token_info.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include <furi/furi.h>
  2. #include <furi_hal.h>
  3. #include "token_info.h"
  4. #include "stdlib.h"
  5. #include "common.h"
  6. #include "../services/base32/base32.h"
  7. #include "../services/crypto/crypto.h"
  8. #include "../services/crypto/memset_s.h"
  9. TokenInfo* token_info_alloc() {
  10. TokenInfo* tokenInfo = malloc(sizeof(TokenInfo));
  11. tokenInfo->algo = SHA1;
  12. tokenInfo->digits = TOTP_6_DIGITS;
  13. return tokenInfo;
  14. }
  15. void token_info_free(TokenInfo* token_info) {
  16. if(token_info == NULL) return;
  17. free(token_info->name);
  18. free(token_info->token);
  19. free(token_info);
  20. }
  21. bool token_info_set_secret(
  22. TokenInfo* token_info,
  23. const char* base32_token_secret,
  24. size_t token_secret_length,
  25. uint8_t* iv) {
  26. uint8_t* plain_secret = malloc(token_secret_length);
  27. int plain_secret_length =
  28. base32_decode((uint8_t*)base32_token_secret, plain_secret, token_secret_length);
  29. bool result;
  30. if(plain_secret_length >= 0) {
  31. token_info->token =
  32. totp_crypto_encrypt(plain_secret, plain_secret_length, iv, &token_info->token_length);
  33. result = true;
  34. } else {
  35. result = false;
  36. }
  37. memset_s(plain_secret, sizeof(plain_secret), 0, token_secret_length);
  38. free(plain_secret);
  39. return result;
  40. }
  41. uint8_t token_info_get_digits_count(TokenInfo* token_info) {
  42. switch(token_info->digits) {
  43. case TOTP_6_DIGITS:
  44. return 6;
  45. case TOTP_8_DIGITS:
  46. return 8;
  47. }
  48. return 6;
  49. }