14c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* ssl/dtls1.h */ 24c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* 34c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * DTLS implementation written by Nagendra Modadugu 44c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 54c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley */ 64c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* ==================================================================== 74c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. 84c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 94c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * Redistribution and use in source and binary forms, with or without 104c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * modification, are permitted provided that the following conditions 114c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * are met: 124c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 134c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 1. Redistributions of source code must retain the above copyright 144c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * notice, this list of conditions and the following disclaimer. 154c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 164c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 2. Redistributions in binary form must reproduce the above copyright 174c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * notice, this list of conditions and the following disclaimer in 184c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * the documentation and/or other materials provided with the 194c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * distribution. 204c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 214c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 3. All advertising materials mentioning features or use of this 224c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * software must display the following acknowledgment: 234c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * "This product includes software developed by the OpenSSL Project 244c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 254c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 264c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 274c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * endorse or promote products derived from this software without 284c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * prior written permission. For written permission, please contact 294c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * openssl-core@OpenSSL.org. 304c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 314c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 5. Products derived from this software may not be called "OpenSSL" 324c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * nor may "OpenSSL" appear in their names without prior written 334c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * permission of the OpenSSL Project. 344c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 354c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 6. Redistributions of any form whatsoever must retain the following 364c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * acknowledgment: 374c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * "This product includes software developed by the OpenSSL Project 384c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 394c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 404c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 414c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 424c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 434c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 444c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 454c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 464c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 474c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 484c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 494c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 504c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 514c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * OF THE POSSIBILITY OF SUCH DAMAGE. 524c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * ==================================================================== 534c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 544c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * This product includes cryptographic software written by Eric Young 554c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * (eay@cryptsoft.com). This product includes software written by Tim 56ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley * Hudson (tjh@cryptsoft.com). */ 574c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 584c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#ifndef HEADER_DTLS1_H 594c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define HEADER_DTLS1_H 604c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 61ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley#include <openssl/base.h> 624c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#include <openssl/buf.h> 634c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#include <openssl/pqueue.h> 644c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 654c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#ifdef __cplusplus 664c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleyextern "C" { 674c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif 684c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 69ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley 704c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_VERSION 0xFEFF 714c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_2_VERSION 0xFEFD 724c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* Special value for method supporting multiple versions */ 734c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS_ANY_VERSION 0x1FFFF 744c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 754c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#if 0 764c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* this alert description is not specified anywhere... */ 774c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE 110 784c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif 794c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 804c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* lengths of messages */ 814c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_COOKIE_LENGTH 256 824c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 834c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_RT_HEADER_LENGTH 13 844c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 854c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_HM_HEADER_LENGTH 12 864c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 874c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_HM_BAD_FRAGMENT -2 884c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_HM_FRAGMENT_RETRY -3 894c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 904c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_CCS_HEADER_LENGTH 1 914c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 924c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE 934c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_AL_HEADER_LENGTH 7 944c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#else 954c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_AL_HEADER_LENGTH 2 964c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif 974c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 984c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#ifndef OPENSSL_NO_SSL_INTERN 994c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 100ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley 101ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley#if defined(OPENSSL_WINDOWS) 102ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley/* Because of Windows header issues, we can't get the normal declaration of 103ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley * timeval. */ 104ded93581f1674f81faa0dba4b15a842756066ab2Adam Langleytypedef struct OPENSSL_timeval_st { 105ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley long tv_sec; 106ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley long tv_usec; 107ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley} OPENSSL_timeval; 108ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley#else 109ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley#include <sys/time.h> 110ded93581f1674f81faa0dba4b15a842756066ab2Adam Langleytypedef struct timeval OPENSSL_timeval; 111ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley#endif 112ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley 1134c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleytypedef struct dtls1_bitmap_st 1144c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley { 1154c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned long map; /* track 32 packets on 32-bit systems 1164c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley and 64 - on 64-bit systems */ 1174c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned char max_seq_num[8]; /* max record number seen so far, 1184c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 64-bit value in big-endian 1194c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley encoding */ 1204c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley } DTLS1_BITMAP; 1214c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1224c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleystruct dtls1_retransmit_state 1234c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley { 1244c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ 1254c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley EVP_MD_CTX *write_hash; /* used for mac generation */ 1264c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley SSL_SESSION *session; 1274c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned short epoch; 1284c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley }; 1294c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1304c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleystruct hm_header_st 1314c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley { 1324c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned char type; 1334c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned long msg_len; 1344c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned short seq; 1354c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned long frag_off; 1364c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned long frag_len; 1374c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int is_ccs; 1384c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley struct dtls1_retransmit_state saved_retransmit_state; 1394c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley }; 1404c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1414c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleystruct ccs_header_st 1424c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley { 1434c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned char type; 1444c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned short seq; 1454c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley }; 1464c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1474c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleystruct dtls1_timeout_st 1484c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley { 1494c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* Number of read timeouts so far */ 1504c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int read_timeouts; 1514c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1524c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* Number of write timeouts so far */ 1534c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int write_timeouts; 1544c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1554c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* Number of alerts received so far */ 1564c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int num_alerts; 1574c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley }; 1584c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1594c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleytypedef struct record_pqueue_st 1604c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley { 1614c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned short epoch; 1624c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley pqueue q; 1634c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley } record_pqueue; 1644c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1654c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleytypedef struct hm_fragment_st 1664c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley { 1674c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley struct hm_header_st msg_header; 1684c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned char *fragment; 1694c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned char *reassembly; 1704c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley } hm_fragment; 1714c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1724c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleytypedef struct dtls1_state_st 1734c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley { 174f2fedefdcaf62f10b566f55858c25f35112072eaDavid Benjamin /* send_cookie is true if we are resending the ClientHello 175f2fedefdcaf62f10b566f55858c25f35112072eaDavid Benjamin * with a cookie from a HelloVerifyRequest. */ 1764c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int send_cookie; 177f2fedefdcaf62f10b566f55858c25f35112072eaDavid Benjamin 178fb4ea28bb84875a844cd65a9e4a2167ec884cd48David Benjamin uint8_t cookie[DTLS1_COOKIE_LENGTH]; 179fb4ea28bb84875a844cd65a9e4a2167ec884cd48David Benjamin size_t cookie_len; 1804c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1814c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* 1824c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * The current data and handshake epoch. This is initially 1834c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * undefined, and starts at zero once the initial handshake is 1844c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * completed 1854c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley */ 1864c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned short r_epoch; 1874c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned short w_epoch; 1884c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1894c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* records being received in the current epoch */ 1904c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley DTLS1_BITMAP bitmap; 1914c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1924c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* renegotiation starts a new set of sequence numbers */ 1934c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley DTLS1_BITMAP next_bitmap; 1944c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1954c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* handshake message numbers */ 1964c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned short handshake_write_seq; 1974c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned short next_handshake_write_seq; 1984c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1994c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned short handshake_read_seq; 2004c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2014c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* save last sequence number for retransmissions */ 2024c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned char last_write_sequence[8]; 2034c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2044c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* Received handshake records (processed and unprocessed) */ 2054c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley record_pqueue unprocessed_rcds; 2064c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley record_pqueue processed_rcds; 2074c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2084c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* Buffered handshake messages */ 2094c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley pqueue buffered_messages; 2104c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2114c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* Buffered (sent) handshake records */ 2124c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley pqueue sent_messages; 2134c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2144c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* Buffered application records. 2154c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * Only for records between CCS and Finished 2164c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * to prevent either protocol violation or 2174c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * unnecessary message loss. 2184c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley */ 2194c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley record_pqueue buffered_app_data; 2204c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2214c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* Is set when listening for new connections with dtls1_listen() */ 2224c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int listen; 2234c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2244c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int mtu; /* max DTLS packet size */ 2254c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2264c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley struct hm_header_st w_msg_hdr; 2274c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley struct hm_header_st r_msg_hdr; 2284c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2294c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley struct dtls1_timeout_st timeout; 2304c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 231ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley /* Indicates when the last handshake msg or heartbeat sent will 232ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley * timeout. Because of header issues on Windows, this cannot actually 233ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley * be a struct timeval. */ 234ded93581f1674f81faa0dba4b15a842756066ab2Adam Langley OPENSSL_timeval next_timeout; 2354c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2364c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* Timeout duration */ 2374c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned short timeout_duration; 2384c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2394c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley /* storage for Alert/Handshake protocol data received but not 2404c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * yet processed by ssl3_read_bytes: */ 2414c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH]; 2424c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int alert_fragment_len; 2434c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH]; 2444c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int handshake_fragment_len; 2454c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2464c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int retransmitting; 2474c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int change_cipher_spec_ok; 2484c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley } DTLS1_STATE; 2494c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2504c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleytypedef struct dtls1_record_data_st 2514c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley { 2524c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned char *packet; 2534c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned int packet_length; 2544c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley SSL3_BUFFER rbuf; 2554c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley SSL3_RECORD rrec; 2564c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley } DTLS1_RECORD_DATA; 2574c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2584c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif 2594c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2604c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* Timeout multipliers (timeout slice is defined in apps/timeouts.h */ 2614c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_TMO_READ_COUNT 2 2624c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_TMO_WRITE_COUNT 2 2634c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2644c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define DTLS1_TMO_ALERT_COUNT 12 2654c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 2664c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#ifdef __cplusplus 2674c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley} 2684c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif 2694c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif 2704c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 271