Blame nss/tests/chains/chains.sh

Packit 40b132
#!/bin/bash
Packit 40b132
#
Packit 40b132
# This Source Code Form is subject to the terms of the Mozilla Public
Packit 40b132
# License, v. 2.0. If a copy of the MPL was not distributed with this
Packit 40b132
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
Packit 40b132
Packit 40b132
########################################################################
Packit 40b132
#
Packit 40b132
# mozilla/security/nss/tests/cert/chains.sh
Packit 40b132
#
Packit 40b132
# Script to test certificate chains validity. 
Packit 40b132
#
Packit 40b132
# needs to work on all Unix and Windows platforms
Packit 40b132
#
Packit 40b132
# special strings
Packit 40b132
# ---------------
Packit 40b132
#   FIXME ... known problems, search for this string
Packit 40b132
#   NOTE .... unexpected behavior
Packit 40b132
########################################################################
Packit 40b132
Packit 40b132
########################### is_httpserv_alive ##########################
Packit 40b132
# local shell function to exit with a fatal error if selfserver is not
Packit 40b132
# running
Packit 40b132
########################################################################
Packit 40b132
is_httpserv_alive()
Packit 40b132
{
Packit 40b132
  if [ ! -f "${HTTPPID}" ]; then
Packit 40b132
      echo "$SCRIPTNAME: Error - httpserv PID file ${HTTPPID} doesn't exist"
Packit 40b132
      sleep 5
Packit 40b132
      if [ ! -f "${HTTPPID}" ]; then
Packit 40b132
          Exit 9 "Fatal - httpserv pid file ${HTTPPID} does not exist"
Packit 40b132
      fi
Packit 40b132
  fi
Packit 40b132
  
Packit 40b132
  if [ "${OS_ARCH}" = "WINNT" ] && \
Packit 40b132
     [ "$OS_NAME" = "CYGWIN_NT" -o "$OS_NAME" = "MINGW32_NT" ]; then
Packit 40b132
      PID=${SHELL_HTTPPID}
Packit 40b132
  else
Packit 40b132
      PID=`cat ${HTTPPID}`
Packit 40b132
  fi
Packit 40b132
Packit 40b132
  echo "kill -0 ${PID} >/dev/null 2>/dev/null" 
Packit 40b132
  kill -0 ${PID} >/dev/null 2>/dev/null || Exit 10 "Fatal - httpserv process not detectable"
Packit 40b132
Packit 40b132
  echo "httpserv with PID ${PID} found at `date`"
Packit 40b132
}
Packit 40b132
Packit 40b132
########################### wait_for_httpserv ##########################
Packit 40b132
# local shell function to wait until httpserver is running and initialized
Packit 40b132
########################################################################
Packit 40b132
wait_for_httpserv()
Packit 40b132
{
Packit 40b132
  echo "trying to connect to httpserv at `date`"
Packit 40b132
  echo "tstclnt -p ${NSS_AIA_PORT} -h ${HOSTADDR} -q -v"
Packit 40b132
  ${BINDIR}/tstclnt -p ${NSS_AIA_PORT} -h ${HOSTADDR} -q -v
Packit 40b132
  if [ $? -ne 0 ]; then
Packit 40b132
      sleep 5
Packit 40b132
      echo "retrying to connect to httpserv at `date`"
Packit 40b132
      echo "tstclnt -p ${NSS_AIA_PORT} -h ${HOSTADDR} -q -v"
Packit 40b132
      ${BINDIR}/tstclnt -p ${NSS_AIA_PORT} -h ${HOSTADDR} -q -v
Packit 40b132
      if [ $? -ne 0 ]; then
Packit 40b132
          html_failed "Waiting for Server"
Packit 40b132
      fi
Packit 40b132
  fi
Packit 40b132
  is_httpserv_alive
Packit 40b132
}
Packit 40b132
Packit 40b132
########################### kill_httpserv ##############################
Packit 40b132
# local shell function to kill the httpserver after the tests are done
Packit 40b132
########################################################################
Packit 40b132
kill_httpserv()
Packit 40b132
{
Packit 40b132
  if [ "${OS_ARCH}" = "WINNT" ] && \
Packit 40b132
     [ "$OS_NAME" = "CYGWIN_NT" -o "$OS_NAME" = "MINGW32_NT" ]; then
Packit 40b132
      PID=${SHELL_HTTPPID}
Packit 40b132
  else
Packit 40b132
      PID=`cat ${HTTPPID}`
Packit 40b132
  fi
Packit 40b132
Packit 40b132
  echo "trying to kill httpserv with PID ${PID} at `date`"
Packit 40b132
Packit 40b132
  if [ "${OS_ARCH}" = "WINNT" -o "${OS_ARCH}" = "WIN95" -o "${OS_ARCH}" = "OS2" ]; then
Packit 40b132
      echo "${KILL} ${PID}"
Packit 40b132
      ${KILL} ${PID}
Packit 40b132
  else
Packit 40b132
      echo "${KILL} -USR1 ${PID}"
Packit 40b132
      ${KILL} -USR1 ${PID}
Packit 40b132
  fi
Packit 40b132
  wait ${PID}
Packit 40b132
Packit 40b132
  # On Linux httpserv needs up to 30 seconds to fully die and free
Packit 40b132
  # the port.  Wait until the port is free. (Bug 129701)
Packit 40b132
  if [ "${OS_ARCH}" = "Linux" ]; then
Packit 40b132
      echo "httpserv -b -p ${NSS_AIA_PORT} 2>/dev/null;"
Packit 40b132
      until ${BINDIR}/httpserv -b -p ${NSS_AIA_PORT} 2>/dev/null; do
Packit 40b132
          echo "RETRY: httpserv -b -p ${NSS_AIA_PORT} 2>/dev/null;"
Packit 40b132
          sleep 1
Packit 40b132
      done
Packit 40b132
  fi
Packit 40b132
Packit 40b132
  echo "httpserv with PID ${PID} killed at `date`"
Packit 40b132
Packit 40b132
  rm ${HTTPPID}
Packit 40b132
  html_detect_core "kill_httpserv core detection step"
Packit 40b132
}
Packit 40b132
Packit 40b132
########################### start_httpserv #############################
Packit 40b132
# local shell function to start the httpserver with the parameters required 
Packit 40b132
# for this test and log information (parameters, start time)
Packit 40b132
# also: wait until the server is up and running
Packit 40b132
########################################################################
Packit 40b132
start_httpserv()
Packit 40b132
{
Packit 40b132
  HTTP_METHOD=$1
Packit 40b132
Packit 40b132
  if [ -n "$testname" ] ; then
Packit 40b132
      echo "$SCRIPTNAME: $testname ----"
Packit 40b132
  fi
Packit 40b132
  echo "httpserv starting at `date`"
Packit 40b132
  ODDIR="${HOSTDIR}/chains/OCSPD"
Packit 40b132
  echo "httpserv -D -p ${NSS_AIA_PORT} ${SERVER_OPTIONS} \\"
Packit 40b132
  echo "         -A OCSPRoot -C ${ODDIR}/OCSPRoot.crl -A OCSPCA1 -C ${ODDIR}/OCSPCA1.crl \\"
Packit 40b132
  echo "         -A OCSPCA2  -C ${ODDIR}/OCSPCA2.crl  -A OCSPCA3 -C ${ODDIR}/OCSPCA3.crl \\"
Packit 40b132
  echo "         -O ${HTTP_METHOD} -d ${ODDIR}/ServerDB/ -f ${ODDIR}/ServerDB/dbpasswd \\"
Packit 40b132
  echo "         -i ${HTTPPID} $verbose &"
Packit 40b132
  ${PROFTOOL} ${BINDIR}/httpserv -D -p ${NSS_AIA_PORT} ${SERVER_OPTIONS} \
Packit 40b132
                 -A OCSPRoot -C ${ODDIR}/OCSPRoot.crl -A OCSPCA1 -C ${ODDIR}/OCSPCA1.crl \
Packit 40b132
                 -A OCSPCA2  -C ${ODDIR}/OCSPCA2.crl  -A OCSPCA3 -C ${ODDIR}/OCSPCA3.crl \
Packit 40b132
                 -O ${HTTP_METHOD} -d ${ODDIR}/ServerDB/ -f ${ODDIR}/ServerDB/dbpasswd \
Packit 40b132
                 -i ${HTTPPID} $verbose &
Packit 40b132
  RET=$?
Packit 40b132
Packit 40b132
  # The PID $! returned by the MKS or Cygwin shell is not the PID of
Packit 40b132
  # the real background process, but rather the PID of a helper
Packit 40b132
  # process (sh.exe).  MKS's kill command has a bug: invoking kill
Packit 40b132
  # on the helper process does not terminate the real background
Packit 40b132
  # process.  Our workaround has been to have httpserv save its PID
Packit 40b132
  # in the ${HTTPPID} file and "kill" that PID instead.  But this
Packit 40b132
  # doesn't work under Cygwin; its kill command doesn't recognize
Packit 40b132
  # the PID of the real background process, but it does work on the
Packit 40b132
  # PID of the helper process.  So we save the value of $! in the
Packit 40b132
  # SHELL_HTTPPID variable, and use it instead of the ${HTTPPID}
Packit 40b132
  # file under Cygwin.  (In fact, this should work in any shell
Packit 40b132
  # other than the MKS shell.)
Packit 40b132
  SHELL_HTTPPID=$!
Packit 40b132
  wait_for_httpserv
Packit 40b132
Packit 40b132
  if [ "${OS_ARCH}" = "WINNT" ] && \
Packit 40b132
     [ "$OS_NAME" = "CYGWIN_NT" -o "$OS_NAME" = "MINGW32_NT" ]; then
Packit 40b132
      PID=${SHELL_HTTPPID}
Packit 40b132
  else
Packit 40b132
      PID=`cat ${HTTPPID}`
Packit 40b132
  fi
Packit 40b132
Packit 40b132
  echo "httpserv with PID ${PID} started at `date`"
Packit 40b132
}
Packit 40b132
Packit 40b132
############################# chains_init ##############################
Packit 40b132
# local shell function to initialize this script
Packit 40b132
########################################################################
Packit 40b132
chains_init()
Packit 40b132
{
Packit 40b132
    if [ -z "${CLEANUP}" ] ; then   # if nobody else is responsible for
Packit 40b132
        CLEANUP="${SCRIPTNAME}"     # cleaning this script will do it
Packit 40b132
    fi
Packit 40b132
    if [ -z "${INIT_SOURCED}" ] ; then
Packit 40b132
        cd ../common
Packit 40b132
        . ./init.sh
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    SCRIPTNAME="chains.sh"
Packit 40b132
Packit 40b132
    CHAINS_DIR="${HOSTDIR}/chains"
Packit 40b132
    mkdir -p ${CHAINS_DIR}
Packit 40b132
    cd ${CHAINS_DIR}
Packit 40b132
Packit 40b132
    CHAINS_SCENARIOS="${QADIR}/chains/scenarios/scenarios"
Packit 40b132
Packit 40b132
    CERT_SN_CNT=$(date '+%m%d%H%M%S' | sed "s/^0*//")
Packit 40b132
    CERT_SN_FIX=$(expr ${CERT_SN_CNT} - 1000)
Packit 40b132
Packit 40b132
    PK7_NONCE=${CERT_SN_CNT}
Packit 40b132
    SCEN_CNT=${CERT_SN_CNT}
Packit 40b132
Packit 40b132
    AIA_FILES="${HOSTDIR}/aiafiles"
Packit 40b132
Packit 40b132
    CU_DATA=${HOSTDIR}/cu_data
Packit 40b132
    CRL_DATA=${HOSTDIR}/crl_data
Packit 40b132
Packit 40b132
    DEFAULT_AIA_BASE_PORT=$(expr ${PORT:-8631} + 10)
Packit 40b132
    NSS_AIA_PORT=${NSS_AIA_PORT:-$DEFAULT_AIA_BASE_PORT}
Packit 40b132
    DEFAULT_UNUSED_PORT=$(expr ${PORT:-8631} + 11)
Packit 40b132
    NSS_UNUSED_PORT=${NSS_UNUSED_PORT:-$DEFAULT_UNUSED_PORT}
Packit 40b132
    NSS_AIA_HTTP=${NSS_AIA_HTTP:-"http://${HOSTADDR}:${NSS_AIA_PORT}"}
Packit 40b132
    NSS_AIA_PATH=${NSS_AIA_PATH:-$HOSTDIR/aiahttp}
Packit 40b132
    NSS_AIA_OCSP=${NSS_AIA_OCSP:-$NSS_AIA_HTTP/ocsp}
Packit 40b132
    NSS_OCSP_UNUSED=${NSS_AIA_OCSP_UNUSED:-"http://${HOSTADDR}:${NSS_UNUSED_PORT}"}
Packit 40b132
Packit 40b132
    html_head "Certificate Chains Tests"
Packit 40b132
}
Packit 40b132
Packit 40b132
chains_run_httpserv()
Packit 40b132
{
Packit 40b132
    HTTP_METHOD=$1
Packit 40b132
Packit 40b132
    if [ -n "${NSS_AIA_PATH}" ]; then
Packit 40b132
        HTTPPID=${NSS_AIA_PATH}/http_pid.$$
Packit 40b132
        mkdir -p "${NSS_AIA_PATH}"
Packit 40b132
        SAVEPWD=`pwd`
Packit 40b132
        cd "${NSS_AIA_PATH}"
Packit 40b132
        # Start_httpserv sets environment variables, which are required for
Packit 40b132
        # correct cleanup. (Running it in a subshell doesn't work, the
Packit 40b132
        # value of $SHELL_HTTPPID wouldn't arrive in this scope.)
Packit 40b132
        start_httpserv ${HTTP_METHOD}
Packit 40b132
        cd "${SAVEPWD}"
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
chains_stop_httpserv()
Packit 40b132
{
Packit 40b132
    if [ -n "${NSS_AIA_PATH}" ]; then
Packit 40b132
        kill_httpserv
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
############################ chains_cleanup ############################
Packit 40b132
# local shell function to finish this script (no exit since it might be
Packit 40b132
# sourced)
Packit 40b132
########################################################################
Packit 40b132
chains_cleanup()
Packit 40b132
{
Packit 40b132
    html "
"
Packit 40b132
    cd ${QADIR}
Packit 40b132
    . common/cleanup.sh
Packit 40b132
}
Packit 40b132
Packit 40b132
############################ print_cu_data #############################
Packit 40b132
# local shell function to print certutil input data
Packit 40b132
########################################################################
Packit 40b132
print_cu_data()
Packit 40b132
{
Packit 40b132
    echo "=== Certutil input data ==="
Packit 40b132
    cat ${CU_DATA}
Packit 40b132
    echo "==="
Packit 40b132
}
Packit 40b132
Packit 40b132
set_cert_sn()
Packit 40b132
{
Packit 40b132
    if [ -z "${SERIAL}" ]; then
Packit 40b132
        CERT_SN_CNT=$(expr ${CERT_SN_CNT} + 1)
Packit 40b132
        CERT_SN=${CERT_SN_CNT}
Packit 40b132
    else
Packit 40b132
        echo ${SERIAL} | cut -b 1 | grep '+' > /dev/null
Packit 40b132
        if [ $? -eq 0 ]; then
Packit 40b132
            CERT_SN=$(echo ${SERIAL} | cut -b 2-)
Packit 40b132
            CERT_SN=$(expr ${CERT_SN_FIX} + ${CERT_SN})
Packit 40b132
        else
Packit 40b132
            CERT_SN=${SERIAL}
Packit 40b132
        fi 
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
############################# create_db ################################
Packit 40b132
# local shell function to create certificate database
Packit 40b132
########################################################################
Packit 40b132
create_db()
Packit 40b132
{
Packit 40b132
    DB=$1
Packit 40b132
Packit 40b132
    [ -d "${DB}" ] && rm -rf ${DB}
Packit 40b132
    mkdir -p ${DB}
Packit 40b132
Packit 40b132
    echo "${DB}passwd" > ${DB}/dbpasswd
Packit 40b132
Packit 40b132
    TESTNAME="Creating DB ${DB}"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "certutil -N -d ${DB} -f ${DB}/dbpasswd" 
Packit 40b132
    ${BINDIR}/certutil -N -d ${DB} -f ${DB}/dbpasswd
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}" 
Packit 40b132
}
Packit 40b132
Packit 40b132
########################### create_root_ca #############################
Packit 40b132
# local shell function to generate self-signed root certificate
Packit 40b132
########################################################################
Packit 40b132
create_root_ca()
Packit 40b132
{
Packit 40b132
    ENTITY=$1
Packit 40b132
    ENTITY_DB=${ENTITY}DB
Packit 40b132
Packit 40b132
    set_cert_sn
Packit 40b132
    date >> ${NOISE_FILE} 2>&1
Packit 40b132
Packit 40b132
    CTYPE_OPT=
Packit 40b132
    if [ -n "${CTYPE}" ]; then
Packit 40b132
        CTYPE_OPT="-k ${CTYPE}"
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    echo "5
Packit 40b132
6
Packit 40b132
9
Packit 40b132
n
Packit 40b132
y
Packit 40b132
-1
Packit 40b132
n
Packit 40b132
5
Packit 40b132
6
Packit 40b132
7
Packit 40b132
9
Packit 40b132
n
Packit 40b132
" > ${CU_DATA}
Packit 40b132
Packit 40b132
    TESTNAME="Creating Root CA ${ENTITY}"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "certutil -s \"CN=${ENTITY} ROOT CA, O=${ENTITY}, C=US\" -S -n ${ENTITY} ${CTYPE_OPT} -t CTu,CTu,CTu -v 600 -x -d ${ENTITY_DB} -1 -2 -5 -f ${ENTITY_DB}/dbpasswd -z ${NOISE_FILE} -m ${CERT_SN} < ${CU_DATA}"
Packit 40b132
    print_cu_data
Packit 40b132
    ${BINDIR}/certutil -s "CN=${ENTITY} ROOT CA, O=${ENTITY}, C=US" -S -n ${ENTITY} ${CTYPE_OPT} -t CTu,CTu,CTu -v 600 -x -d ${ENTITY_DB} -1 -2 -5 -f ${ENTITY_DB}/dbpasswd -z ${NOISE_FILE} -m ${CERT_SN} < ${CU_DATA}
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
Packit 40b132
    TESTNAME="Exporting Root CA ${ENTITY}.der"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "certutil -L -d ${ENTITY_DB} -r -n ${ENTITY} -o ${ENTITY}.der"
Packit 40b132
    ${BINDIR}/certutil -L -d ${ENTITY_DB} -r -n ${ENTITY} -o ${ENTITY}.der
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
}
Packit 40b132
Packit 40b132
########################### create_cert_req ############################
Packit 40b132
# local shell function to generate certificate sign request
Packit 40b132
########################################################################
Packit 40b132
create_cert_req()
Packit 40b132
{
Packit 40b132
    ENTITY=$1
Packit 40b132
    TYPE=$2
Packit 40b132
Packit 40b132
    ENTITY_DB=${ENTITY}DB
Packit 40b132
Packit 40b132
    REQ=${ENTITY}Req.der
Packit 40b132
Packit 40b132
    date >> ${NOISE_FILE} 2>&1
Packit 40b132
Packit 40b132
    CTYPE_OPT=
Packit 40b132
    if [ -n "${CTYPE}" ]; then
Packit 40b132
        CTYPE_OPT="-k ${CTYPE}"
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    CA_FLAG=
Packit 40b132
    EXT_DATA=
Packit 40b132
    OPTIONS=
Packit 40b132
Packit 40b132
    if [ "${TYPE}" != "EE" ]; then
Packit 40b132
        CA_FLAG="-2"
Packit 40b132
        EXT_DATA="y
Packit 40b132
-1
Packit 40b132
y
Packit 40b132
"
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    process_crldp
Packit 40b132
Packit 40b132
    echo "${EXT_DATA}" > ${CU_DATA}
Packit 40b132
Packit 40b132
    TESTNAME="Creating ${TYPE} certifiate request ${REQ}"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "certutil -s \"CN=${ENTITY} ${TYPE}, O=${ENTITY}, C=US\" ${CTYPE_OPT} -R ${CA_FLAG} -d ${ENTITY_DB} -f ${ENTITY_DB}/dbpasswd -z ${NOISE_FILE} -o ${REQ} ${OPTIONS} < ${CU_DATA}"
Packit 40b132
    print_cu_data
Packit 40b132
    ${BINDIR}/certutil -s "CN=${ENTITY} ${TYPE}, O=${ENTITY}, C=US" ${CTYPE_OPT} -R ${CA_FLAG} -d ${ENTITY_DB} -f ${ENTITY_DB}/dbpasswd -z ${NOISE_FILE} -o ${REQ} ${OPTIONS} < ${CU_DATA} 
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
}
Packit 40b132
Packit 40b132
############################ create_entity #############################
Packit 40b132
# local shell function to create certificate chain entity
Packit 40b132
########################################################################
Packit 40b132
create_entity()
Packit 40b132
{
Packit 40b132
    ENTITY=$1
Packit 40b132
    TYPE=$2
Packit 40b132
Packit 40b132
    if [ -z "${ENTITY}" ]; then
Packit 40b132
        echo "Configuration error: Unnamed entity"
Packit 40b132
        exit 1
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    DB=${ENTITY}DB
Packit 40b132
    ENTITY_DB=${ENTITY}DB
Packit 40b132
Packit 40b132
    case "${TYPE}" in
Packit 40b132
    "Root")
Packit 40b132
        create_db "${DB}"
Packit 40b132
        create_root_ca "${ENTITY}"
Packit 40b132
        ;;
Packit 40b132
    "Intermediate" | "Bridge" | "EE")
Packit 40b132
        create_db "${DB}"
Packit 40b132
        create_cert_req "${ENTITY}" "${TYPE}"
Packit 40b132
        ;;
Packit 40b132
    "*")
