SmartSnippets DA1459x SDK
hw_aes.h
Go to the documentation of this file.
1 
42 #ifndef HW_AES_H_
43 #define HW_AES_H_
44 
45 #if dg_configUSE_HW_AES
46 
47 #define HW_AES_USER_DATA_KEYS_MAX_ENTRIES ((MEMORY_EFLASH_USER_DATA_KEYS_END - \
48  MEMORY_EFLASH_USER_DATA_KEYS_BASE) \
49  / MEMORY_EFLASH_USER_DATA_KEY_SIZE)
50 #include <stdbool.h>
51 #include "hw_aes_hash.h"
52 
56 typedef enum {
57  HW_AES_ERROR_INVALID_INPUT_DATA_LEN = -2,
58  HW_AES_ERROR_CRYPTO_ENGINE_LOCKED = -1,
59  HW_AES_ERROR_NONE = 0
60 } HW_AES_ERROR;
61 
65 typedef enum {
69 } HW_AES_MODE;
70 
74 typedef enum {
78 
82 typedef enum {
87 
91 typedef enum {
95 
99 typedef enum {
103 
127 typedef struct {
135  const uint8_t *iv_cnt_ptr;
138  uint32_t keys_addr;
142  uint32_t input_data_addr;
143  uint32_t output_data_addr;
144  uint32_t input_data_len;
146 
154 __STATIC_INLINE void hw_aes_set_mode(HW_AES_MODE aes_mode)
155 {
156  ASSERT_WARNING((aes_mode == HW_AES_MODE_ECB) || (aes_mode == HW_AES_MODE_CTR) ||
157  (aes_mode == HW_AES_MODE_CBC));
158 
159  uint32_t crypto_ctrl_reg = AES_HASH->CRYPTO_CTRL_REG;
160 
161  REG_SET_FIELD(AES_HASH, CRYPTO_CTRL_REG, CRYPTO_HASH_SEL, crypto_ctrl_reg, 0);
162  REG_SET_FIELD(AES_HASH, CRYPTO_CTRL_REG, CRYPTO_ALG, crypto_ctrl_reg, 0);
163  REG_SET_FIELD(AES_HASH, CRYPTO_CTRL_REG, CRYPTO_ALG_MD, crypto_ctrl_reg, aes_mode);
164 
165  AES_HASH->CRYPTO_CTRL_REG = crypto_ctrl_reg;
166 }
167 
175 __STATIC_INLINE HW_AES_MODE hw_aes_get_mode(void)
176 {
177  return REG_GETF(AES_HASH, CRYPTO_CTRL_REG, CRYPTO_ALG_MD);
178 }
179 
187 __STATIC_INLINE void hw_aes_set_operation(HW_AES_OPERATION operation)
188 {
189  ASSERT_WARNING((operation == HW_AES_OPERATION_DECRYPT) ||
190  (operation == HW_AES_OPERATION_ENCRYPT));
191 
192  REG_SETF(AES_HASH, CRYPTO_CTRL_REG, CRYPTO_ENCDEC, operation);
193 }
194 
202 __STATIC_INLINE void hw_aes_set_key_size(HW_AES_KEY_SIZE key_size)
203 {
204  ASSERT_WARNING((key_size == HW_AES_KEY_SIZE_128) || (key_size == HW_AES_KEY_SIZE_192) ||
205  (key_size == HW_AES_KEY_SIZE_256));
206 
207  REG_SETF(AES_HASH, CRYPTO_CTRL_REG, CRYPTO_AES_KEY_SZ, key_size);
208 }
209 
217 __STATIC_INLINE void hw_aes_set_key_expansion(HW_AES_KEY_EXPAND key_expand)
218 {
219  ASSERT_WARNING((key_expand == HW_AES_KEY_EXPAND_BY_SW) ||
220  (key_expand == HW_AES_KEY_EXPAND_BY_HW));
221 
222  REG_SETF(AES_HASH, CRYPTO_CTRL_REG, CRYPTO_AES_KEXP, key_expand);
223 }
224 
232 __STATIC_INLINE void hw_aes_set_output_data_mode(HW_AES_OUTPUT_DATA_MODE output_data_mode)
233 {
234  ASSERT_WARNING((output_data_mode == HW_AES_OUTPUT_DATA_MODE_ALL) ||
235  (output_data_mode == HW_AES_OUTPUT_DATA_MODE_FINAL_BLOCK));
236 
237  REG_SETF(AES_HASH, CRYPTO_CTRL_REG, CRYPTO_OUT_MD, output_data_mode);
238 }
239 
247 __STATIC_INLINE void hw_aes_start_operation(HW_AES_OPERATION aes_operation)
248 {
249  hw_aes_set_operation(aes_operation);
251 }
252 
269 
278 void hw_aes_set_init_vector(const uint8_t *iv_cnt_ptr);
291 bool hw_aes_is_key_valid(uint8_t idx);
292 
293 
307 uint32_t hw_aes_key_address_get(uint8_t key_idx);
308 
322 void hw_aes_load_keys(uint32_t key_src_addr, HW_AES_KEY_SIZE key_size, HW_AES_KEY_EXPAND key_exp);
323 
352 
353 #endif /* dg_configUSE_HW_AES */
354 
355 #endif /* HW_AES_H_ */
356 
hw_aes_config_t::input_data_addr
uint32_t input_data_addr
Definition: hw_aes.h:142
hw_aes_get_mode
__STATIC_INLINE HW_AES_MODE hw_aes_get_mode(void)
Get AES Mode.
Definition: hw_aes.h:175
REG_SETF
#define REG_SETF(base, reg, field, new_val)
Set the value of a register field.
Definition: sdk_defs.h:738
hw_aes_start_operation
__STATIC_INLINE void hw_aes_start_operation(HW_AES_OPERATION aes_operation)
Start AES operation (Encryption/Decryption).
Definition: hw_aes.h:247
hw_aes_config_t::output_data_mode
HW_AES_OUTPUT_DATA_MODE output_data_mode
Definition: hw_aes.h:132
hw_aes_config_t::key_expand
HW_AES_KEY_EXPAND key_expand
Definition: hw_aes.h:131
hw_aes_config_t::keys_addr
uint32_t keys_addr
Definition: hw_aes.h:138
HW_AES_KEY_SIZE_192
Definition: hw_aes.h:84
HW_AES_OUTPUT_DATA_MODE_FINAL_BLOCK
Definition: hw_aes.h:101
HW_AES_KEY_SIZE_128
Definition: hw_aes.h:83
HW_AES_OPERATION
HW_AES_OPERATION
AES operation.
Definition: hw_aes.h:74
HW_AES_MODE
HW_AES_MODE
AES Mode.
Definition: hw_aes.h:65
HW_AES_KEY_SIZE_256
Definition: hw_aes.h:85
HW_AES_MODE_CBC
Definition: hw_aes.h:68
hw_aes_set_key_expansion
__STATIC_INLINE void hw_aes_set_key_expansion(HW_AES_KEY_EXPAND key_expand)
Set AES key expansion mode.
Definition: hw_aes.h:217
hw_aes_is_key_valid
bool hw_aes_is_key_valid(uint8_t idx)
Check whether the Encryption Key is revoked or not.
hw_aes_key_address_get
uint32_t hw_aes_key_address_get(uint8_t key_idx)
Get User Data Encryption Key memory address.
hw_aes_set_output_data_mode
__STATIC_INLINE void hw_aes_set_output_data_mode(HW_AES_OUTPUT_DATA_MODE output_data_mode)
Set AES engine output data mode.
Definition: hw_aes.h:232
hw_aes_config_t
AES engine configuration structure.
Definition: hw_aes.h:127
hw_aes_config_t::mode
HW_AES_MODE mode
Definition: hw_aes.h:128
hw_aes_config_t::input_data_len
uint32_t input_data_len
Definition: hw_aes.h:144
hw_aes_hash.h
Definition of API for the AES/HASH Engine Low Level Driver.
HW_AES_KEY_SIZE
HW_AES_KEY_SIZE
AES key size.
Definition: hw_aes.h:82
HW_AES_MODE_CTR
Definition: hw_aes.h:67
hw_aes_config_t::wait_more_input
bool wait_more_input
Definition: hw_aes.h:133
HW_AES_OPERATION_DECRYPT
Definition: hw_aes.h:75
HW_AES_ERROR
HW_AES_ERROR
AES engine error codes.
Definition: hw_aes.h:56
hw_aes_config_t::operation
HW_AES_OPERATION operation
Definition: hw_aes.h:129
HW_AES_KEY_EXPAND_BY_SW
Definition: hw_aes.h:92
hw_aes_hash_cb
void(* hw_aes_hash_cb)(uint32_t status)
AES/Hash callback.
Definition: hw_aes_hash.h:168
hw_aes_config_t::callback
hw_aes_hash_cb callback
Definition: hw_aes.h:134
hw_aes_check_input_data_len_restrictions
bool hw_aes_check_input_data_len_restrictions(void)
Check if the restrictions of the input data length are fulfilled.
hw_aes_init
HW_AES_ERROR hw_aes_init(const hw_aes_config_t *aes_cfg)
AES engine initialization function.
HW_AES_KEY_EXPAND
HW_AES_KEY_EXPAND
AES key expansion modes.
Definition: hw_aes.h:91
hw_aes_set_key_size
__STATIC_INLINE void hw_aes_set_key_size(HW_AES_KEY_SIZE key_size)
Set AES key size.
Definition: hw_aes.h:202
hw_aes_config_t::iv_cnt_ptr
const uint8_t * iv_cnt_ptr
Definition: hw_aes.h:135
HW_AES_MODE_ECB
Definition: hw_aes.h:66
REG_GETF
#define REG_GETF(base, reg, field)
Return the value of a register field.
Definition: sdk_defs.h:711
hw_aes_config_t::output_data_addr
uint32_t output_data_addr
Definition: hw_aes.h:143
HW_AES_KEY_EXPAND_BY_HW
Definition: hw_aes.h:93
hw_aes_config_t::key_size
HW_AES_KEY_SIZE key_size
Definition: hw_aes.h:130
HW_AES_OUTPUT_DATA_MODE
HW_AES_OUTPUT_DATA_MODE
AES Output Mode.
Definition: hw_aes.h:99
hw_aes_set_mode
__STATIC_INLINE void hw_aes_set_mode(HW_AES_MODE aes_mode)
Set AES Mode.
Definition: hw_aes.h:154
REG_SET_FIELD
#define REG_SET_FIELD(base, reg, field, var, val)
Set register field value.
Definition: sdk_defs.h:626
hw_aes_hash_start
__STATIC_INLINE void hw_aes_hash_start(void)
Start AES/HASH engine operation.
Definition: hw_aes_hash.h:231
hw_aes_set_init_vector
void hw_aes_set_init_vector(const uint8_t *iv_cnt_ptr)
Set the Initialization Vector in CBC Mode or the Counter in CTR Mode.
hw_aes_set_operation
__STATIC_INLINE void hw_aes_set_operation(HW_AES_OPERATION operation)
Set AES operation, e.g. encryption or decryption.
Definition: hw_aes.h:187
HW_AES_OUTPUT_DATA_MODE_ALL
Definition: hw_aes.h:100
HW_AES_OPERATION_ENCRYPT
Definition: hw_aes.h:76
hw_aes_load_keys
void hw_aes_load_keys(uint32_t key_src_addr, HW_AES_KEY_SIZE key_size, HW_AES_KEY_EXPAND key_exp)
Load the AES keys from OTP/RAM to Crypto Engine.