#!/bin/bash
# Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

# Script to create sample certificates for the dart:io SecureSocket tests.
# Creates a root certificate authority, an intermediate authority,
# and a server certificate,

password=pass:dartdart

# We need a server certificate chain where we don't trust the root.  Take the
# server certificate from the previous run of this script, for that purpose.
if [ -d "certificates" ]; then
  mv certificates/server_key.pem certificates/untrusted_server_key.pem
  mv certificates/server_chain.pem certificates/untrusted_server_chain.pem
else
  mkdir certificates
fi

mkdir -p certificate_authority
cd certificate_authority

# Create a self-signed certificate authority.
openssl req -subj /CN=rootauthority -set_serial 1 -batch -verbose \
    -passout $password -new -x509 -keyout root_authority_key.pem \
    -out root_authority.pem -days 3650

# Create a certificate request for the intermediate authority.
openssl req -subj /CN=intermediateauthority -batch -verbose \
    -passout $password -new -keyout intermediate_authority_key.pem \
    -out intermediate_authority_request.pem

# Sign the certificate of the intermediate authority with the root authority.
# Add the certificate extensions marking it as a certificate authority.
openssl x509 -req -in intermediate_authority_request.pem \
    -out intermediate_authority.pem -set_serial 2 \
    -CA root_authority.pem -CAkey root_authority_key.pem \
    -passin $password -extfile ../sample_certificate_v3_extensions \
    -extensions intermediate_authority -days 3650

# Create a certificate request for the server certificate
openssl req -subj /CN=localhost -batch -verbose -passout $password -new \
    -keyout localhost_key.pem -out localhost_request.pem

# Sign the server certificate with the intermediate authority.  Add the
# certificate extensions for SubjectAltName and that it is not a CA itself.
openssl x509 -req -in localhost_request.pem -out localhost.pem -set_serial 1 \
    -CA intermediate_authority.pem -CAkey intermediate_authority_key.pem \
    -passin $password -extfile ../sample_certificate_v3_extensions \
    -extensions localhost -days 3650

# Create a self-signed client certificate authority.
openssl req -subj /CN=clientauthority -set_serial 1 -batch -verbose \
    -passout $password -new -x509 -keyout client_authority_key.pem \
    -out client_authority.pem -config ../sample_certificate_v3_extensions \
    -extensions client_authority -days 3650

# Create certificate requests for the client certificates
openssl req -subj /CN=user1 -batch -verbose -passout $password -new \
    -keyout client1_key.pem -out client1_request.pem
openssl req -subj /CN=user2 -batch -verbose -passout $password -new \
    -keyout client2_key.pem -out client2_request.pem

# Sign the certificate requests with the client authority
openssl x509 -req -in client1_request.pem -out client1.pem -set_serial 2 \
    -CA client_authority.pem -CAkey client_authority_key.pem \
    -passin $password -extfile ../sample_certificate_v3_extensions \
    -extensions client_certificate -days 3650
openssl x509 -req -in client2_request.pem -out client2.pem -set_serial 3 \
    -CA client_authority.pem -CAkey client_authority_key.pem \
    -passin $password -extfile ../sample_certificate_v3_extensions \
    -extensions client_certificate -days 3650

# Delete all the signing keys for the authorities, so testers that add
# them as trusted are less vulnerable: only the sample server certificate
# and client certificates will be signed by them. No more certificates
# will ever be signed.
rm root_authority_key.pem
rm intermediate_authority.pem
rm client_authority_key.pem

# Copy the certificates we will use to the 'certificates' directory.
CERTS=../certificates
cat localhost.pem intermediate_authority.pem root_authority.pem \
    > $CERTS/server_chain.pem

cat intermediate_authority.pem root_authority.pem client_authority.pem \
    > $CERTS/server_trusted.pem

# BoringSSL only accepts private keys signed with the PBE-SHA1-RC4-128 cipher.
openssl pkcs8 -in localhost_key.pem -out $CERTS/server_key.pem \
    -topk8 -v1 PBE-SHA1-RC4-128 -passin $password -passout $password
openssl pkcs8 -in client1_key.pem -out $CERTS/client1_key.pem \
    -topk8 -v1 PBE-SHA1-RC4-128 -passin $password -passout $password
openssl pkcs8 -in client2_key.pem -out $CERTS/client2_key.pem \
    -topk8 -v1 PBE-SHA1-RC4-128 -passin $password -passout $password

cp root_authority.pem $CERTS/trusted_certs.pem
cp client_authority.pem $CERTS
cp client1.pem $CERTS
cp client2.pem $CERTS

cd ..
