~ubuntu-branches/ubuntu/oneiric/openssl/oneiric-201110041452

« back to all changes in this revision

Viewing changes to .pc/openssl-CVE-2010-3864-secadv_20101116-0.9.8.patch/ssl/t1_lib.c

  • Committer: Bazaar Package Importer
  • Author(s): Steve Beattie
  • Date: 2010-11-16 10:07:49 UTC
  • Revision ID: james.westby@ubuntu.com-20101116100749-yr1a9k5pjqs56v39
Tags: 0.9.8o-1ubuntu4.2
* SECURITY UPDATE: TLS race condition leading to a buffer overflow and
  possible code execution. (LP: #676243)
  - patches/debian/openssl-CVE-2010-3864-secadv_20101116-0.9.8.patch:
    stricter NULL/not-NULL checking in ssl/t1_lib.c
  - CVE-2010-3864

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
#include <stdio.h>
 
60
#include <openssl/objects.h>
 
61
#include <openssl/evp.h>
 
62
#include <openssl/hmac.h>
 
63
#include <openssl/ocsp.h>
 
64
#include "ssl_locl.h"
 
65
 
 
66
const char tls1_version_str[]="TLSv1" OPENSSL_VERSION_PTEXT;
 
67
 
 
68
#ifndef OPENSSL_NO_TLSEXT
 
69
static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen,
 
70
                                const unsigned char *sess_id, int sesslen,
 
71
                                SSL_SESSION **psess);
 
72
#endif
 
73
 
 
74
SSL3_ENC_METHOD TLSv1_enc_data={
 
75
        tls1_enc,
 
76
        tls1_mac,
 
77
        tls1_setup_key_block,
 
78
        tls1_generate_master_secret,
 
79
        tls1_change_cipher_state,
 
80
        tls1_final_finish_mac,
 
81
        TLS1_FINISH_MAC_LENGTH,
 
82
        tls1_cert_verify_mac,
 
83
        TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
 
84
        TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
 
85
        tls1_alert_code,
 
86
        };
 
87
 
 
88
long tls1_default_timeout(void)
 
89
        {
 
90
        /* 2 hours, the 24 hours mentioned in the TLSv1 spec
 
91
         * is way too long for http, the cache would over fill */
 
92
        return(60*60*2);
 
93
        }
 
94
 
 
95
IMPLEMENT_tls1_meth_func(tlsv1_base_method,
 
96
                        ssl_undefined_function,
 
97
                        ssl_undefined_function,
 
98
                        ssl_bad_method)
 
99
 
 
100
int tls1_new(SSL *s)
 
101
        {
 
102
        if (!ssl3_new(s)) return(0);
 
103
        s->method->ssl_clear(s);
 
104
        return(1);
 
105
        }
 
106
 
 
107
void tls1_free(SSL *s)
 
108
        {
 
109
        ssl3_free(s);
 
110
        }
 
111
 
 
112
void tls1_clear(SSL *s)
 
113
        {
 
114
        ssl3_clear(s);
 
115
        s->version=TLS1_VERSION;
 
116
        }
 
117
 
 
118
#if 0
 
119
long tls1_ctrl(SSL *s, int cmd, long larg, char *parg)
 
120
        {
 
121
        return(0);
 
122
        }
 
123
 
 
124
long tls1_callback_ctrl(SSL *s, int cmd, void *(*fp)())
 
125
        {
 
126
        return(0);
 
127
        }
 
128
#endif
 
129
 
 
130
#ifndef OPENSSL_NO_TLSEXT
 
131
unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
 
