Skip to content

Commit 8425113

Browse files
committed
Replace liboqs SPHINCS+ with SLH-DSA in certificate layer
Replace the liboqs-based pre-standardization SPHINCS+ implementation with the native FIPS 205 SLH-DSA implementation across the certificate / ASN.1 / X.509 layers, and add SLH-DSA-rooted test certificates plus TLS 1.3 .conf scenarios that exercise the new verification path. All liboqs SPHINCS+ code is removed. This enables SLH-DSA for certificate chain authentication: CA certificates signed with SLH-DSA, certificate signature verification against an SLH-DSA root. TLS 1.3 entity authentication via CertificateVerify with SLH-DSA will be added in a follow-up PR. Follows RFC 9909 (X.509 Algorithm Identifiers for SLH-DSA) and NIST FIPS 205. Supports both SHAKE and SHA-2 parameter families across all twelve standardized variants. DER codec: - New PrivateKeyDecode, PublicKeyDecode, KeyToDer, PrivateKeyToDer, PublicKeyToDer with RFC 9909 encoding (bare OCTET STRING containing 4*n raw bytes = SK.seed || SK.prf || PK.seed || PK.root, no nested wrapper). OID auto-detection across all twelve SHAKE / SHA-2 variants. - PublicKeyDecode raw-bytes fast path mirrors wc_Falcon_PublicKeyDecode and wc_Dilithium_PublicKeyDecode so callers (notably wolfssl_x509_make_der and ConfirmSignature, which pass the raw BIT STRING contents stashed by StoreKey) decode correctly. Honours the caller's *inOutIdx start offset. - Error paths in Private/PublicKeyDecode preserve params/flags/ inOutIdx and only ForceZero the buffer half each helper actually writes; skip the wipe entirely on BAD_LENGTH_E (no bytes touched). - ImportPublic uses |= on flags so a Private-then-Public import sequence retains FLAG_PRIVATE. OID dispatch: - 12 standardized NIST OIDs (6 SHAKE + 6 SHA-2) per RFC 9909. The pre-standardization OID-collision mechanism is removed since NIST OIDs do not collide. - wc_SlhDsaOidToParam / wc_SlhDsaOidToCertType return NOT_COMPILED_IN (rather than -1) for recognised SLH-DSA OIDs whose parameter set isn't built; wc_IsSlhDsaOid recognises both. The x509 dispatch surfaces this as a precise diagnostic instead of the generic "No public key found". - wc_GetKeyOID picks a placeholder parameter from whatever variant is compiled in and #errors at compile time if none is. - asn_orig.c EncodeCert / EncodeCertReq accept SHA-2 SLH-DSA keyTypes alongside SHAKE. Tests and fixtures: - Test cert chain in certs/slhdsa/: SLH-DSA-SHAKE-128s and SLH-DSA-SHA2-128s self-signed roots that sign reused ML-DSA-44 entity keys (server + client), plus the gen script (gen-slhdsa-mldsa-certs.sh, OpenSSL >= 3.5). - New TLS 1.3 .conf scenarios under tests/suites.c dispatch: test-tls13-slhdsa-shake.conf, test-tls13-slhdsa-sha2.conf, and a wrong-CA negative test test-tls13-slhdsa-fail.conf. - DER round-trip and on-disk decode tests; bench_slhdsa_*_key.der fixtures regenerated with wolfSSL's own encoder so the codec is pinned to RFC 9909. - New unit test test_wc_slhdsa_x509_i2d_roundtrip exercises the raw PublicKeyDecode entry point that wolfssl_x509_make_der relies on. - test_wc_slhdsa_check_key now tests both Public-then-Private and Private-then-Public import orderings. Build / ABI: - DYNAMIC_TYPE_SPHINCS = 98 kept as RESERVED with a tombstone comment for ABI stability; new code should use DYNAMIC_TYPE_SLHDSA (107). - All build system / IDE project files updated; SPHINCS+ sources, headers, and test data removed. - Dead bench_slhdsa_*_key arrays removed from gencertbuf.pl and certs_test.h; the .der files on disk drive the decode tests.
1 parent 43e44cb commit 8425113

90 files changed

