Skip to content

Commit d524cee

Browse files
padelsbachpaul
authored andcommitted
Add support for LMS and XMSS
1 parent 2327252 commit d524cee

12 files changed

Lines changed: 3441 additions & 70 deletions

src/wh_client_crypto.c

Lines changed: 768 additions & 0 deletions
Large diffs are not rendered by default.

src/wh_client_cryptocb.c

Lines changed: 312 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,30 @@
4747
#include "wolfssl/wolfcrypt/ecc.h"
4848
#include "wolfssl/wolfcrypt/sha256.h"
4949
#include "wolfssl/wolfcrypt/sha512.h"
50+
#if defined(WOLFSSL_HAVE_LMS)
51+
#include "wolfssl/wolfcrypt/wc_lms.h"
52+
#endif
53+
#if defined(WOLFSSL_HAVE_XMSS)
54+
#include "wolfssl/wolfcrypt/wc_xmss.h"
55+
#endif
5056

5157
#include "wolfhsm/wh_crypto.h"
5258
#include "wolfhsm/wh_client_crypto.h"
5359
#include "wolfhsm/wh_client_cryptocb.h"
5460
#include "wolfhsm/wh_message_crypto.h"
5561

5662

63+
#if defined(WOLFSSL_HAVE_LMS) || defined(WOLFSSL_HAVE_XMSS)
64+
static int _handlePqcStatefulSigKeyGen(whClientContext* ctx,
65+
wc_CryptoInfo* info, int useDma);
66+
static int _handlePqcStatefulSigSign(whClientContext* ctx, wc_CryptoInfo* info,
67+
int useDma);
68+
static int _handlePqcStatefulSigVerify(whClientContext* ctx,
69+
wc_CryptoInfo* info, int useDma);
70+
static int _handlePqcStatefulSigSigsLeft(whClientContext* ctx,
71+
wc_CryptoInfo* info, int useDma);
72+
#endif /* WOLFSSL_HAVE_LMS || WOLFSSL_HAVE_XMSS */
73+
5774
#if defined(HAVE_DILITHIUM) || defined(HAVE_FALCON)
5875
static int _handlePqcSigKeyGen(whClientContext* ctx, wc_CryptoInfo* info,
5976
int useDma);
@@ -422,6 +439,25 @@ int wh_Client_CryptoCb(int devId, wc_CryptoInfo* info, void* inCtx)
422439
#endif /* HAVE_ED25519 */
423440
#endif /* HAVE_CURVE25519 */
424441

442+
#if defined(WOLFSSL_HAVE_LMS) || defined(WOLFSSL_HAVE_XMSS)
443+
case WC_PK_TYPE_PQC_STATEFUL_SIG_KEYGEN:
444+
ret = _handlePqcStatefulSigKeyGen(ctx, info, 0);
445+
break;
446+
447+
case WC_PK_TYPE_PQC_STATEFUL_SIG_SIGN:
448+
ret = _handlePqcStatefulSigSign(ctx, info, 0);
449+
break;
450+
451+
case WC_PK_TYPE_PQC_STATEFUL_SIG_VERIFY:
452+
ret = _handlePqcStatefulSigVerify(ctx, info, 0);
453+
break;
454+
455+
case WC_PK_TYPE_PQC_STATEFUL_SIG_SIGS_LEFT:
456+
ret = _handlePqcStatefulSigSigsLeft(ctx, info, 0);
457+
break;
458+
459+
#endif /* WOLFSSL_HAVE_LMS || WOLFSSL_HAVE_XMSS */
460+
425461
#if defined(HAVE_DILITHIUM) || defined(HAVE_FALCON)
426462
case WC_PK_TYPE_PQC_SIG_KEYGEN:
427463
ret = _handlePqcSigKeyGen(ctx, info, 0);
@@ -600,6 +636,268 @@ int wh_Client_CryptoCb(int devId, wc_CryptoInfo* info, void* inCtx)
600636
return ret;
601637
}
602638

