Skip to content

Commit 6e49aa7

Browse files
authored
Merge pull request #7421 from philljj/update_lms_parms
Update enum wc_LmsParm for wolfboot support.
2 parents c26f404 + 094ddb6 commit 6e49aa7

4 files changed

Lines changed: 186 additions & 53 deletions

File tree

wolfcrypt/benchmark/benchmark.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9860,8 +9860,8 @@ void bench_lms(void)
98609860
#endif
98619861

98629862
#if defined(WOLFSSL_WC_LMS) && !defined(LMS_PARAMS_BENCHED)
9863-
bench_lms_keygen(0x100, pub);
9864-
bench_lms_sign_verify(0x100, pub);
9863+
bench_lms_keygen(WC_LMS_PARM_L1_H5_W1, pub);
9864+
bench_lms_sign_verify(WC_LMS_PARM_L1_H5_W1, pub);
98659865
#endif
98669866

98679867
return;

wolfcrypt/src/ext_lms.c

Lines changed: 101 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -160,38 +160,77 @@ const char * wc_LmsKey_ParmToStr(enum wc_LmsParm lmsParm)
160160
{
161161
switch (lmsParm) {
162162
case WC_LMS_PARM_NONE:
163-
return "LMS_NONE";
164-
163+
return "LMS/HSS NONE";
164+
case WC_LMS_PARM_L1_H5_W1:
165+
return "LMS/HSS L1_H5_W1";
166+
case WC_LMS_PARM_L1_H5_W2:
167+
return "LMS/HSS L1_H5_W2";
168+
case WC_LMS_PARM_L1_H5_W4:
169+
return "LMS/HSS L1_H5_W4";
170+
case WC_LMS_PARM_L1_H5_W8:
171+
return "LMS/HSS L1_H5_W8";
172+
case WC_LMS_PARM_L1_H10_W2:
173+
return "LMS/HSS L1_H10_W2";
174+
case WC_LMS_PARM_L1_H10_W4:
175+
return "LMS/HSS L1_H10_W4";
176+
case WC_LMS_PARM_L1_H10_W8:
177+
return "LMS/HSS L1_H10_W8";
165178
case WC_LMS_PARM_L1_H15_W2:
166179
return "LMS/HSS L1_H15_W2";
167-
168180
case WC_LMS_PARM_L1_H15_W4:
169181
return "LMS/HSS L1_H15_W4";
170-
182+
case WC_LMS_PARM_L1_H15_W8:
183+
return "LMS/HSS L1_H15_W8";
184+
case WC_LMS_PARM_L1_H20_W2:
185+
return "LMS/HSS L1_H20_W2";
186+
case WC_LMS_PARM_L1_H20_W4:
187+
return "LMS/HSS L1_H20_W4";
188+
case WC_LMS_PARM_L1_H20_W8:
189+
return "LMS/HSS L1_H20_W8";
190+
case WC_LMS_PARM_L2_H5_W2:
191+
return "LMS/HSS L2_H5_W2";
192+
case WC_LMS_PARM_L2_H5_W4:
193+
return "LMS/HSS L2_H5_W4";
194+
case WC_LMS_PARM_L2_H5_W8:
195+
return "LMS/HSS L2_H5_W8";
171196
case WC_LMS_PARM_L2_H10_W2:
172197
return "LMS/HSS L2_H10_W2";
173-
174198
case WC_LMS_PARM_L2_H10_W4:
175199
return "LMS/HSS L2_H10_W4";
176-
177200
case WC_LMS_PARM_L2_H10_W8:
178201
return "LMS/HSS L2_H10_W8";
179-
202+
case WC_LMS_PARM_L2_H15_W2:
203+
return "LMS/HSS L2_H15_W2";
204+
case WC_LMS_PARM_L2_H15_W4:
205+
return "LMS/HSS L2_H15_W4";
206+
case WC_LMS_PARM_L2_H15_W8:
207+
return "LMS/HSS L2_H15_W8";
208+
case WC_LMS_PARM_L2_H20_W2:
209+
return "LMS/HSS L2_H20_W2";
210+
case WC_LMS_PARM_L2_H20_W4:
211+
return "LMS/HSS L2_H20_W4";
212+
case WC_LMS_PARM_L2_H20_W8:
213+
return "LMS/HSS L2_H20_W8";
180214
case WC_LMS_PARM_L3_H5_W2:
181215
return "LMS/HSS L3_H5_W2";
182-
183216
case WC_LMS_PARM_L3_H5_W4:
184217
return "LMS/HSS L3_H5_W4";
185-
186218
case WC_LMS_PARM_L3_H5_W8:
187219
return "LMS/HSS L3_H5_W8";
188-
189220
case WC_LMS_PARM_L3_H10_W4:
190221
return "LMS/HSS L3_H10_W4";
191-
222+
case WC_LMS_PARM_L3_H10_W8:
223+
return "LMS/HSS L3_H10_W8";
224+
case WC_LMS_PARM_L4_H5_W2:
225+
return "LMS/HSS L4_H5_W2";
226+
case WC_LMS_PARM_L4_H5_W4:
227+
return "LMS/HSS L4_H5_W4";
192228
case WC_LMS_PARM_L4_H5_W8:
193229
return "LMS/HSS L4_H5_W8";
194-
230+
case WC_LMS_PARM_L4_H10_W4:
231+
return "LMS/HSS L4_H10_W4";
232+
case WC_LMS_PARM_L4_H10_W8:
233+
return "LMS/HSS L4_H10_W8";
195234
default:
196235
WOLFSSL_MSG("error: invalid LMS parameter");
197236
break;
@@ -279,36 +318,76 @@ int wc_LmsKey_SetLmsParm(LmsKey * key, enum wc_LmsParm lmsParm)
279318
/* If NONE is passed, default to the lowest predefined set. */
280319
switch (lmsParm) {
281320
case WC_LMS_PARM_NONE:
321+
case WC_LMS_PARM_L1_H5_W1:
322+
return wc_LmsKey_SetParameters(key, 1, 5, 1);
323+
case WC_LMS_PARM_L1_H5_W2:
324+
return wc_LmsKey_SetParameters(key, 1, 5, 2);
325+
case WC_LMS_PARM_L1_H5_W4:
326+
return wc_LmsKey_SetParameters(key, 1, 5, 4);
327+
case WC_LMS_PARM_L1_H5_W8:
328+
return wc_LmsKey_SetParameters(key, 1, 5, 8);
329+
case WC_LMS_PARM_L1_H10_W2:
330+
return wc_LmsKey_SetParameters(key, 1, 10, 2);
331+
case WC_LMS_PARM_L1_H10_W4:
332+
return wc_LmsKey_SetParameters(key, 1, 10, 4);
333+
case WC_LMS_PARM_L1_H10_W8:
334+
return wc_LmsKey_SetParameters(key, 1, 10, 8);
282335
case WC_LMS_PARM_L1_H15_W2:
283336
return wc_LmsKey_SetParameters(key, 1, 15, 2);
284-
285337
case WC_LMS_PARM_L1_H15_W4:
286338
return wc_LmsKey_SetParameters(key, 1, 15, 4);
287-
339+
case WC_LMS_PARM_L1_H15_W8:
340+
return wc_LmsKey_SetParameters(key, 1, 15, 8);
341+
case WC_LMS_PARM_L1_H20_W2:
342+
return wc_LmsKey_SetParameters(key, 1, 20, 2);
343+
case WC_LMS_PARM_L1_H20_W4:
344+
return wc_LmsKey_SetParameters(key, 1, 20, 4);
345+
case WC_LMS_PARM_L1_H20_W8:
346+
return wc_LmsKey_SetParameters(key, 1, 20, 8);
347+
case WC_LMS_PARM_L2_H5_W2:
348+
return wc_LmsKey_SetParameters(key, 2, 5, 2);
349+
case WC_LMS_PARM_L2_H5_W4:
350+
return wc_LmsKey_SetParameters(key, 2, 5, 4);
351+
case WC_LMS_PARM_L2_H5_W8:
352+
return wc_LmsKey_SetParameters(key, 2, 5, 8);
288353
case WC_LMS_PARM_L2_H10_W2:
289354
return wc_LmsKey_SetParameters(key, 2, 10, 2);
290-
291355
case WC_LMS_PARM_L2_H10_W4:
292356
return wc_LmsKey_SetParameters(key, 2, 10, 4);
293-
294357
case WC_LMS_PARM_L2_H10_W8:
295358
return wc_LmsKey_SetParameters(key, 2, 10, 8);
296-
359+
case WC_LMS_PARM_L2_H15_W2:
360+
return wc_LmsKey_SetParameters(key, 2, 15, 2);
361+
case WC_LMS_PARM_L2_H15_W4:
362+
return wc_LmsKey_SetParameters(key, 2, 15, 4);
363+
case WC_LMS_PARM_L2_H15_W8:
364+
return wc_LmsKey_SetParameters(key, 2, 15, 8);
365+
case WC_LMS_PARM_L2_H20_W2:
366+
return wc_LmsKey_SetParameters(key, 2, 20, 2);
367+
case WC_LMS_PARM_L2_H20_W4:
368+
return wc_LmsKey_SetParameters(key, 2, 20, 4);
369+
case WC_LMS_PARM_L2_H20_W8:
370+
return wc_LmsKey_SetParameters(key, 2, 20, 8);
297371
case WC_LMS_PARM_L3_H5_W2:
298372
return wc_LmsKey_SetParameters(key, 3, 5, 2);
299-
300373
case WC_LMS_PARM_L3_H5_W4:
301374
return wc_LmsKey_SetParameters(key, 3, 5, 4);
302-
303375
case WC_LMS_PARM_L3_H5_W8:
304376
return wc_LmsKey_SetParameters(key, 3, 5, 8);
305-
306377
case WC_LMS_PARM_L3_H10_W4:
307378
return wc_LmsKey_SetParameters(key, 3, 10, 4);
308-
379+
case WC_LMS_PARM_L3_H10_W8:
380+
return wc_LmsKey_SetParameters(key, 3, 10, 8);
381+
case WC_LMS_PARM_L4_H5_W2:
382+
return wc_LmsKey_SetParameters(key, 4, 5, 2);
383+
case WC_LMS_PARM_L4_H5_W4:
384+
return wc_LmsKey_SetParameters(key, 4, 5, 4);
309385
case WC_LMS_PARM_L4_H5_W8:
310386
return wc_LmsKey_SetParameters(key, 4, 5, 8);
311-
387+
case WC_LMS_PARM_L4_H10_W4:
388+
return wc_LmsKey_SetParameters(key, 4, 10, 4);
389+
case WC_LMS_PARM_L4_H10_W8:
390+
return wc_LmsKey_SetParameters(key, 4, 10, 8);
312391
default:
313392
WOLFSSL_MSG("error: invalid LMS parameter set");
314393
break;

wolfcrypt/test/test.c

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,8 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t scrypt_test(void);
639639
#endif
640640
#if defined(WOLFSSL_HAVE_LMS)
641641
#if !defined(WOLFSSL_SMALL_STACK)
642-
#if defined(WOLFSSL_WC_LMS) && (LMS_MAX_HEIGHT >= 10)
642+
#if (defined(WOLFSSL_WC_LMS) && (LMS_MAX_HEIGHT >= 10)) || \
643+
defined(HAVE_LIBLMS)
643644
WOLFSSL_TEST_SUBROUTINE wc_test_ret_t lms_test_verify_only(void);
644645
#endif
645646
#endif
@@ -1807,7 +1808,8 @@ options: [-s max_relative_stack_bytes] [-m max_relative_heap_memory_bytes]\n\
18071808

18081809
#if defined(WOLFSSL_HAVE_LMS)
18091810
#if !defined(WOLFSSL_SMALL_STACK)
1810-
#if defined(WOLFSSL_WC_LMS) && (LMS_MAX_HEIGHT >= 10)
1811+
#if (defined(WOLFSSL_WC_LMS) && (LMS_MAX_HEIGHT >= 10)) || \
1812+
defined(HAVE_LIBLMS)
18111813
if ( (ret = lms_test_verify_only()) != 0)
18121814
TEST_FAIL("LMS Vfy test failed!\n", ret);
18131815
else
@@ -38583,7 +38585,8 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t lms_test(void)
3858338585
#endif /* if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY) */
3858438586

3858538587
#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_SMALL_STACK)
38586-
#if defined(WOLFSSL_WC_LMS) && (LMS_MAX_HEIGHT >= 10)
38588+
#if (defined(WOLFSSL_WC_LMS) && (LMS_MAX_HEIGHT >= 10)) || \
38589+
defined(HAVE_LIBLMS)
3858738590

3858838591
/* A simple LMS verify only test.
3858938592
*
@@ -38807,18 +38810,23 @@ static byte lms_L1H10W8_sig[LMS_L1H10W8_SIGLEN] =
3880738810

3880838811
WOLFSSL_TEST_SUBROUTINE wc_test_ret_t lms_test_verify_only(void)
3880938812
{
38810-
int ret = -1;
38811-
int ret2 = -1;
38812-
int j = 0;
38813-
LmsKey verifyKey;
38814-
word32 sigSz = 0;
38815-
word32 msgSz = sizeof(lms_msg);
38816-
word32 pubLen = 0;
38817-
int levels = 0;
38818-
int height = 0;
38819-
int winternitz = 0;
38813+
LmsKey verifyKey;
38814+
unsigned char pub_raw[HSS_MAX_PUBLIC_KEY_LEN];
38815+
word32 pub_len = sizeof(pub_raw);
38816+
word32 sigSz = 0;
38817+
word32 msgSz = sizeof(lms_msg);
38818+
word32 pubSz = 0;
38819+
int levels = 0;
38820+
int height = 0;
38821+
int winternitz = 0;
38822+
int ret = -1;
38823+
int ret2 = -1;
38824+
int j = 0;
38825+
int n_diff = 0;
3882038826
WOLFSSL_ENTER("lms_test_verify_only");
3882138827

38828+
XMEMSET(pub_raw, 0, sizeof(pub_raw));
38829+
3882238830
ret = wc_LmsKey_Init(&verifyKey, NULL, INVALID_DEVID);
3882338831
if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); }
3882438832

@@ -38839,12 +38847,12 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t lms_test_verify_only(void)
3883938847
return -1;
3884038848
}
3884138849

38842-
ret = wc_LmsKey_GetPubLen(&verifyKey, &pubLen);
38850+
ret = wc_LmsKey_GetPubLen(&verifyKey, &pubSz);
3884338851
if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); }
3884438852

38845-
if (pubLen != HSS_MAX_PUBLIC_KEY_LEN) {
38846-
printf("error: got %u, expected %d\n", pubLen, HSS_MAX_PUBLIC_KEY_LEN);
38847-
return WC_TEST_RET_ENC_EC(pubLen);
38853+
if (pubSz != HSS_MAX_PUBLIC_KEY_LEN) {
38854+
printf("error: got %u, expected %d\n", pubSz, HSS_MAX_PUBLIC_KEY_LEN);
38855+
return WC_TEST_RET_ENC_EC(pubSz);
3884838856
}
3884938857

3885038858
ret = wc_LmsKey_GetSigLen(&verifyKey, &sigSz);
@@ -38862,6 +38870,27 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t lms_test_verify_only(void)
3886238870
return WC_TEST_RET_ENC_EC(ret);
3886338871
}
3886438872

38873+
/* Now test the ExportPubRaw API, verify we recover the original pub. */
38874+
ret = wc_LmsKey_ExportPubRaw(&verifyKey, pub_raw, &pub_len);
38875+
if (ret != 0) {
38876+
printf("error: wc_LmsKey_ExportPubRaw returned %d, expected 0\n", ret);
38877+
return WC_TEST_RET_ENC_EC(ret);
38878+
}
38879+
38880+
if (pub_len != HSS_MAX_PUBLIC_KEY_LEN) {
38881+
printf("error: LMS pub len %d, expected %d\n", pub_len,
38882+
HSS_MAX_PUBLIC_KEY_LEN);
38883+
return WC_TEST_RET_ENC_EC(pub_len);
38884+
}
38885+
38886+
n_diff = XMEMCMP(pub_raw, lms_L1H10W8_pub, sizeof(lms_L1H10W8_pub));
38887+
38888+
if (n_diff != 0) {
38889+
printf("error: exported and imported pub raw do not match: %d\n",
38890+
n_diff);
38891+
return WC_TEST_RET_ENC_EC(n_diff);
38892+
}
38893+
3886538894
/* Flip bits in message. This should fail. */
3886638895
lms_msg[msgSz / 2] ^= 1;
3886738896
ret2 = wc_LmsKey_Verify(&verifyKey, lms_L1H10W8_sig, LMS_L1H10W8_SIGLEN,

wolfssl/wolfcrypt/lms.h

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -75,20 +75,45 @@ enum wc_LmsRc {
7575

7676
/* Predefined LMS/HSS parameter sets for convenience.
7777
*
78-
* Not predefining a set with Winternitz=1, because the signatures
78+
* Not predefining many sets with Winternitz=1, because the signatures
7979
* will be large. */
8080
enum wc_LmsParm {
81-
WC_LMS_PARM_NONE = 0,
82-
WC_LMS_PARM_L1_H15_W2 = 1, /* 1 level Merkle tree of 15 height. */
83-
WC_LMS_PARM_L1_H15_W4 = 2,
84-
WC_LMS_PARM_L2_H10_W2 = 3, /* 2 level Merkle tree of 10 height. */
85-
WC_LMS_PARM_L2_H10_W4 = 4,
86-
WC_LMS_PARM_L2_H10_W8 = 5,
87-
WC_LMS_PARM_L3_H5_W2 = 6, /* 3 level Merkle tree of 5 height. */
88-
WC_LMS_PARM_L3_H5_W4 = 7,
89-
WC_LMS_PARM_L3_H5_W8 = 8,
90-
WC_LMS_PARM_L3_H10_W4 = 9, /* 3 level Merkle tree of 10 height. */
91-
WC_LMS_PARM_L4_H5_W8 = 10, /* 4 level Merkle tree of 5 height. */
81+
WC_LMS_PARM_NONE = 0,
82+
WC_LMS_PARM_L1_H5_W1 = 1,
83+
WC_LMS_PARM_L1_H5_W2 = 2,
84+
WC_LMS_PARM_L1_H5_W4 = 3,
85+
WC_LMS_PARM_L1_H5_W8 = 4,
86+
WC_LMS_PARM_L1_H10_W2 = 5,
87+
WC_LMS_PARM_L1_H10_W4 = 6,
88+
WC_LMS_PARM_L1_H10_W8 = 7,
89+
WC_LMS_PARM_L1_H15_W2 = 8,
90+
WC_LMS_PARM_L1_H15_W4 = 9,
91+
WC_LMS_PARM_L1_H15_W8 = 10,
92+
WC_LMS_PARM_L1_H20_W2 = 11,
93+
WC_LMS_PARM_L1_H20_W4 = 12,
94+
WC_LMS_PARM_L1_H20_W8 = 13,
95+
WC_LMS_PARM_L2_H5_W2 = 14,
96+
WC_LMS_PARM_L2_H5_W4 = 15,
97+
WC_LMS_PARM_L2_H5_W8 = 16,
98+
WC_LMS_PARM_L2_H10_W2 = 17,
99+
WC_LMS_PARM_L2_H10_W4 = 18,
100+
WC_LMS_PARM_L2_H10_W8 = 19,
101+
WC_LMS_PARM_L2_H15_W2 = 20,
102+
WC_LMS_PARM_L2_H15_W4 = 21,
103+
WC_LMS_PARM_L2_H15_W8 = 22,
104+
WC_LMS_PARM_L2_H20_W2 = 23,
105+
WC_LMS_PARM_L2_H20_W4 = 24,
106+
WC_LMS_PARM_L2_H20_W8 = 25,
107+
WC_LMS_PARM_L3_H5_W2 = 26,
108+
WC_LMS_PARM_L3_H5_W4 = 27,
109+
WC_LMS_PARM_L3_H5_W8 = 28,
110+
WC_LMS_PARM_L3_H10_W4 = 29,
111+
WC_LMS_PARM_L3_H10_W8 = 30,
112+
WC_LMS_PARM_L4_H5_W2 = 31,
113+
WC_LMS_PARM_L4_H5_W4 = 32,
114+
WC_LMS_PARM_L4_H5_W8 = 33,
115+
WC_LMS_PARM_L4_H10_W4 = 34,
116+
WC_LMS_PARM_L4_H10_W8 = 35,
92117
};
93118

94119
/* enum wc_LmsState is to help track the state of an LMS/HSS Key. */

0 commit comments

Comments
 (0)