Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
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/.
7 ########################################################################
8 #
9 # mozilla/security/nss/tests/ssl/ssl.sh
10 #
11 # Script to test NSS SSL
12 #
13 # needs to work on all Unix and Windows platforms
14 #
15 # special strings
16 # ---------------
17 # FIXME ... known problems, search for this string
18 # NOTE .... unexpected behavior
19 #
20 ########################################################################
22 ############################## ssl_init ################################
23 # local shell function to initialize this script
24 ########################################################################
25 ssl_init()
26 {
27 SCRIPTNAME=ssl.sh # sourced - $0 would point to all.sh
29 if [ -z "${CLEANUP}" ] ; then # if nobody else is responsible for
30 CLEANUP="${SCRIPTNAME}" # cleaning this script will do it
31 fi
33 if [ -z "${INIT_SOURCED}" -o "${INIT_SOURCED}" != "TRUE" ]; then
34 cd ../common
35 . ./init.sh
36 fi
37 if [ -z "${IOPR_SSL_SOURCED}" ]; then
38 . ../iopr/ssl_iopr.sh
39 fi
40 if [ ! -r $CERT_LOG_FILE ]; then # we need certificates here
41 cd ../cert
42 . ./cert.sh
43 fi
44 SCRIPTNAME=ssl.sh
45 echo "$SCRIPTNAME: SSL tests ==============================="
47 grep "SUCCESS: SSL passed" $CERT_LOG_FILE >/dev/null || {
48 html_head "SSL Test failure"
49 Exit 8 "Fatal - cert.sh needs to pass first"
50 }
52 if [ -z "$NSS_TEST_DISABLE_CRL" ] ; then
53 grep "SUCCESS: SSL CRL prep passed" $CERT_LOG_FILE >/dev/null || {
54 html_head "SSL Test failure"
55 Exit 8 "Fatal - SSL of cert.sh needs to pass first"
56 }
57 fi
59 PORT=${PORT-8443}
60 NSS_SSL_TESTS=${NSS_SSL_TESTS:-normal_normal}
61 nss_ssl_run="stapling cov auth stress"
62 NSS_SSL_RUN=${NSS_SSL_RUN:-$nss_ssl_run}
64 # Test case files
65 SSLCOV=${QADIR}/ssl/sslcov.txt
66 SSLAUTH=${QADIR}/ssl/sslauth.txt
67 SSLSTRESS=${QADIR}/ssl/sslstress.txt
68 REQUEST_FILE=${QADIR}/ssl/sslreq.dat
70 #temparary files
71 SERVEROUTFILE=${TMP}/tests_server.$$
72 SERVERPID=${TMP}/tests_pid.$$
74 R_SERVERPID=../tests_pid.$$
76 TEMPFILES="$TMPFILES ${SERVEROUTFILE} ${SERVERPID}"
78 fileout=0 #FIXME, looks like all.sh tried to turn this on but actually didn't
79 #fileout=1
80 #verbose="-v" #FIXME - see where this is usefull
82 USER_NICKNAME=TestUser
83 NORM_EXT=""
85 if [ -z "$NSS_DISABLE_ECC" ] ; then
86 ECC_STRING=" - with ECC"
87 else
88 ECC_STRING=""
89 fi
91 CSHORT="-c ABCDEF:003B:003C:003D:0041:0084:009Ccdefgijklmnvyz"
92 CLONG="-c ABCDEF:C001:C002:C003:C004:C005:C006:C007:C008:C009:C00A:C00B:C00C:C00D:C00E:C00F:C010:C011:C012:C013:C014:C023:C027:C02B:C02F:003B:003C:003D:0041:0084:009Ccdefgijklmnvyz"
94 if [ "${OS_ARCH}" != "WINNT" ]; then
95 ulimit -n 1000 # make sure we have enough file descriptors
96 fi
98 cd ${CLIENTDIR}
99 }
101 ########################### is_selfserv_alive ##########################
102 # local shell function to exit with a fatal error if selfserver is not
103 # running
104 ########################################################################
105 is_selfserv_alive()
106 {
107 if [ ! -f "${SERVERPID}" ]; then
108 echo "$SCRIPTNAME: Error - selfserv PID file ${SERVERPID} doesn't exist"
109 sleep 5
110 if [ ! -f "${SERVERPID}" ]; then
111 Exit 9 "Fatal - selfserv pid file ${SERVERPID} does not exist"
112 fi
113 fi
115 if [ "${OS_ARCH}" = "WINNT" ] && \
116 [ "$OS_NAME" = "CYGWIN_NT" -o "$OS_NAME" = "MINGW32_NT" ]; then
117 PID=${SHELL_SERVERPID}
118 else
119 PID=`cat ${SERVERPID}`
120 fi
122 echo "kill -0 ${PID} >/dev/null 2>/dev/null"
123 kill -0 ${PID} >/dev/null 2>/dev/null || Exit 10 "Fatal - selfserv process not detectable"
125 echo "selfserv with PID ${PID} found at `date`"
126 }
128 ########################### wait_for_selfserv ##########################
129 # local shell function to wait until selfserver is running and initialized
130 ########################################################################
131 wait_for_selfserv()
132 {
133 echo "trying to connect to selfserv at `date`"
134 echo "tstclnt -p ${PORT} -h ${HOSTADDR} ${CLIENT_OPTIONS} -q \\"
135 echo " -d ${P_R_CLIENTDIR} -v < ${REQUEST_FILE}"
136 ${BINDIR}/tstclnt -p ${PORT} -h ${HOSTADDR} ${CLIENT_OPTIONS} -q \
137 -d ${P_R_CLIENTDIR} -v < ${REQUEST_FILE}
138 if [ $? -ne 0 ]; then
139 sleep 5
140 echo "retrying to connect to selfserv at `date`"
141 echo "tstclnt -p ${PORT} -h ${HOSTADDR} ${CLIENT_OPTIONS} -q \\"
142 echo " -d ${P_R_CLIENTDIR} -v < ${REQUEST_FILE}"
143 ${BINDIR}/tstclnt -p ${PORT} -h ${HOSTADDR} ${CLIENT_OPTIONS} -q \
144 -d ${P_R_CLIENTDIR} -v < ${REQUEST_FILE}
145 if [ $? -ne 0 ]; then
146 html_failed "Waiting for Server"
147 fi
148 fi
149 is_selfserv_alive
150 }
152 ########################### kill_selfserv ##############################
153 # local shell function to kill the selfserver after the tests are done
154 ########################################################################
155 kill_selfserv()
156 {
157 if [ "${OS_ARCH}" = "WINNT" ] && \
158 [ "$OS_NAME" = "CYGWIN_NT" -o "$OS_NAME" = "MINGW32_NT" ]; then
159 PID=${SHELL_SERVERPID}
160 else
161 PID=`cat ${SERVERPID}`
162 fi
164 echo "trying to kill selfserv with PID ${PID} at `date`"
166 if [ "${OS_ARCH}" = "WINNT" -o "${OS_ARCH}" = "WIN95" -o "${OS_ARCH}" = "OS2" ]; then
167 echo "${KILL} ${PID}"
168 ${KILL} ${PID}
169 else
170 echo "${KILL} -USR1 ${PID}"
171 ${KILL} -USR1 ${PID}
172 fi
173 wait ${PID}
174 if [ ${fileout} -eq 1 ]; then
175 cat ${SERVEROUTFILE}
176 fi
178 # On Linux selfserv needs up to 30 seconds to fully die and free
179 # the port. Wait until the port is free. (Bug 129701)
180 if [ "${OS_ARCH}" = "Linux" ]; then
181 echo "selfserv -b -p ${PORT} 2>/dev/null;"
182 until ${BINDIR}/selfserv -b -p ${PORT} 2>/dev/null; do
183 echo "RETRY: selfserv -b -p ${PORT} 2>/dev/null;"
184 sleep 1
185 done
186 fi
188 echo "selfserv with PID ${PID} killed at `date`"
190 rm ${SERVERPID}
191 html_detect_core "kill_selfserv core detection step"
192 }
194 ########################### start_selfserv #############################
195 # local shell function to start the selfserver with the parameters required
196 # for this test and log information (parameters, start time)
197 # also: wait until the server is up and running
198 ########################################################################
199 start_selfserv()
200 {
201 if [ -n "$testname" ] ; then
202 echo "$SCRIPTNAME: $testname ----"
203 fi
204 sparam=`echo $sparam | sed -e 's;_; ;g'`
205 if [ -z "$NSS_DISABLE_ECC" ] && \
206 [ -z "$NO_ECC_CERTS" -o "$NO_ECC_CERTS" != "1" ] ; then
207 ECC_OPTIONS="-e ${HOSTADDR}-ec"
208 else
209 ECC_OPTIONS=""
210 fi
211 if [ "$1" = "mixed" ]; then
212 ECC_OPTIONS="-e ${HOSTADDR}-ecmixed"
213 fi
214 echo "selfserv starting at `date`"
215 echo "selfserv -D -p ${PORT} -d ${P_R_SERVERDIR} -n ${HOSTADDR} ${SERVER_OPTIONS} \\"
216 echo " ${ECC_OPTIONS} -w nss ${sparam} -i ${R_SERVERPID} $verbose &"
217 if [ ${fileout} -eq 1 ]; then
218 ${PROFTOOL} ${BINDIR}/selfserv -D -p ${PORT} -d ${P_R_SERVERDIR} -n ${HOSTADDR} ${SERVER_OPTIONS} \
219 ${ECC_OPTIONS} -w nss ${sparam} -i ${R_SERVERPID} $verbose \
220 > ${SERVEROUTFILE} 2>&1 &
221 RET=$?
222 else
223 ${PROFTOOL} ${BINDIR}/selfserv -D -p ${PORT} -d ${P_R_SERVERDIR} -n ${HOSTADDR} ${SERVER_OPTIONS} \
224 ${ECC_OPTIONS} -w nss ${sparam} -i ${R_SERVERPID} $verbose &
225 RET=$?
226 fi
228 # The PID $! returned by the MKS or Cygwin shell is not the PID of
229 # the real background process, but rather the PID of a helper
230 # process (sh.exe). MKS's kill command has a bug: invoking kill
231 # on the helper process does not terminate the real background
232 # process. Our workaround has been to have selfserv save its PID
233 # in the ${SERVERPID} file and "kill" that PID instead. But this
234 # doesn't work under Cygwin; its kill command doesn't recognize
235 # the PID of the real background process, but it does work on the
236 # PID of the helper process. So we save the value of $! in the
237 # SHELL_SERVERPID variable, and use it instead of the ${SERVERPID}
238 # file under Cygwin. (In fact, this should work in any shell
239 # other than the MKS shell.)
240 SHELL_SERVERPID=$!
241 wait_for_selfserv
243 if [ "${OS_ARCH}" = "WINNT" ] && \
244 [ "$OS_NAME" = "CYGWIN_NT" -o "$OS_NAME" = "MINGW32_NT" ]; then
245 PID=${SHELL_SERVERPID}
246 else
247 PID=`cat ${SERVERPID}`
248 fi
250 echo "selfserv with PID ${PID} started at `date`"
251 }
253 ############################## ssl_cov #################################
254 # local shell function to perform SSL Cipher Coverage tests
255 ########################################################################
256 ssl_cov()
257 {
258 html_head "SSL Cipher Coverage $NORM_EXT - server $SERVER_MODE/client $CLIENT_MODE $ECC_STRING"
260 testname=""
261 if [ -z "$NSS_DISABLE_ECC" ] ; then
262 sparam="$CLONG"
263 else
264 sparam="$CSHORT"
265 fi
267 mixed=0
268 start_selfserv # Launch the server
270 VMIN="ssl2"
271 VMAX="tls1.1"
273 exec < ${SSLCOV}
274 while read ectype testmax param testname
275 do
276 echo "${testname}" | grep "EXPORT" > /dev/null
277 EXP=$?
278 echo "${testname}" | grep "SSL2" > /dev/null
279 SSL2=$?
281 if [ "${SSL2}" -eq 0 ] ; then
282 # We cannot use asynchronous cert verification with SSL2
283 SSL2_FLAGS=-O
284 VMIN="ssl2"
285 else
286 # Do not enable SSL2 for non-SSL2-specific tests. SSL2 is disabled by
287 # default in libssl but it is enabled by default in tstclnt; we want
288 # to test the libssl default whenever possible.
289 SSL2_FLAGS=
290 VMIN="ssl3"
291 fi
293 if [ "$NORM_EXT" = "Extended Test" -a "${SSL2}" -eq 0 ] ; then
294 echo "$SCRIPTNAME: skipping $testname for $NORM_EXT"
295 elif [ "$ectype" = "ECC" -a -n "$NSS_DISABLE_ECC" ] ; then
296 echo "$SCRIPTNAME: skipping $testname (ECC only)"
297 elif [ "$SERVER_MODE" = "fips" -o "$CLIENT_MODE" = "fips" ] && [ "$SSL2" -eq 0 -o "$EXP" -eq 0 ] ; then
298 echo "$SCRIPTNAME: skipping $testname (non-FIPS only)"
299 elif [ "`echo $ectype | cut -b 1`" != "#" ] ; then
300 echo "$SCRIPTNAME: running $testname ----------------------------"
301 VMAX="ssl3"
302 if [ "$testmax" = "TLS10" ]; then
303 VMAX="tls1.0"
304 fi
305 if [ "$testmax" = "TLS11" ]; then
306 VMAX="tls1.1"
307 fi
308 if [ "$testmax" = "TLS12" ]; then
309 VMAX="tls1.2"
310 fi
312 # These five tests need an EC cert signed with RSA
313 # This requires a different certificate loaded in selfserv
314 # due to a (current) NSS limitation of only loaded one cert
315 # per type so the default selfserv setup will not work.
316 #:C00B TLS ECDH RSA WITH NULL SHA
317 #:C00C TLS ECDH RSA WITH RC4 128 SHA
318 #:C00D TLS ECDH RSA WITH 3DES EDE CBC SHA
319 #:C00E TLS ECDH RSA WITH AES 128 CBC SHA
320 #:C00F TLS ECDH RSA WITH AES 256 CBC SHA
322 if [ $mixed -eq 0 ]; then
323 if [ "${param}" = ":C00B" -o "${param}" = ":C00C" -o "${param}" = ":C00D" -o "${param}" = ":C00E" -o "${param}" = ":C00F" ]; then
324 kill_selfserv
325 start_selfserv mixed
326 mixed=1
327 else
328 is_selfserv_alive
329 fi
330 else
331 if [ "${param}" = ":C00B" -o "${param}" = ":C00C" -o "${param}" = ":C00D" -o "${param}" = ":C00E" -o "${param}" = ":C00F" ]; then
332 is_selfserv_alive
333 else
334 kill_selfserv
335 start_selfserv
336 mixed=0
337 fi
338 fi
340 echo "tstclnt -p ${PORT} -h ${HOSTADDR} -c ${param} -V ${VMIN}:${VMAX} ${SSL2_FLAGS} ${CLIENT_OPTIONS} \\"
341 echo " -f -d ${P_R_CLIENTDIR} -v -w nss < ${REQUEST_FILE}"
343 rm ${TMP}/$HOST.tmp.$$ 2>/dev/null
344 ${PROFTOOL} ${BINDIR}/tstclnt -p ${PORT} -h ${HOSTADDR} -c ${param} -V ${VMIN}:${VMAX} ${SSL2_FLAGS} ${CLIENT_OPTIONS} -f \
345 -d ${P_R_CLIENTDIR} -v -w nss < ${REQUEST_FILE} \
346 >${TMP}/$HOST.tmp.$$ 2>&1
347 ret=$?
348 cat ${TMP}/$HOST.tmp.$$
349 rm ${TMP}/$HOST.tmp.$$ 2>/dev/null
350 html_msg $ret 0 "${testname}" \
351 "produced a returncode of $ret, expected is 0"
352 fi
353 done
355 kill_selfserv
356 html "</TABLE><BR>"
357 }
359 ############################## ssl_auth ################################
360 # local shell function to perform SSL Client Authentication tests
361 ########################################################################
362 ssl_auth()
363 {
364 html_head "SSL Client Authentication $NORM_EXT - server $SERVER_MODE/client $CLIENT_MODE $ECC_STRING"
366 exec < ${SSLAUTH}
367 while read ectype value sparam cparam testname
368 do
369 [ -z "$ectype" ] && continue
370 echo "${testname}" | grep "don't require client auth" > /dev/null
371 CAUTH=$?
373 if [ "${CLIENT_MODE}" = "fips" -a "${CAUTH}" -eq 0 ] ; then
374 echo "$SCRIPTNAME: skipping $testname (non-FIPS only)"
375 elif [ "$ectype" = "SNI" -a "$NORM_EXT" = "Extended Test" ] ; then
376 echo "$SCRIPTNAME: skipping $testname for $NORM_EXT"
377 elif [ "$ectype" = "ECC" -a -n "$NSS_DISABLE_ECC" ] ; then
378 echo "$SCRIPTNAME: skipping $testname (ECC only)"
379 elif [ "`echo $ectype | cut -b 1`" != "#" ]; then
380 cparam=`echo $cparam | sed -e 's;_; ;g' -e "s/TestUser/$USER_NICKNAME/g" `
381 if [ "$ectype" = "SNI" ]; then
382 cparam=`echo $cparam | sed -e "s/Host/$HOST/g" -e "s/Dom/$DOMSUF/g" `
383 sparam=`echo $sparam | sed -e "s/Host/$HOST/g" -e "s/Dom/$DOMSUF/g" `
384 fi
385 start_selfserv
387 echo "tstclnt -p ${PORT} -h ${HOSTADDR} -f -d ${P_R_CLIENTDIR} -v ${CLIENT_OPTIONS} \\"
388 echo " ${cparam} < ${REQUEST_FILE}"
389 rm ${TMP}/$HOST.tmp.$$ 2>/dev/null
390 ${PROFTOOL} ${BINDIR}/tstclnt -p ${PORT} -h ${HOSTADDR} -f ${cparam} ${CLIENT_OPTIONS} \
391 -d ${P_R_CLIENTDIR} -v < ${REQUEST_FILE} \
392 >${TMP}/$HOST.tmp.$$ 2>&1
393 ret=$?
394 cat ${TMP}/$HOST.tmp.$$
395 rm ${TMP}/$HOST.tmp.$$ 2>/dev/null
397 #workaround for bug #402058
398 [ $ret -ne 0 ] && ret=1
399 [ $value -ne 0 ] && value=1
401 html_msg $ret $value "${testname}" \
402 "produced a returncode of $ret, expected is $value"
403 kill_selfserv
404 fi
405 done
407 html "</TABLE><BR>"
408 }
410 ssl_stapling_sub()
411 {
412 testname=$1
413 SO=$2
414 value=$3
416 if [ "$NORM_EXT" = "Extended Test" ] ; then
417 # these tests use the ext_client directory for tstclnt,
418 # which doesn't contain the required "TestCA" for server cert
419 # verification, I don't know if it would be OK to add it...
420 echo "$SCRIPTNAME: skipping $testname for $NORM_EXT"
421 return 0
422 fi
423 if [ "$SERVER_MODE" = "fips" -o "$CLIENT_MODE" = "fips" ] ; then
424 echo "$SCRIPTNAME: skipping $testname (non-FIPS only)"
425 return 0
426 fi
428 SAVE_SERVER_OPTIONS=${SERVER_OPTIONS}
429 SERVER_OPTIONS="${SERVER_OPTIONS} ${SO}"
431 SAVE_P_R_SERVERDIR=${P_R_SERVERDIR}
432 P_R_SERVERDIR=${P_R_SERVERDIR}/../stapling/
434 echo "${testname}"
436 start_selfserv
438 echo "tstclnt -p ${PORT} -h ${HOSTADDR} -f -d ${P_R_CLIENTDIR} -v ${CLIENT_OPTIONS} \\"
439 echo " -T -O -F -M 1 -V ssl3: < ${REQUEST_FILE}"
440 rm ${TMP}/$HOST.tmp.$$ 2>/dev/null
441 ${PROFTOOL} ${BINDIR}/tstclnt -p ${PORT} -h ${HOSTADDR} -f ${CLIENT_OPTIONS} \
442 -d ${P_R_CLIENTDIR} -v -T -O -F -M 1 -V ssl3: < ${REQUEST_FILE} \
443 >${TMP}/$HOST.tmp.$$ 2>&1
444 ret=$?
445 cat ${TMP}/$HOST.tmp.$$
446 rm ${TMP}/$HOST.tmp.$$ 2>/dev/null
448 # hopefully no workaround for bug #402058 needed here?
449 # (see commands in ssl_auth
451 html_msg $ret $value "${testname}" \
452 "produced a returncode of $ret, expected is $value"
453 kill_selfserv
455 SERVER_OPTIONS=${SAVE_SERVER_OPTIONS}
456 P_R_SERVERDIR=${SAVE_P_R_SERVERDIR}
457 }
459 ssl_stapling_stress()
460 {
461 testname="Stress OCSP stapling, server uses random status"
462 SO="-A TestCA -T random"
463 value=0
465 if [ "$NORM_EXT" = "Extended Test" ] ; then
466 # these tests use the ext_client directory for tstclnt,
467 # which doesn't contain the required "TestCA" for server cert
468 # verification, I don't know if it would be OK to add it...
469 echo "$SCRIPTNAME: skipping $testname for $NORM_EXT"
470 return 0
471 fi
472 if [ "$SERVER_MODE" = "fips" -o "$CLIENT_MODE" = "fips" ] ; then
473 echo "$SCRIPTNAME: skipping $testname (non-FIPS only)"
474 return 0
475 fi
477 SAVE_SERVER_OPTIONS=${SERVER_OPTIONS}
478 SERVER_OPTIONS="${SERVER_OPTIONS} ${SO}"
480 SAVE_P_R_SERVERDIR=${P_R_SERVERDIR}
481 P_R_SERVERDIR=${P_R_SERVERDIR}/../stapling/
483 echo "${testname}"
484 start_selfserv
486 echo "strsclnt -q -p ${PORT} -d ${P_R_CLIENTDIR} ${CLIENT_OPTIONS} -w nss \\"
487 echo " -c 1000 -V ssl3: -N -T $verbose ${HOSTADDR}"
488 echo "strsclnt started at `date`"
489 ${PROFTOOL} ${BINDIR}/strsclnt -q -p ${PORT} -d ${P_R_CLIENTDIR} ${CLIENT_OPTIONS} -w nss \
490 -c 1000 -V ssl3: -N -T $verbose ${HOSTADDR}
491 ret=$?
493 echo "strsclnt completed at `date`"
494 html_msg $ret $value \
495 "${testname}" \
496 "produced a returncode of $ret, expected is $value."
497 kill_selfserv
499 SERVER_OPTIONS=${SAVE_SERVER_OPTIONS}
500 P_R_SERVERDIR=${SAVE_P_R_SERVERDIR}
501 }
503 ############################ ssl_stapling ##############################
504 # local shell function to perform SSL Cert Status (OCSP Stapling) tests
505 ########################################################################
506 ssl_stapling()
507 {
508 html_head "SSL Cert Status (OCSP Stapling) $NORM_EXT - server $SERVER_MODE/client $CLIENT_MODE $ECC_STRING"
510 # tstclnt Exit code:
511 # 0: have fresh and valid revocation data, status good
512 # 1: cert failed to verify, prior to revocation checking
513 # 2: missing, old or invalid revocation data
514 # 3: have fresh and valid revocation data, status revoked
516 # selfserv modes
517 # good, revoked, unkown: Include locally signed response. Requires: -A
518 # failure: Include OCSP failure status, such as "try later" (unsigned)
519 # badsig: use a good status but with an invalid signature
520 # corrupted: stapled cert status is an invalid block of data
522 ssl_stapling_sub "OCSP stapling, signed response, good status" "-A TestCA -T good" 0
523 ssl_stapling_sub "OCSP stapling, signed response, revoked status" "-A TestCA -T revoked" 3
524 ssl_stapling_sub "OCSP stapling, signed response, unknown status" "-A TestCA -T unknown" 2
525 ssl_stapling_sub "OCSP stapling, unsigned failure response" "-A TestCA -T failure" 2
526 ssl_stapling_sub "OCSP stapling, good status, bad signature" "-A TestCA -T badsig" 2
527 ssl_stapling_sub "OCSP stapling, invalid cert status data" "-A TestCA -T corrupted" 2
528 ssl_stapling_sub "Valid cert, Server doesn't staple" "" 2
530 ssl_stapling_stress
532 html "</TABLE><BR>"
533 }
536 ############################## ssl_stress ##############################
537 # local shell function to perform SSL stress test
538 ########################################################################
539 ssl_stress()
540 {
541 html_head "SSL Stress Test $NORM_EXT - server $SERVER_MODE/client $CLIENT_MODE $ECC_STRING"
543 exec < ${SSLSTRESS}
544 while read ectype value sparam cparam testname
545 do
546 if [ -z "$ectype" ]; then
547 # silently ignore blank lines
548 continue
549 fi
551 echo "${testname}" | grep "SSL2" > /dev/null
552 SSL2=$?
553 echo "${testname}" | grep "client auth" > /dev/null
554 CAUTH=$?
556 if [ "${SSL2}" -eq 0 -a "$NORM_EXT" = "Extended Test" ] ; then
557 echo "$SCRIPTNAME: skipping $testname for $NORM_EXT"
558 elif [ "$ectype" = "SNI" -a "$NORM_EXT" = "Extended Test" ] ; then
559 echo "$SCRIPTNAME: skipping $testname for $NORM_EXT"
560 elif [ "$ectype" = "ECC" -a -n "$NSS_DISABLE_ECC" ] ; then
561 echo "$SCRIPTNAME: skipping $testname (ECC only)"
562 elif [ "${SERVER_MODE}" = "fips" -o "${CLIENT_MODE}" = "fips" ] && [ "${SSL2}" -eq 0 ] ; then
563 echo "$SCRIPTNAME: skipping $testname (non-FIPS only)"
564 elif [ "${CLIENT_MODE}" = "fips" -a "${CAUTH}" -ne 0 ] ; then
565 echo "$SCRIPTNAME: skipping $testname (non-FIPS only)"
566 elif [ "`echo $ectype | cut -b 1`" != "#" ]; then
567 cparam=`echo $cparam | sed -e 's;_; ;g' -e "s/TestUser/$USER_NICKNAME/g" `
568 if [ "$ectype" = "SNI" ]; then
569 cparam=`echo $cparam | sed -e "s/Host/$HOST/g" -e "s/Dom/$DOMSUF/g" `
570 sparam=`echo $sparam | sed -e "s/Host/$HOST/g" -e "s/Dom/$DOMSUF/g" `
571 fi
573 # These tests need the mixed cert
574 # Stress TLS ECDH-RSA AES 128 CBC with SHA (no reuse)
575 # Stress TLS ECDH-RSA AES 128 CBC with SHA (no reuse, client auth)
576 p=`echo "$sparam" | sed -e "s/\(.*\)\(-c_:C0..\)\(.*\)/\2/"`;
577 if [ "$p" = "-c_:C00E" ]; then
578 start_selfserv mixed
579 else
580 start_selfserv
581 fi
583 if [ "`uname -n`" = "sjsu" ] ; then
584 echo "debugging disapering selfserv... ps -ef | grep selfserv"
585 ps -ef | grep selfserv
586 fi
588 echo "strsclnt -q -p ${PORT} -d ${P_R_CLIENTDIR} ${CLIENT_OPTIONS} -w nss $cparam \\"
589 echo " $verbose ${HOSTADDR}"
590 echo "strsclnt started at `date`"
591 ${PROFTOOL} ${BINDIR}/strsclnt -q -p ${PORT} -d ${P_R_CLIENTDIR} ${CLIENT_OPTIONS} -w nss $cparam \
592 $verbose ${HOSTADDR}
593 ret=$?
594 echo "strsclnt completed at `date`"
595 html_msg $ret $value \
596 "${testname}" \
597 "produced a returncode of $ret, expected is $value. "
598 if [ "`uname -n`" = "sjsu" ] ; then
599 echo "debugging disapering selfserv... ps -ef | grep selfserv"
600 ps -ef | grep selfserv
601 fi
602 kill_selfserv
603 fi
604 done
606 html "</TABLE><BR>"
607 }
609 ############################ ssl_crl_ssl ###############################
610 # local shell function to perform SSL test with/out revoked certs tests
611 ########################################################################
612 ssl_crl_ssl()
613 {
614 html_head "CRL SSL Client Tests $NORM_EXT $ECC_STRING"
616 # Using First CRL Group for this test. There are $CRL_GRP_1_RANGE certs in it.
617 # Cert number $UNREVOKED_CERT_GRP_1 was not revoked
618 CRL_GROUP_BEGIN=$CRL_GRP_1_BEGIN
619 CRL_GROUP_RANGE=$CRL_GRP_1_RANGE
620 UNREVOKED_CERT=$UNREVOKED_CERT_GRP_1
622 exec < ${SSLAUTH}
623 while read ectype value sparam cparam testname
624 do
625 [ "$ectype" = "" ] && continue
626 if [ "$ectype" = "ECC" -a -n "$NSS_DISABLE_ECC" ] ; then
627 echo "$SCRIPTNAME: skipping $testname (ECC only)"
628 elif [ "$ectype" = "SNI" ]; then
629 continue
630 elif [ "`echo $ectype | cut -b 1`" != "#" ]; then
631 servarg=`echo $sparam | awk '{r=split($0,a,"-r") - 1;print r;}'`
632 pwd=`echo $cparam | grep nss`
633 user=`echo $cparam | grep TestUser`
634 _cparam=$cparam
635 case $servarg in
636 1) if [ -z "$pwd" -o -z "$user" ]; then
637 rev_modvalue=0
638 else
639 rev_modvalue=254
640 fi
641 ;;
642 2) rev_modvalue=254 ;;
643 3) if [ -z "$pwd" -o -z "$user" ]; then
644 rev_modvalue=0
645 else
646 rev_modvalue=1
647 fi
648 ;;
649 4) rev_modvalue=1 ;;
650 esac
651 TEMP_NUM=0
652 while [ $TEMP_NUM -lt $CRL_GROUP_RANGE ]
653 do
654 CURR_SER_NUM=`expr ${CRL_GROUP_BEGIN} + ${TEMP_NUM}`
655 TEMP_NUM=`expr $TEMP_NUM + 1`
656 USER_NICKNAME="TestUser${CURR_SER_NUM}"
657 cparam=`echo $_cparam | sed -e 's;_; ;g' -e "s/TestUser/$USER_NICKNAME/g" `
658 start_selfserv
660 echo "tstclnt -p ${PORT} -h ${HOSTADDR} -f -d ${R_CLIENTDIR} -v \\"
661 echo " ${cparam} < ${REQUEST_FILE}"
662 rm ${TMP}/$HOST.tmp.$$ 2>/dev/null
663 ${PROFTOOL} ${BINDIR}/tstclnt -p ${PORT} -h ${HOSTADDR} -f ${cparam} \
664 -d ${R_CLIENTDIR} -v < ${REQUEST_FILE} \
665 >${TMP}/$HOST.tmp.$$ 2>&1
666 ret=$?
667 cat ${TMP}/$HOST.tmp.$$
668 rm ${TMP}/$HOST.tmp.$$ 2>/dev/null
669 if [ $CURR_SER_NUM -ne $UNREVOKED_CERT ]; then
670 modvalue=$rev_modvalue
671 testAddMsg="revoked"
672 else
673 testAddMsg="not revoked"
674 modvalue=$value
675 fi
677 html_msg $ret $modvalue "${testname} (cert ${USER_NICKNAME} - $testAddMsg)" \
678 "produced a returncode of $ret, expected is $modvalue"
679 kill_selfserv
680 done
681 fi
682 done
684 html "</TABLE><BR>"
685 }
687 ############################# is_revoked ###############################
688 # local shell function to check if certificate is revoked
689 ########################################################################
690 is_revoked() {
691 certNum=$1
692 currLoadedGrp=$2
694 found=0
695 ownerGrp=1
696 while [ $ownerGrp -le $TOTAL_GRP_NUM -a $found -eq 0 ]
697 do
698 currGrpBegin=`eval echo \$\{CRL_GRP_${ownerGrp}_BEGIN\}`
699 currGrpRange=`eval echo \$\{CRL_GRP_${ownerGrp}_RANGE\}`
700 currGrpEnd=`expr $currGrpBegin + $currGrpRange - 1`
701 if [ $certNum -ge $currGrpBegin -a $certNum -le $currGrpEnd ]; then
702 found=1
703 else
704 ownerGrp=`expr $ownerGrp + 1`
705 fi
706 done
707 if [ $found -eq 1 -a $currLoadedGrp -lt $ownerGrp ]; then
708 return 1
709 fi
710 if [ $found -eq 0 ]; then
711 return 1
712 fi
713 unrevokedGrpCert=`eval echo \$\{UNREVOKED_CERT_GRP_${ownerGrp}\}`
714 if [ $certNum -eq $unrevokedGrpCert ]; then
715 return 1
716 fi
717 return 0
718 }
720 ########################### load_group_crl #############################
721 # local shell function to load CRL
722 ########################################################################
723 load_group_crl() {
724 group=$1
725 ectype=$2
727 OUTFILE_TMP=${TMP}/$HOST.tmp.$$
728 grpBegin=`eval echo \$\{CRL_GRP_${group}_BEGIN\}`
729 grpRange=`eval echo \$\{CRL_GRP_${group}_RANGE\}`
730 grpEnd=`expr $grpBegin + $grpRange - 1`
732 if [ "$grpBegin" = "" -o "$grpRange" = "" ]; then
733 ret=1
734 return 1;
735 fi
737 # Add -ec suffix for ECC
738 if [ "$ectype" = "ECC" ] ; then
739 ecsuffix="-ec"
740 eccomment="ECC "
741 else
742 ecsuffix=""
743 eccomment=""
744 fi
746 if [ "$RELOAD_CRL" != "" ]; then
747 if [ $group -eq 1 ]; then
748 echo "==================== Resetting to group 1 crl ==================="
749 kill_selfserv
750 start_selfserv
751 is_selfserv_alive
752 fi
753 echo "================= Reloading ${eccomment}CRL for group $grpBegin - $grpEnd ============="
755 echo "tstclnt -p ${PORT} -h ${HOSTADDR} -f -d ${R_CLIENTDIR} -v \\"
756 echo " -V ssl3: -w nss -n TestUser${UNREVOKED_CERT_GRP_1}${ecsuffix}"
757 echo "Request:"
758 echo "GET crl://${SERVERDIR}/root.crl_${grpBegin}-${grpEnd}${ecsuffix}"
759 echo ""
760 echo "RELOAD time $i"
762 REQF=${R_CLIENTDIR}.crlreq
763 cat > ${REQF} <<_EOF_REQUEST_
764 GET crl://${SERVERDIR}/root.crl_${grpBegin}-${grpEnd}${ecsuffix}
766 _EOF_REQUEST_
768 ${PROFTOOL} ${BINDIR}/tstclnt -p ${PORT} -h ${HOSTADDR} -f \
769 -d ${R_CLIENTDIR} -v -V ssl3: -w nss -n TestUser${UNREVOKED_CERT_GRP_1}${ecsuffix} \
770 >${OUTFILE_TMP} 2>&1 < ${REQF}
772 cat ${OUTFILE_TMP}
773 grep "CRL ReCache Error" ${OUTFILE_TMP}
774 if [ $? -eq 0 ]; then
775 ret=1
776 return 1
777 fi
778 else
779 echo "=== Updating DB for group $grpBegin - $grpEnd and restarting selfserv ====="
781 kill_selfserv
782 CU_ACTION="Importing ${eccomment}CRL for groups $grpBegin - $grpEnd"
783 crlu -d ${R_SERVERDIR} -I -i ${SERVERDIR}/root.crl_${grpBegin}-${grpEnd}${ecsuffix} \
784 -p ../tests.pw.928
785 ret=$?
786 if [ "$ret" -eq 0 ]; then
787 html_passed "${CU_ACTION}"
788 return 1
789 fi
790 start_selfserv
791 fi
792 is_selfserv_alive
793 ret=$?
794 echo "================= CRL Reloaded ============="
795 }
797 ########################### ssl_crl_cache ##############################
798 # local shell function to perform SSL test for crl cache functionality
799 # with/out revoked certs
800 ########################################################################
801 ssl_crl_cache()
802 {
803 html_head "Cache CRL SSL Client Tests $NORM_EXT $ECC_STRING"
804 SSLAUTH_TMP=${TMP}/authin.tl.tmp
805 SERV_ARG=-r_-r
806 rm -f ${SSLAUTH_TMP}
807 echo ${SSLAUTH_TMP}
809 grep -- " $SERV_ARG " ${SSLAUTH} | grep -v "^#" | grep -v none | grep -v bogus > ${SSLAUTH_TMP}
810 echo $?
811 while [ $? -eq 0 -a -f ${SSLAUTH_TMP} ]
812 do
813 sparam=$SERV_ARG
814 start_selfserv
815 exec < ${SSLAUTH_TMP}
816 while read ectype value sparam cparam testname
817 do
818 [ "$ectype" = "" ] && continue
819 if [ "$ectype" = "ECC" -a -n "$NSS_DISABLE_ECC" ] ; then
820 echo "$SCRIPTNAME: skipping $testname (ECC only)"
821 elif [ "$ectype" = "SNI" ]; then
822 continue
823 else
824 servarg=`echo $sparam | awk '{r=split($0,a,"-r") - 1;print r;}'`
825 pwd=`echo $cparam | grep nss`
826 user=`echo $cparam | grep TestUser`
827 _cparam=$cparam
828 case $servarg in
829 1) if [ -z "$pwd" -o -z "$user" ]; then
830 rev_modvalue=0
831 else
832 rev_modvalue=254
833 fi
834 ;;
835 2) rev_modvalue=254 ;;
837 3) if [ -z "$pwd" -o -z "$user" ]; then
838 rev_modvalue=0
839 else
840 rev_modvalue=1
841 fi
842 ;;
843 4) rev_modvalue=1 ;;
844 esac
845 TEMP_NUM=0
846 LOADED_GRP=1
847 while [ ${LOADED_GRP} -le ${TOTAL_GRP_NUM} ]
848 do
849 while [ $TEMP_NUM -lt $TOTAL_CRL_RANGE ]
850 do
851 CURR_SER_NUM=`expr ${CRL_GRP_1_BEGIN} + ${TEMP_NUM}`
852 TEMP_NUM=`expr $TEMP_NUM + 1`
853 USER_NICKNAME="TestUser${CURR_SER_NUM}"
854 cparam=`echo $_cparam | sed -e 's;_; ;g' -e "s/TestUser/$USER_NICKNAME/g" `
856 echo "Server Args: $SERV_ARG"
857 echo "tstclnt -p ${PORT} -h ${HOSTADDR} -f -d ${R_CLIENTDIR} -v \\"
858 echo " ${cparam} < ${REQUEST_FILE}"
859 rm ${TMP}/$HOST.tmp.$$ 2>/dev/null
860 ${PROFTOOL} ${BINDIR}/tstclnt -p ${PORT} -h ${HOSTADDR} -f ${cparam} \
861 -d ${R_CLIENTDIR} -v < ${REQUEST_FILE} \
862 >${TMP}/$HOST.tmp.$$ 2>&1
863 ret=$?
864 cat ${TMP}/$HOST.tmp.$$
865 rm ${TMP}/$HOST.tmp.$$ 2>/dev/null
866 is_revoked ${CURR_SER_NUM} ${LOADED_GRP}
867 isRevoked=$?
868 if [ $isRevoked -eq 0 ]; then
869 modvalue=$rev_modvalue
870 testAddMsg="revoked"
871 else
872 modvalue=$value
873 testAddMsg="not revoked"
874 fi
876 is_selfserv_alive
877 ss_status=$?
878 if [ "$ss_status" -ne 0 ]; then
879 html_msg $ret $modvalue \
880 "${testname}(cert ${USER_NICKNAME} - $testAddMsg)" \
881 "produced a returncode of $ret, expected is $modvalue. " \
882 "selfserv is not alive!"
883 else
884 html_msg $ret $modvalue \
885 "${testname}(cert ${USER_NICKNAME} - $testAddMsg)" \
886 "produced a returncode of $ret, expected is $modvalue"
887 fi
888 done
889 LOADED_GRP=`expr $LOADED_GRP + 1`
890 TEMP_NUM=0
891 if [ "$LOADED_GRP" -le "$TOTAL_GRP_NUM" ]; then
892 load_group_crl $LOADED_GRP $ectype
893 html_msg $ret 0 "Load group $LOADED_GRP ${eccomment}crl " \
894 "produced a returncode of $ret, expected is 0"
895 fi
896 done
897 # Restart selfserv to roll back to two initial group 1 crls
898 # TestCA CRL and TestCA-ec CRL
899 kill_selfserv
900 start_selfserv
901 fi
902 done
903 kill_selfserv
904 SERV_ARG="${SERV_ARG}_-r"
905 rm -f ${SSLAUTH_TMP}
906 grep -- " $SERV_ARG " ${SSLAUTH} | grep -v "^#" | grep -v none | grep -v bogus > ${SSLAUTH_TMP}
907 done
908 TEMPFILES=${SSLAUTH_TMP}
909 html "</TABLE><BR>"
910 }
913 ############################## ssl_cleanup #############################
914 # local shell function to finish this script (no exit since it might be
915 # sourced)
916 ########################################################################
917 ssl_cleanup()
918 {
919 rm $SERVERPID 2>/dev/null
920 cd ${QADIR}
921 . common/cleanup.sh
922 }
924 ############################## ssl_run #################################
925 # local shell function to run coverage, authentication and stress tests
926 ########################################################################
927 ssl_run()
928 {
929 for SSL_RUN in ${NSS_SSL_RUN}
930 do
931 case "${SSL_RUN}" in
932 "stapling")
933 ssl_stapling
934 ;;
935 "cov")
936 ssl_cov
937 ;;
938 "auth")
939 ssl_auth
940 ;;
941 "stress")
942 ssl_stress
943 ;;
944 esac
945 done
946 }
948 ############################ ssl_run_all ###############################
949 # local shell function to run both standard and extended ssl tests
950 ########################################################################
951 ssl_run_all()
952 {
953 ORIG_SERVERDIR=$SERVERDIR
954 ORIG_CLIENTDIR=$CLIENTDIR
955 ORIG_R_SERVERDIR=$R_SERVERDIR
956 ORIG_R_CLIENTDIR=$R_CLIENTDIR
957 ORIG_P_R_SERVERDIR=$P_R_SERVERDIR
958 ORIG_P_R_CLIENTDIR=$P_R_CLIENTDIR
960 USER_NICKNAME=TestUser
961 NORM_EXT=""
962 cd ${CLIENTDIR}
964 ssl_run
966 SERVERDIR=$EXT_SERVERDIR
967 CLIENTDIR=$EXT_CLIENTDIR
968 R_SERVERDIR=$R_EXT_SERVERDIR
969 R_CLIENTDIR=$R_EXT_CLIENTDIR
970 P_R_SERVERDIR=$P_R_EXT_SERVERDIR
971 P_R_CLIENTDIR=$P_R_EXT_CLIENTDIR
973 USER_NICKNAME=ExtendedSSLUser
974 NORM_EXT="Extended Test"
975 cd ${CLIENTDIR}
977 ssl_run
979 # the next round of ssl tests will only run if these vars are reset
980 SERVERDIR=$ORIG_SERVERDIR
981 CLIENTDIR=$ORIG_CLIENTDIR
982 R_SERVERDIR=$ORIG_R_SERVERDIR
983 R_CLIENTDIR=$ORIG_R_CLIENTDIR
984 P_R_SERVERDIR=$ORIG_P_R_SERVERDIR
985 P_R_CLIENTDIR=$ORIG_P_R_CLIENTDIR
987 USER_NICKNAME=TestUser
988 NORM_EXT=
989 cd ${QADIR}/ssl
990 }
992 ############################ ssl_set_fips ##############################
993 # local shell function to set FIPS mode on/off
994 ########################################################################
995 ssl_set_fips()
996 {
997 CLTSRV=$1
998 ONOFF=$2
1000 if [ ${CLTSRV} = "server" ]; then
1001 DBDIRS="${SERVERDIR} ${EXT_SERVERDIR}"
1002 else
1003 DBDIRS="${CLIENTDIR} ${EXT_CLIENTDIR}"
1004 fi
1006 if [ "${ONOFF}" = "on" ]; then
1007 FIPSMODE=true
1008 RET_EXP=0
1009 else
1010 FIPSMODE=false
1011 RET_EXP=1
1012 fi
1014 html_head "SSL - FIPS mode ${ONOFF} for ${CLTSRV}"
1016 for DBDIR in ${DBDIRS}
1017 do
1018 EXT_OPT=
1019 echo ${DBDIR} | grep ext > /dev/null
1020 if [ $? -eq 0 ]; then
1021 EXT_OPT="extended "
1022 fi
1024 echo "${SCRIPTNAME}: Turning FIPS ${ONOFF} for the ${EXT_OPT} ${CLTSRV}"
1026 echo "modutil -dbdir ${DBDIR} -fips ${FIPSMODE} -force"
1027 ${BINDIR}/modutil -dbdir ${DBDIR} -fips ${FIPSMODE} -force 2>&1
1028 RET=$?
1029 html_msg "${RET}" "0" "${TESTNAME} (modutil -fips ${FIPSMODE})" \
1030 "produced a returncode of ${RET}, expected is 0"
1032 echo "modutil -dbdir ${DBDIR} -list"
1033 DBLIST=`${BINDIR}/modutil -dbdir ${DBDIR} -list 2>&1`
1034 RET=$?
1035 html_msg "${RET}" "0" "${TESTNAME} (modutil -list)" \
1036 "produced a returncode of ${RET}, expected is 0"
1038 echo "${DBLIST}" | grep "FIPS PKCS #11"
1039 RET=$?
1040 html_msg "${RET}" "${RET_EXP}" "${TESTNAME} (grep \"FIPS PKCS #11\")" \
1041 "produced a returncode of ${RET}, expected is ${RET_EXP}"
1042 done
1044 html "</TABLE><BR>"
1045 }
1047 ############################ ssl_set_fips ##############################
1048 # local shell function to run all tests set in NSS_SSL_TESTS variable
1049 ########################################################################
1050 ssl_run_tests()
1051 {
1052 for SSL_TEST in ${NSS_SSL_TESTS}
1053 do
1054 case "${SSL_TEST}" in
1055 "crl")
1056 ssl_crl_ssl
1057 ssl_crl_cache
1058 ;;
1059 "iopr")
1060 ssl_iopr_run
1061 ;;
1062 *)
1063 SERVER_MODE=`echo "${SSL_TEST}" | cut -d_ -f1`
1064 CLIENT_MODE=`echo "${SSL_TEST}" | cut -d_ -f2`
1066 case "${SERVER_MODE}" in
1067 "normal")
1068 SERVER_OPTIONS=
1069 ;;
1070 "bypass")
1071 SERVER_OPTIONS="-B -s"
1072 ;;
1073 "fips")
1074 SERVER_OPTIONS=
1075 ssl_set_fips server on
1076 ;;
1077 *)
1078 echo "${SCRIPTNAME}: Error: Unknown server mode ${SERVER_MODE}"
1079 continue
1080 ;;
1081 esac
1083 case "${CLIENT_MODE}" in
1084 "normal")
1085 CLIENT_OPTIONS=
1086 ;;
1087 "bypass")
1088 CLIENT_OPTIONS="-B -s"
1089 ;;
1090 "fips")
1091 SERVER_OPTIONS=
1092 ssl_set_fips client on
1093 ;;
1094 *)
1095 echo "${SCRIPTNAME}: Error: Unknown client mode ${CLIENT_MODE}"
1096 continue
1097 ;;
1098 esac
1100 ssl_run_all
1102 if [ "${SERVER_MODE}" = "fips" ]; then
1103 ssl_set_fips server off
1104 fi
1106 if [ "${CLIENT_MODE}" = "fips" ]; then
1107 ssl_set_fips client off
1108 fi
1109 ;;
1110 esac
1111 done
1112 }
1114 ################################# main #################################
1116 ssl_init
1117 ssl_run_tests
1118 ssl_cleanup