Skip to content

Commit 8e6d151

Browse files
committed
PQC: CryptoCb support for signature algorithms
Add initial support of the crypto callback API to the two PQC signature algorithms Dilithium and Falcon. This ultimatelly enables the usage of external hardware modules (e.g. secure elements) for these algorithms. Signed-off-by: Tobias Frauenschläger <t.frauenschlaeger@me.com>
1 parent 4f8fd98 commit 8e6d151

10 files changed

Lines changed: 784 additions & 70 deletions

File tree

src/internal.c

Lines changed: 106 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7787,13 +7787,13 @@ int AllocKey(WOLFSSL* ssl, int type, void** pKey)
77877787
#if defined(HAVE_PQC)
77887788
#if defined(HAVE_FALCON)
77897789
case DYNAMIC_TYPE_FALCON:
7790-
wc_falcon_init((falcon_key*)*pKey);
7790+
wc_falcon_init_ex((falcon_key*)*pKey, ssl->heap, ssl->devId);
77917791
ret = 0;
77927792
break;
77937793
#endif /* HAVE_FALCON */
77947794
#if defined(HAVE_DILITHIUM)
77957795
case DYNAMIC_TYPE_DILITHIUM:
7796-
wc_dilithium_init((dilithium_key*)*pKey);
7796+
wc_dilithium_init_ex((dilithium_key*)*pKey, ssl->heap, ssl->devId);
77977797
ret = 0;
77987798
break;
77997799
#endif /* HAVE_DILITHIUM */
@@ -27451,6 +27451,54 @@ int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
2745127451
}
2745227452
#endif
2745327453
}
27454+
else if (hsType == DYNAMIC_TYPE_DILITHIUM) {
27455+
#if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
27456+
dilithium_key* dilithiumKey;
27457+
27458+
dilithiumKey = (dilithium_key*)XMALLOC(sizeof(dilithium_key), heap,
27459+
DYNAMIC_TYPE_DILITHIUM);
27460+
if (dilithiumKey == NULL) {
27461+
return MEMORY_E;
27462+
}
27463+
27464+
if (label) {
27465+
ret = wc_dilithium_init_label(dilithiumKey, (char*)data, heap, devId);
27466+
}
27467+
else if (id) {
27468+
ret = wc_dilithium_init_id(dilithiumKey, data, length, heap, devId);
27469+
}
27470+
if (ret == 0) {
27471+
*pkey = (void*)dilithiumKey;
27472+
}
27473+
else {
27474+
XFREE(dilithiumKey, heap, DYNAMIC_TYPE_DILITHIUM);
27475+
}
27476+
#endif
27477+
}
27478+
else if (hsType == DYNAMIC_TYPE_FALCON) {
27479+
#if defined(HAVE_PQC) && defined(HAVE_FALCON)
27480+
falcon_key* falconKey;
27481+
27482+
falconKey = (falcon_key*)XMALLOC(sizeof(falcon_key), heap,
27483+
DYNAMIC_TYPE_FALCON);
27484+
if (falconKey == NULL) {
27485+
return MEMORY_E;
27486+
}
27487+
27488+
if (label) {
27489+
ret = wc_falcon_init_label(falconKey, (char*)data, heap, devId);
27490+
}
27491+
else if (id) {
27492+
ret = wc_falcon_init_id(falconKey, data, length, heap, devId);
27493+
}
27494+
if (ret == 0) {
27495+
*pkey = (void*)falconKey;
27496+
}
27497+
else {
27498+
XFREE(falconKey, heap, DYNAMIC_TYPE_FALCON);
27499+
}
27500+
#endif
27501+
}
2745427502

