From 5b535a091b919dfe696485f9ce2c188c1f426438 Mon Sep 17 00:00:00 2001 From: Gilles Peskine Date: Tue, 12 May 2026 13:16:26 +0200 Subject: [PATCH] Add test certificate with basicConstraints containing only an INTEGER The basicConstraints extension contains only an INTEGER. According to RFC 5280, this should be cA=FALSE and a pathLenConstraint value which is effectively ignored. But Mbed TLS parses it as cA=TRUE if the integer value is nonzero. This certificate is syntactically valid, but RFC 5280 forbids CAs from emitting it. Compliant X.509 parsers treat it as cA=FALSE. Signed-off-by: Gilles Peskine --- data_files/Makefile | 16 ++++++++++++++++ ....basic-constraints-integer-first.badsign.crt | Bin 0 -> 461 bytes ...sic-constraints-integer-first.selfsigned.crt | Bin 0 -> 347 bytes 3 files changed, 16 insertions(+) create mode 100644 data_files/parse_input/server5.basic-constraints-integer-first.badsign.crt create mode 100644 data_files/parse_input/server5.basic-constraints-integer-first.selfsigned.crt diff --git a/data_files/Makefile b/data_files/Makefile index 4a1b03f63..5a379a99a 100644 --- a/data_files/Makefile +++ b/data_files/Makefile @@ -2328,6 +2328,22 @@ parse_input/server5.basic-constraints-sequence-overflow.selfsigned.crt: parse_in -inform DER -in $< -outform DER -out $@ all_final += parse_input/server5.basic-constraints-sequence-overflow.selfsigned.crt +# Replace a well-formed basicConstraints extension containing CA:TRUE with +# a malformed extension that is empty with trailing junk. The trailing +# junk is a boolean with the value true, thus it would be interpreted as +# CA:TRUE if it was properly inside the basicConstraints extension. +parse_input/server5.basic-constraints-integer-first.badsign.crt: server5-ca.der + perl -0777 -pe '$$n = s/\x04\x05\x30\x03\x01\x01\xff/\x04\x05\x30\x03\x02\x01\x01/g; die "More substitutions than expected" if $$n > 1; die "Substitution not found" if $$n < 1' <$< >$@.tmp + mv $@.tmp $@ +all_final += parse_input/server5.basic-constraints-integer-first.badsign.crt + +parse_input/server5.basic-constraints-integer-first.selfsigned.crt: parse_input/server5.basic-constraints-integer-first.badsign.crt server5.key + $(OPENSSL) x509 -subj '/CN=Eve/' \ + -key server5.key \ + -days 3653 \ + -inform DER -in $< -outform DER -out $@ +all_final += parse_input/server5.basic-constraints-integer-first.selfsigned.crt + # MD5 test certificate cert_md_test_key = $(cli_crt_key_file_rsa) diff --git a/data_files/parse_input/server5.basic-constraints-integer-first.badsign.crt b/data_files/parse_input/server5.basic-constraints-integer-first.badsign.crt new file mode 100644 index 0000000000000000000000000000000000000000..75d734a9a3a135c6c92aa791406ce642b0cb9272 GIT binary patch literal 461 zcmXqLVmxWk#8|L^nTe5!i6?l`X>TFFwav9Frff3cV&l+i^EhYA!pvmgZYXRZ$i^JX z!py@}oSKtXoSB}Nnqnwmzy}iK=3y^MEiTE-OE(lW;0K9t@o)s>=Oh*d2m2Uu8*qYz z*o2wU&zhn{{E4H_*<4|@v zZ|K=BExuojC$_x(zu3vZ0qjdzVMfOPEUX5=uww)Vge*Tu02p5E4FnzYq4k_a}Xltf~S4(W8a< literal 0 HcmV?d00001 diff --git a/data_files/parse_input/server5.basic-constraints-integer-first.selfsigned.crt b/data_files/parse_input/server5.basic-constraints-integer-first.selfsigned.crt new file mode 100644 index 0000000000000000000000000000000000000000..d57fe4a21e80f6ba9ffa3e18a112c1f6bb07ee5f GIT binary patch literal 347 zcmXqLVhlHE{I`IaiIItkCwS3mZy~?6&9y70Y%<_t{|b5UYJRd!EV-~&Wb5|~rO2d7eoq;0C=337rGLpJHdbtJSI433a^BFh zU0Qs<7*A|@`+u>Mfr9}*&}p*5jEw(TSPg(aVKm?a3GjmifUak6FpvfD`B=nQL;@0* z_FrMYdA*5|=V@wvPqN!`;eE(nW%gh&aAi_txK