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 |
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 | #if defined(OPENSSL_SYS_VXWORKS) |
76 | #include <sys/times.h> |
77 | #else |
78 | #include <sys/time.h> |
79 | #endif |
80 | #endif |
81 | |
82 | #ifdef __cplusplus |
83 | extern "C" { |
84 | #endif |
85 | |
86 | #define DTLS1_VERSION 0xFEFF |
87 | #define DTLS_MAX_VERSION DTLS1_VERSION |
88 | |
89 | #define DTLS1_BAD_VER 0x0100 |
90 | |
91 | #if 0 |
92 | /* this alert description is not specified anywhere... */ |
93 | #define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE 110 |
94 | #endif |
95 | |
96 | /* lengths of messages */ |
97 | #define DTLS1_COOKIE_LENGTH 256 |
98 | |
99 | #define 13 |
100 | |
101 | #define 12 |
102 | |
103 | #define DTLS1_HM_BAD_FRAGMENT -2 |
104 | #define DTLS1_HM_FRAGMENT_RETRY -3 |
105 | |
106 | #define 1 |
107 | |
108 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE |
109 | #define DTLS1_AL_HEADER_LENGTH 7 |
110 | #else |
111 | #define 2 |
112 | #endif |
113 | |
114 | #ifndef OPENSSL_NO_SSL_INTERN |
115 | |
116 | #ifndef OPENSSL_NO_SCTP |
117 | #define DTLS1_SCTP_AUTH_LABEL "EXPORTER_DTLS_OVER_SCTP" |
118 | #endif |
119 | |
120 | typedef struct dtls1_bitmap_st |
121 | { |
122 | unsigned long map; /* track 32 packets on 32-bit systems |
123 | and 64 - on 64-bit systems */ |
124 | unsigned char max_seq_num[8]; /* max record number seen so far, |
125 | 64-bit value in big-endian |
126 | encoding */ |
127 | } DTLS1_BITMAP; |
128 | |
129 | struct dtls1_retransmit_state |
130 | { |
131 | EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ |
132 | EVP_MD_CTX *write_hash; /* used for mac generation */ |
133 | #ifndef OPENSSL_NO_COMP |
134 | COMP_CTX *compress; /* compression */ |
135 | #else |
136 | char *compress; |
137 | #endif |
138 | SSL_SESSION *session; |
139 | unsigned short epoch; |
140 | }; |
141 | |
142 | struct |
143 | { |
144 | unsigned char ; |
145 | unsigned long ; |
146 | unsigned short ; |
147 | unsigned long ; |
148 | unsigned long ; |
149 | unsigned int ; |
150 | struct dtls1_retransmit_state ; |
151 | }; |
152 | |
153 | struct |
154 | { |
155 | unsigned char ; |
156 | unsigned short ; |
157 | }; |
158 | |
159 | struct dtls1_timeout_st |
160 | { |
161 | /* Number of read timeouts so far */ |
162 | unsigned int read_timeouts; |
163 | |
164 | /* Number of write timeouts so far */ |
165 | unsigned int write_timeouts; |
166 | |
167 | /* Number of alerts received so far */ |
168 | unsigned int num_alerts; |
169 | }; |
170 | |
171 | typedef struct record_pqueue_st |
172 | { |
173 | unsigned short epoch; |
174 | pqueue q; |
175 | } record_pqueue; |
176 | |
177 | typedef struct hm_fragment_st |
178 | { |
179 | struct hm_header_st ; |
180 | unsigned char *fragment; |
181 | unsigned char *reassembly; |
182 | } hm_fragment; |
183 | |
184 | typedef struct dtls1_state_st |
185 | { |
186 | unsigned int send_cookie; |
187 | unsigned char cookie[DTLS1_COOKIE_LENGTH]; |
188 | unsigned char rcvd_cookie[DTLS1_COOKIE_LENGTH]; |
189 | unsigned int cookie_len; |
190 | |
191 | /* |
192 | * The current data and handshake epoch. This is initially |
193 | * undefined, and starts at zero once the initial handshake is |
194 | * completed |
195 | */ |
196 | unsigned short r_epoch; |
197 | unsigned short w_epoch; |
198 | |
199 | /* records being received in the current epoch */ |
200 | DTLS1_BITMAP bitmap; |
201 | |
202 | /* renegotiation starts a new set of sequence numbers */ |
203 | DTLS1_BITMAP next_bitmap; |
204 | |
205 | /* handshake message numbers */ |
206 | unsigned short handshake_write_seq; |
207 | unsigned short next_handshake_write_seq; |
208 | |
209 | unsigned short handshake_read_seq; |
210 | |
211 | /* save last sequence number for retransmissions */ |
212 | unsigned char last_write_sequence[8]; |
213 | |
214 | /* Received handshake records (processed and unprocessed) */ |
215 | record_pqueue unprocessed_rcds; |
216 | record_pqueue processed_rcds; |
217 | |
218 | /* Buffered handshake messages */ |
219 | pqueue buffered_messages; |
220 | |
221 | /* Buffered (sent) handshake records */ |
222 | pqueue sent_messages; |
223 | |
224 | /* Buffered application records. |
225 | * Only for records between CCS and Finished |
226 | * to prevent either protocol violation or |
227 | * unnecessary message loss. |
228 | */ |
229 | record_pqueue buffered_app_data; |
230 | |
231 | /* Is set when listening for new connections with dtls1_listen() */ |
232 | unsigned int listen; |
233 | |
234 | unsigned int mtu; /* max DTLS packet size */ |
235 | |
236 | struct hm_header_st w_msg_hdr; |
237 | struct hm_header_st r_msg_hdr; |
238 | |
239 | struct dtls1_timeout_st timeout; |
240 | |
241 | /* Indicates when the last handshake msg or heartbeat sent will timeout */ |
242 | struct timeval next_timeout; |
243 | |
244 | /* Timeout duration */ |
245 | unsigned short timeout_duration; |
246 | |
247 | /* storage for Alert/Handshake protocol data received but not |
248 | * yet processed by ssl3_read_bytes: */ |
249 | unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH]; |
250 | unsigned int alert_fragment_len; |
251 | unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH]; |
252 | unsigned int handshake_fragment_len; |
253 | |
254 | unsigned int retransmitting; |
255 | unsigned int change_cipher_spec_ok; |
256 | |
257 | #ifndef OPENSSL_NO_SCTP |
258 | /* used when SSL_ST_XX_FLUSH is entered */ |
259 | int next_state; |
260 | |
261 | int shutdown_received; |
262 | #endif |
263 | |
264 | } DTLS1_STATE; |
265 | |
266 | typedef struct dtls1_record_data_st |
267 | { |
268 | unsigned char *packet; |
269 | unsigned int packet_length; |
270 | SSL3_BUFFER rbuf; |
271 | SSL3_RECORD rrec; |
272 | #ifndef OPENSSL_NO_SCTP |
273 | struct bio_dgram_sctp_rcvinfo recordinfo; |
274 | #endif |
275 | } DTLS1_RECORD_DATA; |
276 | |
277 | #endif |
278 | |
279 | /* Timeout multipliers (timeout slice is defined in apps/timeouts.h */ |
280 | #define DTLS1_TMO_READ_COUNT 2 |
281 | #define DTLS1_TMO_WRITE_COUNT 2 |
282 | |
283 | #define DTLS1_TMO_ALERT_COUNT 12 |
284 | |
285 | #ifdef __cplusplus |
286 | } |
287 | #endif |
288 | #endif |
289 | |