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