summaryrefslogtreecommitdiffstats
path: root/security/manager/ssl/tests/unit/test_signed_manifest/create_test_files.sh
diff options
context:
space:
mode:
Diffstat (limited to 'security/manager/ssl/tests/unit/test_signed_manifest/create_test_files.sh')
-rwxr-xr-xsecurity/manager/ssl/tests/unit/test_signed_manifest/create_test_files.sh181
1 files changed, 181 insertions, 0 deletions
diff --git a/security/manager/ssl/tests/unit/test_signed_manifest/create_test_files.sh b/security/manager/ssl/tests/unit/test_signed_manifest/create_test_files.sh
new file mode 100755
index 000000000..cddbe17ec
--- /dev/null
+++ b/security/manager/ssl/tests/unit/test_signed_manifest/create_test_files.sh
@@ -0,0 +1,181 @@
+#!/bin/bash
+#
+# Mode: shell-script; sh-indentation:2;
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+export BASE_PATH=`dirname $0`
+echo $BASE_PATH
+
+# location of the 'sign_b2g_manifest.py' script
+export SIGN_SCR_PATH=.
+
+DB_PATH=${BASE_PATH}/signingDB
+PASSWORD_FILE=${DB_PATH}/passwordfile
+VALID_MANIFEST_PATH=${BASE_PATH}/testValidSignedManifest
+INVALID_MANIFEST_PATH=${BASE_PATH}/testInvalidSignedManifest
+
+TRUSTED_EE=trusted_ee1
+UNTRUSTED_EE=untrusted_ee1
+TRUSTED_CA=trusted_ca1
+UNTRUSTED_CA=untrusted_ca1
+
+# Print usage info
+usage() {
+ echo
+ echo
+ tput bold
+ echo "NAME"
+ tput sgr0
+ echo " create_test_files.sh - Signing a manifest for Trusted Hosted Apps."
+ echo
+ tput bold
+ echo "SYNOPSIS"
+ tput sgr0
+ echo " create_test_files.sh"
+ echo " create_test_files.sh [--regenerate-test-certs]"
+ echo " create_test_files.sh [--help]"
+ echo
+ tput bold
+ echo "DESCRIPTION"
+ tput sgr0
+ echo " The script signs a manifest for Trusted Hosted Apps if no parameter"
+ echo " is given and if the manifest file and a certificate database directory"
+ echo " is present in the current directory."
+ echo " Two directories ./testValidSignedManifest and ./testInvalidSignedManifest"
+ echo " are generated containing a manifest signature file each, signed with valid"
+ echo " and invalid certificates respectively."
+ echo " If the --regenerate-test-certs parameter is given, a new certificate database"
+ echo " directory is generated before the signing takes place."
+ echo " If the certificate database is not present and the --regenerate-test-certs"
+ echo " parameter is not given the script exits whithout any operations."
+ echo
+ tput bold
+ echo "OPTIONS"
+ echo " --regenerate-test-certs,"
+ tput sgr0
+ echo " Generates a test certificate database and then signs the manifest.webapp"
+ echo " file in the current directory."
+ echo
+ tput bold
+ echo " --help,"
+ tput sgr0
+ echo " Show this usage information."
+ echo
+}
+
+# Function to create a signing database
+# Parameters:
+# $1: Output directory (where the DB will be created)
+# $2: Password file
+createDB() {
+ local db_path=${1}
+ local password_file=${2}
+
+ mkdir -p ${db_path}
+ echo insecurepassword > ${password_file}
+ certutil -d ${db_path} -N -f ${password_file} 2>&1 >/dev/null
+}
+
+# Add a CA cert and a signing cert to the database
+# Arguments:
+# $1: DB directory
+# $2: CA CN (don't include the CN=, just the value)
+# $3: Signing Cert CN (don't include the CN=, just the value)
+# $4: CA short name (don't use spaces!)
+# $5: Signing Cert short name (don't use spaces!)
+# $6: Password file
+addCerts() {
+ local db_path=${1}
+ local password_file=${6}
+
+ org="O=Example Trusted Corporation,L=Mountain View,ST=CA,C=US"
+ ca_subj="CN=${2},${org}"
+ ee_subj="CN=${3},${org}"
+
+ noisefile=/tmp/noise.$$
+ head -c 32 /dev/urandom > ${noisefile}
+
+ ca_responses=/tmp/caresponses.$$
+ ee_responses=/tmp/earesponses
+
+ echo y > ${ca_responses} # Is this a CA?
+ echo >> ${ca_responses} # Accept default path length constraint (no constraint)
+ echo y >> ${ca_responses} # Is this a critical constraint?
+ echo n > ${ee_responses} # Is this a CA?
+ echo >> ${ee_responses} # Accept default path length constraint (no constraint)
+ echo y >> ${ee_responses} # Is this a critical constraint?
+
+ make_cert="certutil -d ${db_path} -f ${password_file} -S -g 2048 -Z SHA256 \
+ -z ${noisefile} -y 3 -2 --extKeyUsage critical,codeSigning"
+ ${make_cert} -v 480 -n ${4} -m 1 -s "${ca_subj}" --keyUsage critical,certSigning \
+ -t ",,CTu" -x < ${ca_responses} 2>&1 >/dev/null
+ ${make_cert} -v 240 -n ${5} -c ${4} -m 2 -s "${ee_subj}" --keyUsage critical,digitalSignature \
+ -t ",,," < ${ee_responses} 2>&1 >/dev/null
+
+ certutil -d ${db_path} -L -n ${4} -r -o ${SIGN_SCR_PATH}/${4}.der
+
+ rm -f ${noisefile} ${ee_responses} ${ca_responses}
+}
+
+# Signs a manifest
+# Parameters:
+# $1: Database directory
+# $2: Unsigned manifest file path
+# $3: Signed manifest file path
+# $4: Nickname of the signing certificate
+# $5: Password file
+signManifest() {
+ local db_path=${1}
+ local password_file=${5}
+
+ python ${BASE_PATH}/${SIGN_SCR_PATH}/sign_b2g_manifest.py -d ${db_path} \
+ -f ${password_file} -k ${4} -i ${2} -o ${3}
+}
+
+# Generate the necessary files to be used for the signing
+generate_files() {
+ # First create a new couple of signing DBs
+ rm -rf ${DB_PATH} ${VALID_MANIFEST_PATH} ${INVALID_MANIFEST_PATH}
+ createDB ${DB_PATH} ${PASSWORD_FILE}
+ addCerts ${DB_PATH} "Trusted Valid CA" "Trusted Corp Cert" ${TRUSTED_CA} ${TRUSTED_EE} ${PASSWORD_FILE}
+ addCerts ${DB_PATH} "Trusted Invalid CA" "Trusted Invalid Cert" ${UNTRUSTED_CA} ${UNTRUSTED_EE} ${PASSWORD_FILE}
+}
+
+#Start of execution
+if [ ${1} ] && [ "${1}" == '--regenerate-test-certs' ]; then
+ generate_files
+elif [ "${1}" == '--help' ]; then
+ usage
+ exit 1
+else
+ if [ -d ${DB_PATH} ]; then
+ rm -rf ${VALID_MANIFEST_PATH} ${INVALID_MANIFEST_PATH}
+ else
+ echo "Error! The directory ${DB_PATH} does not exist!"
+ echo "New certificate database must be created!"
+ usage $0
+ exit 1
+ fi
+fi
+
+# Create all the test manifests
+mkdir -p ${VALID_MANIFEST_PATH}
+mkdir -p ${INVALID_MANIFEST_PATH}
+
+CURDIR=`pwd`
+cd $CURDIR
+
+# Sign a manifest file with a known issuer
+signManifest ${DB_PATH} ${BASE_PATH}/manifest.webapp \
+ ${VALID_MANIFEST_PATH}/manifest.sig \
+ ${TRUSTED_EE} ${PASSWORD_FILE}
+
+# Sign a manifest file with a unknown issuer
+signManifest ${DB_PATH} ${BASE_PATH}/manifest.webapp \
+ ${INVALID_MANIFEST_PATH}/manifest.sig \
+ ${UNTRUSTED_EE} ${PASSWORD_FILE}
+
+echo "Done!"