furi-hal-crypto.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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.KeyIVConfigSkip = CRYP_KEYIVCONFIG_ONCE;
  43. crypt.Init.pKey = NULL;
  44. furi_check(HAL_CRYP_Init(&crypt) == HAL_OK);
  45. if(SHCI_C2_FUS_LoadUsrKey(slot) == SHCI_Success) {
  46. return true;
  47. } else {
  48. furi_check(HAL_CRYP_DeInit(&crypt) == HAL_OK);
  49. return false;
  50. }
  51. }
  52. bool furi_hal_crypto_store_unload_key(uint8_t slot) {
  53. furi_check(HAL_CRYP_DeInit(&crypt) == HAL_OK);
  54. return SHCI_C2_FUS_UnloadUsrKey(slot) == SHCI_Success;
  55. }
  56. bool furi_hal_crypto_encrypt(const uint8_t* input, uint8_t* output, size_t size) {
  57. return HAL_CRYP_Encrypt(&crypt, (uint32_t*)input, size / 4, (uint32_t*)output, 1000) == HAL_OK;
  58. }
  59. bool furi_hal_crypto_decrypt(const uint8_t* input, uint8_t* output, size_t size) {
  60. return HAL_CRYP_Decrypt(&crypt, (uint32_t*)input, size / 4, (uint32_t*)output, 1000) == HAL_OK;
  61. }