#!/bin/bash

# Copyright 2010 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Generate test keys for use by the tests.

# Load common constants and variables.
. "$(dirname "$0")/common.sh"

set -e

sha_types=( 1 256 512 )

# Generate RSA test keys of various lengths.
function generate_keys {
  key_index=0
  key_name_base="${TESTKEY_DIR}/key_rsa"
  for i in "${key_lengths[@]}"
  do
    key_base="${key_name_base}${i}"
    if [ -f "${key_base}.keyb" ]; then
      key_index=$((key_index + 1))
      continue
    fi

    # Extract exponent from key_length name, if necessary
    exp="F4"
    bits=$i
    if [ "${i##*_exp}" != "${i}" ]; then
        exp="${i##*_exp}"
        bits="${i%%_exp${exp}}"
    fi

    openssl genrsa "-${exp}" -out "${key_base}.pem" "${bits}"
    # Generate self-signed certificate from key.
    openssl req -batch -new -x509 -key "${key_base}.pem" \
      -out "${key_base}.crt"

    # Generate pre-processed key for use by RSA signature verification code.
    "${BIN_DIR}/dumpRSAPublicKey" -cert "${key_base}.crt" > "${key_base}.keyb"

    alg_index=0
    for sha_type in "${sha_types[@]}"
    do
      alg=$((key_index * 3 + alg_index))
  # wrap the public key
      "${FUTILITY}" vbutil_key \
        --pack "${key_base}.sha${sha_type}.vbpubk" \
        --key "${key_base}.keyb" \
        --version 1 \
        --algorithm ${alg}

  # wrap the private key
      "${FUTILITY}" vbutil_key \
        --pack "${key_base}.sha${sha_type}.vbprivk" \
        --key "${key_base}.pem" \
        --algorithm ${alg}
      alg_index=$((alg_index} + 1))
    done
    key_index=$((key_index + 1))
  done
}

mkdir -p ${TESTKEY_DIR}
generate_keys
