Enable various DTLS extensions.
[openssl.git] / ssl / t1_lib.c
1 /* ssl/t1_lib.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  * 
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  * 
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  * 
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from 
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  * 
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  * 
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 /* ====================================================================
59  * Copyright (c) 1998-2007 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 #include <stdio.h>
113 #include <openssl/objects.h>
114 #include <openssl/evp.h>
115 #include <openssl/hmac.h>
116 #include <openssl/ocsp.h>
117 #include <openssl/rand.h>
118 #include "ssl_locl.h"
119
120 const char tls1_version_str[]="TLSv1" OPENSSL_VERSION_PTEXT;
121
122 #ifndef OPENSSL_NO_TLSEXT
123 static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen,
124                                 const unsigned char *sess_id, int sesslen,
125                                 SSL_SESSION **psess);
126 static int ssl_check_clienthello_tlsext_early(SSL *s);
127 int ssl_check_serverhello_tlsext(SSL *s);
128 #endif
129
130 SSL3_ENC_METHOD TLSv1_enc_data={
131         tls1_enc,
132         tls1_mac,
133         tls1_setup_key_block,
134         tls1_generate_master_secret,
135         tls1_change_cipher_state,
136         tls1_final_finish_mac,
137         TLS1_FINISH_MAC_LENGTH,
138         tls1_cert_verify_mac,
139         TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
140         TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
141         tls1_alert_code,
142         tls1_export_keying_material,
143         0,
144         SSL3_HM_HEADER_LENGTH,
145         ssl3_set_handshake_header,
146         ssl3_handshake_write
147         };
148
149 SSL3_ENC_METHOD TLSv1_1_enc_data={
150         tls1_enc,
151         tls1_mac,
152         tls1_setup_key_block,
153         tls1_generate_master_secret,
154         tls1_change_cipher_state,
155         tls1_final_finish_mac,
156         TLS1_FINISH_MAC_LENGTH,
157         tls1_cert_verify_mac,
158         TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
159         TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
160         tls1_alert_code,
161         tls1_export_keying_material,
162         SSL_ENC_FLAG_EXPLICIT_IV,
163         SSL3_HM_HEADER_LENGTH,
164         ssl3_set_handshake_header,
165         ssl3_handshake_write
166         };
167
168 SSL3_ENC_METHOD TLSv1_2_enc_data={
169         tls1_enc,
170         tls1_mac,
171         tls1_setup_key_block,
172         tls1_generate_master_secret,
173         tls1_change_cipher_state,
174         tls1_final_finish_mac,
175         TLS1_FINISH_MAC_LENGTH,
176         tls1_cert_verify_mac,
177         TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
178         TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
179         tls1_alert_code,
180         tls1_export_keying_material,
181         SSL_ENC_FLAG_EXPLICIT_IV|SSL_ENC_FLAG_SIGALGS|SSL_ENC_FLAG_SHA256_PRF,
182         SSL3_HM_HEADER_LENGTH,
183         ssl3_set_handshake_header,
184         ssl3_handshake_write
185         };
186
187 long tls1_default_timeout(void)
188         {
189         /* 2 hours, the 24 hours mentioned in the TLSv1 spec
190          * is way too long for http, the cache would over fill */
191         return(60*60*2);
192         }
193
194 int tls1_new(SSL *s)
195         {
196         if (!ssl3_new(s)) return(0);
197         s->method->ssl_clear(s);
198         return(1);
199         }
200
201 void tls1_free(SSL *s)
202         {
203 #ifndef OPENSSL_NO_TLSEXT
204         if (s->tlsext_session_ticket)
205                 {
206                 OPENSSL_free(s->tlsext_session_ticket);
207                 }
208 #endif /* OPENSSL_NO_TLSEXT */
209         ssl3_free(s);
210         }
211
212 void tls1_clear(SSL *s)
213         {
214         ssl3_clear(s);
215         s->version = s->method->version;
216         }
217
218 #ifndef OPENSSL_NO_EC
219
220 static int nid_list[] =
221         {
222                 NID_sect163k1, /* sect163k1 (1) */
223                 NID_sect163r1, /* sect163r1 (2) */
224                 NID_sect163r2, /* sect163r2 (3) */
225                 NID_sect193r1, /* sect193r1 (4) */ 
226                 NID_sect193r2, /* sect193r2 (5) */ 
227                 NID_sect233k1, /* sect233k1 (6) */
228                 NID_sect233r1, /* sect233r1 (7) */ 
229                 NID_sect239k1, /* sect239k1 (8) */ 
230                 NID_sect283k1, /* sect283k1 (9) */
231                 NID_sect283r1, /* sect283r1 (10) */ 
232                 NID_sect409k1, /* sect409k1 (11) */ 
233                 NID_sect409r1, /* sect409r1 (12) */
234                 NID_sect571k1, /* sect571k1 (13) */ 
235                 NID_sect571r1, /* sect571r1 (14) */ 
236                 NID_secp160k1, /* secp160k1 (15) */
237                 NID_secp160r1, /* secp160r1 (16) */ 
238                 NID_secp160r2, /* secp160r2 (17) */ 
239                 NID_secp192k1, /* secp192k1 (18) */
240                 NID_X9_62_prime192v1, /* secp192r1 (19) */ 
241                 NID_secp224k1, /* secp224k1 (20) */ 
242                 NID_secp224r1, /* secp224r1 (21) */
243                 NID_secp256k1, /* secp256k1 (22) */ 
244                 NID_X9_62_prime256v1, /* secp256r1 (23) */ 
245                 NID_secp384r1, /* secp384r1 (24) */
246                 NID_secp521r1  /* secp521r1 (25) */     
247         };
248
249
250 static const unsigned char ecformats_default[] = 
251         {
252         TLSEXT_ECPOINTFORMAT_uncompressed,
253         TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime,
254         TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2
255         };
256
257 static const unsigned char eccurves_default[] =
258         {
259                 0,14, /* sect571r1 (14) */ 
260                 0,13, /* sect571k1 (13) */ 
261                 0,25, /* secp521r1 (25) */      
262                 0,11, /* sect409k1 (11) */ 
263                 0,12, /* sect409r1 (12) */
264                 0,24, /* secp384r1 (24) */
265                 0,9,  /* sect283k1 (9) */
266                 0,10, /* sect283r1 (10) */ 
267                 0,22, /* secp256k1 (22) */ 
268                 0,23, /* secp256r1 (23) */ 
269                 0,8,  /* sect239k1 (8) */ 
270                 0,6,  /* sect233k1 (6) */
271                 0,7,  /* sect233r1 (7) */ 
272                 0,20, /* secp224k1 (20) */ 
273                 0,21, /* secp224r1 (21) */
274                 0,4,  /* sect193r1 (4) */ 
275                 0,5,  /* sect193r2 (5) */ 
276                 0,18, /* secp192k1 (18) */
277                 0,19, /* secp192r1 (19) */ 
278                 0,1,  /* sect163k1 (1) */
279                 0,2,  /* sect163r1 (2) */
280                 0,3,  /* sect163r2 (3) */
281                 0,15, /* secp160k1 (15) */
282                 0,16, /* secp160r1 (16) */ 
283                 0,17, /* secp160r2 (17) */ 
284         };
285
286 static const unsigned char suiteb_curves[] =
287         {
288                 0, TLSEXT_curve_P_256,
289                 0, TLSEXT_curve_P_384
290         };
291
292 int tls1_ec_curve_id2nid(int curve_id)
293         {
294         /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
295         if ((curve_id < 1) || ((unsigned int)curve_id >
296                                 sizeof(nid_list)/sizeof(nid_list[0])))
297                 return 0;
298         return nid_list[curve_id-1];
299         }
300
301 int tls1_ec_nid2curve_id(int nid)
302         {
303         /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
304         switch (nid)
305                 {
306         case NID_sect163k1: /* sect163k1 (1) */
307                 return 1;
308         case NID_sect163r1: /* sect163r1 (2) */
309                 return 2;
310         case NID_sect163r2: /* sect163r2 (3) */
311                 return 3;
312         case NID_sect193r1: /* sect193r1 (4) */ 
313                 return 4;
314         case NID_sect193r2: /* sect193r2 (5) */ 
315                 return 5;
316         case NID_sect233k1: /* sect233k1 (6) */
317                 return 6;
318         case NID_sect233r1: /* sect233r1 (7) */ 
319                 return 7;
320         case NID_sect239k1: /* sect239k1 (8) */ 
321                 return 8;
322         case NID_sect283k1: /* sect283k1 (9) */
323                 return 9;
324         case NID_sect283r1: /* sect283r1 (10) */ 
325                 return 10;
326         case NID_sect409k1: /* sect409k1 (11) */ 
327                 return 11;
328         case NID_sect409r1: /* sect409r1 (12) */
329                 return 12;
330         case NID_sect571k1: /* sect571k1 (13) */ 
331                 return 13;
332         case NID_sect571r1: /* sect571r1 (14) */ 
333                 return 14;
334         case NID_secp160k1: /* secp160k1 (15) */
335                 return 15;
336         case NID_secp160r1: /* secp160r1 (16) */ 
337                 return 16;
338         case NID_secp160r2: /* secp160r2 (17) */ 
339                 return 17;
340         case NID_secp192k1: /* secp192k1 (18) */
341                 return 18;
342         case NID_X9_62_prime192v1: /* secp192r1 (19) */ 
343                 return 19;
344         case NID_secp224k1: /* secp224k1 (20) */ 
345                 return 20;
346         case NID_secp224r1: /* secp224r1 (21) */
347                 return 21;
348         case NID_secp256k1: /* secp256k1 (22) */ 
349                 return 22;
350         case NID_X9_62_prime256v1: /* secp256r1 (23) */ 
351                 return 23;
352         case NID_secp384r1: /* secp384r1 (24) */
353                 return 24;
354         case NID_secp521r1:  /* secp521r1 (25) */       
355                 return 25;
356         default:
357                 return 0;
358                 }
359         }
360 /* Get curves list, if "sess" is set return client curves otherwise
361  * preferred list
362  */
363 static void tls1_get_curvelist(SSL *s, int sess,
364                                         const unsigned char **pcurves,
365                                         size_t *pcurveslen)
366         {
367         if (sess)
368                 {
369                 *pcurves = s->session->tlsext_ellipticcurvelist;
370                 *pcurveslen = s->session->tlsext_ellipticcurvelist_length;
371                 return;
372                 }
373         /* For Suite B mode only include P-256, P-384 */
374         switch (tls1_suiteb(s))
375                 {
376         case SSL_CERT_FLAG_SUITEB_128_LOS:
377                 *pcurves = suiteb_curves;
378                 *pcurveslen = sizeof(suiteb_curves);
379                 break;
380
381         case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY:
382                 *pcurves = suiteb_curves;
383                 *pcurveslen = 2;
384                 break;
385
386         case SSL_CERT_FLAG_SUITEB_192_LOS:
387                 *pcurves = suiteb_curves + 2;
388                 *pcurveslen = 2;
389                 break;
390         default:
391                 *pcurves = s->tlsext_ellipticcurvelist;
392                 *pcurveslen = s->tlsext_ellipticcurvelist_length;
393                 }
394         if (!*pcurves)
395                 {
396                 *pcurves = eccurves_default;
397                 *pcurveslen = sizeof(eccurves_default);
398                 }
399         }
400 /* Check a curve is one of our preferences */
401 int tls1_check_curve(SSL *s, const unsigned char *p, size_t len)
402         {
403         const unsigned char *curves;
404         size_t curveslen, i;
405         unsigned int suiteb_flags = tls1_suiteb(s);
406         if (len != 3 || p[0] != NAMED_CURVE_TYPE)
407                 return 0;
408         /* Check curve matches Suite B preferences */
409         if (suiteb_flags)
410                 {
411                 unsigned long cid = s->s3->tmp.new_cipher->id;
412                 if (p[1])
413                         return 0;
414                 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
415                         {
416                         if (p[2] != TLSEXT_curve_P_256)
417                                 return 0;
418                         }
419                 else if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
420                         {
421                         if (p[2] != TLSEXT_curve_P_384)
422                                 return 0;
423                         }
424                 else    /* Should never happen */
425                         return 0;
426                 }
427         tls1_get_curvelist(s, 0, &curves, &curveslen);
428         for (i = 0; i < curveslen; i += 2, curves += 2)
429                 {
430                 if (p[1] == curves[0] && p[2] == curves[1])
431                         return 1;
432                 }
433         return 0;
434         }
435
436 /* Return nth shared curve. If nmatch == -1 return number of
437  * matches. For nmatch == -2 return the NID of the curve to use for
438  * an EC tmp key.
439  */
440
441 int tls1_shared_curve(SSL *s, int nmatch)
442         {
443         const unsigned char *pref, *supp;
444         size_t preflen, supplen, i, j;
445         int k;
446         /* Can't do anything on client side */
447         if (s->server == 0)
448                 return -1;
449         if (nmatch == -2)
450                 {
451                 if (tls1_suiteb(s))
452                         {
453                         /* For Suite B ciphersuite determines curve: we 
454                          * already know these are acceptable due to previous
455                          * checks.
456                          */
457                         unsigned long cid = s->s3->tmp.new_cipher->id;
458                         if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
459                                 return NID_X9_62_prime256v1; /* P-256 */
460                         if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
461                                 return NID_secp384r1; /* P-384 */
462                         /* Should never happen */
463                         return NID_undef;
464                         }
465                 /* If not Suite B just return first preference shared curve */
466                 nmatch = 0;
467                 }
468         tls1_get_curvelist(s, !!(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE),
469                                 &supp, &supplen);
470         tls1_get_curvelist(s, !(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE),
471                                 &pref, &preflen);
472         preflen /= 2;
473         supplen /= 2;
474         k = 0;
475         for (i = 0; i < preflen; i++, pref+=2)
476                 {
477                 const unsigned char *tsupp = supp;
478                 for (j = 0; j < supplen; j++, tsupp+=2)
479                         {
480                         if (pref[0] == tsupp[0] && pref[1] == tsupp[1])
481                                 {
482                                 if (nmatch == k)
483                                         {
484                                         int id = (pref[0] << 8) | pref[1];
485                                         return tls1_ec_curve_id2nid(id);
486                                         }
487                                 k++;
488                                 }
489                         }
490                 }
491         if (nmatch == -1)
492                 return k;
493         return 0;
494         }
495
496 int tls1_set_curves(unsigned char **pext, size_t *pextlen,
497                         int *curves, size_t ncurves)
498         {
499         unsigned char *clist, *p;
500         size_t i;
501         /* Bitmap of curves included to detect duplicates: only works
502          * while curve ids < 32 
503          */
504         unsigned long dup_list = 0;
505         clist = OPENSSL_malloc(ncurves * 2);
506         if (!clist)
507                 return 0;
508         for (i = 0, p = clist; i < ncurves; i++)
509                 {
510                 unsigned long idmask;
511                 int id;
512                 id = tls1_ec_nid2curve_id(curves[i]);
513                 idmask = 1L << id;
514                 if (!id || (dup_list & idmask))
515                         {
516                         OPENSSL_free(clist);
517                         return 0;
518                         }
519                 dup_list |= idmask;
520                 s2n(id, p);
521                 }
522         if (*pext)
523                 OPENSSL_free(*pext);
524         *pext = clist;
525         *pextlen = ncurves * 2;
526         return 1;
527         }
528
529 #define MAX_CURVELIST   25
530
531 typedef struct
532         {
533         size_t nidcnt;
534         int nid_arr[MAX_CURVELIST];
535         } nid_cb_st;
536
537 static int nid_cb(const char *elem, int len, void *arg)
538         {
539         nid_cb_st *narg = arg;
540         size_t i;
541         int nid;
542         char etmp[20];
543         if (narg->nidcnt == MAX_CURVELIST)
544                 return 0;
545         if (len > (int)(sizeof(etmp) - 1))
546                 return 0;
547         memcpy(etmp, elem, len);
548         etmp[len] = 0;
549         nid = EC_curve_nist2nid(etmp);
550         if (nid == NID_undef)
551                 nid = OBJ_sn2nid(etmp);
552         if (nid == NID_undef)
553                 nid = OBJ_ln2nid(etmp);
554         if (nid == NID_undef)
555                 return 0;
556         for (i = 0; i < narg->nidcnt; i++)
557                 if (narg->nid_arr[i] == nid)
558                         return 0;
559         narg->nid_arr[narg->nidcnt++] = nid;
560         return 1;
561         }
562 /* Set curves based on a colon separate list */
563 int tls1_set_curves_list(unsigned char **pext, size_t *pextlen, 
564                                 const char *str)
565         {
566         nid_cb_st ncb;
567         ncb.nidcnt = 0;
568         if (!CONF_parse_list(str, ':', 1, nid_cb, &ncb))
569                 return 0;
570         if (pext == NULL)
571                 return 1;
572         return tls1_set_curves(pext, pextlen, ncb.nid_arr, ncb.nidcnt);
573         }
574 /* For an EC key set TLS id and required compression based on parameters */
575 static int tls1_set_ec_id(unsigned char *curve_id, unsigned char *comp_id,
576                                 EC_KEY *ec)
577         {
578         int is_prime, id;
579         const EC_GROUP *grp;
580         const EC_POINT *pt;
581         const EC_METHOD *meth;
582         if (!ec)
583                 return 0;
584         /* Determine if it is a prime field */
585         grp = EC_KEY_get0_group(ec);
586         pt = EC_KEY_get0_public_key(ec);
587         if (!grp || !pt)
588                 return 0;
589         meth = EC_GROUP_method_of(grp);
590         if (!meth)
591                 return 0;
592         if (EC_METHOD_get_field_type(meth) == NID_X9_62_prime_field)
593                 is_prime = 1;
594         else
595                 is_prime = 0;
596         /* Determine curve ID */
597         id = EC_GROUP_get_curve_name(grp);
598         id = tls1_ec_nid2curve_id(id);
599         /* If we have an ID set it, otherwise set arbitrary explicit curve */
600         if (id)
601                 {
602                 curve_id[0] = 0;
603                 curve_id[1] = (unsigned char)id;
604                 }
605         else
606                 {
607                 curve_id[0] = 0xff;
608                 if (is_prime)
609                         curve_id[1] = 0x01;
610                 else
611                         curve_id[1] = 0x02;
612                 }
613         if (comp_id)
614                 {
615                 if (EC_KEY_get_conv_form(ec) == POINT_CONVERSION_COMPRESSED)
616                         {
617                         if (is_prime)
618                                 *comp_id = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
619                         else
620                                 *comp_id = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
621                         }
622                 else
623                         *comp_id = TLSEXT_ECPOINTFORMAT_uncompressed;
624                 }
625         return 1;
626         }
627 /* Check an EC key is compatible with extensions */
628 static int tls1_check_ec_key(SSL *s,
629                         unsigned char *curve_id, unsigned char *comp_id)
630         {
631         const unsigned char *p;
632         size_t plen, i;
633         int j;
634         /* If point formats extension present check it, otherwise everything
635          * is supported (see RFC4492).
636          */
637         if (comp_id && s->session->tlsext_ecpointformatlist)
638                 {
639                 p = s->session->tlsext_ecpointformatlist;
640                 plen = s->session->tlsext_ecpointformatlist_length;
641                 for (i = 0; i < plen; i++, p++)
642                         {
643                         if (*comp_id == *p)
644                                 break;
645                         }
646                 if (i == plen)
647                         return 0;
648                 }
649         if (!curve_id)
650                 return 1;
651         /* Check curve is consistent with client and server preferences */
652         for (j = 0; j <= 1; j++)
653                 {
654                 tls1_get_curvelist(s, j, &p, &plen);
655                 for (i = 0; i < plen; i+=2, p+=2)
656                         {
657                         if (p[0] == curve_id[0] && p[1] == curve_id[1])
658                                 break;
659                         }
660                 if (i == plen)
661                         return 0;
662                 /* For clients can only check sent curve list */
663                 if (!s->server)
664                         return 1;
665                 }
666         return 1;
667         }
668
669 static void tls1_get_formatlist(SSL *s, const unsigned char **pformats,
670                                         size_t *pformatslen)
671         {
672         /* If we have a custom point format list use it otherwise
673          * use default */
674         if (s->tlsext_ecpointformatlist)
675                 {
676                 *pformats = s->tlsext_ecpointformatlist;
677                 *pformatslen = s->tlsext_ecpointformatlist_length;
678                 }
679         else
680                 {
681                 *pformats = ecformats_default;
682                 /* For Suite B we don't support char2 fields */
683                 if (tls1_suiteb(s))
684                         *pformatslen = sizeof(ecformats_default) - 1;
685                 else
686                         *pformatslen = sizeof(ecformats_default);
687                 }
688         }
689
690 /* Check cert parameters compatible with extensions: currently just checks
691  * EC certificates have compatible curves and compression.
692  */
693 static int tls1_check_cert_param(SSL *s, X509 *x, int set_ee_md)
694         {
695         unsigned char comp_id, curve_id[2];
696         EVP_PKEY *pkey;
697         int rv;
698         pkey = X509_get_pubkey(x);
699         if (!pkey)
700                 return 0;
701         /* If not EC nothing to do */
702         if (pkey->type != EVP_PKEY_EC)
703                 {
704                 EVP_PKEY_free(pkey);
705                 return 1;
706                 }
707         rv = tls1_set_ec_id(curve_id, &comp_id, pkey->pkey.ec);
708         EVP_PKEY_free(pkey);
709         if (!rv)
710                 return 0;
711         /* Can't check curve_id for client certs as we don't have a
712          * supported curves extension.
713          */
714         rv = tls1_check_ec_key(s, s->server ? curve_id : NULL, &comp_id);
715         if (!rv)
716                 return 0;
717         /* Special case for suite B. We *MUST* sign using SHA256+P-256 or
718          * SHA384+P-384, adjust digest if necessary.
719          */
720         if (set_ee_md && tls1_suiteb(s))
721                 {
722                 int check_md;
723                 size_t i;
724                 CERT *c = s->cert;
725                 if (curve_id[0])
726                         return 0;
727                 /* Check to see we have necessary signing algorithm */
728                 if (curve_id[1] == TLSEXT_curve_P_256)
729                         check_md = NID_ecdsa_with_SHA256;
730                 else if (curve_id[1] == TLSEXT_curve_P_384)
731                         check_md = NID_ecdsa_with_SHA384;
732                 else
733                         return 0; /* Should never happen */
734                 for (i = 0; i < c->shared_sigalgslen; i++)
735                         if (check_md == c->shared_sigalgs[i].signandhash_nid)
736                                 break;
737                 if (i == c->shared_sigalgslen)
738                         return 0;
739                 if (set_ee_md == 2)
740                         {
741                         if (check_md == NID_ecdsa_with_SHA256)
742                                 c->pkeys[SSL_PKEY_ECC].digest = EVP_sha256();
743                         else
744                                 c->pkeys[SSL_PKEY_ECC].digest = EVP_sha384();
745                         }
746                 }
747         return rv;
748         }
749 /* Check EC temporary key is compatible with client extensions */
750 int tls1_check_ec_tmp_key(SSL *s, unsigned long cid)
751         {
752         unsigned char curve_id[2];
753         EC_KEY *ec = s->cert->ecdh_tmp;
754 #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
755         /* Allow any curve: not just those peer supports */
756         if (s->cert->cert_flags & SSL_CERT_FLAG_BROKEN_PROTOCOL)
757                 return 1;
758 #endif
759         /* If Suite B, AES128 MUST use P-256 and AES256 MUST use P-384,
760          * no other curves permitted.
761          */
762         if (tls1_suiteb(s))
763                 {
764                 /* Curve to check determined by ciphersuite */
765                 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
766                         curve_id[1] = TLSEXT_curve_P_256;
767                 else if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
768                         curve_id[1] = TLSEXT_curve_P_384;
769                 else
770                         return 0;
771                 curve_id[0] = 0;
772                 /* Check this curve is acceptable */
773                 if (!tls1_check_ec_key(s, curve_id, NULL))
774                         return 0;
775                 /* If auto or setting curve from callback assume OK */
776                 if (s->cert->ecdh_tmp_auto || s->cert->ecdh_tmp_cb)
777                         return 1;
778                 /* Otherwise check curve is acceptable */
779                 else 
780                         {
781                         unsigned char curve_tmp[2];
782                         if (!ec)
783                                 return 0;
784                         if (!tls1_set_ec_id(curve_tmp, NULL, ec))
785                                 return 0;
786                         if (!curve_tmp[0] || curve_tmp[1] == curve_id[1])
787                                 return 1;
788                         return 0;
789                         }
790                         
791                 }
792         if (s->cert->ecdh_tmp_auto)
793                 {
794                 /* Need a shared curve */
795                 if (tls1_shared_curve(s, 0))
796                         return 1;
797                 else return 0;
798                 }
799         if (!ec)
800                 {
801                 if (s->cert->ecdh_tmp_cb)
802                         return 1;
803                 else
804                         return 0;
805                 }
806         if (!tls1_set_ec_id(curve_id, NULL, ec))
807                 return 0;
808 /* Set this to allow use of invalid curves for testing */
809 #if 0
810         return 1;
811 #else
812         return tls1_check_ec_key(s, curve_id, NULL);
813 #endif
814         }
815
816 #else
817
818 static int tls1_check_cert_param(SSL *s, X509 *x, int set_ee_md)
819         {
820         return 1;
821         }
822
823 #endif /* OPENSSL_NO_EC */
824
825 #ifndef OPENSSL_NO_TLSEXT
826
827 /* List of supported signature algorithms and hashes. Should make this
828  * customisable at some point, for now include everything we support.
829  */
830
831 #ifdef OPENSSL_NO_RSA
832 #define tlsext_sigalg_rsa(md) /* */
833 #else
834 #define tlsext_sigalg_rsa(md) md, TLSEXT_signature_rsa,
835 #endif
836
837 #ifdef OPENSSL_NO_DSA
838 #define tlsext_sigalg_dsa(md) /* */
839 #else
840 #define tlsext_sigalg_dsa(md) md, TLSEXT_signature_dsa,
841 #endif
842
843 #ifdef OPENSSL_NO_ECDSA
844 #define tlsext_sigalg_ecdsa(md) /* */
845 #else
846 #define tlsext_sigalg_ecdsa(md) md, TLSEXT_signature_ecdsa,
847 #endif
848
849 #define tlsext_sigalg(md) \
850                 tlsext_sigalg_rsa(md) \
851                 tlsext_sigalg_dsa(md) \
852                 tlsext_sigalg_ecdsa(md)
853
854 static unsigned char tls12_sigalgs[] = {
855 #ifndef OPENSSL_NO_SHA512
856         tlsext_sigalg(TLSEXT_hash_sha512)
857         tlsext_sigalg(TLSEXT_hash_sha384)
858 #endif
859 #ifndef OPENSSL_NO_SHA256
860         tlsext_sigalg(TLSEXT_hash_sha256)
861         tlsext_sigalg(TLSEXT_hash_sha224)
862 #endif
863 #ifndef OPENSSL_NO_SHA
864         tlsext_sigalg(TLSEXT_hash_sha1)
865 #endif
866 #ifndef OPENSSL_NO_MD5
867         tlsext_sigalg_rsa(TLSEXT_hash_md5)
868 #endif
869 };
870 #ifndef OPENSSL_NO_ECDSA
871 static unsigned char suiteb_sigalgs[] = {
872         tlsext_sigalg_ecdsa(TLSEXT_hash_sha256)
873         tlsext_sigalg_ecdsa(TLSEXT_hash_sha384)
874 };
875 #endif
876 size_t tls12_get_psigalgs(SSL *s, const unsigned char **psigs)
877         {
878         /* If Suite B mode use Suite B sigalgs only, ignore any other
879          * preferences.
880          */
881 #ifndef OPENSSL_NO_EC
882         switch (tls1_suiteb(s))
883                 {
884         case SSL_CERT_FLAG_SUITEB_128_LOS:
885                 *psigs = suiteb_sigalgs;
886                 return sizeof(suiteb_sigalgs);
887
888         case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY:
889                 *psigs = suiteb_sigalgs;
890                 return 2;
891
892         case SSL_CERT_FLAG_SUITEB_192_LOS:
893                 *psigs = suiteb_sigalgs + 2;
894                 return 2;
895                 }
896 #endif
897         /* If server use client authentication sigalgs if not NULL */
898         if (s->server && s->cert->client_sigalgs)
899                 {
900                 *psigs = s->cert->client_sigalgs;
901                 return s->cert->client_sigalgslen;
902                 }
903         else if (s->cert->conf_sigalgs)
904                 {
905                 *psigs = s->cert->conf_sigalgs;
906                 return s->cert->conf_sigalgslen;
907                 }
908         else
909                 {
910                 *psigs = tls12_sigalgs;
911 #ifdef OPENSSL_FIPS
912                 /* If FIPS mode don't include MD5 which is last */
913                 if (FIPS_mode())
914                         return sizeof(tls12_sigalgs) - 2;
915                 else
916 #endif
917                         return sizeof(tls12_sigalgs);
918                 }
919         }
920 /* Check signature algorithm is consistent with sent supported signature
921  * algorithms and if so return relevant digest.
922  */
923 int tls12_check_peer_sigalg(const EVP_MD **pmd, SSL *s,
924                                 const unsigned char *sig, EVP_PKEY *pkey)
925         {
926         const unsigned char *sent_sigs;
927         size_t sent_sigslen, i;
928         int sigalg = tls12_get_sigid(pkey);
929         /* Should never happen */
930         if (sigalg == -1)
931                 return -1;
932         /* Check key type is consistent with signature */
933         if (sigalg != (int)sig[1])
934                 {
935                 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,SSL_R_WRONG_SIGNATURE_TYPE);
936                 return 0;
937                 }
938 #ifndef OPENSSL_NO_EC
939         if (pkey->type == EVP_PKEY_EC)
940                 {
941                 unsigned char curve_id[2], comp_id;
942                 /* Check compression and curve matches extensions */
943                 if (!tls1_set_ec_id(curve_id, &comp_id, pkey->pkey.ec))
944                         return 0;
945                 if (!s->server && !tls1_check_ec_key(s, curve_id, &comp_id))
946                         {
947                         SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,SSL_R_WRONG_CURVE);
948                         return 0;
949                         }
950                 /* If Suite B only P-384+SHA384 or P-256+SHA-256 allowed */
951                 if (tls1_suiteb(s))
952                         {
953                         if (curve_id[0])
954                                 return 0;
955                         if (curve_id[1] == TLSEXT_curve_P_256)
956                                 {
957                                 if (sig[0] != TLSEXT_hash_sha256)
958                                         {
959                                         SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,
960                                                 SSL_R_ILLEGAL_SUITEB_DIGEST);
961                                         return 0;
962                                         }
963                                 }
964                         else if (curve_id[1] == TLSEXT_curve_P_384)
965                                 {
966                                 if (sig[0] != TLSEXT_hash_sha384)
967                                         {
968                                         SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,
969                                                 SSL_R_ILLEGAL_SUITEB_DIGEST);
970                                         return 0;
971                                         }
972                                 }
973                         else
974                                 return 0;
975                         }
976                 }
977         else if (tls1_suiteb(s))
978                 return 0;
979 #endif
980
981         /* Check signature matches a type we sent */
982         sent_sigslen = tls12_get_psigalgs(s, &sent_sigs);
983         for (i = 0; i < sent_sigslen; i+=2, sent_sigs+=2)
984                 {
985                 if (sig[0] == sent_sigs[0] && sig[1] == sent_sigs[1])
986                         break;
987                 }
988         /* Allow fallback to SHA1 if not strict mode */
989         if (i == sent_sigslen && (sig[0] != TLSEXT_hash_sha1 || s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT))
990                 {
991                 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,SSL_R_WRONG_SIGNATURE_TYPE);
992                 return 0;
993                 }
994         *pmd = tls12_get_hash(sig[0]);
995         if (*pmd == NULL)
996                 {
997                 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,SSL_R_UNKNOWN_DIGEST);
998                 return 0;
999                 }
1000         /* Store the digest used so applications can retrieve it if they
1001          * wish.
1002          */
1003         if (s->session && s->session->sess_cert)
1004                 s->session->sess_cert->peer_key->digest = *pmd;
1005         return 1;
1006         }
1007 /* Get a mask of disabled algorithms: an algorithm is disabled
1008  * if it isn't supported or doesn't appear in supported signature
1009  * algorithms. Unlike ssl_cipher_get_disabled this applies to a specific
1010  * session and not global settings.
1011  * 
1012  */
1013 void ssl_set_client_disabled(SSL *s)
1014         {
1015         CERT *c = s->cert;
1016         const unsigned char *sigalgs;
1017         size_t i, sigalgslen;
1018         int have_rsa = 0, have_dsa = 0, have_ecdsa = 0;
1019         c->mask_a = 0;
1020         c->mask_k = 0;
1021         /* If less than TLS 1.2 don't allow TLS 1.2 only ciphers */
1022         if (TLS1_get_client_version(s) < TLS1_2_VERSION)
1023                 c->mask_ssl = SSL_TLSV1_2;
1024         else
1025                 c->mask_ssl = 0;
1026         /* Now go through all signature algorithms seeing if we support
1027          * any for RSA, DSA, ECDSA. Do this for all versions not just
1028          * TLS 1.2.
1029          */
1030         sigalgslen = tls12_get_psigalgs(s, &sigalgs);
1031         for (i = 0; i < sigalgslen; i += 2, sigalgs += 2)
1032                 {
1033                 switch(sigalgs[1])
1034                         {
1035 #ifndef OPENSSL_NO_RSA
1036                 case TLSEXT_signature_rsa:
1037                         have_rsa = 1;
1038                         break;
1039 #endif
1040 #ifndef OPENSSL_NO_DSA
1041                 case TLSEXT_signature_dsa:
1042                         have_dsa = 1;
1043                         break;
1044 #endif
1045 #ifndef OPENSSL_NO_ECDSA
1046                 case TLSEXT_signature_ecdsa:
1047                         have_ecdsa = 1;
1048                         break;
1049 #endif
1050                         }
1051                 }
1052         /* Disable auth and static DH if we don't include any appropriate
1053          * signature algorithms.
1054          */
1055         if (!have_rsa)
1056                 {
1057                 c->mask_a |= SSL_aRSA;
1058                 c->mask_k |= SSL_kDHr|SSL_kECDHr;
1059                 }
1060         if (!have_dsa)
1061                 {
1062                 c->mask_a |= SSL_aDSS;
1063                 c->mask_k |= SSL_kDHd;
1064                 }
1065         if (!have_ecdsa)
1066                 {
1067                 c->mask_a |= SSL_aECDSA;
1068                 c->mask_k |= SSL_kECDHe;
1069                 }
1070 #ifndef OPENSSL_NO_KRB5
1071         if (!kssl_tgt_is_available(s->kssl_ctx))
1072                 {
1073                 c->mask_a |= SSL_aKRB5;
1074                 c->mask_k |= SSL_kKRB5;
1075                 }
1076 #endif
1077 #ifndef OPENSSL_NO_PSK
1078         /* with PSK there must be client callback set */
1079         if (!s->psk_client_callback)
1080                 {
1081                 c->mask_a |= SSL_aPSK;
1082                 c->mask_k |= SSL_kPSK;
1083                 }
1084 #endif /* OPENSSL_NO_PSK */
1085         c->valid = 1;
1086         }
1087
1088 /* byte_compare is a compare function for qsort(3) that compares bytes. */
1089 static int byte_compare(const void *in_a, const void *in_b)
1090         {
1091         unsigned char a = *((const unsigned char*) in_a);
1092         unsigned char b = *((const unsigned char*) in_b);
1093
1094         if (a > b)
1095                 return 1;
1096         else if (a < b)
1097                 return -1;
1098         return 0;
1099 }
1100
1101 unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
1102         {
1103         int extdatalen=0;
1104         unsigned char *ret = p;
1105 #ifndef OPENSSL_NO_EC
1106         /* See if we support any ECC ciphersuites */
1107         int using_ecc = 0;
1108         if (s->version >= TLS1_VERSION || SSL_IS_DTLS(s))
1109                 {
1110                 int i;
1111                 unsigned long alg_k, alg_a;
1112                 STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
1113
1114                 for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++)
1115                         {
1116                         SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
1117
1118                         alg_k = c->algorithm_mkey;
1119                         alg_a = c->algorithm_auth;
1120                         if ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)
1121                                 || (alg_a & SSL_aECDSA)))
1122                                 {
1123                                 using_ecc = 1;
1124                                 break;
1125                                 }
1126                         }
1127                 }
1128 #endif
1129
1130         /* don't add extensions for SSLv3 unless doing secure renegotiation */
1131         if (s->client_version == SSL3_VERSION
1132                                         && !s->s3->send_connection_binding)
1133                 return p;
1134
1135         ret+=2;
1136
1137         if (ret>=limit) return NULL; /* this really never occurs, but ... */
1138
1139         if (s->tlsext_hostname != NULL)
1140                 { 
1141                 /* Add TLS extension servername to the Client Hello message */
1142                 unsigned long size_str;
1143                 long lenmax; 
1144
1145                 /* check for enough space.
1146                    4 for the servername type and entension length
1147                    2 for servernamelist length
1148                    1 for the hostname type
1149                    2 for hostname length
1150                    + hostname length 
1151                 */
1152                    
1153                 if ((lenmax = limit - ret - 9) < 0 
1154                     || (size_str = strlen(s->tlsext_hostname)) > (unsigned long)lenmax) 
1155                         return NULL;
1156                         
1157                 /* extension type and length */
1158                 s2n(TLSEXT_TYPE_server_name,ret); 
1159                 s2n(size_str+5,ret);
1160                 
1161                 /* length of servername list */
1162                 s2n(size_str+3,ret);
1163         
1164                 /* hostname type, length and hostname */
1165                 *(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name;
1166                 s2n(size_str,ret);
1167                 memcpy(ret, s->tlsext_hostname, size_str);
1168                 ret+=size_str;
1169                 }
1170
1171         /* Add RI if renegotiating */
1172         if (s->renegotiate)
1173           {
1174           int el;
1175           
1176           if(!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0))
1177               {
1178               SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1179               return NULL;
1180               }
1181
1182           if((limit - p - 4 - el) < 0) return NULL;
1183           
1184           s2n(TLSEXT_TYPE_renegotiate,ret);
1185           s2n(el,ret);
1186
1187           if(!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el))
1188               {
1189               SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1190               return NULL;
1191               }
1192
1193           ret += el;
1194         }
1195
1196 #ifndef OPENSSL_NO_SRP
1197         /* Add SRP username if there is one */
1198         if (s->srp_ctx.login != NULL)
1199                 { /* Add TLS extension SRP username to the Client Hello message */
1200
1201                 int login_len = strlen(s->srp_ctx.login);       
1202                 if (login_len > 255 || login_len == 0)
1203                         {
1204                         SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1205                         return NULL;
1206                         } 
1207
1208                 /* check for enough space.
1209                    4 for the srp type type and entension length
1210                    1 for the srp user identity
1211                    + srp user identity length 
1212                 */
1213                 if ((limit - ret - 5 - login_len) < 0) return NULL; 
1214
1215                 /* fill in the extension */
1216                 s2n(TLSEXT_TYPE_srp,ret);
1217                 s2n(login_len+1,ret);
1218                 (*ret++) = (unsigned char) login_len;
1219                 memcpy(ret, s->srp_ctx.login, login_len);
1220                 ret+=login_len;
1221                 }
1222 #endif
1223
1224 #ifndef OPENSSL_NO_EC
1225         if (using_ecc)
1226                 {
1227                 /* Add TLS extension ECPointFormats to the ClientHello message */
1228                 long lenmax; 
1229                 const unsigned char *plist;
1230                 size_t plistlen;
1231
1232                 tls1_get_formatlist(s, &plist, &plistlen);
1233
1234                 if ((lenmax = limit - ret - 5) < 0) return NULL; 
1235                 if (plistlen > (size_t)lenmax) return NULL;
1236                 if (plistlen > 255)
1237                         {
1238                         SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1239                         return NULL;
1240                         }
1241                 
1242                 s2n(TLSEXT_TYPE_ec_point_formats,ret);
1243                 s2n(plistlen + 1,ret);
1244                 *(ret++) = (unsigned char)plistlen ;
1245                 memcpy(ret, plist, plistlen);
1246                 ret+=plistlen;
1247
1248                 /* Add TLS extension EllipticCurves to the ClientHello message */
1249                 plist = s->tlsext_ellipticcurvelist;
1250                 tls1_get_curvelist(s, 0, &plist, &plistlen);
1251
1252                 if ((lenmax = limit - ret - 6) < 0) return NULL; 
1253                 if (plistlen > (size_t)lenmax) return NULL;
1254                 if (plistlen > 65532)
1255                         {
1256                         SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1257                         return NULL;
1258                         }
1259                 
1260                 s2n(TLSEXT_TYPE_elliptic_curves,ret);
1261                 s2n(plistlen + 2, ret);
1262
1263                 /* NB: draft-ietf-tls-ecc-12.txt uses a one-byte prefix for
1264                  * elliptic_curve_list, but the examples use two bytes.
1265                  * http://www1.ietf.org/mail-archive/web/tls/current/msg00538.html
1266                  * resolves this to two bytes.
1267                  */
1268                 s2n(plistlen, ret);
1269                 memcpy(ret, plist, plistlen);
1270                 ret+=plistlen;
1271                 }
1272 #endif /* OPENSSL_NO_EC */
1273
1274         if (!(SSL_get_options(s) & SSL_OP_NO_TICKET))
1275                 {
1276                 int ticklen;
1277                 if (!s->new_session && s->session && s->session->tlsext_tick)
1278                         ticklen = s->session->tlsext_ticklen;
1279                 else if (s->session && s->tlsext_session_ticket &&
1280                          s->tlsext_session_ticket->data)
1281                         {
1282                         ticklen = s->tlsext_session_ticket->length;
1283                         s->session->tlsext_tick = OPENSSL_malloc(ticklen);
1284                         if (!s->session->tlsext_tick)
1285                                 return NULL;
1286                         memcpy(s->session->tlsext_tick,
1287                                s->tlsext_session_ticket->data,
1288                                ticklen);
1289                         s->session->tlsext_ticklen = ticklen;
1290                         }
1291                 else
1292                         ticklen = 0;
1293                 if (ticklen == 0 && s->tlsext_session_ticket &&
1294                     s->tlsext_session_ticket->data == NULL)
1295                         goto skip_ext;
1296                 /* Check for enough room 2 for extension type, 2 for len
1297                  * rest for ticket
1298                  */
1299                 if ((long)(limit - ret - 4 - ticklen) < 0) return NULL;
1300                 s2n(TLSEXT_TYPE_session_ticket,ret); 
1301                 s2n(ticklen,ret);
1302                 if (ticklen)
1303                         {
1304                         memcpy(ret, s->session->tlsext_tick, ticklen);
1305                         ret += ticklen;
1306                         }
1307                 }
1308                 skip_ext:
1309
1310         if (SSL_USE_SIGALGS(s))
1311                 {
1312                 size_t salglen;
1313                 const unsigned char *salg;
1314                 salglen = tls12_get_psigalgs(s, &salg);
1315                 if ((size_t)(limit - ret) < salglen + 6)
1316                         return NULL; 
1317                 s2n(TLSEXT_TYPE_signature_algorithms,ret);
1318                 s2n(salglen + 2, ret);
1319                 s2n(salglen, ret);
1320                 memcpy(ret, salg, salglen);
1321                 ret += salglen;
1322                 }
1323
1324 #ifdef TLSEXT_TYPE_opaque_prf_input
1325         if (s->s3->client_opaque_prf_input != NULL)
1326                 {
1327                 size_t col = s->s3->client_opaque_prf_input_len;
1328                 
1329                 if ((long)(limit - ret - 6 - col < 0))
1330                         return NULL;
1331                 if (col > 0xFFFD) /* can't happen */
1332                         return NULL;
1333
1334                 s2n(TLSEXT_TYPE_opaque_prf_input, ret); 
1335                 s2n(col + 2, ret);
1336                 s2n(col, ret);
1337                 memcpy(ret, s->s3->client_opaque_prf_input, col);
1338                 ret += col;
1339                 }
1340 #endif
1341
1342         if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
1343                 {
1344                 int i;
1345                 long extlen, idlen, itmp;
1346                 OCSP_RESPID *id;
1347
1348                 idlen = 0;
1349                 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
1350                         {
1351                         id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
1352                         itmp = i2d_OCSP_RESPID(id, NULL);
1353                         if (itmp <= 0)
1354                                 return NULL;
1355                         idlen += itmp + 2;
1356                         }
1357
1358                 if (s->tlsext_ocsp_exts)
1359                         {
1360                         extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
1361                         if (extlen < 0)
1362                                 return NULL;
1363                         }
1364                 else
1365                         extlen = 0;
1366                         
1367                 if ((long)(limit - ret - 7 - extlen - idlen) < 0) return NULL;
1368                 s2n(TLSEXT_TYPE_status_request, ret);
1369                 if (extlen + idlen > 0xFFF0)
1370                         return NULL;
1371                 s2n(extlen + idlen + 5, ret);
1372                 *(ret++) = TLSEXT_STATUSTYPE_ocsp;
1373                 s2n(idlen, ret);
1374                 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
1375                         {
1376                         /* save position of id len */
1377                         unsigned char *q = ret;
1378                         id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
1379                         /* skip over id len */
1380                         ret += 2;
1381                         itmp = i2d_OCSP_RESPID(id, &ret);
1382                         /* write id len */
1383                         s2n(itmp, q);
1384                         }
1385                 s2n(extlen, ret);
1386                 if (extlen > 0)
1387                         i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
1388                 }
1389
1390 #ifndef OPENSSL_NO_HEARTBEATS
1391         /* Add Heartbeat extension */
1392         s2n(TLSEXT_TYPE_heartbeat,ret);
1393         s2n(1,ret);
1394         /* Set mode:
1395          * 1: peer may send requests
1396          * 2: peer not allowed to send requests
1397          */
1398         if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
1399                 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1400         else
1401                 *(ret++) = SSL_TLSEXT_HB_ENABLED;
1402 #endif
1403
1404 #ifndef OPENSSL_NO_NEXTPROTONEG
1405         if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len)
1406                 {
1407                 /* The client advertises an emtpy extension to indicate its
1408                  * support for Next Protocol Negotiation */
1409                 if (limit - ret - 4 < 0)
1410                         return NULL;
1411                 s2n(TLSEXT_TYPE_next_proto_neg,ret);
1412                 s2n(0,ret);
1413                 }
1414 #endif
1415
1416         if(SSL_get_srtp_profiles(s))
1417                 {
1418                 int el;
1419
1420                 ssl_add_clienthello_use_srtp_ext(s, 0, &el, 0);
1421                 
1422                 if((limit - p - 4 - el) < 0) return NULL;
1423
1424                 s2n(TLSEXT_TYPE_use_srtp,ret);
1425                 s2n(el,ret);
1426
1427                 if(ssl_add_clienthello_use_srtp_ext(s, ret, &el, el))
1428                         {
1429                         SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1430                         return NULL;
1431                         }
1432                 ret += el;
1433                 }
1434
1435         /* Add TLS extension Server_Authz_DataFormats to the ClientHello */
1436         /* 2 bytes for extension type */
1437         /* 2 bytes for extension length */
1438         /* 1 byte for the list length */
1439         /* 1 byte for the list (we only support audit proofs) */
1440         if (s->ctx->tlsext_authz_server_audit_proof_cb != NULL)
1441                 {
1442                 const unsigned short ext_len = 2;
1443                 const unsigned char list_len = 1;
1444
1445                 if (limit < ret + 6)
1446                         return NULL;
1447
1448                 s2n(TLSEXT_TYPE_server_authz, ret);
1449                 /* Extension length: 2 bytes */
1450                 s2n(ext_len, ret);
1451                 *(ret++) = list_len;
1452                 *(ret++) = TLSEXT_AUTHZDATAFORMAT_audit_proof;
1453                 }
1454
1455         /* Add custom TLS Extensions to ClientHello */
1456         if (s->ctx->custom_cli_ext_records_count)
1457                 {
1458                 size_t i;
1459                 custom_cli_ext_record* record;
1460
1461                 for (i = 0; i < s->ctx->custom_cli_ext_records_count; i++)
1462                         {
1463                         const unsigned char* out = NULL;
1464                         unsigned short outlen = 0;
1465
1466                         record = &s->ctx->custom_cli_ext_records[i];
1467                         /* NULL callback sends empty extension */ 
1468                         /* -1 from callback omits extension */
1469                         if (record->fn1)
1470                                 {
1471                                 int cb_retval = 0;
1472                                 cb_retval = record->fn1(s, record->ext_type,
1473                                                         &out, &outlen,
1474                                                         record->arg);
1475                                 if (cb_retval == 0)
1476                                         return NULL; /* error */
1477                                 if (cb_retval == -1)
1478                                         continue; /* skip this extension */
1479                                 }
1480                         if (limit < ret + 4 + outlen)
1481                                 return NULL;
1482                         s2n(record->ext_type, ret);
1483                         s2n(outlen, ret);
1484                         memcpy(ret, out, outlen);
1485                         ret += outlen;
1486                         }
1487                 }
1488
1489         if ((extdatalen = ret-p-2) == 0)
1490                 return p;
1491
1492         s2n(extdatalen,p);
1493         return ret;
1494         }
1495
1496 unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
1497         {
1498         int extdatalen=0;
1499         unsigned char *ret = p;
1500 #ifndef OPENSSL_NO_NEXTPROTONEG
1501         int next_proto_neg_seen;
1502 #endif
1503 #ifndef OPENSSL_NO_EC
1504         unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1505         unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1506         int using_ecc = (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA);
1507         using_ecc = using_ecc && (s->session->tlsext_ecpointformatlist != NULL);
1508 #endif
1509         /* don't add extensions for SSLv3, unless doing secure renegotiation */
1510         if (s->version == SSL3_VERSION && !s->s3->send_connection_binding)
1511                 return p;
1512         
1513         ret+=2;
1514         if (ret>=limit) return NULL; /* this really never occurs, but ... */
1515
1516         if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL)
1517                 { 
1518                 if ((long)(limit - ret - 4) < 0) return NULL; 
1519
1520                 s2n(TLSEXT_TYPE_server_name,ret);
1521                 s2n(0,ret);
1522                 }
1523
1524         if(s->s3->send_connection_binding)
1525         {
1526           int el;
1527           
1528           if(!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0))
1529               {
1530               SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1531               return NULL;
1532               }
1533
1534           if((limit - p - 4 - el) < 0) return NULL;
1535           
1536           s2n(TLSEXT_TYPE_renegotiate,ret);
1537           s2n(el,ret);
1538
1539           if(!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el))
1540               {
1541               SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1542               return NULL;
1543               }
1544
1545           ret += el;
1546         }
1547
1548 #ifndef OPENSSL_NO_EC
1549         if (using_ecc)
1550                 {
1551                 const unsigned char *plist;
1552                 size_t plistlen;
1553                 /* Add TLS extension ECPointFormats to the ServerHello message */
1554                 long lenmax; 
1555
1556                 tls1_get_formatlist(s, &plist, &plistlen);
1557
1558                 if ((lenmax = limit - ret - 5) < 0) return NULL; 
1559                 if (plistlen > (size_t)lenmax) return NULL;
1560                 if (plistlen > 255)
1561                         {
1562                         SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1563                         return NULL;
1564                         }
1565                 
1566                 s2n(TLSEXT_TYPE_ec_point_formats,ret);
1567                 s2n(plistlen + 1,ret);
1568                 *(ret++) = (unsigned char) plistlen;
1569                 memcpy(ret, plist, plistlen);
1570                 ret+=plistlen;
1571
1572                 }
1573         /* Currently the server should not respond with a SupportedCurves extension */
1574 #endif /* OPENSSL_NO_EC */
1575
1576         if (s->tlsext_ticket_expected
1577                 && !(SSL_get_options(s) & SSL_OP_NO_TICKET)) 
1578                 { 
1579                 if ((long)(limit - ret - 4) < 0) return NULL; 
1580                 s2n(TLSEXT_TYPE_session_ticket,ret);
1581                 s2n(0,ret);
1582                 }
1583
1584         if (s->tlsext_status_expected)
1585                 { 
1586                 if ((long)(limit - ret - 4) < 0) return NULL; 
1587                 s2n(TLSEXT_TYPE_status_request,ret);
1588                 s2n(0,ret);
1589                 }
1590
1591 #ifdef TLSEXT_TYPE_opaque_prf_input
1592         if (s->s3->server_opaque_prf_input != NULL)
1593                 {
1594                 size_t sol = s->s3->server_opaque_prf_input_len;
1595                 
1596                 if ((long)(limit - ret - 6 - sol) < 0)
1597                         return NULL;
1598                 if (sol > 0xFFFD) /* can't happen */
1599                         return NULL;
1600
1601                 s2n(TLSEXT_TYPE_opaque_prf_input, ret); 
1602                 s2n(sol + 2, ret);
1603                 s2n(sol, ret);
1604                 memcpy(ret, s->s3->server_opaque_prf_input, sol);
1605                 ret += sol;
1606                 }
1607 #endif
1608
1609         if(s->srtp_profile)
1610                 {
1611                 int el;
1612
1613                 ssl_add_serverhello_use_srtp_ext(s, 0, &el, 0);
1614                 
1615                 if((limit - p - 4 - el) < 0) return NULL;
1616
1617                 s2n(TLSEXT_TYPE_use_srtp,ret);
1618                 s2n(el,ret);
1619
1620                 if(ssl_add_serverhello_use_srtp_ext(s, ret, &el, el))
1621                         {
1622                         SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1623                         return NULL;
1624                         }
1625                 ret+=el;
1626                 }
1627
1628         if (((s->s3->tmp.new_cipher->id & 0xFFFF)==0x80 || (s->s3->tmp.new_cipher->id & 0xFFFF)==0x81) 
1629                 && (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG))
1630                 { const unsigned char cryptopro_ext[36] = {
1631                         0xfd, 0xe8, /*65000*/
1632                         0x00, 0x20, /*32 bytes length*/
1633                         0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85, 
1634                         0x03,   0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06, 
1635                         0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08, 
1636                         0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17};
1637                         if (limit-ret<36) return NULL;
1638                         memcpy(ret,cryptopro_ext,36);
1639                         ret+=36;
1640
1641                 }
1642
1643 #ifndef OPENSSL_NO_HEARTBEATS
1644         /* Add Heartbeat extension if we've received one */
1645         if (s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED)
1646                 {
1647                 s2n(TLSEXT_TYPE_heartbeat,ret);
1648                 s2n(1,ret);
1649                 /* Set mode:
1650                  * 1: peer may send requests
1651                  * 2: peer not allowed to send requests
1652                  */
1653                 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
1654                         *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1655                 else
1656                         *(ret++) = SSL_TLSEXT_HB_ENABLED;
1657
1658                 }
1659 #endif
1660
1661 #ifndef OPENSSL_NO_NEXTPROTONEG
1662         next_proto_neg_seen = s->s3->next_proto_neg_seen;
1663         s->s3->next_proto_neg_seen = 0;
1664         if (next_proto_neg_seen && s->ctx->next_protos_advertised_cb)
1665                 {
1666                 const unsigned char *npa;
1667                 unsigned int npalen;
1668                 int r;
1669
1670                 r = s->ctx->next_protos_advertised_cb(s, &npa, &npalen, s->ctx->next_protos_advertised_cb_arg);
1671                 if (r == SSL_TLSEXT_ERR_OK)
1672                         {
1673                         if ((long)(limit - ret - 4 - npalen) < 0) return NULL;
1674                         s2n(TLSEXT_TYPE_next_proto_neg,ret);
1675                         s2n(npalen,ret);
1676                         memcpy(ret, npa, npalen);
1677                         ret += npalen;
1678                         s->s3->next_proto_neg_seen = 1;
1679                         }
1680                 }
1681 #endif
1682
1683         /* If the client supports authz then see whether we have any to offer
1684          * to it. */
1685         if (s->s3->tlsext_authz_client_types_len)
1686                 {
1687                 size_t authz_length;
1688                 /* By now we already know the new cipher, so we can look ahead
1689                  * to see whether the cert we are going to send
1690                  * has any authz data attached to it. */
1691                 const unsigned char* authz = ssl_get_authz_data(s, &authz_length);
1692                 const unsigned char* const orig_authz = authz;
1693                 size_t i;
1694                 unsigned authz_count = 0;
1695
1696                 /* The authz data contains a number of the following structures:
1697                  *      uint8_t authz_type
1698                  *      uint16_t length
1699                  *      uint8_t data[length]
1700                  *
1701                  * First we walk over it to find the number of authz elements. */
1702                 for (i = 0; i < authz_length; i++)
1703                         {
1704                         unsigned short length;
1705                         unsigned char type;
1706
1707                         type = *(authz++);
1708                         if (memchr(s->s3->tlsext_authz_client_types,
1709                                    type,
1710                                    s->s3->tlsext_authz_client_types_len) != NULL)
1711                                 authz_count++;
1712
1713                         n2s(authz, length);
1714                         /* n2s increments authz by 2 */
1715                         i += 2;
1716                         authz += length;
1717                         i += length;
1718                         }
1719
1720                 if (authz_count)
1721                         {
1722                         /* Add TLS extension server_authz to the ServerHello message
1723                          * 2 bytes for extension type
1724                          * 2 bytes for extension length
1725                          * 1 byte for the list length
1726                          * n bytes for the list */
1727                         const unsigned short ext_len = 1 + authz_count;
1728
1729                         if ((long)(limit - ret - 4 - ext_len) < 0) return NULL;
1730                         s2n(TLSEXT_TYPE_server_authz, ret);
1731                         s2n(ext_len, ret);
1732                         *(ret++) = authz_count;
1733                         s->s3->tlsext_authz_promised_to_client = 1;
1734                         }
1735
1736                 authz = orig_authz;
1737                 for (i = 0; i < authz_length; i++)
1738                         {
1739                         unsigned short length;
1740                         unsigned char type;
1741
1742                         authz_count++;
1743                         type = *(authz++);
1744                         if (memchr(s->s3->tlsext_authz_client_types,
1745                                    type,
1746                                    s->s3->tlsext_authz_client_types_len) != NULL)
1747                                 *(ret++) = type;
1748                         n2s(authz, length);
1749                         /* n2s increments authz by 2 */
1750                         i += 2;
1751                         authz += length;
1752                         i += length;
1753                         }
1754                 }
1755
1756         /* If custom types were sent in ClientHello, add ServerHello responses */
1757         if (s->s3->tlsext_custom_types_count)
1758                 {
1759                 size_t i;
1760
1761                 for (i = 0; i < s->s3->tlsext_custom_types_count; i++)
1762                         {
1763                         size_t j;
1764                         custom_srv_ext_record *record;
1765
1766                         for (j = 0; j < s->ctx->custom_srv_ext_records_count; j++)
1767                                 {
1768                                 record = &s->ctx->custom_srv_ext_records[j];
1769                                 if (s->s3->tlsext_custom_types[i] == record->ext_type)
1770                                         {
1771                                         const unsigned char *out = NULL;
1772                                         unsigned short outlen = 0;
1773                                         int cb_retval = 0;
1774
1775                                         /* NULL callback or -1 omits extension */
1776                                         if (!record->fn2)
1777                                                 break;
1778                                         cb_retval = record->fn2(s, record->ext_type,
1779                                                                 &out, &outlen,
1780                                                                 record->arg);
1781                                         if (cb_retval == 0)
1782                                                 return NULL; /* error */
1783                                         if (cb_retval == -1)
1784                                                 break; /* skip this extension */
1785                                         if (limit < ret + 4 + outlen)
1786                                                 return NULL;
1787                                         s2n(record->ext_type, ret);
1788                                         s2n(outlen, ret);
1789                                         memcpy(ret, out, outlen);
1790                                         ret += outlen;
1791                                         break;
1792                                         }
1793                                 }
1794                         }
1795                 }
1796
1797         if ((extdatalen = ret-p-2)== 0) 
1798                 return p;
1799
1800         s2n(extdatalen,p);
1801         return ret;
1802         }
1803
1804 #ifndef OPENSSL_NO_EC
1805 /* ssl_check_for_safari attempts to fingerprint Safari using OS X
1806  * SecureTransport using the TLS extension block in |d|, of length |n|.
1807  * Safari, since 10.6, sends exactly these extensions, in this order:
1808  *   SNI,
1809  *   elliptic_curves
1810  *   ec_point_formats
1811  *
1812  * We wish to fingerprint Safari because they broke ECDHE-ECDSA support in 10.8,
1813  * but they advertise support. So enabling ECDHE-ECDSA ciphers breaks them.
1814  * Sadly we cannot differentiate 10.6, 10.7 and 10.8.4 (which work), from
1815  * 10.8..10.8.3 (which don't work).
1816  */
1817 static void ssl_check_for_safari(SSL *s, const unsigned char *data, const unsigned char *d, int n) {
1818         unsigned short type, size;
1819         static const unsigned char kSafariExtensionsBlock[] = {
1820                 0x00, 0x0a,  /* elliptic_curves extension */
1821                 0x00, 0x08,  /* 8 bytes */
1822                 0x00, 0x06,  /* 6 bytes of curve ids */
1823                 0x00, 0x17,  /* P-256 */
1824                 0x00, 0x18,  /* P-384 */
1825                 0x00, 0x19,  /* P-521 */
1826
1827                 0x00, 0x0b,  /* ec_point_formats */
1828                 0x00, 0x02,  /* 2 bytes */
1829                 0x01,        /* 1 point format */
1830                 0x00,        /* uncompressed */
1831         };
1832
1833         /* The following is only present in TLS 1.2 */
1834         static const unsigned char kSafariTLS12ExtensionsBlock[] = {
1835                 0x00, 0x0d,  /* signature_algorithms */
1836                 0x00, 0x0c,  /* 12 bytes */
1837                 0x00, 0x0a,  /* 10 bytes */
1838                 0x05, 0x01,  /* SHA-384/RSA */
1839                 0x04, 0x01,  /* SHA-256/RSA */
1840                 0x02, 0x01,  /* SHA-1/RSA */
1841                 0x04, 0x03,  /* SHA-256/ECDSA */
1842                 0x02, 0x03,  /* SHA-1/ECDSA */
1843         };
1844
1845         if (data >= (d+n-2))
1846                 return;
1847         data += 2;
1848
1849         if (data > (d+n-4))
1850                 return;
1851         n2s(data,type);
1852         n2s(data,size);
1853
1854         if (type != TLSEXT_TYPE_server_name)
1855                 return;
1856
1857         if (data+size > d+n)
1858                 return;
1859         data += size;
1860
1861         if (TLS1_get_client_version(s) >= TLS1_2_VERSION)
1862                 {
1863                 const size_t len1 = sizeof(kSafariExtensionsBlock);
1864                 const size_t len2 = sizeof(kSafariTLS12ExtensionsBlock);
1865
1866                 if (data + len1 + len2 != d+n)
1867                         return;
1868                 if (memcmp(data, kSafariExtensionsBlock, len1) != 0)
1869                         return;
1870                 if (memcmp(data + len1, kSafariTLS12ExtensionsBlock, len2) != 0)
1871                         return;
1872                 }
1873         else
1874                 {
1875                 const size_t len = sizeof(kSafariExtensionsBlock);
1876
1877                 if (data + len != d+n)
1878                         return;
1879                 if (memcmp(data, kSafariExtensionsBlock, len) != 0)
1880                         return;
1881                 }
1882
1883         s->s3->is_probably_safari = 1;
1884 }
1885 #endif /* !OPENSSL_NO_EC */
1886
1887 static int ssl_scan_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al) 
1888         {       
1889         unsigned short type;
1890         unsigned short size;
1891         unsigned short len;
1892         unsigned char *data = *p;
1893         int renegotiate_seen = 0;
1894         size_t i;
1895
1896         s->servername_done = 0;
1897         s->tlsext_status_type = -1;
1898 #ifndef OPENSSL_NO_NEXTPROTONEG
1899         s->s3->next_proto_neg_seen = 0;
1900 #endif
1901
1902         /* Clear observed custom extensions */
1903         s->s3->tlsext_custom_types_count = 0;
1904         if (s->s3->tlsext_custom_types != NULL)
1905                 {
1906                 OPENSSL_free(s->s3->tlsext_custom_types);
1907                 s->s3->tlsext_custom_types = NULL;
1908                 }               
1909
1910 #ifndef OPENSSL_NO_HEARTBEATS
1911         s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
1912                                SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
1913 #endif
1914
1915 #ifndef OPENSSL_NO_EC
1916         if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
1917                 ssl_check_for_safari(s, data, d, n);
1918 #endif /* !OPENSSL_NO_EC */
1919
1920         /* Clear any signature algorithms extension received */
1921         if (s->cert->peer_sigalgs)
1922                 {
1923                 OPENSSL_free(s->cert->peer_sigalgs);
1924                 s->cert->peer_sigalgs = NULL;
1925                 }
1926         /* Clear any shared sigtnature algorithms */
1927         if (s->cert->shared_sigalgs)
1928                 {
1929                 OPENSSL_free(s->cert->shared_sigalgs);
1930                 s->cert->shared_sigalgs = NULL;
1931                 }
1932         /* Clear certificate digests and validity flags */
1933         for (i = 0; i < SSL_PKEY_NUM; i++)
1934                 {
1935                 s->cert->pkeys[i].digest = NULL;
1936                 s->cert->pkeys[i].valid_flags = 0;
1937                 }
1938
1939         if (data >= (d+n-2))
1940                 goto ri_check;
1941         n2s(data,len);
1942
1943         if (data > (d+n-len)) 
1944                 goto ri_check;
1945
1946         while (data <= (d+n-4))
1947                 {
1948                 n2s(data,type);
1949                 n2s(data,size);
1950
1951                 if (data+size > (d+n))
1952                         goto ri_check;
1953 #if 0
1954                 fprintf(stderr,"Received extension type %d size %d\n",type,size);
1955 #endif
1956                 if (s->tlsext_debug_cb)
1957                         s->tlsext_debug_cb(s, 0, type, data, size,
1958                                                 s->tlsext_debug_arg);
1959 /* The servername extension is treated as follows:
1960
1961    - Only the hostname type is supported with a maximum length of 255.
1962    - The servername is rejected if too long or if it contains zeros,
1963      in which case an fatal alert is generated.
1964    - The servername field is maintained together with the session cache.
1965    - When a session is resumed, the servername call back invoked in order
1966      to allow the application to position itself to the right context. 
1967    - The servername is acknowledged if it is new for a session or when 
1968      it is identical to a previously used for the same session. 
1969      Applications can control the behaviour.  They can at any time
1970      set a 'desirable' servername for a new SSL object. This can be the
1971      case for example with HTTPS when a Host: header field is received and
1972      a renegotiation is requested. In this case, a possible servername
1973      presented in the new client hello is only acknowledged if it matches
1974      the value of the Host: field. 
1975    - Applications must  use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
1976      if they provide for changing an explicit servername context for the session,
1977      i.e. when the session has been established with a servername extension. 
1978    - On session reconnect, the servername extension may be absent. 
1979
1980 */      
1981
1982                 if (type == TLSEXT_TYPE_server_name)
1983                         {
1984                         unsigned char *sdata;
1985                         int servname_type;
1986                         int dsize; 
1987                 
1988                         if (size < 2) 
1989                                 {
1990                                 *al = SSL_AD_DECODE_ERROR;
1991                                 return 0;
1992                                 }
1993                         n2s(data,dsize);  
1994                         size -= 2;
1995                         if (dsize > size  ) 
1996                                 {
1997                                 *al = SSL_AD_DECODE_ERROR;
1998                                 return 0;
1999                                 } 
2000
2001                         sdata = data;
2002                         while (dsize > 3) 
2003                                 {
2004                                 servname_type = *(sdata++); 
2005                                 n2s(sdata,len);
2006                                 dsize -= 3;
2007
2008                                 if (len > dsize) 
2009                                         {
2010                                         *al = SSL_AD_DECODE_ERROR;
2011                                         return 0;
2012                                         }
2013                                 if (s->servername_done == 0)
2014                                 switch (servname_type)
2015                                         {
2016                                 case TLSEXT_NAMETYPE_host_name:
2017                                         if (!s->hit)
2018                                                 {
2019                                                 if(s->session->tlsext_hostname)
2020                                                         {
2021                                                         *al = SSL_AD_DECODE_ERROR;
2022                                                         return 0;
2023                                                         }
2024                                                 if (len > TLSEXT_MAXLEN_host_name)
2025                                                         {
2026                                                         *al = TLS1_AD_UNRECOGNIZED_NAME;
2027                                                         return 0;
2028                                                         }
2029                                                 if ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL)
2030                                                         {
2031                                                         *al = TLS1_AD_INTERNAL_ERROR;
2032                                                         return 0;
2033                                                         }
2034                                                 memcpy(s->session->tlsext_hostname, sdata, len);
2035                                                 s->session->tlsext_hostname[len]='\0';
2036                                                 if (strlen(s->session->tlsext_hostname) != len) {
2037                                                         OPENSSL_free(s->session->tlsext_hostname);
2038                                                         s->session->tlsext_hostname = NULL;
2039                                                         *al = TLS1_AD_UNRECOGNIZED_NAME;
2040                                                         return 0;
2041                                                 }
2042                                                 s->servername_done = 1; 
2043
2044                                                 }
2045                                         else 
2046                                                 s->servername_done = s->session->tlsext_hostname
2047                                                         && strlen(s->session->tlsext_hostname) == len 
2048                                                         && strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
2049                                         
2050                                         break;
2051
2052                                 default:
2053                                         break;
2054                                         }
2055                                  
2056                                 dsize -= len;
2057                                 }
2058                         if (dsize != 0) 
2059                                 {
2060                                 *al = SSL_AD_DECODE_ERROR;
2061                                 return 0;
2062                                 }
2063
2064                         }
2065 #ifndef OPENSSL_NO_SRP
2066                 else if (type == TLSEXT_TYPE_srp)
2067                         {
2068                         if (size <= 0 || ((len = data[0])) != (size -1))
2069                                 {
2070                                 *al = SSL_AD_DECODE_ERROR;
2071                                 return 0;
2072                                 }
2073                         if (s->srp_ctx.login != NULL)
2074                                 {
2075                                 *al = SSL_AD_DECODE_ERROR;
2076                                 return 0;
2077                                 }
2078                         if ((s->srp_ctx.login = OPENSSL_malloc(len+1)) == NULL)
2079                                 return -1;
2080                         memcpy(s->srp_ctx.login, &data[1], len);
2081                         s->srp_ctx.login[len]='\0';
2082   
2083                         if (strlen(s->srp_ctx.login) != len) 
2084                                 {
2085                                 *al = SSL_AD_DECODE_ERROR;
2086                                 return 0;
2087                                 }
2088                         }
2089 #endif
2090
2091 #ifndef OPENSSL_NO_EC
2092                 else if (type == TLSEXT_TYPE_ec_point_formats)
2093                         {
2094                         unsigned char *sdata = data;
2095                         int ecpointformatlist_length = *(sdata++);
2096
2097                         if (ecpointformatlist_length != size - 1 || 
2098                                 ecpointformatlist_length < 1)
2099                                 {
2100                                 *al = TLS1_AD_DECODE_ERROR;
2101                                 return 0;
2102                                 }
2103                         if (!s->hit)
2104                                 {
2105                                 if(s->session->tlsext_ecpointformatlist)
2106                                         {
2107                                         OPENSSL_free(s->session->tlsext_ecpointformatlist);
2108                                         s->session->tlsext_ecpointformatlist = NULL;
2109                                         }
2110                                 s->session->tlsext_ecpointformatlist_length = 0;
2111                                 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
2112                                         {
2113                                         *al = TLS1_AD_INTERNAL_ERROR;
2114                                         return 0;
2115                                         }
2116                                 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
2117                                 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
2118                                 }
2119 #if 0
2120                         fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ecpointformatlist (length=%i) ", s->session->tlsext_ecpointformatlist_length);
2121                         sdata = s->session->tlsext_ecpointformatlist;
2122                         for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
2123                                 fprintf(stderr,"%i ",*(sdata++));
2124                         fprintf(stderr,"\n");
2125 #endif
2126                         }
2127                 else if (type == TLSEXT_TYPE_elliptic_curves)
2128                         {
2129                         unsigned char *sdata = data;
2130                         int ellipticcurvelist_length = (*(sdata++) << 8);
2131                         ellipticcurvelist_length += (*(sdata++));
2132
2133                         if (ellipticcurvelist_length != size - 2 ||
2134                                 ellipticcurvelist_length < 1)
2135                                 {
2136                                 *al = TLS1_AD_DECODE_ERROR;
2137                                 return 0;
2138                                 }
2139                         if (!s->hit)
2140                                 {
2141                                 if(s->session->tlsext_ellipticcurvelist)
2142                                         {
2143                                         *al = TLS1_AD_DECODE_ERROR;
2144                                         return 0;
2145                                         }
2146                                 s->session->tlsext_ellipticcurvelist_length = 0;
2147                                 if ((s->session->tlsext_ellipticcurvelist = OPENSSL_malloc(ellipticcurvelist_length)) == NULL)
2148                                         {
2149                                         *al = TLS1_AD_INTERNAL_ERROR;
2150                                         return 0;
2151                                         }
2152                                 s->session->tlsext_ellipticcurvelist_length = ellipticcurvelist_length;
2153                                 memcpy(s->session->tlsext_ellipticcurvelist, sdata, ellipticcurvelist_length);
2154                                 }
2155 #if 0
2156                         fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ellipticcurvelist (length=%i) ", s->session->tlsext_ellipticcurvelist_length);
2157                         sdata = s->session->tlsext_ellipticcurvelist;
2158                         for (i = 0; i < s->session->tlsext_ellipticcurvelist_length; i++)
2159                                 fprintf(stderr,"%i ",*(sdata++));
2160                         fprintf(stderr,"\n");
2161 #endif
2162                         }
2163 #endif /* OPENSSL_NO_EC */
2164 #ifdef TLSEXT_TYPE_opaque_prf_input
2165                 else if (type == TLSEXT_TYPE_opaque_prf_input)
2166                         {
2167                         unsigned char *sdata = data;
2168
2169                         if (size < 2)
2170                                 {
2171                                 *al = SSL_AD_DECODE_ERROR;
2172                                 return 0;
2173                                 }
2174                         n2s(sdata, s->s3->client_opaque_prf_input_len);
2175                         if (s->s3->client_opaque_prf_input_len != size - 2)
2176                                 {
2177                                 *al = SSL_AD_DECODE_ERROR;
2178                                 return 0;
2179                                 }
2180
2181                         if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
2182                                 OPENSSL_free(s->s3->client_opaque_prf_input);
2183                         if (s->s3->client_opaque_prf_input_len == 0)
2184                                 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
2185                         else
2186                                 s->s3->client_opaque_prf_input = BUF_memdup(sdata, s->s3->client_opaque_prf_input_len);
2187                         if (s->s3->client_opaque_prf_input == NULL)
2188                                 {
2189                                 *al = TLS1_AD_INTERNAL_ERROR;
2190                                 return 0;
2191                                 }
2192                         }
2193 #endif
2194                 else if (type == TLSEXT_TYPE_session_ticket)
2195                         {
2196                         if (s->tls_session_ticket_ext_cb &&
2197                             !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
2198                                 {
2199                                 *al = TLS1_AD_INTERNAL_ERROR;
2200                                 return 0;
2201                                 }
2202                         }
2203                 else if (type == TLSEXT_TYPE_renegotiate)
2204                         {
2205                         if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
2206                                 return 0;
2207                         renegotiate_seen = 1;
2208                         }
2209                 else if (type == TLSEXT_TYPE_signature_algorithms)
2210                         {
2211                         int dsize;
2212                         if (s->cert->peer_sigalgs || size < 2) 
2213                                 {
2214                                 *al = SSL_AD_DECODE_ERROR;
2215                                 return 0;
2216                                 }
2217                         n2s(data,dsize);
2218                         size -= 2;
2219                         if (dsize != size || dsize & 1 || !dsize) 
2220                                 {
2221                                 *al = SSL_AD_DECODE_ERROR;
2222                                 return 0;
2223                                 }
2224                         if (!tls1_process_sigalgs(s, data, dsize))
2225                                 {
2226                                 *al = SSL_AD_DECODE_ERROR;
2227                                 return 0;
2228                                 }
2229                         /* If sigalgs received and no shared algorithms fatal
2230                          * error.
2231                          */
2232                         if (s->cert->peer_sigalgs && !s->cert->shared_sigalgs)
2233                                 {
2234                                 SSLerr(SSL_F_SSL_SCAN_CLIENTHELLO_TLSEXT,
2235                                         SSL_R_NO_SHARED_SIGATURE_ALGORITHMS);
2236                                 *al = SSL_AD_ILLEGAL_PARAMETER;
2237                                 return 0;
2238                                 }
2239                         }
2240                 else if (type == TLSEXT_TYPE_status_request
2241                          && s->ctx->tlsext_status_cb)
2242                         {
2243                 
2244                         if (size < 5) 
2245                                 {
2246                                 *al = SSL_AD_DECODE_ERROR;
2247                                 return 0;
2248                                 }
2249
2250                         s->tlsext_status_type = *data++;
2251                         size--;
2252                         if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
2253                                 {
2254                                 const unsigned char *sdata;
2255                                 int dsize;
2256                                 /* Read in responder_id_list */
2257                                 n2s(data,dsize);
2258                                 size -= 2;
2259                                 if (dsize > size  ) 
2260                                         {
2261                                         *al = SSL_AD_DECODE_ERROR;
2262                                         return 0;
2263                                         }
2264                                 while (dsize > 0)
2265                                         {
2266                                         OCSP_RESPID *id;
2267                                         int idsize;
2268                                         if (dsize < 4)
2269                                                 {
2270                                                 *al = SSL_AD_DECODE_ERROR;
2271                                                 return 0;
2272                                                 }
2273                                         n2s(data, idsize);
2274                                         dsize -= 2 + idsize;
2275                                         size -= 2 + idsize;
2276                                         if (dsize < 0)
2277                                                 {
2278                                                 *al = SSL_AD_DECODE_ERROR;
2279                                                 return 0;
2280                                                 }
2281                                         sdata = data;
2282                                         data += idsize;
2283                                         id = d2i_OCSP_RESPID(NULL,
2284                                                                 &sdata, idsize);
2285                                         if (!id)
2286                                                 {
2287                                                 *al = SSL_AD_DECODE_ERROR;
2288                                                 return 0;
2289                                                 }
2290                                         if (data != sdata)
2291                                                 {
2292                                                 OCSP_RESPID_free(id);
2293                                                 *al = SSL_AD_DECODE_ERROR;
2294                                                 return 0;
2295                                                 }
2296                                         if (!s->tlsext_ocsp_ids
2297                                                 && !(s->tlsext_ocsp_ids =
2298                                                 sk_OCSP_RESPID_new_null()))
2299                                                 {
2300                                                 OCSP_RESPID_free(id);
2301                                                 *al = SSL_AD_INTERNAL_ERROR;
2302                                                 return 0;
2303                                                 }
2304                                         if (!sk_OCSP_RESPID_push(
2305                                                         s->tlsext_ocsp_ids, id))
2306                                                 {
2307                                                 OCSP_RESPID_free(id);
2308                                                 *al = SSL_AD_INTERNAL_ERROR;
2309                                                 return 0;
2310                                                 }
2311                                         }
2312
2313                                 /* Read in request_extensions */
2314                                 if (size < 2)
2315                                         {
2316                                         *al = SSL_AD_DECODE_ERROR;
2317                                         return 0;
2318                                         }
2319                                 n2s(data,dsize);
2320                                 size -= 2;
2321                                 if (dsize != size)
2322                                         {
2323                                         *al = SSL_AD_DECODE_ERROR;
2324                                         return 0;
2325                                         }
2326                                 sdata = data;
2327                                 if (dsize > 0)
2328                                         {
2329                                         if (s->tlsext_ocsp_exts)
2330                                                 {
2331                                                 sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
2332                                                                            X509_EXTENSION_free);
2333                                                 }
2334
2335                                         s->tlsext_ocsp_exts =
2336                                                 d2i_X509_EXTENSIONS(NULL,
2337                                                         &sdata, dsize);
2338                                         if (!s->tlsext_ocsp_exts
2339                                                 || (data + dsize != sdata))
2340                                                 {
2341                                                 *al = SSL_AD_DECODE_ERROR;
2342                                                 return 0;
2343                                                 }
2344                                         }
2345                                 }
2346                                 /* We don't know what to do with any other type
2347                                 * so ignore it.
2348                                 */
2349                                 else
2350                                         s->tlsext_status_type = -1;
2351                         }
2352 #ifndef OPENSSL_NO_HEARTBEATS
2353                 else if (type == TLSEXT_TYPE_heartbeat)
2354                         {
2355                         switch(data[0])
2356                                 {
2357                                 case 0x01:      /* Client allows us to send HB requests */
2358                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
2359                                                         break;
2360                                 case 0x02:      /* Client doesn't accept HB requests */
2361                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
2362                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
2363                                                         break;
2364                                 default:        *al = SSL_AD_ILLEGAL_PARAMETER;
2365                                                         return 0;
2366                                 }
2367                         }
2368 #endif
2369 #ifndef OPENSSL_NO_NEXTPROTONEG
2370                 else if (type == TLSEXT_TYPE_next_proto_neg &&
2371                          s->s3->tmp.finish_md_len == 0)
2372                         {
2373                         /* We shouldn't accept this extension on a
2374                          * renegotiation.
2375                          *
2376                          * s->new_session will be set on renegotiation, but we
2377                          * probably shouldn't rely that it couldn't be set on
2378                          * the initial renegotation too in certain cases (when
2379                          * there's some other reason to disallow resuming an
2380                          * earlier session -- the current code won't be doing
2381                          * anything like that, but this might change).
2382
2383                          * A valid sign that there's been a previous handshake
2384                          * in this connection is if s->s3->tmp.finish_md_len >
2385                          * 0.  (We are talking about a check that will happen
2386                          * in the Hello protocol round, well before a new
2387                          * Finished message could have been computed.) */
2388                         s->s3->next_proto_neg_seen = 1;
2389                         }
2390 #endif
2391
2392                 /* session ticket processed earlier */
2393                 else if (type == TLSEXT_TYPE_use_srtp)
2394                         {
2395                         if(ssl_parse_clienthello_use_srtp_ext(s, data, size,
2396                                                               al))
2397                                 return 0;
2398                         }
2399
2400                 else if (type == TLSEXT_TYPE_server_authz)
2401                         {
2402                         unsigned char *sdata = data;
2403                         unsigned char server_authz_dataformatlist_length;
2404
2405                         if (size == 0)
2406                                 {
2407                                 *al = TLS1_AD_DECODE_ERROR;
2408                                 return 0;
2409                                 }
2410
2411                         server_authz_dataformatlist_length = *(sdata++);
2412
2413                         if (server_authz_dataformatlist_length != size - 1)
2414                                 {
2415                                 *al = TLS1_AD_DECODE_ERROR;
2416                                 return 0;
2417                                 }
2418
2419                         /* Successful session resumption uses the same authz
2420                          * information as the original session so we ignore this
2421                          * in the case of a session resumption. */
2422                         if (!s->hit)
2423                                 {
2424                                 if (s->s3->tlsext_authz_client_types != NULL)
2425                                         OPENSSL_free(s->s3->tlsext_authz_client_types);
2426                                 s->s3->tlsext_authz_client_types =
2427                                         OPENSSL_malloc(server_authz_dataformatlist_length);
2428                                 if (!s->s3->tlsext_authz_client_types)
2429                                         {
2430                                         *al = TLS1_AD_INTERNAL_ERROR;
2431                                         return 0;
2432                                         }
2433
2434                                 s->s3->tlsext_authz_client_types_len =
2435                                         server_authz_dataformatlist_length;
2436                                 memcpy(s->s3->tlsext_authz_client_types,
2437                                        sdata,
2438                                        server_authz_dataformatlist_length);
2439
2440                                 /* Sort the types in order to check for duplicates. */
2441                                 qsort(s->s3->tlsext_authz_client_types,
2442                                       server_authz_dataformatlist_length,
2443                                       1 /* element size */,
2444                                       byte_compare);
2445
2446                                 for (i = 0; i < server_authz_dataformatlist_length; i++)
2447                                         {
2448                                         if (i > 0 &&
2449                                             s->s3->tlsext_authz_client_types[i] ==
2450                                               s->s3->tlsext_authz_client_types[i-1])
2451                                                 {
2452                                                 *al = TLS1_AD_DECODE_ERROR;
2453                                                 return 0;
2454                                                 }
2455                                         }
2456                                 }
2457                         }
2458
2459                 /* If this ClientHello extension was unhandled and this is 
2460                  * a nonresumed connection, check whether the extension is a 
2461                  * custom TLS Extension (has a custom_srv_ext_record), and if
2462                  * so call the callback and record the extension number so that
2463                  * an appropriate ServerHello may be later returned.
2464                  */
2465                 else if (!s->hit && s->ctx->custom_srv_ext_records_count)
2466                         {
2467                         custom_srv_ext_record *record;
2468
2469                         for (i=0; i < s->ctx->custom_srv_ext_records_count; i++)
2470                                 {
2471                                 record = &s->ctx->custom_srv_ext_records[i];
2472                                 if (type == record->ext_type)
2473                                         {
2474                                         size_t j;
2475
2476                                         /* Error on duplicate TLS Extensions */
2477                                         for (j = 0; j < s->s3->tlsext_custom_types_count; j++)
2478                                                 {
2479                                                 if (type == s->s3->tlsext_custom_types[j])
2480                                                         {
2481                                                         *al = TLS1_AD_DECODE_ERROR;
2482                                                         return 0;
2483                                                         }
2484                                                 }
2485
2486                                         /* NULL callback still notes the extension */ 
2487                                         if (record->fn1 && !record->fn1(s, type, data, size, al, record->arg))
2488                                                 return 0;
2489                                                 
2490                                         /* Add the (non-duplicated) entry */
2491                                         s->s3->tlsext_custom_types_count++;
2492                                         s->s3->tlsext_custom_types = OPENSSL_realloc(
2493                                                         s->s3->tlsext_custom_types,
2494                                                         s->s3->tlsext_custom_types_count * 2);
2495                                         if (s->s3->tlsext_custom_types == NULL)
2496                                                 {
2497                                                 s->s3->tlsext_custom_types = 0;
2498                                                 *al = TLS1_AD_INTERNAL_ERROR;
2499                                                 return 0;
2500                                                 }
2501                                         s->s3->tlsext_custom_types[
2502                                                         s->s3->tlsext_custom_types_count - 1] = type;
2503                                         }                                               
2504                                 }
2505                         }
2506
2507                 data+=size;
2508                 }
2509
2510         *p = data;
2511
2512         ri_check:
2513
2514         /* Need RI if renegotiating */
2515
2516         if (!renegotiate_seen && s->renegotiate &&
2517                 !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
2518                 {
2519                 *al = SSL_AD_HANDSHAKE_FAILURE;
2520                 SSLerr(SSL_F_SSL_SCAN_CLIENTHELLO_TLSEXT,
2521                                 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
2522                 return 0;
2523                 }
2524         /* If no signature algorithms extension set default values */
2525         if (!s->cert->peer_sigalgs)
2526                 ssl_cert_set_default_md(s->cert);
2527
2528         return 1;
2529         }
2530
2531 int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n) 
2532         {
2533         int al = -1;
2534         if (ssl_scan_clienthello_tlsext(s, p, d, n, &al) <= 0) 
2535                 {
2536                 ssl3_send_alert(s,SSL3_AL_FATAL,al); 
2537                 return 0;
2538                 }
2539
2540         if (ssl_check_clienthello_tlsext_early(s) <= 0) 
2541                 {
2542                 SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,SSL_R_CLIENTHELLO_TLSEXT);
2543                 return 0;
2544                 }
2545         return 1;
2546 }
2547
2548 #ifndef OPENSSL_NO_NEXTPROTONEG
2549 /* ssl_next_proto_validate validates a Next Protocol Negotiation block. No
2550  * elements of zero length are allowed and the set of elements must exactly fill
2551  * the length of the block. */
2552 static char ssl_next_proto_validate(unsigned char *d, unsigned len)
2553         {
2554         unsigned int off = 0;
2555
2556         while (off < len)
2557                 {
2558                 if (d[off] == 0)
2559                         return 0;
2560                 off += d[off];
2561                 off++;
2562                 }
2563
2564         return off == len;
2565         }
2566 #endif
2567
2568 static int ssl_scan_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
2569         {
2570         unsigned short length;
2571         unsigned short type;
2572         unsigned short size;
2573         unsigned char *data = *p;
2574         int tlsext_servername = 0;
2575         int renegotiate_seen = 0;
2576
2577 #ifndef OPENSSL_NO_NEXTPROTONEG
2578         s->s3->next_proto_neg_seen = 0;
2579 #endif
2580
2581 #ifndef OPENSSL_NO_HEARTBEATS
2582         s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
2583                                SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
2584 #endif
2585
2586         if (data >= (d+n-2))
2587                 goto ri_check;
2588
2589         n2s(data,length);
2590         if (data+length != d+n)
2591                 {
2592                 *al = SSL_AD_DECODE_ERROR;
2593                 return 0;
2594                 }
2595
2596         while(data <= (d+n-4))
2597                 {
2598                 n2s(data,type);
2599                 n2s(data,size);
2600
2601                 if (data+size > (d+n))
2602                         goto ri_check;
2603
2604                 if (s->tlsext_debug_cb)
2605                         s->tlsext_debug_cb(s, 1, type, data, size,
2606                                                 s->tlsext_debug_arg);
2607
2608                 if (type == TLSEXT_TYPE_server_name)
2609                         {
2610                         if (s->tlsext_hostname == NULL || size > 0)
2611                                 {
2612                                 *al = TLS1_AD_UNRECOGNIZED_NAME;
2613                                 return 0;
2614                                 }
2615                         tlsext_servername = 1;   
2616                         }
2617
2618 #ifndef OPENSSL_NO_EC
2619                 else if (type == TLSEXT_TYPE_ec_point_formats)
2620                         {
2621                         unsigned char *sdata = data;
2622                         int ecpointformatlist_length = *(sdata++);
2623
2624                         if (ecpointformatlist_length != size - 1)
2625                                 {
2626                                 *al = TLS1_AD_DECODE_ERROR;
2627                                 return 0;
2628                                 }
2629                         s->session->tlsext_ecpointformatlist_length = 0;
2630                         if (s->session->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->session->tlsext_ecpointformatlist);
2631                         if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
2632                                 {
2633                                 *al = TLS1_AD_INTERNAL_ERROR;
2634                                 return 0;
2635                                 }
2636                         s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
2637                         memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
2638 #if 0
2639                         fprintf(stderr,"ssl_parse_serverhello_tlsext s->session->tlsext_ecpointformatlist ");
2640                         sdata = s->session->tlsext_ecpointformatlist;
2641                         for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
2642                                 fprintf(stderr,"%i ",*(sdata++));
2643                         fprintf(stderr,"\n");
2644 #endif
2645                         }
2646 #endif /* OPENSSL_NO_EC */
2647
2648                 else if (type == TLSEXT_TYPE_session_ticket)
2649                         {
2650                         if (s->tls_session_ticket_ext_cb &&
2651                             !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
2652                                 {
2653                                 *al = TLS1_AD_INTERNAL_ERROR;
2654                                 return 0;
2655                                 }
2656                         if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
2657                                 || (size > 0))
2658                                 {
2659                                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
2660                                 return 0;
2661                                 }
2662                         s->tlsext_ticket_expected = 1;
2663                         }
2664 #ifdef TLSEXT_TYPE_opaque_prf_input
2665                 else if (type == TLSEXT_TYPE_opaque_prf_input)
2666                         {
2667                         unsigned char *sdata = data;
2668
2669                         if (size < 2)
2670                                 {
2671                                 *al = SSL_AD_DECODE_ERROR;
2672                                 return 0;
2673                                 }
2674                         n2s(sdata, s->s3->server_opaque_prf_input_len);
2675                         if (s->s3->server_opaque_prf_input_len != size - 2)
2676                                 {
2677                                 *al = SSL_AD_DECODE_ERROR;
2678                                 return 0;
2679                                 }
2680                         
2681                         if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
2682                                 OPENSSL_free(s->s3->server_opaque_prf_input);
2683                         if (s->s3->server_opaque_prf_input_len == 0)
2684                                 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
2685                         else
2686                                 s->s3->server_opaque_prf_input = BUF_memdup(sdata, s->s3->server_opaque_prf_input_len);
2687
2688                         if (s->s3->server_opaque_prf_input == NULL)
2689                                 {
2690                                 *al = TLS1_AD_INTERNAL_ERROR;
2691                                 return 0;
2692                                 }
2693                         }
2694 #endif
2695                 else if (type == TLSEXT_TYPE_status_request)
2696                         {
2697                         /* MUST be empty and only sent if we've requested
2698                          * a status request message.
2699                          */ 
2700                         if ((s->tlsext_status_type == -1) || (size > 0))
2701                                 {
2702                                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
2703                                 return 0;
2704                                 }
2705                         /* Set flag to expect CertificateStatus message */
2706                         s->tlsext_status_expected = 1;
2707                         }
2708 #ifndef OPENSSL_NO_NEXTPROTONEG
2709                 else if (type == TLSEXT_TYPE_next_proto_neg &&
2710                          s->s3->tmp.finish_md_len == 0)
2711                         {
2712                         unsigned char *selected;
2713                         unsigned char selected_len;
2714
2715                         /* We must have requested it. */
2716                         if (s->ctx->next_proto_select_cb == NULL)
2717                                 {
2718                                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
2719                                 return 0;
2720                                 }
2721                         /* The data must be valid */
2722                         if (!ssl_next_proto_validate(data, size))
2723                                 {
2724                                 *al = TLS1_AD_DECODE_ERROR;
2725                                 return 0;
2726                                 }
2727                         if (s->ctx->next_proto_select_cb(s, &selected, &selected_len, data, size, s->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK)
2728                                 {
2729                                 *al = TLS1_AD_INTERNAL_ERROR;
2730                                 return 0;
2731                                 }
2732                         s->next_proto_negotiated = OPENSSL_malloc(selected_len);
2733                         if (!s->next_proto_negotiated)
2734                                 {
2735                                 *al = TLS1_AD_INTERNAL_ERROR;
2736                                 return 0;
2737                                 }
2738                         memcpy(s->next_proto_negotiated, selected, selected_len);
2739                         s->next_proto_negotiated_len = selected_len;
2740                         s->s3->next_proto_neg_seen = 1;
2741                         }
2742 #endif
2743                 else if (type == TLSEXT_TYPE_renegotiate)
2744                         {
2745                         if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
2746                                 return 0;
2747                         renegotiate_seen = 1;
2748                         }
2749 #ifndef OPENSSL_NO_HEARTBEATS
2750                 else if (type == TLSEXT_TYPE_heartbeat)
2751                         {
2752                         switch(data[0])
2753                                 {
2754                                 case 0x01:      /* Server allows us to send HB requests */
2755                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
2756                                                         break;
2757                                 case 0x02:      /* Server doesn't accept HB requests */
2758                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
2759                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
2760                                                         break;
2761                                 default:        *al = SSL_AD_ILLEGAL_PARAMETER;
2762                                                         return 0;
2763                                 }
2764                         }
2765 #endif
2766                 else if (type == TLSEXT_TYPE_use_srtp)
2767                         {
2768                         if(ssl_parse_serverhello_use_srtp_ext(s, data, size,
2769                                                               al))
2770                                 return 0;
2771                         }
2772
2773                 else if (type == TLSEXT_TYPE_server_authz)
2774                         {
2775                         /* We only support audit proofs. It's an error to send
2776                          * an authz hello extension if the client
2777                          * didn't request a proof. */
2778                         unsigned char *sdata = data;
2779                         unsigned char server_authz_dataformatlist_length;
2780
2781                         if (!s->ctx->tlsext_authz_server_audit_proof_cb)
2782                                 {
2783                                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
2784                                 return 0;
2785                                 }
2786
2787                         if (!size)
2788                                 {
2789                                 *al = TLS1_AD_DECODE_ERROR;
2790                                 return 0;
2791                                 }
2792
2793                         server_authz_dataformatlist_length = *(sdata++);
2794                         if (server_authz_dataformatlist_length != size - 1)
2795                                 {
2796                                 *al = TLS1_AD_DECODE_ERROR;
2797                                 return 0;
2798                                 }
2799
2800                         /* We only support audit proofs, so a legal ServerHello
2801                          * authz list contains exactly one entry. */
2802                         if (server_authz_dataformatlist_length != 1 ||
2803                                 sdata[0] != TLSEXT_AUTHZDATAFORMAT_audit_proof)
2804                                 {
2805                                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
2806                                 return 0;
2807                                 }
2808
2809                         s->s3->tlsext_authz_server_promised = 1;
2810                         }
2811
2812                 /* If this extension type was not otherwise handled, but 
2813                  * matches a custom_cli_ext_record, then send it to the c
2814                  * callback */
2815                 else if (s->ctx->custom_cli_ext_records_count)
2816                         {
2817                         size_t i;
2818                         custom_cli_ext_record* record;
2819
2820                         for (i = 0; i < s->ctx->custom_cli_ext_records_count; i++)
2821                                 {
2822                                 record = &s->ctx->custom_cli_ext_records[i];
2823                                 if (record->ext_type == type)
2824                                         {
2825                                         if (record->fn2 && !record->fn2(s, type, data, size, al, record->arg))
2826                                                 return 0;
2827                                         break;
2828                                         }
2829                                 }                       
2830                         }
2831  
2832                 data += size;
2833                 }
2834
2835         if (data != d+n)
2836                 {
2837                 *al = SSL_AD_DECODE_ERROR;
2838                 return 0;
2839                 }
2840
2841         if (!s->hit && tlsext_servername == 1)
2842                 {
2843                 if (s->tlsext_hostname)
2844                         {
2845                         if (s->session->tlsext_hostname == NULL)
2846                                 {
2847                                 s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);   
2848                                 if (!s->session->tlsext_hostname)
2849                                         {
2850                                         *al = SSL_AD_UNRECOGNIZED_NAME;
2851                                         return 0;
2852                                         }
2853                                 }
2854                         else 
2855                                 {
2856                                 *al = SSL_AD_DECODE_ERROR;
2857                                 return 0;
2858                                 }
2859                         }
2860                 }
2861
2862         *p = data;
2863
2864         ri_check:
2865
2866         /* Determine if we need to see RI. Strictly speaking if we want to
2867          * avoid an attack we should *always* see RI even on initial server
2868          * hello because the client doesn't see any renegotiation during an
2869          * attack. However this would mean we could not connect to any server
2870          * which doesn't support RI so for the immediate future tolerate RI
2871          * absence on initial connect only.
2872          */
2873         if (!renegotiate_seen
2874                 && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
2875                 && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
2876                 {
2877                 *al = SSL_AD_HANDSHAKE_FAILURE;
2878                 SSLerr(SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT,
2879                                 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
2880                 return 0;
2881                 }
2882
2883         return 1;
2884         }
2885
2886
2887 int ssl_prepare_clienthello_tlsext(SSL *s)
2888         {
2889
2890 #ifdef TLSEXT_TYPE_opaque_prf_input
2891         {
2892                 int r = 1;
2893         
2894                 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
2895                         {
2896                         r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
2897                         if (!r)
2898                                 return -1;
2899                         }
2900
2901                 if (s->tlsext_opaque_prf_input != NULL)
2902                         {
2903                         if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
2904                                 OPENSSL_free(s->s3->client_opaque_prf_input);
2905
2906                         if (s->tlsext_opaque_prf_input_len == 0)
2907                                 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
2908                         else
2909                                 s->s3->client_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
2910                         if (s->s3->client_opaque_prf_input == NULL)
2911                                 {
2912                                 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
2913                                 return -1;
2914                                 }
2915                         s->s3->client_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
2916                         }
2917
2918                 if (r == 2)
2919                         /* at callback's request, insist on receiving an appropriate server opaque PRF input */
2920                         s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
2921         }
2922 #endif
2923
2924         return 1;
2925         }
2926
2927 int ssl_prepare_serverhello_tlsext(SSL *s)
2928         {
2929         return 1;
2930         }
2931
2932 static int ssl_check_clienthello_tlsext_early(SSL *s)
2933         {
2934         int ret=SSL_TLSEXT_ERR_NOACK;
2935         int al = SSL_AD_UNRECOGNIZED_NAME;
2936
2937 #ifndef OPENSSL_NO_EC
2938         /* The handling of the ECPointFormats extension is done elsewhere, namely in 
2939          * ssl3_choose_cipher in s3_lib.c.
2940          */
2941         /* The handling of the EllipticCurves extension is done elsewhere, namely in 
2942          * ssl3_choose_cipher in s3_lib.c.
2943          */
2944 #endif
2945
2946         if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0) 
2947                 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
2948         else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)             
2949                 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
2950
2951 #ifdef TLSEXT_TYPE_opaque_prf_input
2952         {
2953                 /* This sort of belongs into ssl_prepare_serverhello_tlsext(),
2954                  * but we might be sending an alert in response to the client hello,
2955                  * so this has to happen here in
2956                  * ssl_check_clienthello_tlsext_early(). */
2957
2958                 int r = 1;
2959         
2960                 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
2961                         {
2962                         r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
2963                         if (!r)
2964                                 {
2965                                 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2966                                 al = SSL_AD_INTERNAL_ERROR;
2967                                 goto err;
2968                                 }
2969                         }
2970
2971                 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
2972                         OPENSSL_free(s->s3->server_opaque_prf_input);
2973                 s->s3->server_opaque_prf_input = NULL;
2974
2975                 if (s->tlsext_opaque_prf_input != NULL)
2976                         {
2977                         if (s->s3->client_opaque_prf_input != NULL &&
2978                                 s->s3->client_opaque_prf_input_len == s->tlsext_opaque_prf_input_len)
2979                                 {
2980                                 /* can only use this extension if we have a server opaque PRF input
2981                                  * of the same length as the client opaque PRF input! */
2982
2983                                 if (s->tlsext_opaque_prf_input_len == 0)
2984                                         s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
2985                                 else
2986                                         s->s3->server_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
2987                                 if (s->s3->server_opaque_prf_input == NULL)
2988                                         {
2989                                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2990                                         al = SSL_AD_INTERNAL_ERROR;
2991                                         goto err;
2992                                         }
2993                                 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
2994                                 }
2995                         }
2996
2997                 if (r == 2 && s->s3->server_opaque_prf_input == NULL)
2998                         {
2999                         /* The callback wants to enforce use of the extension,
3000                          * but we can't do that with the client opaque PRF input;
3001                          * abort the handshake.
3002                          */
3003                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3004                         al = SSL_AD_HANDSHAKE_FAILURE;
3005                         }
3006         }
3007
3008  err:
3009 #endif
3010         switch (ret)
3011                 {
3012                 case SSL_TLSEXT_ERR_ALERT_FATAL:
3013                         ssl3_send_alert(s,SSL3_AL_FATAL,al); 
3014                         return -1;
3015
3016                 case SSL_TLSEXT_ERR_ALERT_WARNING:
3017                         ssl3_send_alert(s,SSL3_AL_WARNING,al);
3018                         return 1; 
3019                                         
3020                 case SSL_TLSEXT_ERR_NOACK:
3021                         s->servername_done=0;
3022                         default:
3023                 return 1;
3024                 }
3025         }
3026
3027 int ssl_check_clienthello_tlsext_late(SSL *s)
3028         {
3029         int ret = SSL_TLSEXT_ERR_OK;
3030         int al;
3031
3032         /* If status request then ask callback what to do.
3033          * Note: this must be called after servername callbacks in case
3034          * the certificate has changed, and must be called after the cipher
3035          * has been chosen because this may influence which certificate is sent
3036          */
3037         if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb)
3038                 {
3039                 int r;
3040                 CERT_PKEY *certpkey;
3041                 certpkey = ssl_get_server_send_pkey(s);
3042                 /* If no certificate can't return certificate status */
3043                 if (certpkey == NULL)
3044                         {
3045                         s->tlsext_status_expected = 0;
3046                         return 1;
3047                         }
3048                 /* Set current certificate to one we will use so
3049                  * SSL_get_certificate et al can pick it up.
3050                  */
3051                 s->cert->key = certpkey;
3052                 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
3053                 switch (r)
3054                         {
3055                         /* We don't want to send a status request response */
3056                         case SSL_TLSEXT_ERR_NOACK:
3057                                 s->tlsext_status_expected = 0;
3058                                 break;
3059                         /* status request response should be sent */
3060                         case SSL_TLSEXT_ERR_OK:
3061                                 if (s->tlsext_ocsp_resp)
3062                                         s->tlsext_status_expected = 1;
3063                                 else
3064                                         s->tlsext_status_expected = 0;
3065                                 break;
3066                         /* something bad happened */
3067                         case SSL_TLSEXT_ERR_ALERT_FATAL:
3068                                 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3069                                 al = SSL_AD_INTERNAL_ERROR;
3070                                 goto err;
3071                         }
3072                 }
3073         else
3074                 s->tlsext_status_expected = 0;
3075
3076  err:
3077         switch (ret)
3078                 {
3079                 case SSL_TLSEXT_ERR_ALERT_FATAL:
3080                         ssl3_send_alert(s, SSL3_AL_FATAL, al);
3081                         return -1;
3082
3083                 case SSL_TLSEXT_ERR_ALERT_WARNING:
3084                         ssl3_send_alert(s, SSL3_AL_WARNING, al);
3085                         return 1; 
3086
3087                 default:
3088                         return 1;
3089                 }
3090         }
3091
3092 int ssl_check_serverhello_tlsext(SSL *s)
3093         {
3094         int ret=SSL_TLSEXT_ERR_NOACK;
3095         int al = SSL_AD_UNRECOGNIZED_NAME;
3096
3097 #ifndef OPENSSL_NO_EC
3098         /* If we are client and using an elliptic curve cryptography cipher
3099          * suite, then if server returns an EC point formats lists extension
3100          * it must contain uncompressed.
3101          */
3102         unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
3103         unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
3104         if ((s->tlsext_ecpointformatlist != NULL) && (s->tlsext_ecpointformatlist_length > 0) && 
3105             (s->session->tlsext_ecpointformatlist != NULL) && (s->session->tlsext_ecpointformatlist_length > 0) && 
3106             ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA)))
3107                 {
3108                 /* we are using an ECC cipher */
3109                 size_t i;
3110                 unsigned char *list;
3111                 int found_uncompressed = 0;
3112                 list = s->session->tlsext_ecpointformatlist;
3113                 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
3114                         {
3115                         if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed)
3116                                 {
3117                                 found_uncompressed = 1;
3118                                 break;
3119                                 }
3120                         }
3121                 if (!found_uncompressed)
3122                         {
3123                         SSLerr(SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT,SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
3124                         return -1;
3125                         }
3126                 }
3127         ret = SSL_TLSEXT_ERR_OK;
3128 #endif /* OPENSSL_NO_EC */
3129
3130         if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0) 
3131                 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
3132         else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)             
3133                 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
3134
3135 #ifdef TLSEXT_TYPE_opaque_prf_input
3136         if (s->s3->server_opaque_prf_input_len > 0)
3137                 {
3138                 /* This case may indicate that we, as a client, want to insist on using opaque PRF inputs.
3139                  * So first verify that we really have a value from the server too. */
3140
3141                 if (s->s3->server_opaque_prf_input == NULL)
3142                         {
3143                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3144                         al = SSL_AD_HANDSHAKE_FAILURE;
3145                         }
3146                 
3147                 /* Anytime the server *has* sent an opaque PRF input, we need to check
3148                  * that we have a client opaque PRF input of the same size. */
3149                 if (s->s3->client_opaque_prf_input == NULL ||
3150                     s->s3->client_opaque_prf_input_len != s->s3->server_opaque_prf_input_len)
3151                         {
3152                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3153                         al = SSL_AD_ILLEGAL_PARAMETER;
3154                         }
3155                 }
3156 #endif
3157
3158         /* If we've requested certificate status and we wont get one
3159          * tell the callback
3160          */
3161         if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
3162                         && s->ctx && s->ctx->tlsext_status_cb)
3163                 {
3164                 int r;
3165                 /* Set resp to NULL, resplen to -1 so callback knows
3166                  * there is no response.
3167                  */
3168                 if (s->tlsext_ocsp_resp)
3169                         {
3170                         OPENSSL_free(s->tlsext_ocsp_resp);
3171                         s->tlsext_ocsp_resp = NULL;
3172                         }
3173                 s->tlsext_ocsp_resplen = -1;
3174                 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
3175                 if (r == 0)
3176                         {
3177                         al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
3178                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3179                         }
3180                 if (r < 0)
3181                         {
3182                         al = SSL_AD_INTERNAL_ERROR;
3183                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3184                         }
3185                 }
3186
3187         switch (ret)
3188                 {
3189                 case SSL_TLSEXT_ERR_ALERT_FATAL:
3190                         ssl3_send_alert(s,SSL3_AL_FATAL,al); 
3191                         return -1;
3192
3193                 case SSL_TLSEXT_ERR_ALERT_WARNING:
3194                         ssl3_send_alert(s,SSL3_AL_WARNING,al);
3195                         return 1; 
3196                                         
3197                 case SSL_TLSEXT_ERR_NOACK:
3198                         s->servername_done=0;
3199                         default:
3200                 return 1;
3201                 }
3202         }
3203
3204 int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n) 
3205         {
3206         int al = -1;
3207         if (s->version < SSL3_VERSION)
3208                 return 1;
3209         if (ssl_scan_serverhello_tlsext(s, p, d, n, &al) <= 0) 
3210                 {
3211                 ssl3_send_alert(s,SSL3_AL_FATAL,al); 
3212                 return 0;
3213                 }
3214
3215         if (ssl_check_serverhello_tlsext(s) <= 0) 
3216                 {
3217                 SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,SSL_R_SERVERHELLO_TLSEXT);
3218                 return 0;
3219                 }
3220         return 1;
3221 }
3222
3223 /* Since the server cache lookup is done early on in the processing of the
3224  * ClientHello, and other operations depend on the result, we need to handle
3225  * any TLS session ticket extension at the same time.
3226  *
3227  *   session_id: points at the session ID in the ClientHello. This code will
3228  *       read past the end of this in order to parse out the session ticket
3229  *       extension, if any.
3230  *   len: the length of the session ID.
3231  *   limit: a pointer to the first byte after the ClientHello.
3232  *   ret: (output) on return, if a ticket was decrypted, then this is set to
3233  *       point to the resulting session.
3234  *
3235  * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
3236  * ciphersuite, in which case we have no use for session tickets and one will
3237  * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
3238  *
3239  * Returns:
3240  *   -1: fatal error, either from parsing or decrypting the ticket.
3241  *    0: no ticket was found (or was ignored, based on settings).
3242  *    1: a zero length extension was found, indicating that the client supports
3243  *       session tickets but doesn't currently have one to offer.
3244  *    2: either s->tls_session_secret_cb was set, or a ticket was offered but
3245  *       couldn't be decrypted because of a non-fatal error.
3246  *    3: a ticket was successfully decrypted and *ret was set.
3247  *
3248  * Side effects:
3249  *   Sets s->tlsext_ticket_expected to 1 if the server will have to issue
3250  *   a new session ticket to the client because the client indicated support
3251  *   (and s->tls_session_secret_cb is NULL) but the client either doesn't have
3252  *   a session ticket or we couldn't use the one it gave us, or if
3253  *   s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
3254  *   Otherwise, s->tlsext_ticket_expected is set to 0.
3255  */
3256 int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
3257                         const unsigned char *limit, SSL_SESSION **ret)
3258         {
3259         /* Point after session ID in client hello */
3260         const unsigned char *p = session_id + len;
3261         unsigned short i;
3262
3263         *ret = NULL;
3264         s->tlsext_ticket_expected = 0;
3265
3266         /* If tickets disabled behave as if no ticket present
3267          * to permit stateful resumption.
3268          */
3269         if (SSL_get_options(s) & SSL_OP_NO_TICKET)
3270                 return 0;
3271         if ((s->version <= SSL3_VERSION) || !limit)
3272                 return 0;
3273         if (p >= limit)
3274                 return -1;
3275         /* Skip past DTLS cookie */
3276         if (SSL_IS_DTLS(s))
3277                 {
3278                 i = *(p++);
3279                 p+= i;
3280                 if (p >= limit)
3281                         return -1;
3282                 }
3283         /* Skip past cipher list */
3284         n2s(p, i);
3285         p+= i;
3286         if (p >= limit)
3287                 return -1;
3288         /* Skip past compression algorithm list */
3289         i = *(p++);
3290         p += i;
3291         if (p > limit)
3292                 return -1;
3293         /* Now at start of extensions */
3294         if ((p + 2) >= limit)
3295                 return 0;
3296         n2s(p, i);
3297         while ((p + 4) <= limit)
3298                 {
3299                 unsigned short type, size;
3300                 n2s(p, type);
3301                 n2s(p, size);
3302                 if (p + size > limit)
3303                         return 0;
3304                 if (type == TLSEXT_TYPE_session_ticket)
3305                         {
3306                         int r;
3307                         if (size == 0)
3308                                 {
3309                                 /* The client will accept a ticket but doesn't
3310                                  * currently have one. */
3311                                 s->tlsext_ticket_expected = 1;
3312                                 return 1;
3313                                 }
3314                         if (s->tls_session_secret_cb)
3315                                 {
3316                                 /* Indicate that the ticket couldn't be
3317                                  * decrypted rather than generating the session
3318                                  * from ticket now, trigger abbreviated
3319                                  * handshake based on external mechanism to
3320                                  * calculate the master secret later. */
3321                                 return 2;
3322                                 }
3323                         r = tls_decrypt_ticket(s, p, size, session_id, len, ret);
3324                         switch (r)
3325                                 {
3326                                 case 2: /* ticket couldn't be decrypted */
3327                                         s->tlsext_ticket_expected = 1;
3328                                         return 2;
3329                                 case 3: /* ticket was decrypted */
3330                                         return r;
3331                                 case 4: /* ticket decrypted but need to renew */
3332                                         s->tlsext_ticket_expected = 1;
3333                                         return 3;
3334                                 default: /* fatal error */
3335                                         return -1;
3336                                 }
3337                         }
3338                 p += size;
3339                 }
3340         return 0;
3341         }
3342
3343 /* tls_decrypt_ticket attempts to decrypt a session ticket.
3344  *
3345  *   etick: points to the body of the session ticket extension.
3346  *   eticklen: the length of the session tickets extenion.
3347  *   sess_id: points at the session ID.
3348  *   sesslen: the length of the session ID.
3349  *   psess: (output) on return, if a ticket was decrypted, then this is set to
3350  *       point to the resulting session.
3351  *
3352  * Returns:
3353  *   -1: fatal error, either from parsing or decrypting the ticket.
3354  *    2: the ticket couldn't be decrypted.
3355  *    3: a ticket was successfully decrypted and *psess was set.
3356  *    4: same as 3, but the ticket needs to be renewed.
3357  */
3358 static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
3359                                 const unsigned char *sess_id, int sesslen,
3360                                 SSL_SESSION **psess)
3361         {
3362         SSL_SESSION *sess;
3363         unsigned char *sdec;
3364         const unsigned char *p;
3365         int slen, mlen, renew_ticket = 0;
3366         unsigned char tick_hmac[EVP_MAX_MD_SIZE];
3367         HMAC_CTX hctx;
3368         EVP_CIPHER_CTX ctx;
3369         SSL_CTX *tctx = s->initial_ctx;
3370         /* Need at least keyname + iv + some encrypted data */
3371         if (eticklen < 48)
3372                 return 2;
3373         /* Initialize session ticket encryption and HMAC contexts */
3374         HMAC_CTX_init(&hctx);
3375         EVP_CIPHER_CTX_init(&ctx);
3376         if (tctx->tlsext_ticket_key_cb)
3377                 {
3378                 unsigned char *nctick = (unsigned char *)etick;
3379                 int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
3380                                                         &ctx, &hctx, 0);
3381                 if (rv < 0)
3382                         return -1;
3383                 if (rv == 0)
3384                         return 2;
3385                 if (rv == 2)
3386                         renew_ticket = 1;
3387                 }
3388         else
3389                 {
3390                 /* Check key name matches */
3391                 if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
3392                         return 2;
3393                 HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
3394                                         tlsext_tick_md(), NULL);
3395                 EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
3396                                 tctx->tlsext_tick_aes_key, etick + 16);
3397                 }
3398         /* Attempt to process session ticket, first conduct sanity and
3399          * integrity checks on ticket.
3400          */
3401         mlen = HMAC_size(&hctx);
3402         if (mlen < 0)
3403                 {
3404                 EVP_CIPHER_CTX_cleanup(&ctx);
3405                 return -1;
3406                 }
3407         eticklen -= mlen;
3408         /* Check HMAC of encrypted ticket */
3409         HMAC_Update(&hctx, etick, eticklen);
3410         HMAC_Final(&hctx, tick_hmac, NULL);
3411         HMAC_CTX_cleanup(&hctx);
3412         if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen))
3413                 return 2;
3414         /* Attempt to decrypt session data */
3415         /* Move p after IV to start of encrypted ticket, update length */
3416         p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
3417         eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
3418         sdec = OPENSSL_malloc(eticklen);
3419         if (!sdec)
3420                 {
3421                 EVP_CIPHER_CTX_cleanup(&ctx);
3422                 return -1;
3423                 }
3424         EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
3425         if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0)
3426                 return 2;
3427         slen += mlen;
3428         EVP_CIPHER_CTX_cleanup(&ctx);
3429         p = sdec;
3430
3431         sess = d2i_SSL_SESSION(NULL, &p, slen);
3432         OPENSSL_free(sdec);
3433         if (sess)
3434                 {
3435                 /* The session ID, if non-empty, is used by some clients to
3436                  * detect that the ticket has been accepted. So we copy it to
3437                  * the session structure. If it is empty set length to zero
3438                  * as required by standard.
3439                  */
3440                 if (sesslen)
3441                         memcpy(sess->session_id, sess_id, sesslen);
3442                 sess->session_id_length = sesslen;
3443                 *psess = sess;
3444                 if (renew_ticket)
3445                         return 4;
3446                 else
3447                         return 3;
3448                 }
3449         ERR_clear_error();
3450         /* For session parse failure, indicate that we need to send a new
3451          * ticket. */
3452         return 2;
3453         }
3454
3455 /* Tables to translate from NIDs to TLS v1.2 ids */
3456
3457 typedef struct 
3458         {
3459         int nid;
3460         int id;
3461         } tls12_lookup;
3462
3463 static tls12_lookup tls12_md[] = {
3464         {NID_md5, TLSEXT_hash_md5},
3465         {NID_sha1, TLSEXT_hash_sha1},
3466         {NID_sha224, TLSEXT_hash_sha224},
3467         {NID_sha256, TLSEXT_hash_sha256},
3468         {NID_sha384, TLSEXT_hash_sha384},
3469         {NID_sha512, TLSEXT_hash_sha512}
3470 };
3471
3472 static tls12_lookup tls12_sig[] = {
3473         {EVP_PKEY_RSA, TLSEXT_signature_rsa},
3474         {EVP_PKEY_DSA, TLSEXT_signature_dsa},
3475         {EVP_PKEY_EC, TLSEXT_signature_ecdsa}
3476 };
3477
3478 static int tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
3479         {
3480         size_t i;
3481         for (i = 0; i < tlen; i++)
3482                 {
3483                 if (table[i].nid == nid)
3484                         return table[i].id;
3485                 }
3486         return -1;
3487         }
3488
3489 static int tls12_find_nid(int id, tls12_lookup *table, size_t tlen)
3490         {
3491         size_t i;
3492         for (i = 0; i < tlen; i++)
3493                 {
3494                 if ((table[i].id) == id)
3495                         return table[i].nid;
3496                 }
3497         return NID_undef;
3498         }
3499
3500 int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, const EVP_MD *md)
3501         {
3502         int sig_id, md_id;
3503         if (!md)
3504                 return 0;
3505         md_id = tls12_find_id(EVP_MD_type(md), tls12_md,
3506                                 sizeof(tls12_md)/sizeof(tls12_lookup));
3507         if (md_id == -1)
3508                 return 0;
3509         sig_id = tls12_get_sigid(pk);
3510         if (sig_id == -1)
3511                 return 0;
3512         p[0] = (unsigned char)md_id;
3513         p[1] = (unsigned char)sig_id;
3514         return 1;
3515         }
3516
3517 int tls12_get_sigid(const EVP_PKEY *pk)
3518         {
3519         return tls12_find_id(pk->type, tls12_sig,
3520                                 sizeof(tls12_sig)/sizeof(tls12_lookup));
3521         }
3522
3523 const EVP_MD *tls12_get_hash(unsigned char hash_alg)
3524         {
3525         switch(hash_alg)
3526                 {
3527 #ifndef OPENSSL_NO_MD5
3528                 case TLSEXT_hash_md5:
3529 #ifdef OPENSSL_FIPS
3530                 if (FIPS_mode())
3531                         return NULL;
3532 #endif
3533                 return EVP_md5();
3534 #endif
3535 #ifndef OPENSSL_NO_SHA
3536                 case TLSEXT_hash_sha1:
3537                 return EVP_sha1();
3538 #endif
3539 #ifndef OPENSSL_NO_SHA256
3540                 case TLSEXT_hash_sha224:
3541                 return EVP_sha224();
3542
3543                 case TLSEXT_hash_sha256:
3544                 return EVP_sha256();
3545 #endif
3546 #ifndef OPENSSL_NO_SHA512
3547                 case TLSEXT_hash_sha384:
3548                 return EVP_sha384();
3549
3550                 case TLSEXT_hash_sha512:
3551                 return EVP_sha512();
3552 #endif
3553                 default:
3554                 return NULL;
3555
3556                 }
3557         }
3558
3559 static int tls12_get_pkey_idx(unsigned char sig_alg)
3560         {
3561         switch(sig_alg)
3562                 {
3563 #ifndef OPENSSL_NO_RSA
3564         case TLSEXT_signature_rsa:
3565                 return SSL_PKEY_RSA_SIGN;
3566 #endif
3567 #ifndef OPENSSL_NO_DSA
3568         case TLSEXT_signature_dsa:
3569                 return SSL_PKEY_DSA_SIGN;
3570 #endif
3571 #ifndef OPENSSL_NO_ECDSA
3572         case TLSEXT_signature_ecdsa:
3573                 return SSL_PKEY_ECC;
3574 #endif
3575                 }
3576         return -1;
3577         }
3578
3579 /* Convert TLS 1.2 signature algorithm extension values into NIDs */
3580 static void tls1_lookup_sigalg(int *phash_nid, int *psign_nid,
3581                         int *psignhash_nid, const unsigned char *data)
3582         {
3583         int sign_nid = 0, hash_nid = 0;
3584         if (!phash_nid && !psign_nid && !psignhash_nid)
3585                 return;
3586         if (phash_nid || psignhash_nid)
3587                 {
3588                 hash_nid = tls12_find_nid(data[0], tls12_md,
3589                                         sizeof(tls12_md)/sizeof(tls12_lookup));
3590                 if (phash_nid)
3591                         *phash_nid = hash_nid;
3592                 }
3593         if (psign_nid || psignhash_nid)
3594                 {
3595                 sign_nid = tls12_find_nid(data[1], tls12_sig,
3596                                         sizeof(tls12_sig)/sizeof(tls12_lookup));
3597                 if (psign_nid)
3598                         *psign_nid = sign_nid;
3599                 }
3600         if (psignhash_nid)
3601                 {
3602                 if (sign_nid && hash_nid)
3603                         OBJ_find_sigid_by_algs(psignhash_nid,
3604                                                         hash_nid, sign_nid);
3605                 else
3606                         *psignhash_nid = NID_undef;
3607                 }
3608         }
3609 /* Given preference and allowed sigalgs set shared sigalgs */
3610 static int tls12_do_shared_sigalgs(TLS_SIGALGS *shsig,
3611                                 const unsigned char *pref, size_t preflen,
3612                                 const unsigned char *allow, size_t allowlen)
3613         {
3614         const unsigned char *ptmp, *atmp;
3615         size_t i, j, nmatch = 0;
3616         for (i = 0, ptmp = pref; i < preflen; i+=2, ptmp+=2)
3617                 {
3618                 /* Skip disabled hashes or signature algorithms */
3619                 if (tls12_get_hash(ptmp[0]) == NULL)
3620                         continue;
3621                 if (tls12_get_pkey_idx(ptmp[1]) == -1)
3622                         continue;
3623                 for (j = 0, atmp = allow; j < allowlen; j+=2, atmp+=2)
3624                         {
3625                         if (ptmp[0] == atmp[0] && ptmp[1] == atmp[1])
3626                                 {
3627                                 nmatch++;
3628                                 if (shsig)
3629                                         {
3630                                         shsig->rhash = ptmp[0];
3631                                         shsig->rsign = ptmp[1];
3632                                         tls1_lookup_sigalg(&shsig->hash_nid,
3633                                                 &shsig->sign_nid,
3634                                                 &shsig->signandhash_nid,
3635                                                 ptmp);
3636                                         shsig++;
3637                                         }
3638                                 break;
3639                                 }
3640                         }
3641                 }
3642         return nmatch;
3643         }
3644
3645 /* Set shared signature algorithms for SSL structures */
3646 static int tls1_set_shared_sigalgs(SSL *s)
3647         {
3648         const unsigned char *pref, *allow, *conf;
3649         size_t preflen, allowlen, conflen;
3650         size_t nmatch;
3651         TLS_SIGALGS *salgs = NULL;
3652         CERT *c = s->cert;
3653         unsigned int is_suiteb = tls1_suiteb(s);
3654         /* If client use client signature algorithms if not NULL */
3655         if (!s->server && c->client_sigalgs && !is_suiteb)
3656                 {
3657                 conf = c->client_sigalgs;
3658                 conflen = c->client_sigalgslen;
3659                 }
3660         else if (c->conf_sigalgs && !is_suiteb)
3661                 {
3662                 conf = c->conf_sigalgs;
3663                 conflen = c->conf_sigalgslen;
3664                 }
3665         else
3666                 conflen = tls12_get_psigalgs(s, &conf);
3667         if(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE || is_suiteb)
3668                 {
3669                 pref = conf;
3670                 preflen = conflen;
3671                 allow = c->peer_sigalgs;
3672                 allowlen = c->peer_sigalgslen;
3673                 }
3674         else
3675                 {
3676                 allow = conf;
3677                 allowlen = conflen;
3678                 pref = c->peer_sigalgs;
3679                 preflen = c->peer_sigalgslen;
3680                 }
3681         nmatch = tls12_do_shared_sigalgs(NULL, pref, preflen, allow, allowlen);
3682         if (!nmatch)
3683                 return 1;
3684         salgs = OPENSSL_malloc(nmatch * sizeof(TLS_SIGALGS));
3685         if (!salgs)
3686                 return 0;
3687         nmatch = tls12_do_shared_sigalgs(salgs, pref, preflen, allow, allowlen);
3688         c->shared_sigalgs = salgs;
3689         c->shared_sigalgslen = nmatch;
3690         return 1;
3691         }
3692                 
3693
3694 /* Set preferred digest for each key type */
3695
3696 int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
3697         {
3698         int idx;
3699         size_t i;
3700         const EVP_MD *md;
3701         CERT *c = s->cert;
3702         TLS_SIGALGS *sigptr;
3703         /* Extension ignored for inappropriate versions */
3704         if (!SSL_USE_SIGALGS(s))
3705                 return 1;
3706         /* Should never happen */
3707         if (!c)
3708                 return 0;
3709
3710         c->peer_sigalgs = OPENSSL_malloc(dsize);
3711         if (!c->peer_sigalgs)
3712                 return 0;
3713         c->peer_sigalgslen = dsize;
3714         memcpy(c->peer_sigalgs, data, dsize);
3715
3716         tls1_set_shared_sigalgs(s);
3717
3718 #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
3719         if (s->cert->cert_flags & SSL_CERT_FLAG_BROKEN_PROTOCOL)
3720                 {
3721                 /* Use first set signature preference to force message
3722                  * digest, ignoring any peer preferences.
3723                  */
3724                 const unsigned char *sigs = NULL;
3725                 if (s->server)
3726                         sigs = c->conf_sigalgs;
3727                 else
3728                         sigs = c->client_sigalgs;
3729                 if (sigs)
3730                         {
3731                         idx = tls12_get_pkey_idx(sigs[1]);
3732                         md = tls12_get_hash(sigs[0]);
3733                         c->pkeys[idx].digest = md;
3734                         c->pkeys[idx].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
3735                         if (idx == SSL_PKEY_RSA_SIGN)
3736                                 {
3737                                 c->pkeys[SSL_PKEY_RSA_ENC].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
3738                                 c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
3739                                 }
3740                         }
3741                 }
3742 #endif
3743
3744         for (i = 0, sigptr = c->shared_sigalgs;
3745                         i < c->shared_sigalgslen; i++, sigptr++)
3746                 {
3747                 idx = tls12_get_pkey_idx(sigptr->rsign);
3748                 if (idx > 0 && c->pkeys[idx].digest == NULL)
3749                         {
3750                         md = tls12_get_hash(sigptr->rhash);
3751                         c->pkeys[idx].digest = md;
3752                         c->pkeys[idx].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
3753                         if (idx == SSL_PKEY_RSA_SIGN)
3754                                 {
3755                                 c->pkeys[SSL_PKEY_RSA_ENC].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
3756                                 c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
3757                                 }
3758                         }
3759
3760                 }
3761         /* In strict mode leave unset digests as NULL to indicate we can't
3762          * use the certificate for signing.
3763          */
3764         if (!(s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT))
3765                 {
3766                 /* Set any remaining keys to default values. NOTE: if alg is
3767                  * not supported it stays as NULL.
3768                  */
3769 #ifndef OPENSSL_NO_DSA
3770                 if (!c->pkeys[SSL_PKEY_DSA_SIGN].digest)
3771                         c->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
3772 #endif
3773 #ifndef OPENSSL_NO_RSA
3774                 if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest)
3775                         {
3776                         c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
3777                         c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
3778                         }
3779 #endif
3780 #ifndef OPENSSL_NO_ECDSA
3781                 if (!c->pkeys[SSL_PKEY_ECC].digest)
3782                         c->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
3783 #endif
3784                 }
3785         return 1;
3786         }
3787
3788
3789 int SSL_get_sigalgs(SSL *s, int idx,
3790                         int *psign, int *phash, int *psignhash,
3791                         unsigned char *rsig, unsigned char *rhash)
3792         {
3793         const unsigned char *psig = s->cert->peer_sigalgs;
3794         if (psig == NULL)
3795                 return 0;
3796         if (idx >= 0)
3797                 {
3798                 idx <<= 1;
3799                 if (idx >= (int)s->cert->peer_sigalgslen)
3800                         return 0;
3801                 psig += idx;
3802                 if (rhash)
3803                         *rhash = psig[0];
3804                 if (rsig)
3805                         *rsig = psig[1];
3806                 tls1_lookup_sigalg(phash, psign, psignhash, psig);
3807                 }
3808         return s->cert->peer_sigalgslen / 2;
3809         }
3810
3811 int SSL_get_shared_sigalgs(SSL *s, int idx,
3812                         int *psign, int *phash, int *psignhash,
3813                         unsigned char *rsig, unsigned char *rhash)
3814         {
3815         TLS_SIGALGS *shsigalgs = s->cert->shared_sigalgs;
3816         if (!shsigalgs || idx >= (int)s->cert->shared_sigalgslen)
3817                 return 0;
3818         shsigalgs += idx;
3819         if (phash)
3820                 *phash = shsigalgs->hash_nid;
3821         if (psign)
3822                 *psign = shsigalgs->sign_nid;
3823         if (psignhash)
3824                 *psignhash = shsigalgs->signandhash_nid;
3825         if (rsig)
3826                 *rsig = shsigalgs->rsign;
3827         if (rhash)
3828                 *rhash = shsigalgs->rhash;
3829         return s->cert->shared_sigalgslen;
3830         }
3831         
3832
3833 #ifndef OPENSSL_NO_HEARTBEATS
3834 int
3835 tls1_process_heartbeat(SSL *s)
3836         {
3837         unsigned char *p = &s->s3->rrec.data[0], *pl;
3838         unsigned short hbtype;
3839         unsigned int payload;
3840         unsigned int padding = 16; /* Use minimum padding */
3841
3842         /* Read type and payload length first */
3843         hbtype = *p++;
3844         n2s(p, payload);
3845         pl = p;
3846
3847         if (s->msg_callback)
3848                 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
3849                         &s->s3->rrec.data[0], s->s3->rrec.length,
3850                         s, s->msg_callback_arg);
3851
3852         if (hbtype == TLS1_HB_REQUEST)
3853                 {
3854                 unsigned char *buffer, *bp;
3855                 int r;
3856
3857                 /* Allocate memory for the response, size is 1 bytes
3858                  * message type, plus 2 bytes payload length, plus
3859                  * payload, plus padding
3860                  */
3861                 buffer = OPENSSL_malloc(1 + 2 + payload + padding);
3862                 bp = buffer;
3863                 
3864                 /* Enter response type, length and copy payload */
3865                 *bp++ = TLS1_HB_RESPONSE;
3866                 s2n(payload, bp);
3867                 memcpy(bp, pl, payload);
3868                 bp += payload;
3869                 /* Random padding */
3870                 RAND_pseudo_bytes(bp, padding);
3871
3872                 r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
3873
3874                 if (r >= 0 && s->msg_callback)
3875                         s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
3876                                 buffer, 3 + payload + padding,
3877                                 s, s->msg_callback_arg);
3878
3879                 OPENSSL_free(buffer);
3880
3881                 if (r < 0)
3882                         return r;
3883                 }
3884         else if (hbtype == TLS1_HB_RESPONSE)
3885                 {
3886                 unsigned int seq;
3887                 
3888                 /* We only send sequence numbers (2 bytes unsigned int),
3889                  * and 16 random bytes, so we just try to read the
3890                  * sequence number */
3891                 n2s(pl, seq);
3892                 
3893                 if (payload == 18 && seq == s->tlsext_hb_seq)
3894                         {
3895                         s->tlsext_hb_seq++;
3896                         s->tlsext_hb_pending = 0;
3897                         }
3898                 }
3899
3900         return 0;
3901         }
3902
3903 int
3904 tls1_heartbeat(SSL *s)
3905         {
3906         unsigned char *buf, *p;
3907         int ret;
3908         unsigned int payload = 18; /* Sequence number + random bytes */
3909         unsigned int padding = 16; /* Use minimum padding */
3910
3911         /* Only send if peer supports and accepts HB requests... */
3912         if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
3913             s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS)
3914                 {
3915                 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
3916                 return -1;
3917                 }
3918
3919         /* ...and there is none in flight yet... */
3920         if (s->tlsext_hb_pending)
3921                 {
3922                 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PENDING);
3923                 return -1;
3924                 }
3925                 
3926         /* ...and no handshake in progress. */
3927         if (SSL_in_init(s) || s->in_handshake)
3928                 {
3929                 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_UNEXPECTED_MESSAGE);
3930                 return -1;
3931                 }
3932                 
3933         /* Check if padding is too long, payload and padding
3934          * must not exceed 2^14 - 3 = 16381 bytes in total.
3935          */
3936         OPENSSL_assert(payload + padding <= 16381);
3937
3938         /* Create HeartBeat message, we just use a sequence number
3939          * as payload to distuingish different messages and add
3940          * some random stuff.
3941          *  - Message Type, 1 byte
3942          *  - Payload Length, 2 bytes (unsigned int)
3943          *  - Payload, the sequence number (2 bytes uint)
3944          *  - Payload, random bytes (16 bytes uint)
3945          *  - Padding
3946          */
3947         buf = OPENSSL_malloc(1 + 2 + payload + padding);
3948         p = buf;
3949         /* Message Type */
3950         *p++ = TLS1_HB_REQUEST;
3951         /* Payload length (18 bytes here) */
3952         s2n(payload, p);
3953         /* Sequence number */
3954         s2n(s->tlsext_hb_seq, p);
3955         /* 16 random bytes */
3956         RAND_pseudo_bytes(p, 16);
3957         p += 16;
3958         /* Random padding */
3959         RAND_pseudo_bytes(p, padding);
3960
3961         ret = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
3962         if (ret >= 0)
3963                 {
3964                 if (s->msg_callback)
3965                         s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
3966                                 buf, 3 + payload + padding,
3967                                 s, s->msg_callback_arg);
3968
3969                 s->tlsext_hb_pending = 1;
3970                 }
3971                 
3972         OPENSSL_free(buf);
3973
3974         return ret;
3975         }
3976 #endif
3977
3978 #define MAX_SIGALGLEN   (TLSEXT_hash_num * TLSEXT_signature_num * 2)
3979
3980 typedef struct
3981         {
3982         size_t sigalgcnt;
3983         int sigalgs[MAX_SIGALGLEN];
3984         } sig_cb_st;
3985
3986 static int sig_cb(const char *elem, int len, void *arg)
3987         {
3988         sig_cb_st *sarg = arg;
3989         size_t i;
3990         char etmp[20], *p;
3991         int sig_alg, hash_alg;
3992         if (sarg->sigalgcnt == MAX_SIGALGLEN)
3993                 return 0;
3994         if (len > (int)(sizeof(etmp) - 1))
3995                 return 0;
3996         memcpy(etmp, elem, len);
3997         etmp[len] = 0;
3998         p = strchr(etmp, '+');
3999         if (!p)
4000                 return 0;
4001         *p = 0;
4002         p++;
4003         if (!*p)
4004                 return 0;
4005
4006         if (!strcmp(etmp, "RSA"))
4007                 sig_alg = EVP_PKEY_RSA;
4008         else if (!strcmp(etmp, "DSA"))
4009                 sig_alg = EVP_PKEY_DSA;
4010         else if (!strcmp(etmp, "ECDSA"))
4011                 sig_alg = EVP_PKEY_EC;
4012         else return 0;
4013
4014         hash_alg = OBJ_sn2nid(p);
4015         if (hash_alg == NID_undef)
4016                 hash_alg = OBJ_ln2nid(p);
4017         if (hash_alg == NID_undef)
4018                 return 0;
4019
4020         for (i = 0; i < sarg->sigalgcnt; i+=2)
4021                 {
4022                 if (sarg->sigalgs[i] == sig_alg
4023                         && sarg->sigalgs[i + 1] == hash_alg)
4024                         return 0;
4025                 }
4026         sarg->sigalgs[sarg->sigalgcnt++] = hash_alg;
4027         sarg->sigalgs[sarg->sigalgcnt++] = sig_alg;
4028         return 1;
4029         }
4030
4031 /* Set suppored signature algorithms based on a colon separated list
4032  * of the form sig+hash e.g. RSA+SHA512:DSA+SHA512 */
4033 int tls1_set_sigalgs_list(CERT *c, const char *str, int client)
4034         {
4035         sig_cb_st sig;
4036         sig.sigalgcnt = 0;
4037         if (!CONF_parse_list(str, ':', 1, sig_cb, &sig))
4038                 return 0;
4039         if (c == NULL)
4040                 return 1;
4041         return tls1_set_sigalgs(c, sig.sigalgs, sig.sigalgcnt, client);
4042         }
4043
4044 int tls1_set_sigalgs(CERT *c, const int *psig_nids, size_t salglen, int client)
4045         {
4046         unsigned char *sigalgs, *sptr;
4047         int rhash, rsign;
4048         size_t i;
4049         if (salglen & 1)
4050                 return 0;
4051         sigalgs = OPENSSL_malloc(salglen);
4052         if (sigalgs == NULL)
4053                 return 0;
4054         for (i = 0, sptr = sigalgs; i < salglen; i+=2)
4055                 {
4056                 rhash = tls12_find_id(*psig_nids++, tls12_md,
4057                                         sizeof(tls12_md)/sizeof(tls12_lookup));
4058                 rsign = tls12_find_id(*psig_nids++, tls12_sig,
4059                                 sizeof(tls12_sig)/sizeof(tls12_lookup));
4060
4061                 if (rhash == -1 || rsign == -1)
4062                         goto err;
4063                 *sptr++ = rhash;
4064                 *sptr++ = rsign;
4065                 }
4066
4067         if (client)
4068                 {
4069                 if (c->client_sigalgs)
4070                         OPENSSL_free(c->client_sigalgs);
4071                 c->client_sigalgs = sigalgs;
4072                 c->client_sigalgslen = salglen;
4073                 }
4074         else
4075                 {
4076                 if (c->conf_sigalgs)
4077                         OPENSSL_free(c->conf_sigalgs);
4078                 c->conf_sigalgs = sigalgs;
4079                 c->conf_sigalgslen = salglen;
4080                 }
4081
4082         return 1;
4083
4084         err:
4085         OPENSSL_free(sigalgs);
4086         return 0;
4087         }
4088
4089 static int tls1_check_sig_alg(CERT *c, X509 *x, int default_nid)
4090         {
4091         int sig_nid;
4092         size_t i;
4093         if (default_nid == -1)
4094                 return 1;
4095         sig_nid = X509_get_signature_nid(x);
4096         if (default_nid)
4097                 return sig_nid == default_nid ? 1 : 0;
4098         for (i = 0; i < c->shared_sigalgslen; i++)
4099                 if (sig_nid == c->shared_sigalgs[i].signandhash_nid)
4100                         return 1;
4101         return 0;
4102         }
4103 /* Check to see if a certificate issuer name matches list of CA names */
4104 static int ssl_check_ca_name(STACK_OF(X509_NAME) *names, X509 *x)
4105         {
4106         X509_NAME *nm;
4107         int i;
4108         nm = X509_get_issuer_name(x);
4109         for (i = 0; i < sk_X509_NAME_num(names); i++)
4110                 {
4111                 if(!X509_NAME_cmp(nm, sk_X509_NAME_value(names, i)))
4112                         return 1;
4113                 }
4114         return 0;
4115         }
4116
4117 /* Check certificate chain is consistent with TLS extensions and is
4118  * usable by server. This servers two purposes: it allows users to 
4119  * check chains before passing them to the server and it allows the
4120  * server to check chains before attempting to use them.
4121  */
4122
4123 /* Flags which need to be set for a certificate when stict mode not set */
4124
4125 #define CERT_PKEY_VALID_FLAGS \
4126         (CERT_PKEY_EE_SIGNATURE|CERT_PKEY_EE_PARAM)
4127 /* Strict mode flags */
4128 #define CERT_PKEY_STRICT_FLAGS \
4129          (CERT_PKEY_VALID_FLAGS|CERT_PKEY_CA_SIGNATURE|CERT_PKEY_CA_PARAM \
4130          | CERT_PKEY_ISSUER_NAME|CERT_PKEY_CERT_TYPE)
4131
4132 int tls1_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain,
4133                                                                         int idx)
4134         {
4135         int i;
4136         int rv = 0;
4137         int check_flags = 0, strict_mode;
4138         CERT_PKEY *cpk = NULL;
4139         CERT *c = s->cert;
4140         unsigned int suiteb_flags = tls1_suiteb(s);
4141         /* idx == -1 means checking server chains */
4142         if (idx != -1)
4143                 {
4144                 /* idx == -2 means checking client certificate chains */
4145                 if (idx == -2)
4146                         {
4147                         cpk = c->key;
4148                         idx = cpk - c->pkeys;
4149                         }
4150                 else
4151                         cpk = c->pkeys + idx;
4152                 x = cpk->x509;
4153                 pk = cpk->privatekey;
4154                 chain = cpk->chain;
4155                 strict_mode = c->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT;
4156                 /* If no cert or key, forget it */
4157                 if (!x || !pk)
4158                         goto end;
4159 #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
4160                 /* Allow any certificate to pass test */
4161                 if (s->cert->cert_flags & SSL_CERT_FLAG_BROKEN_PROTOCOL)
4162                         {
4163                         rv = CERT_PKEY_STRICT_FLAGS|CERT_PKEY_EXPLICIT_SIGN|CERT_PKEY_VALID|CERT_PKEY_SIGN;
4164                         cpk->valid_flags = rv;
4165                         return rv;
4166                         }
4167 #endif
4168                 }
4169         else
4170                 {
4171                 if (!x || !pk)
4172                         goto end;
4173                 idx = ssl_cert_type(x, pk);
4174                 if (idx == -1)
4175                         goto end;
4176                 cpk = c->pkeys + idx;
4177                 if (c->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT)
4178                         check_flags = CERT_PKEY_STRICT_FLAGS;
4179                 else
4180                         check_flags = CERT_PKEY_VALID_FLAGS;
4181                 strict_mode = 1;
4182                 }
4183
4184         if (suiteb_flags)
4185                 {
4186                 int ok;
4187                 if (check_flags)
4188                         check_flags |= CERT_PKEY_SUITEB;
4189                 ok = X509_chain_check_suiteb(NULL, x, chain, suiteb_flags);
4190                 if (ok != X509_V_OK)
4191                         {
4192                         if (check_flags)
4193                                 rv |= CERT_PKEY_SUITEB;
4194                         else
4195                                 goto end;
4196                         }
4197                 }
4198
4199         /* Check all signature algorithms are consistent with
4200          * signature algorithms extension if TLS 1.2 or later
4201          * and strict mode.
4202          */
4203         if (TLS1_get_version(s) >= TLS1_2_VERSION && strict_mode)
4204                 {
4205                 int default_nid;
4206                 unsigned char rsign = 0;
4207                 if (c->peer_sigalgs)
4208                         default_nid = 0;
4209                 /* If no sigalgs extension use defaults from RFC5246 */
4210                 else
4211                         {
4212                         switch(idx)
4213                                 {       
4214                         case SSL_PKEY_RSA_ENC:
4215                         case SSL_PKEY_RSA_SIGN:
4216                         case SSL_PKEY_DH_RSA:
4217                                 rsign = TLSEXT_signature_rsa;
4218                                 default_nid = NID_sha1WithRSAEncryption;
4219                                 break;
4220
4221                         case SSL_PKEY_DSA_SIGN:
4222                         case SSL_PKEY_DH_DSA:
4223                                 rsign = TLSEXT_signature_dsa;
4224                                 default_nid = NID_dsaWithSHA1;
4225                                 break;
4226
4227                         case SSL_PKEY_ECC:
4228                                 rsign = TLSEXT_signature_ecdsa;
4229                                 default_nid = NID_ecdsa_with_SHA1;
4230                                 break;
4231
4232                         default:
4233                                 default_nid = -1;
4234                                 break;
4235                                 }
4236                         }
4237                 /* If peer sent no signature algorithms extension and we
4238                  * have set preferred signature algorithms check we support
4239                  * sha1.
4240                  */
4241                 if (default_nid > 0 && c->conf_sigalgs)
4242                         {
4243                         size_t j;
4244                         const unsigned char *p = c->conf_sigalgs;
4245                         for (j = 0; j < c->conf_sigalgslen; j += 2, p += 2)
4246                                 {
4247                                 if (p[0] == TLSEXT_hash_sha1 && p[1] == rsign)
4248                                         break;
4249                                 }
4250                         if (j == c->conf_sigalgslen)
4251                                 {
4252                                 if (check_flags)
4253                                         goto skip_sigs;
4254                                 else
4255                                         goto end;
4256                                 }
4257                         }
4258                 /* Check signature algorithm of each cert in chain */
4259                 if (!tls1_check_sig_alg(c, x, default_nid))
4260                         {
4261                         if (!check_flags) goto end;
4262                         }
4263                 else
4264                         rv |= CERT_PKEY_EE_SIGNATURE;
4265                 rv |= CERT_PKEY_CA_SIGNATURE;
4266                 for (i = 0; i < sk_X509_num(chain); i++)
4267                         {
4268                         if (!tls1_check_sig_alg(c, sk_X509_value(chain, i),
4269                                                         default_nid))
4270                                 {
4271                                 if (check_flags)
4272                                         {
4273                                         rv &= ~CERT_PKEY_CA_SIGNATURE;
4274                                         break;
4275                                         }
4276                                 else
4277                                         goto end;
4278                                 }
4279                         }
4280                 }
4281         /* Else not TLS 1.2, so mark EE and CA signing algorithms OK */
4282         else if(check_flags)
4283                 rv |= CERT_PKEY_EE_SIGNATURE|CERT_PKEY_CA_SIGNATURE;
4284         skip_sigs:
4285         /* Check cert parameters are consistent */
4286         if (tls1_check_cert_param(s, x, check_flags ? 1 : 2))
4287                 rv |= CERT_PKEY_EE_PARAM;
4288         else if (!check_flags)
4289                 goto end;
4290         if (!s->server)
4291                 rv |= CERT_PKEY_CA_PARAM;
4292         /* In strict mode check rest of chain too */
4293         else if (strict_mode)
4294                 {
4295                 rv |= CERT_PKEY_CA_PARAM;
4296                 for (i = 0; i < sk_X509_num(chain); i++)
4297                         {
4298                         X509 *ca = sk_X509_value(chain, i);
4299                         if (!tls1_check_cert_param(s, ca, 0))
4300                                 {
4301                                 if (check_flags)
4302                                         {
4303                                         rv &= ~CERT_PKEY_CA_PARAM;
4304                                         break;
4305                                         }
4306                                 else
4307                                         goto end;
4308                                 }
4309                         }
4310                 }
4311         if (!s->server && strict_mode)
4312                 {
4313                 STACK_OF(X509_NAME) *ca_dn;
4314                 int check_type = 0;
4315                 switch (pk->type)
4316                         {
4317                 case EVP_PKEY_RSA:
4318                         check_type = TLS_CT_RSA_SIGN;
4319                         break;
4320                 case EVP_PKEY_DSA:
4321                         check_type = TLS_CT_DSS_SIGN;
4322                         break;
4323                 case EVP_PKEY_EC:
4324                         check_type = TLS_CT_ECDSA_SIGN;
4325                         break;
4326                 case EVP_PKEY_DH:
4327                 case EVP_PKEY_DHX:
4328                                 {
4329                                 int cert_type = X509_certificate_type(x, pk);
4330                                 if (cert_type & EVP_PKS_RSA)
4331                                         check_type = TLS_CT_RSA_FIXED_DH;
4332                                 if (cert_type & EVP_PKS_DSA)
4333                                         check_type = TLS_CT_DSS_FIXED_DH;
4334                                 }
4335                         }
4336                 if (check_type)
4337                         {
4338                         const unsigned char *ctypes;
4339                         int ctypelen;
4340                         if (c->ctypes)
4341                                 {
4342                                 ctypes = c->ctypes;
4343                                 ctypelen = (int)c->ctype_num;
4344                                 }
4345                         else
4346                                 {
4347                                 ctypes = (unsigned char *)s->s3->tmp.ctype;
4348                                 ctypelen = s->s3->tmp.ctype_num;
4349                                 }
4350                         for (i = 0; i < ctypelen; i++)
4351                                 {
4352                                 if (ctypes[i] == check_type)
4353                                         {
4354                                         rv |= CERT_PKEY_CERT_TYPE;
4355                                         break;
4356                                         }
4357                                 }
4358                         if (!(rv & CERT_PKEY_CERT_TYPE) && !check_flags)
4359                                 goto end;
4360                         }
4361                 else
4362                         rv |= CERT_PKEY_CERT_TYPE;
4363
4364
4365                 ca_dn = s->s3->tmp.ca_names;
4366
4367                 if (!sk_X509_NAME_num(ca_dn))
4368                         rv |= CERT_PKEY_ISSUER_NAME;
4369
4370                 if (!(rv & CERT_PKEY_ISSUER_NAME))
4371                         {
4372                         if (ssl_check_ca_name(ca_dn, x))
4373                                 rv |= CERT_PKEY_ISSUER_NAME;
4374                         }
4375                 if (!(rv & CERT_PKEY_ISSUER_NAME))
4376                         {
4377                         for (i = 0; i < sk_X509_num(chain); i++)
4378                                 {
4379                                 X509 *xtmp = sk_X509_value(chain, i);
4380                                 if (ssl_check_ca_name(ca_dn, xtmp))
4381                                         {
4382                                         rv |= CERT_PKEY_ISSUER_NAME;
4383                                         break;
4384                                         }
4385                                 }
4386                         }
4387                 if (!check_flags && !(rv & CERT_PKEY_ISSUER_NAME))
4388                         goto end;
4389                 }
4390         else
4391                 rv |= CERT_PKEY_ISSUER_NAME|CERT_PKEY_CERT_TYPE;
4392
4393         if (!check_flags || (rv & check_flags) == check_flags)
4394                 rv |= CERT_PKEY_VALID;
4395
4396         end:
4397
4398         if (TLS1_get_version(s) >= TLS1_2_VERSION)
4399                 {
4400                 if (cpk->valid_flags & CERT_PKEY_EXPLICIT_SIGN)
4401                         rv |= CERT_PKEY_EXPLICIT_SIGN|CERT_PKEY_SIGN;
4402                 else if (cpk->digest)
4403                         rv |= CERT_PKEY_SIGN;
4404                 }
4405         else
4406                 rv |= CERT_PKEY_SIGN|CERT_PKEY_EXPLICIT_SIGN;
4407
4408         /* When checking a CERT_PKEY structure all flags are irrelevant
4409          * if the chain is invalid.
4410          */
4411         if (!check_flags)
4412                 {
4413                 if (rv & CERT_PKEY_VALID)
4414                         cpk->valid_flags = rv;
4415                 else
4416                         {
4417                         /* Preserve explicit sign flag, clear rest */
4418                         cpk->valid_flags &= CERT_PKEY_EXPLICIT_SIGN;
4419                         return 0;
4420                         }
4421                 }
4422         return rv;
4423         }
4424
4425 /* Set validity of certificates in an SSL structure */
4426 void tls1_set_cert_validity(SSL *s)
4427         {
4428         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_RSA_ENC);
4429         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_RSA_SIGN);
4430         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_DSA_SIGN);
4431         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_DH_RSA);
4432         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_DH_DSA);
4433         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_ECC);
4434         }
4435 /* User level utiity function to check a chain is suitable */
4436 int SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain)
4437         {
4438         return tls1_check_chain(s, x, pk, chain, -1);
4439         }
4440
4441 #endif