blob: 286eec4df55db32ee936785f92c87fa672772e6f [file] [log] [blame]
Paul Bakkeraccd4eb2013-07-19 13:41:51 +02001#!/bin/bash
2
Manuel Pégourié-Gonnardeaadc502014-02-20 11:01:30 +01003# Test interop with OpenSSL for each common ciphersuite and version.
4# Also test selfop for ciphersuites not shared with OpenSSL.
5
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +01006set -u
7
Manuel Pégourié-Gonnard70064fd2013-08-27 22:00:47 +02008let "tests = 0"
9let "failed = 0"
10let "skipped = 0"
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +010011let "srvmem = 0"
Manuel Pégourié-Gonnard70064fd2013-08-27 22:00:47 +020012
Manuel Pégourié-Gonnardf7a26902014-02-27 12:25:54 +010013# default values, can be overriden by the environment
14: ${P_SRV:=../programs/ssl/ssl_server2}
15: ${P_CLI:=../programs/ssl/ssl_client2}
16: ${OPENSSL:=openssl}
17
Paul Bakker10cd2252012-04-12 21:26:34 +000018MODES="ssl3 tls1 tls1_1 tls1_2"
Paul Bakker1eeceae2012-11-23 14:25:34 +010019VERIFIES="NO YES"
Manuel Pégourié-Gonnard7ebaf372013-08-27 21:03:33 +020020TYPES="ECDSA RSA PSK"
Paul Bakkeraccd4eb2013-07-19 13:41:51 +020021FILTER=""
22VERBOSE=""
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +010023MEMCHECK=0
Paul Bakkeraccd4eb2013-07-19 13:41:51 +020024
Manuel Pégourié-Gonnard9dea8bd2014-02-26 18:21:02 +010025print_usage() {
26 echo "Usage: $0"
27 echo -e " -f|--filter\tFilter ciphersuites to test (Default: all)"
28 echo -e " -h|--help\t\tPrint this help."
29 echo -e " -m|--modes\tWhich modes to perform (Default: \"ssl3 tls1 tls1_1 tls1_2\")"
30 echo -e " -t|--types\tWhich key exchange type to perform (Default: \"ECDSA RSA PSK\")"
31 echo -e " -V|--verify\tWhich verification modes to perform (Default: \"NO YES\")"
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +010032 echo -e " -M, --memcheck\tCheck memory leaks and errors."
Manuel Pégourié-Gonnard9dea8bd2014-02-26 18:21:02 +010033 echo -e " -v|--verbose\t\tSet verbose output."
34}
35
36get_options() {
37 while [ $# -gt 0 ]; do
38 case "$1" in
39 -f|--filter)
40 shift; FILTER=$1
41 ;;
42 -m|--modes)
43 shift; MODES=$1
44 ;;
45 -t|--types)
46 shift; TYPES=$1
47 ;;
48 -V|--verify)
49 shift; VERIFIES=$1
50 ;;
51 -v|--verbose)
52 VERBOSE=1
53 ;;
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +010054 -M|--memcheck)
55 MEMCHECK=1
56 ;;
Manuel Pégourié-Gonnard9dea8bd2014-02-26 18:21:02 +010057 -h|--help)
58 print_usage
59 exit 0
60 ;;
61 *)
62 echo "Unknown argument: '$1'"
63 print_usage
64 exit 1
65 ;;
66 esac
67 shift
68 done
69}
Paul Bakkeraccd4eb2013-07-19 13:41:51 +020070
Manuel Pégourié-Gonnard95957712014-02-19 15:29:38 +010071log() {
Paul Bakkeraccd4eb2013-07-19 13:41:51 +020072 if [ "X" != "X$VERBOSE" ]; then
73 echo "$@"
74 fi
75}
Paul Bakker10cd2252012-04-12 21:26:34 +000076
Manuel Pégourié-Gonnarddfc8d5a2013-08-27 20:48:40 +020077filter()
78{
79 LIST=$1
80 FILTER=$2
81
82 NEW_LIST=""
83
84 for i in $LIST;
85 do
86 NEW_LIST="$NEW_LIST $( echo "$i" | grep "$FILTER" )"
87 done
88
Manuel Pégourié-Gonnard911622d2014-02-27 11:50:40 +010089 # normalize whitespace
90 echo "$NEW_LIST" | sed -e 's/[[:space:]]\+/ /g' -e 's/^ //' -e 's/ $//'
Manuel Pégourié-Gonnarddfc8d5a2013-08-27 20:48:40 +020091}
92
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +010093filter_ciphersuites()
94{
95 if [ "X" != "X$FILTER" ];
96 then
97 P_CIPHERS=$( filter "$P_CIPHERS" "$FILTER" )
98 O_CIPHERS=$( filter "$O_CIPHERS" "$FILTER" )
99 G_CIPHERS=$( filter "$G_CIPHERS" "$FILTER" )
100 fi
101}
102
103reset_ciphersuites()
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100104{
105 P_CIPHERS=""
106 O_CIPHERS=""
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100107 G_CIPHERS=""
108}
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100109
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100110add_openssl_ciphersuites()
111{
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100112 case $TYPE in
113
114 "ECDSA")
115 if [ "$MODE" != "ssl3" ];
116 then
117 P_CIPHERS="$P_CIPHERS \
118 TLS-ECDHE-ECDSA-WITH-NULL-SHA \
119 TLS-ECDHE-ECDSA-WITH-RC4-128-SHA \
120 TLS-ECDHE-ECDSA-WITH-3DES-EDE-CBC-SHA \
121 TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA \
122 TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA \
123 TLS-ECDH-ECDSA-WITH-NULL-SHA \
124 TLS-ECDH-ECDSA-WITH-RC4-128-SHA \
125 TLS-ECDH-ECDSA-WITH-3DES-EDE-CBC-SHA \
126 TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA \
127 TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA \
128 "
129 O_CIPHERS="$O_CIPHERS \
130 ECDHE-ECDSA-NULL-SHA \
131 ECDHE-ECDSA-RC4-SHA \
132 ECDHE-ECDSA-DES-CBC3-SHA \
133 ECDHE-ECDSA-AES128-SHA \
134 ECDHE-ECDSA-AES256-SHA \
135 ECDH-ECDSA-NULL-SHA \
136 ECDH-ECDSA-RC4-SHA \
137 ECDH-ECDSA-DES-CBC3-SHA \
138 ECDH-ECDSA-AES128-SHA \
139 ECDH-ECDSA-AES256-SHA \
140 "
141 fi
142 if [ "$MODE" = "tls1_2" ];
143 then
144 P_CIPHERS="$P_CIPHERS \
145 TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256 \
146 TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384 \
147 TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256 \
148 TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384 \
149 TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA256 \
150 TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA384 \
151 TLS-ECDH-ECDSA-WITH-AES-128-GCM-SHA256 \
152 TLS-ECDH-ECDSA-WITH-AES-256-GCM-SHA384 \
153 "
154 O_CIPHERS="$O_CIPHERS \
155 ECDHE-ECDSA-AES128-SHA256 \
156 ECDHE-ECDSA-AES256-SHA384 \
157 ECDHE-ECDSA-AES128-GCM-SHA256 \
158 ECDHE-ECDSA-AES256-GCM-SHA384 \
159 ECDH-ECDSA-AES128-SHA256 \
160 ECDH-ECDSA-AES256-SHA384 \
161 ECDH-ECDSA-AES128-GCM-SHA256 \
162 ECDH-ECDSA-AES256-GCM-SHA384 \
163 "
164 fi
165 ;;
166
167 "RSA")
168 P_CIPHERS="$P_CIPHERS \
169 TLS-DHE-RSA-WITH-AES-128-CBC-SHA \
170 TLS-DHE-RSA-WITH-AES-256-CBC-SHA \
171 TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA \
172 TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA \
173 TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA \
174 TLS-RSA-WITH-AES-256-CBC-SHA \
175 TLS-RSA-WITH-CAMELLIA-256-CBC-SHA \
176 TLS-RSA-WITH-AES-128-CBC-SHA \
177 TLS-RSA-WITH-CAMELLIA-128-CBC-SHA \
178 TLS-RSA-WITH-3DES-EDE-CBC-SHA \
179 TLS-RSA-WITH-RC4-128-SHA \
180 TLS-RSA-WITH-RC4-128-MD5 \
181 TLS-RSA-WITH-NULL-MD5 \
182 TLS-RSA-WITH-NULL-SHA \
183 TLS-RSA-WITH-DES-CBC-SHA \
184 TLS-DHE-RSA-WITH-DES-CBC-SHA \
185 "
186 O_CIPHERS="$O_CIPHERS \
187 DHE-RSA-AES128-SHA \
188 DHE-RSA-AES256-SHA \
189 DHE-RSA-CAMELLIA128-SHA \
190 DHE-RSA-CAMELLIA256-SHA \
191 EDH-RSA-DES-CBC3-SHA \
192 AES256-SHA \
193 CAMELLIA256-SHA \
194 AES128-SHA \
195 CAMELLIA128-SHA \
196 DES-CBC3-SHA \
197 RC4-SHA \
198 RC4-MD5 \
199 NULL-MD5 \
200 NULL-SHA \
201 DES-CBC-SHA \
202 EDH-RSA-DES-CBC-SHA \
203 "
204 if [ "$MODE" != "ssl3" ];
205 then
206 P_CIPHERS="$P_CIPHERS \
207 TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA \
208 TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA \
209 TLS-ECDHE-RSA-WITH-3DES-EDE-CBC-SHA \
210 TLS-ECDHE-RSA-WITH-RC4-128-SHA \
211 TLS-ECDHE-RSA-WITH-NULL-SHA \
212 "
213 O_CIPHERS="$O_CIPHERS \
214 ECDHE-RSA-AES256-SHA \
215 ECDHE-RSA-AES128-SHA \
216 ECDHE-RSA-DES-CBC3-SHA \
217 ECDHE-RSA-RC4-SHA \
218 ECDHE-RSA-NULL-SHA \
219 "
220 fi
221 if [ "$MODE" = "tls1_2" ];
222 then
223 P_CIPHERS="$P_CIPHERS \
224 TLS-RSA-WITH-NULL-SHA256 \
225 TLS-RSA-WITH-AES-128-CBC-SHA256 \
226 TLS-DHE-RSA-WITH-AES-128-CBC-SHA256 \
227 TLS-RSA-WITH-AES-256-CBC-SHA256 \
228 TLS-DHE-RSA-WITH-AES-256-CBC-SHA256 \
229 TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256 \
230 TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384 \
231 TLS-RSA-WITH-AES-128-GCM-SHA256 \
232 TLS-RSA-WITH-AES-256-GCM-SHA384 \
233 TLS-DHE-RSA-WITH-AES-128-GCM-SHA256 \
234 TLS-DHE-RSA-WITH-AES-256-GCM-SHA384 \
235 TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256 \
236 TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384 \
237 "
238 O_CIPHERS="$O_CIPHERS \
239 NULL-SHA256 \
240 AES128-SHA256 \
241 DHE-RSA-AES128-SHA256 \
242 AES256-SHA256 \
243 DHE-RSA-AES256-SHA256 \
244 ECDHE-RSA-AES128-SHA256 \
245 ECDHE-RSA-AES256-SHA384 \
246 AES128-GCM-SHA256 \
247 DHE-RSA-AES128-GCM-SHA256 \
248 AES256-GCM-SHA384 \
249 DHE-RSA-AES256-GCM-SHA384 \
250 ECDHE-RSA-AES128-GCM-SHA256 \
251 ECDHE-RSA-AES256-GCM-SHA384 \
252 "
253 fi
254 ;;
255
256 "PSK")
257 P_CIPHERS="$P_CIPHERS \
258 TLS-PSK-WITH-RC4-128-SHA \
259 TLS-PSK-WITH-3DES-EDE-CBC-SHA \
260 TLS-PSK-WITH-AES-128-CBC-SHA \
261 TLS-PSK-WITH-AES-256-CBC-SHA \
262 "
263 O_CIPHERS="$O_CIPHERS \
264 PSK-RC4-SHA \
265 PSK-3DES-EDE-CBC-SHA \
266 PSK-AES128-CBC-SHA \
267 PSK-AES256-CBC-SHA \
268 "
269 ;;
270 esac
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100271}
272
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100273add_gnutls_ciphersuites()
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100274{
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100275 # TODO: add to G_CIPHERS too
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100276 case $TYPE in
277
278 "ECDSA")
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100279 if [ "$MODE" = "tls1_2" ];
280 then
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100281 P_CIPHERS="$P_CIPHERS \
282 TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-CBC-SHA256 \
283 TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-CBC-SHA384 \
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100284 TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-GCM-SHA256 \
285 TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-GCM-SHA384 \
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100286 "
287 fi
288 ;;
289
290 "RSA")
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100291 if [ "$MODE" = "tls1_2" ];
292 then
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100293 P_CIPHERS="$P_CIPHERS \
294 TLS-ECDHE-RSA-WITH-CAMELLIA-128-CBC-SHA256 \
295 TLS-ECDHE-RSA-WITH-CAMELLIA-256-CBC-SHA384 \
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100296 TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256 \
297 TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256 \
298 TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256 \
299 TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256 \
300 TLS-ECDHE-RSA-WITH-CAMELLIA-128-GCM-SHA256 \
301 TLS-ECDHE-RSA-WITH-CAMELLIA-256-GCM-SHA384 \
302 TLS-DHE-RSA-WITH-CAMELLIA-128-GCM-SHA256 \
303 TLS-DHE-RSA-WITH-CAMELLIA-256-GCM-SHA384 \
304 TLS-RSA-WITH-CAMELLIA-128-GCM-SHA256 \
305 TLS-RSA-WITH-CAMELLIA-256-GCM-SHA384 \
306 "
307 fi
308 ;;
309
310 "PSK")
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100311 # GnuTLS 3.2.11 (2014-02-13) requires TLS 1.x for most *PSK suites
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100312 if [ "$MODE" != "ssl3" ];
313 then
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100314 P_CIPHERS="$P_CIPHERS \
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100315 TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA \
316 TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA \
317 TLS-ECDHE-PSK-WITH-3DES-EDE-CBC-SHA \
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100318 TLS-DHE-PSK-WITH-3DES-EDE-CBC-SHA \
319 TLS-DHE-PSK-WITH-AES-128-CBC-SHA \
320 TLS-DHE-PSK-WITH-AES-256-CBC-SHA \
321 TLS-RSA-PSK-WITH-3DES-EDE-CBC-SHA \
322 TLS-RSA-PSK-WITH-AES-256-CBC-SHA \
323 TLS-RSA-PSK-WITH-AES-128-CBC-SHA \
324 TLS-RSA-WITH-NULL-SHA \
325 TLS-RSA-WITH-NULL-MD5 \
326 "
327 fi
328 if [ "$MODE" = "tls1_2" ];
329 then
330 P_CIPHERS="$P_CIPHERS \
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100331 TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA384 \
332 TLS-ECDHE-PSK-WITH-CAMELLIA-256-CBC-SHA384 \
333 TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256 \
334 TLS-ECDHE-PSK-WITH-CAMELLIA-128-CBC-SHA256 \
335 TLS-ECDHE-PSK-WITH-NULL-SHA384 \
336 TLS-ECDHE-PSK-WITH-NULL-SHA256 \
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100337 TLS-PSK-WITH-AES-128-CBC-SHA256 \
338 TLS-PSK-WITH-AES-256-CBC-SHA384 \
339 TLS-DHE-PSK-WITH-AES-128-CBC-SHA256 \
340 TLS-DHE-PSK-WITH-AES-256-CBC-SHA384 \
341 TLS-PSK-WITH-NULL-SHA256 \
342 TLS-PSK-WITH-NULL-SHA384 \
343 TLS-DHE-PSK-WITH-NULL-SHA256 \
344 TLS-DHE-PSK-WITH-NULL-SHA384 \
345 TLS-RSA-PSK-WITH-AES-256-CBC-SHA384 \
346 TLS-RSA-PSK-WITH-AES-128-CBC-SHA256 \
347 TLS-RSA-PSK-WITH-NULL-SHA256 \
348 TLS-RSA-PSK-WITH-NULL-SHA384 \
349 TLS-DHE-PSK-WITH-CAMELLIA-128-CBC-SHA256 \
350 TLS-DHE-PSK-WITH-CAMELLIA-256-CBC-SHA384 \
351 TLS-PSK-WITH-CAMELLIA-128-CBC-SHA256 \
352 TLS-PSK-WITH-CAMELLIA-256-CBC-SHA384 \
353 TLS-RSA-PSK-WITH-CAMELLIA-256-CBC-SHA384 \
354 TLS-RSA-PSK-WITH-CAMELLIA-128-CBC-SHA256 \
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100355 TLS-PSK-WITH-AES-128-GCM-SHA256 \
356 TLS-PSK-WITH-AES-256-GCM-SHA384 \
357 TLS-DHE-PSK-WITH-AES-128-GCM-SHA256 \
358 TLS-DHE-PSK-WITH-AES-256-GCM-SHA384 \
359 TLS-RSA-PSK-WITH-CAMELLIA-128-GCM-SHA256 \
360 TLS-RSA-PSK-WITH-CAMELLIA-256-GCM-SHA384 \
361 TLS-PSK-WITH-CAMELLIA-128-GCM-SHA256 \
362 TLS-PSK-WITH-CAMELLIA-256-GCM-SHA384 \
363 TLS-DHE-PSK-WITH-CAMELLIA-128-GCM-SHA256 \
364 TLS-DHE-PSK-WITH-CAMELLIA-256-GCM-SHA384 \
365 TLS-RSA-PSK-WITH-AES-256-GCM-SHA384 \
366 TLS-RSA-PSK-WITH-AES-128-GCM-SHA256 \
367 TLS-RSA-WITH-NULL-SHA256 \
368 "
369 fi
370 ;;
371 esac
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100372}
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100373
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100374add_polarssl_ciphersuites()
375{
376 case $TYPE in
377
378 "ECDSA")
379 if [ "$MODE" != "ssl3" ];
380 then
381 P_CIPHERS="$P_CIPHERS \
382 TLS-ECDH-ECDSA-WITH-CAMELLIA-128-CBC-SHA256 \
383 TLS-ECDH-ECDSA-WITH-CAMELLIA-256-CBC-SHA384 \
384 "
385 fi
386 if [ "$MODE" = "tls1_2" ];
387 then
388 P_CIPHERS="$P_CIPHERS \
389 TLS-ECDH-ECDSA-WITH-CAMELLIA-128-GCM-SHA256 \
390 TLS-ECDH-ECDSA-WITH-CAMELLIA-256-GCM-SHA384 \
391 "
392 fi
393 ;;
394
395 "RSA")
396 ;;
397
398 "PSK")
399 P_CIPHERS="$P_CIPHERS \
400 TLS-PSK-WITH-NULL-SHA \
401 TLS-DHE-PSK-WITH-RC4-128-SHA \
402 TLS-DHE-PSK-WITH-NULL-SHA \
403 TLS-RSA-PSK-WITH-RC4-128-SHA \
404 "
405 if [ "$MODE" != "ssl3" ];
406 then
407 P_CIPHERS="$P_CIPHERS \
408 TLS-ECDHE-PSK-WITH-RC4-128-SHA \
409 TLS-ECDHE-PSK-WITH-NULL-SHA \
410 "
411 fi
412 ;;
413 esac
Manuel Pégourié-Gonnard48f196c2014-02-19 13:51:58 +0100414}
415
Manuel Pégourié-Gonnardd941a792014-02-19 13:35:52 +0100416setup_arguments()
417{
Manuel Pégourié-Gonnard9ada01a2014-02-19 14:24:24 +0100418 case $MODE in
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100419 "ssl3")
420 G_PRIO_MODE="+VERS-SSL3.0"
421 ;;
422 "tls1")
423 G_PRIO_MODE="+VERS-TLS1.0"
424 ;;
425 "tls1_1")
426 G_PRIO_MODE="+VERS-TLS1.1"
427 ;;
428 "tls1_2")
429 G_PRIO_MODE="+VERS-TLS1.2"
Manuel Pégourié-Gonnard9ada01a2014-02-19 14:24:24 +0100430 ;;
431 *)
432 echo "error: invalid mode: $MODE" >&2
433 exit 1;
434 esac
435
436 P_SERVER_ARGS="server_addr=0.0.0.0 force_version=$MODE"
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100437 O_SERVER_ARGS="-www -cipher NULL,ALL -$MODE"
438 G_SERVER_ARGS="-p 4433 --http"
439 G_PRIO_BASE="EXPORT:+PSK:+DHE-PSK:+ECDHE-PSK:+RSA-PSK:-VERS-TLS-ALL"
440
441 P_CLIENT_ARGS="force_version=$MODE"
Manuel Pégourié-Gonnard9ada01a2014-02-19 14:24:24 +0100442 O_CLIENT_ARGS="-$MODE"
443
Manuel Pégourié-Gonnardd941a792014-02-19 13:35:52 +0100444 if [ "X$VERIFY" = "XYES" ];
445 then
Manuel Pégourié-Gonnard9ada01a2014-02-19 14:24:24 +0100446 P_SERVER_ARGS="$P_SERVER_ARGS ca_file=data_files/test-ca_cat12.crt auth_mode=required"
Manuel Pégourié-Gonnard9ada01a2014-02-19 14:24:24 +0100447 O_SERVER_ARGS="$O_SERVER_ARGS -CAfile data_files/test-ca_cat12.crt -Verify 10"
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100448 G_SERVER_ARGS="$G_SERVER_ARGS --x509cafile data_files/test-ca_cat12.crt --require-client-cert"
449
450 P_CLIENT_ARGS="$P_CLIENT_ARGS ca_file=data_files/test-ca_cat12.crt auth_mode=required"
Manuel Pégourié-Gonnardda782c92014-02-21 10:10:20 +0100451 O_CLIENT_ARGS="$O_CLIENT_ARGS -CAfile data_files/test-ca_cat12.crt -verify 10"
452 else
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100453 # don't request a client cert at all
Manuel Pégourié-Gonnard1b149ef2014-02-27 14:38:29 +0100454 P_SERVER_ARGS="$P_SERVER_ARGS ca_file=none auth_mode=none"
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100455 G_SERVER_ARGS="$G_SERVER_ARGS --disable-client-cert"
456
Manuel Pégourié-Gonnard1b149ef2014-02-27 14:38:29 +0100457 # give dummy CA to clients
458 P_CLIENT_ARGS="$P_CLIENT_ARGS ca_file=data_files/cli2.crt"
459 O_CLIENT_ARGS="$O_CLIENT_ARGS -CAfile data_files/cli2.crt"
Manuel Pégourié-Gonnardd941a792014-02-19 13:35:52 +0100460 fi
461
462 case $TYPE in
463 "ECDSA")
Manuel Pégourié-Gonnard9ada01a2014-02-19 14:24:24 +0100464 P_SERVER_ARGS="$P_SERVER_ARGS crt_file=data_files/server5.crt key_file=data_files/server5.key"
Manuel Pégourié-Gonnard9ada01a2014-02-19 14:24:24 +0100465 O_SERVER_ARGS="$O_SERVER_ARGS -cert data_files/server5.crt -key data_files/server5.key"
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100466 G_SERVER_ARGS="$G_SERVER_ARGS --x509certfile data_files/server5.crt --x509keyfile data_files/server5.key"
467
Manuel Pégourié-Gonnard1b149ef2014-02-27 14:38:29 +0100468 if [ "X$VERIFY" = "XYES" ]; then
469 P_CLIENT_ARGS="$P_CLIENT_ARGS crt_file=data_files/server6.crt key_file=data_files/server6.key"
470 O_CLIENT_ARGS="$O_CLIENT_ARGS -cert data_files/server6.crt -key data_files/server6.key"
471 else
472 P_CLIENT_ARGS="$P_CLIENT_ARGS crt_file=none key_file=none"
473 fi
Manuel Pégourié-Gonnardd941a792014-02-19 13:35:52 +0100474 ;;
475
476 "RSA")
Manuel Pégourié-Gonnardda782c92014-02-21 10:10:20 +0100477 P_SERVER_ARGS="$P_SERVER_ARGS crt_file=data_files/server2.crt key_file=data_files/server2.key"
Manuel Pégourié-Gonnardda782c92014-02-21 10:10:20 +0100478 O_SERVER_ARGS="$O_SERVER_ARGS -cert data_files/server2.crt -key data_files/server2.key"
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100479 G_SERVER_ARGS="$G_SERVER_ARGS --x509certfile data_files/server2.crt --x509keyfile data_files/server2.key"
480
Manuel Pégourié-Gonnard1b149ef2014-02-27 14:38:29 +0100481 if [ "X$VERIFY" = "XYES" ]; then
482 P_CLIENT_ARGS="$P_CLIENT_ARGS crt_file=data_files/server1.crt key_file=data_files/server1.key"
483 O_CLIENT_ARGS="$O_CLIENT_ARGS -cert data_files/server1.crt -key data_files/server1.key"
484 else
485 P_CLIENT_ARGS="$P_CLIENT_ARGS crt_file=none key_file=none"
486 fi
Manuel Pégourié-Gonnardd941a792014-02-19 13:35:52 +0100487 ;;
488
489 "PSK")
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100490 # give RSA-PSK-capable server a RSA cert
Manuel Pégourié-Gonnard1b149ef2014-02-27 14:38:29 +0100491 # (should be a separate type, but harder to close with openssl)
492 P_SERVER_ARGS="$P_SERVER_ARGS psk=6162636465666768696a6b6c6d6e6f70 ca_file=none crt_file=data_files/server2.crt key_file=data_files/server2.key"
Manuel Pégourié-Gonnard1b149ef2014-02-27 14:38:29 +0100493 O_SERVER_ARGS="$O_SERVER_ARGS -psk 6162636465666768696a6b6c6d6e6f70 -nocert"
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100494 G_SERVER_ARGS="$G_SERVER_ARGS --x509certfile data_files/server2.crt --x509keyfile data_files/server2.key --pskpasswd data_files/passwd.psk"
495
496 P_CLIENT_ARGS="$P_CLIENT_ARGS psk=6162636465666768696a6b6c6d6e6f70 crt_file=none key_file=none"
Manuel Pégourié-Gonnard9ada01a2014-02-19 14:24:24 +0100497 O_CLIENT_ARGS="$O_CLIENT_ARGS -psk 6162636465666768696a6b6c6d6e6f70"
Manuel Pégourié-Gonnardd941a792014-02-19 13:35:52 +0100498 ;;
499 esac
500}
501
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +0100502# is_polar <cmd_line>
503is_polar() {
504 echo "$1" | grep 'ssl_server2\|ssl_client2' > /dev/null
505}
506
507# has_mem_err <log_file_name>
508has_mem_err() {
509 if ( grep -F 'All heap blocks were freed -- no leaks are possible' "$1" &&
510 grep -F 'ERROR SUMMARY: 0 errors from 0 contexts' "$1" ) > /dev/null
511 then
512 return 1 # false: does not have errors
513 else
514 return 0 # true: has errors
515 fi
516}
517
Manuel Pégourié-Gonnard304beef2014-02-19 14:45:00 +0100518# start_server <name>
519# also saves name and command
520start_server() {
Manuel Pégourié-Gonnard304beef2014-02-19 14:45:00 +0100521 case $1 in
522 [Oo]pen*)
523 SERVER_CMD="$OPENSSL s_server $O_SERVER_ARGS"
524 ;;
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100525 [Gg]nu*)
526 SERVER_CMD="gnutls-serv $G_SERVER_ARGS --priority $G_PRIO_BASE:$G_PRIO_MODE"
527 ;;
Manuel Pégourié-Gonnard304beef2014-02-19 14:45:00 +0100528 [Pp]olar*)
Manuel Pégourié-Gonnardf7a26902014-02-27 12:25:54 +0100529 SERVER_CMD="$P_SRV $P_SERVER_ARGS"
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +0100530 if [ "$MEMCHECK" -gt 0 ]; then
531 SERVER_CMD="valgrind --leak-check=full $SERVER_CMD"
532 fi
Manuel Pégourié-Gonnard304beef2014-02-19 14:45:00 +0100533 ;;
534 *)
535 echo "error: invalid server name: $1" >&2
536 exit 1
537 ;;
538 esac
539 SERVER_NAME=$1
540
541 log "$SERVER_CMD"
Manuel Pégourié-Gonnard87ae3032014-02-27 11:12:30 +0100542 $SERVER_CMD >srv_out 2>&1 &
Manuel Pégourié-Gonnard304beef2014-02-19 14:45:00 +0100543 PROCESS_ID=$!
544
545 sleep 1
546}
547
Manuel Pégourié-Gonnard911622d2014-02-27 11:50:40 +0100548# terminate the running server (closing it cleanly if it is ours)
Manuel Pégourié-Gonnard95957712014-02-19 15:29:38 +0100549stop_server() {
Manuel Pégourié-Gonnardc57e98b2014-02-19 17:37:55 +0100550 case $SERVER_NAME in
551 [Pp]olar*)
Manuel Pégourié-Gonnard911622d2014-02-27 11:50:40 +0100552 # we must force a PSK suite when in PSK mode (otherwise client
553 # auth will fail), so use $O_CIPHERS
554 CS=$( echo "$O_CIPHERS" | tr ' ' ':' )
555 echo SERVERQUIT | \
556 $OPENSSL s_client $O_CLIENT_ARGS -cipher "$CS" >/dev/null 2>&1
Manuel Pégourié-Gonnardc57e98b2014-02-19 17:37:55 +0100557 ;;
Manuel Pégourié-Gonnard911622d2014-02-27 11:50:40 +0100558 *)
559 kill $PROCESS_ID 2>/dev/null
Manuel Pégourié-Gonnardc57e98b2014-02-19 17:37:55 +0100560 esac
561
Manuel Pégourié-Gonnard95957712014-02-19 15:29:38 +0100562 wait $PROCESS_ID 2>/dev/null
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +0100563
564 if [ "$MEMCHECK" -gt 0 ]; then
565 if is_polar "$SERVER_CMD" && has_mem_err srv_out; then
566 echo " ! Server had memory errors"
567 let "srvmem++"
568 return
569 fi
570 fi
571
Manuel Pégourié-Gonnard87ae3032014-02-27 11:12:30 +0100572 rm -f srv_out
Manuel Pégourié-Gonnard95957712014-02-19 15:29:38 +0100573}
574
Manuel Pégourié-Gonnarda9062e92014-02-25 16:21:22 +0100575# kill the running server (used when killed by signal)
576cleanup() {
Manuel Pégourié-Gonnard87ae3032014-02-27 11:12:30 +0100577 rm -f srv_out cli_out
Manuel Pégourié-Gonnarda9062e92014-02-25 16:21:22 +0100578 kill $PROCESS_ID
579 exit 1
580}
581
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100582# run_client <name> <cipher>
583run_client() {
Manuel Pégourié-Gonnard87ae3032014-02-27 11:12:30 +0100584 # announce what we're going to do
585 let "tests++"
586 VERIF=$(echo $VERIFY | tr '[:upper:]' '[:lower:]')
587 TITLE="${1:0:1}->${SERVER_NAME:0:1} $MODE,$VERIF $2 "
588 echo -n "$TITLE"
589 LEN=`echo "$TITLE" | wc -c`
590 LEN=`echo 72 - $LEN | bc`
591 for i in `seq 1 $LEN`; do echo -n '.'; done; echo -n ' '
592
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100593 # run the command and interpret result
594 case $1 in
595 [Oo]pen*)
596 CLIENT_CMD="$OPENSSL s_client $O_CLIENT_ARGS -cipher $2"
597 log "$CLIENT_CMD"
Manuel Pégourié-Gonnard87ae3032014-02-27 11:12:30 +0100598 ( echo -e 'GET HTTP/1.0'; echo; ) | $CLIENT_CMD > cli_out 2>&1
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100599 EXIT=$?
600
601 if [ "$EXIT" == "0" ]; then
602 RESULT=0
603 else
Manuel Pégourié-Gonnard87ae3032014-02-27 11:12:30 +0100604 if grep 'Cipher is (NONE)' cli_out >/dev/null; then
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100605 RESULT=1
606 else
607 RESULT=2
608 fi
609 fi
610 ;;
611
612 [Pp]olar*)
Manuel Pégourié-Gonnardf7a26902014-02-27 12:25:54 +0100613 CLIENT_CMD="$P_CLI $P_CLIENT_ARGS force_ciphersuite=$2"
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +0100614 if [ "$MEMCHECK" -gt 0 ]; then
615 CLIENT_CMD="valgrind --leak-check=full $CLIENT_CMD"
616 fi
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100617 log "$CLIENT_CMD"
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +0100618 $CLIENT_CMD > cli_out 2>&1
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100619 EXIT=$?
620
621 case $EXIT in
622 "0") RESULT=0 ;;
623 "2") RESULT=1 ;;
624 *) RESULT=2 ;;
625 esac
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +0100626
627 if [ "$MEMCHECK" -gt 0 ]; then
628 if is_polar "$CLIENT_CMD" && has_mem_err cli_out; then
629 RESULT=2
630 fi
631 fi
632
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100633 ;;
634
635 *)
636 echo "error: invalid client name: $1" >&2
637 exit 1
638 ;;
639 esac
640
641 # report and count result
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100642 case $RESULT in
643 "0")
Manuel Pégourié-Gonnard4145b892014-02-24 13:20:14 +0100644 echo PASS
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100645 ;;
646 "1")
Manuel Pégourié-Gonnard4145b892014-02-24 13:20:14 +0100647 echo SKIP
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100648 let "skipped++"
649 ;;
650 "2")
Manuel Pégourié-Gonnard4145b892014-02-24 13:20:14 +0100651 echo FAIL
652 echo " ! $SERVER_CMD"
653 echo " ! $CLIENT_CMD"
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +0100654 cp srv_out c-srv-${tests}.log
655 cp cli_out c-cli-${tests}.log
656 echo " ! outputs saved to c-srv-${tests}.log, c-cli-${tests}.log"
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100657 let "failed++"
658 ;;
659 esac
Manuel Pégourié-Gonnard87ae3032014-02-27 11:12:30 +0100660
661 rm -f cli_out
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100662}
663
Manuel Pégourié-Gonnard9dea8bd2014-02-26 18:21:02 +0100664#
665# MAIN
666#
667
Manuel Pégourié-Gonnardf7a26902014-02-27 12:25:54 +0100668# sanity checks, avoid an avalanche of errors
669if [ ! -x "$P_SRV" ]; then
670 echo "Command '$P_SRV' is not an executable file"
671 exit 1
672fi
673if [ ! -x "$P_CLI" ]; then
674 echo "Command '$P_CLI' is not an executable file"
675 exit 1
676fi
677if which $OPENSSL >/dev/null 2>&1; then :; else
678 echo "Command '$OPENSSL' not found"
679 exit 1
680fi
681
Manuel Pégourié-Gonnard9dea8bd2014-02-26 18:21:02 +0100682get_options "$@"
683
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100684killall -q gnutls-serv openssl ssl_server ssl_server2
Manuel Pégourié-Gonnarda9062e92014-02-25 16:21:22 +0100685trap cleanup INT TERM HUP
686
Manuel Pégourié-Gonnard95957712014-02-19 15:29:38 +0100687for VERIFY in $VERIFIES; do
688 for MODE in $MODES; do
Manuel Pégourié-Gonnard95957712014-02-19 15:29:38 +0100689 for TYPE in $TYPES; do
Paul Bakker7e5e7ca2013-04-17 19:27:58 +0200690
Manuel Pégourié-Gonnard95957712014-02-19 15:29:38 +0100691 setup_arguments
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100692
693 reset_ciphersuites
694 add_openssl_ciphersuites
695 filter_ciphersuites
Manuel Pégourié-Gonnardd3313192013-09-13 19:20:37 +0200696
Manuel Pégourié-Gonnard42d195a2014-02-27 11:11:33 +0100697 if [ "X" != "X$P_CIPHERS" ]; then
698 start_server "OpenSSL"
699 for i in $P_CIPHERS; do
700 run_client PolarSSL $i
701 done
702 stop_server
703 fi
Paul Bakker398cb512012-04-10 08:22:31 +0000704
Manuel Pégourié-Gonnard42d195a2014-02-27 11:11:33 +0100705 if [ "X" != "X$O_CIPHERS" ]; then
706 start_server "PolarSSL"
707 for i in $O_CIPHERS; do
708 run_client OpenSSL $i
709 done
710 stop_server
711 fi
Manuel Pégourié-Gonnard330e4112014-02-19 15:23:21 +0100712
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100713 reset_ciphersuites
714 add_gnutls_ciphersuites
715 filter_ciphersuites
716
717 if [ "X" != "X$P_CIPHERS" ]; then
718 start_server "GnuTLS"
719 for i in $P_CIPHERS; do
720 run_client PolarSSL $i
721 done
722 stop_server
723 fi
724
725 if [ "X" != "X$G_CIPHERS" ]; then
726 start_server "PolarSSL"
727 for i in $G_CIPHERS; do
728 run_client GnuTLS $i
729 done
730 stop_server
731 fi
732
733 reset_ciphersuites
734 add_openssl_ciphersuites
735 add_gnutls_ciphersuites
Manuel Pégourié-Gonnard95957712014-02-19 15:29:38 +0100736 add_polarssl_ciphersuites
Manuel Pégourié-Gonnard5b2d7762014-02-28 12:42:57 +0100737 filter_ciphersuites
Paul Bakkerfab5c822012-02-06 16:45:10 +0000738
Manuel Pégourié-Gonnard42d195a2014-02-27 11:11:33 +0100739 if [ "X" != "X$P_CIPHERS" ]; then
740 start_server "PolarSSL"
741 for i in $P_CIPHERS; do
742 run_client PolarSSL $i
743 done
744 stop_server
745 fi
Paul Bakkerfab5c822012-02-06 16:45:10 +0000746
Manuel Pégourié-Gonnard95957712014-02-19 15:29:38 +0100747 done
748 done
Manuel Pégourié-Gonnard9791a402013-08-27 19:57:15 +0200749done
Manuel Pégourié-Gonnard70064fd2013-08-27 22:00:47 +0200750
Manuel Pégourié-Gonnard4145b892014-02-24 13:20:14 +0100751echo "------------------------------------------------------------------------"
Manuel Pégourié-Gonnard70064fd2013-08-27 22:00:47 +0200752
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +0100753if (( failed != 0 && srvmem != 0 ));
Manuel Pégourié-Gonnard70064fd2013-08-27 22:00:47 +0200754then
755 echo -n "FAILED"
756else
757 echo -n "PASSED"
758fi
759
760let "passed = tests - failed"
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +0100761echo " ($passed / $tests tests ($skipped skipped, $srvmem server memory errors)"
Manuel Pégourié-Gonnard70064fd2013-08-27 22:00:47 +0200762
Manuel Pégourié-Gonnard3eec6042014-02-27 15:37:24 +0100763let "failed += srvmem"
Manuel Pégourié-Gonnard70064fd2013-08-27 22:00:47 +0200764exit $failed