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