ADuCM4x50 Device Drivers API Reference Manual  Release 4.0.0.0
adi_crypto.h
1 
19 #ifndef ADI_CRYPTO_H
20 #define ADI_CRYPTO_H
21 
23 #include <adi_processor.h>
24 #include <adi_callback.h>
25 #include <rtos_map/adi_rtos_map.h> /* for ADI_SEM_SIZE */
27 #include <adi_crypto_config.h>
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif /* __cplusplus */
32 
33 
38 typedef enum
39 {
56 #if (defined (__ADUCM4x50__) && (1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT))
57  ADI_CRYPTO_PK_ALREADY_ENABLED,
58  ADI_CRYPTO_PK_ALREADY_DISABLED,
59  ADI_CRYPTO_PK_NOT_ENABLED,
60  ADI_CRYPTO_PK_INVALID_KUWLEN,
61  ADI_CRYPTO_PK_INVALID_KEY_INDEX,
62  ADI_CRYPTO_PK_CMD_BUSY,
63  ADI_CRYPTO_PK_CMD_FAULT,
64  ADI_CRYPTO_PK_CMD_ECC_FAULT,
65 #endif
67 
72 typedef enum
73 {
74  /* successful buffer completion events */
80 #if defined (__ADUCM4x50__)
82 #else
83  ADI_CRYPTO_RESERVED_EVENT,
84 #endif /*__ADUCM4x50*/
87  /* other events */
94 
96 #if defined (__ADUCM4x50__)
97 #if (1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT)
98 #define ADI_CRYPTO_MEMORY_SIZE (100u + ADI_SEM_SIZE)
99 #else
100 #define ADI_CRYPTO_MEMORY_SIZE (92u + ADI_SEM_SIZE)
101 #endif
102 #elif defined (__ADUCM302x__)
103 #define ADI_CRYPTO_MEMORY_SIZE (88u + ADI_SEM_SIZE)
104 #else
105 #error Crypto driver is not ported to this proccesor
106 #endif
107 
109 typedef struct __ADI_CRYPTO_DEV_DATA_TYPE* ADI_CRYPTO_HANDLE;
110 
111 
113 #define ADI_CRYPTO_SHA_HASH_BYTES (256u/8u)
114 
115 #if defined (__ADUCM4x50__)
116 
117 #define ADI_CRYPTO_HMAC_HASH_BYTES (256u/8u)
118 #endif
119 
121 typedef enum
122 {
123  ADI_CRYPTO_DECODE = (0u << BITP_CRYPT_CFG_ENCR),
124  ADI_CRYPTO_ENCODE = (1u << BITP_CRYPT_CFG_ENCR),
126 
128 typedef enum
129 {
130  ADI_CRYPTO_AES_KEY_LEN_128_BIT = (0u << BITP_CRYPT_CFG_AESKEYLEN),
131  ADI_CRYPTO_AES_KEY_LEN_256_BIT = (2u << BITP_CRYPT_CFG_AESKEYLEN),
133 
134 #if defined (__ADUCM4x50__)
135 
136 typedef enum
137 {
138  ADI_CRYPTO_KEY_LITTLE_ENDIAN = (0u << BITP_CRYPT_CFG_KEY_BYTESWAP),
139  ADI_CRYPTO_KEY_BIG_ENDIAN = (1u << BITP_CRYPT_CFG_KEY_BYTESWAP),
141 #endif /*__ADUCM4x50__*/
142 
143 #if defined (__ADUCM4x50__)
144 
145 typedef enum
146 {
147  ADI_CRYPTO_SHA_LITTLE_ENDIAN = (0u << BITP_CRYPT_CFG_SHA_BYTESWAP),
148  ADI_CRYPTO_SHA_BIG_ENDIAN = (1u << BITP_CRYPT_CFG_SHA_BYTESWAP),
150 #endif /*__ADUCM4x50__*/
151 
153 typedef enum
154 {
155  ADI_CRYPTO_AES_LITTLE_ENDIAN = (0u << BITP_CRYPT_CFG_AES_BYTESWAP),
156  ADI_CRYPTO_AES_BIG_ENDIAN = (1u << BITP_CRYPT_CFG_AES_BYTESWAP),
158 
163 typedef enum {
164  ADI_CRYPTO_MODE_CBC = BITM_CRYPT_CFG_CBCEN,
165  ADI_CRYPTO_MODE_CCM = BITM_CRYPT_CFG_CCMEN,
166  ADI_CRYPTO_MODE_CMAC = BITM_CRYPT_CFG_CMACEN,
167  ADI_CRYPTO_MODE_CTR = BITM_CRYPT_CFG_CTREN,
168  ADI_CRYPTO_MODE_ECB = BITM_CRYPT_CFG_ECBEN,
169 #if defined (__ADUCM4x50__)
170  ADI_CRYPTO_MODE_HMAC = BITM_CRYPT_CFG_HMACEN,
171 #endif /*__ADUCM4x50__*/
172  ADI_CRYPTO_MODE_SHA = BITM_CRYPT_CFG_SHA256EN,
174 
175 
176 #if defined (__ADUCM4x50__)
177 #if ((1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT) || (1 == ADI_CRYPTO_ENABLE_HMAC_SUPPORT))
178 
179 typedef enum
180 {
181  ADI_PK_KUW_LEN_128 = (1u << BITP_CRYPT_CFG_KUWKEYLEN),
182  ADI_PK_KUW_LEN_256 = (2u << BITP_CRYPT_CFG_KUWKEYLEN),
183  ADI_PK_KUW_LEN_512 = (3u << BITP_CRYPT_CFG_KUWKEYLEN),
184 } ADI_CRYPTO_PK_KUW_LEN;
185 #endif /* ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT or ADI_CRYPTO_ENABLE_HMAC_SUPPORT */
186 #endif /* __ADUCM4x50__ */
187 
188 
189 #if (defined (__ADUCM4x50__) && (1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT))
190 
191 typedef enum
192 {
193  ADI_PK_CMD_WRAP_KUW = (0x1 << BITP_CRYPT_PRKSTORCFG_CMD),
194  ADI_PK_CMD_UNWRAP_KUW = (0x2 << BITP_CRYPT_PRKSTORCFG_CMD),
195  ADI_PK_CMD_RESET_KUW = (0x3 << BITP_CRYPT_PRKSTORCFG_CMD),
196  ADI_PK_CMD_USE_KEY = (0x4 << BITP_CRYPT_PRKSTORCFG_CMD),
197  ADI_PK_CMD_USE_DEV_KEY = (0x5 << BITP_CRYPT_PRKSTORCFG_CMD),
198  /* gap */
199  ADI_PK_CMD_RETRIEVE_KEY = (0x8 << BITP_CRYPT_PRKSTORCFG_CMD),
200  ADI_PK_CMD_STORE_KEY = (0x9 << BITP_CRYPT_PRKSTORCFG_CMD),
201  ADI_PK_CMD_ERASE_KEY = (0xA << BITP_CRYPT_PRKSTORCFG_CMD),
202  ADI_PK_CMD_ERASE_PAGE = (0xB << BITP_CRYPT_PRKSTORCFG_CMD),
203 } ADI_CRYPTO_PK_CMD;
204 #endif /*ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT*/
205 
206 
208 typedef struct
209 {
212 #if defined (__ADUCM4x50__)
215 #endif /*__ADUCM4x50__*/
218  uint8_t *pAesKey;
221  uint8_t *pHmacKey;
223  uint32_t *pAuthData;
224  uint32_t numAuthBytes;
226  uint32_t *pInputData;
227  uint32_t numInputBytes;
229  uint32_t *pOutputData;
230  uint32_t numOutputBytes;
232  uint8_t *pNonceIV;
243  uint32_t CounterInit;
244  uint32_t numValidBytes;
245  uint32_t numShaBits;
247 #if (defined (__ADUCM4x50__) && (1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT))
248  /* PKSTOR extensions used only in context of overriding above key info with protected keys stored in flash. */
249  /* Assumes previously wrapped keys have already been stored using adi_crypto_pk_Xxx APIs. */
250  /* NOTE: Enabling PKSTOR boolean results in explicit key loads being replaced with PKSTOR keys prior to all Crypto operations */
251  /* When enabled, the PKSTOR sequence is to RETRIEVE, UNWRAP and USE whichever key index and size is designated below. */
252 
253  bool bUsePKSTOR;
254  ADI_CRYPTO_PK_KUW_LEN pkKuwLen;
255  uint8_t pkIndex;
256 #endif
258 
259 
260 /*================ PUBLIC API ==================*/
261 
262 
263 ADI_CRYPTO_RESULT adi_crypto_Open (uint32_t const nDeviceNum, void * const pMemory, uint32_t const nMemorySize, ADI_CRYPTO_HANDLE * const phDevice);
265 ADI_CRYPTO_RESULT adi_crypto_RegisterCallback (ADI_CRYPTO_HANDLE const hDevice, ADI_CALLBACK const pfCallback, void * const pCBParam);
266 ADI_CRYPTO_RESULT adi_crypto_Enable (ADI_CRYPTO_HANDLE const hDevice, bool const bEnable);
267 
270 ADI_CRYPTO_RESULT adi_crypto_IsBufferAvailable (ADI_CRYPTO_HANDLE const hDevice, bool * const pbAvailable);
271 
272 #if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1)
273 ADI_CRYPTO_RESULT adi_crypto_EnableDmaMode (ADI_CRYPTO_HANDLE const hDevice, bool const bEnable);
274 #endif
275 
276 #if (defined (__ADUCM4x50__) && (1 == ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT))
277 ADI_CRYPTO_RESULT adi_crypto_pk_EnablePKSTOR (ADI_CRYPTO_HANDLE const hDevice, bool const bEnable);
278 
279 ADI_CRYPTO_RESULT adi_crypto_pk_SetValString (ADI_CRYPTO_HANDLE const hDevice, uint8_t * const pValStr);
280 ADI_CRYPTO_RESULT adi_crypto_pk_GetValString (ADI_CRYPTO_HANDLE const hDevice, uint8_t * const pValStr);
281 
282 ADI_CRYPTO_RESULT adi_crypto_pk_SetKuwLen (ADI_CRYPTO_HANDLE const hDevice, ADI_CRYPTO_PK_KUW_LEN const kuwDataLen);
283 ADI_CRYPTO_RESULT adi_crypto_pk_SetKuwReg (ADI_CRYPTO_HANDLE const hDevice, uint8_t * const pKuwData);
284 ADI_CRYPTO_RESULT adi_crypto_pk_WrapKuwReg (ADI_CRYPTO_HANDLE const hDevice);
285 ADI_CRYPTO_RESULT adi_crypto_pk_UnwrapKuwReg (ADI_CRYPTO_HANDLE const hDevice);
286 ADI_CRYPTO_RESULT adi_crypto_pk_ResetKuwReg (ADI_CRYPTO_HANDLE const hDevice);
287 
288 ADI_CRYPTO_RESULT adi_crypto_pk_UseDecryptedKey (ADI_CRYPTO_HANDLE const hDevice);
289 ADI_CRYPTO_RESULT adi_crypto_pk_LoadDeviceKey (ADI_CRYPTO_HANDLE const hDevice);
290 
291 ADI_CRYPTO_RESULT adi_crypto_pk_RetrieveKey (ADI_CRYPTO_HANDLE const hDevice, uint8_t const index);
292 ADI_CRYPTO_RESULT adi_crypto_pk_StoreKey (ADI_CRYPTO_HANDLE const hDevice, uint8_t const index);
293 ADI_CRYPTO_RESULT adi_crypto_pk_DestroyKey (ADI_CRYPTO_HANDLE const hDevice, uint8_t const index);
294 ADI_CRYPTO_RESULT adi_crypto_pk_ErasePage (ADI_CRYPTO_HANDLE const hDevice, uint8_t const index);
295 #endif /* ADI_CRYPTO_ENABLE_PKSTOR_SUPPORT */
296 
297 
298 #ifdef __cplusplus
299 }
300 #endif
301 
302 #endif /* include guard */
303 
304 /*
305 ** EOF
306 */
307 
ADI_CRYPTO_AES_BYTE_SWAP eAesByteSwap
Definition: adi_crypto.h:216
ADI_CRYPTO_CODING_MODE eCodingMode
Definition: adi_crypto.h:211
ADI_CRYPTO_KEY_BYTE_SWAP
Definition: adi_crypto.h:136
ADI_CRYPTO_EVENT
Definition: adi_crypto.h:72
ADI_CRYPTO_AES_KEY_LEN
Definition: adi_crypto.h:128
ADI_CRYPTO_CIPHER_MODE
Definition: adi_crypto.h:163
ADI_CRYPTO_SHA_BYTE_SWAP eShaByteSwap
Definition: adi_crypto.h:214
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:643
ADI_CRYPTO_AES_KEY_LEN eAesKeyLen
Definition: adi_crypto.h:219
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:532
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:736
uint32_t * pOutputData
Definition: adi_crypto.h:229
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:395
ADI_CRYPTO_RESULT
Definition: adi_crypto.h:38
ADI_CRYPTO_CODING_MODE
Definition: adi_crypto.h:121
ADI_CRYPTO_KEY_BYTE_SWAP eKeyByteSwap
Definition: adi_crypto.h:213
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:585
ADI_CRYPTO_AES_BYTE_SWAP
Definition: adi_crypto.h:153
struct __ADI_CRYPTO_DEV_DATA_TYPE * ADI_CRYPTO_HANDLE
Definition: adi_crypto.h:109
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:697
ADI_CRYPTO_RESULT adi_crypto_Close(ADI_CRYPTO_HANDLE const hDevice)
Close the given device instance.
Definition: adi_crypto.c:480
ADI_CRYPTO_CIPHER_MODE eCipherMode
Definition: adi_crypto.h:210
ADI_CRYPTO_SHA_BYTE_SWAP
Definition: adi_crypto.h:145