diff --git a/boring/src/x509/tests/mod.rs b/boring/src/x509/tests/mod.rs index eda694f35..d7b209581 100644 --- a/boring/src/x509/tests/mod.rs +++ b/boring/src/x509/tests/mod.rs @@ -16,6 +16,7 @@ use crate::x509::verify::X509CheckFlags; use crate::x509::{X509Extension, X509Name, X509Req, X509StoreContext, X509}; const TEST_CERT_DIGEST: &str = "585e3a58acfd3b4e5e2825659407244ddd93539c"; +mod path_len; mod trusted_first; fn pkey() -> PKey { diff --git a/boring/src/x509/tests/path_len.rs b/boring/src/x509/tests/path_len.rs new file mode 100644 index 000000000..39eee2ea2 --- /dev/null +++ b/boring/src/x509/tests/path_len.rs @@ -0,0 +1,90 @@ +//! See https://github.com/google/boringssl/commit/ed00cfde0 and the +//! `PathLenSelfIssuedNotCountedButStillVerified` test in `crypto/x509/x509_test.cc`. +//! +//! Fixtures are generated by `boring/test/generate-path-len-rollover-certs.sh`. + +use crate::stack::Stack; +use crate::x509::store::X509StoreBuilder; +use crate::x509::verify::X509VerifyParamRef; +use crate::x509::{X509Ref, X509StoreContext, X509VerifyError, X509VerifyResult, X509}; + +#[test] +fn test_self_issued_rollover() { + let root = X509::from_pem(include_bytes!("../../../test/path-len-rollover-root.pem")).unwrap(); + let int2 = X509::from_pem(include_bytes!("../../../test/path-len-rollover-int2.pem")).unwrap(); + let int2_pathlen0 = X509::from_pem(include_bytes!( + "../../../test/path-len-rollover-int2-pathlen0.pem" + )) + .unwrap(); + let rollover = X509::from_pem(include_bytes!( + "../../../test/path-len-rollover-rollover.pem" + )) + .unwrap(); + let rollover_pathlen0 = X509::from_pem(include_bytes!( + "../../../test/path-len-rollover-rollover-pathlen0.pem" + )) + .unwrap(); + let int1 = X509::from_pem(include_bytes!("../../../test/path-len-rollover-int1.pem")).unwrap(); + let leaf = X509::from_pem(include_bytes!("../../../test/path-len-rollover-leaf.pem")).unwrap(); + + // Leaf -- Int1 -- Rollover -- Int2 -- Root + // + // Rollover is self-issued: it has Int2's name and is signed by Int2's old key, but carries + // Int2's new key. It does not count towards the path length, so pathlen 1 on both Int2 and + // Rollover is enough to cover Int1. + assert_eq!( + Ok(()), + verify(&leaf, &[&root], &[&int1, &rollover, &int2], |_| {}) + ); + + // Rollover's own pathlen is still enforced, and pathlen 0 does not allow Int1 below it. + // BoringSSL ignored this before ed00cfde0. + assert_eq!( + Err(X509VerifyError::PATH_LENGTH_EXCEEDED), + verify(&leaf, &[&root], &[&int1, &rollover_pathlen0, &int2], |_| {}) + ); + + // Int1 still counts against Int2's pathlen, even with Rollover in between. + assert_eq!( + Err(X509VerifyError::PATH_LENGTH_EXCEEDED), + verify(&leaf, &[&root], &[&int1, &rollover, &int2_pathlen0], |_| {}) + ); +} + +fn verify( + cert: &X509Ref, + trusted: &[&X509Ref], + untrusted: &[&X509Ref], + configure: impl FnOnce(&mut X509VerifyParamRef), +) -> X509VerifyResult { + let trusted = { + let mut builder = X509StoreBuilder::new().unwrap(); + + for cert in trusted { + builder.add_cert(cert).unwrap(); + } + + builder.build() + }; + + let untrusted = { + let mut stack = Stack::new().unwrap(); + + for cert in untrusted { + stack.push((**cert).to_owned()).unwrap(); + } + + stack + }; + + let mut store_ctx = X509StoreContext::new().unwrap(); + + store_ctx + .init(&trusted, cert, &untrusted, |ctx| { + configure(ctx.verify_param_mut()); + ctx.verify_cert().unwrap(); + + Ok(ctx.verify_result()) + }) + .expect("failed to obtain X509VerifyResult") +} diff --git a/boring/test/generate-path-len-rollover-certs.sh b/boring/test/generate-path-len-rollover-certs.sh new file mode 100755 index 000000000..08c842fdd --- /dev/null +++ b/boring/test/generate-path-len-rollover-certs.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +# Generates the certificates used by `boring/src/x509/tests/path_len.rs`. +# +# The chain models a CA key rollover, where Int2 re-keys itself by issuing a +# self-issued (same subject and issuer name, different key) certificate: +# +# Root +# └─ Int2 (old key, pathlen 1 or 0) +# └─ Rollover (Int2 name, new key, signed by old key, pathlen 1 or 0) +# └─ Int1 +# └─ Leaf +# +# RFC 5280 says self-issued intermediates do not count towards the path length, +# but their own pathLenConstraint still applies. BoringSSL only enforces the +# latter since ed00cfde0. +# +# The *-pathlen0 variants are reissued from the same key and name as their +# pathlen 1 counterparts, so the rest of the chain is shared. +# +# CA keys are committed so the chain can be reissued (e.g. to extend validity) +# without changing key identifiers. Missing keys are generated. The leaf key is +# discarded. +set -euo pipefail + +cd "$(dirname "$0")" +NAME=path-len-rollover +DAYS=7300 + +ROOT_SUBJ="/CN=Path Len Rollover Test Root" +INT2_SUBJ="/CN=Path Len Rollover Test Int2" +INT1_SUBJ="/CN=Path Len Rollover Test Int1" +LEAF_SUBJ="/CN=localhost" + +for key in root int2 int2-new int1; do + if [[ ! -f "${NAME}-${key}.key" ]]; then + openssl genrsa -traditional -out "${NAME}-${key}.key" 2048 + fi +done +openssl genrsa -out "${NAME}-leaf-key.pem" 2048 + +# issue OUT KEY SUBJECT CA_CERT CA_KEY EXTENSION... +issue() { + local out=$1 key=$2 subj=$3 ca_cert=$4 ca_key=$5 + shift 5 + openssl req -new -key "${key}" -subj "${subj}" -out "${NAME}.csr" + openssl x509 -req \ + -in "${NAME}.csr" \ + -CA "${ca_cert}" \ + -CAkey "${ca_key}" \ + -CAserial "${NAME}.srl" \ + -CAcreateserial \ + -out "${out}" \ + -days "${DAYS}" \ + -extfile <(printf '%s\n' "$@" \ + 'subjectKeyIdentifier=hash' \ + 'authorityKeyIdentifier=keyid:always') +} + +CA_KEY_USAGE='keyUsage=critical,keyCertSign,cRLSign' + +# Self-signed root. +openssl req -new -x509 \ + -key "${NAME}-root.key" \ + -out "${NAME}-root.pem" \ + -days "${DAYS}" \ + -subj "${ROOT_SUBJ}" \ + -addext "basicConstraints=critical,CA:TRUE" \ + -addext "${CA_KEY_USAGE}" \ + -addext "subjectKeyIdentifier=hash" \ + -addext "authorityKeyIdentifier=keyid:always" + +# Int2 with its old key, issued by Root. +for pathlen in 1 0; do + suffix=$([[ ${pathlen} == 0 ]] && echo "-pathlen0" || true) + issue "${NAME}-int2${suffix}.pem" "${NAME}-int2.key" "${INT2_SUBJ}" \ + "${NAME}-root.pem" "${NAME}-root.key" \ + "basicConstraints=critical,CA:TRUE,pathlen:${pathlen}" "${CA_KEY_USAGE}" +done + +# Rollover: Int2's name and new key, signed by Int2's old key. +for pathlen in 1 0; do + suffix=$([[ ${pathlen} == 0 ]] && echo "-pathlen0" || true) + issue "${NAME}-rollover${suffix}.pem" "${NAME}-int2-new.key" "${INT2_SUBJ}" \ + "${NAME}-int2.pem" "${NAME}-int2.key" \ + "basicConstraints=critical,CA:TRUE,pathlen:${pathlen}" "${CA_KEY_USAGE}" +done + +# Int1, issued by Int2's new key (i.e. by Rollover). +issue "${NAME}-int1.pem" "${NAME}-int1.key" "${INT1_SUBJ}" \ + "${NAME}-rollover.pem" "${NAME}-int2-new.key" \ + "basicConstraints=critical,CA:TRUE" "${CA_KEY_USAGE}" + +# Leaf, issued by Int1. +issue "${NAME}-leaf.pem" "${NAME}-leaf-key.pem" "${LEAF_SUBJ}" \ + "${NAME}-int1.pem" "${NAME}-int1.key" \ + "basicConstraints=critical,CA:FALSE" \ + "keyUsage=critical,digitalSignature" \ + "extendedKeyUsage=serverAuth" \ + "subjectAltName=DNS:localhost" + +rm -f "${NAME}.csr" "${NAME}.srl" "${NAME}-leaf-key.pem" diff --git a/boring/test/path-len-rollover-int1.key b/boring/test/path-len-rollover-int1.key new file mode 100644 index 000000000..3dd343af4 --- /dev/null +++ b/boring/test/path-len-rollover-int1.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEAohf4cV7gujHnSmqLa0n468DkUYFs6SNOVsawrPskqpXPUg0l +Ih18YVn2WO3YwRMPDcRj5DuvJVNX5zx4kYJhsTRrkeCKdvN2IMmfegqdgQMNdZ0F +O1gG+tTzP2ZS5U5q31/cUgq8Ttrx8WOc1BA4pbb26Q9u8i66wXgnNXmy0D0H02JL +Qbn54mQZkY+4HrtBIjDzgfCjhxgFI7OxqfGZ1xFXpu7lPSqkbJ3ybGU9RY9JSvbw +2CWOtkNa4x/7XjgrVRuE0jfpIi9HqdwpB6KjJBqNgTf1fS3adjLxA1wUjiy7aIKG +OERb1nwo4VS80ZbosnNyronrpWJ0HCRSbQnKHwIDAQABAoIBABT5lhgRh3IAoCXU +iKr+/PuAz+quHUpD29DF0DnqG7IJRbUf51S1TRGJ4yNZz8kYLsQAzE5N3NmvIbpV +7GIj5YFZP6w2SqSe14Pho0XXFs+JdhXoljM6LlkJ8lobYxGyJok2Ldvd8MUhdtpe +If6dBL+I4AWDjj8/hcIgSq6US2u/rTmmkFdipOGH8pP4p7gR7XeMlKdykz2t8uar +orTs1fakPbqnhJhXsILxYCoR8pFf37Ucx8NQaRYKx/wlLfkpPnv4QUQouABB3Dr4 +tXug/8CxXuod8v1Eb0kDwz2bsQQFupYwJhR5Mv2mOk9KwdPGSo88QeSHU6dBY26C +CeS4AcUCgYEA1ei+TBWfEi67hpIW9Pztb4h9Gd7pTdS5fNZD1uZouYSBNukWKs63 +UKj3XcsPF4gDTgd/pmSZ2yW4mZ3ILlB7SwrKcQH/9wcagE+bqSqsV8hO8pNmGhAr +0fZHrIX+mZ5og2vL35KPpwShGUqwWJtut5TjAwvpS+HlowAL8amr2WUCgYEAwf0f +EanNxP8lYO93M61Wp6QtC15v5X/cYRItzy9vu+M6QASz8B+Az2AoeLlcpgZnlrYd +vsI1IN9wgbMRQCk/INLMr4UdLiIWtgfEoP+G0VZbo4R8l01zKDKMbXzHT87itETl ++da0tRiTtyPmVMUeWx6oDa9riPCZwqsfJJANXzMCgYEArrS2p8GI9/q/IjuzEEh7 +S/q34idTeUPicvk00xHAOrTkLArXFgNbaT93OV2dZ+SoflRVh3rmxjvat2xMkLce +271mdkHh4sokdOOQCOxXciKhiDGm1Gacw5FYHKobtS/RwHSMQH+dYBXB1bxQpy3b +kYjCmDxkQJuxSB3Do46mUpkCgYEApFRlZlQe4Lt3EZeptdgn6RlVoyTby2E18fEx +Zyp7D4HczXBucYJuXr3JawMzLd2NEQmzRu5DjVZaezSS73RBau/HvwQXhQYRkSAh +fHUZ4umx9WH9HTrZy3qOpQ0n1j6eozEeVDeCm0p3j5PUwYi+P1hH6lfo03dl+Zd2 +aUWyXisCgYEAv3H+Js3XxZHIcOw9NeM/UwIHar0mjQED2Zg5iOo+G0sP6078abRY +/gmQAmV2/vAlSl6rd0HGJ+IHGHcCQ5r2QuGQ6+lM5EVm/RCB+6e51i+4YcYIeTkO +tszEh1HO8D3MzIEJ0a2eQLvMyZCORW0jKIlvmO5e/2C8bQetiA/dzOE= +-----END RSA PRIVATE KEY----- diff --git a/boring/test/path-len-rollover-int1.pem b/boring/test/path-len-rollover-int1.pem new file mode 100644 index 000000000..dfa88c055 --- /dev/null +++ b/boring/test/path-len-rollover-int1.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDPTCCAiWgAwIBAgIUZ9Wex0ml6IMTL1w76kF31xMl8ZgwDQYJKoZIhvcNAQEL +BQAwJjEkMCIGA1UEAwwbUGF0aCBMZW4gUm9sbG92ZXIgVGVzdCBJbnQyMB4XDTI2 +MTAxOTExMDcxMFoXDTQ2MTAxNDExMDcxMFowJjEkMCIGA1UEAwwbUGF0aCBMZW4g +Um9sbG92ZXIgVGVzdCBJbnQxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAohf4cV7gujHnSmqLa0n468DkUYFs6SNOVsawrPskqpXPUg0lIh18YVn2WO3Y +wRMPDcRj5DuvJVNX5zx4kYJhsTRrkeCKdvN2IMmfegqdgQMNdZ0FO1gG+tTzP2ZS +5U5q31/cUgq8Ttrx8WOc1BA4pbb26Q9u8i66wXgnNXmy0D0H02JLQbn54mQZkY+4 +HrtBIjDzgfCjhxgFI7OxqfGZ1xFXpu7lPSqkbJ3ybGU9RY9JSvbw2CWOtkNa4x/7 +XjgrVRuE0jfpIi9HqdwpB6KjJBqNgTf1fS3adjLxA1wUjiy7aIKGOERb1nwo4VS8 +0ZbosnNyronrpWJ0HCRSbQnKHwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUs+T2WmxRCsDFYmuES8d6DD0YZA0wHwYD +VR0jBBgwFoAULDw80usaXk51h5y+YQpZOSf6bGUwDQYJKoZIhvcNAQELBQADggEB +AI8shqAF0rXAQ0uLKpBtX9VcSVOxkNpFrgl9au1pHFS/gXRwN6Q4meXgcdxiNQAE +Wp3nxPNLJGkJKeEpBeWfqZ5XY0xsRwGfKhp6YAygZU9Njl+oXD3M94KwnCvUBXl1 +wONL0cVhLNnCbyD/Ec0g+3ch5mwgLp6rv47Zvjsd633NrJzfq31Yd8GX/sh7J3LG +22yR2Xd5keapdFXYrvj9zkzKOnXzd26Bo7k5omxOVM9Q0NBzRMPkscXNgJBo8VGE +f2rBLvnjYEx7IJQRzacRfLLdyxAlYLLPIXJaGcbqpP/CGIUL5sf9GXiOimurarDu +NyMgtrAVx02M/mGBCWcQLpI= +-----END CERTIFICATE----- diff --git a/boring/test/path-len-rollover-int2-new.key b/boring/test/path-len-rollover-int2-new.key new file mode 100644 index 000000000..786f5c8e7 --- /dev/null +++ b/boring/test/path-len-rollover-int2-new.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA1typ8Otnz6qOpnXyf+QVNe0wpRgAGcS8jVF6T7RN9KENnPhV +1OwTbO8maTvqVWe+Zt/xynWmaYHLyt9SIFQyqvI6pjenQUvjpTD3uJ8iS0t73qTJ +s4Pbsh0xwWP0fZnLWXsQGFzcJCTo6bwNY4uIOK+hiKWMw6UCXtJnowQaIgpt83ey +nNkbqN1j4ixqND5Wj1o8DqnYXeNrOvoDQ5c54RK5JE0GNixirhixd/hP+wSsRucf +H1d534YvmonQGGTDHtg+9HZPAa0N3oVEyhD0wbTpH5C/Ys3DSPvvYYgNQ4OmHCYg +T8E9RVmL0aJpJ8+l/aAf8iNeMNHqyz470pkgvQIDAQABAoIBABGYDyhltmH4Zub1 +mI5laGE6k3WpYfS6OfBegCP/sTR7bahxY2HklPCiIqSSXe1xadN1uhBokuBn2v65 +S7nO+zkpTaknvH/pzXHM8TQCf+Xnf/SqzMNw5DARGO5rl20jh1XD8Hz2OaaSCSp+ +liAVIGn348PTPpQUsn1+QDNGljc8OfVd+FeG9mrkb45Wm295NwUXvHrf6ivBHF89 +k45pj5RaVL/AoaGNQKF8prjEfZSvUDvBIrXDNl7ohRd3AOBdf0i8/gzJ/zR4Ov6Q +8WeNIehVKHVUGTNgAusQ85cyDn53eIF95mDRZS+E5ZDfL7uiOaQOQfC3+lIYBL3K +BcNmr7ECgYEA89EgVOY4L7ZBjwe+IFbrg1khUVYhysEb96v8BemdfVGaRSDYyBUv +E16XiVZ5ynz27u6PII/lkdgmto0et3LuFQtMGJ2ROTrE2kOxpERCdR24hCzGVZNG +lE19pF2ifXl7k4FBXuc/k4/x37E/2FJBeAEQ1pmdlm8DFA/+jOQcu+UCgYEA4Zkm +XWEtaSDQ/9IlgQeU3uJrT97XnsQAbVEHKIwhSHRhGPe5iZAet6BZJcX9NHW8Bxda +qt6i3hOvhOIxz+eujq0jmBk2UvtiQJb9UjfJOrX9pQO/GzJiFIb11INaYMzfHuP0 +q7d3YfeEk5gbvsHbHK5Cb8WfwL3CxxgLBC5c8/kCgYEArS0LruG6ZMEqPYI9W9EB +BNFI5fGsnMuepsMEhdqR3xIX5iPXdf396t8T+Rtv9A/ggIL3LCSo5XdGwADqIVjD +nDTi/tTj8mc4rOLKCSfmoDLU/SSkVuH9jpafuCA9qqufx3xWRycvNAtYvA60j1yV +Xbw8DoEbul7tK9HUdpQLiLUCgYAKqgywOVnGMHDwxuRS9yLIbneYLPaQYL+Ma1ol +RoqEPEwivAMfR5rMH15XdMaFZlNfGnGExkV4rgGMDI1CQLd1syWNmROCVLPOTdTn +wA9ZISU+WbD8/iK4ybBxPUxWaxjZAvmb7G5OST8RIw2ctNlAv9QQKI1mtRGyC6bp +qa9nMQKBgQCX1WMQ2mAqlRkO/+h8fiidiVtr+xVb2wKmR3cv578qrhoGFgVXDWll +ysyhk0Dx4Ngs4UZ5D3wYVIo9j7euEay1J3KOtkHvYreaC1pw8ahA/5S4oIAGxAvT +pXMPx725Wb5qqQNvteGkQqKmawQthkWcvUHIhttoA+JgSoOu1RQYyw== +-----END RSA PRIVATE KEY----- diff --git a/boring/test/path-len-rollover-int2-pathlen0.pem b/boring/test/path-len-rollover-int2-pathlen0.pem new file mode 100644 index 000000000..caece771c --- /dev/null +++ b/boring/test/path-len-rollover-int2-pathlen0.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDQDCCAiigAwIBAgIUZ9Wex0ml6IMTL1w76kF31xMl8ZUwDQYJKoZIhvcNAQEL +BQAwJjEkMCIGA1UEAwwbUGF0aCBMZW4gUm9sbG92ZXIgVGVzdCBSb290MB4XDTI2 +MTAxOTExMDcxMFoXDTQ2MTAxNDExMDcxMFowJjEkMCIGA1UEAwwbUGF0aCBMZW4g +Um9sbG92ZXIgVGVzdCBJbnQyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtdNVtkOd0QZLoSO8+4BtBiokB9aCPFxNdpKisVDwKmvzeAM5p29m5Y4UFRgg +w3xMiTce3KueLW3YJo9RNgdr4+zotVsR9dZO90SyymaW4bYyAbZKaxVRM7BhWvDe +wSReKh5DGUke1Z4wl6wel+KtUoVz7rTL5mZJymVAoXsU++lODTP28doDGffgXyuh +9pL8k8gRyniEC6d/8GH5fRIT+09HDmMSuqsTO2W3+9ZxPQ4dr5SM4KdFT7YAxGrE +ekiubpcip1nHvbyw/yt1MOds6/f96eoiapR7zYNdOfnPtBX3VFRXXT/f9sfrR+e3 +crtv98i5TX/EQNjxgFeoEuXhoQIDAQABo2YwZDASBgNVHRMBAf8ECDAGAQH/AgEA +MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUf1yEQszXesMxJykfhvucWpRK8yEw +HwYDVR0jBBgwFoAURhVWdu0BKqHwx54NfD5eHYvL9/EwDQYJKoZIhvcNAQELBQAD +ggEBAHYoMX4K0DxoRH8rs6DJp/QmcFyZxcQxakRuwqgnfNl5QtqeUE2c2WmgjdZv +oDobtyV4mfo1Be3afOQeiEN6OG08mkswZ/ULLsxKkRCQhLcty5iDd4ILrF1j4h+M +uYKMFh/GNQAZFXipbV8mVspJxT/CIIO1q247B7YATlL4kYmFBVwzHQnH4ObEPt5L +H51Zq6y0Ft2AOCX4med1uD4dqtf+2yQEwWG7S+KPdtMPpHingxp29x5wSK7yzljP +UzjKQsQtIC7iYQwzcCrbqaOa/bR79myf9BMdmflvfPScg+Wj/JU5WyNKHYgoAEr4 +WTerJ6JhG7FL54n/bY5hJLXLnv4= +-----END CERTIFICATE----- diff --git a/boring/test/path-len-rollover-int2.key b/boring/test/path-len-rollover-int2.key new file mode 100644 index 000000000..3021e8e4b --- /dev/null +++ b/boring/test/path-len-rollover-int2.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAtdNVtkOd0QZLoSO8+4BtBiokB9aCPFxNdpKisVDwKmvzeAM5 +p29m5Y4UFRggw3xMiTce3KueLW3YJo9RNgdr4+zotVsR9dZO90SyymaW4bYyAbZK +axVRM7BhWvDewSReKh5DGUke1Z4wl6wel+KtUoVz7rTL5mZJymVAoXsU++lODTP2 +8doDGffgXyuh9pL8k8gRyniEC6d/8GH5fRIT+09HDmMSuqsTO2W3+9ZxPQ4dr5SM +4KdFT7YAxGrEekiubpcip1nHvbyw/yt1MOds6/f96eoiapR7zYNdOfnPtBX3VFRX +XT/f9sfrR+e3crtv98i5TX/EQNjxgFeoEuXhoQIDAQABAoIBAC8CCc1a8uC5B3GM +K048eDNZTsJl/3q6hF5s77n3Cnh1O1diQhQbNZeQoXmIqOPRbXomMYjsp7LoDLN/ +ZwgYaBjfxZQpjN2pf/XmoXC5kDWfpJMTvW6s7rb12V2pG3YEwIGUHFXbtSiWQsrb +uXccKCJHFV94B6Uz+czlW43EI/syeSAk+rQ2M4P5oUJMJNHwcuzlPD4Rx1iH+JNg +kHTUaWddvWygde32h6ZPth9xeVK40pVF6GKhJC38bfUEyIyayH6oj32QqMGjx6a+ +e2yb9VfMHsOu102dF4c5LZAbcb+fVWLUzbq8P7cCt/s8XDYJrqZdZHE6Zq5GdlPo +LxbFjx8CgYEA3ORsgquZwiMIaB9wSjTWTb8QQeQaXDJZZoQC46ngA15RDLxe92hT +tF/wuarXqmGA6i/NsM3zjeXC9gcG0xShlemuY4Fp3Q2F6Z2hYQ3DVOTpMPBvmFA5 +cmnVT5MBWjfo7YDf/WF9WptlQF6UgVUqex9yTZeyG6wf35C2x8KUIJ8CgYEA0rlg +60NEtR7GmKLi529X6F5WFbLzkAss25l0ZilN0RFn8uy0QS2x5vY9aIP2z2/E35UD +P4M71jBlvEthqwNooi2y7v8iiOP8C6xq8aZGLErgEzY88pr1MSqtjOdfagI8uLAe +gEL4FU3ujBb07JqgF8TWtunhB5laCFvggB17lb8CgYEAtJPoQUqXgCWzkath2Mgp +CZXQbI1VH1npy+zPj94ny5knGQpFeGxJQYPM/3uyow7inJBHzuoO2UmjgA1uftC2 +6B8I+T+qk5OijcDXVMgzjwszt1ZXZGTxEZ+DSnIbAO4D9WUNt84i9BdlRqILNU+y +UsT6ZIRGjmjABbwAMH3ZKnECgYBP2zjDb2amTNduGKxskGF8CeQNrRdoSxPg1LKr +1JNM24/NG67j1HFK2Z5D8V6jFfRB1rK4av9OGGE1jkuhB1WrwC3DLKTlw6BMvDZ7 +BUwqlOV94lwOhHLPAyFp+HTMM7TXOMcWTEq/qBzysfB3idGJsGq+PrusqYzZBhh5 +9LJU+QKBgQDYiwBXo/LElZVtJFa2WbI34q1xg/vaduZT0LskHkk2JrnFwnjKtCws +m98/3M/FIfgU+3ulX170CCCxPTmyRPrr/pESoKLkWWcZzJcYbeMx+ZFNp8NAibR5 +CMAZOtrQIJ4//LXux7B31AAkPZ8o5zO3BJ4TriOQkolID7vWB52O4w== +-----END RSA PRIVATE KEY----- diff --git a/boring/test/path-len-rollover-int2.pem b/boring/test/path-len-rollover-int2.pem new file mode 100644 index 000000000..2190ca51b --- /dev/null +++ b/boring/test/path-len-rollover-int2.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDQDCCAiigAwIBAgIUZ9Wex0ml6IMTL1w76kF31xMl8ZQwDQYJKoZIhvcNAQEL +BQAwJjEkMCIGA1UEAwwbUGF0aCBMZW4gUm9sbG92ZXIgVGVzdCBSb290MB4XDTI2 +MTAxOTExMDcxMFoXDTQ2MTAxNDExMDcxMFowJjEkMCIGA1UEAwwbUGF0aCBMZW4g +Um9sbG92ZXIgVGVzdCBJbnQyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtdNVtkOd0QZLoSO8+4BtBiokB9aCPFxNdpKisVDwKmvzeAM5p29m5Y4UFRgg +w3xMiTce3KueLW3YJo9RNgdr4+zotVsR9dZO90SyymaW4bYyAbZKaxVRM7BhWvDe +wSReKh5DGUke1Z4wl6wel+KtUoVz7rTL5mZJymVAoXsU++lODTP28doDGffgXyuh +9pL8k8gRyniEC6d/8GH5fRIT+09HDmMSuqsTO2W3+9ZxPQ4dr5SM4KdFT7YAxGrE +ekiubpcip1nHvbyw/yt1MOds6/f96eoiapR7zYNdOfnPtBX3VFRXXT/f9sfrR+e3 +crtv98i5TX/EQNjxgFeoEuXhoQIDAQABo2YwZDASBgNVHRMBAf8ECDAGAQH/AgEB +MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUf1yEQszXesMxJykfhvucWpRK8yEw +HwYDVR0jBBgwFoAURhVWdu0BKqHwx54NfD5eHYvL9/EwDQYJKoZIhvcNAQELBQAD +ggEBAGwJ4h6sNlTy5oSv/vmdZHxRi+7x2G6MaRFAL8IJ15lytwRSx0guMZgObZcp +RPnz4rAnuqwLO7a8+GGWOqWcTaPIphiXgQBn5zW/5Th1p1c8YDIB0Xm2ryQe/sAW +CFy156jZz43ksQBB6VvJnae3vyp3HKF/3mO3PKGma7lRNoOZ1XeylM2ghFZ194fv +i0kDsIoOvILcSOFagpvjt0lLfnSug2kKwmQ7fMi1xQ7a/L2yDUf3n5+DdRrV+o7H +8WPDKbg7iuQTm51F8CERHzZ4BlfbxgJ9Q81ik/+UWTyR82X7zPHGCLyveauadeg4 +qttbbvD+zJXbY1OHZ3ZQtAq3rDQ= +-----END CERTIFICATE----- diff --git a/boring/test/path-len-rollover-leaf.pem b/boring/test/path-len-rollover-leaf.pem new file mode 100644 index 000000000..1897523d0 --- /dev/null +++ b/boring/test/path-len-rollover-leaf.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIUZ9Wex0ml6IMTL1w76kF31xMl8ZkwDQYJKoZIhvcNAQEL +BQAwJjEkMCIGA1UEAwwbUGF0aCBMZW4gUm9sbG92ZXIgVGVzdCBJbnQxMB4XDTI2 +MTAxOTExMDcxMFoXDTQ2MTAxNDExMDcxMFowFDESMBAGA1UEAwwJbG9jYWxob3N0 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqmzKhsq1d7ronEKCT0G8 +dkNWD4POxzv/WGZK896//DdAYW6gXbwEWkbaS7vdytLCEAfxjjy50z5y6U5yoNJk +LCbHTGGlqQzS/FOM8O225B9rVg35F77x7dhqgd/KkejkshamePkkehAlLFgynSz5 +WGMFfHCGUjXOhRgbR9ZN8Wb8AW+zT/KtmqMqBqVf9+9WWElP2jI0mMSBaTX4ARXU +tViJKlNP7bnWFuRuYxZoa7g9IBhlfBOZwBhGhPihnYK7DHpsrMst9KdTQbJa6woB +YWelijX/chwI6VNBnwYXikLVZA6iViTc1N9a4/wkw7y1OJpqfnbn0zfVTNuBAC2E +UwIDAQABo4GMMIGJMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMBMGA1Ud +JQQMMAoGCCsGAQUFBwMBMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQU +uxKB8pUZMpQ4qQFhPOCD8brANbAwHwYDVR0jBBgwFoAUs+T2WmxRCsDFYmuES8d6 +DD0YZA0wDQYJKoZIhvcNAQELBQADggEBAEyjdupp2+zB28YD01+g2v8wuqJE7lwn +b6+ldDktyyquonfQevbqOp3HfErw2LM61KwijFGudxOZHFkX+SZ+nx+SmwNbo+zK +HIioewXgX/Hi6uvkb2one97ZlaFNVQGCZMqy8LiNvYFsm6lzD3PivVelbuPOm3Qm +Kglo8mP0jf0Mj3CuCVd7tylBGqm4sCufsVuMvZUTc/MpFXQJVBrBrBfNVyp3O4fX +DRGZJRQR8isG4biA0h6RNToTAbu6CFTkEwLSUSTd8h+C5HTyPgnrQ+9HVVFlB2cS +omZOqkvgqrkH6IMzClzahYF2tpMZIq0dc2GSTkjXwOWVn+R0lxghf5w= +-----END CERTIFICATE----- diff --git a/boring/test/path-len-rollover-rollover-pathlen0.pem b/boring/test/path-len-rollover-rollover-pathlen0.pem new file mode 100644 index 000000000..c2fdcfbdb --- /dev/null +++ b/boring/test/path-len-rollover-rollover-pathlen0.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDQDCCAiigAwIBAgIUZ9Wex0ml6IMTL1w76kF31xMl8ZcwDQYJKoZIhvcNAQEL +BQAwJjEkMCIGA1UEAwwbUGF0aCBMZW4gUm9sbG92ZXIgVGVzdCBJbnQyMB4XDTI2 +MTAxOTExMDcxMFoXDTQ2MTAxNDExMDcxMFowJjEkMCIGA1UEAwwbUGF0aCBMZW4g +Um9sbG92ZXIgVGVzdCBJbnQyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA1typ8Otnz6qOpnXyf+QVNe0wpRgAGcS8jVF6T7RN9KENnPhV1OwTbO8maTvq +VWe+Zt/xynWmaYHLyt9SIFQyqvI6pjenQUvjpTD3uJ8iS0t73qTJs4Pbsh0xwWP0 +fZnLWXsQGFzcJCTo6bwNY4uIOK+hiKWMw6UCXtJnowQaIgpt83eynNkbqN1j4ixq +ND5Wj1o8DqnYXeNrOvoDQ5c54RK5JE0GNixirhixd/hP+wSsRucfH1d534YvmonQ +GGTDHtg+9HZPAa0N3oVEyhD0wbTpH5C/Ys3DSPvvYYgNQ4OmHCYgT8E9RVmL0aJp +J8+l/aAf8iNeMNHqyz470pkgvQIDAQABo2YwZDASBgNVHRMBAf8ECDAGAQH/AgEA +MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULDw80usaXk51h5y+YQpZOSf6bGUw +HwYDVR0jBBgwFoAUf1yEQszXesMxJykfhvucWpRK8yEwDQYJKoZIhvcNAQELBQAD +ggEBAICoxPgo0UKRaqCkaSjBiBs4WKHIQKlxKt+5IRc2wpbkrntFtl0Jn5TeINQI +/7HK1XZoHZGlJaJFrlfjgftAWEGlaIugs1ZVZDIKbaLEdJt5mS54iAaRy95jjp/Y +yESJNB1+tkr/I3ln4OYdXRmaVc4fuyo7WMkbtHdusLYdSAY5MwzGP/sHaRd585UO +OtWaqA3HpheHtoqwYbmbY/M17yHyEDYK9lTnzvyNfHqb7vPpRkYW4Hi8nJA5pQh5 +SODKqAlnTONhwAVPn3rBONOnotuJw/VHiSdiBaAmB7wJ6a/lzxG1YZA9cu4wD3K4 +0F9aSjR6GM1/RN4qjkryigTrJK4= +-----END CERTIFICATE----- diff --git a/boring/test/path-len-rollover-rollover.pem b/boring/test/path-len-rollover-rollover.pem new file mode 100644 index 000000000..16ae79fda --- /dev/null +++ b/boring/test/path-len-rollover-rollover.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDQDCCAiigAwIBAgIUZ9Wex0ml6IMTL1w76kF31xMl8ZYwDQYJKoZIhvcNAQEL +BQAwJjEkMCIGA1UEAwwbUGF0aCBMZW4gUm9sbG92ZXIgVGVzdCBJbnQyMB4XDTI2 +MTAxOTExMDcxMFoXDTQ2MTAxNDExMDcxMFowJjEkMCIGA1UEAwwbUGF0aCBMZW4g +Um9sbG92ZXIgVGVzdCBJbnQyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA1typ8Otnz6qOpnXyf+QVNe0wpRgAGcS8jVF6T7RN9KENnPhV1OwTbO8maTvq +VWe+Zt/xynWmaYHLyt9SIFQyqvI6pjenQUvjpTD3uJ8iS0t73qTJs4Pbsh0xwWP0 +fZnLWXsQGFzcJCTo6bwNY4uIOK+hiKWMw6UCXtJnowQaIgpt83eynNkbqN1j4ixq +ND5Wj1o8DqnYXeNrOvoDQ5c54RK5JE0GNixirhixd/hP+wSsRucfH1d534YvmonQ +GGTDHtg+9HZPAa0N3oVEyhD0wbTpH5C/Ys3DSPvvYYgNQ4OmHCYgT8E9RVmL0aJp +J8+l/aAf8iNeMNHqyz470pkgvQIDAQABo2YwZDASBgNVHRMBAf8ECDAGAQH/AgEB +MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULDw80usaXk51h5y+YQpZOSf6bGUw +HwYDVR0jBBgwFoAUf1yEQszXesMxJykfhvucWpRK8yEwDQYJKoZIhvcNAQELBQAD +ggEBACx6VdcIBZKv48W4Vif6KFO6lIdc1kwTXiJNj/Izzfj5sjmHxLJ5VejJDDyx +MV+dS18dGW6Q3gxSI5f0Kgyi6s7vB70v1rIK13ihTJFRFW+cKMcUBhp73VvCO7qc +zHFYR3vqZsyPJc1ItBvxLFimef5kumyL/SRHOJSEX2/805Xv0XzMIDuApIXzFexd +gMadp3xmSNN3ii/y2yJQDBtA0abGxb/5F/ukO8JVvjeH4dlLVXHdKBnn5kMWRDi6 +ILoVYSP2XQcXlz75SqL+xLdKbXXF4cktnAEWtIrWk/PfAv3w1ip+A4d3hBNLd92N +v3mLHBeT5PZgmPd885xpmO4WcPg= +-----END CERTIFICATE----- diff --git a/boring/test/path-len-rollover-root.key b/boring/test/path-len-rollover-root.key new file mode 100644 index 000000000..73b8ab0e5 --- /dev/null +++ b/boring/test/path-len-rollover-root.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEArwa0dTu3JaFdobbDn0Q0VE8rqi9G7HhH20uMAg4f0rsX5sxC +NAwAJ5VadYo0vs0IdNSQpurI3lyyiz4NqsUZgI7RF/QTtWPsqG4Jxv1WdK+Zhq3V +fXshG7K7vBJTCSMQGjK5+twEKtoDzi6/TZ5ac+5m5scxu/JCNxu+Gm8xNMl1fX04 +F8TCNPYYi9k1gAiwJo0QBIKkyJxoyepuRc4NSGbhojD98vWZq+bjcmJTiEfTNuZX +rbyKY/LJNlC4TPapGOC/IzVpqOIcf6WMbk759+mOVbBCaAAuUPrGKPZLCaEg6mwv +1SjJO1MZr+Q6fh7nFXfyOglE6vLXXME5RzsiNQIDAQABAoIBABugnSXvhffbJ6/0 +l568FzSDBhCdg35PzYE4mheNn4lV01kw6cxUY/Ew7+/4yl2fI1QUZObsIvEymajw +DnE5HnmT/D5h3ns16YUmpXAdzM1WFeT+leHyPdDPnuGk1NWZjXD34TJ6E0WpAeEZ +sO8cGAllBXotJtUU0aM9mP2MNVda/avzBFOfJZ12e5K/VIva7W5sfAS2PNuY7zvN +S7Gbf6U4qTgV9GwRcOoI4bICkOKC8JPk1j/UgIti7lXfmVtwkOsNfbEAfY+2NINh +VIDlQ83zC5iO6mOBclau4Xg9ZcmTGejOgyQTjvfeNMQJN5SvqCpN5H10N/GXWA3j +hgW7VCsCgYEA6gPdvD0c3grZwW/npUHj3FxBAdOp78pOg8O5u34eg4dGwob3b/hm +eyxomdNCDLGUxMWRPEj4GoPtAkOb9KP8w8LfdIWiFoWSIuCeATp1IV+mIYdLSrfB +078NWVq8AcnjT09ooxdEiMyabkI58Gj8DxTPFYwhqWInTdIB+CJo9tMCgYEAv3gj +PIUXPs8LcyVCTOX9GhH9f6Utpe5NbboigZpCKfzW/hR4A9R6M01j+NnnwPtraJUW +37aC/UWf6yYl1IYhccuGZ+puEjweUtfY+CTjm5jjz6M+hESUProRv9Pee86dauSH +pQMMqGH0vjJkrJW69xGfPI5HB3BHz7WggkqUbdcCgYEAyXJKjqCNGRd+HGaYokn2 +PNutmkT7JNCihgsW96+51L++yfYlSt4qWh4AbWrOkN7NkhYA0ESAT1MB09Efj5kb +HenDMitXPMv+4Mc7PRN1gSU1fedZiRhmYkE03JafAWspojxZdwuwk5KN3hxkg+/c +C59+JK5cy9MSworl5xS4BsECgYB4U6XBSNq87B0D9exeq0KOebPX3hR77PDX/lvl +Gu5tuKnb7z0lGwjY6M/k+fw9OUPc66T+XpKfXHwNqWGo18p42zDSaW9XIlTkNyXx +fC1WAZVZTfvh379SVFkHNrzhDY28OXZNa0cvIrBOPxkppMdksbxir/9PW26lyDzg +5MG27QKBgQCe5QgTLB1jZBbMQopNeGwQ0eBAcUAEa9x/1PKK/+A8uBM9+hQ3JDah +Scw2A6roMwhi0bFzgo/MIqVWM3XDw48qoWhh3zvEcP8sXVPYYjLJhtB5w9pU55LL +wFjILQqk19aBwxPWEo7yCK51oHGWTQrUN0dA8R+Spns7OTGtYy2R4g== +-----END RSA PRIVATE KEY----- diff --git a/boring/test/path-len-rollover-root.pem b/boring/test/path-len-rollover-root.pem new file mode 100644 index 000000000..995411753 --- /dev/null +++ b/boring/test/path-len-rollover-root.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDPTCCAiWgAwIBAgIUS1aNdVwrza2PvZY2U7qUdiOaFa8wDQYJKoZIhvcNAQEL +BQAwJjEkMCIGA1UEAwwbUGF0aCBMZW4gUm9sbG92ZXIgVGVzdCBSb290MB4XDTI2 +MTAxOTExMDcxMFoXDTQ2MTAxNDExMDcxMFowJjEkMCIGA1UEAwwbUGF0aCBMZW4g +Um9sbG92ZXIgVGVzdCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArwa0dTu3JaFdobbDn0Q0VE8rqi9G7HhH20uMAg4f0rsX5sxCNAwAJ5VadYo0 +vs0IdNSQpurI3lyyiz4NqsUZgI7RF/QTtWPsqG4Jxv1WdK+Zhq3VfXshG7K7vBJT +CSMQGjK5+twEKtoDzi6/TZ5ac+5m5scxu/JCNxu+Gm8xNMl1fX04F8TCNPYYi9k1 +gAiwJo0QBIKkyJxoyepuRc4NSGbhojD98vWZq+bjcmJTiEfTNuZXrbyKY/LJNlC4 +TPapGOC/IzVpqOIcf6WMbk759+mOVbBCaAAuUPrGKPZLCaEg6mwv1SjJO1MZr+Q6 +fh7nFXfyOglE6vLXXME5RzsiNQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQURhVWdu0BKqHwx54NfD5eHYvL9/EwHwYD +VR0jBBgwFoAURhVWdu0BKqHwx54NfD5eHYvL9/EwDQYJKoZIhvcNAQELBQADggEB +AEh04vTqOeIyrz3Nr9WLmgwKonWjlDMewtCBLF6C5x2t7sHAG2RGRJOJBp/nZzIT +ksnSgnhOiwcu+JUs90lGa4lw+4MvOL9pnuaJH0lR2zKcrNPpoVK5TlBo7HI7SrKS +POm75YC9irmVfVLDNJZz3jy/s/g8eueZVAOFZlmNeYBxktJpOuY0qQ//HUcJbDb+ +qUfDQHRwilEB+XAkatZIwRxvBgyTmN6LIMYkiwat4ID00iKaszuuSCz8IWQIMxdv +ZxiEMMwoUvnmJ8q7i1IjymswYfmAcFT8MtRqC5pDgdYWvSRlvQkbB74b/pnxp2Fw +fCVD3TrWyqPR6k1ScSC1tpI= +-----END CERTIFICATE-----