Packit 40b132
        echo "Configuration error: Unknown type ${TYPE}"
Packit 40b132
        exit 1
Packit 40b132
        ;;
Packit 40b132
    esac
Packit 40b132
}
Packit 40b132
Packit 40b132
########################################################################
Packit 40b132
# List of global variables related to certificate extensions processing:
Packit 40b132
#
Packit 40b132
# Generated by process_extensions and functions called from it:
Packit 40b132
# OPTIONS - list of command line policy extensions 
Packit 40b132
# DATA - list of inpud data related to policy extensions
Packit 40b132
#
Packit 40b132
# Generated by parse_config:
Packit 40b132
# POLICY - list of certificate policies
Packit 40b132
# MAPPING - list of policy mappings 
Packit 40b132
# INHIBIT - inhibit flag
Packit 40b132
# AIA - AIA list
Packit 40b132
########################################################################
Packit 40b132
Packit 40b132
############################ process_policy ############################
Packit 40b132
# local shell function to process policy extension parameters and 
Packit 40b132
# generate input for certutil
Packit 40b132
########################################################################
Packit 40b132
process_policy()
Packit 40b132
{
Packit 40b132
    if [ -n "${POLICY}" ]; then
Packit 40b132
        OPTIONS="${OPTIONS} --extCP"
Packit 40b132
Packit 40b132
        NEXT=
Packit 40b132
        for ITEM in ${POLICY}; do
Packit 40b132
            if [ -n "${NEXT}" ]; then
Packit 40b132
                DATA="${DATA}y
Packit 40b132
"
Packit 40b132
            fi
Packit 40b132
Packit 40b132
            NEXT=1
Packit 40b132
            DATA="${DATA}${ITEM}
Packit 40b132
1
Packit 40b132
Packit 40b132
n
Packit 40b132
"
Packit 40b132
        done
Packit 40b132
Packit 40b132
        DATA="${DATA}n
Packit 40b132
n
Packit 40b132
"
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
########################### process_mapping ############################
Packit 40b132
# local shell function to process policy mapping parameters and 
Packit 40b132
# generate input for certutil
Packit 40b132
########################################################################
Packit 40b132
process_mapping()
Packit 40b132
{
Packit 40b132
    if [ -n "${MAPPING}" ]; then
Packit 40b132
        OPTIONS="${OPTIONS} --extPM"
Packit 40b132
Packit 40b132
        NEXT=
Packit 40b132
        for ITEM in ${MAPPING}; do
Packit 40b132
            if [ -n "${NEXT}" ]; then
Packit 40b132
                DATA="${DATA}y
Packit 40b132
"
Packit 40b132
            fi
Packit 40b132
Packit 40b132
            NEXT=1
Packit 40b132
            IDP=`echo ${ITEM} | cut -d: -f1`
Packit 40b132
            SDP=`echo ${ITEM} | cut -d: -f2`
Packit 40b132
            DATA="${DATA}${IDP}
Packit 40b132
${SDP}
Packit 40b132
"
Packit 40b132
        done
Packit 40b132
Packit 40b132
        DATA="${DATA}n
Packit 40b132
n
Packit 40b132
"
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
########################### process_inhibit#############################
Packit 40b132
# local shell function to process inhibit extension and generate input 
Packit 40b132
# for certutil
Packit 40b132
########################################################################
Packit 40b132
process_inhibit()
Packit 40b132
{
Packit 40b132
    if [ -n "${INHIBIT}" ]; then
Packit 40b132
        OPTIONS="${OPTIONS} --extIA"
Packit 40b132
Packit 40b132
        DATA="${DATA}${INHIBIT}
Packit 40b132
n
Packit 40b132
"
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
############################# process_aia ##############################
Packit 40b132
# local shell function to process AIA extension parameters and 
Packit 40b132
# generate input for certutil
Packit 40b132
########################################################################
Packit 40b132
process_aia()
Packit 40b132
{
Packit 40b132
    if [ -n "${AIA}" ]; then
Packit 40b132
        OPTIONS="${OPTIONS} --extAIA"
Packit 40b132
Packit 40b132
        DATA="${DATA}1
Packit 40b132
"
Packit 40b132
Packit 40b132
        for ITEM in ${AIA}; do
Packit 40b132
            PK7_NONCE=`expr $PK7_NONCE + 1`
Packit 40b132
Packit 40b132
            echo ${ITEM} | grep ":" > /dev/null
Packit 40b132
            if [ $? -eq 0 ]; then
Packit 40b132
                CERT_NICK=`echo ${ITEM} | cut -d: -f1`
Packit 40b132
                CERT_ISSUER=`echo ${ITEM} | cut -d: -f2`
Packit 40b132
                CERT_LOCAL="${CERT_NICK}${CERT_ISSUER}.der"
Packit 40b132
                CERT_PUBLIC="${HOST}-$$-${CERT_NICK}${CERT_ISSUER}-${PK7_NONCE}.der"
Packit 40b132
            else
Packit 40b132
                CERT_LOCAL="${ITEM}.p7"
Packit 40b132
                CERT_PUBLIC="${HOST}-$$-${ITEM}-${PK7_NONCE}.p7"
Packit 40b132
            fi
Packit 40b132
Packit 40b132
            DATA="${DATA}7
Packit 40b132
${NSS_AIA_HTTP}/${CERT_PUBLIC}
Packit 40b132
"
Packit 40b132
Packit 40b132
            if [ -n "${NSS_AIA_PATH}" ]; then
Packit 40b132
                cp ${CERT_LOCAL} ${NSS_AIA_PATH}/${CERT_PUBLIC} 2> /dev/null
Packit 40b132
                chmod a+r ${NSS_AIA_PATH}/${CERT_PUBLIC}
Packit 40b132
                echo ${NSS_AIA_PATH}/${CERT_PUBLIC} >> ${AIA_FILES}
Packit 40b132
            fi
Packit 40b132
        done
Packit 40b132
Packit 40b132
        DATA="${DATA}0
Packit 40b132
n
Packit 40b132
n"
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
process_ocsp()
Packit 40b132
{
Packit 40b132
    if [ -n "${OCSP}" ]; then
Packit 40b132
        OPTIONS="${OPTIONS} --extAIA"
Packit 40b132
 
Packit 40b132
	if [ "${OCSP}" = "offline" ]; then
Packit 40b132
	    MY_OCSP_URL=${NSS_OCSP_UNUSED}
Packit 40b132
	else
Packit 40b132
	    MY_OCSP_URL=${NSS_AIA_OCSP}
Packit 40b132
	fi
Packit 40b132
Packit 40b132
        DATA="${DATA}2
Packit 40b132
7
Packit 40b132
${MY_OCSP_URL}
Packit 40b132
0
Packit 40b132
n
Packit 40b132
n
Packit 40b132
"
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
process_crldp()
Packit 40b132
{
Packit 40b132
    if [ -n "${CRLDP}" ]; then
Packit 40b132
        OPTIONS="${OPTIONS} -4"
Packit 40b132
Packit 40b132
        EXT_DATA="${EXT_DATA}1
Packit 40b132
"
Packit 40b132
Packit 40b132
        for ITEM in ${CRLDP}; do
Packit 40b132
            CRL_PUBLIC="${HOST}-$$-${ITEM}-${SCEN_CNT}.crl"
Packit 40b132
Packit 40b132
            EXT_DATA="${EXT_DATA}7
Packit 40b132
${NSS_AIA_HTTP}/${CRL_PUBLIC}
Packit 40b132
"
Packit 40b132
        done
Packit 40b132
Packit 40b132
        EXT_DATA="${EXT_DATA}-1
Packit 40b132
-1
Packit 40b132
-1
Packit 40b132
n
Packit 40b132
n
Packit 40b132
"
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
process_ku_ns_eku()
Packit 40b132
{
Packit 40b132
    if [ -n "${EXT_KU}" ]; then
Packit 40b132
        OPTIONS="${OPTIONS} --keyUsage ${EXT_KU}"
Packit 40b132
    fi
Packit 40b132
    if [ -n "${EXT_NS}" ]; then
Packit 40b132
        EXT_NS_KEY=$(echo ${EXT_NS} | cut -d: -f1)
Packit 40b132
        EXT_NS_CODE=$(echo ${EXT_NS} | cut -d: -f2)
Packit 40b132
Packit 40b132
        OPTIONS="${OPTIONS} --nsCertType ${EXT_NS_KEY}"
Packit 40b132
        DATA="${DATA}${EXT_NS_CODE}
Packit 40b132
-1
Packit 40b132
n
Packit 40b132
"
Packit 40b132
    fi
Packit 40b132
    if [ -n "${EXT_EKU}" ]; then
Packit 40b132
        OPTIONS="${OPTIONS} --extKeyUsage ${EXT_EKU}"
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
copy_crl()
Packit 40b132
Packit 40b132
{
Packit 40b132
    if [ -z "${NSS_AIA_PATH}" ]; then
Packit 40b132
        return;
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    CRL_LOCAL="${COPYCRL}.crl"
Packit 40b132
    CRL_PUBLIC="${HOST}-$$-${COPYCRL}-${SCEN_CNT}.crl"
Packit 40b132
Packit 40b132
    cp ${CRL_LOCAL} ${NSS_AIA_PATH}/${CRL_PUBLIC} 2> /dev/null
Packit 40b132
    chmod a+r ${NSS_AIA_PATH}/${CRL_PUBLIC}
Packit 40b132
    echo ${NSS_AIA_PATH}/${CRL_PUBLIC} >> ${AIA_FILES}
Packit 40b132
}
Packit 40b132
Packit 40b132
########################## process_extension ###########################
Packit 40b132
# local shell function to process entity extension parameters and 
Packit 40b132
# generate input for certutil
Packit 40b132
########################################################################
Packit 40b132
process_extensions()
Packit 40b132
{
Packit 40b132
    OPTIONS=
Packit 40b132
    DATA=
Packit 40b132
Packit 40b132
    process_policy
Packit 40b132
    process_mapping
Packit 40b132
    process_inhibit
Packit 40b132
    process_aia
Packit 40b132
    process_ocsp
Packit 40b132
    process_ku_ns_eku
Packit 40b132
}
Packit 40b132
Packit 40b132
############################## sign_cert ###############################
Packit 40b132
# local shell function to sign certificate sign reuqest
Packit 40b132
########################################################################
Packit 40b132
sign_cert()
Packit 40b132
{
Packit 40b132
    ENTITY=$1
Packit 40b132
    ISSUER=$2
Packit 40b132
    TYPE=$3
Packit 40b132
Packit 40b132
    [ -z "${ISSUER}" ] && return
Packit 40b132
Packit 40b132
    ENTITY_DB=${ENTITY}DB
Packit 40b132
    ISSUER_DB=${ISSUER}DB
Packit 40b132
    REQ=${ENTITY}Req.der
Packit 40b132
    CERT=${ENTITY}${ISSUER}.der
Packit 40b132
Packit 40b132
    set_cert_sn
Packit 40b132
Packit 40b132
    EMAIL_OPT=
Packit 40b132
    if [ "${TYPE}" = "Bridge" ]; then
Packit 40b132
        EMAIL_OPT="-7 ${ENTITY}@${ISSUER}"
Packit 40b132
Packit 40b132
        [ -n "${EMAILS}" ] && EMAILS="${EMAILS},"
Packit 40b132
        EMAILS="${EMAILS}${ENTITY}@${ISSUER}"
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    process_extensions 
Packit 40b132
Packit 40b132
    echo "${DATA}" > ${CU_DATA}
Packit 40b132
Packit 40b132
    TESTNAME="Creating certficate ${CERT} signed by ${ISSUER}"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "certutil -C -c ${ISSUER} -v 60 -d ${ISSUER_DB} -i ${REQ} -o ${CERT} -f ${ISSUER_DB}/dbpasswd -m ${CERT_SN} ${EMAIL_OPT} ${OPTIONS} < ${CU_DATA}"
Packit 40b132
    print_cu_data
Packit 40b132
    ${BINDIR}/certutil -C -c ${ISSUER} -v 60 -d ${ISSUER_DB} -i ${REQ} -o ${CERT} -f ${ISSUER_DB}/dbpasswd -m ${CERT_SN} ${EMAIL_OPT} ${OPTIONS} < ${CU_DATA}
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
Packit 40b132
    TESTNAME="Importing certificate ${CERT} to ${ENTITY_DB} database"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "certutil -A -n ${ENTITY} -t u,u,u -d ${ENTITY_DB} -f ${ENTITY_DB}/dbpasswd -i ${CERT}"
Packit 40b132
    ${BINDIR}/certutil -A -n ${ENTITY} -t u,u,u -d ${ENTITY_DB} -f ${ENTITY_DB}/dbpasswd -i ${CERT}
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
}
Packit 40b132
Packit 40b132
############################# create_pkcs7##############################
Packit 40b132
# local shell function to package bridge certificates into pkcs7 
Packit 40b132
# package
Packit 40b132
########################################################################
Packit 40b132
create_pkcs7()
Packit 40b132
{
Packit 40b132
    ENTITY=$1
Packit 40b132
    ENTITY_DB=${ENTITY}DB
Packit 40b132
Packit 40b132
    TESTNAME="Generating PKCS7 package from ${ENTITY_DB} database"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "cmsutil -O -r \"${EMAILS}\" -d ${ENTITY_DB} > ${ENTITY}.p7"
Packit 40b132
    ${BINDIR}/cmsutil -O -r "${EMAILS}" -d ${ENTITY_DB} > ${ENTITY}.p7
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
}
Packit 40b132
Packit 40b132
############################# import_key ###############################
Packit 40b132
# local shell function to import private key + cert into database
Packit 40b132
########################################################################
Packit 40b132
import_key()
Packit 40b132
{
Packit 40b132
    KEY_NAME=$1.p12
Packit 40b132
    DB=$2
Packit 40b132
Packit 40b132
    KEY_FILE=../OCSPD/${KEY_NAME}
Packit 40b132
Packit 40b132
    TESTNAME="Importing p12 key ${KEY_NAME} to ${DB} database"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "${BINDIR}/pk12util -d ${DB} -i ${KEY_FILE} -k ${DB}/dbpasswd -W nssnss"
Packit 40b132
    ${BINDIR}/pk12util -d ${DB} -i ${KEY_FILE} -k ${DB}/dbpasswd -W nssnss
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
}
Packit 40b132
Packit 40b132
export_key()
Packit 40b132
{
Packit 40b132
    KEY_NAME=$1.p12
Packit 40b132
    DB=$2
Packit 40b132
Packit 40b132
    TESTNAME="Exporting $1 as ${KEY_NAME} from ${DB} database"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "${BINDIR}/pk12util -d ${DB} -o ${KEY_NAME} -n $1 -k ${DB}/dbpasswd -W nssnss"
Packit 40b132
    ${BINDIR}/pk12util -d ${DB} -o ${KEY_NAME} -n $1 -k ${DB}/dbpasswd -W nssnss
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
}
Packit 40b132
Packit 40b132
############################# import_cert ##############################
Packit 40b132
# local shell function to import certificate into database
Packit 40b132
########################################################################
Packit 40b132
import_cert()
Packit 40b132
{
Packit 40b132
    IMPORT=$1
Packit 40b132
    DB=$2
Packit 40b132
Packit 40b132
    CERT_NICK=`echo ${IMPORT} | cut -d: -f1`
Packit 40b132
    CERT_ISSUER=`echo ${IMPORT} | cut -d: -f2`
Packit 40b132
    CERT_TRUST=`echo ${IMPORT} | cut -d: -f3`
Packit 40b132
Packit 40b132
    if [ "${CERT_ISSUER}" = "x" ]; then
Packit 40b132
        CERT_ISSUER=
Packit 40b132
        CERT=${CERT_NICK}.cert
Packit 40b132
        CERT_FILE="${QADIR}/libpkix/certs/${CERT}"
Packit 40b132
    elif [ "${CERT_ISSUER}" = "d" ]; then
Packit 40b132
        CERT_ISSUER=
Packit 40b132
        CERT=${CERT_NICK}.der
Packit 40b132
        CERT_FILE="../OCSPD/${CERT}"
Packit 40b132
    else
Packit 40b132
        CERT=${CERT_NICK}${CERT_ISSUER}.der
Packit 40b132
        CERT_FILE=${CERT}
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    IS_ASCII=`grep -c -- "-----BEGIN CERTIFICATE-----" ${CERT_FILE}`
Packit 40b132
Packit 40b132
    ASCII_OPT=
Packit 40b132
    if [ "${IS_ASCII}" -gt 0 ]; then
Packit 40b132
        ASCII_OPT="-a"
Packit 40b132
    fi
Packit 40b132
   
Packit 40b132
    TESTNAME="Importing certificate ${CERT} to ${DB} database"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "certutil -A -n ${CERT_NICK} ${ASCII_OPT} -t \"${CERT_TRUST}\" -d ${DB} -f ${DB}/dbpasswd -i ${CERT_FILE}"
Packit 40b132
    ${BINDIR}/certutil -A -n ${CERT_NICK} ${ASCII_OPT} -t "${CERT_TRUST}" -d ${DB} -f ${DB}/dbpasswd -i ${CERT_FILE} 
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
}
Packit 40b132
Packit 40b132
import_crl()
Packit 40b132
{
Packit 40b132
    IMPORT=$1
Packit 40b132
    DB=$2
Packit 40b132
Packit 40b132
    CRL_NICK=`echo ${IMPORT} | cut -d: -f1`
Packit 40b132
    CRL_FILE=${CRL_NICK}.crl
Packit 40b132
Packit 40b132
    if [ ! -f "${CRL_FILE}" ]; then
Packit 40b132
        return
Packit 40b132
    fi 
Packit 40b132
Packit 40b132
    TESTNAME="Importing CRL ${CRL_FILE} to ${DB} database"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "crlutil -I -d ${DB} -f ${DB}/dbpasswd -i ${CRL_FILE}"
Packit 40b132
    ${BINDIR}/crlutil -I -d ${DB} -f ${DB}/dbpasswd -i ${CRL_FILE} 
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
}
Packit 40b132
Packit 40b132
create_crl()
Packit 40b132
{
Packit 40b132
    ISSUER=$1
Packit 40b132
    ISSUER_DB=${ISSUER}DB
Packit 40b132
Packit 40b132
    CRL=${ISSUER}.crl
Packit 40b132
Packit 40b132
    DATE=$(date -u '+%Y%m%d%H%M%SZ')
Packit 40b132
    DATE_LAST="${DATE}"
Packit 40b132
Packit 40b132
    UPDATE=$(expr $(date -u '+%Y') + 1)$(date -u '+%m%d%H%M%SZ')
Packit 40b132
Packit 40b132
    echo "update=${DATE}" > ${CRL_DATA}
Packit 40b132
    echo "nextupdate=${UPDATE}" >> ${CRL_DATA}
Packit 40b132
Packit 40b132
    TESTNAME="Create CRL for ${ISSUER_DB}"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "crlutil -G -d ${ISSUER_DB} -n ${ISSUER} -f ${ISSUER_DB}/dbpasswd -o ${CRL}"
Packit 40b132
    echo "=== Crlutil input data ==="
Packit 40b132
    cat ${CRL_DATA}
Packit 40b132
    echo "==="
Packit 40b132
    ${BINDIR}/crlutil -G -d ${ISSUER_DB} -n ${ISSUER} -f ${ISSUER_DB}/dbpasswd -o ${CRL} < ${CRL_DATA}
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
}
Packit 40b132
Packit 40b132
revoke_cert()
Packit 40b132
{
Packit 40b132
    ISSUER=$1
Packit 40b132
    ISSUER_DB=${ISSUER}DB
Packit 40b132
Packit 40b132
    CRL=${ISSUER}.crl
Packit 40b132
Packit 40b132
    set_cert_sn
Packit 40b132
Packit 40b132
    DATE=$(date -u '+%Y%m%d%H%M%SZ')
Packit 40b132
    while [ "${DATE}" = "${DATE_LAST}" ]; do
Packit 40b132
        sleep 1
Packit 40b132
        DATE=$(date -u '+%Y%m%d%H%M%SZ')
Packit 40b132
    done
Packit 40b132
    DATE_LAST="${DATE}"
Packit 40b132
Packit 40b132
    echo "update=${DATE}" > ${CRL_DATA}
Packit 40b132
    echo "addcert ${CERT_SN} ${DATE}" >> ${CRL_DATA}
Packit 40b132
Packit 40b132
    TESTNAME="Revoking certificate with SN ${CERT_SN} issued by ${ISSUER}"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "crlutil -M -d ${ISSUER_DB} -n ${ISSUER} -f ${ISSUER_DB}/dbpasswd -o ${CRL}"
Packit 40b132
    echo "=== Crlutil input data ==="
Packit 40b132
    cat ${CRL_DATA}
Packit 40b132
    echo "==="
Packit 40b132
    ${BINDIR}/crlutil -M -d ${ISSUER_DB} -n ${ISSUER} -f ${ISSUER_DB}/dbpasswd -o ${CRL} < ${CRL_DATA}
Packit 40b132
    html_msg $? 0 "${SCENARIO}${TESTNAME}"
Packit 40b132
}
Packit 40b132
Packit 40b132
########################################################################
Packit 40b132
# List of global variables related to certificate verification:
Packit 40b132
#
Packit 40b132
# Generated by parse_config:
Packit 40b132
# DB - DB used for testing
Packit 40b132
# FETCH - fetch flag (used with AIA extension)
Packit 40b132
# POLICY - list of policies
Packit 40b132
# TRUST - trust anchor
Packit 40b132
# TRUST_AND_DB - Examine both trust anchors and the cert db for trust
Packit 40b132
# VERIFY - list of certificates to use as vfychain parameters
Packit 40b132
# EXP_RESULT - expected result
Packit 40b132
# REV_OPTS - revocation options
Packit 40b132
########################################################################
Packit 40b132
Packit 40b132
############################# verify_cert ##############################
Packit 40b132
# local shell function to verify certificate validity
Packit 40b132
########################################################################
Packit 40b132
verify_cert()
Packit 40b132
{
Packit 40b132
    ENGINE=$1
Packit 40b132
Packit 40b132
    DB_OPT=
Packit 40b132
    FETCH_OPT=
Packit 40b132
    POLICY_OPT=
Packit 40b132
    TRUST_OPT=
Packit 40b132
    VFY_CERTS=
Packit 40b132
    VFY_LIST=
Packit 40b132
    TRUST_AND_DB_OPT=
Packit 40b132
Packit 40b132
    if [ -n "${DB}" ]; then
Packit 40b132
        DB_OPT="-d ${DB}"
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    if [ -n "${FETCH}" ]; then
Packit 40b132
        FETCH_OPT="-f"
Packit 40b132
        if [ -z "${NSS_AIA_HTTP}" ]; then
Packit 40b132
            echo "${SCRIPTNAME} Skipping test using AIA fetching, NSS_AIA_HTTP not defined"
Packit 40b132
            return
Packit 40b132
        fi
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    if [ -n "${TRUST_AND_DB}" ]; then
Packit 40b132
        TRUST_AND_DB_OPT="-T"
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    for ITEM in ${POLICY}; do
Packit 40b132
        POLICY_OPT="${POLICY_OPT} -o ${ITEM}"
Packit 40b132
    done
Packit 40b132
Packit 40b132
    for ITEM in ${TRUST}; do
Packit 40b132
        echo ${ITEM} | grep ":" > /dev/null
Packit 40b132
        if [ $? -eq 0 ]; then
Packit 40b132
            CERT_NICK=`echo ${ITEM} | cut -d: -f1`
Packit 40b132
            CERT_ISSUER=`echo ${ITEM} | cut -d: -f2`
Packit 40b132
            CERT=${CERT_NICK}${CERT_ISSUER}.der
Packit 40b132
Packit 40b132
            TRUST_OPT="${TRUST_OPT} -t ${CERT}"
Packit 40b132
        else
Packit 40b132
            TRUST_OPT="${TRUST_OPT} -t ${ITEM}"
Packit 40b132
        fi
Packit 40b132
    done
Packit 40b132
Packit 40b132
    for ITEM in ${VERIFY}; do
Packit 40b132
        CERT_NICK=`echo ${ITEM} | cut -d: -f1`
Packit 40b132
        CERT_ISSUER=`echo ${ITEM} | cut -d: -f2`
Packit 40b132
Packit 40b132
        if [ "${CERT_ISSUER}" = "x" ]; then
Packit 40b132
            CERT="${QADIR}/libpkix/certs/${CERT_NICK}.cert"
Packit 40b132
            VFY_CERTS="${VFY_CERTS} ${CERT}"
Packit 40b132
            VFY_LIST="${VFY_LIST} ${CERT_NICK}.cert"
Packit 40b132
        elif [ "${CERT_ISSUER}" = "d" ]; then
Packit 40b132
            CERT="../OCSPD/${CERT_NICK}.der"
Packit 40b132
            VFY_CERTS="${VFY_CERTS} ${CERT}"
Packit 40b132
            VFY_LIST="${VFY_LIST} ${CERT_NICK}.cert"
Packit 40b132
        else
Packit 40b132
            CERT=${CERT_NICK}${CERT_ISSUER}.der
Packit 40b132
            VFY_CERTS="${VFY_CERTS} ${CERT}"
Packit 40b132
            VFY_LIST="${VFY_LIST} ${CERT}"
Packit 40b132
        fi
Packit 40b132
    done
Packit 40b132
Packit 40b132
    VFY_OPTS_TNAME="${DB_OPT} ${ENGINE} ${TRUST_AND_DB_OPT} ${REV_OPTS} ${FETCH_OPT} ${USAGE_OPT} ${POLICY_OPT} ${TRUST_OPT}"
Packit 40b132
    VFY_OPTS_ALL="${DB_OPT} ${ENGINE} -vv ${TRUST_AND_DB_OPT} ${REV_OPTS} ${FETCH_OPT} ${USAGE_OPT} ${POLICY_OPT} ${VFY_CERTS} ${TRUST_OPT}"
Packit 40b132
Packit 40b132
    TESTNAME="Verifying certificate(s) ${VFY_LIST} with flags ${VFY_OPTS_TNAME}"
Packit 40b132
    echo "${SCRIPTNAME}: ${TESTNAME}"
Packit 40b132
    echo "vfychain ${VFY_OPTS_ALL}"
Packit 40b132
Packit 40b132
    if [ -z "${MEMLEAK_DBG}" ]; then
Packit 40b132
        VFY_OUT=$(${BINDIR}/vfychain ${VFY_OPTS_ALL} 2>&1)
Packit 40b132
        RESULT=$?
Packit 40b132
        echo "${VFY_OUT}"
Packit 40b132
    else 
Packit 40b132
        VFY_OUT=$(${RUN_COMMAND_DBG} ${BINDIR}/vfychain ${VFY_OPTS_ALL} 2>> ${LOGFILE})
Packit 40b132
        RESULT=$?
Packit 40b132
        echo "${VFY_OUT}"
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    echo "${VFY_OUT}" | grep "ERROR -5990: I/O operation timed out" > /dev/null
Packit 40b132
    E5990=$?
Packit 40b132
    echo "${VFY_OUT}" | grep "ERROR -8030: Server returned bad HTTP response" > /dev/null
Packit 40b132
    E8030=$?
Packit 40b132
Packit 40b132
    if [ $E5990 -eq 0 -o $E8030 -eq 0 ]; then
Packit 40b132
        echo "Result of this test is not valid due to network time out."
Packit 40b132
        html_unknown "${SCENARIO}${TESTNAME}"
Packit 40b132
        return
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    echo "Returned value is ${RESULT}, expected result is ${EXP_RESULT}"
Packit 40b132
    
Packit 40b132
    if [ "${EXP_RESULT}" = "pass" -a ${RESULT} -eq 0 ]; then
Packit 40b132
        html_passed "${SCENARIO}${TESTNAME}"
Packit 40b132
    elif [ "${EXP_RESULT}" = "fail" -a ${RESULT} -ne 0 ]; then
Packit 40b132
        html_passed "${SCENARIO}${TESTNAME}"
Packit 40b132
    else
Packit 40b132
        html_failed "${SCENARIO}${TESTNAME}"
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
check_ocsp()
Packit 40b132
{
Packit 40b132
    OCSP_CERT=$1
Packit 40b132
Packit 40b132
    CERT_NICK=`echo ${OCSP_CERT} | cut -d: -f1`
Packit 40b132
    CERT_ISSUER=`echo ${OCSP_CERT} | cut -d: -f2`
Packit 40b132
Packit 40b132
    if [ "${CERT_ISSUER}" = "x" ]; then
Packit 40b132
        CERT_ISSUER=
Packit 40b132
        CERT=${CERT_NICK}.cert
Packit 40b132
        CERT_FILE="${QADIR}/libpkix/certs/${CERT}"
Packit 40b132
    elif [ "${CERT_ISSUER}" = "d" ]; then
Packit 40b132
        CERT_ISSUER=
Packit 40b132
        CERT=${CERT_NICK}.der
Packit 40b132
        CERT_FILE="../OCSPD/${CERT}"
Packit 40b132
    else
Packit 40b132
        CERT=${CERT_NICK}${CERT_ISSUER}.der
Packit 40b132
        CERT_FILE=${CERT}
Packit 40b132
    fi
Packit 40b132
Packit 40b132
    # sample line:
Packit 40b132
    #   URI: "http://ocsp.server:2601"
Packit 40b132
    OCSP_HOST=$(${BINDIR}/pp -w -t certificate -i ${CERT_FILE} | grep URI | sed "s/.*:\/\///" | sed "s/:.*//")
Packit 40b132
    OCSP_PORT=$(${BINDIR}/pp -w -t certificate -i ${CERT_FILE} | grep URI | sed "s/^.*:.*:\/\/.*:\([0-9]*\).*$/\1/")
Packit 40b132
Packit 40b132
    echo "tstclnt -h ${OCSP_HOST} -p ${OCSP_PORT} -q -t 20"
Packit 40b132
    tstclnt -h ${OCSP_HOST} -p ${OCSP_PORT} -q -t 20
Packit 40b132
    return $?
Packit 40b132
}
Packit 40b132
Packit 40b132
############################ parse_result ##############################
Packit 40b132
# local shell function to process expected result value
Packit 40b132
# this function was created for case that expected result depends on
Packit 40b132
# some conditions - in our case type of cert DB
Packit 40b132
#
Packit 40b132
# default results are pass and fail
Packit 40b132
# this function added parsable values in format:
Packit 40b132
# type1:value1 type2:value2 .... typex:valuex
Packit 40b132
#
Packit 40b132
# allowed types are dbm, sql, all (all means all other cases)
Packit 40b132
# allowed values are pass and fail
Packit 40b132
#
Packit 40b132
# if this format is not used, EXP_RESULT will stay unchanged (this also
Packit 40b132
# covers pass and fail states)
Packit 40b132
########################################################################
Packit 40b132
parse_result()
Packit 40b132
{
Packit 40b132
    for RES in ${EXP_RESULT}
Packit 40b132
    do
Packit 40b132
        RESTYPE=$(echo ${RES} | cut -d: -f1)
Packit 40b132
        RESSTAT=$(echo ${RES} | cut -d: -f2)
Packit 40b132
Packit 40b132
        if [ "${RESTYPE}" = "${NSS_DEFAULT_DB_TYPE}" -o "${RESTYPE}" = "all" ]; then
Packit 40b132
            EXP_RESULT=${RESSTAT}
Packit 40b132
            break
Packit 40b132
        fi
Packit 40b132
    done
Packit 40b132
}
Packit 40b132
Packit 40b132
############################ parse_config ##############################
Packit 40b132
# local shell function to parse and process file containing certificate
Packit 40b132
# chain configuration and list of tests
Packit 40b132
########################################################################
Packit 40b132
parse_config()
Packit 40b132
{
Packit 40b132
    SCENARIO=
Packit 40b132
    LOGNAME=
Packit 40b132
Packit 40b132
    while read KEY VALUE
Packit 40b132
    do
Packit 40b132
        case "${KEY}" in
Packit 40b132
        "entity")
Packit 40b132
            ENTITY="${VALUE}"
Packit 40b132
            TYPE=
Packit 40b132
            ISSUER=
Packit 40b132
            CTYPE=
Packit 40b132
            POLICY=
Packit 40b132
            MAPPING=
Packit 40b132
            INHIBIT=
Packit 40b132
            AIA=
Packit 40b132
            CRLDP=
Packit 40b132
            OCSP=
Packit 40b132
            DB=
Packit 40b132
            EMAILS=
Packit 40b132
            EXT_KU=
Packit 40b132
            EXT_NS=
Packit 40b132
            EXT_EKU=
Packit 40b132
            SERIAL=
Packit 40b132
	    EXPORT_KEY=
Packit 40b132
            ;;
Packit 40b132
        "type")
Packit 40b132
            TYPE="${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "issuer")
Packit 40b132
            if [ -n "${ISSUER}" ]; then
Packit 40b132
                if [ -z "${DB}" ]; then
Packit 40b132
                    create_entity "${ENTITY}" "${TYPE}"
Packit 40b132
                fi
Packit 40b132
                sign_cert "${ENTITY}" "${ISSUER}" "${TYPE}"
Packit 40b132
            fi
Packit 40b132
Packit 40b132
            ISSUER="${VALUE}"
Packit 40b132
            POLICY=
Packit 40b132
            MAPPING=
Packit 40b132
            INHIBIT=
Packit 40b132
            AIA=
Packit 40b132
            EXT_KU=
Packit 40b132
            EXT_NS=
Packit 40b132
            EXT_EKU=
Packit 40b132
            ;;
Packit 40b132
        "ctype") 
Packit 40b132
            CTYPE="${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "policy")
Packit 40b132
            POLICY="${POLICY} ${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "mapping")
Packit 40b132
            MAPPING="${MAPPING} ${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "inhibit")
Packit 40b132
            INHIBIT="${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "aia")
Packit 40b132
            AIA="${AIA} ${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "crldp")
Packit 40b132
            CRLDP="${CRLDP} ${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "ocsp")
Packit 40b132
            OCSP="${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "db")
Packit 40b132
            DB="${VALUE}DB"
Packit 40b132
            create_db "${DB}"
Packit 40b132
            ;;
Packit 40b132
        "import")
Packit 40b132
            IMPORT="${VALUE}"
Packit 40b132
            import_cert "${IMPORT}" "${DB}"
Packit 40b132
            import_crl "${IMPORT}" "${DB}"
Packit 40b132
            ;;
Packit 40b132
        "import_key")
Packit 40b132
            IMPORT="${VALUE}"
Packit 40b132
            import_key "${IMPORT}" "${DB}"
Packit 40b132
            ;;
Packit 40b132
        "crl")
Packit 40b132
            ISSUER="${VALUE}"
Packit 40b132
            create_crl "${ISSUER}"
Packit 40b132
            ;;
Packit 40b132
        "revoke")
Packit 40b132
            REVOKE="${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "serial")
Packit 40b132
            SERIAL="${VALUE}"
Packit 40b132
            ;;
Packit 40b132
	"export_key")
Packit 40b132
	    EXPORT_KEY=1
Packit 40b132
	    ;;
Packit 40b132
        "copycrl")
