dtls1.h revision 296465
1/* ssl/dtls1.h */
2/*
3 * DTLS implementation written by Nagendra Modadugu
4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
5 */
6/* ====================================================================
7 * Copyright (c) 1999-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
60#ifndef HEADER_DTLS1_H
61# define HEADER_DTLS1_H
62
63# include <openssl/buffer.h>
64# include <openssl/pqueue.h>
65# ifdef OPENSSL_SYS_VMS
66#  include <resource.h>
67#  include <sys/timeb.h>
68# endif
69# ifdef OPENSSL_SYS_WIN32
70/* Needed for struct timeval */
71#  include <winsock.h>
72# elif defined(OPENSSL_SYS_NETWARE) && !defined(_WINSOCK2API_)
73#  include <sys/timeval.h>
74# else
75#  include <sys/time.h>
76# endif
77
78#ifdef  __cplusplus
79extern "C" {
80#endif
81
82# define DTLS1_VERSION                   0xFEFF
83# define DTLS_MAX_VERSION                DTLS1_VERSION
84
85# define DTLS1_BAD_VER                   0x0100
86
87# if 0
88/* this alert description is not specified anywhere... */
89#  define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE    110
90# endif
91
92/* lengths of messages */
93# define DTLS1_COOKIE_LENGTH                     256
94
95# define DTLS1_RT_HEADER_LENGTH                  13
96
97# define DTLS1_HM_HEADER_LENGTH                  12
98
99# define DTLS1_HM_BAD_FRAGMENT                   -2
100# define DTLS1_HM_FRAGMENT_RETRY                 -3
101
102# define DTLS1_CCS_HEADER_LENGTH                  1
103
104# ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
105#  define DTLS1_AL_HEADER_LENGTH                   7
106# else
107#  define DTLS1_AL_HEADER_LENGTH                   2
108# endif
109
110typedef struct dtls1_bitmap_st {
111    PQ_64BIT map;
112    unsigned long length;       /* sizeof the bitmap in bits */
113    PQ_64BIT max_seq_num;       /* max record number seen so far */
114} DTLS1_BITMAP;
115
116struct dtls1_retransmit_state {
117    EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */
118    const EVP_MD *write_hash;   /* used for mac generation */
119# ifndef OPENSSL_NO_COMP
120    COMP_CTX *compress;         /* compression */
121# else
122    char *compress;
123# endif
124    SSL_SESSION *session;
125    unsigned short epoch;
126};
127
128struct hm_header_st {
129    unsigned char type;
130    unsigned long msg_len;
131    unsigned short seq;
132    unsigned long frag_off;
133    unsigned long frag_len;
134    unsigned int is_ccs;
135    struct dtls1_retransmit_state saved_retransmit_state;
136};
137
138struct ccs_header_st {
139    unsigned char type;
140    unsigned short seq;
141};
142
143struct dtls1_timeout_st {
144    /* Number of read timeouts so far */
145    unsigned int read_timeouts;
146    /* Number of write timeouts so far */
147    unsigned int write_timeouts;
148    /* Number of alerts received so far */
149    unsigned int num_alerts;
150};
151
152typedef struct record_pqueue_st {
153    unsigned short epoch;
154    pqueue q;
155} record_pqueue;
156
157typedef struct hm_fragment_st {
158    struct hm_header_st msg_header;
159    unsigned char *fragment;
160    unsigned char *reassembly;
161} hm_fragment;
162
163typedef struct dtls1_state_st {
164    unsigned int send_cookie;
165    unsigned char cookie[DTLS1_COOKIE_LENGTH];
166    unsigned char rcvd_cookie[DTLS1_COOKIE_LENGTH];
167    unsigned int cookie_len;
168    /*
169     * The current data and handshake epoch.  This is initially
170     * undefined, and starts at zero once the initial handshake is
171     * completed
172     */
173    unsigned short r_epoch;
174    unsigned short w_epoch;
175    /* records being received in the current epoch */
176    DTLS1_BITMAP bitmap;
177    /* renegotiation starts a new set of sequence numbers */
178    DTLS1_BITMAP next_bitmap;
179    /* handshake message numbers */
180    unsigned short handshake_write_seq;
181    unsigned short next_handshake_write_seq;
182    unsigned short handshake_read_seq;
183    /* save last sequence number for retransmissions */
184    unsigned char last_write_sequence[8];
185    /* Received handshake records (processed and unprocessed) */
186    record_pqueue unprocessed_rcds;
187    record_pqueue processed_rcds;
188    /* Buffered handshake messages */
189    pqueue buffered_messages;
190    /* Buffered (sent) handshake records */
191    pqueue sent_messages;
192    /*
193     * Buffered application records. Only for records between CCS and
194     * Finished to prevent either protocol violation or unnecessary message
195     * loss.
196     */
197    record_pqueue buffered_app_data;
198    /* Is set when listening for new connections with dtls1_listen() */
199    unsigned int listen;
200    unsigned int mtu;           /* max DTLS packet size */
201    struct hm_header_st w_msg_hdr;
202    struct hm_header_st r_msg_hdr;
203    struct dtls1_timeout_st timeout;
204    /* Indicates when the last handshake msg sent will timeout */
205    struct timeval next_timeout;
206    /* Timeout duration */
207    unsigned short timeout_duration;
208    /*
209     * storage for Alert/Handshake protocol data received but not yet
210     * processed by ssl3_read_bytes:
211     */
212    unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH];
213    unsigned int alert_fragment_len;
214    unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH];
215    unsigned int handshake_fragment_len;
216    unsigned int retransmitting;
217    unsigned int change_cipher_spec_ok;
218} DTLS1_STATE;
219
220typedef struct dtls1_record_data_st {
221    unsigned char *packet;
222    unsigned int packet_length;
223    SSL3_BUFFER rbuf;
224    SSL3_RECORD rrec;
225} DTLS1_RECORD_DATA;
226
227/* Timeout multipliers (timeout slice is defined in apps/timeouts.h */
228# define DTLS1_TMO_READ_COUNT                      2
229# define DTLS1_TMO_WRITE_COUNT                     2
230
231# define DTLS1_TMO_ALERT_COUNT                     12
232
233#ifdef  __cplusplus
234}
235#endif
236#endif
237