furi-hal-crypto.c 2.5 KB

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