Skip to content

Commit 0dd0779

Browse files
authored
Merge pull request #206 from Frauschi/lms_xmss_verify
Add verify-only LMS and XMSS support
2 parents d974a0d + 5545a89 commit 0dd0779

16 files changed

Lines changed: 3632 additions & 18 deletions

.github/workflows/build-workflow.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ jobs:
3636
working-directory: ./wolfssl
3737
run: |
3838
./configure --enable-cryptocb --enable-aescfb --enable-rsapss --enable-keygen --enable-pwdbased --enable-scrypt --enable-md5 \
39-
--enable-mldsa C_EXTRA_FLAGS="-DWOLFSSL_PUBLIC_MP -DWC_RSA_DIRECT -DHAVE_AES_ECB -DHAVE_AES_KEYWRAP"
39+
--enable-mldsa --enable-lms=verify-only --enable-xmss=verify-only C_EXTRA_FLAGS="-DWOLFSSL_PUBLIC_MP -DWC_RSA_DIRECT -DHAVE_AES_ECB -DHAVE_AES_KEYWRAP"
4040
- name: wolfssl make install
4141
working-directory: ./wolfssl
4242
run: make

.github/workflows/cmake.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ jobs:
4545
-DWOLFSSL_SHA:BOOL=yes -DWOLFSSL_SHA224:BOOL=yes -DWOLFSSL_SHA3:STRING=yes -DWOLFSSL_SHA384:BOOL=yes \
4646
-DWOLFSSL_SHA512:BOOL=yes -DWOLFSSL_SHAKE128:STRING=yes -DWOLFSSL_SHAKE256:STRING=yes \
4747
-DWOLFSSL_SP_MATH_ALL:BOOL=yes -DWOLFSSL_X86_64_BUILD_ASM:BOOL=yes -DWOLFSSL_MLKEM=1 \
48-
-DWOLFSSL_LMS=1 -DWOLFSSL_LMSSHA256192=1 -DWOLFSSL_DILITHIUM:BOOL=yes -DWOLFSSL_PUBLIC_MP:BOOL=yes \
48+
-DWOLFSSL_LMS=1 -DWOLFSSL_LMSSHA256192=1 -DWOLFSSL_XMSS=1 \
49+
-DWOLFSSL_DILITHIUM:BOOL=yes -DWOLFSSL_PUBLIC_MP:BOOL=yes \
4950
-DWOLFSSL_WC_RSA_DIRECT:BOOL=yes -DCMAKE_BUILD_TYPE=Release \
5051
..
5152
cmake --build .
@@ -64,6 +65,7 @@ jobs:
6465
-DWOLFPKCS11_AESECB:BOOL=yes -DWOLFPKCS11_AESCTS:BOOL=yes -DWOLFPKCS11_AESCMAC:BOOL=yes \
6566
-DWOLFPKCS11_PBKDF2:BOOL=yes -DWOLFPKCS11_SHA3:BOOL=yes -DWOLFPKCS11_PKCS11_V3_0:BOOL=yes \
6667
-DWOLFPKCS11_PKCS11_V3_2:BOOL=yes -DWOLFPKCS11_MLDSA:BOOL=yes -DWOLFPKCS11_MLKEM:BOOL=yes \
68+
-DWOLFPKCS11_LMS:BOOL=yes -DWOLFPKCS11_XMSS:BOOL=yes \
6769
-DCMAKE_MODULE_PATH="$GITHUB_WORKSPACE/install/${CMAKE_INSTALL_LIBDIR}" \
6870
..
6971
cmake --build .

.github/workflows/unit-test.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,22 @@ jobs:
110110
uses: ./.github/workflows/build-workflow.yml
111111
with:
112112
config: --enable-mlkem
113+
lms:
114+
uses: ./.github/workflows/build-workflow.yml
115+
with:
116+
config: --enable-lms
117+
xmss:
118+
uses: ./.github/workflows/build-workflow.yml
119+
with:
120+
config: --enable-xmss
121+
lms_xmss:
122+
uses: ./.github/workflows/build-workflow.yml
123+
with:
124+
config: --enable-lms --enable-xmss
125+
lms_xmss_static:
126+
uses: ./.github/workflows/build-workflow.yml
127+
with:
128+
config: --enable-lms --enable-xmss --disable-shared
113129
debug:
114130
uses: ./.github/workflows/build-workflow.yml
115131
with:

CMakeLists.txt

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,54 @@ if(WOLFPKCS11_MLKEM)
509509
list(APPEND WOLFPKCS11_DEFINITIONS "-DWOLFPKCS11_MLKEM")
510510
endif()
511511

