compat.sh 55 KB

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