Skip to content

Commit f6e930f

Browse files
committed
add regression tests for name constraints. adds necessary certs to test logic
add same DN test
1 parent 710e376 commit f6e930f

11 files changed

Lines changed: 459 additions & 1 deletion

certs/renewcerts.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,17 @@ run_renewcerts(){
888888
echo "End of section"
889889
echo "---------------------------------------------------------------------"
890890
############################################################
891+
###### calling gen-nc-ancestor.sh ##################
892+
############################################################
893+
echo "Calling gen-nc-ancestor.sh"
894+
echo ""
895+
cd ./test/nc-ancestor || { echo "Failed to switch to dir ./test/nc-ancestor"; exit 1; }
896+
./gen-nc-ancestor.sh
897+
check_result $? "gen-nc-ancestor.sh"
898+
cd ../../ || exit 1
899+
echo "End of section"
900+
echo "---------------------------------------------------------------------"
901+
############################################################
891902
###### generate cms bundles in test directory ##############
892903
############################################################
893904
echo "Generating CMS bundle"

certs/test/include.am

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,12 @@ EXTRA_DIST += \
104104
certs/test/expired/expired-ca.der \
105105
certs/test/expired/expired-cert.pem \
106106
certs/test/expired/expired-cert.der
107+
108+
EXTRA_DIST += \
109+
certs/test/nc-ancestor/gen-nc-ancestor.sh \
110+
certs/test/nc-ancestor/00-root.cert.pem \
111+
certs/test/nc-ancestor/00-uri-permit-ca-permissive.cert.pem \
112+
certs/test/nc-ancestor/01-uri-permit-ca.cert.pem \
113+
certs/test/nc-ancestor/02-benign-sub-ca.cert.pem \
114+
certs/test/nc-ancestor/03-leaf-chain.cert.pem \
115+
certs/test/nc-ancestor/03-valid-leaf.cert.pem
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBszCCAVmgAwIBAgIVAJXi3vVvITnmiOESBz9aZSr2FeebMAoGCCqGSM49BAMC
3+
MDcxCzAJBgNVBAYTAlVTMREwDwYDVQQKDAhOQyBUZXN0czEVMBMGA1UEAwwMTkMg
4+
VGVzdCBSb290MB4XDTI2MDYxMDIyNDEyMVoXDTI5MDMwNjIyNDEyMVowNzELMAkG
5+
A1UEBhMCVVMxETAPBgNVBAoMCE5DIFRlc3RzMRUwEwYDVQQDDAxOQyBUZXN0IFJv
6+
b3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASxhvIYQxpzgpaUMoI+04PSN46R
7+
kdVFF5nN4f2ifI+m+QkBMrg7dZOGS0Fn31Uw8esgp66J6qn912rWkFLfFad2o0Iw
8+
QDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUakaR
9+
hB1zSHLZ5x4HovqETbOGflUwCgYIKoZIzj0EAwIDSAAwRQIhAMaH7J1DJvZJ5jif
10+
Rc1BxlesFk85nss/doH8Aw8LBTIWAiBw603a/kNSZSAnfp8i460kA8ACgZ9lYeQE
11+
Cs3h03BtwQ==
12+
-----END CERTIFICATE-----
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBtTCCAVqgAwIBAgIUYLjQNUilzxwweoDkWt+vCJIGZSAwCgYIKoZIzj0EAwIw
3+
ODELMAkGA1UEBhMCVVMxETAPBgNVBAoMCE5DIFRlc3RzMRYwFAYDVQQDDA1VUkkg
4+
UGVybWl0IENBMB4XDTI2MDYxNjE4NTM1N1oXDTI5MDMxMjE4NTM1N1owODELMAkG
5+
A1UEBhMCVVMxETAPBgNVBAoMCE5DIFRlc3RzMRYwFAYDVQQDDA1VUkkgUGVybWl0
6+
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfrp50Uy5VOuiDZAV1g+GjazW
7+
VrGrSi01pj1XIUh0Ps99CTlrrZoKMqIORMvLlvp0vRFC/9xPlBVYAYAaGuehzqNC
8+
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFGux
9+
5AbbDYYMEDI3Upw5mOhCYJjIMAoGCCqGSM49BAMCA0kAMEYCIQC33fvrOa+N0g8M
10+
nGJ6Ra6FnYvaHZFHxP283jIaVkqLiQIhAKIQ/alOoi2Pc/YvaHFse1gVViCekrr0
11+
JF+/6lYl9eZx
12+
-----END CERTIFICATE-----
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIB9jCCAZ2gAwIBAgIVAMWBSaX4LIyu99TUdBqrX7qJfvsNMAoGCCqGSM49BAMC
3+
MDcxCzAJBgNVBAYTAlVTMREwDwYDVQQKDAhOQyBUZXN0czEVMBMGA1UEAwwMTkMg
4+
VGVzdCBSb290MB4XDTI2MDYxMDIyNDEyMVoXDTI5MDMwNjIyNDEyMVowODELMAkG
5+
A1UEBhMCVVMxETAPBgNVBAoMCE5DIFRlc3RzMRYwFAYDVQQDDA1VUkkgUGVybWl0
6+
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1wPAznCjB4X/lwUgJEfJCA3G
7+
r8+LSBmR7zAi8puv1iAMPJqdXtMgVeiGS0oN86Gl5lLAxuLUOwVZaK/9iF55QqOB
8+
hDCBgTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQU
9+
2UGgcB/9rFl6Chp6LvNdPChyQOcwHwYDVR0jBBgwFoAUakaRhB1zSHLZ5x4HovqE
10+
TbOGflUwHgYDVR0eAQH/BBQwEqAQMA6GDC5leGFtcGxlLmNvbTAKBggqhkjOPQQD
11+
AgNHADBEAiA0ZSgJqvBH8IAW9X/4qkas3aLg/e/mDcXFU3Ll0V6A9QIgW2UxJpPq
12+
nK+2qXvUEfPfKt9YJhva0NtcHawG99UwCTI=
13+
-----END CERTIFICATE-----
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIB1jCCAXygAwIBAgIVAKx8tKw6QphEOtBgHbQMCKaB6jnvMAoGCCqGSM49BAMC
3+
MDgxCzAJBgNVBAYTAlVTMREwDwYDVQQKDAhOQyBUZXN0czEWMBQGA1UEAwwNVVJJ
4+
IFBlcm1pdCBDQTAeFw0yNjA2MTAyMjQxMjFaFw0yOTAzMDYyMjQxMjFaMDgxCzAJ
5+
BgNVBAYTAlVTMREwDwYDVQQKDAhOQyBUZXN0czEWMBQGA1UEAwwNQmVuaWduIFN1
6+
YiBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCwaQDa0aKS3j1A+YMqdYceA
7+
mORZW14nICQlx+upj7W+eXG0JQvrRZLw6ROOYbhTaOsU03kzhUx7wo/aOAKdiuej
8+
YzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBQq
9+
FqZNx/PQ4/hypBU0BAGbw3+whDAfBgNVHSMEGDAWgBTZQaBwH/2sWXoKGnou8108
10+
KHJA5zAKBggqhkjOPQQDAgNIADBFAiEA38BZ/g1qaUFKPoR7Svum4mr6oN57Pgh+
11+
DxELpfQHxoACIEEWUBDItBGAC2MPI6as4w7t6Iz/mYWkWgb22ShXgWSs
12+
-----END CERTIFICATE-----
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICGzCCAcCgAwIBAgIUatTgVUySbR6t3cVQhx1kbrMERb0wCgYIKoZIzj0EAwIw
3+
ODELMAkGA1UEBhMCVVMxETAPBgNVBAoMCE5DIFRlc3RzMRYwFAYDVQQDDA1CZW5p
4+
Z24gU3ViIENBMB4XDTI2MDYxMDIyNDEyMVoXDTI5MDMwNjIyNDEyMVowQDELMAkG
5+
A1UEBhMCVVMxETAPBgNVBAoMCE5DIFRlc3RzMR4wHAYDVQQDDBVOQyBUZXN0IEF0
6+
dGFja2VyIExlYWYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATw19KmMSJmcuRm
7+
6JCpmIULNQouTvnKo/RSM835dwDx3lvhq+XITHyG4jSK6OOSDU3GR3NSXciV2uc3
8+
QQe43Llio4GfMIGcMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgWgMBMGA1Ud
9+
JQQMMAoGCCsGAQUFBwMBMB0GA1UdDgQWBBTBzmxwEPtYNq00q3Abzs/mrvzErjAf
10+
BgNVHSMEGDAWgBQqFqZNx/PQ4/hypBU0BAGbw3+whDAnBgNVHREBAf8EHTAbhhlo
11+
dHRwczovL2F0dGFja2VyLmNvbS9sZWFmMAoGCCqGSM49BAMCA0kAMEYCIQCNQqLZ
12+
CljaJx8J9GDnh4Fr4/CGgXfkw0K/IgcQGrt4sAIhAM2XsX/8HCNz/oZDHgvalnrj
13+
+Vr8R3DoFPo6YxvwNvga
14+
-----END CERTIFICATE-----
15+
-----BEGIN CERTIFICATE-----
16+
MIIB1jCCAXygAwIBAgIVAKx8tKw6QphEOtBgHbQMCKaB6jnvMAoGCCqGSM49BAMC
17+
MDgxCzAJBgNVBAYTAlVTMREwDwYDVQQKDAhOQyBUZXN0czEWMBQGA1UEAwwNVVJJ
18+
IFBlcm1pdCBDQTAeFw0yNjA2MTAyMjQxMjFaFw0yOTAzMDYyMjQxMjFaMDgxCzAJ
19+
BgNVBAYTAlVTMREwDwYDVQQKDAhOQyBUZXN0czEWMBQGA1UEAwwNQmVuaWduIFN1
20+
YiBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCwaQDa0aKS3j1A+YMqdYceA
21+
mORZW14nICQlx+upj7W+eXG0JQvrRZLw6ROOYbhTaOsU03kzhUx7wo/aOAKdiuej
22+
YzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBQq
23+
FqZNx/PQ4/hypBU0BAGbw3+whDAfBgNVHSMEGDAWgBTZQaBwH/2sWXoKGnou8108
24+
KHJA5zAKBggqhkjOPQQDAgNIADBFAiEA38BZ/g1qaUFKPoR7Svum4mr6oN57Pgh+
25+
DxELpfQHxoACIEEWUBDItBGAC2MPI6as4w7t6Iz/mYWkWgb22ShXgWSs
26+
-----END CERTIFICATE-----
27+
-----BEGIN CERTIFICATE-----
28+
MIIB9jCCAZ2gAwIBAgIVAMWBSaX4LIyu99TUdBqrX7qJfvsNMAoGCCqGSM49BAMC
29+
MDcxCzAJBgNVBAYTAlVTMREwDwYDVQQKDAhOQyBUZXN0czEVMBMGA1UEAwwMTkMg
30+
VGVzdCBSb290MB4XDTI2MDYxMDIyNDEyMVoXDTI5MDMwNjIyNDEyMVowODELMAkG
31+
A1UEBhMCVVMxETAPBgNVBAoMCE5DIFRlc3RzMRYwFAYDVQQDDA1VUkkgUGVybWl0
32+
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1wPAznCjB4X/lwUgJEfJCA3G
33+
r8+LSBmR7zAi8puv1iAMPJqdXtMgVeiGS0oN86Gl5lLAxuLUOwVZaK/9iF55QqOB
34+
hDCBgTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQU
35+
2UGgcB/9rFl6Chp6LvNdPChyQOcwHwYDVR0jBBgwFoAUakaRhB1zSHLZ5x4HovqE
36+
TbOGflUwHgYDVR0eAQH/BBQwEqAQMA6GDC5leGFtcGxlLmNvbTAKBggqhkjOPQQD
37+
AgNHADBEAiA0ZSgJqvBH8IAW9X/4qkas3aLg/e/mDcXFU3Ll0V6A9QIgW2UxJpPq
38+
nK+2qXvUEfPfKt9YJhva0NtcHawG99UwCTI=
39+
-----END CERTIFICATE-----
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICGjCCAcCgAwIBAgIVAMoFBI5Onz8UCFQ9o8tJQ6vGWwonMAoGCCqGSM49BAMC
3+
MDgxCzAJBgNVBAYTAlVTMREwDwYDVQQKDAhOQyBUZXN0czEWMBQGA1UEAwwNQmVu
4+
aWduIFN1YiBDQTAeFw0yNjA2MTAyMjQxMjFaFw0yOTAzMDYyMjQxMjFaMD0xCzAJ
5+
BgNVBAYTAlVTMREwDwYDVQQKDAhOQyBUZXN0czEbMBkGA1UEAwwSTkMgVGVzdCBW
6+
YWxpZCBMZWFmMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUbPrfhvey3eHKtMu
7+
Nv3ys2G1cwBPUgCez/CmW0SIaxR219reC7gt7x0DKvWHZM6nRUo0bh13lE+dhlCB
8+
w8n3HKOBoTCBnjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUE
9+
DDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUhBa9znRuVy9+W6CgQ8NY3utPy8UwHwYD
10+
VR0jBBgwFoAUKhamTcfz0OP4cqQVNAQBm8N/sIQwKQYDVR0RAQH/BB8wHYYbaHR0
11+
cHM6Ly9iZW5pZ24uZXhhbXBsZS5jb20vMAoGCCqGSM49BAMCA0gAMEUCIQCntd7i
12+
6xUvNiaGyMdzTa4ArJ/yVB9x5oUxlWtgzNMnXQIgb1FJXrLwN7dVDYMT2aApfRno
13+
tBBJwUIPZR0J946US4M=
14+
-----END CERTIFICATE-----
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
#!/usr/bin/env bash
2+
# Regenerate the NameConstraints ancestor-walk test PEMs.
3+
#
4+
# Chains produced:
5+
#
6+
# Negative (leaf violates grandparent's URI permit):
7+
# 00-root -> 01-uri-permit-ca (permits URI:.example.com) ->
8+
# 02-benign-sub-ca -> 03-leaf (URI:https://attacker.com/leaf)
9+
# Emitted as concatenated bundle 03-leaf-chain.cert.pem; only the
10+
# leaf is verified by the test, but the bundle order keeps the file
11+
# self-documenting.
12+
#
13+
# Positive (chain that should verify successfully):
14+
# 00-root -> 01-uri-permit-ca -> 02-benign-sub-ca ->
15+
# 03-valid-leaf (URI:https://benign.example.com/)
16+
#
17+
# SKID disambiguation (same DN as 01-uri-permit-ca, different key, no NC):
18+
# self-signed 00-uri-permit-ca-permissive
19+
# Sits in the CM as a same-DN distractor; the ancestor walk must use
20+
# AKID->SKID lookup (not a name-only walk) to pick the real signer.
21+
#
22+
# NotBefore is the current wall-clock time and NotAfter is +1000d, set by
23+
# openssl's -days 1000 flag. Serial numbers come from openssl's default
24+
# random generator. Re-running this script rewrites the PEMs with new
25+
# serials and shifted validity windows; the tests only assert verify
26+
# behavior, not specific cert bytes.
27+
28+
set -euo pipefail
29+
30+
DIR="$(cd "$(dirname "$0")" && pwd)"
31+
WORK="$(mktemp -d)"
32+
trap 'rm -rf "$WORK"' EXIT
33+
34+
cd "$WORK"
35+
36+
CURVE="prime256v1"
37+
38+
# ---- helpers ----
39+
40+
mkkey() {
41+
# $1 = key file
42+
openssl ecparam -name "$CURVE" -genkey -noout -out "$1"
43+
}
44+
45+
mkroot() {
46+
# $1 = key, $2 = cert out, $3 = subject CN, $4 = ext-file
47+
openssl req -new -x509 -key "$1" -out "$2" \
48+
-subj "/C=US/O=NC Tests/CN=$3" \
49+
-config "$4" -extensions v3_ca \
50+
-set_serial "0x$(openssl rand -hex 20)" \
51+
-days 1000 -sha256
52+
}
53+
54+
# Issue a child cert from $issuer_key / $issuer_cert using ext-file $4.
55+
# $1 child-key $2 child-csr-subject-CN $3 out-cert $4 ext-file $5 ext-section
56+
mkchild() {
57+
local child_key=$1 cn=$2 out=$3 extfile=$4 extsec=$5
58+
openssl req -new -key "$child_key" -out child.csr \
59+
-subj "/C=US/O=NC Tests/CN=$cn" -config "$extfile"
60+
openssl x509 -req -in child.csr \
61+
-CA "$issuer_cert" -CAkey "$issuer_key" \
62+
-set_serial "0x$(openssl rand -hex 20)" \
63+
-out "$out" -days 1000 -sha256 \
64+
-extfile "$extfile" -extensions "$extsec"
65+
rm -f child.csr
66+
}
67+
68+
# ---- ext configs ----
69+
70+
cat > root.cnf <<'EOF'
71+
[req]
72+
distinguished_name = dn
73+
prompt = no
74+
[dn]
75+
[v3_ca]
76+
basicConstraints = critical, CA:TRUE
77+
keyUsage = critical, digitalSignature, keyCertSign, cRLSign
78+
subjectKeyIdentifier = hash
79+
EOF
80+
81+
cat > uri-permit-ca.cnf <<'EOF'
82+
[req]
83+
distinguished_name = dn
84+
prompt = no
85+
[dn]
86+
[v3_uri_permit]
87+
basicConstraints = critical, CA:TRUE
88+
keyUsage = critical, digitalSignature, keyCertSign, cRLSign
89+
subjectKeyIdentifier = hash
90+
authorityKeyIdentifier = keyid
91+
nameConstraints = critical, permitted;URI:.example.com
92+
EOF
93+
94+
cat > sub-ca-nonc.cnf <<'EOF'
95+
[req]
96+
distinguished_name = dn
97+
prompt = no
98+
[dn]
99+
[v3_sub_ca]
100+
basicConstraints = critical, CA:TRUE
101+
keyUsage = critical, digitalSignature, keyCertSign, cRLSign
102+
subjectKeyIdentifier = hash
103+
authorityKeyIdentifier = keyid
104+
EOF
105+
106+
cat > leaf-attacker.cnf <<'EOF'
107+
[req]
108+
distinguished_name = dn
109+
prompt = no
110+
[dn]
111+
[v3_leaf_attacker]
112+
basicConstraints = critical, CA:FALSE
113+
keyUsage = critical, digitalSignature, keyEncipherment
114+
extendedKeyUsage = serverAuth
115+
subjectKeyIdentifier = hash
116+
authorityKeyIdentifier = keyid
117+
subjectAltName = critical, URI:https://attacker.com/leaf
118+
EOF
119+
120+
cat > leaf-valid.cnf <<'EOF'
121+
[req]
122+
distinguished_name = dn
123+
prompt = no
124+
[dn]
125+
[v3_leaf_valid]
126+
basicConstraints = critical, CA:FALSE
127+
keyUsage = critical, digitalSignature, keyEncipherment
128+
extendedKeyUsage = serverAuth
129+
subjectKeyIdentifier = hash
130+
authorityKeyIdentifier = keyid
131+
subjectAltName = critical, URI:https://benign.example.com/
132+
EOF
133+
134+
# ---- root ----
135+
136+
mkkey root.key
137+
mkroot root.key 00-root.cert.pem "NC Test Root" root.cnf
138+
139+
# ---- 01 uri-permit-ca (permits URI:.example.com), issued by root ----
140+
141+
mkkey uri-permit-ca.key
142+
issuer_cert=00-root.cert.pem; issuer_key=root.key
143+
mkchild uri-permit-ca.key "URI Permit CA" 01-uri-permit-ca.cert.pem \
144+
uri-permit-ca.cnf v3_uri_permit
145+
146+
# ---- 01 permissive sibling (same DN as 01-uri-permit-ca, different key,
147+
# no NC). Self-signed so it isn't part of any chain of trust; sits
148+
# in the CM purely as a same-DN distractor for the ancestor walk's
149+
# AKID->SKID disambiguation test.
150+
#
151+
# The wolfSSL CM hash-buckets signers by SKID into CA_TABLE_SIZE=11 rows.
152+
# A name-only lookup (the walk's fallback when AKID disambiguation is
153+
# broken) iterates rows 0..10 and returns the first match. For the
154+
# regression test to FAIL when disambiguation is broken, the permissive
155+
# sibling must land in a row strictly less than the strict variant's so
156+
# the name-only lookup surfaces it. Iterate key generation until that
157+
# holds. ----
158+
159+
# Compute the CM row index for a cert's SKID:
160+
# row = (first 4 SKID bytes as big-endian word) mod 11
161+
# Mirrors HashSigner() in src/ssl_certman.c.
162+
skid_bucket() {
163+
local hex
164+
hex=$(openssl x509 -in "$1" -noout -ext subjectKeyIdentifier \
165+
| grep -E '^[[:space:]]+[A-Fa-f0-9]' | head -1 \
166+
| tr -d ' :' | head -c 8)
167+
echo $(( 0x$hex % 11 ))
168+
}
169+
170+
strict_bucket=$(skid_bucket 01-uri-permit-ca.cert.pem)
171+
if (( strict_bucket == 0 )); then
172+
echo "ERROR: strict CA hashed to row 0; cannot place permissive sibling lower." >&2
173+
echo " Rerun the script to rotate the strict CA's SKID." >&2
174+
exit 1
175+
fi
176+
177+
attempts=0
178+
perm_bucket=$strict_bucket
179+
while (( attempts < 200 )); do
180+
attempts=$(( attempts + 1 ))
181+
mkkey uri-permit-ca-permissive.key
182+
mkroot uri-permit-ca-permissive.key 00-uri-permit-ca-permissive.cert.pem \
183+
"URI Permit CA" root.cnf
184+
perm_bucket=$(skid_bucket 00-uri-permit-ca-permissive.cert.pem)
185+
if (( perm_bucket < strict_bucket )); then
186+
break
187+
fi
188+
done
189+
if (( perm_bucket >= strict_bucket )); then
190+
echo "ERROR: failed to land permissive sibling below row $strict_bucket after $attempts tries." >&2
191+
exit 1
192+
fi
193+
echo "Permissive sibling: row $perm_bucket < strict row $strict_bucket (after $attempts tries)"
194+
195+
# ---- 02 benign-sub-ca (no NC, no URI SAN), issued by uri-permit-ca ----
196+
197+
mkkey benign-sub-ca.key
198+
issuer_cert=01-uri-permit-ca.cert.pem; issuer_key=uri-permit-ca.key
199+
mkchild benign-sub-ca.key "Benign Sub CA" 02-benign-sub-ca.cert.pem \
200+
sub-ca-nonc.cnf v3_sub_ca
201+
202+
# ---- 03 leaf (URI:attacker.com/leaf -- violates grandparent's permit) ----
203+
204+
mkkey leaf-attacker.key
205+
issuer_cert=02-benign-sub-ca.cert.pem; issuer_key=benign-sub-ca.key
206+
mkchild leaf-attacker.key "NC Test Attacker Leaf" 03-leaf.cert.pem \
207+
leaf-attacker.cnf v3_leaf_attacker
208+
209+
# ---- 03 valid-leaf (URI:benign.example.com -- inside permit) ----
210+
211+
mkkey leaf-valid.key
212+
issuer_cert=02-benign-sub-ca.cert.pem; issuer_key=benign-sub-ca.key
213+
mkchild leaf-valid.key "NC Test Valid Leaf" 03-valid-leaf.cert.pem \
214+
leaf-valid.cnf v3_leaf_valid
215+
216+
# ---- copy into destination ----
217+
218+
cp -f 00-root.cert.pem 01-uri-permit-ca.cert.pem \
219+
00-uri-permit-ca-permissive.cert.pem \
220+
02-benign-sub-ca.cert.pem 03-valid-leaf.cert.pem \
221+
"$DIR/"
222+
223+
# Concatenated bundle (attacker leaf + benign-sub-ca + uri-permit-ca).
224+
# CertManagerVerify reads only the first PEM block (the leaf); the
225+
# trailing CAs keep the file self-documenting. Order: leaf first, then
226+
# ascending issuers.
227+
cat 03-leaf.cert.pem 02-benign-sub-ca.cert.pem 01-uri-permit-ca.cert.pem \
228+
> "$DIR/03-leaf-chain.cert.pem"
229+
230+
echo "Generated chain in $DIR/"
231+
ls -la "$DIR/"

0 commit comments

Comments
 (0)