API参考
载入中...
搜索中...
未找到
sm9.h
1/*
2 * This file is part of the openHiTLS project.
3 *
4 * openHiTLS is licensed under the Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 *
8 * http://license.coscl.org.cn/MulanPSL2
9 *
10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13 * See the Mulan PSL v2 for more details.
14 */
15
16#ifndef __HEADER_SM9_ALG_H__
17#define __HEADER_SM9_ALG_H__
18
19#include "hitls_build.h"
20#ifdef HITLS_CRYPTO_SM9
21
22#include <stdint.h>
23#include "sm9_curve.h"
24
25/*=======================SM3 Adaptation Layer Functions======================*/
26
27// SM3 hash functions
28void SM9_Hash_Init(SM9_Hash_Ctx *ctx);
29void SM9_Hash_Update(SM9_Hash_Ctx *ctx, const uint8_t *data, uint32_t len);
30void SM9_Hash_Final(SM9_Hash_Ctx *ctx, uint8_t *digest);
31void SM9_Hash_Data(const uint8_t *data, uint32_t len, uint8_t *digest);
32
33#define SM3_Alg_Data SM9_Hash_Data
34
40void sm9_rand(uint8_t *p, uint32_t len);
41
42/*----------------------SM9 algorithem length define--------------------------*/
43#define SM9_CURVE_MODULE_BYTES 32
44
45#define SM9_MODE_NUL 0
46#define SM9_MODE_SIG 1
47#define SM9_MODE_ENC 3
48
49#define SM9_SIG_SYS_PRIKEY_BYTES SM9_CURVE_MODULE_BYTES
50#define SM9_SIG_SYS_PUBKEY_BYTES (4*SM9_CURVE_MODULE_BYTES)
51#define SM9_SIG_USR_PRIKEY_BYTES (2*SM9_CURVE_MODULE_BYTES)
52
53#define SM9_ENC_SYS_PRIKEY_BYTES SM9_CURVE_MODULE_BYTES
54#define SM9_ENC_SYS_PUBKEY_BYTES (2*SM9_CURVE_MODULE_BYTES)
55#define SM9_ENC_USR_PRIKEY_BYTES (4*SM9_CURVE_MODULE_BYTES)
56
57#define SM9_SIGNATURE_BYTES (3*SM9_CURVE_MODULE_BYTES)
58
59#define SM9_KEYEX_RA_BYTES (2*SM9_CURVE_MODULE_BYTES)
60#define SM9_KEYEX_RB_BYTES (2*SM9_CURVE_MODULE_BYTES)
61
62#define SM9_OPT_DM_MODE0 0x00
63#define SM9_OPT_DM_MODE1 0x04
64#define SM9_OPT_DM_MODE2 0x02
65#define SM9_OPT_DM_MODE3 0x06
66
67/*----------------------SM9 algorithem error code-----------------------------*/
68#define SM9_OK 0 // OK
69#define SM9_ERR_ID_UNUSEABLE 0x3F01 // Current ID cannot use
70#define SM9_ERR_RND_UNUSEABLE 0x3F02 // Current rand number cannot use
71#define SM9_ERR_BAD_INPUT 0x3F03
72#define SM9_ERR_VERIFY_FAILED 0x3F04
73#define SM9_ERR_INVALID_POINT 0x3F05
74#define SM9_ERR_MAC_FAILED 0x3F06
75#define SM9_ERR_INPUT 0x3F07
76#define SM9_ERR_MODE_UNUSEABLE 0x3F0E
77#define SM9_ERR_NODEINFO 0x3F0A
78#define SM9_ERR_UNSUPPORT 0x3F0F
79
80/*============================================================================*/
81
82#ifdef __cplusplus
83extern "C" {
84#endif
85
86int32_t SM9_Alg_GetVersion();
87
88int32_t SM9_Alg_Pair(
89 uint8_t *g,
90 uint8_t *p1,
91 uint8_t *p2);
92
93int32_t SM9_Get_Sig_G(uint8_t *g, uint8_t *mpk);
94
95int32_t SM9_Get_Enc_G(uint8_t *g, uint8_t *mpk);
96
97int32_t SM9_Alg_MSKG(
98 uint8_t *ks,
99 uint8_t *mpk);
100
101int32_t SM9_Alg_USKG(
102 const uint8_t *id,
103 uint32_t ilen,
104 uint8_t *ks,
105 uint8_t *ds);
106
107int32_t SM9_Alg_Sign(
108 const uint8_t *msg,
109 uint32_t mlen,
110 const uint8_t *ds,
111 uint8_t *r,
112 const uint8_t *g,
113 const uint8_t *mpk,
114 uint8_t *sign);
115
116int32_t SM9_Sign(
117 uint32_t opt,
118 const uint8_t *msg,
119 uint32_t mlen,
120 const uint8_t *ds,
121 uint8_t *r,
122 const uint8_t *g,
123 const uint8_t *mpk,
124 uint8_t *sign,
125 uint32_t *slen);
126
127int32_t SM9_Alg_Verify(
128 const uint8_t *msg,
129 uint32_t mlen,
130 const uint8_t *id,
131 uint32_t ilen,
132 const uint8_t *g,
133 const uint8_t *mpk,
134 const uint8_t *sign);
135
136int32_t SM9_Verify(
137 uint32_t opt,
138 const uint8_t *msg,
139 uint32_t mlen,
140 const uint8_t *id,
141 uint32_t ilen,
142 const uint8_t *g,
143 const uint8_t *mpk,
144 const uint8_t *sign,
145 uint8_t slen);
146
147int32_t SM9_Alg_MEKG(
148 uint8_t *ke,
149 uint8_t *mpk);
150
151int32_t SM9_Alg_UEKG(
152 const uint8_t *id,
153 uint32_t ilen,
154 uint8_t *ke,
155 uint8_t *de);
156
157int32_t SM9_Alg_Enc(
158 const uint8_t *msg,
159 uint32_t mlen,
160 const uint8_t *id,
161 uint32_t ilen,
162 uint8_t *r,
163 const uint8_t *g,
164 const uint8_t *mpk,
165 uint8_t *enc,
166 uint32_t *elen);
167
168int32_t SM9_Alg_Dec(
169 const uint8_t *enc,
170 uint32_t elen,
171 const uint8_t *de,
172 const uint8_t *id,
173 uint32_t ilen,
174 uint8_t *msg,
175 uint32_t *mlen);
176
177int32_t SM9_Alg_KeyEx_InitA(
178 uint8_t *ida,
179 uint32_t ilen_a,
180 uint8_t *idb,
181 uint32_t ilen_b,
182 uint8_t *ra,
183 uint8_t *da,
184 uint8_t *mpk,
185 uint8_t *RA);
186
187int32_t SM9_Alg_KeyEx_InitB(
188 uint8_t *ida,
189 uint32_t ilen_a,
190 uint8_t *idb,
191 uint32_t ilen_b,
192 uint8_t *rb,
193 uint8_t *db,
194 uint8_t *mpk,
195 uint8_t *RB);
196
197// User A confirms and generates shared key SK_A and confirmation value SA
198// This function only generates, does not verify SB
199int32_t SM9_Alg_KeyEx_ConfirmA(
200 uint8_t *ida,
201 uint32_t ilen_a,
202 uint8_t *idb,
203 uint32_t ilen_b,
204 uint8_t *ra,
205 uint8_t *RA,
206 uint8_t *RB,
207 uint8_t *da,
208 uint8_t *mpk,
209 uint32_t klen,
210 uint8_t *SK, // Output: Shared key
211 uint8_t *SA); // Output: Confirmation value SA for User A
212
213// User B confirms and generates shared key SK_B and confirmation value SB
214// This function only generates, does not verify SA
215int32_t SM9_Alg_KeyEx_ConfirmB(
216 uint8_t *ida,
217 uint32_t ilen_a,
218 uint8_t *idb,
219 uint32_t ilen_b,
220 uint8_t *rb,
221 uint8_t *RA,
222 uint8_t *RB,
223 uint8_t *db,
224 uint8_t *mpk,
225 uint32_t klen,
226 uint8_t *SK, // Output: Shared key
227 uint8_t *SB); // Output: Confirmation value SB for User B
228
229// User B verifies SA received from User A (standalone verification function)
230int32_t SM9_Alg_KeyEx_VerifySA(
231 uint8_t *ida,
232 uint32_t ilen_a,
233 uint8_t *idb,
234 uint32_t ilen_b,
235 uint8_t *rb,
236 uint8_t *RA,
237 uint8_t *RB,
238 uint8_t *db,
239 uint8_t *mpk,
240 uint8_t *SA); // Input: SA received from User A
241
242// User A verifies SB received from User B (standalone verification function)
243int32_t SM9_Alg_KeyEx_VerifySB(
244 uint8_t *ida,
245 uint32_t ilen_a,
246 uint8_t *idb,
247 uint32_t ilen_b,
248 uint8_t *ra,
249 uint8_t *RA,
250 uint8_t *RB,
251 uint8_t *da,
252 uint8_t *mpk,
253 uint8_t *SB); // Input: SB received from User B
254
255#ifdef __cplusplus
256}
257#endif
258
259#endif // HITLS_CRYPTO_SM9
260#endif /* __HEADER_SM9_Alg_H__ */