token_info.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include <furi_hal.h>
  2. #include "token_info.h"
  3. #include "stdlib.h"
  4. #include "common.h"
  5. #include "../lib/base32/base32.h"
  6. #include "../services/crypto/crypto.h"
  7. #include "../lib/polyfills/memset_s.h"
  8. #include "../lib/polyfills/strnlen.h"
  9. TokenInfo* token_info_alloc() {
  10. TokenInfo* tokenInfo = malloc(sizeof(TokenInfo));
  11. furi_check(tokenInfo != NULL);
  12. tokenInfo->algo = SHA1;
  13. tokenInfo->digits = TOTP_6_DIGITS;
  14. tokenInfo->duration = TOTP_TOKEN_DURATION_DEFAULT;
  15. tokenInfo->automation_features = TOKEN_AUTOMATION_FEATURE_NONE;
  16. return tokenInfo;
  17. }
  18. void token_info_free(TokenInfo* token_info) {
  19. if(token_info == NULL) return;
  20. free(token_info->name);
  21. free(token_info->token);
  22. free(token_info);
  23. }
  24. bool token_info_set_secret(
  25. TokenInfo* token_info,
  26. const char* base32_token_secret,
  27. size_t token_secret_length,
  28. const uint8_t* iv) {
  29. if(token_secret_length == 0) return false;
  30. uint8_t* plain_secret = malloc(token_secret_length);
  31. furi_check(plain_secret != NULL);
  32. int plain_secret_length =
  33. base32_decode((const uint8_t*)base32_token_secret, plain_secret, token_secret_length);
  34. bool result;
  35. if(plain_secret_length > 0) {
  36. token_info->token =
  37. totp_crypto_encrypt(plain_secret, plain_secret_length, iv, &token_info->token_length);
  38. result = true;
  39. } else {
  40. result = false;
  41. }
  42. memset_s(plain_secret, token_secret_length, 0, token_secret_length);
  43. free(plain_secret);
  44. return result;
  45. }
  46. bool token_info_set_digits_from_int(TokenInfo* token_info, uint8_t digits) {
  47. switch(digits) {
  48. case 6:
  49. token_info->digits = TOTP_6_DIGITS;
  50. return true;
  51. case 8:
  52. token_info->digits = TOTP_8_DIGITS;
  53. return true;
  54. default:
  55. break;
  56. }
  57. return false;
  58. }
  59. bool token_info_set_duration_from_int(TokenInfo* token_info, uint8_t duration) {
  60. if(duration >= 15) {
  61. token_info->duration = duration;
  62. return true;
  63. }
  64. return false;
  65. }
  66. bool token_info_set_algo_from_str(TokenInfo* token_info, const FuriString* str) {
  67. if(furi_string_cmpi_str(str, TOTP_TOKEN_ALGO_SHA1_NAME) == 0) {
  68. token_info->algo = SHA1;
  69. return true;
  70. }
  71. if(furi_string_cmpi_str(str, TOTP_TOKEN_ALGO_SHA256_NAME) == 0) {
  72. token_info->algo = SHA256;
  73. return true;
  74. }
  75. if(furi_string_cmpi_str(str, TOTP_TOKEN_ALGO_SHA512_NAME) == 0) {
  76. token_info->algo = SHA512;
  77. return true;
  78. }
  79. return false;
  80. }
  81. char* token_info_get_algo_as_cstr(const TokenInfo* token_info) {
  82. switch(token_info->algo) {
  83. case SHA1:
  84. return TOTP_TOKEN_ALGO_SHA1_NAME;
  85. case SHA256:
  86. return TOTP_TOKEN_ALGO_SHA256_NAME;
  87. case SHA512:
  88. return TOTP_TOKEN_ALGO_SHA512_NAME;
  89. default:
  90. break;
  91. }
  92. return NULL;
  93. }
  94. bool token_info_set_automation_feature_from_str(TokenInfo* token_info, const FuriString* str) {
  95. if(furi_string_cmpi_str(str, TOTP_TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END_NAME) == 0) {
  96. token_info->automation_features |= TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END;
  97. return true;
  98. }
  99. if(furi_string_cmpi_str(str, TOTP_TOKEN_AUTOMATION_FEATURE_NONE_NAME) == 0) {
  100. token_info->automation_features = TOKEN_AUTOMATION_FEATURE_NONE;
  101. return true;
  102. }
  103. return false;
  104. }
  105. TokenInfo* token_info_clone(const TokenInfo* src) {
  106. TokenInfo* clone = token_info_alloc();
  107. memcpy(clone, src, sizeof(TokenInfo));
  108. clone->token = malloc(src->token_length);
  109. furi_check(clone->token != NULL);
  110. memcpy(clone->token, src->token, src->token_length);
  111. int name_length = strnlen(src->name, TOTP_TOKEN_MAX_LENGTH);
  112. clone->name = malloc(name_length + 1);
  113. furi_check(clone->name != NULL);
  114. strlcpy(clone->name, src->name, name_length + 1);
  115. return clone;
  116. }