Packit 40b132
            COPYCRL="${VALUE}"
Packit 40b132
            copy_crl "${COPYCRL}"
Packit 40b132
            ;;
Packit 40b132
        "verify")
Packit 40b132
            VERIFY="${VALUE}"
Packit 40b132
            TRUST=
Packit 40b132
            TRUST_AND_DB=
Packit 40b132
            POLICY=
Packit 40b132
            FETCH=
Packit 40b132
            EXP_RESULT=
Packit 40b132
            REV_OPTS=
Packit 40b132
            USAGE_OPT=
Packit 40b132
            ;;
Packit 40b132
        "cert")
Packit 40b132
            VERIFY="${VERIFY} ${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "testdb")
Packit 40b132
            if [ -n "${VALUE}" ]; then
Packit 40b132
                DB="${VALUE}DB"
Packit 40b132
            else
Packit 40b132
                DB=
Packit 40b132
            fi
Packit 40b132
            ;;
Packit 40b132
        "trust")
Packit 40b132
            TRUST="${TRUST} ${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "trust_and_db")
Packit 40b132
            TRUST_AND_DB=1
Packit 40b132
            ;;
Packit 40b132
        "fetch")
Packit 40b132
            FETCH=1
Packit 40b132
            ;;
Packit 40b132
        "result")
