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