132
        {
 
133
        int extdatalen=0;
 
134
        unsigned char *ret = p;
 
135
 
 
136
        /* don't add extensions for SSLv3 unless doing secure renegotiation */
 
137
        if (s->client_version == SSL3_VERSION
 
138
                                        && !s->s3->send_connection_binding)
 
139
                return p;
 
140
 
 
141
        ret+=2;
 
142
 
 
143
        if (ret>=limit) return NULL; /* this really never occurs, but ... */
 
144
 
 
145
        if (s->tlsext_hostname != NULL)
 
146
                { 
 
147
                /* Add TLS extension servername to the Client Hello message */
 
148
                unsigned long size_str;
 
149
                long lenmax; 
 
150
 
 
151
                /* check for enough space.
 
152
                   4 for the servername type and entension length
 
153
                   2 for servernamelist length
 
154
                   1 for the hostname type
 
155
                   2 for hostname length
 
156
                   + hostname length 
 
157
                */
 
158
                   
 
159
                if ((lenmax = limit - ret - 9) < 0 
 
160
                || (size_str = strlen(s->tlsext_hostname)) > (unsigned long)lenmax) 
 
161
                        return NULL;
 
162
                        
 
163
                /* extension type and length */
 
164
                s2n(TLSEXT_TYPE_server_name,ret); 
 
165
                s2n(size_str+5,ret);
 
166
                
 
167
                /* length of servername list */
 
168
                s2n(size_str+3,ret);
 
169
        
 
170
                /* hostname type, length and hostname */
 
171
                *(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name;
 
172
                s2n(size_str,ret);
 
173
                memcpy(ret, s->tlsext_hostname, size_str);
 
174
                ret+=size_str;
 
175
 
 
176
                }
 
177
 
 
178
        /* Add RI if renegotiating */
 
179
        if (s->new_session)
 
180
          {
 
181
          int el;
 
182
          
 
183
          if(!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0))
 
184
              {
 
185
              SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
 
186
              return NULL;
 
187
              }
 
188
 
 
189
          if((limit - p - 4 - el) < 0) return NULL;
 
190
          
 
191
          s2n(TLSEXT_TYPE_renegotiate,ret);
 
192
          s2n(el,ret);
 
193
 
 
194
          if(!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el))
 
195
              {
 
196
              SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
 
197
              return NULL;
 
198
              }
 
199
 
 
200
          ret += el;
 
201
        }
 
202
 
 
203
           
 
204
        if (!(SSL_get_options(s) & SSL_OP_NO_TICKET))
 
205
                {
 
206
                int ticklen;
 
207
                if (!s->new_session && s->session && s->session->tlsext_tick)
 
208
                        ticklen = s->session->tlsext_ticklen;
 
209
                else
 
210
                        ticklen = 0;
 
211
                /* Check for enough room 2 for extension type, 2 for len
 
212
                 * rest for ticket
 
213
                 */
 
214
                if (limit - ret - 4 - ticklen < 0)
 
215
                        return NULL;
 
216
                s2n(TLSEXT_TYPE_session_ticket,ret); 
 
217
                s2n(ticklen,ret);
 
218
                if (ticklen)
 
219
                        {
 
220
                        memcpy(ret, s->session->tlsext_tick, ticklen);
 
221
                        ret += ticklen;
 
222
                        }
 
223
                }
 
224
 
 
225
        if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp &&
 
226
            s->version != DTLS1_VERSION)
 
227
                {
 
228
                int i;
 
229
                long extlen, idlen, itmp;
 
230
                OCSP_RESPID *id;
 
231
 
 
232
                idlen = 0;
 
233
                for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
 
234
                        {
 
235
                        id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
 
236
                        itmp = i2d_OCSP_RESPID(id, NULL);
 
237
                        if (itmp <= 0)
 
238
                                return NULL;
 
239
                        idlen += itmp + 2;
 
240
                        }
 
241
 
 
242
                if (s->tlsext_ocsp_exts)
 
243
                        {
 
244
                        extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
 
245
                        if (extlen < 0)
 
246
                                return NULL;
 
247
                        }
 
248
                else
 
249
                        extlen = 0;
 
250
                        
 
251
                if ((long)(limit - ret - 7 - extlen - idlen) < 0) return NULL;
 
252
                s2n(TLSEXT_TYPE_status_request, ret);
 
253
                if (extlen + idlen > 0xFFF0)
 
254
                        return NULL;
 
255
                s2n(extlen + idlen + 5, ret);
 
256
                *(ret++) = TLSEXT_STATUSTYPE_ocsp;
 
257
                s2n(idlen, ret);
 
258
                for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
 
259
                        {
 
260
                        /* save position of id len */
 
261
                        unsigned char *q = ret;
 
262
                        id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
 
263
                        /* skip over id len */
 
264
                        ret += 2;
 
265
                        itmp = i2d_OCSP_RESPID(id, &ret);
 
266
                        /* write id len */
 
267
                        s2n(itmp, q);
 
268
                        }
 
269
                s2n(extlen, ret);
 
270
                if (extlen > 0)
 
271
                        i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
 
272
                }
 
273
 
 
274
        if ((extdatalen = ret-p-2)== 0) 
 
275
                return p;
 
276
 
 
277
        s2n(extdatalen,p);
 
278
        return ret;
 
279
        }
 
280
 
 
281
unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
 