Packit 40b132
            EXP_RESULT="${VALUE}"
Packit 40b132
            parse_result
Packit 40b132
            ;;
Packit 40b132
        "rev_type")
Packit 40b132
            REV_OPTS="${REV_OPTS} -g ${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "rev_flags")
Packit 40b132
            REV_OPTS="${REV_OPTS} -h ${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "rev_mtype")
Packit 40b132
            REV_OPTS="${REV_OPTS} -m ${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "rev_mflags")
Packit 40b132
            REV_OPTS="${REV_OPTS} -s ${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "scenario")
Packit 40b132
            SCENARIO="${VALUE}: "
Packit 40b132
Packit 40b132
            CHAINS_DIR="${HOSTDIR}/chains/${VALUE}"
Packit 40b132
            mkdir -p ${CHAINS_DIR}
Packit 40b132
            cd ${CHAINS_DIR}
Packit 40b132
Packit 40b132
            if [ -n "${MEMLEAK_DBG}" ]; then
Packit 40b132
                LOGNAME="libpkix-${VALUE}"
Packit 40b132
                LOGFILE="${LOGDIR}/${LOGNAME}"
Packit 40b132
            fi
Packit 40b132
Packit 40b132
            SCEN_CNT=$(expr ${SCEN_CNT} + 1)
