PageRenderTime 47ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/src/tests.c

https://gitlab.com/axil/gnutls
C | 1104 lines | 801 code | 244 blank | 59 comment | 149 complexity | 8b34923d2cdbf0c5d8ad1e39edcfe470 MD5 | raw file
Possible License(s): LGPL-3.0, GPL-3.0, LGPL-2.1, LGPL-2.0
  1. /*
  2. * Copyright (C) 2000-2012 Free Software Foundation, Inc.
  3. *
  4. * This file is part of GnuTLS.
  5. *
  6. * GnuTLS is free software: you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * GnuTLS is distributed in the hope that it will be useful, but
  12. * WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see
  18. * <http://www.gnu.org/licenses/>.
  19. */
  20. #include <config.h>
  21. #include <gnutls/gnutls.h>
  22. #include <gnutls/x509.h>
  23. #ifndef _WIN32
  24. #include <unistd.h>
  25. #include <signal.h>
  26. #else
  27. #include <errno.h>
  28. #endif
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <string.h>
  32. #include <common.h>
  33. #include <tests.h>
  34. extern gnutls_srp_client_credentials_t srp_cred;
  35. extern gnutls_anon_client_credentials_t anon_cred;
  36. extern gnutls_certificate_credentials_t xcred;
  37. extern unsigned int verbose;
  38. int tls1_ok = 0;
  39. int ssl3_ok = 0;
  40. int tls1_1_ok = 0;
  41. int tls1_2_ok = 0;
  42. /* keep session info */
  43. static char *session_data = NULL;
  44. static char session_id[32];
  45. static size_t session_data_size = 0, session_id_size = 0;
  46. static int sfree = 0;
  47. static int handshake_output = 0;
  48. static int do_handshake(gnutls_session_t session)
  49. {
  50. int ret, alert;
  51. do {
  52. ret = gnutls_handshake(session);
  53. }
  54. while (ret < 0 && gnutls_error_is_fatal(ret) == 0);
  55. handshake_output = ret;
  56. if (ret < 0 && verbose > 1) {
  57. if (ret == GNUTLS_E_FATAL_ALERT_RECEIVED) {
  58. alert = gnutls_alert_get(session);
  59. printf("\n");
  60. printf("*** Received alert [%d]: %s\n",
  61. alert, gnutls_alert_get_name(alert));
  62. }
  63. }
  64. if (ret < 0)
  65. return TEST_FAILED;
  66. gnutls_session_get_data(session, NULL, &session_data_size);
  67. if (sfree != 0) {
  68. free(session_data);
  69. sfree = 0;
  70. }
  71. session_data = malloc(session_data_size);
  72. sfree = 1;
  73. if (session_data == NULL) {
  74. fprintf(stderr, "Memory error\n");
  75. exit(1);
  76. }
  77. gnutls_session_get_data(session, session_data, &session_data_size);
  78. session_id_size = sizeof(session_id);
  79. gnutls_session_get_id(session, session_id, &session_id_size);
  80. return TEST_SUCCEED;
  81. }
  82. char protocol_str[] =
  83. "+VERS-TLS1.2:+VERS-TLS1.1:+VERS-TLS1.0:+VERS-SSL3.0";
  84. char protocol_all_str[] =
  85. "+VERS-TLS1.2:+VERS-TLS1.1:+VERS-TLS1.0:+VERS-SSL3.0";
  86. char prio_str[512] = "";
  87. #define ALL_CIPHERS "+3DES-CBC:+ARCFOUR-128:+ARCFOUR-40"
  88. #define BLOCK_CIPHERS "+3DES-CBC:+AES-128-CBC"
  89. #define ALL_COMP "+COMP-NULL"
  90. #define ALL_MACS "+SHA1:+MD5"
  91. #define ALL_CERTTYPES "+CTYPE-X509"
  92. #define ALL_KX "+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+ECDHE-RSA:+ECDHE-ECDSA:+ANON-ECDH"
  93. #define INIT_STR "NONE:"
  94. char rest[128] = "%UNSAFE_RENEGOTIATION:+SIGN-ALL:+CURVE-ALL";
  95. static inline void
  96. _gnutls_priority_set_direct(gnutls_session_t session, const char *str)
  97. {
  98. const char *err;
  99. int ret = gnutls_priority_set_direct(session, str, &err);
  100. if (ret < 0) {
  101. fprintf(stderr, "Error with string %s\n", str);
  102. fprintf(stderr, "Error at %s: %s\n", err,
  103. gnutls_strerror(ret));
  104. exit(1);
  105. }
  106. }
  107. test_code_t test_server(gnutls_session_t session)
  108. {
  109. int ret, i = 0;
  110. char buf[5 * 1024];
  111. char *p;
  112. const char snd_buf[] = "GET / HTTP/1.0\n\n";
  113. if (verbose == 0)
  114. return TEST_UNSURE;
  115. buf[sizeof(buf) - 1] = 0;
  116. sprintf(prio_str, INIT_STR
  117. ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:" ALL_MACS
  118. ":" ALL_KX ":" "%s", protocol_str, rest);
  119. _gnutls_priority_set_direct(session, prio_str);
  120. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  121. ret = do_handshake(session);
  122. if (ret != TEST_SUCCEED)
  123. return TEST_FAILED;
  124. gnutls_record_send(session, snd_buf, sizeof(snd_buf) - 1);
  125. ret = gnutls_record_recv(session, buf, sizeof(buf) - 1);
  126. if (ret < 0)
  127. return TEST_FAILED;
  128. p = strstr(buf, "Server:");
  129. if (p != NULL)
  130. p = strchr(p, ':');
  131. if (p != NULL) {
  132. p++;
  133. while (*p != 0 && *p != '\r' && *p != '\n') {
  134. putc(*p, stdout);
  135. p++;
  136. i++;
  137. if (i > 128)
  138. break;
  139. }
  140. }
  141. return TEST_SUCCEED;
  142. }
  143. static gnutls_datum_t pubkey = { NULL, 0 };
  144. static gnutls_ecc_curve_t curve = GNUTLS_ECC_CURVE_INVALID;
  145. test_code_t test_dhe(gnutls_session_t session)
  146. {
  147. int ret;
  148. sprintf(prio_str, INIT_STR
  149. ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:" ALL_MACS
  150. ":+DHE-RSA:+DHE-DSS:%s", protocol_str, rest);
  151. _gnutls_priority_set_direct(session, prio_str);
  152. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  153. ret = do_handshake(session);
  154. gnutls_dh_get_pubkey(session, &pubkey);
  155. return ret;
  156. }
  157. test_code_t test_ecdhe(gnutls_session_t session)
  158. {
  159. int ret;
  160. sprintf(prio_str, INIT_STR
  161. ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:" ALL_MACS
  162. ":+ECDHE-RSA:+ECDHE-ECDSA:+CURVE-ALL:%s", protocol_all_str,
  163. rest);
  164. _gnutls_priority_set_direct(session, prio_str);
  165. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  166. ret = do_handshake(session);
  167. curve = gnutls_ecc_curve_get(session);
  168. return ret;
  169. }
  170. test_code_t test_safe_renegotiation(gnutls_session_t session)
  171. {
  172. int ret;
  173. sprintf(prio_str, INIT_STR
  174. ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:" ALL_MACS
  175. ":" ALL_KX ":%%SAFE_RENEGOTIATION", protocol_str);
  176. _gnutls_priority_set_direct(session, prio_str);
  177. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  178. ret = do_handshake(session);
  179. return ret;
  180. }
  181. test_code_t test_safe_renegotiation_scsv(gnutls_session_t session)
  182. {
  183. int ret;
  184. sprintf(prio_str, INIT_STR
  185. ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":+VERS-SSL3.0:"
  186. ALL_MACS ":" ALL_KX ":%%SAFE_RENEGOTIATION");
  187. _gnutls_priority_set_direct(session, prio_str);
  188. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  189. ret = do_handshake(session);
  190. return ret;
  191. }
  192. test_code_t test_dhe_group(gnutls_session_t session)
  193. {
  194. int ret, ret2;
  195. gnutls_datum_t gen, prime, pubkey2;
  196. const char *print;
  197. if (verbose == 0 || pubkey.data == NULL)
  198. return TEST_IGNORE;
  199. sprintf(prio_str, INIT_STR
  200. ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:" ALL_MACS
  201. ":+DHE-RSA:+DHE-DSS:%s", protocol_str, rest);
  202. _gnutls_priority_set_direct(session, prio_str);
  203. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  204. ret = do_handshake(session);
  205. ret2 = gnutls_dh_get_group(session, &gen, &prime);
  206. if (ret2 >= 0) {
  207. printf("\n");
  208. print = raw_to_string(gen.data, gen.size);
  209. if (print)
  210. printf(" Generator [%d bits]: %s\n", gen.size * 8,
  211. print);
  212. print = raw_to_string(prime.data, prime.size);
  213. if (print)
  214. printf(" Prime [%d bits]: %s\n", prime.size * 8,
  215. print);
  216. gnutls_dh_get_pubkey(session, &pubkey2);
  217. print = raw_to_string(pubkey2.data, pubkey2.size);
  218. if (print)
  219. printf(" Pubkey [%d bits]: %s\n", pubkey2.size * 8,
  220. print);
  221. if (pubkey2.data && pubkey2.size == pubkey.size &&
  222. memcmp(pubkey.data, pubkey2.data, pubkey.size) == 0) {
  223. printf
  224. (" (public key seems to be static among sessions)\n");
  225. }
  226. }
  227. return ret;
  228. }
  229. test_code_t test_ecdhe_curve(gnutls_session_t session)
  230. {
  231. if (curve == GNUTLS_ECC_CURVE_INVALID)
  232. return TEST_IGNORE;
  233. printf("\n Curve %s", gnutls_ecc_curve_get_name(curve));
  234. return TEST_SUCCEED;
  235. }
  236. test_code_t test_ssl3(gnutls_session_t session)
  237. {
  238. int ret;
  239. sprintf(prio_str, INIT_STR
  240. ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":+VERS-SSL3.0:"
  241. ALL_MACS ":" ALL_KX ":%s", rest);
  242. _gnutls_priority_set_direct(session, prio_str);
  243. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  244. ret = do_handshake(session);
  245. if (ret == TEST_SUCCEED)
  246. ssl3_ok = 1;
  247. return ret;
  248. }
  249. static int alrm = 0;
  250. static void got_alarm(int k)
  251. {
  252. alrm = 1;
  253. }
  254. test_code_t test_bye(gnutls_session_t session)
  255. {
  256. int ret;
  257. char data[20];
  258. int secs = 6;
  259. #ifndef _WIN32
  260. int old;
  261. signal(SIGALRM, got_alarm);
  262. #endif
  263. sprintf(prio_str, INIT_STR
  264. ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:" ALL_MACS
  265. ":" ALL_KX ":%s", protocol_str, rest);
  266. _gnutls_priority_set_direct(session, prio_str);
  267. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  268. ret = do_handshake(session);
  269. if (ret == TEST_FAILED)
  270. return ret;
  271. ret = gnutls_bye(session, GNUTLS_SHUT_WR);
  272. if (ret < 0)
  273. return TEST_FAILED;
  274. #ifndef _WIN32
  275. old = siginterrupt(SIGALRM, 1);
  276. alarm(secs);
  277. #else
  278. setsockopt((int) gnutls_transport_get_ptr(session), SOL_SOCKET,
  279. SO_RCVTIMEO, (char *) &secs, sizeof(int));
  280. #endif
  281. do {
  282. ret = gnutls_record_recv(session, data, sizeof(data));
  283. }
  284. while (ret > 0);
  285. #ifndef _WIN32
  286. siginterrupt(SIGALRM, old);
  287. #else
  288. if (WSAGetLastError() == WSAETIMEDOUT ||
  289. WSAGetLastError() == WSAECONNABORTED)
  290. alrm = 1;
  291. #endif
  292. if (ret == 0)
  293. return TEST_SUCCEED;
  294. if (alrm == 0)
  295. return TEST_UNSURE;
  296. return TEST_FAILED;
  297. }
  298. test_code_t test_aes(gnutls_session_t session)
  299. {
  300. int ret;
  301. sprintf(prio_str, INIT_STR
  302. "+AES-128-CBC:" ALL_COMP ":" ALL_CERTTYPES ":%s:" ALL_MACS
  303. ":" ALL_KX ":%s", protocol_str, rest);
  304. _gnutls_priority_set_direct(session, prio_str);
  305. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  306. ret = do_handshake(session);
  307. return ret;
  308. }
  309. test_code_t test_aes_gcm(gnutls_session_t session)
  310. {
  311. int ret;
  312. sprintf(prio_str, INIT_STR
  313. "+AES-128-GCM:+AES-256-GCM:+AEAD:" ALL_COMP ":"
  314. ALL_CERTTYPES ":%s:" ALL_MACS ":" ALL_KX ":%s",
  315. protocol_all_str, rest);
  316. _gnutls_priority_set_direct(session, prio_str);
  317. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  318. ret = do_handshake(session);
  319. return ret;
  320. }
  321. test_code_t test_camellia_cbc(gnutls_session_t session)
  322. {
  323. int ret;
  324. sprintf(prio_str,
  325. INIT_STR "+CAMELLIA-128-CBC:" ALL_COMP ":" ALL_CERTTYPES
  326. ":%s:" ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  327. _gnutls_priority_set_direct(session, prio_str);
  328. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  329. ret = do_handshake(session);
  330. return ret;
  331. }
  332. test_code_t test_camellia_gcm(gnutls_session_t session)
  333. {
  334. int ret;
  335. sprintf(prio_str,
  336. INIT_STR "+CAMELLIA-128-GCM:+AEAD:" ALL_COMP ":" ALL_CERTTYPES
  337. ":%s:" ALL_KX ":%s", protocol_str, rest);
  338. _gnutls_priority_set_direct(session, prio_str);
  339. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  340. ret = do_handshake(session);
  341. return ret;
  342. }
  343. test_code_t test_openpgp1(gnutls_session_t session)
  344. {
  345. int ret;
  346. sprintf(prio_str,
  347. INIT_STR ALL_CIPHERS ":" ALL_COMP ":+CTYPE-OPENPGP:%s:"
  348. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  349. _gnutls_priority_set_direct(session, prio_str);
  350. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  351. ret = do_handshake(session);
  352. if (ret == TEST_FAILED)
  353. return ret;
  354. if (gnutls_certificate_type_get(session) == GNUTLS_CRT_OPENPGP)
  355. return TEST_SUCCEED;
  356. return TEST_FAILED;
  357. }
  358. test_code_t test_unknown_ciphersuites(gnutls_session_t session)
  359. {
  360. int ret;
  361. sprintf(prio_str,
  362. INIT_STR "+AES-128-CBC:" ALL_CIPHERS ":" ALL_COMP ":"
  363. ALL_CERTTYPES ":%s:" ALL_MACS ":" ALL_KX ":%s",
  364. protocol_str, rest);
  365. _gnutls_priority_set_direct(session, prio_str);
  366. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  367. ret = do_handshake(session);
  368. return ret;
  369. }
  370. test_code_t test_md5(gnutls_session_t session)
  371. {
  372. int ret;
  373. sprintf(prio_str,
  374. INIT_STR "+AES-128-CBC:" ALL_CIPHERS ":" ALL_COMP ":"
  375. ALL_CERTTYPES ":%s:+MD5:" ALL_KX ":%s", protocol_str,
  376. rest);
  377. _gnutls_priority_set_direct(session, prio_str);
  378. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  379. ret = do_handshake(session);
  380. return ret;
  381. }
  382. #ifdef HAVE_LIBZ
  383. test_code_t test_zlib(gnutls_session_t session)
  384. {
  385. int ret;
  386. sprintf(prio_str,
  387. INIT_STR ALL_CIPHERS ":+COMP-DEFLATE:" ALL_CERTTYPES ":%s:"
  388. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  389. _gnutls_priority_set_direct(session, prio_str);
  390. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  391. ret = do_handshake(session);
  392. return ret;
  393. }
  394. #endif
  395. test_code_t test_sha(gnutls_session_t session)
  396. {
  397. int ret;
  398. sprintf(prio_str,
  399. INIT_STR "+AES-128-CBC:" ALL_CIPHERS ":" ALL_COMP ":"
  400. ALL_CERTTYPES ":%s:+SHA1:" ALL_KX ":%s", protocol_str,
  401. rest);
  402. _gnutls_priority_set_direct(session, prio_str);
  403. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  404. ret = do_handshake(session);
  405. return ret;
  406. }
  407. test_code_t test_sha256(gnutls_session_t session)
  408. {
  409. int ret;
  410. sprintf(prio_str,
  411. INIT_STR "+AES-128-CBC:" ALL_CIPHERS ":" ALL_COMP ":"
  412. ALL_CERTTYPES ":%s:+SHA256:" ALL_KX ":%s",
  413. protocol_all_str, rest);
  414. _gnutls_priority_set_direct(session, prio_str);
  415. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  416. ret = do_handshake(session);
  417. return ret;
  418. }
  419. test_code_t test_3des(gnutls_session_t session)
  420. {
  421. int ret;
  422. sprintf(prio_str,
  423. INIT_STR "+3DES-CBC:" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  424. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  425. _gnutls_priority_set_direct(session, prio_str);
  426. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  427. ret = do_handshake(session);
  428. return ret;
  429. }
  430. test_code_t test_arcfour(gnutls_session_t session)
  431. {
  432. int ret;
  433. sprintf(prio_str,
  434. INIT_STR "+ARCFOUR-128:" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  435. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  436. _gnutls_priority_set_direct(session, prio_str);
  437. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  438. ret = do_handshake(session);
  439. return ret;
  440. }
  441. test_code_t test_tls1(gnutls_session_t session)
  442. {
  443. int ret;
  444. sprintf(prio_str,
  445. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES
  446. ":+VERS-TLS1.0:" ALL_MACS ":" ALL_KX ":%s", rest);
  447. _gnutls_priority_set_direct(session, prio_str);
  448. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  449. ret = do_handshake(session);
  450. if (ret == TEST_SUCCEED)
  451. tls1_ok = 1;
  452. return ret;
  453. }
  454. test_code_t test_record_padding(gnutls_session_t session)
  455. {
  456. int ret;
  457. sprintf(prio_str,
  458. INIT_STR BLOCK_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES
  459. ":+VERS-TLS1.0:" ALL_MACS ":" ALL_KX ":%s", rest);
  460. _gnutls_priority_set_direct(session, prio_str);
  461. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  462. ret = do_handshake(session);
  463. if (ret == TEST_SUCCEED) {
  464. tls1_ok = 1;
  465. } else {
  466. strcat(rest, ":%COMPAT");
  467. }
  468. return ret;
  469. }
  470. test_code_t test_tls1_2(gnutls_session_t session)
  471. {
  472. int ret;
  473. sprintf(prio_str,
  474. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES
  475. ":+VERS-TLS1.2:" ALL_MACS ":" ALL_KX ":%s", rest);
  476. _gnutls_priority_set_direct(session, prio_str);
  477. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  478. ret = do_handshake(session);
  479. if (ret == TEST_SUCCEED)
  480. tls1_2_ok = 1;
  481. return ret;
  482. }
  483. test_code_t test_tls1_1(gnutls_session_t session)
  484. {
  485. int ret;
  486. sprintf(prio_str,
  487. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES
  488. ":+VERS-TLS1.1:" ALL_MACS ":" ALL_KX ":%s", rest);
  489. _gnutls_priority_set_direct(session, prio_str);
  490. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  491. ret = do_handshake(session);
  492. if (ret == TEST_SUCCEED)
  493. tls1_1_ok = 1;
  494. return ret;
  495. }
  496. test_code_t test_tls1_1_fallback(gnutls_session_t session)
  497. {
  498. int ret;
  499. if (tls1_1_ok)
  500. return TEST_IGNORE;
  501. sprintf(prio_str,
  502. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES
  503. ":+VERS-TLS1.1:+VERS-TLS1.0:+VERS-SSL3.0:" ALL_MACS ":"
  504. ALL_KX ":%s", rest);
  505. _gnutls_priority_set_direct(session, prio_str);
  506. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  507. ret = do_handshake(session);
  508. if (ret != TEST_SUCCEED)
  509. return TEST_FAILED;
  510. if (gnutls_protocol_get_version(session) == GNUTLS_TLS1)
  511. return TEST_SUCCEED;
  512. else if (gnutls_protocol_get_version(session) == GNUTLS_SSL3)
  513. return TEST_UNSURE;
  514. return TEST_FAILED;
  515. }
  516. /* Advertize both TLS 1.0 and SSL 3.0. If the connection fails,
  517. * but the previous SSL 3.0 test succeeded then disable TLS 1.0.
  518. */
  519. test_code_t test_tls_disable0(gnutls_session_t session)
  520. {
  521. int ret;
  522. if (tls1_ok != 0)
  523. return TEST_IGNORE;
  524. sprintf(prio_str,
  525. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  526. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  527. _gnutls_priority_set_direct(session, prio_str);
  528. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  529. ret = do_handshake(session);
  530. if (ret == TEST_FAILED) {
  531. /* disable TLS 1.0 */
  532. if (ssl3_ok != 0) {
  533. strcpy(protocol_str, "+VERS-SSL3.0");
  534. }
  535. }
  536. return ret;
  537. }
  538. test_code_t test_tls_disable1(gnutls_session_t session)
  539. {
  540. int ret;
  541. if (tls1_1_ok != 0)
  542. return TEST_IGNORE;
  543. sprintf(prio_str,
  544. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  545. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  546. _gnutls_priority_set_direct(session, prio_str);
  547. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  548. ret = do_handshake(session);
  549. if (ret == TEST_FAILED) {
  550. protocol_str[0] = 0;
  551. /* disable TLS 1.1 */
  552. if (tls1_ok != 0) {
  553. strcat(protocol_str, "+VERS-TLS1.0");
  554. }
  555. if (ssl3_ok != 0) {
  556. if (protocol_str[0] != 0)
  557. strcat(protocol_str, ":+VERS-SSL3.0");
  558. else
  559. strcat(protocol_str, "+VERS-SSL3.0");
  560. }
  561. }
  562. return ret;
  563. }
  564. test_code_t test_tls_disable2(gnutls_session_t session)
  565. {
  566. int ret;
  567. if (tls1_2_ok != 0)
  568. return TEST_IGNORE;
  569. sprintf(prio_str,
  570. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  571. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  572. _gnutls_priority_set_direct(session, prio_str);
  573. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  574. ret = do_handshake(session);
  575. if (ret == TEST_FAILED) {
  576. /* disable TLS 1.2 */
  577. protocol_str[0] = 0;
  578. if (tls1_1_ok != 0) {
  579. strcat(protocol_str, "+VERS-TLS1.1");
  580. }
  581. if (tls1_ok != 0) {
  582. if (protocol_str[0] != 0)
  583. strcat(protocol_str, ":+VERS-TLS1.0");
  584. else
  585. strcat(protocol_str, "+VERS-TLS1.0");
  586. }
  587. if (ssl3_ok != 0) {
  588. if (protocol_str[0] != 0)
  589. strcat(protocol_str, ":+VERS-SSL3.0");
  590. else
  591. strcat(protocol_str, "+VERS-SSL3.0");
  592. }
  593. }
  594. return ret;
  595. }
  596. test_code_t test_rsa_pms(gnutls_session_t session)
  597. {
  598. int ret;
  599. /* here we enable both SSL 3.0 and TLS 1.0
  600. * and try to connect and use rsa authentication.
  601. * If the server is old, buggy and only supports
  602. * SSL 3.0 then the handshake will fail.
  603. */
  604. sprintf(prio_str,
  605. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  606. ALL_MACS ":+RSA:%s", protocol_str, rest);
  607. _gnutls_priority_set_direct(session, prio_str);
  608. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  609. ret = do_handshake(session);
  610. if (ret == TEST_FAILED)
  611. return TEST_FAILED;
  612. if (gnutls_protocol_get_version(session) == GNUTLS_TLS1)
  613. return TEST_SUCCEED;
  614. return TEST_UNSURE;
  615. }
  616. test_code_t test_max_record_size(gnutls_session_t session)
  617. {
  618. int ret;
  619. sprintf(prio_str,
  620. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  621. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  622. _gnutls_priority_set_direct(session, prio_str);
  623. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  624. gnutls_record_set_max_size(session, 512);
  625. ret = do_handshake(session);
  626. if (ret == TEST_FAILED)
  627. return ret;
  628. ret = gnutls_record_get_max_size(session);
  629. if (ret == 512)
  630. return TEST_SUCCEED;
  631. return TEST_FAILED;
  632. }
  633. test_code_t test_hello_extension(gnutls_session_t session)
  634. {
  635. int ret;
  636. sprintf(prio_str,
  637. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  638. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  639. _gnutls_priority_set_direct(session, prio_str);
  640. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  641. gnutls_record_set_max_size(session, 4096);
  642. ret = do_handshake(session);
  643. return ret;
  644. }
  645. test_code_t test_heartbeat_extension(gnutls_session_t session)
  646. {
  647. sprintf(prio_str,
  648. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  649. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  650. _gnutls_priority_set_direct(session, prio_str);
  651. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  652. gnutls_record_set_max_size(session, 4096);
  653. gnutls_heartbeat_enable(session, GNUTLS_HB_PEER_ALLOWED_TO_SEND);
  654. do_handshake(session);
  655. switch (gnutls_heartbeat_allowed(session, 1)) {
  656. case 1:
  657. return TEST_SUCCEED;
  658. case 0:
  659. return TEST_FAILED;
  660. default:
  661. return TEST_UNSURE;
  662. }
  663. }
  664. test_code_t test_small_records(gnutls_session_t session)
  665. {
  666. int ret;
  667. sprintf(prio_str,
  668. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  669. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  670. _gnutls_priority_set_direct(session, prio_str);
  671. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  672. gnutls_record_set_max_size(session, 512);
  673. ret = do_handshake(session);
  674. return ret;
  675. }
  676. void _gnutls_record_set_default_version(gnutls_session_t session,
  677. unsigned char major,
  678. unsigned char minor);
  679. test_code_t test_version_rollback(gnutls_session_t session)
  680. {
  681. int ret;
  682. if (tls1_ok == 0)
  683. return TEST_IGNORE;
  684. /* here we enable both SSL 3.0 and TLS 1.0
  685. * and we connect using a 3.1 client hello version,
  686. * and a 3.0 record version. Some implementations
  687. * are buggy (and vulnerable to man in the middle
  688. * attacks which allow a version downgrade) and this
  689. * connection will fail.
  690. */
  691. sprintf(prio_str,
  692. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  693. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  694. _gnutls_priority_set_direct(session, prio_str);
  695. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  696. _gnutls_record_set_default_version(session, 3, 0);
  697. ret = do_handshake(session);
  698. if (ret != TEST_SUCCEED)
  699. return ret;
  700. if (tls1_ok != 0
  701. && gnutls_protocol_get_version(session) == GNUTLS_SSL3)
  702. return TEST_FAILED;
  703. return TEST_SUCCEED;
  704. }
  705. /* See if the server tolerates out of bounds
  706. * record layer versions in the first client hello
  707. * message.
  708. */
  709. test_code_t test_version_oob(gnutls_session_t session)
  710. {
  711. int ret;
  712. /* here we enable both SSL 3.0 and TLS 1.0
  713. * and we connect using a 5.5 record version.
  714. */
  715. sprintf(prio_str,
  716. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  717. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  718. _gnutls_priority_set_direct(session, prio_str);
  719. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  720. _gnutls_record_set_default_version(session, 5, 5);
  721. ret = do_handshake(session);
  722. return ret;
  723. }
  724. void _gnutls_rsa_pms_set_version(gnutls_session_t session,
  725. unsigned char major, unsigned char minor);
  726. test_code_t test_rsa_pms_version_check(gnutls_session_t session)
  727. {
  728. int ret;
  729. /* here we use an arbitary version in the RSA PMS
  730. * to see whether to server will check this version.
  731. *
  732. * A normal server would abort this handshake.
  733. */
  734. sprintf(prio_str,
  735. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  736. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  737. _gnutls_priority_set_direct(session, prio_str);
  738. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  739. _gnutls_rsa_pms_set_version(session, 5, 5); /* use SSL 5.5 version */
  740. ret = do_handshake(session);
  741. return ret;
  742. }
  743. #ifdef ENABLE_ANON
  744. test_code_t test_anonymous(gnutls_session_t session)
  745. {
  746. int ret;
  747. sprintf(prio_str,
  748. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  749. ALL_MACS ":+ANON-DH:+ANON-ECDH:+CURVE-ALL:%s",
  750. protocol_str, rest);
  751. _gnutls_priority_set_direct(session, prio_str);
  752. gnutls_credentials_set(session, GNUTLS_CRD_ANON, anon_cred);
  753. ret = do_handshake(session);
  754. if (ret == TEST_SUCCEED)
  755. gnutls_dh_get_pubkey(session, &pubkey);
  756. return ret;
  757. }
  758. #endif
  759. test_code_t test_session_resume2(gnutls_session_t session)
  760. {
  761. int ret;
  762. char tmp_session_id[32];
  763. size_t tmp_session_id_size;
  764. if (session == NULL)
  765. return TEST_IGNORE;
  766. sprintf(prio_str,
  767. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  768. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  769. _gnutls_priority_set_direct(session, prio_str);
  770. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  771. gnutls_credentials_set(session, GNUTLS_CRD_ANON, anon_cred);
  772. gnutls_session_set_data(session, session_data, session_data_size);
  773. memcpy(tmp_session_id, session_id, session_id_size);
  774. tmp_session_id_size = session_id_size;
  775. ret = do_handshake(session);
  776. if (ret == TEST_FAILED)
  777. return ret;
  778. /* check if we actually resumed the previous session */
  779. session_id_size = sizeof(session_id);
  780. gnutls_session_get_id(session, session_id, &session_id_size);
  781. if (session_id_size == 0)
  782. return TEST_FAILED;
  783. if (gnutls_session_is_resumed(session))
  784. return TEST_SUCCEED;
  785. if (tmp_session_id_size == session_id_size &&
  786. memcmp(tmp_session_id, session_id, tmp_session_id_size) == 0)
  787. return TEST_SUCCEED;
  788. else
  789. return TEST_FAILED;
  790. }
  791. extern char *hostname;
  792. test_code_t test_certificate(gnutls_session_t session)
  793. {
  794. int ret;
  795. if (verbose == 0)
  796. return TEST_IGNORE;
  797. sprintf(prio_str,
  798. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  799. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  800. _gnutls_priority_set_direct(session, prio_str);
  801. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  802. ret = do_handshake(session);
  803. if (ret == TEST_FAILED)
  804. return ret;
  805. printf("\n");
  806. print_cert_info(session, GNUTLS_CRT_PRINT_FULL, verbose);
  807. return TEST_SUCCEED;
  808. }
  809. /* A callback function to be used at the certificate selection time.
  810. */
  811. static int
  812. cert_callback(gnutls_session_t session,
  813. const gnutls_datum_t * req_ca_rdn, int nreqs,
  814. const gnutls_pk_algorithm_t * sign_algos,
  815. int sign_algos_length, gnutls_retr2_st * st)
  816. {
  817. char issuer_dn[256];
  818. int i, ret;
  819. size_t len;
  820. if (verbose == 0)
  821. return -1;
  822. /* Print the server's trusted CAs
  823. */
  824. printf("\n");
  825. if (nreqs > 0)
  826. printf("- Server's trusted authorities:\n");
  827. else
  828. printf
  829. ("- Server did not send us any trusted authorities names.\n");
  830. /* print the names (if any) */
  831. for (i = 0; i < nreqs; i++) {
  832. len = sizeof(issuer_dn);
  833. ret = gnutls_x509_rdn_get(&req_ca_rdn[i], issuer_dn, &len);
  834. if (ret >= 0) {
  835. printf(" [%d]: ", i);
  836. printf("%s\n", issuer_dn);
  837. }
  838. }
  839. return -1;
  840. }
  841. /* Prints the trusted server's CAs. This is only
  842. * if the server sends a certificate request packet.
  843. */
  844. test_code_t test_server_cas(gnutls_session_t session)
  845. {
  846. int ret;
  847. if (verbose == 0)
  848. return TEST_IGNORE;
  849. sprintf(prio_str,
  850. INIT_STR ALL_CIPHERS ":" ALL_COMP ":" ALL_CERTTYPES ":%s:"
  851. ALL_MACS ":" ALL_KX ":%s", protocol_str, rest);
  852. _gnutls_priority_set_direct(session, prio_str);
  853. gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  854. gnutls_certificate_set_retrieve_function(xcred, cert_callback);
  855. ret = do_handshake(session);
  856. gnutls_certificate_set_retrieve_function(xcred, NULL);
  857. if (ret == TEST_FAILED)
  858. return ret;
  859. return TEST_SUCCEED;
  860. }