282
        {
 
283
        int extdatalen=0;
 
284
        unsigned char *ret = p;
 
285
 
 
286
        /* don't add extensions for SSLv3, unless doing secure renegotiation */
 
287
        if (s->version == SSL3_VERSION && !s->s3->send_connection_binding)
 
288
                return p;
 
289
        
 
290
        ret+=2;
 
291
        if (ret>=limit) return NULL; /* this really never occurs, but ... */
 
292
 
 
293
        if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL)
 
294
                { 
 
295
                if (limit - ret - 4 < 0) return NULL; 
 
296
 
 
297
                s2n(TLSEXT_TYPE_server_name,ret);
 
298
                s2n(0,ret);
 
299
                }
 
300
 
 
301
        if(s->s3->send_connection_binding)
 
302
        {
 
303
          int el;
 
304
          
 
305
          if(!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0))
 
306
              {
 
307
              SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
 
308
              return NULL;
 
309
              }
 
310
 
 
311
          if((limit - p - 4 - el) < 0) return NULL;
 
312
          
 
313
          s2n(TLSEXT_TYPE_renegotiate,ret);
 
314
          s2n(el,ret);
 
315
 
 
316
          if(!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el))
 
317
              {
 
318
              SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
 
319
              return NULL;
 
320
              }
 
321
 
 
322
          ret += el;
 
323
        }
 
324
        
 
325
        if (s->tlsext_ticket_expected
 
326
                && !(SSL_get_options(s) & SSL_OP_NO_TICKET)) 
 
327
                { 
 
328
                if (limit - ret - 4 < 0) return NULL; 
 
329
                s2n(TLSEXT_TYPE_session_ticket,ret);
 
330
                s2n(0,ret);
 
331
                }
 
332
 
 
333
        if (s->tlsext_status_expected)
 
334
                { 
 
335
                if ((long)(limit - ret - 4) < 0) return NULL; 
 
336
                s2n(TLSEXT_TYPE_status_request,ret);
 
337
                s2n(0,ret);
 
338
                }
 
339
 
 
340
        if ((extdatalen = ret-p-2)== 0) 
 
341
                return p;
 
342
 
 
343
        s2n(extdatalen,p);
 
344
        return ret;
 
345
        }
 
346
 
 
347
int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
 
