Просмотр исходного кода

Use advanced furi_hal_crypto funcs if available

twisted_pear 2 лет назад
Родитель
Сommit
20f277329f
1 измененных файлов с 29 добавлено и 1 удалено
  1. 29 1
      crypto_wrapper.c

+ 29 - 1
crypto_wrapper.c

@@ -1,16 +1,25 @@
 #include <furi_hal.h>
 
+#ifndef FURI_HAL_CRYPTO_ADVANCED_AVAIL
 #include "crypto/gcm.h"
+#endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
+
 #include "crypto_wrapper.h"
 
 struct ESugGhzChatCryptoCtx {
+#ifdef FURI_HAL_CRYPTO_ADVANCED_AVAIL
+	uint8_t key[KEY_BITS / 8];
+#else /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
 	gcm_context gcm_ctx;
+#endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
 };
 
 void crypto_init(void)
 {
+#ifndef FURI_HAL_CRYPTO_ADVANCED_AVAIL
 	/* init the GCM and AES tables */
 	gcm_initialize();
+#endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
 }
 
 void crypto_explicit_bzero(void *s, size_t len)
@@ -43,7 +52,12 @@ void crypto_ctx_clear(ESubGhzChatCryptoCtx *ctx)
 
 bool crypto_ctx_set_key(ESubGhzChatCryptoCtx *ctx, const uint8_t *key)
 {
+#ifdef FURI_HAL_CRYPTO_ADVANCED_AVAIL
+	memcpy(ctx->key, key, KEY_BITS / 8);
+	return true;
+#else /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
 	return (gcm_setkey(&(ctx->gcm_ctx), key, KEY_BITS / 8) == 0);
+#endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
 }
 
 bool crypto_ctx_decrypt(ESubGhzChatCryptoCtx *ctx, uint8_t *in, size_t in_len,
@@ -53,21 +67,35 @@ bool crypto_ctx_decrypt(ESubGhzChatCryptoCtx *ctx, uint8_t *in, size_t in_len,
 		return false;
 	}
 
+#ifdef FURI_HAL_CRYPTO_ADVANCED_AVAIL
+	return (furi_hal_crypto_gcm_decrypt_and_verify(ctx->key,
+			in, in + IV_BYTES, out,
+			in_len - MSG_OVERHEAD,
+			in + in_len - TAG_BYTES) == FuriHalCryptoGCMStateOk);
+#else /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
 	return (gcm_auth_decrypt(&(ctx->gcm_ctx),
 			in, IV_BYTES,
 			NULL, 0,
 			in + IV_BYTES, out, in_len - MSG_OVERHEAD,
 			in + in_len - TAG_BYTES, TAG_BYTES) == 0);
-
+#endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
 }
 
 bool crypto_ctx_encrypt(ESubGhzChatCryptoCtx *ctx, uint8_t *in, size_t in_len,
 		uint8_t *out)
 {
 	furi_hal_random_fill_buf(out, IV_BYTES);
+
+#ifdef FURI_HAL_CRYPTO_ADVANCED_AVAIL
+	return (furi_hal_crypto_gcm_encrypt_and_tag(ctx->key,
+			out, in, out + IV_BYTES,
+			in_len,
+			out + IV_BYTES + in_len) == FuriHalCryptoGCMStateOk);
+#else /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
 	return (gcm_crypt_and_tag(&(ctx->gcm_ctx), ENCRYPT,
 			out, IV_BYTES,
 			NULL, 0,
 			in, out + IV_BYTES, in_len,
 			out + IV_BYTES + in_len, TAG_BYTES) == 0);
+#endif /* FURI_HAL_CRYPTO_ADVANCED_AVAIL */
 }