Branch data Line data Source code
1 : : /* ssl/d1_pkt.c */
2 : : /*
3 : : * DTLS implementation written by Nagendra Modadugu
4 : : * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
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
14 : : * notice, this list of conditions and the following disclaimer.
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.
65 : : *
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).
72 : : *
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.
79 : : *
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 :-).
94 : : * 4. If you include any Windows specific code (or a derivative thereof) from
95 : : * the apps directory (application code) you must include an acknowledgement:
96 : : * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
97 : : *
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.
109 : : *
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
119 : : #include "ssl_locl.h"
120 : : #include <openssl/evp.h>
121 : : #include <openssl/buffer.h>
122 : : #include <openssl/pqueue.h>
123 : : #include <openssl/rand.h>
124 : :
125 : : /* mod 128 saturating subtract of two 64-bit values in big-endian order */
126 : 0 : static int satsub64be(const unsigned char *v1,const unsigned char *v2)
127 : : { int ret,sat,brw,i;
128 : :
129 : : if (sizeof(long) == 8) do
130 : : { const union { long one; char little; } is_endian = {1};
131 : : long l;
132 : :
133 : : if (is_endian.little) break;
134 : : /* not reached on little-endians */
135 : : /* following test is redundant, because input is
136 : : * always aligned, but I take no chances... */
137 : : if (((size_t)v1|(size_t)v2)&0x7) break;
138 : :
139 : : l = *((long *)v1);
140 : : l -= *((long *)v2);
141 : : if (l>128) return 128;
142 : : else if (l<-128) return -128;
143 : : else return (int)l;
144 : : } while (0);
145 : :
146 : 0 : ret = (int)v1[7]-(int)v2[7];
147 : 0 : sat = 0;
148 : 0 : brw = ret>>8; /* brw is either 0 or -1 */
149 [ # # ]: 0 : if (ret & 0x80)
150 [ # # ]: 0 : { for (i=6;i>=0;i--)
151 : 0 : { brw += (int)v1[i]-(int)v2[i];
152 : 0 : sat |= ~brw;
153 : 0 : brw >>= 8;
154 : : }
155 : : }
156 : : else
157 [ # # ]: 0 : { for (i=6;i>=0;i--)
158 : 0 : { brw += (int)v1[i]-(int)v2[i];
159 : 0 : sat |= brw;
160 : 0 : brw >>= 8;
161 : : }
162 : : }
163 : 0 : brw <<= 8; /* brw is either 0 or -256 */
164 : :
165 [ # # ]: 0 : if (sat&0xff) return brw | 0x80;
166 : 0 : else return brw + (ret&0xFF);
167 : : }
168 : :
169 : : static int have_handshake_fragment(SSL *s, int type, unsigned char *buf,
170 : : int len, int peek);
171 : : static int dtls1_record_replay_check(SSL *s, DTLS1_BITMAP *bitmap);
172 : : static void dtls1_record_bitmap_update(SSL *s, DTLS1_BITMAP *bitmap);
173 : : static DTLS1_BITMAP *dtls1_get_bitmap(SSL *s, SSL3_RECORD *rr,
174 : : unsigned int *is_next_epoch);
175 : : #if 0
176 : : static int dtls1_record_needs_buffering(SSL *s, SSL3_RECORD *rr,
177 : : unsigned short *priority, unsigned long *offset);
178 : : #endif
179 : : static int dtls1_buffer_record(SSL *s, record_pqueue *q,
180 : : unsigned char *priority);
181 : : static int dtls1_process_record(SSL *s);
182 : :
183 : : /* copy buffered record into SSL structure */
184 : : static int
185 : 0 : dtls1_copy_record(SSL *s, pitem *item)
186 : : {
187 : : DTLS1_RECORD_DATA *rdata;
188 : :
189 : 0 : rdata = (DTLS1_RECORD_DATA *)item->data;
190 : :
191 [ # # ]: 0 : if (s->s3->rbuf.buf != NULL)
192 : 0 : OPENSSL_free(s->s3->rbuf.buf);
193 : :
194 : 0 : s->packet = rdata->packet;
195 : 0 : s->packet_length = rdata->packet_length;
196 : 0 : memcpy(&(s->s3->rbuf), &(rdata->rbuf), sizeof(SSL3_BUFFER));
197 : 0 : memcpy(&(s->s3->rrec), &(rdata->rrec), sizeof(SSL3_RECORD));
198 : :
199 : : /* Set proper sequence number for mac calculation */
200 : 0 : memcpy(&(s->s3->read_sequence[2]), &(rdata->packet[5]), 6);
201 : :
202 : 0 : return(1);
203 : : }
204 : :
205 : :
206 : : static int
207 : 0 : dtls1_buffer_record(SSL *s, record_pqueue *queue, unsigned char *priority)
208 : : {
209 : : DTLS1_RECORD_DATA *rdata;
210 : : pitem *item;
211 : :
212 : : /* Limit the size of the queue to prevent DOS attacks */
213 [ # # ]: 0 : if (pqueue_size(queue->q) >= 100)
214 : : return 0;
215 : :
216 : 0 : rdata = OPENSSL_malloc(sizeof(DTLS1_RECORD_DATA));
217 : 0 : item = pitem_new(priority, rdata);
218 [ # # ]: 0 : if (rdata == NULL || item == NULL)
219 : : {
220 [ # # ]: 0 : if (rdata != NULL) OPENSSL_free(rdata);
221 [ # # ]: 0 : if (item != NULL) pitem_free(item);
222 : :
223 : 0 : SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR);
224 : : return(0);
225 : : }
226 : :
227 : 0 : rdata->packet = s->packet;
228 : 0 : rdata->packet_length = s->packet_length;
229 : 0 : memcpy(&(rdata->rbuf), &(s->s3->rbuf), sizeof(SSL3_BUFFER));
230 : 0 : memcpy(&(rdata->rrec), &(s->s3->rrec), sizeof(SSL3_RECORD));
231 : :
232 : 0 : item->data = rdata;
233 : :
234 : : #ifndef OPENSSL_NO_SCTP
235 : : /* Store bio_dgram_sctp_rcvinfo struct */
236 : : if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
237 : : (s->state == SSL3_ST_SR_FINISHED_A || s->state == SSL3_ST_CR_FINISHED_A)) {
238 : : BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SCTP_GET_RCVINFO, sizeof(rdata->recordinfo), &rdata->recordinfo);
239 : : }
240 : : #endif
241 : :
242 : 0 : s->packet = NULL;
243 : 0 : s->packet_length = 0;
244 : 0 : memset(&(s->s3->rbuf), 0, sizeof(SSL3_BUFFER));
245 : 0 : memset(&(s->s3->rrec), 0, sizeof(SSL3_RECORD));
246 : :
247 [ # # ]: 0 : if (!ssl3_setup_buffers(s))
248 : : {
249 : 0 : SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR);
250 : 0 : OPENSSL_free(rdata);
251 : 0 : pitem_free(item);
252 : : return(0);
253 : : }
254 : :
255 : : /* insert should not fail, since duplicates are dropped */
256 [ # # ]: 0 : if (pqueue_insert(queue->q, item) == NULL)
257 : : {
258 : 0 : SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR);
259 : 0 : OPENSSL_free(rdata);
260 : 0 : pitem_free(item);
261 : : return(0);
262 : : }
263 : :
264 : : return(1);
265 : : }
266 : :
267 : :
268 : : static int
269 : 0 : dtls1_retrieve_buffered_record(SSL *s, record_pqueue *queue)
270 : : {
271 : 0 : pitem *item;
272 : :
273 : 0 : item = pqueue_pop(queue->q);
274 [ # # ]: 0 : if (item)
275 : : {
276 : 0 : dtls1_copy_record(s, item);
277 : :
278 : 0 : OPENSSL_free(item->data);
279 : 0 : pitem_free(item);
280 : :
281 : : return(1);
282 : : }
283 : :
284 : : return(0);
285 : : }
286 : :
287 : :
288 : : /* retrieve a buffered record that belongs to the new epoch, i.e., not processed
289 : : * yet */
290 : : #define dtls1_get_unprocessed_record(s) \
291 : : dtls1_retrieve_buffered_record((s), \
292 : : &((s)->d1->unprocessed_rcds))
293 : :
294 : : /* retrieve a buffered record that belongs to the current epoch, ie, processed */
295 : : #define dtls1_get_processed_record(s) \
296 : : dtls1_retrieve_buffered_record((s), \
297 : : &((s)->d1->processed_rcds))
298 : :
299 : : static int
300 : 0 : dtls1_process_buffered_records(SSL *s)
301 : : {
302 : : pitem *item;
303 : :
304 : 0 : item = pqueue_peek(s->d1->unprocessed_rcds.q);
305 [ # # ]: 0 : if (item)
306 : : {
307 : : /* Check if epoch is current. */
308 [ # # ]: 0 : if (s->d1->unprocessed_rcds.epoch != s->d1->r_epoch)
309 : : return(1); /* Nothing to do. */
310 : :
311 : : /* Process all the records. */
312 [ # # ]: 0 : while (pqueue_peek(s->d1->unprocessed_rcds.q))
313 : : {
314 : 0 : dtls1_get_unprocessed_record(s);
315 [ # # ]: 0 : if ( ! dtls1_process_record(s))
316 : : return(0);
317 : 0 : dtls1_buffer_record(s, &(s->d1->processed_rcds),
318 : 0 : s->s3->rrec.seq_num);
319 : : }
320 : : }
321 : :
322 : : /* sync epoch numbers once all the unprocessed records
323 : : * have been processed */
324 : 0 : s->d1->processed_rcds.epoch = s->d1->r_epoch;
325 : 0 : s->d1->unprocessed_rcds.epoch = s->d1->r_epoch + 1;
326 : :
327 : 0 : return(1);
328 : : }
329 : :
330 : :
331 : : #if 0
332 : :
333 : : static int
334 : : dtls1_get_buffered_record(SSL *s)
335 : : {
336 : : pitem *item;
337 : : PQ_64BIT priority =
338 : : (((PQ_64BIT)s->d1->handshake_read_seq) << 32) |
339 : : ((PQ_64BIT)s->d1->r_msg_hdr.frag_off);
340 : :
341 : : if ( ! SSL_in_init(s)) /* if we're not (re)negotiating,
342 : : nothing buffered */
343 : : return 0;
344 : :
345 : :
346 : : item = pqueue_peek(s->d1->rcvd_records);
347 : : if (item && item->priority == priority)
348 : : {
349 : : /* Check if we've received the record of interest. It must be
350 : : * a handshake record, since data records as passed up without
351 : : * buffering */
352 : : DTLS1_RECORD_DATA *rdata;
353 : : item = pqueue_pop(s->d1->rcvd_records);
354 : : rdata = (DTLS1_RECORD_DATA *)item->data;
355 : :
356 : : if (s->s3->rbuf.buf != NULL)
357 : : OPENSSL_free(s->s3->rbuf.buf);
358 : :
359 : : s->packet = rdata->packet;
360 : : s->packet_length = rdata->packet_length;
361 : : memcpy(&(s->s3->rbuf), &(rdata->rbuf), sizeof(SSL3_BUFFER));
362 : : memcpy(&(s->s3->rrec), &(rdata->rrec), sizeof(SSL3_RECORD));
363 : :
364 : : OPENSSL_free(item->data);
365 : : pitem_free(item);
366 : :
367 : : /* s->d1->next_expected_seq_num++; */
368 : : return(1);
369 : : }
370 : :
371 : : return 0;
372 : : }
373 : :
374 : : #endif
375 : :
376 : : static int
377 : 0 : dtls1_process_record(SSL *s)
378 : : {
379 : : int i,al;
380 : : int enc_err;
381 : : SSL_SESSION *sess;
382 : : SSL3_RECORD *rr;
383 : : unsigned int mac_size;
384 : : unsigned char md[EVP_MAX_MD_SIZE];
385 : :
386 : 0 : rr= &(s->s3->rrec);
387 : 0 : sess = s->session;
388 : :
389 : : /* At this point, s->packet_length == SSL3_RT_HEADER_LNGTH + rr->length,
390 : : * and we have that many bytes in s->packet
391 : : */
392 : 0 : rr->input= &(s->packet[DTLS1_RT_HEADER_LENGTH]);
393 : :
394 : : /* ok, we can now read from 's->packet' data into 'rr'
395 : : * rr->input points at rr->length bytes, which
396 : : * need to be copied into rr->data by either
397 : : * the decryption or by the decompression
398 : : * When the data is 'copied' into the rr->data buffer,
399 : : * rr->input will be pointed at the new buffer */
400 : :
401 : : /* We now have - encrypted [ MAC [ compressed [ plain ] ] ]
402 : : * rr->length bytes of encrypted compressed stuff. */
403 : :
404 : : /* check is not needed I believe */
405 [ # # ]: 0 : if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH)
406 : : {
407 : 0 : al=SSL_AD_RECORD_OVERFLOW;
408 : 0 : SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_ENCRYPTED_LENGTH_TOO_LONG);
409 : 0 : goto f_err;
410 : : }
411 : :
412 : : /* decrypt in place in 'rr->input' */
413 : 0 : rr->data=rr->input;
414 : 0 : rr->orig_len=rr->length;
415 : :
416 : 0 : enc_err = s->method->ssl3_enc->enc(s,0);
417 : : /* enc_err is:
418 : : * 0: (in non-constant time) if the record is publically invalid.
419 : : * 1: if the padding is valid
420 : : * -1: if the padding is invalid */
421 [ # # ]: 0 : if (enc_err == 0)
422 : : {
423 : : /* For DTLS we simply ignore bad packets. */
424 : 0 : rr->length = 0;
425 : 0 : s->packet_length = 0;
426 : 0 : goto err;
427 : : }
428 : :
429 : : #ifdef TLS_DEBUG
430 : : printf("dec %d\n",rr->length);
431 : : { unsigned int z; for (z=0; z<rr->length; z++) printf("%02X%c",rr->data[z],((z+1)%16)?' ':'\n'); }
432 : : printf("\n");
433 : : #endif
434 : :
435 : : /* r->length is now the compressed data plus mac */
436 [ # # ][ # # ]: 0 : if ((sess != NULL) &&
437 [ # # ]: 0 : (s->enc_read_ctx != NULL) &&
438 : 0 : (EVP_MD_CTX_md(s->read_hash) != NULL))
439 : : {
440 : : /* s->read_hash != NULL => mac_size != -1 */
441 : 0 : unsigned char *mac = NULL;
442 : : unsigned char mac_tmp[EVP_MAX_MD_SIZE];
443 : 0 : mac_size=EVP_MD_CTX_size(s->read_hash);
444 [ # # ]: 0 : OPENSSL_assert(mac_size <= EVP_MAX_MD_SIZE);
445 : :
446 : : /* orig_len is the length of the record before any padding was
447 : : * removed. This is public information, as is the MAC in use,
448 : : * therefore we can safely process the record in a different
449 : : * amount of time if it's too short to possibly contain a MAC.
450 : : */
451 [ # # # # ]: 0 : if (rr->orig_len < mac_size ||
452 : : /* CBC records must have a padding length byte too. */
453 [ # # ]: 0 : (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
454 : 0 : rr->orig_len < mac_size+1))
455 : : {
456 : 0 : al=SSL_AD_DECODE_ERROR;
457 : 0 : SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_LENGTH_TOO_SHORT);
458 : 0 : goto f_err;
459 : : }
460 : :
461 [ # # ]: 0 : if (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE)
462 : : {
463 : : /* We update the length so that the TLS header bytes
464 : : * can be constructed correctly but we need to extract
465 : : * the MAC in constant time from within the record,
466 : : * without leaking the contents of the padding bytes.
467 : : * */
468 : 0 : mac = mac_tmp;
469 : 0 : ssl3_cbc_copy_mac(mac_tmp, rr, mac_size);
470 : 0 : rr->length -= mac_size;
471 : : }
472 : : else
473 : : {
474 : : /* In this case there's no padding, so |rec->orig_len|
475 : : * equals |rec->length| and we checked that there's
476 : : * enough bytes for |mac_size| above. */
477 : 0 : rr->length -= mac_size;
478 : 0 : mac = &rr->data[rr->length];
479 : : }
480 : :
481 : 0 : i=s->method->ssl3_enc->mac(s,md,0 /* not send */);
482 [ # # ][ # # ]: 0 : if (i < 0 || mac == NULL || CRYPTO_memcmp(md, mac, (size_t)mac_size) != 0)
483 : : enc_err = -1;
484 [ # # ]: 0 : if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+mac_size)
485 : 0 : enc_err = -1;
486 : : }
487 : :
488 [ # # ]: 0 : if (enc_err < 0)
489 : : {
490 : : /* decryption failed, silently discard message */
491 : 0 : rr->length = 0;
492 : 0 : s->packet_length = 0;
493 : 0 : goto err;
494 : : }
495 : :
496 : : /* r->length is now just compressed */
497 [ # # ]: 0 : if (s->expand != NULL)
498 : : {
499 [ # # ]: 0 : if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH)
500 : : {
501 : 0 : al=SSL_AD_RECORD_OVERFLOW;
502 : 0 : SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_COMPRESSED_LENGTH_TOO_LONG);
503 : 0 : goto f_err;
504 : : }
505 [ # # ]: 0 : if (!ssl3_do_uncompress(s))
506 : : {
507 : 0 : al=SSL_AD_DECOMPRESSION_FAILURE;
508 : 0 : SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_BAD_DECOMPRESSION);
509 : 0 : goto f_err;
510 : : }
511 : : }
512 : :
513 [ # # ]: 0 : if (rr->length > SSL3_RT_MAX_PLAIN_LENGTH)
514 : : {
515 : 0 : al=SSL_AD_RECORD_OVERFLOW;
516 : 0 : SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_DATA_LENGTH_TOO_LONG);
517 : 0 : goto f_err;
518 : : }
519 : :
520 : 0 : rr->off=0;
521 : : /* So at this point the following is true
522 : : * ssl->s3->rrec.type is the type of record
523 : : * ssl->s3->rrec.length == number of bytes in record
524 : : * ssl->s3->rrec.off == offset to first valid byte
525 : : * ssl->s3->rrec.data == where to take bytes from, increment
526 : : * after use :-).
527 : : */
528 : :
529 : : /* we have pulled in a full packet so zero things */
530 : 0 : s->packet_length=0;
531 : 0 : dtls1_record_bitmap_update(s, &(s->d1->bitmap));/* Mark receipt of record. */
532 : 0 : return(1);
533 : :
534 : : f_err:
535 : 0 : ssl3_send_alert(s,SSL3_AL_FATAL,al);
536 : : err:
537 : : return(0);
538 : : }
539 : :
540 : :
541 : : /* Call this to get a new input record.
542 : : * It will return <= 0 if more data is needed, normally due to an error
543 : : * or non-blocking IO.
544 : : * When it finishes, one packet has been decoded and can be found in
545 : : * ssl->s3->rrec.type - is the type of record
546 : : * ssl->s3->rrec.data, - data
547 : : * ssl->s3->rrec.length, - number of bytes
548 : : */
549 : : /* used only by dtls1_read_bytes */
550 : 0 : int dtls1_get_record(SSL *s)
551 : : {
552 : : int ssl_major,ssl_minor;
553 : : int i,n;
554 : 0 : SSL3_RECORD *rr;
555 : 0 : unsigned char *p = NULL;
556 : : unsigned short version;
557 : : DTLS1_BITMAP *bitmap;
558 : : unsigned int is_next_epoch;
559 : :
560 : 0 : rr= &(s->s3->rrec);
561 : :
562 : : /* The epoch may have changed. If so, process all the
563 : : * pending records. This is a non-blocking operation. */
564 : 0 : dtls1_process_buffered_records(s);
565 : :
566 : : /* if we're renegotiating, then there may be buffered records */
567 [ # # ]: 0 : if (dtls1_get_processed_record(s))
568 : : return 1;
569 : :
570 : : /* get something from the wire */
571 : : again:
572 : : /* check if we have the header */
573 [ # # ][ # # ]: 0 : if ( (s->rstate != SSL_ST_READ_BODY) ||
574 : 0 : (s->packet_length < DTLS1_RT_HEADER_LENGTH))
575 : : {
576 : 0 : n=ssl3_read_n(s, DTLS1_RT_HEADER_LENGTH, s->s3->rbuf.len, 0);
577 : : /* read timeout is handled by dtls1_read_bytes */
578 [ # # ]: 0 : if (n <= 0) return(n); /* error or non-blocking */
579 : :
580 : : /* this packet contained a partial record, dump it */
581 [ # # ]: 0 : if (s->packet_length != DTLS1_RT_HEADER_LENGTH)
582 : : {
583 : 0 : s->packet_length = 0;
584 : 0 : goto again;
585 : : }
586 : :
587 : 0 : s->rstate=SSL_ST_READ_BODY;
588 : :
589 : 0 : p=s->packet;
590 : :
591 [ # # ]: 0 : if (s->msg_callback)
592 : 0 : s->msg_callback(0, 0, SSL3_RT_HEADER, p, DTLS1_RT_HEADER_LENGTH, s, s->msg_callback_arg);
593 : :
594 : : /* Pull apart the header into the DTLS1_RECORD */
595 : 0 : rr->type= *(p++);
596 : 0 : ssl_major= *(p++);
597 : 0 : ssl_minor= *(p++);
598 : 0 : version=(ssl_major<<8)|ssl_minor;
599 : :
600 : : /* sequence number is 64 bits, with top 2 bytes = epoch */
601 : 0 : n2s(p,rr->epoch);
602 : :
603 : 0 : memcpy(&(s->s3->read_sequence[2]), p, 6);
604 : 0 : p+=6;
605 : :
606 : 0 : n2s(p,rr->length);
607 : :
608 : : /* Lets check version */
609 [ # # ]: 0 : if (!s->first_packet)
610 : : {
611 [ # # ]: 0 : if (version != s->version)
612 : : {
613 : : /* unexpected version, silently discard */
614 : 0 : rr->length = 0;
615 : 0 : s->packet_length = 0;
616 : 0 : goto again;
617 : : }
618 : : }
619 : :
620 [ # # ]: 0 : if ((version & 0xff00) != (s->version & 0xff00))
621 : : {
622 : : /* wrong version, silently discard record */
623 : 0 : rr->length = 0;
624 : 0 : s->packet_length = 0;
625 : 0 : goto again;
626 : : }
627 : :
628 [ # # ]: 0 : if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH)
629 : : {
630 : : /* record too long, silently discard it */
631 : 0 : rr->length = 0;
632 : 0 : s->packet_length = 0;
633 : 0 : goto again;
634 : : }
635 : :
636 : : /* now s->rstate == SSL_ST_READ_BODY */
637 : : }
638 : :
639 : : /* s->rstate == SSL_ST_READ_BODY, get and decode the data */
640 : :
641 [ # # ]: 0 : if (rr->length > s->packet_length-DTLS1_RT_HEADER_LENGTH)
642 : : {
643 : : /* now s->packet_length == DTLS1_RT_HEADER_LENGTH */
644 : 0 : i=rr->length;
645 : 0 : n=ssl3_read_n(s,i,i,1);
646 [ # # ]: 0 : if (n <= 0) return(n); /* error or non-blocking io */
647 : :
648 : : /* this packet contained a partial record, dump it */
649 [ # # ]: 0 : if ( n != i)
650 : : {
651 : 0 : rr->length = 0;
652 : 0 : s->packet_length = 0;
653 : 0 : goto again;
654 : : }
655 : :
656 : : /* now n == rr->length,
657 : : * and s->packet_length == DTLS1_RT_HEADER_LENGTH + rr->length */
658 : : }
659 : 0 : s->rstate=SSL_ST_READ_HEADER; /* set state for later operations */
660 : :
661 : : /* match epochs. NULL means the packet is dropped on the floor */
662 : 0 : bitmap = dtls1_get_bitmap(s, rr, &is_next_epoch);
663 [ # # ]: 0 : if ( bitmap == NULL)
664 : : {
665 : 0 : rr->length = 0;
666 : 0 : s->packet_length = 0; /* dump this record */
667 : 0 : goto again; /* get another record */
668 : : }
669 : :
670 : : #ifndef OPENSSL_NO_SCTP
671 : : /* Only do replay check if no SCTP bio */
672 : : if (!BIO_dgram_is_sctp(SSL_get_rbio(s)))
673 : : {
674 : : #endif
675 : : /* Check whether this is a repeat, or aged record.
676 : : * Don't check if we're listening and this message is
677 : : * a ClientHello. They can look as if they're replayed,
678 : : * since they arrive from different connections and
679 : : * would be dropped unnecessarily.
680 : : */
681 [ # # ][ # # ]: 0 : if (!(s->d1->listen && rr->type == SSL3_RT_HANDSHAKE &&
[ # # ]
682 [ # # ]: 0 : *p == SSL3_MT_CLIENT_HELLO) &&
683 : 0 : !dtls1_record_replay_check(s, bitmap))
684 : : {
685 : 0 : rr->length = 0;
686 : 0 : s->packet_length=0; /* dump this record */
687 : 0 : goto again; /* get another record */
688 : : }
689 : : #ifndef OPENSSL_NO_SCTP
690 : : }
691 : : #endif
692 : :
693 : : /* just read a 0 length packet */
694 [ # # ]: 0 : if (rr->length == 0) goto again;
695 : :
696 : : /* If this record is from the next epoch (either HM or ALERT),
697 : : * and a handshake is currently in progress, buffer it since it
698 : : * cannot be processed at this time. However, do not buffer
699 : : * anything while listening.
700 : : */
701 [ # # ]: 0 : if (is_next_epoch)
702 : : {
703 [ # # ][ # # ]: 0 : if ((SSL_in_init(s) || s->in_handshake) && !s->d1->listen)
[ # # ]
704 : : {
705 : 0 : dtls1_buffer_record(s, &(s->d1->unprocessed_rcds), rr->seq_num);
706 : : }
707 : 0 : rr->length = 0;
708 : 0 : s->packet_length = 0;
709 : 0 : goto again;
710 : : }
711 : :
712 [ # # ]: 0 : if (!dtls1_process_record(s))
713 : : {
714 : 0 : rr->length = 0;
715 : 0 : s->packet_length = 0; /* dump this record */
716 : 0 : goto again; /* get another record */
717 : : }
718 : :
719 : : return(1);
720 : :
721 : : }
722 : :
723 : : /* Return up to 'len' payload bytes received in 'type' records.
724 : : * 'type' is one of the following:
725 : : *
726 : : * - SSL3_RT_HANDSHAKE (when ssl3_get_message calls us)
727 : : * - SSL3_RT_APPLICATION_DATA (when ssl3_read calls us)
728 : : * - 0 (during a shutdown, no data has to be returned)
729 : : *
730 : : * If we don't have stored data to work from, read a SSL/TLS record first
731 : : * (possibly multiple records if we still don't have anything to return).
732 : : *
733 : : * This function must handle any surprises the peer may have for us, such as
734 : : * Alert records (e.g. close_notify), ChangeCipherSpec records (not really
735 : : * a surprise, but handled as if it were), or renegotiation requests.
736 : : * Also if record payloads contain fragments too small to process, we store
737 : : * them until there is enough for the respective protocol (the record protocol
738 : : * may use arbitrary fragmentation and even interleaving):
739 : : * Change cipher spec protocol
740 : : * just 1 byte needed, no need for keeping anything stored
741 : : * Alert protocol
742 : : * 2 bytes needed (AlertLevel, AlertDescription)
743 : : * Handshake protocol
744 : : * 4 bytes needed (HandshakeType, uint24 length) -- we just have
745 : : * to detect unexpected Client Hello and Hello Request messages
746 : : * here, anything else is handled by higher layers
747 : : * Application data protocol
748 : : * none of our business
749 : : */
750 : 0 : int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
751 : : {
752 : : int al,i,j,ret;
753 : : unsigned int n;
754 : : SSL3_RECORD *rr;
755 : 0 : void (*cb)(const SSL *ssl,int type2,int val)=NULL;
756 : :
757 [ # # ]: 0 : if (s->s3->rbuf.buf == NULL) /* Not initialized yet */
758 [ # # ]: 0 : if (!ssl3_setup_buffers(s))
759 : : return(-1);
760 : :
761 : : /* XXX: check what the second '&& type' is about */
762 [ # # ]: 0 : if ((type && (type != SSL3_RT_APPLICATION_DATA) &&
763 [ # # ][ # # ]: 0 : (type != SSL3_RT_HANDSHAKE) && type) ||
764 : 0 : (peek && (type != SSL3_RT_APPLICATION_DATA)))
765 : : {
766 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR);
767 : 0 : return -1;
768 : : }
769 : :
770 : : /* check whether there's a handshake message (client hello?) waiting */
771 [ # # ]: 0 : if ( (ret = have_handshake_fragment(s, type, buf, len, peek)))
772 : : return ret;
773 : :
774 : : /* Now s->d1->handshake_fragment_len == 0 if type == SSL3_RT_HANDSHAKE. */
775 : :
776 : : #ifndef OPENSSL_NO_SCTP
777 : : /* Continue handshake if it had to be interrupted to read
778 : : * app data with SCTP.
779 : : */
780 : : if ((!s->in_handshake && SSL_in_init(s)) ||
781 : : (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
782 : : (s->state == DTLS1_SCTP_ST_SR_READ_SOCK || s->state == DTLS1_SCTP_ST_CR_READ_SOCK) &&
783 : : s->s3->in_read_app_data != 2))
784 : : #else
785 [ # # ][ # # ]: 0 : if (!s->in_handshake && SSL_in_init(s))
786 : : #endif
787 : : {
788 : : /* type == SSL3_RT_APPLICATION_DATA */
789 : 0 : i=s->handshake_func(s);
790 [ # # ]: 0 : if (i < 0) return(i);
791 [ # # ]: 0 : if (i == 0)
792 : : {
793 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
794 : 0 : return(-1);
795 : : }
796 : : }
797 : :
798 : : start:
799 : 0 : s->rwstate=SSL_NOTHING;
800 : :
801 : : /* s->s3->rrec.type - is the type of record
802 : : * s->s3->rrec.data, - data
803 : : * s->s3->rrec.off, - offset into 'data' for next read
804 : : * s->s3->rrec.length, - number of bytes. */
805 : 0 : rr = &(s->s3->rrec);
806 : :
807 : : /* We are not handshaking and have no data yet,
808 : : * so process data buffered during the last handshake
809 : : * in advance, if any.
810 : : */
811 [ # # ][ # # ]: 0 : if (s->state == SSL_ST_OK && rr->length == 0)
812 : : {
813 : 0 : pitem *item;
814 : 0 : item = pqueue_pop(s->d1->buffered_app_data.q);
815 [ # # ]: 0 : if (item)
816 : : {
817 : : #ifndef OPENSSL_NO_SCTP
818 : : /* Restore bio_dgram_sctp_rcvinfo struct */
819 : : if (BIO_dgram_is_sctp(SSL_get_rbio(s)))
820 : : {
821 : : DTLS1_RECORD_DATA *rdata = (DTLS1_RECORD_DATA *) item->data;
822 : : BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SCTP_SET_RCVINFO, sizeof(rdata->recordinfo), &rdata->recordinfo);
823 : : }
824 : : #endif
825 : :
826 : 0 : dtls1_copy_record(s, item);
827 : :
828 : 0 : OPENSSL_free(item->data);
829 : 0 : pitem_free(item);
830 : : }
831 : : }
832 : :
833 : : /* Check for timeout */
834 [ # # ]: 0 : if (dtls1_handle_timeout(s) > 0)
835 : : goto start;
836 : :
837 : : /* get new packet if necessary */
838 [ # # ][ # # ]: 0 : if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY))
839 : : {
840 : 0 : ret=dtls1_get_record(s);
841 [ # # ]: 0 : if (ret <= 0)
842 : : {
843 : 0 : ret = dtls1_read_failed(s, ret);
844 : : /* anything other than a timeout is an error */
845 [ # # ]: 0 : if (ret <= 0)
846 : : return(ret);
847 : : else
848 : : goto start;
849 : : }
850 : : }
851 : :
852 [ # # ][ # # ]: 0 : if (s->d1->listen && rr->type != SSL3_RT_HANDSHAKE)
853 : : {
854 : 0 : rr->length = 0;
855 : 0 : goto start;
856 : : }
857 : :
858 : : /* we now have a packet which can be read and processed */
859 : :
860 [ # # ]: 0 : if (s->s3->change_cipher_spec /* set when we receive ChangeCipherSpec,
861 : : * reset by ssl3_get_finished */
862 [ # # ]: 0 : && (rr->type != SSL3_RT_HANDSHAKE))
863 : : {
864 : : /* We now have application data between CCS and Finished.
865 : : * Most likely the packets were reordered on their way, so
866 : : * buffer the application data for later processing rather
867 : : * than dropping the connection.
868 : : */
869 : 0 : dtls1_buffer_record(s, &(s->d1->buffered_app_data), rr->seq_num);
870 : 0 : rr->length = 0;
871 : 0 : goto start;
872 : : }
873 : :
874 : : /* If the other end has shut down, throw anything we read away
875 : : * (even in 'peek' mode) */
876 [ # # ]: 0 : if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
877 : : {
878 : 0 : rr->length=0;
879 : 0 : s->rwstate=SSL_NOTHING;
880 : 0 : return(0);
881 : : }
882 : :
883 : :
884 [ # # ]: 0 : if (type == rr->type) /* SSL3_RT_APPLICATION_DATA or SSL3_RT_HANDSHAKE */
885 : : {
886 : : /* make sure that we are not getting application data when we
887 : : * are doing a handshake for the first time */
888 [ # # ][ # # ]: 0 : if (SSL_in_init(s) && (type == SSL3_RT_APPLICATION_DATA) &&
[ # # ]
889 : 0 : (s->enc_read_ctx == NULL))
890 : : {
891 : 0 : al=SSL_AD_UNEXPECTED_MESSAGE;
892 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_APP_DATA_IN_HANDSHAKE);
893 : 0 : goto f_err;
894 : : }
895 : :
896 [ # # ]: 0 : if (len <= 0) return(len);
897 : :
898 [ # # ]: 0 : if ((unsigned int)len > rr->length)
899 : : n = rr->length;
900 : : else
901 : 0 : n = (unsigned int)len;
902 : :
903 : 0 : memcpy(buf,&(rr->data[rr->off]),n);
904 [ # # ]: 0 : if (!peek)
905 : : {
906 : 0 : rr->length-=n;
907 : 0 : rr->off+=n;
908 [ # # ]: 0 : if (rr->length == 0)
909 : : {
910 : 0 : s->rstate=SSL_ST_READ_HEADER;
911 : 0 : rr->off=0;
912 : : }
913 : : }
914 : :
915 : : #ifndef OPENSSL_NO_SCTP
916 : : /* We were about to renegotiate but had to read
917 : : * belated application data first, so retry.
918 : : */
919 : : if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
920 : : rr->type == SSL3_RT_APPLICATION_DATA &&
921 : : (s->state == DTLS1_SCTP_ST_SR_READ_SOCK || s->state == DTLS1_SCTP_ST_CR_READ_SOCK))
922 : : {
923 : : s->rwstate=SSL_READING;
924 : : BIO_clear_retry_flags(SSL_get_rbio(s));
925 : : BIO_set_retry_read(SSL_get_rbio(s));
926 : : }
927 : :
928 : : /* We might had to delay a close_notify alert because
929 : : * of reordered app data. If there was an alert and there
930 : : * is no message to read anymore, finally set shutdown.
931 : : */
932 : : if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
933 : : s->d1->shutdown_received && !BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s)))
934 : : {
935 : : s->shutdown |= SSL_RECEIVED_SHUTDOWN;
936 : : return(0);
937 : : }
938 : : #endif
939 : 0 : return(n);
940 : : }
941 : :
942 : :
943 : : /* If we get here, then type != rr->type; if we have a handshake
944 : : * message, then it was unexpected (Hello Request or Client Hello). */
945 : :
946 : : /* In case of record types for which we have 'fragment' storage,
947 : : * fill that so that we can process the data at a fixed place.
948 : : */
949 : : {
950 : 0 : unsigned int k, dest_maxlen = 0;
951 : 0 : unsigned char *dest = NULL;
952 : 0 : unsigned int *dest_len = NULL;
953 : :
954 [ # # ]: 0 : if (rr->type == SSL3_RT_HANDSHAKE)
955 : : {
956 : 0 : dest_maxlen = sizeof s->d1->handshake_fragment;
957 : 0 : dest = s->d1->handshake_fragment;
958 : 0 : dest_len = &s->d1->handshake_fragment_len;
959 : : }
960 [ # # ]: 0 : else if (rr->type == SSL3_RT_ALERT)
961 : : {
962 : 0 : dest_maxlen = sizeof(s->d1->alert_fragment);
963 : 0 : dest = s->d1->alert_fragment;
964 : 0 : dest_len = &s->d1->alert_fragment_len;
965 : : }
966 : : #ifndef OPENSSL_NO_HEARTBEATS
967 [ # # ]: 0 : else if (rr->type == TLS1_RT_HEARTBEAT)
968 : : {
969 : 0 : dtls1_process_heartbeat(s);
970 : :
971 : : /* Exit and notify application to read again */
972 : 0 : rr->length = 0;
973 : 0 : s->rwstate=SSL_READING;
974 : 0 : BIO_clear_retry_flags(SSL_get_rbio(s));
975 : 0 : BIO_set_retry_read(SSL_get_rbio(s));
976 : 0 : return(-1);
977 : : }
978 : : #endif
979 : : /* else it's a CCS message, or application data or wrong */
980 [ # # ]: 0 : else if (rr->type != SSL3_RT_CHANGE_CIPHER_SPEC)
981 : : {
982 : : /* Application data while renegotiating
983 : : * is allowed. Try again reading.
984 : : */
985 [ # # ]: 0 : if (rr->type == SSL3_RT_APPLICATION_DATA)
986 : : {
987 : : BIO *bio;
988 : 0 : s->s3->in_read_app_data=2;
989 : 0 : bio=SSL_get_rbio(s);
990 : 0 : s->rwstate=SSL_READING;
991 : 0 : BIO_clear_retry_flags(bio);
992 : 0 : BIO_set_retry_read(bio);
993 : 0 : return(-1);
994 : : }
995 : :
996 : : /* Not certain if this is the right error handling */
997 : 0 : al=SSL_AD_UNEXPECTED_MESSAGE;
998 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
999 : 0 : goto f_err;
1000 : : }
1001 : :
1002 [ # # ]: 0 : if (dest_maxlen > 0)
1003 : : {
1004 : : /* XDTLS: In a pathalogical case, the Client Hello
1005 : : * may be fragmented--don't always expect dest_maxlen bytes */
1006 [ # # ]: 0 : if ( rr->length < dest_maxlen)
1007 : : {
1008 : : #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
1009 : : /*
1010 : : * for normal alerts rr->length is 2, while
1011 : : * dest_maxlen is 7 if we were to handle this
1012 : : * non-existing alert...
1013 : : */
1014 : : FIX ME
1015 : : #endif
1016 : 0 : s->rstate=SSL_ST_READ_HEADER;
1017 : 0 : rr->length = 0;
1018 : 0 : goto start;
1019 : : }
1020 : :
1021 : : /* now move 'n' bytes: */
1022 [ # # ]: 0 : for ( k = 0; k < dest_maxlen; k++)
1023 : : {
1024 : 0 : dest[k] = rr->data[rr->off++];
1025 : 0 : rr->length--;
1026 : : }
1027 : 0 : *dest_len = dest_maxlen;
1028 : : }
1029 : : }
1030 : :
1031 : : /* s->d1->handshake_fragment_len == 12 iff rr->type == SSL3_RT_HANDSHAKE;
1032 : : * s->d1->alert_fragment_len == 7 iff rr->type == SSL3_RT_ALERT.
1033 : : * (Possibly rr is 'empty' now, i.e. rr->length may be 0.) */
1034 : :
1035 : : /* If we are a client, check for an incoming 'Hello Request': */
1036 [ # # ][ # # ]: 0 : if ((!s->server) &&
1037 [ # # ]: 0 : (s->d1->handshake_fragment_len >= DTLS1_HM_HEADER_LENGTH) &&
1038 [ # # ]: 0 : (s->d1->handshake_fragment[0] == SSL3_MT_HELLO_REQUEST) &&
1039 [ # # ]: 0 : (s->session != NULL) && (s->session->cipher != NULL))
1040 : : {
1041 : 0 : s->d1->handshake_fragment_len = 0;
1042 : :
1043 [ # # ]: 0 : if ((s->d1->handshake_fragment[1] != 0) ||
1044 : 0 : (s->d1->handshake_fragment[2] != 0) ||
1045 : : (s->d1->handshake_fragment[3] != 0))
1046 : : {
1047 : 0 : al=SSL_AD_DECODE_ERROR;
1048 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_BAD_HELLO_REQUEST);
1049 : 0 : goto err;
1050 : : }
1051 : :
1052 : : /* no need to check sequence number on HELLO REQUEST messages */
1053 : :
1054 [ # # ]: 0 : if (s->msg_callback)
1055 : 0 : s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE,
1056 : 0 : s->d1->handshake_fragment, 4, s, s->msg_callback_arg);
1057 : :
1058 [ # # ][ # # ]: 0 : if (SSL_is_init_finished(s) &&
1059 [ # # ]: 0 : !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) &&
1060 : 0 : !s->s3->renegotiate)
1061 : : {
1062 : 0 : s->d1->handshake_read_seq++;
1063 : 0 : s->new_session = 1;
1064 : 0 : ssl3_renegotiate(s);
1065 [ # # ]: 0 : if (ssl3_renegotiate_check(s))
1066 : : {
1067 : 0 : i=s->handshake_func(s);
1068 [ # # ]: 0 : if (i < 0) return(i);
1069 [ # # ]: 0 : if (i == 0)
1070 : : {
1071 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
1072 : 0 : return(-1);
1073 : : }
1074 : :
1075 [ # # ]: 0 : if (!(s->mode & SSL_MODE_AUTO_RETRY))
1076 : : {
1077 [ # # ]: 0 : if (s->s3->rbuf.left == 0) /* no read-ahead left? */
1078 : : {
1079 : : BIO *bio;
1080 : : /* In the case where we try to read application data,
1081 : : * but we trigger an SSL handshake, we return -1 with
1082 : : * the retry option set. Otherwise renegotiation may
1083 : : * cause nasty problems in the blocking world */
1084 : 0 : s->rwstate=SSL_READING;
1085 : 0 : bio=SSL_get_rbio(s);
1086 : 0 : BIO_clear_retry_flags(bio);
1087 : 0 : BIO_set_retry_read(bio);
1088 : 0 : return(-1);
1089 : : }
1090 : : }
1091 : : }
1092 : : }
1093 : : /* we either finished a handshake or ignored the request,
1094 : : * now try again to obtain the (application) data we were asked for */
1095 : : goto start;
1096 : : }
1097 : :
1098 [ # # ]: 0 : if (s->d1->alert_fragment_len >= DTLS1_AL_HEADER_LENGTH)
1099 : : {
1100 : 0 : int alert_level = s->d1->alert_fragment[0];
1101 : 0 : int alert_descr = s->d1->alert_fragment[1];
1102 : :
1103 : 0 : s->d1->alert_fragment_len = 0;
1104 : :
1105 [ # # ]: 0 : if (s->msg_callback)
1106 : 0 : s->msg_callback(0, s->version, SSL3_RT_ALERT,
1107 : 0 : s->d1->alert_fragment, 2, s, s->msg_callback_arg);
1108 : :
1109 [ # # ]: 0 : if (s->info_callback != NULL)
1110 : : cb=s->info_callback;
1111 [ # # ]: 0 : else if (s->ctx->info_callback != NULL)
1112 : 0 : cb=s->ctx->info_callback;
1113 : :
1114 [ # # ]: 0 : if (cb != NULL)
1115 : : {
1116 : 0 : j = (alert_level << 8) | alert_descr;
1117 : 0 : cb(s, SSL_CB_READ_ALERT, j);
1118 : : }
1119 : :
1120 [ # # ]: 0 : if (alert_level == 1) /* warning */
1121 : : {
1122 : 0 : s->s3->warn_alert = alert_descr;
1123 [ # # ]: 0 : if (alert_descr == SSL_AD_CLOSE_NOTIFY)
1124 : : {
1125 : : #ifndef OPENSSL_NO_SCTP
1126 : : /* With SCTP and streams the socket may deliver app data
1127 : : * after a close_notify alert. We have to check this
1128 : : * first so that nothing gets discarded.
1129 : : */
1130 : : if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
1131 : : BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s)))
1132 : : {
1133 : : s->d1->shutdown_received = 1;
1134 : : s->rwstate=SSL_READING;
1135 : : BIO_clear_retry_flags(SSL_get_rbio(s));
1136 : : BIO_set_retry_read(SSL_get_rbio(s));
1137 : : return -1;
1138 : : }
1139 : : #endif
1140 : 0 : s->shutdown |= SSL_RECEIVED_SHUTDOWN;
1141 : 0 : return(0);
1142 : : }
1143 : : #if 0
1144 : : /* XXX: this is a possible improvement in the future */
1145 : : /* now check if it's a missing record */
1146 : : if (alert_descr == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE)
1147 : : {
1148 : : unsigned short seq;
1149 : : unsigned int frag_off;
1150 : : unsigned char *p = &(s->d1->alert_fragment[2]);
1151 : :
1152 : : n2s(p, seq);
1153 : : n2l3(p, frag_off);
1154 : :
1155 : : dtls1_retransmit_message(s,
1156 : : dtls1_get_queue_priority(frag->msg_header.seq, 0),
1157 : : frag_off, &found);
1158 : : if ( ! found && SSL_in_init(s))
1159 : : {
1160 : : /* fprintf( stderr,"in init = %d\n", SSL_in_init(s)); */
1161 : : /* requested a message not yet sent,
1162 : : send an alert ourselves */
1163 : : ssl3_send_alert(s,SSL3_AL_WARNING,
1164 : : DTLS1_AD_MISSING_HANDSHAKE_MESSAGE);
1165 : : }
1166 : : }
1167 : : #endif
1168 : : }
1169 [ # # ]: 0 : else if (alert_level == 2) /* fatal */
1170 : : {
1171 : : char tmp[16];
1172 : :
1173 : 0 : s->rwstate=SSL_NOTHING;
1174 : 0 : s->s3->fatal_alert = alert_descr;
1175 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_AD_REASON_OFFSET + alert_descr);
1176 : 0 : BIO_snprintf(tmp,sizeof tmp,"%d",alert_descr);
1177 : 0 : ERR_add_error_data(2,"SSL alert number ",tmp);
1178 : 0 : s->shutdown|=SSL_RECEIVED_SHUTDOWN;
1179 : 0 : SSL_CTX_remove_session(s->ctx,s->session);
1180 : : return(0);
1181 : : }
1182 : : else
1183 : : {
1184 : 0 : al=SSL_AD_ILLEGAL_PARAMETER;
1185 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_UNKNOWN_ALERT_TYPE);
1186 : 0 : goto f_err;
1187 : : }
1188 : :
1189 : : goto start;
1190 : : }
1191 : :
1192 [ # # ]: 0 : if (s->shutdown & SSL_SENT_SHUTDOWN) /* but we have not received a shutdown */
1193 : : {
1194 : 0 : s->rwstate=SSL_NOTHING;
1195 : 0 : rr->length=0;
1196 : 0 : return(0);
1197 : : }
1198 : :
1199 [ # # ]: 0 : if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC)
1200 : : {
1201 : : struct ccs_header_st ccs_hdr;
1202 : 0 : unsigned int ccs_hdr_len = DTLS1_CCS_HEADER_LENGTH;
1203 : :
1204 : 0 : dtls1_get_ccs_header(rr->data, &ccs_hdr);
1205 : :
1206 [ # # ]: 0 : if (s->version == DTLS1_BAD_VER)
1207 : 0 : ccs_hdr_len = 3;
1208 : :
1209 : : /* 'Change Cipher Spec' is just a single byte, so we know
1210 : : * exactly what the record payload has to look like */
1211 : : /* XDTLS: check that epoch is consistent */
1212 [ # # ][ # # ]: 0 : if ( (rr->length != ccs_hdr_len) ||
1213 [ # # ]: 0 : (rr->off != 0) || (rr->data[0] != SSL3_MT_CCS))
1214 : : {
1215 : 0 : i=SSL_AD_ILLEGAL_PARAMETER;
1216 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_BAD_CHANGE_CIPHER_SPEC);
1217 : 0 : goto err;
1218 : : }
1219 : :
1220 : 0 : rr->length=0;
1221 : :
1222 [ # # ]: 0 : if (s->msg_callback)
1223 : 0 : s->msg_callback(0, s->version, SSL3_RT_CHANGE_CIPHER_SPEC,
1224 : : rr->data, 1, s, s->msg_callback_arg);
1225 : :
1226 : : /* We can't process a CCS now, because previous handshake
1227 : : * messages are still missing, so just drop it.
1228 : : */
1229 [ # # ]: 0 : if (!s->d1->change_cipher_spec_ok)
1230 : : {
1231 : : goto start;
1232 : : }
1233 : :
1234 : 0 : s->d1->change_cipher_spec_ok = 0;
1235 : :
1236 : 0 : s->s3->change_cipher_spec=1;
1237 [ # # ]: 0 : if (!ssl3_do_change_cipher_spec(s))
1238 : : goto err;
1239 : :
1240 : : /* do this whenever CCS is processed */
1241 : 0 : dtls1_reset_seq_numbers(s, SSL3_CC_READ);
1242 : :
1243 [ # # ]: 0 : if (s->version == DTLS1_BAD_VER)
1244 : 0 : s->d1->handshake_read_seq++;
1245 : :
1246 : : #ifndef OPENSSL_NO_SCTP
1247 : : /* Remember that a CCS has been received,
1248 : : * so that an old key of SCTP-Auth can be
1249 : : * deleted when a CCS is sent. Will be ignored
1250 : : * if no SCTP is used
1251 : : */
1252 : : BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD, 1, NULL);
1253 : : #endif
1254 : :
1255 : : goto start;
1256 : : }
1257 : :
1258 : : /* Unexpected handshake message (Client Hello, or protocol violation) */
1259 [ # # ][ # # ]: 0 : if ((s->d1->handshake_fragment_len >= DTLS1_HM_HEADER_LENGTH) &&
1260 : 0 : !s->in_handshake)
1261 : : {
1262 : : struct hm_header_st msg_hdr;
1263 : :
1264 : : /* this may just be a stale retransmit */
1265 : 0 : dtls1_get_message_header(rr->data, &msg_hdr);
1266 [ # # ]: 0 : if( rr->epoch != s->d1->r_epoch)
1267 : : {
1268 : 0 : rr->length = 0;
1269 : 0 : goto start;
1270 : : }
1271 : :
1272 : : /* If we are server, we may have a repeated FINISHED of the
1273 : : * client here, then retransmit our CCS and FINISHED.
1274 : : */
1275 [ # # ]: 0 : if (msg_hdr.type == SSL3_MT_FINISHED)
1276 : : {
1277 [ # # ]: 0 : if (dtls1_check_timeout_num(s) < 0)
1278 : 0 : return -1;
1279 : :
1280 : 0 : dtls1_retransmit_buffered_messages(s);
1281 : 0 : rr->length = 0;
1282 : 0 : goto start;
1283 : : }
1284 : :
1285 [ # # ][ # # ]: 0 : if (((s->state&SSL_ST_MASK) == SSL_ST_OK) &&
1286 : 0 : !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS))
1287 : : {
1288 : : #if 0 /* worked only because C operator preferences are not as expected (and
1289 : : * because this is not really needed for clients except for detecting
1290 : : * protocol violations): */
1291 : : s->state=SSL_ST_BEFORE|(s->server)
1292 : : ?SSL_ST_ACCEPT
1293 : : :SSL_ST_CONNECT;
1294 : : #else
1295 [ # # ]: 0 : s->state = s->server ? SSL_ST_ACCEPT : SSL_ST_CONNECT;
1296 : : #endif
1297 : 0 : s->renegotiate=1;
1298 : 0 : s->new_session=1;
1299 : : }
1300 : 0 : i=s->handshake_func(s);
1301 [ # # ]: 0 : if (i < 0) return(i);
1302 [ # # ]: 0 : if (i == 0)
1303 : : {
1304 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
1305 : 0 : return(-1);
1306 : : }
1307 : :
1308 [ # # ]: 0 : if (!(s->mode & SSL_MODE_AUTO_RETRY))
1309 : : {
1310 [ # # ]: 0 : if (s->s3->rbuf.left == 0) /* no read-ahead left? */
1311 : : {
1312 : : BIO *bio;
1313 : : /* In the case where we try to read application data,
1314 : : * but we trigger an SSL handshake, we return -1 with
1315 : : * the retry option set. Otherwise renegotiation may
1316 : : * cause nasty problems in the blocking world */
1317 : 0 : s->rwstate=SSL_READING;
1318 : 0 : bio=SSL_get_rbio(s);
1319 : 0 : BIO_clear_retry_flags(bio);
1320 : 0 : BIO_set_retry_read(bio);
1321 : 0 : return(-1);
1322 : : }
1323 : : }
1324 : : goto start;
1325 : : }
1326 : :
1327 [ # # # ]: 0 : switch (rr->type)
1328 : : {
1329 : : default:
1330 : : #ifndef OPENSSL_NO_TLS
1331 : : /* TLS just ignores unknown message types */
1332 [ # # ]: 0 : if (s->version == TLS1_VERSION)
1333 : : {
1334 : 0 : rr->length = 0;
1335 : 0 : goto start;
1336 : : }
1337 : : #endif
1338 : 0 : al=SSL_AD_UNEXPECTED_MESSAGE;
1339 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
1340 : 0 : goto f_err;
1341 : : case SSL3_RT_CHANGE_CIPHER_SPEC:
1342 : : case SSL3_RT_ALERT:
1343 : : case SSL3_RT_HANDSHAKE:
1344 : : /* we already handled all of these, with the possible exception
1345 : : * of SSL3_RT_HANDSHAKE when s->in_handshake is set, but that
1346 : : * should not happen when type != rr->type */
1347 : 0 : al=SSL_AD_UNEXPECTED_MESSAGE;
1348 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES,ERR_R_INTERNAL_ERROR);
1349 : 0 : goto f_err;
1350 : : case SSL3_RT_APPLICATION_DATA:
1351 : : /* At this point, we were expecting handshake data,
1352 : : * but have application data. If the library was
1353 : : * running inside ssl3_read() (i.e. in_read_app_data
1354 : : * is set) and it makes sense to read application data
1355 : : * at this point (session renegotiation not yet started),
1356 : : * we will indulge it.
1357 : : */
1358 [ # # ][ # # ]: 0 : if (s->s3->in_read_app_data &&
1359 [ # # ]: 0 : (s->s3->total_renegotiations != 0) &&
1360 : : ((
1361 [ # # ]: 0 : (s->state & SSL_ST_CONNECT) &&
1362 [ # # ]: 0 : (s->state >= SSL3_ST_CW_CLNT_HELLO_A) &&
1363 : : (s->state <= SSL3_ST_CR_SRVR_HELLO_A)
1364 [ # # ]: 0 : ) || (
1365 [ # # ]: 0 : (s->state & SSL_ST_ACCEPT) &&
1366 [ # # ]: 0 : (s->state <= SSL3_ST_SW_HELLO_REQ_A) &&
1367 : : (s->state >= SSL3_ST_SR_CLNT_HELLO_A)
1368 : : )
1369 : : ))
1370 : : {
1371 : 0 : s->s3->in_read_app_data=2;
1372 : 0 : return(-1);
1373 : : }
1374 : : else
1375 : : {
1376 : 0 : al=SSL_AD_UNEXPECTED_MESSAGE;
1377 : 0 : SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
1378 : 0 : goto f_err;
1379 : : }
1380 : : }
1381 : : /* not reached */
1382 : :
1383 : : f_err:
1384 : 0 : ssl3_send_alert(s,SSL3_AL_FATAL,al);
1385 : : err:
1386 : : return(-1);
1387 : : }
1388 : :
1389 : : int
1390 : 0 : dtls1_write_app_data_bytes(SSL *s, int type, const void *buf_, int len)
1391 : : {
1392 : : int i;
1393 : :
1394 : : #ifndef OPENSSL_NO_SCTP
1395 : : /* Check if we have to continue an interrupted handshake
1396 : : * for reading belated app data with SCTP.
1397 : : */
1398 : : if ((SSL_in_init(s) && !s->in_handshake) ||
1399 : : (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
1400 : : (s->state == DTLS1_SCTP_ST_SR_READ_SOCK || s->state == DTLS1_SCTP_ST_CR_READ_SOCK)))
1401 : : #else
1402 [ # # ][ # # ]: 0 : if (SSL_in_init(s) && !s->in_handshake)
1403 : : #endif
1404 : : {
1405 : 0 : i=s->handshake_func(s);
1406 [ # # ]: 0 : if (i < 0) return(i);
1407 [ # # ]: 0 : if (i == 0)
1408 : : {
1409 : 0 : SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
1410 : 0 : return -1;
1411 : : }
1412 : : }
1413 : :
1414 [ # # ]: 0 : if (len > SSL3_RT_MAX_PLAIN_LENGTH)
1415 : : {
1416 : 0 : SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES,SSL_R_DTLS_MESSAGE_TOO_BIG);
1417 : 0 : return -1;
1418 : : }
1419 : :
1420 : 0 : i = dtls1_write_bytes(s, type, buf_, len);
1421 : 0 : return i;
1422 : : }
1423 : :
1424 : :
1425 : : /* this only happens when a client hello is received and a handshake
1426 : : * is started. */
1427 : : static int
1428 : 0 : have_handshake_fragment(SSL *s, int type, unsigned char *buf,
1429 : : int len, int peek)
1430 : : {
1431 : :
1432 [ # # ][ # # ]: 0 : if ((type == SSL3_RT_HANDSHAKE) && (s->d1->handshake_fragment_len > 0))
1433 : : /* (partially) satisfy request from storage */
1434 : : {
1435 : 0 : unsigned char *src = s->d1->handshake_fragment;
1436 : 0 : unsigned char *dst = buf;
1437 : : unsigned int k,n;
1438 : :
1439 : : /* peek == 0 */
1440 : 0 : n = 0;
1441 [ # # ][ # # ]: 0 : while ((len > 0) && (s->d1->handshake_fragment_len > 0))
1442 : : {
1443 : 0 : *dst++ = *src++;
1444 : 0 : len--; s->d1->handshake_fragment_len--;
1445 : 0 : n++;
1446 : : }
1447 : : /* move any remaining fragment bytes: */
1448 [ # # ]: 0 : for (k = 0; k < s->d1->handshake_fragment_len; k++)
1449 : 0 : s->d1->handshake_fragment[k] = *src++;
1450 : 0 : return n;
1451 : : }
1452 : :
1453 : : return 0;
1454 : : }
1455 : :
1456 : :
1457 : :
1458 : :
1459 : : /* Call this to write data in records of type 'type'
1460 : : * It will return <= 0 if not all data has been sent or non-blocking IO.
1461 : : */
1462 : 0 : int dtls1_write_bytes(SSL *s, int type, const void *buf, int len)
1463 : : {
1464 : : int i;
1465 : :
1466 [ # # ]: 0 : OPENSSL_assert(len <= SSL3_RT_MAX_PLAIN_LENGTH);
1467 : 0 : s->rwstate=SSL_NOTHING;
1468 : 0 : i=do_dtls1_write(s, type, buf, len, 0);
1469 : 0 : return i;
1470 : : }
1471 : :
1472 : 0 : int do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len, int create_empty_fragment)
1473 : : {
1474 : : unsigned char *p,*pseq;
1475 : 0 : int i,mac_size,clear=0;
1476 : 0 : int prefix_len = 0;
1477 : : int eivlen;
1478 : : SSL3_RECORD *wr;
1479 : : SSL3_BUFFER *wb;
1480 : : SSL_SESSION *sess;
1481 : :
1482 : : /* first check if there is a SSL3_BUFFER still being written
1483 : : * out. This will happen with non blocking IO */
1484 [ # # ]: 0 : if (s->s3->wbuf.left != 0)
1485 : : {
1486 : 0 : OPENSSL_assert(0); /* XDTLS: want to see if we ever get here */
1487 : 0 : return(ssl3_write_pending(s,type,buf,len));
1488 : : }
1489 : :
1490 : : /* If we have an alert to send, lets send it */
1491 [ # # ]: 0 : if (s->s3->alert_dispatch)
1492 : : {
1493 : 0 : i=s->method->ssl_dispatch_alert(s);
1494 [ # # ]: 0 : if (i <= 0)
1495 : : return(i);
1496 : : /* if it went, fall through and send more stuff */
1497 : : }
1498 : :
1499 [ # # ]: 0 : if (len == 0 && !create_empty_fragment)
1500 : : return 0;
1501 : :
1502 : 0 : wr= &(s->s3->wrec);
1503 : 0 : wb= &(s->s3->wbuf);
1504 : 0 : sess=s->session;
1505 : :
1506 [ # # ][ # # ]: 0 : if ( (sess == NULL) ||
1507 [ # # ]: 0 : (s->enc_write_ctx == NULL) ||
1508 : 0 : (EVP_MD_CTX_md(s->write_hash) == NULL))
1509 : : clear=1;
1510 : :
1511 [ # # ]: 0 : if (clear)
1512 : : mac_size=0;
1513 : : else
1514 : : {
1515 : 0 : mac_size=EVP_MD_CTX_size(s->write_hash);
1516 [ # # ]: 0 : if (mac_size < 0)
1517 : : goto err;
1518 : : }
1519 : :
1520 : : /* DTLS implements explicit IV, so no need for empty fragments */
1521 : : #if 0
1522 : : /* 'create_empty_fragment' is true only when this function calls itself */
1523 : : if (!clear && !create_empty_fragment && !s->s3->empty_fragment_done
1524 : : && SSL_version(s) != DTLS1_VERSION && SSL_version(s) != DTLS1_BAD_VER)
1525 : : {
1526 : : /* countermeasure against known-IV weakness in CBC ciphersuites
1527 : : * (see http://www.openssl.org/~bodo/tls-cbc.txt)
1528 : : */
1529 : :
1530 : : if (s->s3->need_empty_fragments && type == SSL3_RT_APPLICATION_DATA)
1531 : : {
1532 : : /* recursive function call with 'create_empty_fragment' set;
1533 : : * this prepares and buffers the data for an empty fragment
1534 : : * (these 'prefix_len' bytes are sent out later
1535 : : * together with the actual payload) */
1536 : : prefix_len = s->method->do_ssl_write(s, type, buf, 0, 1);
1537 : : if (prefix_len <= 0)
1538 : : goto err;
1539 : :
1540 : : if (s->s3->wbuf.len < (size_t)prefix_len + SSL3_RT_MAX_PACKET_SIZE)
1541 : : {
1542 : : /* insufficient space */
1543 : : SSLerr(SSL_F_DO_DTLS1_WRITE, ERR_R_INTERNAL_ERROR);
1544 : : goto err;
1545 : : }
1546 : : }
1547 : :
1548 : : s->s3->empty_fragment_done = 1;
1549 : : }
1550 : : #endif
1551 : 0 : p = wb->buf + prefix_len;
1552 : :
1553 : : /* write the header */
1554 : :
1555 : 0 : *(p++)=type&0xff;
1556 : 0 : wr->type=type;
1557 : : /* Special case: for hello verify request, client version 1.0 and
1558 : : * we haven't decided which version to use yet send back using
1559 : : * version 1.0 header: otherwise some clients will ignore it.
1560 : : */
1561 [ # # ]: 0 : if (s->method->version == DTLS_ANY_VERSION)
1562 : : {
1563 : 0 : *(p++)=DTLS1_VERSION>>8;
1564 : 0 : *(p++)=DTLS1_VERSION&0xff;
1565 : : }
1566 : : else
1567 : : {
1568 : 0 : *(p++)=s->version>>8;
1569 : 0 : *(p++)=s->version&0xff;
1570 : : }
1571 : :
1572 : : /* field where we are to write out packet epoch, seq num and len */
1573 : 0 : pseq=p;
1574 : 0 : p+=10;
1575 : :
1576 : : /* Explicit IV length, block ciphers appropriate version flag */
1577 [ # # ]: 0 : if (s->enc_write_ctx)
1578 : : {
1579 : 0 : int mode = EVP_CIPHER_CTX_mode(s->enc_write_ctx);
1580 [ # # ]: 0 : if (mode == EVP_CIPH_CBC_MODE)
1581 : : {
1582 : 0 : eivlen = EVP_CIPHER_CTX_iv_length(s->enc_write_ctx);
1583 [ # # ]: 0 : if (eivlen <= 1)
1584 : 0 : eivlen = 0;
1585 : : }
1586 : : /* Need explicit part of IV for GCM mode */
1587 [ # # ]: 0 : else if (mode == EVP_CIPH_GCM_MODE)
1588 : : eivlen = EVP_GCM_TLS_EXPLICIT_IV_LEN;
1589 : : else
1590 : 0 : eivlen = 0;
1591 : : }
1592 : : else
1593 : : eivlen = 0;
1594 : :
1595 : : /* lets setup the record stuff. */
1596 : 0 : wr->data=p + eivlen; /* make room for IV in case of CBC */
1597 : 0 : wr->length=(int)len;
1598 : 0 : wr->input=(unsigned char *)buf;
1599 : :
1600 : : /* we now 'read' from wr->input, wr->length bytes into
1601 : : * wr->data */
1602 : :
1603 : : /* first we compress */
1604 [ # # ]: 0 : if (s->compress != NULL)
1605 : : {
1606 [ # # ]: 0 : if (!ssl3_do_compress(s))
1607 : : {
1608 : 0 : SSLerr(SSL_F_DO_DTLS1_WRITE,SSL_R_COMPRESSION_FAILURE);
1609 : 0 : goto err;
1610 : : }
1611 : : }
1612 : : else
1613 : : {
1614 : 0 : memcpy(wr->data,wr->input,wr->length);
1615 : 0 : wr->input=wr->data;
1616 : : }
1617 : :
1618 : : /* we should still have the output to wr->data and the input
1619 : : * from wr->input. Length should be wr->length.
1620 : : * wr->data still points in the wb->buf */
1621 : :
1622 [ # # ]: 0 : if (mac_size != 0)
1623 : : {
1624 [ # # ]: 0 : if(s->method->ssl3_enc->mac(s,&(p[wr->length + eivlen]),1) < 0)
1625 : : goto err;
1626 : 0 : wr->length+=mac_size;
1627 : : }
1628 : :
1629 : : /* this is true regardless of mac size */
1630 : 0 : wr->input=p;
1631 : 0 : wr->data=p;
1632 : :
1633 [ # # ]: 0 : if (eivlen)
1634 : 0 : wr->length += eivlen;
1635 : :
1636 : 0 : s->method->ssl3_enc->enc(s,1);
1637 : :
1638 : : /* record length after mac and block padding */
1639 : : /* if (type == SSL3_RT_APPLICATION_DATA ||
1640 : : (type == SSL3_RT_ALERT && ! SSL_in_init(s))) */
1641 : :
1642 : : /* there's only one epoch between handshake and app data */
1643 : :
1644 : 0 : s2n(s->d1->w_epoch, pseq);
1645 : :
1646 : : /* XDTLS: ?? */
1647 : : /* else
1648 : : s2n(s->d1->handshake_epoch, pseq); */
1649 : :
1650 : 0 : memcpy(pseq, &(s->s3->write_sequence[2]), 6);
1651 : 0 : pseq+=6;
1652 : 0 : s2n(wr->length,pseq);
1653 : :
1654 [ # # ]: 0 : if (s->msg_callback)
1655 : 0 : s->msg_callback(1, 0, SSL3_RT_HEADER, pseq - DTLS1_RT_HEADER_LENGTH, DTLS1_RT_HEADER_LENGTH, s, s->msg_callback_arg);
1656 : :
1657 : : /* we should now have
1658 : : * wr->data pointing to the encrypted data, which is
1659 : : * wr->length long */
1660 : 0 : wr->type=type; /* not needed but helps for debugging */
1661 : 0 : wr->length+=DTLS1_RT_HEADER_LENGTH;
1662 : :
1663 : : #if 0 /* this is now done at the message layer */
1664 : : /* buffer the record, making it easy to handle retransmits */
1665 : : if ( type == SSL3_RT_HANDSHAKE || type == SSL3_RT_CHANGE_CIPHER_SPEC)
1666 : : dtls1_buffer_record(s, wr->data, wr->length,
1667 : : *((PQ_64BIT *)&(s->s3->write_sequence[0])));
1668 : : #endif
1669 : :
1670 : 0 : ssl3_record_sequence_update(&(s->s3->write_sequence[0]));
1671 : :
1672 [ # # ]: 0 : if (create_empty_fragment)
1673 : : {
1674 : : /* we are in a recursive call;
1675 : : * just return the length, don't write out anything here
1676 : : */
1677 : 0 : return wr->length;
1678 : : }
1679 : :
1680 : : /* now let's set up wb */
1681 : 0 : wb->left = prefix_len + wr->length;
1682 : 0 : wb->offset = 0;
1683 : :
1684 : : /* memorize arguments so that ssl3_write_pending can detect bad write retries later */
1685 : 0 : s->s3->wpend_tot=len;
1686 : 0 : s->s3->wpend_buf=buf;
1687 : 0 : s->s3->wpend_type=type;
1688 : 0 : s->s3->wpend_ret=len;
1689 : :
1690 : : /* we now just need to write the buffer */
1691 : 0 : return ssl3_write_pending(s,type,buf,len);
1692 : : err:
1693 : : return -1;
1694 : : }
1695 : :
1696 : :
1697 : :
1698 : 0 : static int dtls1_record_replay_check(SSL *s, DTLS1_BITMAP *bitmap)
1699 : : {
1700 : : int cmp;
1701 : : unsigned int shift;
1702 : 0 : const unsigned char *seq = s->s3->read_sequence;
1703 : :
1704 : 0 : cmp = satsub64be(seq,bitmap->max_seq_num);
1705 [ # # ]: 0 : if (cmp > 0)
1706 : : {
1707 : 0 : memcpy (s->s3->rrec.seq_num,seq,8);
1708 : : return 1; /* this record in new */
1709 : : }
1710 : 0 : shift = -cmp;
1711 [ # # ]: 0 : if (shift >= sizeof(bitmap->map)*8)
1712 : : return 0; /* stale, outside the window */
1713 [ # # ]: 0 : else if (bitmap->map & (1UL<<shift))
1714 : : return 0; /* record previously received */
1715 : :
1716 : 0 : memcpy (s->s3->rrec.seq_num,seq,8);
1717 : : return 1;
1718 : : }
1719 : :
1720 : :
1721 : 0 : static void dtls1_record_bitmap_update(SSL *s, DTLS1_BITMAP *bitmap)
1722 : : {
1723 : : int cmp;
1724 : : unsigned int shift;
1725 : 0 : const unsigned char *seq = s->s3->read_sequence;
1726 : :
1727 : 0 : cmp = satsub64be(seq,bitmap->max_seq_num);
1728 [ # # ]: 0 : if (cmp > 0)
1729 : : {
1730 : 0 : shift = cmp;
1731 [ # # ]: 0 : if (shift < sizeof(bitmap->map)*8)
1732 : 0 : bitmap->map <<= shift, bitmap->map |= 1UL;
1733 : : else
1734 : 0 : bitmap->map = 1UL;
1735 : 0 : memcpy(bitmap->max_seq_num,seq,8);
1736 : : }
1737 : : else {
1738 : 0 : shift = -cmp;
1739 [ # # ]: 0 : if (shift < sizeof(bitmap->map)*8)
1740 : 0 : bitmap->map |= 1UL<<shift;
1741 : : }
1742 : 0 : }
1743 : :
1744 : :
1745 : 0 : int dtls1_dispatch_alert(SSL *s)
1746 : : {
1747 : : int i,j;
1748 : 0 : void (*cb)(const SSL *ssl,int type,int val)=NULL;
1749 : : unsigned char buf[DTLS1_AL_HEADER_LENGTH];
1750 : 0 : unsigned char *ptr = &buf[0];
1751 : :
1752 : 0 : s->s3->alert_dispatch=0;
1753 : :
1754 : : memset(buf, 0x00, sizeof(buf));
1755 : 0 : *ptr++ = s->s3->send_alert[0];
1756 : 0 : *ptr++ = s->s3->send_alert[1];
1757 : :
1758 : : #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
1759 : : if (s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE)
1760 : : {
1761 : : s2n(s->d1->handshake_read_seq, ptr);
1762 : : #if 0
1763 : : if ( s->d1->r_msg_hdr.frag_off == 0) /* waiting for a new msg */
1764 : :
1765 : : else
1766 : : s2n(s->d1->r_msg_hdr.seq, ptr); /* partial msg read */
1767 : : #endif
1768 : :
1769 : : #if 0
1770 : : fprintf(stderr, "s->d1->handshake_read_seq = %d, s->d1->r_msg_hdr.seq = %d\n",s->d1->handshake_read_seq,s->d1->r_msg_hdr.seq);
1771 : : #endif
1772 : : l2n3(s->d1->r_msg_hdr.frag_off, ptr);
1773 : : }
1774 : : #endif
1775 : :
1776 : 0 : i = do_dtls1_write(s, SSL3_RT_ALERT, &buf[0], sizeof(buf), 0);
1777 [ # # ]: 0 : if (i <= 0)
1778 : : {
1779 : 0 : s->s3->alert_dispatch=1;
1780 : : /* fprintf( stderr, "not done with alert\n" ); */
1781 : : }
1782 : : else
1783 : : {
1784 [ # # ]: 0 : if (s->s3->send_alert[0] == SSL3_AL_FATAL
1785 : : #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
1786 : : || s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
1787 : : #endif
1788 : : )
1789 : 0 : (void)BIO_flush(s->wbio);
1790 : :
1791 [ # # ]: 0 : if (s->msg_callback)
1792 : 0 : s->msg_callback(1, s->version, SSL3_RT_ALERT, s->s3->send_alert,
1793 : : 2, s, s->msg_callback_arg);
1794 : :
1795 [ # # ]: 0 : if (s->info_callback != NULL)
1796 : : cb=s->info_callback;
1797 [ # # ]: 0 : else if (s->ctx->info_callback != NULL)
1798 : 0 : cb=s->ctx->info_callback;
1799 : :
1800 [ # # ]: 0 : if (cb != NULL)
1801 : : {
1802 : 0 : j=(s->s3->send_alert[0]<<8)|s->s3->send_alert[1];
1803 : 0 : cb(s,SSL_CB_WRITE_ALERT,j);
1804 : : }
1805 : : }
1806 : 0 : return(i);
1807 : : }
1808 : :
1809 : :
1810 : : static DTLS1_BITMAP *
1811 : 0 : dtls1_get_bitmap(SSL *s, SSL3_RECORD *rr, unsigned int *is_next_epoch)
1812 : : {
1813 : :
1814 : 0 : *is_next_epoch = 0;
1815 : :
1816 : : /* In current epoch, accept HM, CCS, DATA, & ALERT */
1817 [ # # ]: 0 : if (rr->epoch == s->d1->r_epoch)
1818 : 0 : return &s->d1->bitmap;
1819 : :
1820 : : /* Only HM and ALERT messages can be from the next epoch */
1821 [ # # ][ # # ]: 0 : else if (rr->epoch == (unsigned long)(s->d1->r_epoch + 1) &&
1822 : 0 : (rr->type == SSL3_RT_HANDSHAKE ||
1823 : : rr->type == SSL3_RT_ALERT))
1824 : : {
1825 : 0 : *is_next_epoch = 1;
1826 : 0 : return &s->d1->next_bitmap;
1827 : : }
1828 : :
1829 : : return NULL;
1830 : : }
1831 : :
1832 : : #if 0
1833 : : static int
1834 : : dtls1_record_needs_buffering(SSL *s, SSL3_RECORD *rr, unsigned short *priority,
1835 : : unsigned long *offset)
1836 : : {
1837 : :
1838 : : /* alerts are passed up immediately */
1839 : : if ( rr->type == SSL3_RT_APPLICATION_DATA ||
1840 : : rr->type == SSL3_RT_ALERT)
1841 : : return 0;
1842 : :
1843 : : /* Only need to buffer if a handshake is underway.
1844 : : * (this implies that Hello Request and Client Hello are passed up
1845 : : * immediately) */
1846 : : if ( SSL_in_init(s))
1847 : : {
1848 : : unsigned char *data = rr->data;
1849 : : /* need to extract the HM/CCS sequence number here */
1850 : : if ( rr->type == SSL3_RT_HANDSHAKE ||
1851 : : rr->type == SSL3_RT_CHANGE_CIPHER_SPEC)
1852 : : {
1853 : : unsigned short seq_num;
1854 : : struct hm_header_st msg_hdr;
1855 : : struct ccs_header_st ccs_hdr;
1856 : :
1857 : : if ( rr->type == SSL3_RT_HANDSHAKE)
1858 : : {
1859 : : dtls1_get_message_header(data, &msg_hdr);
1860 : : seq_num = msg_hdr.seq;
1861 : : *offset = msg_hdr.frag_off;
1862 : : }
1863 : : else
1864 : : {
1865 : : dtls1_get_ccs_header(data, &ccs_hdr);
1866 : : seq_num = ccs_hdr.seq;
1867 : : *offset = 0;
1868 : : }
1869 : :
1870 : : /* this is either a record we're waiting for, or a
1871 : : * retransmit of something we happened to previously
1872 : : * receive (higher layers will drop the repeat silently */
1873 : : if ( seq_num < s->d1->handshake_read_seq)
1874 : : return 0;
1875 : : if (rr->type == SSL3_RT_HANDSHAKE &&
1876 : : seq_num == s->d1->handshake_read_seq &&
1877 : : msg_hdr.frag_off < s->d1->r_msg_hdr.frag_off)
1878 : : return 0;
1879 : : else if ( seq_num == s->d1->handshake_read_seq &&
1880 : : (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC ||
1881 : : msg_hdr.frag_off == s->d1->r_msg_hdr.frag_off))
1882 : : return 0;
1883 : : else
1884 : : {
1885 : : *priority = seq_num;
1886 : : return 1;
1887 : : }
1888 : : }
1889 : : else /* unknown record type */
1890 : : return 0;
1891 : : }
1892 : :
1893 : : return 0;
1894 : : }
1895 : : #endif
1896 : :
1897 : : void
1898 : 0 : dtls1_reset_seq_numbers(SSL *s, int rw)
1899 : : {
1900 : : unsigned char *seq;
1901 : 0 : unsigned int seq_bytes = sizeof(s->s3->read_sequence);
1902 : :
1903 [ # # ]: 0 : if ( rw & SSL3_CC_READ)
1904 : : {
1905 : 0 : seq = s->s3->read_sequence;
1906 : 0 : s->d1->r_epoch++;
1907 : 0 : memcpy(&(s->d1->bitmap), &(s->d1->next_bitmap), sizeof(DTLS1_BITMAP));
1908 : 0 : memset(&(s->d1->next_bitmap), 0x00, sizeof(DTLS1_BITMAP));
1909 : : }
1910 : : else
1911 : : {
1912 : 0 : seq = s->s3->write_sequence;
1913 : 0 : memcpy(s->d1->last_write_sequence, seq, sizeof(s->s3->write_sequence));
1914 : 0 : s->d1->w_epoch++;
1915 : : }
1916 : :
1917 : 0 : memset(seq, 0x00, seq_bytes);
1918 : 0 : }
|