20 #include "hpm_sdp_regs.h"
21 #include "hpm_soc_feature.h"
32 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
47 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
55 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
67 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
68 sdp_crypto_alg_sm4 = 1,
106 #if defined(SDP_HAS_SM3_SUPPORT) && (SDP_HAS_SM3_SUPPORT == 1)
107 sdp_hash_alg_sm3 = 8,
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)
134 typedef struct _sdp_packet_struct {
135 struct _sdp_packet_struct *next_cmd;
138 uint32_t RESERVED0: 1;
142 uint32_t HASHINIT: 1;
143 uint32_t HASHFINISH: 1;
145 uint32_t RESERVED1: 17;
153 uint32_t reserved[3];
172 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
188 uint32_t
internal[64];
293 if (key_bits == 256) {
294 uint32_t actual_key_index = key_index * 2;
295 for (uint32_t i = 0; i < 2; i++) {
297 for (uint32_t j = 0; j < 4; j++) {
298 base->
KEYDAT = *crypto_key++;
303 for (uint32_t j = 0; j < 4; j++) {
304 base->
KEYDAT = *crypto_key++;
317 for (uint32_t i = 0; i < num_words; i++) {
318 base->
HASWRD[i] = *digest++;
330 for (uint32_t i = 0; i < num_words; i++) {
331 *digest++ = base->
HASWRD[i];
342 for (uint32_t i = 0; i < 4; i++) {
397 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
409 sdp_sm4_ctx_t *sm4_ctx,
433 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
444 #define sdp_sm4_crypt_ecb sdp_aes_crypt_ecb
462 const uint8_t iv[16],
463 const uint8_t *input,
466 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
478 #define sdp_sm4_crypt_cbc sdp_aes_crypt_cbc
494 uint8_t *nonce_counter,
499 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
510 #define sdp_sm4_crypt_ctr sdp_aes_crypt_ctr
536 const uint8_t *input,
541 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
558 #define sdp_sm4_ccm_generate_encrypt sdp_aes_ccm_generate_encrypt
584 const uint8_t *input,
589 #if defined(SDP_HAS_SM4_SUPPORT) && (SDP_HAS_SM4_SUPPORT == 1)
605 #define sdp_sm4_ccm_decrypt_verify sdp_aes_ccm_decrypt_verify
#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