OSDN Git Service

7c597810bcc1e19784e2e322bc90c022b5e7527a
[ffftp/ffftp.git] / contrib / openssl / include / openssl / dtls1.h
1 /* ssl/dtls1.h */\r
2 /*\r
3  * DTLS implementation written by Nagendra Modadugu\r
4  * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.\r
5  */\r
6 /* ====================================================================\r
7  * Copyright (c) 1999-2005 The OpenSSL Project.  All rights reserved.\r
8  *\r
9  * Redistribution and use in source and binary forms, with or without\r
10  * modification, are permitted provided that the following conditions\r
11  * are met:\r
12  *\r
13  * 1. Redistributions of source code must retain the above copyright\r
14  *    notice, this list of conditions and the following disclaimer.\r
15  *\r
16  * 2. Redistributions in binary form must reproduce the above copyright\r
17  *    notice, this list of conditions and the following disclaimer in\r
18  *    the documentation and/or other materials provided with the\r
19  *    distribution.\r
20  *\r
21  * 3. All advertising materials mentioning features or use of this\r
22  *    software must display the following acknowledgment:\r
23  *    "This product includes software developed by the OpenSSL Project\r
24  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"\r
25  *\r
26  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to\r
27  *    endorse or promote products derived from this software without\r
28  *    prior written permission. For written permission, please contact\r
29  *    openssl-core@OpenSSL.org.\r
30  *\r
31  * 5. Products derived from this software may not be called "OpenSSL"\r
32  *    nor may "OpenSSL" appear in their names without prior written\r
33  *    permission of the OpenSSL Project.\r
34  *\r
35  * 6. Redistributions of any form whatsoever must retain the following\r
36  *    acknowledgment:\r
37  *    "This product includes software developed by the OpenSSL Project\r
38  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"\r
39  *\r
40  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY\r
41  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
43  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR\r
44  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
45  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
46  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
47  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\r
49  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
50  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
51  * OF THE POSSIBILITY OF SUCH DAMAGE.\r
52  * ====================================================================\r
53  *\r
54  * This product includes cryptographic software written by Eric Young\r
55  * (eay@cryptsoft.com).  This product includes software written by Tim\r
56  * Hudson (tjh@cryptsoft.com).\r
57  *\r
58  */\r
59 \r
60 #ifndef HEADER_DTLS1_H\r
61 #define HEADER_DTLS1_H\r
62 \r
63 #include <openssl/buffer.h>\r
64 #include <openssl/pqueue.h>\r
65 #ifdef OPENSSL_SYS_VMS\r
66 #include <resource.h>\r
67 #include <sys/timeb.h>\r
68 #endif\r
69 #ifdef OPENSSL_SYS_WIN32\r
70 /* Needed for struct timeval */\r
71 #include <winsock.h>\r
72 #elif defined(OPENSSL_SYS_NETWARE) && !defined(_WINSOCK2API_)\r
73 #include <sys/timeval.h>\r
74 #else\r
75 #if defined(OPENSSL_SYS_VXWORKS)\r
76 #include <sys/times.h>\r
77 #else\r
78 #include <sys/time.h>\r
79 #endif\r
80 #endif\r
81 \r
82 #ifdef  __cplusplus\r
83 extern "C" {\r
84 #endif\r
85 \r
86 #define DTLS1_VERSION                   0xFEFF\r
87 #define DTLS1_BAD_VER                   0x0100\r
88 \r
89 #if 0\r
90 /* this alert description is not specified anywhere... */\r
91 #define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE    110\r
92 #endif\r
93 \r
94 /* lengths of messages */\r
95 #define DTLS1_COOKIE_LENGTH                     256\r
96 \r
97 #define DTLS1_RT_HEADER_LENGTH                  13\r
98 \r
99 #define DTLS1_HM_HEADER_LENGTH                  12\r
100 \r
101 #define DTLS1_HM_BAD_FRAGMENT                   -2\r
102 #define DTLS1_HM_FRAGMENT_RETRY                 -3\r
103 \r
104 #define DTLS1_CCS_HEADER_LENGTH                  1\r
105 \r
106 #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE\r
107 #define DTLS1_AL_HEADER_LENGTH                   7\r
108 #else\r
109 #define DTLS1_AL_HEADER_LENGTH                   2\r
110 #endif\r
111 \r
112 #ifndef OPENSSL_NO_SSL_INTERN\r
113 \r
114 #ifndef OPENSSL_NO_SCTP\r
115 #define DTLS1_SCTP_AUTH_LABEL   "EXPORTER_DTLS_OVER_SCTP"\r
116 #endif\r
117 \r
118 typedef struct dtls1_bitmap_st\r
119         {\r
120         unsigned long map;              /* track 32 packets on 32-bit systems\r
121                                            and 64 - on 64-bit systems */\r
122         unsigned char max_seq_num[8];   /* max record number seen so far,\r
123                                            64-bit value in big-endian\r
124                                            encoding */\r
125         } DTLS1_BITMAP;\r
126 \r
127 struct dtls1_retransmit_state\r
128         {\r
129         EVP_CIPHER_CTX *enc_write_ctx;  /* cryptographic state */\r
130         EVP_MD_CTX *write_hash;                 /* used for mac generation */\r
131 #ifndef OPENSSL_NO_COMP\r
132         COMP_CTX *compress;                             /* compression */\r
133 #else\r
134         char *compress;\r
135 #endif\r
136         SSL_SESSION *session;\r
137         unsigned short epoch;\r
138         };\r
139 \r
140 struct hm_header_st\r
141         {\r
142         unsigned char type;\r
143         unsigned long msg_len;\r
144         unsigned short seq;\r
145         unsigned long frag_off;\r
146         unsigned long frag_len;\r
147         unsigned int is_ccs;\r
148         struct dtls1_retransmit_state saved_retransmit_state;\r
149         };\r
150 \r
151 struct ccs_header_st\r
152         {\r
153         unsigned char type;\r
154         unsigned short seq;\r
155         };\r
156 \r
157 struct dtls1_timeout_st\r
158         {\r
159         /* Number of read timeouts so far */\r
160         unsigned int read_timeouts;\r
161 \r
162         /* Number of write timeouts so far */\r
163         unsigned int write_timeouts;\r
164 \r
165         /* Number of alerts received so far */\r
166         unsigned int num_alerts;\r
167         };\r
168 \r
169 typedef struct record_pqueue_st\r
170         {\r
171         unsigned short epoch;\r
172         pqueue q;\r
173         } record_pqueue;\r
174 \r
175 typedef struct hm_fragment_st\r
176         {\r
177         struct hm_header_st msg_header;\r
178         unsigned char *fragment;\r
179         unsigned char *reassembly;\r
180         } hm_fragment;\r
181 \r
182 typedef struct dtls1_state_st\r
183         {\r
184         unsigned int send_cookie;\r
185         unsigned char cookie[DTLS1_COOKIE_LENGTH];\r
186         unsigned char rcvd_cookie[DTLS1_COOKIE_LENGTH];\r
187         unsigned int cookie_len;\r
188 \r
189         /*\r
190          * The current data and handshake epoch.  This is initially\r
191          * undefined, and starts at zero once the initial handshake is\r
192          * completed\r
193          */\r
194         unsigned short r_epoch;\r
195         unsigned short w_epoch;\r
196 \r
197         /* records being received in the current epoch */\r
198         DTLS1_BITMAP bitmap;\r
199 \r
200         /* renegotiation starts a new set of sequence numbers */\r
201         DTLS1_BITMAP next_bitmap;\r
202 \r
203         /* handshake message numbers */\r
204         unsigned short handshake_write_seq;\r
205         unsigned short next_handshake_write_seq;\r
206 \r
207         unsigned short handshake_read_seq;\r
208 \r
209         /* save last sequence number for retransmissions */\r
210         unsigned char last_write_sequence[8];\r
211 \r
212         /* Received handshake records (processed and unprocessed) */\r
213         record_pqueue unprocessed_rcds;\r
214         record_pqueue processed_rcds;\r
215 \r
216         /* Buffered handshake messages */\r
217         pqueue buffered_messages;\r
218 \r
219         /* Buffered (sent) handshake records */\r
220         pqueue sent_messages;\r
221 \r
222         /* Buffered application records.\r
223          * Only for records between CCS and Finished\r
224          * to prevent either protocol violation or\r
225          * unnecessary message loss.\r
226          */\r
227         record_pqueue buffered_app_data;\r
228 \r
229         /* Is set when listening for new connections with dtls1_listen() */\r
230         unsigned int listen;\r
231 \r
232         unsigned int mtu; /* max DTLS packet size */\r
233 \r
234         struct hm_header_st w_msg_hdr;\r
235         struct hm_header_st r_msg_hdr;\r
236 \r
237         struct dtls1_timeout_st timeout;\r
238 \r
239         /* Indicates when the last handshake msg or heartbeat sent will timeout */\r
240         struct timeval next_timeout;\r
241 \r
242         /* Timeout duration */\r
243         unsigned short timeout_duration;\r
244 \r
245         /* storage for Alert/Handshake protocol data received but not\r
246          * yet processed by ssl3_read_bytes: */\r
247         unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH];\r
248         unsigned int alert_fragment_len;\r
249         unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH];\r
250         unsigned int handshake_fragment_len;\r
251 \r
252         unsigned int retransmitting;\r
253         unsigned int change_cipher_spec_ok;\r
254 \r
255 #ifndef OPENSSL_NO_SCTP\r
256         /* used when SSL_ST_XX_FLUSH is entered */\r
257         int next_state;\r
258 \r
259         int shutdown_received;\r
260 #endif\r
261 \r
262         } DTLS1_STATE;\r
263 \r
264 typedef struct dtls1_record_data_st\r
265         {\r
266         unsigned char *packet;\r
267         unsigned int   packet_length;\r
268         SSL3_BUFFER    rbuf;\r
269         SSL3_RECORD    rrec;\r
270 #ifndef OPENSSL_NO_SCTP\r
271         struct bio_dgram_sctp_rcvinfo recordinfo;\r
272 #endif\r
273         } DTLS1_RECORD_DATA;\r
274 \r
275 #endif\r
276 \r
277 /* Timeout multipliers (timeout slice is defined in apps/timeouts.h */\r
278 #define DTLS1_TMO_READ_COUNT                      2\r
279 #define DTLS1_TMO_WRITE_COUNT                     2\r
280 \r
281 #define DTLS1_TMO_ALERT_COUNT                     12\r
282 \r
283 #ifdef  __cplusplus\r
284 }\r
285 #endif\r
286 #endif\r
287 \r