diff --git a/Makefile.am b/Makefile.am
index b7bbd4057..104a8fb86 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -128,92 +128,6 @@ src_libbitcoin_network_la_SOURCES = \
src/sessions/session_peer.cpp \
src/sessions/session_seed.cpp \
src/sessions/session_server.cpp \
- src/ssl/wolfcrypt/aes.c \
- src/ssl/wolfcrypt/arc4.c \
- src/ssl/wolfcrypt/ascon.c \
- src/ssl/wolfcrypt/asm.c \
- src/ssl/wolfcrypt/asn.c \
- src/ssl/wolfcrypt/blake2b.c \
- src/ssl/wolfcrypt/blake2s.c \
- src/ssl/wolfcrypt/camellia.c \
- src/ssl/wolfcrypt/chacha.c \
- src/ssl/wolfcrypt/chacha20_poly1305.c \
- src/ssl/wolfcrypt/cmac.c \
- src/ssl/wolfcrypt/coding.c \
- src/ssl/wolfcrypt/compress.c \
- src/ssl/wolfcrypt/cpuid.c \
- src/ssl/wolfcrypt/cryptocb.c \
- src/ssl/wolfcrypt/curve25519.c \
- src/ssl/wolfcrypt/curve448.c \
- src/ssl/wolfcrypt/des3.c \
- src/ssl/wolfcrypt/dh.c \
- src/ssl/wolfcrypt/dilithium.c \
- src/ssl/wolfcrypt/dsa.c \
- src/ssl/wolfcrypt/ecc.c \
- src/ssl/wolfcrypt/eccsi.c \
- src/ssl/wolfcrypt/ed25519.c \
- src/ssl/wolfcrypt/ed448.c \
- src/ssl/wolfcrypt/error1.c \
- src/ssl/wolfcrypt/ext_lms.c \
- src/ssl/wolfcrypt/ext_mlkem.c \
- src/ssl/wolfcrypt/ext_xmss.c \
- src/ssl/wolfcrypt/falcon.c \
- src/ssl/wolfcrypt/fe_448.c \
- src/ssl/wolfcrypt/fe_low_mem.c \
- src/ssl/wolfcrypt/fe_operations.c \
- src/ssl/wolfcrypt/fe_x25519_128.h \
- src/ssl/wolfcrypt/ge_448.c \
- src/ssl/wolfcrypt/ge_low_mem.c \
- src/ssl/wolfcrypt/ge_operations.c \
- src/ssl/wolfcrypt/hash.c \
- src/ssl/wolfcrypt/hmac.c \
- src/ssl/wolfcrypt/hpke.c \
- src/ssl/wolfcrypt/integer.c \
- src/ssl/wolfcrypt/kdf.c \
- src/ssl/wolfcrypt/logging.c \
- src/ssl/wolfcrypt/md2.c \
- src/ssl/wolfcrypt/md4.c \
- src/ssl/wolfcrypt/md5.c \
- src/ssl/wolfcrypt/memory1.c \
- src/ssl/wolfcrypt/pkcs12.c \
- src/ssl/wolfcrypt/pkcs7.c \
- src/ssl/wolfcrypt/poly1305.c \
- src/ssl/wolfcrypt/pwdbased.c \
- src/ssl/wolfcrypt/random.c \
- src/ssl/wolfcrypt/rc2.c \
- src/ssl/wolfcrypt/ripemd.c \
- src/ssl/wolfcrypt/rsa.c \
- src/ssl/wolfcrypt/sakke.c \
- src/ssl/wolfcrypt/sha.c \
- src/ssl/wolfcrypt/sha256.c \
- src/ssl/wolfcrypt/sha3.c \
- src/ssl/wolfcrypt/sha512.c \
- src/ssl/wolfcrypt/signature.c \
- src/ssl/wolfcrypt/siphash.c \
- src/ssl/wolfcrypt/sp_arm32.c \
- src/ssl/wolfcrypt/sp_arm64.c \
- src/ssl/wolfcrypt/sp_armthumb.c \
- src/ssl/wolfcrypt/sp_c32.c \
- src/ssl/wolfcrypt/sp_c64.c \
- src/ssl/wolfcrypt/sp_cortexm.c \
- src/ssl/wolfcrypt/sp_dsp32.c \
- src/ssl/wolfcrypt/sp_int.c \
- src/ssl/wolfcrypt/sp_x86_64.c \
- src/ssl/wolfcrypt/sphincs.c \
- src/ssl/wolfcrypt/srp.c \
- src/ssl/wolfcrypt/tfm.c \
- src/ssl/wolfcrypt/wc_dsp.c \
- src/ssl/wolfcrypt/wc_encrypt.c \
- src/ssl/wolfcrypt/wc_lms.c \
- src/ssl/wolfcrypt/wc_lms_impl.c \
- src/ssl/wolfcrypt/wc_mlkem.c \
- src/ssl/wolfcrypt/wc_mlkem_poly.c \
- src/ssl/wolfcrypt/wc_pkcs11.c \
- src/ssl/wolfcrypt/wc_port.c \
- src/ssl/wolfcrypt/wc_xmss.c \
- src/ssl/wolfcrypt/wc_xmss_impl.c \
- src/ssl/wolfcrypt/wolfevent.c \
- src/ssl/wolfcrypt/wolfmath.c \
src/ssl/wolfssl/crl.c \
src/ssl/wolfssl/dtls.c \
src/ssl/wolfssl/dtls13.c \
@@ -240,7 +154,93 @@ src_libbitcoin_network_la_SOURCES = \
src/ssl/wolfssl/src/ssl_sess.c \
src/ssl/wolfssl/src/ssl_sk.c \
src/ssl/wolfssl/src/x509.c \
- src/ssl/wolfssl/src/x509_str.c
+ src/ssl/wolfssl/src/x509_str.c \
+ src/ssl/wolfssl/wolfcrypt/aes.c \
+ src/ssl/wolfssl/wolfcrypt/arc4.c \
+ src/ssl/wolfssl/wolfcrypt/ascon.c \
+ src/ssl/wolfssl/wolfcrypt/asm.c \
+ src/ssl/wolfssl/wolfcrypt/asn.c \
+ src/ssl/wolfssl/wolfcrypt/blake2b.c \
+ src/ssl/wolfssl/wolfcrypt/blake2s.c \
+ src/ssl/wolfssl/wolfcrypt/camellia.c \
+ src/ssl/wolfssl/wolfcrypt/chacha.c \
+ src/ssl/wolfssl/wolfcrypt/chacha20_poly1305.c \
+ src/ssl/wolfssl/wolfcrypt/cmac.c \
+ src/ssl/wolfssl/wolfcrypt/coding.c \
+ src/ssl/wolfssl/wolfcrypt/compress.c \
+ src/ssl/wolfssl/wolfcrypt/cpuid.c \
+ src/ssl/wolfssl/wolfcrypt/cryptocb.c \
+ src/ssl/wolfssl/wolfcrypt/curve25519.c \
+ src/ssl/wolfssl/wolfcrypt/curve448.c \
+ src/ssl/wolfssl/wolfcrypt/des3.c \
+ src/ssl/wolfssl/wolfcrypt/dh.c \
+ src/ssl/wolfssl/wolfcrypt/dilithium.c \
+ src/ssl/wolfssl/wolfcrypt/dsa.c \
+ src/ssl/wolfssl/wolfcrypt/ecc.c \
+ src/ssl/wolfssl/wolfcrypt/eccsi.c \
+ src/ssl/wolfssl/wolfcrypt/ed25519.c \
+ src/ssl/wolfssl/wolfcrypt/ed448.c \
+ src/ssl/wolfssl/wolfcrypt/error.c \
+ src/ssl/wolfssl/wolfcrypt/ext_lms.c \
+ src/ssl/wolfssl/wolfcrypt/ext_mlkem.c \
+ src/ssl/wolfssl/wolfcrypt/ext_xmss.c \
+ src/ssl/wolfssl/wolfcrypt/falcon.c \
+ src/ssl/wolfssl/wolfcrypt/fe_448.c \
+ src/ssl/wolfssl/wolfcrypt/fe_low_mem.c \
+ src/ssl/wolfssl/wolfcrypt/fe_operations.c \
+ src/ssl/wolfssl/wolfcrypt/fe_x25519_128.h \
+ src/ssl/wolfssl/wolfcrypt/ge_448.c \
+ src/ssl/wolfssl/wolfcrypt/ge_low_mem.c \
+ src/ssl/wolfssl/wolfcrypt/ge_operations.c \
+ src/ssl/wolfssl/wolfcrypt/hash.c \
+ src/ssl/wolfssl/wolfcrypt/hmac.c \
+ src/ssl/wolfssl/wolfcrypt/hpke.c \
+ src/ssl/wolfssl/wolfcrypt/integer.c \
+ src/ssl/wolfssl/wolfcrypt/kdf.c \
+ src/ssl/wolfssl/wolfcrypt/logging.c \
+ src/ssl/wolfssl/wolfcrypt/md2.c \
+ src/ssl/wolfssl/wolfcrypt/md4.c \
+ src/ssl/wolfssl/wolfcrypt/md5.c \
+ src/ssl/wolfssl/wolfcrypt/memory.c \
+ src/ssl/wolfssl/wolfcrypt/pkcs12.c \
+ src/ssl/wolfssl/wolfcrypt/pkcs7.c \
+ src/ssl/wolfssl/wolfcrypt/poly1305.c \
+ src/ssl/wolfssl/wolfcrypt/pwdbased.c \
+ src/ssl/wolfssl/wolfcrypt/random.c \
+ src/ssl/wolfssl/wolfcrypt/rc2.c \
+ src/ssl/wolfssl/wolfcrypt/ripemd.c \
+ src/ssl/wolfssl/wolfcrypt/rsa.c \
+ src/ssl/wolfssl/wolfcrypt/sakke.c \
+ src/ssl/wolfssl/wolfcrypt/sha.c \
+ src/ssl/wolfssl/wolfcrypt/sha256.c \
+ src/ssl/wolfssl/wolfcrypt/sha3.c \
+ src/ssl/wolfssl/wolfcrypt/sha512.c \
+ src/ssl/wolfssl/wolfcrypt/signature.c \
+ src/ssl/wolfssl/wolfcrypt/siphash.c \
+ src/ssl/wolfssl/wolfcrypt/sp_arm32.c \
+ src/ssl/wolfssl/wolfcrypt/sp_arm64.c \
+ src/ssl/wolfssl/wolfcrypt/sp_armthumb.c \
+ src/ssl/wolfssl/wolfcrypt/sp_c32.c \
+ src/ssl/wolfssl/wolfcrypt/sp_c64.c \
+ src/ssl/wolfssl/wolfcrypt/sp_cortexm.c \
+ src/ssl/wolfssl/wolfcrypt/sp_dsp32.c \
+ src/ssl/wolfssl/wolfcrypt/sp_int.c \
+ src/ssl/wolfssl/wolfcrypt/sp_x86_64.c \
+ src/ssl/wolfssl/wolfcrypt/sphincs.c \
+ src/ssl/wolfssl/wolfcrypt/srp.c \
+ src/ssl/wolfssl/wolfcrypt/tfm.c \
+ src/ssl/wolfssl/wolfcrypt/wc_dsp.c \
+ src/ssl/wolfssl/wolfcrypt/wc_encrypt.c \
+ src/ssl/wolfssl/wolfcrypt/wc_lms.c \
+ src/ssl/wolfssl/wolfcrypt/wc_lms_impl.c \
+ src/ssl/wolfssl/wolfcrypt/wc_mlkem.c \
+ src/ssl/wolfssl/wolfcrypt/wc_mlkem_poly.c \
+ src/ssl/wolfssl/wolfcrypt/wc_pkcs11.c \
+ src/ssl/wolfssl/wolfcrypt/wc_port.c \
+ src/ssl/wolfssl/wolfcrypt/wc_xmss.c \
+ src/ssl/wolfssl/wolfcrypt/wc_xmss_impl.c \
+ src/ssl/wolfssl/wolfcrypt/wolfevent.c \
+ src/ssl/wolfssl/wolfcrypt/wolfmath.c
# local: test/libbitcoin-network-test
#------------------------------------------------------------------------------
@@ -249,7 +249,7 @@ if WITH_TESTS
TESTS = libbitcoin-network-test_runner.sh
check_PROGRAMS = test/libbitcoin-network-test
-test_libbitcoin_network_test_CPPFLAGS = -I${srcdir}/include -I${srcdir}/include/bitcoin/ssl ${bitcoin_system_BUILD_CPPFLAGS}
+test_libbitcoin_network_test_CPPFLAGS = -I${srcdir}/include -I${srcdir}/include/bitcoin/ssl -I${srcdir}/test/ssl/wolfssl ${bitcoin_system_BUILD_CPPFLAGS}
test_libbitcoin_network_test_LDADD = src/libbitcoin-network.la ${boost_unit_test_framework_LIBS} ${bitcoin_system_LIBS}
test_libbitcoin_network_test_SOURCES = \
test/error.cpp \
@@ -370,7 +370,152 @@ test_libbitcoin_network_test_SOURCES = \
test/sessions/session_manual.cpp \
test/sessions/session_outbound.cpp \
test/sessions/session_seed.cpp \
- test/sessions/session_server.cpp
+ test/sessions/session_server.cpp \
+ test/ssl/wolfssl.cpp \
+ test/ssl/wolfssl/examples/client/client.c \
+ test/ssl/wolfssl/examples/client/client.h \
+ test/ssl/wolfssl/examples/server/server.c \
+ test/ssl/wolfssl/examples/server/server.h \
+ test/ssl/wolfssl/tests/api.c \
+ test/ssl/wolfssl/tests/quic.c \
+ test/ssl/wolfssl/tests/srp.c \
+ test/ssl/wolfssl/tests/suites.c \
+ test/ssl/wolfssl/tests/unit.c \
+ test/ssl/wolfssl/tests/unit.h \
+ test/ssl/wolfssl/tests/utils.c \
+ test/ssl/wolfssl/tests/utils.h \
+ test/ssl/wolfssl/tests/w64wrapper.c \
+ test/ssl/wolfssl/tests/api/api.h \
+ test/ssl/wolfssl/tests/api/api_decl.h \
+ test/ssl/wolfssl/tests/api/test_aes.c \
+ test/ssl/wolfssl/tests/api/test_aes.h \
+ test/ssl/wolfssl/tests/api/test_arc4.c \
+ test/ssl/wolfssl/tests/api/test_arc4.h \
+ test/ssl/wolfssl/tests/api/test_ascon.c \
+ test/ssl/wolfssl/tests/api/test_ascon.h \
+ test/ssl/wolfssl/tests/api/test_ascon_kats.h \
+ test/ssl/wolfssl/tests/api/test_asn.c \
+ test/ssl/wolfssl/tests/api/test_asn.h \
+ test/ssl/wolfssl/tests/api/test_blake2.c \
+ test/ssl/wolfssl/tests/api/test_blake2.h \
+ test/ssl/wolfssl/tests/api/test_camellia.c \
+ test/ssl/wolfssl/tests/api/test_camellia.h \
+ test/ssl/wolfssl/tests/api/test_chacha.c \
+ test/ssl/wolfssl/tests/api/test_chacha.h \
+ test/ssl/wolfssl/tests/api/test_chacha20_poly1305.c \
+ test/ssl/wolfssl/tests/api/test_chacha20_poly1305.h \
+ test/ssl/wolfssl/tests/api/test_cmac.c \
+ test/ssl/wolfssl/tests/api/test_cmac.h \
+ test/ssl/wolfssl/tests/api/test_curve25519.c \
+ test/ssl/wolfssl/tests/api/test_curve25519.h \
+ test/ssl/wolfssl/tests/api/test_curve448.c \
+ test/ssl/wolfssl/tests/api/test_curve448.h \
+ test/ssl/wolfssl/tests/api/test_des3.c \
+ test/ssl/wolfssl/tests/api/test_des3.h \
+ test/ssl/wolfssl/tests/api/test_dh.c \
+ test/ssl/wolfssl/tests/api/test_dh.h \
+ test/ssl/wolfssl/tests/api/test_digest.h \
+ test/ssl/wolfssl/tests/api/test_dsa.c \
+ test/ssl/wolfssl/tests/api/test_dsa.h \
+ test/ssl/wolfssl/tests/api/test_dtls.c \
+ test/ssl/wolfssl/tests/api/test_dtls.h \
+ test/ssl/wolfssl/tests/api/test_ecc.c \
+ test/ssl/wolfssl/tests/api/test_ecc.h \
+ test/ssl/wolfssl/tests/api/test_ed25519.c \
+ test/ssl/wolfssl/tests/api/test_ed25519.h \
+ test/ssl/wolfssl/tests/api/test_ed448.c \
+ test/ssl/wolfssl/tests/api/test_ed448.h \
+ test/ssl/wolfssl/tests/api/test_evp.c \
+ test/ssl/wolfssl/tests/api/test_evp.h \
+ test/ssl/wolfssl/tests/api/test_hash.c \
+ test/ssl/wolfssl/tests/api/test_hash.h \
+ test/ssl/wolfssl/tests/api/test_hmac.c \
+ test/ssl/wolfssl/tests/api/test_hmac.h \
+ test/ssl/wolfssl/tests/api/test_md2.c \
+ test/ssl/wolfssl/tests/api/test_md2.h \
+ test/ssl/wolfssl/tests/api/test_md4.c \
+ test/ssl/wolfssl/tests/api/test_md4.h \
+ test/ssl/wolfssl/tests/api/test_md5.c \
+ test/ssl/wolfssl/tests/api/test_md5.h \
+ test/ssl/wolfssl/tests/api/test_mldsa.c \
+ test/ssl/wolfssl/tests/api/test_mldsa.h \
+ test/ssl/wolfssl/tests/api/test_mlkem.c \
+ test/ssl/wolfssl/tests/api/test_mlkem.h \
+ test/ssl/wolfssl/tests/api/test_ocsp.c \
+ test/ssl/wolfssl/tests/api/test_ocsp.h \
+ test/ssl/wolfssl/tests/api/test_ocsp_test_blobs.h \
+ test/ssl/wolfssl/tests/api/test_ossl_asn1.c \
+ test/ssl/wolfssl/tests/api/test_ossl_asn1.h \
+ test/ssl/wolfssl/tests/api/test_ossl_bio.c \
+ test/ssl/wolfssl/tests/api/test_ossl_bio.h \
+ test/ssl/wolfssl/tests/api/test_ossl_bn.c \
+ test/ssl/wolfssl/tests/api/test_ossl_bn.h \
+ test/ssl/wolfssl/tests/api/test_ossl_cipher.c \
+ test/ssl/wolfssl/tests/api/test_ossl_cipher.h \
+ test/ssl/wolfssl/tests/api/test_ossl_dgst.c \
+ test/ssl/wolfssl/tests/api/test_ossl_dgst.h \
+ test/ssl/wolfssl/tests/api/test_ossl_dh.c \
+ test/ssl/wolfssl/tests/api/test_ossl_dh.h \
+ test/ssl/wolfssl/tests/api/test_ossl_dsa.c \
+ test/ssl/wolfssl/tests/api/test_ossl_dsa.h \
+ test/ssl/wolfssl/tests/api/test_ossl_ec.c \
+ test/ssl/wolfssl/tests/api/test_ossl_ec.h \
+ test/ssl/wolfssl/tests/api/test_ossl_ecx.c \
+ test/ssl/wolfssl/tests/api/test_ossl_ecx.h \
+ test/ssl/wolfssl/tests/api/test_ossl_mac.c \
+ test/ssl/wolfssl/tests/api/test_ossl_mac.h \
+ test/ssl/wolfssl/tests/api/test_ossl_rsa.c \
+ test/ssl/wolfssl/tests/api/test_ossl_rsa.h \
+ test/ssl/wolfssl/tests/api/test_ossl_sk.c \
+ test/ssl/wolfssl/tests/api/test_ossl_sk.h \
+ test/ssl/wolfssl/tests/api/test_pkcs12.c \
+ test/ssl/wolfssl/tests/api/test_pkcs12.h \
+ test/ssl/wolfssl/tests/api/test_pkcs7.c \
+ test/ssl/wolfssl/tests/api/test_pkcs7.h \
+ test/ssl/wolfssl/tests/api/test_poly1305.c \
+ test/ssl/wolfssl/tests/api/test_poly1305.h \
+ test/ssl/wolfssl/tests/api/test_random.c \
+ test/ssl/wolfssl/tests/api/test_random.h \
+ test/ssl/wolfssl/tests/api/test_rc2.c \
+ test/ssl/wolfssl/tests/api/test_rc2.h \
+ test/ssl/wolfssl/tests/api/test_ripemd.c \
+ test/ssl/wolfssl/tests/api/test_ripemd.h \
+ test/ssl/wolfssl/tests/api/test_rsa.c \
+ test/ssl/wolfssl/tests/api/test_rsa.h \
+ test/ssl/wolfssl/tests/api/test_sha.c \
+ test/ssl/wolfssl/tests/api/test_sha.h \
+ test/ssl/wolfssl/tests/api/test_sha256.c \
+ test/ssl/wolfssl/tests/api/test_sha256.h \
+ test/ssl/wolfssl/tests/api/test_sha3.c \
+ test/ssl/wolfssl/tests/api/test_sha3.h \
+ test/ssl/wolfssl/tests/api/test_sha512.c \
+ test/ssl/wolfssl/tests/api/test_sha512.h \
+ test/ssl/wolfssl/tests/api/test_signature.c \
+ test/ssl/wolfssl/tests/api/test_signature.h \
+ test/ssl/wolfssl/tests/api/test_sm2.c \
+ test/ssl/wolfssl/tests/api/test_sm2.h \
+ test/ssl/wolfssl/tests/api/test_sm3.c \
+ test/ssl/wolfssl/tests/api/test_sm3.h \
+ test/ssl/wolfssl/tests/api/test_sm4.c \
+ test/ssl/wolfssl/tests/api/test_sm4.h \
+ test/ssl/wolfssl/tests/api/test_tls.c \
+ test/ssl/wolfssl/tests/api/test_tls.h \
+ test/ssl/wolfssl/tests/api/test_tls13.c \
+ test/ssl/wolfssl/tests/api/test_tls13.h \
+ test/ssl/wolfssl/tests/api/test_tls_ext.c \
+ test/ssl/wolfssl/tests/api/test_tls_ext.h \
+ test/ssl/wolfssl/tests/api/test_wc_encrypt.c \
+ test/ssl/wolfssl/tests/api/test_wc_encrypt.h \
+ test/ssl/wolfssl/tests/api/test_wolfmath.c \
+ test/ssl/wolfssl/tests/api/test_wolfmath.h \
+ test/ssl/wolfssl/tests/api/test_x509.c \
+ test/ssl/wolfssl/tests/api/test_x509.h \
+ test/ssl/wolfssl/testsuite/utils.h \
+ test/ssl/wolfssl/testsuite/utils1.c \
+ test/ssl/wolfssl/wolfcrypt/benchmark/benchmark.c \
+ test/ssl/wolfssl/wolfcrypt/benchmark/benchmark.h \
+ test/ssl/wolfssl/wolfcrypt/test/test.c \
+ test/ssl/wolfssl/wolfcrypt/test/test.h
endif WITH_TESTS
@@ -624,10 +769,6 @@ include_bitcoin_ssl_openssl_HEADERS = \
include/bitcoin/ssl/openssl/x509.h \
include/bitcoin/ssl/openssl/x509v3.h
-include_bitcoin_ssl_wolfcryptdir = ${includedir}/bitcoin/ssl/wolfcrypt
-include_bitcoin_ssl_wolfcrypt_HEADERS = \
- include/bitcoin/ssl/wolfcrypt/wolfcrypt.h
-
include_bitcoin_ssl_wolfssldir = ${includedir}/bitcoin/ssl/wolfssl
include_bitcoin_ssl_wolfssl_HEADERS = \
include/bitcoin/ssl/wolfssl/callbacks.h \
diff --git a/builds/cmake/CMakeLists.txt b/builds/cmake/CMakeLists.txt
index fc9e0dd51..6977e3063 100644
--- a/builds/cmake/CMakeLists.txt
+++ b/builds/cmake/CMakeLists.txt
@@ -311,92 +311,6 @@ add_library( ${CANONICAL_LIB_NAME}
"../../src/sessions/session_peer.cpp"
"../../src/sessions/session_seed.cpp"
"../../src/sessions/session_server.cpp"
- "../../src/ssl/wolfcrypt/aes.c"
- "../../src/ssl/wolfcrypt/arc4.c"
- "../../src/ssl/wolfcrypt/ascon.c"
- "../../src/ssl/wolfcrypt/asm.c"
- "../../src/ssl/wolfcrypt/asn.c"
- "../../src/ssl/wolfcrypt/blake2b.c"
- "../../src/ssl/wolfcrypt/blake2s.c"
- "../../src/ssl/wolfcrypt/camellia.c"
- "../../src/ssl/wolfcrypt/chacha.c"
- "../../src/ssl/wolfcrypt/chacha20_poly1305.c"
- "../../src/ssl/wolfcrypt/cmac.c"
- "../../src/ssl/wolfcrypt/coding.c"
- "../../src/ssl/wolfcrypt/compress.c"
- "../../src/ssl/wolfcrypt/cpuid.c"
- "../../src/ssl/wolfcrypt/cryptocb.c"
- "../../src/ssl/wolfcrypt/curve25519.c"
- "../../src/ssl/wolfcrypt/curve448.c"
- "../../src/ssl/wolfcrypt/des3.c"
- "../../src/ssl/wolfcrypt/dh.c"
- "../../src/ssl/wolfcrypt/dilithium.c"
- "../../src/ssl/wolfcrypt/dsa.c"
- "../../src/ssl/wolfcrypt/ecc.c"
- "../../src/ssl/wolfcrypt/eccsi.c"
- "../../src/ssl/wolfcrypt/ed25519.c"
- "../../src/ssl/wolfcrypt/ed448.c"
- "../../src/ssl/wolfcrypt/error1.c"
- "../../src/ssl/wolfcrypt/ext_lms.c"
- "../../src/ssl/wolfcrypt/ext_mlkem.c"
- "../../src/ssl/wolfcrypt/ext_xmss.c"
- "../../src/ssl/wolfcrypt/falcon.c"
- "../../src/ssl/wolfcrypt/fe_448.c"
- "../../src/ssl/wolfcrypt/fe_low_mem.c"
- "../../src/ssl/wolfcrypt/fe_operations.c"
- "../../src/ssl/wolfcrypt/fe_x25519_128.h"
- "../../src/ssl/wolfcrypt/ge_448.c"
- "../../src/ssl/wolfcrypt/ge_low_mem.c"
- "../../src/ssl/wolfcrypt/ge_operations.c"
- "../../src/ssl/wolfcrypt/hash.c"
- "../../src/ssl/wolfcrypt/hmac.c"
- "../../src/ssl/wolfcrypt/hpke.c"
- "../../src/ssl/wolfcrypt/integer.c"
- "../../src/ssl/wolfcrypt/kdf.c"
- "../../src/ssl/wolfcrypt/logging.c"
- "../../src/ssl/wolfcrypt/md2.c"
- "../../src/ssl/wolfcrypt/md4.c"
- "../../src/ssl/wolfcrypt/md5.c"
- "../../src/ssl/wolfcrypt/memory1.c"
- "../../src/ssl/wolfcrypt/pkcs12.c"
- "../../src/ssl/wolfcrypt/pkcs7.c"
- "../../src/ssl/wolfcrypt/poly1305.c"
- "../../src/ssl/wolfcrypt/pwdbased.c"
- "../../src/ssl/wolfcrypt/random.c"
- "../../src/ssl/wolfcrypt/rc2.c"
- "../../src/ssl/wolfcrypt/ripemd.c"
- "../../src/ssl/wolfcrypt/rsa.c"
- "../../src/ssl/wolfcrypt/sakke.c"
- "../../src/ssl/wolfcrypt/sha.c"
- "../../src/ssl/wolfcrypt/sha256.c"
- "../../src/ssl/wolfcrypt/sha3.c"
- "../../src/ssl/wolfcrypt/sha512.c"
- "../../src/ssl/wolfcrypt/signature.c"
- "../../src/ssl/wolfcrypt/siphash.c"
- "../../src/ssl/wolfcrypt/sp_arm32.c"
- "../../src/ssl/wolfcrypt/sp_arm64.c"
- "../../src/ssl/wolfcrypt/sp_armthumb.c"
- "../../src/ssl/wolfcrypt/sp_c32.c"
- "../../src/ssl/wolfcrypt/sp_c64.c"
- "../../src/ssl/wolfcrypt/sp_cortexm.c"
- "../../src/ssl/wolfcrypt/sp_dsp32.c"
- "../../src/ssl/wolfcrypt/sp_int.c"
- "../../src/ssl/wolfcrypt/sp_x86_64.c"
- "../../src/ssl/wolfcrypt/sphincs.c"
- "../../src/ssl/wolfcrypt/srp.c"
- "../../src/ssl/wolfcrypt/tfm.c"
- "../../src/ssl/wolfcrypt/wc_dsp.c"
- "../../src/ssl/wolfcrypt/wc_encrypt.c"
- "../../src/ssl/wolfcrypt/wc_lms.c"
- "../../src/ssl/wolfcrypt/wc_lms_impl.c"
- "../../src/ssl/wolfcrypt/wc_mlkem.c"
- "../../src/ssl/wolfcrypt/wc_mlkem_poly.c"
- "../../src/ssl/wolfcrypt/wc_pkcs11.c"
- "../../src/ssl/wolfcrypt/wc_port.c"
- "../../src/ssl/wolfcrypt/wc_xmss.c"
- "../../src/ssl/wolfcrypt/wc_xmss_impl.c"
- "../../src/ssl/wolfcrypt/wolfevent.c"
- "../../src/ssl/wolfcrypt/wolfmath.c"
"../../src/ssl/wolfssl/crl.c"
"../../src/ssl/wolfssl/dtls.c"
"../../src/ssl/wolfssl/dtls13.c"
@@ -423,7 +337,93 @@ add_library( ${CANONICAL_LIB_NAME}
"../../src/ssl/wolfssl/src/ssl_sess.c"
"../../src/ssl/wolfssl/src/ssl_sk.c"
"../../src/ssl/wolfssl/src/x509.c"
- "../../src/ssl/wolfssl/src/x509_str.c" )
+ "../../src/ssl/wolfssl/src/x509_str.c"
+ "../../src/ssl/wolfssl/wolfcrypt/aes.c"
+ "../../src/ssl/wolfssl/wolfcrypt/arc4.c"
+ "../../src/ssl/wolfssl/wolfcrypt/ascon.c"
+ "../../src/ssl/wolfssl/wolfcrypt/asm.c"
+ "../../src/ssl/wolfssl/wolfcrypt/asn.c"
+ "../../src/ssl/wolfssl/wolfcrypt/blake2b.c"
+ "../../src/ssl/wolfssl/wolfcrypt/blake2s.c"
+ "../../src/ssl/wolfssl/wolfcrypt/camellia.c"
+ "../../src/ssl/wolfssl/wolfcrypt/chacha.c"
+ "../../src/ssl/wolfssl/wolfcrypt/chacha20_poly1305.c"
+ "../../src/ssl/wolfssl/wolfcrypt/cmac.c"
+ "../../src/ssl/wolfssl/wolfcrypt/coding.c"
+ "../../src/ssl/wolfssl/wolfcrypt/compress.c"
+ "../../src/ssl/wolfssl/wolfcrypt/cpuid.c"
+ "../../src/ssl/wolfssl/wolfcrypt/cryptocb.c"
+ "../../src/ssl/wolfssl/wolfcrypt/curve25519.c"
+ "../../src/ssl/wolfssl/wolfcrypt/curve448.c"
+ "../../src/ssl/wolfssl/wolfcrypt/des3.c"
+ "../../src/ssl/wolfssl/wolfcrypt/dh.c"
+ "../../src/ssl/wolfssl/wolfcrypt/dilithium.c"
+ "../../src/ssl/wolfssl/wolfcrypt/dsa.c"
+ "../../src/ssl/wolfssl/wolfcrypt/ecc.c"
+ "../../src/ssl/wolfssl/wolfcrypt/eccsi.c"
+ "../../src/ssl/wolfssl/wolfcrypt/ed25519.c"
+ "../../src/ssl/wolfssl/wolfcrypt/ed448.c"
+ "../../src/ssl/wolfssl/wolfcrypt/error.c"
+ "../../src/ssl/wolfssl/wolfcrypt/ext_lms.c"
+ "../../src/ssl/wolfssl/wolfcrypt/ext_mlkem.c"
+ "../../src/ssl/wolfssl/wolfcrypt/ext_xmss.c"
+ "../../src/ssl/wolfssl/wolfcrypt/falcon.c"
+ "../../src/ssl/wolfssl/wolfcrypt/fe_448.c"
+ "../../src/ssl/wolfssl/wolfcrypt/fe_low_mem.c"
+ "../../src/ssl/wolfssl/wolfcrypt/fe_operations.c"
+ "../../src/ssl/wolfssl/wolfcrypt/fe_x25519_128.h"
+ "../../src/ssl/wolfssl/wolfcrypt/ge_448.c"
+ "../../src/ssl/wolfssl/wolfcrypt/ge_low_mem.c"
+ "../../src/ssl/wolfssl/wolfcrypt/ge_operations.c"
+ "../../src/ssl/wolfssl/wolfcrypt/hash.c"
+ "../../src/ssl/wolfssl/wolfcrypt/hmac.c"
+ "../../src/ssl/wolfssl/wolfcrypt/hpke.c"
+ "../../src/ssl/wolfssl/wolfcrypt/integer.c"
+ "../../src/ssl/wolfssl/wolfcrypt/kdf.c"
+ "../../src/ssl/wolfssl/wolfcrypt/logging.c"
+ "../../src/ssl/wolfssl/wolfcrypt/md2.c"
+ "../../src/ssl/wolfssl/wolfcrypt/md4.c"
+ "../../src/ssl/wolfssl/wolfcrypt/md5.c"
+ "../../src/ssl/wolfssl/wolfcrypt/memory.c"
+ "../../src/ssl/wolfssl/wolfcrypt/pkcs12.c"
+ "../../src/ssl/wolfssl/wolfcrypt/pkcs7.c"
+ "../../src/ssl/wolfssl/wolfcrypt/poly1305.c"
+ "../../src/ssl/wolfssl/wolfcrypt/pwdbased.c"
+ "../../src/ssl/wolfssl/wolfcrypt/random.c"
+ "../../src/ssl/wolfssl/wolfcrypt/rc2.c"
+ "../../src/ssl/wolfssl/wolfcrypt/ripemd.c"
+ "../../src/ssl/wolfssl/wolfcrypt/rsa.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sakke.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sha.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sha256.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sha3.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sha512.c"
+ "../../src/ssl/wolfssl/wolfcrypt/signature.c"
+ "../../src/ssl/wolfssl/wolfcrypt/siphash.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sp_arm32.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sp_arm64.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sp_armthumb.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sp_c32.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sp_c64.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sp_cortexm.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sp_dsp32.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sp_int.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sp_x86_64.c"
+ "../../src/ssl/wolfssl/wolfcrypt/sphincs.c"
+ "../../src/ssl/wolfssl/wolfcrypt/srp.c"
+ "../../src/ssl/wolfssl/wolfcrypt/tfm.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wc_dsp.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wc_encrypt.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wc_lms.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wc_lms_impl.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wc_mlkem.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wc_mlkem_poly.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wc_pkcs11.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wc_port.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wc_xmss.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wc_xmss_impl.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wolfevent.c"
+ "../../src/ssl/wolfssl/wolfcrypt/wolfmath.c" )
# ${CANONICAL_LIB_NAME} project specific include directory normalization for build.
#------------------------------------------------------------------------------
@@ -578,7 +578,185 @@ if (with-tests)
"../../test/sessions/session_manual.cpp"
"../../test/sessions/session_outbound.cpp"
"../../test/sessions/session_seed.cpp"
- "../../test/sessions/session_server.cpp" )
+ "../../test/sessions/session_server.cpp"
+ "../../test/ssl/wolfssl.cpp"
+ "../../test/ssl/vectors/certs/ca-ecc-cert.pem"
+ "../../test/ssl/vectors/certs/ca-ecc384-cert.pem"
+ "../../test/ssl/vectors/certs/ca-ecc384-key.der"
+ "../../test/ssl/vectors/certs/ca-ecc384-key.pem"
+ "../../test/ssl/vectors/certs/client-ecc384-cert.pem"
+ "../../test/ssl/vectors/certs/client-ecc384-key.pem"
+ "../../test/ssl/vectors/certs/ecc-key.der"
+ "../../test/ssl/vectors/certs/ecc-key.pem"
+ "../../test/ssl/vectors/certs/ecc-privOnlyCert.pem"
+ "../../test/ssl/vectors/certs/ecc-privOnlyKey.pem"
+ "../../test/ssl/vectors/certs/entity-no-ca-bool-cert.pem"
+ "../../test/ssl/vectors/certs/entity-no-ca-bool-key.pem"
+ "../../test/ssl/vectors/certs/server-cert.pem"
+ "../../test/ssl/vectors/certs/server-ecc-rsa.pem"
+ "../../test/ssl/vectors/certs/server-ecc.pem"
+ "../../test/ssl/vectors/certs/server-ecc384-cert.pem"
+ "../../test/ssl/vectors/certs/server-ecc384-key.pem"
+ "../../test/ssl/vectors/certs/server-key.pem"
+ "../../test/ssl/vectors/certs/test/server-cert-ecc-badsig.pem"
+ "../../test/ssl/vectors/certs/test/server-cert-rsa-badsig.pem"
+ "../../test/ssl/vectors/certs/test/server-goodalt.pem"
+ "../../test/ssl/vectors/certs/test/server-goodaltwild.pem"
+ "../../test/ssl/vectors/certs/test/server-goodcn.pem"
+ "../../test/ssl/vectors/certs/test/server-goodcnwild.pem"
+ "../../test/ssl/vectors/certs/test/server-localhost.pem"
+ "../../test/ssl/vectors/tests/test-chains.conf"
+ "../../test/ssl/vectors/tests/test-dhprime.conf"
+ "../../test/ssl/vectors/tests/test-fails.conf"
+ "../../test/ssl/vectors/tests/test-tls13-down.conf"
+ "../../test/ssl/vectors/tests/test-tls13-ecc.conf"
+ "../../test/ssl/vectors/tests/test-tls13.conf"
+ "../../test/ssl/vectors/tests/test.conf"
+ "../../test/ssl/wolfssl/examples/client/client.c"
+ "../../test/ssl/wolfssl/examples/client/client.h"
+ "../../test/ssl/wolfssl/examples/server/server.c"
+ "../../test/ssl/wolfssl/examples/server/server.h"
+ "../../test/ssl/wolfssl/tests/api.c"
+ "../../test/ssl/wolfssl/tests/quic.c"
+ "../../test/ssl/wolfssl/tests/srp.c"
+ "../../test/ssl/wolfssl/tests/suites.c"
+ "../../test/ssl/wolfssl/tests/unit.c"
+ "../../test/ssl/wolfssl/tests/unit.h"
+ "../../test/ssl/wolfssl/tests/utils.c"
+ "../../test/ssl/wolfssl/tests/utils.h"
+ "../../test/ssl/wolfssl/tests/w64wrapper.c"
+ "../../test/ssl/wolfssl/tests/api/api.h"
+ "../../test/ssl/wolfssl/tests/api/api_decl.h"
+ "../../test/ssl/wolfssl/tests/api/test_aes.c"
+ "../../test/ssl/wolfssl/tests/api/test_aes.h"
+ "../../test/ssl/wolfssl/tests/api/test_arc4.c"
+ "../../test/ssl/wolfssl/tests/api/test_arc4.h"
+ "../../test/ssl/wolfssl/tests/api/test_ascon.c"
+ "../../test/ssl/wolfssl/tests/api/test_ascon.h"
+ "../../test/ssl/wolfssl/tests/api/test_ascon_kats.h"
+ "../../test/ssl/wolfssl/tests/api/test_asn.c"
+ "../../test/ssl/wolfssl/tests/api/test_asn.h"
+ "../../test/ssl/wolfssl/tests/api/test_blake2.c"
+ "../../test/ssl/wolfssl/tests/api/test_blake2.h"
+ "../../test/ssl/wolfssl/tests/api/test_camellia.c"
+ "../../test/ssl/wolfssl/tests/api/test_camellia.h"
+ "../../test/ssl/wolfssl/tests/api/test_chacha.c"
+ "../../test/ssl/wolfssl/tests/api/test_chacha.h"
+ "../../test/ssl/wolfssl/tests/api/test_chacha20_poly1305.c"
+ "../../test/ssl/wolfssl/tests/api/test_chacha20_poly1305.h"
+ "../../test/ssl/wolfssl/tests/api/test_cmac.c"
+ "../../test/ssl/wolfssl/tests/api/test_cmac.h"
+ "../../test/ssl/wolfssl/tests/api/test_curve25519.c"
+ "../../test/ssl/wolfssl/tests/api/test_curve25519.h"
+ "../../test/ssl/wolfssl/tests/api/test_curve448.c"
+ "../../test/ssl/wolfssl/tests/api/test_curve448.h"
+ "../../test/ssl/wolfssl/tests/api/test_des3.c"
+ "../../test/ssl/wolfssl/tests/api/test_des3.h"
+ "../../test/ssl/wolfssl/tests/api/test_dh.c"
+ "../../test/ssl/wolfssl/tests/api/test_dh.h"
+ "../../test/ssl/wolfssl/tests/api/test_digest.h"
+ "../../test/ssl/wolfssl/tests/api/test_dsa.c"
+ "../../test/ssl/wolfssl/tests/api/test_dsa.h"
+ "../../test/ssl/wolfssl/tests/api/test_dtls.c"
+ "../../test/ssl/wolfssl/tests/api/test_dtls.h"
+ "../../test/ssl/wolfssl/tests/api/test_ecc.c"
+ "../../test/ssl/wolfssl/tests/api/test_ecc.h"
+ "../../test/ssl/wolfssl/tests/api/test_ed25519.c"
+ "../../test/ssl/wolfssl/tests/api/test_ed25519.h"
+ "../../test/ssl/wolfssl/tests/api/test_ed448.c"
+ "../../test/ssl/wolfssl/tests/api/test_ed448.h"
+ "../../test/ssl/wolfssl/tests/api/test_evp.c"
+ "../../test/ssl/wolfssl/tests/api/test_evp.h"
+ "../../test/ssl/wolfssl/tests/api/test_hash.c"
+ "../../test/ssl/wolfssl/tests/api/test_hash.h"
+ "../../test/ssl/wolfssl/tests/api/test_hmac.c"
+ "../../test/ssl/wolfssl/tests/api/test_hmac.h"
+ "../../test/ssl/wolfssl/tests/api/test_md2.c"
+ "../../test/ssl/wolfssl/tests/api/test_md2.h"
+ "../../test/ssl/wolfssl/tests/api/test_md4.c"
+ "../../test/ssl/wolfssl/tests/api/test_md4.h"
+ "../../test/ssl/wolfssl/tests/api/test_md5.c"
+ "../../test/ssl/wolfssl/tests/api/test_md5.h"
+ "../../test/ssl/wolfssl/tests/api/test_mldsa.c"
+ "../../test/ssl/wolfssl/tests/api/test_mldsa.h"
+ "../../test/ssl/wolfssl/tests/api/test_mlkem.c"
+ "../../test/ssl/wolfssl/tests/api/test_mlkem.h"
+ "../../test/ssl/wolfssl/tests/api/test_ocsp.c"
+ "../../test/ssl/wolfssl/tests/api/test_ocsp.h"
+ "../../test/ssl/wolfssl/tests/api/test_ocsp_test_blobs.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_asn1.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_asn1.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_bio.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_bio.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_bn.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_bn.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_cipher.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_cipher.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_dgst.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_dgst.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_dh.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_dh.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_dsa.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_dsa.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_ec.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_ec.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_ecx.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_ecx.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_mac.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_mac.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_rsa.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_rsa.h"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_sk.c"
+ "../../test/ssl/wolfssl/tests/api/test_ossl_sk.h"
+ "../../test/ssl/wolfssl/tests/api/test_pkcs12.c"
+ "../../test/ssl/wolfssl/tests/api/test_pkcs12.h"
+ "../../test/ssl/wolfssl/tests/api/test_pkcs7.c"
+ "../../test/ssl/wolfssl/tests/api/test_pkcs7.h"
+ "../../test/ssl/wolfssl/tests/api/test_poly1305.c"
+ "../../test/ssl/wolfssl/tests/api/test_poly1305.h"
+ "../../test/ssl/wolfssl/tests/api/test_random.c"
+ "../../test/ssl/wolfssl/tests/api/test_random.h"
+ "../../test/ssl/wolfssl/tests/api/test_rc2.c"
+ "../../test/ssl/wolfssl/tests/api/test_rc2.h"
+ "../../test/ssl/wolfssl/tests/api/test_ripemd.c"
+ "../../test/ssl/wolfssl/tests/api/test_ripemd.h"
+ "../../test/ssl/wolfssl/tests/api/test_rsa.c"
+ "../../test/ssl/wolfssl/tests/api/test_rsa.h"
+ "../../test/ssl/wolfssl/tests/api/test_sha.c"
+ "../../test/ssl/wolfssl/tests/api/test_sha.h"
+ "../../test/ssl/wolfssl/tests/api/test_sha256.c"
+ "../../test/ssl/wolfssl/tests/api/test_sha256.h"
+ "../../test/ssl/wolfssl/tests/api/test_sha3.c"
+ "../../test/ssl/wolfssl/tests/api/test_sha3.h"
+ "../../test/ssl/wolfssl/tests/api/test_sha512.c"
+ "../../test/ssl/wolfssl/tests/api/test_sha512.h"
+ "../../test/ssl/wolfssl/tests/api/test_signature.c"
+ "../../test/ssl/wolfssl/tests/api/test_signature.h"
+ "../../test/ssl/wolfssl/tests/api/test_sm2.c"
+ "../../test/ssl/wolfssl/tests/api/test_sm2.h"
+ "../../test/ssl/wolfssl/tests/api/test_sm3.c"
+ "../../test/ssl/wolfssl/tests/api/test_sm3.h"
+ "../../test/ssl/wolfssl/tests/api/test_sm4.c"
+ "../../test/ssl/wolfssl/tests/api/test_sm4.h"
+ "../../test/ssl/wolfssl/tests/api/test_tls.c"
+ "../../test/ssl/wolfssl/tests/api/test_tls.h"
+ "../../test/ssl/wolfssl/tests/api/test_tls13.c"
+ "../../test/ssl/wolfssl/tests/api/test_tls13.h"
+ "../../test/ssl/wolfssl/tests/api/test_tls_ext.c"
+ "../../test/ssl/wolfssl/tests/api/test_tls_ext.h"
+ "../../test/ssl/wolfssl/tests/api/test_wc_encrypt.c"
+ "../../test/ssl/wolfssl/tests/api/test_wc_encrypt.h"
+ "../../test/ssl/wolfssl/tests/api/test_wolfmath.c"
+ "../../test/ssl/wolfssl/tests/api/test_wolfmath.h"
+ "../../test/ssl/wolfssl/tests/api/test_x509.c"
+ "../../test/ssl/wolfssl/tests/api/test_x509.h"
+ "../../test/ssl/wolfssl/testsuite/utils.h"
+ "../../test/ssl/wolfssl/testsuite/utils1.c"
+ "../../test/ssl/wolfssl/wolfcrypt/benchmark/README.md"
+ "../../test/ssl/wolfssl/wolfcrypt/benchmark/benchmark.c"
+ "../../test/ssl/wolfssl/wolfcrypt/benchmark/benchmark.h"
+ "../../test/ssl/wolfssl/wolfcrypt/test/test.c"
+ "../../test/ssl/wolfssl/wolfcrypt/test/test.h" )
add_test( NAME libbitcoin-network-test COMMAND libbitcoin-network-test
--run_test=*
@@ -592,7 +770,8 @@ if (with-tests)
#------------------------------------------------------------------------------
target_include_directories( libbitcoin-network-test PRIVATE
"../../include"
- "../../include/bitcoin/ssl" )
+ "../../include/bitcoin/ssl"
+ "../../test/ssl/wolfssl" )
# libbitcoin-network-test project specific libraries/linker flags.
#------------------------------------------------------------------------------
diff --git a/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.props b/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.props
index 661a8a406..25f340480 100644
--- a/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.props
+++ b/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.props
@@ -11,13 +11,23 @@
+ $(ProjectDir)..\..\..\..\..\libbitcoin-network\test\ssl\wolfssl\;%(AdditionalIncludeDirectories)
false
+ CERT_PREFIX="$(RepoRoot.Replace("\", "/"))test/ssl/vectors/";%(PreprocessorDefinitions)
"$(TargetPath)" --log_level=warning --run_test=* --show_progress=no --build_info=yes
+
+
+
+ /wd4005 /wd4189 /wd4245 /wd4267 /wd4701 /wd4702 /wd4703 %(AdditionalOptions)
+
+
+
+
diff --git a/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.vcxproj b/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.vcxproj
index cb73b5d37..3c33064ea 100644
--- a/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.vcxproj
+++ b/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.vcxproj
@@ -247,9 +247,290 @@
-
+
+
+ $(IntDir)test_ssl_wolfssl_examples_client_client.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_examples_server_server.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_aes.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_arc4.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ascon.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_asn.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_blake2.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_camellia.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_chacha.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_chacha20_poly1305.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_cmac.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_curve25519.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_curve448.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_des3.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_dh.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_dsa.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_dtls.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ecc.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ed25519.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ed448.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_evp.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_hash.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_hmac.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_md2.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_md4.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_md5.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_mldsa.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_mlkem.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ocsp.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_asn1.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_bio.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_bn.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_cipher.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_dgst.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_dh.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_dsa.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_ec.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_ecx.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_mac.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_rsa.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ossl_sk.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_pkcs12.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_pkcs7.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_poly1305.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_random.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_rc2.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_ripemd.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_rsa.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_sha.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_sha256.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_sha3.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_sha512.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_signature.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_sm2.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_sm3.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_sm4.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_tls.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_tls13.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_tls_ext.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_wc_encrypt.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_wolfmath.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_api_test_x509.c.obj
+
+
+
+
+
+ $(IntDir)test_ssl_wolfssl_tests_unit.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_tests_utils.c.obj
+
+
+
+
+ $(IntDir)test_ssl_wolfssl_wolfcrypt_benchmark_benchmark.c.obj
+
+
+ $(IntDir)test_ssl_wolfssl_wolfcrypt_test_test.c.obj
+
+
+ $(IntDir)test_test.obj
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.vcxproj.filters b/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.vcxproj.filters
index fa0cda05d..b3b63e611 100644
--- a/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.vcxproj.filters
+++ b/builds/msvc/vs2022/libbitcoin-network-test/libbitcoin-network-test.vcxproj.filters
@@ -14,7 +14,7 @@
{D28FC18A-8B81-4247-0000-000000000001}
- {D28FC18A-8B81-4247-0000-000000000009}
+ {D28FC18A-8B81-4247-0000-00000000000A}
{D28FC18A-8B81-4247-0000-000000000002}
@@ -29,22 +29,22 @@
{D28FC18A-8B81-4247-0000-000000000005}
- {D28FC18A-8B81-4247-0000-00000000000A}
+ {D28FC18A-8B81-4247-0000-00000000000B}
- {D28FC18A-8B81-4247-0000-00000000000D}
+ {D28FC18A-8B81-4247-0000-00000000000E}
- {D28FC18A-8B81-4247-0000-00000000000B}
+ {D28FC18A-8B81-4247-0000-00000000000C}
- {D28FC18A-8B81-4247-0000-00000000000E}
+ {D28FC18A-8B81-4247-0000-00000000000F}
- {D28FC18A-8B81-4247-0000-00000000000F}
+ {D28FC18A-8B81-4247-0000-000000000001}
- {D28FC18A-8B81-4247-0000-00000000000C}
+ {D28FC18A-8B81-4247-0000-00000000000D}
{D28FC18A-8B81-4247-0000-000000000006}
@@ -55,6 +55,51 @@
{D28FC18A-8B81-4247-0000-000000000008}
+
+ {D28FC18A-8B81-4247-0000-000000000009}
+
+
+ {D28FC18A-8B81-4247-0000-000000000002}
+
+
+ {D28FC18A-8B81-4247-0000-000000000004}
+
+
+ {D28FC18A-8B81-4247-0000-000000000006}
+
+
+ {D28FC18A-8B81-4247-0000-000000000005}
+
+
+ {D28FC18A-8B81-4247-0000-000000000003}
+
+
+ {D28FC18A-8B81-4247-0000-000000000007}
+
+
+ {D28FC18A-8B81-4247-0000-0000000000A1}
+
+
+ {D28FC18A-8B81-4247-0000-0000000000B1}
+
+
+ {D28FC18A-8B81-4247-0000-000000000008}
+
+
+ {D28FC18A-8B81-4247-0000-0000000000C1}
+
+
+ {D28FC18A-8B81-4247-0000-000000000009}
+
+
+ {D28FC18A-8B81-4247-0000-000000000010}
+
+
+ {D28FC18A-8B81-4247-0000-0000000000D1}
+
+
+ {D28FC18A-8B81-4247-0000-0000000000E1}
+
@@ -408,11 +453,446 @@
src
+
+ src\ssl
+
+
+ src\ssl\wolfssl\examples\client
+
+
+ src\ssl\wolfssl\examples\server
+
+
+ src\ssl\wolfssl\tests
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests
+
+
+ src\ssl\wolfssl\tests
+
+
+ src\ssl\wolfssl\tests
+
+
+ src\ssl\wolfssl\tests
+
+
+ src\ssl\wolfssl\tests
+
+
+ src\ssl\wolfssl\tests
+
+
+ src\ssl\wolfssl\testsuite
+
+
+ src\ssl\wolfssl\wolfcrypt\benchmark
+
+
+ src\ssl\wolfssl\wolfcrypt\test
+
src
+
+ src\ssl\wolfssl\examples\client
+
+
+ src\ssl\wolfssl\examples\server
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests\api
+
+
+ src\ssl\wolfssl\tests
+
+
+ src\ssl\wolfssl\tests
+
+
+ src\ssl\wolfssl\testsuite
+
+
+ src\ssl\wolfssl\wolfcrypt\benchmark
+
+
+ src\ssl\wolfssl\wolfcrypt\test
+
src
diff --git a/builds/msvc/vs2022/libbitcoin-network.import.props b/builds/msvc/vs2022/libbitcoin-network.import.props
index d963a1a34..81b0d3dc8 100644
--- a/builds/msvc/vs2022/libbitcoin-network.import.props
+++ b/builds/msvc/vs2022/libbitcoin-network.import.props
@@ -15,12 +15,10 @@
-
- $(ProjectDir)..\..\..\..\..\libbitcoin-network\include\bitcoin\ssl\;%(AdditionalIncludeDirectories)
$(ProjectDir)..\..\..\..\..\libbitcoin-network\include\;%(AdditionalIncludeDirectories)
+ $(ProjectDir)..\..\..\..\..\libbitcoin-network\include\bitcoin\ssl\;%(AdditionalIncludeDirectories)
/bigobj %(AdditionalOptions)
BCT_STATIC;%(PreprocessorDefinitions)
-
WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions)
diff --git a/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.props b/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.props
index 5dbf3d3a7..03d786e64 100644
--- a/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.props
+++ b/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.props
@@ -11,18 +11,24 @@
-
- $(RepoRoot)include\bitcoin\ssl\;%(AdditionalIncludeDirectories)
$(RepoRoot)include\;%(AdditionalIncludeDirectories)
+ $(RepoRoot)include\bitcoin\ssl\;%(AdditionalIncludeDirectories)
/bigobj %(AdditionalOptions)
false
BCT_DLL;%(PreprocessorDefinitions)
BCT_STATIC;%(PreprocessorDefinitions)
-
WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions)
+
+
+
+ /wd4189 /wd4245 /wd4267 /wd4701 /wd4702 /wd4703 %(AdditionalOptions)
+
+
+
+
diff --git a/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.vcxproj b/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.vcxproj
index 77e5837d4..256690245 100644
--- a/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.vcxproj
+++ b/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.vcxproj
@@ -135,11 +135,15 @@
-
+
+ $(IntDir)src_error.obj
+
-
+
+ $(IntDir)src_memory.obj
+
@@ -219,91 +223,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -330,6 +249,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(IntDir)src_ssl_wolfssl_wolfcrypt_error.c.obj
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(IntDir)src_ssl_wolfssl_wolfcrypt_memory.c.obj
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -489,7 +497,6 @@
-
@@ -650,7 +657,7 @@
-
+
@@ -695,4 +702,4 @@
-
+
\ No newline at end of file
diff --git a/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.vcxproj.filters b/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.vcxproj.filters
index bcd62f3f8..b6bea5c5e 100644
--- a/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.vcxproj.filters
+++ b/builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.vcxproj.filters
@@ -157,13 +157,13 @@
{564EB540-D6B6-425C-0000-000000000009}
-
+
{564EB540-D6B6-425C-0000-00000000000F}
-
+
{564EB540-D6B6-425C-0000-000000000001}
-
+
{564EB540-D6B6-425C-0000-000000000002}
@@ -450,338 +450,338 @@
src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\src
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl\src
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl
+
+ src\ssl\wolfssl\wolfcrypt
-
- src\ssl\wolfssl
+
+ src\ssl\wolfssl\wolfcrypt
src\ssl\wolfssl
@@ -1256,9 +1256,6 @@
include\bitcoin\ssl\openssl
-
- include\bitcoin\ssl\wolfcrypt
-
include\bitcoin\ssl\wolfssl
@@ -1739,8 +1736,8 @@
include\bitcoin\ssl\wolfssl
-
- src\ssl\wolfcrypt
+
+ src\ssl\wolfssl\wolfcrypt
@@ -1791,4 +1788,4 @@
-
+
\ No newline at end of file
diff --git a/include/bitcoin/network/async/asio.hpp b/include/bitcoin/network/async/asio.hpp
index c2123fc04..4854be022 100644
--- a/include/bitcoin/network/async/asio.hpp
+++ b/include/bitcoin/network/async/asio.hpp
@@ -60,6 +60,7 @@ constexpr auto max_connections =
boost::asio::socket_base::max_listen_connections;
/// ssl
+#if defined(HAVE_SSL)
namespace ssl {
typedef boost::asio::ssl::context context;
@@ -74,6 +75,8 @@ inline void foobar() THROWS
}
} // namespace ssl
+#endif // HAVE_SSL
+
} // namespace asio
} // namespace network
} // namespace libbitcoin
diff --git a/include/bitcoin/network/boost.hpp b/include/bitcoin/network/boost.hpp
index 2c98f2645..6671465e1 100644
--- a/include/bitcoin/network/boost.hpp
+++ b/include/bitcoin/network/boost.hpp
@@ -21,18 +21,22 @@
#include
-// See for wolf/openssl includes.
-#define BOOST_ASIO_USE_WOLFSSL
-#define BOOST_ASIO_NO_DEPRECATED
-
-// The /ssl/openssl/ directory is provided for direct ssl import by boost,
-// which is required because is included.
-#include
-#include
#include
#include
#include
#include
#include
+#define BOOST_ASIO_NO_DEPRECATED
+#include
+
+// TODO: Hoist this out to build config.
+#define WITH_SSL
+
+#if defined(WITH_SSL)
+#define HAVE_SSL
+#define BOOST_ASIO_USE_WOLFSSL
+#include
+#endif // WITH_SSL
+
#endif
diff --git a/include/bitcoin/ssl/openssl/conf.h b/include/bitcoin/ssl/openssl/conf.h
index cc8e42ed5..4f3b3712c 100644
--- a/include/bitcoin/ssl/openssl/conf.h
+++ b/include/bitcoin/ssl/openssl/conf.h
@@ -19,7 +19,7 @@
#ifndef LIBBITCOIN_NETWORK_SSL_OPENSSL_CONF_H
#define LIBBITCOIN_NETWORK_SSL_OPENSSL_CONF_H
-// Forward load of .
+/* Forward load of . */
#include
#endif
diff --git a/include/bitcoin/ssl/openssl/dh.h b/include/bitcoin/ssl/openssl/dh.h
index 37a73e70d..b7ef5b276 100644
--- a/include/bitcoin/ssl/openssl/dh.h
+++ b/include/bitcoin/ssl/openssl/dh.h
@@ -19,7 +19,7 @@
#ifndef LIBBITCOIN_NETWORK_SSL_OPENSSL_DH_H
#define LIBBITCOIN_NETWORK_SSL_OPENSSL_DH_H
-// Forward load of .
+/* Forward load of . */
#include
#endif
diff --git a/include/bitcoin/ssl/openssl/err.h b/include/bitcoin/ssl/openssl/err.h
index 4ee222fba..dfb5468ee 100644
--- a/include/bitcoin/ssl/openssl/err.h
+++ b/include/bitcoin/ssl/openssl/err.h
@@ -19,7 +19,7 @@
#ifndef LIBBITCOIN_NETWORK_SSL_OPENSSL_ERR_H
#define LIBBITCOIN_NETWORK_SSL_OPENSSL_ERR_H
-// Forward load of .
+/* Forward load of . */
#include
#endif
diff --git a/include/bitcoin/ssl/openssl/openssl.h b/include/bitcoin/ssl/openssl/openssl.h
index 5a20df777..4c5d46ab8 100644
--- a/include/bitcoin/ssl/openssl/openssl.h
+++ b/include/bitcoin/ssl/openssl/openssl.h
@@ -19,8 +19,8 @@
#ifndef LIBBITCOIN_NETWORK_SSL_OPENSSL_OPENSSL_H
#define LIBBITCOIN_NETWORK_SSL_OPENSSL_OPENSSL_H
-// This directory is defined by libbitcoin to provide the expected path for
-// boost::asio to #include the contained headers. Each header forwards to:
-// #include
+/* This directory is defined by libbitcoin to provide the expected path for */
+/* boost::asio to #include the contained headers. Each header forwards to: */
+/* #include */
#endif
diff --git a/include/bitcoin/ssl/openssl/rsa.h b/include/bitcoin/ssl/openssl/rsa.h
index c4e5164e5..1791c6be7 100644
--- a/include/bitcoin/ssl/openssl/rsa.h
+++ b/include/bitcoin/ssl/openssl/rsa.h
@@ -19,7 +19,7 @@
#ifndef LIBBITCOIN_NETWORK_SSL_OPENSSL_RSA_H
#define LIBBITCOIN_NETWORK_SSL_OPENSSL_RSA_H
-// Forward load of .
+/* Forward load of . */
#include
#endif
diff --git a/include/bitcoin/ssl/openssl/ssl.h b/include/bitcoin/ssl/openssl/ssl.h
index cc2149aa8..20da14052 100644
--- a/include/bitcoin/ssl/openssl/ssl.h
+++ b/include/bitcoin/ssl/openssl/ssl.h
@@ -19,7 +19,7 @@
#ifndef LIBBITCOIN_NETWORK_SSL_OPENSSL_SSL_H
#define LIBBITCOIN_NETWORK_SSL_OPENSSL_SSL_H
-// Forward load of .
+/* Forward load of . */
#include
#endif
diff --git a/include/bitcoin/ssl/openssl/x509.h b/include/bitcoin/ssl/openssl/x509.h
index 92bd52737..def26deee 100644
--- a/include/bitcoin/ssl/openssl/x509.h
+++ b/include/bitcoin/ssl/openssl/x509.h
@@ -19,7 +19,7 @@
#ifndef LIBBITCOIN_NETWORK_SSL_OPENSSL_X509_H
#define LIBBITCOIN_NETWORK_SSL_OPENSSL_X509_H
-// Forward load of .
+/* Forward load of . */
#include
#endif
diff --git a/include/bitcoin/ssl/openssl/x509v3.h b/include/bitcoin/ssl/openssl/x509v3.h
index 2d1713450..14782bb39 100644
--- a/include/bitcoin/ssl/openssl/x509v3.h
+++ b/include/bitcoin/ssl/openssl/x509v3.h
@@ -19,7 +19,7 @@
#ifndef LIBBITCOIN_NETWORK_SSL_OPENSSL_X509V3_H
#define LIBBITCOIN_NETWORK_SSL_OPENSSL_X509V3_H
-// Forward load of .
+/* Forward load of . */
#include
#endif
diff --git a/include/bitcoin/ssl/wolfcrypt/wolfcrypt.h b/include/bitcoin/ssl/wolfcrypt/wolfcrypt.h
deleted file mode 100644
index 1ff8271d2..000000000
--- a/include/bitcoin/ssl/wolfcrypt/wolfcrypt.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright (c) 2011-2025 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-#ifndef LIBBITCOIN_NETWORK_SSL_WOLFCRYPT_WOLFCRYPT_H
-#define LIBBITCOIN_NETWORK_SSL_WOLFCRYPT_WOLFCRYPT_H
-
-// This directory is defined by libbitcoin to provide the expected path so that
-// wolfssl sources may remain unmodified and specify:
-// #include
-
-#endif
diff --git a/include/bitcoin/ssl/wolfssl/options.h b/include/bitcoin/ssl/wolfssl/options.h
index 4774966c8..dab724fba 100644
--- a/include/bitcoin/ssl/wolfssl/options.h
+++ b/include/bitcoin/ssl/wolfssl/options.h
@@ -19,12 +19,14 @@
#ifndef LIBBITCOIN_NETWORK_SSL_WOLFSSL_OPTIONS_H
#define LIBBITCOIN_NETWORK_SSL_WOLFSSL_OPTIONS_H
-// This ensures boost sees all configuration, but probably not used.
+/* This ensures boost sees all configuration, but probably not used. */
#include
-// Boost ASIO pulls in this file when BOOST_ASIO_USE_WOLFSSL is defined.
-////#if defined(BOOST_ASIO_USE_WOLFSSL)
-//// #include
-////#endif
+/* Boost ASIO pulls in this file when BOOST_ASIO_USE_WOLFSSL is defined. */
+/*
+#if defined(BOOST_ASIO_USE_WOLFSSL)
+#include
+#endif
+*/
#endif
diff --git a/include/bitcoin/ssl/wolfssl/test.h b/include/bitcoin/ssl/wolfssl/test.h
index f67b02919..237ec5e76 100644
--- a/include/bitcoin/ssl/wolfssl/test.h
+++ b/include/bitcoin/ssl/wolfssl/test.h
@@ -2199,7 +2199,11 @@ static WC_INLINE unsigned int my_psk_client_cs_cb(WOLFSSL* ssl,
#elif defined(USE_WINDOWS_API)
+/* LIBBITCOIN: fix warning when WIN32_LEAN_AND_MEAN is already defined. */
+#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
+#endif
+
#define _WINSOCKAPI_ /* block inclusion of winsock.h header file */
#include
#undef _WINSOCKAPI_ /* undefine it for MINGW winsock2.h header file */
diff --git a/include/bitcoin/ssl/wolfssl/wolfcrypt/user_settings.h b/include/bitcoin/ssl/wolfssl/wolfcrypt/user_settings.h
index 80a8b784e..5fb4c1ba2 100644
--- a/include/bitcoin/ssl/wolfssl/wolfcrypt/user_settings.h
+++ b/include/bitcoin/ssl/wolfssl/wolfcrypt/user_settings.h
@@ -19,93 +19,90 @@
#ifndef LIBBITCOIN_NETWORK_SSL_WOLFSSL_WOLFCRYPT_USER_SETINGS_H
#define LIBBITCOIN_NETWORK_SSL_WOLFSSL_WOLFCRYPT_USER_SETINGS_H
-// This file is imported into all wolfssl sources when WOLFSSL_USER_SETTINGS
-// is defined, which is done at project scope. This is also imported by boost
-// asio via options.h import when BOOST_ASIO_USE_WOLFSSL is defined.
-// The /ssl/openssl/ directory is provided for direct import by boost when
-// #include is specified, forwarding to wolfssl headers.
-
-// This build has no dependency on any libbitcoin sources.
-////#include
+/* This file is imported into all wolfssl sources when WOLFSSL_USER_SETTINGS */
+/* is defined, which is done at project scope. This is also imported by boost */
+/* asio via options.h import when BOOST_ASIO_USE_WOLFSSL is defined. */
+/* The /ssl/openssl/ directory is provided for direct import by boost when */
+/* #include is specified, forwarding to wolfssl headers. */
+
+/* This build has no dependency on any libbitcoin sources. */
+/* #include */
#if defined(_MSC_VER)
- // C99 variable-length arrays (VLAs) are not supported by MSVC.
+ /* C99 variable-length arrays (VLAs) are not supported by MSVC. */
#define WOLFSSL_SP_NO_DYN_STACK
- // Avoid conflict with min/max compatibility macros.
+ /* Avoid conflict with min/max compatibility macros. */
#define WOLFSSL_HAVE_MIN
#define WOLFSSL_HAVE_MAX
#endif
-// Documentation for the options below.
-// wolfssl.com/documentation/manuals/wolfssl/chapter02.html
+/* Documentation for the options below. */
+/* wolfssl.com/documentation/manuals/wolfssl/chapter02.html */
-// In a library build, "HAVE_" symbols are set on the command line. But since
-// this is embedded they are set here just as with "NO_", "WC_" and "WOLFSSL_".
+/* In a library build, "HAVE_" symbols are set on the command line. But since */
+/* this is embedded they are set here just as with "NO_", "WC_" and "WOLFSSL_". */
-// Suppress warnings on unnecessary file inclusions.
-#define WOLFSSL_IGNORE_FILE_WARN
-
-// Side-channel protection is not required.
-////#define WOLFSSL_HARDEN_TLS 128
-#define NO_ECC_TIMING_RESISTANT
-#define NO_TFM_TIMING_RESISTANT
-#define NO_WC_RSA_BLINDING
-#define WC_NO_HARDEN
+/* Used with BOOST_ASIO_USE_WOLFSSL to optimize boost integration. */
+/* wolfssl.com/wolfssl-support-asio-boost-asio-c-libraries */
+#define WOLFSSL_ASIO
-// On Windows OS APIs are used.
-////#define NO_DEV_RANDOM
-////#define NO_DEV_URANDOM
+/* Suppress warnings on unnecessary file inclusions. */
+#define WOLFSSL_IGNORE_FILE_WARN
-// Keep control over socket.
-// wolfssl.com/documentation/manuals/wolfssl/chapter05.html
-#define WOLFSSL_USER_IO
-#define WOLFSSL_NO_SOCK
+/* wolfssl.com/documentation/manuals/wolfssl/chapter05.html */
+/* Requires that send and receive data copy functions be defined. */
+/* #define WOLFSSL_USER_IO */
-// Required for certificate management via filesystem.
-////#define NO_FILESYSTEM
+/* No reason to define this as the library does not use sockets (test only). */
+/* #define WOLFSSL_NO_SOCK */
-// TODO: keygen.
-////#define WOLFSSL_PEM_TO_DER
+/* Required by boost for certificate management via filesystem. */
+/* #define NO_FILESYSTEM */
+#define WOLFSSL_PEM_TO_DER
#define WOLFSSL_CERT_GEN
#define WOLFSSL_DER_LOAD
#define WOLFSSL_KEY_GEN
-// TLS is required, not just cryptographic functions.
-////#define WOLFSSL_AEAD_ONLY
+/* TLS is required, not just cryptographic functions. */
#define WOLFSSL_TLS13
+
+/* At least one encryption method is required. */
+/* ECC is needed for Curve25519-based key exchange in modern TLS. */
+#define HAVE_SUPPORTED_CURVES
#define HAVE_TLS_EXTENSIONS
-#define HAVE_FFDHE_2048
+#define HAVE_CURVE25519
#define HAVE_POLY1305
#define HAVE_CHACHA
+#define HAVE_SHA256
#define HAVE_HKDF
#define HAVE_HMAC
-#define HAVE_SHA256
-
-// At least one encryption method is required.
-// ECC is needed for Curve25519-based key exchange in modern TLS.
-#define HAVE_CURVE25519
#define HAVE_ECC
-// Callback requires at least one union element to be defined.
+/* Callback requires at least one union element to be defined. */
#define WOLF_CRYPTO_CB
-
-// Used with BOOST_ASIO_USE_WOLFSSL to optimize boost integration.
-// wolfssl.com/wolfssl-support-asio-boost-asio-c-libraries
-#define WOLFSSL_ASIO
-
-// This is an openssl setting that affects wolfssl.
-#define OPENSSL_EXTRA
-
-// These are openssl settings that affect boost asio.
+/* This removes default RNG fallback (must set a callback RNG). */
+/* #define WC_NO_HASHDRBG */
+/* On Windows OS RNG APIs are used, these on others. */
+/* #define NO_DEV_RANDOM */
+/* #define NO_DEV_URANDOM */
+
+/* These are openssl settings that affect wolfssl and/or boost asio. */
+#define OPENSSL_VERSION_NUMBER 0x10101000L
#define OPENSSL_NO_ENGINE
#define OPENSSL_NO_SSL3
#define OPENSSL_NO_SSL2
+#define OPENSSL_EXTRA
+
+/* Side-channel protection is not required. */
+/* #define WOLFSSL_HARDEN_TLS 128 */
+#define NO_ECC_TIMING_RESISTANT
+#define NO_TFM_TIMING_RESISTANT
+#define WC_NO_HARDEN
-// Remove unused or undesired components.
-#define WC_NO_HASHDRBG
-#define NO_PWDBASED
+/* Remove unused or undesired components. */
+#define WOLFSSL_NO_CLIENT_AUTH
+#define NO_SESSION_CACHE
#define NO_OLD_TLS
-#define NO_AESGCM
#define NO_OCSP
#define NO_DES3
#define NO_PSK
@@ -113,20 +110,37 @@
#define NO_SHA
#define NO_DSA
#define NO_RSA
-#define NO_DH
#define NO_MD4
#define NO_MD5
#define NO_RC4
-#define NO_TLS_DH
-#define NO_CAMELLIA_CBC
-#define NO_SESSION_CACHE
-#define NO_ED448_CLIENT_AUTH
-#define NO_ED25519_CLIENT_AUTH
-#define NO_OLD_SSL_NAMES
-#define NO_OLD_WC_NAMES
-#define NO_OLD_POLY1305
-#define WOLFSSL_NO_SOCK
-#define WOLFSSL_NO_CLIENT_AUTH
-#define NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION
+#define NO_DH
+
+#ifdef _MSC_VER
+ /* Warnings emitted due to missing define in vc++. */
+ #define WC_MAYBE_UNUSED __pragma(warning(suppress:4505))
+
+ /* Build break in test_ossl_bio.c due to missing define in vc++. */
+ #ifndef STDERR_FILENO
+ #define STDERR_FILENO _fileno(stderr)
+ #endif
+#endif
+
+#ifndef NDEBUG
+ #define DEBUG_WOLFSSL
+ #define DEBUG_SUITE_TESTS
+ ////#define WOLFSSL_VERBOSE_ERRORS
+ #define WOLFSSL_HAVE_ERROR_QUEUE
+
+ #ifndef WOLFSSL_LOGGINGENABLED_DEFAULT
+ #define WOLFSSL_LOGGINGENABLED_DEFAULT 1
+ #endif
+ #ifndef WOLFSSL_CERT_LOG_ENABLED_DEFAULT
+ #define WOLFSSL_CERT_LOG_ENABLED_DEFAULT 1
+ #endif
+#endif
+
+#define NO_MAIN_DRIVER
+#define NO_TESTSUITE_MAIN_DRIVER
+#define CERT_WRITE_TEMP_DIR "./"
#endif
diff --git a/include/bitcoin/ssl/wolfssl/wolfssl.h b/include/bitcoin/ssl/wolfssl/wolfssl.h
index a0d4e3d3d..d24b754d4 100644
--- a/include/bitcoin/ssl/wolfssl/wolfssl.h
+++ b/include/bitcoin/ssl/wolfssl/wolfssl.h
@@ -19,10 +19,12 @@
#ifndef LIBBITCOIN_NETWORK_SSL_WOLFSSL_WOLFSSL_H
#define LIBBITCOIN_NETWORK_SSL_WOLFSSL_WOLFSSL_H
-// This directory is defined by libbitcoin to provide the expected path so that
-// wolfssl sources may remain unmodified and specify:
-// #include
-// #include
-// #include
+/* This directory is defined by libbitcoin to provide the expected path so that */
+/* wolfssl sources may remain unmodified and specify: */
+/*
+#include
+#include
+#include
+*/
#endif
diff --git a/libbitcoin-network.pc.in b/libbitcoin-network.pc.in
index 1e6133fec..ec8b5efda 100644
--- a/libbitcoin-network.pc.in
+++ b/libbitcoin-network.pc.in
@@ -29,7 +29,7 @@ Requires: libbitcoin-system >= 4.0.0
# Include directory and any other required compiler flags.
#------------------------------------------------------------------------------
-Cflags: -I${includedir}
+Cflags: -I${includedir} -DWOLFSSL_USER_SETTINGS
# Lib directory, lib and any required that do not publish pkg-config.
#------------------------------------------------------------------------------
diff --git a/src/ssl/wolfssl/internal.c b/src/ssl/wolfssl/internal.c
index 5a67083ee..30c27fbcb 100644
--- a/src/ssl/wolfssl/internal.c
+++ b/src/ssl/wolfssl/internal.c
@@ -25591,23 +25591,8 @@ static int ModifyForMTU(WOLFSSL* ssl, int buffSz, int outputSz, int mtuSz)
*/
static int CheckTLS13AEADSendLimit(WOLFSSL* ssl)
{
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// LIBBITCOIN: fix unused variable warning.
-#if defined(BUILD_AESGCM) | defined(HAVE_AESCCM) || defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) || defined(WOLFSSL_DTLS13)
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
w64wrapper seq;
-////////////////////////////////////////////////////////////////////////////////////////////////////////
-#endif // unused variable
-////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////
-// LIBBITCOIN: fix unused variable warning.
-#if defined(BUILD_AESGCM) | defined(HAVE_AESCCM) || defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
-////////////////////////////////////////////////////////////////////////////////////////////////////////
w64wrapper limit;
-////////////////////////////////////////////////////////////////////////////////////////////////////////
-#endif // unused variable
-////////////////////////////////////////////////////////////////////////////////////////////////////////
switch (ssl->specs.bulk_cipher_algorithm) {
#ifdef BUILD_AESGCM
@@ -25660,11 +25645,6 @@ static int CheckTLS13AEADSendLimit(WOLFSSL* ssl)
}
else
#endif
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////
-// LIBBITCOIN: fix unreachable code warnings.
-#if defined(BUILD_AESGCM) | defined(HAVE_AESCCM) || defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
-////////////////////////////////////////////////////////////////////////////////////////////////////////
{
seq = w64From32(ssl->keys.sequence_number_hi,
ssl->keys.sequence_number_lo);
@@ -25677,9 +25657,6 @@ static int CheckTLS13AEADSendLimit(WOLFSSL* ssl)
}
return 0;
-////////////////////////////////////////////////////////////////////////////////////////////////////////
-#endif // unreachable code
-////////////////////////////////////////////////////////////////////////////////////////////////////////
}
#endif /* WOLFSSL_TLS13 && !WOLFSSL_TLS13_IGNORE_AEAD_LIMITS */
diff --git a/src/ssl/wolfssl/src/x509.c b/src/ssl/wolfssl/src/x509.c
index 8aa5b5f55..801e8a214 100644
--- a/src/ssl/wolfssl/src/x509.c
+++ b/src/ssl/wolfssl/src/x509.c
@@ -10630,11 +10630,7 @@ static int CertFromX509(Cert* cert, WOLFSSL_X509* x509)
cert->isCA = wolfSSL_X509_get_isCA(x509);
cert->basicConstCrit = x509->basicConstCrit;
cert->basicConstSet = x509->basicConstSet;
-///////////////////////////////////////////////////////////////////////////////
-// LIBBITCOIN: implicit cast (4 bytes to 1 byte). Added runtime guard and cast:
- if (x509->pathLength > (byte)~0) return WOLFSSL_FAILURE;
cert->pathLen = (byte)x509->pathLength;
-///////////////////////////////////////////////////////////////////////////////
cert->pathLenSet = x509->pathLengthSet;
#ifdef WOLFSSL_CERT_EXT
diff --git a/src/ssl/wolfssl/ssl.c b/src/ssl/wolfssl/ssl.c
index d08650f57..436c039ba 100644
--- a/src/ssl/wolfssl/ssl.c
+++ b/src/ssl/wolfssl/ssl.c
@@ -19,13 +19,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
*/
-///////////////////////////////////////////////////////////////////////////////
-// LIBBITCOIN: Four lines in this file have been modified as follows.
-// #include -> "src/ssl_load.c"
-// #include -> "src/conf.c"
-// #include -> "src/x509_str.c"
-// #include -> "src/ssl_p7p12.c"
-///////////////////////////////////////////////////////////////////////////////
+/* LIBBITCOIN: Four lines in this file have been modified as follows. */
+/*
+ #include -> "src/ssl_load.c"
+ #include -> "src/conf.c"
+ #include -> "src/x509_str.c"
+ #include -> "src/ssl_p7p12.c"
+*/
#include
@@ -186,11 +186,11 @@
#include "src/ssl_misc.c"
#define WOLFSSL_EVP_INCLUDED
-///////////////////////////////////////////////////////////////////////////////
-// LIBBITCOIN: one line modified as follows.
-// #include "wolfcrypt/src/evp.c" -> "src/evp.c"
+/* LIBBITCOIN: One line modified as follows. */
+/*
+ #include "wolfcrypt/src/evp.c" -> "src/evp.c"
+*/
#include "src/evp.c"
-///////////////////////////////////////////////////////////////////////////////
/* Crypto code uses EVP APIs. */
#define WOLFSSL_SSL_CRYPTO_INCLUDED
@@ -5979,11 +5979,7 @@ int AddCA(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int type, int verify)
{
int ret;
Signer* signer = NULL;
-///////////////////////////////////////////////////////////////////////////////
-// LIBBITCOIN: fix (bogus) potentially uninitialized variable warning.
- word32 row = 0;
-// word32 row;
-///////////////////////////////////////////////////////////////////////////////
+ word32 row;
byte* subjectHash;
WC_DECLARE_VAR(cert, DecodedCert, 1, 0);
DerBuffer* der = *pDer;
diff --git a/src/ssl/wolfcrypt/aes.c b/src/ssl/wolfssl/wolfcrypt/aes.c
similarity index 100%
rename from src/ssl/wolfcrypt/aes.c
rename to src/ssl/wolfssl/wolfcrypt/aes.c
diff --git a/src/ssl/wolfcrypt/arc4.c b/src/ssl/wolfssl/wolfcrypt/arc4.c
similarity index 100%
rename from src/ssl/wolfcrypt/arc4.c
rename to src/ssl/wolfssl/wolfcrypt/arc4.c
diff --git a/src/ssl/wolfcrypt/ascon.c b/src/ssl/wolfssl/wolfcrypt/ascon.c
similarity index 100%
rename from src/ssl/wolfcrypt/ascon.c
rename to src/ssl/wolfssl/wolfcrypt/ascon.c
diff --git a/src/ssl/wolfcrypt/asm.c b/src/ssl/wolfssl/wolfcrypt/asm.c
similarity index 100%
rename from src/ssl/wolfcrypt/asm.c
rename to src/ssl/wolfssl/wolfcrypt/asm.c
diff --git a/src/ssl/wolfcrypt/asn.c b/src/ssl/wolfssl/wolfcrypt/asn.c
similarity index 100%
rename from src/ssl/wolfcrypt/asn.c
rename to src/ssl/wolfssl/wolfcrypt/asn.c
diff --git a/src/ssl/wolfcrypt/blake2b.c b/src/ssl/wolfssl/wolfcrypt/blake2b.c
similarity index 100%
rename from src/ssl/wolfcrypt/blake2b.c
rename to src/ssl/wolfssl/wolfcrypt/blake2b.c
diff --git a/src/ssl/wolfcrypt/blake2s.c b/src/ssl/wolfssl/wolfcrypt/blake2s.c
similarity index 100%
rename from src/ssl/wolfcrypt/blake2s.c
rename to src/ssl/wolfssl/wolfcrypt/blake2s.c
diff --git a/src/ssl/wolfcrypt/camellia.c b/src/ssl/wolfssl/wolfcrypt/camellia.c
similarity index 100%
rename from src/ssl/wolfcrypt/camellia.c
rename to src/ssl/wolfssl/wolfcrypt/camellia.c
diff --git a/src/ssl/wolfcrypt/chacha.c b/src/ssl/wolfssl/wolfcrypt/chacha.c
similarity index 100%
rename from src/ssl/wolfcrypt/chacha.c
rename to src/ssl/wolfssl/wolfcrypt/chacha.c
diff --git a/src/ssl/wolfcrypt/chacha20_poly1305.c b/src/ssl/wolfssl/wolfcrypt/chacha20_poly1305.c
similarity index 100%
rename from src/ssl/wolfcrypt/chacha20_poly1305.c
rename to src/ssl/wolfssl/wolfcrypt/chacha20_poly1305.c
diff --git a/src/ssl/wolfcrypt/cmac.c b/src/ssl/wolfssl/wolfcrypt/cmac.c
similarity index 100%
rename from src/ssl/wolfcrypt/cmac.c
rename to src/ssl/wolfssl/wolfcrypt/cmac.c
diff --git a/src/ssl/wolfcrypt/coding.c b/src/ssl/wolfssl/wolfcrypt/coding.c
similarity index 100%
rename from src/ssl/wolfcrypt/coding.c
rename to src/ssl/wolfssl/wolfcrypt/coding.c
diff --git a/src/ssl/wolfcrypt/compress.c b/src/ssl/wolfssl/wolfcrypt/compress.c
similarity index 100%
rename from src/ssl/wolfcrypt/compress.c
rename to src/ssl/wolfssl/wolfcrypt/compress.c
diff --git a/src/ssl/wolfcrypt/cpuid.c b/src/ssl/wolfssl/wolfcrypt/cpuid.c
similarity index 100%
rename from src/ssl/wolfcrypt/cpuid.c
rename to src/ssl/wolfssl/wolfcrypt/cpuid.c
diff --git a/src/ssl/wolfcrypt/cryptocb.c b/src/ssl/wolfssl/wolfcrypt/cryptocb.c
similarity index 100%
rename from src/ssl/wolfcrypt/cryptocb.c
rename to src/ssl/wolfssl/wolfcrypt/cryptocb.c
diff --git a/src/ssl/wolfcrypt/curve25519.c b/src/ssl/wolfssl/wolfcrypt/curve25519.c
similarity index 100%
rename from src/ssl/wolfcrypt/curve25519.c
rename to src/ssl/wolfssl/wolfcrypt/curve25519.c
diff --git a/src/ssl/wolfcrypt/curve448.c b/src/ssl/wolfssl/wolfcrypt/curve448.c
similarity index 100%
rename from src/ssl/wolfcrypt/curve448.c
rename to src/ssl/wolfssl/wolfcrypt/curve448.c
diff --git a/src/ssl/wolfcrypt/des3.c b/src/ssl/wolfssl/wolfcrypt/des3.c
similarity index 100%
rename from src/ssl/wolfcrypt/des3.c
rename to src/ssl/wolfssl/wolfcrypt/des3.c
diff --git a/src/ssl/wolfcrypt/dh.c b/src/ssl/wolfssl/wolfcrypt/dh.c
similarity index 100%
rename from src/ssl/wolfcrypt/dh.c
rename to src/ssl/wolfssl/wolfcrypt/dh.c
diff --git a/src/ssl/wolfcrypt/dilithium.c b/src/ssl/wolfssl/wolfcrypt/dilithium.c
similarity index 100%
rename from src/ssl/wolfcrypt/dilithium.c
rename to src/ssl/wolfssl/wolfcrypt/dilithium.c
diff --git a/src/ssl/wolfcrypt/dsa.c b/src/ssl/wolfssl/wolfcrypt/dsa.c
similarity index 100%
rename from src/ssl/wolfcrypt/dsa.c
rename to src/ssl/wolfssl/wolfcrypt/dsa.c
diff --git a/src/ssl/wolfcrypt/ecc.c b/src/ssl/wolfssl/wolfcrypt/ecc.c
similarity index 100%
rename from src/ssl/wolfcrypt/ecc.c
rename to src/ssl/wolfssl/wolfcrypt/ecc.c
diff --git a/src/ssl/wolfcrypt/eccsi.c b/src/ssl/wolfssl/wolfcrypt/eccsi.c
similarity index 100%
rename from src/ssl/wolfcrypt/eccsi.c
rename to src/ssl/wolfssl/wolfcrypt/eccsi.c
diff --git a/src/ssl/wolfcrypt/ed25519.c b/src/ssl/wolfssl/wolfcrypt/ed25519.c
similarity index 100%
rename from src/ssl/wolfcrypt/ed25519.c
rename to src/ssl/wolfssl/wolfcrypt/ed25519.c
diff --git a/src/ssl/wolfcrypt/ed448.c b/src/ssl/wolfssl/wolfcrypt/ed448.c
similarity index 100%
rename from src/ssl/wolfcrypt/ed448.c
rename to src/ssl/wolfssl/wolfcrypt/ed448.c
diff --git a/src/ssl/wolfcrypt/error1.c b/src/ssl/wolfssl/wolfcrypt/error.c
similarity index 100%
rename from src/ssl/wolfcrypt/error1.c
rename to src/ssl/wolfssl/wolfcrypt/error.c
diff --git a/src/ssl/wolfcrypt/ext_lms.c b/src/ssl/wolfssl/wolfcrypt/ext_lms.c
similarity index 100%
rename from src/ssl/wolfcrypt/ext_lms.c
rename to src/ssl/wolfssl/wolfcrypt/ext_lms.c
diff --git a/src/ssl/wolfcrypt/ext_mlkem.c b/src/ssl/wolfssl/wolfcrypt/ext_mlkem.c
similarity index 100%
rename from src/ssl/wolfcrypt/ext_mlkem.c
rename to src/ssl/wolfssl/wolfcrypt/ext_mlkem.c
diff --git a/src/ssl/wolfcrypt/ext_xmss.c b/src/ssl/wolfssl/wolfcrypt/ext_xmss.c
similarity index 100%
rename from src/ssl/wolfcrypt/ext_xmss.c
rename to src/ssl/wolfssl/wolfcrypt/ext_xmss.c
diff --git a/src/ssl/wolfcrypt/falcon.c b/src/ssl/wolfssl/wolfcrypt/falcon.c
similarity index 100%
rename from src/ssl/wolfcrypt/falcon.c
rename to src/ssl/wolfssl/wolfcrypt/falcon.c
diff --git a/src/ssl/wolfcrypt/fe_448.c b/src/ssl/wolfssl/wolfcrypt/fe_448.c
similarity index 100%
rename from src/ssl/wolfcrypt/fe_448.c
rename to src/ssl/wolfssl/wolfcrypt/fe_448.c
diff --git a/src/ssl/wolfcrypt/fe_low_mem.c b/src/ssl/wolfssl/wolfcrypt/fe_low_mem.c
similarity index 100%
rename from src/ssl/wolfcrypt/fe_low_mem.c
rename to src/ssl/wolfssl/wolfcrypt/fe_low_mem.c
diff --git a/src/ssl/wolfcrypt/fe_operations.c b/src/ssl/wolfssl/wolfcrypt/fe_operations.c
similarity index 100%
rename from src/ssl/wolfcrypt/fe_operations.c
rename to src/ssl/wolfssl/wolfcrypt/fe_operations.c
diff --git a/src/ssl/wolfcrypt/fe_x25519_128.h b/src/ssl/wolfssl/wolfcrypt/fe_x25519_128.h
similarity index 100%
rename from src/ssl/wolfcrypt/fe_x25519_128.h
rename to src/ssl/wolfssl/wolfcrypt/fe_x25519_128.h
diff --git a/src/ssl/wolfcrypt/ge_448.c b/src/ssl/wolfssl/wolfcrypt/ge_448.c
similarity index 100%
rename from src/ssl/wolfcrypt/ge_448.c
rename to src/ssl/wolfssl/wolfcrypt/ge_448.c
diff --git a/src/ssl/wolfcrypt/ge_low_mem.c b/src/ssl/wolfssl/wolfcrypt/ge_low_mem.c
similarity index 100%
rename from src/ssl/wolfcrypt/ge_low_mem.c
rename to src/ssl/wolfssl/wolfcrypt/ge_low_mem.c
diff --git a/src/ssl/wolfcrypt/ge_operations.c b/src/ssl/wolfssl/wolfcrypt/ge_operations.c
similarity index 100%
rename from src/ssl/wolfcrypt/ge_operations.c
rename to src/ssl/wolfssl/wolfcrypt/ge_operations.c
diff --git a/src/ssl/wolfcrypt/hash.c b/src/ssl/wolfssl/wolfcrypt/hash.c
similarity index 100%
rename from src/ssl/wolfcrypt/hash.c
rename to src/ssl/wolfssl/wolfcrypt/hash.c
diff --git a/src/ssl/wolfcrypt/hmac.c b/src/ssl/wolfssl/wolfcrypt/hmac.c
similarity index 100%
rename from src/ssl/wolfcrypt/hmac.c
rename to src/ssl/wolfssl/wolfcrypt/hmac.c
diff --git a/src/ssl/wolfcrypt/hpke.c b/src/ssl/wolfssl/wolfcrypt/hpke.c
similarity index 100%
rename from src/ssl/wolfcrypt/hpke.c
rename to src/ssl/wolfssl/wolfcrypt/hpke.c
diff --git a/src/ssl/wolfcrypt/integer.c b/src/ssl/wolfssl/wolfcrypt/integer.c
similarity index 100%
rename from src/ssl/wolfcrypt/integer.c
rename to src/ssl/wolfssl/wolfcrypt/integer.c
diff --git a/src/ssl/wolfcrypt/kdf.c b/src/ssl/wolfssl/wolfcrypt/kdf.c
similarity index 100%
rename from src/ssl/wolfcrypt/kdf.c
rename to src/ssl/wolfssl/wolfcrypt/kdf.c
diff --git a/src/ssl/wolfcrypt/logging.c b/src/ssl/wolfssl/wolfcrypt/logging.c
similarity index 100%
rename from src/ssl/wolfcrypt/logging.c
rename to src/ssl/wolfssl/wolfcrypt/logging.c
diff --git a/src/ssl/wolfcrypt/md2.c b/src/ssl/wolfssl/wolfcrypt/md2.c
similarity index 100%
rename from src/ssl/wolfcrypt/md2.c
rename to src/ssl/wolfssl/wolfcrypt/md2.c
diff --git a/src/ssl/wolfcrypt/md4.c b/src/ssl/wolfssl/wolfcrypt/md4.c
similarity index 100%
rename from src/ssl/wolfcrypt/md4.c
rename to src/ssl/wolfssl/wolfcrypt/md4.c
diff --git a/src/ssl/wolfcrypt/md5.c b/src/ssl/wolfssl/wolfcrypt/md5.c
similarity index 100%
rename from src/ssl/wolfcrypt/md5.c
rename to src/ssl/wolfssl/wolfcrypt/md5.c
diff --git a/src/ssl/wolfcrypt/memory1.c b/src/ssl/wolfssl/wolfcrypt/memory.c
similarity index 100%
rename from src/ssl/wolfcrypt/memory1.c
rename to src/ssl/wolfssl/wolfcrypt/memory.c
diff --git a/src/ssl/wolfcrypt/pkcs12.c b/src/ssl/wolfssl/wolfcrypt/pkcs12.c
similarity index 100%
rename from src/ssl/wolfcrypt/pkcs12.c
rename to src/ssl/wolfssl/wolfcrypt/pkcs12.c
diff --git a/src/ssl/wolfcrypt/pkcs7.c b/src/ssl/wolfssl/wolfcrypt/pkcs7.c
similarity index 100%
rename from src/ssl/wolfcrypt/pkcs7.c
rename to src/ssl/wolfssl/wolfcrypt/pkcs7.c
diff --git a/src/ssl/wolfcrypt/poly1305.c b/src/ssl/wolfssl/wolfcrypt/poly1305.c
similarity index 100%
rename from src/ssl/wolfcrypt/poly1305.c
rename to src/ssl/wolfssl/wolfcrypt/poly1305.c
diff --git a/src/ssl/wolfcrypt/pwdbased.c b/src/ssl/wolfssl/wolfcrypt/pwdbased.c
similarity index 100%
rename from src/ssl/wolfcrypt/pwdbased.c
rename to src/ssl/wolfssl/wolfcrypt/pwdbased.c
diff --git a/src/ssl/wolfcrypt/random.c b/src/ssl/wolfssl/wolfcrypt/random.c
similarity index 100%
rename from src/ssl/wolfcrypt/random.c
rename to src/ssl/wolfssl/wolfcrypt/random.c
diff --git a/src/ssl/wolfcrypt/rc2.c b/src/ssl/wolfssl/wolfcrypt/rc2.c
similarity index 100%
rename from src/ssl/wolfcrypt/rc2.c
rename to src/ssl/wolfssl/wolfcrypt/rc2.c
diff --git a/src/ssl/wolfcrypt/ripemd.c b/src/ssl/wolfssl/wolfcrypt/ripemd.c
similarity index 100%
rename from src/ssl/wolfcrypt/ripemd.c
rename to src/ssl/wolfssl/wolfcrypt/ripemd.c
diff --git a/src/ssl/wolfcrypt/rsa.c b/src/ssl/wolfssl/wolfcrypt/rsa.c
similarity index 100%
rename from src/ssl/wolfcrypt/rsa.c
rename to src/ssl/wolfssl/wolfcrypt/rsa.c
diff --git a/src/ssl/wolfcrypt/sakke.c b/src/ssl/wolfssl/wolfcrypt/sakke.c
similarity index 100%
rename from src/ssl/wolfcrypt/sakke.c
rename to src/ssl/wolfssl/wolfcrypt/sakke.c
diff --git a/src/ssl/wolfcrypt/sha.c b/src/ssl/wolfssl/wolfcrypt/sha.c
similarity index 100%
rename from src/ssl/wolfcrypt/sha.c
rename to src/ssl/wolfssl/wolfcrypt/sha.c
diff --git a/src/ssl/wolfcrypt/sha256.c b/src/ssl/wolfssl/wolfcrypt/sha256.c
similarity index 100%
rename from src/ssl/wolfcrypt/sha256.c
rename to src/ssl/wolfssl/wolfcrypt/sha256.c
diff --git a/src/ssl/wolfcrypt/sha3.c b/src/ssl/wolfssl/wolfcrypt/sha3.c
similarity index 100%
rename from src/ssl/wolfcrypt/sha3.c
rename to src/ssl/wolfssl/wolfcrypt/sha3.c
diff --git a/src/ssl/wolfcrypt/sha512.c b/src/ssl/wolfssl/wolfcrypt/sha512.c
similarity index 100%
rename from src/ssl/wolfcrypt/sha512.c
rename to src/ssl/wolfssl/wolfcrypt/sha512.c
diff --git a/src/ssl/wolfcrypt/signature.c b/src/ssl/wolfssl/wolfcrypt/signature.c
similarity index 100%
rename from src/ssl/wolfcrypt/signature.c
rename to src/ssl/wolfssl/wolfcrypt/signature.c
diff --git a/src/ssl/wolfcrypt/siphash.c b/src/ssl/wolfssl/wolfcrypt/siphash.c
similarity index 100%
rename from src/ssl/wolfcrypt/siphash.c
rename to src/ssl/wolfssl/wolfcrypt/siphash.c
diff --git a/src/ssl/wolfcrypt/sp_arm32.c b/src/ssl/wolfssl/wolfcrypt/sp_arm32.c
similarity index 100%
rename from src/ssl/wolfcrypt/sp_arm32.c
rename to src/ssl/wolfssl/wolfcrypt/sp_arm32.c
diff --git a/src/ssl/wolfcrypt/sp_arm64.c b/src/ssl/wolfssl/wolfcrypt/sp_arm64.c
similarity index 100%
rename from src/ssl/wolfcrypt/sp_arm64.c
rename to src/ssl/wolfssl/wolfcrypt/sp_arm64.c
diff --git a/src/ssl/wolfcrypt/sp_armthumb.c b/src/ssl/wolfssl/wolfcrypt/sp_armthumb.c
similarity index 100%
rename from src/ssl/wolfcrypt/sp_armthumb.c
rename to src/ssl/wolfssl/wolfcrypt/sp_armthumb.c
diff --git a/src/ssl/wolfcrypt/sp_c32.c b/src/ssl/wolfssl/wolfcrypt/sp_c32.c
similarity index 100%
rename from src/ssl/wolfcrypt/sp_c32.c
rename to src/ssl/wolfssl/wolfcrypt/sp_c32.c
diff --git a/src/ssl/wolfcrypt/sp_c64.c b/src/ssl/wolfssl/wolfcrypt/sp_c64.c
similarity index 100%
rename from src/ssl/wolfcrypt/sp_c64.c
rename to src/ssl/wolfssl/wolfcrypt/sp_c64.c
diff --git a/src/ssl/wolfcrypt/sp_cortexm.c b/src/ssl/wolfssl/wolfcrypt/sp_cortexm.c
similarity index 100%
rename from src/ssl/wolfcrypt/sp_cortexm.c
rename to src/ssl/wolfssl/wolfcrypt/sp_cortexm.c
diff --git a/src/ssl/wolfcrypt/sp_dsp32.c b/src/ssl/wolfssl/wolfcrypt/sp_dsp32.c
similarity index 100%
rename from src/ssl/wolfcrypt/sp_dsp32.c
rename to src/ssl/wolfssl/wolfcrypt/sp_dsp32.c
diff --git a/src/ssl/wolfcrypt/sp_int.c b/src/ssl/wolfssl/wolfcrypt/sp_int.c
similarity index 100%
rename from src/ssl/wolfcrypt/sp_int.c
rename to src/ssl/wolfssl/wolfcrypt/sp_int.c
diff --git a/src/ssl/wolfcrypt/sp_x86_64.c b/src/ssl/wolfssl/wolfcrypt/sp_x86_64.c
similarity index 100%
rename from src/ssl/wolfcrypt/sp_x86_64.c
rename to src/ssl/wolfssl/wolfcrypt/sp_x86_64.c
diff --git a/src/ssl/wolfcrypt/sphincs.c b/src/ssl/wolfssl/wolfcrypt/sphincs.c
similarity index 100%
rename from src/ssl/wolfcrypt/sphincs.c
rename to src/ssl/wolfssl/wolfcrypt/sphincs.c
diff --git a/src/ssl/wolfcrypt/srp.c b/src/ssl/wolfssl/wolfcrypt/srp.c
similarity index 100%
rename from src/ssl/wolfcrypt/srp.c
rename to src/ssl/wolfssl/wolfcrypt/srp.c
diff --git a/src/ssl/wolfcrypt/tfm.c b/src/ssl/wolfssl/wolfcrypt/tfm.c
similarity index 100%
rename from src/ssl/wolfcrypt/tfm.c
rename to src/ssl/wolfssl/wolfcrypt/tfm.c
diff --git a/src/ssl/wolfcrypt/wc_dsp.c b/src/ssl/wolfssl/wolfcrypt/wc_dsp.c
similarity index 100%
rename from src/ssl/wolfcrypt/wc_dsp.c
rename to src/ssl/wolfssl/wolfcrypt/wc_dsp.c
diff --git a/src/ssl/wolfcrypt/wc_encrypt.c b/src/ssl/wolfssl/wolfcrypt/wc_encrypt.c
similarity index 100%
rename from src/ssl/wolfcrypt/wc_encrypt.c
rename to src/ssl/wolfssl/wolfcrypt/wc_encrypt.c
diff --git a/src/ssl/wolfcrypt/wc_lms.c b/src/ssl/wolfssl/wolfcrypt/wc_lms.c
similarity index 100%
rename from src/ssl/wolfcrypt/wc_lms.c
rename to src/ssl/wolfssl/wolfcrypt/wc_lms.c
diff --git a/src/ssl/wolfcrypt/wc_lms_impl.c b/src/ssl/wolfssl/wolfcrypt/wc_lms_impl.c
similarity index 100%
rename from src/ssl/wolfcrypt/wc_lms_impl.c
rename to src/ssl/wolfssl/wolfcrypt/wc_lms_impl.c
diff --git a/src/ssl/wolfcrypt/wc_mlkem.c b/src/ssl/wolfssl/wolfcrypt/wc_mlkem.c
similarity index 100%
rename from src/ssl/wolfcrypt/wc_mlkem.c
rename to src/ssl/wolfssl/wolfcrypt/wc_mlkem.c
diff --git a/src/ssl/wolfcrypt/wc_mlkem_poly.c b/src/ssl/wolfssl/wolfcrypt/wc_mlkem_poly.c
similarity index 100%
rename from src/ssl/wolfcrypt/wc_mlkem_poly.c
rename to src/ssl/wolfssl/wolfcrypt/wc_mlkem_poly.c
diff --git a/src/ssl/wolfcrypt/wc_pkcs11.c b/src/ssl/wolfssl/wolfcrypt/wc_pkcs11.c
similarity index 100%
rename from src/ssl/wolfcrypt/wc_pkcs11.c
rename to src/ssl/wolfssl/wolfcrypt/wc_pkcs11.c
diff --git a/src/ssl/wolfcrypt/wc_port.c b/src/ssl/wolfssl/wolfcrypt/wc_port.c
similarity index 100%
rename from src/ssl/wolfcrypt/wc_port.c
rename to src/ssl/wolfssl/wolfcrypt/wc_port.c
diff --git a/src/ssl/wolfcrypt/wc_xmss.c b/src/ssl/wolfssl/wolfcrypt/wc_xmss.c
similarity index 100%
rename from src/ssl/wolfcrypt/wc_xmss.c
rename to src/ssl/wolfssl/wolfcrypt/wc_xmss.c
diff --git a/src/ssl/wolfcrypt/wc_xmss_impl.c b/src/ssl/wolfssl/wolfcrypt/wc_xmss_impl.c
similarity index 100%
rename from src/ssl/wolfcrypt/wc_xmss_impl.c
rename to src/ssl/wolfssl/wolfcrypt/wc_xmss_impl.c
diff --git a/src/ssl/wolfcrypt/wolfevent.c b/src/ssl/wolfssl/wolfcrypt/wolfevent.c
similarity index 100%
rename from src/ssl/wolfcrypt/wolfevent.c
rename to src/ssl/wolfssl/wolfcrypt/wolfevent.c
diff --git a/src/ssl/wolfcrypt/wolfmath.c b/src/ssl/wolfssl/wolfcrypt/wolfmath.c
similarity index 100%
rename from src/ssl/wolfcrypt/wolfmath.c
rename to src/ssl/wolfssl/wolfcrypt/wolfmath.c
diff --git a/test/.gitattributes b/test/.gitattributes
new file mode 100644
index 000000000..783feddac
--- /dev/null
+++ b/test/.gitattributes
@@ -0,0 +1 @@
+ssl/vectors/tests/*.conf eol=lf
diff --git a/test/main.cpp b/test/main.cpp
index 0a381a003..6b3cc88be 100644
--- a/test/main.cpp
+++ b/test/main.cpp
@@ -17,4 +17,5 @@
* along with this program. If not, see .
*/
#define BOOST_TEST_MODULE libbitcoin_network_test
+
#include
diff --git a/test/ssl/vectors/certs/ca-ecc-cert.pem b/test/ssl/vectors/certs/ca-ecc-cert.pem
new file mode 100644
index 000000000..6987fbd5e
--- /dev/null
+++ b/test/ssl/vectors/certs/ca-ecc-cert.pem
@@ -0,0 +1,53 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 29:66:97:2b:07:5d:f1:5b:37:1e:e8:5f:10:1c:c4:e9:aa:99:b7:73
+ Signature Algorithm: ecdsa-with-SHA256
+ Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:12 2025 GMT
+ Not After : Aug 9 20:41:12 2028 GMT
+ Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: id-ecPublicKey
+ Public-Key: (256 bit)
+ pub:
+ 04:02:d3:d9:6e:d6:01:8e:45:c8:b9:90:31:e5:c0:
+ 4c:e3:9e:ad:29:38:98:ba:10:d6:e9:09:2a:80:a9:
+ 2e:17:2a:b9:8a:bf:33:83:46:e3:95:0b:e4:77:40:
+ b5:3b:43:45:33:0f:61:53:7c:37:44:c1:cb:fc:80:
+ ca:e8:43:ea:a7
+ ASN1 OID: prime256v1
+ NIST CURVE: P-256
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 56:8E:9A:C3:F0:42:DE:18:B9:45:55:6E:F9:93:CF:EA:C3:F3:A5:21
+ X509v3 Authority Key Identifier:
+ 56:8E:9A:C3:F0:42:DE:18:B9:45:55:6E:F9:93:CF:EA:C3:F3:A5:21
+ X509v3 Basic Constraints: critical
+ CA:TRUE
+ X509v3 Key Usage: critical
+ Digital Signature, Certificate Sign, CRL Sign
+ Signature Algorithm: ecdsa-with-SHA256
+ Signature Value:
+ 30:44:02:20:40:55:70:46:7a:a1:eb:b5:c8:53:a7:78:b3:f3:
+ b7:16:92:c5:9b:34:90:d5:44:68:a7:03:9b:9f:db:78:f0:51:
+ 02:20:61:a8:3a:c9:ff:ff:e9:63:c7:a7:14:d4:19:d2:9e:77:
+ 55:47:93:d1:7a:68:50:86:48:8f:3b:97:87:50:f5:42
+-----BEGIN CERTIFICATE-----
+MIIClDCCAjugAwIBAgIUKWaXKwdd8Vs3HuhfEBzE6aqZt3MwCgYIKoZIzj0EAwIw
+gZcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT
+ZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEY
+MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv
+bGZzc2wuY29tMB4XDTI1MTExMzIwNDExMloXDTI4MDgwOTIwNDExMlowgZcxCzAJ
+BgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxl
+MRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UE
+AwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu
+Y29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAtPZbtYBjkXIuZAx5cBM456t
+KTiYuhDW6QkqgKkuFyq5ir8zg0bjlQvkd0C1O0NFMw9hU3w3RMHL/IDK6EPqp6Nj
+MGEwHQYDVR0OBBYEFFaOmsPwQt4YuUVVbvmTz+rD86UhMB8GA1UdIwQYMBaAFFaO
+msPwQt4YuUVVbvmTz+rD86UhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgGGMAoGCCqGSM49BAMCA0cAMEQCIEBVcEZ6oeu1yFOneLPztxaSxZs0kNVEaKcD
+m5/bePBRAiBhqDrJ///pY8enFNQZ0p53VUeT0XpoUIZIjzuXh1D1Qg==
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/ca-ecc384-cert.pem b/test/ssl/vectors/certs/ca-ecc384-cert.pem
new file mode 100644
index 000000000..3ee5a91c3
--- /dev/null
+++ b/test/ssl/vectors/certs/ca-ecc384-cert.pem
@@ -0,0 +1,59 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 5f:b1:4e:91:98:c0:60:33:b2:ae:31:e4:61:c7:80:1a:f5:be:40:b7
+ Signature Algorithm: ecdsa-with-SHA384
+ Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:12 2025 GMT
+ Not After : Aug 9 20:41:12 2028 GMT
+ Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: id-ecPublicKey
+ Public-Key: (384 bit)
+ pub:
+ 04:ee:82:d4:39:9a:b1:27:82:f4:d7:ea:c6:bc:03:
+ 1d:4d:83:61:f4:03:ae:7e:bd:d8:5a:a5:b9:f0:8e:
+ a2:a5:da:ce:87:3b:5a:ab:44:16:9c:f5:9f:62:dd:
+ f6:20:cd:9c:76:3c:40:b1:3f:97:17:df:59:f6:cd:
+ de:cd:46:35:c0:ed:5e:2e:48:b6:66:91:71:74:b7:
+ 0c:3f:b9:9a:b7:83:bd:93:3f:5f:50:2d:70:3f:de:
+ 35:25:e1:90:3b:86:e0
+ ASN1 OID: secp384r1
+ NIST CURVE: P-384
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ AB:E0:C3:26:4C:18:D4:72:BB:D2:84:8C:9C:0A:05:92:80:12:53:52
+ X509v3 Authority Key Identifier:
+ AB:E0:C3:26:4C:18:D4:72:BB:D2:84:8C:9C:0A:05:92:80:12:53:52
+ X509v3 Basic Constraints: critical
+ CA:TRUE
+ X509v3 Key Usage: critical
+ Digital Signature, Certificate Sign, CRL Sign
+ Signature Algorithm: ecdsa-with-SHA384
+ Signature Value:
+ 30:65:02:31:00:a8:5a:b8:bb:38:90:e1:3e:39:e0:28:66:19:
+ 69:39:3b:ac:94:a8:5d:d8:03:60:76:29:88:f9:23:3e:22:31:
+ 19:df:0d:c4:c0:11:ec:89:38:a1:a5:01:96:87:e5:29:66:02:
+ 30:42:c8:cc:cf:fe:c1:33:f3:a4:79:f2:6a:df:6a:69:d9:bd:
+ 18:f0:13:ae:f8:0d:d4:8f:02:e7:b1:43:89:ae:2a:f8:cb:30:
+ 0e:96:7d:06:22:83:06:75:8c:4d:ff:c4:59
+-----BEGIN CERTIFICATE-----
+MIIC0jCCAligAwIBAgIUX7FOkZjAYDOyrjHkYceAGvW+QLcwCgYIKoZIzj0EAwMw
+gZcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT
+ZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEY
+MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv
+bGZzc2wuY29tMB4XDTI1MTExMzIwNDExMloXDTI4MDgwOTIwNDExMlowgZcxCzAJ
+BgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxl
+MRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UE
+AwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu
+Y29tMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE7oLUOZqxJ4L01+rGvAMdTYNh9AOu
+fr3YWqW58I6ipdrOhztaq0QWnPWfYt32IM2cdjxAsT+XF99Z9s3ezUY1wO1eLki2
+ZpFxdLcMP7mat4O9kz9fUC1wP941JeGQO4bgo2MwYTAdBgNVHQ4EFgQUq+DDJkwY
+1HK70oSMnAoFkoASU1IwHwYDVR0jBBgwFoAUq+DDJkwY1HK70oSMnAoFkoASU1Iw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAw
+ZQIxAKhauLs4kOE+OeAoZhlpOTuslKhd2ANgdimI+SM+IjEZ3w3EwBHsiTihpQGW
+h+UpZgIwQsjMz/7BM/OkefJq32pp2b0Y8BOu+A3UjwLnsUOJrir4yzAOln0GIoMG
+dYxN/8RZ
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/ca-ecc384-key.der b/test/ssl/vectors/certs/ca-ecc384-key.der
new file mode 100644
index 000000000..073ddfdd6
Binary files /dev/null and b/test/ssl/vectors/certs/ca-ecc384-key.der differ
diff --git a/test/ssl/vectors/certs/ca-ecc384-key.pem b/test/ssl/vectors/certs/ca-ecc384-key.pem
new file mode 100644
index 000000000..7201cd5ee
--- /dev/null
+++ b/test/ssl/vectors/certs/ca-ecc384-key.pem
@@ -0,0 +1,6 @@
+-----BEGIN PRIVATE KEY-----
+MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDB7FuPW0oGUbIrdqHju
+x36zxdHbLvPtDkiFsfLhejlWwPFiEg81tzm8nCXAduv+VXChZANiAATugtQ5mrEn
+gvTX6sa8Ax1Ng2H0A65+vdhapbnwjqKl2s6HO1qrRBac9Z9i3fYgzZx2PECxP5cX
+31n2zd7NRjXA7V4uSLZmkXF0tww/uZq3g72TP19QLXA/3jUl4ZA7huA=
+-----END PRIVATE KEY-----
diff --git a/test/ssl/vectors/certs/client-ecc384-cert.pem b/test/ssl/vectors/certs/client-ecc384-cert.pem
new file mode 100644
index 000000000..0a357061c
--- /dev/null
+++ b/test/ssl/vectors/certs/client-ecc384-cert.pem
@@ -0,0 +1,18 @@
+-----BEGIN CERTIFICATE-----
+MIIC8DCCAnagAwIBAgICEAIwCgYIKoZIzj0EAwMwgZcxCzAJBgNVBAYTAlVTMRMw
+EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3
+b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz
+c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMCAXDTI1MTEx
+MzIwNDEwN1oYDzIwNTUxMTA2MjA0MTA3WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV
+BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEVsbGlw
+dGljMRMwEQYDVQQLDApFQ0MzODRDbGl0MRgwFgYDVQQDDA93d3cud29sZnNzbC5j
+b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wdjAQBgcqhkjOPQIB
+BgUrgQQAIgNiAARmxAg9ZqehFdRTCiOzrQvOj8j0mB2m2LJuIhH6ue+ZwPopPkgA
++f7CpkobpxKoa5BMHLusXW4OYs5wIPdDd9iXx3TTaP6J7HfLGS+JSh13+ZdLZgJo
+pWKvlYHL4yQ264WjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAw
+HQYDVR0OBBYEFB7y0Bv4/KXLP9yK9ZcqQlOwQvnUMB8GA1UdIwQYMBaAFKvgwyZM
+GNRyu9KEjJwKBZKAElNSMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEF
+BQcDAgYIKwYBBQUHAwQwCgYIKoZIzj0EAwMDaAAwZQIwNYNL+eFhS245CekwHZcO
+hqtr/n3pV6UvAoVIEWGd8FNcvh+LoH3xIqX75i3P7eDKAjEA/CKA7PyQ3hGgHPA6
+PsMjXhW+VTShvuH8iJ5qJBSSRAiIwkakqLN0+Yl5Ev6bkNYf
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/client-ecc384-key.pem b/test/ssl/vectors/certs/client-ecc384-key.pem
new file mode 100644
index 000000000..c12526d3d
--- /dev/null
+++ b/test/ssl/vectors/certs/client-ecc384-key.pem
@@ -0,0 +1,6 @@
+-----BEGIN PRIVATE KEY-----
+MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDB1nVO7/TbLqFdjldpO
+TH23WVi/DIOkNaLUNEpfkh3gbrWk1AQ2OgnmrBSgMI8FN5ahZANiAARmxAg9Zqeh
+FdRTCiOzrQvOj8j0mB2m2LJuIhH6ue+ZwPopPkgA+f7CpkobpxKoa5BMHLusXW4O
+Ys5wIPdDd9iXx3TTaP6J7HfLGS+JSh13+ZdLZgJopWKvlYHL4yQ264U=
+-----END PRIVATE KEY-----
diff --git a/test/ssl/vectors/certs/ecc-key.der b/test/ssl/vectors/certs/ecc-key.der
new file mode 100644
index 000000000..a88d141e0
Binary files /dev/null and b/test/ssl/vectors/certs/ecc-key.der differ
diff --git a/test/ssl/vectors/certs/ecc-key.pem b/test/ssl/vectors/certs/ecc-key.pem
new file mode 100644
index 000000000..03e7a617c
--- /dev/null
+++ b/test/ssl/vectors/certs/ecc-key.pem
@@ -0,0 +1,9 @@
+ASN1 OID: prime256v1
+-----BEGIN EC PARAMETERS-----
+BggqhkjOPQMBBw==
+-----END EC PARAMETERS-----
+-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEIEW2aQJznGyFoThbcujox6zEA41TNQT6bCjcNI3hqAmMoAoGCCqGSM49
+AwEHoUQDQgAEuzOsTCdQSsZKpQTDPN6fNttyLc6U6iv6yyAJOSwW6GEC6a9N0wKT
+mjFbl5Ihf/DPGNqREQI0huggWDMLgDSJ2A==
+-----END EC PRIVATE KEY-----
diff --git a/test/ssl/vectors/certs/ecc-privOnlyCert.pem b/test/ssl/vectors/certs/ecc-privOnlyCert.pem
new file mode 100644
index 000000000..056b8a06c
--- /dev/null
+++ b/test/ssl/vectors/certs/ecc-privOnlyCert.pem
@@ -0,0 +1,10 @@
+-----BEGIN CERTIFICATE-----
+MIIBVzCB/aADAgECAhQ4ukTJqclv2S12DIvPILd3l7T3MTAKBggqhkjOPQQDAjAa
+MQswCQYDVQQKDAJXUjELMAkGA1UEAwwCREUwHhcNMjUxMTEzMjA0MTE2WhcNMjgw
+ODA5MjA0MTE2WjAaMQswCQYDVQQKDAJXUjELMAkGA1UEAwwCREUwWTATBgcqhkjO
+PQIBBggqhkjOPQMBBwNCAAQlwP0WuCvyuAoe3azOYlJ8WApgfVd12r0RwdUq6lRr
+duY9NvfdUZdrqCb+e6a9llWFUJ2afmkB2ENFidn+SismoyEwHzAdBgNVHQ4EFgQU
+srENBaxqDKGtkgp+x+FoVjVAGeowCgYIKoZIzj0EAwIDSQAwRgIhAPNFDJz5zhDc
+7PP+zNWwsMqLKF7CX0YjKL8f9aCOAqZTAiEA374DH7CDzDXOdsQsaucqCLDYCtA8
+S8qvfyNKHeqoHgU=
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/ecc-privOnlyKey.pem b/test/ssl/vectors/certs/ecc-privOnlyKey.pem
new file mode 100644
index 000000000..6c1070152
--- /dev/null
+++ b/test/ssl/vectors/certs/ecc-privOnlyKey.pem
@@ -0,0 +1,4 @@
+-----BEGIN PRIVATE KEY-----
+MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCBmlE/nixmHCpmplUopbqNEo+jJE40p
+wfkxzH01tAWqcQ==
+-----END PRIVATE KEY-----
diff --git a/test/ssl/vectors/certs/entity-no-ca-bool-cert.pem b/test/ssl/vectors/certs/entity-no-ca-bool-cert.pem
new file mode 100644
index 000000000..2700c53fb
--- /dev/null
+++ b/test/ssl/vectors/certs/entity-no-ca-bool-cert.pem
@@ -0,0 +1,184 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 1 (0x1)
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:16 2025 GMT
+ Not After : Aug 9 20:41:16 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=NoCaBool, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:eb:52:8d:b0:d8:01:6b:f7:16:50:fe:34:a3:86:
+ 1b:e8:49:50:b1:6f:6a:3f:af:de:6c:d1:af:25:9c:
+ ab:21:fc:d1:3f:45:dc:86:1d:57:04:9e:9c:56:ff:
+ 66:af:78:4b:85:7c:71:bc:6b:79:a9:63:21:f4:88:
+ 1e:6f:b9:53:58:b0:4d:93:b5:a7:e5:9c:80:3b:d9:
+ fb:f4:47:fe:46:f1:e7:7e:59:1d:e7:21:11:6b:96:
+ a0:d7:3b:de:ba:06:61:eb:03:d4:74:b7:b4:93:f4:
+ 38:34:db:9f:58:dc:d7:fa:ee:fe:56:69:b8:97:af:
+ 5b:ca:56:40:30:11:1c:26:40:a6:1f:1c:bb:d6:e0:
+ ff:1e:a4:57:35:e3:74:ab:49:a1:87:95:2f:8a:77:
+ 0a:b1:65:a0:8f:d3:5a:ac:04:93:cc:50:83:42:64:
+ ab:12:fa:2e:af:2b:ea:b1:73:7b:ce:33:c3:68:23:
+ 27:f0:75:f4:0b:82:1e:ae:21:00:4f:fc:26:17:75:
+ 84:9b:e0:31:de:59:83:aa:45:f9:82:cb:3e:dd:22:
+ ee:ce:7c:0c:06:dc:cc:61:25:7e:7a:64:e9:c5:06:
+ 57:d3:c1:61:53:59:82:32:c6:cf:1d:70:87:44:3d:
+ b7:52:e5:56:67:e3:16:7b:bb:48:98:8d:54:c1:85:
+ aa:57
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ EF:F4:8B:86:CE:75:EF:DC:E1:F8:23:1E:1A:B8:3B:8D:98:09:88:E7
+ X509v3 Authority Key Identifier:
+ keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+ DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
+ serial:3F:29:11:20:57:71:E7:8E:F9:18:0D:CA:70:4D:5B:15:2A:43:D6:24
+ X509v3 Basic Constraints:
+ CA:FALSE, pathlen:0
+ X509v3 Key Usage:
+ Digital Signature
+ X509v3 Extended Key Usage:
+ TLS Web Client Authentication, TLS Web Server Authentication
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ 95:6e:d9:b6:c8:ba:6b:24:bc:5a:f6:87:09:b0:39:4b:1c:8d:
+ 6a:a9:b6:c7:86:a9:e2:5d:9e:ae:27:a5:03:4c:cb:2b:65:6c:
+ c1:fe:8a:90:c8:8d:53:bb:8e:c7:ac:c0:53:90:a9:4c:ba:db:
+ f0:24:08:4e:bc:31:e4:e7:d7:81:31:00:9e:f4:32:06:fc:26:
+ 95:4f:12:34:62:ba:c2:dc:0a:5c:54:c0:6d:60:33:0e:21:99:
+ 63:7f:46:09:dc:22:32:f6:cd:fb:6c:9c:96:94:39:d1:c9:e4:
+ 98:83:a0:c4:56:88:d9:fe:5a:cc:01:ca:18:a1:fc:a8:6a:40:
+ 8f:4a:23:f7:ed:9d:b6:c7:43:46:5c:13:b6:65:be:0e:ce:63:
+ 1b:f8:c9:7a:44:32:f4:b8:f0:fc:d3:7e:39:6a:55:de:bc:f4:
+ 3d:cc:70:1a:f1:ff:11:c8:a3:81:1b:8c:54:4e:bd:06:01:7f:
+ 7d:2e:1b:bd:4b:a4:ff:a3:19:aa:4c:d6:0d:41:09:6d:65:31:
+ ed:bd:fd:ab:43:b9:a0:93:ca:15:ae:22:d4:81:e5:21:d8:e0:
+ aa:da:01:40:fe:3e:5d:78:e4:71:50:5c:61:63:48:d6:ec:92:
+ 6e:45:64:85:ac:d3:b5:0b:f3:fc:2e:fc:2c:5d:e2:39:bc:64:
+ b8:65:cc:22
+-----BEGIN CERTIFICATE-----
+MIIE2DCCA8CgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh
+d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz
+bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjUxMTEz
+MjA0MTE2WhcNMjgwODA5MjA0MTE2WjCBkTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM
+B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxETAP
+BgNVBAsMCE5vQ2FCb29sMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkq
+hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDrUo2w2AFr9xZQ/jSjhhvoSVCxb2o/r95s0a8lnKsh/NE/RdyG
+HVcEnpxW/2aveEuFfHG8a3mpYyH0iB5vuVNYsE2TtaflnIA72fv0R/5G8ed+WR3n
+IRFrlqDXO966BmHrA9R0t7ST9Dg0259Y3Nf67v5WabiXr1vKVkAwERwmQKYfHLvW
+4P8epFc143SrSaGHlS+KdwqxZaCP01qsBJPMUINCZKsS+i6vK+qxc3vOM8NoIyfw
+dfQLgh6uIQBP/CYXdYSb4DHeWYOqRfmCyz7dIu7OfAwG3MxhJX56ZOnFBlfTwWFT
+WYIyxs8dcIdEPbdS5VZn4xZ7u0iYjVTBhapXAgMBAAGjggE0MIIBMDAdBgNVHQ4E
+FgQU7/SLhs5179zh+CMeGrg7jZgJiOcwgdQGA1UdIwSBzDCByYAUJ45nEXTDJh0/
+7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250
+YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UE
+CwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZI
+hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQ/KREgV3HnjvkYDcpwTVsVKkPWJDAM
+BgNVHRMEBTADAgEAMAsGA1UdDwQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAgYI
+KwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAJVu2bbIumskvFr2hwmwOUscjWqp
+tseGqeJdnq4npQNMyytlbMH+ipDIjVO7jseswFOQqUy62/AkCE68MeTn14ExAJ70
+Mgb8JpVPEjRiusLcClxUwG1gMw4hmWN/RgncIjL2zftsnJaUOdHJ5JiDoMRWiNn+
+WswByhih/KhqQI9KI/ftnbbHQ0ZcE7Zlvg7OYxv4yXpEMvS48PzTfjlqVd689D3M
+cBrx/xHIo4EbjFROvQYBf30uG71LpP+jGapM1g1BCW1lMe29/atDuaCTyhWuItSB
+5SHY4KraAUD+Pl145HFQXGFjSNbskm5FZIWs07UL8/wu/Cxd4jm8ZLhlzCI=
+-----END CERTIFICATE-----
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 3f:29:11:20:57:71:e7:8e:f9:18:0d:ca:70:4d:5b:15:2a:43:d6:24
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:11 2025 GMT
+ Not After : Aug 9 20:41:11 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:bf:0c:ca:2d:14:b2:1e:84:42:5b:cd:38:1f:4a:
+ f2:4d:75:10:f1:b6:35:9f:df:ca:7d:03:98:d3:ac:
+ de:03:66:ee:2a:f1:d8:b0:7d:6e:07:54:0b:10:98:
+ 21:4d:80:cb:12:20:e7:cc:4f:de:45:7d:c9:72:77:
+ 32:ea:ca:90:bb:69:52:10:03:2f:a8:f3:95:c5:f1:
+ 8b:62:56:1b:ef:67:6f:a4:10:41:95:ad:0a:9b:e3:
+ a5:c0:b0:d2:70:76:50:30:5b:a8:e8:08:2c:7c:ed:
+ a7:a2:7a:8d:38:29:1c:ac:c7:ed:f2:7c:95:b0:95:
+ 82:7d:49:5c:38:cd:77:25:ef:bd:80:75:53:94:3c:
+ 3d:ca:63:5b:9f:15:b5:d3:1d:13:2f:19:d1:3c:db:
+ 76:3a:cc:b8:7d:c9:e5:c2:d7:da:40:6f:d8:21:dc:
+ 73:1b:42:2d:53:9c:fe:1a:fc:7d:ab:7a:36:3f:98:
+ de:84:7c:05:67:ce:6a:14:38:87:a9:f1:8c:b5:68:
+ cb:68:7f:71:20:2b:f5:a0:63:f5:56:2f:a3:26:d2:
+ b7:6f:b1:5a:17:d7:38:99:08:fe:93:58:6f:fe:c3:
+ 13:49:08:16:0b:a7:4d:67:00:52:31:67:23:4e:98:
+ ed:51:45:1d:b9:04:d9:0b:ec:d8:28:b3:4b:bd:ed:
+ 36:79
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+ X509v3 Authority Key Identifier:
+ keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+ DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
+ serial:3F:29:11:20:57:71:E7:8E:F9:18:0D:CA:70:4D:5B:15:2A:43:D6:24
+ X509v3 Basic Constraints:
+ CA:TRUE
+ X509v3 Subject Alternative Name:
+ DNS:example.com, IP Address:127.0.0.1
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication, TLS Web Client Authentication
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ 0f:ae:89:d5:68:e4:41:f8:9b:e0:c5:61:06:57:ff:a0:92:0f:
+ b2:ed:d3:99:5b:99:5e:32:7e:97:c7:af:6c:fe:8c:a6:ae:32:
+ a1:0d:ca:cd:fc:18:e5:d1:f8:20:5b:5a:38:81:46:5b:48:87:
+ a5:3f:3b:7b:c7:ea:f5:35:29:31:15:39:38:5d:48:e6:01:81:
+ 5c:5e:7c:10:f5:16:e3:59:af:44:c8:b5:8d:c1:32:23:b3:b8:
+ 12:6e:5c:8d:e6:c2:d2:41:03:eb:17:42:e2:7f:bc:00:5d:a5:
+ 31:ef:c6:48:ee:db:cc:e0:f1:56:f5:d4:ca:45:a1:59:b5:e4:
+ d7:60:9c:57:e0:a7:5a:f2:35:1e:a0:22:db:5e:1c:0c:61:bd:
+ a1:c5:7b:9f:69:f2:d5:95:e2:bc:52:b9:1d:9c:2c:da:b6:73:
+ 75:4a:84:e5:94:b8:19:4d:dd:70:bd:7f:4c:b9:17:6a:58:16:
+ 89:22:44:37:57:55:26:42:e3:b7:e5:c7:2b:40:0c:e9:e4:7f:
+ 52:75:df:06:c9:fb:01:44:34:ac:20:3c:b4:be:2b:3e:ef:85:
+ 38:96:5b:9b:1e:25:86:18:4c:a4:06:70:06:6a:c8:4b:6f:5f:
+ c4:05:1f:03:62:30:11:61:bc:c1:40:31:66:dc:64:f0:4f:6b:
+ b9:ec:c8:29
+-----BEGIN CERTIFICATE-----
+MIIE/zCCA+egAwIBAgIUPykRIFdx5475GA3KcE1bFSpD1iQwDQYJKoZIhvcNAQEL
+BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC
+b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY
+MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv
+bGZzc2wuY29tMB4XDTI1MTExMzIwNDExMVoXDTI4MDgwOTIwNDExMVowgZQxCzAJ
+BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw
+DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP
+d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvwzKLRSyHoRCW804H0ry
+TXUQ8bY1n9/KfQOY06zeA2buKvHYsH1uB1QLEJghTYDLEiDnzE/eRX3Jcncy6sqQ
+u2lSEAMvqPOVxfGLYlYb72dvpBBBla0Km+OlwLDScHZQMFuo6AgsfO2nonqNOCkc
+rMft8nyVsJWCfUlcOM13Je+9gHVTlDw9ymNbnxW10x0TLxnRPNt2Osy4fcnlwtfa
+QG/YIdxzG0ItU5z+Gvx9q3o2P5jehHwFZ85qFDiHqfGMtWjLaH9xICv1oGP1Vi+j
+JtK3b7FaF9c4mQj+k1hv/sMTSQgWC6dNZwBSMWcjTpjtUUUduQTZC+zYKLNLve02
+eQIDAQABo4IBRTCCAUEwHQYDVR0OBBYEFCeOZxF0wyYdP+0zY7Ok2B0w5ejVMIHU
+BgNVHSMEgcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYD
+VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G
+A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3
+dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU
+PykRIFdx5475GA3KcE1bFSpD1iQwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl
+eGFtcGxlLmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
+DQYJKoZIhvcNAQELBQADggEBAA+uidVo5EH4m+DFYQZX/6CSD7Lt05lbmV4yfpfH
+r2z+jKauMqENys38GOXR+CBbWjiBRltIh6U/O3vH6vU1KTEVOThdSOYBgVxefBD1
+FuNZr0TItY3BMiOzuBJuXI3mwtJBA+sXQuJ/vABdpTHvxkju28zg8Vb11MpFoVm1
+5NdgnFfgp1ryNR6gItteHAxhvaHFe59p8tWV4rxSuR2cLNq2c3VKhOWUuBlN3XC9
+f0y5F2pYFokiRDdXVSZC47flxytADOnkf1J13wbJ+wFENKwgPLS+Kz7vhTiWW5se
+JYYYTKQGcAZqyEtvX8QFHwNiMBFhvMFAMWbcZPBPa7nsyCk=
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/entity-no-ca-bool-key.pem b/test/ssl/vectors/certs/entity-no-ca-bool-key.pem
new file mode 100644
index 000000000..30c2f630a
--- /dev/null
+++ b/test/ssl/vectors/certs/entity-no-ca-bool-key.pem
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEA61KNsNgBa/cWUP40o4Yb6ElQsW9qP6/ebNGvJZyrIfzRP0Xc
+hh1XBJ6cVv9mr3hLhXxxvGt5qWMh9Igeb7lTWLBNk7Wn5ZyAO9n79Ef+RvHnflkd
+5yERa5ag1zveugZh6wPUdLe0k/Q4NNufWNzX+u7+Vmm4l69bylZAMBEcJkCmHxy7
+1uD/HqRXNeN0q0mhh5UvincKsWWgj9NarASTzFCDQmSrEvouryvqsXN7zjPDaCMn
+8HX0C4IeriEAT/wmF3WEm+Ax3lmDqkX5gss+3SLuznwMBtzMYSV+emTpxQZX08Fh
+U1mCMsbPHXCHRD23UuVWZ+MWe7tImI1UwYWqVwIDAQABAoIBAQCbAnw3O3JkThSz
+MWA3P0Xu0yyGVN/mJ9EaWV1IJ1VLRCAJz9kdtwH1Fw3g+MgJWfJVcc3x0dIIVDav
+v2JdMfTG/Qt8+zInu9l0k3i2Rx4mWX6l6coaz9uLxWMZpGRooX+qsZEneUNIGp1T
+pD/o50CWGQwMnANuV6LdO8d4YizqvHO7N3QQqYLb80KnvbjOdqR3hApV2B/fehqP
+ye+b7ThJpiSSxcY/CA0bBDFU8fZUyDxgaqyu5NbkFnT2m6JUfpQXef3FaYb2934Z
+EkvsLMciWYQJ4jNtaUFoFxYADw8ZDp8d9VV6BxxykcdwAbd6F9y5pmYPq8/hkLDJ
+9AbXXTLxAoGBAPuyE7i4ktHwFDNLKKp2olF49dYr8onr9JuuIwWihRNnR7I4CyFq
+/vcyatLysGwWRZtqwPIjBoqSdN+TvY763fyIn8gtFFlGNk1YLDNb3cXV8MBaaXhm
+niJDvVg+mdj8tFUzjQVyv+CJV2Ow9LWVk1wU1wbKIdzIWInchc0aLhI9AoGBAO9Y
+y3x+bAsEI4isnbq6J2t9EowJQ7mSUxuSEa7v+GDXeEnIVZ4rWo8mmEq/p9jHM+YF
+JVBfI6OhFVpBoUOHL4u2MrMscXhPqGgSB7eSvlhJntpnjwpfF+COel2sNW6MNAbk
+WZRGnfs4ImyEI0BBSKXto0mLH5M2ZpXrjEZwTJwjAoGAeTLo+Dw4xsr6jzCT5nG1
++9FpX7ZN1kg+w3B5AM+fkRZcmd8OzQq+t74ZXnbqqUGYRxyCyJZBIh0gFkEIOH9o
+wZ/wgO3kLJD4uQnKTvjfs9IvWhCvVQDlCM7hsEqEvs4A8D4gnA0DhFXeNO0TCRV7
+ng2S9XwEDlKS/9+mtnry0GkCgYAweWJU52HIZWEw+AzF2ZfMPDt6YxH1Tn5Ici/k
+pzM9ocX543n7m7oujdmAIgrDa6zGJDqnaW1VYXVqnyoi/AkUGaVxBkpA3Jk14pjv
+g+fLB7YFc73TkujKEPEVcaAssHaFAtBlqFusmnTWV3iwNciZ2mQcq/GMJhNmv5rc
+VTge0wKBgQD2abpREDn7GCEwDrE5y/47Hcx/Godd0dkaYt/fZyokypspQS+nFyjp
+BkUR7C7slMR4iO7uXWCQO8fw81TvE6ZX5MuAdpmbavORWNhQSfijTyhV4+WvE0E2
+KBN8G0ctKOZ3e5RpYIuzYRSzMaj38vAFVtVdiPDpjyiSzbXkjqm+Hw==
+-----END RSA PRIVATE KEY-----
diff --git a/test/ssl/vectors/certs/server-cert.pem b/test/ssl/vectors/certs/server-cert.pem
new file mode 100644
index 000000000..4058c2db1
--- /dev/null
+++ b/test/ssl/vectors/certs/server-cert.pem
@@ -0,0 +1,185 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 1 (0x1)
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:13 2025 GMT
+ Not After : Aug 9 20:41:13 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Support, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27:
+ 01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6:
+ f6:1c:88:bc:7c:9f:fb:a8:67:7f:fe:5c:9c:51:75:
+ f7:8a:ca:07:e7:35:2f:8f:e1:bd:7b:c0:2f:7c:ab:
+ 64:a8:17:fc:ca:5d:7b:ba:e0:21:e5:72:2e:6f:2e:
+ 86:d8:95:73:da:ac:1b:53:b9:5f:3f:d7:19:0d:25:
+ 4f:e1:63:63:51:8b:0b:64:3f:ad:43:b8:a5:1c:5c:
+ 34:b3:ae:00:a0:63:c5:f6:7f:0b:59:68:78:73:a6:
+ 8c:18:a9:02:6d:af:c3:19:01:2e:b8:10:e3:c6:cc:
+ 40:b4:69:a3:46:33:69:87:6e:c4:bb:17:a6:f3:e8:
+ dd:ad:73:bc:7b:2f:21:b5:fd:66:51:0c:bd:54:b3:
+ e1:6d:5f:1c:bc:23:73:d1:09:03:89:14:d2:10:b9:
+ 64:c3:2a:d0:a1:96:4a:bc:e1:d4:1a:5b:c7:a0:c0:
+ c1:63:78:0f:44:37:30:32:96:80:32:23:95:a1:77:
+ ba:13:d2:97:73:e2:5d:25:c9:6a:0d:c3:39:60:a4:
+ b4:b0:69:42:42:09:e9:d8:08:bc:33:20:b3:58:22:
+ a7:aa:eb:c4:e1:e6:61:83:c5:d2:96:df:d9:d0:4f:
+ ad:d7
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ B3:11:32:C9:92:98:84:E2:C9:F8:D0:3B:6E:03:42:CA:1F:0E:8E:3C
+ X509v3 Authority Key Identifier:
+ keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+ DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
+ serial:3F:29:11:20:57:71:E7:8E:F9:18:0D:CA:70:4D:5B:15:2A:43:D6:24
+ X509v3 Basic Constraints:
+ CA:TRUE
+ X509v3 Subject Alternative Name:
+ DNS:example.com, IP Address:127.0.0.1
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication, TLS Web Client Authentication
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ bb:de:9b:8d:eb:6b:17:42:a4:de:1f:9d:61:80:80:7d:f3:3a:
+ 5e:c1:b9:a2:b4:0d:28:5a:92:4e:d6:02:47:2f:99:1a:43:fa:
+ a4:8b:d8:56:45:22:c3:bb:f3:7d:d4:07:db:9b:99:0b:01:35:
+ 04:d3:13:d9:ad:6e:88:b9:89:db:35:ed:e4:bf:12:6e:66:bd:
+ c2:a6:8f:0a:95:8d:f7:6e:6e:4c:ff:fc:d0:b4:d7:ee:c9:5f:
+ c3:44:ef:2a:9b:6f:fa:69:fe:2e:d6:10:64:da:9f:9b:33:f0:
+ 5f:49:e3:6f:e1:9e:d5:f7:4a:2a:1d:4c:c8:d0:82:d0:c7:a6:
+ 54:c0:57:f1:a8:e8:d2:24:c9:59:7d:dc:3c:21:cf:2d:ff:36:
+ 5d:14:ed:3c:4b:74:53:f6:3a:25:2f:42:9d:76:fb:dc:60:2c:
+ 28:eb:2d:c5:35:65:b5:bc:f1:dc:70:5d:fd:76:ce:8c:b6:da:
+ bb:de:d7:b1:ff:f0:56:db:1f:7b:41:e8:6f:3c:4b:92:4d:ed:
+ 2f:23:46:91:aa:7c:73:98:c1:bf:28:6e:7f:50:30:e8:b5:51:
+ 3c:ac:ce:b4:b4:c8:83:36:b7:40:6f:68:d0:8f:12:63:93:d5:
+ a4:42:b9:c5:c6:93:55:33:ed:84:c1:fc:19:ad:70:98:15:68:
+ 03:9e:65:c9
+-----BEGIN CERTIFICATE-----
+MIIE6DCCA9CgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh
+d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz
+bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjUxMTEz
+MjA0MTEzWhcNMjgwODA5MjA0MTEzWjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM
+B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxEDAO
+BgNVBAsMB1N1cHBvcnQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG
+SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMCVCOFXQfJxbbfSRUEnAWXGRa7yvCQwuJXOL07W9hyIvHyf+6hn
+f/5cnFF194rKB+c1L4/hvXvAL3yrZKgX/Mpde7rgIeVyLm8uhtiVc9qsG1O5Xz/X
+GQ0lT+FjY1GLC2Q/rUO4pRxcNLOuAKBjxfZ/C1loeHOmjBipAm2vwxkBLrgQ48bM
+QLRpo0YzaYduxLsXpvPo3a1zvHsvIbX9ZlEMvVSz4W1fHLwjc9EJA4kU0hC5ZMMq
+0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3uhPSl3PiXSXJag3DOWCktLBpQkIJ
+6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcCAwEAAaOCAUUwggFBMB0GA1UdDgQW
+BBSzETLJkpiE4sn40DtuA0LKHw6OPDCB1AYDVR0jBIHMMIHJgBQnjmcRdMMmHT/t
+M2OzpNgdMOXo1aGBmqSBlzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh
+bmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQL
+DApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG
+9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFD8pESBXceeO+RgNynBNWxUqQ9YkMAwG
+A1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwHQYDVR0l
+BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQC73puN
+62sXQqTeH51hgIB98zpewbmitA0oWpJO1gJHL5kaQ/qki9hWRSLDu/N91Afbm5kL
+ATUE0xPZrW6IuYnbNe3kvxJuZr3Cpo8KlY33bm5M//zQtNfuyV/DRO8qm2/6af4u
+1hBk2p+bM/BfSeNv4Z7V90oqHUzI0ILQx6ZUwFfxqOjSJMlZfdw8Ic8t/zZdFO08
+S3RT9jolL0KddvvcYCwo6y3FNWW1vPHccF39ds6Mttq73tex//BW2x97QehvPEuS
+Te0vI0aRqnxzmMG/KG5/UDDotVE8rM60tMiDNrdAb2jQjxJjk9WkQrnFxpNVM+2E
+wfwZrXCYFWgDnmXJ
+-----END CERTIFICATE-----
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 3f:29:11:20:57:71:e7:8e:f9:18:0d:ca:70:4d:5b:15:2a:43:d6:24
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:11 2025 GMT
+ Not After : Aug 9 20:41:11 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:bf:0c:ca:2d:14:b2:1e:84:42:5b:cd:38:1f:4a:
+ f2:4d:75:10:f1:b6:35:9f:df:ca:7d:03:98:d3:ac:
+ de:03:66:ee:2a:f1:d8:b0:7d:6e:07:54:0b:10:98:
+ 21:4d:80:cb:12:20:e7:cc:4f:de:45:7d:c9:72:77:
+ 32:ea:ca:90:bb:69:52:10:03:2f:a8:f3:95:c5:f1:
+ 8b:62:56:1b:ef:67:6f:a4:10:41:95:ad:0a:9b:e3:
+ a5:c0:b0:d2:70:76:50:30:5b:a8:e8:08:2c:7c:ed:
+ a7:a2:7a:8d:38:29:1c:ac:c7:ed:f2:7c:95:b0:95:
+ 82:7d:49:5c:38:cd:77:25:ef:bd:80:75:53:94:3c:
+ 3d:ca:63:5b:9f:15:b5:d3:1d:13:2f:19:d1:3c:db:
+ 76:3a:cc:b8:7d:c9:e5:c2:d7:da:40:6f:d8:21:dc:
+ 73:1b:42:2d:53:9c:fe:1a:fc:7d:ab:7a:36:3f:98:
+ de:84:7c:05:67:ce:6a:14:38:87:a9:f1:8c:b5:68:
+ cb:68:7f:71:20:2b:f5:a0:63:f5:56:2f:a3:26:d2:
+ b7:6f:b1:5a:17:d7:38:99:08:fe:93:58:6f:fe:c3:
+ 13:49:08:16:0b:a7:4d:67:00:52:31:67:23:4e:98:
+ ed:51:45:1d:b9:04:d9:0b:ec:d8:28:b3:4b:bd:ed:
+ 36:79
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+ X509v3 Authority Key Identifier:
+ keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+ DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
+ serial:3F:29:11:20:57:71:E7:8E:F9:18:0D:CA:70:4D:5B:15:2A:43:D6:24
+ X509v3 Basic Constraints:
+ CA:TRUE
+ X509v3 Subject Alternative Name:
+ DNS:example.com, IP Address:127.0.0.1
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication, TLS Web Client Authentication
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ 0f:ae:89:d5:68:e4:41:f8:9b:e0:c5:61:06:57:ff:a0:92:0f:
+ b2:ed:d3:99:5b:99:5e:32:7e:97:c7:af:6c:fe:8c:a6:ae:32:
+ a1:0d:ca:cd:fc:18:e5:d1:f8:20:5b:5a:38:81:46:5b:48:87:
+ a5:3f:3b:7b:c7:ea:f5:35:29:31:15:39:38:5d:48:e6:01:81:
+ 5c:5e:7c:10:f5:16:e3:59:af:44:c8:b5:8d:c1:32:23:b3:b8:
+ 12:6e:5c:8d:e6:c2:d2:41:03:eb:17:42:e2:7f:bc:00:5d:a5:
+ 31:ef:c6:48:ee:db:cc:e0:f1:56:f5:d4:ca:45:a1:59:b5:e4:
+ d7:60:9c:57:e0:a7:5a:f2:35:1e:a0:22:db:5e:1c:0c:61:bd:
+ a1:c5:7b:9f:69:f2:d5:95:e2:bc:52:b9:1d:9c:2c:da:b6:73:
+ 75:4a:84:e5:94:b8:19:4d:dd:70:bd:7f:4c:b9:17:6a:58:16:
+ 89:22:44:37:57:55:26:42:e3:b7:e5:c7:2b:40:0c:e9:e4:7f:
+ 52:75:df:06:c9:fb:01:44:34:ac:20:3c:b4:be:2b:3e:ef:85:
+ 38:96:5b:9b:1e:25:86:18:4c:a4:06:70:06:6a:c8:4b:6f:5f:
+ c4:05:1f:03:62:30:11:61:bc:c1:40:31:66:dc:64:f0:4f:6b:
+ b9:ec:c8:29
+-----BEGIN CERTIFICATE-----
+MIIE/zCCA+egAwIBAgIUPykRIFdx5475GA3KcE1bFSpD1iQwDQYJKoZIhvcNAQEL
+BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC
+b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY
+MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv
+bGZzc2wuY29tMB4XDTI1MTExMzIwNDExMVoXDTI4MDgwOTIwNDExMVowgZQxCzAJ
+BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw
+DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP
+d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvwzKLRSyHoRCW804H0ry
+TXUQ8bY1n9/KfQOY06zeA2buKvHYsH1uB1QLEJghTYDLEiDnzE/eRX3Jcncy6sqQ
+u2lSEAMvqPOVxfGLYlYb72dvpBBBla0Km+OlwLDScHZQMFuo6AgsfO2nonqNOCkc
+rMft8nyVsJWCfUlcOM13Je+9gHVTlDw9ymNbnxW10x0TLxnRPNt2Osy4fcnlwtfa
+QG/YIdxzG0ItU5z+Gvx9q3o2P5jehHwFZ85qFDiHqfGMtWjLaH9xICv1oGP1Vi+j
+JtK3b7FaF9c4mQj+k1hv/sMTSQgWC6dNZwBSMWcjTpjtUUUduQTZC+zYKLNLve02
+eQIDAQABo4IBRTCCAUEwHQYDVR0OBBYEFCeOZxF0wyYdP+0zY7Ok2B0w5ejVMIHU
+BgNVHSMEgcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYD
+VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G
+A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3
+dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU
+PykRIFdx5475GA3KcE1bFSpD1iQwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl
+eGFtcGxlLmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
+DQYJKoZIhvcNAQELBQADggEBAA+uidVo5EH4m+DFYQZX/6CSD7Lt05lbmV4yfpfH
+r2z+jKauMqENys38GOXR+CBbWjiBRltIh6U/O3vH6vU1KTEVOThdSOYBgVxefBD1
+FuNZr0TItY3BMiOzuBJuXI3mwtJBA+sXQuJ/vABdpTHvxkju28zg8Vb11MpFoVm1
+5NdgnFfgp1ryNR6gItteHAxhvaHFe59p8tWV4rxSuR2cLNq2c3VKhOWUuBlN3XC9
+f0y5F2pYFokiRDdXVSZC47flxytADOnkf1J13wbJ+wFENKwgPLS+Kz7vhTiWW5se
+JYYYTKQGcAZqyEtvX8QFHwNiMBFhvMFAMWbcZPBPa7nsyCk=
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/server-ecc-rsa.pem b/test/ssl/vectors/certs/server-ecc-rsa.pem
new file mode 100644
index 000000000..900c634d0
--- /dev/null
+++ b/test/ssl/vectors/certs/server-ecc-rsa.pem
@@ -0,0 +1,76 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 1 (0x1)
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:14 2025 GMT
+ Not After : Aug 9 20:41:14 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, O=Elliptic - RSAsig, OU=ECC-RSAsig, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: id-ecPublicKey
+ Public-Key: (256 bit)
+ pub:
+ 04:bb:33:ac:4c:27:50:4a:c6:4a:a5:04:c3:3c:de:
+ 9f:36:db:72:2d:ce:94:ea:2b:fa:cb:20:09:39:2c:
+ 16:e8:61:02:e9:af:4d:d3:02:93:9a:31:5b:97:92:
+ 21:7f:f0:cf:18:da:91:11:02:34:86:e8:20:58:33:
+ 0b:80:34:89:d8
+ ASN1 OID: prime256v1
+ NIST CURVE: P-256
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 5D:5D:26:EF:AC:7E:36:F9:9B:76:15:2B:4A:25:02:23:EF:B2:89:30
+ X509v3 Authority Key Identifier:
+ keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+ DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
+ serial:3F:29:11:20:57:71:E7:8E:F9:18:0D:CA:70:4D:5B:15:2A:43:D6:24
+ X509v3 Basic Constraints:
+ CA:TRUE
+ X509v3 Subject Alternative Name:
+ DNS:example.com, IP Address:127.0.0.1
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication, TLS Web Client Authentication
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ 01:53:08:5b:e2:1a:b9:c6:e3:a8:2b:51:19:de:1b:12:c0:d0:
+ b0:b7:ce:ad:27:5c:c7:b6:93:c4:84:84:19:6e:e4:28:8f:43:
+ 36:79:28:fd:c5:fb:52:24:5a:85:7b:3e:a9:1f:8f:2b:d2:ac:
+ f4:4e:cc:68:86:bb:01:ce:83:b5:cd:32:6b:32:a8:ca:9e:79:
+ 95:57:2b:1d:7d:0d:70:63:7f:4f:a7:f3:08:4c:71:00:fe:36:
+ 51:e8:29:46:2c:91:23:42:e1:47:d8:ac:52:92:09:d3:02:ad:
+ c2:1c:c2:ca:cc:df:79:cf:1d:da:1d:cb:6c:d2:b8:a3:34:a2:
+ c1:11:17:c9:5b:4b:8b:76:4a:d1:d6:06:46:ca:9c:0d:5b:c2:
+ 5d:6e:5b:e6:00:6d:e2:3b:3f:03:d6:a0:3e:cf:31:c8:19:0d:
+ 85:1f:6a:5f:76:80:d4:8c:26:73:d0:27:06:cb:49:49:62:b9:
+ 7f:6e:77:56:c4:68:5b:64:11:68:f4:37:9c:82:b2:c8:4f:b2:
+ 20:8a:6f:49:b1:4e:54:e0:f2:83:97:1d:55:c0:4d:a9:84:48:
+ 70:61:33:bd:ca:1c:f5:d0:a8:24:b6:f7:36:35:b1:4c:7c:e5:
+ 3b:52:32:cb:9f:32:e2:a1:12:30:43:60:1f:97:b0:6e:07:6a:
+ 94:72:f5:61
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh
+d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz
+bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjUxMTEz
+MjA0MTE0WhcNMjgwODA5MjA0MTE0WjCBnTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM
+B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xGjAYBgNVBAoMEUVsbGlwdGljIC0g
+UlNBc2lnMRMwEQYDVQQLDApFQ0MtUlNBc2lnMRgwFgYDVQQDDA93d3cud29sZnNz
+bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wWTATBgcqhkjO
+PQIBBggqhkjOPQMBBwNCAAS7M6xMJ1BKxkqlBMM83p8223ItzpTqK/rLIAk5LBbo
+YQLpr03TApOaMVuXkiF/8M8Y2pERAjSG6CBYMwuANInYo4IBRTCCAUEwHQYDVR0O
+BBYEFF1dJu+sfjb5m3YVK0olAiPvsokwMIHUBgNVHSMEgcwwgcmAFCeOZxF0wyYd
+P+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9u
+dGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwIU2F3dG9vdGgxEzARBgNV
+BAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG
+SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPykRIFdx5475GA3KcE1bFSpD1iQw
+DAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATAdBgNV
+HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAAFT
+CFviGrnG46grURneGxLA0LC3zq0nXMe2k8SEhBlu5CiPQzZ5KP3F+1IkWoV7Pqkf
+jyvSrPROzGiGuwHOg7XNMmsyqMqeeZVXKx19DXBjf0+n8whMcQD+NlHoKUYskSNC
+4UfYrFKSCdMCrcIcwsrM33nPHdody2zSuKM0osERF8lbS4t2StHWBkbKnA1bwl1u
+W+YAbeI7PwPWoD7PMcgZDYUfal92gNSMJnPQJwbLSUliuX9ud1bEaFtkEWj0N5yC
+sshPsiCKb0mxTlTg8oOXHVXATamESHBhM73KHPXQqCS29zY1sUx85TtSMsufMuKh
+EjBDYB+XsG4HapRy9WE=
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/server-ecc.pem b/test/ssl/vectors/certs/server-ecc.pem
new file mode 100644
index 000000000..49d54fd08
--- /dev/null
+++ b/test/ssl/vectors/certs/server-ecc.pem
@@ -0,0 +1,57 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 3 (0x3)
+ Signature Algorithm: ecdsa-with-SHA256
+ Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:15 2025 GMT
+ Not After : Aug 9 20:41:15 2028 GMT
+ Subject: C=US, ST=Washington, L=Seattle, O=Elliptic, OU=ECC, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: id-ecPublicKey
+ Public-Key: (256 bit)
+ pub:
+ 04:bb:33:ac:4c:27:50:4a:c6:4a:a5:04:c3:3c:de:
+ 9f:36:db:72:2d:ce:94:ea:2b:fa:cb:20:09:39:2c:
+ 16:e8:61:02:e9:af:4d:d3:02:93:9a:31:5b:97:92:
+ 21:7f:f0:cf:18:da:91:11:02:34:86:e8:20:58:33:
+ 0b:80:34:89:d8
+ ASN1 OID: prime256v1
+ NIST CURVE: P-256
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 5D:5D:26:EF:AC:7E:36:F9:9B:76:15:2B:4A:25:02:23:EF:B2:89:30
+ X509v3 Authority Key Identifier:
+ 56:8E:9A:C3:F0:42:DE:18:B9:45:55:6E:F9:93:CF:EA:C3:F3:A5:21
+ X509v3 Basic Constraints: critical
+ CA:FALSE
+ X509v3 Key Usage: critical
+ Digital Signature, Key Encipherment, Key Agreement
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication
+ Netscape Cert Type:
+ SSL Server
+ Signature Algorithm: ecdsa-with-SHA256
+ Signature Value:
+ 30:46:02:21:00:f8:2f:f4:39:99:19:97:11:37:9f:d8:d7:7f:
+ 04:a6:ca:74:59:9a:fe:30:5b:4d:e5:31:06:55:9c:e8:f6:b4:
+ 71:02:21:00:a1:52:c9:72:89:c6:4f:22:e7:bf:97:68:dc:ff:
+ 7d:97:15:05:9d:d8:56:29:f5:df:de:a7:2d:90:d1:c5:27:30
+-----BEGIN CERTIFICATE-----
+MIICozCCAkigAwIBAgIBAzAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzAR
+BgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dv
+bGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNz
+bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjUxMTEz
+MjA0MTE1WhcNMjgwODA5MjA0MTE1WjCBkDELMAkGA1UEBhMCVVMxEzARBgNVBAgM
+Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEVsbGlwdGlj
+MQwwCgYDVQQLDANFQ0MxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG
+SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEH
+A0IABLszrEwnUErGSqUEwzzenzbbci3OlOor+ssgCTksFuhhAumvTdMCk5oxW5eS
+IX/wzxjakRECNIboIFgzC4A0idijgYkwgYYwHQYDVR0OBBYEFF1dJu+sfjb5m3YV
+K0olAiPvsokwMB8GA1UdIwQYMBaAFFaOmsPwQt4YuUVVbvmTz+rD86UhMAwGA1Ud
+EwEB/wQCMAAwDgYDVR0PAQH/BAQDAgOoMBMGA1UdJQQMMAoGCCsGAQUFBwMBMBEG
+CWCGSAGG+EIBAQQEAwIGQDAKBggqhkjOPQQDAgNJADBGAiEA+C/0OZkZlxE3n9jX
+fwSmynRZmv4wW03lMQZVnOj2tHECIQChUslyicZPIue/l2jc/32XFQWd2FYp9d/e
+py2Q0cUnMA==
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/server-ecc384-cert.pem b/test/ssl/vectors/certs/server-ecc384-cert.pem
new file mode 100644
index 000000000..10dd806a8
--- /dev/null
+++ b/test/ssl/vectors/certs/server-ecc384-cert.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAyagAwIBAgICEAEwCgYIKoZIzj0EAwMwgZcxCzAJBgNVBAYTAlVTMRMw
+EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3
+b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz
+c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMCAXDTI1MTEx
+MzIwNDEwNloYDzIwNTUxMTA2MjA0MTA2WjCBljELMAkGA1UEBhMCVVMxEzARBgNV
+BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEVsbGlw
+dGljMRIwEAYDVQQLDAlFQ0MzODRTcnYxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNv
+bTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTB2MBAGByqGSM49AgEG
+BSuBBAAiA2IABOrPk08sCbs5FA9WZMNAtN8OY67lcUsAzASX/+HpOJa7X5Gyasy1
+OV+PcFnxAfZaKwFsaAvPVSWvbZhICqh0yakXoAzD+9MjaP4EPGNQiDu5T3xnNPc7
+qXPnG8NRXiIY7KOCAUAwggE8MAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZA
+MB0GA1UdDgQWBBSCO/JlL/O0AMa8Bv15QnVLZdHOvDCB1wYDVR0jBIHPMIHMgBSr
+4MMmTBjUcrvShIycCgWSgBJTUqGBnaSBmjCBlzELMAkGA1UEBhMCVVMxEzARBgNV
+BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT
+U0wxFDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNzbC5j
+b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFCneXF5mcNk0Pu0y
+084/37VrndgZMA4GA1UdDwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATAK
+BggqhkjOPQQDAwNoADBlAjAkCetD06AxczyUg24KVWTlZ6lBSjcRwkILppSJplIb
+PNMFg8uV8W0VjSu9C+h9kH0CMQCYp6dbhcYS/JJPGwV0STPLoy4LE8b4wAnREK8E
+TxXuxtiKg8yN3FLlu774DXJSjiM=
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/server-ecc384-key.pem b/test/ssl/vectors/certs/server-ecc384-key.pem
new file mode 100644
index 000000000..5d3d61d0c
--- /dev/null
+++ b/test/ssl/vectors/certs/server-ecc384-key.pem
@@ -0,0 +1,6 @@
+-----BEGIN PRIVATE KEY-----
+MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCk5QboBhY+q4n4YEPA
+YCXbunv+GTUIVWV24tzgAYtraN/Pb4ASznk36yuce8RoHHShZANiAATqz5NPLAm7
+ORQPVmTDQLTfDmOu5XFLAMwEl//h6TiWu1+RsmrMtTlfj3BZ8QH2WisBbGgLz1Ul
+r22YSAqodMmpF6AMw/vTI2j+BDxjUIg7uU98ZzT3O6lz5xvDUV4iGOw=
+-----END PRIVATE KEY-----
diff --git a/test/ssl/vectors/certs/server-key.pem b/test/ssl/vectors/certs/server-key.pem
new file mode 100644
index 000000000..d1627f4d4
--- /dev/null
+++ b/test/ssl/vectors/certs/server-key.pem
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEAwJUI4VdB8nFtt9JFQScBZcZFrvK8JDC4lc4vTtb2HIi8fJ/7
+qGd//lycUXX3isoH5zUvj+G9e8AvfKtkqBf8yl17uuAh5XIuby6G2JVz2qwbU7lf
+P9cZDSVP4WNjUYsLZD+tQ7ilHFw0s64AoGPF9n8LWWh4c6aMGKkCba/DGQEuuBDj
+xsxAtGmjRjNph27Euxem8+jdrXO8ey8htf1mUQy9VLPhbV8cvCNz0QkDiRTSELlk
+wyrQoZZKvOHUGlvHoMDBY3gPRDcwMpaAMiOVoXe6E9KXc+JdJclqDcM5YKS0sGlC
+Qgnp2Ai8MyCzWCKnquvE4eZhg8XSlt/Z0E+t1wIDAQABAoIBAQCa0DQPUmIFUAHv
+n+1kbsLE2hryhNeSEEiSxOlq64t1bMZ5OPLJckqGZFSVd8vDmp231B2kAMieTuTd
+x7pnFsF0vKnWlI8rMBr77d8hBSPZSjm9mGtlmrjcxH3upkMVLj2+HSJgKnMw1T7Y
+oqyGQy7E9WReP4l1DxHYUSVOn9iqo85gs+KK2X4b8GTKmlsFC1uqy+XjP24yIgXz
+0PrvdFKB4l90073/MYNFdfpjepcu1rYZxpIm5CgGUFAOeC6peA0Ul7QS2DFAq6EB
+QcIw+AdfFuRhd9Jg8p+N6PS662PeKpeB70xs5lU0USsoNPRTHMRYCj+7r7X3SoVD
+LTzxWFiBAoGBAPIsVHY5I2PJEDK3k62vvhl1loFk5rW4iUJB0W3QHBv4G6xpyzY8
+ZH3c9Bm4w2CxV0hfUk9ZOlV/MsAZQ1A/rs5vF/MOn0DKTq0VO8l56cBZOHNwnAp8
+yTpIMqfYSXUKhcLC/RVz2pkJKmmanwpxv7AEpox6Wm9IWlQ7xrFTF9/nAoGBAMuT
+3ncVXbdcXHzYkKmYLdZpDmOzo9ymzItqpKISjI57SCyySzfcBhh96v52odSh6T8N
+zRtfr1+elltbD6F8r7ObkNtXczrtsCNErkFPHwdCEyNMy/r0FKTV9542fFufqDzB
+hV900jkt/9CE3/uzIHoumxeu5roLrl9TpFLtG8SRAoGBAOyY2rvV/vlSSn0CVUlv
+VW5SL4SjK7OGYrNU0mNS2uOIdqDvixWl0xgUcndex6MEH54ZYrUbG57D8rUy+UzB
+qusMJn3UX0pRXKRFBnBEp1bA1CIUdp7YY1CJkNPiv4GVkjFBhzkaQwsYpVMfORpf
+H0O8h2rfbtMiAP4imHBOGhkpAoGBAIpBVihRnl/Ungs7mKNU8mxW1KrpaTOFJAza
+1AwtxL9PAmk4fNTm3Ezt1xYRwz4A58MmwFEC3rt1nG9WnHrzju/PisUr0toGakTJ
+c/5umYf4W77xfOZltU9s8MnF/xbKixsX4lg9ojerAby/QM5TjI7t7+5ZneBj5nxe
+9Y5L8TvBAoGATUX5QIzFW/QqGoq08hysa+kMVja3TnKW1eWK0uL/8fEYEz2GCbjY
+dqfJHHFSlDBD4PF4dP1hG0wJzOZoKnGtHN9DvFbbpaS+NXCkXs9P/ABVmTo9I89n
+WvUi+LUp0EQR6zUuRr79jhiyX6i/GTKh9dwD5nyaHwx8qbAOITc78bA=
+-----END RSA PRIVATE KEY-----
diff --git a/test/ssl/vectors/certs/test/server-cert-ecc-badsig.pem b/test/ssl/vectors/certs/test/server-cert-ecc-badsig.pem
new file mode 100644
index 000000000..a4f9800b7
--- /dev/null
+++ b/test/ssl/vectors/certs/test/server-cert-ecc-badsig.pem
@@ -0,0 +1,57 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 3 (0x3)
+ Signature Algorithm: ecdsa-with-SHA256
+ Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:15 2025 GMT
+ Not After : Aug 9 20:41:15 2028 GMT
+ Subject: C=US, ST=Washington, L=Seattle, O=Elliptic, OU=ECC, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: id-ecPublicKey
+ Public-Key: (256 bit)
+ pub:
+ 04:bb:33:ac:4c:27:50:4a:c6:4a:a5:04:c3:3c:de:
+ 9f:36:db:72:2d:ce:94:ea:2b:fa:cb:20:09:39:2c:
+ 16:e8:61:02:e9:af:4d:d3:02:93:9a:31:5b:97:92:
+ 21:7f:f0:cf:18:da:91:11:02:34:86:e8:20:58:33:
+ 0b:80:34:89:d8
+ ASN1 OID: prime256v1
+ NIST CURVE: P-256
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 5D:5D:26:EF:AC:7E:36:F9:9B:76:15:2B:4A:25:02:23:EF:B2:89:30
+ X509v3 Authority Key Identifier:
+ 56:8E:9A:C3:F0:42:DE:18:B9:45:55:6E:F9:93:CF:EA:C3:F3:A5:21
+ X509v3 Basic Constraints: critical
+ CA:FALSE
+ X509v3 Key Usage: critical
+ Digital Signature, Key Encipherment, Key Agreement
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication
+ Netscape Cert Type:
+ SSL Server
+ Signature Algorithm: ecdsa-with-SHA256
+ Signature Value:
+ 30:46:02:21:00:f8:2f:f4:39:99:19:97:11:37:9f:d8:d7:7f:
+ 04:a6:ca:74:59:9a:fe:30:5b:4d:e5:31:06:55:9c:e8:f6:b4:
+ 71:02:21:00:a1:52:c9:72:89:c6:4f:22:e7:bf:97:68:dc:ff:
+ 7d:97:15:05:9d:d8:56:29:f5:df:de:a7:2d:90:d1:c5:27:30
+-----BEGIN CERTIFICATE-----
+MIICozCCAkigAwIBAgIBAzAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzAR
+BgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dv
+bGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNz
+bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjUxMTEz
+MjA0MTE1WhcNMjgwODA5MjA0MTE1WjCBkDELMAkGA1UEBhMCVVMxEzARBgNVBAgM
+Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEVsbGlwdGlj
+MQwwCgYDVQQLDANFQ0MxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG
+SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEH
+A0IABLszrEwnUErGSqUEwzzenzbbci3OlOor+ssgCTksFuhhAumvTdMCk5oxW5eS
+IX/wzxjakRECNIboIFgzC4A0idijgYkwgYYwHQYDVR0OBBYEFF1dJu+sfjb5m3YV
+K0olAiPvsokwMB8GA1UdIwQYMBaAFFaOmsPwQt4YuUVVbvmTz+rD86UhMAwGA1Ud
+EwEB/wQCMAAwDgYDVR0PAQH/BAQDAgOoMBMGA1UdJQQMMAoGCCsGAQUFBwMBMBEG
+CWCGSAGG+EIBAQQEAwIGQDAKBggqhkjOPQQDAgNJADBGAiEA+C/0OZkZlxE3n9jX
+fwSmynRZmv4wW03lMQZVnOj2tHECIQChUslyicZPIue/l2jc/32XFQWd2FYp9d/e
+py2Q0cUnxA==
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/test/server-cert-rsa-badsig.pem b/test/ssl/vectors/certs/test/server-cert-rsa-badsig.pem
new file mode 100644
index 000000000..a87fb3a5c
--- /dev/null
+++ b/test/ssl/vectors/certs/test/server-cert-rsa-badsig.pem
@@ -0,0 +1,185 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 1 (0x1)
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:13 2025 GMT
+ Not After : Aug 9 20:41:13 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Support, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27:
+ 01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6:
+ f6:1c:88:bc:7c:9f:fb:a8:67:7f:fe:5c:9c:51:75:
+ f7:8a:ca:07:e7:35:2f:8f:e1:bd:7b:c0:2f:7c:ab:
+ 64:a8:17:fc:ca:5d:7b:ba:e0:21:e5:72:2e:6f:2e:
+ 86:d8:95:73:da:ac:1b:53:b9:5f:3f:d7:19:0d:25:
+ 4f:e1:63:63:51:8b:0b:64:3f:ad:43:b8:a5:1c:5c:
+ 34:b3:ae:00:a0:63:c5:f6:7f:0b:59:68:78:73:a6:
+ 8c:18:a9:02:6d:af:c3:19:01:2e:b8:10:e3:c6:cc:
+ 40:b4:69:a3:46:33:69:87:6e:c4:bb:17:a6:f3:e8:
+ dd:ad:73:bc:7b:2f:21:b5:fd:66:51:0c:bd:54:b3:
+ e1:6d:5f:1c:bc:23:73:d1:09:03:89:14:d2:10:b9:
+ 64:c3:2a:d0:a1:96:4a:bc:e1:d4:1a:5b:c7:a0:c0:
+ c1:63:78:0f:44:37:30:32:96:80:32:23:95:a1:77:
+ ba:13:d2:97:73:e2:5d:25:c9:6a:0d:c3:39:60:a4:
+ b4:b0:69:42:42:09:e9:d8:08:bc:33:20:b3:58:22:
+ a7:aa:eb:c4:e1:e6:61:83:c5:d2:96:df:d9:d0:4f:
+ ad:d7
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ B3:11:32:C9:92:98:84:E2:C9:F8:D0:3B:6E:03:42:CA:1F:0E:8E:3C
+ X509v3 Authority Key Identifier:
+ keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+ DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
+ serial:3F:29:11:20:57:71:E7:8E:F9:18:0D:CA:70:4D:5B:15:2A:43:D6:24
+ X509v3 Basic Constraints:
+ CA:TRUE
+ X509v3 Subject Alternative Name:
+ DNS:example.com, IP Address:127.0.0.1
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication, TLS Web Client Authentication
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ bb:de:9b:8d:eb:6b:17:42:a4:de:1f:9d:61:80:80:7d:f3:3a:
+ 5e:c1:b9:a2:b4:0d:28:5a:92:4e:d6:02:47:2f:99:1a:43:fa:
+ a4:8b:d8:56:45:22:c3:bb:f3:7d:d4:07:db:9b:99:0b:01:35:
+ 04:d3:13:d9:ad:6e:88:b9:89:db:35:ed:e4:bf:12:6e:66:bd:
+ c2:a6:8f:0a:95:8d:f7:6e:6e:4c:ff:fc:d0:b4:d7:ee:c9:5f:
+ c3:44:ef:2a:9b:6f:fa:69:fe:2e:d6:10:64:da:9f:9b:33:f0:
+ 5f:49:e3:6f:e1:9e:d5:f7:4a:2a:1d:4c:c8:d0:82:d0:c7:a6:
+ 54:c0:57:f1:a8:e8:d2:24:c9:59:7d:dc:3c:21:cf:2d:ff:36:
+ 5d:14:ed:3c:4b:74:53:f6:3a:25:2f:42:9d:76:fb:dc:60:2c:
+ 28:eb:2d:c5:35:65:b5:bc:f1:dc:70:5d:fd:76:ce:8c:b6:da:
+ bb:de:d7:b1:ff:f0:56:db:1f:7b:41:e8:6f:3c:4b:92:4d:ed:
+ 2f:23:46:91:aa:7c:73:98:c1:bf:28:6e:7f:50:30:e8:b5:51:
+ 3c:ac:ce:b4:b4:c8:83:36:b7:40:6f:68:d0:8f:12:63:93:d5:
+ a4:42:b9:c5:c6:93:55:33:ed:84:c1:fc:19:ad:70:98:15:68:
+ 03:9e:65:c9
+-----BEGIN CERTIFICATE-----
+MIIE6DCCA9CgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh
+d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz
+bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjUxMTEz
+MjA0MTEzWhcNMjgwODA5MjA0MTEzWjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM
+B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxEDAO
+BgNVBAsMB1N1cHBvcnQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG
+SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMCVCOFXQfJxbbfSRUEnAWXGRa7yvCQwuJXOL07W9hyIvHyf+6hn
+f/5cnFF194rKB+c1L4/hvXvAL3yrZKgX/Mpde7rgIeVyLm8uhtiVc9qsG1O5Xz/X
+GQ0lT+FjY1GLC2Q/rUO4pRxcNLOuAKBjxfZ/C1loeHOmjBipAm2vwxkBLrgQ48bM
+QLRpo0YzaYduxLsXpvPo3a1zvHsvIbX9ZlEMvVSz4W1fHLwjc9EJA4kU0hC5ZMMq
+0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3uhPSl3PiXSXJag3DOWCktLBpQkIJ
+6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcCAwEAAaOCAUUwggFBMB0GA1UdDgQW
+BBSzETLJkpiE4sn40DtuA0LKHw6OPDCB1AYDVR0jBIHMMIHJgBQnjmcRdMMmHT/t
+M2OzpNgdMOXo1aGBmqSBlzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh
+bmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQL
+DApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG
+9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFD8pESBXceeO+RgNynBNWxUqQ9YkMAwG
+A1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwHQYDVR0l
+BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQC73puN
+62sXQqTeH51hgIB98zpewbmitA0oWpJO1gJHL5kaQ/qki9hWRSLDu/N91Afbm5kL
+ATUE0xPZrW6IuYnbNe3kvxJuZr3Cpo8KlY33bm5M//zQtNfuyV/DRO8qm2/6af4u
+1hBk2p+bM/BfSeNv4Z7V90oqHUzI0ILQx6ZUwFfxqOjSJMlZfdw8Ic8t/zZdFO08
+S3RT9jolL0KddvvcYCwo6y3FNWW1vPHccF39ds6Mttq73tex//BW2x97QehvPEuS
+Te0vI0aRqnxzmMG/KG5/UDDotVE8rM60tMiDNrdAb2jQjxJjk9WkQrnFxpNVM+2E
+wfwZrXCYFWgDnmXJ
+-----END CERTIFICATE-----
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 3f:29:11:20:57:71:e7:8e:f9:18:0d:ca:70:4d:5b:15:2a:43:d6:24
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:11 2025 GMT
+ Not After : Aug 9 20:41:11 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:bf:0c:ca:2d:14:b2:1e:84:42:5b:cd:38:1f:4a:
+ f2:4d:75:10:f1:b6:35:9f:df:ca:7d:03:98:d3:ac:
+ de:03:66:ee:2a:f1:d8:b0:7d:6e:07:54:0b:10:98:
+ 21:4d:80:cb:12:20:e7:cc:4f:de:45:7d:c9:72:77:
+ 32:ea:ca:90:bb:69:52:10:03:2f:a8:f3:95:c5:f1:
+ 8b:62:56:1b:ef:67:6f:a4:10:41:95:ad:0a:9b:e3:
+ a5:c0:b0:d2:70:76:50:30:5b:a8:e8:08:2c:7c:ed:
+ a7:a2:7a:8d:38:29:1c:ac:c7:ed:f2:7c:95:b0:95:
+ 82:7d:49:5c:38:cd:77:25:ef:bd:80:75:53:94:3c:
+ 3d:ca:63:5b:9f:15:b5:d3:1d:13:2f:19:d1:3c:db:
+ 76:3a:cc:b8:7d:c9:e5:c2:d7:da:40:6f:d8:21:dc:
+ 73:1b:42:2d:53:9c:fe:1a:fc:7d:ab:7a:36:3f:98:
+ de:84:7c:05:67:ce:6a:14:38:87:a9:f1:8c:b5:68:
+ cb:68:7f:71:20:2b:f5:a0:63:f5:56:2f:a3:26:d2:
+ b7:6f:b1:5a:17:d7:38:99:08:fe:93:58:6f:fe:c3:
+ 13:49:08:16:0b:a7:4d:67:00:52:31:67:23:4e:98:
+ ed:51:45:1d:b9:04:d9:0b:ec:d8:28:b3:4b:bd:ed:
+ 36:79
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+ X509v3 Authority Key Identifier:
+ keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+ DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
+ serial:3F:29:11:20:57:71:E7:8E:F9:18:0D:CA:70:4D:5B:15:2A:43:D6:24
+ X509v3 Basic Constraints:
+ CA:TRUE
+ X509v3 Subject Alternative Name:
+ DNS:example.com, IP Address:127.0.0.1
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication, TLS Web Client Authentication
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ 0f:ae:89:d5:68:e4:41:f8:9b:e0:c5:61:06:57:ff:a0:92:0f:
+ b2:ed:d3:99:5b:99:5e:32:7e:97:c7:af:6c:fe:8c:a6:ae:32:
+ a1:0d:ca:cd:fc:18:e5:d1:f8:20:5b:5a:38:81:46:5b:48:87:
+ a5:3f:3b:7b:c7:ea:f5:35:29:31:15:39:38:5d:48:e6:01:81:
+ 5c:5e:7c:10:f5:16:e3:59:af:44:c8:b5:8d:c1:32:23:b3:b8:
+ 12:6e:5c:8d:e6:c2:d2:41:03:eb:17:42:e2:7f:bc:00:5d:a5:
+ 31:ef:c6:48:ee:db:cc:e0:f1:56:f5:d4:ca:45:a1:59:b5:e4:
+ d7:60:9c:57:e0:a7:5a:f2:35:1e:a0:22:db:5e:1c:0c:61:bd:
+ a1:c5:7b:9f:69:f2:d5:95:e2:bc:52:b9:1d:9c:2c:da:b6:73:
+ 75:4a:84:e5:94:b8:19:4d:dd:70:bd:7f:4c:b9:17:6a:58:16:
+ 89:22:44:37:57:55:26:42:e3:b7:e5:c7:2b:40:0c:e9:e4:7f:
+ 52:75:df:06:c9:fb:01:44:34:ac:20:3c:b4:be:2b:3e:ef:85:
+ 38:96:5b:9b:1e:25:86:18:4c:a4:06:70:06:6a:c8:4b:6f:5f:
+ c4:05:1f:03:62:30:11:61:bc:c1:40:31:66:dc:64:f0:4f:6b:
+ b9:ec:c8:29
+-----BEGIN CERTIFICATE-----
+MIIE/zCCA+egAwIBAgIUPykRIFdx5475GA3KcE1bFSpD1iQwDQYJKoZIhvcNAQEL
+BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC
+b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY
+MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv
+bGZzc2wuY29tMB4XDTI1MTExMzIwNDExMVoXDTI4MDgwOTIwNDExMVowgZQxCzAJ
+BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw
+DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP
+d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvwzKLRSyHoRCW804H0ry
+TXUQ8bY1n9/KfQOY06zeA2buKvHYsH1uB1QLEJghTYDLEiDnzE/eRX3Jcncy6sqQ
+u2lSEAMvqPOVxfGLYlYb72dvpBBBla0Km+OlwLDScHZQMFuo6AgsfO2nonqNOCkc
+rMft8nyVsJWCfUlcOM13Je+9gHVTlDw9ymNbnxW10x0TLxnRPNt2Osy4fcnlwtfa
+QG/YIdxzG0ItU5z+Gvx9q3o2P5jehHwFZ85qFDiHqfGMtWjLaH9xICv1oGP1Vi+j
+JtK3b7FaF9c4mQj+k1hv/sMTSQgWC6dNZwBSMWcjTpjtUUUduQTZC+zYKLNLve02
+eQIDAQABo4IBRTCCAUEwHQYDVR0OBBYEFCeOZxF0wyYdP+0zY7Ok2B0w5ejVMIHU
+BgNVHSMEgcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYD
+VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G
+A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3
+dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU
+PykRIFdx5475GA3KcE1bFSpD1iQwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl
+eGFtcGxlLmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
+DQYJKoZIhvcNAQELBQADggEBAA+uidVo5EH4m+DFYQZX/6CSD7Lt05lbmV4yfpfH
+r2z+jKauMqENys38GOXR+CBbWjiBRltIh6U/O3vH6vU1KTEVOThdSOYBgVxefBD1
+FuNZr0TItY3BMiOzuBJuXI3mwtJBA+sXQuJ/vABdpTHvxkju28zg8Vb11MpFoVm1
+5NdgnFfgp1ryNR6gItteHAxhvaHFe59p8tWV4rxSuR2cLNq2c3VKhOWUuBlN3XC9
+f0y5F2pYFokiRDdXVSZC47flxytADOnkf1J13wbJ+wFENKwgPLS+Kz7vhTiWW5se
+JYYYTKQGcAZqyEtvX8QFHwNiMBFhvMFAMWbcZPBPa7nsxCk=
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/test/server-goodalt.pem b/test/ssl/vectors/certs/test/server-goodalt.pem
new file mode 100644
index 000000000..078732c03
--- /dev/null
+++ b/test/ssl/vectors/certs/test/server-goodalt.pem
@@ -0,0 +1,79 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 78:8e:15:da:c6:d8:82:d8:0f:65:96:64:60:9e:6d:90:71:da:cf:49
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, OU=Engineering, CN=www.nomatch.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:28 2025 GMT
+ Not After : Aug 9 20:41:28 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, OU=Engineering, CN=www.nomatch.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27:
+ 01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6:
+ f6:1c:88:bc:7c:9f:fb:a8:67:7f:fe:5c:9c:51:75:
+ f7:8a:ca:07:e7:35:2f:8f:e1:bd:7b:c0:2f:7c:ab:
+ 64:a8:17:fc:ca:5d:7b:ba:e0:21:e5:72:2e:6f:2e:
+ 86:d8:95:73:da:ac:1b:53:b9:5f:3f:d7:19:0d:25:
+ 4f:e1:63:63:51:8b:0b:64:3f:ad:43:b8:a5:1c:5c:
+ 34:b3:ae:00:a0:63:c5:f6:7f:0b:59:68:78:73:a6:
+ 8c:18:a9:02:6d:af:c3:19:01:2e:b8:10:e3:c6:cc:
+ 40:b4:69:a3:46:33:69:87:6e:c4:bb:17:a6:f3:e8:
+ dd:ad:73:bc:7b:2f:21:b5:fd:66:51:0c:bd:54:b3:
+ e1:6d:5f:1c:bc:23:73:d1:09:03:89:14:d2:10:b9:
+ 64:c3:2a:d0:a1:96:4a:bc:e1:d4:1a:5b:c7:a0:c0:
+ c1:63:78:0f:44:37:30:32:96:80:32:23:95:a1:77:
+ ba:13:d2:97:73:e2:5d:25:c9:6a:0d:c3:39:60:a4:
+ b4:b0:69:42:42:09:e9:d8:08:bc:33:20:b3:58:22:
+ a7:aa:eb:c4:e1:e6:61:83:c5:d2:96:df:d9:d0:4f:
+ ad:d7
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Alternative Name:
+ DNS:localhost
+ X509v3 Subject Key Identifier:
+ B3:11:32:C9:92:98:84:E2:C9:F8:D0:3B:6E:03:42:CA:1F:0E:8E:3C
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ 2c:6d:e6:50:9c:7c:79:c9:f0:d8:7b:0e:ca:9c:32:09:44:70:
+ b0:2b:07:05:02:3a:18:01:3a:ac:ad:53:4b:65:2f:1a:6f:c1:
+ 03:e5:86:3b:d8:a0:fe:d8:d8:89:88:3a:d6:e9:72:56:16:3b:
+ bd:d8:7e:2c:d6:ea:69:59:47:ad:cd:4a:12:42:25:65:10:eb:
+ 78:13:85:a2:65:d8:d7:c4:c3:71:80:74:c1:00:bd:b9:4e:be:
+ 2d:08:f3:a7:c4:43:6f:47:9c:c9:a6:7a:7b:38:4a:23:70:8b:
+ 61:4e:24:16:23:32:bf:d5:ba:1b:c0:7e:a6:eb:f4:01:f9:5f:
+ 60:ef:f0:42:fa:13:2d:17:ce:da:f5:da:6f:9c:b0:b6:80:0d:
+ da:03:3f:35:95:cd:83:22:11:65:dd:7a:03:68:42:ad:54:97:
+ 59:71:86:b5:74:88:99:74:1a:2f:28:46:ea:ff:8c:b9:d7:8e:
+ 4b:dc:15:75:33:f7:d6:cf:29:7e:20:7a:6a:d6:20:d9:14:85:
+ df:cb:9a:1b:3b:45:3d:86:85:b8:7e:cc:0c:43:94:88:87:44:
+ c7:8c:74:fe:d5:38:45:62:f7:89:78:2c:02:89:fa:3d:1a:1c:
+ d5:c8:2c:8a:88:df:27:03:25:4d:ce:26:be:d7:ed:7f:82:eb:
+ 0b:c4:04:34
+-----BEGIN CERTIFICATE-----
+MIIDyzCCArOgAwIBAgIUeI4V2sbYgtgPZZZkYJ5tkHHaz0kwDQYJKoZIhvcNAQEL
+BQAwgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC
+b3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEYMBYGA1UEAwwPd3d3Lm5vbWF0
+Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTI1MTEx
+MzIwNDEyOFoXDTI4MDgwOTIwNDEyOFowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI
+DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmlu
+ZzEYMBYGA1UEAwwPd3d3Lm5vbWF0Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv
+QHdvbGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwJUI
+4VdB8nFtt9JFQScBZcZFrvK8JDC4lc4vTtb2HIi8fJ/7qGd//lycUXX3isoH5zUv
+j+G9e8AvfKtkqBf8yl17uuAh5XIuby6G2JVz2qwbU7lfP9cZDSVP4WNjUYsLZD+t
+Q7ilHFw0s64AoGPF9n8LWWh4c6aMGKkCba/DGQEuuBDjxsxAtGmjRjNph27Euxem
+8+jdrXO8ey8htf1mUQy9VLPhbV8cvCNz0QkDiRTSELlkwyrQoZZKvOHUGlvHoMDB
+Y3gPRDcwMpaAMiOVoXe6E9KXc+JdJclqDcM5YKS0sGlCQgnp2Ai8MyCzWCKnquvE
+4eZhg8XSlt/Z0E+t1wIDAQABozcwNTAUBgNVHREEDTALgglsb2NhbGhvc3QwHQYD
+VR0OBBYEFLMRMsmSmITiyfjQO24DQsofDo48MA0GCSqGSIb3DQEBCwUAA4IBAQAs
+beZQnHx5yfDYew7KnDIJRHCwKwcFAjoYATqsrVNLZS8ab8ED5YY72KD+2NiJiDrW
+6XJWFju92H4s1uppWUetzUoSQiVlEOt4E4WiZdjXxMNxgHTBAL25Tr4tCPOnxENv
+R5zJpnp7OEojcIthTiQWIzK/1bobwH6m6/QB+V9g7/BC+hMtF87a9dpvnLC2gA3a
+Az81lc2DIhFl3XoDaEKtVJdZcYa1dIiZdBovKEbq/4y5145L3BV1M/fWzyl+IHpq
+1iDZFIXfy5obO0U9hoW4fswMQ5SIh0THjHT+1ThFYveJeCwCifo9GhzVyCyKiN8n
+AyVNzia+1+1/gusLxAQ0
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/test/server-goodaltwild.pem b/test/ssl/vectors/certs/test/server-goodaltwild.pem
new file mode 100644
index 000000000..e5108ab55
--- /dev/null
+++ b/test/ssl/vectors/certs/test/server-goodaltwild.pem
@@ -0,0 +1,79 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 77:f0:7a:e3:b9:07:5c:49:0d:05:03:01:ea:13:42:36:15:7f:24:f0
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, OU=Engineering, CN=www.nomatch.com, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:29 2025 GMT
+ Not After : Aug 9 20:41:29 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, OU=Engineering, CN=www.nomatch.com, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27:
+ 01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6:
+ f6:1c:88:bc:7c:9f:fb:a8:67:7f:fe:5c:9c:51:75:
+ f7:8a:ca:07:e7:35:2f:8f:e1:bd:7b:c0:2f:7c:ab:
+ 64:a8:17:fc:ca:5d:7b:ba:e0:21:e5:72:2e:6f:2e:
+ 86:d8:95:73:da:ac:1b:53:b9:5f:3f:d7:19:0d:25:
+ 4f:e1:63:63:51:8b:0b:64:3f:ad:43:b8:a5:1c:5c:
+ 34:b3:ae:00:a0:63:c5:f6:7f:0b:59:68:78:73:a6:
+ 8c:18:a9:02:6d:af:c3:19:01:2e:b8:10:e3:c6:cc:
+ 40:b4:69:a3:46:33:69:87:6e:c4:bb:17:a6:f3:e8:
+ dd:ad:73:bc:7b:2f:21:b5:fd:66:51:0c:bd:54:b3:
+ e1:6d:5f:1c:bc:23:73:d1:09:03:89:14:d2:10:b9:
+ 64:c3:2a:d0:a1:96:4a:bc:e1:d4:1a:5b:c7:a0:c0:
+ c1:63:78:0f:44:37:30:32:96:80:32:23:95:a1:77:
+ ba:13:d2:97:73:e2:5d:25:c9:6a:0d:c3:39:60:a4:
+ b4:b0:69:42:42:09:e9:d8:08:bc:33:20:b3:58:22:
+ a7:aa:eb:c4:e1:e6:61:83:c5:d2:96:df:d9:d0:4f:
+ ad:d7
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Alternative Name:
+ DNS:*localhost
+ X509v3 Subject Key Identifier:
+ B3:11:32:C9:92:98:84:E2:C9:F8:D0:3B:6E:03:42:CA:1F:0E:8E:3C
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ 9a:1e:e4:0b:44:ea:1a:c9:4d:15:ca:f6:c2:2a:5d:1a:e9:64:
+ 15:1c:83:d4:ba:7e:40:0b:fe:25:60:dc:53:66:58:a8:77:37:
+ ab:c3:46:68:72:92:70:10:35:da:d2:f0:bb:74:bb:98:06:3b:
+ 1e:76:e7:36:d1:7d:4b:d0:4b:c9:73:8e:e6:f9:2c:f6:33:c1:
+ 39:f8:a1:85:95:9f:82:18:76:b8:f3:c9:85:5e:f0:ac:eb:5c:
+ aa:46:ab:04:06:49:8a:1c:1c:6d:ab:02:fc:58:85:39:34:97:
+ 2d:39:88:6d:f1:d1:c6:eb:fc:6e:f1:e7:47:4e:63:ad:8b:96:
+ a7:92:ce:64:d5:1a:70:ac:01:21:b2:41:10:cb:bf:bc:bb:5b:
+ c6:20:4b:db:28:40:78:93:a8:df:92:73:44:41:ab:2e:76:df:
+ 1e:2e:20:9f:82:24:79:3b:05:ce:3c:00:6c:bc:67:43:2e:fc:
+ 16:42:1a:b0:6f:2d:bf:55:61:32:4a:c1:64:a6:56:42:56:29:
+ 19:6b:12:cb:84:27:0e:5f:92:b4:e5:11:60:71:38:1b:45:4b:
+ eb:29:69:b7:44:0b:e9:79:cd:54:d8:32:d5:77:ed:53:21:c1:
+ 7e:1c:ec:04:fb:25:09:34:dc:a7:8b:9e:38:8b:b3:ff:95:5e:
+ 93:81:7c:72
+-----BEGIN CERTIFICATE-----
+MIIDzDCCArSgAwIBAgIUd/B647kHXEkNBQMB6hNCNhV/JPAwDQYJKoZIhvcNAQEL
+BQAwgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC
+b3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEYMBYGA1UEAwwPd3d3Lm5vbWF0
+Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTI1MTEx
+MzIwNDEyOVoXDTI4MDgwOTIwNDEyOVowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI
+DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmlu
+ZzEYMBYGA1UEAwwPd3d3Lm5vbWF0Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv
+QHdvbGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwJUI
+4VdB8nFtt9JFQScBZcZFrvK8JDC4lc4vTtb2HIi8fJ/7qGd//lycUXX3isoH5zUv
+j+G9e8AvfKtkqBf8yl17uuAh5XIuby6G2JVz2qwbU7lfP9cZDSVP4WNjUYsLZD+t
+Q7ilHFw0s64AoGPF9n8LWWh4c6aMGKkCba/DGQEuuBDjxsxAtGmjRjNph27Euxem
+8+jdrXO8ey8htf1mUQy9VLPhbV8cvCNz0QkDiRTSELlkwyrQoZZKvOHUGlvHoMDB
+Y3gPRDcwMpaAMiOVoXe6E9KXc+JdJclqDcM5YKS0sGlCQgnp2Ai8MyCzWCKnquvE
+4eZhg8XSlt/Z0E+t1wIDAQABozgwNjAVBgNVHREEDjAMggoqbG9jYWxob3N0MB0G
+A1UdDgQWBBSzETLJkpiE4sn40DtuA0LKHw6OPDANBgkqhkiG9w0BAQsFAAOCAQEA
+mh7kC0TqGslNFcr2wipdGulkFRyD1Lp+QAv+JWDcU2ZYqHc3q8NGaHKScBA12tLw
+u3S7mAY7HnbnNtF9S9BLyXOO5vks9jPBOfihhZWfghh2uPPJhV7wrOtcqkarBAZJ
+ihwcbasC/FiFOTSXLTmIbfHRxuv8bvHnR05jrYuWp5LOZNUacKwBIbJBEMu/vLtb
+xiBL2yhAeJOo35JzREGrLnbfHi4gn4IkeTsFzjwAbLxnQy78FkIasG8tv1VhMkrB
+ZKZWQlYpGWsSy4QnDl+StOURYHE4G0VL6ylpt0QL6XnNVNgy1XftUyHBfhzsBPsl
+CTTcp4ueOIuz/5Vek4F8cg==
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/test/server-goodcn.pem b/test/ssl/vectors/certs/test/server-goodcn.pem
new file mode 100644
index 000000000..7c8a0f52a
--- /dev/null
+++ b/test/ssl/vectors/certs/test/server-goodcn.pem
@@ -0,0 +1,76 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 42:82:bd:f1:a2:49:28:42:27:94:65:7f:2a:e0:6a:3e:18:e4:6d:d1
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, OU=Engineering, CN=localhost, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:27 2025 GMT
+ Not After : Aug 9 20:41:27 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, OU=Engineering, CN=localhost, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27:
+ 01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6:
+ f6:1c:88:bc:7c:9f:fb:a8:67:7f:fe:5c:9c:51:75:
+ f7:8a:ca:07:e7:35:2f:8f:e1:bd:7b:c0:2f:7c:ab:
+ 64:a8:17:fc:ca:5d:7b:ba:e0:21:e5:72:2e:6f:2e:
+ 86:d8:95:73:da:ac:1b:53:b9:5f:3f:d7:19:0d:25:
+ 4f:e1:63:63:51:8b:0b:64:3f:ad:43:b8:a5:1c:5c:
+ 34:b3:ae:00:a0:63:c5:f6:7f:0b:59:68:78:73:a6:
+ 8c:18:a9:02:6d:af:c3:19:01:2e:b8:10:e3:c6:cc:
+ 40:b4:69:a3:46:33:69:87:6e:c4:bb:17:a6:f3:e8:
+ dd:ad:73:bc:7b:2f:21:b5:fd:66:51:0c:bd:54:b3:
+ e1:6d:5f:1c:bc:23:73:d1:09:03:89:14:d2:10:b9:
+ 64:c3:2a:d0:a1:96:4a:bc:e1:d4:1a:5b:c7:a0:c0:
+ c1:63:78:0f:44:37:30:32:96:80:32:23:95:a1:77:
+ ba:13:d2:97:73:e2:5d:25:c9:6a:0d:c3:39:60:a4:
+ b4:b0:69:42:42:09:e9:d8:08:bc:33:20:b3:58:22:
+ a7:aa:eb:c4:e1:e6:61:83:c5:d2:96:df:d9:d0:4f:
+ ad:d7
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ B3:11:32:C9:92:98:84:E2:C9:F8:D0:3B:6E:03:42:CA:1F:0E:8E:3C
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ a1:03:8f:c0:51:fa:a2:7c:78:0a:af:68:e3:04:e5:0c:f4:af:
+ 02:64:62:e7:2b:8a:96:1d:2c:c3:1a:f1:11:6f:ad:f8:aa:4e:
+ 25:37:ac:e3:f6:93:24:6f:c9:65:6f:62:63:0c:9d:cd:16:19:
+ 4b:1a:a8:a2:32:65:fe:2a:87:08:85:a0:b5:fa:71:4d:60:91:
+ 39:e7:30:80:e8:75:17:bf:31:50:5b:be:b2:65:3d:5c:ce:39:
+ f5:ab:90:b1:38:85:74:53:70:f3:75:90:c1:a3:c3:8f:67:7d:
+ 05:25:5f:f6:04:3e:9a:18:15:29:7d:9f:90:75:1d:7b:c0:5b:
+ cb:48:21:c7:7c:1c:ec:12:82:08:19:15:bb:65:7a:40:e7:a9:
+ 4f:e7:84:b6:1b:2b:88:03:e2:23:ef:cf:77:59:95:fc:00:bb:
+ 09:41:b3:d1:77:fd:9d:fa:47:8b:23:22:dc:44:a8:b6:db:dc:
+ fa:1c:55:31:da:90:16:26:3d:89:34:21:5c:3e:b6:31:5d:d3:
+ 85:9d:c1:dd:ec:cb:0a:d9:2e:2e:6c:7f:e6:8d:09:c9:a9:c6:
+ a9:e6:10:e4:22:b3:90:4f:bb:10:5d:ef:c2:1b:8b:84:6b:4e:
+ 08:8d:17:e9:df:46:2c:21:ac:13:79:04:2e:6b:b7:d5:da:67:
+ e5:3d:93:15
+-----BEGIN CERTIFICATE-----
+MIIDpzCCAo+gAwIBAgIUQoK98aJJKEInlGV/KuBqPhjkbdEwDQYJKoZIhvcNAQEL
+BQAwfDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv
+emVtYW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRIwEAYDVQQDDAlsb2NhbGhvc3Qx
+HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjUxMTEzMjA0MTI3
+WhcNMjgwODA5MjA0MTI3WjB8MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFu
+YTEQMA4GA1UEBwwHQm96ZW1hbjEUMBIGA1UECwwLRW5naW5lZXJpbmcxEjAQBgNV
+BAMMCWxvY2FsaG9zdDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMCVCOFXQfJxbbfSRUEnAWXG
+Ra7yvCQwuJXOL07W9hyIvHyf+6hnf/5cnFF194rKB+c1L4/hvXvAL3yrZKgX/Mpd
+e7rgIeVyLm8uhtiVc9qsG1O5Xz/XGQ0lT+FjY1GLC2Q/rUO4pRxcNLOuAKBjxfZ/
+C1loeHOmjBipAm2vwxkBLrgQ48bMQLRpo0YzaYduxLsXpvPo3a1zvHsvIbX9ZlEM
+vVSz4W1fHLwjc9EJA4kU0hC5ZMMq0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3
+uhPSl3PiXSXJag3DOWCktLBpQkIJ6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcC
+AwEAAaMhMB8wHQYDVR0OBBYEFLMRMsmSmITiyfjQO24DQsofDo48MA0GCSqGSIb3
+DQEBCwUAA4IBAQChA4/AUfqifHgKr2jjBOUM9K8CZGLnK4qWHSzDGvERb634qk4l
+N6zj9pMkb8llb2JjDJ3NFhlLGqiiMmX+KocIhaC1+nFNYJE55zCA6HUXvzFQW76y
+ZT1czjn1q5CxOIV0U3DzdZDBo8OPZ30FJV/2BD6aGBUpfZ+QdR17wFvLSCHHfBzs
+EoIIGRW7ZXpA56lP54S2GyuIA+Ij7893WZX8ALsJQbPRd/2d+keLIyLcRKi229z6
+HFUx2pAWJj2JNCFcPrYxXdOFncHd7MsK2S4ubH/mjQnJqcap5hDkIrOQT7sQXe/C
+G4uEa04IjRfp30YsIawTeQQua7fV2mflPZMV
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/test/server-goodcnwild.pem b/test/ssl/vectors/certs/test/server-goodcnwild.pem
new file mode 100644
index 000000000..db0b94aa5
--- /dev/null
+++ b/test/ssl/vectors/certs/test/server-goodcnwild.pem
@@ -0,0 +1,76 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 11:4c:a8:ce:f8:a7:2e:27:82:b2:60:85:a5:c2:bf:09:a2:23:e9:a4
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, OU=Engineering, CN=*localhost, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:29 2025 GMT
+ Not After : Aug 9 20:41:29 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, OU=Engineering, CN=*localhost, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27:
+ 01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6:
+ f6:1c:88:bc:7c:9f:fb:a8:67:7f:fe:5c:9c:51:75:
+ f7:8a:ca:07:e7:35:2f:8f:e1:bd:7b:c0:2f:7c:ab:
+ 64:a8:17:fc:ca:5d:7b:ba:e0:21:e5:72:2e:6f:2e:
+ 86:d8:95:73:da:ac:1b:53:b9:5f:3f:d7:19:0d:25:
+ 4f:e1:63:63:51:8b:0b:64:3f:ad:43:b8:a5:1c:5c:
+ 34:b3:ae:00:a0:63:c5:f6:7f:0b:59:68:78:73:a6:
+ 8c:18:a9:02:6d:af:c3:19:01:2e:b8:10:e3:c6:cc:
+ 40:b4:69:a3:46:33:69:87:6e:c4:bb:17:a6:f3:e8:
+ dd:ad:73:bc:7b:2f:21:b5:fd:66:51:0c:bd:54:b3:
+ e1:6d:5f:1c:bc:23:73:d1:09:03:89:14:d2:10:b9:
+ 64:c3:2a:d0:a1:96:4a:bc:e1:d4:1a:5b:c7:a0:c0:
+ c1:63:78:0f:44:37:30:32:96:80:32:23:95:a1:77:
+ ba:13:d2:97:73:e2:5d:25:c9:6a:0d:c3:39:60:a4:
+ b4:b0:69:42:42:09:e9:d8:08:bc:33:20:b3:58:22:
+ a7:aa:eb:c4:e1:e6:61:83:c5:d2:96:df:d9:d0:4f:
+ ad:d7
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ B3:11:32:C9:92:98:84:E2:C9:F8:D0:3B:6E:03:42:CA:1F:0E:8E:3C
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ 4a:47:47:f0:f6:8e:ed:e1:65:15:68:43:d7:64:b5:9f:8a:8d:
+ 8a:4a:da:6f:68:22:44:9d:1e:77:33:be:60:df:af:e1:14:24:
+ 55:47:82:c3:b4:9c:2b:0d:69:64:d0:c9:d0:ef:19:a8:c0:54:
+ 3d:39:6b:69:6c:09:9d:5b:3c:7d:f6:18:22:6a:68:16:bb:dc:
+ b0:01:ab:ed:94:e7:17:4c:8e:52:13:0f:dc:bc:b3:9f:9e:87:
+ 36:01:e5:e9:71:d5:19:5e:47:7c:b5:9d:42:72:67:17:26:31:
+ 40:54:f8:dd:1e:f9:76:2b:e5:88:cd:5f:07:8f:94:cb:c7:2a:
+ 0b:0b:69:4d:b6:6b:27:07:0e:55:a2:56:f9:db:57:95:c6:28:
+ 50:8b:bc:28:85:9b:b7:41:d7:fe:e3:1d:33:84:91:aa:55:e1:
+ f8:09:11:29:f1:0f:92:ae:d9:c9:5f:a3:98:5b:2a:09:93:45:
+ 09:92:cb:58:e7:6e:e1:2a:2d:e7:70:17:f7:e5:14:0e:b8:89:
+ 83:c3:ce:16:41:7a:0f:bb:99:ec:f5:b7:3b:c0:39:8a:74:00:
+ b6:8f:dd:28:d4:85:c3:af:a4:fb:a3:b3:7d:e0:ea:66:c6:8f:
+ 4d:e2:a6:a0:f0:1a:de:5f:b1:bd:cb:28:8c:c0:9a:71:84:3a:
+ d1:0f:c4:d1
+-----BEGIN CERTIFICATE-----
+MIIDqTCCApGgAwIBAgIUEUyozvinLieCsmCFpcK/CaIj6aQwDQYJKoZIhvcNAQEL
+BQAwfTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv
+emVtYW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRMwEQYDVQQDDAoqbG9jYWxob3N0
+MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTI1MTExMzIwNDEy
+OVoXDTI4MDgwOTIwNDEyOVowfTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh
+bmExEDAOBgNVBAcMB0JvemVtYW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRMwEQYD
+VQQDDAoqbG9jYWxob3N0MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwJUI4VdB8nFtt9JFQScB
+ZcZFrvK8JDC4lc4vTtb2HIi8fJ/7qGd//lycUXX3isoH5zUvj+G9e8AvfKtkqBf8
+yl17uuAh5XIuby6G2JVz2qwbU7lfP9cZDSVP4WNjUYsLZD+tQ7ilHFw0s64AoGPF
+9n8LWWh4c6aMGKkCba/DGQEuuBDjxsxAtGmjRjNph27Euxem8+jdrXO8ey8htf1m
+UQy9VLPhbV8cvCNz0QkDiRTSELlkwyrQoZZKvOHUGlvHoMDBY3gPRDcwMpaAMiOV
+oXe6E9KXc+JdJclqDcM5YKS0sGlCQgnp2Ai8MyCzWCKnquvE4eZhg8XSlt/Z0E+t
+1wIDAQABoyEwHzAdBgNVHQ4EFgQUsxEyyZKYhOLJ+NA7bgNCyh8OjjwwDQYJKoZI
+hvcNAQELBQADggEBAEpHR/D2ju3hZRVoQ9dktZ+KjYpK2m9oIkSdHnczvmDfr+EU
+JFVHgsO0nCsNaWTQydDvGajAVD05a2lsCZ1bPH32GCJqaBa73LABq+2U5xdMjlIT
+D9y8s5+ehzYB5elx1RleR3y1nUJyZxcmMUBU+N0e+XYr5YjNXwePlMvHKgsLaU22
+aycHDlWiVvnbV5XGKFCLvCiFm7dB1/7jHTOEkapV4fgJESnxD5Ku2clfo5hbKgmT
+RQmSy1jnbuEqLedwF/flFA64iYPDzhZBeg+7mez1tzvAOYp0ALaP3SjUhcOvpPuj
+s33g6mbGj03ipqDwGt5fsb3LKIzAmnGEOtEPxNE=
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/certs/test/server-localhost.pem b/test/ssl/vectors/certs/test/server-localhost.pem
new file mode 100644
index 000000000..0dcfabd3b
--- /dev/null
+++ b/test/ssl/vectors/certs/test/server-localhost.pem
@@ -0,0 +1,79 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 21:0e:4e:8a:39:de:07:ee:c4:06:ef:e7:28:81:47:e7:2b:13:42:52
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C=US, ST=Montana, L=Bozeman, OU=Engineering, CN=localhost, emailAddress=info@wolfssl.com
+ Validity
+ Not Before: Nov 13 20:41:32 2025 GMT
+ Not After : Aug 9 20:41:32 2028 GMT
+ Subject: C=US, ST=Montana, L=Bozeman, OU=Engineering, CN=localhost, emailAddress=info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27:
+ 01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6:
+ f6:1c:88:bc:7c:9f:fb:a8:67:7f:fe:5c:9c:51:75:
+ f7:8a:ca:07:e7:35:2f:8f:e1:bd:7b:c0:2f:7c:ab:
+ 64:a8:17:fc:ca:5d:7b:ba:e0:21:e5:72:2e:6f:2e:
+ 86:d8:95:73:da:ac:1b:53:b9:5f:3f:d7:19:0d:25:
+ 4f:e1:63:63:51:8b:0b:64:3f:ad:43:b8:a5:1c:5c:
+ 34:b3:ae:00:a0:63:c5:f6:7f:0b:59:68:78:73:a6:
+ 8c:18:a9:02:6d:af:c3:19:01:2e:b8:10:e3:c6:cc:
+ 40:b4:69:a3:46:33:69:87:6e:c4:bb:17:a6:f3:e8:
+ dd:ad:73:bc:7b:2f:21:b5:fd:66:51:0c:bd:54:b3:
+ e1:6d:5f:1c:bc:23:73:d1:09:03:89:14:d2:10:b9:
+ 64:c3:2a:d0:a1:96:4a:bc:e1:d4:1a:5b:c7:a0:c0:
+ c1:63:78:0f:44:37:30:32:96:80:32:23:95:a1:77:
+ ba:13:d2:97:73:e2:5d:25:c9:6a:0d:c3:39:60:a4:
+ b4:b0:69:42:42:09:e9:d8:08:bc:33:20:b3:58:22:
+ a7:aa:eb:c4:e1:e6:61:83:c5:d2:96:df:d9:d0:4f:
+ ad:d7
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Alternative Name:
+ DNS:localhost
+ X509v3 Subject Key Identifier:
+ B3:11:32:C9:92:98:84:E2:C9:F8:D0:3B:6E:03:42:CA:1F:0E:8E:3C
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ a6:97:75:8b:75:a5:53:95:c2:cf:d5:0f:68:b6:29:bb:70:89:
+ 84:24:52:1a:7e:b1:3e:b1:c6:0a:ab:41:0a:93:db:d3:b5:ce:
+ ab:e9:1b:f3:ed:4f:e9:23:30:29:e9:65:7a:b2:c0:2b:bc:de:
+ 31:ca:06:90:42:3c:ba:09:e7:b7:f8:c8:1c:22:81:14:b7:f0:
+ 1e:3b:d8:03:4c:6e:0e:40:f4:a2:dd:57:69:fb:4b:b9:5e:67:
+ 5d:8e:b6:d4:d5:91:b1:12:d8:1a:8c:3c:2b:06:b0:91:b2:53:
+ 84:49:ca:b3:ad:0b:d1:8d:03:91:14:c8:58:1c:9b:30:5c:8d:
+ a0:20:6d:04:14:95:e8:b3:fe:69:9a:b1:22:44:d6:14:e6:a2:
+ 89:28:25:0e:f0:23:fd:af:44:d7:57:6e:8f:32:a5:41:5b:98:
+ cb:d6:9f:b6:20:17:fa:f6:ef:75:86:c4:f9:10:95:55:27:ba:
+ bc:e9:78:d1:c6:4b:e3:3b:9b:22:97:71:0e:86:f8:ac:10:68:
+ 19:a7:ad:e2:62:11:f0:13:0b:77:c5:09:b1:2d:ec:43:34:59:
+ 54:13:bc:48:bb:1a:3e:59:7e:d6:38:98:c6:90:5a:58:46:c3:
+ 06:24:62:c2:e0:c2:84:4a:f7:4b:e9:22:36:a1:eb:10:40:cf:
+ 48:5b:5b:5f
+-----BEGIN CERTIFICATE-----
+MIIDvTCCAqWgAwIBAgIUIQ5OijneB+7EBu/nKIFH5ysTQlIwDQYJKoZIhvcNAQEL
+BQAwfDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv
+emVtYW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRIwEAYDVQQDDAlsb2NhbGhvc3Qx
+HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjUxMTEzMjA0MTMy
+WhcNMjgwODA5MjA0MTMyWjB8MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFu
+YTEQMA4GA1UEBwwHQm96ZW1hbjEUMBIGA1UECwwLRW5naW5lZXJpbmcxEjAQBgNV
+BAMMCWxvY2FsaG9zdDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMCVCOFXQfJxbbfSRUEnAWXG
+Ra7yvCQwuJXOL07W9hyIvHyf+6hnf/5cnFF194rKB+c1L4/hvXvAL3yrZKgX/Mpd
+e7rgIeVyLm8uhtiVc9qsG1O5Xz/XGQ0lT+FjY1GLC2Q/rUO4pRxcNLOuAKBjxfZ/
+C1loeHOmjBipAm2vwxkBLrgQ48bMQLRpo0YzaYduxLsXpvPo3a1zvHsvIbX9ZlEM
+vVSz4W1fHLwjc9EJA4kU0hC5ZMMq0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3
+uhPSl3PiXSXJag3DOWCktLBpQkIJ6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcC
+AwEAAaM3MDUwFAYDVR0RBA0wC4IJbG9jYWxob3N0MB0GA1UdDgQWBBSzETLJkpiE
+4sn40DtuA0LKHw6OPDANBgkqhkiG9w0BAQsFAAOCAQEAppd1i3WlU5XCz9UPaLYp
+u3CJhCRSGn6xPrHGCqtBCpPb07XOq+kb8+1P6SMwKellerLAK7zeMcoGkEI8ugnn
+t/jIHCKBFLfwHjvYA0xuDkD0ot1XaftLuV5nXY621NWRsRLYGow8KwawkbJThEnK
+s60L0Y0DkRTIWBybMFyNoCBtBBSV6LP+aZqxIkTWFOaiiSglDvAj/a9E11dujzKl
+QVuYy9aftiAX+vbvdYbE+RCVVSe6vOl40cZL4zubIpdxDob4rBBoGaet4mIR8BML
+d8UJsS3sQzRZVBO8SLsaPll+1jiYxpBaWEbDBiRiwuDChEr3S+kiNqHrEEDPSFtb
+Xw==
+-----END CERTIFICATE-----
diff --git a/test/ssl/vectors/tests/test-chains.conf b/test/ssl/vectors/tests/test-chains.conf
new file mode 100644
index 000000000..cf99d214d
--- /dev/null
+++ b/test/ssl/vectors/tests/test-chains.conf
@@ -0,0 +1,384 @@
+# Tests will use complete chain with intermediate CA for testing
+# The tests with chains have the CRL checking disabled
+# CRL's only load for trusted CA's, for a chain you must load the root and intermediate as trusted
+# For these tests we are loading root and sending intermediate and peer certs
+# server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Chain
+-v 3
+-l DHE-RSA-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/server-key.pem
+-c ./certs/intermediate/server-chain.pem
+-V
+
+# client TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Chain
+-v 3
+-l DHE-RSA-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/client-key.pem
+-c ./certs/intermediate/client-chain.pem
+-C
+
+# server TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Chain
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/server-key.pem
+-c ./certs/intermediate/server-chain.pem
+-V
+
+# client TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Chain
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/client-key.pem
+-c ./certs/intermediate/client-chain.pem
+-C
+
+# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Chain
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-k ./certs/ecc-key.pem
+-c ./certs/intermediate/server-chain-ecc.pem
+-V
+
+# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Chain
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-k ./certs/ecc-client-key.pem
+-c ./certs/intermediate/client-chain-ecc.pem
+-C
+
+# server TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/test-pathlen/chainA-entity-key.pem
+-c ./certs/test-pathlen/chainA-assembled.pem
+-V
+
+# client TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-C
+
+# server TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/test-pathlen/chainB-entity-key.pem
+-c ./certs/test-pathlen/chainB-assembled.pem
+-V
+
+# client TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-C
+
+# server TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/test-pathlen/chainC-entity-key.pem
+-c ./certs/test-pathlen/chainC-assembled.pem
+-V
+
+# client TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-C
+
+# server TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/test-pathlen/chainD-entity-key.pem
+-c ./certs/test-pathlen/chainD-assembled.pem
+-V
+
+# client TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-C
+
+# server TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/test-pathlen/chainE-entity-key.pem
+-c ./certs/test-pathlen/chainE-assembled.pem
+-H exitWithRet
+-V
+
+# client TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-H exitWithRet
+-C
+
+# server TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/test-pathlen/chainF-entity-key.pem
+-c ./certs/test-pathlen/chainF-assembled.pem
+-H exitWithRet
+-V
+
+# client TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-H exitWithRet
+-C
+
+# server TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/test-pathlen/chainG-entity-key.pem
+-c ./certs/test-pathlen/chainG-assembled.pem
+-V
+
+# client TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-C
+
+# server TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/test-pathlen/chainH-entity-key.pem
+-c ./certs/test-pathlen/chainH-assembled.pem
+-H exitWithRet
+-V
+
+# client TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-H exitWithRet
+-C
+
+# server TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/test-pathlen/chainI-entity-key.pem
+-c ./certs/test-pathlen/chainI-assembled.pem
+-V
+
+# client TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-C
+
+# server TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/test-pathlen/chainJ-entity-key.pem
+-c ./certs/test-pathlen/chainJ-assembled.pem
+-H exitWithRet
+-V
+
+# client TLSv1.2 pathLen constraint test
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-H exitWithRet
+-C
+
+# server TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Chain
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/server-key.pem
+-c ./certs/intermediate/server-chain.pem
+-V
+
+# client TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Chain
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/client-key.pem
+-c ./certs/intermediate/client-chain.pem
+-C
+
+# server TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Chain
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-k ./certs/ecc-key.pem
+-c ./certs/intermediate/server-chain-ecc.pem
+-V
+
+# client TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Chain
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-k ./certs/ecc-client-key.pem
+-c ./certs/intermediate/client-chain-ecc.pem
+-C
+
+# Test will load intermediate CA as trusted and only present the peer cert (partial chain)
+# server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Partial Chain
+-v 3
+-l DHE-RSA-AES128-GCM-SHA256
+-A ./certs/intermediate/ca-int2-cert.pem
+-k ./certs/server-key.pem
+-c ./certs/intermediate/server-int-cert.pem
+-V
+
+# client TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Partial Chain
+-v 3
+-l DHE-RSA-AES128-GCM-SHA256
+-A ./certs/intermediate/ca-int2-cert.pem
+-k ./certs/client-key.pem
+-c ./certs/intermediate/client-int-cert.pem
+-C
+
+# server TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Partial Chain
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-A ./certs/intermediate/ca-int2-cert.pem
+-k ./certs/server-key.pem
+-c ./certs/intermediate/server-int-cert.pem
+-V
+
+# client TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Partial Chain
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-A ./certs/intermediate/ca-int2-cert.pem
+-k ./certs/client-key.pem
+-c ./certs/intermediate/client-int-cert.pem
+-C
+
+# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Partial Chain
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-A ./certs/intermediate/ca-int2-ecc-cert.pem
+-k ./certs/ecc-key.pem
+-c ./certs/intermediate/server-int-ecc-cert.pem
+-V
+
+# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Partial Chain
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-A ./certs/intermediate/ca-int2-ecc-cert.pem
+-k ./certs/ecc-client-key.pem
+-c ./certs/intermediate/client-int-ecc-cert.pem
+-C
+
+# server TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Partial Chain
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/intermediate/ca-int2-cert.pem
+-k ./certs/server-key.pem
+-c ./certs/intermediate/server-int-cert.pem
+-V
+
+# client TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Partial Chain
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/intermediate/ca-int2-cert.pem
+-k ./certs/client-key.pem
+-c ./certs/intermediate/client-int-cert.pem
+-C
+
+# server TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Partial Chain
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/intermediate/ca-int2-ecc-cert.pem
+-k ./certs/ecc-key.pem
+-c ./certs/intermediate/server-int-ecc-cert.pem
+-V
+
+# client TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Partial Chain
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/intermediate/ca-int2-ecc-cert.pem
+-k ./certs/ecc-client-key.pem
+-c ./certs/intermediate/client-int-ecc-cert.pem
+-C
+
+# Test will use alternate chain where chain contains extra cert
+# These tests should fail
+# server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Alt Chain Fail
+-v 3
+-l DHE-RSA-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/server-key.pem
+-c ./certs/intermediate/server-chain-alt.pem
+-H exitWithRet
+-V
+
+# client TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Alt Chain Fail
+-v 3
+-l DHE-RSA-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/client-key.pem
+-c ./certs/intermediate/client-chain-alt.pem
+-H exitWithRet
+-C
+
+# server TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Alt Chain Fail
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/server-key.pem
+-c ./certs/intermediate/server-chain-alt.pem
+-H exitWithRet
+-V
+
+# client TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Alt Chain Fail
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/client-key.pem
+-c ./certs/intermediate/client-chain-alt.pem
+-H exitWithRet
+-C
+
+# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Alt Chain Fail
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-k ./certs/ecc-key.pem
+-c ./certs/intermediate/server-chain-alt-ecc.pem
+-H exitWithRet
+-V
+
+# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Alt Chain Fail
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-k ./certs/ecc-client-key.pem
+-c ./certs/intermediate/client-chain-alt-ecc.pem
+-H exitWithRet
+-C
+
+# server TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Alt Chain Fail
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/server-key.pem
+-c ./certs/intermediate/server-chain-alt.pem
+-H exitWithRet
+-V
+
+# client TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Alt Chain Fail
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-cert.pem
+-k ./certs/client-key.pem
+-c ./certs/intermediate/client-chain-alt.pem
+-H exitWithRet
+-C
+
+# server TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Alt Chain Fail
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-k ./certs/ecc-key.pem
+-c ./certs/intermediate/server-chain-alt-ecc.pem
+-H exitWithRet
+-V
+
+# client TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Alt Chain Fail
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-k ./certs/ecc-client-key.pem
+-c ./certs/intermediate/client-chain-alt-ecc.pem
+-H exitWithRet
+-C
diff --git a/test/ssl/vectors/tests/test-dhprime.conf b/test/ssl/vectors/tests/test-dhprime.conf
new file mode 100644
index 000000000..f43739ed0
--- /dev/null
+++ b/test/ssl/vectors/tests/test-dhprime.conf
@@ -0,0 +1,25 @@
+# server TLSv1.2 DHE AES128 (DHE prime test)
+-v 3
+-l DHE-RSA-AES128-SHA
+
+# client TLSv1.2 DHE AES128 (DHE prime test)
+-v 3
+-l DHE-RSA-AES128-SHA
+
+# server TLSv1.2 DHE AES256-SHA256 (DHE prime test)
+-v 3
+-l DHE-RSA-AES256-SHA256
+
+# client TLSv1.2 DHE AES256-SHA256 (DHE prime test)
+-v 3
+-l DHE-RSA-AES256-SHA256
+
+# server TLSv1.2 DHE-PSK-AES128-CBC-SHA256 (DHE prime test)
+-s
+-v 3
+-l DHE-PSK-AES128-CBC-SHA256
+
+# client TLSv1.2 DHE-PSK-AES128-CBC-SHA256 (DHE prime test)
+-s
+-v 3
+-l DHE-PSK-AES128-CBC-SHA256
diff --git a/test/ssl/vectors/tests/test-fails.conf b/test/ssl/vectors/tests/test-fails.conf
new file mode 100644
index 000000000..66edd321b
--- /dev/null
+++ b/test/ssl/vectors/tests/test-fails.conf
@@ -0,0 +1,214 @@
+# server bad certificate common name has null
+# DG: Have not found a way to properly encode null in common name
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/server-key.pem
+-c ./certs/test/server-badcnnull.pem
+-d
+
+# client bad certificate common name has null
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-h localhost
+-A ./certs/test/server-badcnnull.pem
+-m
+-x
+
+# server bad certificate alternate name has null
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/server-key.pem
+-c ./certs/test/server-badaltnull.pem
+-d
+
+# client bad certificate alternate name has null
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-h localhost
+-A ./certs/test/server-badaltnull.pem
+-m
+-x
+
+# server nomatch common name
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/server-key.pem
+-c ./certs/test/server-badcn.pem
+-d
+
+# client nomatch common name
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-h localhost
+-A ./certs/test/server-badcn.pem
+-m
+-x
+
+# server nomatch alternate name
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/server-key.pem
+-c ./certs/test/server-badaltname.pem
+-d
+
+# client nomatch alternate name
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-h localhost
+-A ./certs/test/server-badaltname.pem
+-m
+-x
+
+# server RSA no signer error
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+
+# client RSA no signer error
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-A ./certs/client-cert.pem
+
+# server ECC no signer error
+#-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client ECC no signer error
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-A ./certs/client-ecc-cert.pem
+
+# server RSA bad sig error
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-c ./certs/test/server-cert-rsa-badsig.pem
+
+# client RSA bad sig error
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+
+# server ECC bad sig error
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-c ./certs/test/server-cert-ecc-badsig.pem
+
+# client ECC bad sig error
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+
+# server missing CN from alternate names list
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-c ./certs/test/server-garbage.pem
+
+# client missing CN from alternate names list
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-h localhost
+-A ./certs/test/server-garbage.pem
+-m
+
+# Verify Callback Failure Tests
+# no error going into callback, return error
+# server
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-H verifyFail
+
+# client verify should fail
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-H verifyFail
+
+# server verify should fail
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-H verifyFail
+
+# client
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-H verifyFail
+
+# server
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-H verifyFail
+
+# client verify should fail
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-H verifyFail
+
+# server verify should fail
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-H verifyFail
+
+# client
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-H verifyFail
+
+# error going into callback, return error
+# server
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-c ./certs/test/server-cert-rsa-badsig.pem
+-k ./certs/server-key.pem
+-H verifyFail
+
+# client verify should fail
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-H verifyFail
+
+# server
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-c ./certs/test/server-cert-ecc-badsig.pem
+-k ./certs/ecc-key.pem
+-H verifyFail
+
+# client verify should fail
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-H verifyFail
+
+# Client is using RSA certificate with ECDSA cipher suite. Server will fail.
+# server
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+-A ./certs/client-cert.pem
+-H exitWithRet
+
+# client
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-c ./certs/client-cert.pem
+-k ./certs/client-key.pem
+-A ./certs/ca-ecc-cert.pem
+-H exitWithRet
+
+# server send alert on no mutual authentication
+-v 3
+-F
+-H verifyFail
+
+# client send alert on no mutual authentication
+-v 3
+-x
+-H verifyFail
+
+# server TLSv1.3 fail on no client certificate
+# server always sets WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT unless using -d
+-v 4
+-l TLS13-AES128-GCM-SHA256
+
+# client TLSv1.3 no client certificate
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-x
diff --git a/test/ssl/vectors/tests/test-tls13-down.conf b/test/ssl/vectors/tests/test-tls13-down.conf
new file mode 100644
index 000000000..3b388a026
--- /dev/null
+++ b/test/ssl/vectors/tests/test-tls13-down.conf
@@ -0,0 +1,128 @@
+# THIS TEST IS BROKEN
+# server TLSv1.3 downgrade
+#-v d
+#-l TLS13-CHACHA20-POLY1305-SHA256
+
+# client TLSv1.2
+#-v 3
+
+# server TLSv1.2
+-v 3
+
+# client TLSv1.3 downgrade
+-v d
+
+# server TLSv1.3 downgrade
+-v d
+
+# client TLSv1.3 downgrade
+-v d
+
+# server TLSv1.3 downgrade but don't and resume
+-v d
+-r
+
+# client TLSv1.3 downgrade but don't and resume
+-v d
+-r
+
+# server TLSv1.3 downgrade and resume
+-v d
+-r
+
+# client TLSv1.2 and resume
+-v 3
+-r
+
+# server TLSv1.2 and resume
+-v d
+-r
+
+# cient TLSv1.3 downgrade and resume
+-v 3
+-r
+
+# server TLSv1.3
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-H exitWithRet
+
+# client TLSv1.2, should fail
+-v 3
+-H exitWithRet
+
+# server TLSv1.2
+-v 3
+-l ECDHE-RSA-AES256-GCM-SHA384
+-H exitWithRet
+
+# client TLSv1.3, should fail
+-v 4
+-H exitWithRet
+
+# server TLSv1.2
+-v 3
+-l ECDHE-RSA-AES256-GCM-SHA384
+-H exitWithRet
+
+# client
+# enable downgrade
+# minimum downgradable TLSv 1.3
+# expect to be failure
+-7 4
+-v d
+-H exitWithRet
+
+# server
+# enable downgrade
+# minimum downgradable TLSv 1.3
+-7 4
+-v d
+-l TLS13-AES128-GCM-SHA256
+
+# client
+# enable downgrade
+# minimum downgradable TLSv 1.3
+-7 4
+-v d
+
+# server
+# enable downgrade
+# minimum downgradable TLSv 1.2
+-7 3
+-v d
+-l ECDHE-RSA-AES256-GCM-SHA384
+
+# client TLSv 1.2
+-v 3
+
+# server
+# enable downgrade
+# minimum downgradable TLSv 1.3
+# expect to be failure
+-7 4
+-v d
+-l TLS13-AES128-GCM-SHA256
+-H exitWithRet
+
+# client TLSv 1.2
+-v 3
+-H exitWithRet
+
+# server TLSv1.2 - PSK
+-v 3
+-s
+-l ECDHE-PSK-AES128-GCM-SHA256
+
+# client TLS PSK multiversion, allow downgrade
+-v d
+-7 3
+-s
+-l ECDHE-PSK-AES128-GCM-SHA256
+
+# server TLSv1.3
+-v 4
+
+# client downgrade with trusted ca
+-v d
+-5
diff --git a/test/ssl/vectors/tests/test-tls13-ecc.conf b/test/ssl/vectors/tests/test-tls13-ecc.conf
new file mode 100644
index 000000000..160df27bd
--- /dev/null
+++ b/test/ssl/vectors/tests/test-tls13-ecc.conf
@@ -0,0 +1,104 @@
+# server TLSv1.3 TLS13-CHACHA20-POLY1305-SHA256
+-v 4
+-l TLS13-CHACHA20-POLY1305-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.3 TLS13-CHACHA20-POLY1305-SHA256
+-v 4
+-l TLS13-CHACHA20-POLY1305-SHA256
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.3 TLS13-AES128-GCM-SHA256
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.3 TLS13-AES128-GCM-SHA256
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.3 TLS13-AES256-GCM-SHA384
+-v 4
+-l TLS13-AES256-GCM-SHA384
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.3 TLS13-AES256-GCM-SHA384
+-v 4
+-l TLS13-AES256-GCM-SHA384
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.3 TLS13-AES128-CCM-SHA256
+-v 4
+-l TLS13-AES128-CCM-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.3 TLS13-AES128-CCM-SHA256
+-v 4
+-l TLS13-AES128-CCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.3 TLS13-AES128-CCM-8-SHA256
+-v 4
+-l TLS13-AES128-CCM-8-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.3 TLS13-AES128-CCM-8-SHA256
+-v 4
+-l TLS13-AES128-CCM-8-SHA256
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.3 TLS13-AES128-CCM8-SHA256 (OpenSSL-compat alias)
+-v 4
+-l TLS13-AES128-CCM8-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.3 TLS13-AES128-CCM8-SHA256 (OpenSSL-compat alias)
+-v 4
+-l TLS13-AES128-CCM8-SHA256
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.3 TLS13-AES128-GCM-SHA256
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+-t
+
+# client TLSv1.3 TLS13-AES128-GCM-SHA256
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-t
+
+# server TLSv1.3 TLS13-AES128-GCM-SHA256
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+-8
+
+# client TLSv1.3 TLS13-AES128-GCM-SHA256
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-8
+
+# server TLSv1.3 TLS13-AES128-GCM-SHA256
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+-Y
+
+# client TLSv1.3 TLS13-AES128-GCM-SHA256
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-y
diff --git a/test/ssl/vectors/tests/test-tls13.conf b/test/ssl/vectors/tests/test-tls13.conf
new file mode 100644
index 000000000..266f37321
--- /dev/null
+++ b/test/ssl/vectors/tests/test-tls13.conf
@@ -0,0 +1,231 @@
+# server TLSv1.3 TLS13-CHACHA20-POLY1305-SHA256
+-v 4
+-l TLS13-CHACHA20-POLY1305-SHA256
+
+# client TLSv1.3 TLS13-CHACHA20-POLY1305-SHA256
+-v 4
+-l TLS13-CHACHA20-POLY1305-SHA256
+
+# server TLSv1.3 TLS13-AES128-GCM-SHA256
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-6
+
+# client TLSv1.3 TLS13-AES128-GCM-SHA256
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-6
+
+# server TLSv1.3 TLS13-AES256-GCM-SHA384
+-v 4
+-l TLS13-AES256-GCM-SHA384
+
+# client TLSv1.3 TLS13-AES256-GCM-SHA384
+-v 4
+-l TLS13-AES256-GCM-SHA384
+
+# server TLSv1.3 TLS13-AES128-CCM-SHA256
+-v 4
+-l TLS13-AES128-CCM-SHA256
+
+# client TLSv1.3 TLS13-AES128-CCM-SHA256
+-v 4
+-l TLS13-AES128-CCM-SHA256
+
+# server TLSv1.3 TLS13-AES128-CCM-8-SHA256
+-v 4
+-l TLS13-AES128-CCM-8-SHA256
+
+# client TLSv1.3 TLS13-AES128-CCM-8-SHA256
+-v 4
+-l TLS13-AES128-CCM-8-SHA256
+
+# server TLSv1.3 TLS13-AES128-CCM8-SHA256 (OpenSSL-compat alias)
+-v 4
+-l TLS13-AES128-CCM8-SHA256
+
+# client TLSv1.3 TLS13-AES128-CCM8-SHA256 (OpenSSL-compat alias)
+-v 4
+-l TLS13-AES128-CCM8-SHA256
+
+# server TLSv1.3 resumption
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-r
+
+# client TLSv1.3 resumption
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-r
+
+# server TLSv1.3 resumption - SHA384
+-v 4
+-l TLS13-AES256-GCM-SHA384
+-r
+
+# client TLSv1.3 resumption - SHA384
+-v 4
+-l TLS13-AES256-GCM-SHA384
+-r
+
+# server TLSv1.3 PSK without (EC)DHE
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-r
+
+# client TLSv1.3 PSK without (EC)DHE
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-r
+-K
+
+# server TLSv1.3 accepting EarlyData
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-r
+-0
+
+# client TLSv1.3 sending EarlyData
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-r
+-0
+
+# server TLSv1.3 not accepting EarlyData
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-r
+
+# client TLSv1.3 sending EarlyData
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-r
+-0
+
+# server TLSv1.3 accepting EarlyData
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-r
+-0
+
+# client TLSv1.3 not sending EarlyData
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-r
+
+# server TLSv1.3
+-v 4
+-l TLS13-AES128-GCM-SHA256
+
+# client TLSv1.3 Fragments
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-F 1
+
+# server TLSv1.3
+-v 4
+-l TLS13-AES128-GCM-SHA256
+
+# client TLSv1.3 HelloRetryRequest to negotiate Key Exchange algorithm
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-J
+
+# server TLSv1.3
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-J
+
+# client TLSv1.3 HelloRetryRequest with cookie
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-J
+
+# server TLSv1.3
+-v 4
+-l TLS13-AES128-GCM-SHA256
+
+# client TLSv1.3 DH key exchange
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-y
+
+# server TLSv1.3
+-v 4
+-l TLS13-AES128-GCM-SHA256
+
+# client TLSv1.3 ECC key exchange
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-Y
+
+# server TLSv1.3
+-v 4
+-l TLS13-AES128-GCM-SHA256
+
+# client TLSv1.3 ECC key exchange
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-Y
+
+# server TLSv1.3 multiple cipher suites
+-v 4
+-l TLS13-AES128-GCM-SHA256:TLS13-AES256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES128-CCM-SHA256:TLS13-AES128-CCM-8-SHA256
+
+# client TLSv1.3
+-v 4
+-l TLS13-AES128-GCM-SHA256:TLS13-AES256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES128-CCM-SHA256:TLS13-AES128-CCM-8-SHA256
+
+# server TLSv1.3 KeyUpdate
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-U
+
+# client TLSv1.3 KeyUpdate
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-I
+
+# server TLSv1.3 No session ticket
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-T
+
+# client TLSv1.3 No session ticket
+-v 4
+-l TLS13-AES128-GCM-SHA256
+
+# server TLSv1.3 Post-Handshake Authentication
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-Q
+
+# client TLSv1.3 Post-Handshake Authentication
+-v 4
+-l TLS13-AES128-GCM-SHA256
+-Q
+
+# server TLSv1.3 Send Ticket explicitly
+-v 4
+-l TLS13-AES128-GCM-SHA256
+--send-ticket
+
+# client TLSv1.3 Send Ticket explicitly
+-v 4
+-l TLS13-AES128-GCM-SHA256
+
+# server TLSv1.3 Integrity-only SHA256
+-v 4
+-l TLS13-SHA256-SHA256
+
+# client TLSv1.3 Integrity-only SHA256
+-v 4
+-l TLS13-SHA256-SHA256
+
+# server TLSv1.3 Integrity-only SHA384
+-v 4
+-l TLS13-SHA384-SHA384
+
+# client TLSv1.3 Integrity-only SHA384
+-v 4
+-l TLS13-SHA384-SHA384
diff --git a/test/ssl/vectors/tests/test.conf b/test/ssl/vectors/tests/test.conf
new file mode 100644
index 000000000..73d40f000
--- /dev/null
+++ b/test/ssl/vectors/tests/test.conf
@@ -0,0 +1,2094 @@
+# server TLSv1.2 DHE-RSA-CHACHA20-POLY1305
+-v 3
+-l DHE-RSA-CHACHA20-POLY1305
+
+# client TLSv1.2 DHE-RSA-CHACHA20-POLY1305
+-v 3
+-l DHE-RSA-CHACHA20-POLY1305
+
+# server TLSv1.2 ECDHE-RSA-CHACHA20-POLY1305
+-v 3
+-l ECDHE-RSA-CHACHA20-POLY1305
+
+# client TLSv1.2 ECDHE-RSA-CHACHA20-POLY1305
+-v 3
+-l ECDHE-RSA-CHACHA20-POLY1305
+
+# server TLSv1.2 ECDHE-EDCSA-CHACHA20-POLY1305
+-v 3
+-l ECDHE-ECDSA-CHACHA20-POLY1305
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-CHACHA20-POLY1305
+-v 3
+-l ECDHE-ECDSA-CHACHA20-POLY1305
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 DHE-PSK-CHACHA20-POLY1305
+-v 3
+-s
+-l DHE-PSK-CHACHA20-POLY1305
+
+# client TLSv1.2 DHE-PSK-CHACHA20-POLY1305
+-v 3
+-s
+-l DHE-PSK-CHACHA20-POLY1305
+
+# server TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305
+-v 3
+-s
+-l ECDHE-PSK-CHACHA20-POLY1305
+
+# client TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305
+-v 3
+-s
+-l ECDHE-PSK-CHACHA20-POLY1305
+
+# server TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 x25519
+-v 3
+-s
+-t
+-l ECDHE-PSK-CHACHA20-POLY1305
+
+# client TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 x25519
+-v 3
+-s
+-t
+-l ECDHE-PSK-CHACHA20-POLY1305
+
+# server TLSv1.2 PSK-CHACHA20-POLY1305
+-v 3
+-s
+-l PSK-CHACHA20-POLY1305
+
+# client TLSv1.2 PSK-CHACHA20-POLY1305
+-v 3
+-s
+-l PSK-CHACHA20-POLY1305
+
+# server TLSv1.2 DHE-RSA-CHACHA20-POLY1305-OLD
+-v 3
+-l DHE-RSA-CHACHA20-POLY1305-OLD
+
+# client TLSv1.2 DHE-RSA-CHACHA20-POLY1305-OLD
+-v 3
+-l DHE-RSA-CHACHA20-POLY1305-OLD
+
+# server TLSv1.2 ECDHE-RSA-CHACHA20-POLY1305-OLD
+-v 3
+-l ECDHE-RSA-CHACHA20-POLY1305-OLD
+
+# client TLSv1.2 ECDHE-RSA-CHACHA20-POLY1305-OLD
+-v 3
+-l ECDHE-RSA-CHACHA20-POLY1305-OLD
+
+# server TLSv1.2 ECDHE-EDCSA-CHACHA20-POLY1305-OLD
+-v 3
+-l ECDHE-ECDSA-CHACHA20-POLY1305-OLD
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-CHACHA20-POLY1305-OLD
+-v 3
+-l ECDHE-ECDSA-CHACHA20-POLY1305-OLD
+-A ./certs/ca-ecc-cert.pem
+
+# server SSLv3 RC4-SHA
+-v 0
+-l RC4-SHA
+
+# client SSLv3 RC4-SHA
+-v 0
+-l RC4-SHA
+
+# server SSLv3 RC4-MD5
+-v 0
+-l RC4-MD5
+
+# client SSLv3 RC4-MD5
+-v 0
+-l RC4-MD5
+
+# server SSLv3 DES-CBC3-SHA
+-v 0
+-l DES-CBC3-SHA
+
+# client SSLv3 DES-CBC3-SHA
+-v 0
+-l DES-CBC3-SHA
+
+# server TLSv1 RC4-SHA
+-v 1
+-l RC4-SHA
+
+# client TLSv1 RC4-SHA
+-v 1
+-l RC4-SHA
+
+# server TLSv1 RC4-MD5
+-v 1
+-l RC4-MD5
+
+# client TLSv1 RC4-MD5
+-v 1
+-l RC4-MD5
+
+# server TLSv1 DES-CBC3-SHA
+-v 1
+-l DES-CBC3-SHA
+
+# client TLSv1 DES-CBC3-SHA
+-v 1
+-l DES-CBC3-SHA
+
+# server TLSv1 AES128-SHA
+-v 1
+-l AES128-SHA
+
+# client TLSv1 AES128-SHA
+-v 1
+-l AES128-SHA
+
+# server TLSv1 AES256-SHA
+-v 1
+-l AES256-SHA
+
+# client TLSv1 AES256-SHA
+-v 1
+-l AES256-SHA
+
+# server TLSv1.1 RC4-SHA
+-v 2
+-l RC4-SHA
+
+# client TLSv1.1 RC4-SHA
+-v 2
+-l RC4-SHA
+
+# server TLSv1.1 RC4-MD5
+-v 2
+-l RC4-MD5
+
+# client TLSv1.1 RC4-MD5
+-v 2
+-l RC4-MD5
+
+# server TLSv1.1 DES-CBC3-SHA
+-v 2
+-l DES-CBC3-SHA
+
+# client TLSv1.1 DES-CBC3-SHA
+-v 2
+-l DES-CBC3-SHA
+
+# server TLSv1.1 AES128-SHA
+-v 2
+-l AES128-SHA
+
+# client TLSv1.1 AES128-SHA
+-v 2
+-l AES128-SHA
+
+# server TLSv1.1 AES256-SHA
+-v 2
+-l AES256-SHA
+
+# client TLSv1.1 AES256-SHA
+-v 2
+-l AES256-SHA
+
+# server TLSv1.2 RC4-SHA
+-v 3
+-l RC4-SHA
+
+# client TLSv1.2 RC4-SHA
+-v 3
+-l RC4-SHA
+
+# server TLSv1.2 RC4-MD5
+-v 3
+-l RC4-MD5
+
+# client TLSv1.2 RC4-MD5
+-v 3
+-l RC4-MD5
+
+# server TLSv1.2 DES-CBC3-SHA
+-v 3
+-l DES-CBC3-SHA
+
+# client TLSv1.2 DES-CBC3-SHA
+-v 3
+-l DES-CBC3-SHA
+
+# server TLSv1.2 AES128-SHA
+-v 3
+-l AES128-SHA
+
+# client TLSv1.2 AES128-SHA
+-v 3
+-l AES128-SHA
+
+# server TLSv1.2 AES256-SHA
+-v 3
+-l AES256-SHA
+
+# client TLSv1.2 AES256-SHA
+-v 3
+-l AES256-SHA
+
+# server TLSv1.2 AES128-SHA256
+-v 3
+-l AES128-SHA256
+
+# client TLSv1.2 AES128-SHA256
+-v 3
+-l AES128-SHA256
+
+# server TLSv1.2 AES256-SHA256
+-v 3
+-l AES256-SHA256
+
+# client TLSv1.2 AES256-SHA256
+-v 3
+-l AES256-SHA256
+
+# server TLSv1 ECDHE-RSA-RC4
+-v 1
+-l ECDHE-RSA-RC4-SHA
+
+# client TLSv1 ECDHE-RSA-RC4
+-v 1
+-l ECDHE-RSA-RC4-SHA
+
+# server TLSv1 ECDHE-RSA-DES3
+-v 1
+-l ECDHE-RSA-DES-CBC3-SHA
+
+# client TLSv1 ECDHE-RSA-DES3
+-v 1
+-l ECDHE-RSA-DES-CBC3-SHA
+
+# server TLSv1 ECDHE-RSA-AES128
+-v 1
+-l ECDHE-RSA-AES128-SHA
+
+# client TLSv1 ECDHE-RSA-AES128
+-v 1
+-l ECDHE-RSA-AES128-SHA
+
+# server TLSv1 ECDHE-RSA-AES256
+-v 1
+-l ECDHE-RSA-AES256-SHA
+
+# client TLSv1 ECDHE-RSA-AES256
+-v 1
+-l ECDHE-RSA-AES256-SHA
+
+# server TLSv1.1 ECDHE-RSA-RC4
+-v 2
+-l ECDHE-RSA-RC4-SHA
+
+# client TLSv1.1 ECDHE-RSA-RC4
+-v 2
+-l ECDHE-RSA-RC4-SHA
+
+# server TLSv1.1 ECDHE-RSA-DES3
+-v 2
+-l ECDHE-RSA-DES-CBC3-SHA
+
+# client TLSv1.1 ECDHE-RSA-DES3
+-v 2
+-l ECDHE-RSA-DES-CBC3-SHA
+
+# server TLSv1.1 ECDHE-RSA-AES128
+-v 2
+-l ECDHE-RSA-AES128-SHA
+
+# client TLSv1.1 ECDHE-RSA-AES128
+-v 2
+-l ECDHE-RSA-AES128-SHA
+
+# server TLSv1.1 ECDHE-RSA-AES256
+-v 2
+-l ECDHE-RSA-AES256-SHA
+
+# client TLSv1.1 ECDHE-RSA-AES256
+-v 2
+-l ECDHE-RSA-AES256-SHA
+
+# server TLSv1.2 ECDHE-RSA-RC4
+-v 3
+-l ECDHE-RSA-RC4-SHA
+
+# client TLSv1.2 ECDHE-RSA-RC4
+-v 3
+-l ECDHE-RSA-RC4-SHA
+
+# server TLSv1.2 ECDHE-RSA-DES3
+-v 3
+-l ECDHE-RSA-DES-CBC3-SHA
+
+# client TLSv1.2 ECDHE-RSA-DES3
+-v 3
+-l ECDHE-RSA-DES-CBC3-SHA
+
+# server TLSv1.2 ECDHE-RSA-AES128
+-v 3
+-l ECDHE-RSA-AES128-SHA
+
+# client TLSv1.2 ECDHE-RSA-AES128
+-v 3
+-l ECDHE-RSA-AES128-SHA
+
+# server TLSv1.2 ECDHE-RSA-AES128-SHA256
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+
+# client TLSv1.2 ECDHE-RSA-AES128-SHA256
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+
+# server TLSv1.2 ECDHE-RSA-AES256
+-v 3
+-l ECDHE-RSA-AES256-SHA
+
+# client TLSv1.2 ECDHE-RSA-AES256
+-v 3
+-l ECDHE-RSA-AES256-SHA
+
+# server TLSv1 ECDHE-ECDSA-NULL-SHA
+-v 1
+-l ECDHE-ECDSA-NULL-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDHE-ECDSA-NULL-SHA
+-v 1
+-l ECDHE-ECDSA-NULL-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.1 ECDHE-ECDSA-NULL-SHA
+-v 2
+-l ECDHE-ECDSA-NULL-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDHE-ECDSA-NULL-SHA
+-v 2
+-l ECDHE-ECDSA-NULL-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-NULL-SHA
+-v 3
+-l ECDHE-ECDSA-NULL-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-NULL-SHA
+-v 3
+-l ECDHE-ECDSA-NULL-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1 ECDHE-ECDSA-RC4
+-v 1
+-l ECDHE-ECDSA-RC4-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDHE-ECDSA-RC4
+-v 1
+-l ECDHE-ECDSA-RC4-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1 ECDHE-ECDSA-DES3
+-v 1
+-l ECDHE-ECDSA-DES-CBC3-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDHE-ECDSA-DES3
+-v 1
+-l ECDHE-ECDSA-DES-CBC3-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1 ECDHE-ECDSA-AES128
+-v 1
+-l ECDHE-ECDSA-AES128-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDHE-ECDSA-AES128
+-v 1
+-l ECDHE-ECDSA-AES128-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1 ECDHE-ECDSA-AES256
+-v 1
+-l ECDHE-ECDSA-AES256-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDHE-ECDSA-AES256
+-v 1
+-l ECDHE-ECDSA-AES256-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.1 ECDHE-EDCSA-RC4
+-v 2
+-l ECDHE-ECDSA-RC4-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDHE-ECDSA-RC4
+-v 2
+-l ECDHE-ECDSA-RC4-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.1 ECDHE-ECDSA-DES3
+-v 2
+-l ECDHE-ECDSA-DES-CBC3-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDHE-ECDSA-DES3
+-v 2
+-l ECDHE-ECDSA-DES-CBC3-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.1 ECDHE-ECDSA-AES128
+-v 2
+-l ECDHE-ECDSA-AES128-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDHE-ECDSA-AES128
+-v 2
+-l ECDHE-ECDSA-AES128-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.1 ECDHE-ECDSA-AES256
+-v 2
+-l ECDHE-ECDSA-AES256-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDHE-ECDSA-AES256
+-v 2
+-l ECDHE-ECDSA-AES256-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-RC4
+-v 3
+-l ECDHE-ECDSA-RC4-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-RC4
+-v 3
+-l ECDHE-ECDSA-RC4-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-DES3
+-v 3
+-l ECDHE-ECDSA-DES-CBC3-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-DES3
+-v 3
+-l ECDHE-ECDSA-DES-CBC3-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-AES128
+-v 3
+-l ECDHE-ECDSA-AES128-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES128
+-v 3
+-l ECDHE-ECDSA-AES128-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-AES128-SHA256
+-v 3
+-l ECDHE-ECDSA-AES128-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES128-SHA256
+-v 3
+-l ECDHE-ECDSA-AES128-SHA256
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-AES256
+-v 3
+-l ECDHE-ECDSA-AES256-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES256
+-v 3
+-l ECDHE-ECDSA-AES256-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1 ECDH-RSA-RC4
+-v 1
+-l ECDH-RSA-RC4-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDH-RSA-RC4
+-v 1
+-l ECDH-RSA-RC4-SHA
+
+# server TLSv1 ECDH-RSA-DES3
+-v 1
+-l ECDH-RSA-DES-CBC3-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDH-RSA-DES3
+-v 1
+-l ECDH-RSA-DES-CBC3-SHA
+
+# server TLSv1 ECDH-RSA-AES128
+-v 1
+-l ECDH-RSA-AES128-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDH-RSA-AES128
+-v 1
+-l ECDH-RSA-AES128-SHA
+
+# server TLSv1 ECDH-RSA-AES256
+-v 1
+-l ECDH-RSA-AES256-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDH-RSA-AES256
+-v 1
+-l ECDH-RSA-AES256-SHA
+
+# server TLSv1.1 ECDH-RSA-RC4
+-v 2
+-l ECDH-RSA-RC4-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDH-RSA-RC4
+-v 2
+-l ECDH-RSA-RC4-SHA
+
+# server TLSv1.1 ECDH-RSA-DES3
+-v 2
+-l ECDH-RSA-DES-CBC3-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDH-RSA-DES3
+-v 2
+-l ECDH-RSA-DES-CBC3-SHA
+
+# server TLSv1.1 ECDH-RSA-AES128
+-v 2
+-l ECDH-RSA-AES128-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDH-RSA-AES128
+-v 2
+-l ECDH-RSA-AES128-SHA
+
+# server TLSv1.1 ECDH-RSA-AES256
+-v 2
+-l ECDH-RSA-AES256-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDH-RSA-AES256
+-v 2
+-l ECDH-RSA-AES256-SHA
+
+# server TLSv1.2 ECDH-RSA-RC4
+-v 3
+-l ECDH-RSA-RC4-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-RSA-RC4
+-v 3
+-l ECDH-RSA-RC4-SHA
+
+# server TLSv1.2 ECDH-RSA-DES3
+-v 3
+-l ECDH-RSA-DES-CBC3-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-RSA-DES3
+-v 3
+-l ECDH-RSA-DES-CBC3-SHA
+
+# server TLSv1.2 ECDH-RSA-AES128
+-v 3
+-l ECDH-RSA-AES128-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-RSA-AES128
+-v 3
+-l ECDH-RSA-AES128-SHA
+
+# server TLSv1.2 ECDH-RSA-AES128-SHA256
+-v 3
+-l ECDH-RSA-AES128-SHA256
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-RSA-AES128-SHA256
+-v 3
+-l ECDH-RSA-AES128-SHA256
+
+# server TLSv1.2 ECDH-RSA-AES256
+-v 3
+-l ECDH-RSA-AES256-SHA
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-RSA-AES256
+-v 3
+-l ECDH-RSA-AES256-SHA
+
+# server TLSv1 ECDH-ECDSA-RC4
+-v 1
+-l ECDH-ECDSA-RC4-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDH-ECDSA-RC4
+-v 1
+-l ECDH-ECDSA-RC4-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1 ECDH-ECDSA-DES3
+-v 1
+-l ECDH-ECDSA-DES-CBC3-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDH-ECDSA-DES3
+-v 1
+-l ECDH-ECDSA-DES-CBC3-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1 ECDH-ECDSA-AES128
+-v 1
+-l ECDH-ECDSA-AES128-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDH-ECDSA-AES128
+-v 1
+-l ECDH-ECDSA-AES128-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1 ECDH-ECDSA-AES256
+-v 1
+-l ECDH-ECDSA-AES256-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1 ECDH-ECDSA-AES256
+-v 1
+-l ECDH-ECDSA-AES256-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.1 ECDH-EDCSA-RC4
+-v 2
+-l ECDH-ECDSA-RC4-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDH-ECDSA-RC4
+-v 2
+-l ECDH-ECDSA-RC4-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.1 ECDH-ECDSA-DES3
+-v 2
+-l ECDH-ECDSA-DES-CBC3-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDH-ECDSA-DES3
+-v 2
+-l ECDH-ECDSA-DES-CBC3-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.1 ECDH-ECDSA-AES128
+-v 2
+-l ECDH-ECDSA-AES128-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDH-ECDSA-AES128
+-v 2
+-l ECDH-ECDSA-AES128-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.1 ECDH-ECDSA-AES256
+-v 2
+-l ECDH-ECDSA-AES256-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.1 ECDH-ECDSA-AES256
+-v 2
+-l ECDH-ECDSA-AES256-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-RC4
+-v 3
+-l ECDH-ECDSA-RC4-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-ECDSA-RC4
+-v 3
+-l ECDH-ECDSA-RC4-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDH-ECDSA-DES3
+-v 3
+-l ECDH-ECDSA-DES-CBC3-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-ECDSA-DES3
+-v 3
+-l ECDH-ECDSA-DES-CBC3-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDH-ECDSA-AES128
+-v 3
+-l ECDH-ECDSA-AES128-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-ECDSA-AES128
+-v 3
+-l ECDH-ECDSA-AES128-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDH-ECDSA-AES128-SHA256
+-v 3
+-l ECDH-ECDSA-AES128-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-ECDSA-AES128-SHA256
+-v 3
+-l ECDH-ECDSA-AES128-SHA256
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDH-ECDSA-AES256
+-v 3
+-l ECDH-ECDSA-AES256-SHA
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-ECDSA-AES256
+-v 3
+-l ECDH-ECDSA-AES256-SHA
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-RSA-AES256-SHA384
+-v 3
+-l ECDHE-RSA-AES256-SHA384
+
+# client TLSv1.2 ECDHE-RSA-AES256-SHA384
+-v 3
+-l ECDHE-RSA-AES256-SHA384
+
+# server TLSv1.2 ECDHE-ECDSA-AES256-SHA384
+-v 3
+-l ECDHE-ECDSA-AES256-SHA384
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES256-SHA384
+-v 3
+-l ECDHE-ECDSA-AES256-SHA384
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDH-RSA-AES256-SHA384
+-v 3
+-l ECDH-RSA-AES256-SHA384
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-RSA-AES256-SHA384
+-v 3
+-l ECDH-RSA-AES256-SHA384
+
+# server TLSv1.2 ECDH-ECDSA-AES256-SHA384
+-v 3
+-l ECDH-ECDSA-AES256-SHA384
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-ECDSA-AES256-SHA384
+-v 3
+-l ECDH-ECDSA-AES256-SHA384
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1 DHE AES128
+-v 1
+-l DHE-RSA-AES128-SHA
+
+# client TLSv1 DHE AES128
+-v 1
+-l DHE-RSA-AES128-SHA
+
+# server TLSv1 DHE AES256
+-v 1
+-l DHE-RSA-AES256-SHA
+
+# client TLSv1 DHE AES256
+-v 1
+-l DHE-RSA-AES256-SHA
+
+# server TLSv1.1 DHE AES128
+-v 2
+-l DHE-RSA-AES128-SHA
+
+# client TLSv1.1 DHE AES128
+-v 2
+-l DHE-RSA-AES128-SHA
+
+# server TLSv1.1 DHE AES256
+-v 2
+-l DHE-RSA-AES256-SHA
+
+# client TLSv1.1 DHE AES256
+-v 2
+-l DHE-RSA-AES256-SHA
+
+# server TLSv1.1 DHE 3DES
+-v 2
+-l EDH-RSA-DES-CBC3-SHA
+
+# client TLSv1.1 DHE 3DES
+-v 2
+-l EDH-RSA-DES-CBC3-SHA
+
+# server TLSv1.2 DHE 3DES
+-v 3
+-l EDH-RSA-DES-CBC3-SHA
+
+# client TLSv1.2 DHE 3DES
+-v 3
+-l EDH-RSA-DES-CBC3-SHA
+
+# server TLSv1.2 DHE AES128
+-v 3
+-l DHE-RSA-AES128-SHA
+
+# client TLSv1.2 DHE AES128
+-v 3
+-l DHE-RSA-AES128-SHA
+
+# server TLSv1.2 DHE AES256
+-v 3
+-l DHE-RSA-AES256-SHA
+
+# client TLSv1.2 DHE AES256
+-v 3
+-l DHE-RSA-AES256-SHA
+
+# server TLSv1.2 DHE AES128-SHA256
+-v 3
+-l DHE-RSA-AES128-SHA256
+
+# client TLSv1.2 DHE AES128-SHA256
+-v 3
+-l DHE-RSA-AES128-SHA256
+
+# server TLSv1.2 DHE AES256-SHA256
+-v 3
+-l DHE-RSA-AES256-SHA256
+
+# client TLSv1.2 DHE AES256-SHA256
+-v 3
+-l DHE-RSA-AES256-SHA256
+
+# server TLSv1.2 ECDHE-PSK-NULL-SHA256
+-s
+-v 3
+-l ECDHE-PSK-NULL-SHA256
+
+# client TLSv1.2 ECDHE-PSK-NULL-SHA256
+-s
+-v 3
+-l ECDHE-PSK-NULL-SHA256
+
+# server TLSv1.2 ECDHE-PSK-AES128-SHA256
+-s
+-v 3
+-l ECDHE-PSK-AES128-SHA256
+
+# client TLSv1.2 ECDHE-PSK-AES128-SHA256
+-s
+-v 3
+-l ECDHE-PSK-AES128-SHA256
+
+# server TLSv1 PSK-AES128
+-s
+-v 1
+-l PSK-AES128-CBC-SHA
+
+# client TLSv1 PSK-AES128
+-s
+-v 1
+-l PSK-AES128-CBC-SHA
+
+# server TLSv1 PSK-AES256
+-s
+-v 1
+-l PSK-AES256-CBC-SHA
+
+# client TLSv1 PSK-AES256
+-s
+-v 1
+-l PSK-AES256-CBC-SHA
+
+# server TLSv1.1 PSK-AES128
+-s
+-v 2
+-l PSK-AES128-CBC-SHA
+
+# client TLSv1.1 PSK-AES128
+-s
+-v 2
+-l PSK-AES128-CBC-SHA
+
+# server TLSv1.1 PSK-AES256
+-s
+-v 2
+-l PSK-AES256-CBC-SHA
+
+# client TLSv1.1 PSK-AES256
+-s
+-v 2
+-l PSK-AES256-CBC-SHA
+
+# server TLSv1.2 PSK-AES128
+-s
+-v 3
+-l PSK-AES128-CBC-SHA
+
+# client TLSv1.2 PSK-AES128
+-s
+-v 3
+-l PSK-AES128-CBC-SHA
+
+# server TLSv1.2 PSK-AES256
+-s
+-v 3
+-l PSK-AES256-CBC-SHA
+
+# client TLSv1.2 PSK-AES256
+-s
+-v 3
+-l PSK-AES256-CBC-SHA
+
+# server TLSv1.2 PSK-AES128-SHA256
+-s
+-v 3
+-l PSK-AES128-CBC-SHA256
+
+# client TLSv1.2 PSK-AES128-SHA256
+-s
+-v 3
+-l PSK-AES128-CBC-SHA256
+
+# server TLSv1.2 PSK-AES256-SHA384
+-s
+-v 3
+-l PSK-AES256-CBC-SHA384
+
+# client TLSv1.2 PSK-AES256-SHA384
+-s
+-v 3
+-l PSK-AES256-CBC-SHA384
+
+# server TLSv1.0 PSK-NULL
+-s
+-v 1
+-l PSK-NULL-SHA
+
+# client TLSv1.0 PSK-NULL
+-s
+-v 1
+-l PSK-NULL-SHA
+
+# server TLSv1.1 PSK-NULL
+-s
+-v 2
+-l PSK-NULL-SHA
+
+# client TLSv1.1 PSK-NULL
+-s
+-v 2
+-l PSK-NULL-SHA
+
+# server TLSv1.2 PSK-NULL
+-s
+-v 3
+-l PSK-NULL-SHA
+
+# client TLSv1.2 PSK-NULL
+-s
+-v 3
+-l PSK-NULL-SHA
+
+# server TLSv1.2 PSK-NULL-SHA256
+-s
+-v 3
+-l PSK-NULL-SHA256
+
+# client TLSv1.2 PSK-NULL-SHA256
+-s
+-v 3
+-l PSK-NULL-SHA256
+
+# server TLSv1.2 PSK-NULL-SHA384
+-s
+-v 3
+-l PSK-NULL-SHA384
+
+# client TLSv1.2 PSK-NULL-SHA384
+-s
+-v 3
+-l PSK-NULL-SHA384
+
+# server TLSv1.2 PSK-NULL
+-s
+-v 3
+-l PSK-NULL-SHA
+
+# client TLSv1.2 PSK-NULL
+-s
+-v 3
+-l PSK-NULL-SHA
+
+# server TLSv1.2 PSK-NULL-SHA256
+-s
+-v 3
+-l PSK-NULL-SHA256
+
+# client TLSv1.2 PSK-NULL-SHA256
+-s
+-v 3
+-l PSK-NULL-SHA256
+
+# server TLSv1.0 RSA-NULL-MD5
+-v 1
+-l NULL-MD5
+
+# client TLSv1.0 RSA-NULL-MD5
+-v 1
+-l NULL-MD5
+
+# server TLSv1.1 RSA-NULL-MD5
+-v 2
+-l NULL-MD5
+
+# client TLSv1.1 RSA-NULL-MD5
+-v 2
+-l NULL-MD5
+
+# server TLSv1.2 RSA-NULL-MD5
+-v 3
+-l NULL-MD5
+
+# client TLSv1.2 RSA-NULL-MD5
+-v 3
+-l NULL-MD5
+
+# server TLSv1.0 RSA-NULL-SHA
+-v 1
+-l NULL-SHA
+
+# client TLSv1.0 RSA-NULL-SHA
+-v 1
+-l NULL-SHA
+
+# server TLSv1.1 RSA-NULL-SHA
+-v 2
+-l NULL-SHA
+
+# client TLSv1.1 RSA-NULL-SHA
+-v 2
+-l NULL-SHA
+
+# server TLSv1.2 RSA-NULL-SHA
+-v 3
+-l NULL-SHA
+
+# client TLSv1.2 RSA-NULL-SHA
+-v 3
+-l NULL-SHA
+
+# server TLSv1.2 RSA-NULL-SHA256
+-v 3
+-l NULL-SHA256
+
+# client TLSv1.2 RSA-NULL-SHA256
+-v 3
+-l NULL-SHA256
+
+# server TLSv1 CAMELLIA128-SHA
+-v 1
+-l CAMELLIA128-SHA
+
+# client TLSv1 CAMELLIA128-SHA
+-v 1
+-l CAMELLIA128-SHA
+
+# server TLSv1 CAMELLIA256-SHA
+-v 1
+-l CAMELLIA256-SHA
+
+# client TLSv1 CAMELLIA256-SHA
+-v 1
+-l CAMELLIA256-SHA
+
+# server TLSv1.1 CAMELLIA128-SHA
+-v 2
+-l CAMELLIA128-SHA
+
+# client TLSv1.1 CAMELLIA128-SHA
+-v 2
+-l CAMELLIA128-SHA
+
+# server TLSv1.1 CAMELLIA256-SHA
+-v 2
+-l CAMELLIA256-SHA
+
+# client TLSv1.1 CAMELLIA256-SHA
+-v 2
+-l CAMELLIA256-SHA
+
+# server TLSv1.2 CAMELLIA128-SHA
+-v 3
+-l CAMELLIA128-SHA
+
+# client TLSv1.2 CAMELLIA128-SHA
+-v 3
+-l CAMELLIA128-SHA
+
+# server TLSv1.2 CAMELLIA256-SHA
+-v 3
+-l CAMELLIA256-SHA
+
+# client TLSv1.2 CAMELLIA256-SHA
+-v 3
+-l CAMELLIA256-SHA
+
+# server TLSv1.2 CAMELLIA128-SHA256
+-v 3
+-l CAMELLIA128-SHA256
+
+# client TLSv1.2 CAMELLIA128-SHA256
+-v 3
+-l CAMELLIA128-SHA256
+
+# server TLSv1.2 CAMELLIA256-SHA256
+-v 3
+-l CAMELLIA256-SHA256
+
+# client TLSv1.2 CAMELLIA256-SHA256
+-v 3
+-l CAMELLIA256-SHA256
+
+# server TLSv1 DHE-RSA-CAMELLIA128-SHA
+-v 1
+-l DHE-RSA-CAMELLIA128-SHA
+
+# client TLSv1 DHE-RSA-CAMELLIA128-SHA
+-v 1
+-l DHE-RSA-CAMELLIA128-SHA
+
+# server TLSv1 DHE-RSA-CAMELLIA256-SHA
+-v 1
+-l DHE-RSA-CAMELLIA256-SHA
+
+# client TLSv1 DHE-RSA-CAMELLIA256-SHA
+-v 1
+-l DHE-RSA-CAMELLIA256-SHA
+
+# server TLSv1.1 DHE-RSA-CAMELLIA128-SHA
+-v 2
+-l DHE-RSA-CAMELLIA128-SHA
+
+# client TLSv1.1 DHE-RSA-CAMELLIA128-SHA
+-v 2
+-l DHE-RSA-CAMELLIA128-SHA
+
+# server TLSv1.1 DHE-RSA-CAMELLIA256-SHA
+-v 2
+-l DHE-RSA-CAMELLIA256-SHA
+
+# client TLSv1.1 DHE-RSA-CAMELLIA256-SHA
+-v 2
+-l DHE-RSA-CAMELLIA256-SHA
+
+# server TLSv1.2 DHE-RSA-CAMELLIA128-SHA
+-v 3
+-l DHE-RSA-CAMELLIA128-SHA
+
+# client TLSv1.2 DHE-RSA-CAMELLIA128-SHA
+-v 3
+-l DHE-RSA-CAMELLIA128-SHA
+
+# server TLSv1.2 DHE-RSA-CAMELLIA256-SHA
+-v 3
+-l DHE-RSA-CAMELLIA256-SHA
+
+# client TLSv1.2 DHE-RSA-CAMELLIA256-SHA
+-v 3
+-l DHE-RSA-CAMELLIA256-SHA
+
+# server TLSv1.2 DHE-RSA-CAMELLIA128-SHA256
+-v 3
+-l DHE-RSA-CAMELLIA128-SHA256
+
+# client TLSv1.2 DHE-RSA-CAMELLIA128-SHA256
+-v 3
+-l DHE-RSA-CAMELLIA128-SHA256
+
+# server TLSv1.2 DHE-RSA-CAMELLIA256-SHA256
+-v 3
+-l DHE-RSA-CAMELLIA256-SHA256
+
+# client TLSv1.2 DHE-RSA-CAMELLIA256-SHA256
+-v 3
+-l DHE-RSA-CAMELLIA256-SHA256
+
+# server TLSv1.2 RSA-AES128-GCM-SHA256
+-v 3
+-l AES128-GCM-SHA256
+
+# client TLSv1.2 RSA-AES128-GCM-SHA256
+-v 3
+-l AES128-GCM-SHA256
+
+# server TLSv1.2 RSA-AES256-GCM-SHA384
+-v 3
+-l AES256-GCM-SHA384
+
+# client TLSv1.2 RSA-AES256-GCM-SHA384
+-v 3
+-l AES256-GCM-SHA384
+
+# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-AES256-GCM-SHA384
+-v 3
+-l ECDHE-ECDSA-AES256-GCM-SHA384
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES256-GCM-SHA384
+-v 3
+-l ECDHE-ECDSA-AES256-GCM-SHA384
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256
+-v 3
+-l ECDH-ECDSA-AES128-GCM-SHA256
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256
+-v 3
+-l ECDH-ECDSA-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDH-ECDSA-AES256-GCM-SHA384
+-v 3
+-l ECDH-ECDSA-AES256-GCM-SHA384
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-ECDSA-AES256-GCM-SHA384
+-v 3
+-l ECDH-ECDSA-AES256-GCM-SHA384
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+
+# client TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+
+# server TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384
+-v 3
+-l ECDHE-RSA-AES256-GCM-SHA384
+
+# client TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384
+-v 3
+-l ECDHE-RSA-AES256-GCM-SHA384
+
+# server TLSv1.2 ECDH-RSA-AES128-GCM-SHA256
+-v 3
+-l ECDH-RSA-AES128-GCM-SHA256
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-RSA-AES128-GCM-SHA256
+-v 3
+-l ECDH-RSA-AES128-GCM-SHA256
+
+# server TLSv1.2 ECDH-RSA-AES256-GCM-SHA384
+-v 3
+-l ECDH-RSA-AES256-GCM-SHA384
+-c ./certs/server-ecc-rsa.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDH-RSA-AES256-GCM-SHA384
+-v 3
+-l ECDH-RSA-AES256-GCM-SHA384
+
+# server TLSv1.2 DHE-RSA-AES128-GCM-SHA256
+-v 3
+-l DHE-RSA-AES128-GCM-SHA256
+
+# client TLSv1.2 DHE-RSA-AES128-GCM-SHA256
+-v 3
+-l DHE-RSA-AES128-GCM-SHA256
+
+# server TLSv1.2 DHE-RSA-AES256-GCM-SHA384
+-v 3
+-l DHE-RSA-AES256-GCM-SHA384
+
+# client TLSv1.2 DHE-RSA-AES256-GCM-SHA384
+-v 3
+-l DHE-RSA-AES256-GCM-SHA384
+
+# server TLSv1.2 PSK-AES128-GCM-SHA256
+-s
+-v 3
+-l PSK-AES128-GCM-SHA256
+
+# client TLSv1.2 PSK-AES128-GCM-SHA256
+-s
+-v 3
+-l PSK-AES128-GCM-SHA256
+
+# server TLSv1.2 PSK-AES256-GCM-SHA384
+-s
+-v 3
+-l PSK-AES256-GCM-SHA384
+
+# client TLSv1.2 PSK-AES256-GCM-SHA384
+-s
+-v 3
+-l PSK-AES256-GCM-SHA384
+
+# server TLSv1.2 AES128-CCM-8
+-v 3
+-l AES128-CCM-8
+
+# client TLSv1.2 AES128-CCM-8
+-v 3
+-l AES128-CCM-8
+
+# server TLSv1.2 AES256-CCM-8
+-v 3
+-l AES256-CCM-8
+
+# client TLSv1.2 AES256-CCM-8
+-v 3
+-l AES256-CCM-8
+
+# server TLSv1.2 AES128-CCM8 (OpenSSL-compat alias)
+-v 3
+-l AES128-CCM8
+
+# client TLSv1.2 AES128-CCM8 (OpenSSL-compat alias)
+-v 3
+-l AES128-CCM8
+
+# server TLSv1.2 AES256-CCM8 (OpenSSL-compat alias)
+-v 3
+-l AES256-CCM8
+
+# client TLSv1.2 AES256-CCM8 (OpenSSL-compat alias)
+-v 3
+-l AES256-CCM8
+
+# server TLSv1.2 ECDHE-ECDSA-AES128-CCM
+-v 3
+-l ECDHE-ECDSA-AES128-CCM
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES128-CCM
+-v 3
+-l ECDHE-ECDSA-AES128-CCM
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-AES128-CCM-8
+-v 3
+-l ECDHE-ECDSA-AES128-CCM-8
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES128-CCM-8
+-v 3
+-l ECDHE-ECDSA-AES128-CCM-8
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-AES256-CCM-8
+-v 3
+-l ECDHE-ECDSA-AES256-CCM-8
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES256-CCM-8
+-v 3
+-l ECDHE-ECDSA-AES256-CCM-8
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-AES128-CCM8 (OpenSSL-compat alias)
+-v 3
+-l ECDHE-ECDSA-AES128-CCM8
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES128-CCM8 (OpenSSL-compat alias)
+-v 3
+-l ECDHE-ECDSA-AES128-CCM8
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 ECDHE-ECDSA-AES256-CCM8 (OpenSSL-compat alias)
+-v 3
+-l ECDHE-ECDSA-AES256-CCM8
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES256-CCM8 (OpenSSL-compat alias)
+-v 3
+-l ECDHE-ECDSA-AES256-CCM8
+-A ./certs/ca-ecc-cert.pem
+
+# server TLSv1.2 PSK-AES128-CCM
+-s
+-v 3
+-l PSK-AES128-CCM
+
+# client TLSv1.2 PSK-AES128-CCM
+-s
+-v 3
+-l PSK-AES128-CCM
+
+# server TLSv1.2 PSK-AES256-CCM
+-s
+-v 3
+-l PSK-AES256-CCM
+
+# client TLSv1.2 PSK-AES256-CCM
+-s
+-v 3
+-l PSK-AES256-CCM
+
+# server TLSv1.2 PSK-AES128-CCM-8
+-s
+-v 3
+-l PSK-AES128-CCM-8
+
+# client TLSv1.2 PSK-AES128-CCM-8
+-s
+-v 3
+-l PSK-AES128-CCM-8
+
+# server TLSv1.2 PSK-AES256-CCM-8
+-s
+-v 3
+-l PSK-AES256-CCM-8
+
+# client TLSv1.2 PSK-AES256-CCM-8
+-s
+-v 3
+-l PSK-AES256-CCM-8
+
+# server TLSv1.2 PSK-AES128-CCM8 (OpenSSL-compat alias)
+-s
+-v 3
+-l PSK-AES128-CCM8
+
+# client TLSv1.2 PSK-AES128-CCM8 (OpenSSL-compat alias)
+-s
+-v 3
+-l PSK-AES128-CCM8
+
+# server TLSv1.2 PSK-AES256-CCM8 (OpenSSL-compat alias)
+-s
+-v 3
+-l PSK-AES256-CCM8
+
+# client TLSv1.2 PSK-AES256-CCM8 (OpenSSL-compat alias)
+-s
+-v 3
+-l PSK-AES256-CCM8
+
+# server TLSv1.2 DHE-PSK-AES128-CBC-SHA256
+-s
+-v 3
+-l DHE-PSK-AES128-CBC-SHA256
+
+# client TLSv1.2 DHE-PSK-AES128-CBC-SHA256
+-s
+-v 3
+-l DHE-PSK-AES128-CBC-SHA256
+
+# server TLSv1.2 DHE-PSK-AES256-CBC-SHA384
+-s
+-v 3
+-l DHE-PSK-AES256-CBC-SHA384
+
+# client TLSv1.2 DHE-PSK-AES256-CBC-SHA384
+-s
+-v 3
+-l DHE-PSK-AES256-CBC-SHA384
+
+# server TLSv1.2 DHE-PSK-NULL-SHA256
+-s
+-v 3
+-l DHE-PSK-NULL-SHA256
+
+# client TLSv1.2 DHE-PSK-NULL-SHA256
+-s
+-v 3
+-l DHE-PSK-NULL-SHA256
+
+# server TLSv1.2 DHE-PSK-NULL-SHA384
+-s
+-v 3
+-l DHE-PSK-NULL-SHA384
+
+# client TLSv1.2 DHE-PSK-NULL-SHA384
+-s
+-v 3
+-l DHE-PSK-NULL-SHA384
+
+# server TLSv1.2 DHE-PSK-AES128-GCM-SHA256
+-s
+-v 3
+-l DHE-PSK-AES128-GCM-SHA256
+
+# client TLSv1.2 DHE-PSK-AES128-GCM-SHA256
+-s
+-v 3
+-l DHE-PSK-AES128-GCM-SHA256
+
+# server TLSv1.2 DHE-PSK-AES256-GCM-SHA384
+-s
+-v 3
+-l DHE-PSK-AES256-GCM-SHA384
+
+# client TLSv1.2 DHE-PSK-AES256-GCM-SHA384
+-s
+-v 3
+-l DHE-PSK-AES256-GCM-SHA384
+
+# server TLSv1.2 DHE-PSK-AES128-CCM
+-s
+-v 3
+-l DHE-PSK-AES128-CCM
+
+# client TLSv1.2 DHE-PSK-AES128-CCM
+-s
+-v 3
+-l DHE-PSK-AES128-CCM
+
+# server TLSv1.2 DHE-PSK-AES256-CCM
+-s
+-v 3
+-l DHE-PSK-AES256-CCM
+
+# client TLSv1.2 DHE-PSK-AES256-CCM
+-s
+-v 3
+-l DHE-PSK-AES256-CCM
+
+# server TLSv1.2 ADH-AES128-SHA
+-a
+-v 3
+-l ADH-AES128-SHA
+
+# client TLSv1.2 ADH-AES128-SHA
+-a
+-v 3
+-l ADH-AES128-SHA
+
+# server TLSv1.1 ADH-AES128-SHA
+-a
+-v 2
+-l ADH-AES128-SHA
+
+# client TLSv1.1 ADH-AES128-SHA
+-a
+-v 2
+-l ADH-AES128-SHA
+
+# server TLSv1.0 ADH-AES128-SHA
+-a
+-v 1
+-l ADH-AES128-SHA
+
+# client TLSv1.0 ADH-AES128-SHA
+-a
+-v 1
+-l ADH-AES128-SHA
+
+# server TLSv1.2 ADH-AES256-GCM-SHA384
+-a
+-v 3
+-l ADH-AES256-GCM-SHA384
+
+# client TLSv1.2 ADH-AES256-GCM-SHA384
+-a
+-v 3
+-l ADH-AES256-GCM-SHA384
+
+# server TLSv1.1 ADH-AES256-GCM-SHA384
+-a
+-v 2
+-l ADH-AES256-GCM-SHA384
+-H exitWithRet
+
+# client TLSv1.1 ADH-AES256-GCM-SHA384
+-a
+-v 2
+-l ADH-AES256-GCM-SHA384
+-H exitWithRet
+
+# server TLSv1.0 ADH-AES256-GCM-SHA384
+-a
+-v 1
+-l ADH-AES256-GCM-SHA384
+-H exitWithRet
+
+# client TLSv1.0 ADH-AES256-GCM-SHA384
+-a
+-v 1
+-l ADH-AES256-GCM-SHA384
+-H exitWithRet
+
+# server TLSv1.1 DHE-RSA-AES256-GCM-SHA384
+-a
+-v 2
+-l DHE-RSA-AES256-GCM-SHA384
+-H exitWithRet
+
+# client TLSv1.1 DHE-RSA-AES256-GCM-SHA384
+-a
+-v 2
+-l DHE-RSA-AES256-GCM-SHA384
+-H exitWithRet
+
+# server TLSv1.0 DHE-RSA-AES256-GCM-SHA384
+-a
+-v 1
+-l DHE-RSA-AES256-GCM-SHA384
+-H exitWithRet
+
+# client TLSv1.0 DHE-RSA-AES256-GCM-SHA384
+-a
+-v 1
+-l DHE-RSA-AES256-GCM-SHA384
+-H exitWithRet
+
+# server TLSv1.1
+-a
+-v 2
+
+# client TLSv1.1 DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA
+-a
+-v 2
+-l DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA
+
+# error going into callback, return ok
+# server TLSv1.2 verify callback override
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-c ./certs/test/server-cert-rsa-badsig.pem
+
+# client TLSv1.2 verify callback override
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-j
+
+# server TLSv1.2 verify callback override
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-c ./certs/test/server-cert-ecc-badsig.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 verify callback override
+-v 3
+-l ECDHE-ECDSA-AES128-GCM-SHA256
+-A ./certs/ca-ecc-cert.pem
+-j
+
+# no error going into callback, return ok
+# server TLSv1.2 verify callback override
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-c ./certs/server-cert.pem
+
+# client TLSv1.2 verify callback override
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-j
+
+# server TLSv1.2 verify callback override
+#-v 3
+#-l ECDHE-ECDSA-AES128-GCM-SHA256
+#-c ./certs/test/server-ecc.pem #This cert no longer exists
+#-k ./certs/ecc-key.pem
+
+# client TLSv1.2 verify callback override
+#-v 3
+#-l ECDHE-ECDSA-AES128-GCM-SHA256
+#-A ./certs/ca-ecc-cert.pem
+#-j
+
+# server TLSv1.2 ECDHE-EDCSA-CHACHA20-POLY1305
+-v 3
+-l ECDHE-ECDSA-CHACHA20-POLY1305
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-CHACHA20-POLY1305
+-v 3
+-l ECDHE-ECDSA-CHACHA20-POLY1305
+-A ./certs/ca-ecc-cert.pem
+-t
+
+# server TLSv1.2 ECDHE-EDCSA-CHACHA20-POLY1305
+-v 3
+-l ECDHE-ECDSA-CHACHA20-POLY1305
+-c ./certs/server-ecc.pem
+-k ./certs/ecc-key.pem
+
+# client TLSv1.2 ECDHE-ECDSA-CHACHA20-POLY1305
+-v 3
+-l ECDHE-ECDSA-CHACHA20-POLY1305
+-A ./certs/ca-ecc-cert.pem
+-8
+
+# server TLSv1.2 private-only key
+-v 3
+-c ./certs/ecc-privOnlyCert.pem
+-k ./certs/ecc-privOnlyKey.pem
+
+# client TLSv1.2 private-only key on server
+-v 3
+-d
+
+# server TLSv1.2 with fragment
+-v 3
+
+# client TLSv1.2 with fragment
+-v 3
+-F 1
+
+# server TLSv1.2 RSA 3072-bit DH 3072-bit
+-v 3
+-D certs/dh3072.pem
+-A certs/3072/client-cert.pem
+
+# client TLSv1.2 RSA 3072-bit DH 3072-bit
+-v 3
+-D certs/dh3072.pem
+-c certs/3072/client-cert.pem
+-k certs/3072/client-key.pem
+
+# server good certificate common name
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/server-key.pem
+-c ./certs/test/server-goodcn.pem
+-d
+
+# client good certificate common name
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-h localhost
+-A ./certs/test/server-goodcn.pem
+-m
+-C
+
+# server good certificate alt name
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/server-key.pem
+-c ./certs/test/server-goodalt.pem
+-d
+
+# client good certificate alt name
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-h localhost
+-A ./certs/test/server-goodalt.pem
+-m
+-C
+
+# server good certificate common name wild
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/server-key.pem
+-c ./certs/test/server-goodcnwild.pem
+-d
+
+# client good certificate common name wild
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-h localhost
+-A ./certs/test/server-goodcnwild.pem
+-m
+-C
+
+# server good certificate alt name wild
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-k ./certs/server-key.pem
+-c ./certs/test/server-goodaltwild.pem
+-d
+
+# client good certificate alt name wild
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-h localhost
+-A ./certs/test/server-goodaltwild.pem
+-m
+-C
+
+# server CN in alternate names list
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-c ./certs/test/server-localhost.pem
+
+# client CN in alternate names list
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-h localhost
+-A ./certs/test/server-localhost.pem
+-m
+
+# server TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384
+-v 3
+-l ECDHE-RSA-AES256-GCM-SHA384
+
+# client TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 with user curve (384 or 256)
+-v 3
+-l ECDHE-RSA-AES256-GCM-SHA384
+-H useSupCurve
+
+# server TLSv1.2 ECDHE-ECDSA-AES256-GCM-SHA384 with P-384 Certs and CA
+-v 3
+-l ECDHE-ECDSA-AES256-GCM-SHA384
+-c ./certs/server-ecc384-cert.pem
+-k ./certs/server-ecc384-key.pem
+-A ./certs/ca-ecc384-cert.pem
+
+# client TLSv1.2 ECDHE-ECDSA-AES256-GCM-SHA384 with P-384 Certs and CA
+-v 3
+-l ECDHE-ECDSA-AES256-GCM-SHA384
+-c ./certs/client-ecc384-cert.pem
+-k ./certs/client-ecc384-key.pem
+-A ./certs/ca-ecc384-cert.pem
+
+# server TLSv1.2 default with secure renegotiation (renegotiation available)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-M
+
+# client TLSv1.2 default with secure renegotiation (client initiated)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-i
+
+# server TLSv1.2 default with secure renegotiation (renegotiation available)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-M
+
+# client TLSv1.2 default with secure renegotiation (client initiated as resume)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-i -4
+
+# server TLSv1.2 default with secure renegotiation (server initiated)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-m
+
+# client TLSv1.2 default with secure renegotiation (renegotiation available)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-R
+
+# server TLSv1.2 default with secure renegotiation (server initiated)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-m
+
+# client TLSv1.2 default with secure renegotiation (renegotiation available as resume)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-R -4
+
+# server TLSv1.2 default with secure renegotiation (server initiated)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-m
+
+# client TLSv1.2 default with secure renegotiation (client initiated)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-i
+
+# server TLSv1.2 default with secure renegotiation (server initiated)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-m
+
+# client TLSv1.2 default with secure renegotiation (client initiated as resume)
+-v 3
+-l ECDHE-RSA-AES128-GCM-SHA256
+-i -4
+
+# server TLSv1.2 with Trusted CA Indication (pre-shared)
+-v 3
+-5
+
+# client TLSv1.2 with Trusted CA Indication (pre-shared)
+-v 3
+-5
+
+# server TLSv1.2 with block cipher and no ETM
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+-H disallowETM
+
+# client TLSv1.2 with block cipher
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+-6
+
+# server TLSv1.2 with block cipher
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+-6
+
+# client TLSv1.2 with block cipher and no ETM
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+-H disallowETM
+
+# server TLSv1.2 with block cipher and no ETM
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+-H disallowETM
+
+# client TLSv1.2 with block cipher and no ETM
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+-H disallowETM
+
+# server TLSv1.2 with block cipher and SHA-1 and no ETM
+-v 3
+-l ECDHE-RSA-AES128-SHA
+-H disallowETM
+
+# client TLSv1.2 with block cipher and SHA-1 and no ETM
+-v 3
+-l ECDHE-RSA-AES128-SHA
+-H disallowETM
+
+# server TLSv1.2 with block cipher
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+
+# client TLSv1.2 with block cipher - atomic user (use callback)
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+-U
+
+# server TLSv1.2 with block cipher and no ETM
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+-H disallowETM
+
+# client TLSv1.2 with block cipher - atomic user (use callback)
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+-U
+
+# server with bidirectional shutdown
+-l ECDHE-RSA-AES128-SHA256
+-w
+
+# client with bidirectional shutdown
+-l ECDHE-RSA-AES128-SHA256
+-w
+
+# server TLSv1.2 No Session ticket
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+-T o
+
+# client TLSv1.2 No Session ticket
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+
+# server load an entity cert without ca boolean set
+-c ./certs/entity-no-ca-bool-cert.pem
+-k ./certs/entity-no-ca-bool-key.pem
+-l ECDHE-RSA-AES128-SHA256
+
+# client checks default ca bool value used when processing the peers chain
+-v 3
+-l ECDHE-RSA-AES128-SHA256
+
+# server test with a blocking write socket
+-v 3
+-6
+-l TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
+
+# client test with a blocking write socket
+-v 3
+-6
+-l TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
+
diff --git a/test/ssl/wolfssl.cpp b/test/ssl/wolfssl.cpp
new file mode 100644
index 000000000..37bfcd1d6
--- /dev/null
+++ b/test/ssl/wolfssl.cpp
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2011-2025 libbitcoin developers (see AUTHORS)
+ *
+ * This file is part of libbitcoin.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+#include "../test.hpp"
+
+extern "C" {
+#include "tests/unit.h"
+#include "wolfcrypt/test/test.h"
+}
+
+// If not defined in build config match wolfcrypt/test/test.c.
+#ifndef CERT_PREFIX
+#define CERT_PREFIX "./"
+#endif
+
+// These can be set, but are disabled in `unit_tests()` given current config.
+// wolfSSL_Debugging_ON()
+// wolfSSL_SetMemFailCount(memFailCount)
+// wc_SetSeed_Cb(WC_GENERATE_SEED_DEFAULT)
+// wc_InitNetRandom(wnrConfig, NULL, 5000)
+// wc_RunCast_fips(setting)
+// wc_RunAllCast_fips()
+
+BOOST_FIXTURE_TEST_SUITE(wolfssl_tests, test::current_directory_setup_fixture)
+
+#if defined(WOLFSSL_W64_WRAPPER)
+BOOST_AUTO_TEST_CASE(wolfssl__w64wrapper__always__success)
+{
+ BOOST_REQUIRE(is_zero(w64wrapper_test()));
+}
+#endif
+
+#if defined(WOLFCRYPT_HAVE_SRP) && defined(WOLFSSL_SHA512)
+BOOST_AUTO_TEST_CASE(wolfssl__srp__always__success)
+{
+ BOOST_REQUIRE_NO_THROW(SrpTest());
+}
+#endif
+
+#if defined(WOLFSSL_QUIC)
+BOOST_AUTO_TEST_CASE(wolfssl__quic__always__success)
+{
+ BOOST_REQUIRE(is_zero(QuicTest()));
+}
+#endif
+
+// Disabled until setting CERT_PREFIX is worked out.
+#if defined(HAVE_MSC)
+
+#if !defined(NO_CRYPT_TEST)
+BOOST_AUTO_TEST_CASE(wolfssl__wolfcrypt__always__success)
+{
+ // requires:
+ // /vectors/certs/ecc-key.der
+ // /vectors/certs/ca-ecc384-key.der
+ // /vectors/certs/ca-ecc384-cert.pem
+ // cert paths are wired in "test.c" as:
+
+ // By default CERT_PREFIX is "./" (relative),
+ // and combined as: CERT_PREFIX "certs" CERT_PATH_SEP
+ // but CERT_PREFIX is defined as absolute in the project build.
+
+ // By default CERT_WRITE_TEMP_DIR is CERT_PREFIX, but this is absolute, so
+ // CERT_WRITE_TEMP_DIR is predefined as relative ("./") in user_settings.h
+ // Working directory is then controlled by current_directory_setup_fixture.
+
+ func_args arguments{};
+ wolfCrypt_Init();
+ BOOST_REQUIRE(is_zero(wolfcrypt_test(&arguments)));
+ BOOST_REQUIRE(is_zero(arguments.return_code));
+ wolfCrypt_Cleanup();
+}
+#endif
+
+#if !defined(NO_WOLFSSL_CIPHER_SUITE_TEST) && \
+ !defined(NO_WOLFSSL_CLIENT) && \
+ !defined(NO_WOLFSSL_SERVER) && \
+ !defined(NO_TLS) && \
+ !defined(SINGLE_THREADED) && \
+ defined(WOLFSSL_PEM_TO_DER)
+BOOST_AUTO_TEST_CASE(wolfssl__suite__always__success)
+{
+ // "test.conf" must have only '\n' line termination (not '\r\n').
+ // Otherwise the file will be read as a single line and bypass all tests.
+ // SuiteTest also bypasses any test for which the cert file is not found.
+
+ // requires:
+ // /vectors/certs/*.pem
+ // /vectors/certs/test/*.pem
+ // /vectors/tests/test.conf
+
+ // cert paths are configured in "test.conf" only as: "./certs" (relative).
+ // test.conf defaults to "tests/test.conf" (parameterizable). Since we need
+ // to set the working directory for certs, we can use it for both.
+ // Working directory is restored by current_directory_setup_fixture,
+
+ code ec{};
+ std::filesystem::current_path(CERT_PREFIX, ec);
+ BOOST_REQUIRE(!ec);
+
+ constexpr int argc{};
+ const char* args[]{ "", nullptr };
+ BC_PUSH_WARNING(NO_CONST_CAST)
+ BC_PUSH_WARNING(NO_CONST_CAST_REQUIRED)
+ auto argv = const_cast(args);
+ BC_POP_WARNING()
+ BC_POP_WARNING()
+ BOOST_REQUIRE(is_zero(SuiteTest(argc, argv)));
+}
+#endif
+
+#endif // HAVE_MSC
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/test/ssl/wolfssl/examples/client/client.c b/test/ssl/wolfssl/examples/client/client.c
new file mode 100644
index 000000000..c7b1b952f
--- /dev/null
+++ b/test/ssl/wolfssl/examples/client/client.c
@@ -0,0 +1,4885 @@
+/* client.c
+ *
+ * Copyright (C) 2006-2025 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+/* For simpler wolfSSL TLS client examples, visit
+ * https://github.com/wolfSSL/wolfssl-examples/tree/master/tls
+ */
+
+#ifdef HAVE_CONFIG_H
+ #include
+#endif
+
+#ifndef WOLFSSL_USER_SETTINGS
+ #include
+#endif
+#include
+
+#undef TEST_OPENSSL_COEXIST /* can't use this option with this example */
+#undef OPENSSL_COEXIST /* can't use this option with this example */
+
+#include
+
+#ifdef WOLFSSL_WOLFSENTRY_HOOKS
+#include
+#if !defined(NO_FILESYSTEM) && !defined(WOLFSENTRY_NO_JSON)
+static const char *wolfsentry_config_path = NULL;
+#endif
+#endif /* WOLFSSL_WOLFSENTRY_HOOKS */
+
+#if defined(WOLFSSL_MDK_ARM) || defined(WOLFSSL_KEIL_TCP_NET)
+ #include
+ #include
+ #include "rl_fs.h"
+ #include "rl_net.h"
+#endif
+
+#include
+
+#include
+#include
+
+#if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_TLS)
+
+
+#ifdef NO_FILESYSTEM
+#ifdef NO_RSA
+#error currently the example only tries to load in a RSA buffer
+#endif
+#undef USE_CERT_BUFFERS_256
+#define USE_CERT_BUFFERS_256
+#undef USE_CERT_BUFFERS_2048
+#define USE_CERT_BUFFERS_2048
+#include
+#endif
+
+#include /* for max bits */
+
+#ifdef HAVE_ECC
+ #include
+#endif
+
+#ifdef WOLFSSL_ASYNC_CRYPT
+ static int devId = INVALID_DEVID;
+#endif
+
+#define DEFAULT_TIMEOUT_SEC 2
+#ifndef MAX_NON_BLOCK_SEC
+#define MAX_NON_BLOCK_SEC 10
+#endif
+
+#define OCSP_STAPLING 1
+#define OCSP_STAPLINGV2 2
+#define OCSP_STAPLINGV2_MULTI 3
+#define OCSP_STAPLING_OPT_MAX OCSP_STAPLINGV2_MULTI
+
+#ifdef WOLFSSL_ALT_TEST_STRINGS
+ #define TEST_STR_TERM "\n"
+#else
+ #define TEST_STR_TERM
+#endif
+
+static const char kHelloMsg[] = "hello wolfssl!" TEST_STR_TERM;
+#ifndef NO_SESSION_CACHE
+static const char kResumeMsg[] = "resuming wolfssl!" TEST_STR_TERM;
+#endif
+
+#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_EARLY_DATA)
+ static const char kEarlyMsg[] = "A drop of info" TEST_STR_TERM;
+#endif
+static const char kHttpGetMsg[] = "GET /index.html HTTP/1.0\r\n\r\n";
+
+/* Write needs to be largest of the above strings (29) */
+#define CLI_MSG_SZ 32
+/* Read needs to be at least sizeof server.c `webServerMsg` (226) */
+#define CLI_REPLY_SZ 256
+
+#if defined(XSLEEP_US) && defined(NO_MAIN_DRIVER)
+ /* This is to force the server's thread to get a chance to
+ * execute before continuing the resume in non-blocking
+ * DTLS test cases. */
+ #define TEST_DELAY() XSLEEP_US(10000)
+#else
+ #define TEST_DELAY() XSLEEP_MS(1000)
+#endif
+
+/* Note on using port 0: the client standalone example doesn't utilize the
+ * port 0 port sharing; that is used by (1) the server in external control
+ * test mode and (2) the testsuite which uses this code and sets up the correct
+ * port numbers when the internal thread using the server code using port 0. */
+
+static int lng_index = 0;
+#ifdef WOLFSSL_CALLBACKS
+ WOLFSSL_TIMEVAL timeoutConnect;
+ static int handShakeCB(HandShakeInfo* info)
+ {
+ (void)info;
+ return 0;
+ }
+
+ static int timeoutCB(TimeoutInfo* info)
+ {
+ (void)info;
+ return 0;
+ }
+
+#endif
+
+static int quieter = 0; /* Print fewer messages. This is helpful with overly
+ * ambitious log parsers. */
+
+#define LOG_ERROR(...) \
+ do { \
+ if (!quieter) \
+ fprintf(stderr, __VA_ARGS__); \
+ } while(0)
+
+#ifdef HAVE_SESSION_TICKET
+
+#ifndef SESSION_TICKET_LEN
+#define SESSION_TICKET_LEN 256
+#endif
+ static int sessionTicketCB(WOLFSSL* ssl,
+ const unsigned char* ticket, int ticketSz,
+ void* ctx)
+ {
+ (void)ssl;
+ (void)ticket;
+ printf("Session Ticket CB: ticketSz = %d, ctx = %s\n",
+ ticketSz, (char*)ctx);
+ return 0;
+ }
+#endif
+
+static int NonBlockingSSL_Connect(WOLFSSL* ssl)
+{
+ int ret;
+ int error;
+ SOCKET_T sockfd;
+ int select_ret = 0;
+ int elapsedSec = 0;
+
+#ifndef WOLFSSL_CALLBACKS
+ ret = wolfSSL_connect(ssl);
+#else
+ ret = wolfSSL_connect_ex(ssl, handShakeCB, timeoutCB, timeoutConnect);
+#endif
+ error = wolfSSL_get_error(ssl, 0);
+ sockfd = (SOCKET_T)wolfSSL_get_fd(ssl);
+
+ while (ret != WOLFSSL_SUCCESS &&
+ (error == WOLFSSL_ERROR_WANT_READ || error == WOLFSSL_ERROR_WANT_WRITE
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ || error == WC_NO_ERR_TRACE(WC_PENDING_E)
+ #endif
+ #ifdef WOLFSSL_NONBLOCK_OCSP
+ || error == WC_NO_ERR_TRACE(OCSP_WANT_READ)
+ #endif
+ )) {
+ int currTimeout = 1;
+
+ if (error == WOLFSSL_ERROR_WANT_READ)
+ printf("... client would read block\n");
+ else if (error == WOLFSSL_ERROR_WANT_WRITE)
+ printf("... client would write block\n");
+
+#ifdef WOLFSSL_ASYNC_CRYPT
+ if (error == WC_NO_ERR_TRACE(WC_PENDING_E)) {
+ ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
+ if (ret < 0) break;
+ }
+ else
+#endif
+ {
+ if (error == WOLFSSL_ERROR_WANT_WRITE) {
+ select_ret = tcp_select_tx(sockfd, currTimeout);
+
+ }
+ else
+ {
+ #ifdef WOLFSSL_DTLS
+ if (wolfSSL_dtls(ssl))
+ currTimeout = wolfSSL_dtls_get_current_timeout(ssl);
+ #endif
+ select_ret = tcp_select(sockfd, currTimeout);
+ }
+ }
+
+ if ((select_ret == TEST_RECV_READY) || (select_ret == TEST_SEND_READY)
+ || (select_ret == TEST_ERROR_READY)
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ || error == WC_NO_ERR_TRACE(WC_PENDING_E)
+ #endif
+ #ifdef WOLFSSL_NONBLOCK_OCSP
+ || error == WC_NO_ERR_TRACE(OCSP_WANT_READ)
+ #endif
+ ) {
+ #ifndef WOLFSSL_CALLBACKS
+ ret = wolfSSL_connect(ssl);
+ #else
+ ret = wolfSSL_connect_ex(ssl, handShakeCB, timeoutCB,
+ timeoutConnect);
+ #endif
+ error = wolfSSL_get_error(ssl, 0);
+ elapsedSec = 0; /* reset elapsed */
+ }
+ else if (select_ret == TEST_TIMEOUT && !wolfSSL_dtls(ssl)) {
+ error = WOLFSSL_ERROR_WANT_READ;
+
+ elapsedSec += currTimeout;
+ if (elapsedSec > MAX_NON_BLOCK_SEC) {
+ printf("Nonblocking connect timeout\n");
+ error = WOLFSSL_FATAL_ERROR;
+ }
+ }
+#ifdef WOLFSSL_DTLS
+ else if (select_ret == TEST_TIMEOUT && wolfSSL_dtls(ssl)) {
+ ret = wolfSSL_dtls_got_timeout(ssl);
+ if (ret != WOLFSSL_SUCCESS)
+ error = wolfSSL_get_error(ssl, ret);
+ else
+ error = WOLFSSL_ERROR_WANT_READ;
+ ret = WOLFSSL_FAILURE; /* Reset error so we loop */
+ }
+#endif
+ else {
+ error = WOLFSSL_FATAL_ERROR;
+ }
+ }
+
+ return ret;
+}
+
+
+static void ShowCiphers(void)
+{
+ static char ciphers[WOLFSSL_CIPHER_LIST_MAX_SIZE];
+ int ret = wolfSSL_get_ciphers(ciphers, (int)sizeof(ciphers));
+ if (ret == WOLFSSL_SUCCESS) {
+ printf("%s\n", ciphers);
+ }
+}
+
+/* Shows which versions are valid */
+static void ShowVersions(void)
+{
+ char verStr[100];
+ XMEMSET(verStr, 0, sizeof(verStr));
+#ifndef NO_OLD_TLS
+ #ifdef WOLFSSL_ALLOW_SSLV3
+ XSTRNCAT(verStr, "0:", 3);
+ #endif
+ #ifdef WOLFSSL_ALLOW_TLSV10
+ XSTRNCAT(verStr, "1:", 3);
+ #endif
+ XSTRNCAT(verStr, "2:", 3);
+#endif /* NO_OLD_TLS */
+#ifndef WOLFSSL_NO_TLS12
+ XSTRNCAT(verStr, "3:", 3);
+#endif
+#ifdef WOLFSSL_TLS13
+ XSTRNCAT(verStr, "4:", 3);
+#endif
+ XSTRNCAT(verStr, "d(downgrade):", 14);
+#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
+ XSTRNCAT(verStr, "e(either):", 11);
+#endif
+ /* print all strings at same time on stdout to avoid any flush issues */
+ printf("%s\n", verStr);
+}
+
+#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
+#define MAX_GROUP_NUMBER 4
+static void SetKeyShare(WOLFSSL* ssl, int onlyKeyShare, int useX25519,
+ int useX448, int usePqc, char* pqcAlg, int setGroups)
+{
+ int ret;
+ int groups[MAX_GROUP_NUMBER] = {0};
+ int count = 0;
+
+ (void)useX25519;
+ (void)useX448;
+ (void)usePqc;
+ (void)pqcAlg;
+
+ WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
+ if (onlyKeyShare == 0 || onlyKeyShare == 2) {
+ if (useX25519) {
+ #ifdef HAVE_CURVE25519
+ do {
+ ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_ECC_X25519);
+ if (ret == WOLFSSL_SUCCESS)
+ groups[count++] = WOLFSSL_ECC_X25519;
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
+ wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
+ #endif
+ else
+ err_sys("unable to use curve x25519");
+ } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E));
+ #endif
+ }
+ else if (useX448) {
+ #ifdef HAVE_CURVE448
+ do {
+ ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_ECC_X448);
+ if (ret == WOLFSSL_SUCCESS)
+ groups[count++] = WOLFSSL_ECC_X448;
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
+ wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
+ #endif
+ else
+ err_sys("unable to use curve x448");
+ } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E));
+ #endif
+ }
+ else {
+ #ifdef HAVE_ECC
+ #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
+ do {
+ ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_ECC_SECP256R1);
+ if (ret == WOLFSSL_SUCCESS)
+ groups[count++] = WOLFSSL_ECC_SECP256R1;
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
+ wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
+ #endif
+ else
+ err_sys("unable to use curve secp256r1");
+ } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E));
+ #endif
+ #ifdef WOLFSSL_SM2
+ do {
+ ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_ECC_SM2P256V1);
+ if (ret == WOLFSSL_SUCCESS)
+ groups[count++] = WOLFSSL_ECC_SM2P256V1;
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
+ wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
+ #endif
+ else
+ err_sys("unable to use curve sm2p256v1");
+ } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E));
+ #endif
+ #endif
+ }
+ }
+ if (onlyKeyShare == 0 || onlyKeyShare == 1) {
+ #ifdef HAVE_FFDHE_2048
+ do {
+ ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_FFDHE_2048);
+ if (ret == WOLFSSL_SUCCESS)
+ groups[count++] = WOLFSSL_FFDHE_2048;
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
+ wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
+ #endif
+ else
+ err_sys("unable to use DH 2048-bit parameters");
+ } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E));
+ #endif
+ }
+ #ifdef HAVE_PQC
+ if (onlyKeyShare == 0 || onlyKeyShare == 3) {
+ if (usePqc) {
+ int group = 0;
+
+ #ifndef WOLFSSL_NO_ML_KEM
+ #ifndef WOLFSSL_NO_ML_KEM_512
+ if (XSTRCMP(pqcAlg, "ML_KEM_512") == 0) {
+ group = WOLFSSL_ML_KEM_512;
+ }
+ else
+ #endif
+ #ifndef WOLFSSL_NO_ML_KEM_768
+ if (XSTRCMP(pqcAlg, "ML_KEM_768") == 0) {
+ group = WOLFSSL_ML_KEM_768;
+ }
+ else
+ #endif
+ #ifndef WOLFSSL_NO_ML_KEM_1024
+ if (XSTRCMP(pqcAlg, "ML_KEM_1024") == 0) {
+ group = WOLFSSL_ML_KEM_1024;
+ }
+ else
+ #endif
+ #ifndef WOLFSSL_NO_ML_KEM_512
+ if (XSTRCMP(pqcAlg, "SecP256r1MLKEM512") == 0) {
+ group = WOLFSSL_SECP256R1MLKEM512;
+ }
+ else
+ #endif
+ #ifndef WOLFSSL_NO_ML_KEM_768
+ if (XSTRCMP(pqcAlg, "SecP384r1MLKEM768") == 0) {
+ group = WOLFSSL_SECP384R1MLKEM768;
+ }
+ else if (XSTRCMP(pqcAlg, "SecP256r1MLKEM768") == 0) {
+ group = WOLFSSL_SECP256R1MLKEM768;
+ }
+ else
+ #endif
+ #ifndef WOLFSSL_NO_ML_KEM_1024
+ if (XSTRCMP(pqcAlg, "SecP521r1MLKEM1024") == 0) {
+ group = WOLFSSL_SECP521R1MLKEM1024;
+ }
+ else if (XSTRCMP(pqcAlg, "SecP384r1MLKEM1024") == 0) {
+ group = WOLFSSL_SECP384R1MLKEM1024;
+ }
+ else
+ #endif
+ #if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_CURVE25519)
+ if (XSTRCMP(pqcAlg, "X25519MLKEM512") == 0) {
+ group = WOLFSSL_X25519MLKEM512;
+ }
+ else
+ #endif
+ #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519)
+ if (XSTRCMP(pqcAlg, "X25519MLKEM768") == 0) {
+ group = WOLFSSL_X25519MLKEM768;
+ }
+ else
+ #endif
+ #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE448)
+ if (XSTRCMP(pqcAlg, "X448MLKEM768") == 0) {
+ group = WOLFSSL_X448MLKEM768;
+ }
+ else
+ #endif
+ #endif /* WOLFSSL_NO_ML_KEM */
+ #ifdef WOLFSSL_MLKEM_KYBER
+ #ifndef WOLFSSL_NO_KYBER512
+ if (XSTRCMP(pqcAlg, "KYBER_LEVEL1") == 0) {
+ group = WOLFSSL_KYBER_LEVEL1;
+ }
+ else
+ #endif
+ #ifndef WOLFSSL_NO_KYBER768
+ if (XSTRCMP(pqcAlg, "KYBER_LEVEL3") == 0) {
+ group = WOLFSSL_KYBER_LEVEL3;
+ }
+ else
+ #endif
+ #ifndef WOLFSSL_NO_KYBER1024
+ if (XSTRCMP(pqcAlg, "KYBER_LEVEL5") == 0) {
+ group = WOLFSSL_KYBER_LEVEL5;
+ }
+ else
+ #endif
+ #ifndef WOLFSSL_NO_KYBER512
+ if (XSTRCMP(pqcAlg, "P256_KYBER_LEVEL1") == 0) {
+ group = WOLFSSL_P256_KYBER_LEVEL1;
+ }
+ else
+ #endif
+ #ifndef WOLFSSL_NO_KYBER768
+ if (XSTRCMP(pqcAlg, "P384_KYBER_LEVEL3") == 0) {
+ group = WOLFSSL_P384_KYBER_LEVEL3;
+ }
+ else if (XSTRCMP(pqcAlg, "P256_KYBER_LEVEL3") == 0) {
+ group = WOLFSSL_P256_KYBER_LEVEL3;
+ }
+ else
+ #endif
+ #ifndef WOLFSSL_NO_KYBER1024
+ if (XSTRCMP(pqcAlg, "P521_KYBER_LEVEL5") == 0) {
+ group = WOLFSSL_P521_KYBER_LEVEL5;
+ }
+ else
+ #endif
+ #if !defined(WOLFSSL_NO_KYBER512) && defined(HAVE_CURVE25519)
+ if (XSTRCMP(pqcAlg, "X25519_KYBER_LEVEL1") == 0) {
+ group = WOLFSSL_X25519_KYBER_LEVEL1;
+ }
+ else
+ #endif
+ #if !defined(WOLFSSL_NO_KYBER768) && defined(HAVE_CURVE25519)
+ if (XSTRCMP(pqcAlg, "X25519_KYBER_LEVEL3") == 0) {
+ group = WOLFSSL_X25519_KYBER_LEVEL3;
+ }
+ else
+ #endif
+ #if !defined(WOLFSSL_NO_KYBER768) && defined(HAVE_CURVE448)
+ if (XSTRCMP(pqcAlg, "X448_KYBER_LEVEL3") == 0) {
+ group = WOLFSSL_X448_KYBER_LEVEL3;
+ }
+ else
+ #endif
+ #endif /* WOLFSSL_MLKEM_KYBER */
+ {
+ err_sys("invalid post-quantum KEM specified");
+ }
+
+ printf("Using Post-Quantum KEM: %s\n", pqcAlg);
+ if (wolfSSL_UseKeyShare(ssl, group) == WOLFSSL_SUCCESS) {
+ groups[count++] = group;
+ }
+ else {
+ err_sys("unable to use post-quantum KEM");
+ }
+ }
+ }
+ #endif
+ if (count >= MAX_GROUP_NUMBER)
+ err_sys("example group array size error");
+ if (setGroups && count > 0) {
+ if (wolfSSL_set_groups(ssl, groups, count) != WOLFSSL_SUCCESS)
+ err_sys("unable to set groups");
+ }
+ WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
+}
+#endif /* WOLFSSL_TLS13 && HAVE_SUPPORTED_CURVES */
+
+#ifdef WOLFSSL_EARLY_DATA
+static void EarlyData(WOLFSSL_CTX* ctx, WOLFSSL* ssl, const char* msg,
+ int msgSz, char* buffer)
+{
+ int err;
+ int ret;
+
+ WOLFSSL_ASYNC_WHILE_PENDING(ret = wolfSSL_write_early_data(ssl, msg, msgSz, &msgSz),
+ ret <= 0);
+ if (ret != msgSz) {
+ LOG_ERROR("SSL_write_early_data msg error %d, %s\n", err,
+ wolfSSL_ERR_error_string((unsigned long)err, buffer));
+ wolfSSL_free(ssl); ssl = NULL;
+ wolfSSL_CTX_free(ctx); ctx = NULL;
+ err_sys("SSL_write_early_data failed");
+ }
+}
+#endif
+
+/* Measures average time to create, connect and disconnect a connection (TPS).
+Benchmark = number of connections. */
+static const char* client_bench_conmsg[][5] = {
+ /* English */
+ {
+ "wolfSSL_resume avg took:", "milliseconds\n",
+ "wolfSSL_connect avg took:", "milliseconds\n",
+ NULL
+ },
+ #ifndef NO_MULTIBYTE_PRINT
+ /* Japanese */
+ {
+ "wolfSSL_resume 平均時間:", "ミリ秒\n",
+ "wolfSSL_connect 平均時間:", "ミリ秒\n",
+ }
+ #endif
+};
+
+static int ClientBenchmarkConnections(WOLFSSL_CTX* ctx, char* host, word16 port,
+ int dtlsUDP, int dtlsSCTP, int benchmark, int resumeSession, int useX25519,
+ int useX448, int usePqc, char* pqcAlg, int helloRetry, int onlyKeyShare,
+ int version, int earlyData)
+{
+ /* time passed in number of connects give average */
+ int times = benchmark, skip = (int)((double)times * 0.1);
+ int loops = resumeSession ? 2 : 1;
+ int i = 0, err, ret;
+#ifndef NO_SESSION_CACHE
+ WOLFSSL_SESSION* benchSession = NULL;
+#endif
+#ifdef WOLFSSL_TLS13
+ byte reply[CLI_REPLY_SZ];
+#endif
+ const char** words = client_bench_conmsg[lng_index];
+
+ (void)resumeSession;
+ (void)useX25519;
+ (void)useX448;
+ (void)usePqc;
+ (void)pqcAlg;
+ (void)helloRetry;
+ (void)onlyKeyShare;
+ (void)version;
+ (void)earlyData;
+
+ while (loops--) {
+ #ifndef NO_SESSION_CACHE
+ int benchResume = resumeSession && loops == 0;
+ #endif
+ double start = current_time(1), avg;
+
+ for (i = 0; i < times; i++) {
+ SOCKET_T sockfd;
+ WOLFSSL* ssl;
+
+ if (i == skip)
+ start = current_time(1);
+
+ ssl = wolfSSL_new(ctx);
+ if (ssl == NULL)
+ err_sys("unable to get SSL object");
+
+ #ifndef NO_SESSION_CACHE
+ if (benchResume)
+ wolfSSL_set_session(ssl, benchSession);
+ #endif
+ #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
+ else if (version >= 4) {
+ if (!helloRetry)
+ SetKeyShare(ssl, onlyKeyShare, useX25519, useX448,
+ usePqc, pqcAlg, 1);
+ else
+ wolfSSL_NoKeyShares(ssl);
+ }
+ #endif
+
+ tcp_connect(&sockfd, host, port, dtlsUDP, dtlsSCTP, ssl);
+
+ if (wolfSSL_set_fd(ssl, sockfd) != WOLFSSL_SUCCESS) {
+ err_sys("error in setting fd");
+ }
+
+ #if defined(WOLFSSL_TLS13) && !defined(NO_SESSION_CACHE) && \
+ defined(WOLFSSL_EARLY_DATA)
+ if (version >= 4 && benchResume && earlyData) {
+ char buffer[WOLFSSL_MAX_ERROR_SZ];
+ EarlyData(ctx, ssl, kEarlyMsg, sizeof(kEarlyMsg)-1, buffer);
+ }
+ #endif
+ WOLFSSL_ASYNC_WHILE_PENDING(ret = wolfSSL_connect(ssl),
+ ret != WOLFSSL_SUCCESS);
+ #ifdef WOLFSSL_EARLY_DATA
+ EarlyDataStatus(ssl);
+ #endif
+ if (ret != WOLFSSL_SUCCESS) {
+ err_sys("SSL_connect failed");
+ }
+
+ #ifdef WOLFSSL_TLS13
+ #ifndef NO_SESSION_CACHE
+ if (version >= 4 && resumeSession && !benchResume)
+ #else
+ if (version >= 4 && resumeSession)
+ #endif
+ {
+ /* no null term */
+ if (wolfSSL_write(ssl, kHttpGetMsg, sizeof(kHttpGetMsg)-1) <= 0)
+ err_sys("SSL_write failed");
+
+ if (wolfSSL_read(ssl, reply, sizeof(reply)-1) <= 0)
+ err_sys("SSL_read failed");
+ }
+ #endif
+
+
+ wolfSSL_shutdown(ssl);
+ #ifndef NO_SESSION_CACHE
+ if (i == (times-1) && resumeSession) {
+ if (benchSession != NULL)
+ wolfSSL_SESSION_free(benchSession);
+ benchSession = wolfSSL_get1_session(ssl);
+ }
+ #endif
+ wolfSSL_free(ssl); ssl = NULL;
+ CloseSocket(sockfd);
+ }
+ avg = current_time(0) - start;
+ avg /= (times - skip);
+ avg *= 1000; /* milliseconds */
+ #ifndef NO_SESSION_CACHE
+ if (benchResume)
+ printf("%s %8.3f %s\n", words[0],avg, words[1]);
+ else
+ #endif
+ printf("%s %8.3f %s\n", words[2],avg, words[3]);
+
+ WOLFSSL_TIME(times);
+ }
+
+#ifndef NO_SESSION_CACHE
+ if (benchSession != NULL)
+ wolfSSL_SESSION_free(benchSession);
+#endif
+
+ return EXIT_SUCCESS;
+}
+
+/* Measures throughput in mbps. Throughput = number of bytes */
+static int ClientBenchmarkThroughput(WOLFSSL_CTX* ctx, char* host, word16 port,
+ int dtlsUDP, int dtlsSCTP, int block, size_t throughput, int useX25519,
+ int useX448, int usePqc, char* pqcAlg, int exitWithRet, int version,
+ int onlyKeyShare)
+{
+ double start, conn_time = 0, tx_time = 0, rx_time = 0;
+ SOCKET_T sockfd = WOLFSSL_SOCKET_INVALID;
+ WOLFSSL* ssl;
+ int ret = 0, err = 0;
+
+ start = current_time(1);
+ ssl = wolfSSL_new(ctx);
+ if (ssl == NULL)
+ err_sys("unable to get SSL object");
+
+ tcp_connect(&sockfd, host, port, dtlsUDP, dtlsSCTP, ssl);
+ if (wolfSSL_set_fd(ssl, sockfd) != WOLFSSL_SUCCESS) {
+ err_sys("error in setting fd");
+ }
+
+ (void)useX25519;
+ (void)useX448;
+ (void)usePqc;
+ (void)pqcAlg;
+ (void)version;
+ (void)onlyKeyShare;
+#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
+ if (version >= 4) {
+ SetKeyShare(ssl, onlyKeyShare, useX25519, useX448, usePqc,
+ pqcAlg, 1);
+ }
+#endif
+
+ WOLFSSL_ASYNC_WHILE_PENDING(ret = wolfSSL_connect(ssl),
+ ret != WOLFSSL_SUCCESS);
+ if (ret == WOLFSSL_SUCCESS) {
+ /* Perform throughput test */
+ char *tx_buffer, *rx_buffer;
+
+ /* Record connection time */
+ conn_time = current_time(0) - start;
+
+ /* Allocate TX/RX buffers */
+ tx_buffer = (char*)XMALLOC((size_t)block, NULL, DYNAMIC_TYPE_TMP_BUFFER);
+ rx_buffer = (char*)XMALLOC((size_t)block, NULL, DYNAMIC_TYPE_TMP_BUFFER);
+ if (tx_buffer && rx_buffer) {
+ WC_RNG rng;
+
+ /* Startup the RNG */
+ #if !defined(HAVE_FIPS) && defined(WOLFSSL_ASYNC_CRYPT)
+ ret = wc_InitRng_ex(&rng, NULL, devId);
+ #else
+ ret = wc_InitRng(&rng);
+ #endif
+ if (ret == 0) {
+ size_t xfer_bytes;
+
+ /* Generate random data to send */
+ ret = wc_RNG_GenerateBlock(&rng, (byte*)tx_buffer, (word32)block);
+ wc_FreeRng(&rng);
+ if(ret != 0) {
+ err_sys("wc_RNG_GenerateBlock failed");
+ }
+
+ /* Perform TX and RX of bytes */
+ xfer_bytes = 0;
+ while (throughput > xfer_bytes) {
+ int len, rx_pos, select_ret;
+
+ /* Determine packet size */
+ len = (int)min((word32)block, (word32)(throughput - xfer_bytes));
+
+ /* Perform TX */
+ start = current_time(1);
+ WOLFSSL_ASYNC_WHILE_PENDING(ret = wolfSSL_write(ssl, tx_buffer, len),
+ ret <= 0);
+ if (ret != len) {
+ LOG_ERROR("SSL_write bench error %d!\n", err);
+ if (!exitWithRet)
+ err_sys("SSL_write failed");
+ goto doExit;
+ }
+ tx_time += current_time(0) - start;
+
+ /* Perform RX */
+ select_ret = tcp_select(sockfd, DEFAULT_TIMEOUT_SEC);
+ if (select_ret == TEST_RECV_READY) {
+ start = current_time(1);
+ rx_pos = 0;
+ while (rx_pos < len) {
+ ret = wolfSSL_read(ssl, &rx_buffer[rx_pos],
+ len - rx_pos);
+ if (ret <= 0) {
+ err = wolfSSL_get_error(ssl, 0);
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
+ ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
+ if (ret < 0) break;
+ }
+ else
+ #endif
+ if (err != WOLFSSL_ERROR_WANT_READ &&
+ err != WOLFSSL_ERROR_WANT_WRITE) {
+ LOG_ERROR("SSL_read bench error %d\n", err);
+ err_sys("SSL_read failed");
+ }
+ }
+ else {
+ rx_pos += ret;
+ }
+ }
+ rx_time += current_time(0) - start;
+ }
+
+ /* Compare TX and RX buffers */
+ if (XMEMCMP(tx_buffer, rx_buffer, (size_t)len) != 0) {
+ XFREE(tx_buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER);
+ tx_buffer = NULL;
+ XFREE(rx_buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER);
+ rx_buffer = NULL;
+ err_sys("Compare TX and RX buffers failed");
+ }
+
+ /* Update overall position */
+ xfer_bytes += (size_t)len;
+ }
+ }
+ else {
+ err_sys("wc_InitRng failed");
+ }
+ (void)rng; /* for WC_NO_RNG case */
+ }
+ else {
+ err_sys("Client buffer malloc failed");
+ }
+doExit:
+ XFREE(tx_buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER);
+ XFREE(rx_buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER);
+ }
+ else {
+ err_sys("wolfSSL_connect failed");
+ }
+
+ wolfSSL_shutdown(ssl);
+ wolfSSL_free(ssl); ssl = NULL;
+ CloseSocket(sockfd);
+
+ if (exitWithRet)
+ return err;
+
+#if defined(__MINGW32__) || defined(_WIN32)
+#define SIZE_FMT "%d"
+#define SIZE_TYPE int
+#else
+#define SIZE_FMT "%zu"
+#define SIZE_TYPE size_t
+#endif
+ printf(
+ "wolfSSL Client Benchmark " SIZE_FMT " bytes\n"
+ "\tConnect %8.3f ms\n"
+ "\tTX %8.3f ms (%8.3f MBps)\n"
+ "\tRX %8.3f ms (%8.3f MBps)\n",
+ (SIZE_TYPE)throughput,
+ conn_time * 1000,
+ (double)tx_time * 1000, (double)throughput / tx_time / 1024 / 1024,
+ (double)rx_time * 1000, (double)throughput / rx_time / 1024 / 1024
+ );
+
+ return EXIT_SUCCESS;
+}
+
+const char* starttlsCmd[6] = {
+ "220",
+ "EHLO mail.example.com\r\n",
+ "250",
+ "STARTTLS\r\n",
+ "220",
+ "QUIT\r\n",
+};
+
+/* Initiates the STARTTLS command sequence over TCP */
+static int StartTLS_Init(SOCKET_T* sockfd)
+{
+ char tmpBuf[512];
+
+ if (sockfd == NULL)
+ return BAD_FUNC_ARG;
+
+ /* S: 220 SMTP service ready */
+ XMEMSET(tmpBuf, 0, sizeof(tmpBuf));
+ if (recv(*sockfd, tmpBuf, sizeof(tmpBuf)-1, 0) < 0)
+ err_sys("failed to read STARTTLS command\n");
+
+ if ((!XSTRNCMP(tmpBuf, starttlsCmd[0], XSTRLEN(starttlsCmd[0]))) &&
+ (tmpBuf[XSTRLEN(starttlsCmd[0])] == ' ')) {
+ printf("%s\n", tmpBuf);
+ } else {
+ err_sys("incorrect STARTTLS command received");
+ }
+
+ /* C: EHLO mail.example.com */
+ if (send(*sockfd, starttlsCmd[1], (SIZE_TYPE)XSTRLEN(starttlsCmd[1]), 0) !=
+ (int)XSTRLEN(starttlsCmd[1]))
+ err_sys("failed to send STARTTLS EHLO command\n");
+
+ /* S: 250 offers a warm hug of welcome */
+ XMEMSET(tmpBuf, 0, sizeof(tmpBuf));
+ if (recv(*sockfd, tmpBuf, sizeof(tmpBuf)-1, 0) < 0)
+ err_sys("failed to read STARTTLS command\n");
+
+ if ((!XSTRNCMP(tmpBuf, starttlsCmd[2], XSTRLEN(starttlsCmd[2]))) &&
+ (tmpBuf[XSTRLEN(starttlsCmd[2])] == '-')) {
+ printf("%s\n", tmpBuf);
+ } else {
+ err_sys("incorrect STARTTLS command received");
+ }
+
+ /* C: STARTTLS */
+ if (send(*sockfd, starttlsCmd[3], (SIZE_TYPE)XSTRLEN(starttlsCmd[3]), 0) !=
+ (int)XSTRLEN(starttlsCmd[3])) {
+ err_sys("failed to send STARTTLS command\n");
+ }
+
+ /* S: 220 Go ahead */
+ XMEMSET(tmpBuf, 0, sizeof(tmpBuf));
+ if (recv(*sockfd, tmpBuf, sizeof(tmpBuf)-1, 0) < 0)
+ err_sys("failed to read STARTTLS command\n");
+ tmpBuf[sizeof(tmpBuf)-1] = '\0';
+
+ if ((!XSTRNCMP(tmpBuf, starttlsCmd[4], XSTRLEN(starttlsCmd[4]))) &&
+ (tmpBuf[XSTRLEN(starttlsCmd[4])] == ' ')) {
+ printf("%s\n", tmpBuf);
+ } else {
+ err_sys("incorrect STARTTLS command received, expected 220");
+ }
+
+ return WOLFSSL_SUCCESS;
+}
+
+/* Closes down the SMTP connection */
+static int SMTP_Shutdown(WOLFSSL* ssl, int wc_shutdown)
+{
+ int ret, err = 0;
+ char tmpBuf[256];
+
+ if (ssl == NULL)
+ return BAD_FUNC_ARG;
+
+ printf("\nwolfSSL client shutting down SMTP connection\n");
+
+ XMEMSET(tmpBuf, 0, sizeof(tmpBuf));
+
+ /* C: QUIT */
+ WOLFSSL_ASYNC_WHILE_PENDING(
+ ret = wolfSSL_write(ssl, starttlsCmd[5], (int)XSTRLEN(starttlsCmd[5])),
+ ret < 0);
+ if (ret != (int)XSTRLEN(starttlsCmd[5])) {
+ err_sys("failed to send SMTP QUIT command\n");
+ }
+
+ /* S: 221 2.0.0 Service closing transmission channel */
+ WOLFSSL_ASYNC_WHILE_PENDING(
+ ret = wolfSSL_read(ssl, tmpBuf, sizeof(tmpBuf)-1),
+ ret < 0);
+ if (ret < 0) {
+ err_sys("failed to read SMTP closing down response\n");
+ }
+ tmpBuf[ret] = 0; /* null terminate message */
+ printf("%s\n", tmpBuf);
+
+ ret = wolfSSL_shutdown(ssl);
+ if (wc_shutdown && ret == WOLFSSL_SHUTDOWN_NOT_DONE) {
+ if (tcp_select(wolfSSL_get_fd(ssl), DEFAULT_TIMEOUT_SEC) ==
+ TEST_RECV_READY) {
+ ret = wolfSSL_shutdown(ssl); /* bidirectional shutdown */
+ if (ret == WOLFSSL_SUCCESS)
+ printf("Bidirectional shutdown complete\n");
+ }
+ if (ret != WOLFSSL_SUCCESS)
+ LOG_ERROR("Bidirectional shutdown failed\n");
+ }
+
+ return WOLFSSL_SUCCESS;
+}
+
+static int ClientWrite(WOLFSSL* ssl, const char* msg, int msgSz, const char* str,
+ int exitWithRet)
+{
+ int ret, err;
+
+ do {
+ err = 0; /* reset error */
+ ret = wolfSSL_write(ssl, msg, msgSz);
+ if (ret <= 0) {
+ err = wolfSSL_get_error(ssl, 0);
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
+ ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
+ if (ret < 0) break;
+ }
+ #endif
+ }
+ } while (err == WOLFSSL_ERROR_WANT_WRITE ||
+ err == WOLFSSL_ERROR_WANT_READ
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ || err == WC_NO_ERR_TRACE(WC_PENDING_E)
+ #endif
+ );
+ if (ret != msgSz) {
+ char buffer[WOLFSSL_MAX_ERROR_SZ];
+ LOG_ERROR("SSL_write%s msg error %d, %s\n", str, err,
+ wolfSSL_ERR_error_string((unsigned long)err, buffer));
+ if (!exitWithRet) {
+ err_sys("SSL_write failed");
+ }
+ }
+
+ return err;
+}
+
+static int ClientRead(WOLFSSL* ssl, char* reply, int replyLen, int mustRead,
+ const char* str, int exitWithRet)
+{
+ int ret, err;
+ char buffer[WOLFSSL_MAX_ERROR_SZ];
+ double start = current_time(1), elapsed;
+
+ do {
+ err = 0; /* reset error */
+ ret = wolfSSL_read(ssl, reply, replyLen);
+ if (ret <= 0) {
+ err = wolfSSL_get_error(ssl, 0);
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
+ ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
+ if (ret < 0) break;
+ }
+ else
+ #endif
+ if (err != WOLFSSL_ERROR_WANT_READ &&
+ err != WOLFSSL_ERROR_WANT_WRITE &&
+ err != WC_NO_ERR_TRACE(APP_DATA_READY))
+ {
+ LOG_ERROR("SSL_read reply error %d, %s\n", err,
+ wolfSSL_ERR_error_string((unsigned long)err, buffer));
+ if (!exitWithRet) {
+ err_sys("SSL_read failed");
+ }
+ else {
+ break;
+ }
+ }
+ }
+
+ if (mustRead &&
+ (err == WOLFSSL_ERROR_WANT_READ
+ || err == WOLFSSL_ERROR_WANT_WRITE)) {
+ elapsed = current_time(0) - start;
+ if (elapsed > MAX_NON_BLOCK_SEC) {
+ LOG_ERROR("Nonblocking read timeout\n");
+ ret = WOLFSSL_FATAL_ERROR;
+ break;
+ }
+ }
+ } while ((mustRead && err == WOLFSSL_ERROR_WANT_READ)
+ || err == WOLFSSL_ERROR_WANT_WRITE
+ #ifdef WOLFSSL_ASYNC_CRYPT
+ || err == WC_NO_ERR_TRACE(WC_PENDING_E)
+ #endif
+ || err == WC_NO_ERR_TRACE(APP_DATA_READY)
+ );
+ if (ret > 0) {
+ reply[ret] = 0; /* null terminate */
+ printf("%s%s\n", str, reply);
+ }
+
+ return err;
+}
+
+static int ClientWriteRead(WOLFSSL* ssl, const char* msg, int msgSz,
+ char* reply, int replyLen, int mustRead,
+ const char* str, int exitWithRet)
+{
+ int ret = 0;
+
+ do {
+ ret = ClientWrite(ssl, msg, msgSz, str, exitWithRet);
+ if (ret != 0) {
+ if (!exitWithRet)
+ err_sys("ClientWrite failed");
+ else
+ break;
+ }
+ if (wolfSSL_dtls(ssl)) {
+ ret = tcp_select(wolfSSL_get_fd(ssl), DEFAULT_TIMEOUT_SEC);
+ if (ret == TEST_TIMEOUT) {
+ continue;
+ }
+ else if (ret == TEST_RECV_READY) {
+ /* Ready to read */
+ }
+ else {
+ LOG_ERROR("%s tcp_select error\n", str);
+ if (!exitWithRet)
+ err_sys("tcp_select failed");
+ else
+ ret = WOLFSSL_FATAL_ERROR;
+ break;
+ }
+ }
+ ret = ClientRead(ssl, reply, replyLen, mustRead, str, exitWithRet);
+ if (mustRead && ret != 0) {
+ if (!exitWithRet)
+ err_sys("ClientRead failed");
+ else
+ break;
+ }
+ break;
+ } while (1);
+
+ if (ret != 0) {
+ char buffer[WOLFSSL_MAX_ERROR_SZ];
+ LOG_ERROR("SSL_write%s msg error %d, %s\n", str, ret,
+ wolfSSL_ERR_error_string((unsigned long)ret, buffer));
+ }
+
+ return ret;
+}
+
+/* when adding new option, please follow the steps below: */
+/* 1. add new option message in English section */
+/* 2. increase the number of the second column */
+/* 3. increase the array dimension */
+/* 4. add the same message into Japanese section */
+/* (will be translated later) */
+/* 5. add printf() into suitable position of Usage() */
+static const char* client_usage_msg[][78] = {
+ /* English */
+ {
+ " NOTE: All files relative to wolfSSL home dir\n", /* 0 */
+ "Max RSA key size in bits for build is set at : ", /* 1 */
+#ifdef NO_RSA
+ "RSA not supported\n", /* 2 */
+#elif defined(WOLFSSL_SP_MATH) /* case of SP math only */
+#ifdef WOLFSSL_SP_4096
+ "4096\n", /* 2 */
+#elif !defined(WOLFSSL_SP_NO_3072)
+ "3072\n", /* 2 */
+#elif !defined(WOLFSSL_SP_NO_2048)
+ "2048\n", /* 2 */
+#else
+ "0\n", /* 2 */
+#endif
+#elif defined(USE_FAST_MATH)
+#else
+ "INFINITE\n", /* 2 */
+#endif
+ "-? Help, print this usage\n"
+ " 0: English, 1: Japanese\n"
+ "--help Help, in English\n", /* 3 */
+ "-h Host to connect to, default", /* 4 */
+ "-p Port to connect on, not 0, default", /* 5 */
+
+#ifndef WOLFSSL_TLS13
+ "-v SSL version [0-3], SSLv3(0) - TLS1.2(3)), default", /* 6 */
+ "-V Prints valid ssl version numbers"
+ ", SSLv3(0) - TLS1.2(3)\n", /* 7 */
+#else
+ "-v SSL version [0-4], SSLv3(0) - TLS1.3(4)), default", /* 6 */
+ "-V Prints valid ssl version numbers,"
+ " SSLv3(0) - TLS1.3(4)\n", /* 7 */
+#endif
+ "-l Cipher suite list (: delimited)\n", /* 8 */
+#ifndef NO_CERTS
+ "-c Certificate file, default", /* 9 */
+ "-k Key file, default", /* 10 */
+ "-A Certificate Authority file, default", /* 11 */
+#endif
+#ifndef NO_DH
+ "-Z Minimum DH key bits, default", /* 12 */
+#endif
+ "-b Benchmark connections and print stats\n", /* 13 */
+#ifdef HAVE_ALPN
+ "-L Application-Layer Protocol"
+ " Negotiation ({C,F}:)\n", /* 14 */
+#endif
+ "-B Benchmark throughput"
+ " using bytes and print stats\n", /* 15 */
+#ifndef NO_PSK
+ "-s Use pre Shared keys\n", /* 16 */
+#endif
+ "-d Disable peer checks\n", /* 17 */
+ "-D Override Date Errors example\n", /* 18 */
+ "-e List Every cipher suite available, \n", /* 19 */
+ "-g Send server HTTP GET\n", /* 20 */
+#ifdef WOLFSSL_DTLS
+#ifndef WOLFSSL_DTLS13
+ "-u Use UDP DTLS, add -v 2 for DTLSv1, -v 3 for DTLSv1.2"
+ " (default)\n", /* 21 */
+#else
+ "-u Use UDP DTLS, add -v 2 for DTLSv1, -v 3 for DTLSv1.2"
+ " (default), -v 4 for DTLSv1.3\n", /* 21 */
+#endif /* !WOLFSSL_DTLS13 */
+#endif
+#ifdef WOLFSSL_SCTP
+ "-G Use SCTP DTLS,"
+ " add -v 2 for DTLSv1, -v 3 for DTLSv1.2 (default)\n", /* 22 */
+#endif
+#ifndef NO_CERTS
+ "-m Match domain name in cert\n", /* 23 */
+#endif
+ "-N Use Non-blocking sockets\n", /* 24 */
+#ifndef NO_SESSION_CACHE
+ "-r Resume session\n", /* 25 */
+#endif
+ "-w Wait for bidirectional shutdown\n", /* 26 */
+ "-M Use STARTTLS, using protocol (smtp)\n", /* 27 */
+#ifdef HAVE_SECURE_RENEGOTIATION
+ "-R Allow Secure Renegotiation\n", /* 28 */
+ "-i Force client Initiated Secure Renegotiation. If the\n"
+ " string 'scr-app-data' is passed in as the value and\n"
+ " Non-blocking sockets are enabled ('-N') then wolfSSL\n"
+ " sends a test message during the secure renegotiation.\n"
+ " The string parameter is optional.\n", /* 29 */
+#endif
+ "-f Fewer packets/group messages\n", /* 30 */
+#ifndef NO_CERTS
+ "-x Disable client cert/key loading\n", /* 31 */
+#endif
+ "-X Driven by eXternal test case\n", /* 32 */
+ "-j Use verify callback override\n", /* 33 */
+#ifdef SHOW_SIZES
+ "-z Print structure sizes\n", /* 34 */
+#endif
+#ifdef HAVE_SNI
+ "-S Use Host Name Indication\n", /* 35 */
+#endif
+#ifdef HAVE_MAX_FRAGMENT
+ "-F Use Maximum Fragment Length [1-6]\n", /* 36 */
+#endif
+#ifdef HAVE_TRUNCATED_HMAC
+ "-T Use Truncated HMAC\n", /* 37 */
+#endif
+#ifdef HAVE_EXTENDED_MASTER
+ "-n Disable Extended Master Secret\n", /* 38 */
+#endif
+#ifdef HAVE_OCSP
+ "-o Perform OCSP lookup on peer certificate\n", /* 39 */
+ "-O Perform OCSP lookup using as responder\n", /* 40 */
+#endif
+#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
+ || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
+ "-W Use OCSP Stapling (1 v1, 2 v2, 3 v2 multi)\n", /* 41 */
+ " With 'm' at end indicates MUST staple\n", /* 42 */
+#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS_OCSP_MULTI)
+ " -W 1 -v 4, Perform multi OCSP stapling for TLS13\n",
+ /* 43 */
+#endif
+#endif
+#if defined(ATOMIC_USER) && !defined(WOLFSSL_AEAD_ONLY)
+ "-U Atomic User Record Layer Callbacks\n", /* 44 */
+#endif
+#ifdef HAVE_PK_CALLBACKS
+ "-P Public Key Callbacks\n", /* 45 */
+#endif
+#ifdef HAVE_ANON
+ "-a Anonymous client\n", /* 46 */
+#endif
+#ifdef HAVE_CRL
+ "-C Disable CRL\n", /* 47 */
+#endif
+#ifdef WOLFSSL_TRUST_PEER_CERT
+ "-E Path to load trusted peer cert\n", /* 48 */
+#endif
+#ifdef HAVE_WNR
+ "-q Whitewood config file, defaults\n", /* 49 */
+#endif
+ "-H Internal tests"
+ " [defCipherList, exitWithRet, verifyFail, useSupCurve,\n"
+ " loadSSL, disallowETM]\n", /* 50 */
+#ifdef WOLFSSL_TLS13
+ "-J Use HelloRetryRequest to choose group for KE\n", /* 51 */
+ "-K Key Exchange for PSK not using (EC)DHE\n", /* 52 */
+ "-I Update keys and IVs before sending data\n", /* 53 */
+#ifndef NO_DH
+ "-y Key Share with FFDHE named groups only\n", /* 54 */
+#endif
+#ifdef HAVE_ECC
+ "-Y Key Share with ECC named groups only\n", /* 55 */
+#endif
+#endif /* WOLFSSL_TLS13 */
+#ifdef HAVE_CURVE25519
+ "-t Use X25519 for key exchange\n", /* 56 */
+#endif
+#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
+ "-Q Support requesting certificate post-handshake\n", /* 57 */
+#endif
+#ifdef WOLFSSL_EARLY_DATA
+ "-0 Early data sent to server (0-RTT handshake)\n", /* 58 */
+#endif
+#ifdef WOLFSSL_MULTICAST
+ "-3 Multicast, grpid < 256\n", /* 59 */
+#endif
+ "-1 Display a result by specified language.\n"
+ " 0: English, 1: Japanese\n", /* 60 */
+#if !defined(NO_DH) && !defined(HAVE_FIPS) && \
+ !defined(HAVE_SELFTEST) && !defined(WOLFSSL_OLD_PRIME_CHECK)
+ "-2 Disable DH Prime check\n", /* 61 */
+#endif
+#ifdef HAVE_SECURE_RENEGOTIATION
+ "-4 Use resumption for renegotiation\n", /* 62 */
+#endif
+#ifdef HAVE_TRUSTED_CA
+ "-5 Use Trusted CA Key Indication\n", /* 63 */
+#endif
+ "-6 Simulate WANT_WRITE errors on every other IO send\n", /* 64 */
+#ifdef HAVE_CURVE448
+ "-8 Use X448 for key exchange\n", /* 65 */
+#endif
+#if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
+ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
+ !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
+ "-9 Use hash dir look up for certificate loading\n"
+ " loading from /certs folder\n"
+ " files in the folder would have the form \"hash.N\" file name\n"
+ " e.g symbolic link to the file at certs folder\n"
+ " ln -s ca-cert.pem `openssl x509 -in ca-cert.pem -hash -noout`.0\n",
+ /* 66 */
+#endif
+#if defined(WOLFSSL_WOLFSENTRY_HOOKS) && !defined(NO_FILESYSTEM) && \
+ !defined(WOLFSENTRY_NO_JSON)
+ "--wolfsentry-config Path for JSON wolfSentry config\n",
+ /* 67 */
+#endif
+#ifndef WOLFSSL_TLS13
+ "-7 Set minimum downgrade protocol version [0-3] "
+ " SSLv3(0) - TLS1.2(3)\n",
+#else
+ "-7 Set minimum downgrade protocol version [0-4] "
+ " SSLv3(0) - TLS1.3(4)\n", /* 68 */
+#endif
+#ifdef HAVE_PQC
+ "--pqc Key Share with specified post-quantum algorithm only:\n"
+#ifndef WOLFSSL_NO_ML_KEM
+ " ML_KEM_512, ML_KEM_768, ML_KEM_1024,\n"
+ " SecP256r1MLKEM512,\n"
+ " SecP384r1MLKEM768,\n"
+ " SecP521r1MLKEM1024,\n"
+ " SecP256r1MLKEM768,\n"
+ " SecP521r1MLKEM1024,\n"
+ " SecP384r1MLKEM1024,\n"
+ " X25519MLKEM512,\n"
+ " X25519MLKEM768,\n"
+ " X448MLKEM768\n"
+#endif
+#ifdef WOLFSSL_MLKEM_KYBER
+ " KYBER_LEVEL1, KYBER_LEVEL3, KYBER_LEVEL5, "
+ "P256_KYBER_LEVEL1,\n"
+ " P384_KYBER_LEVEL3, P256_KYBER_LEVEL3, "
+ "P521_KYBER_LEVEL5,\n"
+ " X25519_KYBER_LEVEL1, X25519_KYBER_LEVEL3, "
+ "X448_KYBER_LEVEL3\n"
+#endif
+ "",
+ /* 69 */
+#endif
+#ifdef WOLFSSL_SRTP
+ "--srtp (default is SRTP_AES128_CM_SHA1_80)\n", /* 70 */
+#endif
+#ifdef WOLFSSL_SYS_CA_CERTS
+ "--sys-ca-certs Load system CA certs for server cert verification\n", /* 71 */
+#endif
+#ifdef HAVE_SUPPORTED_CURVES
+ "--onlyPskDheKe Must use DHE key exchange with PSK\n", /* 72 */
+#endif
+#ifndef NO_PSK
+ "--openssl-psk Use TLS 1.3 PSK callback compatible with OpenSSL\n", /* 73 */
+#endif
+#ifdef HAVE_RPK
+ "--rpk Use RPK for the defined certificates\n", /* 74 */
+#endif
+ "--files-are-der Specified files are in DER, not PEM format\n", /* 75 */
+#ifdef WOLFSSL_SYS_CRYPTO_POLICY
+ "--crypto-policy \n", /* 76 */
+#endif
+ "\n"
+ "For simpler wolfSSL TLS client examples, visit\n"
+ "https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 77 */
+ NULL,
+ },
+#ifndef NO_MULTIBYTE_PRINT
+ /* Japanese */
+ {
+ " 注意 : 全てのファイルは wolfSSL ホーム・ディレクトリからの相対です。"
+ "\n", /* 0 */
+ "RSAの最大ビットは次のように設定されています: ", /* 1 */
+#ifdef NO_RSA
+ "RSAはサポートされていません。\n", /* 2 */
+#elif defined(WOLFSSL_SP_MATH) /* case of SP math only */
+#ifndef WOLFSSL_SP_NO_3072
+ "3072\n", /* 2 */
+#elif !defined(WOLFSSL_SP_NO_2048)
+ "2048\n", /* 2 */
+#else
+ "0\n", /* 2 */
+#endif
+#elif defined(USE_FAST_MATH)
+#else
+ "無限\n", /* 2 */
+#endif
+ "-? ヘルプ, 使い方を表示\n"
+ " 0: 英語、 1: 日本語\n"
+ "--ヘルプ 日本語で使い方を表示\n", /* 3 */
+ "-h 接続先ホスト, 既定値", /* 4 */
+ "-p 接続先ポート, 0は無効, 既定値", /* 5 */
+
+#ifndef WOLFSSL_TLS13
+ "-v SSL バージョン [0-3], SSLv3(0) - TLS1.2(3)),"
+ " 既定値", /* 6 */
+ "-V 有効な ssl バージョン番号を出力, SSLv3(0) -"
+ " TLS1.2(3)\n", /* 7 */
+#else
+ "-v SSL バージョン [0-4], SSLv3(0) - TLS1.3(4)),"
+ " 既定値", /* 6 */
+ "-V 有効な ssl バージョン番号を出力, SSLv3(0) -"
+ " TLS1.3(4)\n", /* 7 */
+#endif
+ "-l 暗号スイートリスト (区切り文字 :)\n", /* 8 */
+#ifndef NO_CERTS
+ "-c 証明書ファイル, 既定値", /* 9 */
+ "-k 鍵ファイル, 既定値", /* 10 */
+ "-A 認証局ファイル, 既定値", /* 11 */
+#endif
+#ifndef NO_DH
+ "-Z 最小 DH 鍵 ビット, 既定値", /* 12 */
+#endif
+ "-b ベンチマーク 接続及び結果出力する\n", /* 13 */
+#ifdef HAVE_ALPN
+ "-L アプリケーション層プロトコルネゴシエーションを行う"
+ " ({C,F}:)\n", /* 14 */
+#endif
+ "-B