Declarations for low-level security API.
Copyright (c) 2013-2018 Microchip Technology Inc. and its subsidiaries.
Macros | |
#define | AES_BASE_ADDR (0x80) |
Base address for Transceiver AES address space. More... | |
#define | AES_DIR_DECRYPT (1) |
AES core operation direction: Decryption (ECB) More... | |
#define | AES_DIR_ENCRYPT (0) |
AES core operation direction: Encryption (ECB, CBC) More... | |
#define | AES_DONE (1) |
AES core operation status: AES module finished. More... | |
#define | AES_MODE_CBC (2) |
Set CBC mode. More... | |
#define | AES_MODE_ECB (0) |
Set ECB mode. More... | |
#define | AES_MODE_KEY (1) |
Set key mode. More... | |
#define | AES_NOT_DONE (0) |
AES core operation status: AES module did not finish. More... | |
#define | AES_REQUEST (1) |
Initiate an AES operation. More... | |
#define | RG_AES_CTRL (0x03) |
Offset for register AES_CTRL. More... | |
#define | RG_AES_STATE_KEY_0 (0x04) |
Offset for register AES_STATE_KEY_0. More... | |
#define | RG_AES_STATUS (0x02) |
Offset for register AES_STATUS. More... | |
#define | sal_aes_clean_up() _sal_aes_clean_up() |
Route function macro to the corresponding function. More... | |
#define | SR_AES_DIR 0x03, 0x08, 3 |
Access parameters for sub-register AES_DIR in register RG_AES_CTRL. More... | |
#define | SR_AES_MODE 0x03, 0x70, 4 |
Access parameters for sub-register AES_MODE in register RG_AES_CTRL. More... | |
#define | SR_AES_REQUEST 0x03, 0x80, 7 |
Access parameters for sub-register AES_REQUEST in register RG_AES_CTRL. More... | |
Functions | |
void | _sal_aes_clean_up (void) |
Cleans up the SAL/AES after STB has been completed. More... | |
void | sal_aes_exec (uint8_t *data) |
En/decrypt one AES block. More... | |
void | sal_aes_read (uint8_t *data) |
Reads the result of previous AES en/decryption. More... | |
void | sal_aes_restart (void) |
Re-inits key and state after a sleep or TRX reset. More... | |
bool | sal_aes_setup (uint8_t *key, uint8_t enc_mode, uint8_t dir) |
Setup AES unit. More... | |
void | sal_aes_wrrd (uint8_t *idata, uint8_t *odata) |
Writes data, reads previous result and does the AES en/decryption. More... | |
void | sal_init (void) |
Initialization of SAL. More... | |
#define AES_BASE_ADDR (0x80) |
Base address for Transceiver AES address space.
#define AES_DIR_DECRYPT (1) |
AES core operation direction: Decryption (ECB)
#define AES_DIR_ENCRYPT (0) |
AES core operation direction: Encryption (ECB, CBC)
#define AES_DONE (1) |
AES core operation status: AES module finished.
#define AES_MODE_CBC (2) |
Set CBC mode.
#define AES_MODE_ECB (0) |
Set ECB mode.
#define AES_MODE_KEY (1) |
Set key mode.
#define AES_NOT_DONE (0) |
AES core operation status: AES module did not finish.
#define AES_REQUEST (1) |
Initiate an AES operation.
#define RG_AES_CTRL (0x03) |
Offset for register AES_CTRL.
#define RG_AES_STATE_KEY_0 (0x04) |
Offset for register AES_STATE_KEY_0.
#define RG_AES_STATUS (0x02) |
Offset for register AES_STATUS.
#define sal_aes_clean_up | ( | ) | _sal_aes_clean_up() |
Route function macro to the corresponding function.
Referenced by stb_ccm_secure().
#define SR_AES_DIR 0x03, 0x08, 3 |
Access parameters for sub-register AES_DIR in register RG_AES_CTRL.
#define SR_AES_MODE 0x03, 0x70, 4 |
Access parameters for sub-register AES_MODE in register RG_AES_CTRL.
#define SR_AES_REQUEST 0x03, 0x80, 7 |
Access parameters for sub-register AES_REQUEST in register RG_AES_CTRL.
void _sal_aes_clean_up | ( | void | ) |
Cleans up the SAL/AES after STB has been completed.
This function puts the radio to SLEEP if it has been in SLEEP before sal_aes_restart().
Cleans up the SAL/AES after STB has been completed.
void sal_aes_exec | ( | uint8_t * | data | ) |
En/decrypt one AES block.
The function returns after the AES operation is finished.
[in] | data | AES block to be en/decrypted |
Referenced by compute_mic(), and encrypt_with_padding().
void sal_aes_read | ( | uint8_t * | data | ) |
Reads the result of previous AES en/decryption.
This function returns the result of the previous AES operation, so this function is needed in order to get the last result of a series of sal_aes_wrrd() calls.
[out] | data | - result of previous operation |
References AES_BASE_ADDR, AES_BLOCKSIZE, RG_AES_STATE_KEY_0, and trx_sram_read().
Referenced by compute_mic(), and encrypt_pldmic().
void sal_aes_restart | ( | void | ) |
Re-inits key and state after a sleep or TRX reset.
This function re-initializes the AES key and the state of the AES engine after TRX sleep or reset. The contents of AES register AES_CON is restored, the next AES operation started with sal_aes_exec() will be executed correctly.
This function re-initializes the AES key and the state of the AES engine after TRX sleep or reset. The contents of AES registers AES_CON and AES_CON_MIRROR are restored, the next AES operation started with sal_aes_wrrd() will be executed correctly. However, the contents of SRAM buffers is destroyed, in general. When using sal_aes_wrrd(), call sal_aes_read() to get the result of the last AES operation BEFORE you put the transceiver unit to sleep state!
bool sal_aes_setup | ( | uint8_t * | key, |
uint8_t | enc_mode, | ||
uint8_t | dir | ||
) |
Setup AES unit.
This function perform the following tasks as part of the setup of the AES unit: key initialization, set encryption mode.
[in] | key | AES key or NULL (NULL: use last key) |
[in] | enc_mode | AES_MODE_ECB or AES_MODE_CBC |
[in] | dir | must be AES_DIR_ENCRYPT |
This function perform the following tasks as part of the setup of the AES unit: key initialization, set encryption direction and encryption mode.
In general, the contents of SRAM buffer is destroyed. When using sal_aes_wrrd(), sal_aes_read() needs to be called in order to get the result of the last AES operation before you may call sal_aes_setup() again.
[in] | key | AES key or NULL (NULL: use last key) |
[in] | enc_mode | AES_MODE_ECB or AES_MODE_CBC |
[in] | dir | AES_DIR_ENCRYPT or AES_DIR_DECRYPT |
References AES_BASE_ADDR, AES_BLOCKSIZE, aes_buf, AES_DIR_DECRYPT, AES_DIR_ENCRYPT, AES_DIR_VOID, AES_KEYSIZE, AES_MODE_CBC, AES_MODE_ECB, AES_MODE_KEY, AES_REQUEST, dec_initialized, dec_key, enc_key, last_dir, RG_AES_CTRL, RG_AES_STATE_KEY_0, sal_aes_wrrd(), setup_flag, SR_AES_DIR, SR_AES_MODE, SR_AES_REQUEST, SR_MASK, trx_sram_read(), and trx_sram_write().
Referenced by compute_mic(), encrypt_pldmic(), and stb_ccm_secure().
void sal_aes_wrrd | ( | uint8_t * | idata, |
uint8_t * | odata | ||
) |
Writes data, reads previous result and does the AES en/decryption.
The function returns after the AES operation is finished.
When sal_aes_wrrd() is called several times in sequence, from the second call onwards, odata contains the result of the previous operation. To obtain the last result, you must call sal_aes_read() at the end. Please note that any call of sal_aes_setup() as well as putting the transceiver to sleep state destroys the SRAM contents, i.e. the next call of sal_aes_wrrd() yields no meaningful result.
[in] | idata | AES block to be en/decrypted |
[out] | odata | Result of previous operation (odata may be NULL or equal to idata) |
References AES_BASE_ADDR, AES_BLOCKSIZE, aes_buf, delay_us, RG_AES_CTRL, RG_AES_STATE_KEY_0, setup_flag, and trx_aes_wrrd().
Referenced by compute_mic(), encrypt_pldmic(), encrypt_with_padding(), and sal_aes_setup().
void sal_init | ( | void | ) |