Packit 40b132
            ;;
Packit 40b132
        "sleep")
Packit 40b132
            sleep ${VALUE}
Packit 40b132
            ;;
Packit 40b132
        "break")
Packit 40b132
            break
Packit 40b132
            ;;
Packit 40b132
        "check_ocsp")
Packit 40b132
            TESTNAME="Test that OCSP server is reachable"
Packit 40b132
            check_ocsp ${VALUE}
Packit 40b132
            if [ $? -ne 0 ]; then
Packit 40b132
                html_failed "$TESTNAME"
Packit 40b132
                break;
Packit 40b132
            else
Packit 40b132
                html_passed "$TESTNAME"
Packit 40b132
            fi
Packit 40b132
            ;;
Packit 40b132
        "ku")
Packit 40b132
            EXT_KU="${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "ns")
Packit 40b132
            EXT_NS="${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "eku")
Packit 40b132
            EXT_EKU="${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "usage")
Packit 40b132
            USAGE_OPT="-u ${VALUE}"
Packit 40b132
            ;;
Packit 40b132
        "")
Packit 40b132
            if [ -n "${ENTITY}" ]; then
Packit 40b132
                if [ -z "${DB}" ]; then
Packit 40b132
                    create_entity "${ENTITY}" "${TYPE}"
Packit 40b132
                fi