512+
# LMS/HSS (RFC 8554) verify + public-key import (default: disabled)
513+
add_option("WOLFPKCS11_LMS"
514+
"Enable wolfPKCS11 LMS/HSS verification and public-key import (default: disabled)"
515+
"no" "yes;no"
516+
)
517+
518+
if(WOLFPKCS11_LMS AND NOT WOLFPKCS11_SHA256)
519+
message(STATUS "LMS/HSS requires SHA-256 support (disabled); disabling WOLFPKCS11_LMS")
520+
override_cache(WOLFPKCS11_LMS "no")
521+
endif()
522+
523+
if(WOLFPKCS11_LMS)
524+
if(NOT WOLFPKCS11_PKCS11_V3_2)
525+
message(STATUS "LMS/HSS requires PKCS#11 v3.2 support — enabling WOLFPKCS11_PKCS11_V3_2 automatically")
526+
override_cache(WOLFPKCS11_PKCS11_V3_2 "yes")
527+
if(NOT WOLFPKCS11_PKCS11_V3_0)
528+
override_cache(WOLFPKCS11_PKCS11_V3_0 "yes")
529+
list(APPEND WOLFPKCS11_DEFINITIONS "-DWOLFPKCS11_PKCS11_V3_0")
530+
endif()
531+
list(APPEND WOLFPKCS11_DEFINITIONS "-DWOLFPKCS11_PKCS11_V3_2")
532+
endif()
533+
list(APPEND WOLFPKCS11_DEFINITIONS "-DWOLFPKCS11_LMS")
534+
endif()
535+
536+
# XMSS/XMSS^MT (RFC 8391) verify + public-key import (default: disabled)
537+
add_option("WOLFPKCS11_XMSS"
538+
"Enable wolfPKCS11 XMSS/XMSS^MT verification and public-key import (default: disabled)"
539+
"no" "yes;no"
540+
)
541+
542+
if(WOLFPKCS11_XMSS AND NOT WOLFPKCS11_SHA256)
543+
message(STATUS "XMSS requires SHA-256 support (disabled); disabling WOLFPKCS11_XMSS")
544+
override_cache(WOLFPKCS11_XMSS "no")
545+
endif()
546+
547+
if(WOLFPKCS11_XMSS)
548+
if(NOT WOLFPKCS11_PKCS11_V3_2)
549+
message(STATUS "XMSS requires PKCS#11 v3.2 support — enabling WOLFPKCS11_PKCS11_V3_2 automatically")
550+
override_cache(WOLFPKCS11_PKCS11_V3_2 "yes")
551+
if(NOT WOLFPKCS11_PKCS11_V3_0)
552+
override_cache(WOLFPKCS11_PKCS11_V3_0 "yes")
553+
list(APPEND WOLFPKCS11_DEFINITIONS "-DWOLFPKCS11_PKCS11_V3_0")
554+
endif()
555+
list(APPEND WOLFPKCS11_DEFINITIONS "-DWOLFPKCS11_PKCS11_V3_2")
556+
endif()
557+
list(APPEND WOLFPKCS11_DEFINITIONS "-DWOLFPKCS11_XMSS")
558+
endif()
559+
512560

513561
# If wolfpkcs11/options.h exists, delete it to avoid
514562
# a mixup with build/wolfpkcs11/options.h.
@@ -728,6 +776,15 @@ if(WOLFPKCS11_TESTS)
728776
add_wpkcs11_test(${test_target}
729777
${CMAKE_CURRENT_SOURCE_DIR}/tests/${test_target}.c)
730778
endforeach()
779+
780+
# HBS (LMS/HSS, XMSS/XMSS^MT) public-key persistence test. Only built when
781+
# the feature is enabled; the test exits 77 (skip) when no token store is
782+
# available, so treat that as a skip rather than a failure.
783+
if(WOLFPKCS11_LMS OR WOLFPKCS11_XMSS)
784+
add_wpkcs11_test(hbs_persistence_test
785+
${CMAKE_CURRENT_SOURCE_DIR}/tests/hbs_persistence_test.c)
786+
set_tests_properties(hbs_persistence_test PROPERTIES SKIP_RETURN_CODE 77)
787+
endif()
731788
endif()
732789

733790
if(WOLFPKCS11_EXAMPLES)