348
        {
 
349
        unsigned short type;
 
350
        unsigned short size;
 
351
        unsigned short len;
 
352
        unsigned char *data = *p;
 
353
        int renegotiate_seen = 0;
 
354
 
 
355
        s->servername_done = 0;
 
356
        s->tlsext_status_type = -1;
 
357
 
 
358
        if (data >= (d+n-2))
 
359
                goto ri_check;
 
360
 
 
361
        n2s(data,len);
 
362
 
 
363
        if (data > (d+n-len)) 
 
364
                goto ri_check;
 
365
 
 
366
        while (data <= (d+n-4))
 
367
                {
 
368
                n2s(data,type);
 
369
                n2s(data,size);
 
370
 
 
371
                if (data+size > (d+n))
 
372
                        goto ri_check;
 
373
 
 
374
                if (s->tlsext_debug_cb)
 
375
                        s->tlsext_debug_cb(s, 0, type, data, size,
 
376
                                                s->tlsext_debug_arg);
 
377
/* The servername extension is treated as follows:
 
378
 
 
379
   - Only the hostname type is supported with a maximum length of 255.
 
380
   - The servername is rejected if too long or if it contains zeros,
 
381
     in which case an fatal alert is generated.
 
382
   - The servername field is maintained together with the session cache.
 
383
   - When a session is resumed, the servername call back invoked in order
 
384
     to allow the application to position itself to the right context. 
 
385
   - The servername is acknowledged if it is new for a session or when 
 
386
     it is identical to a previously used for the same session. 
 
387
     Applications can control the behaviour.  They can at any time
 
388
     set a 'desirable' servername for a new SSL object. This can be the
 
389
     case for example with HTTPS when a Host: header field is received and
 
390
     a renegotiation is requested. In this case, a possible servername
 
391
     presented in the new client hello is only acknowledged if it matches
 
392
     the value of the Host: field. 
 
393
   - Applications must  use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
 
394
     if they provide for changing an explicit servername context for the session,
 
395
     i.e. when the session has been established with a servername extension. 
 
396
   - On session reconnect, the servername extension may be absent. 
 
397
 
 
398
*/      
 
399
 
 
400
                if (type == TLSEXT_TYPE_server_name)
 
401
                        {
 
402
                        unsigned char *sdata;
 
403
                        int servname_type;
 
404
                        int dsize; 
 
405
                
 
406
                        if (size < 2) 
 
407
                                {
 
408
                                *al = SSL_AD_DECODE_ERROR;
 
409
                                return 0;
 
410
                                }
 
411
                        n2s(data,dsize);  
 
412
                        size -= 2;
 
413
                        if (dsize > size  ) 
 
414
                                {
 
415
                                *al = SSL_AD_DECODE_ERROR;
 
416
                                return 0;
 
417
                                } 
 
418
 
 
419
                        sdata = data;
 
420
                        while (dsize > 3) 
 
421
                                {
 
422
                                servname_type = *(sdata++); 
 
423
                                n2s(sdata,len);
 
424
                                dsize -= 3;
 
425
 
 
426
                                if (len > dsize) 
 
427
                                        {
 
428
                                        *al = SSL_AD_DECODE_ERROR;
 
429
                                        return 0;
 
430
                                        }
 
431
                                if (s->servername_done == 0)
 
432
                                switch (servname_type)
 
433
                                        {
 
434
                                case TLSEXT_NAMETYPE_host_name:
 
435
                                        if (s->session->tlsext_hostname == NULL)
 
436
                                                {
 
437
                                                if (len > TLSEXT_MAXLEN_host_name || 
 
438
                                                        ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL))
 
439
                                                        {
 
440
                                                        *al = TLS1_AD_UNRECOGNIZED_NAME;
 
441
                                                        return 0;
 
442
                                                        }
 
443
                                                memcpy(s->session->tlsext_hostname, sdata, len);
 
444
                                                s->session->tlsext_hostname[len]='\0';
 
445
                                                if (strlen(s->session->tlsext_hostname) != len) {
 
446
                                                        OPENSSL_free(s->session->tlsext_hostname);
 
447
                                                        s->session->tlsext_hostname = NULL;
 
448
                                                        *al = TLS1_AD_UNRECOGNIZED_NAME;
 
449
                                                        return 0;
 
450
                                                }
 
451
                                                s->servername_done = 1; 
 
452
 
 
453
                                                }
 
454
                                        else 
 
455
                                                s->servername_done = strlen(s->session->tlsext_hostname) == len 
 
456
                                                        && strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
 
457
                                        
 
458
                                        break;
 
459
 
 
460
                                default:
 
461
                                        break;
 
462
                                        }
 
463
                                 
 
464
                                dsize -= len;
 
465
                                }
 
466
                        if (dsize != 0) 
 
467
                                {
 
468
                                *al = SSL_AD_DECODE_ERROR;
 
469
                                return 0;
 
470
                                }
 
471
 
 
472
                        }
 
473
                else if (type == TLSEXT_TYPE_renegotiate)
 
474
                        {
 
475
                        if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
 
476
                                return 0;
 
477
                        renegotiate_seen = 1;
 
478
                        }
 
479
                else if (type == TLSEXT_TYPE_status_request &&
 
480
                         s->version != DTLS1_VERSION && s->ctx->tlsext_status_cb)
 
481
                        {
 
482
                
 
483
                        if (size < 5) 
 
484
                                {
 
485
                                *al = SSL_AD_DECODE_ERROR;
 
486
                                return 0;
 
487
                                }
 
488
 
 
489
                        s->tlsext_status_type = *data++;
 
490
                        size--;
 
491
                        if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
 
492
                                {
 
493
                                const unsigned char *sdata;
 
494
                                int dsize;
 
495
                                /* Read in responder_id_list */
 
496
                                n2s(data,dsize);
 
497
                                size -= 2;
 
498
                                if (dsize > size  ) 
 
499
                                        {
 
500
                                        *al = SSL_AD_DECODE_ERROR;
 
501
                                        return 0;
 
502
                                        }
 
503
                                while (dsize > 0)
 
504
                                        {
 
505
                                        OCSP_RESPID *id;
 
506
                                        int idsize;
 
507
                                        if (dsize < 4)
 
508
                                                {
 
509
                                                *al = SSL_AD_DECODE_ERROR;
 
510
                                                return 0;
 
511
                                                }
 
512
                                        n2s(data, idsize);
 
513
                                        dsize -= 2 + idsize;
 
514
                                        if (dsize < 0)
 
515
                                                {
 
516
                                                *al = SSL_AD_DECODE_ERROR;
 
517
                                                return 0;
 
518
                                                }
 
519
                                        sdata = data;
 
520
                                        data += idsize;
 
521
                                        id = d2i_OCSP_RESPID(NULL,
 
522
                                                                &sdata, idsize);
 
523
                                        if (!id)
 
524
                                                {
 
525
                                                *al = SSL_AD_DECODE_ERROR;
 
526
                                                return 0;
 
527
                                                }
 
528
                                        if (data != sdata)
 
529
                                                {
 
530
                                                OCSP_RESPID_free(id);
 
531
                                                *al = SSL_AD_DECODE_ERROR;
 
532
                                                return 0;
 
533
                                                }
 
534
                                        if (!s->tlsext_ocsp_ids
 
535
                                                && !(s->tlsext_ocsp_ids =
 
536
                                                sk_OCSP_RESPID_new_null()))
 
537
                                                {
 
538
                                                OCSP_RESPID_free(id);
 
539
                                                *al = SSL_AD_INTERNAL_ERROR;
 
540
                                                return 0;
 
541
                                                }
 
542
                                        if (!sk_OCSP_RESPID_push(
 
543
                                                        s->tlsext_ocsp_ids, id))
 
544
                                                {
 
545
                                                OCSP_RESPID_free(id);
 
546
                                                *al = SSL_AD_INTERNAL_ERROR;
 
547
                                                return 0;
 
548
                                                }
 
549
                                        }
 
550
 
 
551
                                /* Read in request_extensions */
 
552
                                n2s(data,dsize);
 
553
                                size -= 2;
 
554
                                if (dsize > size) 
 
555
                                        {
 
556
                                        *al = SSL_AD_DECODE_ERROR;
 
557
                                        return 0;
 
558
                                        }
 
559
                                sdata = data;
 
560
                                if (dsize > 0)
 
561
                                        {
 
562
                                        s->tlsext_ocsp_exts =
 
563
                                                d2i_X509_EXTENSIONS(NULL,
 
564
                                                        &sdata, dsize);
 
565
                                        if (!s->tlsext_ocsp_exts
 
566
                                                || (data + dsize != sdata))
 
567
                                                {
 
568
                                                *al = SSL_AD_DECODE_ERROR;
 
569
                                                return 0;
 
570
                                                }
 
571
                                        }
 
572
                                }
 
573
                                /* We don't know what to do with any other type
 
574
                                * so ignore it.
 
575
                                */
 
576
                                else
 
577
                                        s->tlsext_status_type = -1;
 
578
                        }
 
579
 
 
580
                /* session ticket processed earlier */
 
581
 
 
582
                data+=size;             
 
583
                }
 
