furi-hal-crypto.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. size_t key_data_size = 0;
  13. if (key->type == FuriHalCryptoKeyTypeMaster) {
  14. pParam.KeyType = KEYTYPE_MASTER;
  15. } else if (key->type == FuriHalCryptoKeyTypeSimple) {
  16. pParam.KeyType = KEYTYPE_SIMPLE;
  17. } else if (key->type == FuriHalCryptoKeyTypeEncrypted) {
  18. pParam.KeyType = KEYTYPE_ENCRYPTED;
  19. key_data_size += 12;
  20. } else {
  21. furi_crash("Incorrect key type");
  22. }
  23. if (key->size == FuriHalCryptoKeySize128) {
  24. pParam.KeySize = KEYSIZE_16;
  25. key_data_size += 16;
  26. } else if (key->size == FuriHalCryptoKeySize256) {
  27. pParam.KeySize = KEYSIZE_32;
  28. key_data_size += 32;
  29. } else {
  30. furi_crash("Incorrect key size");
  31. }
  32. memcpy(pParam.KeyData, key->data, key_data_size);
  33. return SHCI_C2_FUS_StoreUsrKey(&pParam, slot) == SHCI_Success;
  34. }
  35. bool furi_hal_crypto_store_load_key(uint8_t slot, const uint8_t* iv) {
  36. furi_assert(slot > 0 && slot <= 100);
  37. crypt.Instance = AES1;
  38. crypt.Init.DataType = CRYP_DATATYPE_32B;
  39. crypt.Init.KeySize = CRYP_KEYSIZE_256B;
  40. crypt.Init.Algorithm = CRYP_AES_CBC;
  41. crypt.Init.pInitVect = (uint32_t*)iv;
  42. crypt.Init.pKey = NULL;
  43. furi_check(HAL_CRYP_Init(&crypt) == HAL_OK);
  44. if (SHCI_C2_FUS_LoadUsrKey(slot) == SHCI_Success) {
  45. return true;
  46. } else {
  47. furi_check(HAL_CRYP_DeInit(&crypt) == HAL_OK);
  48. return false;
  49. }
  50. }
  51. bool furi_hal_crypto_store_unload_key(uint8_t slot) {
  52. furi_check(HAL_CRYP_DeInit(&crypt) == HAL_OK);
  53. return SHCI_C2_FUS_UnloadUsrKey(slot) == SHCI_Success;
  54. }
  55. bool furi_hal_crypto_encrypt(const uint8_t *input, uint8_t *output, size_t size) {
  56. return HAL_CRYP_Encrypt(&crypt, (uint32_t*)input, size/4, (uint32_t*)output, 1000) == HAL_OK;
  57. }
  58. bool furi_hal_crypto_decrypt(const uint8_t *input, uint8_t *output, size_t size) {
  59. return HAL_CRYP_Decrypt(&crypt, (uint32_t*)input, size/4, (uint32_t*)output, 1000) == HAL_OK;
  60. }