HPM SDK
HPMicro Software Development Kit
hpm_sdp_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2023 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,
69 #endif
71 
75 typedef enum {
79 #if defined(SDP_HAS_SM3_SUPPORT) && (SDP_HAS_SM3_SUPPORT == 1)
80  sdp_hash_alg_sm3 = 8,
81  sdp_hash_alg_max = sdp_hash_alg_sm3,
82 #else
84 #endif
86 
87 #define HASH_BLOCK_SIZE (64U)
88 #define AES_BLOCK_SIZE (16U)
89 #define AES_128_KEY_SIZE (0x10U)
90 #define AES_256_KEY_SIZE (0x20U)
92 #define SM4_BLOCK_SIZE (AES_BLOCK_SIZE)
93 #define SM4_KEY_SIZE (AES_128_KEY_SIZE)
98 #define SDP_PKT_CTRL_DERSEMA_MASK (1U << 2)
99 #define SDP_PKT_CTRL_CHAIN_MASK (1U << 3)
100 #define SDP_PKT_CTRL_HASHINIT_MASK (1U << 4)
101 #define SDP_PKT_CTRL_HASHFINISH_MASK (1U << 5)
102 #define SDP_PKT_CTRL_CIPHIV_MASK (1U << 6)
103 
107 typedef struct _sdp_packet_struct {
108  struct _sdp_packet_struct *next_cmd;
109  union {
110  struct {
111  uint32_t RESERVED0: 1;
112  uint32_t PKTINT: 1;
113  uint32_t DCRSEMA: 1;
114  uint32_t CHAIN: 1;
115  uint32_t HASHINIT: 1;
116  uint32_t HASHFINISH: 1;
117  uint32_t CIPHIV: 1;
118  uint32_t RESERVED1: 17;
119  uint32_t PKTTAG: 8;
120  };
121  uint32_t PKT_CTRL;
122  } pkt_ctrl;
123  uint32_t src_addr;
124  uint32_t dst_addr;
125  uint32_t buf_size;
126  uint32_t reserved[3];
128 
132 typedef struct {
133  uint8_t key_idx;
134  uint8_t key_bits;
135  uint16_t crypto_algo;
137  uint32_t buf0[AES_BLOCK_SIZE / sizeof(uint32_t)];
138  uint32_t buf1[AES_BLOCK_SIZE / sizeof(uint32_t)];
139  uint32_t buf2[AES_BLOCK_SIZE / sizeof(uint32_t)];
140  uint32_t buf3[AES_BLOCK_SIZE / sizeof(uint32_t)];
142 
144 
145 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
146 typedef sdp_crypto_ctx_t sdp_sm4_ctx_t;
147 #endif
148 
152 typedef struct {
154 } sdp_dma_ctx_t;
155 
159 typedef struct {
161  uint32_t internal[64];
163 
167 enum {
182 };
183 
184 #ifdef __cplusplus
185 extern "C"
186 {
187 #endif
188 
189 
190 /***********************************************************************************************************************
191  * Prototypes
192  **********************************************************************************************************************/
199 
206 
217  sdp_aes_ctx_t *aes_ctx,
218  const uint8_t *key,
219  sdp_aes_key_bits_t key_bits,
220  uint32_t key_idx);
221 
222 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
232 hpm_stat_t sdp_sm4_set_key(SDP_Type *base,
233  sdp_sm4_ctx_t *sm4_ctx,
234  const uint8_t *key,
235  sdp_sm4_key_bits_t key_bits,
236  uint32_t key_idx);
237 #endif
238 
250  sdp_aes_ctx_t *aes_ctx,
251  sdp_aes_op_t op,
252  uint32_t len,
253  const uint8_t *in,
254  uint8_t *out);
255 
256 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
267 #define sdp_sm4_crypt_ecb sdp_aes_crypt_ecb
268 #endif
269 
282  sdp_aes_ctx_t *aes_ctx,
283  sdp_aes_op_t op,
284  uint32_t length,
285  const uint8_t iv[16],
286  const uint8_t *input,
287  uint8_t *output);
288 
289 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
301 #define sdp_sm4_crypt_cbc sdp_aes_crypt_cbc
302 #endif
303 
316  sdp_aes_ctx_t *aes_ctx,
317  uint8_t *nonce_counter,
318  uint8_t *input,
319  uint8_t *output,
320  uint32_t length);
321 
322 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
333 #define sdp_sm4_crypt_ctr sdp_aes_crypt_ctr
334 #endif
335 
353  sdp_aes_ctx_t *aes_ctx,
354  uint32_t input_len,
355  const uint8_t *iv,
356  uint32_t iv_len,
357  const uint8_t *aad,
358  uint32_t aad_len,
359  const uint8_t *input,
360  uint8_t *output,
361  uint8_t *tag,
362  uint32_t tag_len);
363 
364 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
381 #define sdp_sm4_ccm_generate_encrypt sdp_aes_ccm_generate_encrypt
382 #endif
383 
401  sdp_aes_ctx_t *aes_ctx,
402  uint32_t input_len,
403  const uint8_t *iv,
404  uint32_t iv_len,
405  const uint8_t *aad,
406  uint32_t aad_len,
407  const uint8_t *input,
408  uint8_t *output,
409  const uint8_t *tag,
410  uint32_t tag_len);
411 
412 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
428 #define sdp_sm4_ccm_decrypt_verify sdp_aes_ccm_decrypt_verify
429 #endif
439 hpm_stat_t sdp_memcpy(SDP_Type *base, sdp_dma_ctx_t *sdp_ctx, void *dst, const void *src, uint32_t length);
440 
450 hpm_stat_t sdp_memset(SDP_Type *base, sdp_dma_ctx_t *sdp_ctx, void *dst, uint8_t pattern, uint32_t length);
451 
460 
469 hpm_stat_t sdp_hash_update(SDP_Type *base, sdp_hash_ctx_t *hash_ctx, const uint8_t *data, uint32_t length);
470 
478 hpm_stat_t sdp_hash_finish(SDP_Type *base, sdp_hash_ctx_t *hash_ctx, uint8_t *digest);
479 
485 
486 #ifdef __cplusplus
487 }
488 #endif
489 
494 #endif /* HPM_SDP_DRV_H */
uint32_t hpm_stat_t
Definition: hpm_common.h:119
#define MAKE_STATUS(group, code)
Definition: hpm_common.h:128
@ status_group_sdp
Definition: hpm_common.h:141
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:855
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:811
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
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:652
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:610
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:902
sdp_crypto_key_bits_t sdp_sm4_key_bits_t
Definition: hpm_sdp_drv.h:39
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:944
struct _sdp_packet_struct sdp_pkt_struct_t
SDP packet data structure.
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:143
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
sdp_hash_alg_t
SDP HASH algorithm definitions.
Definition: hpm_sdp_drv.h:75
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:236
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:694
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:382
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:298
#define AES_BLOCK_SIZE
Definition: hpm_sdp_drv.h:88
@ 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
@ status_sdp_error_packet
Definition: hpm_sdp_drv.h:171
@ status_sdp_error_src
Definition: hpm_sdp_drv.h:175
@ status_sdp_error_setup
Definition: hpm_sdp_drv.h:174
@ status_sdp_aes_busy
Definition: hpm_sdp_drv.h:172
@ status_sdp_invalid_alg
Definition: hpm_sdp_drv.h:180
@ status_sdp_error_hash
Definition: hpm_sdp_drv.h:177
@ status_sdp_no_crypto_support
Definition: hpm_sdp_drv.h:168
@ status_sdp_error_chain
Definition: hpm_sdp_drv.h:178
@ status_sdp_invalid_key_src
Definition: hpm_sdp_drv.h:170
@ status_sdp_hash_busy
Definition: hpm_sdp_drv.h:173
@ status_sdp_error_invalid_mac
Definition: hpm_sdp_drv.h:179
@ status_sdp_no_hash_support
Definition: hpm_sdp_drv.h:169
@ status_sdp_error_dst
Definition: hpm_sdp_drv.h:176
@ sdp_hash_alg_sha1
Definition: hpm_sdp_drv.h:76
@ sdp_hash_alg_crc32
Definition: hpm_sdp_drv.h:77
@ sdp_hash_alg_max
Definition: hpm_sdp_drv.h:83
@ sdp_hash_alg_sha256
Definition: hpm_sdp_drv.h:78
Definition: hpm_sdp_regs.h:12
SDP AES context structure.
Definition: hpm_sdp_drv.h:132
uint8_t key_bits
Definition: hpm_sdp_drv.h:134
uint16_t crypto_algo
Definition: hpm_sdp_drv.h:135
uint8_t key_idx
Definition: hpm_sdp_drv.h:133
sdp_pkt_struct_t sdp_pkt
Definition: hpm_sdp_drv.h:136
SDP DMA context.
Definition: hpm_sdp_drv.h:152
sdp_pkt_struct_t sdp_pkt
Definition: hpm_sdp_drv.h:153
SDP HASH context.
Definition: hpm_sdp_drv.h:159
sdp_pkt_struct_t sdp_pkt
Definition: hpm_sdp_drv.h:160