crypto_wrapper.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <furi_hal.h>
  2. #ifndef FURI_HAL_CRYPTO_ADVANCED_AVAIL
  3. #include "crypto/gcm.h"
  4. #endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
  5. #include "crypto_wrapper.h"
  6. struct ESugGhzChatCryptoCtx {
  7. #ifdef FURI_HAL_CRYPTO_ADVANCED_AVAIL
  8. uint8_t key[KEY_BITS / 8];
  9. #else /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
  10. gcm_context gcm_ctx;
  11. #endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
  12. };
  13. void crypto_init(void)
  14. {
  15. #ifndef FURI_HAL_CRYPTO_ADVANCED_AVAIL
  16. /* init the GCM and AES tables */
  17. gcm_initialize();
  18. #endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
  19. }
  20. void crypto_explicit_bzero(void *s, size_t len)
  21. {
  22. memset(s, 0, len);
  23. asm volatile("" ::: "memory");
  24. }
  25. ESubGhzChatCryptoCtx *crypto_ctx_alloc(void)
  26. {
  27. ESubGhzChatCryptoCtx *ret = malloc(sizeof(ESubGhzChatCryptoCtx));
  28. if (ret != NULL) {
  29. memset(ret, 0, sizeof(ESubGhzChatCryptoCtx));
  30. }
  31. return ret;
  32. }
  33. void crypto_ctx_free(ESubGhzChatCryptoCtx *ctx)
  34. {
  35. crypto_ctx_clear(ctx);
  36. free(ctx);
  37. }
  38. void crypto_ctx_clear(ESubGhzChatCryptoCtx *ctx)
  39. {
  40. crypto_explicit_bzero(ctx, sizeof(ESubGhzChatCryptoCtx));
  41. }
  42. bool crypto_ctx_set_key(ESubGhzChatCryptoCtx *ctx, const uint8_t *key)
  43. {
  44. #ifdef FURI_HAL_CRYPTO_ADVANCED_AVAIL
  45. memcpy(ctx->key, key, KEY_BITS / 8);
  46. return true;
  47. #else /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
  48. return (gcm_setkey(&(ctx->gcm_ctx), key, KEY_BITS / 8) == 0);
  49. #endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
  50. }
  51. bool crypto_ctx_decrypt(ESubGhzChatCryptoCtx *ctx, uint8_t *in, size_t in_len,
  52. uint8_t *out)
  53. {
  54. if (in_len < MSG_OVERHEAD + 1) {
  55. return false;
  56. }
  57. #ifdef FURI_HAL_CRYPTO_ADVANCED_AVAIL
  58. return (furi_hal_crypto_gcm_decrypt_and_verify(ctx->key,
  59. in, in + IV_BYTES, out,
  60. in_len - MSG_OVERHEAD,
  61. in + in_len - TAG_BYTES) == FuriHalCryptoGCMStateOk);
  62. #else /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
  63. return (gcm_auth_decrypt(&(ctx->gcm_ctx),
  64. in, IV_BYTES,
  65. NULL, 0,
  66. in + IV_BYTES, out, in_len - MSG_OVERHEAD,
  67. in + in_len - TAG_BYTES, TAG_BYTES) == 0);
  68. #endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
  69. }
  70. bool crypto_ctx_encrypt(ESubGhzChatCryptoCtx *ctx, uint8_t *in, size_t in_len,
  71. uint8_t *out)
  72. {
  73. furi_hal_random_fill_buf(out, IV_BYTES);
  74. #ifdef FURI_HAL_CRYPTO_ADVANCED_AVAIL
  75. return (furi_hal_crypto_gcm_encrypt_and_tag(ctx->key,
  76. out, in, out + IV_BYTES,
  77. in_len,
  78. out + IV_BYTES + in_len) == FuriHalCryptoGCMStateOk);
  79. #else /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
  80. return (gcm_crypt_and_tag(&(ctx->gcm_ctx), ENCRYPT,
  81. out, IV_BYTES,
  82. NULL, 0,
  83. in, out + IV_BYTES, in_len,
  84. out + IV_BYTES + in_len, TAG_BYTES) == 0);
  85. #endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
  86. }