Commit Graph
1209 Commits
Author SHA1 Message Date
night1rider 2fcc341072 Add AES key wrap with padding (RFC 5649) and crypto callback support
Adds wc_AesKeyWrap_Pad/wc_AesKeyUnWrap_Pad and their _ex variants plus crypto
callback dispatch, routing blocks through wc_AesEcb* so an ECB only callback works.
2026-08-10 15:10:46 -06:00
David GarskeandGitHub 968e03e18f Merge pull request #10813 from kojo1/odbc
OpenSSL compatibility for libodbc
2026-08-08 10:57:18 -07:00
Takashi Kojo 39aad36963 Use a parse-in-progress sentinel for hmac.h's evp.h include 2026-08-08 18:04:20 +09:00
Takashi Kojo 82f9241b49 Drop BIO_{get,set}_app_data fallback aliasing BIO_{get,set}_data 2026-08-08 17:42:25 +09:00
Takashi Kojo 0babeebd55 Store callback_ctrl in BIO_meth_set_callback_ctrl like OpenSSL 2026-08-08 17:37:27 +09:00
Takashi Kojo f73e8013c8 Make BIO_get_new_index thread-safe with atomics, add threaded test 2026-08-08 17:33:35 +09:00
David GarskeandGitHub af9f62b690 Merge pull request #11092 from sameehj/fix/mem-fail-null-checks
Fix mem-fail nightly crashes (jenkins-supervisor #501)
2026-08-07 14:52:36 -07:00
David GarskeandGitHub 1bd2ee0dd4 Merge pull request #11041 from kareem-wolfssl/zd22232_42_63
Fully clear ECC k when calling wc_ecc_sign_hash_ex with SP math.  Avoid aliasing the ticket in wolfSSL_GetSessionAtIndex.  Fix IAR warnings.
2026-08-07 13:47:07 -07:00
David GarskeandGitHub 9ea943e34f Merge pull request #11016 from rizlik/dtls_epochs
dtls13: epoch mangament improvement and bug fixes
2026-08-07 12:30:09 -07:00
David GarskeandGitHub e2ddff61b7 Merge pull request #11105 from Frauschi/psk_fix
Send decrypt_error alert for TLS 1.3 PSK binder failures
2026-08-07 11:31:32 -07:00
David GarskeandGitHub 08a7c29537 Merge pull request #11039 from danielinux/mcdc-test-coverage
Mcdc test coverage: part 5
2026-08-07 10:11:57 -07:00
David GarskeandGitHub 586f1ed490 Merge pull request #11096 from Frauschi/pqc_only
Support post-quantum-only (ML-KEM + ML-DSA/SLH-DSA) TLS 1.3 builds
2026-08-07 10:08:34 -07:00
David GarskeandGitHub 032c78726f Merge pull request #10999 from embhorn/zd22154
Parse x500UniqueIdentifier (OID 2.5.4.45) in certificate DN
2026-08-07 10:01:55 -07:00
David GarskeandGitHub 96586b8f81 Merge pull request #11093 from Frauschi/fenrir_crypto
wolfCrypt Fenrir fixes
2026-08-07 09:11:42 -07:00
David GarskeandGitHub 9081c71f94 Merge pull request #11094 from Frauschi/fenrir_tls
TLS Fenrir fixes
2026-08-07 09:07:34 -07:00
David GarskeandGitHub bbdc07c1e7 Merge pull request #10786 from aidankeefe2022/fenrir-fixes-jun24/26-ak
Fix: WolfCrypt Fenrir - 11 fixes
2026-08-07 09:06:39 -07:00
Tobias Frauenschläger ec7d2de6a2 Send decrypt_error alert for TLS 1.3 PSK binder failures
RFC 8446 Section 6.2 lists failure to validate a PSK binder under
decrypt_error, but TranslateErrorToAlert() mapped BAD_BINDER to
illegal_parameter. That told the peer its ClientHello was malformed, when
in fact the message was well formed and only the binder MAC did not match.

BAD_BINDER is also returned when no offered PSK matched and the server has
no certificate to fall back to. That reuse is deliberate, because it keeps
an unknown PSK identity indistinguishable from a failed binder, so both
conditions still map to a single alert after this change. A comment at the
return site in CheckPreSharedKeys() now records the invariant at both ends.

Splitting BAD_BINDER off illegal_parameter exposed a second path that had to
move with it. FindPsk() raised PSK_KEY_ERROR, which stays mapped to
illegal_parameter, when the server callback recognised an identity carrying
a non-zero obfuscated_ticket_age. That check ran before any binder was
derived, so on a certificate-less server the two alerts would have let an
unauthenticated peer enumerate valid PSK identities without holding a key.
The check is removed rather than made to fail differently: RFC 8446 Section
4.2.11 says that for an externally established identity an
obfuscated_ticket_age of 0 SHOULD be used and servers MUST ignore the value.
Ignoring it satisfies that requirement, closes the oracle, and lets a
conformant client that sends a non-zero age complete a handshake that was
previously rejected. test_tls13_psk_age_no_identity_oracle() asserts a known
and an unknown identity produce the same alert, with a positive control that
the known run really took the matched path.

Also removes an unreachable branch in CheckPreSharedKeys(). Since commit
089f1f7c9 added the earlier !*usingPSK certificate check, the later
certificate check and its BAD_BINDER return can no longer be reached. A
build with certificates returns BAD_BINDER earlier when none is loaded, and
a NO_CERTS build returns it unconditionally. The remaining branch now falls
through to the shared exit so WOLFSSL_LEAVE() is emitted on the certificate
fallback path as well.

Adds an os-check-linux configuration, tls13-psk-no-certs. psk.yml already
covers NO_CERTS with TLS 1.3 PSK through static-psk-lowresource-tls13, but
that config disables DH, so it only reaches the psk_ke branch. This one
leaves DH enabled and covers psk_dhe_ke under NO_CERTS.

Applications that inspect wolfSSL_get_alert_history() will observe alert 51
instead of 47 for these conditions. The affected tests are updated.
2026-08-07 15:07:51 +02:00
Tobias Frauenschläger a9d58f389f Honor per-context X509_STORE_CTX verify callback
wolfSSL_X509_STORE_CTX_set_verify_cb stored the application callback in
ctx->verify_cb, but every verification site read ctx->store->verify_cb
instead, so the field was never consulted. An application installing a
restrictive callback on the store context, which is the OpenSSL
documented way to enforce extra policy during verification, had it
silently ignored, and wolfSSL_X509_verify_cert could report success on a
chain the callback would have rejected.

Add X509StoreGetVerifyCb, which prefers the context callback and falls
back to the store one, and use it at all four call sites in
X509StoreVerifyCert, X509StoreCheckPathLen and wolfSSL_X509_verify_cert.
The store fallback keeps its OPENSSL_ALL or WOLFSSL_QT guard because the
store field only exists there, while the call sites now follow the
OPENSSL_EXTRA guard of the setter. Clear ctx->verify_cb in
wolfSSL_X509_STORE_CTX_init along with the other per-verification state
so a reused context does not carry a stale callback.

A rejection also has to be reportable. When the certificate manager
accepts a chain, ctx->error is X509_V_OK, so a callback that rejects it
without recording an error of its own left wolfSSL_X509_verify_cert
returning failure while X509_STORE_CTX_get_error still said the chain
was fine. Record WOLFSSL_X509_V_ERR_UNSPECIFIED in that case, matching
what OpenSSL reports, and only when the callback set no error itself.
Add that value to the X509 error enum, where the openssl compatibility
header already had the define.

Feeding the rejection marker to SetupStoreCtxError is not an option
there, since GetX509Error has no X509_V_ error for it and would pass the
negative value through as the reported error. The OPENSSL_ALL date
recheck did exactly that after a rejection, so skip that block once the
callback has rejected, which also stops it from consulting the callback
a second time.

Add a regression test that verifies a good chain twice, once bare and
once with a rejecting context callback, requires the second attempt to
fail, and checks the reported error both when the callback records one
and when it does not.

Fixes F-7341.
2026-08-07 10:00:38 +02:00
Tobias Frauenschläger f7b4dab947 Fix double free in wolfSSL_X509_EXTENSION_set_data
The function freed the extension's dynamically allocated ASN.1 string
buffer but left value.data and value.isDynamic pointing at it. The
subsequent wolfSSL_ASN1_STRING_copy() call snapshots those fields before
copying and frees the old buffer once the copy is complete, so the stale
pointer was freed a second time. Any second call to
wolfSSL_X509_EXTENSION_set_data() on an extension holding a value of at
least CTC_NAME_SIZE bytes hit this, and passing the extension its own
value made the copy read freed memory as well.

wolfSSL_ASN1_STRING_set() already performs an alias safe replacement and
disposes of the previous buffer itself, so drop the manual free. Add a
regression test that replaces a dynamically allocated extension value and
then sets the value from itself.

Fixes F-7340.
2026-08-07 10:00:38 +02:00
Tobias Frauenschläger 8b551a8c35 Send protocol_version alert when no version can be negotiated
DoClientHello has four exits that fail with VERSION_ERROR when runtime
version restrictions leave nothing acceptable at or below the version the
client offered. Three of them sent no alert at all, and the fourth sent
one only when WOLFSSL_EXTRA_ALERTS was defined, so a default build simply
dropped the connection. The client could not tell a version mismatch from
a network failure.

The generic fallback did not help. SendFatalAlertOnly is a no-op unless
WOLFSSL_EXTRA_ALERTS is defined, and where it is defined it grouped
VERSION_ERROR with MATCH_SUITE_ERROR and sent handshake_failure. That also
disagreed with the TLS 1.3 mapping, which already resolves VERSION_ERROR
to protocol_version.

Send a fatal protocol_version alert from all four branches regardless of
WOLFSSL_EXTRA_ALERTS, and give VERSION_ERROR its own case in
SendFatalAlertOnly so the generic path agrees.

Note that this is only observable on the TLS 1.2 message path. A TLS 1.3
capable server routes the ClientHello through DoTls13HandShakeMsgType,
which already translates the error into the right alert.

Fixes F-7568.
2026-08-07 10:00:38 +02:00
Takashi KojoandGitHub 563f0f0c13 Merge pull request #10962 from kojo1/oss_mldsa
OpenSSL compat with ML-DSA
2026-08-07 16:38:17 +09:00
Daniele Lacamera e79f833be3 tests: wrap error-code operands and fix the test_compress include order
check-source-text flags a comparison against a bare error code, since an
unwrapped operand defeats the error-trace build. 85 of them across five
white-boxes, all introduced by this branch; wrap each in WC_NO_ERR_TRACE().

test_compress.c was the only file of the 105 in tests/api/ that included a
libc header before <tests/unit.h>. That header establishes wolfSSL's
feature-test macros, and pulling limits.h in ahead of it fixes glibc's
exposure before they are seen, which under -std=c89 left POSIX types the
rest of the suite needs undeclared -- the unknown 'stack_t' and 'intptr_t'
the c89 clang-tidy scenario reported. Include it after, where it still
provides INT_MAX.
2026-08-07 09:27:42 +02:00
Daniele Lacamera 44de2692dd tests: fix codespell hits in the MC/DC test files
"statics" is not a word and codespell reads it as "statistics"; say
helpers or internals instead.

The ASNSetData array named `nd` reads as a typo for "and"/"2nd"; rename it
to `nested`, which is what it holds.

The strlcat truncation case asserted against "he worl", a deliberately cut
string that codespell flags. Use data whose truncation is not
dictionary-adjacent; the expected values come from the same OpenBSD
reference as the rest of these assertions.
2026-08-07 09:27:42 +02:00
Daniele Lacamera a7e5504818 tests: assert the documented strlcpy/strlcat and PKCS7 stream contracts
These three tests fail against master today and pass once the wc_port and
pkcs7 fixes land; they are the executable statement of what those fixes
must do.

wc_strlcpy must return the length of src, not the bytes it copied, which
is what makes the documented truncation check (ret >= dstSize) work and
what its own doxygen comment already specifies.

wc_strlcat must return the total length attempted and must not measure dst
past dstSize: an unbounded scan of a dst holding no NUL is the
out-of-bounds read strlcat(3) bounds this at to prevent. The dst in that
case keeps a NUL at the very end of the array so an unbounded
implementation reads a wrong length and fails the assertion rather than
running off the buffer under a sanitizer.

Tearing down a PKCS7 whose AuthEnvelopedData decode stopped part-way must
not leak the encryptedContent buffer that stream->bufferPt holds across
WANT_READ re-entries. Counting allocators wrap the whole cycle; an
untouched blob runs first as a control so an imbalance is attributable to
the aborted decode rather than to ambient allocation.

Expected values verified against the OpenBSD strlcpy/strlcat sources and
against a build carrying the fixes.
2026-08-07 09:27:42 +02:00
Daniele Lacamera b5c67536f9 tests: address review feedback on the Part 5 tests
Include <limits.h> in test_compress.c rather than relying on another
header pulling it in for INT_MAX.

Free wc_PKCS12_parse's outputs with the types it allocates them with:
DYNAMIC_TYPE_PUBLIC_KEY for the key and DYNAMIC_TYPE_PKCS for the cert
buffer, which comes from a WC_DerCertList node. The white-box was using
PRIVATE_KEY/CERT, which misaccounts under memory tracking.

Run the SHE argument guards only on a context wc_SHE_Init() accepted,
since `she` is an uninitialised stack object otherwise.

Note in test_port.c that wc_strlcpy returns the number of bytes copied
rather than XSTRLEN(src) as BSD strlcpy does, so the truncating call is
expected to report 2.
2026-08-07 09:27:42 +02:00
Daniele Lacamera a123863e92 tests: add she DecisionCoverage case
wc_SHE_GenerateM1M2M3 and wc_SHE_GenerateM4M5 have a 12-operand and an
8-operand argument OR that account for 20 of wc_she.c's 23 uncovered
conditions; the group's other tests only pass valid arguments. One call
per operand.
2026-08-07 09:27:42 +02:00
Daniele Lacamera 65ffd32f4c tests: add pkcs12 container DecisionCoverage case
The pkcs12 group was almost entirely wc_PKCS12_PBKDF_ex, which lives in
pwdbased.c, leaving pkcs12.c's container entry points to the KAT alone.
Drives the argument guards of wc_d2i_PKCS12, wc_i2d_PKCS12,
wc_PKCS12_parse and wc_PKCS12_free.
2026-08-07 09:27:42 +02:00
Daniele Lacamera 9ddb7ff5e0 tests: add compress group for compress.c MC/DC
Argument guards of wc_Compress_ex, wc_DeCompress_ex and
wc_DeCompressDynamic, plus the inSz overflow cap. Takes compress.c to
8/8 with the existing compress_test() KAT.
2026-08-07 09:27:42 +02:00
Daniele Lacamera 28f4440dd0 tests: add port group for wc_port.c MC/DC
Covers the argument guards of wc_FileLoad, wc_ReadDirFirst/Next,
wc_strtok, wc_strsep, wc_strlcpy's truncation arm and wolfSSL_NewThread.
wc_port.c had no test group of its own.

Builds clean under --enable-all, default and --enable-singlethreaded.
2026-08-07 09:27:42 +02:00
Tobias Frauenschläger f5f3dd4c6e Support post-quantum-only (ML-KEM + ML-DSA/SLH-DSA) TLS 1.3 builds
Allow a quantum-safe-only TLS 1.3 stack - ML-KEM key exchange with ML-DSA or
SLH-DSA authentication - with RSA, ECC and DH all disabled (the CNSA 2.0 /
EO 14412 posture).

- Treat a usable standalone ML-KEM group as a valid key exchange and
  Falcon/ML-DSA/SLH-DSA as valid authentication, so the "no cipher suites"
  #errors no longer fire (ssl.c, internal.h), and extend the CopyDecodedToX509
  pkCurveOID guard to match the struct member guards (internal.c).
- asn.c: guard the RSA/ECC-only certificate signing helpers so cert generation
  compiles with RSA and ECC disabled, while keeping MakeSignatureCb available
  for the WOLFSSL_CERT_SIGN_CB (TPM/HSM) offload path.
- tls.c: advertise the psk_dhe_ke exchange mode when a standalone ML-KEM group
  is usable on the client side, that is when the build has both key generation
  and decapsulation. Without it an ML-KEM-only build fell back to psk_ke, the
  resumption key schedules diverged, and the first AEAD record failed to
  authenticate (AES_GCM_AUTH_E), breaking session-ticket resumption.
- tls13.c: hoist the hashAlgo void cast in EncodeSigAlg out of the Ed25519 and
  Ed448 cases so a build with no classic signature algorithm still marks the
  parameter used.
- Examples and tests: add ML-DSA and SLH-DSA certificate selection (gated on
  NO_RSA so it only applies in true PQC-only builds) and default to TLS 1.3
  when no classic auth is built in and a post-quantum signature is available
  (test.h, client/server/echo*, test_tls13.c). SLH-DSA uses the SHAKE-128s leaf
  certificates and their shared 128s root.
- CI: add PQC-only entries to the pq-all.json config list (ML-DSA and SLH-DSA),
  each exercising the build, a full TLS 1.3 handshake, and ML-KEM-only
  session-ticket resumption.

Whether a build can authenticate with a post-quantum certificate is three
separate questions - is the algorithm compiled in, are test credentials wired
up for the enabled parameter set, and can this build sign - so test.h answers
them with three tiers of macro rather than testing WOLFSSL_HAVE_MLDSA and
WOLFSSL_HAVE_SLHDSA directly:

- TEST_HAVE_MLDSA_CERT_FILES / TEST_HAVE_SLHDSA_CERT_FILES: the credential
  paths name real files. ML-DSA needs an enabled parameter level; SLH-DSA needs
  a 128s parameter set, since both families share a 128s root and only those
  certificates are wired up, and PEM decoding, since the entity certificates
  ship as PEM only. Loading a certificate needs verification support alone, so
  test_tls13.c uses this tier - it only needs a certificate on the context.
- TEST_HAVE_MLDSA_CERTS / TEST_HAVE_SLHDSA_CERTS: the above, plus the ability
  to sign. A verify-only build derives WOLFSSL_MLDSA_NO_SIGN and drops private
  key support entirely, so it can neither load the key nor produce a
  CertificateVerify. The example credential ladders use this tier.
- TEST_HAVE_PQC_CERT_AUTH: either of those, plus WOLFSSL_TLS13. Both algorithms
  are TLS 1.3 only, so folding the version into the macro keeps the version
  defaults and the PSK fallbacks in the client, server and echo examples from
  disagreeing. Falcon is deliberately absent, having no credentials in the
  ladders, so a Falcon-only build keeps the historic TLS 1.2 PSK behavior.

A build that fails a gate now falls back to PSK instead of naming credentials
it cannot use, which removes two hard #errors that were reachable from
configure: --enable-slhdsa with only non-128s parameter sets broke every build
that includes test.h, even ones with RSA and ECC enabled that would never touch
an SLH-DSA credential.

Also in the credential material and the configurations this opens up:

- test.h: pair the DER ML-DSA certificate with mldsa<N>-key.der. The
  mldsa<N>_priv-only.der files are standalone PKCS#8 encoding vectors from an
  unrelated key pair, so a build without PEM decoding presented a certificate
  and signed with a key that did not match it, and the peer rejected the
  CertificateVerify.
- echoserver.c: load the SLH-DSA key with CERT_FILETYPE like every neighboring
  branch, rather than hardcoding WOLFSSL_FILETYPE_PEM against a certificate
  loaded in the build-dependent format.
- internal.c, tls13.c, ssl_load.c: mark ssl, sigOut, keyType and keySz used.
  Every reader of these sits in a per-algorithm block, so a build with no
  signing algorithm at all left them unused and -Werror rejected the library.
- tests/api.c: skip test_wolfSSL_PKCS8 unless RSA, ECC or PEM decoding is
  available. With none of them every key-loading body compiles out, leaving the
  file locals unused and nothing for the test to do.
2026-08-07 08:14:26 +02:00
Tobias Frauenschläger d4755b4b62 Fix EVP_DecodeUpdate overflow on NUL byte in base64 input
The quad decoding loop broke out on a NUL byte without clearing the
remaining input length, unlike the equivalent loops in Base64_Decode and
Base64_Decode_nonCT. Control then fell into the block that buffers the
leftover input in the context, which copied the full remaining byte count
into the 48 byte ctx->data with an unbounded index, and read one byte past
the end of the caller's buffer. An application decoding attacker supplied
base64 with an explicit, binary safe length could write attacker
controlled data past the end of a heap allocated encode context.

Clear the length before breaking, and bound the leftover copy loop at one
decode block, which is the most that loop can legitimately buffer. That
also keeps ctx->remaining below the block size, so a reused context cannot
underflow the copy size in the next update call or over-read ctx->data in
EVP_DecodeFinal.

Add a negative test feeding a NUL byte followed by more non-whitespace
data than the context buffer can hold.

Fixes F-7445.
2026-08-07 08:11:23 +02:00
Tobias Frauenschläger af0eb33fff Invalidate LMS key when private key write fails
wc_LmsKey_Sign computes the signature with the one-time key at the
current leaf and only afterwards advances the leaf index and writes it
to non-volatile storage. When that write failed the signature was erased
but the key state was left as OK, so the same in-memory key could sign
again while storage still recorded the already consumed leaf. A restart
followed by wc_LmsKey_Reload would then resume from that leaf and sign a
second message with the same LM-OTS private key.

Set the key state to bad before signing and only restore it to OK once
the advanced private key has been committed to storage, matching what
wc_xmsskey_signupdate already does for XMSS. Exhausted keys keep their
existing NOSIGS state.

Fixes F-7411.
2026-08-07 08:11:23 +02:00
Sean Parkinson 5a1cd9fc3e ssl.c split: cleanup
Clean up includes single return point from every function, consistent formatting function block comment and tests added.

ssl_api_rw.c: Cleanup; 6 helpers extracted from write_dup/shutdown; fixed a SendBuffered corner case that returned 0 instead of an error.

ssl_api_ext.c: Cleanup; extracted wolfssl_ticket_key_cb_process, wolfssl_rehandshake_prepare.

ssl_api_hs.c: Cleanup + de-indent; 9 helpers extracted, incl. shared wolfssl_handshake_flush/_done between connect and accept (~100 duplicated lines removed). wolfSSL_connect/accept left multi-exit.

ssl_api_cert.c: Cleanup of newer functions at end of file; extracted PushPeerCertToChain; fixed a double free in CreatePeerCertChain; fixed 5 wrong @param names.

ssl_api_crl_ocsp.c: Full cleanup of all 49 functions; wolfSSL_OCSP_parse_url rewritten; fixed a URL with no host returning success with the rest of the URL as the host; added IPv6 literal support; fixed 4 wrong WOLFSSL_ENTER names.

ssl.c: Moved the x509GetIssuerFromCM forward declaration here for clarity.
2026-08-07 09:30:56 +10:00
Takashi Kojo f79cb90071 Do not free caller's EVP_PKEY until d2i has a replacement 2026-08-07 07:52:57 +09:00
Takashi Kojo 25946c854e Keep the full PKCS#8 wrapper for ML-DSA 2026-08-07 07:48:34 +09:00
Takashi Kojo 26ec360efb Cross-check cached mldsaOID against decoded signing key 2026-08-07 07:48:34 +09:00
Takashi Kojo 25031722ca Use MLDSA_MAX_PUB_KEY_DER_SIZE for SPKI buffers 2026-08-07 07:48:34 +09:00
Takashi Kojo 0f24bac7ab Use d2i_PUBKEY in Ed25519 reuse regression test 2026-08-07 07:48:34 +09:00
Takashi Kojo e63172051d Move multi-KB test buffers from stack to heap 2026-08-07 07:48:34 +09:00
Takashi Kojo 3d8b6f8701 Use explicit prePopulated flag in Ed25519/Ed448 d2i helpers 2026-08-07 07:48:34 +09:00
Takashi Kojo 4749f702fc Cover X25519/X448/HKDF/CMAC in d2i_free_prev_key_obj 2026-08-07 07:48:34 +09:00
Takashi Kojo 5340dc1f09 Fix error code check 2026-08-07 07:47:02 +09:00
Takashi Kojo b9ed467425 Free previous algorithm object when d2i repurposes an EVP_PKEY 2026-08-07 07:46:32 +09:00
Takashi Kojo cc419553e2 Reset XFILE handle after every close in ML-DSA tests 2026-08-07 07:38:29 +09:00
Takashi Kojo 522df01c29 Guard ML-DSA key/RNG cleanup in tests against Expect short-circuit 2026-08-07 07:38:29 +09:00
Takashi Kojo 728e41791c Test X509_set_pubkey with seed and private-only ML-DSA keys 2026-08-07 07:38:29 +09:00
Takashi Kojo 8f0f2eb229 Use mldsa_get_oid_sum for draft-aware OID in X509 signing 2026-08-07 07:38:29 +09:00
Takashi Kojo 977ed7f1c4 Extend ML-DSA compat test coverage to all levels and untested paths 2026-08-07 07:38:29 +09:00
Takashi Kojo 997cfdaeb2 PKCS#8 algId check and DER-only typed d2i for ML-DSA 2026-08-07 07:38:29 +09:00
Takashi Kojo 69749e8f99 Reset MlDsaKey between decode attempts in X509_set_pubkey 2026-08-07 07:38:29 +09:00