2745527503
return ret;
2745627504
}
@@ -27499,6 +27547,10 @@ int DecodePrivateKey(WOLFSSL *ssl, word16* length)
2749927547
ssl->hsType = DYNAMIC_TYPE_RSA;
2750027548
else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
2750127549
ssl->hsType = DYNAMIC_TYPE_ECC;
27550+
else if (ssl->buffers.keyType == falcon_level5_sa_algo)
27551+
ssl->hsType = DYNAMIC_TYPE_FALCON;
27552+
else if (ssl->buffers.keyType == dilithium_level5_sa_algo)
27553+
ssl->hsType = DYNAMIC_TYPE_DILITHIUM;
2750227554
ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
2750327555
if (ret != 0) {
2750427556
goto exit_dpk;
@@ -27554,6 +27606,58 @@ int DecodePrivateKey(WOLFSSL *ssl, word16* length)
2755427606
}
2755527607
#else
2755627608
ret = NOT_COMPILED_IN;
27609+
#endif
27610+
}
27611+
else if (ssl->buffers.keyType == falcon_level5_sa_algo) {
27612+
#if defined(HAVE_PQC) && defined(HAVE_FALCON)
27613+
if (ssl->buffers.keyLabel) {
27614+
ret = wc_falcon_init_label((falcon_key*)ssl->hsKey,
27615+
(char*)ssl->buffers.key->buffer,
27616+
ssl->heap, ssl->buffers.keyDevId);
27617+
}
27618+
else if (ssl->buffers.keyId) {
27619+
ret = wc_falcon_init_id((falcon_key*)ssl->hsKey,
27620+
ssl->buffers.key->buffer,
27621+
ssl->buffers.key->length, ssl->heap,
27622+
ssl->buffers.keyDevId);
27623+
}
27624+
if (ret == 0) {
27625+
if (ssl->buffers.keySz < ssl->options.minFalconKeySz) {
27626+
WOLFSSL_MSG("Falcon key size too small");
27627+
ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk);
27628+
}
27629+
27630+
/* Return the maximum signature length. */
27631+
*length = (word16)wc_falcon_sig_size((falcon_key*)ssl->hsKey);
27632+
}
27633+
#else
27634+
ret = NOT_COMPILED_IN;
27635+
#endif
27636+
}
27637+
else if (ssl->buffers.keyType == dilithium_level5_sa_algo) {
27638+
#if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
27639+
if (ssl->buffers.keyLabel) {
27640+
ret = wc_dilithium_init_label((dilithium_key*)ssl->hsKey,
27641+
(char*)ssl->buffers.key->buffer,
27642+
ssl->heap, ssl->buffers.keyDevId);
27643+
}
27644+
else if (ssl->buffers.keyId) {
27645+
ret = wc_dilithium_init_id((dilithium_key*)ssl->hsKey,
27646+
ssl->buffers.key->buffer,
27647+
ssl->buffers.key->length, ssl->heap,
27648+
ssl->buffers.keyDevId);
27649+
}
27650+
if (ret == 0) {
27651+
if (ssl->buffers.keySz < ssl->options.minDilithiumKeySz) {
27652+
WOLFSSL_MSG("Dilithium key size too small");
27653+
ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dpk);
27654+
}
27655+
27656+
/* Return the maximum signature length. */
27657+
*length = (word16)wc_dilithium_sig_size((dilithium_key*)ssl->hsKey);
27658+
}
27659+
#else
27660+
ret = NOT_COMPILED_IN;
2755727661
#endif
2755827662
}
2755927663
goto exit_dpk;

src/ssl.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7734,6 +7734,9 @@ int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
77347734
#if defined(HAVE_FALCON)
77357735
case FALCON_LEVEL1k:
77367736
case FALCON_LEVEL5k:
7737+
#ifdef WOLF_PRIVATE_KEY_ID
7738+
keyType = falcon_level5_sa_algo;
7739+
#endif
77377740
/* Falcon is fixed key size */
77387741
keySz = FALCON_MAX_KEY_SIZE;
77397742
if (ssl && !ssl->options.verifyNone) {
@@ -7756,6 +7759,9 @@ int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
77567759
case DILITHIUM_LEVEL2k:
77577760
case DILITHIUM_LEVEL3k:
77587761
case DILITHIUM_LEVEL5k:
7762+
#ifdef WOLF_PRIVATE_KEY_ID
7763+
keyType = dilithium_level5_sa_algo;
7764+
#endif
77597765
/* Dilithium is fixed key size */
77607766
keySz = DILITHIUM_MAX_KEY_SIZE;
77617767
if (ssl && !ssl->options.verifyNone) {
@@ -9090,6 +9096,19 @@ static int check_cert_key(DerBuffer* cert, DerBuffer* key, void* heap,
90909096
type = DYNAMIC_TYPE_ECC;
90919097
}
90929098
#endif
9099+
#if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
9100+
if ((der->keyOID == DILITHIUM_LEVEL2k) ||
9101+
(der->keyOID == DILITHIUM_LEVEL3k) ||
9102+
(der->keyOID == DILITHIUM_LEVEL5k)) {
9103+
type = DYNAMIC_TYPE_DILITHIUM;
9104+
}
9105+
#endif
9106+
#if defined(HAVE_PQC) && defined(HAVE_FALCON)
9107+
if ((der->keyOID == FALCON_LEVEL1k) ||
9108+
(der->keyOID == FALCON_LEVEL5k)) {
9109+
type = DYNAMIC_TYPE_FALCON;
9110+
}
9111+
#endif
90939112

90949113
ret = CreateDevPrivateKey(&pkey, buff, size, type,
90959114
isKeyLabel, isKeyId, heap, devId);
@@ -9111,6 +9130,23 @@ static int check_cert_key(DerBuffer* cert, DerBuffer* key, void* heap,
91119130
der->publicKey, der->pubKeySize);
91129131
}
91139132
#endif
9133+
#if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
9134+
if ((der->keyOID == DILITHIUM_LEVEL2k) ||
9135+
(der->keyOID == DILITHIUM_LEVEL3k) ||
9136+
(der->keyOID == DILITHIUM_LEVEL5k)) {
9137+
ret = wc_CryptoCb_PqcSignatureCheckPrivKey(pkey,
9138+
WC_PQC_SIG_TYPE_DILITHIUM,
9139+
der->publicKey, der->pubKeySize);
9140+
}
9141+
#endif
9142+
#if defined(HAVE_PQC) && defined(HAVE_FALCON)
9143+
if ((der->keyOID == FALCON_LEVEL1k) ||
9144+
(der->keyOID == FALCON_LEVEL5k)) {
9145+
ret = wc_CryptoCb_PqcSignatureCheckPrivKey(pkey,
9146+
WC_PQC_SIG_TYPE_FALCON,
9147+
der->publicKey, der->pubKeySize);
9148+
}
9149+
#endif
91149150
}
91159151
#else
91169152
/* devId was set, don't check, for now */
@@ -9130,6 +9166,19 @@ static int check_cert_key(DerBuffer* cert, DerBuffer* key, void* heap,
91309166
if (der->keyOID == ECDSAk) {
91319167
wc_ecc_free((ecc_key*)pkey);
91329168
}
9169+
#endif
9170+
#if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
9171+
if ((der->keyOID == DILITHIUM_LEVEL2k) ||
9172+
(der->keyOID == DILITHIUM_LEVEL3k) ||
9173+
(der->keyOID == DILITHIUM_LEVEL5k)) {
9174+
wc_dilithium_free((dilithium_key*)pkey);
9175+
}
9176+
#endif
9177+
#if defined(HAVE_PQC) && defined(HAVE_FALCON)
9178+
if ((der->keyOID == FALCON_LEVEL1k) ||
9179+
(der->keyOID == FALCON_LEVEL5k)) {
9180+
wc_falcon_free((falcon_key*)pkey);
9181+
}
91339182
#endif
91349183
XFREE(pkey, heap, type);
91359184
}

