Skip to content

Commit 0ba16a9

Browse files
authored
Merge pull request wolfSSL#9104 from kojiws/export_long_key_orig_asn
Improve original implementation on SetAsymKeyDer() and the test
2 parents b096d9b + 0a9356e commit 0ba16a9

5 files changed

Lines changed: 400 additions & 44 deletions

File tree

tests/api/test_asn.c

Lines changed: 387 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,393 @@
2323

2424
#include <tests/api/test_asn.h>
2525

26+
#if defined(WC_ENABLE_ASYM_KEY_EXPORT) && defined(HAVE_ED25519)
27+
static int test_SetAsymKeyDer_once(byte* privKey, word32 privKeySz, byte* pubKey,
28+
word32 pubKeySz, byte* trueDer, word32 trueDerSz)
29+
{
30+
EXPECT_DECLS;
31+
32+
byte* calcDer = NULL;
33+
word32 calcDerSz = 0;
34+
35+
ExpectIntEQ(calcDerSz = SetAsymKeyDer(privKey, privKeySz, pubKey, pubKeySz,
36+
NULL, 0, ED25519k), trueDerSz);
37+
ExpectNotNull(calcDer = (byte*)XMALLOC(calcDerSz, NULL,
38+
DYNAMIC_TYPE_TMP_BUFFER));
39+
ExpectIntEQ(calcDerSz = SetAsymKeyDer(privKey, privKeySz, pubKey, pubKeySz,
40+
calcDer, calcDerSz, ED25519k), trueDerSz);
41+
ExpectIntEQ(XMEMCMP(calcDer, trueDer, trueDerSz), 0);
42+
XFREE(calcDer, NULL, DYNAMIC_TYPE_TMP_BUFFER);
43+
44+
return EXPECT_RESULT();
45+
}
46+
#endif /* WC_ENABLE_ASYM_KEY_EXPORT && HAVE_ED25519 */
47+
48+
int test_SetAsymKeyDer(void)
49+
{
50+
EXPECT_DECLS;
51+
52+
#if defined(WC_ENABLE_ASYM_KEY_EXPORT) && defined(HAVE_ED25519)
53+
/* We can't access the keyEd25519Oid variable, so declare it instead */
54+
byte algId[] = {43, 101, 112};
55+
byte version[] = {0x0};
56+
byte keyPat = 0xcc;
57+
58+
byte* privKey = NULL;
59+
word32 privKeySz = 0;
60+
byte* pubKey = NULL;
61+
word32 pubKeySz = 0;
62+
byte trueDer[310]; /* The largest size is 310 bytes on Condition 8 */
63+
word32 trueDerSz = 0;
64+
65+
/*
66+
* Condition 1:
67+
* PKEY data = 34 (1 to 127)
68+
* PKEY_CURVEPKEY data = 32 (1 to 127)
69+
* PUBKEY data = 0 (Empty)
70+
* SEQ data = 46 (1 to 127)
71+
*/
72+
privKeySz = 32;
73+
pubKeySz = 0;
74+
trueDerSz = 48;
75+
76+
/* SEQ */
77+
trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED;
78+
trueDer[1] = trueDerSz - 2;
79+
/* VER */
80+
trueDer[2] = ASN_INTEGER;
81+
trueDer[3] = sizeof(version);
82+
trueDer[4] = version[0];
83+
/* PKEYALGO_SEQ */
84+
trueDer[5] = ASN_SEQUENCE | ASN_CONSTRUCTED;
85+
trueDer[6] = sizeof(algId) + 2;
86+
trueDer[7] = ASN_OBJECT_ID;
87+
trueDer[8] = sizeof(algId);
88+
trueDer[9] = algId[0];
89+
trueDer[10] = algId[1];
90+
trueDer[11] = algId[2];
91+
/* PKEY */
92+
trueDer[12] = ASN_OCTET_STRING;
93+
trueDer[13] = privKeySz + 2;
94+
trueDer[14] = ASN_OCTET_STRING;
95+
trueDer[15] = privKeySz;
96+
privKey = &trueDer[16];
97+
XMEMSET(privKey, keyPat, privKeySz); /* trueDer[16] to trueDer[47] */
98+
/* PUBKEY */
99+
pubKey = NULL; /* Empty */
100+
101+
EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz,
102+
trueDer, trueDerSz));
103+
104+
/*
105+
* Condition 2:
106+
* PKEY data = 129 (128 to 255)
107+
* PKEY_CURVEKEY data = 127 (0 to 127)
108+
* PUBKEY data = 0 (Empty)
109+
* SEQ data = 142 (128 to 255)
110+
*/
111+
privKeySz = 127;
112+
pubKeySz = 0;
113+
trueDerSz = 145;
114+
115+
/* SEQ */
116+
trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED;
117+
trueDer[1] = 0x81;
118+
trueDer[2] = trueDerSz - 3;
119+
/* VER */
120+
trueDer[3] = ASN_INTEGER;
121+
trueDer[4] = sizeof(version);
122+
trueDer[5] = version[0];
123+
/* PKEYALGO_SEQ */
124+
trueDer[6] = ASN_SEQUENCE | ASN_CONSTRUCTED;
125+
trueDer[7] = sizeof(algId) + 2;
126+
trueDer[8] = ASN_OBJECT_ID;
127+
trueDer[9] = sizeof(algId);
128+
trueDer[10] = algId[0];
129+
trueDer[11] = algId[1];
130+
trueDer[12] = algId[2];
131+
/* PKEY */
132+
trueDer[13] = ASN_OCTET_STRING;
133+
trueDer[14] = 0x81;
134+
trueDer[15] = privKeySz + 2;
135+
trueDer[16] = ASN_OCTET_STRING;
136+
trueDer[17] = privKeySz;
137+
privKey = &trueDer[18];
138+
XMEMSET(privKey, keyPat, privKeySz); /* trueDer[18] to trueDer[144] */
139+
/* PUBKEY */
140+
pubKey = NULL; /* Empty */
141+
142+
EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz,
143+
trueDer, trueDerSz));
144+
145+
/*
146+
* Condition 3:
147+
* PKEY data = 131 (128 to 255)
148+
* PKEY_CURVEKEY = 128 (128 to 255)
149+
* PUBKEY data = 0 (Empty)
150+
* SEQ data =144 (128 to 255)
151+
*/
152+
privKeySz = 128;
153+
pubKeySz = 0;
154+
trueDerSz = 147;
155+
156+
/* SEQ */
157+
trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED;
158+
trueDer[1] = 0x81;
159+
trueDer[2] = trueDerSz - 3;
160+
/* VER */
161+
trueDer[3] = ASN_INTEGER;
162+
trueDer[4] = sizeof(version);
163+
trueDer[5] = version[0];
164+
/* PKEYALGO_SEQ */
165+
trueDer[6] = ASN_SEQUENCE | ASN_CONSTRUCTED;
166+
trueDer[7] = sizeof(algId) + 2;
167+
trueDer[8] = ASN_OBJECT_ID;
168+
trueDer[9] = sizeof(algId);
169+
trueDer[10] = algId[0];
170+
trueDer[11] = algId[1];
171+
trueDer[12] = algId[2];
172+
/* PKEY */
173+
trueDer[13] = ASN_OCTET_STRING;
174+
trueDer[14] = 0x81;
175+
trueDer[15] = privKeySz + 3;
176+
trueDer[16] = ASN_OCTET_STRING;
177+
trueDer[17] = 0x81;
178+
trueDer[18] = privKeySz;
179+
privKey = &trueDer[19];
180+
XMEMSET(privKey, keyPat, privKeySz); /* trueDer[19] to trueDer[146] */
181+
/* PUBKEY */
182+
pubKey = NULL; /* Empty */
183+
184+
EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz,
185+
trueDer, trueDerSz));
186+
187+
/*
188+
* Condition 4:
189+
* PKEY data = 258 (256 to 65535)
190+
* PKEY_CURVEPKEY data = 255 (128 to 255)
191+
* PUBKEY data = 0 (Empty)
192+
* SEQ data = 272 (256 to 65536)
193+
*/
194+
privKeySz = 255;
195+
pubKeySz = 0;
196+
trueDerSz = 276;
197+
198+
/* SEQ */
199+
trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED;
200+
trueDer[1] = 0x82;
201+
trueDer[2] = ((trueDerSz - 4) >> 8) & 0xff;
202+
trueDer[3] = (trueDerSz - 4) & 0xff;
203+
/* VER */
204+
trueDer[4] = ASN_INTEGER;
205+
trueDer[5] = sizeof(version);
206+
trueDer[6] = version[0];
207+
/* PKEYALGO_SEQ */
208+
trueDer[7] = ASN_SEQUENCE | ASN_CONSTRUCTED;
209+
trueDer[8] = sizeof(algId) + 2;
210+
trueDer[9] = ASN_OBJECT_ID;
211+
trueDer[10] = sizeof(algId);
212+
trueDer[11] = algId[0];
213+
trueDer[12] = algId[1];
214+
trueDer[13] = algId[2];
215+
/* PKEY */
216+
trueDer[14] = ASN_OCTET_STRING;
217+
trueDer[15] = 0x82;
218+
trueDer[16] = ((privKeySz + 3) >> 8) & 0xff;
219+
trueDer[17] = (privKeySz + 3) & 0xff;
220+
trueDer[18] = ASN_OCTET_STRING;
221+
trueDer[19] = 0x81;
222+
trueDer[20] = privKeySz;
223+
privKey = &trueDer[21];
224+
XMEMSET(privKey, keyPat, privKeySz); /* trueDer[21] to trueDer[275] */
225+
/* PUBKEY */
226+
pubKey = NULL; /* Empty */
227+
228+
EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz,
229+
trueDer, trueDerSz));
230+
231+
/*
232+
* Condition 5:
233+
* PKEY data = 260 (256 to 65535)
234+
* PKEY_CURVEPKEY data = 256 (256 to 65535)
235+
* PUBKEY data = 0 (Empty)
236+
* SEQ data = 274 (256 to 65535)
237+
*/
238+
privKeySz = 256;
239+
pubKeySz = 0;
240+
trueDerSz = 278;
241+
242+
/* SEQ */
243+
trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED;
244+
trueDer[1] = 0x82;
245+
trueDer[2] = ((trueDerSz - 4) >> 8) & 0xff;
246+
trueDer[3] = (trueDerSz - 4) & 0xff;
247+
/* VER */
248+
trueDer[4] = ASN_INTEGER;
249+
trueDer[5] = sizeof(version);
250+
trueDer[6] = version[0];
251+
/* PKEYALGO_SEQ */
252+
trueDer[7] = ASN_SEQUENCE | ASN_CONSTRUCTED;
253+
trueDer[8] = sizeof(algId) + 2;
254+
trueDer[9] = ASN_OBJECT_ID;
255+
trueDer[10] = sizeof(algId);
256+
trueDer[11] = algId[0];
257+
trueDer[12] = algId[1];
258+
trueDer[13] = algId[2];
259+
/* PKEY */
260+
trueDer[14] = ASN_OCTET_STRING;
261+
trueDer[15] = 0x82;
262+
trueDer[16] = ((privKeySz + 4) >> 8) & 0xff;
263+
trueDer[17] = (privKeySz + 4) & 0xff;
264+
trueDer[18] = ASN_OCTET_STRING;
265+
trueDer[19] = 0x82;
266+
trueDer[20] = (privKeySz >> 8) & 0xff;
267+
trueDer[21] = privKeySz & 0xff;
268+
privKey = &trueDer[22];
269+
XMEMSET(privKey, keyPat, privKeySz); /* trueDer[22] to trueDer[277] */
270+
/* PUBKEY */
271+
pubKey = NULL; /* Empty */
272+
273+
EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz,
274+
trueDer, trueDerSz));
275+
276+
/*
277+
* Condition 6:
278+
* PKEY data = 34 (1 to 127)
279+
* PKEY_CURVEPKEY data = 32 (1 to 127)
280+
* PUBKEY data = 32 (1 to 127)
281+
* SEQ data = 80 (1 to 127)
282+
*/
283+
privKeySz = 32;
284+
pubKeySz = 32;
285+
trueDerSz = 82;
286+
287+
/* SEQ */
288+
trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED;
289+
trueDer[1] = trueDerSz - 2;
290+
/* VER */
291+
trueDer[2] = ASN_INTEGER;
292+
trueDer[3] = sizeof(version);
293+
trueDer[4] = version[0];
294+
/* PKEYALGO_SEQ */
295+
trueDer[5] = ASN_SEQUENCE | ASN_CONSTRUCTED;
296+
trueDer[6] = sizeof(algId) + 2;
297+
trueDer[7] = ASN_OBJECT_ID;
298+
trueDer[8] = sizeof(algId);
299+
trueDer[9] = algId[0];
300+
trueDer[10] = algId[1];
301+
trueDer[11] = algId[2];
302+
/* PKEY */
303+
trueDer[12] = ASN_OCTET_STRING;
304+
trueDer[13] = privKeySz + 2;
305+
trueDer[14] = ASN_OCTET_STRING;
306+
trueDer[15] = privKeySz;
307+
privKey = &trueDer[16];
308+
XMEMSET(privKey, keyPat, privKeySz); /* trueDer[16] to trueDer[47] */
309+
/* PUBKEY */
310+
trueDer[48] = ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_PUBKEY;
311+
trueDer[49] = pubKeySz;
312+
pubKey = &trueDer[50];
313+
XMEMSET(pubKey, keyPat, pubKeySz); /* trueDer[50] to trueDer[81] */
314+
315+
EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz,
316+
trueDer, trueDerSz));
317+
318+
/*
319+
* Condition 7:
320+
* PKEY data = 34 (1 to 127)
321+
* PKEY_CURVEPKEY data = 32 (1 to 127)
322+
* PUBKEY data = 128 (128 to 255)
323+
* SEQ data = 180 (128 to 255)
324+
*/
325+
privKeySz = 32;
326+
pubKeySz = 128;
327+
trueDerSz = 180;
328+
329+
/* SEQ */
330+
trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED;
331+
trueDer[1] = 0x81;
332+
trueDer[2] = trueDerSz - 3;
333+
/* VER */
334+
trueDer[3] = ASN_INTEGER;
335+
trueDer[4] = sizeof(version);
336+
trueDer[5] = version[0];
337+
/* PKEYALGO_SEQ */
338+
trueDer[6] = ASN_SEQUENCE | ASN_CONSTRUCTED;
339+
trueDer[7] = sizeof(algId) + 2;
340+
trueDer[8] = ASN_OBJECT_ID;
341+
trueDer[9] = sizeof(algId);
342+
trueDer[10] = algId[0];
343+
trueDer[11] = algId[1];
344+
trueDer[12] = algId[2];
345+
/* PKEY */
346+
trueDer[13] = ASN_OCTET_STRING;
347+
trueDer[14] = privKeySz + 2;
348+
trueDer[15] = ASN_OCTET_STRING;
349+
trueDer[16] = privKeySz;
350+
privKey = &trueDer[17];
351+
XMEMSET(privKey, keyPat, privKeySz); /* trueDer[17] to trueDer[48] */
352+
/* PUBKEY */
353+
trueDer[49] = ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_PUBKEY;
354+
trueDer[50] = 0x81;
355+
trueDer[51] = pubKeySz;
356+
pubKey = &trueDer[52];
357+
XMEMSET(pubKey, keyPat, pubKeySz); /* trueDer[52] to trueDer[179] */
358+
359+
EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz,
360+
trueDer, trueDerSz));
361+
362+
/*
363+
* Condition 8:
364+
* PKEY data = 34 (1 to 127)
365+
* PKEY_CURVEPKEY data = 32 (1 to 127)
366+
* PUBKEY data = 256 (256 to 65535)
367+
* SEQ data = 306 (256 to 65535)
368+
*/
369+
privKeySz = 32;
370+
pubKeySz = 256;
371+
trueDerSz = 310;
372+
373+
/* SEQ */
374+
trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED;
375+
trueDer[1] = 0x82;
376+
trueDer[2] = ((trueDerSz - 4) >> 8) & 0xff;
377+
trueDer[3] = (trueDerSz - 4) & 0xff;
378+
/* VER */
379+
trueDer[4] = ASN_INTEGER;
380+
trueDer[5] = sizeof(version);
381+
trueDer[6] = version[0];
382+
/* PKEYALGO_SEQ */
383+
trueDer[7] = ASN_SEQUENCE | ASN_CONSTRUCTED;
384+
trueDer[8] = sizeof(algId) + 2;
385+
trueDer[9] = ASN_OBJECT_ID;
386+
trueDer[10] = sizeof(algId);
387+
trueDer[11] = algId[0];
388+
trueDer[12] = algId[1];
389+
trueDer[13] = algId[2];
390+
/* PKEY */
391+
trueDer[14] = ASN_OCTET_STRING;
392+
trueDer[15] = privKeySz + 2;
393+
trueDer[16] = ASN_OCTET_STRING;
394+
trueDer[17] = privKeySz;
395+
privKey = &trueDer[18];
396+
XMEMSET(privKey, keyPat, privKeySz); /* trueDer[18] to trueDer[49] */
397+
/* PUBKEY */
398+
trueDer[50] = ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_PUBKEY;
399+
trueDer[51] = 0x82;
400+
trueDer[52] = (pubKeySz >> 8) & 0xff;
401+
trueDer[53] = pubKeySz & 0xff;
402+
pubKey = &trueDer[54];
403+
XMEMSET(pubKey, keyPat, pubKeySz); /* trueDer[54] to trueDer[309] */
404+
405+
EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz,
406+
trueDer, trueDerSz));
407+
#endif /* WC_ENABLE_ASYM_KEY_EXPORT && HAVE_ED25519 */
408+
409+
return EXPECT_RESULT();
410+
411+
}
412+
26413
#ifndef NO_ASN
27414
static int test_SetShortInt_once(word32 val, byte* valDer, word32 valDerSz)
28415
{

0 commit comments

Comments
 (0)