Skip to content

Commit 640b060

Browse files
committed
LMS: Key ID fixup
Fix implementation for extracting from private key data. Add implementation that gets Key ID from wc_LmsKey.
1 parent 7898823 commit 640b060

File tree

4 files changed

+78
-2
lines changed

4 files changed

+78
-2
lines changed

wolfcrypt/src/ext_lms.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,6 +1043,15 @@ int wc_LmsKey_Verify(LmsKey * key, const byte * sig, word32 sigSz,
10431043
return 0;
10441044
}
10451045

1046+
int wc_LmsKey_GetKid(LmsKey * key, const byte ** kid, word32* kidSz)
1047+
{
1048+
if ((key == NULL) || (kid == NULL) || (kidSz == NULL)) {
1049+
return BAD_FUNC_ARG;
1050+
}
1051+
1052+
return NOT_COMPILED_IN;
1053+
}
1054+
10461055
const byte * wc_LmsKey_GetKidFromPrivRaw(const byte * priv, word32 privSz)
10471056
{
10481057
if ((priv == NULL) || (privSz < 16)) {

wolfcrypt/src/wc_lms.c

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,34 @@ int wc_LmsKey_Verify(LmsKey* key, const byte* sig, word32 sigSz,
12581258
return ret;
12591259
}
12601260

1261+
/* Get the Key ID from the LMS key.
1262+
*
1263+
* PRIV = Q | PARAMS | SEED | I
1264+
* where I is the Key ID.
1265+
*
1266+
* @param [in] key LMS key.
1267+
* @param [out] kid Key ID data.
1268+
* @param [out] kidSz Size of key ID.
1269+
* @return 0 on success.
1270+
* @return BAD_FUNC_ARG when a key, kid or kidSz is NULL.
1271+
*/
1272+
int wc_LmsKey_GetKid(LmsKey * key, const byte ** kid, word32* kidSz)
1273+
{
1274+
word32 offset;
1275+
1276+
if ((key == NULL) || (kid == NULL) || (kidSz == NULL)) {
1277+
return BAD_FUNC_ARG;
1278+
}
1279+
1280+
/* SEED length is hash length. */
1281+
offset = HSS_Q_LEN + HSS_PRIV_KEY_PARAM_SET_LEN + key->params->hash_len;
1282+
*kid = key->priv_raw + offset;
1283+
*kidSz = HSS_PRIVATE_KEY_LEN(key->params->hash_len) - offset;
1284+
1285+
return 0;
1286+
}
1287+
1288+
12611289
/* Get the Key ID from the raw private key data.
12621290
*
12631291
* PRIV = Q | PARAMS | SEED | I
@@ -1270,7 +1298,7 @@ int wc_LmsKey_Verify(LmsKey* key, const byte* sig, word32 sigSz,
12701298
*/
12711299
const byte * wc_LmsKey_GetKidFromPrivRaw(const byte * priv, word32 privSz)
12721300
{
1273-
word32 seedSz = privSz - LMS_Q_LEN + HSS_PRIV_KEY_PARAM_SET_LEN - LMS_I_LEN;
1301+
word32 seedSz = privSz - HSS_Q_LEN - HSS_PRIV_KEY_PARAM_SET_LEN - LMS_I_LEN;
12741302

12751303
if (priv == NULL) {
12761304
return NULL;
@@ -1279,7 +1307,7 @@ const byte * wc_LmsKey_GetKidFromPrivRaw(const byte * priv, word32 privSz)
12791307
(seedSz != WC_SHA256_DIGEST_SIZE)) {
12801308
return NULL;
12811309
}
1282-
return priv - LMS_I_LEN;
1310+
return priv + privSz - LMS_I_LEN;
12831311
}
12841312

12851313
#endif /* WOLFSSL_HAVE_LMS && WOLFSSL_WC_LMS */

wolfcrypt/test/test.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47891,6 +47891,11 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t lms_test(void)
4789147891
#else
4789247892
byte sig[WC_TEST_LMS_SIG_LEN];
4789347893
#endif
47894+
#if !defined(HAVE_LIBLMS)
47895+
const byte * kid;
47896+
word32 kidSz;
47897+
#endif
47898+
4789447899
WOLFSSL_ENTER("lms_test");
4789547900

4789647901
XMEMSET(priv, 0, sizeof(priv));
@@ -47939,6 +47944,35 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t lms_test(void)
4793947944

4794047945
XMEMCPY(old_priv, priv, sizeof(priv));
4794147946

47947+
#if !defined(HAVE_LIBLMS)
47948+
ret = wc_LmsKey_GetKid(NULL, NULL, NULL);
47949+
if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
47950+
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
47951+
ret = wc_LmsKey_GetKid(&signingKey, NULL, NULL);
47952+
if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
47953+
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
47954+
ret = wc_LmsKey_GetKid(NULL, &kid, NULL);
47955+
if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
47956+
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
47957+
ret = wc_LmsKey_GetKid(NULL, NULL, &kidSz);
47958+
if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
47959+
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
47960+
ret = wc_LmsKey_GetKid(&signingKey, &kid, NULL);
47961+
if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
47962+
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
47963+
ret = wc_LmsKey_GetKid(&signingKey, NULL, &kidSz);
47964+
if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
47965+
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
47966+
ret = wc_LmsKey_GetKid(NULL, &kid, &kidSz);
47967+
if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
47968+
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
47969+
ret = wc_LmsKey_GetKid(&signingKey, &kid, &kidSz);
47970+
if (ret != 0) { ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); }
47971+
if (kidSz != WC_LMS_I_LEN) {
47972+
ERROR_OUT(WC_TEST_RET_ENC_I(kidSz), out);
47973+
}
47974+
#endif
47975+
4794247976
ret = wc_LmsKey_ExportPub(&verifyKey, &signingKey);
4794347977
if (ret != 0) { ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); }
4794447978

wolfssl/wolfcrypt/lms.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131

3232
#ifdef WOLFSSL_HAVE_LMS
3333

34+
/* Length of the Key ID. */
35+
#define WC_LMS_I_LEN 16
36+
3437
typedef struct LmsKey LmsKey;
3538

3639
/* Private key write and read callbacks. */
@@ -187,6 +190,8 @@ WOLFSSL_API int wc_LmsKey_Verify(LmsKey * key, const byte * sig, word32 sigSz,
187190
WOLFSSL_API const char * wc_LmsKey_ParmToStr(enum wc_LmsParm lmsParm);
188191
WOLFSSL_API const char * wc_LmsKey_RcToStr(enum wc_LmsRc lmsRc);
189192

193+
WOLFSSL_API int wc_LmsKey_GetKid(LmsKey * key, const byte ** kid,
194+
word32* kidSz);
190195
WOLFSSL_API const byte * wc_LmsKey_GetKidFromPrivRaw(const byte * priv,
191196
word32 privSz);
192197
#ifdef __cplusplus

0 commit comments

Comments
 (0)