]> git.ipfire.org Git - thirdparty/openssl.git/blame - ssl/record/d1_pkt.c
Remove last trace of non-record layer code reading and writing sequence
[thirdparty/openssl.git] / ssl / record / d1_pkt.c
CommitLineData
36d16f8e 1/* ssl/d1_pkt.c */
0f113f3e 2/*
36d16f8e 3 * DTLS implementation written by Nagendra Modadugu
0f113f3e 4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
36d16f8e
BL
5 */
6/* ====================================================================
7 * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
0f113f3e 14 * notice, this list of conditions and the following disclaimer.
36d16f8e
BL
15 *
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in
18 * the documentation and/or other materials provided with the
19 * distribution.
20 *
21 * 3. All advertising materials mentioning features or use of this
22 * software must display the following acknowledgment:
23 * "This product includes software developed by the OpenSSL Project
24 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
25 *
26 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27 * endorse or promote products derived from this software without
28 * prior written permission. For written permission, please contact
29 * openssl-core@openssl.org.
30 *
31 * 5. Products derived from this software may not be called "OpenSSL"
32 * nor may "OpenSSL" appear in their names without prior written
33 * permission of the OpenSSL Project.
34 *
35 * 6. Redistributions of any form whatsoever must retain the following
36 * acknowledgment:
37 * "This product includes software developed by the OpenSSL Project
38 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
44 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51 * OF THE POSSIBILITY OF SUCH DAMAGE.
52 * ====================================================================
53 *
54 * This product includes cryptographic software written by Eric Young
55 * (eay@cryptsoft.com). This product includes software written by Tim
56 * Hudson (tjh@cryptsoft.com).
57 *
58 */
59/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
60 * All rights reserved.
61 *
62 * This package is an SSL implementation written
63 * by Eric Young (eay@cryptsoft.com).
64 * The implementation was written so as to conform with Netscapes SSL.
0f113f3e 65 *
36d16f8e
BL
66 * This library is free for commercial and non-commercial use as long as
67 * the following conditions are aheared to. The following conditions
68 * apply to all code found in this distribution, be it the RC4, RSA,
69 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
70 * included with this distribution is covered by the same copyright terms
71 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
0f113f3e 72 *
36d16f8e
BL
73 * Copyright remains Eric Young's, and as such any Copyright notices in
74 * the code are not to be removed.
75 * If this package is used in a product, Eric Young should be given attribution
76 * as the author of the parts of the library used.
77 * This can be in the form of a textual message at program startup or
78 * in documentation (online or textual) provided with the package.
0f113f3e 79 *
36d16f8e
BL
80 * Redistribution and use in source and binary forms, with or without
81 * modification, are permitted provided that the following conditions
82 * are met:
83 * 1. Redistributions of source code must retain the copyright
84 * notice, this list of conditions and the following disclaimer.
85 * 2. Redistributions in binary form must reproduce the above copyright
86 * notice, this list of conditions and the following disclaimer in the
87 * documentation and/or other materials provided with the distribution.
88 * 3. All advertising materials mentioning features or use of this software
89 * must display the following acknowledgement:
90 * "This product includes cryptographic software written by
91 * Eric Young (eay@cryptsoft.com)"
92 * The word 'cryptographic' can be left out if the rouines from the library
93 * being used are not cryptographic related :-).
0f113f3e 94 * 4. If you include any Windows specific code (or a derivative thereof) from
36d16f8e
BL
95 * the apps directory (application code) you must include an acknowledgement:
96 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
0f113f3e 97 *
36d16f8e
BL
98 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
99 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
100 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
101 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
102 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
103 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
104 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
105 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
106 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
107 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
108 * SUCH DAMAGE.
0f113f3e 109 *
36d16f8e
BL
110 * The licence and distribution terms for any publically available version or
111 * derivative of this code cannot be changed. i.e. this code cannot simply be
112 * copied and put under another distribution licence
113 * [including the GNU Public Licence.]
114 */
115
116#include <stdio.h>
117#include <errno.h>
118#define USE_SOCKETS
999005e4 119#include "../ssl_locl.h"
36d16f8e
BL
120#include <openssl/evp.h>
121#include <openssl/buffer.h>
122#include <openssl/pqueue.h>
d527834a 123#include <openssl/rand.h>
36d16f8e 124
40f37188
MC
125
126int DTLS_RECORD_LAYER_new(RECORD_LAYER *rl)
127{
128 DTLS_RECORD_LAYER *d;
129
130 if ((d = OPENSSL_malloc(sizeof *d)) == NULL) {
131 return (0);
132 }
133
cb2ce7ab 134
40f37188 135 rl->d = d;
5fb6f80c 136
cb2ce7ab
MC
137 d->unprocessed_rcds.q = pqueue_new();
138 d->processed_rcds.q = pqueue_new();
24a1e2f2 139 d->buffered_app_data.q = pqueue_new();
cb2ce7ab 140
24a1e2f2
MC
141 if (!d->unprocessed_rcds.q || !d->processed_rcds.q
142 || !d->buffered_app_data.q) {
cb2ce7ab
MC
143 if (d->unprocessed_rcds.q)
144 pqueue_free(d->unprocessed_rcds.q);
145 if (d->processed_rcds.q)
146 pqueue_free(d->processed_rcds.q);
24a1e2f2
MC
147 if (d->buffered_app_data.q)
148 pqueue_free(d->buffered_app_data.q);
cb2ce7ab
MC
149 OPENSSL_free(d);
150 rl->d = NULL;
151 return (0);
152 }
40f37188
MC
153
154 return 1;
155}
156
157void DTLS_RECORD_LAYER_free(RECORD_LAYER *rl)
158{
cb2ce7ab
MC
159 DTLS_RECORD_LAYER_clear(rl);
160 pqueue_free(rl->d->unprocessed_rcds.q);
161 pqueue_free(rl->d->processed_rcds.q);
24a1e2f2 162 pqueue_free(rl->d->buffered_app_data.q);
40f37188
MC
163 OPENSSL_free(rl->d);
164 rl->d = NULL;
165}
166
167void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl)
168{
169 DTLS_RECORD_LAYER *d;
cb2ce7ab
MC
170 pitem *item = NULL;
171 DTLS1_RECORD_DATA *rdata;
172 pqueue unprocessed_rcds;
173 pqueue processed_rcds;
24a1e2f2 174 pqueue buffered_app_data;
cb2ce7ab 175
40f37188 176 d = rl->d;
cb2ce7ab
MC
177
178 while ((item = pqueue_pop(d->unprocessed_rcds.q)) != NULL) {
179 rdata = (DTLS1_RECORD_DATA *)item->data;
180 if (rdata->rbuf.buf) {
181 OPENSSL_free(rdata->rbuf.buf);
182 }
183 OPENSSL_free(item->data);
184 pitem_free(item);
185 }
186
187 while ((item = pqueue_pop(d->processed_rcds.q)) != NULL) {
188 rdata = (DTLS1_RECORD_DATA *)item->data;
189 if (rdata->rbuf.buf) {
190 OPENSSL_free(rdata->rbuf.buf);
191 }
192 OPENSSL_free(item->data);
193 pitem_free(item);
194 }
195
24a1e2f2
MC
196 while ((item = pqueue_pop(d->buffered_app_data.q)) != NULL) {
197 rdata = (DTLS1_RECORD_DATA *)item->data;
198 if (rdata->rbuf.buf) {
199 OPENSSL_free(rdata->rbuf.buf);
200 }
201 OPENSSL_free(item->data);
202 pitem_free(item);
203 }
204
cb2ce7ab
MC
205 unprocessed_rcds = d->unprocessed_rcds.q;
206 processed_rcds = d->processed_rcds.q;
24a1e2f2 207 buffered_app_data = d->buffered_app_data.q;
40f37188 208 memset(d, 0, sizeof *d);
cb2ce7ab
MC
209 d->unprocessed_rcds.q = unprocessed_rcds;
210 d->processed_rcds.q = processed_rcds;
24a1e2f2 211 d->buffered_app_data.q = buffered_app_data;
40f37188
MC
212}
213
3bb8f87d
MC
214void DTLS_RECORD_LAYER_set_saved_w_epoch(RECORD_LAYER *rl, unsigned short e)
215{
216 if (e == rl->d->w_epoch - 1) {
217 memcpy(rl->d->curr_write_sequence,
218 rl->write_sequence,
219 sizeof(rl->write_sequence));
220 memcpy(rl->write_sequence,
221 rl->d->last_write_sequence,
222 sizeof(rl->write_sequence));
223 } else if (e == rl->d->w_epoch + 1) {
224 memcpy(rl->d->last_write_sequence,
225 rl->write_sequence,
226 sizeof(unsigned char[8]));
227 memcpy(rl->write_sequence,
228 rl->d->curr_write_sequence,
229 sizeof(rl->write_sequence));
230 }
231 rl->d->w_epoch = e;
232}
233
0f113f3e
MC
234static int have_handshake_fragment(SSL *s, int type, unsigned char *buf,
235 int len, int peek);
36d16f8e 236
36d16f8e 237/* copy buffered record into SSL structure */
0f113f3e
MC
238static int dtls1_copy_record(SSL *s, pitem *item)
239{
36d16f8e
BL
240 DTLS1_RECORD_DATA *rdata;
241
242 rdata = (DTLS1_RECORD_DATA *)item->data;
0f113f3e 243
88c23039 244 SSL3_BUFFER_release(&s->rlayer.rbuf);
0f113f3e 245
7a7048af
MC
246 s->rlayer.packet = rdata->packet;
247 s->rlayer.packet_length = rdata->packet_length;
88c23039
MC
248 memcpy(&s->rlayer.rbuf, &(rdata->rbuf), sizeof(SSL3_BUFFER));
249 memcpy(&s->rlayer.rrec, &(rdata->rrec), sizeof(SSL3_RECORD));
36d16f8e 250
0f113f3e 251 /* Set proper sequence number for mac calculation */
de07f311 252 memcpy(&(s->rlayer.read_sequence[2]), &(rdata->packet[5]), 6);
0f113f3e
MC
253
254 return (1);
255}
36d16f8e 256
fe589e61 257int
dffdb56b 258dtls1_buffer_record(SSL *s, record_pqueue *queue, unsigned char *priority)
0f113f3e
MC
259{
260 DTLS1_RECORD_DATA *rdata;
261 pitem *item;
262
263 /* Limit the size of the queue to prevent DOS attacks */
264 if (pqueue_size(queue->q) >= 100)
265 return 0;
266
267 rdata = OPENSSL_malloc(sizeof(DTLS1_RECORD_DATA));
268 item = pitem_new(priority, rdata);
269 if (rdata == NULL || item == NULL) {
270 if (rdata != NULL)
271 OPENSSL_free(rdata);
272 if (item != NULL)
273 pitem_free(item);
274
275 SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR);
06c6a2b4 276 return -1;
0f113f3e
MC
277 }
278
7a7048af
MC
279 rdata->packet = s->rlayer.packet;
280 rdata->packet_length = s->rlayer.packet_length;
88c23039
MC
281 memcpy(&(rdata->rbuf), &s->rlayer.rbuf, sizeof(SSL3_BUFFER));
282 memcpy(&(rdata->rrec), &s->rlayer.rrec, sizeof(SSL3_RECORD));
0f113f3e
MC
283
284 item->data = rdata;
36d16f8e 285
7e159e01 286#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
287 /* Store bio_dgram_sctp_rcvinfo struct */
288 if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
289 (s->state == SSL3_ST_SR_FINISHED_A
290 || s->state == SSL3_ST_CR_FINISHED_A)) {
291 BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SCTP_GET_RCVINFO,
292 sizeof(rdata->recordinfo), &rdata->recordinfo);
293 }
7e159e01
DSH
294#endif
295
7a7048af
MC
296 s->rlayer.packet = NULL;
297 s->rlayer.packet_length = 0;
88c23039
MC
298 memset(&s->rlayer.rbuf, 0, sizeof(SSL3_BUFFER));
299 memset(&s->rlayer.rrec, 0, sizeof(SSL3_RECORD));
0f113f3e
MC
300
301 if (!ssl3_setup_buffers(s)) {
302 SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR);
303 if (rdata->rbuf.buf != NULL)
304 OPENSSL_free(rdata->rbuf.buf);
305 OPENSSL_free(rdata);
306 pitem_free(item);
307 return (-1);
308 }
36d16f8e 309
0f113f3e
MC
310 /* insert should not fail, since duplicates are dropped */
311 if (pqueue_insert(queue->q, item) == NULL) {
312 SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR);
313 if (rdata->rbuf.buf != NULL)
314 OPENSSL_free(rdata->rbuf.buf);
315 OPENSSL_free(rdata);
316 pitem_free(item);
317 return (-1);
318 }
36d16f8e 319
0f113f3e
MC
320 return (1);
321}
322
fe589e61 323int dtls1_retrieve_buffered_record(SSL *s, record_pqueue *queue)
0f113f3e 324{
36d16f8e
BL
325 pitem *item;
326
327 item = pqueue_pop(queue->q);
0f113f3e 328 if (item) {
36d16f8e
BL
329 dtls1_copy_record(s, item);
330
331 OPENSSL_free(item->data);
0f113f3e 332 pitem_free(item);
36d16f8e 333
0f113f3e 334 return (1);
36d16f8e
BL
335 }
336
0f113f3e
MC
337 return (0);
338}
36d16f8e 339
0f113f3e
MC
340/*
341 * retrieve a buffered record that belongs to the new epoch, i.e., not
342 * processed yet
343 */
36d16f8e
BL
344#define dtls1_get_unprocessed_record(s) \
345 dtls1_retrieve_buffered_record((s), \
cb2ce7ab 346 &((s)->rlayer.d->unprocessed_rcds))
36d16f8e 347
36d16f8e 348
fe589e61 349int dtls1_process_buffered_records(SSL *s)
0f113f3e 350{
36d16f8e 351 pitem *item;
0f113f3e 352
cb2ce7ab 353 item = pqueue_peek(s->rlayer.d->unprocessed_rcds.q);
0f113f3e 354 if (item) {
36d16f8e 355 /* Check if epoch is current. */
cb2ce7ab 356 if (s->rlayer.d->unprocessed_rcds.epoch != s->rlayer.d->r_epoch)
0f113f3e
MC
357 return (1); /* Nothing to do. */
358
36d16f8e 359 /* Process all the records. */
cb2ce7ab 360 while (pqueue_peek(s->rlayer.d->unprocessed_rcds.q)) {
36d16f8e 361 dtls1_get_unprocessed_record(s);
0f113f3e
MC
362 if (!dtls1_process_record(s))
363 return (0);
cb2ce7ab 364 if (dtls1_buffer_record(s, &(s->rlayer.d->processed_rcds),
88c23039 365 SSL3_RECORD_get_seq_num(&s->rlayer.rrec)) < 0)
103b171d 366 return -1;
36d16f8e 367 }
0f113f3e 368 }
36d16f8e 369
0f113f3e
MC
370 /*
371 * sync epoch numbers once all the unprocessed records have been
372 * processed
373 */
cb2ce7ab
MC
374 s->rlayer.d->processed_rcds.epoch = s->rlayer.d->r_epoch;
375 s->rlayer.d->unprocessed_rcds.epoch = s->rlayer.d->r_epoch + 1;
36d16f8e 376
0f113f3e
MC
377 return (1);
378}
36d16f8e 379
36d16f8e 380
1d97c843
TH
381/*-
382 * Return up to 'len' payload bytes received in 'type' records.
36d16f8e
BL
383 * 'type' is one of the following:
384 *
385 * - SSL3_RT_HANDSHAKE (when ssl3_get_message calls us)
386 * - SSL3_RT_APPLICATION_DATA (when ssl3_read calls us)
387 * - 0 (during a shutdown, no data has to be returned)
388 *
389 * If we don't have stored data to work from, read a SSL/TLS record first
390 * (possibly multiple records if we still don't have anything to return).
391 *
392 * This function must handle any surprises the peer may have for us, such as
393 * Alert records (e.g. close_notify), ChangeCipherSpec records (not really
394 * a surprise, but handled as if it were), or renegotiation requests.
395 * Also if record payloads contain fragments too small to process, we store
396 * them until there is enough for the respective protocol (the record protocol
397 * may use arbitrary fragmentation and even interleaving):
398 * Change cipher spec protocol
399 * just 1 byte needed, no need for keeping anything stored
400 * Alert protocol
401 * 2 bytes needed (AlertLevel, AlertDescription)
402 * Handshake protocol
403 * 4 bytes needed (HandshakeType, uint24 length) -- we just have
404 * to detect unexpected Client Hello and Hello Request messages
405 * here, anything else is handled by higher layers
406 * Application data protocol
407 * none of our business
408 */
409int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
0f113f3e
MC
410{
411 int al, i, j, ret;
412 unsigned int n;
413 SSL3_RECORD *rr;
414 void (*cb) (const SSL *ssl, int type2, int val) = NULL;
415
88c23039 416 if (!SSL3_BUFFER_is_initialised(&s->rlayer.rbuf)) {
28d59af8 417 /* Not initialized yet */
0f113f3e
MC
418 if (!ssl3_setup_buffers(s))
419 return (-1);
28d59af8 420 }
0f113f3e
MC
421
422 if ((type && (type != SSL3_RT_APPLICATION_DATA) &&
423 (type != SSL3_RT_HANDSHAKE)) ||
424 (peek && (type != SSL3_RT_APPLICATION_DATA))) {
425 SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR);
426 return -1;
427 }
428
429 /*
430 * check whether there's a handshake message (client hello?) waiting
431 */
432 if ((ret = have_handshake_fragment(s, type, buf, len, peek)))
433 return ret;
434
435 /*
c661ac16
MC
436 * Now s->rlayer.d->handshake_fragment_len == 0 if
437 * type == SSL3_RT_HANDSHAKE.
0f113f3e 438 */
36d16f8e 439
7e159e01 440#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
441 /*
442 * Continue handshake if it had to be interrupted to read app data with
443 * SCTP.
444 */
445 if ((!s->in_handshake && SSL_in_init(s)) ||
446 (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
447 (s->state == DTLS1_SCTP_ST_SR_READ_SOCK
448 || s->state == DTLS1_SCTP_ST_CR_READ_SOCK)
449 && s->s3->in_read_app_data != 2))
7e159e01 450#else
0f113f3e 451 if (!s->in_handshake && SSL_in_init(s))
7e159e01 452#endif
0f113f3e
MC
453 {
454 /* type == SSL3_RT_APPLICATION_DATA */
455 i = s->handshake_func(s);
456 if (i < 0)
457 return (i);
458 if (i == 0) {
459 SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_SSL_HANDSHAKE_FAILURE);
460 return (-1);
461 }
462 }
463
464 start:
465 s->rwstate = SSL_NOTHING;
466
50e735f9
MC
467 /*-
468 * s->s3->rrec.type - is the type of record
469 * s->s3->rrec.data, - data
470 * s->s3->rrec.off, - offset into 'data' for next read
471 * s->s3->rrec.length, - number of bytes.
472 */
88c23039 473 rr = &s->rlayer.rrec;
0f113f3e
MC
474
475 /*
476 * We are not handshaking and have no data yet, so process data buffered
477 * during the last handshake in advance, if any.
478 */
479 if (s->state == SSL_ST_OK && rr->length == 0) {
480 pitem *item;
24a1e2f2 481 item = pqueue_pop(s->rlayer.d->buffered_app_data.q);
0f113f3e 482 if (item) {
7e159e01 483#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
484 /* Restore bio_dgram_sctp_rcvinfo struct */
485 if (BIO_dgram_is_sctp(SSL_get_rbio(s))) {
486 DTLS1_RECORD_DATA *rdata = (DTLS1_RECORD_DATA *)item->data;
487 BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SCTP_SET_RCVINFO,
488 sizeof(rdata->recordinfo), &rdata->recordinfo);
489 }
7e159e01
DSH
490#endif
491
0f113f3e
MC
492 dtls1_copy_record(s, item);
493
494 OPENSSL_free(item->data);
495 pitem_free(item);
496 }
497 }
498
499 /* Check for timeout */
500 if (dtls1_handle_timeout(s) > 0)
501 goto start;
502
503 /* get new packet if necessary */
295c3f41 504 if ((rr->length == 0) || (s->rlayer.rstate == SSL_ST_READ_BODY)) {
0f113f3e
MC
505 ret = dtls1_get_record(s);
506 if (ret <= 0) {
507 ret = dtls1_read_failed(s, ret);
508 /* anything other than a timeout is an error */
509 if (ret <= 0)
510 return (ret);
511 else
512 goto start;
513 }
514 }
515
516 if (s->d1->listen && rr->type != SSL3_RT_HANDSHAKE) {
517 rr->length = 0;
518 goto start;
519 }
520
521 /* we now have a packet which can be read and processed */
522
523 if (s->s3->change_cipher_spec /* set when we receive ChangeCipherSpec,
524 * reset by ssl3_get_finished */
525 && (rr->type != SSL3_RT_HANDSHAKE)) {
526 /*
527 * We now have application data between CCS and Finished. Most likely
528 * the packets were reordered on their way, so buffer the application
529 * data for later processing rather than dropping the connection.
530 */
24a1e2f2
MC
531 if (dtls1_buffer_record(s, &(s->rlayer.d->buffered_app_data),
532 rr->seq_num) < 0) {
0f113f3e
MC
533 SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR);
534 return -1;
535 }
536 rr->length = 0;
537 goto start;
538 }
539
540 /*
541 * If the other end has shut down, throw anything we read away (even in
542 * 'peek' mode)
543 */
544 if (s->shutdown & SSL_RECEIVED_SHUTDOWN) {
545 rr->length = 0;
546 s->rwstate = SSL_NOTHING;
547 return (0);
548 }
549
550 if (type == rr->type) { /* SSL3_RT_APPLICATION_DATA or
551 * SSL3_RT_HANDSHAKE */
552 /*
553 * make sure that we are not getting application data when we are
554 * doing a handshake for the first time
555 */
556 if (SSL_in_init(s) && (type == SSL3_RT_APPLICATION_DATA) &&
557 (s->enc_read_ctx == NULL)) {
558 al = SSL_AD_UNEXPECTED_MESSAGE;
559 SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_APP_DATA_IN_HANDSHAKE);
560 goto f_err;
561 }
7e159e01 562
0f113f3e
MC
563 if (len <= 0)
564 return (len);
565
566 if ((unsigned int)len > rr->length)
567 n = rr->length;
568 else
569 n = (unsigned int)len;
570
571 memcpy(buf, &(rr->data[rr->off]), n);
572 if (!peek) {
573 rr->length -= n;
574 rr->off += n;
575 if (rr->length == 0) {
295c3f41 576 s->rlayer.rstate = SSL_ST_READ_HEADER;
0f113f3e
MC
577 rr->off = 0;
578 }
579 }
7e159e01 580#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
581 /*
582 * We were about to renegotiate but had to read belated application
583 * data first, so retry.
584 */
585 if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
586 rr->type == SSL3_RT_APPLICATION_DATA &&
587 (s->state == DTLS1_SCTP_ST_SR_READ_SOCK
588 || s->state == DTLS1_SCTP_ST_CR_READ_SOCK)) {
589 s->rwstate = SSL_READING;
590 BIO_clear_retry_flags(SSL_get_rbio(s));
591 BIO_set_retry_read(SSL_get_rbio(s));
592 }
593
594 /*
595 * We might had to delay a close_notify alert because of reordered
596 * app data. If there was an alert and there is no message to read
597 * anymore, finally set shutdown.
598 */
599 if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
600 s->d1->shutdown_received
601 && !BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s))) {
602 s->shutdown |= SSL_RECEIVED_SHUTDOWN;
603 return (0);
604 }
605#endif
606 return (n);
607 }
608
609 /*
610 * If we get here, then type != rr->type; if we have a handshake message,
611 * then it was unexpected (Hello Request or Client Hello).
612 */
613
614 /*
615 * In case of record types for which we have 'fragment' storage, fill
616 * that so that we can process the data at a fixed place.
617 */
618 {
619 unsigned int k, dest_maxlen = 0;
620 unsigned char *dest = NULL;
621 unsigned int *dest_len = NULL;
622
623 if (rr->type == SSL3_RT_HANDSHAKE) {
c661ac16
MC
624 dest_maxlen = sizeof s->rlayer.d->handshake_fragment;
625 dest = s->rlayer.d->handshake_fragment;
626 dest_len = &s->rlayer.d->handshake_fragment_len;
0f113f3e 627 } else if (rr->type == SSL3_RT_ALERT) {
c661ac16
MC
628 dest_maxlen = sizeof(s->rlayer.d->alert_fragment);
629 dest = s->rlayer.d->alert_fragment;
630 dest_len = &s->rlayer.d->alert_fragment_len;
0f113f3e 631 }
4817504d 632#ifndef OPENSSL_NO_HEARTBEATS
0f113f3e 633 else if (rr->type == TLS1_RT_HEARTBEAT) {
69f68237 634 /* We allow a 0 return */
2c60ed04
MC
635 if(dtls1_process_heartbeat(s, SSL3_RECORD_get_data(&s->rlayer.rrec),
636 SSL3_RECORD_get_length(&s->rlayer.rrec)) < 0) {
69f68237
MC
637 return -1;
638 }
0f113f3e
MC
639 /* Exit and notify application to read again */
640 rr->length = 0;
641 s->rwstate = SSL_READING;
642 BIO_clear_retry_flags(SSL_get_rbio(s));
643 BIO_set_retry_read(SSL_get_rbio(s));
644 return (-1);
645 }
4817504d 646#endif
0f113f3e
MC
647 /* else it's a CCS message, or application data or wrong */
648 else if (rr->type != SSL3_RT_CHANGE_CIPHER_SPEC) {
649 /*
650 * Application data while renegotiating is allowed. Try again
651 * reading.
652 */
653 if (rr->type == SSL3_RT_APPLICATION_DATA) {
654 BIO *bio;
655 s->s3->in_read_app_data = 2;
656 bio = SSL_get_rbio(s);
657 s->rwstate = SSL_READING;
658 BIO_clear_retry_flags(bio);
659 BIO_set_retry_read(bio);
660 return (-1);
661 }
662
663 /* Not certain if this is the right error handling */
664 al = SSL_AD_UNEXPECTED_MESSAGE;
665 SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNEXPECTED_RECORD);
666 goto f_err;
667 }
668
669 if (dest_maxlen > 0) {
670 /*
671 * XDTLS: In a pathalogical case, the Client Hello may be
672 * fragmented--don't always expect dest_maxlen bytes
673 */
674 if (rr->length < dest_maxlen) {
d4938995 675#ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
0f113f3e
MC
676 /*
677 * for normal alerts rr->length is 2, while
678 * dest_maxlen is 7 if we were to handle this
679 * non-existing alert...
680 */
681 FIX ME
d4938995 682#endif
295c3f41 683 s->rlayer.rstate = SSL_ST_READ_HEADER;
0f113f3e
MC
684 rr->length = 0;
685 goto start;
686 }
687
688 /* now move 'n' bytes: */
689 for (k = 0; k < dest_maxlen; k++) {
690 dest[k] = rr->data[rr->off++];
691 rr->length--;
692 }
693 *dest_len = dest_maxlen;
694 }
695 }
696
35a1cc90 697 /*-
c661ac16
MC
698 * s->rlayer.d->handshake_fragment_len == 12 iff rr->type == SSL3_RT_HANDSHAKE;
699 * s->rlayer.d->alert_fragment_len == 7 iff rr->type == SSL3_RT_ALERT.
35a1cc90
MC
700 * (Possibly rr is 'empty' now, i.e. rr->length may be 0.)
701 */
0f113f3e
MC
702
703 /* If we are a client, check for an incoming 'Hello Request': */
704 if ((!s->server) &&
c661ac16
MC
705 (s->rlayer.d->handshake_fragment_len >= DTLS1_HM_HEADER_LENGTH) &&
706 (s->rlayer.d->handshake_fragment[0] == SSL3_MT_HELLO_REQUEST) &&
0f113f3e 707 (s->session != NULL) && (s->session->cipher != NULL)) {
c661ac16 708 s->rlayer.d->handshake_fragment_len = 0;
0f113f3e 709
c661ac16
MC
710 if ((s->rlayer.d->handshake_fragment[1] != 0) ||
711 (s->rlayer.d->handshake_fragment[2] != 0) ||
712 (s->rlayer.d->handshake_fragment[3] != 0)) {
0f113f3e
MC
713 al = SSL_AD_DECODE_ERROR;
714 SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_BAD_HELLO_REQUEST);
715 goto err;
716 }
717
718 /*
719 * no need to check sequence number on HELLO REQUEST messages
720 */
721
722 if (s->msg_callback)
723 s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE,
c661ac16 724 s->rlayer.d->handshake_fragment, 4, s,
0f113f3e
MC
725 s->msg_callback_arg);
726
727 if (SSL_is_init_finished(s) &&
728 !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) &&
729 !s->s3->renegotiate) {
730 s->d1->handshake_read_seq++;
731 s->new_session = 1;
732 ssl3_renegotiate(s);
733 if (ssl3_renegotiate_check(s)) {
734 i = s->handshake_func(s);
735 if (i < 0)
736 return (i);
737 if (i == 0) {
738 SSLerr(SSL_F_DTLS1_READ_BYTES,
739 SSL_R_SSL_HANDSHAKE_FAILURE);
740 return (-1);
741 }
742
743 if (!(s->mode & SSL_MODE_AUTO_RETRY)) {
88c23039 744 if (SSL3_BUFFER_get_left(&s->rlayer.rbuf) == 0) {
28d59af8 745 /* no read-ahead left? */
0f113f3e
MC
746 BIO *bio;
747 /*
748 * In the case where we try to read application data,
749 * but we trigger an SSL handshake, we return -1 with
750 * the retry option set. Otherwise renegotiation may
751 * cause nasty problems in the blocking world
752 */
753 s->rwstate = SSL_READING;
754 bio = SSL_get_rbio(s);
755 BIO_clear_retry_flags(bio);
756 BIO_set_retry_read(bio);
757 return (-1);
758 }
759 }
760 }
761 }
762 /*
763 * we either finished a handshake or ignored the request, now try
764 * again to obtain the (application) data we were asked for
765 */
766 goto start;
767 }
768
c661ac16
MC
769 if (s->rlayer.d->alert_fragment_len >= DTLS1_AL_HEADER_LENGTH) {
770 int alert_level = s->rlayer.d->alert_fragment[0];
771 int alert_descr = s->rlayer.d->alert_fragment[1];
0f113f3e 772
c661ac16 773 s->rlayer.d->alert_fragment_len = 0;
0f113f3e
MC
774
775 if (s->msg_callback)
776 s->msg_callback(0, s->version, SSL3_RT_ALERT,
c661ac16
MC
777 s->rlayer.d->alert_fragment, 2, s,
778 s->msg_callback_arg);
0f113f3e
MC
779
780 if (s->info_callback != NULL)
781 cb = s->info_callback;
782 else if (s->ctx->info_callback != NULL)
783 cb = s->ctx->info_callback;
784
785 if (cb != NULL) {
786 j = (alert_level << 8) | alert_descr;
787 cb(s, SSL_CB_READ_ALERT, j);
788 }
789
fd865cad 790 if (alert_level == SSL3_AL_WARNING) {
0f113f3e
MC
791 s->s3->warn_alert = alert_descr;
792 if (alert_descr == SSL_AD_CLOSE_NOTIFY) {
7e159e01 793#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
794 /*
795 * With SCTP and streams the socket may deliver app data
796 * after a close_notify alert. We have to check this first so
797 * that nothing gets discarded.
798 */
799 if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
800 BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s))) {
801 s->d1->shutdown_received = 1;
802 s->rwstate = SSL_READING;
803 BIO_clear_retry_flags(SSL_get_rbio(s));
804 BIO_set_retry_read(SSL_get_rbio(s));
805 return -1;
806 }
7e159e01 807#endif
0f113f3e
MC
808 s->shutdown |= SSL_RECEIVED_SHUTDOWN;
809 return (0);
810 }
36d16f8e
BL
811#if 0
812 /* XXX: this is a possible improvement in the future */
0f113f3e
MC
813 /* now check if it's a missing record */
814 if (alert_descr == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) {
815 unsigned short seq;
816 unsigned int frag_off;
c661ac16 817 unsigned char *p = &(s->rlayer.d->alert_fragment[2]);
0f113f3e
MC
818
819 n2s(p, seq);
820 n2l3(p, frag_off);
821
822 dtls1_retransmit_message(s,
823 dtls1_get_queue_priority
824 (frag->msg_header.seq, 0), frag_off,
825 &found);
826 if (!found && SSL_in_init(s)) {
827 /*
828 * fprintf( stderr,"in init = %d\n", SSL_in_init(s));
829 */
830 /*
831 * requested a message not yet sent, send an alert
832 * ourselves
833 */
834 ssl3_send_alert(s, SSL3_AL_WARNING,
835 DTLS1_AD_MISSING_HANDSHAKE_MESSAGE);
836 }
837 }
36d16f8e 838#endif
fd865cad 839 } else if (alert_level == SSL3_AL_FATAL) {
0f113f3e
MC
840 char tmp[16];
841
842 s->rwstate = SSL_NOTHING;
843 s->s3->fatal_alert = alert_descr;
844 SSLerr(SSL_F_DTLS1_READ_BYTES,
845 SSL_AD_REASON_OFFSET + alert_descr);
846 BIO_snprintf(tmp, sizeof tmp, "%d", alert_descr);
847 ERR_add_error_data(2, "SSL alert number ", tmp);
848 s->shutdown |= SSL_RECEIVED_SHUTDOWN;
849 SSL_CTX_remove_session(s->ctx, s->session);
850 return (0);
851 } else {
852 al = SSL_AD_ILLEGAL_PARAMETER;
853 SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNKNOWN_ALERT_TYPE);
854 goto f_err;
855 }
856
857 goto start;
858 }
859
860 if (s->shutdown & SSL_SENT_SHUTDOWN) { /* but we have not received a
861 * shutdown */
862 s->rwstate = SSL_NOTHING;
863 rr->length = 0;
864 return (0);
865 }
866
867 if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC) {
868 struct ccs_header_st ccs_hdr;
869 unsigned int ccs_hdr_len = DTLS1_CCS_HEADER_LENGTH;
870
871 dtls1_get_ccs_header(rr->data, &ccs_hdr);
872
873 if (s->version == DTLS1_BAD_VER)
874 ccs_hdr_len = 3;
875
876 /*
877 * 'Change Cipher Spec' is just a single byte, so we know exactly
878 * what the record payload has to look like
879 */
880 /* XDTLS: check that epoch is consistent */
881 if ((rr->length != ccs_hdr_len) ||
882 (rr->off != 0) || (rr->data[0] != SSL3_MT_CCS)) {
883 i = SSL_AD_ILLEGAL_PARAMETER;
884 SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_BAD_CHANGE_CIPHER_SPEC);
885 goto err;
886 }
887
888 rr->length = 0;
889
890 if (s->msg_callback)
891 s->msg_callback(0, s->version, SSL3_RT_CHANGE_CIPHER_SPEC,
892 rr->data, 1, s, s->msg_callback_arg);
893
894 /*
895 * We can't process a CCS now, because previous handshake messages
896 * are still missing, so just drop it.
897 */
898 if (!s->d1->change_cipher_spec_ok) {
899 goto start;
900 }
901
902 s->d1->change_cipher_spec_ok = 0;
903
904 s->s3->change_cipher_spec = 1;
905 if (!ssl3_do_change_cipher_spec(s))
906 goto err;
907
908 /* do this whenever CCS is processed */
909 dtls1_reset_seq_numbers(s, SSL3_CC_READ);
910
911 if (s->version == DTLS1_BAD_VER)
912 s->d1->handshake_read_seq++;
8711efb4 913
7e159e01 914#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
915 /*
916 * Remember that a CCS has been received, so that an old key of
917 * SCTP-Auth can be deleted when a CCS is sent. Will be ignored if no
918 * SCTP is used
919 */
920 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD, 1, NULL);
7e159e01
DSH
921#endif
922
0f113f3e
MC
923 goto start;
924 }
925
926 /*
927 * Unexpected handshake message (Client Hello, or protocol violation)
928 */
c661ac16 929 if ((s->rlayer.d->handshake_fragment_len >= DTLS1_HM_HEADER_LENGTH) &&
0f113f3e
MC
930 !s->in_handshake) {
931 struct hm_header_st msg_hdr;
932
933 /* this may just be a stale retransmit */
934 dtls1_get_message_header(rr->data, &msg_hdr);
78a39fe7 935 if (rr->epoch != s->rlayer.d->r_epoch) {
0f113f3e
MC
936 rr->length = 0;
937 goto start;
938 }
939
940 /*
941 * If we are server, we may have a repeated FINISHED of the client
942 * here, then retransmit our CCS and FINISHED.
943 */
944 if (msg_hdr.type == SSL3_MT_FINISHED) {
945 if (dtls1_check_timeout_num(s) < 0)
946 return -1;
947
17dd65e6 948 dtls1_retransmit_buffered_messages(s);
0f113f3e
MC
949 rr->length = 0;
950 goto start;
951 }
952
953 if (((s->state & SSL_ST_MASK) == SSL_ST_OK) &&
954 !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)) {
0f113f3e 955 s->state = s->server ? SSL_ST_ACCEPT : SSL_ST_CONNECT;
0f113f3e
MC
956 s->renegotiate = 1;
957 s->new_session = 1;
958 }
959 i = s->handshake_func(s);
960 if (i < 0)
961 return (i);
962 if (i == 0) {
963 SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_SSL_HANDSHAKE_FAILURE);
964 return (-1);
965 }
966
967 if (!(s->mode & SSL_MODE_AUTO_RETRY)) {
88c23039 968 if (SSL3_BUFFER_get_left(&s->rlayer.rbuf) == 0) {
28d59af8 969 /* no read-ahead left? */
0f113f3e
MC
970 BIO *bio;
971 /*
972 * In the case where we try to read application data, but we
973 * trigger an SSL handshake, we return -1 with the retry
974 * option set. Otherwise renegotiation may cause nasty
975 * problems in the blocking world
976 */
977 s->rwstate = SSL_READING;
978 bio = SSL_get_rbio(s);
979 BIO_clear_retry_flags(bio);
980 BIO_set_retry_read(bio);
981 return (-1);
982 }
983 }
984 goto start;
985 }
986
987 switch (rr->type) {
988 default:
0f113f3e
MC
989 /* TLS just ignores unknown message types */
990 if (s->version == TLS1_VERSION) {
991 rr->length = 0;
992 goto start;
993 }
0f113f3e
MC
994 al = SSL_AD_UNEXPECTED_MESSAGE;
995 SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNEXPECTED_RECORD);
996 goto f_err;
997 case SSL3_RT_CHANGE_CIPHER_SPEC:
998 case SSL3_RT_ALERT:
999 case SSL3_RT_HANDSHAKE:
1000 /*
1001 * we already handled all of these, with the possible exception of
1002 * SSL3_RT_HANDSHAKE when s->in_handshake is set, but that should not
1003 * happen when type != rr->type
1004 */
1005 al = SSL_AD_UNEXPECTED_MESSAGE;
1006 SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR);
1007 goto f_err;
1008 case SSL3_RT_APPLICATION_DATA:
1009 /*
1010 * At this point, we were expecting handshake data, but have
1011 * application data. If the library was running inside ssl3_read()
1012 * (i.e. in_read_app_data is set) and it makes sense to read
1013 * application data at this point (session renegotiation not yet
1014 * started), we will indulge it.
1015 */
1016 if (s->s3->in_read_app_data &&
1017 (s->s3->total_renegotiations != 0) &&
1018 (((s->state & SSL_ST_CONNECT) &&
1019 (s->state >= SSL3_ST_CW_CLNT_HELLO_A) &&
1020 (s->state <= SSL3_ST_CR_SRVR_HELLO_A)
1021 ) || ((s->state & SSL_ST_ACCEPT) &&
1022 (s->state <= SSL3_ST_SW_HELLO_REQ_A) &&
1023 (s->state >= SSL3_ST_SR_CLNT_HELLO_A)
1024 )
1025 )) {
1026 s->s3->in_read_app_data = 2;
1027 return (-1);
1028 } else {
1029 al = SSL_AD_UNEXPECTED_MESSAGE;
1030 SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNEXPECTED_RECORD);
1031 goto f_err;
1032 }
1033 }
1034 /* not reached */
1035
1036 f_err:
1037 ssl3_send_alert(s, SSL3_AL_FATAL, al);
1038 err:
1039 return (-1);
1040}
1041
0f113f3e
MC
1042
1043 /*
1044 * this only happens when a client hello is received and a handshake
1045 * is started.
1046 */
36d16f8e 1047static int
0f113f3e
MC
1048have_handshake_fragment(SSL *s, int type, unsigned char *buf,
1049 int len, int peek)
1050{
1051
c661ac16
MC
1052 if ((type == SSL3_RT_HANDSHAKE)
1053 && (s->rlayer.d->handshake_fragment_len > 0))
0f113f3e
MC
1054 /* (partially) satisfy request from storage */
1055 {
c661ac16 1056 unsigned char *src = s->rlayer.d->handshake_fragment;
0f113f3e
MC
1057 unsigned char *dst = buf;
1058 unsigned int k, n;
1059
1060 /* peek == 0 */
1061 n = 0;
c661ac16 1062 while ((len > 0) && (s->rlayer.d->handshake_fragment_len > 0)) {
0f113f3e
MC
1063 *dst++ = *src++;
1064 len--;
c661ac16 1065 s->rlayer.d->handshake_fragment_len--;
0f113f3e
MC
1066 n++;
1067 }
1068 /* move any remaining fragment bytes: */
c661ac16
MC
1069 for (k = 0; k < s->rlayer.d->handshake_fragment_len; k++)
1070 s->rlayer.d->handshake_fragment[k] = *src++;
0f113f3e
MC
1071 return n;
1072 }
1073
1074 return 0;
1075}
1076
1077/*
1078 * Call this to write data in records of type 'type' It will return <= 0 if
1079 * not all data has been sent or non-blocking IO.
36d16f8e 1080 */
480b9e5d 1081int dtls1_write_bytes(SSL *s, int type, const void *buf, int len)
0f113f3e
MC
1082{
1083 int i;
1084
1085 OPENSSL_assert(len <= SSL3_RT_MAX_PLAIN_LENGTH);
1086 s->rwstate = SSL_NOTHING;
1087 i = do_dtls1_write(s, type, buf, len, 0);
1088 return i;
1089}
1090
1091int do_dtls1_write(SSL *s, int type, const unsigned char *buf,
1092 unsigned int len, int create_empty_fragment)
1093{
1094 unsigned char *p, *pseq;
1095 int i, mac_size, clear = 0;
1096 int prefix_len = 0;
1097 int eivlen;
1098 SSL3_RECORD *wr;
1099 SSL3_BUFFER *wb;
1100 SSL_SESSION *sess;
1101
88c23039 1102 wb = &s->rlayer.wbuf;
db9a32e7 1103
0f113f3e
MC
1104 /*
1105 * first check if there is a SSL3_BUFFER still being written out. This
1106 * will happen with non blocking IO
1107 */
db9a32e7 1108 if (SSL3_BUFFER_get_left(wb) != 0) {
0f113f3e
MC
1109 OPENSSL_assert(0); /* XDTLS: want to see if we ever get here */
1110 return (ssl3_write_pending(s, type, buf, len));
1111 }
1112
1113 /* If we have an alert to send, lets send it */
1114 if (s->s3->alert_dispatch) {
1115 i = s->method->ssl_dispatch_alert(s);
1116 if (i <= 0)
1117 return (i);
1118 /* if it went, fall through and send more stuff */
1119 }
1120
1121 if (len == 0 && !create_empty_fragment)
1122 return 0;
1123
88c23039 1124 wr = &s->rlayer.wrec;
0f113f3e
MC
1125 sess = s->session;
1126
1127 if ((sess == NULL) ||
1128 (s->enc_write_ctx == NULL) || (EVP_MD_CTX_md(s->write_hash) == NULL))
1129 clear = 1;
1130
1131 if (clear)
1132 mac_size = 0;
1133 else {
1134 mac_size = EVP_MD_CTX_size(s->write_hash);
1135 if (mac_size < 0)
1136 goto err;
1137 }
1138
0f113f3e
MC
1139 p = wb->buf + prefix_len;
1140
1141 /* write the header */
1142
1143 *(p++) = type & 0xff;
1144 wr->type = type;
1145 /*
1146 * Special case: for hello verify request, client version 1.0 and we
1147 * haven't decided which version to use yet send back using version 1.0
1148 * header: otherwise some clients will ignore it.
1149 */
1150 if (s->method->version == DTLS_ANY_VERSION) {
1151 *(p++) = DTLS1_VERSION >> 8;
1152 *(p++) = DTLS1_VERSION & 0xff;
1153 } else {
1154 *(p++) = s->version >> 8;
1155 *(p++) = s->version & 0xff;
1156 }
1157
1158 /* field where we are to write out packet epoch, seq num and len */
1159 pseq = p;
1160 p += 10;
1161
1162 /* Explicit IV length, block ciphers appropriate version flag */
1163 if (s->enc_write_ctx) {
1164 int mode = EVP_CIPHER_CTX_mode(s->enc_write_ctx);
1165 if (mode == EVP_CIPH_CBC_MODE) {
1166 eivlen = EVP_CIPHER_CTX_iv_length(s->enc_write_ctx);
1167 if (eivlen <= 1)
1168 eivlen = 0;
1169 }
1170 /* Need explicit part of IV for GCM mode */
1171 else if (mode == EVP_CIPH_GCM_MODE)
1172 eivlen = EVP_GCM_TLS_EXPLICIT_IV_LEN;
1173 else
1174 eivlen = 0;
1175 } else
1176 eivlen = 0;
1177
1178 /* lets setup the record stuff. */
1179 wr->data = p + eivlen; /* make room for IV in case of CBC */
1180 wr->length = (int)len;
1181 wr->input = (unsigned char *)buf;
1182
1183 /*
1184 * we now 'read' from wr->input, wr->length bytes into wr->data
1185 */
1186
1187 /* first we compress */
1188 if (s->compress != NULL) {
1189 if (!ssl3_do_compress(s)) {
1190 SSLerr(SSL_F_DO_DTLS1_WRITE, SSL_R_COMPRESSION_FAILURE);
1191 goto err;
1192 }
1193 } else {
1194 memcpy(wr->data, wr->input, wr->length);
1195 wr->input = wr->data;
1196 }
36d16f8e 1197
0f113f3e
MC
1198 /*
1199 * we should still have the output to wr->data and the input from
1200 * wr->input. Length should be wr->length. wr->data still points in the
1201 * wb->buf
1202 */
36d16f8e 1203
0f113f3e
MC
1204 if (mac_size != 0) {
1205 if (s->method->ssl3_enc->mac(s, &(p[wr->length + eivlen]), 1) < 0)
1206 goto err;
1207 wr->length += mac_size;
1208 }
36d16f8e 1209
0f113f3e
MC
1210 /* this is true regardless of mac size */
1211 wr->input = p;
1212 wr->data = p;
36d16f8e 1213
0f113f3e
MC
1214 if (eivlen)
1215 wr->length += eivlen;
36d16f8e 1216
0f113f3e
MC
1217 if (s->method->ssl3_enc->enc(s, 1) < 1)
1218 goto err;
36d16f8e 1219
0f113f3e
MC
1220 /* record length after mac and block padding */
1221 /*
1222 * if (type == SSL3_RT_APPLICATION_DATA || (type == SSL3_RT_ALERT && !
1223 * SSL_in_init(s)))
1224 */
36d16f8e 1225
0f113f3e 1226 /* there's only one epoch between handshake and app data */
36d16f8e 1227
78a39fe7 1228 s2n(s->rlayer.d->w_epoch, pseq);
36d16f8e 1229
0f113f3e
MC
1230 /* XDTLS: ?? */
1231 /*
1232 * else s2n(s->d1->handshake_epoch, pseq);
1233 */
36d16f8e 1234
de07f311 1235 memcpy(pseq, &(s->rlayer.write_sequence[2]), 6);
0f113f3e
MC
1236 pseq += 6;
1237 s2n(wr->length, pseq);
36d16f8e 1238
0f113f3e
MC
1239 if (s->msg_callback)
1240 s->msg_callback(1, 0, SSL3_RT_HEADER, pseq - DTLS1_RT_HEADER_LENGTH,
1241 DTLS1_RT_HEADER_LENGTH, s, s->msg_callback_arg);
36d16f8e 1242
0f113f3e
MC
1243 /*
1244 * we should now have wr->data pointing to the encrypted data, which is
1245 * wr->length long
1246 */
1247 wr->type = type; /* not needed but helps for debugging */
1248 wr->length += DTLS1_RT_HEADER_LENGTH;
36d16f8e 1249
de07f311 1250 ssl3_record_sequence_update(&(s->rlayer.write_sequence[0]));
36d16f8e 1251
0f113f3e
MC
1252 if (create_empty_fragment) {
1253 /*
1254 * we are in a recursive call; just return the length, don't write
1255 * out anything here
1256 */
1257 return wr->length;
1258 }
36d16f8e 1259
0f113f3e
MC
1260 /* now let's set up wb */
1261 wb->left = prefix_len + wr->length;
1262 wb->offset = 0;
1263
1264 /*
1265 * memorize arguments so that ssl3_write_pending can detect bad write
1266 * retries later
1267 */
f8caa3c8
MC
1268 s->rlayer.wpend_tot = len;
1269 s->rlayer.wpend_buf = buf;
1270 s->rlayer.wpend_type = type;
1271 s->rlayer.wpend_ret = len;
0f113f3e
MC
1272
1273 /* we now just need to write the buffer */
1274 return ssl3_write_pending(s, type, buf, len);
1275 err:
1276 return -1;
1277}
36d16f8e 1278
fe589e61 1279DTLS1_BITMAP *dtls1_get_bitmap(SSL *s, SSL3_RECORD *rr,
0f113f3e
MC
1280 unsigned int *is_next_epoch)
1281{
1282
36d16f8e
BL
1283 *is_next_epoch = 0;
1284
1285 /* In current epoch, accept HM, CCS, DATA, & ALERT */
78a39fe7 1286 if (rr->epoch == s->rlayer.d->r_epoch)
91f93f69 1287 return &s->rlayer.d->bitmap;
36d16f8e
BL
1288
1289 /* Only HM and ALERT messages can be from the next epoch */
78a39fe7
MC
1290 else if (rr->epoch == (unsigned long)(s->rlayer.d->r_epoch + 1) &&
1291 (rr->type == SSL3_RT_HANDSHAKE || rr->type == SSL3_RT_ALERT)) {
36d16f8e 1292 *is_next_epoch = 1;
91f93f69 1293 return &s->rlayer.d->next_bitmap;
0f113f3e 1294 }
36d16f8e
BL
1295
1296 return NULL;
0f113f3e 1297}
36d16f8e 1298
0f113f3e
MC
1299void dtls1_reset_seq_numbers(SSL *s, int rw)
1300{
1301 unsigned char *seq;
de07f311 1302 unsigned int seq_bytes = sizeof(s->rlayer.read_sequence);
0f113f3e
MC
1303
1304 if (rw & SSL3_CC_READ) {
de07f311 1305 seq = s->rlayer.read_sequence;
78a39fe7 1306 s->rlayer.d->r_epoch++;
c661ac16
MC
1307 memcpy(&(s->rlayer.d->bitmap), &(s->rlayer.d->next_bitmap),
1308 sizeof(DTLS1_BITMAP));
91f93f69 1309 memset(&(s->rlayer.d->next_bitmap), 0x00, sizeof(DTLS1_BITMAP));
0f113f3e 1310 } else {
de07f311 1311 seq = s->rlayer.write_sequence;
3bb8f87d 1312 memcpy(s->rlayer.d->last_write_sequence, seq,
de07f311 1313 sizeof(s->rlayer.write_sequence));
78a39fe7 1314 s->rlayer.d->w_epoch++;
0f113f3e
MC
1315 }
1316
1317 memset(seq, 0x00, seq_bytes);
1318}