/** * @file furi-hal-crypto.h * Cryptography HAL API */ #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 * @param[in] iv pointer to 16 bytes Initialization Vector data * * @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);