584
        *p = data;
 
585
 
 
586
        ri_check:
 
587
 
 
588
        /* Need RI if renegotiating */
 
589
 
 
590
        if (!renegotiate_seen && s->new_session &&
 
591
                !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
 
592
                {
 
593
                *al = SSL_AD_HANDSHAKE_FAILURE;
 
594
                SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,
 
595
                                SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
 
596
                return 0;
 
597
                }
 
598
 
 
599
        return 1;
 
600
        }
 
601
 
 
602
int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
 
603
        {
 
604
        unsigned short type;
 
605
        unsigned short size;
 
606
        unsigned short len;  
 
607
        unsigned char *data = *p;
 
608
        int tlsext_servername = 0;
 
609
        int renegotiate_seen = 0;
 
610
 
 
611
        if (data >= (d+n-2))
 
612
                goto ri_check;
 
613
 
 
614
        n2s(data,len);
 
615
 
 
616
        while(data <= (d+n-4))
 
617
                {
 
618
                n2s(data,type);
 
619
                n2s(data,size);
 
620
 
 
621
                if (data+size > (d+n))
 
622
                        goto ri_check;
 
623
 
 
624
                if (s->tlsext_debug_cb)
 
625
                        s->tlsext_debug_cb(s, 1, type, data, size,
 
626
                                                s->tlsext_debug_arg);
 
627
 
 
628
                if (type == TLSEXT_TYPE_server_name)
 
629
                        {
 
630
                        if (s->tlsext_hostname == NULL || size > 0)
 
631
                                {
 
632
                                *al = TLS1_AD_UNRECOGNIZED_NAME;
 
633
                                return 0;
 
634
                                }
 
635
                        tlsext_servername = 1;   
 
636
                        }
 
637
                else if (type == TLSEXT_TYPE_session_ticket)
 
638
                        {
 
639
                        if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
 
640
                                || (size > 0))
 
641
                                {
 
642
                                *al = TLS1_AD_UNSUPPORTED_EXTENSION;
 
643
                                return 0;
 
644
                                }
 
645
                        s->tlsext_ticket_expected = 1;
 
646
                        }
 
647
                else if (type == TLSEXT_TYPE_status_request &&
 
648
                         s->version != DTLS1_VERSION)
 
649
                        {
 
650
                        /* MUST be empty and only sent if we've requested
 
651
                         * a status request message.
 
652
                         */ 
 
653
                        if ((s->tlsext_status_type == -1) || (size > 0))
 
654
                                {
 
655
                                *al = TLS1_AD_UNSUPPORTED_EXTENSION;
 
656
                                return 0;
 
657
                                }
 
658
                        /* Set flag to expect CertificateStatus message */
 
659
                        s->tlsext_status_expected = 1;
 
660
                        }
 
661
                else if (type == TLSEXT_TYPE_renegotiate)
 
662
                        {
 
663
                        if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
 
664
                                return 0;
 
665
                        renegotiate_seen = 1;
 
666
                        }
 
667
                data+=size;             
 
668
                }
 
