#pragma once #include #include #include /** FuriHalCryptoKey Type */ typedef enum { FuriHalCryptoKeyTypeMaster, /**< Master key */ FuriHalCryptoKeyTypeSimple, /**< Simple enencrypted key */ FuriHalCryptoKeyTypeEncrypted, /**< Encrypted with Master key */ } FuriHalCryptoKeyType; /** FuriHalCryptoKey Size in bits */ typedef enum { FuriHalCryptoKeySize128, FuriHalCryptoKeySize256, } FuriHalCryptoKeySize; /** FuriHalCryptoKey */ typedef struct { FuriHalCryptoKeyType type; FuriHalCryptoKeySize size; uint8_t* data; } FuriHalCryptoKey; /** Initialize cryptography layer * This includes AES engines, PKA and RNG */ void furi_hal_crypto_init(); /** Store key in crypto storage * @param key - FuriHalCryptoKey to store. Only Master, Simple or Encrypted * @param slot - pinter to int where store slot number will be saved * @return true on success */ bool furi_hal_crypto_store_add_key(FuriHalCryptoKey* key, uint8_t* slot); /** Init AES engine and load key from crypto store * @param slot - store slot number * @return true on success */ bool furi_hal_crypto_store_load_key(uint8_t slot, const uint8_t* iv); /** Unload key engine and deinit AES engine * @param slot - store slot number * @return true on success */ bool furi_hal_crypto_store_unload_key(uint8_t slot); /** Encrypt data * @param input - pointer to input data * @param output - pointer to output data * @param size - input/output buffer size in bytes * @return true on success */ bool furi_hal_crypto_encrypt(const uint8_t *input, uint8_t *output, size_t size); /** Decrypt data * @param input - pointer to input data * @param output - pointer to output data * @param size - input/output buffer size in bytes * @return true on success */ bool furi_hal_crypto_decrypt(const uint8_t *input, uint8_t *output, size_t size);