Lines changed: 10676 additions & 2906 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.wolfssl_known_macro_extras

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,6 @@ WOLFSSL_NO_SERVER_GROUPS_EXT
851851
WOLFSSL_NO_SESSION_STATS
852852
WOLFSSL_NO_SIGALG
853853
WOLFSSL_NO_SOCKADDR_UN
854-
WOLFSSL_NO_SPHINCS
855854
WOLFSSL_NO_STRICT_CIPHER_SUITE
856855
WOLFSSL_NO_TICKET_EXPIRE
857856
WOLFSSL_NO_TRUSTED_CERTS_VERIFY

IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/component.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,6 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/siphash.o
245245
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm2.o
246246
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm3.o
247247
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm4.o
248-
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sphincs.o
249248
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm32.o
250249
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm64.o
251250
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_armthumb.o
@@ -271,6 +270,7 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_mlkem_poly.o
271270
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_lms.o
272271
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_pkcs11.o
273272
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_port.o
273+
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_slhdsa.o
274274
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_xmss.o
275275
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o # autogen exclusion
276276
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o # autogen exclusion

IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,6 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/siphash.o
245245
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm2.o
246246
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm3.o
247247
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm4.o
248-
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sphincs.o
249248
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm32.o
250249
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm64.o
251250
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_armthumb.o
@@ -271,6 +270,7 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_mlkem_poly.o
271270
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_lms.o
272271
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_pkcs11.o
273272
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_port.o
273+
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_slhdsa.o
274274
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_xmss.o
275275
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o # autogen exclusion
276276
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o # autogen exclusion

IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,6 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/siphash.o
245245
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm2.o
246246
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm3.o
247247
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm4.o
248-
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sphincs.o
249248
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm32.o
250249
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm64.o
251250
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_armthumb.o
@@ -271,6 +270,7 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_mlkem_poly.o
271270
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_lms.o
272271
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_pkcs11.o
273272
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_port.o
273+
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_slhdsa.o
274274
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_xmss.o
275275
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o # autogen exclusion
276276
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o # autogen exclusion

IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,6 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/siphash.o
245245
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm2.o
246246
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm3.o
247247
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm4.o
248-
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sphincs.o
249248
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm32.o
250249
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm64.o
251250
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_armthumb.o
@@ -271,6 +270,7 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_mlkem_poly.o
271270
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_lms.o
272271
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_pkcs11.o
273272
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_port.o
273+
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_slhdsa.o
274274
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_xmss.o
275275
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o # autogen exclusion
276276
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o # autogen exclusion

IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,6 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/siphash.o
245245
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm2.o
246246
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm3.o
247247
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm4.o
248-
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sphincs.o
249248
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm32.o
250249
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm64.o
251250
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_armthumb.o
@@ -271,6 +270,7 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_mlkem_poly.o
271270
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_lms.o
272271
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_pkcs11.o
273272
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_port.o
273+
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_slhdsa.o
274274
COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_xmss.o
275275
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o # autogen exclusion
276276
# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o # autogen exclusion

IDE/INTIME-RTOS/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,6 @@ INCL_TARGS := wolfssl/callbacks.h \
320320
wolfssl/wolfcrypt/sm4.h \
321321
wolfssl/wolfcrypt/sp.h \
322322
wolfssl/wolfcrypt/sp_int.h \
323-
wolfssl/wolfcrypt/sphincs.h \
324323
wolfssl/wolfcrypt/srp.h \
325324
wolfssl/wolfcrypt/tfm.h \
326325
wolfssl/wolfcrypt/types.h \
@@ -329,6 +328,7 @@ INCL_TARGS := wolfssl/callbacks.h \
329328
wolfssl/wolfcrypt/wc_kyber.h \
330329
wolfssl/wolfcrypt/wc_pkcs11.h \
331330
wolfssl/wolfcrypt/wc_port.h \
331+
wolfssl/wolfcrypt/wc_slhdsa.h \
332332
wolfssl/wolfcrypt/wolfevent.h \
333333
wolfssl/wolfcrypt/wolfmath.h \
334334
wolfssl/wolfcrypt/xmss.h \