669
 
 
670
        if (data != d+n)
 
671
                {
 
672
                *al = SSL_AD_DECODE_ERROR;
 
673
                return 0;
 
674
                }
 
675
 
 
676
        if (!s->hit && tlsext_servername == 1)
 
677
                {
 
678
                if (s->tlsext_hostname)
 
679
                        {
 
680
                        if (s->session->tlsext_hostname == NULL)
 
681
                                {
 
682
                                s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);   
 
683
                                if (!s->session->tlsext_hostname)
 
684
                                        {
 
685
                                        *al = SSL_AD_UNRECOGNIZED_NAME;
 
686
                                        return 0;
 
687
                                        }
 
688
                                }
 
689
                        else 
 
690
                                {
 
691
                                *al = SSL_AD_DECODE_ERROR;
 
692
                                return 0;
 
693
                                }
 
694
                        }
 
695
                }
 
696
 
 
697
        *p = data;
 
698
 
 
699
        ri_check:
 
700
 
 
701
        /* Determine if we need to see RI. Strictly speaking if we want to
 
702
         * avoid an attack we should *always* see RI even on initial server
 
703
         * hello because the client doesn't see any renegotiation during an
 
704
         * attack. However this would mean we could not connect to any server
 
705
         * which doesn't support RI so for the immediate future tolerate RI
 
706
         * absence on initial connect only.
 
707
         */
 
708
        if (!renegotiate_seen
 
709
                && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
 
710
                && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
 
711
                {
 
712
                *al = SSL_AD_HANDSHAKE_FAILURE;
 
713
                SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,
 
714
                                SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
 
715
                return 0;
 
716
                }
 
717
 
 
718
        return 1;
 
719
        }
 
720
 
 
721
int ssl_check_clienthello_tlsext(SSL *s)
 
722
        {
 
723
        int ret=SSL_TLSEXT_ERR_NOACK;
 
724
        int al = SSL_AD_UNRECOGNIZED_NAME;
 
725
 
 
726
        if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0) 
 
727
                ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
 
728
        else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)             
 
729
                ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
 
730
 
 
731
        /* If status request then ask callback what to do.
 
732
         * Note: this must be called after servername callbacks in case 
 
733
         * the certificate has changed.
 
734
         */
 
735
        if ((s->tlsext_status_type != -1) && s->ctx->tlsext_status_cb)
 
736
                {
 
737
                int r;
 
738
                r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
 
739
                switch (r)
 
740
                        {
 
741
                        /* We don't want to send a status request response */
 
742
                        case SSL_TLSEXT_ERR_NOACK:
 
743
                                s->tlsext_status_expected = 0;
 
744
                                break;
 
745
                        /* status request response should be sent */
 
746
                        case SSL_TLSEXT_ERR_OK:
 
747
                                if (s->tlsext_ocsp_resp)
 
748
                                        s->tlsext_status_expected = 1;
 
749
                                else
 
750
                                        s->tlsext_status_expected = 0;
 
751
                                break;
 
752
                        /* something bad happened */
 
753
                        case SSL_TLSEXT_ERR_ALERT_FATAL:
 
754
                                ret = SSL_TLSEXT_ERR_ALERT_FATAL;
 
755
                                al = SSL_AD_INTERNAL_ERROR;
 
756
                                goto err;
 
757
                        }
 
758
                }
 
759
        else
 
760
                s->tlsext_status_expected = 0;
 
761
        err:
 
762
        switch (ret)
 
