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