compat.sh 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247
  1. #!/bin/sh
  2. # compat.sh
  3. #
  4. # This file is part of mbed TLS (https://tls.mbed.org)
  5. #
  6. # Copyright (c) 2012-2016, ARM Limited, All Rights Reserved
  7. #
  8. # Purpose
  9. #
  10. # Test interoperbility with OpenSSL, GnuTLS as well as itself.
  11. #
  12. # Check each common ciphersuite, with each version, both ways (client/server),
  13. # with and without client authentication.
  14. set -u
  15. # initialise counters
  16. TESTS=0
  17. FAILED=0
  18. SKIPPED=0
  19. SRVMEM=0
  20. # default commands, can be overriden by the environment
  21. : ${M_SRV:=../programs/ssl/ssl_server2}
  22. : ${M_CLI:=../programs/ssl/ssl_client2}
  23. : ${OPENSSL_CMD:=openssl} # OPENSSL would conflict with the build system
  24. : ${GNUTLS_CLI:=gnutls-cli}
  25. : ${GNUTLS_SERV:=gnutls-serv}
  26. # do we have a recent enough GnuTLS?
  27. if ( which $GNUTLS_CLI && which $GNUTLS_SERV ) >/dev/null 2>&1; then
  28. G_VER="$( $GNUTLS_CLI --version | head -n1 )"
  29. if echo "$G_VER" | grep '@VERSION@' > /dev/null; then # git version
  30. PEER_GNUTLS=" GnuTLS"
  31. else
  32. eval $( echo $G_VER | sed 's/.* \([0-9]*\)\.\([0-9]\)*\.\([0-9]*\)$/MAJOR="\1" MINOR="\2" PATCH="\3"/' )
  33. if [ $MAJOR -lt 3 -o \
  34. \( $MAJOR -eq 3 -a $MINOR -lt 2 \) -o \
  35. \( $MAJOR -eq 3 -a $MINOR -eq 2 -a $PATCH -lt 15 \) ]
  36. then
  37. PEER_GNUTLS=""
  38. else
  39. PEER_GNUTLS=" GnuTLS"
  40. fi
  41. fi
  42. else
  43. PEER_GNUTLS=""
  44. fi
  45. # default values for options
  46. MODES="tls1 tls1_1 tls1_2 dtls1 dtls1_2"
  47. VERIFIES="NO YES"
  48. TYPES="ECDSA RSA PSK"
  49. FILTER=""
  50. EXCLUDE='NULL\|DES-CBC-\|RC4\|ARCFOUR' # avoid plain DES but keep 3DES-EDE-CBC (mbedTLS), DES-CBC3 (OpenSSL)
  51. VERBOSE=""
  52. MEMCHECK=0
  53. PEERS="OpenSSL$PEER_GNUTLS mbedTLS"
  54. # hidden option: skip DTLS with OpenSSL
  55. # (travis CI has a version that doesn't work for us)
  56. : ${OSSL_NO_DTLS:=0}
  57. print_usage() {
  58. echo "Usage: $0"
  59. printf " -h|--help\tPrint this help.\n"
  60. printf " -f|--filter\tOnly matching ciphersuites are tested (Default: '$FILTER')\n"
  61. printf " -e|--exclude\tMatching ciphersuites are excluded (Default: '$EXCLUDE')\n"
  62. printf " -m|--modes\tWhich modes to perform (Default: '$MODES')\n"
  63. printf " -t|--types\tWhich key exchange type to perform (Default: '$TYPES')\n"
  64. printf " -V|--verify\tWhich verification modes to perform (Default: '$VERIFIES')\n"
  65. printf " -p|--peers\tWhich peers to use (Default: '$PEERS')\n"
  66. printf " \tAlso available: GnuTLS (needs v3.2.15 or higher)\n"
  67. printf " -M|--memcheck\tCheck memory leaks and errors.\n"
  68. printf " -v|--verbose\tSet verbose output.\n"
  69. }
  70. get_options() {
  71. while [ $# -gt 0 ]; do
  72. case "$1" in
  73. -f|--filter)
  74. shift; FILTER=$1
  75. ;;
  76. -e|--exclude)
  77. shift; EXCLUDE=$1
  78. ;;
  79. -m|--modes)
  80. shift; MODES=$1
  81. ;;
  82. -t|--types)
  83. shift; TYPES=$1
  84. ;;
  85. -V|--verify)
  86. shift; VERIFIES=$1
  87. ;;
  88. -p|--peers)
  89. shift; PEERS=$1
  90. ;;
  91. -v|--verbose)
  92. VERBOSE=1
  93. ;;
  94. -M|--memcheck)
  95. MEMCHECK=1
  96. ;;
  97. -h|--help)
  98. print_usage
  99. exit 0
  100. ;;
  101. *)
  102. echo "Unknown argument: '$1'"
  103. print_usage
  104. exit 1
  105. ;;
  106. esac
  107. shift
  108. done
  109. # sanitize some options (modes checked later)
  110. VERIFIES="$( echo $VERIFIES | tr [a-z] [A-Z] )"
  111. TYPES="$( echo $TYPES | tr [a-z] [A-Z] )"
  112. }
  113. log() {
  114. if [ "X" != "X$VERBOSE" ]; then
  115. echo ""
  116. echo "$@"
  117. fi
  118. }
  119. # is_dtls <mode>
  120. is_dtls()
  121. {
  122. test "$1" = "dtls1" -o "$1" = "dtls1_2"
  123. }
  124. # minor_ver <mode>
  125. minor_ver()
  126. {
  127. case "$1" in
  128. ssl3)
  129. echo 0
  130. ;;
  131. tls1)
  132. echo 1
  133. ;;
  134. tls1_1|dtls1)
  135. echo 2
  136. ;;
  137. tls1_2|dtls1_2)
  138. echo 3
  139. ;;
  140. *)
  141. echo "error: invalid mode: $MODE" >&2
  142. # exiting is no good here, typically called in a subshell
  143. echo -1
  144. esac
  145. }
  146. filter()
  147. {
  148. LIST="$1"
  149. NEW_LIST=""
  150. if is_dtls "$MODE"; then
  151. EXCLMODE="$EXCLUDE"'\|RC4\|ARCFOUR'
  152. else
  153. EXCLMODE="$EXCLUDE"
  154. fi
  155. for i in $LIST;
  156. do
  157. NEW_LIST="$NEW_LIST $( echo "$i" | grep "$FILTER" | grep -v "$EXCLMODE" )"
  158. done
  159. # normalize whitespace
  160. echo "$NEW_LIST" | sed -e 's/[[:space:]][[:space:]]*/ /g' -e 's/^ //' -e 's/ $//'
  161. }
  162. # OpenSSL 1.0.1h with -Verify wants a ClientCertificate message even for
  163. # PSK ciphersuites with DTLS, which is incorrect, so disable them for now
  164. check_openssl_server_bug()
  165. {
  166. if test "X$VERIFY" = "XYES" && is_dtls "$MODE" && \
  167. echo "$1" | grep "^TLS-PSK" >/dev/null;
  168. then
  169. SKIP_NEXT="YES"
  170. fi
  171. }
  172. filter_ciphersuites()
  173. {
  174. if [ "X" != "X$FILTER" -o "X" != "X$EXCLUDE" ];
  175. then
  176. # Ciphersuite for mbed TLS
  177. M_CIPHERS=$( filter "$M_CIPHERS" )
  178. # Ciphersuite for OpenSSL
  179. O_CIPHERS=$( filter "$O_CIPHERS" )
  180. # Ciphersuite for GnuTLS
  181. G_CIPHERS=$( filter "$G_CIPHERS" )
  182. fi
  183. # OpenSSL 1.0.1h doesn't support DTLS 1.2
  184. if [ `minor_ver "$MODE"` -ge 3 ] && is_dtls "$MODE"; then
  185. O_CIPHERS=""
  186. case "$PEER" in
  187. [Oo]pen*)
  188. M_CIPHERS=""
  189. ;;
  190. esac
  191. fi
  192. # For GnuTLS client -> mbed TLS server,
  193. # we need to force IPv4 by connecting to 127.0.0.1 but then auth fails
  194. if [ "X$VERIFY" = "XYES" ] && is_dtls "$MODE"; then
  195. G_CIPHERS=""
  196. fi
  197. }
  198. reset_ciphersuites()
  199. {
  200. M_CIPHERS=""
  201. O_CIPHERS=""
  202. G_CIPHERS=""
  203. }
  204. add_common_ciphersuites()
  205. {
  206. case $TYPE in
  207. "ECDSA")
  208. if [ `minor_ver "$MODE"` -gt 0 ]
  209. then
  210. M_CIPHERS="$M_CIPHERS \
  211. TLS-ECDHE-ECDSA-WITH-NULL-SHA \
  212. TLS-ECDHE-ECDSA-WITH-RC4-128-SHA \
  213. TLS-ECDHE-ECDSA-WITH-3DES-EDE-CBC-SHA \
  214. TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA \
  215. TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA \
  216. "
  217. G_CIPHERS="$G_CIPHERS \
  218. +ECDHE-ECDSA:+NULL:+SHA1 \
  219. +ECDHE-ECDSA:+ARCFOUR-128:+SHA1 \
  220. +ECDHE-ECDSA:+3DES-CBC:+SHA1 \
  221. +ECDHE-ECDSA:+AES-128-CBC:+SHA1 \
  222. +ECDHE-ECDSA:+AES-256-CBC:+SHA1 \
  223. "
  224. O_CIPHERS="$O_CIPHERS \
  225. ECDHE-ECDSA-NULL-SHA \
  226. ECDHE-ECDSA-RC4-SHA \
  227. ECDHE-ECDSA-DES-CBC3-SHA \
  228. ECDHE-ECDSA-AES128-SHA \
  229. ECDHE-ECDSA-AES256-SHA \
  230. "
  231. fi
  232. if [ `minor_ver "$MODE"` -ge 3 ]
  233. then
  234. M_CIPHERS="$M_CIPHERS \
  235. TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256 \
  236. TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384 \
  237. TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256 \
  238. TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384 \
  239. "
  240. G_CIPHERS="$G_CIPHERS \
  241. +ECDHE-ECDSA:+AES-128-CBC:+SHA256 \
  242. +ECDHE-ECDSA:+AES-256-CBC:+SHA384 \
  243. +ECDHE-ECDSA:+AES-128-GCM:+AEAD \
  244. +ECDHE-ECDSA:+AES-256-GCM:+AEAD \
  245. "
  246. O_CIPHERS="$O_CIPHERS \
  247. ECDHE-ECDSA-AES128-SHA256 \
  248. ECDHE-ECDSA-AES256-SHA384 \
  249. ECDHE-ECDSA-AES128-GCM-SHA256 \
  250. ECDHE-ECDSA-AES256-GCM-SHA384 \
  251. "
  252. fi
  253. ;;
  254. "RSA")
  255. M_CIPHERS="$M_CIPHERS \
  256. TLS-DHE-RSA-WITH-AES-128-CBC-SHA \
  257. TLS-DHE-RSA-WITH-AES-256-CBC-SHA \
  258. TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA \
  259. TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA \
  260. TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA \
  261. TLS-RSA-WITH-AES-256-CBC-SHA \
  262. TLS-RSA-WITH-CAMELLIA-256-CBC-SHA \
  263. TLS-RSA-WITH-AES-128-CBC-SHA \
  264. TLS-RSA-WITH-CAMELLIA-128-CBC-SHA \
  265. TLS-RSA-WITH-3DES-EDE-CBC-SHA \
  266. TLS-RSA-WITH-RC4-128-SHA \
  267. TLS-RSA-WITH-RC4-128-MD5 \
  268. TLS-RSA-WITH-NULL-MD5 \
  269. TLS-RSA-WITH-NULL-SHA \
  270. "
  271. G_CIPHERS="$G_CIPHERS \
  272. +DHE-RSA:+AES-128-CBC:+SHA1 \
  273. +DHE-RSA:+AES-256-CBC:+SHA1 \
  274. +DHE-RSA:+CAMELLIA-128-CBC:+SHA1 \
  275. +DHE-RSA:+CAMELLIA-256-CBC:+SHA1 \
  276. +DHE-RSA:+3DES-CBC:+SHA1 \
  277. +RSA:+AES-256-CBC:+SHA1 \
  278. +RSA:+CAMELLIA-256-CBC:+SHA1 \
  279. +RSA:+AES-128-CBC:+SHA1 \
  280. +RSA:+CAMELLIA-128-CBC:+SHA1 \
  281. +RSA:+3DES-CBC:+SHA1 \
  282. +RSA:+ARCFOUR-128:+SHA1 \
  283. +RSA:+ARCFOUR-128:+MD5 \
  284. +RSA:+NULL:+MD5 \
  285. +RSA:+NULL:+SHA1 \
  286. "
  287. O_CIPHERS="$O_CIPHERS \
  288. DHE-RSA-AES128-SHA \
  289. DHE-RSA-AES256-SHA \
  290. DHE-RSA-CAMELLIA128-SHA \
  291. DHE-RSA-CAMELLIA256-SHA \
  292. EDH-RSA-DES-CBC3-SHA \
  293. AES256-SHA \
  294. CAMELLIA256-SHA \
  295. AES128-SHA \
  296. CAMELLIA128-SHA \
  297. DES-CBC3-SHA \
  298. RC4-SHA \
  299. RC4-MD5 \
  300. NULL-MD5 \
  301. NULL-SHA \
  302. "
  303. if [ `minor_ver "$MODE"` -gt 0 ]
  304. then
  305. M_CIPHERS="$M_CIPHERS \
  306. TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA \
  307. TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA \
  308. TLS-ECDHE-RSA-WITH-3DES-EDE-CBC-SHA \
  309. TLS-ECDHE-RSA-WITH-RC4-128-SHA \
  310. TLS-ECDHE-RSA-WITH-NULL-SHA \
  311. "
  312. G_CIPHERS="$G_CIPHERS \
  313. +ECDHE-RSA:+AES-128-CBC:+SHA1 \
  314. +ECDHE-RSA:+AES-256-CBC:+SHA1 \
  315. +ECDHE-RSA:+3DES-CBC:+SHA1 \
  316. +ECDHE-RSA:+ARCFOUR-128:+SHA1 \
  317. +ECDHE-RSA:+NULL:+SHA1 \
  318. "
  319. O_CIPHERS="$O_CIPHERS \
  320. ECDHE-RSA-AES256-SHA \
  321. ECDHE-RSA-AES128-SHA \
  322. ECDHE-RSA-DES-CBC3-SHA \
  323. ECDHE-RSA-RC4-SHA \
  324. ECDHE-RSA-NULL-SHA \
  325. "
  326. fi
  327. if [ `minor_ver "$MODE"` -ge 3 ]
  328. then
  329. M_CIPHERS="$M_CIPHERS \
  330. TLS-RSA-WITH-AES-128-CBC-SHA256 \
  331. TLS-DHE-RSA-WITH-AES-128-CBC-SHA256 \
  332. TLS-RSA-WITH-AES-256-CBC-SHA256 \
  333. TLS-DHE-RSA-WITH-AES-256-CBC-SHA256 \
  334. TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256 \
  335. TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384 \
  336. TLS-RSA-WITH-AES-128-GCM-SHA256 \
  337. TLS-RSA-WITH-AES-256-GCM-SHA384 \
  338. TLS-DHE-RSA-WITH-AES-128-GCM-SHA256 \
  339. TLS-DHE-RSA-WITH-AES-256-GCM-SHA384 \
  340. TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256 \
  341. TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384 \
  342. "
  343. G_CIPHERS="$G_CIPHERS \
  344. +RSA:+AES-128-CBC:+SHA256 \
  345. +DHE-RSA:+AES-128-CBC:+SHA256 \
  346. +RSA:+AES-256-CBC:+SHA256 \
  347. +DHE-RSA:+AES-256-CBC:+SHA256 \
  348. +ECDHE-RSA:+AES-128-CBC:+SHA256 \
  349. +ECDHE-RSA:+AES-256-CBC:+SHA384 \
  350. +RSA:+AES-128-GCM:+AEAD \
  351. +RSA:+AES-256-GCM:+AEAD \
  352. +DHE-RSA:+AES-128-GCM:+AEAD \
  353. +DHE-RSA:+AES-256-GCM:+AEAD \
  354. +ECDHE-RSA:+AES-128-GCM:+AEAD \
  355. +ECDHE-RSA:+AES-256-GCM:+AEAD \
  356. "
  357. O_CIPHERS="$O_CIPHERS \
  358. NULL-SHA256 \
  359. AES128-SHA256 \
  360. DHE-RSA-AES128-SHA256 \
  361. AES256-SHA256 \
  362. DHE-RSA-AES256-SHA256 \
  363. ECDHE-RSA-AES128-SHA256 \
  364. ECDHE-RSA-AES256-SHA384 \
  365. AES128-GCM-SHA256 \
  366. DHE-RSA-AES128-GCM-SHA256 \
  367. AES256-GCM-SHA384 \
  368. DHE-RSA-AES256-GCM-SHA384 \
  369. ECDHE-RSA-AES128-GCM-SHA256 \
  370. ECDHE-RSA-AES256-GCM-SHA384 \
  371. "
  372. fi
  373. ;;
  374. "PSK")
  375. M_CIPHERS="$M_CIPHERS \
  376. TLS-PSK-WITH-RC4-128-SHA \
  377. TLS-PSK-WITH-3DES-EDE-CBC-SHA \
  378. TLS-PSK-WITH-AES-128-CBC-SHA \
  379. TLS-PSK-WITH-AES-256-CBC-SHA \
  380. "
  381. G_CIPHERS="$G_CIPHERS \
  382. +PSK:+ARCFOUR-128:+SHA1 \
  383. +PSK:+3DES-CBC:+SHA1 \
  384. +PSK:+AES-128-CBC:+SHA1 \
  385. +PSK:+AES-256-CBC:+SHA1 \
  386. "
  387. O_CIPHERS="$O_CIPHERS \
  388. PSK-RC4-SHA \
  389. PSK-3DES-EDE-CBC-SHA \
  390. PSK-AES128-CBC-SHA \
  391. PSK-AES256-CBC-SHA \
  392. "
  393. ;;
  394. esac
  395. }
  396. add_openssl_ciphersuites()
  397. {
  398. case $TYPE in
  399. "ECDSA")
  400. if [ `minor_ver "$MODE"` -gt 0 ]
  401. then
  402. M_CIPHERS="$M_CIPHERS \
  403. TLS-ECDH-ECDSA-WITH-NULL-SHA \
  404. TLS-ECDH-ECDSA-WITH-RC4-128-SHA \
  405. TLS-ECDH-ECDSA-WITH-3DES-EDE-CBC-SHA \
  406. TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA \
  407. TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA \
  408. "
  409. O_CIPHERS="$O_CIPHERS \
  410. ECDH-ECDSA-NULL-SHA \
  411. ECDH-ECDSA-RC4-SHA \
  412. ECDH-ECDSA-DES-CBC3-SHA \
  413. ECDH-ECDSA-AES128-SHA \
  414. ECDH-ECDSA-AES256-SHA \
  415. "
  416. fi
  417. if [ `minor_ver "$MODE"` -ge 3 ]
  418. then
  419. M_CIPHERS="$M_CIPHERS \
  420. TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA256 \
  421. TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA384 \
  422. TLS-ECDH-ECDSA-WITH-AES-128-GCM-SHA256 \
  423. TLS-ECDH-ECDSA-WITH-AES-256-GCM-SHA384 \
  424. "
  425. O_CIPHERS="$O_CIPHERS \
  426. ECDH-ECDSA-AES128-SHA256 \
  427. ECDH-ECDSA-AES256-SHA384 \
  428. ECDH-ECDSA-AES128-GCM-SHA256 \
  429. ECDH-ECDSA-AES256-GCM-SHA384 \
  430. "
  431. fi
  432. ;;
  433. "RSA")
  434. M_CIPHERS="$M_CIPHERS \
  435. TLS-RSA-WITH-DES-CBC-SHA \
  436. TLS-DHE-RSA-WITH-DES-CBC-SHA \
  437. "
  438. O_CIPHERS="$O_CIPHERS \
  439. DES-CBC-SHA \
  440. EDH-RSA-DES-CBC-SHA \
  441. "
  442. ;;
  443. "PSK")
  444. ;;
  445. esac
  446. }
  447. add_gnutls_ciphersuites()
  448. {
  449. case $TYPE in
  450. "ECDSA")
  451. if [ `minor_ver "$MODE"` -ge 3 ]
  452. then
  453. M_CIPHERS="$M_CIPHERS \
  454. TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-CBC-SHA256 \
  455. TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-CBC-SHA384 \
  456. TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-GCM-SHA256 \
  457. TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-GCM-SHA384 \
  458. "
  459. G_CIPHERS="$G_CIPHERS \
  460. +ECDHE-ECDSA:+CAMELLIA-128-CBC:+SHA256 \
  461. +ECDHE-ECDSA:+CAMELLIA-256-CBC:+SHA384 \
  462. +ECDHE-ECDSA:+CAMELLIA-128-GCM:+AEAD \
  463. +ECDHE-ECDSA:+CAMELLIA-256-GCM:+AEAD \
  464. "
  465. fi
  466. ;;
  467. "RSA")
  468. if [ `minor_ver "$MODE"` -gt 0 ]
  469. then
  470. M_CIPHERS="$M_CIPHERS \
  471. TLS-RSA-WITH-NULL-SHA256 \
  472. "
  473. G_CIPHERS="$G_CIPHERS \
  474. +RSA:+NULL:+SHA256 \
  475. "
  476. fi
  477. if [ `minor_ver "$MODE"` -ge 3 ]
  478. then
  479. M_CIPHERS="$M_CIPHERS \
  480. TLS-ECDHE-RSA-WITH-CAMELLIA-128-CBC-SHA256 \
  481. TLS-ECDHE-RSA-WITH-CAMELLIA-256-CBC-SHA384 \
  482. TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256 \
  483. TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256 \
  484. TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256 \
  485. TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256 \
  486. TLS-ECDHE-RSA-WITH-CAMELLIA-128-GCM-SHA256 \
  487. TLS-ECDHE-RSA-WITH-CAMELLIA-256-GCM-SHA384 \
  488. TLS-DHE-RSA-WITH-CAMELLIA-128-GCM-SHA256 \
  489. TLS-DHE-RSA-WITH-CAMELLIA-256-GCM-SHA384 \
  490. TLS-RSA-WITH-CAMELLIA-128-GCM-SHA256 \
  491. TLS-RSA-WITH-CAMELLIA-256-GCM-SHA384 \
  492. "
  493. G_CIPHERS="$G_CIPHERS \
  494. +ECDHE-RSA:+CAMELLIA-128-CBC:+SHA256 \
  495. +ECDHE-RSA:+CAMELLIA-256-CBC:+SHA384 \
  496. +RSA:+CAMELLIA-128-CBC:+SHA256 \
  497. +RSA:+CAMELLIA-256-CBC:+SHA256 \
  498. +DHE-RSA:+CAMELLIA-128-CBC:+SHA256 \
  499. +DHE-RSA:+CAMELLIA-256-CBC:+SHA256 \
  500. +ECDHE-RSA:+CAMELLIA-128-GCM:+AEAD \
  501. +ECDHE-RSA:+CAMELLIA-256-GCM:+AEAD \
  502. +DHE-RSA:+CAMELLIA-128-GCM:+AEAD \
  503. +DHE-RSA:+CAMELLIA-256-GCM:+AEAD \
  504. +RSA:+CAMELLIA-128-GCM:+AEAD \
  505. +RSA:+CAMELLIA-256-GCM:+AEAD \
  506. "
  507. fi
  508. ;;
  509. "PSK")
  510. M_CIPHERS="$M_CIPHERS \
  511. TLS-DHE-PSK-WITH-3DES-EDE-CBC-SHA \
  512. TLS-DHE-PSK-WITH-AES-128-CBC-SHA \
  513. TLS-DHE-PSK-WITH-AES-256-CBC-SHA \
  514. TLS-DHE-PSK-WITH-RC4-128-SHA \
  515. "
  516. G_CIPHERS="$G_CIPHERS \
  517. +DHE-PSK:+3DES-CBC:+SHA1 \
  518. +DHE-PSK:+AES-128-CBC:+SHA1 \
  519. +DHE-PSK:+AES-256-CBC:+SHA1 \
  520. +DHE-PSK:+ARCFOUR-128:+SHA1 \
  521. "
  522. if [ `minor_ver "$MODE"` -gt 0 ]
  523. then
  524. M_CIPHERS="$M_CIPHERS \
  525. TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA \
  526. TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA \
  527. TLS-ECDHE-PSK-WITH-3DES-EDE-CBC-SHA \
  528. TLS-ECDHE-PSK-WITH-RC4-128-SHA \
  529. TLS-RSA-PSK-WITH-3DES-EDE-CBC-SHA \
  530. TLS-RSA-PSK-WITH-AES-256-CBC-SHA \
  531. TLS-RSA-PSK-WITH-AES-128-CBC-SHA \
  532. TLS-RSA-PSK-WITH-RC4-128-SHA \
  533. "
  534. G_CIPHERS="$G_CIPHERS \
  535. +ECDHE-PSK:+3DES-CBC:+SHA1 \
  536. +ECDHE-PSK:+AES-128-CBC:+SHA1 \
  537. +ECDHE-PSK:+AES-256-CBC:+SHA1 \
  538. +ECDHE-PSK:+ARCFOUR-128:+SHA1 \
  539. +RSA-PSK:+3DES-CBC:+SHA1 \
  540. +RSA-PSK:+AES-256-CBC:+SHA1 \
  541. +RSA-PSK:+AES-128-CBC:+SHA1 \
  542. +RSA-PSK:+ARCFOUR-128:+SHA1 \
  543. "
  544. fi
  545. if [ `minor_ver "$MODE"` -ge 3 ]
  546. then
  547. M_CIPHERS="$M_CIPHERS \
  548. TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA384 \
  549. TLS-ECDHE-PSK-WITH-CAMELLIA-256-CBC-SHA384 \
  550. TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256 \
  551. TLS-ECDHE-PSK-WITH-CAMELLIA-128-CBC-SHA256 \
  552. TLS-ECDHE-PSK-WITH-NULL-SHA384 \
  553. TLS-ECDHE-PSK-WITH-NULL-SHA256 \
  554. TLS-PSK-WITH-AES-128-CBC-SHA256 \
  555. TLS-PSK-WITH-AES-256-CBC-SHA384 \
  556. TLS-DHE-PSK-WITH-AES-128-CBC-SHA256 \
  557. TLS-DHE-PSK-WITH-AES-256-CBC-SHA384 \
  558. TLS-PSK-WITH-NULL-SHA256 \
  559. TLS-PSK-WITH-NULL-SHA384 \
  560. TLS-DHE-PSK-WITH-NULL-SHA256 \
  561. TLS-DHE-PSK-WITH-NULL-SHA384 \
  562. TLS-RSA-PSK-WITH-AES-256-CBC-SHA384 \
  563. TLS-RSA-PSK-WITH-AES-128-CBC-SHA256 \
  564. TLS-RSA-PSK-WITH-NULL-SHA256 \
  565. TLS-RSA-PSK-WITH-NULL-SHA384 \
  566. TLS-DHE-PSK-WITH-CAMELLIA-128-CBC-SHA256 \
  567. TLS-DHE-PSK-WITH-CAMELLIA-256-CBC-SHA384 \
  568. TLS-PSK-WITH-CAMELLIA-128-CBC-SHA256 \
  569. TLS-PSK-WITH-CAMELLIA-256-CBC-SHA384 \
  570. TLS-RSA-PSK-WITH-CAMELLIA-256-CBC-SHA384 \
  571. TLS-RSA-PSK-WITH-CAMELLIA-128-CBC-SHA256 \
  572. TLS-PSK-WITH-AES-128-GCM-SHA256 \
  573. TLS-PSK-WITH-AES-256-GCM-SHA384 \
  574. TLS-DHE-PSK-WITH-AES-128-GCM-SHA256 \
  575. TLS-DHE-PSK-WITH-AES-256-GCM-SHA384 \
  576. TLS-RSA-PSK-WITH-CAMELLIA-128-GCM-SHA256 \
  577. TLS-RSA-PSK-WITH-CAMELLIA-256-GCM-SHA384 \
  578. TLS-PSK-WITH-CAMELLIA-128-GCM-SHA256 \
  579. TLS-PSK-WITH-CAMELLIA-256-GCM-SHA384 \
  580. TLS-DHE-PSK-WITH-CAMELLIA-128-GCM-SHA256 \
  581. TLS-DHE-PSK-WITH-CAMELLIA-256-GCM-SHA384 \
  582. TLS-RSA-PSK-WITH-AES-256-GCM-SHA384 \
  583. TLS-RSA-PSK-WITH-AES-128-GCM-SHA256 \
  584. "
  585. G_CIPHERS="$G_CIPHERS \
  586. +ECDHE-PSK:+AES-256-CBC:+SHA384 \
  587. +ECDHE-PSK:+CAMELLIA-256-CBC:+SHA384 \
  588. +ECDHE-PSK:+AES-128-CBC:+SHA256 \
  589. +ECDHE-PSK:+CAMELLIA-128-CBC:+SHA256 \
  590. +PSK:+AES-128-CBC:+SHA256 \
  591. +PSK:+AES-256-CBC:+SHA384 \
  592. +DHE-PSK:+AES-128-CBC:+SHA256 \
  593. +DHE-PSK:+AES-256-CBC:+SHA384 \
  594. +RSA-PSK:+AES-256-CBC:+SHA384 \
  595. +RSA-PSK:+AES-128-CBC:+SHA256 \
  596. +DHE-PSK:+CAMELLIA-128-CBC:+SHA256 \
  597. +DHE-PSK:+CAMELLIA-256-CBC:+SHA384 \
  598. +PSK:+CAMELLIA-128-CBC:+SHA256 \
  599. +PSK:+CAMELLIA-256-CBC:+SHA384 \
  600. +RSA-PSK:+CAMELLIA-256-CBC:+SHA384 \
  601. +RSA-PSK:+CAMELLIA-128-CBC:+SHA256 \
  602. +PSK:+AES-128-GCM:+AEAD \
  603. +PSK:+AES-256-GCM:+AEAD \
  604. +DHE-PSK:+AES-128-GCM:+AEAD \
  605. +DHE-PSK:+AES-256-GCM:+AEAD \
  606. +RSA-PSK:+CAMELLIA-128-GCM:+AEAD \
  607. +RSA-PSK:+CAMELLIA-256-GCM:+AEAD \
  608. +PSK:+CAMELLIA-128-GCM:+AEAD \
  609. +PSK:+CAMELLIA-256-GCM:+AEAD \
  610. +DHE-PSK:+CAMELLIA-128-GCM:+AEAD \
  611. +DHE-PSK:+CAMELLIA-256-GCM:+AEAD \
  612. +RSA-PSK:+AES-256-GCM:+AEAD \
  613. +RSA-PSK:+AES-128-GCM:+AEAD \
  614. +ECDHE-PSK:+NULL:+SHA384 \
  615. +ECDHE-PSK:+NULL:+SHA256 \
  616. +PSK:+NULL:+SHA256 \
  617. +PSK:+NULL:+SHA384 \
  618. +DHE-PSK:+NULL:+SHA256 \
  619. +DHE-PSK:+NULL:+SHA384 \
  620. +RSA-PSK:+NULL:+SHA256 \
  621. +RSA-PSK:+NULL:+SHA384 \
  622. "
  623. fi
  624. ;;
  625. esac
  626. }
  627. add_mbedtls_ciphersuites()
  628. {
  629. case $TYPE in
  630. "ECDSA")
  631. if [ `minor_ver "$MODE"` -gt 0 ]
  632. then
  633. M_CIPHERS="$M_CIPHERS \
  634. TLS-ECDH-ECDSA-WITH-CAMELLIA-128-CBC-SHA256 \
  635. TLS-ECDH-ECDSA-WITH-CAMELLIA-256-CBC-SHA384 \
  636. "
  637. fi
  638. if [ `minor_ver "$MODE"` -ge 3 ]
  639. then
  640. M_CIPHERS="$M_CIPHERS \
  641. TLS-ECDH-ECDSA-WITH-CAMELLIA-128-GCM-SHA256 \
  642. TLS-ECDH-ECDSA-WITH-CAMELLIA-256-GCM-SHA384 \
  643. TLS-ECDHE-ECDSA-WITH-AES-128-CCM \
  644. TLS-ECDHE-ECDSA-WITH-AES-256-CCM \
  645. TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8 \
  646. TLS-ECDHE-ECDSA-WITH-AES-256-CCM-8 \
  647. "
  648. fi
  649. ;;
  650. "RSA")
  651. if [ "$MODE" = "tls1_2" ];
  652. then
  653. M_CIPHERS="$M_CIPHERS \
  654. TLS-RSA-WITH-AES-128-CCM \
  655. TLS-RSA-WITH-AES-256-CCM \
  656. TLS-DHE-RSA-WITH-AES-128-CCM \
  657. TLS-DHE-RSA-WITH-AES-256-CCM \
  658. TLS-RSA-WITH-AES-128-CCM-8 \
  659. TLS-RSA-WITH-AES-256-CCM-8 \
  660. TLS-DHE-RSA-WITH-AES-128-CCM-8 \
  661. TLS-DHE-RSA-WITH-AES-256-CCM-8 \
  662. "
  663. fi
  664. ;;
  665. "PSK")
  666. # *PSK-NULL-SHA suites supported by GnuTLS 3.3.5 but not 3.2.15
  667. M_CIPHERS="$M_CIPHERS \
  668. TLS-PSK-WITH-NULL-SHA \
  669. TLS-DHE-PSK-WITH-NULL-SHA \
  670. "
  671. if [ `minor_ver "$MODE"` -gt 0 ]
  672. then
  673. M_CIPHERS="$M_CIPHERS \
  674. TLS-ECDHE-PSK-WITH-NULL-SHA \
  675. TLS-RSA-PSK-WITH-NULL-SHA \
  676. "
  677. fi
  678. if [ "$MODE" = "tls1_2" ];
  679. then
  680. M_CIPHERS="$M_CIPHERS \
  681. TLS-PSK-WITH-AES-128-CCM \
  682. TLS-PSK-WITH-AES-256-CCM \
  683. TLS-DHE-PSK-WITH-AES-128-CCM \
  684. TLS-DHE-PSK-WITH-AES-256-CCM \
  685. TLS-PSK-WITH-AES-128-CCM-8 \
  686. TLS-PSK-WITH-AES-256-CCM-8 \
  687. TLS-DHE-PSK-WITH-AES-128-CCM-8 \
  688. TLS-DHE-PSK-WITH-AES-256-CCM-8 \
  689. "
  690. fi
  691. ;;
  692. esac
  693. }
  694. setup_arguments()
  695. {
  696. G_MODE=""
  697. case "$MODE" in
  698. "ssl3")
  699. G_PRIO_MODE="+VERS-SSL3.0"
  700. ;;
  701. "tls1")
  702. G_PRIO_MODE="+VERS-TLS1.0"
  703. ;;
  704. "tls1_1")
  705. G_PRIO_MODE="+VERS-TLS1.1"
  706. ;;
  707. "tls1_2")
  708. G_PRIO_MODE="+VERS-TLS1.2"
  709. ;;
  710. "dtls1")
  711. G_PRIO_MODE="+VERS-DTLS1.0"
  712. G_MODE="-u"
  713. ;;
  714. "dtls1_2")
  715. G_PRIO_MODE="+VERS-DTLS1.2"
  716. G_MODE="-u"
  717. ;;
  718. *)
  719. echo "error: invalid mode: $MODE" >&2
  720. exit 1;
  721. esac
  722. M_SERVER_ARGS="server_port=$PORT server_addr=0.0.0.0 force_version=$MODE arc4=1"
  723. O_SERVER_ARGS="-accept $PORT -cipher NULL,ALL -$MODE -dhparam data_files/dhparams.pem"
  724. G_SERVER_ARGS="-p $PORT --http $G_MODE"
  725. G_SERVER_PRIO="NORMAL:+ARCFOUR-128:+NULL:+MD5:+PSK:+DHE-PSK:+ECDHE-PSK:+RSA-PSK:-VERS-TLS-ALL:$G_PRIO_MODE"
  726. # with OpenSSL 1.0.1h, -www, -WWW and -HTTP break DTLS handshakes
  727. if is_dtls "$MODE"; then
  728. O_SERVER_ARGS="$O_SERVER_ARGS"
  729. else
  730. O_SERVER_ARGS="$O_SERVER_ARGS -www"
  731. fi
  732. M_CLIENT_ARGS="server_port=$PORT server_addr=127.0.0.1 force_version=$MODE"
  733. O_CLIENT_ARGS="-connect localhost:$PORT -$MODE"
  734. G_CLIENT_ARGS="-p $PORT --debug 3 $G_MODE"
  735. G_CLIENT_PRIO="NONE:$G_PRIO_MODE:+COMP-NULL:+CURVE-ALL:+SIGN-ALL"
  736. if [ "X$VERIFY" = "XYES" ];
  737. then
  738. M_SERVER_ARGS="$M_SERVER_ARGS ca_file=data_files/test-ca_cat12.crt auth_mode=required"
  739. O_SERVER_ARGS="$O_SERVER_ARGS -CAfile data_files/test-ca_cat12.crt -Verify 10"
  740. G_SERVER_ARGS="$G_SERVER_ARGS --x509cafile data_files/test-ca_cat12.crt --require-client-cert"
  741. M_CLIENT_ARGS="$M_CLIENT_ARGS ca_file=data_files/test-ca_cat12.crt auth_mode=required"
  742. O_CLIENT_ARGS="$O_CLIENT_ARGS -CAfile data_files/test-ca_cat12.crt -verify 10"
  743. G_CLIENT_ARGS="$G_CLIENT_ARGS --x509cafile data_files/test-ca_cat12.crt"
  744. else
  745. # don't request a client cert at all
  746. M_SERVER_ARGS="$M_SERVER_ARGS ca_file=none auth_mode=none"
  747. G_SERVER_ARGS="$G_SERVER_ARGS --disable-client-cert"
  748. M_CLIENT_ARGS="$M_CLIENT_ARGS ca_file=none auth_mode=none"
  749. O_CLIENT_ARGS="$O_CLIENT_ARGS"
  750. G_CLIENT_ARGS="$G_CLIENT_ARGS --insecure"
  751. fi
  752. case $TYPE in
  753. "ECDSA")
  754. M_SERVER_ARGS="$M_SERVER_ARGS crt_file=data_files/server5.crt key_file=data_files/server5.key"
  755. O_SERVER_ARGS="$O_SERVER_ARGS -cert data_files/server5.crt -key data_files/server5.key"
  756. G_SERVER_ARGS="$G_SERVER_ARGS --x509certfile data_files/server5.crt --x509keyfile data_files/server5.key"
  757. if [ "X$VERIFY" = "XYES" ]; then
  758. M_CLIENT_ARGS="$M_CLIENT_ARGS crt_file=data_files/server6.crt key_file=data_files/server6.key"
  759. O_CLIENT_ARGS="$O_CLIENT_ARGS -cert data_files/server6.crt -key data_files/server6.key"
  760. G_CLIENT_ARGS="$G_CLIENT_ARGS --x509certfile data_files/server6.crt --x509keyfile data_files/server6.key"
  761. else
  762. M_CLIENT_ARGS="$M_CLIENT_ARGS crt_file=none key_file=none"
  763. fi
  764. ;;
  765. "RSA")
  766. M_SERVER_ARGS="$M_SERVER_ARGS crt_file=data_files/server2.crt key_file=data_files/server2.key"
  767. O_SERVER_ARGS="$O_SERVER_ARGS -cert data_files/server2.crt -key data_files/server2.key"
  768. G_SERVER_ARGS="$G_SERVER_ARGS --x509certfile data_files/server2.crt --x509keyfile data_files/server2.key"
  769. if [ "X$VERIFY" = "XYES" ]; then
  770. M_CLIENT_ARGS="$M_CLIENT_ARGS crt_file=data_files/server1.crt key_file=data_files/server1.key"
  771. O_CLIENT_ARGS="$O_CLIENT_ARGS -cert data_files/server1.crt -key data_files/server1.key"
  772. G_CLIENT_ARGS="$G_CLIENT_ARGS --x509certfile data_files/server1.crt --x509keyfile data_files/server1.key"
  773. else
  774. M_CLIENT_ARGS="$M_CLIENT_ARGS crt_file=none key_file=none"
  775. fi
  776. ;;
  777. "PSK")
  778. # give RSA-PSK-capable server a RSA cert
  779. # (should be a separate type, but harder to close with openssl)
  780. M_SERVER_ARGS="$M_SERVER_ARGS psk=6162636465666768696a6b6c6d6e6f70 ca_file=none crt_file=data_files/server2.crt key_file=data_files/server2.key"
  781. O_SERVER_ARGS="$O_SERVER_ARGS -psk 6162636465666768696a6b6c6d6e6f70 -nocert"
  782. G_SERVER_ARGS="$G_SERVER_ARGS --x509certfile data_files/server2.crt --x509keyfile data_files/server2.key --pskpasswd data_files/passwd.psk"
  783. M_CLIENT_ARGS="$M_CLIENT_ARGS psk=6162636465666768696a6b6c6d6e6f70 crt_file=none key_file=none"
  784. O_CLIENT_ARGS="$O_CLIENT_ARGS -psk 6162636465666768696a6b6c6d6e6f70"
  785. G_CLIENT_ARGS="$G_CLIENT_ARGS --pskusername Client_identity --pskkey=6162636465666768696a6b6c6d6e6f70"
  786. ;;
  787. esac
  788. }
  789. # is_mbedtls <cmd_line>
  790. is_mbedtls() {
  791. echo "$1" | grep 'ssl_server2\|ssl_client2' > /dev/null
  792. }
  793. # has_mem_err <log_file_name>
  794. has_mem_err() {
  795. if ( grep -F 'All heap blocks were freed -- no leaks are possible' "$1" &&
  796. grep -F 'ERROR SUMMARY: 0 errors from 0 contexts' "$1" ) > /dev/null
  797. then
  798. return 1 # false: does not have errors
  799. else
  800. return 0 # true: has errors
  801. fi
  802. }
  803. # start_server <name>
  804. # also saves name and command
  805. start_server() {
  806. case $1 in
  807. [Oo]pen*)
  808. SERVER_CMD="$OPENSSL_CMD s_server $O_SERVER_ARGS"
  809. ;;
  810. [Gg]nu*)
  811. SERVER_CMD="$GNUTLS_SERV $G_SERVER_ARGS --priority $G_SERVER_PRIO"
  812. ;;
  813. mbed*)
  814. SERVER_CMD="$M_SRV $M_SERVER_ARGS"
  815. if [ "$MEMCHECK" -gt 0 ]; then
  816. SERVER_CMD="valgrind --leak-check=full $SERVER_CMD"
  817. fi
  818. ;;
  819. *)
  820. echo "error: invalid server name: $1" >&2
  821. exit 1
  822. ;;
  823. esac
  824. SERVER_NAME=$1
  825. log "$SERVER_CMD"
  826. echo "$SERVER_CMD" > $SRV_OUT
  827. # for servers without -www or equivalent
  828. while :; do echo bla; sleep 1; done | $SERVER_CMD >> $SRV_OUT 2>&1 &
  829. PROCESS_ID=$!
  830. sleep 1
  831. }
  832. # terminate the running server
  833. stop_server() {
  834. kill $PROCESS_ID 2>/dev/null
  835. wait $PROCESS_ID 2>/dev/null
  836. if [ "$MEMCHECK" -gt 0 ]; then
  837. if is_mbedtls "$SERVER_CMD" && has_mem_err $SRV_OUT; then
  838. echo " ! Server had memory errors"
  839. SRVMEM=$(( $SRVMEM + 1 ))
  840. return
  841. fi
  842. fi
  843. rm -f $SRV_OUT
  844. }
  845. # kill the running server (used when killed by signal)
  846. cleanup() {
  847. rm -f $SRV_OUT $CLI_OUT
  848. kill $PROCESS_ID >/dev/null 2>&1
  849. kill $WATCHDOG_PID >/dev/null 2>&1
  850. exit 1
  851. }
  852. # wait for client to terminate and set EXIT
  853. # must be called right after starting the client
  854. wait_client_done() {
  855. CLI_PID=$!
  856. ( sleep "$DOG_DELAY"; echo "TIMEOUT" >> $CLI_OUT; kill $CLI_PID ) &
  857. WATCHDOG_PID=$!
  858. wait $CLI_PID
  859. EXIT=$?
  860. kill $WATCHDOG_PID
  861. wait $WATCHDOG_PID
  862. echo "EXIT: $EXIT" >> $CLI_OUT
  863. }
  864. # run_client <name> <cipher>
  865. run_client() {
  866. # announce what we're going to do
  867. TESTS=$(( $TESTS + 1 ))
  868. VERIF=$(echo $VERIFY | tr '[:upper:]' '[:lower:]')
  869. TITLE="`echo $1 | head -c1`->`echo $SERVER_NAME | head -c1`"
  870. TITLE="$TITLE $MODE,$VERIF $2"
  871. printf "$TITLE "
  872. LEN=$(( 72 - `echo "$TITLE" | wc -c` ))
  873. for i in `seq 1 $LEN`; do printf '.'; done; printf ' '
  874. # should we skip?
  875. if [ "X$SKIP_NEXT" = "XYES" ]; then
  876. SKIP_NEXT="NO"
  877. echo "SKIP"
  878. SKIPPED=$(( $SKIPPED + 1 ))
  879. return
  880. fi
  881. # run the command and interpret result
  882. case $1 in
  883. [Oo]pen*)
  884. CLIENT_CMD="$OPENSSL_CMD s_client $O_CLIENT_ARGS -cipher $2"
  885. log "$CLIENT_CMD"
  886. echo "$CLIENT_CMD" > $CLI_OUT
  887. printf 'GET HTTP/1.0\r\n\r\n' | $CLIENT_CMD >> $CLI_OUT 2>&1 &
  888. wait_client_done
  889. if [ $EXIT -eq 0 ]; then
  890. RESULT=0
  891. else
  892. # If the cipher isn't supported...
  893. if grep 'Cipher is (NONE)' $CLI_OUT >/dev/null; then
  894. RESULT=1
  895. else
  896. RESULT=2
  897. fi
  898. fi
  899. ;;
  900. [Gg]nu*)
  901. # need to force IPv4 with UDP, but keep localhost for auth
  902. if is_dtls "$MODE"; then
  903. G_HOST="127.0.0.1"
  904. else
  905. G_HOST="localhost"
  906. fi
  907. CLIENT_CMD="$GNUTLS_CLI $G_CLIENT_ARGS --priority $G_PRIO_MODE:$2 $G_HOST"
  908. log "$CLIENT_CMD"
  909. echo "$CLIENT_CMD" > $CLI_OUT
  910. printf 'GET HTTP/1.0\r\n\r\n' | $CLIENT_CMD >> $CLI_OUT 2>&1 &
  911. wait_client_done
  912. if [ $EXIT -eq 0 ]; then
  913. RESULT=0
  914. else
  915. RESULT=2
  916. # interpret early failure, with a handshake_failure alert
  917. # before the server hello, as "no ciphersuite in common"
  918. if grep -F 'Received alert [40]: Handshake failed' $CLI_OUT; then
  919. if grep -i 'SERVER HELLO .* was received' $CLI_OUT; then :
  920. else
  921. RESULT=1
  922. fi
  923. fi >/dev/null
  924. fi
  925. ;;
  926. mbed*)
  927. CLIENT_CMD="$M_CLI $M_CLIENT_ARGS force_ciphersuite=$2"
  928. if [ "$MEMCHECK" -gt 0 ]; then
  929. CLIENT_CMD="valgrind --leak-check=full $CLIENT_CMD"
  930. fi
  931. log "$CLIENT_CMD"
  932. echo "$CLIENT_CMD" > $CLI_OUT
  933. $CLIENT_CMD >> $CLI_OUT 2>&1 &
  934. wait_client_done
  935. case $EXIT in
  936. # Success
  937. "0") RESULT=0 ;;
  938. # Ciphersuite not supported
  939. "2") RESULT=1 ;;
  940. # Error
  941. *) RESULT=2 ;;
  942. esac
  943. if [ "$MEMCHECK" -gt 0 ]; then
  944. if is_mbedtls "$CLIENT_CMD" && has_mem_err $CLI_OUT; then
  945. RESULT=2
  946. fi
  947. fi
  948. ;;
  949. *)
  950. echo "error: invalid client name: $1" >&2
  951. exit 1
  952. ;;
  953. esac
  954. echo "EXIT: $EXIT" >> $CLI_OUT
  955. # report and count result
  956. case $RESULT in
  957. "0")
  958. echo PASS
  959. ;;
  960. "1")
  961. echo SKIP
  962. SKIPPED=$(( $SKIPPED + 1 ))
  963. ;;
  964. "2")
  965. echo FAIL
  966. cp $SRV_OUT c-srv-${TESTS}.log
  967. cp $CLI_OUT c-cli-${TESTS}.log
  968. echo " ! outputs saved to c-srv-${TESTS}.log, c-cli-${TESTS}.log"
  969. if [ "X${USER:-}" = Xbuildbot -o "X${LOGNAME:-}" = Xbuildbot ]; then
  970. echo " ! server output:"
  971. cat c-srv-${TESTS}.log
  972. echo " ! ==================================================="
  973. echo " ! client output:"
  974. cat c-cli-${TESTS}.log
  975. fi
  976. FAILED=$(( $FAILED + 1 ))
  977. ;;
  978. esac
  979. rm -f $CLI_OUT
  980. }
  981. #
  982. # MAIN
  983. #
  984. if cd $( dirname $0 ); then :; else
  985. echo "cd $( dirname $0 ) failed" >&2
  986. exit 1
  987. fi
  988. get_options "$@"
  989. # sanity checks, avoid an avalanche of errors
  990. if [ ! -x "$M_SRV" ]; then
  991. echo "Command '$M_SRV' is not an executable file" >&2
  992. exit 1
  993. fi
  994. if [ ! -x "$M_CLI" ]; then
  995. echo "Command '$M_CLI' is not an executable file" >&2
  996. exit 1
  997. fi
  998. if echo "$PEERS" | grep -i openssl > /dev/null; then
  999. if which "$OPENSSL_CMD" >/dev/null 2>&1; then :; else
  1000. echo "Command '$OPENSSL_CMD' not found" >&2
  1001. exit 1
  1002. fi
  1003. fi
  1004. if echo "$PEERS" | grep -i gnutls > /dev/null; then
  1005. for CMD in "$GNUTLS_CLI" "$GNUTLS_SERV"; do
  1006. if which "$CMD" >/dev/null 2>&1; then :; else
  1007. echo "Command '$CMD' not found" >&2
  1008. exit 1
  1009. fi
  1010. done
  1011. fi
  1012. for PEER in $PEERS; do
  1013. case "$PEER" in
  1014. mbed*|[Oo]pen*|[Gg]nu*)
  1015. ;;
  1016. *)
  1017. echo "Unknown peers: $PEER" >&2
  1018. exit 1
  1019. esac
  1020. done
  1021. # Pick a "unique" port in the range 10000-19999.
  1022. PORT="0000$$"
  1023. PORT="1$(echo $PORT | tail -c 5)"
  1024. # Also pick a unique name for intermediate files
  1025. SRV_OUT="srv_out.$$"
  1026. CLI_OUT="cli_out.$$"
  1027. # client timeout delay: be more patient with valgrind
  1028. if [ "$MEMCHECK" -gt 0 ]; then
  1029. DOG_DELAY=30
  1030. else
  1031. DOG_DELAY=10
  1032. fi
  1033. SKIP_NEXT="NO"
  1034. trap cleanup INT TERM HUP
  1035. for VERIFY in $VERIFIES; do
  1036. for MODE in $MODES; do
  1037. for TYPE in $TYPES; do
  1038. for PEER in $PEERS; do
  1039. setup_arguments
  1040. case "$PEER" in
  1041. [Oo]pen*)
  1042. if test "$OSSL_NO_DTLS" -gt 0 && is_dtls "$MODE"; then
  1043. continue;
  1044. fi
  1045. reset_ciphersuites
  1046. add_common_ciphersuites
  1047. add_openssl_ciphersuites
  1048. filter_ciphersuites
  1049. if [ "X" != "X$M_CIPHERS" ]; then
  1050. start_server "OpenSSL"
  1051. for i in $M_CIPHERS; do
  1052. check_openssl_server_bug $i
  1053. run_client mbedTLS $i
  1054. done
  1055. stop_server
  1056. fi
  1057. if [ "X" != "X$O_CIPHERS" ]; then
  1058. start_server "mbedTLS"
  1059. for i in $O_CIPHERS; do
  1060. run_client OpenSSL $i
  1061. done
  1062. stop_server
  1063. fi
  1064. ;;
  1065. [Gg]nu*)
  1066. reset_ciphersuites
  1067. add_common_ciphersuites
  1068. add_gnutls_ciphersuites
  1069. filter_ciphersuites
  1070. if [ "X" != "X$M_CIPHERS" ]; then
  1071. start_server "GnuTLS"
  1072. for i in $M_CIPHERS; do
  1073. run_client mbedTLS $i
  1074. done
  1075. stop_server
  1076. fi
  1077. if [ "X" != "X$G_CIPHERS" ]; then
  1078. start_server "mbedTLS"
  1079. for i in $G_CIPHERS; do
  1080. run_client GnuTLS $i
  1081. done
  1082. stop_server
  1083. fi
  1084. ;;
  1085. mbed*)
  1086. reset_ciphersuites
  1087. add_common_ciphersuites
  1088. add_openssl_ciphersuites
  1089. add_gnutls_ciphersuites
  1090. add_mbedtls_ciphersuites
  1091. filter_ciphersuites
  1092. if [ "X" != "X$M_CIPHERS" ]; then
  1093. start_server "mbedTLS"
  1094. for i in $M_CIPHERS; do
  1095. run_client mbedTLS $i
  1096. done
  1097. stop_server
  1098. fi
  1099. ;;
  1100. *)
  1101. echo "Unknown peer: $PEER" >&2
  1102. exit 1
  1103. ;;
  1104. esac
  1105. done
  1106. done
  1107. done
  1108. done
  1109. echo "------------------------------------------------------------------------"
  1110. if [ $FAILED -ne 0 -o $SRVMEM -ne 0 ];
  1111. then
  1112. printf "FAILED"
  1113. else
  1114. printf "PASSED"
  1115. fi
  1116. if [ "$MEMCHECK" -gt 0 ]; then
  1117. MEMREPORT=", $SRVMEM server memory errors"
  1118. else
  1119. MEMREPORT=""
  1120. fi
  1121. PASSED=$(( $TESTS - $FAILED ))
  1122. echo " ($PASSED / $TESTS tests ($SKIPPED skipped$MEMREPORT))"
  1123. FAILED=$(( $FAILED + $SRVMEM ))
  1124. exit $FAILED