763
                {
 
764
                case SSL_TLSEXT_ERR_ALERT_FATAL:
 
765
                        ssl3_send_alert(s,SSL3_AL_FATAL,al); 
 
766
                        return -1;
 
767
 
 
768
                case SSL_TLSEXT_ERR_ALERT_WARNING:
 
769
                        ssl3_send_alert(s,SSL3_AL_WARNING,al);
 
770
                        return 1; 
 
771
                                        
 
772
                case SSL_TLSEXT_ERR_NOACK:
 
773
                        s->servername_done=0;
 
774
                        default:
 
775
                return 1;
 
776
                }
 
777
        }
 
778
 
 
779
int ssl_check_serverhello_tlsext(SSL *s)
 
780
        {
 
781
        int ret=SSL_TLSEXT_ERR_NOACK;
 
782
        int al = SSL_AD_UNRECOGNIZED_NAME;
 
783
 
 
784
        if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0) 
 
785
                ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
 
786
        else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)             
 
787
                ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
 
788
 
 
789
        /* If we've requested certificate status and we wont get one
 
790
         * tell the callback
 
791
         */
 
792
        if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
 
793
                        && s->ctx->tlsext_status_cb)
 
794
                {
 
795
                int r;
 
796
                /* Set resp to NULL, resplen to -1 so callback knows
 
797
                 * there is no response.
 
798
                 */
 
799
                if (s->tlsext_ocsp_resp)
 
800
                        {
 
801
                        OPENSSL_free(s->tlsext_ocsp_resp);
 
802
                        s->tlsext_ocsp_resp = NULL;
 
803
                        }
 
804
                s->tlsext_ocsp_resplen = -1;
 
805
                r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
 
806
                if (r == 0)
 
807
                        {
 
808
                        al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
 
809
                        ret = SSL_TLSEXT_ERR_ALERT_FATAL;
 
810
                        }
 
811
                if (r < 0)
 
812
                        {
 
813
                        al = SSL_AD_INTERNAL_ERROR;
 
814
                        ret = SSL_TLSEXT_ERR_ALERT_FATAL;
 
815
                        }
 
816
                }
 
817
 
 
818
        switch (ret)
 
819
                {
 
820
                case SSL_TLSEXT_ERR_ALERT_FATAL:
 
821
                        ssl3_send_alert(s,SSL3_AL_FATAL,al); 
 
822
                        return -1;
 
823
 
 
824
                case SSL_TLSEXT_ERR_ALERT_WARNING:
 
825
                        ssl3_send_alert(s,SSL3_AL_WARNING,al);
 
826
                        return 1; 
 
827
                                        
 
828
                case SSL_TLSEXT_ERR_NOACK:
 
829
                        s->servername_done=0;
 
830
                        default:
 
831
                return 1;
 
832
                }
 
833
        }
 
834
 
 
835
/* Since the server cache lookup is done early on in the processing of client
 
836
 * hello and other operations depend on the result we need to handle any TLS
 
837
 * session ticket extension at the same time.
 
838
 */
 
839
 
 
840
int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
 
841
                                const unsigned char *limit, SSL_SESSION **ret)
 
842
        {
 
843
        /* Point after session ID in client hello */
 
844
        const unsigned char *p = session_id + len;
 
845
        unsigned short i;
 
846
 
 
847
        /* If tickets disabled behave as if no ticket present
 
848
         * to permit stateful resumption.
 
849
         */
 
850
        if (SSL_get_options(s) & SSL_OP_NO_TICKET)
 
851
                return 1;
 
852
 
 
853
        if ((s->version <= SSL3_VERSION) || !limit)
 
854
                return 1;
 
855
        if (p >= limit)
 
856
                return -1;
 
857
        /* Skip past DTLS cookie */
 
858
        if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
 
859
                {
 
860
                i = *(p++);
 
861
                p+= i;
 
862
                if (p >= limit)
 
863
                        return -1;
 
864
                }
 
865
        /* Skip past cipher list */
 
866
        n2s(p, i);
 
867
        p+= i;
 
868
        if (p >= limit)
 
869
                return -1;
 
870
        /* Skip past compression algorithm list */
 
871
        i = *(p++);
 
872
        p += i;
 
873
        if (p > limit)
 
874
                return -1;
 
875
        /* Now at start of extensions */
 
876
        if ((p + 2) >= limit)
 
877
                return 1;
 
878
        n2s(p, i);
 
879
        while ((p + 4) <= limit)
 
880
                {
 
881
                unsigned short type, size;
 
882
                n2s(p, type);
 
883
                n2s(p, size);
 
884
                if (p + size > limit)
 
885
                        return 1;
 
886
                if (type == TLSEXT_TYPE_session_ticket)
 
887
                        {
 
888
                        /* If zero length note client will accept a ticket
 
889
                         * and indicate cache miss to trigger full handshake
 
890
                         */
 
891
                        if (size == 0)
 
892
                                {
 
893
                                s->tlsext_ticket_expected = 1;
 
894
                                return 0;       /* Cache miss */
 
895
                                }
 
896
                        return tls_decrypt_ticket(s, p, size, session_id, len,
 
897
                                                                        ret);
 
898
                        }
 
899
                p += size;
 
900
                }
 
901
        return 1;
 
902
        }
 