cmake/options.h.in

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ extern "C" {
9696
#cmakedefine WOLFPKCS11_MLDSA
9797
#undef WOLFPKCS11_MLKEM
9898
#cmakedefine WOLFPKCS11_MLKEM
99+
#undef WOLFPKCS11_LMS
100+
#cmakedefine WOLFPKCS11_LMS
101+
#undef WOLFPKCS11_XMSS
102+
#cmakedefine WOLFPKCS11_XMSS
99103
#undef WOLFPKCS11_TPM
100104
#cmakedefine WOLFPKCS11_TPM
101105
#undef WOLFPKCS11_NSS

configure.ac

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,65 @@ then
566566
AM_CFLAGS="$AM_CFLAGS -DWOLFPKCS11_MLKEM"
567567
fi
568568

569+
# LMS/HSS (RFC 8554) verification and public-key import. Requires wolfSSL
570+
# built with --enable-lms (WOLFSSL_HAVE_LMS). Sign/keygen are a separate,
571+
# later feature; this flag provides verify + public-key import only.
572+
AC_ARG_ENABLE([lms],
573+
[AS_HELP_STRING([--enable-lms],[Enable LMS/HSS verification and public-key import (default: disabled)])],
574+
[ ENABLED_LMS=$enableval ],
575+
[ ENABLED_LMS=no ]
576+
)
577+
578+
if test "$ENABLED_SHA256" = "no"
579+
then
580+
if test "$ENABLED_LMS" = "yes"; then
581+
echo "LMS/HSS requires SHA-256 support (disabled), disabling LMS/HSS"
582+
fi
583+
ENABLED_LMS=no
584+
fi
585+
586+
if test "$ENABLED_LMS" = "yes"
587+
then
588+
if test "$ENABLED_PKCS11V3_2" = "no"; then
589+
ENABLED_PKCS11V3_2=yes
590+
AM_CFLAGS="$AM_CFLAGS -DWOLFPKCS11_PKCS11_V3_2"
591+
if test "$ENABLED_PKCS11V3_0" = "no"; then
592+
ENABLED_PKCS11V3_0=yes
593+
AM_CFLAGS="$AM_CFLAGS -DWOLFPKCS11_PKCS11_V3_0"
594+
fi
595+
fi
596+
AM_CFLAGS="$AM_CFLAGS -DWOLFPKCS11_LMS"
597+
fi
598+
599+
# XMSS/XMSS^MT (RFC 8391) verification and public-key import. Requires wolfSSL
600+
# built with --enable-xmss (WOLFSSL_HAVE_XMSS). Verify + public-key import only.
601+
AC_ARG_ENABLE([xmss],
602+
[AS_HELP_STRING([--enable-xmss],[Enable XMSS/XMSS^MT verification and public-key import (default: disabled)])],
603+
[ ENABLED_XMSS=$enableval ],
604+
[ ENABLED_XMSS=no ]
605+
)
606+
607+
if test "$ENABLED_SHA256" = "no"
608+
then
609+
if test "$ENABLED_XMSS" = "yes"; then
610+
echo "XMSS requires SHA-256 support (disabled), disabling XMSS"
611+
fi
612+
ENABLED_XMSS=no
613+
fi
614+
615+
if test "$ENABLED_XMSS" = "yes"
616+
then
617+
if test "$ENABLED_PKCS11V3_2" = "no"; then
618+
ENABLED_PKCS11V3_2=yes
619+
AM_CFLAGS="$AM_CFLAGS -DWOLFPKCS11_PKCS11_V3_2"
620+
if test "$ENABLED_PKCS11V3_0" = "no"; then
621+
ENABLED_PKCS11V3_0=yes
622+
AM_CFLAGS="$AM_CFLAGS -DWOLFPKCS11_PKCS11_V3_0"
623+
fi
624+
fi
625+
AM_CFLAGS="$AM_CFLAGS -DWOLFPKCS11_XMSS"
626+
fi
627+
569628

570629
AM_CONDITIONAL([BUILD_STATIC],[test "x$enable_shared" = "xno"])
571630

@@ -755,6 +814,8 @@ echo " * ECC: $ENABLED_ECC"
755814
echo " * HKDF: $ENABLED_HKDF"
756815
echo " * ML-DSA: $ENABLED_MLDSA"
757816
echo " * ML-KEM: $ENABLED_MLKEM"
817+
echo " * LMS/HSS verify: $ENABLED_LMS"
818+
echo " * XMSS/XMSS^MT verify: $ENABLED_XMSS"
758819
echo " * NSS modifications: $ENABLED_NSS"
759820
echo " * Default token path: $WOLFPKCS11_DEFAULT_TOKEN_PATH"
760821
echo " * PKCS#11 Version 3.0: $ENABLED_PKCS11V3_0"

0 commit comments

Comments
 (0)