#!/bin/sh

# Copyright (c) 2011 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This script generates a set of test (end-entity, intermediate, root)
# certificates with (weak, strong), (RSA, DSA, ECDSA) key pairs.

key_types="768-rsa 1024-rsa 2048-rsa prime256v1-ecdsa"

try () {
  echo "$@"
  "$@" || exit 1
}

generate_key_command () {
  case "$1" in
    dsa)
      echo "dsaparam -genkey"
      ;;
    ecdsa)
      echo "ecparam -genkey"
      ;;
    rsa)
      echo genrsa
      ;;
    *)
      exit 1
  esac
}

try rm -rf out
try mkdir out

# Create the serial number files.
try /bin/sh -c "echo 01 > out/2048-rsa-root-serial"
for key_type in $key_types
do
  try /bin/sh -c "echo 01 > out/$key_type-intermediate-serial"
done

# Generate one root CA certificate.
try openssl genrsa -out out/2048-rsa-root.key 2048

CA_COMMON_NAME="2048 RSA Test Root CA" \
  CA_DIR=out \
  CA_NAME=req_env_dn \
  KEY_SIZE=2048 \
  ALGO=rsa \
  CERT_TYPE=root \
  try openssl req \
    -new \
    -key out/2048-rsa-root.key \
    -extensions ca_cert \
    -out out/2048-rsa-root.csr \
    -config ca.cnf

CA_COMMON_NAME="2048 RSA Test Root CA" \
  CA_DIR=out \
  CA_NAME=req_env_dn \
  try openssl x509 \
    -req -days 3650 \
    -in out/2048-rsa-root.csr \
    -extensions ca_cert \
    -extfile ca.cnf \
    -signkey out/2048-rsa-root.key \
    -out out/2048-rsa-root.pem \
    -text

# Generate private keys of all types and strengths for intermediate CAs and
# end-entities.
for key_type in $key_types
do
  key_size=$(echo "$key_type" | sed -E 's/-.+//')
  algo=$(echo "$key_type" | sed -E 's/.+-//')

  if [ ecdsa = $algo ]
  then
    key_size="-name $key_size"
  fi

  try openssl $(generate_key_command $algo) \
    -out out/$key_type-intermediate.key $key_size
done

for key_type in $key_types
do
  key_size=$(echo "$key_type" | sed -E 's/-.+//')
  algo=$(echo "$key_type" | sed -E 's/.+-//')

  if [ ecdsa = $algo ]
  then
    key_size="-name $key_size"
  fi

  for signer_key_type in $key_types
  do
    try openssl $(generate_key_command $algo) \
      -out out/$key_type-ee-by-$signer_key_type-intermediate.key $key_size
  done
done

# The root signs the intermediates.
for key_type in $key_types
do
  key_size=$(echo "$key_type" | sed -E 's/-.+//')
  algo=$(echo "$key_type" | sed -E 's/.+-//')

  CA_COMMON_NAME="$key_size $algo Test intermediate CA" \
    CA_DIR=out \
    CA_NAME=req_env_dn \
    KEY_SIZE=$key_size \
    ALGO=$algo \
    CERT_TYPE=intermediate \
    try openssl req \
      -new \
      -key out/$key_type-intermediate.key \
      -out out/$key_type-intermediate.csr \
      -config ca.cnf

  # Make sure the signer's DB file exists.
  touch out/2048-rsa-root-index.txt

  CA_COMMON_NAME="2048 RSA Test Root CA" \
    CA_DIR=out \
    CA_NAME=req_env_dn \
    KEY_SIZE=2048 \
    ALGO=rsa \
    CERT_TYPE=root \
    try openssl ca \
      -batch \
      -extensions ca_cert \
      -in out/$key_type-intermediate.csr \
      -out out/$key_type-intermediate.pem \
      -config ca.cnf
done

# The intermediates sign the end-entities.
for key_type in $key_types
do
  for signer_key_type in $key_types
  do
    key_size=$(echo "$key_type" | sed -E 's/-.+//')
    algo=$(echo "$key_type" | sed -E 's/.+-//')
    signer_key_size=$(echo "$signer_key_type" | sed -E 's/-.+//')
    signer_algo=$(echo "$signer_key_type" | sed -E 's/.+-//')
    touch out/$signer_key_type-intermediate-index.txt

    KEY_SIZE=$key_size \
      try openssl req \
        -new \
        -key out/$key_type-ee-by-$signer_key_type-intermediate.key \
        -out out/$key_type-ee-by-$signer_key_type-intermediate.csr \
        -config ee.cnf

    CA_COMMON_NAME="$signer_key_size $algo Test intermediate CA" \
      CA_DIR=out \
      CA_NAME=req_env_dn \
      KEY_SIZE=$signer_key_size \
      ALGO=$signer_algo \
      CERT_TYPE=intermediate \
      try openssl ca \
        -batch \
        -extensions user_cert \
        -in out/$key_type-ee-by-$signer_key_type-intermediate.csr \
        -out out/$key_type-ee-by-$signer_key_type-intermediate.pem \
        -config ca.cnf
  done
done

# Copy final outputs.
try cp out/*root*pem out/*intermediate*pem ../certificates