IDE/INTIME-RTOS/libwolfssl.vcxproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@
8181
<ClCompile Include="..\..\wolfcrypt\src\sha3.c" />
8282
<ClCompile Include="..\..\wolfcrypt\src\sha512.c" />
8383
<ClCompile Include="..\..\wolfcrypt\src\signature.c" />
84-
<ClCompile Include="..\..\wolfcrypt\src\sphincs.c" />
8584
<ClCompile Include="..\..\wolfcrypt\src\sp_c32.c" />
8685
<ClCompile Include="..\..\wolfcrypt\src\sp_c64.c" />
8786
<ClCompile Include="..\..\wolfcrypt\src\sp_int.c" />
@@ -93,6 +92,7 @@
9392
<ClCompile Include="..\..\wolfcrypt\src\wolfevent.c" />
9493
<ClCompile Include="..\..\wolfcrypt\src\wolfmath.c" />
9594
<ClCompile Include="..\..\wolfcrypt\src\wc_pkcs11.c" />
95+
<ClCompile Include="..\..\wolfcrypt\src\wc_slhdsa.c" />
9696
<ClCompile Include="..\..\wolfcrypt\src\port\liboqs\liboqs.c" />
9797

9898
</ItemGroup>
@@ -164,6 +164,7 @@
164164
<ClInclude Include="..\..\wolfssl\wolfcrypt\visibility.h" />
165165
<ClInclude Include="..\..\wolfssl\wolfcrypt\wc_encrypt.h" />
166166
<ClInclude Include="..\..\wolfssl\wolfcrypt\wc_port.h" />
167+
<ClInclude Include="..\..\wolfssl\wolfcrypt\wc_slhdsa.h" />
167168
<ClInclude Include="..\..\wolfssl\wolfcrypt\wolfevent.h" />
168169
<ClInclude Include="..\..\wolfssl\wolfcrypt\wolfmath.h" />
169170
</ItemGroup>

IDE/INTIME-RTOS/wolfssl-lib.vcxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@
108108
<ClCompile Include="..\..\wolfcrypt\src\sm2.c" />
109109
<ClCompile Include="..\..\wolfcrypt\src\sm3.c" />
110110
<ClCompile Include="..\..\wolfcrypt\src\sm4.c" />
111-
<ClCompile Include="..\..\wolfcrypt\src\sphincs.c" />
112111
<ClCompile Include="..\..\wolfcrypt\src\sp_arm32.c" />
113112
<ClCompile Include="..\..\wolfcrypt\src\sp_arm64.c" />
114113
<ClCompile Include="..\..\wolfcrypt\src\sp_armthumb.c" />
@@ -190,6 +189,7 @@
190189
<ClCompile Include="..\..\wolfcrypt\src\tfm.c" />
191190
<ClCompile Include="..\..\wolfcrypt\src\wc_encrypt.c" />
192191
<ClCompile Include="..\..\wolfcrypt\src\wc_port.c" />
192+
<ClCompile Include="..\..\wolfcrypt\src\wc_slhdsa.c" />
193193
<ClCompile Include="..\..\wolfcrypt\src\wolfevent.c" />
194194
<ClCompile Include="..\..\wolfcrypt\src\wolfmath.c" />
195195
</ItemGroup>

IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@
8181
<itemPath>../../../wolfcrypt/src/sp_c32.c</itemPath>
8282
<itemPath>../../../wolfcrypt/src/sp_c64.c</itemPath>
8383
<itemPath>../../../wolfcrypt/src/sp_int.c</itemPath>
84-
<itemPath>../../../wolfcrypt/src/sphincs.c</itemPath>
8584
<itemPath>../../../wolfcrypt/src/srp.c</itemPath>
8685
<itemPath>../../../wolfcrypt/src/tfm.c</itemPath>
8786
<itemPath>../../../wolfcrypt/src/wc_encrypt.c</itemPath>
8887
<itemPath>../../../wolfcrypt/src/wc_pkcs11.c</itemPath>
8988
<itemPath>../../../wolfcrypt/src/wc_port.c</itemPath>
89+
<itemPath>../../../wolfcrypt/src/wc_slhdsa.c</itemPath>
9090
<itemPath>../../../wolfcrypt/src/wolfevent.c</itemPath>
9191
<itemPath>../../../wolfcrypt/src/wolfmath.c</itemPath>
9292
</logicalFolder>

0 commit comments

Comments
 (0)