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 |
79 |
extern "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 |
|
110 |
|
111 |
typedef struct dtls1_bitmap_st |
112 |
{ |
113 |
PQ_64BIT map; |
114 |
unsigned long length; /* sizeof the bitmap in bits */ |
115 |
PQ_64BIT max_seq_num; /* max record number seen so far */ |
116 |
} DTLS1_BITMAP; |
117 |
|
118 |
struct dtls1_retransmit_state |
119 |
{ |
120 |
EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ |
121 |
const EVP_MD *write_hash; /* used for mac generation */ |
122 |
#ifndef OPENSSL_NO_COMP |
123 |
COMP_CTX *compress; /* compression */ |
124 |
#else |
125 |
char *compress; |
126 |
#endif |
127 |
SSL_SESSION *session; |
128 |
unsigned short epoch; |
129 |
}; |
130 |
|
131 |
struct hm_header_st |
132 |
{ |
133 |
unsigned char type; |
134 |
unsigned long msg_len; |
135 |
unsigned short seq; |
136 |
unsigned long frag_off; |
137 |
unsigned long frag_len; |
138 |
unsigned int is_ccs; |
139 |
struct dtls1_retransmit_state saved_retransmit_state; |
140 |
}; |
141 |
|
142 |
struct ccs_header_st |
143 |
{ |
144 |
unsigned char type; |
145 |
unsigned short seq; |
146 |
}; |
147 |
|
148 |
struct dtls1_timeout_st |
149 |
{ |
150 |
/* Number of read timeouts so far */ |
151 |
unsigned int read_timeouts; |
152 |
|
153 |
/* Number of write timeouts so far */ |
154 |
unsigned int write_timeouts; |
155 |
|
156 |
/* Number of alerts received so far */ |
157 |
unsigned int num_alerts; |
158 |
}; |
159 |
|
160 |
typedef struct record_pqueue_st |
161 |
{ |
162 |
unsigned short epoch; |
163 |
pqueue q; |
164 |
} record_pqueue; |
165 |
|
166 |
typedef struct hm_fragment_st |
167 |
{ |
168 |
struct hm_header_st msg_header; |
169 |
unsigned char *fragment; |
170 |
unsigned char *reassembly; |
171 |
} hm_fragment; |
172 |
|
173 |
typedef struct dtls1_state_st |
174 |
{ |
175 |
unsigned int send_cookie; |
176 |
unsigned char cookie[DTLS1_COOKIE_LENGTH]; |
177 |
unsigned char rcvd_cookie[DTLS1_COOKIE_LENGTH]; |
178 |
unsigned int cookie_len; |
179 |
|
180 |
/* |
181 |
* The current data and handshake epoch. This is initially |
182 |
* undefined, and starts at zero once the initial handshake is |
183 |
* completed |
184 |
*/ |
185 |
unsigned short r_epoch; |
186 |
unsigned short w_epoch; |
187 |
|
188 |
/* records being received in the current epoch */ |
189 |
DTLS1_BITMAP bitmap; |
190 |
|
191 |
/* renegotiation starts a new set of sequence numbers */ |
192 |
DTLS1_BITMAP next_bitmap; |
193 |
|
194 |
/* handshake message numbers */ |
195 |
unsigned short handshake_write_seq; |
196 |
unsigned short next_handshake_write_seq; |
197 |
|
198 |
unsigned short handshake_read_seq; |
199 |
|
200 |
/* save last sequence number for retransmissions */ |
201 |
unsigned char last_write_sequence[8]; |
202 |
|
203 |
/* Received handshake records (processed and unprocessed) */ |
204 |
record_pqueue unprocessed_rcds; |
205 |
record_pqueue processed_rcds; |
206 |
|
207 |
/* Buffered handshake messages */ |
208 |
pqueue buffered_messages; |
209 |
|
210 |
/* Buffered (sent) handshake records */ |
211 |
pqueue sent_messages; |
212 |
|
213 |
/* Buffered application records. |
214 |
* Only for records between CCS and Finished |
215 |
* to prevent either protocol violation or |
216 |
* unnecessary message loss. |
217 |
*/ |
218 |
record_pqueue buffered_app_data; |
219 |
|
220 |
/* Is set when listening for new connections with dtls1_listen() */ |
221 |
unsigned int listen; |
222 |
|
223 |
unsigned int mtu; /* max DTLS packet size */ |
224 |
|
225 |
struct hm_header_st w_msg_hdr; |
226 |
struct hm_header_st r_msg_hdr; |
227 |
|
228 |
struct dtls1_timeout_st timeout; |
229 |
|
230 |
/* Indicates when the last handshake msg sent will timeout */ |
231 |
struct timeval next_timeout; |
232 |
|
233 |
/* Timeout duration */ |
234 |
unsigned short timeout_duration; |
235 |
|
236 |
/* storage for Alert/Handshake protocol data received but not |
237 |
* yet processed by ssl3_read_bytes: */ |
238 |
unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH]; |
239 |
unsigned int alert_fragment_len; |
240 |
unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH]; |
241 |
unsigned int handshake_fragment_len; |
242 |
|
243 |
unsigned int retransmitting; |
244 |
unsigned int change_cipher_spec_ok; |
245 |
|
246 |
} DTLS1_STATE; |
247 |
|
248 |
typedef struct dtls1_record_data_st |
249 |
{ |
250 |
unsigned char *packet; |
251 |
unsigned int packet_length; |
252 |
SSL3_BUFFER rbuf; |
253 |
SSL3_RECORD rrec; |
254 |
} DTLS1_RECORD_DATA; |
255 |
|
256 |
|
257 |
/* Timeout multipliers (timeout slice is defined in apps/timeouts.h */ |
258 |
#define DTLS1_TMO_READ_COUNT 2 |
259 |
#define DTLS1_TMO_WRITE_COUNT 2 |
260 |
|
261 |
#define DTLS1_TMO_ALERT_COUNT 12 |
262 |
|
263 |
#ifdef __cplusplus |
264 |
} |
265 |
#endif |
266 |
#endif |