ADuCM302x Device Drivers API Reference Manual  Release 3.1.2.0
adi_crypto.h
1 
50 #ifndef ADI_CRYPTO_H
51 #define ADI_CRYPTO_H
52 
54 #include <adi_processor.h>
55 #include <adi_callback.h>
56 #include <rtos_map/adi_rtos_map.h> /* for ADI_SEM_SIZE */
58 #include <adi_crypto_config.h>
59 
60 #ifdef __cplusplus
61 extern "C" {
62 #endif /* __cplusplus */
63 
64 
69 typedef enum
70 {
87 #if (defined (__ADUCM4x50__) && (1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT))
88  ADI_CRYPTO_PK_ALREADY_ENABLED,
89  ADI_CRYPTO_PK_ALREADY_DISABLED,
90  ADI_CRYPTO_PK_NOT_ENABLED,
91  ADI_CRYPTO_PK_INVALID_KUWLEN,
92  ADI_CRYPTO_PK_INVALID_KEY_INDEX,
93  ADI_CRYPTO_PK_CMD_BUSY,
94  ADI_CRYPTO_PK_CMD_FAULT,
95  ADI_CRYPTO_PK_CMD_ECC_FAULT,
96 #endif
98 
103 typedef enum
104 {
105  /* successful buffer completion events */
111 #if defined (__ADUCM4x50__)
112  ADI_CRYPTO_EVENT_STATUS_HMAC_DONE,
113 #else
115 #endif /*__ADUCM4x50*/
118  /* other events */
125 
127 #if defined (__ADUCM4x50__)
128 #if (1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT)
129 #define ADI_CRYPTO_MEMORY_SIZE (100u + ADI_SEM_SIZE)
130 #else
131 #define ADI_CRYPTO_MEMORY_SIZE (92u + ADI_SEM_SIZE)
132 #endif
133 #elif defined (__ADUCM302x__)
134 #define ADI_CRYPTO_MEMORY_SIZE (88u + ADI_SEM_SIZE)
135 #else
136 #error Crypto driver is not ported to this proccesor
137 #endif
138 
140 typedef struct __ADI_CRYPTO_DEV_DATA_TYPE* ADI_CRYPTO_HANDLE;
141 
142 
144 #define ADI_CRYPTO_SHA_HASH_BYTES (256u/8u)
145 
146 #if defined (__ADUCM4x50__)
147 
148 #define ADI_CRYPTO_HMAC_HASH_BYTES (256u/8u)
149 #endif
150 
152 typedef enum
153 {
154  ADI_CRYPTO_DECODE = (0u << BITP_CRYPT_CFG_ENCR),
155  ADI_CRYPTO_ENCODE = (1u << BITP_CRYPT_CFG_ENCR),
157 
159 typedef enum
160 {
161  ADI_CRYPTO_AES_KEY_LEN_128_BIT = (0u << BITP_CRYPT_CFG_AESKEYLEN),
162  ADI_CRYPTO_AES_KEY_LEN_256_BIT = (2u << BITP_CRYPT_CFG_AESKEYLEN),
164 
165 #if defined (__ADUCM4x50__)
166 
167 typedef enum
168 {
169  ADI_CRYPTO_KEY_LITTLE_ENDIAN = (0u << BITP_CRYPT_CFG_KEY_BYTESWAP),
170  ADI_CRYPTO_KEY_BIG_ENDIAN = (1u << BITP_CRYPT_CFG_KEY_BYTESWAP),
171 } ADI_CRYPTO_KEY_BYTE_SWAP;
172 #endif /*__ADUCM4x50__*/
173 
174 #if defined (__ADUCM4x50__)
175 
176 typedef enum
177 {
178  ADI_CRYPTO_SHA_LITTLE_ENDIAN = (0u << BITP_CRYPT_CFG_SHA_BYTESWAP),
179  ADI_CRYPTO_SHA_BIG_ENDIAN = (1u << BITP_CRYPT_CFG_SHA_BYTESWAP),
180 } ADI_CRYPTO_SHA_BYTE_SWAP;
181 #endif /*__ADUCM4x50__*/
182 
184 typedef enum
185 {
186  ADI_CRYPTO_AES_LITTLE_ENDIAN = (0u << BITP_CRYPT_CFG_AES_BYTESWAP),
187  ADI_CRYPTO_AES_BIG_ENDIAN = (1u << BITP_CRYPT_CFG_AES_BYTESWAP),
189 
194 typedef enum {
195  ADI_CRYPTO_MODE_CBC = BITM_CRYPT_CFG_CBCEN,
196  ADI_CRYPTO_MODE_CCM = BITM_CRYPT_CFG_CCMEN,
197  ADI_CRYPTO_MODE_CMAC = BITM_CRYPT_CFG_CMACEN,
198  ADI_CRYPTO_MODE_CTR = BITM_CRYPT_CFG_CTREN,
199  ADI_CRYPTO_MODE_ECB = BITM_CRYPT_CFG_ECBEN,
200 #if defined (__ADUCM4x50__)
201  ADI_CRYPTO_MODE_HMAC = BITM_CRYPT_CFG_HMACEN,
202 #endif /*__ADUCM4x50__*/
203  ADI_CRYPTO_MODE_SHA = BITM_CRYPT_CFG_SHA256EN,
205 
206 
207 #if defined (__ADUCM4x50__)
208 #if ((1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT) || (1 == ADI_CRYPTO_ENABLE_HMAC_SUPPORT))
209 
210 typedef enum
211 {
212  ADI_PK_KUW_LEN_128 = (1u << BITP_CRYPT_CFG_KUWKEYLEN),
213  ADI_PK_KUW_LEN_256 = (2u << BITP_CRYPT_CFG_KUWKEYLEN),
214  ADI_PK_KUW_LEN_512 = (3u << BITP_CRYPT_CFG_KUWKEYLEN),
215 } ADI_CRYPTO_PK_KUW_LEN;
216 #endif /* ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT or ADI_CRYPTO_ENABLE_HMAC_SUPPORT */
217 #endif /* __ADUCM4x50__ */
218 
219 
220 #if (defined (__ADUCM4x50__) && (1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT))
221 
222 typedef enum
223 {
224  ADI_PK_CMD_WRAP_KUW = (0x1 << BITP_CRYPT_PRKSTORCFG_CMD),
225  ADI_PK_CMD_UNWRAP_KUW = (0x2 << BITP_CRYPT_PRKSTORCFG_CMD),
226  ADI_PK_CMD_RESET_KUW = (0x3 << BITP_CRYPT_PRKSTORCFG_CMD),
227  ADI_PK_CMD_USE_KEY = (0x4 << BITP_CRYPT_PRKSTORCFG_CMD),
228  ADI_PK_CMD_USE_DEV_KEY = (0x5 << BITP_CRYPT_PRKSTORCFG_CMD),
229  /* gap */
230  ADI_PK_CMD_RETRIEVE_KEY = (0x8 << BITP_CRYPT_PRKSTORCFG_CMD),
231  ADI_PK_CMD_STORE_KEY = (0x9 << BITP_CRYPT_PRKSTORCFG_CMD),
232  ADI_PK_CMD_ERASE_KEY = (0xA << BITP_CRYPT_PRKSTORCFG_CMD),
233  ADI_PK_CMD_ERASE_PAGE = (0xB << BITP_CRYPT_PRKSTORCFG_CMD),
234 } ADI_CRYPTO_PK_CMD;
235 #endif /*ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT*/
236 
237 
239 typedef struct
240 {
241  ADI_CRYPTO_CIPHER_MODE eCipherMode;
243 #if defined (__ADUCM4x50__)
244  ADI_CRYPTO_KEY_BYTE_SWAP eKeyByteSwap;
245  ADI_CRYPTO_SHA_BYTE_SWAP eShaByteSwap;
246 #endif /*__ADUCM4x50__*/
249  uint8_t *pAesKey;
252  uint8_t *pHmacKey;
254  uint32_t *pAuthData;
255  uint32_t numAuthBytes;
257  uint32_t *pInputData;
258  uint32_t numInputBytes;
260  uint32_t *pOutputData;
261  uint32_t numOutputBytes;
263  uint8_t *pNonceIV;
274  uint32_t CounterInit;
275  uint32_t numValidBytes;
276  uint32_t numShaBits;
278 #if (defined (__ADUCM4x50__) && (1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT))
279  /* PKSTOR extensions used only in context of overriding above key info with protected keys stored in flash. */
280  /* Assumes previously wrapped keys have already been stored using adi_crypto_pk_Xxx APIs. */
281  /* NOTE: Enabling PKSTOR boolean results in explicit key loads being replaced with PKSTOR keys prior to all Crypto operations */
282  /* When enabled, the PKSTOR sequence is to RETRIEVE, UNWRAP and USE whichever key index and size is designated below. */
283 
284  bool bUsePKSTOR;
285  ADI_CRYPTO_PK_KUW_LEN pkKuwLen;
286  uint8_t pkIndex;
287 #endif
289 
290 
291 /*================ PUBLIC API ==================*/
292 
293 
294 ADI_CRYPTO_RESULT adi_crypto_Open (uint32_t const nDeviceNum, void * const pMemory, uint32_t const nMemorySize, ADI_CRYPTO_HANDLE * const phDevice);
295 ADI_CRYPTO_RESULT adi_crypto_Close (ADI_CRYPTO_HANDLE const hDevice);
296 ADI_CRYPTO_RESULT adi_crypto_RegisterCallback (ADI_CRYPTO_HANDLE const hDevice, ADI_CALLBACK const pfCallback, void * const pCBParam);
297 ADI_CRYPTO_RESULT adi_crypto_Enable (ADI_CRYPTO_HANDLE const hDevice, bool const bEnable);
298 
299 ADI_CRYPTO_RESULT adi_crypto_SubmitBuffer (ADI_CRYPTO_HANDLE const hDevice, ADI_CRYPTO_TRANSACTION * const pBuffer);
300 ADI_CRYPTO_RESULT adi_crypto_GetBuffer (ADI_CRYPTO_HANDLE const hDevice, ADI_CRYPTO_TRANSACTION ** const ppBuffer);
301 ADI_CRYPTO_RESULT adi_crypto_IsBufferAvailable (ADI_CRYPTO_HANDLE const hDevice, bool * const pbAvailable);
302 
303 #if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1)
304 ADI_CRYPTO_RESULT adi_crypto_EnableDmaMode (ADI_CRYPTO_HANDLE const hDevice, bool const bEnable);
305 #endif
306 
307 #if (defined (__ADUCM4x50__) && (1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT))
308 ADI_CRYPTO_RESULT adi_crypto_pk_EnablePKSTOR (ADI_CRYPTO_HANDLE const hDevice, bool const bEnable);
309 
310 ADI_CRYPTO_RESULT adi_crypto_pk_SetValString (ADI_CRYPTO_HANDLE const hDevice, uint8_t * const pValStr);
311 ADI_CRYPTO_RESULT adi_crypto_pk_GetValString (ADI_CRYPTO_HANDLE const hDevice, uint8_t * const pValStr);
312 
313 ADI_CRYPTO_RESULT adi_crypto_pk_SetKuwLen (ADI_CRYPTO_HANDLE const hDevice, ADI_CRYPTO_PK_KUW_LEN const kuwDataLen);
314 ADI_CRYPTO_RESULT adi_crypto_pk_SetKuwReg (ADI_CRYPTO_HANDLE const hDevice, uint8_t * const pKuwData);
315 ADI_CRYPTO_RESULT adi_crypto_pk_WrapKuwReg (ADI_CRYPTO_HANDLE const hDevice);
316 ADI_CRYPTO_RESULT adi_crypto_pk_UnwrapKuwReg (ADI_CRYPTO_HANDLE const hDevice);
317 ADI_CRYPTO_RESULT adi_crypto_pk_ResetKuwReg (ADI_CRYPTO_HANDLE const hDevice);
318 
319 ADI_CRYPTO_RESULT adi_crypto_pk_UseDecryptedKey (ADI_CRYPTO_HANDLE const hDevice);
320 ADI_CRYPTO_RESULT adi_crypto_pk_LoadDeviceKey (ADI_CRYPTO_HANDLE const hDevice);
321 
322 ADI_CRYPTO_RESULT adi_crypto_pk_RetrieveKey (ADI_CRYPTO_HANDLE const hDevice, uint8_t const index);
323 ADI_CRYPTO_RESULT adi_crypto_pk_StoreKey (ADI_CRYPTO_HANDLE const hDevice, uint8_t const index);
324 ADI_CRYPTO_RESULT adi_crypto_pk_DestroyKey (ADI_CRYPTO_HANDLE const hDevice, uint8_t const index);
325 ADI_CRYPTO_RESULT adi_crypto_pk_ErasePage (ADI_CRYPTO_HANDLE const hDevice, uint8_t const index);
326 #endif /* ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT */
327 
328 
329 #ifdef __cplusplus
330 }
331 #endif
332 
333 #endif /* include guard */
334 
335 /*
336 ** EOF
337 */
338 
ADI_CRYPTO_AES_BYTE_SWAP eAesByteSwap
Definition: adi_crypto.h:247
ADI_CRYPTO_CODING_MODE eCodingMode
Definition: adi_crypto.h:242
ADI_CRYPTO_EVENT
Definition: adi_crypto.h:103
ADI_CRYPTO_AES_KEY_LEN
Definition: adi_crypto.h:159
ADI_CRYPTO_CIPHER_MODE
Definition: adi_crypto.h:194
ADI_CRYPTO_RESULT adi_crypto_GetBuffer(ADI_CRYPTO_HANDLE const hDevice, ADI_CRYPTO_TRANSACTION **const ppBuffer)
Get the submitted transaction buffer back from the driver.
Definition: adi_crypto.c:674
ADI_CRYPTO_AES_KEY_LEN eAesKeyLen
Definition: adi_crypto.h:250
ADI_CRYPTO_RESULT adi_crypto_RegisterCallback(ADI_CRYPTO_HANDLE const hDevice, ADI_CALLBACK const pfCallback, void *const pCBParam)
Register a user callback function.
Definition: adi_crypto.c:563
ADI_CRYPTO_RESULT adi_crypto_Enable(ADI_CRYPTO_HANDLE const hDevice, bool const bEnable)
Enable/Disable the device. Enabling the device causes the submitted buffer to be processed.
Definition: adi_crypto.c:767
uint32_t * pOutputData
Definition: adi_crypto.h:260
ADI_CRYPTO_RESULT adi_crypto_Open(uint32_t const nDeviceNum, void *const pMemory, uint32_t const nMemorySize, ADI_CRYPTO_HANDLE *const phDevice)
Opens a Crypto device instance.
Definition: adi_crypto.c:426
ADI_CRYPTO_RESULT
Definition: adi_crypto.h:69
ADI_CRYPTO_CODING_MODE
Definition: adi_crypto.h:152
ADI_CRYPTO_RESULT adi_crypto_SubmitBuffer(ADI_CRYPTO_HANDLE const hDevice, ADI_CRYPTO_TRANSACTION *const pBuffer)
Submit a Crypto transaction buffer for processing.
Definition: adi_crypto.c:616
ADI_CRYPTO_AES_BYTE_SWAP
Definition: adi_crypto.h:184
struct __ADI_CRYPTO_DEV_DATA_TYPE * ADI_CRYPTO_HANDLE
Definition: adi_crypto.h:140
ADI_CRYPTO_RESULT adi_crypto_IsBufferAvailable(ADI_CRYPTO_HANDLE const hDevice, bool *const pbAvailable)
Peek function to know whether a submitted transaction is complete.
Definition: adi_crypto.c:728
ADI_CRYPTO_RESULT adi_crypto_Close(ADI_CRYPTO_HANDLE const hDevice)
Close the given device instance.
Definition: adi_crypto.c:511
ADI_CRYPTO_CIPHER_MODE eCipherMode
Definition: adi_crypto.h:241