Skip to content

Commit 1643766

Browse files
committed
Add SLH-DSA TLS 1.3 entity authentication and CertificateVerify support
Add SLH-DSA as a TLS 1.3 signature algorithm for entity authentication in the handshake, per draft-reddy-tls-slhdsa-02. This builds on the certificate-layer SLH-DSA support (PR #5) and adds: TLS 1.3 SignatureScheme negotiation: - 6 SHAKE code points (0x0917-0x091C) with PQC_SA_MAJOR = 0x09 - EncodeSigAlg / DecodeTls13SigAlg / DecodeSigAlg - PickHashSigAlgo with SLH-DSA pkCurveOID matching - MatchSigAlgo for all 6 SHAKE variants - SIG_SLHDSA flag in SIG_ALL CertificateVerify signing and verification: - SendTls13CertificateVerify with SLH-DSA signing (empty context) - DoTls13CertificateVerify with SLH-DSA verification - Record fragmentation for signatures > MAX_RECORD_SIZE (16384 bytes) - Saves tail plaintext before in-place encryption - Loops through N fragments for arbitrarily large signatures - Tested with SHAKE-256f (49856-byte sig, 4 records) Peer key management: - peerSlhDsaKey / peerSlhDsaKeyPresent in WOLFSSL struct - AllocKey / FreeKey / ReuseKey for DYNAMIC_TYPE_SLHDSA - ProcessPeerCerts extracts SLH-DSA peer keys with param auto-detect Key loading: - ProcessBufferTryDecodeSlhDsa for SLH-DSA private key loading - ProcessBufferCertSetHave / ProcessBufferKeySet for haveSlhDsaSig Infrastructure: - haveSlhDsaSig, minSlhDsaKeySz in Options and CTX - MAX_X509_SIZE = 56*1024 for SLH-DSA (SHAKE-256f cert ~50KB) - WC_MAX_CERT_VERIFY_SZ = 49920 for SLH-DSA-SHAKE-256f - OpenSSL 3.5-generated SLH-DSA-SHAKE-128s cert chain for testing Interop tested with OQS provider (OpenSSL 3.4 + liboqs): - SHAKE-128s (7856-byte sig, 1 record) - bidirectional - SHAKE-128f (17088-byte sig, 2 records) - bidirectional - SHAKE-256f (49856-byte sig, 4 records) - bidirectional https://claude.ai/code/session_019gqvW3ZMKGGyi6zCRNPDYV
1 parent 42ff19f commit 1643766

28 files changed

Lines changed: 2381 additions & 52 deletions

certs/slhdsa/ca-slhdsa-key.pem

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MDAwCwYJYIZIAWUDBAMaAyEAEAnO7nuRhDQxpORenWhoVeFHXZOiIq+1C+m8YImu
3+
ZXM=
4+
-----END PUBLIC KEY-----

certs/slhdsa/ca-slhdsa-priv.der

84 Bytes
Binary file not shown.

certs/slhdsa/ca-slhdsa-priv.pem

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MFICAQAwCwYJYIZIAWUDBAMaBEDTKHsTe4ciLXjko7Ecvkg9CefXEJ3vhaPzfEUq
3+
TQ4kdRAJzu57kYQ0MaTkXp1oaFXhR12ToiKvtQvpvGCJrmVz
4+
-----END PRIVATE KEY-----

certs/slhdsa/ca-slhdsa.der

8.21 KB
Binary file not shown.

certs/slhdsa/ca-slhdsa.pem

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIg0zCCAg2gAwIBAgIBATALBglghkgBZQMEAxowgZ0xCzAJBgNVBAYTAlVTMRAw
3+
DgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA93b2xm
4+
U1NMX1NMSC1EU0ExFTATBgNVBAsMDFJvb3QtU0xILURTQTEYMBYGA1UEAwwPd3d3
5+
LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4X
6+
DTI2MDQxMzIwNDYxN1oXDTM2MDQxMDIwNDYxN1owgZsxCzAJBgNVBAYTAlVTMRAw
7+
DgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA93b2xm
8+
U1NMX1NMSC1EU0ExEzARBgNVBAsMCkNBLVNMSC1EU0ExGDAWBgNVBAMMD3d3dy53
9+
b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAwMAsG
10+
CWCGSAFlAwQDGgMhABAJzu57kYQ0MaTkXp1oaFXhR12ToiKvtQvpvGCJrmVzo2Yw
11+
ZDASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSzuwlJTbvzDi4eTSwxLGo8
12+
e9xxkzAfBgNVHSMEGDAWgBTwgzxTRobN5QXRSxxuZ8VlPUFp7DAOBgNVHQ8BAf8E
13+
BAMCAQYwCwYJYIZIAWUDBAMaA4IesQBmxvv1Mu4tE/qqnri/hLll96tPutMghdha
14+
e5yztjJNgJTpeWAI4Enz3v291d9xTlNByzZI/nV4VYtxiC4HMGyGID7cFTtaIl61
15+
yYFWeKF6pwSTEGk0vOWyUqbEJ3p6KLAL1gD4GcXIp/4CyWfdyCHnCpjRQGBA0ii4
16+
BD1ZgmVFDee0WRUgySzqr3cJJDr0GuSj5O4XHDeFXNNmKJNHpBH0hEEvlVuMyKPj
17+
ChBkJifO7i95UoqnUOGly+rRCElNiKNTrMky0oFgcHzPhl/txCFbvn8jCskHkZJL
18+
fx37O/RiM8MdZPBYliLgJUIb3n99LUt58EeNVr8JIxwKLa1byw/UP5MHj3fYrqOx
19+
y9gmMnMsXZL6cLPF+vewCXxEqW54cZdqpQJbP8es6Hwgi6HZeQ+09wTs4RbaDD66
20+
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
177+
66fV92bC0g==
178+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)