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