SemiDrive SSDK Appication Program Interface PTG3.0
pke.h
Go to the documentation of this file.
1
9#ifndef PKE_H
10#define PKE_H
11
12#ifdef __cplusplus
13extern "C" {
14#endif
15
16#include "eccp_curve.h"
17#include "register_base_addr.h"
18#include "sdrv_crypto_utility.h"
19
20#define PKE_SEC
21
22#define SUPPORT_SM2 1
23#define SUPPORT_C25519 1
24
25#ifdef SUPPORT_C25519
26extern const edward_curve_t ed25519[1];
27#endif
28
29/***************** PKE register *******************/
30#define PKE_CTRL (*((volatile uint32_t *)(PKE_BASE_ADDR)))
31#define PKE_CFG (*((volatile uint32_t *)(PKE_BASE_ADDR + 0x04)))
32#define PKE_MC_PTR (*((volatile uint32_t *)(PKE_BASE_ADDR + 0x08)))
33#define PKE_RISR (*((volatile uint32_t *)(PKE_BASE_ADDR + 0x0C)))
34#define PKE_IMCR (*((volatile uint32_t *)(PKE_BASE_ADDR + 0x10)))
35#define PKE_MISR (*((volatile uint32_t *)(PKE_BASE_ADDR + 0x14)))
36#define PKE_RT_CODE (*((volatile uint32_t *)(PKE_BASE_ADDR + 0x24)))
37#ifdef PKE_SEC
38#define PKE_RAND_SEED (*((volatile uint32_t *)(PKE_BASE_ADDR + 0x40)))
39#define PKE_RC_EN (*((volatile uint32_t *)(PKE_BASE_ADDR + 0x60)))
40#define PKE_RC_KEY (*((volatile uint32_t *)(PKE_BASE_ADDR + 0x64)))
41#define PKE_RC_D_NONCE (*((volatile uint32_t *)(PKE_BASE_ADDR + 0x68)))
42#define PKE_RC_A_NONCE (*((volatile uint32_t *)(PKE_BASE_ADDR + 0x6C)))
43#endif
44#define PKE_VERSION (*((volatile uint32_t *)(PKE_BASE_ADDR + 0xFC)))
45#define PKE_A(a, step) \
46 ((volatile uint32_t *)(PKE_BASE_ADDR + 0x0400 + (a) * (step)))
47#define PKE_B(a, step) \
48 ((volatile uint32_t *)(PKE_BASE_ADDR + 0x1000 + (a) * (step)))
49
50/*********** PKE register action offset ************/
51#define PKE_INT_ENABLE_OFFSET (8)
52#define PKE_START_CALC (1)
53
54/***************** PKE microcode ******************/
55#define MICROCODE_PDBL (0x04)
56#define MICROCODE_PADD (0x08)
57#define MICROCODE_PVER (0x0C)
58#define MICROCODE_PMUL (0x10)
59#define MICROCODE_MODEXP (0x14)
60#define MICROCODE_MODMUL (0x18)
61#define MICROCODE_MODINV (0x1C)
62#define MICROCODE_MODADD (0x20)
63#define MICROCODE_MODSUB (0x24)
64#define MICROCODE_MGMR_PRE_H (0x28)
65#define MICROCODE_INTMUL (0x2C)
66#define MICROCODE_Ed25519_PMUL (0x30)
67#define MICROCODE_Ed25519_PADD (0x34)
68#define MICROCODE_C25519_PMUL (0x38)
69#define MICROCODE_MODRES (0x3C)
70#define MICROCODE_INTADD (0x40)
71#define MICROCODE_INTSUB (0x44)
72#define MICROCODE_PMULF (0x48)
73#define MICROCODE_MGMR_PRE_H_MM (0x4C)
74#define MICROCODE_MGMR_PRE_N0 (0x50)
75#ifdef PKE_SEC
76#define MICROCODE_PMUL_SEC (0x54)
77#define MICROCODE_MODEXP_WITH_PUBKEY (0x58)
78#define MICROCODE_MODEXP_MGMR_LADDER (0x5C)
79#endif
80
81/*********** some PKE algorithm operand length ************/
82#define OPERAND_MAX_BIT_LEN (4096)
83#define OPERAND_MAX_WORD_LEN (GET_WORD_LEN(OPERAND_MAX_BIT_LEN))
84
85#define ECCP_MAX_BIT_LEN (521)
86#define ECCP_MAX_BYTE_LEN (GET_BYTE_LEN(ECCP_MAX_BIT_LEN))
87#define ECCP_MAX_WORD_LEN (GET_WORD_LEN(ECCP_MAX_BIT_LEN))
88
89#define C25519_BYTE_LEN (256 / 8)
90#define C25519_WORD_LEN (256 / 32)
91
92#define Ed25519_BYTE_LEN C25519_BYTE_LEN
93#define Ed25519_WORD_LEN C25519_WORD_LEN
94
95#define MAX_RSA_WORD_LEN OPERAND_MAX_WORD_LEN
96#define MAX_RSA_BIT_LEN (MAX_RSA_WORD_LEN << 5)
97#define MIN_RSA_BIT_LEN (512)
98
99/******************* PKE return code ********************/
110};
111
112typedef void *(*KDF_FUNC)(const void *input, uint32_t bytelen, uint8_t *key,
113 uint32_t keybytelen);
114
115uint32_t pke_get_version(void);
116
118
119uint32_t pke_modinv(const uint32_t *modulus, const uint32_t *a, uint32_t *ainv,
120 uint32_t modwordlen, uint32_t awordlen);
121
122uint32_t pke_modadd(const uint32_t *modulus, const uint32_t *a,
123 const uint32_t *b, uint32_t *out, uint32_t wordlen);
124
125uint32_t pke_modsub(const uint32_t *modulus, const uint32_t *a,
126 const uint32_t *b, uint32_t *out, uint32_t wordlen);
127
128uint32_t pke_add(const uint32_t *a, const uint32_t *b, uint32_t *out,
129 uint32_t wordlen);
130
131uint32_t pke_sub(const uint32_t *a, const uint32_t *b, uint32_t *out,
132 uint32_t wordlen);
133
134uint32_t pke_mul(const uint32_t *a, const uint32_t *b, uint32_t *out,
135 uint32_t ab_wordLen);
136
137uint32_t pke_mul_internal(const uint32_t *a, const uint32_t *b, uint32_t *out,
138 uint32_t a_wordlen, uint32_t b_wordlen,
139 uint32_t out_wordlen);
140
141uint32_t pke_pre_calc_mont(const uint32_t *modulus, uint32_t bitlen,
142 uint32_t *H);
143
144uint32_t pke_pre_calc_mont_no_output(const uint32_t *modulus, uint32_t wordlen);
145
146void pke_load_pre_calc_mont(uint32_t *H, uint32_t wordlen);
147
148uint32_t pke_modmul_internal(const uint32_t *modulus, const uint32_t *a,
149 const uint32_t *b, uint32_t *out,
150 uint32_t wordlen);
151
152uint32_t pke_modmul(const uint32_t *modulus, const uint32_t *a,
153 const uint32_t *b, uint32_t *out, uint32_t wordlen);
154
155uint32_t pke_modexp(const uint32_t *modulus, const uint32_t *exponent,
156 const uint32_t *base, uint32_t *out, uint32_t mod_wordlen,
157 uint32_t exp_wordlen);
158
159uint32_t pke_mod(uint32_t *a, uint32_t awordlen, uint32_t *b, uint32_t *b_h,
160 uint32_t bwordlen, uint32_t *c);
161
162uint32_t eccp_pointMul(eccp_curve_t *curve, uint32_t *k, uint32_t *Px,
163 uint32_t *Py, uint32_t *Qx, uint32_t *Qy);
164
165uint32_t eccp_pointMul_Shamir(eccp_curve_t *curve, uint32_t *k1, uint32_t *P1x,
166 uint32_t *P1y, uint32_t *k2, uint32_t *P2x,
167 uint32_t *P2y, uint32_t *Qx, uint32_t *Qy);
168
169uint32_t eccp_pointMul_Shamir_safe(eccp_curve_t *curve, uint32_t *k1,
170 uint32_t *P1x, uint32_t *P1y, uint32_t *k2,
171 uint32_t *P2x, uint32_t *P2y, uint32_t *Qx,
172 uint32_t *Qy);
173
174uint32_t eccp_pointMul_base(eccp_curve_t *curve, uint32_t *k, uint32_t *Qx,
175 uint32_t *Qy);
176
177uint32_t eccp_pointAdd(eccp_curve_t *curve, uint32_t *P1x, uint32_t *P1y,
178 uint32_t *P2x, uint32_t *P2y, uint32_t *Qx,
179 uint32_t *Qy);
180
181void pke_set_operand_width(uint32_t bitlen);
182
183void pke_load_operand(uint32_t *baseaddr, uint32_t *data, uint32_t wordlen);
184
186
187void pke_set_microcode(uint32_t addr);
188
189void pke_start(void);
190
191uint32_t pke_check_rt_code(void);
192
194
195/* recommended not to define */
196#define ECCP_POINT_DOUBLE
197#ifdef ECCP_POINT_DOUBLE
198uint32_t eccp_pointDouble(eccp_curve_t *curve, uint32_t *Px, uint32_t *Py,
199 uint32_t *Qx, uint32_t *Qy);
200#endif
201
202uint32_t eccp_pointVerify(eccp_curve_t *curve, uint32_t *Px, uint32_t *Py);
203
204uint32_t eccp_get_pubkey_from_prikey(eccp_curve_t *curve, uint8_t *prikey,
205 uint8_t *pubkey);
206
207uint32_t eccp_getkey(eccp_curve_t *curve, uint8_t *prikey, uint8_t *pubkey);
208
209#ifdef SUPPORT_C25519
210uint32_t x25519_pointMul(mont_curve_t *curve, uint32_t *k, uint32_t *Pu,
211 uint32_t *Qu);
212
213uint32_t ed25519_pointMul(edward_curve_t *curve, uint32_t *k, uint32_t *Px,
214 uint32_t *Py, uint32_t *Qx, uint32_t *Qy);
215
216uint32_t ed25519_pointAdd(edward_curve_t *curve, uint32_t *P1x, uint32_t *P1y,
217 uint32_t *P2x, uint32_t *P2y, uint32_t *Qx,
218 uint32_t *Qy);
219
220uint32_t ed25519_decode_point(edward_curve_t *curve, uint8_t in_y[32],
221 uint8_t out_x[32], uint8_t out_y[32]);
222#endif
223
224#ifdef PKE_SEC
225
226uint32_t pke_sec_init(void);
227
228uint32_t pke_sec_uninit(void);
229
230uint32_t pke_modexp_ladder(const uint32_t *modulus, const uint32_t *exponent,
231 const uint32_t *base, uint32_t *out,
232 uint32_t mod_wordlen, uint32_t exp_wordlen);
233
234uint32_t pke_modexp_with_pub(const uint32_t *modulus, const uint32_t *exponent,
235 const uint32_t *pub, const uint32_t *base,
236 uint32_t *out, uint32_t mod_wordlen,
237 uint32_t exp_wordlen, uint32_t pub_wordlen);
238
239uint32_t eccp_pointMul_sec(eccp_curve_t *curve, uint32_t *k, uint32_t *Px,
240 uint32_t *Py, uint32_t *Qx, uint32_t *Qy);
241
242#endif
243
244#ifdef __cplusplus
245}
246#endif
247
248#endif
Semidrive CRYPTO eccp_curve header file.
uint32_t ed25519_decode_point(edward_curve_t *curve, uint8_t in_y[32], uint8_t out_x[32], uint8_t out_y[32])
void pke_set_operand_width(uint32_t bitlen)
uint32_t pke_mul_internal(const uint32_t *a, const uint32_t *b, uint32_t *out, uint32_t a_wordlen, uint32_t b_wordlen, uint32_t out_wordlen)
uint32_t ed25519_pointAdd(edward_curve_t *curve, uint32_t *P1x, uint32_t *P1y, uint32_t *P2x, uint32_t *P2y, uint32_t *Qx, uint32_t *Qy)
uint32_t eccp_getkey(eccp_curve_t *curve, uint8_t *prikey, uint8_t *pubkey)
uint32_t pke_sec_uninit(void)
void pke_clear_interrupt(void)
uint32_t pke_modsub(const uint32_t *modulus, const uint32_t *a, const uint32_t *b, uint32_t *out, uint32_t wordlen)
void pke_start(void)
void pke_set_microcode(uint32_t addr)
void pke_wait_till_done(void)
uint32_t pke_sec_init(void)
uint32_t eccp_pointMul(eccp_curve_t *curve, uint32_t *k, uint32_t *Px, uint32_t *Py, uint32_t *Qx, uint32_t *Qy)
uint32_t pke_modexp(const uint32_t *modulus, const uint32_t *exponent, const uint32_t *base, uint32_t *out, uint32_t mod_wordlen, uint32_t exp_wordlen)
void pke_load_operand(uint32_t *baseaddr, uint32_t *data, uint32_t wordlen)
void pke_load_pre_calc_mont(uint32_t *H, uint32_t wordlen)
PKE_RET_CODE
Definition: pke.h:100
@ PKE_ERROR
Definition: pke.h:109
@ PKE_INVALID_MC
Definition: pke.h:105
@ PKE_NOT_ON_CURVE
Definition: pke.h:104
@ PKE_STOP
Definition: pke.h:102
@ PKE_NO_MODINV
Definition: pke.h:103
@ PKE_SUCCESS
Definition: pke.h:101
@ PKE_INVALID_INPUT
Definition: pke.h:108
@ PKE_INTEGER_TOO_BIG
Definition: pke.h:107
@ PKE_ZERO_ALL
Definition: pke.h:106
uint32_t pke_modexp_ladder(const uint32_t *modulus, const uint32_t *exponent, const uint32_t *base, uint32_t *out, uint32_t mod_wordlen, uint32_t exp_wordlen)
uint32_t pke_modexp_with_pub(const uint32_t *modulus, const uint32_t *exponent, const uint32_t *pub, const uint32_t *base, uint32_t *out, uint32_t mod_wordlen, uint32_t exp_wordlen, uint32_t pub_wordlen)
uint32_t eccp_pointDouble(eccp_curve_t *curve, uint32_t *Px, uint32_t *Py, uint32_t *Qx, uint32_t *Qy)
uint32_t pke_modmul(const uint32_t *modulus, const uint32_t *a, const uint32_t *b, uint32_t *out, uint32_t wordlen)
uint32_t pke_pre_calc_mont_no_output(const uint32_t *modulus, uint32_t wordlen)
uint32_t eccp_pointMul_Shamir(eccp_curve_t *curve, uint32_t *k1, uint32_t *P1x, uint32_t *P1y, uint32_t *k2, uint32_t *P2x, uint32_t *P2y, uint32_t *Qx, uint32_t *Qy)
uint32_t eccp_pointMul_sec(eccp_curve_t *curve, uint32_t *k, uint32_t *Px, uint32_t *Py, uint32_t *Qx, uint32_t *Qy)
uint32_t pke_modmul_internal(const uint32_t *modulus, const uint32_t *a, const uint32_t *b, uint32_t *out, uint32_t wordlen)
uint32_t x25519_pointMul(mont_curve_t *curve, uint32_t *k, uint32_t *Pu, uint32_t *Qu)
uint32_t eccp_pointMul_base(eccp_curve_t *curve, uint32_t *k, uint32_t *Qx, uint32_t *Qy)
uint32_t eccp_get_pubkey_from_prikey(eccp_curve_t *curve, uint8_t *prikey, uint8_t *pubkey)
uint32_t pke_check_rt_code(void)
uint32_t eccp_pointAdd(eccp_curve_t *curve, uint32_t *P1x, uint32_t *P1y, uint32_t *P2x, uint32_t *P2y, uint32_t *Qx, uint32_t *Qy)
uint32_t pke_pre_calc_mont(const uint32_t *modulus, uint32_t bitlen, uint32_t *H)
uint32_t pke_modinv(const uint32_t *modulus, const uint32_t *a, uint32_t *ainv, uint32_t modwordlen, uint32_t awordlen)
uint32_t eccp_pointVerify(eccp_curve_t *curve, uint32_t *Px, uint32_t *Py)
uint32_t pke_mod(uint32_t *a, uint32_t awordlen, uint32_t *b, uint32_t *b_h, uint32_t bwordlen, uint32_t *c)
uint32_t pke_get_version(void)
uint32_t ed25519_pointMul(edward_curve_t *curve, uint32_t *k, uint32_t *Px, uint32_t *Py, uint32_t *Qx, uint32_t *Qy)
uint32_t eccp_pointMul_Shamir_safe(eccp_curve_t *curve, uint32_t *k1, uint32_t *P1x, uint32_t *P1y, uint32_t *k2, uint32_t *P2x, uint32_t *P2y, uint32_t *Qx, uint32_t *Qy)
uint32_t pke_get_operand_bytes(void)
const edward_curve_t ed25519[1]
uint32_t pke_mul(const uint32_t *a, const uint32_t *b, uint32_t *out, uint32_t ab_wordLen)
uint32_t pke_add(const uint32_t *a, const uint32_t *b, uint32_t *out, uint32_t wordlen)
uint32_t pke_sub(const uint32_t *a, const uint32_t *b, uint32_t *out, uint32_t wordlen)
uint32_t pke_modadd(const uint32_t *modulus, const uint32_t *a, const uint32_t *b, uint32_t *out, uint32_t wordlen)
crypto utility api
Definition: eccp_curve.h:32
Definition: eccp_curve.h:89
Definition: eccp_curve.h:76