~ubuntu-branches/ubuntu/utopic/openssl/utopic

« back to all changes in this revision

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

  • Committer: Bazaar Package Importer
  • Author(s): Kurt Roeckx
  • Date: 2011-04-02 13:19:19 UTC
  • mfrom: (1.2.1 upstream) (11.2.2 experimental)
  • mto: This revision was merged to the branch mainline in revision 55.
  • Revision ID: james.westby@ubuntu.com-20110402131919-anszuslper64ey9e
Tags: 1.0.0d-1
* New upstream version
  - Fixes CVE-2011-0014
* Make libssl-doc Replaces/Breaks with old libssl-dev packages
  (Closes: #607609)
* Only export the symbols we should, instead of all.
* Add symbol file.
* Upload to unstable

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