Packit 40b132
                sign_cert "${ENTITY}" "${ISSUER}" "${TYPE}"
Packit 40b132
                if [ "${TYPE}" = "Bridge" ]; then
Packit 40b132
                    create_pkcs7 "${ENTITY}"
Packit 40b132
                fi
Packit 40b132
		if [ -n "${EXPORT_KEY}" ]; then
Packit 40b132
		    export_key "${ENTITY}" "${DB}"
Packit 40b132
		fi
Packit 40b132
                ENTITY=
Packit 40b132
            fi
Packit 40b132
Packit 40b132
            if [ -n "${VERIFY}" ]; then
Packit 40b132
                verify_cert "-pp"
Packit 40b132
		if [ -n "${VERIFY_CLASSIC_ENGINE_TOO}" ]; then
Packit 40b132
		    verify_cert ""
Packit 40b132
		    verify_cert "-p"
Packit 40b132
		fi
Packit 40b132
                VERIFY=
Packit 40b132
            fi
Packit 40b132
Packit 40b132
            if [ -n "${REVOKE}" ]; then
Packit 40b132
                revoke_cert "${REVOKE}" "${DB}"
Packit 40b132
                REVOKE=
Packit 40b132
            fi
Packit 40b132
            ;;
Packit 40b132
        *)
