1/* ssl/ssl_ciph.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 * ECC cipher suite support in OpenSSL originally developed by
114 * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
115 */
116#include <stdio.h>
117#include <openssl/objects.h>
118#include <openssl/comp.h>
119#include "ssl_locl.h"
120
121#define SSL_ENC_DES_IDX		0
122#define SSL_ENC_3DES_IDX	1
123#define SSL_ENC_RC4_IDX		2
124#define SSL_ENC_RC2_IDX		3
125#define SSL_ENC_IDEA_IDX	4
126#define SSL_ENC_eFZA_IDX	5
127#define SSL_ENC_NULL_IDX	6
128#define SSL_ENC_AES128_IDX	7
129#define SSL_ENC_AES256_IDX	8
130#define SSL_ENC_NUM_IDX		9
131#define SSL_ENC_CAMELLIA128_IDX	9
132#define SSL_ENC_CAMELLIA256_IDX	10
133#undef  SSL_ENC_NUM_IDX
134#define SSL_ENC_NUM_IDX		11
135
136
137static const EVP_CIPHER *ssl_cipher_methods[SSL_ENC_NUM_IDX]={
138	NULL,NULL,NULL,NULL,NULL,NULL,
139	};
140
141#define SSL_COMP_NULL_IDX	0
142#define SSL_COMP_ZLIB_IDX	1
143#define SSL_COMP_NUM_IDX	2
144
145static STACK_OF(SSL_COMP) *ssl_comp_methods=NULL;
146
147#define SSL_MD_MD5_IDX	0
148#define SSL_MD_SHA1_IDX	1
149#define SSL_MD_NUM_IDX	2
150static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX]={
151	NULL,NULL,
152	};
153
154#define CIPHER_ADD	1
155#define CIPHER_KILL	2
156#define CIPHER_DEL	3
157#define CIPHER_ORD	4
158#define CIPHER_SPECIAL	5
159
160typedef struct cipher_order_st
161	{
162	SSL_CIPHER *cipher;
163	int active;
164	int dead;
165	struct cipher_order_st *next,*prev;
166	} CIPHER_ORDER;
167
168static const SSL_CIPHER cipher_aliases[]={
169	/* Don't include eNULL unless specifically enabled. */
170	/* Don't include ECC in ALL because these ciphers are not yet official. */
171	{0,SSL_TXT_ALL, 0,SSL_ALL & ~SSL_eNULL & ~SSL_kECDH & ~SSL_kECDHE, SSL_ALL ,0,0,0,SSL_ALL,SSL_ALL}, /* must be first */
172	/* TODO: COMPLEMENT OF ALL and COMPLEMENT OF DEFAULT do not have ECC cipher suites handled properly. */
173	{0,SSL_TXT_CMPALL,0,SSL_eNULL,0,0,0,0,SSL_ENC_MASK,0},  /* COMPLEMENT OF ALL */
174	{0,SSL_TXT_CMPDEF,0,SSL_ADH, 0,0,0,0,SSL_AUTH_MASK,0},
175	{0,SSL_TXT_kKRB5,0,SSL_kKRB5,0,0,0,0,SSL_MKEY_MASK,0},  /* VRS Kerberos5 */
176	{0,SSL_TXT_kRSA,0,SSL_kRSA,  0,0,0,0,SSL_MKEY_MASK,0},
177	{0,SSL_TXT_kDHr,0,SSL_kDHr,  0,0,0,0,SSL_MKEY_MASK,0},
178	{0,SSL_TXT_kDHd,0,SSL_kDHd,  0,0,0,0,SSL_MKEY_MASK,0},
179	{0,SSL_TXT_kEDH,0,SSL_kEDH,  0,0,0,0,SSL_MKEY_MASK,0},
180	{0,SSL_TXT_kFZA,0,SSL_kFZA,  0,0,0,0,SSL_MKEY_MASK,0},
181	{0,SSL_TXT_DH,	0,SSL_DH,    0,0,0,0,SSL_MKEY_MASK,0},
182	{0,SSL_TXT_ECC,	0,(SSL_kECDH|SSL_kECDHE), 0,0,0,0,SSL_MKEY_MASK,0},
183	{0,SSL_TXT_EDH,	0,SSL_EDH,   0,0,0,0,SSL_MKEY_MASK|SSL_AUTH_MASK,0},
184	{0,SSL_TXT_aKRB5,0,SSL_aKRB5,0,0,0,0,SSL_AUTH_MASK,0},  /* VRS Kerberos5 */
185	{0,SSL_TXT_aRSA,0,SSL_aRSA,  0,0,0,0,SSL_AUTH_MASK,0},
186	{0,SSL_TXT_aDSS,0,SSL_aDSS,  0,0,0,0,SSL_AUTH_MASK,0},
187	{0,SSL_TXT_aFZA,0,SSL_aFZA,  0,0,0,0,SSL_AUTH_MASK,0},
188	{0,SSL_TXT_aNULL,0,SSL_aNULL,0,0,0,0,SSL_AUTH_MASK,0},
189	{0,SSL_TXT_aDH, 0,SSL_aDH,   0,0,0,0,SSL_AUTH_MASK,0},
190	{0,SSL_TXT_DSS,	0,SSL_DSS,   0,0,0,0,SSL_AUTH_MASK,0},
191
192	{0,SSL_TXT_DES,	0,SSL_DES,   0,0,0,0,SSL_ENC_MASK,0},
193	{0,SSL_TXT_3DES,0,SSL_3DES,  0,0,0,0,SSL_ENC_MASK,0},
194	{0,SSL_TXT_RC4,	0,SSL_RC4,   0,0,0,0,SSL_ENC_MASK,0},
195	{0,SSL_TXT_RC2,	0,SSL_RC2,   0,0,0,0,SSL_ENC_MASK,0},
196#ifndef OPENSSL_NO_IDEA
197	{0,SSL_TXT_IDEA,0,SSL_IDEA,  0,0,0,0,SSL_ENC_MASK,0},
198#endif
199	{0,SSL_TXT_eNULL,0,SSL_eNULL,0,0,0,0,SSL_ENC_MASK,0},
200	{0,SSL_TXT_eFZA,0,SSL_eFZA,  0,0,0,0,SSL_ENC_MASK,0},
201	{0,SSL_TXT_AES,	0,SSL_AES,   0,0,0,0,SSL_ENC_MASK,0},
202	{0,SSL_TXT_CAMELLIA,	0,SSL_CAMELLIA,   0,0,0,0,SSL_ENC_MASK,0},
203
204	{0,SSL_TXT_MD5,	0,SSL_MD5,   0,0,0,0,SSL_MAC_MASK,0},
205	{0,SSL_TXT_SHA1,0,SSL_SHA1,  0,0,0,0,SSL_MAC_MASK,0},
206	{0,SSL_TXT_SHA,	0,SSL_SHA,   0,0,0,0,SSL_MAC_MASK,0},
207
208	{0,SSL_TXT_NULL,0,SSL_NULL,  0,0,0,0,SSL_ENC_MASK,0},
209	{0,SSL_TXT_KRB5,0,SSL_KRB5,  0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK,0},
210	{0,SSL_TXT_RSA,	0,SSL_RSA,   0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK,0},
211	{0,SSL_TXT_ADH,	0,SSL_ADH,   0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK,0},
212	{0,SSL_TXT_FZA,	0,SSL_FZA,   0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK|SSL_ENC_MASK,0},
213
214	{0,SSL_TXT_SSLV2, 0,SSL_SSLV2, 0,0,0,0,SSL_SSL_MASK,0},
215	{0,SSL_TXT_SSLV3, 0,SSL_SSLV3, 0,0,0,0,SSL_SSL_MASK,0},
216	{0,SSL_TXT_TLSV1, 0,SSL_TLSV1, 0,0,0,0,SSL_SSL_MASK,0},
217
218	{0,SSL_TXT_EXP   ,0, 0,SSL_EXPORT, 0,0,0,0,SSL_EXP_MASK},
219	{0,SSL_TXT_EXPORT,0, 0,SSL_EXPORT, 0,0,0,0,SSL_EXP_MASK},
220	{0,SSL_TXT_EXP40, 0, 0, SSL_EXP40, 0,0,0,0,SSL_STRONG_MASK},
221	{0,SSL_TXT_EXP56, 0, 0, SSL_EXP56, 0,0,0,0,SSL_STRONG_MASK},
222	{0,SSL_TXT_LOW,   0, 0,   SSL_LOW, 0,0,0,0,SSL_STRONG_MASK},
223	{0,SSL_TXT_MEDIUM,0, 0,SSL_MEDIUM, 0,0,0,0,SSL_STRONG_MASK},
224	{0,SSL_TXT_HIGH,  0, 0,  SSL_HIGH, 0,0,0,0,SSL_STRONG_MASK},
225	};
226
227void ssl_load_ciphers(void)
228	{
229	ssl_cipher_methods[SSL_ENC_DES_IDX]=
230		EVP_get_cipherbyname(SN_des_cbc);
231	ssl_cipher_methods[SSL_ENC_3DES_IDX]=
232		EVP_get_cipherbyname(SN_des_ede3_cbc);
233	ssl_cipher_methods[SSL_ENC_RC4_IDX]=
234		EVP_get_cipherbyname(SN_rc4);
235	ssl_cipher_methods[SSL_ENC_RC2_IDX]=
236		EVP_get_cipherbyname(SN_rc2_cbc);
237#ifndef OPENSSL_NO_IDEA
238	ssl_cipher_methods[SSL_ENC_IDEA_IDX]=
239		EVP_get_cipherbyname(SN_idea_cbc);
240#else
241	ssl_cipher_methods[SSL_ENC_IDEA_IDX]= NULL;
242#endif
243	ssl_cipher_methods[SSL_ENC_AES128_IDX]=
244	  EVP_get_cipherbyname(SN_aes_128_cbc);
245	ssl_cipher_methods[SSL_ENC_AES256_IDX]=
246	  EVP_get_cipherbyname(SN_aes_256_cbc);
247	ssl_cipher_methods[SSL_ENC_CAMELLIA128_IDX]=
248	  EVP_get_cipherbyname(SN_camellia_128_cbc);
249	ssl_cipher_methods[SSL_ENC_CAMELLIA256_IDX]=
250	  EVP_get_cipherbyname(SN_camellia_256_cbc);
251
252	ssl_digest_methods[SSL_MD_MD5_IDX]=
253		EVP_get_digestbyname(SN_md5);
254	ssl_digest_methods[SSL_MD_SHA1_IDX]=
255		EVP_get_digestbyname(SN_sha1);
256	}
257
258
259#ifndef OPENSSL_NO_COMP
260
261static int sk_comp_cmp(const SSL_COMP * const *a,
262			const SSL_COMP * const *b)
263	{
264	return((*a)->id-(*b)->id);
265	}
266
267static void load_builtin_compressions(void)
268	{
269	int got_write_lock = 0;
270
271	CRYPTO_r_lock(CRYPTO_LOCK_SSL);
272	if (ssl_comp_methods == NULL)
273		{
274		CRYPTO_r_unlock(CRYPTO_LOCK_SSL);
275		CRYPTO_w_lock(CRYPTO_LOCK_SSL);
276		got_write_lock = 1;
277
278		if (ssl_comp_methods == NULL)
279			{
280			SSL_COMP *comp = NULL;
281
282			MemCheck_off();
283			ssl_comp_methods=sk_SSL_COMP_new(sk_comp_cmp);
284			if (ssl_comp_methods != NULL)
285				{
286				comp=(SSL_COMP *)OPENSSL_malloc(sizeof(SSL_COMP));
287				if (comp != NULL)
288					{
289					comp->method=COMP_zlib();
290					if (comp->method
291						&& comp->method->type == NID_undef)
292						OPENSSL_free(comp);
293					else
294						{
295						comp->id=SSL_COMP_ZLIB_IDX;
296						comp->name=comp->method->name;
297						sk_SSL_COMP_push(ssl_comp_methods,comp);
298						}
299					}
300				}
301			MemCheck_on();
302			}
303		}
304
305	if (got_write_lock)
306		CRYPTO_w_unlock(CRYPTO_LOCK_SSL);
307	else
308		CRYPTO_r_unlock(CRYPTO_LOCK_SSL);
309	}
310#endif
311
312int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc,
313	     const EVP_MD **md, SSL_COMP **comp)
314	{
315	int i;
316	SSL_CIPHER *c;
317
318	c=s->cipher;
319	if (c == NULL) return(0);
320	if (comp != NULL)
321		{
322		SSL_COMP ctmp;
323#ifndef OPENSSL_NO_COMP
324		load_builtin_compressions();
325#endif
326
327		*comp=NULL;
328		ctmp.id=s->compress_meth;
329		if (ssl_comp_methods != NULL)
330			{
331			i=sk_SSL_COMP_find(ssl_comp_methods,&ctmp);
332			if (i >= 0)
333				*comp=sk_SSL_COMP_value(ssl_comp_methods,i);
334			else
335				*comp=NULL;
336			}
337		}
338
339	if ((enc == NULL) || (md == NULL)) return(0);
340
341	switch (c->algorithms & SSL_ENC_MASK)
342		{
343	case SSL_DES:
344		i=SSL_ENC_DES_IDX;
345		break;
346	case SSL_3DES:
347		i=SSL_ENC_3DES_IDX;
348		break;
349	case SSL_RC4:
350		i=SSL_ENC_RC4_IDX;
351		break;
352	case SSL_RC2:
353		i=SSL_ENC_RC2_IDX;
354		break;
355	case SSL_IDEA:
356		i=SSL_ENC_IDEA_IDX;
357		break;
358	case SSL_eNULL:
359		i=SSL_ENC_NULL_IDX;
360		break;
361	case SSL_AES:
362		switch(c->alg_bits)
363			{
364		case 128: i=SSL_ENC_AES128_IDX; break;
365		case 256: i=SSL_ENC_AES256_IDX; break;
366		default: i=-1; break;
367			}
368		break;
369	case SSL_CAMELLIA:
370		switch(c->alg_bits)
371			{
372		case 128: i=SSL_ENC_CAMELLIA128_IDX; break;
373		case 256: i=SSL_ENC_CAMELLIA256_IDX; break;
374		default: i=-1; break;
375			}
376		break;
377
378	default:
379		i= -1;
380		break;
381		}
382
383	if ((i < 0) || (i > SSL_ENC_NUM_IDX))
384		*enc=NULL;
385	else
386		{
387		if (i == SSL_ENC_NULL_IDX)
388			*enc=EVP_enc_null();
389		else
390			*enc=ssl_cipher_methods[i];
391		}
392
393	switch (c->algorithms & SSL_MAC_MASK)
394		{
395	case SSL_MD5:
396		i=SSL_MD_MD5_IDX;
397		break;
398	case SSL_SHA1:
399		i=SSL_MD_SHA1_IDX;
400		break;
401	default:
402		i= -1;
403		break;
404		}
405	if ((i < 0) || (i > SSL_MD_NUM_IDX))
406		*md=NULL;
407	else
408		*md=ssl_digest_methods[i];
409
410	if ((*enc != NULL) && (*md != NULL))
411		return(1);
412	else
413		return(0);
414	}
415
416#define ITEM_SEP(a) \
417	(((a) == ':') || ((a) == ' ') || ((a) == ';') || ((a) == ','))
418
419static void ll_append_tail(CIPHER_ORDER **head, CIPHER_ORDER *curr,
420	     CIPHER_ORDER **tail)
421	{
422	if (curr == *tail) return;
423	if (curr == *head)
424		*head=curr->next;
425	if (curr->prev != NULL)
426		curr->prev->next=curr->next;
427	if (curr->next != NULL) /* should always be true */
428		curr->next->prev=curr->prev;
429	(*tail)->next=curr;
430	curr->prev= *tail;
431	curr->next=NULL;
432	*tail=curr;
433	}
434
435struct disabled_masks { /* This is a kludge no longer needed with OpenSSL 0.9.9,
436                         * where 128-bit and 256-bit algorithms simply will get
437                         * separate bits. */
438  unsigned long mask; /* everything except m256 */
439  unsigned long m256; /* applies to 256-bit algorithms only */
440};
441
442struct disabled_masks ssl_cipher_get_disabled(void)
443	{
444	unsigned long mask;
445	unsigned long m256;
446	struct disabled_masks ret;
447
448	mask = SSL_kFZA;
449#ifdef OPENSSL_NO_RSA
450	mask |= SSL_aRSA|SSL_kRSA;
451#endif
452#ifdef OPENSSL_NO_DSA
453	mask |= SSL_aDSS;
454#endif
455#ifdef OPENSSL_NO_DH
456	mask |= SSL_kDHr|SSL_kDHd|SSL_kEDH|SSL_aDH;
457#endif
458#ifdef OPENSSL_NO_KRB5
459	mask |= SSL_kKRB5|SSL_aKRB5;
460#endif
461#ifdef OPENSSL_NO_ECDH
462	mask |= SSL_kECDH|SSL_kECDHE;
463#endif
464#ifdef SSL_FORBID_ENULL
465	mask |= SSL_eNULL;
466#endif
467
468	mask |= (ssl_cipher_methods[SSL_ENC_DES_IDX ] == NULL) ? SSL_DES :0;
469	mask |= (ssl_cipher_methods[SSL_ENC_3DES_IDX] == NULL) ? SSL_3DES:0;
470	mask |= (ssl_cipher_methods[SSL_ENC_RC4_IDX ] == NULL) ? SSL_RC4 :0;
471	mask |= (ssl_cipher_methods[SSL_ENC_RC2_IDX ] == NULL) ? SSL_RC2 :0;
472	mask |= (ssl_cipher_methods[SSL_ENC_IDEA_IDX] == NULL) ? SSL_IDEA:0;
473	mask |= (ssl_cipher_methods[SSL_ENC_eFZA_IDX] == NULL) ? SSL_eFZA:0;
474
475	mask |= (ssl_digest_methods[SSL_MD_MD5_IDX ] == NULL) ? SSL_MD5 :0;
476	mask |= (ssl_digest_methods[SSL_MD_SHA1_IDX] == NULL) ? SSL_SHA1:0;
477
478	/* finally consider algorithms where mask and m256 differ */
479	m256 = mask;
480	mask |= (ssl_cipher_methods[SSL_ENC_AES128_IDX] == NULL) ? SSL_AES:0;
481	mask |= (ssl_cipher_methods[SSL_ENC_CAMELLIA128_IDX] == NULL) ? SSL_CAMELLIA:0;
482	m256 |= (ssl_cipher_methods[SSL_ENC_AES256_IDX] == NULL) ? SSL_AES:0;
483	m256 |= (ssl_cipher_methods[SSL_ENC_CAMELLIA256_IDX] == NULL) ? SSL_CAMELLIA:0;
484
485	ret.mask = mask;
486	ret.m256 = m256;
487	return ret;
488	}
489
490static void ssl_cipher_collect_ciphers(const SSL_METHOD *ssl_method,
491		int num_of_ciphers, unsigned long mask, unsigned long m256,
492		CIPHER_ORDER *co_list, CIPHER_ORDER **head_p,
493		CIPHER_ORDER **tail_p)
494	{
495	int i, co_list_num;
496	SSL_CIPHER *c;
497
498	/*
499	 * We have num_of_ciphers descriptions compiled in, depending on the
500	 * method selected (SSLv2 and/or SSLv3, TLSv1 etc).
501	 * These will later be sorted in a linked list with at most num
502	 * entries.
503	 */
504
505	/* Get the initial list of ciphers */
506	co_list_num = 0;	/* actual count of ciphers */
507	for (i = 0; i < num_of_ciphers; i++)
508		{
509		c = ssl_method->get_cipher(i);
510#define IS_MASKED(c) ((c)->algorithms & (((c)->alg_bits == 256) ? m256 : mask))
511		/* drop those that use any of that is not available */
512		if ((c != NULL) && c->valid && !IS_MASKED(c))
513			{
514			co_list[co_list_num].cipher = c;
515			co_list[co_list_num].next = NULL;
516			co_list[co_list_num].prev = NULL;
517			co_list[co_list_num].active = 0;
518			co_list_num++;
519#ifdef KSSL_DEBUG
520			printf("\t%d: %s %lx %lx\n",i,c->name,c->id,c->algorithms);
521#endif	/* KSSL_DEBUG */
522			/*
523			if (!sk_push(ca_list,(char *)c)) goto err;
524			*/
525			}
526		}
527
528	/*
529	 * Prepare linked list from list entries
530	 */
531	for (i = 1; i < co_list_num - 1; i++)
532		{
533		co_list[i].prev = &(co_list[i-1]);
534		co_list[i].next = &(co_list[i+1]);
535		}
536	if (co_list_num > 0)
537		{
538		(*head_p) = &(co_list[0]);
539		(*head_p)->prev = NULL;
540		(*head_p)->next = &(co_list[1]);
541		(*tail_p) = &(co_list[co_list_num - 1]);
542		(*tail_p)->prev = &(co_list[co_list_num - 2]);
543		(*tail_p)->next = NULL;
544		}
545	}
546
547static void ssl_cipher_collect_aliases(SSL_CIPHER **ca_list,
548			int num_of_group_aliases, unsigned long mask,
549			CIPHER_ORDER *head)
550	{
551	CIPHER_ORDER *ciph_curr;
552	SSL_CIPHER **ca_curr;
553	int i;
554
555	/*
556	 * First, add the real ciphers as already collected
557	 */
558	ciph_curr = head;
559	ca_curr = ca_list;
560	while (ciph_curr != NULL)
561		{
562		*ca_curr = ciph_curr->cipher;
563		ca_curr++;
564		ciph_curr = ciph_curr->next;
565		}
566
567	/*
568	 * Now we add the available ones from the cipher_aliases[] table.
569	 * They represent either an algorithm, that must be fully
570	 * supported (not match any bit in mask) or represent a cipher
571	 * strength value (will be added in any case because algorithms=0).
572	 */
573	for (i = 0; i < num_of_group_aliases; i++)
574		{
575		if ((i == 0) ||		/* always fetch "ALL" */
576		    !(cipher_aliases[i].algorithms & mask))
577			{
578			*ca_curr = (SSL_CIPHER *)(cipher_aliases + i);
579			ca_curr++;
580			}
581		}
582
583	*ca_curr = NULL;	/* end of list */
584	}
585
586static void ssl_cipher_apply_rule(unsigned long cipher_id, unsigned long ssl_version,
587		unsigned long algorithms, unsigned long mask,
588		unsigned long algo_strength, unsigned long mask_strength,
589		int rule, int strength_bits, CIPHER_ORDER *co_list,
590		CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p)
591	{
592	CIPHER_ORDER *head, *tail, *curr, *curr2, *tail2;
593	SSL_CIPHER *cp;
594	unsigned long ma, ma_s;
595
596#ifdef CIPHER_DEBUG
597	printf("Applying rule %d with %08lx %08lx %08lx %08lx (%d)\n",
598		rule, algorithms, mask, algo_strength, mask_strength,
599		strength_bits);
600#endif
601
602	curr = head = *head_p;
603	curr2 = head;
604	tail2 = tail = *tail_p;
605	for (;;)
606		{
607		if ((curr == NULL) || (curr == tail2)) break;
608		curr = curr2;
609		curr2 = curr->next;
610
611		cp = curr->cipher;
612
613		/* If explicit cipher suite, match only that one for its own protocol version.
614		 * Usual selection criteria will be used for similar ciphersuites from other version! */
615
616		if (cipher_id && (cp->algorithms & SSL_SSL_MASK) == ssl_version)
617			{
618			if (cp->id != cipher_id)
619				continue;
620			}
621
622		/*
623		 * Selection criteria is either the number of strength_bits
624		 * or the algorithm used.
625		 */
626		else if (strength_bits == -1)
627			{
628			ma = mask & cp->algorithms;
629			ma_s = mask_strength & cp->algo_strength;
630
631#ifdef CIPHER_DEBUG
632			printf("\nName: %s:\nAlgo = %08lx Algo_strength = %08lx\nMask = %08lx Mask_strength %08lx\n", cp->name, cp->algorithms, cp->algo_strength, mask, mask_strength);
633			printf("ma = %08lx ma_s %08lx, ma&algo=%08lx, ma_s&algos=%08lx\n", ma, ma_s, ma&algorithms, ma_s&algo_strength);
634#endif
635			/*
636			 * Select: if none of the mask bit was met from the
637			 * cipher or not all of the bits were met, the
638			 * selection does not apply.
639			 */
640			if (((ma == 0) && (ma_s == 0)) ||
641			    ((ma & algorithms) != ma) ||
642			    ((ma_s & algo_strength) != ma_s))
643				continue; /* does not apply */
644			}
645		else if (strength_bits != cp->strength_bits)
646			continue;	/* does not apply */
647
648#ifdef CIPHER_DEBUG
649		printf("Action = %d\n", rule);
650#endif
651
652		/* add the cipher if it has not been added yet. */
653		if (rule == CIPHER_ADD)
654			{
655			if (!curr->active)
656				{
657				int add_this_cipher = 1;
658
659				if (((cp->algorithms & (SSL_kECDHE|SSL_kECDH|SSL_aECDSA)) != 0))
660					{
661					/* Make sure "ECCdraft" ciphersuites are activated only if
662					 * *explicitly* requested, but not implicitly (such as
663					 * as part of the "AES" alias). */
664
665					add_this_cipher = (mask & (SSL_kECDHE|SSL_kECDH|SSL_aECDSA)) != 0 || cipher_id != 0;
666					}
667
668				if (add_this_cipher)
669					{
670					ll_append_tail(&head, curr, &tail);
671					curr->active = 1;
672					}
673				}
674			}
675		/* Move the added cipher to this location */
676		else if (rule == CIPHER_ORD)
677			{
678			if (curr->active)
679				{
680				ll_append_tail(&head, curr, &tail);
681				}
682			}
683		else if	(rule == CIPHER_DEL)
684			curr->active = 0;
685		else if (rule == CIPHER_KILL)
686			{
687			if (head == curr)
688				head = curr->next;
689			else
690				curr->prev->next = curr->next;
691			if (tail == curr)
692				tail = curr->prev;
693			curr->active = 0;
694			if (curr->next != NULL)
695				curr->next->prev = curr->prev;
696			if (curr->prev != NULL)
697				curr->prev->next = curr->next;
698			curr->next = NULL;
699			curr->prev = NULL;
700			}
701		}
702
703	*head_p = head;
704	*tail_p = tail;
705	}
706
707static int ssl_cipher_strength_sort(CIPHER_ORDER *co_list,
708				    CIPHER_ORDER **head_p,
709				    CIPHER_ORDER **tail_p)
710	{
711	int max_strength_bits, i, *number_uses;
712	CIPHER_ORDER *curr;
713
714	/*
715	 * This routine sorts the ciphers with descending strength. The sorting
716	 * must keep the pre-sorted sequence, so we apply the normal sorting
717	 * routine as '+' movement to the end of the list.
718	 */
719	max_strength_bits = 0;
720	curr = *head_p;
721	while (curr != NULL)
722		{
723		if (curr->active &&
724		    (curr->cipher->strength_bits > max_strength_bits))
725		    max_strength_bits = curr->cipher->strength_bits;
726		curr = curr->next;
727		}
728
729	number_uses = OPENSSL_malloc((max_strength_bits + 1) * sizeof(int));
730	if (!number_uses)
731	{
732		SSLerr(SSL_F_SSL_CIPHER_STRENGTH_SORT,ERR_R_MALLOC_FAILURE);
733		return(0);
734	}
735	memset(number_uses, 0, (max_strength_bits + 1) * sizeof(int));
736
737	/*
738	 * Now find the strength_bits values actually used
739	 */
740	curr = *head_p;
741	while (curr != NULL)
742		{
743		if (curr->active)
744			number_uses[curr->cipher->strength_bits]++;
745		curr = curr->next;
746		}
747	/*
748	 * Go through the list of used strength_bits values in descending
749	 * order.
750	 */
751	for (i = max_strength_bits; i >= 0; i--)
752		if (number_uses[i] > 0)
753			ssl_cipher_apply_rule(0, 0, 0, 0, 0, 0, CIPHER_ORD, i,
754					co_list, head_p, tail_p);
755
756	OPENSSL_free(number_uses);
757	return(1);
758	}
759
760static int ssl_cipher_process_rulestr(const char *rule_str,
761		CIPHER_ORDER *co_list, CIPHER_ORDER **head_p,
762		CIPHER_ORDER **tail_p, SSL_CIPHER **ca_list)
763	{
764	unsigned long algorithms, mask, algo_strength, mask_strength;
765	const char *l, *start, *buf;
766	int j, multi, found, rule, retval, ok, buflen;
767	unsigned long cipher_id = 0, ssl_version = 0;
768	char ch;
769
770	retval = 1;
771	l = rule_str;
772	for (;;)
773		{
774		ch = *l;
775
776		if (ch == '\0')
777			break;		/* done */
778		if (ch == '-')
779			{ rule = CIPHER_DEL; l++; }
780		else if (ch == '+')
781			{ rule = CIPHER_ORD; l++; }
782		else if (ch == '!')
783			{ rule = CIPHER_KILL; l++; }
784		else if (ch == '@')
785			{ rule = CIPHER_SPECIAL; l++; }
786		else
787			{ rule = CIPHER_ADD; }
788
789		if (ITEM_SEP(ch))
790			{
791			l++;
792			continue;
793			}
794
795		algorithms = mask = algo_strength = mask_strength = 0;
796
797		start=l;
798		for (;;)
799			{
800			ch = *l;
801			buf = l;
802			buflen = 0;
803#ifndef CHARSET_EBCDIC
804			while (	((ch >= 'A') && (ch <= 'Z')) ||
805				((ch >= '0') && (ch <= '9')) ||
806				((ch >= 'a') && (ch <= 'z')) ||
807				 (ch == '-'))
808#else
809			while (	isalnum(ch) || (ch == '-'))
810#endif
811				 {
812				 ch = *(++l);
813				 buflen++;
814				 }
815
816			if (buflen == 0)
817				{
818				/*
819				 * We hit something we cannot deal with,
820				 * it is no command or separator nor
821				 * alphanumeric, so we call this an error.
822				 */
823				SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
824				       SSL_R_INVALID_COMMAND);
825				retval = found = 0;
826				l++;
827				break;
828				}
829
830			if (rule == CIPHER_SPECIAL)
831				{
832				found = 0; /* unused -- avoid compiler warning */
833				break;	/* special treatment */
834				}
835
836			/* check for multi-part specification */
837			if (ch == '+')
838				{
839				multi=1;
840				l++;
841				}
842			else
843				multi=0;
844
845			/*
846			 * Now search for the cipher alias in the ca_list. Be careful
847			 * with the strncmp, because the "buflen" limitation
848			 * will make the rule "ADH:SOME" and the cipher
849			 * "ADH-MY-CIPHER" look like a match for buflen=3.
850			 * So additionally check whether the cipher name found
851			 * has the correct length. We can save a strlen() call:
852			 * just checking for the '\0' at the right place is
853			 * sufficient, we have to strncmp() anyway. (We cannot
854			 * use strcmp(), because buf is not '\0' terminated.)
855			 */
856			 j = found = 0;
857			 cipher_id = 0;
858			 ssl_version = 0;
859			 while (ca_list[j])
860				{
861				if (!strncmp(buf, ca_list[j]->name, buflen) &&
862				    (ca_list[j]->name[buflen] == '\0'))
863					{
864					found = 1;
865					break;
866					}
867				else
868					j++;
869				}
870			if (!found)
871				break;	/* ignore this entry */
872
873			/* New algorithms:
874			 *  1 - any old restrictions apply outside new mask
875			 *  2 - any new restrictions apply outside old mask
876			 *  3 - enforce old & new where masks intersect
877			 */
878			algorithms = (algorithms & ~ca_list[j]->mask) |		/* 1 */
879			             (ca_list[j]->algorithms & ~mask) |		/* 2 */
880			             (algorithms & ca_list[j]->algorithms);	/* 3 */
881			mask |= ca_list[j]->mask;
882			algo_strength = (algo_strength & ~ca_list[j]->mask_strength) |
883			                (ca_list[j]->algo_strength & ~mask_strength) |
884			                (algo_strength & ca_list[j]->algo_strength);
885			mask_strength |= ca_list[j]->mask_strength;
886
887			/* explicit ciphersuite found */
888			if (ca_list[j]->valid)
889				{
890				cipher_id = ca_list[j]->id;
891				ssl_version = ca_list[j]->algorithms & SSL_SSL_MASK;
892				break;
893				}
894
895			if (!multi) break;
896			}
897
898		/*
899		 * Ok, we have the rule, now apply it
900		 */
901		if (rule == CIPHER_SPECIAL)
902			{	/* special command */
903			ok = 0;
904			if ((buflen == 8) &&
905				!strncmp(buf, "STRENGTH", 8))
906				ok = ssl_cipher_strength_sort(co_list,
907					head_p, tail_p);
908			else
909				SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
910					SSL_R_INVALID_COMMAND);
911			if (ok == 0)
912				retval = 0;
913			/*
914			 * We do not support any "multi" options
915			 * together with "@", so throw away the
916			 * rest of the command, if any left, until
917			 * end or ':' is found.
918			 */
919			while ((*l != '\0') && !ITEM_SEP(*l))
920				l++;
921			}
922		else if (found)
923			{
924			ssl_cipher_apply_rule(cipher_id, ssl_version, algorithms, mask,
925				algo_strength, mask_strength, rule, -1,
926				co_list, head_p, tail_p);
927			}
928		else
929			{
930			while ((*l != '\0') && !ITEM_SEP(*l))
931				l++;
932			}
933		if (*l == '\0') break; /* done */
934		}
935
936	return(retval);
937	}
938
939STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
940		STACK_OF(SSL_CIPHER) **cipher_list,
941		STACK_OF(SSL_CIPHER) **cipher_list_by_id,
942		const char *rule_str)
943	{
944	int ok, num_of_ciphers, num_of_alias_max, num_of_group_aliases;
945	unsigned long disabled_mask;
946	unsigned long disabled_m256;
947	STACK_OF(SSL_CIPHER) *cipherstack, *tmp_cipher_list;
948	const char *rule_p;
949	CIPHER_ORDER *co_list = NULL, *head = NULL, *tail = NULL, *curr;
950	SSL_CIPHER **ca_list = NULL;
951
952	/*
953	 * Return with error if nothing to do.
954	 */
955	if (rule_str == NULL || cipher_list == NULL || cipher_list_by_id == NULL)
956		return NULL;
957
958	/*
959	 * To reduce the work to do we only want to process the compiled
960	 * in algorithms, so we first get the mask of disabled ciphers.
961	 */
962	{
963		struct disabled_masks d;
964		d = ssl_cipher_get_disabled();
965		disabled_mask = d.mask;
966		disabled_m256 = d.m256;
967	}
968
969	/*
970	 * Now we have to collect the available ciphers from the compiled
971	 * in ciphers. We cannot get more than the number compiled in, so
972	 * it is used for allocation.
973	 */
974	num_of_ciphers = ssl_method->num_ciphers();
975#ifdef KSSL_DEBUG
976	printf("ssl_create_cipher_list() for %d ciphers\n", num_of_ciphers);
977#endif    /* KSSL_DEBUG */
978	co_list = (CIPHER_ORDER *)OPENSSL_malloc(sizeof(CIPHER_ORDER) * num_of_ciphers);
979	if (co_list == NULL)
980		{
981		SSLerr(SSL_F_SSL_CREATE_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
982		return(NULL);	/* Failure */
983		}
984
985	ssl_cipher_collect_ciphers(ssl_method, num_of_ciphers, disabled_mask,
986				   disabled_m256, co_list, &head, &tail);
987
988	/*
989	 * We also need cipher aliases for selecting based on the rule_str.
990	 * There might be two types of entries in the rule_str: 1) names
991	 * of ciphers themselves 2) aliases for groups of ciphers.
992	 * For 1) we need the available ciphers and for 2) the cipher
993	 * groups of cipher_aliases added together in one list (otherwise
994	 * we would be happy with just the cipher_aliases table).
995	 */
996	num_of_group_aliases = sizeof(cipher_aliases) / sizeof(SSL_CIPHER);
997	num_of_alias_max = num_of_ciphers + num_of_group_aliases + 1;
998	ca_list =
999		(SSL_CIPHER **)OPENSSL_malloc(sizeof(SSL_CIPHER *) * num_of_alias_max);
1000	if (ca_list == NULL)
1001		{
1002		OPENSSL_free(co_list);
1003		SSLerr(SSL_F_SSL_CREATE_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
1004		return(NULL);	/* Failure */
1005		}
1006	ssl_cipher_collect_aliases(ca_list, num_of_group_aliases,
1007				   (disabled_mask & disabled_m256), head);
1008
1009	/*
1010	 * If the rule_string begins with DEFAULT, apply the default rule
1011	 * before using the (possibly available) additional rules.
1012	 */
1013	ok = 1;
1014	rule_p = rule_str;
1015	if (strncmp(rule_str,"DEFAULT",7) == 0)
1016		{
1017		ok = ssl_cipher_process_rulestr(SSL_DEFAULT_CIPHER_LIST,
1018			co_list, &head, &tail, ca_list);
1019		rule_p += 7;
1020		if (*rule_p == ':')
1021			rule_p++;
1022		}
1023
1024	if (ok && (strlen(rule_p) > 0))
1025		ok = ssl_cipher_process_rulestr(rule_p, co_list, &head, &tail,
1026						ca_list);
1027
1028	OPENSSL_free(ca_list);	/* Not needed anymore */
1029
1030	if (!ok)
1031		{	/* Rule processing failure */
1032		OPENSSL_free(co_list);
1033		return(NULL);
1034		}
1035	/*
1036	 * Allocate new "cipherstack" for the result, return with error
1037	 * if we cannot get one.
1038	 */
1039	if ((cipherstack = sk_SSL_CIPHER_new_null()) == NULL)
1040		{
1041		OPENSSL_free(co_list);
1042		return(NULL);
1043		}
1044
1045	/*
1046	 * The cipher selection for the list is done. The ciphers are added
1047	 * to the resulting precedence to the STACK_OF(SSL_CIPHER).
1048	 */
1049	for (curr = head; curr != NULL; curr = curr->next)
1050		{
1051		if (curr->active)
1052			{
1053			sk_SSL_CIPHER_push(cipherstack, curr->cipher);
1054#ifdef CIPHER_DEBUG
1055			printf("<%s>\n",curr->cipher->name);
1056#endif
1057			}
1058		}
1059	OPENSSL_free(co_list);	/* Not needed any longer */
1060
1061	tmp_cipher_list = sk_SSL_CIPHER_dup(cipherstack);
1062	if (tmp_cipher_list == NULL)
1063		{
1064		sk_SSL_CIPHER_free(cipherstack);
1065		return NULL;
1066		}
1067	if (*cipher_list != NULL)
1068		sk_SSL_CIPHER_free(*cipher_list);
1069	*cipher_list = cipherstack;
1070	if (*cipher_list_by_id != NULL)
1071		sk_SSL_CIPHER_free(*cipher_list_by_id);
1072	*cipher_list_by_id = tmp_cipher_list;
1073	sk_SSL_CIPHER_set_cmp_func(*cipher_list_by_id,ssl_cipher_ptr_id_cmp);
1074
1075	return(cipherstack);
1076	}
1077
1078char *SSL_CIPHER_description(SSL_CIPHER *cipher, char *buf, int len)
1079	{
1080	int is_export,pkl,kl;
1081	const char *ver,*exp_str;
1082	const char *kx,*au,*enc,*mac;
1083	unsigned long alg,alg2,alg_s;
1084#ifdef KSSL_DEBUG
1085	static const char *format="%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s AL=%lx\n";
1086#else
1087	static const char *format="%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s\n";
1088#endif /* KSSL_DEBUG */
1089
1090	alg=cipher->algorithms;
1091	alg_s=cipher->algo_strength;
1092	alg2=cipher->algorithm2;
1093
1094	is_export=SSL_C_IS_EXPORT(cipher);
1095	pkl=SSL_C_EXPORT_PKEYLENGTH(cipher);
1096	kl=SSL_C_EXPORT_KEYLENGTH(cipher);
1097	exp_str=is_export?" export":"";
1098
1099	if (alg & SSL_SSLV2)
1100		ver="SSLv2";
1101	else if (alg & SSL_SSLV3)
1102		ver="SSLv3";
1103	else
1104		ver="unknown";
1105
1106	switch (alg&SSL_MKEY_MASK)
1107		{
1108	case SSL_kRSA:
1109		kx=is_export?(pkl == 512 ? "RSA(512)" : "RSA(1024)"):"RSA";
1110		break;
1111	case SSL_kDHr:
1112		kx="DH/RSA";
1113		break;
1114	case SSL_kDHd:
1115		kx="DH/DSS";
1116		break;
1117        case SSL_kKRB5:         /* VRS */
1118        case SSL_KRB5:          /* VRS */
1119            kx="KRB5";
1120            break;
1121	case SSL_kFZA:
1122		kx="Fortezza";
1123		break;
1124	case SSL_kEDH:
1125		kx=is_export?(pkl == 512 ? "DH(512)" : "DH(1024)"):"DH";
1126		break;
1127	case SSL_kECDH:
1128	case SSL_kECDHE:
1129		kx=is_export?"ECDH(<=163)":"ECDH";
1130		break;
1131	default:
1132		kx="unknown";
1133		}
1134
1135	switch (alg&SSL_AUTH_MASK)
1136		{
1137	case SSL_aRSA:
1138		au="RSA";
1139		break;
1140	case SSL_aDSS:
1141		au="DSS";
1142		break;
1143	case SSL_aDH:
1144		au="DH";
1145		break;
1146        case SSL_aKRB5:         /* VRS */
1147        case SSL_KRB5:          /* VRS */
1148            au="KRB5";
1149            break;
1150	case SSL_aFZA:
1151	case SSL_aNULL:
1152		au="None";
1153		break;
1154	case SSL_aECDSA:
1155		au="ECDSA";
1156		break;
1157	default:
1158		au="unknown";
1159		break;
1160		}
1161
1162	switch (alg&SSL_ENC_MASK)
1163		{
1164	case SSL_DES:
1165		enc=(is_export && kl == 5)?"DES(40)":"DES(56)";
1166		break;
1167	case SSL_3DES:
1168		enc="3DES(168)";
1169		break;
1170	case SSL_RC4:
1171		enc=is_export?(kl == 5 ? "RC4(40)" : "RC4(56)")
1172		  :((alg2&SSL2_CF_8_BYTE_ENC)?"RC4(64)":"RC4(128)");
1173		break;
1174	case SSL_RC2:
1175		enc=is_export?(kl == 5 ? "RC2(40)" : "RC2(56)"):"RC2(128)";
1176		break;
1177	case SSL_IDEA:
1178		enc="IDEA(128)";
1179		break;
1180	case SSL_eFZA:
1181		enc="Fortezza";
1182		break;
1183	case SSL_eNULL:
1184		enc="None";
1185		break;
1186	case SSL_AES:
1187		switch(cipher->strength_bits)
1188			{
1189		case 128: enc="AES(128)"; break;
1190		case 192: enc="AES(192)"; break;
1191		case 256: enc="AES(256)"; break;
1192		default: enc="AES(?""?""?)"; break;
1193			}
1194		break;
1195	case SSL_CAMELLIA:
1196		switch(cipher->strength_bits)
1197			{
1198		case 128: enc="Camellia(128)"; break;
1199		case 256: enc="Camellia(256)"; break;
1200		default: enc="Camellia(?""?""?)"; break;
1201			}
1202		break;
1203
1204	default:
1205		enc="unknown";
1206		break;
1207		}
1208
1209	switch (alg&SSL_MAC_MASK)
1210		{
1211	case SSL_MD5:
1212		mac="MD5";
1213		break;
1214	case SSL_SHA1:
1215		mac="SHA1";
1216		break;
1217	default:
1218		mac="unknown";
1219		break;
1220		}
1221
1222	if (buf == NULL)
1223		{
1224		len=128;
1225		buf=OPENSSL_malloc(len);
1226		if (buf == NULL) return("OPENSSL_malloc Error");
1227		}
1228	else if (len < 128)
1229		return("Buffer too small");
1230
1231#ifdef KSSL_DEBUG
1232	BIO_snprintf(buf,len,format,cipher->name,ver,kx,au,enc,mac,exp_str,alg);
1233#else
1234	BIO_snprintf(buf,len,format,cipher->name,ver,kx,au,enc,mac,exp_str);
1235#endif /* KSSL_DEBUG */
1236	return(buf);
1237	}
1238
1239char *SSL_CIPHER_get_version(const SSL_CIPHER *c)
1240	{
1241	int i;
1242
1243	if (c == NULL) return("(NONE)");
1244	i=(int)(c->id>>24L);
1245	if (i == 3)
1246		return("TLSv1/SSLv3");
1247	else if (i == 2)
1248		return("SSLv2");
1249	else
1250		return("unknown");
1251	}
1252
1253/* return the actual cipher being used */
1254const char *SSL_CIPHER_get_name(const SSL_CIPHER *c)
1255	{
1256	if (c != NULL)
1257		return(c->name);
1258	return("(NONE)");
1259	}
1260
1261/* number of bits for symmetric cipher */
1262int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits)
1263	{
1264	int ret=0;
1265
1266	if (c != NULL)
1267		{
1268		if (alg_bits != NULL) *alg_bits = c->alg_bits;
1269		ret = c->strength_bits;
1270		}
1271	return(ret);
1272	}
1273
1274SSL_COMP *ssl3_comp_find(STACK_OF(SSL_COMP) *sk, int n)
1275	{
1276	SSL_COMP *ctmp;
1277	int i,nn;
1278
1279	if ((n == 0) || (sk == NULL)) return(NULL);
1280	nn=sk_SSL_COMP_num(sk);
1281	for (i=0; i<nn; i++)
1282		{
1283		ctmp=sk_SSL_COMP_value(sk,i);
1284		if (ctmp->id == n)
1285			return(ctmp);
1286		}
1287	return(NULL);
1288	}
1289
1290#ifdef OPENSSL_NO_COMP
1291void *SSL_COMP_get_compression_methods(void)
1292	{
1293	return NULL;
1294	}
1295int SSL_COMP_add_compression_method(int id, void *cm)
1296	{
1297	return 1;
1298	}
1299
1300const char *SSL_COMP_get_name(const void *comp)
1301	{
1302	return NULL;
1303	}
1304#else
1305STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
1306	{
1307	load_builtin_compressions();
1308	return(ssl_comp_methods);
1309	}
1310
1311int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm)
1312	{
1313	SSL_COMP *comp;
1314
1315        if (cm == NULL || cm->type == NID_undef)
1316                return 1;
1317
1318	/* According to draft-ietf-tls-compression-04.txt, the
1319	   compression number ranges should be the following:
1320
1321	   0 to 63:    methods defined by the IETF
1322	   64 to 192:  external party methods assigned by IANA
1323	   193 to 255: reserved for private use */
1324	if (id < 193 || id > 255)
1325		{
1326		SSLerr(SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD,SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE);
1327		return 0;
1328		}
1329
1330	MemCheck_off();
1331	comp=(SSL_COMP *)OPENSSL_malloc(sizeof(SSL_COMP));
1332	comp->id=id;
1333	comp->method=cm;
1334	load_builtin_compressions();
1335	if (ssl_comp_methods
1336		&& !sk_SSL_COMP_find(ssl_comp_methods,comp))
1337		{
1338		OPENSSL_free(comp);
1339		MemCheck_on();
1340		SSLerr(SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD,SSL_R_DUPLICATE_COMPRESSION_ID);
1341		return(1);
1342		}
1343	else if ((ssl_comp_methods == NULL)
1344		|| !sk_SSL_COMP_push(ssl_comp_methods,comp))
1345		{
1346		OPENSSL_free(comp);
1347		MemCheck_on();
1348		SSLerr(SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD,ERR_R_MALLOC_FAILURE);
1349		return(1);
1350		}
1351	else
1352		{
1353		MemCheck_on();
1354		return(0);
1355		}
1356	}
1357
1358const char *SSL_COMP_get_name(const COMP_METHOD *comp)
1359	{
1360	if (comp)
1361		return comp->name;
1362	return NULL;
1363	}
1364
1365#endif
1366