903
 
 
904
static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
 
905
                                const unsigned char *sess_id, int sesslen,
 
906
                                SSL_SESSION **psess)
 
907
        {
 
908
        SSL_SESSION *sess;
 
909
        unsigned char *sdec;
 
910
        const unsigned char *p;
 
911
        int slen, mlen, renew_ticket = 0;
 
912
        unsigned char tick_hmac[EVP_MAX_MD_SIZE];
 
913
        HMAC_CTX hctx;
 
914
        EVP_CIPHER_CTX ctx;
 
915
        SSL_CTX *tctx = s->initial_ctx;
 
916
        /* Need at least keyname + iv + some encrypted data */
 
917
        if (eticklen < 48)
 
918
                goto tickerr;
 
919
        /* Initialize session ticket encryption and HMAC contexts */
 
920
        HMAC_CTX_init(&hctx);
 
921
        EVP_CIPHER_CTX_init(&ctx);
 
922
        if (tctx->tlsext_ticket_key_cb)
 
923
                {
 
924
                unsigned char *nctick = (unsigned char *)etick;
 
925
                int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
 
926
                                                        &ctx, &hctx, 0);
 
927
                if (rv < 0)
 
928
                        return -1;
 
929
                if (rv == 0)
 
930
                        goto tickerr;
 
931
                if (rv == 2)
 
932
                        renew_ticket = 1;
 
933
                }
 
934
        else
 
935
                {
 
936
                /* Check key name matches */
 
937
                if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
 
938
                        goto tickerr;
 
939
                HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
 
940
                                        tlsext_tick_md(), NULL);
 
941
                EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
 
942
                                tctx->tlsext_tick_aes_key, etick + 16);
 
943
                }
 
944
        /* Attempt to process session ticket, first conduct sanity and
 
945
         * integrity checks on ticket.
 
946
         */
 
947
        mlen = HMAC_size(&hctx);
 
948
        eticklen -= mlen;
 
949
        /* Check HMAC of encrypted ticket */
 
950
        HMAC_Update(&hctx, etick, eticklen);
 
951
        HMAC_Final(&hctx, tick_hmac, NULL);
 
952
        HMAC_CTX_cleanup(&hctx);
 
953
        if (memcmp(tick_hmac, etick + eticklen, mlen))
 
954
                goto tickerr;
 
955
        /* Attempt to decrypt session data */
 
956
        /* Move p after IV to start of encrypted ticket, update length */
 
957
        p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
 
958
        eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
 
959
        sdec = OPENSSL_malloc(eticklen);
 
960
        if (!sdec)
 
961
                {
 
962
                EVP_CIPHER_CTX_cleanup(&ctx);
 
963
                return -1;
 
964
                }
 
965
        EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
 
966
        if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0)
 
967
                goto tickerr;
 
968
        slen += mlen;
 
969
        EVP_CIPHER_CTX_cleanup(&ctx);
 
970
        p = sdec;
 
971
                
 
972
        sess = d2i_SSL_SESSION(NULL, &p, slen);
 
973
        OPENSSL_free(sdec);
 
974
        if (sess)
 
975
                {
 
976
                /* The session ID if non-empty is used by some clients to
 
977
                 * detect that the ticket has been accepted. So we copy it to
 
978
                 * the session structure. If it is empty set length to zero
 
979
                 * as required by standard.
 
980
                 */
 
981
                if (sesslen)
 
982
                        memcpy(sess->session_id, sess_id, sesslen);
 
983
                sess->session_id_length = sesslen;
 
984
                *psess = sess;
 
985
                s->tlsext_ticket_expected = renew_ticket;
 
986
                return 1;
 
987
                }
 
988
        /* If session decrypt failure indicate a cache miss and set state to
 
989
         * send a new ticket
 
990
         */
 
991
        tickerr:        
 
992
        s->tlsext_ticket_expected = 1;
 
993
        return 0;
 
994
        }
 
995
 
 
996
#endif