Packit 40b132
            if [ `echo ${KEY} | cut -b 1` != "#" ]; then
Packit 40b132
                echo "Configuration error: Unknown keyword ${KEY}"
Packit 40b132
                exit 1
Packit 40b132
            fi
Packit 40b132
            ;;
Packit 40b132
        esac
Packit 40b132
    done
Packit 40b132
Packit 40b132
    if [ -n "${MEMLEAK_DBG}" ]; then
Packit 40b132
        log_parse
Packit 40b132
        html_msg $? 0 "${SCENARIO}Memory leak checking" 
Packit 40b132
    fi
Packit 40b132
}
Packit 40b132
Packit 40b132
process_scenario()
Packit 40b132
{
Packit 40b132
    SCENARIO_FILE=$1
Packit 40b132
Packit 40b132
    > ${AIA_FILES}
Packit 40b132
Packit 40b132
    parse_config < "${QADIR}/chains/scenarios/${SCENARIO_FILE}"
Packit 40b132
Packit 40b132
    while read AIA_FILE
Packit 40b132
    do
Packit 40b132
	rm ${AIA_FILE} 2> /dev/null
Packit 40b132
    done < ${AIA_FILES}
Packit 40b132
    rm ${AIA_FILES}
Packit 40b132
}
Packit 40b132
Packit 40b132
# process ocspd.cfg separately
Packit 40b132
chains_ocspd()
Packit 40b132
{
Packit 40b132
    process_scenario "ocspd.cfg"
Packit 40b132
}
Packit 40b132
Packit 40b132
# process ocsp.cfg separately
Packit 40b132
chains_method()
Packit 40b132
{
Packit 40b132
    process_scenario "method.cfg"
Packit 40b132
}
Packit 40b132
Packit 40b132
############################# chains_main ##############################
Packit 40b132
# local shell function to process all testing scenarios
Packit 40b132
########################################################################
Packit 40b132
chains_main()
Packit 40b132
{
Packit 40b132
    while read LINE 
Packit 40b132
    do
Packit 40b132
        [ `echo ${LINE} | cut -b 1` != "#" ] || continue
Packit 40b132
Packit 40b132
	[ ${LINE} != 'ocspd.cfg' ] || continue
Packit 40b132
	[ ${LINE} != 'method.cfg' ] || continue
Packit 40b132
Packit 40b132
	process_scenario ${LINE}
Packit 40b132
    done < "${CHAINS_SCENARIOS}"
Packit 40b132
}
Packit 40b132
Packit 40b132
################################ main ##################################
Packit 40b132
Packit 40b132
chains_init
Packit 40b132
VERIFY_CLASSIC_ENGINE_TOO=
Packit 40b132
chains_ocspd
Packit 40b132
VERIFY_CLASSIC_ENGINE_TOO=1
Packit 40b132
chains_run_httpserv get
Packit 40b132
chains_method
Packit 40b132
chains_stop_httpserv
Packit 40b132
chains_run_httpserv post
Packit 40b132
chains_method
Packit 40b132
chains_stop_httpserv
Packit 40b132
VERIFY_CLASSIC_ENGINE_TOO=
Packit 40b132
chains_run_httpserv random
Packit 40b132
chains_main
Packit 40b132
chains_stop_httpserv
Packit 40b132
chains_run_httpserv get-unknown
Packit 40b132
chains_main
Packit 40b132
chains_stop_httpserv
Packit 40b132
chains_cleanup