wolfcrypt/src/asn.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16440,7 +16440,8 @@ static int ConfirmSignature(SignatureCtx* sigCtx,
1644016440
if (sigCtx->key.falcon == NULL) {
1644116441
ERROR_OUT(MEMORY_E, exit_cs);
1644216442
}
16443-
if ((ret = wc_falcon_init(sigCtx->key.falcon)) < 0) {
16443+
if ((ret = wc_falcon_init_ex(sigCtx->key.falcon,
16444+
sigCtx->heap, sigCtx->devId)) < 0) {
1644416445
goto exit_cs;
1644516446
}
1644616447
if ((ret = wc_falcon_set_level(sigCtx->key.falcon, 1))
@@ -16465,7 +16466,8 @@ static int ConfirmSignature(SignatureCtx* sigCtx,
1646516466
if (sigCtx->key.falcon == NULL) {
1646616467
ERROR_OUT(MEMORY_E, exit_cs);
1646716468
}
16468-
if ((ret = wc_falcon_init(sigCtx->key.falcon)) < 0) {
16469+
if ((ret = wc_falcon_init_ex(sigCtx->key.falcon,
16470+
sigCtx->heap, sigCtx->devId)) < 0) {
1646916471
goto exit_cs;
1647016472
}
1647116473
if ((ret = wc_falcon_set_level(sigCtx->key.falcon, 5))
@@ -16492,7 +16494,8 @@ static int ConfirmSignature(SignatureCtx* sigCtx,
1649216494
if (sigCtx->key.dilithium == NULL) {
1649316495
ERROR_OUT(MEMORY_E, exit_cs);
1649416496
}
16495-
if ((ret = wc_dilithium_init(sigCtx->key.dilithium)) < 0) {
16497+
if ((ret = wc_dilithium_init_ex(sigCtx->key.dilithium,
16498+
sigCtx->heap, sigCtx->devId)) < 0) {
1649616499
goto exit_cs;
1649716500
}
1649816501
if ((ret = wc_dilithium_set_level(
@@ -16517,7 +16520,8 @@ static int ConfirmSignature(SignatureCtx* sigCtx,
1651716520
if (sigCtx->key.dilithium == NULL) {
1651816521
ERROR_OUT(MEMORY_E, exit_cs);
1651916522
}
16520-
if ((ret = wc_dilithium_init(sigCtx->key.dilithium)) < 0) {
16523+
if ((ret = wc_dilithium_init_ex(sigCtx->key.dilithium,
16524+
sigCtx->heap, sigCtx->devId)) < 0) {
1652116525
goto exit_cs;
1652216526
}
1652316527
if ((ret = wc_dilithium_set_level(
@@ -16542,7 +16546,8 @@ static int ConfirmSignature(SignatureCtx* sigCtx,
1654216546
if (sigCtx->key.dilithium == NULL) {
1654316547
ERROR_OUT(MEMORY_E, exit_cs);
1654416548
}
16545-
if ((ret = wc_dilithium_init(sigCtx->key.dilithium)) < 0) {
16549+
if ((ret = wc_dilithium_init_ex(sigCtx->key.dilithium,
16550+
sigCtx->heap, sigCtx->devId)) < 0) {
1654616551
goto exit_cs;
1654716552
}
1654816553
if ((ret = wc_dilithium_set_level(

0 commit comments

Comments
 (0)