639+
#if defined(WOLFSSL_HAVE_LMS) || defined(WOLFSSL_HAVE_XMSS)
640+
static int _handlePqcStatefulSigKeyGen(whClientContext* ctx,
641+
wc_CryptoInfo* info, int useDma)
642+
{
643+
int ret = CRYPTOCB_UNAVAILABLE;
644+
int type = info->pk.pqc_stateful_sig_kg.type;
645+
646+
#ifndef WOLFHSM_CFG_DMA
647+
(void)ctx;
648+
if (useDma) {
649+
return WC_HW_E;
650+
}
651+
#endif
652+
653+
switch (type) {
654+
#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY)
655+
case WC_PQC_STATEFUL_SIG_TYPE_LMS:
656+
#ifdef WOLFHSM_CFG_DMA
657+
if (useDma) {
658+
ret = wh_Client_LmsMakeExportKeyDma(
659+
ctx, (LmsKey*)info->pk.pqc_stateful_sig_kg.key);
660+
}
661+
else
662+
#endif /* WOLFHSM_CFG_DMA */
663+
{
664+
/* Non-DMA transport not supported in v1; signatures exceed the
665+
* default WOLFHSM_CFG_COMM_DATA_LEN. */
666+
ret = CRYPTOCB_UNAVAILABLE;
667+
}
668+
break;
669+
#endif /* WOLFSSL_HAVE_LMS && !WOLFSSL_LMS_VERIFY_ONLY */
670+
#if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY)
671+
case WC_PQC_STATEFUL_SIG_TYPE_XMSS:
672+
#ifdef WOLFHSM_CFG_DMA
673+
if (useDma) {
674+
ret = wh_Client_XmssMakeExportKeyDma(
675+
ctx, (XmssKey*)info->pk.pqc_stateful_sig_kg.key);
676+
}
677+
else
678+
#endif /* WOLFHSM_CFG_DMA */
679+
{
680+
ret = CRYPTOCB_UNAVAILABLE;
681+
}
682+
break;
683+
#endif /* WOLFSSL_HAVE_XMSS && !WOLFSSL_XMSS_VERIFY_ONLY */
684+
685+
default:
686+
ret = CRYPTOCB_UNAVAILABLE;
687+
break;
688+
}
689+
690+
if (ret == WH_ERROR_BADARGS) {
691+
ret = BAD_FUNC_ARG;
692+
}
693+
else if (ret == WH_ERROR_NOTIMPL) {
694+
ret = CRYPTOCB_UNAVAILABLE;
695+
}
696+
697+
return ret;
698+
}
699+
700+
static int _handlePqcStatefulSigSign(whClientContext* ctx, wc_CryptoInfo* info,
701+
int useDma)
702+
{
703+
int ret = CRYPTOCB_UNAVAILABLE;
704+
int type = info->pk.pqc_stateful_sig_sign.type;
705+
706+
#ifndef WOLFHSM_CFG_DMA
707+
(void)ctx;
708+
if (useDma) {
709+
return WC_HW_E;
710+
}
711+
#endif
712+
713+
switch (type) {
714+
#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY)
715+
case WC_PQC_STATEFUL_SIG_TYPE_LMS:
716+
#ifdef WOLFHSM_CFG_DMA
717+
if (useDma) {
718+
ret = wh_Client_LmsSignDma(
719+
ctx,
720+
info->pk.pqc_stateful_sig_sign.msg,
721+
info->pk.pqc_stateful_sig_sign.msgSz,
722+
info->pk.pqc_stateful_sig_sign.out,
723+
info->pk.pqc_stateful_sig_sign.outSz,
724+
(LmsKey*)info->pk.pqc_stateful_sig_sign.key);
725+
}
726+
else
727+
#endif /* WOLFHSM_CFG_DMA */
728+
{
729+
ret = CRYPTOCB_UNAVAILABLE;
730+
}
731+
break;
732+
#endif /* WOLFSSL_HAVE_LMS && !WOLFSSL_LMS_VERIFY_ONLY */
733+
#if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY)
734+
case WC_PQC_STATEFUL_SIG_TYPE_XMSS:
735+
#ifdef WOLFHSM_CFG_DMA
736+
if (useDma) {
737+
ret = wh_Client_XmssSignDma(
738+
ctx,
739+
info->pk.pqc_stateful_sig_sign.msg,
740+
info->pk.pqc_stateful_sig_sign.msgSz,
741+
info->pk.pqc_stateful_sig_sign.out,
742+
info->pk.pqc_stateful_sig_sign.outSz,
743+
(XmssKey*)info->pk.pqc_stateful_sig_sign.key);
744+
}
745+
else
746+
#endif /* WOLFHSM_CFG_DMA */
747+
{
748+
ret = CRYPTOCB_UNAVAILABLE;
749+
}
750+
break;
751+
#endif /* WOLFSSL_HAVE_XMSS && !WOLFSSL_XMSS_VERIFY_ONLY */
752+
753+
default:
754+
ret = CRYPTOCB_UNAVAILABLE;
755+
break;
756+
}
757+
758+
if (ret == WH_ERROR_BADARGS) {
759+
ret = BAD_FUNC_ARG;
760+
}
761+
else if (ret == WH_ERROR_NOTIMPL) {
762+
ret = CRYPTOCB_UNAVAILABLE;
763+
}
764+
765+
return ret;
766+
}
767+
768+
static int _handlePqcStatefulSigVerify(whClientContext* ctx,
769+
wc_CryptoInfo* info, int useDma)
770+
{
771+
int ret = CRYPTOCB_UNAVAILABLE;
772+
int type = info->pk.pqc_stateful_sig_verify.type;
773+
774+
#ifndef WOLFHSM_CFG_DMA
775+
(void)ctx;
776+
if (useDma) {
777+
return WC_HW_E;
778+
}
779+
#endif
780+
781+
switch (type) {
782+
#ifdef WOLFSSL_HAVE_LMS
783+
case WC_PQC_STATEFUL_SIG_TYPE_LMS:
784+
#ifdef WOLFHSM_CFG_DMA
785+
if (useDma) {
786+
ret = wh_Client_LmsVerifyDma(
787+
ctx,
788+
info->pk.pqc_stateful_sig_verify.sig,
789+
info->pk.pqc_stateful_sig_verify.sigSz,
790+
info->pk.pqc_stateful_sig_verify.msg,
791+
info->pk.pqc_stateful_sig_verify.msgSz,
792+
info->pk.pqc_stateful_sig_verify.res,
793+
(LmsKey*)info->pk.pqc_stateful_sig_verify.key);
794+
}
795+
else
796+
#endif /* WOLFHSM_CFG_DMA */
797+
{
798+
ret = CRYPTOCB_UNAVAILABLE;
799+
}
800+
break;
801+
#endif /* WOLFSSL_HAVE_LMS */
802+
#ifdef WOLFSSL_HAVE_XMSS
803+
case WC_PQC_STATEFUL_SIG_TYPE_XMSS:
804+
#ifdef WOLFHSM_CFG_DMA
805+
if (useDma) {
806+
ret = wh_Client_XmssVerifyDma(
807+
ctx,
808+
info->pk.pqc_stateful_sig_verify.sig,
809+
info->pk.pqc_stateful_sig_verify.sigSz,
810+
info->pk.pqc_stateful_sig_verify.msg,
811+
info->pk.pqc_stateful_sig_verify.msgSz,
812+
info->pk.pqc_stateful_sig_verify.res,
813+
(XmssKey*)info->pk.pqc_stateful_sig_verify.key);
814+
}
815+
else
816+
#endif /* WOLFHSM_CFG_DMA */
817+
{
818+
ret = CRYPTOCB_UNAVAILABLE;
819+
}
820+
break;
821+
#endif /* WOLFSSL_HAVE_XMSS */
822+
823+
default:
824+
ret = CRYPTOCB_UNAVAILABLE;
825+
break;
826+
}
827+
828+
if (ret == WH_ERROR_BADARGS) {
829+
ret = BAD_FUNC_ARG;
830+
}
831+
else if (ret == WH_ERROR_NOTIMPL) {
832+
ret = CRYPTOCB_UNAVAILABLE;
833+
}
834+
835+
return ret;
836+
}
837+
838+
static int _handlePqcStatefulSigSigsLeft(whClientContext* ctx,
839+
wc_CryptoInfo* info, int useDma)
840+
{
841+
int ret = CRYPTOCB_UNAVAILABLE;
842+
int type = info->pk.pqc_stateful_sig_sigs_left.type;
843+
844+
#ifndef WOLFHSM_CFG_DMA
845+
(void)ctx;
846+
if (useDma) {
847+
return WC_HW_E;
848+
}
849+
#endif
850+
851+
switch (type) {
852+
#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY)
853+
case WC_PQC_STATEFUL_SIG_TYPE_LMS:
854+
#ifdef WOLFHSM_CFG_DMA
855+
if (useDma) {
856+
ret = wh_Client_LmsSigsLeftDma(
857+
ctx,
858+
(LmsKey*)info->pk.pqc_stateful_sig_sigs_left.key,
859+
info->pk.pqc_stateful_sig_sigs_left.sigsLeft);
860+
}
861+
else
862+
#endif /* WOLFHSM_CFG_DMA */
863+
{
864+
ret = CRYPTOCB_UNAVAILABLE;
865+
}
866+
break;
867+
#endif /* WOLFSSL_HAVE_LMS && !WOLFSSL_LMS_VERIFY_ONLY */
868+
#if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY)
869+
case WC_PQC_STATEFUL_SIG_TYPE_XMSS:
870+
#ifdef WOLFHSM_CFG_DMA
871+
if (useDma) {
872+
ret = wh_Client_XmssSigsLeftDma(
873+
ctx,
874+
(XmssKey*)info->pk.pqc_stateful_sig_sigs_left.key,
875+
info->pk.pqc_stateful_sig_sigs_left.sigsLeft);
876+
}
877+
else
878+
#endif /* WOLFHSM_CFG_DMA */
879+
{
880+
ret = CRYPTOCB_UNAVAILABLE;
881+
}
882+
break;
883+
#endif /* WOLFSSL_HAVE_XMSS && !WOLFSSL_XMSS_VERIFY_ONLY */
884+
885+
default:
886+
ret = CRYPTOCB_UNAVAILABLE;
887+
break;
888+
}
889+
890+
if (ret == WH_ERROR_BADARGS) {
891+
ret = BAD_FUNC_ARG;
892+
}
893+
else if (ret == WH_ERROR_NOTIMPL) {
894+
ret = CRYPTOCB_UNAVAILABLE;
895+
}
896+
897+
return ret;
898+
}
899+
#endif /* WOLFSSL_HAVE_LMS || WOLFSSL_HAVE_XMSS */
900+
603901
#if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM)
604902
static int _handlePqcSigKeyGen(whClientContext* ctx, wc_CryptoInfo* info,
605903
int useDma)
@@ -864,6 +1162,20 @@ int wh_Client_CryptoCbDma(int devId, wc_CryptoInfo* info, void* inCtx)
8641162

