Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: add cert chain with mixed key sizes #4433

Merged
merged 4 commits into from
Feb 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 16 additions & 0 deletions tests/pems/mixed_chains/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
This folder contains "mixed key" cert chains.

The `ecdsa` cert chain contains intermediate and leaf certs that are issued from a CA with a smaller key.
```
leaf: P-384 key
│ signature: ECDSA with SHA384
intermediate: P-384 key
│ signature: ECDSA with SHA384
root: P-256 key
signature:ECDSA with SHA384
```
11 changes: 11 additions & 0 deletions tests/pems/mixed_chains/ecdsa/ca-cert.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBnzCCAUWgAwIBAgIUXI8F6k7vlX97S4ZpnR59noZbxrowCgYIKoZIzj0EAwMw
HDELMAkGA1UEBhMCVVMxDTALBgNVBAMMBHJvb3QwIBcNMjQwMjIxMDQzMzA3WhgP
MjIwMzA3MjkwNDMzMDdaMBwxCzAJBgNVBAYTAlVTMQ0wCwYDVQQDDARyb290MFkw
EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAED9Xh6MZhQGw+p0V7rLGzBF3YPgwJFP+f
Ee5D/XSaS76v/RiEWzqOGJ7hxUrsxvoNJUXPJJMASDwDRVvx8iB5kKNjMGEwHQYD
VR0OBBYEFLLjtcK+eccZErEbdrRBGyjjyYc3MB8GA1UdIwQYMBaAFLLjtcK+eccZ
ErEbdrRBGyjjyYc3MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMAoG
CCqGSM49BAMDA0gAMEUCID6Svg9A9LmGqK5vJPguEsV0EggHPRmUT27bEPaO57Qh
AiEAnmgHw9d3qWOGGVhkYEpb/tKnVU6wFyRLd4qOZn0vgnM=
-----END CERTIFICATE-----
35 changes: 35 additions & 0 deletions tests/pems/mixed_chains/ecdsa/server-chain.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
-----BEGIN CERTIFICATE-----
MIIB1DCCAVmgAwIBAgIUIqQpkU80sEjH8mxl5O46jWU3IskwCgYIKoZIzj0EAwMw
HjELMAkGA1UEBhMCVVMxDzANBgNVBAMMBmJyYW5jaDAgFw0yNDAyMjEwNDMzMDda
GA8yMjAzMDcyOTA0MzMwN1owHDELMAkGA1UEBhMCVVMxDTALBgNVBAMMBGxlYWYw
djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQIl3I7/xURYZY4mIYhQujKAv3W4me4QKnB
0oinYiVzMpZ7/+I8YoeiOtzeuWER1TuoZ551mMTTSzPCfvgTwCyvbJdsWYIvcUD2
afa/+z5mWhq0rYkvH0fOwTP7BiJh5bCjWDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9z
dDAdBgNVHQ4EFgQUtyazibNdyEtNQl26ufEuq0Xi59AwHwYDVR0jBBgwFoAU4Adk
/yc9lPlh8XfREeXYXnp/wxwwCgYIKoZIzj0EAwMDaQAwZgIxAJlqGLkZCoOCU+xu
K6EAQBrcidmNaBqO5A+1hQnmJrGcZ9D7N5GigKQ5Tf1+RlLgkAIxANmxOoFKoaD6
7mSckr7+XN/s8IcZPJ/ZUvM5jeLT8qugb4lOm4d/9jJfECJPcHDNBg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIBvzCCAWSgAwIBAgIUQnk97VcKbYR3+vC1kvJW4WxMDk4wCgYIKoZIzj0EAwMw
HDELMAkGA1UEBhMCVVMxDTALBgNVBAMMBHJvb3QwIBcNMjQwMjIxMDQzMzA3WhgP
MjIwMzA3MjkwNDMzMDdaMB4xCzAJBgNVBAYTAlVTMQ8wDQYDVQQDDAZicmFuY2gw
djAQBgcqhkjOPQIBBgUrgQQAIgNiAAThrJeng+kFLIMSVqzMMgK9z4+H7LzVfnau
YtjU86NtFxwfFFVu4H5IS4sC+LV7bQXiGSWzptzmxHZLZBI6Os8hGG5BLqkMBFyp
KfqzyjuTAYiIp/qIMOkzY/yHtIEnDm6jYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYD
VR0PAQH/BAQDAgIEMB0GA1UdDgQWBBTgB2T/Jz2U+WHxd9ER5dheen/DHDAfBgNV
HSMEGDAWgBSy47XCvnnHGRKxG3a0QRso48mHNzAKBggqhkjOPQQDAwNJADBGAiEA
3y/BPqbHkj+7TWv2+9d/FREZX/sk9k7b/MKowj3LHZACIQDbeGLk0TVpdElzVYLl
HBcgqJegl/ptFbAlNB36KqpYYA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIBnzCCAUWgAwIBAgIUXI8F6k7vlX97S4ZpnR59noZbxrowCgYIKoZIzj0EAwMw
HDELMAkGA1UEBhMCVVMxDTALBgNVBAMMBHJvb3QwIBcNMjQwMjIxMDQzMzA3WhgP
MjIwMzA3MjkwNDMzMDdaMBwxCzAJBgNVBAYTAlVTMQ0wCwYDVQQDDARyb290MFkw
EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAED9Xh6MZhQGw+p0V7rLGzBF3YPgwJFP+f
Ee5D/XSaS76v/RiEWzqOGJ7hxUrsxvoNJUXPJJMASDwDRVvx8iB5kKNjMGEwHQYD
VR0OBBYEFLLjtcK+eccZErEbdrRBGyjjyYc3MB8GA1UdIwQYMBaAFLLjtcK+eccZ
ErEbdrRBGyjjyYc3MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMAoG
CCqGSM49BAMDA0gAMEUCID6Svg9A9LmGqK5vJPguEsV0EggHPRmUT27bEPaO57Qh
AiEAnmgHw9d3qWOGGVhkYEpb/tKnVU6wFyRLd4qOZn0vgnM=
-----END CERTIFICATE-----
6 changes: 6 additions & 0 deletions tests/pems/mixed_chains/ecdsa/server-key.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
-----BEGIN PRIVATE KEY-----
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCosm1okl1Efmyz4wtv
paXDecqqo/7P7l6AE1+357MBHB1us6CM677L66a6rS1YcRKhZANiAAQIl3I7/xUR
YZY4mIYhQujKAv3W4me4QKnB0oinYiVzMpZ7/+I8YoeiOtzeuWER1TuoZ551mMTT
SzPCfvgTwCyvbJdsWYIvcUD2afa/+z5mWhq0rYkvH0fOwTP7BiJh5bA=
-----END PRIVATE KEY-----
119 changes: 119 additions & 0 deletions tests/pems/mixed_chains/generate-certs.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
#!/usr/bin/env bash

# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0

# Usage: ./generate_certs.sh [clean]
# Generates mixed-chain certs for testing
# Use argument "clean" to remove all generated certs

# immediately bail if any command fails
set -e

# Generates certs with given algorithms and bits in $1$2/, ex. ec384/
jmayclin marked this conversation as resolved.
Show resolved Hide resolved
# $1: rsa or ec
# $2: size of the key used by the leaf and intermediate
# $3: size of the key used by the issuing CA
# $4: digest using in the certificate signatures
# $5: name of the output directory
cert-gen () {
key_family=$1
key_size=$2
ca_key_size=$3
digest=$4
dir_name=$5

echo -e "\n----- generating certs for ec $key_size with $digest $signature -----\n"

# make directory for certs
mkdir -p $dir_name
cd $dir_name

echo "generating CA private key and certificate"
openssl req -new -noenc -x509 \
-newkey ec \
-pkeyopt ec_paramgen_curve:P-$ca_key_size \
-keyout ca-key.pem \
-out ca-cert.pem \
-days 65536 \
-$digest \
-subj "/C=US/CN=root" \
-addext "basicConstraints = critical,CA:true" \
-addext "keyUsage = critical,keyCertSign"

echo "generating intermediate private key and CSR"
openssl req -new -noenc \
-newkey ec \
-pkeyopt ec_paramgen_curve:P-$key_size \
-keyout intermediate-key.pem \
-out intermediate.csr \
-subj "/C=US/CN=branch" \
-addext "basicConstraints = critical,CA:true" \
-addext "keyUsage = critical,keyCertSign"

echo "generating server private key and CSR"
openssl req -new -noenc \
-newkey ec \
-pkeyopt ec_paramgen_curve:P-$key_size \
-keyout server-key.pem \
-out server.csr \
-subj "/C=US/CN=leaf" \
-addext "subjectAltName = DNS:localhost"

echo "generating intermediate certificate and signing it"
openssl x509 -days 65536 \
-req -in intermediate.csr \
-$digest \
-CA ca-cert.pem \
-CAkey ca-key.pem \
-CAcreateserial \
-out intermediate-cert.pem \
-copy_extensions=copyall

echo "generating server certificate and signing it"
openssl x509 -days 65536 \
-req -in server.csr \
-$digest \
-CA intermediate-cert.pem \
-CAkey intermediate-key.pem \
-CAcreateserial -out server-cert.pem \
-copy_extensions=copyall

touch server-chain.pem
cat server-cert.pem >> server-chain.pem
cat intermediate-cert.pem >> server-chain.pem
cat ca-cert.pem >> server-chain.pem

echo "verifying server certificates"
openssl verify -CAfile ca-cert.pem intermediate-cert.pem
openssl verify -CAfile ca-cert.pem -untrusted intermediate-cert.pem server-cert.pem

# certificate signing requests are never used after the certs are generated
rm server.csr
rm intermediate.csr

# serial files are generated during the signing process, but are not used
rm ca-cert.srl
rm intermediate-cert.srl

# the private keys of the CA and the intermediate CA are never needed after
# signing
rm ca-key.pem
rm intermediate-key.pem

# the intermediate and server certs are included in server-chain.pem, so
# the individual files can be deleted
rm intermediate-cert.pem
rm server-cert.pem

cd ..
}

if [[ $1 != "clean" ]]
then
# key key_size ca_key_size digest directory
cert-gen ec 384 256 SHA384 ecdsa
else
echo "cleaning certs"
rm -rf ecdsa*
fi
5 changes: 5 additions & 0 deletions tests/testlib/s2n_testlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,11 @@ S2N_RESULT s2n_connection_set_test_master_secret(struct s2n_connection *conn, co
* that our certificate validation code does not fail a root certificate signed with SHA-1. */
#define S2N_SHA1_ROOT_SIGNATURE_CA_CERT "../pems/rsa_1024_sha1_CA_cert.pem"

/* The leaf and intermediate have larger key sizes than the root. */
#define S2N_MIXED_CHAIN_CERTS "../pems/mixed_chains/ecdsa/server-chain.pem"
#define S2N_MIXED_CHAIN_KEY "../pems/mixed_chains/ecdsa/server-key.pem"
#define S2N_MIXED_CHAIN_CA "../pems/mixed_chains/ecdsa/ca-cert.pem"

#define S2N_DEFAULT_TEST_CERT_CHAIN S2N_RSA_2048_PKCS1_CERT_CHAIN
#define S2N_DEFAULT_TEST_PRIVATE_KEY S2N_RSA_2048_PKCS1_KEY

Expand Down