1 /* ssl/ssl3.h */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *   notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *   notice, this list of conditions and the following disclaimer in the
30  *   documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *   must display the following acknowledgement:
33  *   "This product includes cryptographic software written by
34  *    Eric Young (eay@cryptsoft.com)"
35  *   The word 'cryptographic' can be left out if the rouines from the library
36  *   being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *   the apps directory (application code) you must include an acknowledgement:
39  *   "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 /* ====================================================================
59  * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
60  *
61  * Redistribution and use in source and binary forms, with or without
62  * modification, are permitted provided that the following conditions
63  * are met:
64  *
65  * 1. Redistributions of source code must retain the above copyright
66  *   notice, this list of conditions and the following disclaimer.
67  *
68  * 2. Redistributions in binary form must reproduce the above copyright
69  *   notice, this list of conditions and the following disclaimer in
70  *   the documentation and/or other materials provided with the
71  *   distribution.
72  *
73  * 3. All advertising materials mentioning features or use of this
74  *   software must display the following acknowledgment:
75  *   "This product includes software developed by the OpenSSL Project
76  *   for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77  *
78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79  *   endorse or promote products derived from this software without
80  *   prior written permission. For written permission, please contact
81  *   openssl-core@openssl.org.
82  *
83  * 5. Products derived from this software may not be called "OpenSSL"
84  *   nor may "OpenSSL" appear in their names without prior written
85  *   permission of the OpenSSL Project.
86  *
87  * 6. Redistributions of any form whatsoever must retain the following
88  *   acknowledgment:
89  *   "This product includes software developed by the OpenSSL Project
90  *   for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91  *
92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103  * OF THE POSSIBILITY OF SUCH DAMAGE.
104  * ====================================================================
105  *
106  * This product includes cryptographic software written by Eric Young
107  * (eay@cryptsoft.com).  This product includes software written by Tim
108  * Hudson (tjh@cryptsoft.com).
109  *
110  */
111 /* ====================================================================
112  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
113  * ECC cipher suite support in OpenSSL originally developed by
114  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
115  */
116 
117 module deimos.openssl.ssl3;
118 
119 import deimos.openssl._d_util;
120 
121 version(OPENSSL_NO_COMP) {} else {
122 public import deimos.openssl.comp;
123 }
124 public import deimos.openssl.buffer;
125 public import deimos.openssl.evp;
126 public import deimos.openssl.ssl;
127 
128 extern (C):
129 nothrow:
130 
131 /* Signalling cipher suite value: from draft-ietf-tls-renegotiation-03.txt */
132 enum SSL3_CK_SCSV = 0x030000FF;
133 
134 enum SSL3_CK_RSA_NULL_MD5 = 0x03000001;
135 enum SSL3_CK_RSA_NULL_SHA = 0x03000002;
136 enum SSL3_CK_RSA_RC4_40_MD5 = 0x03000003;
137 enum SSL3_CK_RSA_RC4_128_MD5 = 0x03000004;
138 enum SSL3_CK_RSA_RC4_128_SHA = 0x03000005;
139 enum SSL3_CK_RSA_RC2_40_MD5 = 0x03000006;
140 enum SSL3_CK_RSA_IDEA_128_SHA = 0x03000007;
141 enum SSL3_CK_RSA_DES_40_CBC_SHA = 0x03000008;
142 enum SSL3_CK_RSA_DES_64_CBC_SHA = 0x03000009;
143 enum SSL3_CK_RSA_DES_192_CBC3_SHA = 0x0300000A;
144 
145 enum SSL3_CK_DH_DSS_DES_40_CBC_SHA = 0x0300000B;
146 enum SSL3_CK_DH_DSS_DES_64_CBC_SHA = 0x0300000C;
147 enum SSL3_CK_DH_DSS_DES_192_CBC3_SHA = 0x0300000D;
148 enum SSL3_CK_DH_RSA_DES_40_CBC_SHA = 0x0300000E;
149 enum SSL3_CK_DH_RSA_DES_64_CBC_SHA = 0x0300000F;
150 enum SSL3_CK_DH_RSA_DES_192_CBC3_SHA = 0x03000010;
151 
152 enum SSL3_CK_EDH_DSS_DES_40_CBC_SHA = 0x03000011;
153 enum SSL3_CK_EDH_DSS_DES_64_CBC_SHA = 0x03000012;
154 enum SSL3_CK_EDH_DSS_DES_192_CBC3_SHA = 0x03000013;
155 enum SSL3_CK_EDH_RSA_DES_40_CBC_SHA = 0x03000014;
156 enum SSL3_CK_EDH_RSA_DES_64_CBC_SHA = 0x03000015;
157 enum SSL3_CK_EDH_RSA_DES_192_CBC3_SHA = 0x03000016;
158 
159 enum SSL3_CK_ADH_RC4_40_MD5 = 0x03000017;
160 enum SSL3_CK_ADH_RC4_128_MD5 = 0x03000018;
161 enum SSL3_CK_ADH_DES_40_CBC_SHA = 0x03000019;
162 enum SSL3_CK_ADH_DES_64_CBC_SHA = 0x0300001A;
163 enum SSL3_CK_ADH_DES_192_CBC_SHA = 0x0300001B;
164 
165 version (none) {
166 	enum SSL3_CK_FZA_DMS_NULL_SHA = 0x0300001C;
167 	enum SSL3_CK_FZA_DMS_FZA_SHA = 0x0300001D;
168 	version (none) { /* Because it clashes with KRB5, is never used any more, and is safe
169 		 to remove according to David Hopwood <david.hopwood@zetnet.co.uk>
170 		 of the ietf-tls list */
171 	enum SSL3_CK_FZA_DMS_RC4_SHA = 0x0300001E;
172 	}
173 }
174 
175 /*   VRS Additional Kerberos5 entries
176  */
177 enum SSL3_CK_KRB5_DES_64_CBC_SHA = 0x0300001E;
178 enum SSL3_CK_KRB5_DES_192_CBC3_SHA = 0x0300001F;
179 enum SSL3_CK_KRB5_RC4_128_SHA = 0x03000020;
180 enum SSL3_CK_KRB5_IDEA_128_CBC_SHA = 0x03000021;
181 enum SSL3_CK_KRB5_DES_64_CBC_MD5 = 0x03000022;
182 enum SSL3_CK_KRB5_DES_192_CBC3_MD5 = 0x03000023;
183 enum SSL3_CK_KRB5_RC4_128_MD5 = 0x03000024;
184 enum SSL3_CK_KRB5_IDEA_128_CBC_MD5 = 0x03000025;
185 
186 enum SSL3_CK_KRB5_DES_40_CBC_SHA = 0x03000026;
187 enum SSL3_CK_KRB5_RC2_40_CBC_SHA = 0x03000027;
188 enum SSL3_CK_KRB5_RC4_40_SHA = 0x03000028;
189 enum SSL3_CK_KRB5_DES_40_CBC_MD5 = 0x03000029;
190 enum SSL3_CK_KRB5_RC2_40_CBC_MD5 = 0x0300002A;
191 enum SSL3_CK_KRB5_RC4_40_MD5 = 0x0300002B;
192 
193 enum SSL3_TXT_RSA_NULL_MD5 = "NULL-MD5";
194 enum SSL3_TXT_RSA_NULL_SHA = "NULL-SHA";
195 enum SSL3_TXT_RSA_RC4_40_MD5 = "EXP-RC4-MD5";
196 enum SSL3_TXT_RSA_RC4_128_MD5 = "RC4-MD5";
197 enum SSL3_TXT_RSA_RC4_128_SHA = "RC4-SHA";
198 enum SSL3_TXT_RSA_RC2_40_MD5 = "EXP-RC2-CBC-MD5";
199 enum SSL3_TXT_RSA_IDEA_128_SHA = "IDEA-CBC-SHA";
200 enum SSL3_TXT_RSA_DES_40_CBC_SHA = "EXP-DES-CBC-SHA";
201 enum SSL3_TXT_RSA_DES_64_CBC_SHA = "DES-CBC-SHA";
202 enum SSL3_TXT_RSA_DES_192_CBC3_SHA = "DES-CBC3-SHA";
203 
204 enum SSL3_TXT_DH_DSS_DES_40_CBC_SHA = "EXP-DH-DSS-DES-CBC-SHA";
205 enum SSL3_TXT_DH_DSS_DES_64_CBC_SHA = "DH-DSS-DES-CBC-SHA";
206 enum SSL3_TXT_DH_DSS_DES_192_CBC3_SHA = "DH-DSS-DES-CBC3-SHA";
207 enum SSL3_TXT_DH_RSA_DES_40_CBC_SHA = "EXP-DH-RSA-DES-CBC-SHA";
208 enum SSL3_TXT_DH_RSA_DES_64_CBC_SHA = "DH-RSA-DES-CBC-SHA";
209 enum SSL3_TXT_DH_RSA_DES_192_CBC3_SHA = "DH-RSA-DES-CBC3-SHA";
210 
211 enum SSL3_TXT_EDH_DSS_DES_40_CBC_SHA = "EXP-EDH-DSS-DES-CBC-SHA";
212 enum SSL3_TXT_EDH_DSS_DES_64_CBC_SHA = "EDH-DSS-DES-CBC-SHA";
213 enum SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA = "EDH-DSS-DES-CBC3-SHA";
214 enum SSL3_TXT_EDH_RSA_DES_40_CBC_SHA = "EXP-EDH-RSA-DES-CBC-SHA";
215 enum SSL3_TXT_EDH_RSA_DES_64_CBC_SHA = "EDH-RSA-DES-CBC-SHA";
216 enum SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA = "EDH-RSA-DES-CBC3-SHA";
217 
218 enum SSL3_TXT_ADH_RC4_40_MD5 = "EXP-ADH-RC4-MD5";
219 enum SSL3_TXT_ADH_RC4_128_MD5 = "ADH-RC4-MD5";
220 enum SSL3_TXT_ADH_DES_40_CBC_SHA = "EXP-ADH-DES-CBC-SHA";
221 enum SSL3_TXT_ADH_DES_64_CBC_SHA = "ADH-DES-CBC-SHA";
222 enum SSL3_TXT_ADH_DES_192_CBC_SHA = "ADH-DES-CBC3-SHA";
223 
224 version (none) {
225 	enum SSL3_TXT_FZA_DMS_NULL_SHA = "FZA-NULL-SHA";
226 	enum SSL3_TXT_FZA_DMS_FZA_SHA = "FZA-FZA-CBC-SHA";
227 	enum SSL3_TXT_FZA_DMS_RC4_SHA = "FZA-RC4-SHA";
228 }
229 
230 enum SSL3_TXT_KRB5_DES_64_CBC_SHA = "KRB5-DES-CBC-SHA";
231 enum SSL3_TXT_KRB5_DES_192_CBC3_SHA = "KRB5-DES-CBC3-SHA";
232 enum SSL3_TXT_KRB5_RC4_128_SHA = "KRB5-RC4-SHA";
233 enum SSL3_TXT_KRB5_IDEA_128_CBC_SHA = "KRB5-IDEA-CBC-SHA";
234 enum SSL3_TXT_KRB5_DES_64_CBC_MD5 = "KRB5-DES-CBC-MD5";
235 enum SSL3_TXT_KRB5_DES_192_CBC3_MD5 = "KRB5-DES-CBC3-MD5";
236 enum SSL3_TXT_KRB5_RC4_128_MD5 = "KRB5-RC4-MD5";
237 enum SSL3_TXT_KRB5_IDEA_128_CBC_MD5 = "KRB5-IDEA-CBC-MD5";
238 
239 enum SSL3_TXT_KRB5_DES_40_CBC_SHA = "EXP-KRB5-DES-CBC-SHA";
240 enum SSL3_TXT_KRB5_RC2_40_CBC_SHA = "EXP-KRB5-RC2-CBC-SHA";
241 enum SSL3_TXT_KRB5_RC4_40_SHA = "EXP-KRB5-RC4-SHA";
242 enum SSL3_TXT_KRB5_DES_40_CBC_MD5 = "EXP-KRB5-DES-CBC-MD5";
243 enum SSL3_TXT_KRB5_RC2_40_CBC_MD5 = "EXP-KRB5-RC2-CBC-MD5";
244 enum SSL3_TXT_KRB5_RC4_40_MD5 = "EXP-KRB5-RC4-MD5";
245 
246 enum SSL3_SSL_SESSION_ID_LENGTH = 32;
247 enum SSL3_MAX_SSL_SESSION_ID_LENGTH = 32;
248 
249 enum SSL3_MASTER_SECRET_SIZE = 48;
250 enum SSL3_RANDOM_SIZE = 32;
251 enum SSL3_SESSION_ID_SIZE = 32;
252 enum SSL3_RT_HEADER_LENGTH = 5;
253 
254 /+
255 version(SSL3_ALIGN_PAYLOAD) {} else {
256  /* Some will argue that this increases memory footprint, but it's
257   * not actually true. Point is that malloc has to return at least
258   * 64-bit aligned pointers, meaning that allocating 5 bytes wastes
259   * 3 bytes in either case. Suggested pre-gaping simply moves these
260   * wasted bytes from the end of allocated region to its front,
261   * but makes data payload aligned, which improves performance:-) */
262 # define SSL3_ALIGN_PAYLOAD			8
263 #else
264 # if (SSL3_ALIGN_PAYLOAD&(SSL3_ALIGN_PAYLOAD-1))!=0
265 #  error "insane SSL3_ALIGN_PAYLOAD"
266 #  undef SSL3_ALIGN_PAYLOAD
267 # endif
268 #endif+/
269 
270 /* This is the maximum MAC (digest) size used by the SSL library.
271  * Currently maximum of 20 is used by SHA1, but we reserve for
272  * future extension for 512-bit hashes.
273  */
274 
275 enum SSL3_RT_MAX_MD_SIZE = 64;
276 
277 /* Maximum block size used in all ciphersuites. Currently 16 for AES.
278  */
279 
280 enum SSL_RT_MAX_CIPHER_BLOCK_SIZE = 16;
281 
282 enum SSL3_RT_MAX_EXTRA = (16384);
283 
284 /* Maximum plaintext length: defined by SSL/TLS standards */
285 enum SSL3_RT_MAX_PLAIN_LENGTH = 16384;
286 /* Maximum compression overhead: defined by SSL/TLS standards */
287 enum SSL3_RT_MAX_COMPRESSED_OVERHEAD = 1024;
288 
289 /* The standards give a maximum encryption overhead of 1024 bytes.
290  * In practice the value is lower than this. The overhead is the maximum
291  * number of padding bytes (256) plus the mac size.
292  */
293 enum SSL3_RT_MAX_ENCRYPTED_OVERHEAD = (256 + SSL3_RT_MAX_MD_SIZE);
294 
295 /* OpenSSL currently only uses a padding length of at most one block so
296  * the send overhead is smaller.
297  */
298 
299 enum SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD =
300 			(SSL_RT_MAX_CIPHER_BLOCK_SIZE + SSL3_RT_MAX_MD_SIZE);
301 
302 /* If compression isn't used don't include the compression overhead */
303 
304 version (OPENSSL_NO_COMP) {
305 	enum SSL3_RT_MAX_COMPRESSED_LENGTH = SSL3_RT_MAX_PLAIN_LENGTH;
306 } else {
307 	enum SSL3_RT_MAX_COMPRESSED_LENGTH =
308 		(SSL3_RT_MAX_PLAIN_LENGTH+SSL3_RT_MAX_COMPRESSED_OVERHEAD);
309 }
310 enum SSL3_RT_MAX_ENCRYPTED_LENGTH =
311 		(SSL3_RT_MAX_ENCRYPTED_OVERHEAD+SSL3_RT_MAX_COMPRESSED_LENGTH);
312 enum SSL3_RT_MAX_PACKET_SIZE =
313 		(SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH);
314 
315 enum SSL3_MD_CLIENT_FINISHED_CONST = "\x43\x4C\x4E\x54";
316 enum SSL3_MD_SERVER_FINISHED_CONST = "\x53\x52\x56\x52";
317 
318 enum SSL3_VERSION = 0x0300;
319 enum SSL3_VERSION_MAJOR = 0x03;
320 enum SSL3_VERSION_MINOR = 0x00;
321 
322 enum SSL3_RT_CHANGE_CIPHER_SPEC = 20;
323 enum SSL3_RT_ALERT = 21;
324 enum SSL3_RT_HANDSHAKE = 22;
325 enum SSL3_RT_APPLICATION_DATA = 23;
326 enum TLS1_RT_HEARTBEAT = 24;
327 
328 enum SSL3_AL_WARNING = 1;
329 enum SSL3_AL_FATAL = 2;
330 
331 enum SSL3_AD_CLOSE_NOTIFY = 0;
332 enum SSL3_AD_UNEXPECTED_MESSAGE = 10;	/* fatal */
333 enum SSL3_AD_BAD_RECORD_MAC = 20;	/* fatal */
334 enum SSL3_AD_DECOMPRESSION_FAILURE = 30;	/* fatal */
335 enum SSL3_AD_HANDSHAKE_FAILURE = 40;	/* fatal */
336 enum SSL3_AD_NO_CERTIFICATE = 41;
337 enum SSL3_AD_BAD_CERTIFICATE = 42;
338 enum SSL3_AD_UNSUPPORTED_CERTIFICATE = 43;
339 enum SSL3_AD_CERTIFICATE_REVOKED = 44;
340 enum SSL3_AD_CERTIFICATE_EXPIRED = 45;
341 enum SSL3_AD_CERTIFICATE_UNKNOWN = 46;
342 enum SSL3_AD_ILLEGAL_PARAMETER = 47;	/* fatal */
343 
344 enum TLS1_HB_REQUEST = 1;
345 enum TLS1_HB_RESPONSE = 2;
346 	
347 version(OPENSSL_NO_SSL_INTERN) {} else {
348 
349 struct ssl3_record_st {
350 /*r */	int type;               /* type of record */
351 /*rw*/	uint length;    /* How many bytes available */
352 /*r */	uint off;       /* read/write offset into 'buf' */
353 /*rw*/	ubyte* data;    /* pointer to the record data */
354 /*rw*/	ubyte* input;   /* where the decode bytes are */
355 /*r */	ubyte* comp;    /* only used with decompression - malloc()ed */
356 /*r */  c_ulong epoch;    /* epoch number, needed by DTLS1 */
357 /*r */  ubyte[8] seq_num; /* sequence number, needed by DTLS1 */
358 	}
359 alias ssl3_record_st SSL3_RECORD;
360 
361 struct ssl3_buffer_st {
362 	ubyte* buf;     /* at least SSL3_RT_MAX_PACKET_SIZE bytes,
363 	                         * see ssl3_setup_buffers() */
364 	size_t len;             /* buffer size */
365 	int offset;             /* where to 'copy from' */
366 	int left;               /* how many bytes left */
367 	}
368 alias ssl3_buffer_st SSL3_BUFFER;
369 
370 }
371 
372 enum SSL3_CT_RSA_SIGN = 1;
373 enum SSL3_CT_DSS_SIGN = 2;
374 enum SSL3_CT_RSA_FIXED_DH = 3;
375 enum SSL3_CT_DSS_FIXED_DH = 4;
376 enum SSL3_CT_RSA_EPHEMERAL_DH = 5;
377 enum SSL3_CT_DSS_EPHEMERAL_DH = 6;
378 enum SSL3_CT_FORTEZZA_DMS = 20;
379 /* SSL3_CT_NUMBER is used to size arrays and it must be large
380  * enough to contain all of the cert types defined either for
381  * SSLv3 and TLSv1.
382  */
383 enum SSL3_CT_NUMBER = 9;
384 
385 
386 enum SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS = 0x0001;
387 enum SSL3_FLAGS_DELAY_CLIENT_FINISHED = 0x0002;
388 enum SSL3_FLAGS_POP_BUFFER = 0x0004;
389 enum TLS1_FLAGS_TLS_PADDING_BUG = 0x0008;
390 enum TLS1_FLAGS_SKIP_CERT_VERIFY = 0x0010;
391 enum TLS1_FLAGS_KEEP_HANDSHAKE = 0x0020;
392  
393 /* SSL3_FLAGS_SGC_RESTART_DONE is set when we
394  * restart a handshake because of MS SGC and so prevents us
395  * from restarting the handshake in a loop. It's reset on a
396  * renegotiation, so effectively limits the client to one restart
397  * per negotiation. This limits the possibility of a DDoS
398  * attack where the client handshakes in a loop using SGC to
399  * restart. Servers which permit renegotiation can still be
400  * effected, but we can't prevent that.
401  */
402 enum SSL3_FLAGS_SGC_RESTART_DONE = 0x0040;
403 
404 version(OPENSSL_NO_SSL_INTERN) {} else {
405 
406 struct ssl3_state_st
407 	{
408 	c_long flags;
409 	int delay_buf_pop_ret;
410 
411 	ubyte[8] read_sequence;
412 	int read_mac_secret_size;
413 	ubyte[EVP_MAX_MD_SIZE] read_mac_secret;
414 	ubyte[8] write_sequence;
415 	int write_mac_secret_size;
416 	ubyte[EVP_MAX_MD_SIZE] write_mac_secret;
417 
418 	ubyte[SSL3_RANDOM_SIZE] server_random;
419 	ubyte[SSL3_RANDOM_SIZE] client_random;
420 
421 	/* flags for countermeasure against known-IV weakness */
422 	int need_empty_fragments;
423 	int empty_fragment_done;
424 
425 	/* The value of 'extra' when the buffers were initialized */
426 	int init_extra;
427 
428 	SSL3_BUFFER rbuf;	/* read IO goes into here */
429 	SSL3_BUFFER wbuf;	/* write IO goes into here */
430 
431 	SSL3_RECORD rrec;	/* each decoded record goes in here */
432 	SSL3_RECORD wrec;	/* goes out from here */
433 
434 	/* storage for Alert/Handshake protocol data received but not
435 	 * yet processed by ssl3_read_bytes: */
436 	ubyte[2] alert_fragment;
437 	uint alert_fragment_len;
438 	ubyte[4] handshake_fragment;
439 	uint handshake_fragment_len;
440 
441 	/* partial write - check the numbers match */
442 	uint wnum;	/* number of bytes sent so far */
443 	int wpend_tot;		/* number bytes written */
444 	int wpend_type;
445 	int wpend_ret;		/* number of bytes submitted */
446 	const(ubyte)* wpend_buf;
447 
448 	/* used during startup, digest all incoming/outgoing packets */
449 	BIO* handshake_buffer;
450 	/* When set of handshake digests is determined, buffer is hashed
451 	 * and freed and MD_CTX-es for all required digests are stored in
452 	 * this array */
453 	EVP_MD_CTX** handshake_dgst;
454 	/* this is set whenerver we see a change_cipher_spec message
455 	 * come in when we are not looking for one */
456 	int change_cipher_spec;
457 
458 	int warn_alert;
459 	int fatal_alert;
460 	/* we allow one fatal and one warning alert to be outstanding,
461 	 * send close alert via the warning alert */
462 	int alert_dispatch;
463 	ubyte[2] send_alert;
464 
465 	/* This flag is set when we should renegotiate ASAP, basically when
466 	 * there is no more data in the read or write buffers */
467 	int renegotiate;
468 	int total_renegotiations;
469 	int num_renegotiations;
470 
471 	int in_read_app_data;
472 
473 	/* Opaque PRF input as used for the current handshake.
474 	 * These fields are used only if TLSEXT_TYPE_opaque_prf_input is defined
475 	 * (otherwise, they are merely present to improve binary compatibility) */
476 	void* client_opaque_prf_input;
477 	size_t client_opaque_prf_input_len;
478 	void* server_opaque_prf_input;
479 	size_t server_opaque_prf_input_len;
480 
481 	struct tmp_ {
482 		/* actually only needs to be 16+20 */
483 		ubyte[EVP_MAX_MD_SIZE*2] cert_verify_md;
484 
485 		/* actually only need to be 16+20 for SSLv3 and 12 for TLS */
486 		ubyte[EVP_MAX_MD_SIZE*2] finish_md;
487 		int finish_md_len;
488 		ubyte[EVP_MAX_MD_SIZE*2] peer_finish_md;
489 		int peer_finish_md_len;
490 
491 		c_ulong message_size;
492 		int message_type;
493 
494 		/* used to hold the new cipher we are going to use */
495 		const(SSL_CIPHER)* new_cipher;
496 version(OPENSSL_NO_DH) {} else {
497 		DH* dh;
498 }
499 
500 version(OPENSSL_NO_ECDH) {} else {
501 		EC_KEY* ecdh; /* holds short lived ECDH key */
502 }
503 
504 		/* used when SSL_ST_FLUSH_DATA is entered */
505 		int next_state;
506 
507 		int reuse_message;
508 
509 		/* used for certificate requests */
510 		int cert_req;
511 		int ctype_num;
512 		char[SSL3_CT_NUMBER] ctype;
513 		STACK_OF!(X509_NAME) *ca_names;
514 
515 		int use_rsa_tmp;
516 
517 		int key_block_length;
518 		ubyte* key_block;
519 
520 		const(EVP_CIPHER)* new_sym_enc;
521 		const(EVP_MD)* new_hash;
522 		int new_mac_pkey_type;
523 		int new_mac_secret_size;
524 version(OPENSSL_NO_COMP) {
525 		char* new_compression;
526 } else {
527 		const(SSL_COMP)* new_compression;
528 }
529 		int cert_request;
530 		}
531 	tmp_ tmp;
532 
533         /* Connection binding to prevent renegotiation attacks */
534         ubyte[EVP_MAX_MD_SIZE] previous_client_finished;
535         ubyte previous_client_finished_len;
536         ubyte[EVP_MAX_MD_SIZE] previous_server_finished;
537         ubyte previous_server_finished_len;
538         int send_connection_binding; /* TODOEKR */
539 
540 version(OPENSSL_NO_NEXTPROTONEG) {} else {
541 	/* Set if we saw the Next Protocol Negotiation extension from our peer. */
542 	int next_proto_neg_seen;
543 }
544 
545 version(OPENSSL_NO_TLSEXT) {} else {
546 version(OPENSSL_NO_EC) {} else {
547 	/* This is set to true if we believe that this is a version of Safari
548 	 * running on OS X 10.6 or newer. We wish to know this because Safari
549 	 * on 10.8 .. 10.8.3 has broken ECDHE-ECDSA support. */
550 	char is_probably_safari;
551 } /* !OPENSSL_NO_EC */
552 } /* !OPENSSL_NO_TLSEXT */
553 	}
554 alias ssl3_state_st SSL3_STATE;
555 
556 }
557 
558 /* SSLv3 */
559 /*client */
560 /* extra state */
561 enum SSL3_ST_CW_FLUSH = (0x100|SSL_ST_CONNECT);
562 version(OPENSSL_NO_SCTP) {} else {
563 enum DTLS1_SCTP_ST_CW_WRITE_SOCK = (0x310|SSL_ST_CONNECT);
564 enum DTLS1_SCTP_ST_CR_READ_SOCK = (0x320|SSL_ST_CONNECT);
565 }	
566 /* write to server */
567 enum SSL3_ST_CW_CLNT_HELLO_A = (0x110|SSL_ST_CONNECT);
568 enum SSL3_ST_CW_CLNT_HELLO_B = (0x111|SSL_ST_CONNECT);
569 /* read from server */
570 enum SSL3_ST_CR_SRVR_HELLO_A = (0x120|SSL_ST_CONNECT);
571 enum SSL3_ST_CR_SRVR_HELLO_B = (0x121|SSL_ST_CONNECT);
572 enum DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A = (0x126|SSL_ST_CONNECT);
573 enum DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B = (0x127|SSL_ST_CONNECT);
574 enum SSL3_ST_CR_CERT_A = (0x130|SSL_ST_CONNECT);
575 enum SSL3_ST_CR_CERT_B = (0x131|SSL_ST_CONNECT);
576 enum SSL3_ST_CR_KEY_EXCH_A = (0x140|SSL_ST_CONNECT);
577 enum SSL3_ST_CR_KEY_EXCH_B = (0x141|SSL_ST_CONNECT);
578 enum SSL3_ST_CR_CERT_REQ_A = (0x150|SSL_ST_CONNECT);
579 enum SSL3_ST_CR_CERT_REQ_B = (0x151|SSL_ST_CONNECT);
580 enum SSL3_ST_CR_SRVR_DONE_A = (0x160|SSL_ST_CONNECT);
581 enum SSL3_ST_CR_SRVR_DONE_B = (0x161|SSL_ST_CONNECT);
582 /* write to server */
583 enum SSL3_ST_CW_CERT_A = (0x170|SSL_ST_CONNECT);
584 enum SSL3_ST_CW_CERT_B = (0x171|SSL_ST_CONNECT);
585 enum SSL3_ST_CW_CERT_C = (0x172|SSL_ST_CONNECT);
586 enum SSL3_ST_CW_CERT_D = (0x173|SSL_ST_CONNECT);
587 enum SSL3_ST_CW_KEY_EXCH_A = (0x180|SSL_ST_CONNECT);
588 enum SSL3_ST_CW_KEY_EXCH_B = (0x181|SSL_ST_CONNECT);
589 enum SSL3_ST_CW_CERT_VRFY_A = (0x190|SSL_ST_CONNECT);
590 enum SSL3_ST_CW_CERT_VRFY_B = (0x191|SSL_ST_CONNECT);
591 enum SSL3_ST_CW_CHANGE_A = (0x1A0|SSL_ST_CONNECT);
592 enum SSL3_ST_CW_CHANGE_B = (0x1A1|SSL_ST_CONNECT);
593 version(OPENSSL_NO_NEXTPROTONEG) {} else {
594 enum SSL3_ST_CW_NEXT_PROTO_A = (0x200|SSL_ST_CONNECT);
595 enum SSL3_ST_CW_NEXT_PROTO_B = (0x201|SSL_ST_CONNECT);
596 }
597 enum SSL3_ST_CW_FINISHED_A = (0x1B0|SSL_ST_CONNECT);
598 enum SSL3_ST_CW_FINISHED_B = (0x1B1|SSL_ST_CONNECT);
599 /* read from server */
600 enum SSL3_ST_CR_CHANGE_A = (0x1C0|SSL_ST_CONNECT);
601 enum SSL3_ST_CR_CHANGE_B = (0x1C1|SSL_ST_CONNECT);
602 enum SSL3_ST_CR_FINISHED_A = (0x1D0|SSL_ST_CONNECT);
603 enum SSL3_ST_CR_FINISHED_B = (0x1D1|SSL_ST_CONNECT);
604 enum SSL3_ST_CR_SESSION_TICKET_A = (0x1E0|SSL_ST_CONNECT);
605 enum SSL3_ST_CR_SESSION_TICKET_B = (0x1E1|SSL_ST_CONNECT);
606 enum SSL3_ST_CR_CERT_STATUS_A = (0x1F0|SSL_ST_CONNECT);
607 enum SSL3_ST_CR_CERT_STATUS_B = (0x1F1|SSL_ST_CONNECT);
608 
609 /* server */
610 /* extra state */
611 enum SSL3_ST_SW_FLUSH = (0x100|SSL_ST_ACCEPT);
612 version(OPENSSL_NO_SCTP) {} else {
613 enum DTLS1_SCTP_ST_SW_WRITE_SOCK = (0x310|SSL_ST_ACCEPT);
614 enum DTLS1_SCTP_ST_SR_READ_SOCK = (0x320|SSL_ST_ACCEPT);
615 }	
616 /* read from client */
617 /* Do not change the number values, they do matter */
618 enum SSL3_ST_SR_CLNT_HELLO_A = (0x110|SSL_ST_ACCEPT);
619 enum SSL3_ST_SR_CLNT_HELLO_B = (0x111|SSL_ST_ACCEPT);
620 enum SSL3_ST_SR_CLNT_HELLO_C = (0x112|SSL_ST_ACCEPT);
621 /* write to client */
622 enum DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A = (0x113|SSL_ST_ACCEPT);
623 enum DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B = (0x114|SSL_ST_ACCEPT);
624 enum SSL3_ST_SW_HELLO_REQ_A = (0x120|SSL_ST_ACCEPT);
625 enum SSL3_ST_SW_HELLO_REQ_B = (0x121|SSL_ST_ACCEPT);
626 enum SSL3_ST_SW_HELLO_REQ_C = (0x122|SSL_ST_ACCEPT);
627 enum SSL3_ST_SW_SRVR_HELLO_A = (0x130|SSL_ST_ACCEPT);
628 enum SSL3_ST_SW_SRVR_HELLO_B = (0x131|SSL_ST_ACCEPT);
629 enum SSL3_ST_SW_CERT_A = (0x140|SSL_ST_ACCEPT);
630 enum SSL3_ST_SW_CERT_B = (0x141|SSL_ST_ACCEPT);
631 enum SSL3_ST_SW_KEY_EXCH_A = (0x150|SSL_ST_ACCEPT);
632 enum SSL3_ST_SW_KEY_EXCH_B = (0x151|SSL_ST_ACCEPT);
633 enum SSL3_ST_SW_CERT_REQ_A = (0x160|SSL_ST_ACCEPT);
634 enum SSL3_ST_SW_CERT_REQ_B = (0x161|SSL_ST_ACCEPT);
635 enum SSL3_ST_SW_SRVR_DONE_A = (0x170|SSL_ST_ACCEPT);
636 enum SSL3_ST_SW_SRVR_DONE_B = (0x171|SSL_ST_ACCEPT);
637 /* read from client */
638 enum SSL3_ST_SR_CERT_A = (0x180|SSL_ST_ACCEPT);
639 enum SSL3_ST_SR_CERT_B = (0x181|SSL_ST_ACCEPT);
640 enum SSL3_ST_SR_KEY_EXCH_A = (0x190|SSL_ST_ACCEPT);
641 enum SSL3_ST_SR_KEY_EXCH_B = (0x191|SSL_ST_ACCEPT);
642 enum SSL3_ST_SR_CERT_VRFY_A = (0x1A0|SSL_ST_ACCEPT);
643 enum SSL3_ST_SR_CERT_VRFY_B = (0x1A1|SSL_ST_ACCEPT);
644 enum SSL3_ST_SR_CHANGE_A = (0x1B0|SSL_ST_ACCEPT);
645 enum SSL3_ST_SR_CHANGE_B = (0x1B1|SSL_ST_ACCEPT);
646 version(OPENSSL_NO_NEXTPROTONEG) {} else {
647 enum SSL3_ST_SR_NEXT_PROTO_A = (0x210|SSL_ST_ACCEPT);
648 enum SSL3_ST_SR_NEXT_PROTO_B = (0x211|SSL_ST_ACCEPT);
649 }
650 enum SSL3_ST_SR_FINISHED_A = (0x1C0|SSL_ST_ACCEPT);
651 enum SSL3_ST_SR_FINISHED_B = (0x1C1|SSL_ST_ACCEPT);
652 /* write to client */
653 enum SSL3_ST_SW_CHANGE_A = (0x1D0|SSL_ST_ACCEPT);
654 enum SSL3_ST_SW_CHANGE_B = (0x1D1|SSL_ST_ACCEPT);
655 enum SSL3_ST_SW_FINISHED_A = (0x1E0|SSL_ST_ACCEPT);
656 enum SSL3_ST_SW_FINISHED_B = (0x1E1|SSL_ST_ACCEPT);
657 enum SSL3_ST_SW_SESSION_TICKET_A = (0x1F0|SSL_ST_ACCEPT);
658 enum SSL3_ST_SW_SESSION_TICKET_B = (0x1F1|SSL_ST_ACCEPT);
659 enum SSL3_ST_SW_CERT_STATUS_A = (0x200|SSL_ST_ACCEPT);
660 enum SSL3_ST_SW_CERT_STATUS_B = (0x201|SSL_ST_ACCEPT);
661 
662 enum SSL3_MT_HELLO_REQUEST = 0;
663 enum SSL3_MT_CLIENT_HELLO = 1;
664 enum SSL3_MT_SERVER_HELLO = 2;
665 enum SSL3_MT_NEWSESSION_TICKET = 4;
666 enum SSL3_MT_CERTIFICATE = 11;
667 enum SSL3_MT_SERVER_KEY_EXCHANGE = 12;
668 enum SSL3_MT_CERTIFICATE_REQUEST = 13;
669 enum SSL3_MT_SERVER_DONE = 14;
670 enum SSL3_MT_CERTIFICATE_VERIFY = 15;
671 enum SSL3_MT_CLIENT_KEY_EXCHANGE = 16;
672 enum SSL3_MT_FINISHED = 20;
673 enum SSL3_MT_CERTIFICATE_STATUS = 22;
674 version(OPENSSL_NO_NEXTPROTONEG) {} else {
675 enum SSL3_MT_NEXT_PROTO = 67;
676 }
677 enum DTLS1_MT_HELLO_VERIFY_REQUEST = 3;
678 
679 
680 enum SSL3_MT_CCS = 1;
681 
682 /* These are used when changing over to a new cipher */
683 enum SSL3_CC_READ = 0x01;
684 enum SSL3_CC_WRITE = 0x02;
685 enum SSL3_CC_CLIENT = 0x10;
686 enum SSL3_CC_SERVER = 0x20;
687 enum SSL3_CHANGE_CIPHER_CLIENT_WRITE = (SSL3_CC_CLIENT|SSL3_CC_WRITE);
688 enum SSL3_CHANGE_CIPHER_SERVER_READ = (SSL3_CC_SERVER|SSL3_CC_READ);
689 enum SSL3_CHANGE_CIPHER_CLIENT_READ = (SSL3_CC_CLIENT|SSL3_CC_READ);
690 enum SSL3_CHANGE_CIPHER_SERVER_WRITE = (SSL3_CC_SERVER|SSL3_CC_WRITE);