crypto_facade.c 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "crypto_facade.h"
  2. #include <furi_hal_crypto.h>
  3. #include <furi/core/check.h>
  4. #include "crypto_v1.h"
  5. #include "crypto_v2.h"
  6. #include "crypto_v3.h"
  7. #include "constants.h"
  8. bool totp_crypto_check_key_slot(uint8_t key_slot) {
  9. uint8_t empty_iv[CRYPTO_IV_LENGTH] = {0};
  10. if(key_slot < ACCEPTABLE_CRYPTO_KEY_SLOT_START || key_slot > ACCEPTABLE_CRYPTO_KEY_SLOT_END) {
  11. return false;
  12. }
  13. return furi_hal_crypto_verify_key(key_slot) &&
  14. furi_hal_crypto_store_load_key(key_slot, empty_iv) &&
  15. furi_hal_crypto_store_unload_key(key_slot);
  16. }
  17. uint8_t* totp_crypto_encrypt(
  18. const uint8_t* plain_data,
  19. const size_t plain_data_length,
  20. const CryptoSettings* crypto_settings,
  21. size_t* encrypted_data_length) {
  22. if(crypto_settings->crypto_version == 1) {
  23. return totp_crypto_encrypt_v1(
  24. plain_data, plain_data_length, crypto_settings, encrypted_data_length);
  25. }
  26. if(crypto_settings->crypto_version == 2) {
  27. return totp_crypto_encrypt_v2(
  28. plain_data, plain_data_length, crypto_settings, encrypted_data_length);
  29. }
  30. if(crypto_settings->crypto_version == 3) {
  31. return totp_crypto_encrypt_v3(
  32. plain_data, plain_data_length, crypto_settings, encrypted_data_length);
  33. }
  34. furi_crash("Unsupported crypto version");
  35. }
  36. uint8_t* totp_crypto_decrypt(
  37. const uint8_t* encrypted_data,
  38. const size_t encrypted_data_length,
  39. const CryptoSettings* crypto_settings,
  40. size_t* decrypted_data_length) {
  41. if(crypto_settings->crypto_version == 1) {
  42. return totp_crypto_decrypt_v1(
  43. encrypted_data, encrypted_data_length, crypto_settings, decrypted_data_length);
  44. }
  45. if(crypto_settings->crypto_version == 2) {
  46. return totp_crypto_decrypt_v2(
  47. encrypted_data, encrypted_data_length, crypto_settings, decrypted_data_length);
  48. }
  49. if(crypto_settings->crypto_version == 3) {
  50. return totp_crypto_decrypt_v3(
  51. encrypted_data, encrypted_data_length, crypto_settings, decrypted_data_length);
  52. }
  53. furi_crash("Unsupported crypto version");
  54. }
  55. CryptoSeedIVResult
  56. totp_crypto_seed_iv(CryptoSettings* crypto_settings, const uint8_t* pin, uint8_t pin_length) {
  57. if(crypto_settings->crypto_version == 1) {
  58. return totp_crypto_seed_iv_v1(crypto_settings, pin, pin_length);
  59. }
  60. if(crypto_settings->crypto_version == 2) {
  61. return totp_crypto_seed_iv_v2(crypto_settings, pin, pin_length);
  62. }
  63. if(crypto_settings->crypto_version == 3) {
  64. return totp_crypto_seed_iv_v3(crypto_settings, pin, pin_length);
  65. }
  66. furi_crash("Unsupported crypto version");
  67. }
  68. bool totp_crypto_verify_key(const CryptoSettings* crypto_settings) {
  69. if(crypto_settings->crypto_version == 1) {
  70. return totp_crypto_verify_key_v1(crypto_settings);
  71. }
  72. if(crypto_settings->crypto_version == 2) {
  73. return totp_crypto_verify_key_v2(crypto_settings);
  74. }
  75. if(crypto_settings->crypto_version == 3) {
  76. return totp_crypto_verify_key_v3(crypto_settings);
  77. }
  78. furi_crash("Unsupported crypto version");
  79. }