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