]> git.ipfire.org Git - thirdparty/openssl.git/blob - test/bad_dtls_test.c
Teach ssl_test_new how to test the FIPS module
[thirdparty/openssl.git] / test / bad_dtls_test.c
1 /*
2 * Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 /*
11 * Unit test for Cisco DTLS1_BAD_VER session resume, as used by
12 * AnyConnect VPN protocol.
13 *
14 * This is designed to exercise the code paths in
15 * http://git.infradead.org/users/dwmw2/openconnect.git/blob/HEAD:/dtls.c
16 * which have frequently been affected by regressions in DTLS1_BAD_VER
17 * support.
18 *
19 * Note that unlike other SSL tests, we don't test against our own SSL
20 * server method. Firstly because we don't have one; we *only* support
21 * DTLS1_BAD_VER as a client. And secondly because even if that were
22 * fixed up it's the wrong thing to test against - because if changes
23 * are made in generic DTLS code which don't take DTLS1_BAD_VER into
24 * account, there's plenty of scope for making those changes such that
25 * they break *both* the client and the server in the same way.
26 *
27 * So we handle the server side manually. In a session resume there isn't
28 * much to be done anyway.
29 */
30 #include <string.h>
31
32 #include <openssl/core_names.h>
33 #include <openssl/params.h>
34 #include <openssl/opensslconf.h>
35 #include <openssl/bio.h>
36 #include <openssl/crypto.h>
37 #include <openssl/evp.h>
38 #include <openssl/ssl.h>
39 #include <openssl/err.h>
40 #include <openssl/rand.h>
41 #include <openssl/kdf.h>
42 #include "internal/packet.h"
43 #include "internal/nelem.h"
44 #include "testutil.h"
45
46 /* For DTLS1_BAD_VER packets the MAC doesn't include the handshake header */
47 #define MAC_OFFSET (DTLS1_RT_HEADER_LENGTH + DTLS1_HM_HEADER_LENGTH)
48
49 static unsigned char client_random[SSL3_RANDOM_SIZE];
50 static unsigned char server_random[SSL3_RANDOM_SIZE];
51
52 /* These are all generated locally, sized purely according to our own whim */
53 static unsigned char session_id[32];
54 static unsigned char master_secret[48];
55 static unsigned char cookie[20];
56
57 /* We've hard-coded the cipher suite; we know it's 104 bytes */
58 static unsigned char key_block[104];
59 #define mac_key (key_block + 20)
60 #define dec_key (key_block + 40)
61 #define enc_key (key_block + 56)
62
63 static EVP_MD_CTX *handshake_md;
64
65 static int do_PRF(const void *seed1, int seed1_len,
66 const void *seed2, int seed2_len,
67 const void *seed3, int seed3_len,
68 unsigned char *out, int olen)
69 {
70 EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_TLS1_PRF, NULL);
71 size_t outlen = olen;
72
73 /* No error handling. If it all screws up, the test will fail anyway */
74 EVP_PKEY_derive_init(pctx);
75 EVP_PKEY_CTX_set_tls1_prf_md(pctx, EVP_md5_sha1());
76 EVP_PKEY_CTX_set1_tls1_prf_secret(pctx, master_secret, sizeof(master_secret));
77 EVP_PKEY_CTX_add1_tls1_prf_seed(pctx, seed1, seed1_len);
78 EVP_PKEY_CTX_add1_tls1_prf_seed(pctx, seed2, seed2_len);
79 EVP_PKEY_CTX_add1_tls1_prf_seed(pctx, seed3, seed3_len);
80 EVP_PKEY_derive(pctx, out, &outlen);
81 EVP_PKEY_CTX_free(pctx);
82 return 1;
83 }
84
85 static SSL_SESSION *client_session(void)
86 {
87 static unsigned char session_asn1[] = {
88 0x30, 0x5F, /* SEQUENCE, length 0x5F */
89 0x02, 0x01, 0x01, /* INTEGER, SSL_SESSION_ASN1_VERSION */
90 0x02, 0x02, 0x01, 0x00, /* INTEGER, DTLS1_BAD_VER */
91 0x04, 0x02, 0x00, 0x2F, /* OCTET_STRING, AES128-SHA */
92 0x04, 0x20, /* OCTET_STRING, session id */
93 #define SS_SESSID_OFS 15 /* Session ID goes here */
94 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98 0x04, 0x30, /* OCTET_STRING, master secret */
99 #define SS_SECRET_OFS 49 /* Master secret goes here */
100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 };
107 const unsigned char *p = session_asn1;
108
109 /* Copy the randomly-generated fields into the above ASN1 */
110 memcpy(session_asn1 + SS_SESSID_OFS, session_id, sizeof(session_id));
111 memcpy(session_asn1 + SS_SECRET_OFS, master_secret, sizeof(master_secret));
112
113 return d2i_SSL_SESSION(NULL, &p, sizeof(session_asn1));
114 }
115
116 /* Returns 1 for initial ClientHello, 2 for ClientHello with cookie */
117 static int validate_client_hello(BIO *wbio)
118 {
119 PACKET pkt, pkt2;
120 long len;
121 unsigned char *data;
122 int cookie_found = 0;
123 unsigned int u = 0;
124
125 len = BIO_get_mem_data(wbio, (char **)&data);
126 if (!PACKET_buf_init(&pkt, data, len))
127 return 0;
128
129 /* Check record header type */
130 if (!PACKET_get_1(&pkt, &u) || u != SSL3_RT_HANDSHAKE)
131 return 0;
132 /* Version */
133 if (!PACKET_get_net_2(&pkt, &u) || u != DTLS1_BAD_VER)
134 return 0;
135 /* Skip the rest of the record header */
136 if (!PACKET_forward(&pkt, DTLS1_RT_HEADER_LENGTH - 3))
137 return 0;
138
139 /* Check it's a ClientHello */
140 if (!PACKET_get_1(&pkt, &u) || u != SSL3_MT_CLIENT_HELLO)
141 return 0;
142 /* Skip the rest of the handshake message header */
143 if (!PACKET_forward(&pkt, DTLS1_HM_HEADER_LENGTH - 1))
144 return 0;
145
146 /* Check client version */
147 if (!PACKET_get_net_2(&pkt, &u) || u != DTLS1_BAD_VER)
148 return 0;
149
150 /* Store random */
151 if (!PACKET_copy_bytes(&pkt, client_random, SSL3_RANDOM_SIZE))
152 return 0;
153
154 /* Check session id length and content */
155 if (!PACKET_get_length_prefixed_1(&pkt, &pkt2) ||
156 !PACKET_equal(&pkt2, session_id, sizeof(session_id)))
157 return 0;
158
159 /* Check cookie */
160 if (!PACKET_get_length_prefixed_1(&pkt, &pkt2))
161 return 0;
162 if (PACKET_remaining(&pkt2)) {
163 if (!PACKET_equal(&pkt2, cookie, sizeof(cookie)))
164 return 0;
165 cookie_found = 1;
166 }
167
168 /* Skip ciphers */
169 if (!PACKET_get_net_2(&pkt, &u) || !PACKET_forward(&pkt, u))
170 return 0;
171
172 /* Skip compression */
173 if (!PACKET_get_1(&pkt, &u) || !PACKET_forward(&pkt, u))
174 return 0;
175
176 /* Skip extensions */
177 if (!PACKET_get_net_2(&pkt, &u) || !PACKET_forward(&pkt, u))
178 return 0;
179
180 /* Now we are at the end */
181 if (PACKET_remaining(&pkt))
182 return 0;
183
184 /* Update handshake MAC for second ClientHello (with cookie) */
185 if (cookie_found && !EVP_DigestUpdate(handshake_md, data + MAC_OFFSET,
186 len - MAC_OFFSET))
187 return 0;
188
189 (void)BIO_reset(wbio);
190
191 return 1 + cookie_found;
192 }
193
194 static int send_hello_verify(BIO *rbio)
195 {
196 static unsigned char hello_verify[] = {
197 0x16, /* Handshake */
198 0x01, 0x00, /* DTLS1_BAD_VER */
199 0x00, 0x00, /* Epoch 0 */
200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Seq# 0 */
201 0x00, 0x23, /* Length */
202 0x03, /* Hello Verify */
203 0x00, 0x00, 0x17, /* Length */
204 0x00, 0x00, /* Seq# 0 */
205 0x00, 0x00, 0x00, /* Fragment offset */
206 0x00, 0x00, 0x17, /* Fragment length */
207 0x01, 0x00, /* DTLS1_BAD_VER */
208 0x14, /* Cookie length */
209 #define HV_COOKIE_OFS 28 /* Cookie goes here */
210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212 0x00, 0x00, 0x00, 0x00,
213 };
214
215 memcpy(hello_verify + HV_COOKIE_OFS, cookie, sizeof(cookie));
216
217 BIO_write(rbio, hello_verify, sizeof(hello_verify));
218
219 return 1;
220 }
221
222 static int send_server_hello(BIO *rbio)
223 {
224 static unsigned char server_hello[] = {
225 0x16, /* Handshake */
226 0x01, 0x00, /* DTLS1_BAD_VER */
227 0x00, 0x00, /* Epoch 0 */
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, /* Seq# 1 */
229 0x00, 0x52, /* Length */
230 0x02, /* Server Hello */
231 0x00, 0x00, 0x46, /* Length */
232 0x00, 0x01, /* Seq# */
233 0x00, 0x00, 0x00, /* Fragment offset */
234 0x00, 0x00, 0x46, /* Fragment length */
235 0x01, 0x00, /* DTLS1_BAD_VER */
236 #define SH_RANDOM_OFS 27 /* Server random goes here */
237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241 0x20, /* Session ID length */
242 #define SH_SESSID_OFS 60 /* Session ID goes here */
243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
247 0x00, 0x2f, /* Cipher suite AES128-SHA */
248 0x00, /* Compression null */
249 };
250 static unsigned char change_cipher_spec[] = {
251 0x14, /* Change Cipher Spec */
252 0x01, 0x00, /* DTLS1_BAD_VER */
253 0x00, 0x00, /* Epoch 0 */
254 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, /* Seq# 2 */
255 0x00, 0x03, /* Length */
256 0x01, 0x00, 0x02, /* Message */
257 };
258
259 memcpy(server_hello + SH_RANDOM_OFS, server_random, sizeof(server_random));
260 memcpy(server_hello + SH_SESSID_OFS, session_id, sizeof(session_id));
261
262 if (!EVP_DigestUpdate(handshake_md, server_hello + MAC_OFFSET,
263 sizeof(server_hello) - MAC_OFFSET))
264 return 0;
265
266 BIO_write(rbio, server_hello, sizeof(server_hello));
267 BIO_write(rbio, change_cipher_spec, sizeof(change_cipher_spec));
268
269 return 1;
270 }
271
272 /* Create header, HMAC, pad, encrypt and send a record */
273 static int send_record(BIO *rbio, unsigned char type, uint64_t seqnr,
274 const void *msg, size_t len)
275 {
276 /* Note that the order of the record header fields on the wire,
277 * and in the HMAC, is different. So we just keep them in separate
278 * variables and handle them individually. */
279 static unsigned char epoch[2] = { 0x00, 0x01 };
280 static unsigned char seq[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
281 static unsigned char ver[2] = { 0x01, 0x00 }; /* DTLS1_BAD_VER */
282 unsigned char lenbytes[2];
283 EVP_MAC *hmac;
284 EVP_MAC_CTX *ctx;
285 EVP_CIPHER_CTX *enc_ctx;
286 unsigned char iv[16];
287 unsigned char pad;
288 unsigned char *enc;
289 OSSL_PARAM params[3];
290
291 seq[0] = (seqnr >> 40) & 0xff;
292 seq[1] = (seqnr >> 32) & 0xff;
293 seq[2] = (seqnr >> 24) & 0xff;
294 seq[3] = (seqnr >> 16) & 0xff;
295 seq[4] = (seqnr >> 8) & 0xff;
296 seq[5] = seqnr & 0xff;
297
298 pad = 15 - ((len + SHA_DIGEST_LENGTH) % 16);
299 enc = OPENSSL_malloc(len + SHA_DIGEST_LENGTH + 1 + pad);
300 if (enc == NULL)
301 return 0;
302
303 /* Copy record to encryption buffer */
304 memcpy(enc, msg, len);
305
306 /* Append HMAC to data */
307 hmac = EVP_MAC_fetch(NULL, "HMAC", NULL);
308 ctx = EVP_MAC_CTX_new(hmac);
309 EVP_MAC_free(hmac);
310 params[0] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
311 "SHA1", 0);
312 params[1] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
313 mac_key, 20);
314 params[2] = OSSL_PARAM_construct_end();
315 EVP_MAC_CTX_set_params(ctx, params);
316 EVP_MAC_init(ctx);
317 EVP_MAC_update(ctx, epoch, 2);
318 EVP_MAC_update(ctx, seq, 6);
319 EVP_MAC_update(ctx, &type, 1);
320 EVP_MAC_update(ctx, ver, 2); /* Version */
321 lenbytes[0] = (unsigned char)(len >> 8);
322 lenbytes[1] = (unsigned char)(len);
323 EVP_MAC_update(ctx, lenbytes, 2); /* Length */
324 EVP_MAC_update(ctx, enc, len); /* Finally the data itself */
325 EVP_MAC_final(ctx, enc + len, NULL, SHA_DIGEST_LENGTH);
326 EVP_MAC_CTX_free(ctx);
327
328 /* Append padding bytes */
329 len += SHA_DIGEST_LENGTH;
330 do {
331 enc[len++] = pad;
332 } while (len % 16);
333
334 /* Generate IV, and encrypt */
335 RAND_bytes(iv, sizeof(iv));
336 enc_ctx = EVP_CIPHER_CTX_new();
337 EVP_CipherInit_ex(enc_ctx, EVP_aes_128_cbc(), NULL, enc_key, iv, 1);
338 EVP_Cipher(enc_ctx, enc, enc, len);
339 EVP_CIPHER_CTX_free(enc_ctx);
340
341 /* Finally write header (from fragmented variables), IV and encrypted record */
342 BIO_write(rbio, &type, 1);
343 BIO_write(rbio, ver, 2);
344 BIO_write(rbio, epoch, 2);
345 BIO_write(rbio, seq, 6);
346 lenbytes[0] = (unsigned char)((len + sizeof(iv)) >> 8);
347 lenbytes[1] = (unsigned char)(len + sizeof(iv));
348 BIO_write(rbio, lenbytes, 2);
349
350 BIO_write(rbio, iv, sizeof(iv));
351 BIO_write(rbio, enc, len);
352
353 OPENSSL_free(enc);
354 return 1;
355 }
356
357 static int send_finished(SSL *s, BIO *rbio)
358 {
359 static unsigned char finished_msg[DTLS1_HM_HEADER_LENGTH +
360 TLS1_FINISH_MAC_LENGTH] = {
361 0x14, /* Finished */
362 0x00, 0x00, 0x0c, /* Length */
363 0x00, 0x03, /* Seq# 3 */
364 0x00, 0x00, 0x00, /* Fragment offset */
365 0x00, 0x00, 0x0c, /* Fragment length */
366 /* Finished MAC (12 bytes) */
367 };
368 unsigned char handshake_hash[EVP_MAX_MD_SIZE];
369
370 /* Derive key material */
371 do_PRF(TLS_MD_KEY_EXPANSION_CONST, TLS_MD_KEY_EXPANSION_CONST_SIZE,
372 server_random, SSL3_RANDOM_SIZE,
373 client_random, SSL3_RANDOM_SIZE,
374 key_block, sizeof(key_block));
375
376 /* Generate Finished MAC */
377 if (!EVP_DigestFinal_ex(handshake_md, handshake_hash, NULL))
378 return 0;
379
380 do_PRF(TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE,
381 handshake_hash, EVP_MD_CTX_size(handshake_md),
382 NULL, 0,
383 finished_msg + DTLS1_HM_HEADER_LENGTH, TLS1_FINISH_MAC_LENGTH);
384
385 return send_record(rbio, SSL3_RT_HANDSHAKE, 0,
386 finished_msg, sizeof(finished_msg));
387 }
388
389 static int validate_ccs(BIO *wbio)
390 {
391 PACKET pkt;
392 long len;
393 unsigned char *data;
394 unsigned int u;
395
396 len = BIO_get_mem_data(wbio, (char **)&data);
397 if (!PACKET_buf_init(&pkt, data, len))
398 return 0;
399
400 /* Check record header type */
401 if (!PACKET_get_1(&pkt, &u) || u != SSL3_RT_CHANGE_CIPHER_SPEC)
402 return 0;
403 /* Version */
404 if (!PACKET_get_net_2(&pkt, &u) || u != DTLS1_BAD_VER)
405 return 0;
406 /* Skip the rest of the record header */
407 if (!PACKET_forward(&pkt, DTLS1_RT_HEADER_LENGTH - 3))
408 return 0;
409
410 /* Check ChangeCipherSpec message */
411 if (!PACKET_get_1(&pkt, &u) || u != SSL3_MT_CCS)
412 return 0;
413 /* A DTLS1_BAD_VER ChangeCipherSpec also contains the
414 * handshake sequence number (which is 2 here) */
415 if (!PACKET_get_net_2(&pkt, &u) || u != 0x0002)
416 return 0;
417
418 /* Now check the Finished packet */
419 if (!PACKET_get_1(&pkt, &u) || u != SSL3_RT_HANDSHAKE)
420 return 0;
421 if (!PACKET_get_net_2(&pkt, &u) || u != DTLS1_BAD_VER)
422 return 0;
423
424 /* Check epoch is now 1 */
425 if (!PACKET_get_net_2(&pkt, &u) || u != 0x0001)
426 return 0;
427
428 /* That'll do for now. If OpenSSL accepted *our* Finished packet
429 * then it's evidently remembered that DTLS1_BAD_VER doesn't
430 * include the handshake header in the MAC. There's not a lot of
431 * point in implementing decryption here, just to check that it
432 * continues to get it right for one more packet. */
433
434 return 1;
435 }
436
437 #define NODROP(x) { x##UL, 0 }
438 #define DROP(x) { x##UL, 1 }
439
440 static struct {
441 uint64_t seq;
442 int drop;
443 } tests[] = {
444 NODROP(1), NODROP(3), NODROP(2),
445 NODROP(0x1234), NODROP(0x1230), NODROP(0x1235),
446 NODROP(0xffff), NODROP(0x10001), NODROP(0xfffe), NODROP(0x10000),
447 DROP(0x10001), DROP(0xff), NODROP(0x100000), NODROP(0x800000), NODROP(0x7fffe1),
448 NODROP(0xffffff), NODROP(0x1000000), NODROP(0xfffffe), DROP(0xffffff), NODROP(0x1000010),
449 NODROP(0xfffffd), NODROP(0x1000011), DROP(0x12), NODROP(0x1000012),
450 NODROP(0x1ffffff), NODROP(0x2000000), DROP(0x1ff00fe), NODROP(0x2000001),
451 NODROP(0x20fffff), NODROP(0x2105500), DROP(0x20ffffe), NODROP(0x21054ff),
452 NODROP(0x211ffff), DROP(0x2110000), NODROP(0x2120000)
453 /* The last test should be NODROP, because a DROP wouldn't get tested. */
454 };
455
456 static int test_bad_dtls(void)
457 {
458 SSL_SESSION *sess = NULL;
459 SSL_CTX *ctx = NULL;
460 SSL *con = NULL;
461 BIO *rbio = NULL;
462 BIO *wbio = NULL;
463 time_t now = 0;
464 int testresult = 0;
465 int ret;
466 int i;
467
468 RAND_bytes(session_id, sizeof(session_id));
469 RAND_bytes(master_secret, sizeof(master_secret));
470 RAND_bytes(cookie, sizeof(cookie));
471 RAND_bytes(server_random + 4, sizeof(server_random) - 4);
472
473 now = time(NULL);
474 memcpy(server_random, &now, sizeof(now));
475
476 sess = client_session();
477 if (!TEST_ptr(sess))
478 goto end;
479
480 handshake_md = EVP_MD_CTX_new();
481 if (!TEST_ptr(handshake_md)
482 || !TEST_true(EVP_DigestInit_ex(handshake_md, EVP_md5_sha1(),
483 NULL)))
484 goto end;
485
486 ctx = SSL_CTX_new(DTLS_client_method());
487 if (!TEST_ptr(ctx)
488 || !TEST_true(SSL_CTX_set_min_proto_version(ctx, DTLS1_BAD_VER))
489 || !TEST_true(SSL_CTX_set_max_proto_version(ctx, DTLS1_BAD_VER))
490 || !TEST_true(SSL_CTX_set_cipher_list(ctx, "AES128-SHA")))
491 goto end;
492
493 con = SSL_new(ctx);
494 if (!TEST_ptr(con)
495 || !TEST_true(SSL_set_session(con, sess)))
496 goto end;
497 SSL_SESSION_free(sess);
498
499 rbio = BIO_new(BIO_s_mem());
500 wbio = BIO_new(BIO_s_mem());
501
502 if (!TEST_ptr(rbio)
503 || !TEST_ptr(wbio))
504 goto end;
505
506 SSL_set_bio(con, rbio, wbio);
507
508 if (!TEST_true(BIO_up_ref(rbio))) {
509 /*
510 * We can't up-ref but we assigned ownership to con, so we shouldn't
511 * free in the "end" block
512 */
513 rbio = wbio = NULL;
514 goto end;
515 }
516
517 if (!TEST_true(BIO_up_ref(wbio))) {
518 wbio = NULL;
519 goto end;
520 }
521
522 SSL_set_connect_state(con);
523
524 /* Send initial ClientHello */
525 ret = SSL_do_handshake(con);
526 if (!TEST_int_le(ret, 0)
527 || !TEST_int_eq(SSL_get_error(con, ret), SSL_ERROR_WANT_READ)
528 || !TEST_int_eq(validate_client_hello(wbio), 1)
529 || !TEST_true(send_hello_verify(rbio)))
530 goto end;
531
532 ret = SSL_do_handshake(con);
533 if (!TEST_int_le(ret, 0)
534 || !TEST_int_eq(SSL_get_error(con, ret), SSL_ERROR_WANT_READ)
535 || !TEST_int_eq(validate_client_hello(wbio), 2)
536 || !TEST_true(send_server_hello(rbio)))
537 goto end;
538
539 ret = SSL_do_handshake(con);
540 if (!TEST_int_le(ret, 0)
541 || !TEST_int_eq(SSL_get_error(con, ret), SSL_ERROR_WANT_READ)
542 || !TEST_true(send_finished(con, rbio)))
543 goto end;
544
545 ret = SSL_do_handshake(con);
546 if (!TEST_int_gt(ret, 0)
547 || !TEST_true(validate_ccs(wbio)))
548 goto end;
549
550 /* While we're here and crafting packets by hand, we might as well do a
551 bit of a stress test on the DTLS record replay handling. Not Cisco-DTLS
552 specific but useful anyway for the general case. It's been broken
553 before, and in fact was broken even for a basic 0, 2, 1 test case
554 when this test was first added.... */
555 for (i = 0; i < (int)OSSL_NELEM(tests); i++) {
556 uint64_t recv_buf[2];
557
558 if (!TEST_true(send_record(rbio, SSL3_RT_APPLICATION_DATA, tests[i].seq,
559 &tests[i].seq, sizeof(uint64_t)))) {
560 TEST_error("Failed to send data seq #0x%x%08x (%d)\n",
561 (unsigned int)(tests[i].seq >> 32), (unsigned int)tests[i].seq, i);
562 goto end;
563 }
564
565 if (tests[i].drop)
566 continue;
567
568 ret = SSL_read(con, recv_buf, 2 * sizeof(uint64_t));
569 if (!TEST_int_eq(ret, (int)sizeof(uint64_t))) {
570 TEST_error("SSL_read failed or wrong size on seq#0x%x%08x (%d)\n",
571 (unsigned int)(tests[i].seq >> 32), (unsigned int)tests[i].seq, i);
572 goto end;
573 }
574 if (!TEST_true(recv_buf[0] == tests[i].seq))
575 goto end;
576 }
577
578 /* The last test cannot be DROP() */
579 if (!TEST_false(tests[i-1].drop))
580 goto end;
581
582 testresult = 1;
583
584 end:
585 BIO_free(rbio);
586 BIO_free(wbio);
587 SSL_free(con);
588 SSL_CTX_free(ctx);
589 EVP_MD_CTX_free(handshake_md);
590
591 return testresult;
592 }
593
594 int setup_tests(void)
595 {
596 ADD_TEST(test_bad_dtls);
597 return 1;
598 }