furi-hal-crypto.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <furi-hal-crypto.h>
  2. #include <furi.h>
  3. #include <shci.h>
  4. CRYP_HandleTypeDef crypt;
  5. void furi_hal_crypto_init() {
  6. FURI_LOG_I("FuriHalCrypto", "Init OK");
  7. }
  8. bool furi_hal_crypto_store_add_key(FuriHalCryptoKey* key, uint8_t* slot) {
  9. furi_assert(key);
  10. furi_assert(slot);
  11. SHCI_C2_FUS_StoreUsrKey_Cmd_Param_t pParam;
  12. if (key->type == FuriHalCryptoKeyTypeMaster) {
  13. pParam.KeyType = KEYTYPE_MASTER;
  14. } else if (key->type == FuriHalCryptoKeyTypeSimple) {
  15. pParam.KeyType = KEYTYPE_SIMPLE;
  16. } else if (key->type == FuriHalCryptoKeyTypeEncrypted) {
  17. pParam.KeyType = KEYTYPE_ENCRYPTED;
  18. } else {
  19. furi_crash("Incorrect key type");
  20. }
  21. if (key->size == FuriHalCryptoKeySize128) {
  22. pParam.KeySize = KEYSIZE_16;
  23. } else if (key->size == FuriHalCryptoKeySize256) {
  24. pParam.KeySize = KEYSIZE_32;
  25. } else {
  26. furi_crash("Incorrect key size");
  27. }
  28. return SHCI_C2_FUS_StoreUsrKey(&pParam, slot) == SHCI_Success;
  29. }
  30. bool furi_hal_crypto_store_load_key(uint8_t slot, const uint8_t* iv) {
  31. furi_assert(slot > 0 && slot <= 100);
  32. crypt.Instance = AES1;
  33. crypt.Init.DataType = CRYP_DATATYPE_32B;
  34. crypt.Init.KeySize = CRYP_KEYSIZE_256B;
  35. crypt.Init.Algorithm = CRYP_AES_CBC;
  36. crypt.Init.pInitVect = (uint32_t*)iv;
  37. crypt.Init.pKey = NULL;
  38. furi_check(HAL_CRYP_Init(&crypt) == HAL_OK);
  39. if (SHCI_C2_FUS_LoadUsrKey(slot) == SHCI_Success) {
  40. return true;
  41. } else {
  42. furi_check(HAL_CRYP_DeInit(&crypt) == HAL_OK);
  43. return false;
  44. }
  45. }
  46. bool furi_hal_crypto_store_unload_key(uint8_t slot) {
  47. furi_check(HAL_CRYP_DeInit(&crypt) == HAL_OK);
  48. return SHCI_C2_FUS_UnloadUsrKey(slot) == SHCI_Success;
  49. }
  50. bool furi_hal_crypto_encrypt(const uint8_t *input, uint8_t *output, size_t size) {
  51. return HAL_CRYP_Encrypt(&crypt, (uint32_t*)input, size/4, (uint32_t*)output, 1000) == HAL_OK;
  52. }
  53. bool furi_hal_crypto_decrypt(const uint8_t *input, uint8_t *output, size_t size) {
  54. return HAL_CRYP_Decrypt(&crypt, (uint32_t*)input, size/4, (uint32_t*)output, 1000) == HAL_OK;
  55. }