1/* ssl/s3_lib.c */
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-2006 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 *
114 * Portions of the attached software ("Contribution") are developed by
115 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
116 *
117 * The Contribution is licensed pursuant to the OpenSSL open source
118 * license provided above.
119 *
120 * ECC cipher suite support in OpenSSL originally written by
121 * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories.
122 *
123 */
124
125#include <stdio.h>
126#include <openssl/objects.h>
127#include "ssl_locl.h"
128#include "kssl_lcl.h"
129#include <openssl/md5.h>
130#ifndef OPENSSL_NO_DH
131#include <openssl/dh.h>
132#endif
133#include <openssl/pq_compat.h>
134
135const char ssl3_version_str[]="SSLv3" OPENSSL_VERSION_PTEXT;
136
137#define SSL3_NUM_CIPHERS	(sizeof(ssl3_ciphers)/sizeof(SSL_CIPHER))
138
139/* list of available SSLv3 ciphers (sorted by id) */
140OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={
141/* The RSA ciphers */
142/* Cipher 01 */
143	{
144	1,
145	SSL3_TXT_RSA_NULL_MD5,
146	SSL3_CK_RSA_NULL_MD5,
147	SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_MD5|SSL_SSLV3,
148	SSL_NOT_EXP|SSL_STRONG_NONE,
149	0,
150	0,
151	0,
152	SSL_ALL_CIPHERS,
153	SSL_ALL_STRENGTHS,
154	},
155/* Cipher 02 */
156	{
157	1,
158	SSL3_TXT_RSA_NULL_SHA,
159	SSL3_CK_RSA_NULL_SHA,
160	SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_SHA1|SSL_SSLV3,
161	SSL_NOT_EXP|SSL_STRONG_NONE|SSL_FIPS,
162	0,
163	0,
164	0,
165	SSL_ALL_CIPHERS,
166	SSL_ALL_STRENGTHS,
167	},
168/* Cipher 03 */
169	{
170	1,
171	SSL3_TXT_RSA_RC4_40_MD5,
172	SSL3_CK_RSA_RC4_40_MD5,
173	SSL_kRSA|SSL_aRSA|SSL_RC4  |SSL_MD5 |SSL_SSLV3,
174	SSL_EXPORT|SSL_EXP40,
175	0,
176	40,
177	128,
178	SSL_ALL_CIPHERS,
179	SSL_ALL_STRENGTHS,
180	},
181/* Cipher 04 */
182	{
183	1,
184	SSL3_TXT_RSA_RC4_128_MD5,
185	SSL3_CK_RSA_RC4_128_MD5,
186	SSL_kRSA|SSL_aRSA|SSL_RC4  |SSL_MD5|SSL_SSLV3,
187	SSL_NOT_EXP|SSL_MEDIUM,
188	0,
189	128,
190	128,
191	SSL_ALL_CIPHERS,
192	SSL_ALL_STRENGTHS,
193	},
194/* Cipher 05 */
195	{
196	1,
197	SSL3_TXT_RSA_RC4_128_SHA,
198	SSL3_CK_RSA_RC4_128_SHA,
199	SSL_kRSA|SSL_aRSA|SSL_RC4  |SSL_SHA1|SSL_SSLV3,
200	SSL_NOT_EXP|SSL_MEDIUM,
201	0,
202	128,
203	128,
204	SSL_ALL_CIPHERS,
205	SSL_ALL_STRENGTHS,
206	},
207/* Cipher 06 */
208	{
209	1,
210	SSL3_TXT_RSA_RC2_40_MD5,
211	SSL3_CK_RSA_RC2_40_MD5,
212	SSL_kRSA|SSL_aRSA|SSL_RC2  |SSL_MD5 |SSL_SSLV3,
213	SSL_EXPORT|SSL_EXP40,
214	0,
215	40,
216	128,
217	SSL_ALL_CIPHERS,
218	SSL_ALL_STRENGTHS,
219	},
220/* Cipher 07 */
221/* Cipher 08 */
222	{
223	1,
224	SSL3_TXT_RSA_DES_40_CBC_SHA,
225	SSL3_CK_RSA_DES_40_CBC_SHA,
226	SSL_kRSA|SSL_aRSA|SSL_DES|SSL_SHA1|SSL_SSLV3,
227	SSL_EXPORT|SSL_EXP40,
228	0,
229	40,
230	56,
231	SSL_ALL_CIPHERS,
232	SSL_ALL_STRENGTHS,
233	},
234/* Cipher 09 */
235	{
236	1,
237	SSL3_TXT_RSA_DES_64_CBC_SHA,
238	SSL3_CK_RSA_DES_64_CBC_SHA,
239	SSL_kRSA|SSL_aRSA|SSL_DES  |SSL_SHA1|SSL_SSLV3,
240	SSL_NOT_EXP|SSL_LOW,
241	0,
242	56,
243	56,
244	SSL_ALL_CIPHERS,
245	SSL_ALL_STRENGTHS,
246	},
247/* Cipher 0A */
248	{
249	1,
250	SSL3_TXT_RSA_DES_192_CBC3_SHA,
251	SSL3_CK_RSA_DES_192_CBC3_SHA,
252	SSL_kRSA|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_SSLV3,
253	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
254	0,
255	168,
256	168,
257	SSL_ALL_CIPHERS,
258	SSL_ALL_STRENGTHS,
259	},
260/* The DH ciphers */
261/* Cipher 0B */
262	{
263	0,
264	SSL3_TXT_DH_DSS_DES_40_CBC_SHA,
265	SSL3_CK_DH_DSS_DES_40_CBC_SHA,
266	SSL_kDHd |SSL_aDH|SSL_DES|SSL_SHA1|SSL_SSLV3,
267	SSL_EXPORT|SSL_EXP40,
268	0,
269	40,
270	56,
271	SSL_ALL_CIPHERS,
272	SSL_ALL_STRENGTHS,
273	},
274/* Cipher 0C */
275	{
276	0,
277	SSL3_TXT_DH_DSS_DES_64_CBC_SHA,
278	SSL3_CK_DH_DSS_DES_64_CBC_SHA,
279	SSL_kDHd |SSL_aDH|SSL_DES  |SSL_SHA1|SSL_SSLV3,
280	SSL_NOT_EXP|SSL_LOW,
281	0,
282	56,
283	56,
284	SSL_ALL_CIPHERS,
285	SSL_ALL_STRENGTHS,
286	},
287/* Cipher 0D */
288	{
289	0,
290	SSL3_TXT_DH_DSS_DES_192_CBC3_SHA,
291	SSL3_CK_DH_DSS_DES_192_CBC3_SHA,
292	SSL_kDHd |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_SSLV3,
293	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
294	0,
295	168,
296	168,
297	SSL_ALL_CIPHERS,
298	SSL_ALL_STRENGTHS,
299	},
300/* Cipher 0E */
301	{
302	0,
303	SSL3_TXT_DH_RSA_DES_40_CBC_SHA,
304	SSL3_CK_DH_RSA_DES_40_CBC_SHA,
305	SSL_kDHr |SSL_aDH|SSL_DES|SSL_SHA1|SSL_SSLV3,
306	SSL_EXPORT|SSL_EXP40,
307	0,
308	40,
309	56,
310	SSL_ALL_CIPHERS,
311	SSL_ALL_STRENGTHS,
312	},
313/* Cipher 0F */
314	{
315	0,
316	SSL3_TXT_DH_RSA_DES_64_CBC_SHA,
317	SSL3_CK_DH_RSA_DES_64_CBC_SHA,
318	SSL_kDHr |SSL_aDH|SSL_DES  |SSL_SHA1|SSL_SSLV3,
319	SSL_NOT_EXP|SSL_LOW,
320	0,
321	56,
322	56,
323	SSL_ALL_CIPHERS,
324	SSL_ALL_STRENGTHS,
325	},
326/* Cipher 10 */
327	{
328	0,
329	SSL3_TXT_DH_RSA_DES_192_CBC3_SHA,
330	SSL3_CK_DH_RSA_DES_192_CBC3_SHA,
331	SSL_kDHr |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_SSLV3,
332	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
333	0,
334	168,
335	168,
336	SSL_ALL_CIPHERS,
337	SSL_ALL_STRENGTHS,
338	},
339
340/* The Ephemeral DH ciphers */
341/* Cipher 11 */
342	{
343	1,
344	SSL3_TXT_EDH_DSS_DES_40_CBC_SHA,
345	SSL3_CK_EDH_DSS_DES_40_CBC_SHA,
346	SSL_kEDH|SSL_aDSS|SSL_DES|SSL_SHA1|SSL_SSLV3,
347	SSL_EXPORT|SSL_EXP40,
348	0,
349	40,
350	56,
351	SSL_ALL_CIPHERS,
352	SSL_ALL_STRENGTHS,
353	},
354/* Cipher 12 */
355	{
356	1,
357	SSL3_TXT_EDH_DSS_DES_64_CBC_SHA,
358	SSL3_CK_EDH_DSS_DES_64_CBC_SHA,
359	SSL_kEDH|SSL_aDSS|SSL_DES  |SSL_SHA1|SSL_SSLV3,
360	SSL_NOT_EXP|SSL_LOW,
361	0,
362	56,
363	56,
364	SSL_ALL_CIPHERS,
365	SSL_ALL_STRENGTHS,
366	},
367/* Cipher 13 */
368	{
369	1,
370	SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA,
371	SSL3_CK_EDH_DSS_DES_192_CBC3_SHA,
372	SSL_kEDH|SSL_aDSS|SSL_3DES |SSL_SHA1|SSL_SSLV3,
373	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
374	0,
375	168,
376	168,
377	SSL_ALL_CIPHERS,
378	SSL_ALL_STRENGTHS,
379	},
380/* Cipher 14 */
381	{
382	1,
383	SSL3_TXT_EDH_RSA_DES_40_CBC_SHA,
384	SSL3_CK_EDH_RSA_DES_40_CBC_SHA,
385	SSL_kEDH|SSL_aRSA|SSL_DES|SSL_SHA1|SSL_SSLV3,
386	SSL_EXPORT|SSL_EXP40,
387	0,
388	40,
389	56,
390	SSL_ALL_CIPHERS,
391	SSL_ALL_STRENGTHS,
392	},
393/* Cipher 15 */
394	{
395	1,
396	SSL3_TXT_EDH_RSA_DES_64_CBC_SHA,
397	SSL3_CK_EDH_RSA_DES_64_CBC_SHA,
398	SSL_kEDH|SSL_aRSA|SSL_DES  |SSL_SHA1|SSL_SSLV3,
399	SSL_NOT_EXP|SSL_LOW,
400	0,
401	56,
402	56,
403	SSL_ALL_CIPHERS,
404	SSL_ALL_STRENGTHS,
405	},
406/* Cipher 16 */
407	{
408	1,
409	SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA,
410	SSL3_CK_EDH_RSA_DES_192_CBC3_SHA,
411	SSL_kEDH|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_SSLV3,
412	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
413	0,
414	168,
415	168,
416	SSL_ALL_CIPHERS,
417	SSL_ALL_STRENGTHS,
418	},
419/* Cipher 17 */
420	{
421	1,
422	SSL3_TXT_ADH_RC4_40_MD5,
423	SSL3_CK_ADH_RC4_40_MD5,
424	SSL_kEDH |SSL_aNULL|SSL_RC4  |SSL_MD5 |SSL_SSLV3,
425	SSL_EXPORT|SSL_EXP40,
426	0,
427	40,
428	128,
429	SSL_ALL_CIPHERS,
430	SSL_ALL_STRENGTHS,
431	},
432/* Cipher 18 */
433	{
434	1,
435	SSL3_TXT_ADH_RC4_128_MD5,
436	SSL3_CK_ADH_RC4_128_MD5,
437	SSL_kEDH |SSL_aNULL|SSL_RC4  |SSL_MD5 |SSL_SSLV3,
438	SSL_NOT_EXP|SSL_MEDIUM,
439	0,
440	128,
441	128,
442	SSL_ALL_CIPHERS,
443	SSL_ALL_STRENGTHS,
444	},
445/* Cipher 19 */
446	{
447	1,
448	SSL3_TXT_ADH_DES_40_CBC_SHA,
449	SSL3_CK_ADH_DES_40_CBC_SHA,
450	SSL_kEDH |SSL_aNULL|SSL_DES|SSL_SHA1|SSL_SSLV3,
451	SSL_EXPORT|SSL_EXP40,
452	0,
453	40,
454	128,
455	SSL_ALL_CIPHERS,
456	SSL_ALL_STRENGTHS,
457	},
458/* Cipher 1A */
459	{
460	1,
461	SSL3_TXT_ADH_DES_64_CBC_SHA,
462	SSL3_CK_ADH_DES_64_CBC_SHA,
463	SSL_kEDH |SSL_aNULL|SSL_DES  |SSL_SHA1|SSL_SSLV3,
464	SSL_NOT_EXP|SSL_LOW,
465	0,
466	56,
467	56,
468	SSL_ALL_CIPHERS,
469	SSL_ALL_STRENGTHS,
470	},
471/* Cipher 1B */
472	{
473	1,
474	SSL3_TXT_ADH_DES_192_CBC_SHA,
475	SSL3_CK_ADH_DES_192_CBC_SHA,
476	SSL_kEDH |SSL_aNULL|SSL_3DES |SSL_SHA1|SSL_SSLV3,
477	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
478	0,
479	168,
480	168,
481	SSL_ALL_CIPHERS,
482	SSL_ALL_STRENGTHS,
483	},
484
485/* Fortezza */
486/* Cipher 1C */
487	{
488	0,
489	SSL3_TXT_FZA_DMS_NULL_SHA,
490	SSL3_CK_FZA_DMS_NULL_SHA,
491	SSL_kFZA|SSL_aFZA |SSL_eNULL |SSL_SHA1|SSL_SSLV3,
492	SSL_NOT_EXP|SSL_STRONG_NONE,
493	0,
494	0,
495	0,
496	SSL_ALL_CIPHERS,
497	SSL_ALL_STRENGTHS,
498	},
499
500/* Cipher 1D */
501	{
502	0,
503	SSL3_TXT_FZA_DMS_FZA_SHA,
504	SSL3_CK_FZA_DMS_FZA_SHA,
505	SSL_kFZA|SSL_aFZA |SSL_eFZA |SSL_SHA1|SSL_SSLV3,
506	SSL_NOT_EXP|SSL_STRONG_NONE,
507	0,
508	0,
509	0,
510	SSL_ALL_CIPHERS,
511	SSL_ALL_STRENGTHS,
512	},
513
514#if 0
515/* Cipher 1E */
516	{
517	0,
518	SSL3_TXT_FZA_DMS_RC4_SHA,
519	SSL3_CK_FZA_DMS_RC4_SHA,
520	SSL_kFZA|SSL_aFZA |SSL_RC4  |SSL_SHA1|SSL_SSLV3,
521	SSL_NOT_EXP|SSL_MEDIUM,
522	0,
523	128,
524	128,
525	SSL_ALL_CIPHERS,
526	SSL_ALL_STRENGTHS,
527	},
528#endif
529
530#ifndef OPENSSL_NO_KRB5
531/* The Kerberos ciphers */
532/* Cipher 1E */
533	{
534	1,
535	SSL3_TXT_KRB5_DES_64_CBC_SHA,
536	SSL3_CK_KRB5_DES_64_CBC_SHA,
537	SSL_kKRB5|SSL_aKRB5|  SSL_DES|SSL_SHA1   |SSL_SSLV3,
538	SSL_NOT_EXP|SSL_LOW,
539	0,
540	56,
541	56,
542	SSL_ALL_CIPHERS,
543	SSL_ALL_STRENGTHS,
544	},
545
546/* Cipher 1F */
547	{
548	1,
549	SSL3_TXT_KRB5_DES_192_CBC3_SHA,
550	SSL3_CK_KRB5_DES_192_CBC3_SHA,
551	SSL_kKRB5|SSL_aKRB5|  SSL_3DES|SSL_SHA1  |SSL_SSLV3,
552	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
553	0,
554	168,
555	168,
556	SSL_ALL_CIPHERS,
557	SSL_ALL_STRENGTHS,
558	},
559
560/* Cipher 20 */
561	{
562	1,
563	SSL3_TXT_KRB5_RC4_128_SHA,
564	SSL3_CK_KRB5_RC4_128_SHA,
565	SSL_kKRB5|SSL_aKRB5|  SSL_RC4|SSL_SHA1  |SSL_SSLV3,
566	SSL_NOT_EXP|SSL_MEDIUM,
567	0,
568	128,
569	128,
570	SSL_ALL_CIPHERS,
571	SSL_ALL_STRENGTHS,
572	},
573
574/* Cipher 21 */
575	{
576	1,
577	SSL3_TXT_KRB5_IDEA_128_CBC_SHA,
578	SSL3_CK_KRB5_IDEA_128_CBC_SHA,
579	SSL_kKRB5|SSL_aKRB5|  SSL_IDEA|SSL_SHA1  |SSL_SSLV3,
580	SSL_NOT_EXP|SSL_MEDIUM,
581	0,
582	128,
583	128,
584	SSL_ALL_CIPHERS,
585	SSL_ALL_STRENGTHS,
586	},
587
588/* Cipher 22 */
589	{
590	1,
591	SSL3_TXT_KRB5_DES_64_CBC_MD5,
592	SSL3_CK_KRB5_DES_64_CBC_MD5,
593	SSL_kKRB5|SSL_aKRB5|  SSL_DES|SSL_MD5    |SSL_SSLV3,
594	SSL_NOT_EXP|SSL_LOW,
595	0,
596	56,
597	56,
598	SSL_ALL_CIPHERS,
599	SSL_ALL_STRENGTHS,
600	},
601
602/* Cipher 23 */
603	{
604	1,
605	SSL3_TXT_KRB5_DES_192_CBC3_MD5,
606	SSL3_CK_KRB5_DES_192_CBC3_MD5,
607	SSL_kKRB5|SSL_aKRB5|  SSL_3DES|SSL_MD5   |SSL_SSLV3,
608	SSL_NOT_EXP|SSL_HIGH,
609	0,
610	168,
611	168,
612	SSL_ALL_CIPHERS,
613	SSL_ALL_STRENGTHS,
614	},
615
616/* Cipher 24 */
617	{
618	1,
619	SSL3_TXT_KRB5_RC4_128_MD5,
620	SSL3_CK_KRB5_RC4_128_MD5,
621	SSL_kKRB5|SSL_aKRB5|  SSL_RC4|SSL_MD5  |SSL_SSLV3,
622	SSL_NOT_EXP|SSL_MEDIUM,
623	0,
624	128,
625	128,
626	SSL_ALL_CIPHERS,
627	SSL_ALL_STRENGTHS,
628	},
629
630/* Cipher 25 */
631	{
632	1,
633	SSL3_TXT_KRB5_IDEA_128_CBC_MD5,
634	SSL3_CK_KRB5_IDEA_128_CBC_MD5,
635	SSL_kKRB5|SSL_aKRB5|  SSL_IDEA|SSL_MD5  |SSL_SSLV3,
636	SSL_NOT_EXP|SSL_MEDIUM,
637	0,
638	128,
639	128,
640	SSL_ALL_CIPHERS,
641	SSL_ALL_STRENGTHS,
642	},
643
644/* Cipher 26 */
645	{
646	1,
647	SSL3_TXT_KRB5_DES_40_CBC_SHA,
648	SSL3_CK_KRB5_DES_40_CBC_SHA,
649	SSL_kKRB5|SSL_aKRB5|  SSL_DES|SSL_SHA1   |SSL_SSLV3,
650	SSL_EXPORT|SSL_EXP40,
651	0,
652	40,
653	56,
654	SSL_ALL_CIPHERS,
655	SSL_ALL_STRENGTHS,
656	},
657
658/* Cipher 27 */
659	{
660	1,
661	SSL3_TXT_KRB5_RC2_40_CBC_SHA,
662	SSL3_CK_KRB5_RC2_40_CBC_SHA,
663	SSL_kKRB5|SSL_aKRB5|  SSL_RC2|SSL_SHA1   |SSL_SSLV3,
664	SSL_EXPORT|SSL_EXP40,
665	0,
666	40,
667	128,
668	SSL_ALL_CIPHERS,
669	SSL_ALL_STRENGTHS,
670	},
671
672/* Cipher 28 */
673	{
674	1,
675	SSL3_TXT_KRB5_RC4_40_SHA,
676	SSL3_CK_KRB5_RC4_40_SHA,
677	SSL_kKRB5|SSL_aKRB5|  SSL_RC4|SSL_SHA1   |SSL_SSLV3,
678	SSL_EXPORT|SSL_EXP40,
679	0,
680	40,
681	128,
682	SSL_ALL_CIPHERS,
683	SSL_ALL_STRENGTHS,
684	},
685
686/* Cipher 29 */
687	{
688	1,
689	SSL3_TXT_KRB5_DES_40_CBC_MD5,
690	SSL3_CK_KRB5_DES_40_CBC_MD5,
691	SSL_kKRB5|SSL_aKRB5|  SSL_DES|SSL_MD5    |SSL_SSLV3,
692	SSL_EXPORT|SSL_EXP40,
693	0,
694	40,
695	56,
696	SSL_ALL_CIPHERS,
697	SSL_ALL_STRENGTHS,
698	},
699
700/* Cipher 2A */
701	{
702	1,
703	SSL3_TXT_KRB5_RC2_40_CBC_MD5,
704	SSL3_CK_KRB5_RC2_40_CBC_MD5,
705	SSL_kKRB5|SSL_aKRB5|  SSL_RC2|SSL_MD5    |SSL_SSLV3,
706	SSL_EXPORT|SSL_EXP40,
707	0,
708	40,
709	128,
710	SSL_ALL_CIPHERS,
711	SSL_ALL_STRENGTHS,
712	},
713
714/* Cipher 2B */
715	{
716	1,
717	SSL3_TXT_KRB5_RC4_40_MD5,
718	SSL3_CK_KRB5_RC4_40_MD5,
719	SSL_kKRB5|SSL_aKRB5|  SSL_RC4|SSL_MD5    |SSL_SSLV3,
720	SSL_EXPORT|SSL_EXP40,
721	0,
722	40,
723	128,
724	SSL_ALL_CIPHERS,
725	SSL_ALL_STRENGTHS,
726	},
727#endif	/* OPENSSL_NO_KRB5 */
728
729/* New AES ciphersuites */
730/* Cipher 2F */
731	{
732	1,
733	TLS1_TXT_RSA_WITH_AES_128_SHA,
734	TLS1_CK_RSA_WITH_AES_128_SHA,
735	SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1,
736	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
737	0,
738	128,
739	128,
740	SSL_ALL_CIPHERS,
741	SSL_ALL_STRENGTHS,
742	},
743/* Cipher 30 */
744	{
745	0,
746	TLS1_TXT_DH_DSS_WITH_AES_128_SHA,
747	TLS1_CK_DH_DSS_WITH_AES_128_SHA,
748	SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
749	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
750	0,
751	128,
752	128,
753	SSL_ALL_CIPHERS,
754	SSL_ALL_STRENGTHS,
755	},
756/* Cipher 31 */
757	{
758	0,
759	TLS1_TXT_DH_RSA_WITH_AES_128_SHA,
760	TLS1_CK_DH_RSA_WITH_AES_128_SHA,
761	SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
762	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
763	0,
764	128,
765	128,
766	SSL_ALL_CIPHERS,
767	SSL_ALL_STRENGTHS,
768	},
769/* Cipher 32 */
770	{
771	1,
772	TLS1_TXT_DHE_DSS_WITH_AES_128_SHA,
773	TLS1_CK_DHE_DSS_WITH_AES_128_SHA,
774	SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1,
775	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
776	0,
777	128,
778	128,
779	SSL_ALL_CIPHERS,
780	SSL_ALL_STRENGTHS,
781	},
782/* Cipher 33 */
783	{
784	1,
785	TLS1_TXT_DHE_RSA_WITH_AES_128_SHA,
786	TLS1_CK_DHE_RSA_WITH_AES_128_SHA,
787	SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1,
788	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
789	0,
790	128,
791	128,
792	SSL_ALL_CIPHERS,
793	SSL_ALL_STRENGTHS,
794	},
795/* Cipher 34 */
796	{
797	1,
798	TLS1_TXT_ADH_WITH_AES_128_SHA,
799	TLS1_CK_ADH_WITH_AES_128_SHA,
800	SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1,
801	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
802	0,
803	128,
804	128,
805	SSL_ALL_CIPHERS,
806	SSL_ALL_STRENGTHS,
807	},
808
809/* Cipher 35 */
810	{
811	1,
812	TLS1_TXT_RSA_WITH_AES_256_SHA,
813	TLS1_CK_RSA_WITH_AES_256_SHA,
814	SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1,
815	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
816	0,
817	256,
818	256,
819	SSL_ALL_CIPHERS,
820	SSL_ALL_STRENGTHS,
821	},
822/* Cipher 36 */
823	{
824	0,
825	TLS1_TXT_DH_DSS_WITH_AES_256_SHA,
826	TLS1_CK_DH_DSS_WITH_AES_256_SHA,
827	SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
828	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
829	0,
830	256,
831	256,
832	SSL_ALL_CIPHERS,
833	SSL_ALL_STRENGTHS,
834	},
835/* Cipher 37 */
836	{
837	0,
838	TLS1_TXT_DH_RSA_WITH_AES_256_SHA,
839	TLS1_CK_DH_RSA_WITH_AES_256_SHA,
840	SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
841	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
842	0,
843	256,
844	256,
845	SSL_ALL_CIPHERS,
846	SSL_ALL_STRENGTHS,
847	},
848/* Cipher 38 */
849	{
850	1,
851	TLS1_TXT_DHE_DSS_WITH_AES_256_SHA,
852	TLS1_CK_DHE_DSS_WITH_AES_256_SHA,
853	SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1,
854	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
855	0,
856	256,
857	256,
858	SSL_ALL_CIPHERS,
859	SSL_ALL_STRENGTHS,
860	},
861/* Cipher 39 */
862	{
863	1,
864	TLS1_TXT_DHE_RSA_WITH_AES_256_SHA,
865	TLS1_CK_DHE_RSA_WITH_AES_256_SHA,
866	SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1,
867	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
868	0,
869	256,
870	256,
871	SSL_ALL_CIPHERS,
872	SSL_ALL_STRENGTHS,
873	},
874	/* Cipher 3A */
875	{
876	1,
877	TLS1_TXT_ADH_WITH_AES_256_SHA,
878	TLS1_CK_ADH_WITH_AES_256_SHA,
879	SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1,
880	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
881	0,
882	256,
883	256,
884	SSL_ALL_CIPHERS,
885	SSL_ALL_STRENGTHS,
886	},
887
888#ifndef OPENSSL_NO_CAMELLIA
889	/* Camellia ciphersuites from RFC4132 (128-bit portion) */
890
891	/* Cipher 41 */
892	{
893	1,
894	TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA,
895	TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA,
896	SSL_kRSA|SSL_aRSA|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
897	SSL_NOT_EXP|SSL_HIGH,
898	0,
899	128,
900	128,
901	SSL_ALL_CIPHERS,
902	SSL_ALL_STRENGTHS
903	},
904	/* Cipher 42 */
905	{
906	0, /* not implemented (non-ephemeral DH) */
907	TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA,
908	TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA,
909	SSL_kDHd|SSL_aDH|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
910	SSL_NOT_EXP|SSL_HIGH,
911	0,
912	128,
913	128,
914	SSL_ALL_CIPHERS,
915	SSL_ALL_STRENGTHS
916	},
917	/* Cipher 43 */
918	{
919	0, /* not implemented (non-ephemeral DH) */
920	TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA,
921	TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA,
922	SSL_kDHr|SSL_aDH|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
923	SSL_NOT_EXP|SSL_HIGH,
924	0,
925	128,
926	128,
927	SSL_ALL_CIPHERS,
928	SSL_ALL_STRENGTHS
929	},
930	/* Cipher 44 */
931	{
932	1,
933	TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA,
934	TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA,
935	SSL_kEDH|SSL_aDSS|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
936	SSL_NOT_EXP|SSL_HIGH,
937	0,
938	128,
939	128,
940	SSL_ALL_CIPHERS,
941	SSL_ALL_STRENGTHS
942	},
943	/* Cipher 45 */
944	{
945	1,
946	TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,
947	TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,
948	SSL_kEDH|SSL_aRSA|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
949	SSL_NOT_EXP|SSL_HIGH,
950	0,
951	128,
952	128,
953	SSL_ALL_CIPHERS,
954	SSL_ALL_STRENGTHS
955	},
956	/* Cipher 46 */
957	{
958	1,
959	TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA,
960	TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA,
961	SSL_kEDH|SSL_aNULL|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
962	SSL_NOT_EXP|SSL_HIGH,
963	0,
964	128,
965	128,
966	SSL_ALL_CIPHERS,
967	SSL_ALL_STRENGTHS
968	},
969#endif /* OPENSSL_NO_CAMELLIA */
970
971#if TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES
972	/* New TLS Export CipherSuites from expired ID */
973#if 0
974	/* Cipher 60 */
975	    {
976	    1,
977	    TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5,
978	    TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5,
979	    SSL_kRSA|SSL_aRSA|SSL_RC4|SSL_MD5|SSL_TLSV1,
980	    SSL_EXPORT|SSL_EXP56,
981	    0,
982	    56,
983	    128,
984	    SSL_ALL_CIPHERS,
985	    SSL_ALL_STRENGTHS,
986	    },
987	/* Cipher 61 */
988	    {
989	    1,
990	    TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5,
991	    TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5,
992	    SSL_kRSA|SSL_aRSA|SSL_RC2|SSL_MD5|SSL_TLSV1,
993	    SSL_EXPORT|SSL_EXP56,
994	    0,
995	    56,
996	    128,
997	    SSL_ALL_CIPHERS,
998	    SSL_ALL_STRENGTHS,
999	    },
1000#endif
1001	/* Cipher 62 */
1002	    {
1003	    1,
1004	    TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA,
1005	    TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA,
1006	    SSL_kRSA|SSL_aRSA|SSL_DES|SSL_SHA|SSL_TLSV1,
1007	    SSL_EXPORT|SSL_EXP56,
1008	    0,
1009	    56,
1010	    56,
1011	    SSL_ALL_CIPHERS,
1012	    SSL_ALL_STRENGTHS,
1013	    },
1014	/* Cipher 63 */
1015	    {
1016	    1,
1017	    TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA,
1018	    TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA,
1019	    SSL_kEDH|SSL_aDSS|SSL_DES|SSL_SHA|SSL_TLSV1,
1020	    SSL_EXPORT|SSL_EXP56,
1021	    0,
1022	    56,
1023	    56,
1024	    SSL_ALL_CIPHERS,
1025	    SSL_ALL_STRENGTHS,
1026	    },
1027	/* Cipher 64 */
1028	    {
1029	    1,
1030	    TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA,
1031	    TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA,
1032	    SSL_kRSA|SSL_aRSA|SSL_RC4|SSL_SHA|SSL_TLSV1,
1033	    SSL_EXPORT|SSL_EXP56,
1034	    0,
1035	    56,
1036	    128,
1037	    SSL_ALL_CIPHERS,
1038	    SSL_ALL_STRENGTHS,
1039	    },
1040	/* Cipher 65 */
1041	    {
1042	    1,
1043	    TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA,
1044	    TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA,
1045	    SSL_kEDH|SSL_aDSS|SSL_RC4|SSL_SHA|SSL_TLSV1,
1046	    SSL_EXPORT|SSL_EXP56,
1047	    0,
1048	    56,
1049	    128,
1050	    SSL_ALL_CIPHERS,
1051	    SSL_ALL_STRENGTHS,
1052	    },
1053	/* Cipher 66 */
1054	    {
1055	    1,
1056	    TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA,
1057	    TLS1_CK_DHE_DSS_WITH_RC4_128_SHA,
1058	    SSL_kEDH|SSL_aDSS|SSL_RC4|SSL_SHA|SSL_TLSV1,
1059	    SSL_NOT_EXP|SSL_MEDIUM,
1060	    0,
1061	    128,
1062	    128,
1063	    SSL_ALL_CIPHERS,
1064	    SSL_ALL_STRENGTHS
1065	    },
1066#endif
1067
1068#ifndef OPENSSL_NO_CAMELLIA
1069	/* Camellia ciphersuites from RFC4132 (256-bit portion) */
1070
1071	/* Cipher 84 */
1072	{
1073	1,
1074	TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA,
1075	TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA,
1076	SSL_kRSA|SSL_aRSA|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
1077	SSL_NOT_EXP|SSL_HIGH,
1078	0,
1079	256,
1080	256,
1081	SSL_ALL_CIPHERS,
1082	SSL_ALL_STRENGTHS
1083	},
1084	/* Cipher 85 */
1085	{
1086	0, /* not implemented (non-ephemeral DH) */
1087	TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA,
1088	TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA,
1089	SSL_kDHd|SSL_aDH|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
1090	SSL_NOT_EXP|SSL_HIGH,
1091	0,
1092	256,
1093	256,
1094	SSL_ALL_CIPHERS,
1095	SSL_ALL_STRENGTHS
1096	},
1097	/* Cipher 86 */
1098	{
1099	0, /* not implemented (non-ephemeral DH) */
1100	TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA,
1101	TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA,
1102	SSL_kDHr|SSL_aDH|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
1103	SSL_NOT_EXP|SSL_HIGH,
1104	0,
1105	256,
1106	256,
1107	SSL_ALL_CIPHERS,
1108	SSL_ALL_STRENGTHS
1109	},
1110	/* Cipher 87 */
1111	{
1112	1,
1113	TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA,
1114	TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA,
1115	SSL_kEDH|SSL_aDSS|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
1116	SSL_NOT_EXP|SSL_HIGH,
1117	0,
1118	256,
1119	256,
1120	SSL_ALL_CIPHERS,
1121	SSL_ALL_STRENGTHS
1122	},
1123	/* Cipher 88 */
1124	{
1125	1,
1126	TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,
1127	TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,
1128	SSL_kEDH|SSL_aRSA|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
1129	SSL_NOT_EXP|SSL_HIGH,
1130	0,
1131	256,
1132	256,
1133	SSL_ALL_CIPHERS,
1134	SSL_ALL_STRENGTHS
1135	},
1136	/* Cipher 89 */
1137	{
1138	1,
1139	TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA,
1140	TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA,
1141	SSL_kEDH|SSL_aNULL|SSL_CAMELLIA|SSL_SHA|SSL_TLSV1,
1142	SSL_NOT_EXP|SSL_HIGH,
1143	0,
1144	256,
1145	256,
1146	SSL_ALL_CIPHERS,
1147	SSL_ALL_STRENGTHS
1148	},
1149#endif /* OPENSSL_NO_CAMELLIA */
1150
1151#ifndef OPENSSL_NO_SEED
1152	/* SEED ciphersuites from RFC4162 */
1153
1154	/* Cipher 96 */
1155	{
1156	1,
1157	TLS1_TXT_RSA_WITH_SEED_SHA,
1158	TLS1_CK_RSA_WITH_SEED_SHA,
1159	SSL_kRSA|SSL_aRSA|SSL_SEED|SSL_SHA1|SSL_TLSV1,
1160	SSL_NOT_EXP|SSL_MEDIUM,
1161	0,
1162	128,
1163	128,
1164	SSL_ALL_CIPHERS,
1165	SSL_ALL_STRENGTHS,
1166	},
1167
1168	/* Cipher 97 */
1169	{
1170	0, /* not implemented (non-ephemeral DH) */
1171	TLS1_TXT_DH_DSS_WITH_SEED_SHA,
1172	TLS1_CK_DH_DSS_WITH_SEED_SHA,
1173	SSL_kDHd|SSL_aDH|SSL_SEED|SSL_SHA1|SSL_TLSV1,
1174	SSL_NOT_EXP|SSL_MEDIUM,
1175	0,
1176	128,
1177	128,
1178	SSL_ALL_CIPHERS,
1179	SSL_ALL_STRENGTHS,
1180	},
1181
1182	/* Cipher 98 */
1183	{
1184	0, /* not implemented (non-ephemeral DH) */
1185	TLS1_TXT_DH_RSA_WITH_SEED_SHA,
1186	TLS1_CK_DH_RSA_WITH_SEED_SHA,
1187	SSL_kDHr|SSL_aDH|SSL_SEED|SSL_SHA1|SSL_TLSV1,
1188	SSL_NOT_EXP|SSL_MEDIUM,
1189	0,
1190	128,
1191	128,
1192	SSL_ALL_CIPHERS,
1193	SSL_ALL_STRENGTHS,
1194	},
1195
1196	/* Cipher 99 */
1197	{
1198	1,
1199	TLS1_TXT_DHE_DSS_WITH_SEED_SHA,
1200	TLS1_CK_DHE_DSS_WITH_SEED_SHA,
1201	SSL_kEDH|SSL_aDSS|SSL_SEED|SSL_SHA1|SSL_TLSV1,
1202	SSL_NOT_EXP|SSL_MEDIUM,
1203	0,
1204	128,
1205	128,
1206	SSL_ALL_CIPHERS,
1207	SSL_ALL_STRENGTHS,
1208	},
1209
1210	/* Cipher 9A */
1211	{
1212	1,
1213	TLS1_TXT_DHE_RSA_WITH_SEED_SHA,
1214	TLS1_CK_DHE_RSA_WITH_SEED_SHA,
1215	SSL_kEDH|SSL_aRSA|SSL_SEED|SSL_SHA1|SSL_TLSV1,
1216	SSL_NOT_EXP|SSL_MEDIUM,
1217	0,
1218	128,
1219	128,
1220	SSL_ALL_CIPHERS,
1221	SSL_ALL_STRENGTHS,
1222	},
1223
1224	/* Cipher 9B */
1225	{
1226	1,
1227	TLS1_TXT_ADH_WITH_SEED_SHA,
1228	TLS1_CK_ADH_WITH_SEED_SHA,
1229	SSL_kEDH|SSL_aNULL|SSL_SEED|SSL_SHA1|SSL_TLSV1,
1230	SSL_NOT_EXP|SSL_MEDIUM,
1231	0,
1232	128,
1233	128,
1234	SSL_ALL_CIPHERS,
1235	SSL_ALL_STRENGTHS,
1236	},
1237
1238#endif /* OPENSSL_NO_SEED */
1239
1240#ifndef OPENSSL_NO_ECDH
1241	/* Cipher C001 */
1242	    {
1243            1,
1244            TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA,
1245            TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA,
1246            SSL_kECDH|SSL_aECDSA|SSL_eNULL|SSL_SHA|SSL_TLSV1,
1247            SSL_NOT_EXP,
1248            0,
1249            0,
1250            0,
1251            SSL_ALL_CIPHERS,
1252            SSL_ALL_STRENGTHS,
1253            },
1254
1255	/* Cipher C002 */
1256	    {
1257            1,
1258            TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA,
1259            TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA,
1260            SSL_kECDH|SSL_aECDSA|SSL_RC4|SSL_SHA|SSL_TLSV1,
1261            SSL_NOT_EXP,
1262            0,
1263            128,
1264            128,
1265            SSL_ALL_CIPHERS,
1266            SSL_ALL_STRENGTHS,
1267            },
1268
1269	/* Cipher C003 */
1270	    {
1271            1,
1272            TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA,
1273            TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA,
1274            SSL_kECDH|SSL_aECDSA|SSL_3DES|SSL_SHA|SSL_TLSV1,
1275            SSL_NOT_EXP|SSL_HIGH,
1276            0,
1277            168,
1278            168,
1279            SSL_ALL_CIPHERS,
1280            SSL_ALL_STRENGTHS,
1281            },
1282
1283	/* Cipher C004 */
1284	    {
1285            1,
1286            TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
1287            TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
1288            SSL_kECDH|SSL_aECDSA|SSL_AES|SSL_SHA|SSL_TLSV1,
1289            SSL_NOT_EXP|SSL_HIGH,
1290            0,
1291            128,
1292            128,
1293            SSL_ALL_CIPHERS,
1294            SSL_ALL_STRENGTHS,
1295            },
1296
1297	/* Cipher C005 */
1298	    {
1299            1,
1300            TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
1301            TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
1302            SSL_kECDH|SSL_aECDSA|SSL_AES|SSL_SHA|SSL_TLSV1,
1303            SSL_NOT_EXP|SSL_HIGH,
1304            0,
1305            256,
1306            256,
1307            SSL_ALL_CIPHERS,
1308            SSL_ALL_STRENGTHS,
1309            },
1310
1311	/* Cipher C006 */
1312	    {
1313            1,
1314            TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA,
1315            TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA,
1316            SSL_kECDHE|SSL_aECDSA|SSL_eNULL|SSL_SHA|SSL_TLSV1,
1317            SSL_NOT_EXP,
1318            0,
1319            0,
1320            0,
1321            SSL_ALL_CIPHERS,
1322            SSL_ALL_STRENGTHS,
1323            },
1324
1325	/* Cipher C007 */
1326	    {
1327            1,
1328            TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA,
1329            TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA,
1330            SSL_kECDHE|SSL_aECDSA|SSL_RC4|SSL_SHA|SSL_TLSV1,
1331            SSL_NOT_EXP,
1332            0,
1333            128,
1334            128,
1335            SSL_ALL_CIPHERS,
1336            SSL_ALL_STRENGTHS,
1337            },
1338
1339	/* Cipher C008 */
1340	    {
1341            1,
1342            TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA,
1343            TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA,
1344            SSL_kECDHE|SSL_aECDSA|SSL_3DES|SSL_SHA|SSL_TLSV1,
1345            SSL_NOT_EXP|SSL_HIGH,
1346            0,
1347            168,
1348            168,
1349            SSL_ALL_CIPHERS,
1350            SSL_ALL_STRENGTHS,
1351            },
1352
1353	/* Cipher C009 */
1354	    {
1355            1,
1356            TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
1357            TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
1358            SSL_kECDHE|SSL_aECDSA|SSL_AES|SSL_SHA|SSL_TLSV1,
1359            SSL_NOT_EXP|SSL_HIGH,
1360            0,
1361            128,
1362            128,
1363            SSL_ALL_CIPHERS,
1364            SSL_ALL_STRENGTHS,
1365            },
1366
1367	/* Cipher C00A */
1368	    {
1369            1,
1370            TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
1371            TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
1372            SSL_kECDHE|SSL_aECDSA|SSL_AES|SSL_SHA|SSL_TLSV1,
1373            SSL_NOT_EXP|SSL_HIGH,
1374            0,
1375            256,
1376            256,
1377            SSL_ALL_CIPHERS,
1378            SSL_ALL_STRENGTHS,
1379            },
1380
1381	/* Cipher C00B */
1382	    {
1383            1,
1384            TLS1_TXT_ECDH_RSA_WITH_NULL_SHA,
1385            TLS1_CK_ECDH_RSA_WITH_NULL_SHA,
1386            SSL_kECDH|SSL_aRSA|SSL_eNULL|SSL_SHA|SSL_TLSV1,
1387            SSL_NOT_EXP,
1388            0,
1389            0,
1390            0,
1391            SSL_ALL_CIPHERS,
1392            SSL_ALL_STRENGTHS,
1393            },
1394
1395	/* Cipher C00C */
1396	    {
1397            1,
1398            TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA,
1399            TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA,
1400            SSL_kECDH|SSL_aRSA|SSL_RC4|SSL_SHA|SSL_TLSV1,
1401            SSL_NOT_EXP,
1402            0,
1403            128,
1404            128,
1405            SSL_ALL_CIPHERS,
1406            SSL_ALL_STRENGTHS,
1407            },
1408
1409	/* Cipher C00D */
1410	    {
1411            1,
1412            TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA,
1413            TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA,
1414            SSL_kECDH|SSL_aRSA|SSL_3DES|SSL_SHA|SSL_TLSV1,
1415            SSL_NOT_EXP|SSL_HIGH,
1416            0,
1417            168,
1418            168,
1419            SSL_ALL_CIPHERS,
1420            SSL_ALL_STRENGTHS,
1421            },
1422
1423	/* Cipher C00E */
1424	    {
1425            1,
1426            TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA,
1427            TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA,
1428            SSL_kECDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1,
1429            SSL_NOT_EXP|SSL_HIGH,
1430            0,
1431            128,
1432            128,
1433            SSL_ALL_CIPHERS,
1434            SSL_ALL_STRENGTHS,
1435            },
1436
1437	/* Cipher C00F */
1438	    {
1439            1,
1440            TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA,
1441            TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA,
1442            SSL_kECDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1,
1443            SSL_NOT_EXP|SSL_HIGH,
1444            0,
1445            256,
1446            256,
1447            SSL_ALL_CIPHERS,
1448            SSL_ALL_STRENGTHS,
1449            },
1450
1451	/* Cipher C010 */
1452	    {
1453            1,
1454            TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA,
1455            TLS1_CK_ECDHE_RSA_WITH_NULL_SHA,
1456            SSL_kECDHE|SSL_aRSA|SSL_eNULL|SSL_SHA|SSL_TLSV1,
1457            SSL_NOT_EXP,
1458            0,
1459            0,
1460            0,
1461            SSL_ALL_CIPHERS,
1462            SSL_ALL_STRENGTHS,
1463            },
1464
1465	/* Cipher C011 */
1466	    {
1467            1,
1468            TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA,
1469            TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA,
1470            SSL_kECDHE|SSL_aRSA|SSL_RC4|SSL_SHA|SSL_TLSV1,
1471            SSL_NOT_EXP,
1472            0,
1473            128,
1474            128,
1475            SSL_ALL_CIPHERS,
1476            SSL_ALL_STRENGTHS,
1477            },
1478
1479	/* Cipher C012 */
1480	    {
1481            1,
1482            TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA,
1483            TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA,
1484            SSL_kECDHE|SSL_aRSA|SSL_3DES|SSL_SHA|SSL_TLSV1,
1485            SSL_NOT_EXP|SSL_HIGH,
1486            0,
1487            168,
1488            168,
1489            SSL_ALL_CIPHERS,
1490            SSL_ALL_STRENGTHS,
1491            },
1492
1493	/* Cipher C013 */
1494	    {
1495            1,
1496            TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA,
1497            TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA,
1498            SSL_kECDHE|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1,
1499            SSL_NOT_EXP|SSL_HIGH,
1500            0,
1501            128,
1502            128,
1503            SSL_ALL_CIPHERS,
1504            SSL_ALL_STRENGTHS,
1505            },
1506
1507	/* Cipher C014 */
1508	    {
1509            1,
1510            TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA,
1511            TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA,
1512            SSL_kECDHE|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1,
1513            SSL_NOT_EXP|SSL_HIGH,
1514            0,
1515            256,
1516            256,
1517            SSL_ALL_CIPHERS,
1518            SSL_ALL_STRENGTHS,
1519            },
1520
1521	/* Cipher C015 */
1522            {
1523            1,
1524            TLS1_TXT_ECDH_anon_WITH_NULL_SHA,
1525            TLS1_CK_ECDH_anon_WITH_NULL_SHA,
1526            SSL_kECDHE|SSL_aNULL|SSL_eNULL|SSL_SHA|SSL_TLSV1,
1527            SSL_NOT_EXP,
1528            0,
1529            0,
1530            0,
1531            SSL_ALL_CIPHERS,
1532            SSL_ALL_STRENGTHS,
1533	    },
1534
1535	/* Cipher C016 */
1536            {
1537            1,
1538            TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA,
1539            TLS1_CK_ECDH_anon_WITH_RC4_128_SHA,
1540            SSL_kECDHE|SSL_aNULL|SSL_RC4|SSL_SHA|SSL_TLSV1,
1541            SSL_NOT_EXP,
1542            0,
1543            128,
1544            128,
1545            SSL_ALL_CIPHERS,
1546            SSL_ALL_STRENGTHS,
1547	    },
1548
1549	/* Cipher C017 */
1550	    {
1551            1,
1552            TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA,
1553            TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA,
1554            SSL_kECDHE|SSL_aNULL|SSL_3DES|SSL_SHA|SSL_TLSV1,
1555            SSL_NOT_EXP|SSL_HIGH,
1556            0,
1557            168,
1558            168,
1559            SSL_ALL_CIPHERS,
1560            SSL_ALL_STRENGTHS,
1561            },
1562
1563	/* Cipher C018 */
1564	    {
1565            1,
1566            TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA,
1567            TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA,
1568            SSL_kECDHE|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1,
1569            SSL_NOT_EXP|SSL_HIGH,
1570            0,
1571            128,
1572            128,
1573            SSL_ALL_CIPHERS,
1574            SSL_ALL_STRENGTHS,
1575            },
1576
1577	/* Cipher C019 */
1578	    {
1579            1,
1580            TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA,
1581            TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA,
1582            SSL_kECDHE|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1,
1583            SSL_NOT_EXP|SSL_HIGH,
1584            0,
1585            256,
1586            256,
1587            SSL_ALL_CIPHERS,
1588            SSL_ALL_STRENGTHS,
1589            },
1590#endif	/* OPENSSL_NO_ECDH */
1591
1592
1593/* end of list */
1594	};
1595
1596SSL3_ENC_METHOD SSLv3_enc_data={
1597	ssl3_enc,
1598	ssl3_mac,
1599	ssl3_setup_key_block,
1600	ssl3_generate_master_secret,
1601	ssl3_change_cipher_state,
1602	ssl3_final_finish_mac,
1603	MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
1604	ssl3_cert_verify_mac,
1605	SSL3_MD_CLIENT_FINISHED_CONST,4,
1606	SSL3_MD_SERVER_FINISHED_CONST,4,
1607	ssl3_alert_code,
1608	};
1609
1610long ssl3_default_timeout(void)
1611	{
1612	/* 2 hours, the 24 hours mentioned in the SSLv3 spec
1613	 * is way too long for http, the cache would over fill */
1614	return(60*60*2);
1615	}
1616
1617IMPLEMENT_ssl3_meth_func(sslv3_base_method,
1618			ssl_undefined_function,
1619			ssl_undefined_function,
1620			ssl_bad_method)
1621
1622int ssl3_num_ciphers(void)
1623	{
1624	return(SSL3_NUM_CIPHERS);
1625	}
1626
1627SSL_CIPHER *ssl3_get_cipher(unsigned int u)
1628	{
1629	if (u < SSL3_NUM_CIPHERS)
1630		return(&(ssl3_ciphers[SSL3_NUM_CIPHERS-1-u]));
1631	else
1632		return(NULL);
1633	}
1634
1635int ssl3_pending(const SSL *s)
1636	{
1637	if (s->rstate == SSL_ST_READ_BODY)
1638		return 0;
1639
1640	return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? s->s3->rrec.length : 0;
1641	}
1642
1643int ssl3_new(SSL *s)
1644	{
1645	SSL3_STATE *s3;
1646
1647	if ((s3=OPENSSL_malloc(sizeof *s3)) == NULL) goto err;
1648	memset(s3,0,sizeof *s3);
1649	EVP_MD_CTX_init(&s3->finish_dgst1);
1650	EVP_MD_CTX_init(&s3->finish_dgst2);
1651	pq_64bit_init(&(s3->rrec.seq_num));
1652	pq_64bit_init(&(s3->wrec.seq_num));
1653
1654	s->s3=s3;
1655
1656	s->method->ssl_clear(s);
1657	return(1);
1658err:
1659	return(0);
1660	}
1661
1662void ssl3_free(SSL *s)
1663	{
1664	if(s == NULL)
1665	    return;
1666
1667	ssl3_cleanup_key_block(s);
1668	if (s->s3->rbuf.buf != NULL)
1669		OPENSSL_free(s->s3->rbuf.buf);
1670	if (s->s3->wbuf.buf != NULL)
1671		OPENSSL_free(s->s3->wbuf.buf);
1672	if (s->s3->rrec.comp != NULL)
1673		OPENSSL_free(s->s3->rrec.comp);
1674#ifndef OPENSSL_NO_DH
1675	if (s->s3->tmp.dh != NULL)
1676		DH_free(s->s3->tmp.dh);
1677#endif
1678#ifndef OPENSSL_NO_ECDH
1679	if (s->s3->tmp.ecdh != NULL)
1680		EC_KEY_free(s->s3->tmp.ecdh);
1681#endif
1682
1683	if (s->s3->tmp.ca_names != NULL)
1684		sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
1685	EVP_MD_CTX_cleanup(&s->s3->finish_dgst1);
1686	EVP_MD_CTX_cleanup(&s->s3->finish_dgst2);
1687	pq_64bit_free(&(s->s3->rrec.seq_num));
1688	pq_64bit_free(&(s->s3->wrec.seq_num));
1689
1690	OPENSSL_cleanse(s->s3,sizeof *s->s3);
1691	OPENSSL_free(s->s3);
1692	s->s3=NULL;
1693	}
1694
1695void ssl3_clear(SSL *s)
1696	{
1697	unsigned char *rp,*wp;
1698	size_t rlen, wlen;
1699
1700	ssl3_cleanup_key_block(s);
1701	if (s->s3->tmp.ca_names != NULL)
1702		sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
1703
1704	if (s->s3->rrec.comp != NULL)
1705		{
1706		OPENSSL_free(s->s3->rrec.comp);
1707		s->s3->rrec.comp=NULL;
1708		}
1709#ifndef OPENSSL_NO_DH
1710	if (s->s3->tmp.dh != NULL)
1711		{
1712		DH_free(s->s3->tmp.dh);
1713		s->s3->tmp.dh = NULL;
1714		}
1715#endif
1716#ifndef OPENSSL_NO_ECDH
1717	if (s->s3->tmp.ecdh != NULL)
1718		{
1719		EC_KEY_free(s->s3->tmp.ecdh);
1720		s->s3->tmp.ecdh = NULL;
1721		}
1722#endif
1723#ifndef OPENSSL_NO_TLSEXT
1724#ifndef OPENSSL_NO_EC
1725	s->s3->is_probably_safari = 0;
1726#endif /* !OPENSSL_NO_EC */
1727#endif /* !OPENSSL_NO_TLSEXT */
1728
1729	rp = s->s3->rbuf.buf;
1730	wp = s->s3->wbuf.buf;
1731	rlen = s->s3->rbuf.len;
1732 	wlen = s->s3->wbuf.len;
1733
1734	EVP_MD_CTX_cleanup(&s->s3->finish_dgst1);
1735	EVP_MD_CTX_cleanup(&s->s3->finish_dgst2);
1736
1737	memset(s->s3,0,sizeof *s->s3);
1738	s->s3->rbuf.buf = rp;
1739	s->s3->wbuf.buf = wp;
1740	s->s3->rbuf.len = rlen;
1741 	s->s3->wbuf.len = wlen;
1742
1743	ssl_free_wbio_buffer(s);
1744
1745	s->packet_length=0;
1746	s->s3->renegotiate=0;
1747	s->s3->total_renegotiations=0;
1748	s->s3->num_renegotiations=0;
1749	s->s3->in_read_app_data=0;
1750	s->version=SSL3_VERSION;
1751	}
1752
1753long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
1754	{
1755	int ret=0;
1756
1757#if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_RSA)
1758	if (
1759#ifndef OPENSSL_NO_RSA
1760	    cmd == SSL_CTRL_SET_TMP_RSA ||
1761	    cmd == SSL_CTRL_SET_TMP_RSA_CB ||
1762#endif
1763#ifndef OPENSSL_NO_DSA
1764	    cmd == SSL_CTRL_SET_TMP_DH ||
1765	    cmd == SSL_CTRL_SET_TMP_DH_CB ||
1766#endif
1767		0)
1768		{
1769		if (!ssl_cert_inst(&s->cert))
1770		    	{
1771			SSLerr(SSL_F_SSL3_CTRL, ERR_R_MALLOC_FAILURE);
1772			return(0);
1773			}
1774		}
1775#endif
1776
1777	switch (cmd)
1778		{
1779	case SSL_CTRL_GET_SESSION_REUSED:
1780		ret=s->hit;
1781		break;
1782	case SSL_CTRL_GET_CLIENT_CERT_REQUEST:
1783		break;
1784	case SSL_CTRL_GET_NUM_RENEGOTIATIONS:
1785		ret=s->s3->num_renegotiations;
1786		break;
1787	case SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS:
1788		ret=s->s3->num_renegotiations;
1789		s->s3->num_renegotiations=0;
1790		break;
1791	case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS:
1792		ret=s->s3->total_renegotiations;
1793		break;
1794	case SSL_CTRL_GET_FLAGS:
1795		ret=(int)(s->s3->flags);
1796		break;
1797#ifndef OPENSSL_NO_RSA
1798	case SSL_CTRL_NEED_TMP_RSA:
1799		if ((s->cert != NULL) && (s->cert->rsa_tmp == NULL) &&
1800		    ((s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) ||
1801		     (EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > (512/8))))
1802			ret = 1;
1803		break;
1804	case SSL_CTRL_SET_TMP_RSA:
1805		{
1806			RSA *rsa = (RSA *)parg;
1807			if (rsa == NULL)
1808				{
1809				SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
1810				return(ret);
1811				}
1812			if ((rsa = RSAPrivateKey_dup(rsa)) == NULL)
1813				{
1814				SSLerr(SSL_F_SSL3_CTRL, ERR_R_RSA_LIB);
1815				return(ret);
1816				}
1817			if (s->cert->rsa_tmp != NULL)
1818				RSA_free(s->cert->rsa_tmp);
1819			s->cert->rsa_tmp = rsa;
1820			ret = 1;
1821		}
1822		break;
1823	case SSL_CTRL_SET_TMP_RSA_CB:
1824		{
1825		SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1826		return(ret);
1827		}
1828		break;
1829#endif
1830#ifndef OPENSSL_NO_DH
1831	case SSL_CTRL_SET_TMP_DH:
1832		{
1833			DH *dh = (DH *)parg;
1834			if (dh == NULL)
1835				{
1836				SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
1837				return(ret);
1838				}
1839			if ((dh = DHparams_dup(dh)) == NULL)
1840				{
1841				SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
1842				return(ret);
1843				}
1844			if (!(s->options & SSL_OP_SINGLE_DH_USE))
1845				{
1846				if (!DH_generate_key(dh))
1847					{
1848					DH_free(dh);
1849					SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
1850					return(ret);
1851					}
1852				}
1853			if (s->cert->dh_tmp != NULL)
1854				DH_free(s->cert->dh_tmp);
1855			s->cert->dh_tmp = dh;
1856			ret = 1;
1857		}
1858		break;
1859	case SSL_CTRL_SET_TMP_DH_CB:
1860		{
1861		SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1862		return(ret);
1863		}
1864		break;
1865#endif
1866#ifndef OPENSSL_NO_ECDH
1867	case SSL_CTRL_SET_TMP_ECDH:
1868		{
1869		EC_KEY *ecdh = NULL;
1870
1871		if (parg == NULL)
1872			{
1873			SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
1874			return(ret);
1875			}
1876		if (!EC_KEY_up_ref((EC_KEY *)parg))
1877			{
1878			SSLerr(SSL_F_SSL3_CTRL,ERR_R_ECDH_LIB);
1879			return(ret);
1880			}
1881		ecdh = (EC_KEY *)parg;
1882		if (!(s->options & SSL_OP_SINGLE_ECDH_USE))
1883			{
1884			if (!EC_KEY_generate_key(ecdh))
1885				{
1886				EC_KEY_free(ecdh);
1887				SSLerr(SSL_F_SSL3_CTRL,ERR_R_ECDH_LIB);
1888				return(ret);
1889				}
1890			}
1891		if (s->cert->ecdh_tmp != NULL)
1892			EC_KEY_free(s->cert->ecdh_tmp);
1893		s->cert->ecdh_tmp = ecdh;
1894		ret = 1;
1895		}
1896		break;
1897	case SSL_CTRL_SET_TMP_ECDH_CB:
1898		{
1899		SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1900		return(ret);
1901		}
1902		break;
1903#endif /* !OPENSSL_NO_ECDH */
1904#ifndef OPENSSL_NO_TLSEXT
1905	case SSL_CTRL_SET_TLSEXT_HOSTNAME:
1906 		if (larg == TLSEXT_NAMETYPE_host_name)
1907			{
1908			if (s->tlsext_hostname != NULL)
1909				OPENSSL_free(s->tlsext_hostname);
1910			s->tlsext_hostname = NULL;
1911
1912			ret = 1;
1913			if (parg == NULL)
1914				break;
1915			if (strlen((char *)parg) > TLSEXT_MAXLEN_host_name)
1916				{
1917				SSLerr(SSL_F_SSL3_CTRL, SSL_R_SSL3_EXT_INVALID_SERVERNAME);
1918				return 0;
1919				}
1920			if ((s->tlsext_hostname = BUF_strdup((char *)parg)) == NULL)
1921				{
1922				SSLerr(SSL_F_SSL3_CTRL, ERR_R_INTERNAL_ERROR);
1923				return 0;
1924				}
1925			}
1926		else
1927			{
1928			SSLerr(SSL_F_SSL3_CTRL, SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE);
1929			return 0;
1930			}
1931 		break;
1932	case SSL_CTRL_SET_TLSEXT_DEBUG_ARG:
1933		s->tlsext_debug_arg=parg;
1934		ret = 1;
1935		break;
1936
1937	case SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE:
1938		s->tlsext_status_type=larg;
1939		ret = 1;
1940		break;
1941
1942	case SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS:
1943		*(STACK_OF(X509_EXTENSION) **)parg = s->tlsext_ocsp_exts;
1944		ret = 1;
1945		break;
1946
1947	case SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS:
1948		s->tlsext_ocsp_exts = parg;
1949		ret = 1;
1950		break;
1951
1952	case SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS:
1953		*(STACK_OF(OCSP_RESPID) **)parg = s->tlsext_ocsp_ids;
1954		ret = 1;
1955		break;
1956
1957	case SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS:
1958		s->tlsext_ocsp_ids = parg;
1959		ret = 1;
1960		break;
1961
1962	case SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP:
1963		*(unsigned char **)parg = s->tlsext_ocsp_resp;
1964		return s->tlsext_ocsp_resplen;
1965
1966	case SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP:
1967		if (s->tlsext_ocsp_resp)
1968			OPENSSL_free(s->tlsext_ocsp_resp);
1969		s->tlsext_ocsp_resp = parg;
1970		s->tlsext_ocsp_resplen = larg;
1971		ret = 1;
1972		break;
1973
1974#endif /* !OPENSSL_NO_TLSEXT */
1975	default:
1976		break;
1977		}
1978	return(ret);
1979	}
1980
1981long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void))
1982	{
1983	int ret=0;
1984
1985#if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_RSA)
1986	if (
1987#ifndef OPENSSL_NO_RSA
1988	    cmd == SSL_CTRL_SET_TMP_RSA_CB ||
1989#endif
1990#ifndef OPENSSL_NO_DSA
1991	    cmd == SSL_CTRL_SET_TMP_DH_CB ||
1992#endif
1993		0)
1994		{
1995		if (!ssl_cert_inst(&s->cert))
1996			{
1997			SSLerr(SSL_F_SSL3_CALLBACK_CTRL, ERR_R_MALLOC_FAILURE);
1998			return(0);
1999			}
2000		}
2001#endif
2002
2003	switch (cmd)
2004		{
2005#ifndef OPENSSL_NO_RSA
2006	case SSL_CTRL_SET_TMP_RSA_CB:
2007		{
2008		s->cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp;
2009		}
2010		break;
2011#endif
2012#ifndef OPENSSL_NO_DH
2013	case SSL_CTRL_SET_TMP_DH_CB:
2014		{
2015		s->cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
2016		}
2017		break;
2018#endif
2019#ifndef OPENSSL_NO_ECDH
2020	case SSL_CTRL_SET_TMP_ECDH_CB:
2021		{
2022		s->cert->ecdh_tmp_cb = (EC_KEY *(*)(SSL *, int, int))fp;
2023		}
2024		break;
2025#endif
2026#ifndef OPENSSL_NO_TLSEXT
2027	case SSL_CTRL_SET_TLSEXT_DEBUG_CB:
2028		s->tlsext_debug_cb=(void (*)(SSL *,int ,int,
2029					unsigned char *, int, void *))fp;
2030		break;
2031#endif
2032	default:
2033		break;
2034		}
2035	return(ret);
2036	}
2037
2038long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
2039	{
2040	CERT *cert;
2041
2042	cert=ctx->cert;
2043
2044	switch (cmd)
2045		{
2046#ifndef OPENSSL_NO_RSA
2047	case SSL_CTRL_NEED_TMP_RSA:
2048		if (	(cert->rsa_tmp == NULL) &&
2049			((cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) ||
2050			 (EVP_PKEY_size(cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > (512/8)))
2051			)
2052			return(1);
2053		else
2054			return(0);
2055		/* break; */
2056	case SSL_CTRL_SET_TMP_RSA:
2057		{
2058		RSA *rsa;
2059		int i;
2060
2061		rsa=(RSA *)parg;
2062		i=1;
2063		if (rsa == NULL)
2064			i=0;
2065		else
2066			{
2067			if ((rsa=RSAPrivateKey_dup(rsa)) == NULL)
2068				i=0;
2069			}
2070		if (!i)
2071			{
2072			SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_RSA_LIB);
2073			return(0);
2074			}
2075		else
2076			{
2077			if (cert->rsa_tmp != NULL)
2078				RSA_free(cert->rsa_tmp);
2079			cert->rsa_tmp=rsa;
2080			return(1);
2081			}
2082		}
2083		/* break; */
2084	case SSL_CTRL_SET_TMP_RSA_CB:
2085		{
2086		SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2087		return(0);
2088		}
2089		break;
2090#endif
2091#ifndef OPENSSL_NO_DH
2092	case SSL_CTRL_SET_TMP_DH:
2093		{
2094		DH *new=NULL,*dh;
2095
2096		dh=(DH *)parg;
2097		if ((new=DHparams_dup(dh)) == NULL)
2098			{
2099			SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
2100			return 0;
2101			}
2102		if (!(ctx->options & SSL_OP_SINGLE_DH_USE))
2103			{
2104			if (!DH_generate_key(new))
2105				{
2106				SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
2107				DH_free(new);
2108				return 0;
2109				}
2110			}
2111		if (cert->dh_tmp != NULL)
2112			DH_free(cert->dh_tmp);
2113		cert->dh_tmp=new;
2114		return 1;
2115		}
2116		/*break; */
2117	case SSL_CTRL_SET_TMP_DH_CB:
2118		{
2119		SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2120		return(0);
2121		}
2122		break;
2123#endif
2124#ifndef OPENSSL_NO_ECDH
2125	case SSL_CTRL_SET_TMP_ECDH:
2126		{
2127		EC_KEY *ecdh = NULL;
2128
2129		if (parg == NULL)
2130			{
2131			SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_ECDH_LIB);
2132			return 0;
2133			}
2134		ecdh = EC_KEY_dup((EC_KEY *)parg);
2135		if (ecdh == NULL)
2136			{
2137			SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_EC_LIB);
2138			return 0;
2139			}
2140		if (!(ctx->options & SSL_OP_SINGLE_ECDH_USE))
2141			{
2142			if (!EC_KEY_generate_key(ecdh))
2143				{
2144				EC_KEY_free(ecdh);
2145				SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_ECDH_LIB);
2146				return 0;
2147				}
2148			}
2149
2150		if (cert->ecdh_tmp != NULL)
2151			{
2152			EC_KEY_free(cert->ecdh_tmp);
2153			}
2154		cert->ecdh_tmp = ecdh;
2155		return 1;
2156		}
2157		/* break; */
2158	case SSL_CTRL_SET_TMP_ECDH_CB:
2159		{
2160		SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2161		return(0);
2162		}
2163		break;
2164#endif /* !OPENSSL_NO_ECDH */
2165#ifndef OPENSSL_NO_TLSEXT
2166	case SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG:
2167		ctx->tlsext_servername_arg=parg;
2168		break;
2169	case SSL_CTRL_SET_TLSEXT_TICKET_KEYS:
2170	case SSL_CTRL_GET_TLSEXT_TICKET_KEYS:
2171		{
2172		unsigned char *keys = parg;
2173		if (!keys)
2174			return 48;
2175		if (larg != 48)
2176			{
2177			SSLerr(SSL_F_SSL3_CTX_CTRL, SSL_R_INVALID_TICKET_KEYS_LENGTH);
2178			return 0;
2179			}
2180		if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS)
2181			{
2182			memcpy(ctx->tlsext_tick_key_name, keys, 16);
2183			memcpy(ctx->tlsext_tick_hmac_key, keys + 16, 16);
2184			memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16);
2185			}
2186		else
2187			{
2188			memcpy(keys, ctx->tlsext_tick_key_name, 16);
2189			memcpy(keys + 16, ctx->tlsext_tick_hmac_key, 16);
2190			memcpy(keys + 32, ctx->tlsext_tick_aes_key, 16);
2191			}
2192		return 1;
2193		}
2194
2195	case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG:
2196		ctx->tlsext_status_arg=parg;
2197		return 1;
2198		break;
2199
2200#endif /* !OPENSSL_NO_TLSEXT */
2201	/* A Thawte special :-) */
2202	case SSL_CTRL_EXTRA_CHAIN_CERT:
2203		if (ctx->extra_certs == NULL)
2204			{
2205			if ((ctx->extra_certs=sk_X509_new_null()) == NULL)
2206				return(0);
2207			}
2208		sk_X509_push(ctx->extra_certs,(X509 *)parg);
2209		break;
2210
2211	default:
2212		return(0);
2213		}
2214	return(1);
2215	}
2216
2217long ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void))
2218	{
2219	CERT *cert;
2220
2221	cert=ctx->cert;
2222
2223	switch (cmd)
2224		{
2225#ifndef OPENSSL_NO_RSA
2226	case SSL_CTRL_SET_TMP_RSA_CB:
2227		{
2228		cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp;
2229		}
2230		break;
2231#endif
2232#ifndef OPENSSL_NO_DH
2233	case SSL_CTRL_SET_TMP_DH_CB:
2234		{
2235		cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
2236		}
2237		break;
2238#endif
2239#ifndef OPENSSL_NO_ECDH
2240	case SSL_CTRL_SET_TMP_ECDH_CB:
2241		{
2242		cert->ecdh_tmp_cb = (EC_KEY *(*)(SSL *, int, int))fp;
2243		}
2244		break;
2245#endif
2246#ifndef OPENSSL_NO_TLSEXT
2247	case SSL_CTRL_SET_TLSEXT_SERVERNAME_CB:
2248		ctx->tlsext_servername_callback=(int (*)(SSL *,int *,void *))fp;
2249		break;
2250
2251	case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB:
2252		ctx->tlsext_status_cb=(int (*)(SSL *,void *))fp;
2253		break;
2254
2255	case SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB:
2256		ctx->tlsext_ticket_key_cb=(int (*)(SSL *,unsigned char  *,
2257						unsigned char *,
2258						EVP_CIPHER_CTX *,
2259						HMAC_CTX *, int))fp;
2260		break;
2261
2262#endif
2263	default:
2264		return(0);
2265		}
2266	return(1);
2267	}
2268
2269/* This function needs to check if the ciphers required are actually
2270 * available */
2271SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p)
2272	{
2273	SSL_CIPHER c,*cp;
2274	unsigned long id;
2275
2276	id=0x03000000L|((unsigned long)p[0]<<8L)|(unsigned long)p[1];
2277	c.id=id;
2278	cp = (SSL_CIPHER *)OBJ_bsearch((char *)&c,
2279		(char *)ssl3_ciphers,
2280		SSL3_NUM_CIPHERS,sizeof(SSL_CIPHER),
2281		FP_ICC ssl_cipher_id_cmp);
2282	if (cp == NULL || cp->valid == 0)
2283		return NULL;
2284	else
2285		return cp;
2286	}
2287
2288int ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p)
2289	{
2290	long l;
2291
2292	if (p != NULL)
2293		{
2294		l=c->id;
2295		if ((l & 0xff000000) != 0x03000000) return(0);
2296		p[0]=((unsigned char)(l>> 8L))&0xFF;
2297		p[1]=((unsigned char)(l     ))&0xFF;
2298		}
2299	return(2);
2300	}
2301
2302SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
2303	     STACK_OF(SSL_CIPHER) *srvr)
2304	{
2305	SSL_CIPHER *c,*ret=NULL;
2306	STACK_OF(SSL_CIPHER) *prio, *allow;
2307	int i,j,ok;
2308
2309	CERT *cert;
2310	unsigned long alg,mask,emask;
2311
2312	/* Let's see which ciphers we can support */
2313	cert=s->cert;
2314
2315#if 0
2316	/* Do not set the compare functions, because this may lead to a
2317	 * reordering by "id". We want to keep the original ordering.
2318	 * We may pay a price in performance during sk_SSL_CIPHER_find(),
2319	 * but would have to pay with the price of sk_SSL_CIPHER_dup().
2320	 */
2321	sk_SSL_CIPHER_set_cmp_func(srvr, ssl_cipher_ptr_id_cmp);
2322	sk_SSL_CIPHER_set_cmp_func(clnt, ssl_cipher_ptr_id_cmp);
2323#endif
2324
2325#ifdef CIPHER_DEBUG
2326        printf("Server has %d from %p:\n", sk_SSL_CIPHER_num(srvr), srvr);
2327        for(i=0 ; i < sk_SSL_CIPHER_num(srvr) ; ++i)
2328	    {
2329	    c=sk_SSL_CIPHER_value(srvr,i);
2330	    printf("%p:%s\n",c,c->name);
2331	    }
2332        printf("Client sent %d from %p:\n", sk_SSL_CIPHER_num(clnt), clnt);
2333        for(i=0 ; i < sk_SSL_CIPHER_num(clnt) ; ++i)
2334	    {
2335	    c=sk_SSL_CIPHER_value(clnt,i);
2336	    printf("%p:%s\n",c,c->name);
2337	    }
2338#endif
2339
2340	if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE)
2341	    {
2342	    prio = srvr;
2343	    allow = clnt;
2344	    }
2345	else
2346	    {
2347	    prio = clnt;
2348	    allow = srvr;
2349	    }
2350
2351	for (i=0; i<sk_SSL_CIPHER_num(prio); i++)
2352		{
2353		c=sk_SSL_CIPHER_value(prio,i);
2354
2355		ssl_set_cert_masks(cert,c);
2356		mask=cert->mask;
2357		emask=cert->export_mask;
2358
2359#ifdef KSSL_DEBUG
2360		printf("ssl3_choose_cipher %d alg= %lx\n", i,c->algorithms);
2361#endif    /* KSSL_DEBUG */
2362
2363		alg=c->algorithms&(SSL_MKEY_MASK|SSL_AUTH_MASK);
2364#ifndef OPENSSL_NO_KRB5
2365                if (alg & SSL_KRB5)
2366                        {
2367                        if ( !kssl_keytab_is_available(s->kssl_ctx) )
2368                            continue;
2369                        }
2370#endif /* OPENSSL_NO_KRB5 */
2371		if (SSL_C_IS_EXPORT(c))
2372			{
2373			ok=((alg & emask) == alg)?1:0;
2374#ifdef CIPHER_DEBUG
2375			printf("%d:[%08lX:%08lX]%p:%s (export)\n",ok,alg,emask,
2376			       c,c->name);
2377#endif
2378			}
2379		else
2380			{
2381			ok=((alg & mask) == alg)?1:0;
2382#ifdef CIPHER_DEBUG
2383			printf("%d:[%08lX:%08lX]%p:%s\n",ok,alg,mask,c,
2384			       c->name);
2385#endif
2386			}
2387
2388		if (!ok) continue;
2389		j=sk_SSL_CIPHER_find(allow,c);
2390		if (j >= 0)
2391			{
2392#if !defined(OPENSSL_NO_EC) && !defined(OPENSSL_NO_TLSEXT)
2393			if ((alg & SSL_kECDHE) && (alg & SSL_aECDSA) && s->s3->is_probably_safari)
2394				{
2395				if (!ret) ret=sk_SSL_CIPHER_value(allow,j);
2396				continue;
2397				}
2398#endif
2399			ret=sk_SSL_CIPHER_value(allow,j);
2400			break;
2401			}
2402		}
2403	return(ret);
2404	}
2405
2406int ssl3_get_req_cert_type(SSL *s, unsigned char *p)
2407	{
2408	int ret=0;
2409	unsigned long alg;
2410
2411	alg=s->s3->tmp.new_cipher->algorithms;
2412
2413#ifndef OPENSSL_NO_DH
2414	if (alg & (SSL_kDHr|SSL_kEDH))
2415		{
2416#  ifndef OPENSSL_NO_RSA
2417		p[ret++]=SSL3_CT_RSA_FIXED_DH;
2418#  endif
2419#  ifndef OPENSSL_NO_DSA
2420		p[ret++]=SSL3_CT_DSS_FIXED_DH;
2421#  endif
2422		}
2423	if ((s->version == SSL3_VERSION) &&
2424		(alg & (SSL_kEDH|SSL_kDHd|SSL_kDHr)))
2425		{
2426#  ifndef OPENSSL_NO_RSA
2427		p[ret++]=SSL3_CT_RSA_EPHEMERAL_DH;
2428#  endif
2429#  ifndef OPENSSL_NO_DSA
2430		p[ret++]=SSL3_CT_DSS_EPHEMERAL_DH;
2431#  endif
2432		}
2433#endif /* !OPENSSL_NO_DH */
2434#ifndef OPENSSL_NO_RSA
2435	p[ret++]=SSL3_CT_RSA_SIGN;
2436#endif
2437#ifndef OPENSSL_NO_DSA
2438	p[ret++]=SSL3_CT_DSS_SIGN;
2439#endif
2440#ifndef OPENSSL_NO_ECDH
2441	/* We should ask for fixed ECDH certificates only
2442	 * for SSL_kECDH (and not SSL_kECDHE)
2443	 */
2444	if ((alg & SSL_kECDH) && (s->version >= TLS1_VERSION))
2445		{
2446		p[ret++]=TLS_CT_RSA_FIXED_ECDH;
2447		p[ret++]=TLS_CT_ECDSA_FIXED_ECDH;
2448		}
2449#endif
2450
2451#ifndef OPENSSL_NO_ECDSA
2452	/* ECDSA certs can be used with RSA cipher suites as well
2453	 * so we don't need to check for SSL_kECDH or SSL_kECDHE
2454	 */
2455	if (s->version >= TLS1_VERSION)
2456		{
2457		p[ret++]=TLS_CT_ECDSA_SIGN;
2458		}
2459#endif
2460	return(ret);
2461	}
2462
2463int ssl3_shutdown(SSL *s)
2464	{
2465	int ret;
2466
2467	/* Don't do anything much if we have not done the handshake or
2468	 * we don't want to send messages :-) */
2469	if ((s->quiet_shutdown) || (s->state == SSL_ST_BEFORE))
2470		{
2471		s->shutdown=(SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
2472		return(1);
2473		}
2474
2475	if (!(s->shutdown & SSL_SENT_SHUTDOWN))
2476		{
2477		s->shutdown|=SSL_SENT_SHUTDOWN;
2478#if 1
2479		ssl3_send_alert(s,SSL3_AL_WARNING,SSL_AD_CLOSE_NOTIFY);
2480#endif
2481		/* our shutdown alert has been sent now, and if it still needs
2482	 	 * to be written, s->s3->alert_dispatch will be true */
2483	 	if (s->s3->alert_dispatch)
2484	 		return(-1);	/* return WANT_WRITE */
2485		}
2486	else if (s->s3->alert_dispatch)
2487		{
2488		/* resend it if not sent */
2489#if 1
2490		ret=s->method->ssl_dispatch_alert(s);
2491		if(ret == -1)
2492			{
2493			/* we only get to return -1 here the 2nd/Nth
2494			 * invocation, we must  have already signalled
2495			 * return 0 upon a previous invoation,
2496			 * return WANT_WRITE */
2497			return(ret);
2498			}
2499#endif
2500		}
2501	else if (!(s->shutdown & SSL_RECEIVED_SHUTDOWN))
2502		{
2503		/* If we are waiting for a close from our peer, we are closed */
2504		s->method->ssl_read_bytes(s,0,NULL,0,0);
2505		if(!(s->shutdown & SSL_RECEIVED_SHUTDOWN))
2506			{
2507			return(-1);	/* return WANT_READ */
2508			}
2509		}
2510
2511	if ((s->shutdown == (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN)) &&
2512		!s->s3->alert_dispatch)
2513		return(1);
2514	else
2515		return(0);
2516	}
2517
2518int ssl3_write(SSL *s, const void *buf, int len)
2519	{
2520	int ret,n;
2521
2522#if 0
2523	if (s->shutdown & SSL_SEND_SHUTDOWN)
2524		{
2525		s->rwstate=SSL_NOTHING;
2526		return(0);
2527		}
2528#endif
2529	clear_sys_error();
2530	if (s->s3->renegotiate) ssl3_renegotiate_check(s);
2531
2532	/* This is an experimental flag that sends the
2533	 * last handshake message in the same packet as the first
2534	 * use data - used to see if it helps the TCP protocol during
2535	 * session-id reuse */
2536	/* The second test is because the buffer may have been removed */
2537	if ((s->s3->flags & SSL3_FLAGS_POP_BUFFER) && (s->wbio == s->bbio))
2538		{
2539		/* First time through, we write into the buffer */
2540		if (s->s3->delay_buf_pop_ret == 0)
2541			{
2542			ret=ssl3_write_bytes(s,SSL3_RT_APPLICATION_DATA,
2543					     buf,len);
2544			if (ret <= 0) return(ret);
2545
2546			s->s3->delay_buf_pop_ret=ret;
2547			}
2548
2549		s->rwstate=SSL_WRITING;
2550		n=BIO_flush(s->wbio);
2551		if (n <= 0) return(n);
2552		s->rwstate=SSL_NOTHING;
2553
2554		/* We have flushed the buffer, so remove it */
2555		ssl_free_wbio_buffer(s);
2556		s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
2557
2558		ret=s->s3->delay_buf_pop_ret;
2559		s->s3->delay_buf_pop_ret=0;
2560		}
2561	else
2562		{
2563		ret=s->method->ssl_write_bytes(s,SSL3_RT_APPLICATION_DATA,
2564			buf,len);
2565		if (ret <= 0) return(ret);
2566		}
2567
2568	return(ret);
2569	}
2570
2571static int ssl3_read_internal(SSL *s, void *buf, int len, int peek)
2572	{
2573	int ret;
2574
2575	clear_sys_error();
2576	if (s->s3->renegotiate) ssl3_renegotiate_check(s);
2577	s->s3->in_read_app_data=1;
2578	ret=s->method->ssl_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek);
2579	if ((ret == -1) && (s->s3->in_read_app_data == 2))
2580		{
2581		/* ssl3_read_bytes decided to call s->handshake_func, which
2582		 * called ssl3_read_bytes to read handshake data.
2583		 * However, ssl3_read_bytes actually found application data
2584		 * and thinks that application data makes sense here; so disable
2585		 * handshake processing and try to read application data again. */
2586		s->in_handshake++;
2587		ret=s->method->ssl_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek);
2588		s->in_handshake--;
2589		}
2590	else
2591		s->s3->in_read_app_data=0;
2592
2593	return(ret);
2594	}
2595
2596int ssl3_read(SSL *s, void *buf, int len)
2597	{
2598	return ssl3_read_internal(s, buf, len, 0);
2599	}
2600
2601int ssl3_peek(SSL *s, void *buf, int len)
2602	{
2603	return ssl3_read_internal(s, buf, len, 1);
2604	}
2605
2606int ssl3_renegotiate(SSL *s)
2607	{
2608	if (s->handshake_func == NULL)
2609		return(1);
2610
2611	if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)
2612		return(0);
2613
2614	s->s3->renegotiate=1;
2615	return(1);
2616	}
2617
2618int ssl3_renegotiate_check(SSL *s)
2619	{
2620	int ret=0;
2621
2622	if (s->s3->renegotiate)
2623		{
2624		if (	(s->s3->rbuf.left == 0) &&
2625			(s->s3->wbuf.left == 0) &&
2626			!SSL_in_init(s))
2627			{
2628/*
2629if we are the server, and we have sent a 'RENEGOTIATE' message, we
2630need to go to SSL_ST_ACCEPT.
2631*/
2632			/* SSL_ST_ACCEPT */
2633			s->state=SSL_ST_RENEGOTIATE;
2634			s->s3->renegotiate=0;
2635			s->s3->num_renegotiations++;
2636			s->s3->total_renegotiations++;
2637			ret=1;
2638			}
2639		}
2640	return(ret);
2641	}
2642