tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

cert_iopr.sh (13461B)


      1 #! /bin/bash
      2 #
      3 # This Source Code Form is subject to the terms of the Mozilla Public
      4 # License, v. 2.0. If a copy of the MPL was not distributed with this
      5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
      6 
      7 ########################################################################
      8 #
      9 # mozilla/security/nss/tests/iopr/cert_iopr.sh
     10 #
     11 # Certificate generating and handeling for NSS interoperability QA. This file
     12 # is included from cert.sh
     13 #
     14 # needs to work on all Unix and Windows platforms
     15 #
     16 # special strings
     17 # ---------------
     18 #   FIXME ... known problems, search for this string
     19 #   NOTE .... unexpected behavior
     20 ########################################################################
     21 
     22 IOPR_CERT_SOURCED=1
     23 
     24 ########################################################################
     25 # function wraps calls to pk12util, also: writes action and options
     26 # to stdout. 
     27 # Params are the same as to pk12util.
     28 # Returns pk12util status
     29 #
     30 pk12u()
     31 {
     32    echo "${CU_ACTION} --------------------------"
     33 
     34    echo "pk12util $@"
     35    ${BINDIR}/pk12util $@
     36    RET=$?
     37 
     38    return $RET
     39 }
     40 
     41 ########################################################################
     42 # Initializes nss db directory and files if they don't exists
     43 # Params:
     44 #      $1 - directory location
     45 #
     46 createDBDir() {
     47    trgDir=$1
     48 
     49    if [ -z "`ls $trgDir | grep db`" ]; then
     50        trgDir=`cd ${trgDir}; pwd`
     51        if [ "${OS_ARCH}" = "WINNT" -a "$OS_NAME" = "CYGWIN_NT" ]; then
     52 		trgDir=`cygpath -m ${trgDir}`
     53        fi
     54 
     55        CU_ACTION="Initializing DB at ${trgDir}"
     56        certu -N -d "${trgDir}" -f "${R_PWFILE}" 2>&1
     57        if [ "$RET" -ne 0 ]; then
     58            return $RET
     59        fi
     60 
     61        CU_ACTION="Loading root cert module to Cert DB at ${trgDir}"
     62        modu -add "RootCerts" -libfile "${ROOTCERTSFILE}" -dbdir "${trgDir}" 2>&1
     63        if [ "$RET" -ne 0 ]; then
     64            return $RET
     65        fi
     66    fi
     67 }
     68 ########################################################################
     69 # takes care of downloading config, cert and crl files from remote
     70 # location. 
     71 # Params:
     72 #      $1 - name of the host file will be downloaded from
     73 #      $2 - path to the file as it appeared in url
     74 #      $3 - target directory the file will be saved at.
     75 # Returns tstclnt status.
     76 #
     77 download_file() {
     78    host=$1
     79    filePath=$2
     80    trgDir=$3
     81 
     82    file=$trgDir/`basename $filePath`
     83 
     84    createDBDir $trgDir || return $RET
     85 
     86 #    echo wget -O $file http://${host}${filePath}
     87 #    wget -O $file http://${host}${filePath}
     88 #    ret=$?
     89 
     90    req=$file.$$
     91    echo "GET $filePath HTTP/1.0" > $req
     92    echo >> $req
     93 
     94    echo ${BINDIR}/tstclnt -d $trgDir -S -h $host -p $IOPR_DOWNLOAD_PORT \
     95        -v -w ${R_PWFILE} -o 
     96    ${BINDIR}/tstclnt -d $trgDir -S -h $host -p $IOPR_DOWNLOAD_PORT \
     97        -v -w ${R_PWFILE} -o < $req > $file
     98    ret=$?
     99    rm -f $_tmp;
    100    return $ret
    101 }
    102 
    103 ########################################################################
    104 # Uses pk12util, certutil of cerlutil to import files to an nss db located
    105 # at <dir>(the value of $1 parameter). Chooses a utility to use based on
    106 # a file extension. Initializing a db if it does not exists.
    107 # Params:
    108 #      $1 - db location directory
    109 #      $2 - file name to import
    110 #      $3 - nick name an object in the file will be associated with
    111 #      $4 - trust arguments 
    112 # Returns status of import
    113 #      
    114 importFile() {
    115    dir=$1\
    116    file=$2
    117    certName=$3
    118    certTrust=$4
    119 
    120    [ ! -d $dir ] && mkdir -p $dir;
    121 
    122    createDBDir $dir || return $RET
    123            
    124    case `basename $file | sed 's/^.*\.//'` in
    125        p12)
    126            CU_ACTION="Importing p12 $file to DB at $dir"
    127            pk12u -d $dir -i $file -k ${R_PWFILE} -W iopr
    128            [ $? -ne 0 ] && return 1
    129            CU_ACTION="Modifying trust for cert $certName at $dir"
    130            certu -M -n "$certName" -t "$certTrust" -f "${R_PWFILE}" -d "${dir}"
    131            return $?
    132            ;;
    133        
    134        crl) 
    135            CU_ACTION="Importing crl $file to DB at $dir"
    136            crlu -d ${dir} -I -n TestCA -i $file
    137            return $?
    138            ;;
    139 
    140        crt | cert)
    141            CU_ACTION="Importing cert $certName with trust $certTrust to $dir"
    142            certu -A -n "$certName" -t "$certTrust" -f "${R_PWFILE}" -d "${dir}" \
    143                -i "$file"
    144            return $?
    145            ;;
    146 
    147        *)
    148            echo "Unknown file extension: $file:"
    149            return 1
    150            ;;
    151    esac
    152 }
    153 
    154 
    155 #########################################################################
    156 # Downloads and installs test certs and crl from a remote webserver.
    157 # Generates server cert for reverse testing if reverse test run is turned on.
    158 # Params:
    159 #      $1 - host name to download files from.
    160 #      $2 - directory at which CA cert will be installed and used for
    161 #           signing a server cert.
    162 #      $3 - path to a config file in webserver context.
    163 #      $4 - ssl server db location
    164 #      $5 - ssl client db location
    165 #      $5 - ocsp client db location
    166 #
    167 # Returns 0 upon success, otherwise, failed command error code.
    168 #
    169 download_install_certs() {
    170    host=$1
    171    caDir=$2
    172    confPath=$3
    173    sslServerDir=$4
    174    sslClientDir=$5
    175    ocspClientDir=$6
    176 
    177    [ ! -d "$caDir" ] && mkdir -p $caDir;
    178 
    179    #=======================================================
    180    # Getting config file
    181    #
    182    download_file $host "$confPath/iopr_server.cfg" $caDir
    183    RET=$?
    184    if [ $RET -ne 0 -o ! -f $caDir/iopr_server.cfg ]; then
    185        html_failed "Fail to download website config file(ws: $host)" 
    186        return 1
    187    fi
    188 
    189    . $caDir/iopr_server.cfg
    190    RET=$?
    191    if [ $RET -ne 0 ]; then
    192        html_failed "Fail to source config file(ws: $host)" 
    193        return $RET
    194    fi
    195 
    196    #=======================================================
    197    # Getting CA file
    198    #
    199 
    200    #----------------- !!!WARNING!!! -----------------------
    201    # Do NOT copy this scenario. CA should never accompany its
    202    # cert with the private key when deliver cert to a customer.
    203    #----------------- !!!WARNING!!! -----------------------
    204 
    205    download_file $host $certDir/$caCertName.p12 $caDir
    206    RET=$?
    207    if [ $RET -ne 0 -o ! -f $caDir/$caCertName.p12 ]; then
    208        html_failed "Fail to download $caCertName cert(ws: $host)" 
    209        return 1
    210    fi
    211    tmpFiles="$caDir/$caCertName.p12"
    212 
    213    importFile $caDir $caDir/$caCertName.p12 $caCertName "TC,C,C"
    214    RET=$?
    215    if [ $RET -ne 0 ]; then
    216        html_failed "Fail to import $caCertName cert to CA DB(ws: $host)" 
    217        return $RET
    218    fi
    219 
    220    CU_ACTION="Exporting Root CA cert(ws: $host)"
    221    certu -L -n $caCertName -r -d ${caDir} -o $caDir/$caCertName.cert 
    222    if [ "$RET" -ne 0 ]; then
    223        Exit 7 "Fatal - failed to export $caCertName cert"
    224    fi
    225 
    226    #=======================================================
    227    # Check what tests we want to run
    228    #
    229    doSslTests=0; doOcspTests=0
    230    # XXX remove "_new" from variables below
    231    [ -n "`echo ${supportedTests_new} | grep -i ssl`" ] && doSslTests=1
    232    [ -n "`echo ${supportedTests_new} | grep -i ocsp`" ] && doOcspTests=1
    233 
    234    if [ $doSslTests -eq 1 ]; then
    235        if [ "$reverseRunCGIScript" ]; then
    236            [ ! -d "$sslServerDir" ] && mkdir -p $sslServerDir;
    237            #=======================================================
    238            # Import CA cert to server DB
    239            #
    240            importFile $sslServerDir $caDir/$caCertName.cert server-client-CA \
    241                        "TC,C,C"
    242            RET=$?
    243            if [ $RET -ne 0 ]; then
    244                html_failed "Fail to import server-client-CA cert to \
    245                             server DB(ws: $host)" 
    246                return $RET
    247            fi
    248            
    249            #=======================================================
    250            # Creating server cert
    251            #
    252            CERTNAME=$HOSTADDR
    253            
    254            CU_ACTION="Generate Cert Request for $CERTNAME (ws: $host)"
    255            CU_SUBJECT="CN=$CERTNAME, E=${CERTNAME}@example.com, O=BOGUS NSS, \
    256                        L=Mountain View, ST=California, C=US"
    257            certu -R -d "${sslServerDir}" -f "${R_PWFILE}" -z "${R_NOISE_FILE}"\
    258                -o $sslServerDir/req 2>&1
    259            tmpFiles="$tmpFiles $sslServerDir/req"
    260 
    261            # NOTE:
    262            # For possible time synchronization problems (bug 444308) we generate
    263            # certificates valid also some time in past (-w -1)
    264 
    265            CU_ACTION="Sign ${CERTNAME}'s Request (ws: $host)"
    266            certu -C -c "$caCertName" -m `date +"%s"` -v 60 -w -1 \
    267                -d "${caDir}" \
    268                -i ${sslServerDir}/req -o $caDir/${CERTNAME}.cert \
    269                -f "${R_PWFILE}" 2>&1
    270            
    271            importFile $sslServerDir $caDir/$CERTNAME.cert $CERTNAME ",,"
    272            RET=$?
    273            if [ $RET -ne 0 ]; then
    274                html_failed "Fail to import $CERTNAME cert to server\
    275                             DB(ws: $host)" 
    276                return $RET
    277            fi
    278            tmpFiles="$tmpFiles $caDir/$CERTNAME.cert"
    279            
    280            #=======================================================
    281            # Download and import CA crl to server DB
    282            #
    283            download_file $host "$certDir/$caCrlName.crl" $sslServerDir
    284            RET=$?
    285            if [ $? -ne 0 ]; then
    286                html_failed "Fail to download $caCertName crl\
    287                             (ws: $host)" 
    288                return $RET
    289            fi
    290            tmpFiles="$tmpFiles $sslServerDir/$caCrlName.crl"
    291            
    292            importFile $sslServerDir $sslServerDir/TestCA.crl
    293            RET=$?
    294            if [ $RET -ne 0 ]; then
    295                html_failed "Fail to import TestCA crt to server\
    296                             DB(ws: $host)" 
    297                return $RET
    298            fi
    299        fi # if [ "$reverseRunCGIScript" ]
    300        
    301        [ ! -d "$sslClientDir" ] && mkdir -p $sslClientDir;
    302        #=======================================================
    303        # Import CA cert to ssl client DB
    304        #
    305        importFile $sslClientDir $caDir/$caCertName.cert server-client-CA \
    306                   "TC,C,C"
    307        RET=$?
    308        if [ $RET -ne 0 ]; then
    309            html_failed "Fail to import server-client-CA cert to \
    310                         server DB(ws: $host)" 
    311            return $RET
    312        fi
    313    fi
    314 
    315    if [ $doOcspTests -eq 1 ]; then
    316        [ ! -d "$ocspClientDir" ] && mkdir -p $ocspClientDir;
    317        #=======================================================
    318        # Import CA cert to ocsp client DB
    319        #
    320        importFile $ocspClientDir $caDir/$caCertName.cert server-client-CA \
    321                   "TC,C,C"
    322        RET=$?
    323        if [ $RET -ne 0 ]; then
    324            html_failed "Fail to import server-client-CA cert to \
    325                         server DB(ws: $host)" 
    326            return $RET
    327        fi
    328    fi
    329 
    330    #=======================================================
    331    # Import client certs to client DB
    332    #
    333    for fileName in $downloadFiles; do
    334        certName=`echo $fileName | sed 's/\..*//'`
    335 
    336        if [ -n "`echo $certName | grep ocsp`" -a $doOcspTests -eq 1 ]; then
    337            clientDir=$ocspClientDir
    338        elif [ $doSslTests -eq 1 ]; then
    339            clientDir=$sslClientDir
    340        else
    341            continue
    342        fi
    343 
    344        download_file $host "$certDir/$fileName" $clientDir
    345        RET=$?
    346        if [ $RET -ne 0 -o ! -f $clientDir/$fileName ]; then
    347            html_failed "Fail to download $certName cert(ws: $host)" 
    348            return $RET
    349        fi
    350        tmpFiles="$tmpFiles $clientDir/$fileName"
    351        
    352        importFile $clientDir $clientDir/$fileName $certName ",,"
    353        RET=$?
    354        if [ $RET -ne 0 ]; then
    355            html_failed "Fail to import $certName cert to client DB\
    356                        (ws: $host)" 
    357            return $RET
    358        fi
    359    done
    360 
    361    rm -f $tmpFiles
    362 
    363    return 0
    364 }
    365 
    366 
    367 #########################################################################
    368 # Initial point for downloading config, cert, crl files for multiple hosts
    369 # involved in interoperability testing. Called from nss/tests/cert/cert.sh
    370 # It will only proceed with downloading if environment variable 
    371 # IOPR_HOSTADDR_LIST is set and has a value of host names separated by space.
    372 #
    373 # Returns 1 if interoperability testing is off, 0 otherwise. 
    374 #
    375 cert_iopr_setup() {
    376 
    377    if [ "$IOPR" -ne 1 ]; then
    378        return 1
    379    fi
    380    num=1
    381    IOPR_HOST_PARAM=`echo "${IOPR_HOSTADDR_LIST} " | cut -f 1 -d' '`
    382    while [ "$IOPR_HOST_PARAM" ]; do
    383        IOPR_HOSTADDR=`echo $IOPR_HOST_PARAM | cut -f 1 -d':'`
    384        IOPR_DOWNLOAD_PORT=`echo "$IOPR_HOST_PARAM:" | cut -f 2 -d':'`
    385        [ -z "$IOPR_DOWNLOAD_PORT" ] && IOPR_DOWNLOAD_PORT=443
    386        IOPR_CONF_PATH=`echo "$IOPR_HOST_PARAM:" | cut -f 3 -d':'`
    387        [ -z "$IOPR_CONF_PATH" ] && IOPR_CONF_PATH="/iopr"
    388        
    389        echo "Installing certs for $IOPR_HOSTADDR:$IOPR_DOWNLOAD_PORT:\
    390              $IOPR_CONF_PATH"
    391        
    392        download_install_certs ${IOPR_HOSTADDR} ${IOPR_CADIR}_${IOPR_HOSTADDR} \
    393            ${IOPR_CONF_PATH} ${IOPR_SSL_SERVERDIR}_${IOPR_HOSTADDR} \
    394            ${IOPR_SSL_CLIENTDIR}_${IOPR_HOSTADDR} \
    395            ${IOPR_OCSP_CLIENTDIR}_${IOPR_HOSTADDR}
    396        if [ $? -ne 0 ]; then
    397            echo "wsFlags=\"NOIOPR $wsParam\"" >> \
    398                ${IOPR_CADIR}_${IOPR_HOSTADDR}/iopr_server.cfg
    399        fi
    400        num=`expr $num + 1`
    401        IOPR_HOST_PARAM=`echo "${IOPR_HOSTADDR_LIST} " | cut -f $num -d' '`
    402    done
    403    
    404    return 0
    405 }