HPM SDK
HPMicro Software Development Kit
hpm_sdp_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2024 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_SDP_DRV_H
9 #define HPM_SDP_DRV_H
10 
19 #include "hpm_common.h"
20 #include "hpm_sdp_regs.h"
21 #include "hpm_soc_feature.h"
22 
23 /***********************************************************************************************************************
24  * Definitions
25  **********************************************************************************************************************/
29 typedef enum {
32 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
33  sdp_sm4_keybits_128 = sdp_aes_keybits_128, /* SM4 Key bits */
34 #endif
36 
38 
40 
44 typedef enum {
47 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
48  sdp_sm4_op_encrypt = sdp_aes_op_encrypt,
49  sdp_sm4_op_decrypt = sdp_aes_op_decrypt,
50 #endif
52 
54 
55 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
56 
57 typedef sdp_crypto_op_t sdp_sm4_op_t;
58 
59 #endif
60 
65 typedef enum {
67 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
68  sdp_crypto_alg_sm4 = 1,
69 #endif
71 
75 typedef enum {
79 
83 typedef enum {
89 
93 typedef enum {
97 
98 
102 typedef enum {
106 #if defined(SDP_HAS_SM3_SUPPORT) && (SDP_HAS_SM3_SUPPORT == 1)
107  sdp_hash_alg_sm3 = 8,
108  sdp_hash_alg_max = sdp_hash_alg_sm3,
109 #else
111 #endif
113 
114 #define HASH_BLOCK_SIZE (64U)
115 #define AES_BLOCK_SIZE (16U)
116 #define AES_128_KEY_SIZE (0x10U)
117 #define AES_256_KEY_SIZE (0x20U)
119 #define SM4_BLOCK_SIZE (AES_BLOCK_SIZE)
120 #define SM4_KEY_SIZE (AES_128_KEY_SIZE)
125 #define SDP_PKT_CTRL_DERSEMA_MASK (1U << 2)
126 #define SDP_PKT_CTRL_CHAIN_MASK (1U << 3)
127 #define SDP_PKT_CTRL_HASHINIT_MASK (1U << 4)
128 #define SDP_PKT_CTRL_HASHFINISH_MASK (1U << 5)
129 #define SDP_PKT_CTRL_CIPHIV_MASK (1U << 6)
130 
134 typedef struct _sdp_packet_struct {
135  struct _sdp_packet_struct *next_cmd;
136  union {
137  struct {
138  uint32_t RESERVED0: 1;
139  uint32_t PKTINT: 1;
140  uint32_t DCRSEMA: 1;
141  uint32_t CHAIN: 1;
142  uint32_t HASHINIT: 1;
143  uint32_t HASHFINISH: 1;
144  uint32_t CIPHIV: 1;
145  uint32_t RESERVED1: 17;
146  uint32_t PKTTAG: 8;
147  };
148  uint32_t PKT_CTRL;
149  } pkt_ctrl;
150  uint32_t src_addr;
151  uint32_t dst_addr;
152  uint32_t buf_size;
153  uint32_t reserved[3];
155 
159 typedef struct {
160  uint8_t key_idx;
161  uint8_t key_bits;
162  uint16_t crypto_algo;
164  uint32_t buf0[AES_BLOCK_SIZE / sizeof(uint32_t)];
165  uint32_t buf1[AES_BLOCK_SIZE / sizeof(uint32_t)];
166  uint32_t buf2[AES_BLOCK_SIZE / sizeof(uint32_t)];
167  uint32_t buf3[AES_BLOCK_SIZE / sizeof(uint32_t)];
169 
171 
172 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
173 typedef sdp_crypto_ctx_t sdp_sm4_ctx_t;
174 #endif
175 
179 typedef struct {
181 } sdp_dma_ctx_t;
182 
186 typedef struct {
188  uint32_t internal[64];
190 
194 enum {
209 };
210 
214 typedef enum {
223 
227 typedef struct {
231  struct {
233  bool hash_check;
234  };
235  struct {
238  uint16_t key_bits;
239  uint8_t key_index;
243  };
244 } sdp_action_t;
245 
246 
247 #ifdef __cplusplus
248 extern "C"
249 {
250 #endif
251 
252 
253 /***********************************************************************************************************************
254  * Prototypes
255  **********************************************************************************************************************/
260 static inline void sdp_enable_interrupt(SDP_Type *base)
261 {
262  base->SDPCR |= SDP_SDPCR_INTEN_MASK;
263 }
264 
269 static inline void sdp_disable_interrupt(SDP_Type *base)
270 {
271  base->SDPCR &= ~SDP_SDPCR_INTEN_MASK;
272 }
273 
279 static inline void sdp_set_key_index(SDP_Type *base, uint32_t key_index)
280 {
281  base->KEYADDR = SDP_KEYADDR_INDEX_SET(key_index);
282 }
283 
291 static inline void sdp_write_key(SDP_Type *base, uint32_t key_index, uint32_t key_bits, const uint32_t *crypto_key)
292 {
293  if (key_bits == 256) {
294  uint32_t actual_key_index = key_index * 2;
295  for (uint32_t i = 0; i < 2; i++) {
296  sdp_set_key_index(base, actual_key_index++);
297  for (uint32_t j = 0; j < 4; j++) {
298  base->KEYDAT = *crypto_key++;
299  }
300  }
301  } else {
302  sdp_set_key_index(base, key_index);
303  for (uint32_t j = 0; j < 4; j++) {
304  base->KEYDAT = *crypto_key++;
305  }
306  }
307 }
308 
315 static inline void sdp_write_hash_digest(SDP_Type *base, const uint32_t *digest, uint32_t num_words)
316 {
317  for (uint32_t i = 0; i < num_words; i++) {
318  base->HASWRD[i] = *digest++;
319  }
320 }
321 
328 static inline void sdp_get_hash_digest(SDP_Type *base, uint32_t *digest, uint32_t num_words)
329 {
330  for (uint32_t i = 0; i < num_words; i++) {
331  *digest++ = base->HASWRD[i];
332  }
333 }
334 
340 static inline void sdp_write_cipher_iv(SDP_Type *base, const uint32_t *iv)
341 {
342  for (uint32_t i = 0; i < 4; i++) {
343  base->CIPHIV[i] = *iv++;
344  }
345 }
346 
352 static inline void sdp_clear_status(SDP_Type *base, uint32_t mask)
353 {
354  base->STA = mask;
355 }
356 
363 static inline uint32_t sdp_get_status(SDP_Type *base)
364 {
365  return base->STA;
366 }
367 
374 
381 
392  sdp_aes_ctx_t *aes_ctx,
393  const uint8_t *key,
394  sdp_aes_key_bits_t key_bits,
395  uint32_t key_idx);
396 
397 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
398 
408 hpm_stat_t sdp_sm4_set_key(SDP_Type *base,
409  sdp_sm4_ctx_t *sm4_ctx,
410  const uint8_t *key,
411  sdp_sm4_key_bits_t key_bits,
412  uint32_t key_idx);
413 
414 #endif
415 
427  sdp_aes_ctx_t *aes_ctx,
428  sdp_aes_op_t op,
429  uint32_t len,
430  const uint8_t *in,
431  uint8_t *out);
432 
433 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
444 #define sdp_sm4_crypt_ecb sdp_aes_crypt_ecb
445 #endif
446 
459  sdp_aes_ctx_t *aes_ctx,
460  sdp_aes_op_t op,
461  uint32_t length,
462  const uint8_t iv[16],
463  const uint8_t *input,
464  uint8_t *output);
465 
466 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
478 #define sdp_sm4_crypt_cbc sdp_aes_crypt_cbc
479 #endif
480 
493  sdp_aes_ctx_t *aes_ctx,
494  uint8_t *nonce_counter,
495  uint8_t *input,
496  uint8_t *output,
497  uint32_t length);
498 
499 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
510 #define sdp_sm4_crypt_ctr sdp_aes_crypt_ctr
511 #endif
512 
530  sdp_aes_ctx_t *aes_ctx,
531  uint32_t input_len,
532  const uint8_t *iv,
533  uint32_t iv_len,
534  const uint8_t *aad,
535  uint32_t aad_len,
536  const uint8_t *input,
537  uint8_t *output,
538  uint8_t *tag,
539  uint32_t tag_len);
540 
541 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
558 #define sdp_sm4_ccm_generate_encrypt sdp_aes_ccm_generate_encrypt
559 #endif
560 
578  sdp_aes_ctx_t *aes_ctx,
579  uint32_t input_len,
580  const uint8_t *iv,
581  uint32_t iv_len,
582  const uint8_t *aad,
583  uint32_t aad_len,
584  const uint8_t *input,
585  uint8_t *output,
586  const uint8_t *tag,
587  uint32_t tag_len);
588 
589 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
605 #define sdp_sm4_ccm_decrypt_verify sdp_aes_ccm_decrypt_verify
606 #endif
607 
617 hpm_stat_t sdp_memcpy(SDP_Type *base, sdp_dma_ctx_t *sdp_ctx, void *dst, const void *src, uint32_t length);
618 
628 hpm_stat_t sdp_memset(SDP_Type *base, sdp_dma_ctx_t *sdp_ctx, void *dst, uint8_t pattern, uint32_t length);
629 
638 
648 hpm_stat_t sdp_hash_update(SDP_Type *base, sdp_hash_ctx_t *hash_ctx, const uint8_t *data, uint32_t length);
649 
658 hpm_stat_t sdp_hash_finish(SDP_Type *base, sdp_hash_ctx_t *hash_ctx, uint8_t *digest);
659 
667 
668 
680 hpm_stat_t sdp_trigger_action(SDP_Type *base, const sdp_action_t *action, const sdp_pkt_struct_t *cmd_pkt);
681 
682 #ifdef __cplusplus
683 }
684 #endif
685 
690 #endif /* HPM_SDP_DRV_H */
#define SDP_SDPCR_MCPEN_MASK
Definition: hpm_sdp_regs.h:106
#define SDP_KEYADDR_INDEX_SET(x)
Definition: hpm_sdp_regs.h:463
#define SDP_SDPCR_HASHEN_MASK
Definition: hpm_sdp_regs.h:94
#define SDP_SDPCR_CONFEN_MASK
Definition: hpm_sdp_regs.h:118
#define SDP_SDPCR_INTEN_MASK
Definition: hpm_sdp_regs.h:161
#define SDP_SDPCR_CIPHEN_MASK
Definition: hpm_sdp_regs.h:82
uint32_t hpm_stat_t
Definition: hpm_common.h:126
#define MAKE_STATUS(group, code)
Definition: hpm_common.h:135
@ status_group_sdp
Definition: hpm_common.h:148
hpm_stat_t sdp_hash_finish(SDP_Type *base, sdp_hash_ctx_t *hash_ctx, uint8_t *digest)
Finish the HASH calculation and output the digest.
Definition: hpm_sdp_drv.c:857
sdp_operation_t
SDP Operations.
Definition: hpm_sdp_drv.h:214
hpm_stat_t sdp_hash_update(SDP_Type *base, sdp_hash_ctx_t *hash_ctx, const uint8_t *data, uint32_t length)
Compute the HASH digest.
Definition: hpm_sdp_drv.c:813
hpm_stat_t sdp_init(SDP_Type *base)
Initialize the SDP controller.
Definition: hpm_sdp_drv.c:133
hpm_stat_t sdp_aes_set_key(SDP_Type *base, sdp_aes_ctx_t *aes_ctx, const uint8_t *key, sdp_aes_key_bits_t key_bits, uint32_t key_idx)
Set the AES key for the SDP AES operation.
Definition: hpm_sdp_drv.c:155
static void sdp_write_cipher_iv(SDP_Type *base, const uint32_t *iv)
Write the cipher IV to SDP.
Definition: hpm_sdp_drv.h:340
hpm_stat_t sdp_aes_ccm_decrypt_verify(SDP_Type *base, sdp_aes_ctx_t *aes_ctx, uint32_t input_len, const uint8_t *iv, uint32_t iv_len, const uint8_t *aad, uint32_t aad_len, const uint8_t *input, uint8_t *output, const uint8_t *tag, uint32_t tag_len)
Perform the AES-CCM decrypt and verify See NIST Special Publication 800-38C for more details.
Definition: hpm_sdp_drv.c:654
hpm_stat_t sdp_deinit(SDP_Type *base)
De-initialize the SDP controller.
Definition: hpm_sdp_drv.c:145
hpm_stat_t sdp_aes_ccm_generate_encrypt(SDP_Type *base, sdp_aes_ctx_t *aes_ctx, uint32_t input_len, const uint8_t *iv, uint32_t iv_len, const uint8_t *aad, uint32_t aad_len, const uint8_t *input, uint8_t *output, uint8_t *tag, uint32_t tag_len)
Perform the AES-CCM generate and encrypt See NIST Special Publication 800-38C for more details.
Definition: hpm_sdp_drv.c:612
hpm_stat_t sdp_memcpy(SDP_Type *base, sdp_dma_ctx_t *sdp_ctx, void *dst, const void *src, uint32_t length)
Perform the DMA accelerated memcpy.
Definition: hpm_sdp_drv.c:904
sdp_crypto_key_bits_t sdp_sm4_key_bits_t
Definition: hpm_sdp_drv.h:39
static void sdp_get_hash_digest(SDP_Type *base, uint32_t *digest, uint32_t num_words)
Read the HASH digest result from SDP.
Definition: hpm_sdp_drv.h:328
static void sdp_write_key(SDP_Type *base, uint32_t key_index, uint32_t key_bits, const uint32_t *crypto_key)
Write SDP key to specified SDP Key RAM.
Definition: hpm_sdp_drv.h:291
sdp_crypto_mode_t
SDP Crypto modes.
Definition: hpm_sdp_drv.h:75
sdp_calc_hash_mode_t
SDP HASH calculation mode.
Definition: hpm_sdp_drv.h:93
hpm_stat_t sdp_memset(SDP_Type *base, sdp_dma_ctx_t *sdp_ctx, void *dst, uint8_t pattern, uint32_t length)
Perform the DMA accelerated memset.
Definition: hpm_sdp_drv.c:946
struct _sdp_packet_struct sdp_pkt_struct_t
SDP Command Packet structure.
hpm_stat_t sdp_trigger_action(SDP_Type *base, const sdp_action_t *action, const sdp_pkt_struct_t *cmd_pkt)
Trigger SDP operation via the specified SDP packet description.
Definition: hpm_sdp_drv.c:984
sdp_crypto_op_t
Crypto operation option.
Definition: hpm_sdp_drv.h:44
sdp_crypto_ctx_t sdp_aes_ctx_t
Definition: hpm_sdp_drv.h:170
static void sdp_disable_interrupt(SDP_Type *base)
Disable SDP interrupt.
Definition: hpm_sdp_drv.h:269
sdp_crypto_alg_t
SDP Crypto algorithms.
Definition: hpm_sdp_drv.h:65
sdp_crypto_key_bits_t
SDP AES key bit options.
Definition: hpm_sdp_drv.h:29
hpm_stat_t sdp_wait_done(SDP_Type *base)
Wait until the SDP operation gets done.
Definition: hpm_sdp_drv.c:107
sdp_crypto_op_t sdp_aes_op_t
Definition: hpm_sdp_drv.h:53
static void sdp_set_key_index(SDP_Type *base, uint32_t key_index)
Set the Crypto Key Index in SDP.
Definition: hpm_sdp_drv.h:279
sdp_data_swap_mode_t
SDP Data Swap modes.
Definition: hpm_sdp_drv.h:83
sdp_hash_alg_t
SDP HASH algorithm definitions.
Definition: hpm_sdp_drv.h:102
static uint32_t sdp_get_status(SDP_Type *base)
Get SDP status.
Definition: hpm_sdp_drv.h:363
sdp_crypto_key_bits_t sdp_aes_key_bits_t
Definition: hpm_sdp_drv.h:37
hpm_stat_t sdp_aes_crypt_ecb(SDP_Type *base, sdp_aes_ctx_t *aes_ctx, sdp_aes_op_t op, uint32_t len, const uint8_t *in, uint8_t *out)
Perform the basic AES ECB operation.
Definition: hpm_sdp_drv.c:238
static void sdp_write_hash_digest(SDP_Type *base, const uint32_t *digest, uint32_t num_words)
Write the HASH digest result to SDP.
Definition: hpm_sdp_drv.h:315
hpm_stat_t sdp_hash_init(SDP_Type *base, sdp_hash_ctx_t *hash_ctx, sdp_hash_alg_t alg)
Initialize the HASH engine.
Definition: hpm_sdp_drv.c:696
hpm_stat_t sdp_aes_crypt_ctr(SDP_Type *base, sdp_aes_ctx_t *aes_ctx, uint8_t *nonce_counter, uint8_t *input, uint8_t *output, uint32_t length)
Perform the AES-CTR operation See NIST Special Publication800-38A for more details.
Definition: hpm_sdp_drv.c:384
static void sdp_enable_interrupt(SDP_Type *base)
Enable SDP interrupt.
Definition: hpm_sdp_drv.h:260
hpm_stat_t sdp_aes_crypt_cbc(SDP_Type *base, sdp_aes_ctx_t *aes_ctx, sdp_aes_op_t op, uint32_t length, const uint8_t iv[16], const uint8_t *input, uint8_t *output)
Perform the AES CBC operation.
Definition: hpm_sdp_drv.c:300
#define AES_BLOCK_SIZE
Definition: hpm_sdp_drv.h:115
static void sdp_clear_status(SDP_Type *base, uint32_t mask)
Clear SDP status.
Definition: hpm_sdp_drv.h:352
@ sdp_op_cipher_hash
Definition: hpm_sdp_drv.h:220
@ sdp_op_memfill_only
Definition: hpm_sdp_drv.h:219
@ sdp_op_invalid
Definition: hpm_sdp_drv.h:215
@ sdp_op_copy_hash
Definition: hpm_sdp_drv.h:221
@ sdp_op_cipher_only
Definition: hpm_sdp_drv.h:216
@ sdp_op_memcpy_only
Definition: hpm_sdp_drv.h:218
@ sdp_op_hash_only
Definition: hpm_sdp_drv.h:217
@ sdp_crypto_mode_cbc
Definition: hpm_sdp_drv.h:77
@ sdp_crypto_mode_ecb
Definition: hpm_sdp_drv.h:76
@ sdp_calc_hash_for_output
Definition: hpm_sdp_drv.h:95
@ sdp_calc_hash_for_input
Definition: hpm_sdp_drv.h:94
@ status_sdp_error_packet
Definition: hpm_sdp_drv.h:198
@ status_sdp_error_src
Definition: hpm_sdp_drv.h:202
@ status_sdp_error_setup
Definition: hpm_sdp_drv.h:201
@ status_sdp_aes_busy
Definition: hpm_sdp_drv.h:199
@ status_sdp_invalid_alg
Definition: hpm_sdp_drv.h:207
@ status_sdp_error_hash
Definition: hpm_sdp_drv.h:204
@ status_sdp_no_crypto_support
Definition: hpm_sdp_drv.h:195
@ status_sdp_error_chain
Definition: hpm_sdp_drv.h:205
@ status_sdp_invalid_key_src
Definition: hpm_sdp_drv.h:197
@ status_sdp_hash_busy
Definition: hpm_sdp_drv.h:200
@ status_sdp_error_invalid_mac
Definition: hpm_sdp_drv.h:206
@ status_sdp_no_hash_support
Definition: hpm_sdp_drv.h:196
@ status_sdp_error_dst
Definition: hpm_sdp_drv.h:203
@ sdp_aes_op_encrypt
Definition: hpm_sdp_drv.h:45
@ sdp_aes_op_decrypt
Definition: hpm_sdp_drv.h:46
@ sdp_crypto_alg_aes
Definition: hpm_sdp_drv.h:66
@ sdp_aes_keybits_256
Definition: hpm_sdp_drv.h:31
@ sdp_aes_keybits_128
Definition: hpm_sdp_drv.h:30
@ sdp_swap_mode_word_swap
Definition: hpm_sdp_drv.h:86
@ sdp_swap_mode_bytes_in_word
Definition: hpm_sdp_drv.h:85
@ sdp_swap_mode_switch_endian
Definition: hpm_sdp_drv.h:87
@ sdp_swap_mode_none
Definition: hpm_sdp_drv.h:84
@ sdp_hash_alg_sha1
Definition: hpm_sdp_drv.h:103
@ sdp_hash_alg_crc32
Definition: hpm_sdp_drv.h:104
@ sdp_hash_alg_max
Definition: hpm_sdp_drv.h:110
@ sdp_hash_alg_sha256
Definition: hpm_sdp_drv.h:105
Definition: hpm_sdp_regs.h:12
__RW uint32_t CIPHIV[4]
Definition: hpm_sdp_regs.h:19
__RW uint32_t SDPCR
Definition: hpm_sdp_regs.h:13
__RW uint32_t KEYADDR
Definition: hpm_sdp_regs.h:17
__RW uint32_t STA
Definition: hpm_sdp_regs.h:16
__RW uint32_t KEYDAT
Definition: hpm_sdp_regs.h:18
__RW uint32_t HASWRD[8]
Definition: hpm_sdp_regs.h:20
SDP Action Structure.
Definition: hpm_sdp_drv.h:227
sdp_data_swap_mode_t input_swap_mode
Definition: hpm_sdp_drv.h:229
sdp_hash_alg_t hash_alg
Definition: hpm_sdp_drv.h:232
sdp_crypto_alg_t crypto_alg
Definition: hpm_sdp_drv.h:236
sdp_data_swap_mode_t output_swap_mode
Definition: hpm_sdp_drv.h:230
uint16_t key_bits
Definition: hpm_sdp_drv.h:238
sdp_crypto_op_t crypto_op
Definition: hpm_sdp_drv.h:240
uint8_t key_index
Definition: hpm_sdp_drv.h:239
sdp_operation_t op
Definition: hpm_sdp_drv.h:228
bool hash_check
Definition: hpm_sdp_drv.h:233
sdp_crypto_mode_t crypto_mode
Definition: hpm_sdp_drv.h:237
sdp_calc_hash_mode_t hash_mode
Definition: hpm_sdp_drv.h:242
sdp_data_swap_mode_t key_swap_mode
Definition: hpm_sdp_drv.h:241
SDP AES context structure.
Definition: hpm_sdp_drv.h:159
uint8_t key_bits
Definition: hpm_sdp_drv.h:161
uint16_t crypto_algo
Definition: hpm_sdp_drv.h:162
uint8_t key_idx
Definition: hpm_sdp_drv.h:160
sdp_pkt_struct_t sdp_pkt
Definition: hpm_sdp_drv.h:163
SDP DMA context.
Definition: hpm_sdp_drv.h:179
sdp_pkt_struct_t sdp_pkt
Definition: hpm_sdp_drv.h:180
SDP HASH context.
Definition: hpm_sdp_drv.h:186
sdp_pkt_struct_t sdp_pkt
Definition: hpm_sdp_drv.h:187