8651163
case WC_ALGO_TYPE_PK: {
8661164
switch (info->pk.type) {
1165+
#if defined(WOLFSSL_HAVE_LMS) || defined(WOLFSSL_HAVE_XMSS)
1166+
case WC_PK_TYPE_PQC_STATEFUL_SIG_KEYGEN:
1167+
ret = _handlePqcStatefulSigKeyGen(ctx, info, 1);
1168+
break;
1169+
case WC_PK_TYPE_PQC_STATEFUL_SIG_SIGN:
1170+
ret = _handlePqcStatefulSigSign(ctx, info, 1);
1171+
break;
1172+
case WC_PK_TYPE_PQC_STATEFUL_SIG_VERIFY:
1173+
ret = _handlePqcStatefulSigVerify(ctx, info, 1);
1174+
break;
1175+
case WC_PK_TYPE_PQC_STATEFUL_SIG_SIGS_LEFT:
1176+
ret = _handlePqcStatefulSigSigsLeft(ctx, info, 1);
1177+
break;
1178+
#endif /* WOLFSSL_HAVE_LMS || WOLFSSL_HAVE_XMSS */
8671179
#if defined(HAVE_DILITHIUM) || defined(HAVE_FALCON)
8681180
case WC_PK_TYPE_PQC_SIG_KEYGEN:
8691181
ret = _handlePqcSigKeyGen(ctx, info, 1);

0 commit comments

Comments
 (0)