The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / openssl / openssl / ssl / t1_enc.c @ aa3b4b4d

History | View | Annotate | Download (36.4 KB)

1
/* ssl/t1_enc.c */
2
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3
 * All rights reserved.
4
 *
5
 * This package is an SSL implementation written
6
 * by Eric Young (eay@cryptsoft.com).
7
 * The implementation was written so as to conform with Netscapes SSL.
8
 * 
9
 * This library is free for commercial and non-commercial use as long as
10
 * the following conditions are aheared to.  The following conditions
11
 * apply to all code found in this distribution, be it the RC4, RSA,
12
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13
 * included with this distribution is covered by the same copyright terms
14
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15
 * 
16
 * Copyright remains Eric Young's, and as such any Copyright notices in
17
 * the code are not to be removed.
18
 * If this package is used in a product, Eric Young should be given attribution
19
 * as the author of the parts of the library used.
20
 * This can be in the form of a textual message at program startup or
21
 * in documentation (online or textual) provided with the package.
22
 * 
23
 * Redistribution and use in source and binary forms, with or without
24
 * modification, are permitted provided that the following conditions
25
 * are met:
26
 * 1. Redistributions of source code must retain the copyright
27
 *    notice, this list of conditions and the following disclaimer.
28
 * 2. Redistributions in binary form must reproduce the above copyright
29
 *    notice, this list of conditions and the following disclaimer in the
30
 *    documentation and/or other materials provided with the distribution.
31
 * 3. All advertising materials mentioning features or use of this software
32
 *    must display the following acknowledgement:
33
 *    "This product includes cryptographic software written by
34
 *     Eric Young (eay@cryptsoft.com)"
35
 *    The word 'cryptographic' can be left out if the rouines from the library
36
 *    being used are not cryptographic related :-).
37
 * 4. If you include any Windows specific code (or a derivative thereof) from 
38
 *    the apps directory (application code) you must include an acknowledgement:
39
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40
 * 
41
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51
 * SUCH DAMAGE.
52
 * 
53
 * The licence and distribution terms for any publically available version or
54
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
55
 * copied and put under another distribution licence
56
 * [including the GNU Public Licence.]
57
 */
58
/* ====================================================================
59
 * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
60
 *
61
 * Redistribution and use in source and binary forms, with or without
62
 * modification, are permitted provided that the following conditions
63
 * are met:
64
 *
65
 * 1. Redistributions of source code must retain the above copyright
66
 *    notice, this list of conditions and the following disclaimer. 
67
 *
68
 * 2. Redistributions in binary form must reproduce the above copyright
69
 *    notice, this list of conditions and the following disclaimer in
70
 *    the documentation and/or other materials provided with the
71
 *    distribution.
72
 *
73
 * 3. All advertising materials mentioning features or use of this
74
 *    software must display the following acknowledgment:
75
 *    "This product includes software developed by the OpenSSL Project
76
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77
 *
78
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79
 *    endorse or promote products derived from this software without
80
 *    prior written permission. For written permission, please contact
81
 *    openssl-core@openssl.org.
82
 *
83
 * 5. Products derived from this software may not be called "OpenSSL"
84
 *    nor may "OpenSSL" appear in their names without prior written
85
 *    permission of the OpenSSL Project.
86
 *
87
 * 6. Redistributions of any form whatsoever must retain the following
88
 *    acknowledgment:
89
 *    "This product includes software developed by the OpenSSL Project
90
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91
 *
92
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103
 * OF THE POSSIBILITY OF SUCH DAMAGE.
104
 * ====================================================================
105
 *
106
 * This product includes cryptographic software written by Eric Young
107
 * (eay@cryptsoft.com).  This product includes software written by Tim
108
 * Hudson (tjh@cryptsoft.com).
109
 *
110
 */
111
/* ====================================================================
112
 * Copyright 2005 Nokia. All rights reserved.
113
 *
114
 * The portions of the attached software ("Contribution") is developed by
115
 * Nokia Corporation and is licensed pursuant to the OpenSSL open source
116
 * license.
117
 *
118
 * The Contribution, originally written by Mika Kousa and Pasi Eronen of
119
 * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
120
 * support (see RFC 4279) to OpenSSL.
121
 *
122
 * No patent licenses or other rights except those expressly stated in
123
 * the OpenSSL open source license shall be deemed granted or received
124
 * expressly, by implication, estoppel, or otherwise.
125
 *
126
 * No assurances are provided by Nokia that the Contribution does not
127
 * infringe the patent or other intellectual property rights of any third
128
 * party or that the license provides you with all the necessary rights
129
 * to make use of the Contribution.
130
 *
131
 * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
132
 * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
133
 * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
134
 * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
135
 * OTHERWISE.
136
 */
137

    
138
#include <stdio.h>
139
#include "ssl_locl.h"
140
#ifndef OPENSSL_NO_COMP
141
#include <openssl/comp.h>
142
#endif
143
#include <openssl/evp.h>
144
#include <openssl/hmac.h>
145
#include <openssl/md5.h>
146
#include <openssl/rand.h>
147
#ifdef KSSL_DEBUG
148
#include <openssl/des.h>
149
#endif
150

    
151
/* seed1 through seed5 are virtually concatenated */
152
static int tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
153
                        int sec_len,
154
                        const void *seed1, int seed1_len,
155
                        const void *seed2, int seed2_len,
156
                        const void *seed3, int seed3_len,
157
                        const void *seed4, int seed4_len,
158
                        const void *seed5, int seed5_len,
159
                        unsigned char *out, int olen)
160
        {
161
        int chunk;
162
        size_t j;
163
        EVP_MD_CTX ctx, ctx_tmp;
164
        EVP_PKEY *mac_key;
165
        unsigned char A1[EVP_MAX_MD_SIZE];
166
        size_t A1_len;
167
        int ret = 0;
168
        
169
        chunk=EVP_MD_size(md);
170
        OPENSSL_assert(chunk >= 0);
171

    
172
        EVP_MD_CTX_init(&ctx);
173
        EVP_MD_CTX_init(&ctx_tmp);
174
        EVP_MD_CTX_set_flags(&ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
175
        EVP_MD_CTX_set_flags(&ctx_tmp, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
176
        mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sec, sec_len);
177
        if (!mac_key)
178
                goto err;
179
        if (!EVP_DigestSignInit(&ctx,NULL,md, NULL, mac_key))
180
                goto err;
181
        if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key))
182
                goto err;
183
        if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len))
184
                goto err;
185
        if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len))
186
                goto err;
187
        if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len))
188
                goto err;
189
        if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len))
190
                goto err;
191
        if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
192
                goto err;
193
        if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
194
                goto err;
195

    
196
        for (;;)
197
                {
198
                /* Reinit mac contexts */
199
                if (!EVP_DigestSignInit(&ctx,NULL,md, NULL, mac_key))
200
                        goto err;
201
                if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key))
202
                        goto err;
203
                if (!EVP_DigestSignUpdate(&ctx,A1,A1_len))
204
                        goto err;
205
                if (!EVP_DigestSignUpdate(&ctx_tmp,A1,A1_len))
206
                        goto err;
207
                if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len))
208
                        goto err;
209
                if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len))
210
                        goto err;
211
                if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len))
212
                        goto err;
213
                if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len))
214
                        goto err;
215
                if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
216
                        goto err;
217

    
218
                if (olen > chunk)
219
                        {
220
                        if (!EVP_DigestSignFinal(&ctx,out,&j))
221
                                goto err;
222
                        out+=j;
223
                        olen-=j;
224
                        /* calc the next A1 value */
225
                        if (!EVP_DigestSignFinal(&ctx_tmp,A1,&A1_len))
226
                                goto err;
227
                        }
228
                else        /* last one */
229
                        {
230
                        if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
231
                                goto err;
232
                        memcpy(out,A1,olen);
233
                        break;
234
                        }
235
                }
236
        ret = 1;
237
err:
238
        EVP_PKEY_free(mac_key);
239
        EVP_MD_CTX_cleanup(&ctx);
240
        EVP_MD_CTX_cleanup(&ctx_tmp);
241
        OPENSSL_cleanse(A1,sizeof(A1));
242
        return ret;
243
        }
244

    
245
/* seed1 through seed5 are virtually concatenated */
246
static int tls1_PRF(long digest_mask,
247
                     const void *seed1, int seed1_len,
248
                     const void *seed2, int seed2_len,
249
                     const void *seed3, int seed3_len,
250
                     const void *seed4, int seed4_len,
251
                     const void *seed5, int seed5_len,
252
                     const unsigned char *sec, int slen,
253
                     unsigned char *out1,
254
                     unsigned char *out2, int olen)
255
        {
256
        int len,i,idx,count;
257
        const unsigned char *S1;
258
        long m;
259
        const EVP_MD *md;
260
        int ret = 0;
261

    
262
        /* Count number of digests and partition sec evenly */
263
        count=0;
264
        for (idx=0;ssl_get_handshake_digest(idx,&m,&md);idx++) {
265
                if ((m<<TLS1_PRF_DGST_SHIFT) & digest_mask) count++;
266
        }        
267
        len=slen/count;
268
        if (count == 1)
269
                slen = 0;
270
        S1=sec;
271
        memset(out1,0,olen);
272
        for (idx=0;ssl_get_handshake_digest(idx,&m,&md);idx++) {
273
                if ((m<<TLS1_PRF_DGST_SHIFT) & digest_mask) {
274
                        if (!md) {
275
                                SSLerr(SSL_F_TLS1_PRF,
276
                                SSL_R_UNSUPPORTED_DIGEST_TYPE);
277
                                goto err;                                
278
                        }
279
                        if (!tls1_P_hash(md ,S1,len+(slen&1),
280
                                        seed1,seed1_len,seed2,seed2_len,seed3,seed3_len,seed4,seed4_len,seed5,seed5_len,
281
                                        out2,olen))
282
                                goto err;
283
                        S1+=len;
284
                        for (i=0; i<olen; i++)
285
                        {
286
                                out1[i]^=out2[i];
287
                        }
288
                }
289
        }
290
        ret = 1;
291
err:
292
        return ret;
293
}
294
static int tls1_generate_key_block(SSL *s, unsigned char *km,
295
             unsigned char *tmp, int num)
296
        {
297
        int ret;
298
        ret = tls1_PRF(ssl_get_algorithm2(s),
299
                 TLS_MD_KEY_EXPANSION_CONST,TLS_MD_KEY_EXPANSION_CONST_SIZE,
300
                 s->s3->server_random,SSL3_RANDOM_SIZE,
301
                 s->s3->client_random,SSL3_RANDOM_SIZE,
302
                 NULL,0,NULL,0,
303
                 s->session->master_key,s->session->master_key_length,
304
                 km,tmp,num);
305
#ifdef KSSL_DEBUG
306
        printf("tls1_generate_key_block() ==> %d byte master_key =\n\t",
307
                s->session->master_key_length);
308
        {
309
        int i;
310
        for (i=0; i < s->session->master_key_length; i++)
311
                {
312
                printf("%02X", s->session->master_key[i]);
313
                }
314
        printf("\n");  }
315
#endif    /* KSSL_DEBUG */
316
        return ret;
317
        }
318

    
319
int tls1_change_cipher_state(SSL *s, int which)
320
        {
321
        static const unsigned char empty[]="";
322
        unsigned char *p,*mac_secret;
323
        unsigned char *exp_label;
324
        unsigned char tmp1[EVP_MAX_KEY_LENGTH];
325
        unsigned char tmp2[EVP_MAX_KEY_LENGTH];
326
        unsigned char iv1[EVP_MAX_IV_LENGTH*2];
327
        unsigned char iv2[EVP_MAX_IV_LENGTH*2];
328
        unsigned char *ms,*key,*iv;
329
        int client_write;
330
        EVP_CIPHER_CTX *dd;
331
        const EVP_CIPHER *c;
332
#ifndef OPENSSL_NO_COMP
333
        const SSL_COMP *comp;
334
#endif
335
        const EVP_MD *m;
336
        int mac_type;
337
        int *mac_secret_size;
338
        EVP_MD_CTX *mac_ctx;
339
        EVP_PKEY *mac_key;
340
        int is_export,n,i,j,k,exp_label_len,cl;
341
        int reuse_dd = 0;
342

    
343
        is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
344
        c=s->s3->tmp.new_sym_enc;
345
        m=s->s3->tmp.new_hash;
346
        mac_type = s->s3->tmp.new_mac_pkey_type;
347
#ifndef OPENSSL_NO_COMP
348
        comp=s->s3->tmp.new_compression;
349
#endif
350

    
351
#ifdef KSSL_DEBUG
352
        printf("tls1_change_cipher_state(which= %d) w/\n", which);
353
        printf("\talg= %ld/%ld, comp= %p\n",
354
               s->s3->tmp.new_cipher->algorithm_mkey,
355
               s->s3->tmp.new_cipher->algorithm_auth,
356
               comp);
357
        printf("\tevp_cipher == %p ==? &d_cbc_ede_cipher3\n", c);
358
        printf("\tevp_cipher: nid, blksz= %d, %d, keylen=%d, ivlen=%d\n",
359
                c->nid,c->block_size,c->key_len,c->iv_len);
360
        printf("\tkey_block: len= %d, data= ", s->s3->tmp.key_block_length);
361
        {
362
        int i;
363
        for (i=0; i<s->s3->tmp.key_block_length; i++)
364
                printf("%02x", s->s3->tmp.key_block[i]);  printf("\n");
365
        }
366
#endif        /* KSSL_DEBUG */
367

    
368
        if (which & SSL3_CC_READ)
369
                {
370
                if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
371
                        s->mac_flags |= SSL_MAC_FLAG_READ_MAC_STREAM;
372
                else
373
                        s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_STREAM;
374

    
375
                if (s->enc_read_ctx != NULL)
376
                        reuse_dd = 1;
377
                else if ((s->enc_read_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
378
                        goto err;
379
                else
380
                        /* make sure it's intialized in case we exit later with an error */
381
                        EVP_CIPHER_CTX_init(s->enc_read_ctx);
382
                dd= s->enc_read_ctx;
383
                mac_ctx=ssl_replace_hash(&s->read_hash,NULL);
384
#ifndef OPENSSL_NO_COMP
385
                if (s->expand != NULL)
386
                        {
387
                        COMP_CTX_free(s->expand);
388
                        s->expand=NULL;
389
                        }
390
                if (comp != NULL)
391
                        {
392
                        s->expand=COMP_CTX_new(comp->method);
393
                        if (s->expand == NULL)
394
                                {
395
                                SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
396
                                goto err2;
397
                                }
398
                        if (s->s3->rrec.comp == NULL)
399
                                s->s3->rrec.comp=(unsigned char *)
400
                                        OPENSSL_malloc(SSL3_RT_MAX_ENCRYPTED_LENGTH);
401
                        if (s->s3->rrec.comp == NULL)
402
                                goto err;
403
                        }
404
#endif
405
                /* this is done by dtls1_reset_seq_numbers for DTLS1_VERSION */
406
                 if (s->version != DTLS1_VERSION)
407
                        memset(&(s->s3->read_sequence[0]),0,8);
408
                mac_secret= &(s->s3->read_mac_secret[0]);
409
                mac_secret_size=&(s->s3->read_mac_secret_size);
410
                }
411
        else
412
                {
413
                if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
414
                        s->mac_flags |= SSL_MAC_FLAG_WRITE_MAC_STREAM;
415
                        else
416
                        s->mac_flags &= ~SSL_MAC_FLAG_WRITE_MAC_STREAM;
417
                if (s->enc_write_ctx != NULL && !SSL_IS_DTLS(s))
418
                        reuse_dd = 1;
419
                else if ((s->enc_write_ctx=EVP_CIPHER_CTX_new()) == NULL)
420
                        goto err;
421
                dd= s->enc_write_ctx;
422
                if (SSL_IS_DTLS(s))
423
                        {
424
                        mac_ctx = EVP_MD_CTX_create();
425
                        if (!mac_ctx)
426
                                goto err;
427
                        s->write_hash = mac_ctx;
428
                        }
429
                else
430
                        mac_ctx = ssl_replace_hash(&s->write_hash,NULL);
431
#ifndef OPENSSL_NO_COMP
432
                if (s->compress != NULL)
433
                        {
434
                        COMP_CTX_free(s->compress);
435
                        s->compress=NULL;
436
                        }
437
                if (comp != NULL)
438
                        {
439
                        s->compress=COMP_CTX_new(comp->method);
440
                        if (s->compress == NULL)
441
                                {
442
                                SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
443
                                goto err2;
444
                                }
445
                        }
446
#endif
447
                /* this is done by dtls1_reset_seq_numbers for DTLS1_VERSION */
448
                 if (s->version != DTLS1_VERSION)
449
                        memset(&(s->s3->write_sequence[0]),0,8);
450
                mac_secret= &(s->s3->write_mac_secret[0]);
451
                mac_secret_size = &(s->s3->write_mac_secret_size);
452
                }
453

    
454
        if (reuse_dd)
455
                EVP_CIPHER_CTX_cleanup(dd);
456

    
457
        p=s->s3->tmp.key_block;
458
        i=*mac_secret_size=s->s3->tmp.new_mac_secret_size;
459

    
460
        cl=EVP_CIPHER_key_length(c);
461
        j=is_export ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ?
462
                       cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl;
463
        /* Was j=(exp)?5:EVP_CIPHER_key_length(c); */
464
        /* If GCM mode only part of IV comes from PRF */
465
        if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE)
466
                k = EVP_GCM_TLS_FIXED_IV_LEN;
467
        else
468
                k=EVP_CIPHER_iv_length(c);
469
        if (        (which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
470
                (which == SSL3_CHANGE_CIPHER_SERVER_READ))
471
                {
472
                ms=  &(p[ 0]); n=i+i;
473
                key= &(p[ n]); n+=j+j;
474
                iv=  &(p[ n]); n+=k+k;
475
                exp_label=(unsigned char *)TLS_MD_CLIENT_WRITE_KEY_CONST;
476
                exp_label_len=TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE;
477
                client_write=1;
478
                }
479
        else
480
                {
481
                n=i;
482
                ms=  &(p[ n]); n+=i+j;
483
                key= &(p[ n]); n+=j+k;
484
                iv=  &(p[ n]); n+=k;
485
                exp_label=(unsigned char *)TLS_MD_SERVER_WRITE_KEY_CONST;
486
                exp_label_len=TLS_MD_SERVER_WRITE_KEY_CONST_SIZE;
487
                client_write=0;
488
                }
489

    
490
        if (n > s->s3->tmp.key_block_length)
491
                {
492
                SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_INTERNAL_ERROR);
493
                goto err2;
494
                }
495

    
496
        memcpy(mac_secret,ms,i);
497

    
498
        if (!(EVP_CIPHER_flags(c)&EVP_CIPH_FLAG_AEAD_CIPHER))
499
                {
500
                mac_key = EVP_PKEY_new_mac_key(mac_type, NULL,
501
                                mac_secret,*mac_secret_size);
502
                EVP_DigestSignInit(mac_ctx,NULL,m,NULL,mac_key);
503
                EVP_PKEY_free(mac_key);
504
                }
505
#ifdef TLS_DEBUG
506
printf("which = %04X\nmac key=",which);
507
{ int z; for (z=0; z<i; z++) printf("%02X%c",ms[z],((z+1)%16)?' ':'\n'); }
508
#endif
509
        if (is_export)
510
                {
511
                /* In here I set both the read and write key/iv to the
512
                 * same value since only the correct one will be used :-).
513
                 */
514
                if (!tls1_PRF(ssl_get_algorithm2(s),
515
                                exp_label,exp_label_len,
516
                                s->s3->client_random,SSL3_RANDOM_SIZE,
517
                                s->s3->server_random,SSL3_RANDOM_SIZE,
518
                                NULL,0,NULL,0,
519
                                key,j,tmp1,tmp2,EVP_CIPHER_key_length(c)))
520
                        goto err2;
521
                key=tmp1;
522

    
523
                if (k > 0)
524
                        {
525
                        if (!tls1_PRF(ssl_get_algorithm2(s),
526
                                        TLS_MD_IV_BLOCK_CONST,TLS_MD_IV_BLOCK_CONST_SIZE,
527
                                        s->s3->client_random,SSL3_RANDOM_SIZE,
528
                                        s->s3->server_random,SSL3_RANDOM_SIZE,
529
                                        NULL,0,NULL,0,
530
                                        empty,0,iv1,iv2,k*2))
531
                                goto err2;
532
                        if (client_write)
533
                                iv=iv1;
534
                        else
535
                                iv= &(iv1[k]);
536
                        }
537
                }
538

    
539
        s->session->key_arg_length=0;
540
#ifdef KSSL_DEBUG
541
        {
542
        int i;
543
        printf("EVP_CipherInit_ex(dd,c,key=,iv=,which)\n");
544
        printf("\tkey= "); for (i=0; i<c->key_len; i++) printf("%02x", key[i]);
545
        printf("\n");
546
        printf("\t iv= "); for (i=0; i<c->iv_len; i++) printf("%02x", iv[i]);
547
        printf("\n");
548
        }
549
#endif        /* KSSL_DEBUG */
550

    
551
        if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE)
552
                {
553
                EVP_CipherInit_ex(dd,c,NULL,key,NULL,(which & SSL3_CC_WRITE));
554
                EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_GCM_SET_IV_FIXED, k, iv);
555
                }
556
        else        
557
                EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE));
558

    
559
        /* Needed for "composite" AEADs, such as RC4-HMAC-MD5 */
560
        if ((EVP_CIPHER_flags(c)&EVP_CIPH_FLAG_AEAD_CIPHER) && *mac_secret_size)
561
                EVP_CIPHER_CTX_ctrl(dd,EVP_CTRL_AEAD_SET_MAC_KEY,
562
                                *mac_secret_size,mac_secret);
563

    
564
#ifdef TLS_DEBUG
565
printf("which = %04X\nkey=",which);
566
{ int z; for (z=0; z<EVP_CIPHER_key_length(c); z++) printf("%02X%c",key[z],((z+1)%16)?' ':'\n'); }
567
printf("\niv=");
568
{ int z; for (z=0; z<k; z++) printf("%02X%c",iv[z],((z+1)%16)?' ':'\n'); }
569
printf("\n");
570
#endif
571

    
572
        OPENSSL_cleanse(tmp1,sizeof(tmp1));
573
        OPENSSL_cleanse(tmp2,sizeof(tmp1));
574
        OPENSSL_cleanse(iv1,sizeof(iv1));
575
        OPENSSL_cleanse(iv2,sizeof(iv2));
576
        return(1);
577
err:
578
        SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_MALLOC_FAILURE);
579
err2:
580
        return(0);
581
        }
582

    
583
int tls1_setup_key_block(SSL *s)
584
        {
585
        unsigned char *p1,*p2=NULL;
586
        const EVP_CIPHER *c;
587
        const EVP_MD *hash;
588
        int num;
589
        SSL_COMP *comp;
590
        int mac_type= NID_undef,mac_secret_size=0;
591
        int ret=0;
592

    
593
#ifdef KSSL_DEBUG
594
        printf ("tls1_setup_key_block()\n");
595
#endif        /* KSSL_DEBUG */
596

    
597
        if (s->s3->tmp.key_block_length != 0)
598
                return(1);
599

    
600
        if (!ssl_cipher_get_evp(s->session,&c,&hash,&mac_type,&mac_secret_size,&comp))
601
                {
602
                SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
603
                return(0);
604
                }
605

    
606
        s->s3->tmp.new_sym_enc=c;
607
        s->s3->tmp.new_hash=hash;
608
        s->s3->tmp.new_mac_pkey_type = mac_type;
609
        s->s3->tmp.new_mac_secret_size = mac_secret_size;
610
        num=EVP_CIPHER_key_length(c)+mac_secret_size+EVP_CIPHER_iv_length(c);
611
        num*=2;
612

    
613
        ssl3_cleanup_key_block(s);
614

    
615
        if ((p1=(unsigned char *)OPENSSL_malloc(num)) == NULL)
616
                {
617
                SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
618
                goto err;
619
                }
620

    
621
        s->s3->tmp.key_block_length=num;
622
        s->s3->tmp.key_block=p1;
623

    
624
        if ((p2=(unsigned char *)OPENSSL_malloc(num)) == NULL)
625
                {
626
                SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
627
                goto err;
628
                }
629

    
630
#ifdef TLS_DEBUG
631
printf("client random\n");
632
{ int z; for (z=0; z<SSL3_RANDOM_SIZE; z++) printf("%02X%c",s->s3->client_random[z],((z+1)%16)?' ':'\n'); }
633
printf("server random\n");
634
{ int z; for (z=0; z<SSL3_RANDOM_SIZE; z++) printf("%02X%c",s->s3->server_random[z],((z+1)%16)?' ':'\n'); }
635
printf("pre-master\n");
636
{ int z; for (z=0; z<s->session->master_key_length; z++) printf("%02X%c",s->session->master_key[z],((z+1)%16)?' ':'\n'); }
637
#endif
638
        if (!tls1_generate_key_block(s,p1,p2,num))
639
                goto err;
640
#ifdef TLS_DEBUG
641
printf("\nkey block\n");
642
{ int z; for (z=0; z<num; z++) printf("%02X%c",p1[z],((z+1)%16)?' ':'\n'); }
643
#endif
644

    
645
        if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)
646
                && s->method->version <= TLS1_VERSION)
647
                {
648
                /* enable vulnerability countermeasure for CBC ciphers with
649
                 * known-IV problem (http://www.openssl.org/~bodo/tls-cbc.txt)
650
                 */
651
                s->s3->need_empty_fragments = 1;
652

    
653
                if (s->session->cipher != NULL)
654
                        {
655
                        if (s->session->cipher->algorithm_enc == SSL_eNULL)
656
                                s->s3->need_empty_fragments = 0;
657
                        
658
#ifndef OPENSSL_NO_RC4
659
                        if (s->session->cipher->algorithm_enc == SSL_RC4)
660
                                s->s3->need_empty_fragments = 0;
661
#endif
662
                        }
663
                }
664
                
665
        ret = 1;
666
err:
667
        if (p2)
668
                {
669
                OPENSSL_cleanse(p2,num);
670
                OPENSSL_free(p2);
671
                }
672
        return(ret);
673
        }
674

    
675
/* tls1_enc encrypts/decrypts the record in |s->wrec| / |s->rrec|, respectively.
676
 *
677
 * Returns:
678
 *   0: (in non-constant time) if the record is publically invalid (i.e. too
679
 *       short etc).
680
 *   1: if the record's padding is valid / the encryption was successful.
681
 *   -1: if the record's padding/AEAD-authenticator is invalid or, if sending,
682
 *       an internal error occured.
683
 */
684
int tls1_enc(SSL *s, int send)
685
        {
686
        SSL3_RECORD *rec;
687
        EVP_CIPHER_CTX *ds;
688
        unsigned long l;
689
        int bs,i,j,k,pad=0,ret,mac_size=0;
690
        const EVP_CIPHER *enc;
691

    
692
        if (send)
693
                {
694
                if (EVP_MD_CTX_md(s->write_hash))
695
                        {
696
                        int n=EVP_MD_CTX_size(s->write_hash);
697
                        OPENSSL_assert(n >= 0);
698
                        }
699
                ds=s->enc_write_ctx;
700
                rec= &(s->s3->wrec);
701
                if (s->enc_write_ctx == NULL)
702
                        enc=NULL;
703
                else
704
                        {
705
                        int ivlen;
706
                        enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
707
                        /* For TLSv1.1 and later explicit IV */
708
                        if (s->version >= TLS1_1_VERSION
709
                                && EVP_CIPHER_mode(enc) == EVP_CIPH_CBC_MODE)
710
                                ivlen = EVP_CIPHER_iv_length(enc);
711
                        else
712
                                ivlen = 0;
713
                        if (ivlen > 1)
714
                                {
715
                                if ( rec->data != rec->input)
716
                                        /* we can't write into the input stream:
717
                                         * Can this ever happen?? (steve)
718
                                         */
719
                                        fprintf(stderr,
720
                                                "%s:%d: rec->data != rec->input\n",
721
                                                __FILE__, __LINE__);
722
                                else if (RAND_bytes(rec->input, ivlen) <= 0)
723
                                        return -1;
724
                                }
725
                        }
726
                }
727
        else
728
                {
729
                if (EVP_MD_CTX_md(s->read_hash))
730
                        {
731
                        int n=EVP_MD_CTX_size(s->read_hash);
732
                        OPENSSL_assert(n >= 0);
733
                        }
734
                ds=s->enc_read_ctx;
735
                rec= &(s->s3->rrec);
736
                if (s->enc_read_ctx == NULL)
737
                        enc=NULL;
738
                else
739
                        enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
740
                }
741

    
742
#ifdef KSSL_DEBUG
743
        printf("tls1_enc(%d)\n", send);
744
#endif    /* KSSL_DEBUG */
745

    
746
        if ((s->session == NULL) || (ds == NULL) || (enc == NULL))
747
                {
748
                memmove(rec->data,rec->input,rec->length);
749
                rec->input=rec->data;
750
                ret = 1;
751
                }
752
        else
753
                {
754
                l=rec->length;
755
                bs=EVP_CIPHER_block_size(ds->cipher);
756

    
757
                if (EVP_CIPHER_flags(ds->cipher)&EVP_CIPH_FLAG_AEAD_CIPHER)
758
                        {
759
                        unsigned char buf[13],*seq;
760

    
761
                        seq = send?s->s3->write_sequence:s->s3->read_sequence;
762

    
763
                        if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
764
                                {
765
                                unsigned char dtlsseq[9],*p=dtlsseq;
766

    
767
                                s2n(send?s->d1->w_epoch:s->d1->r_epoch,p);
768
                                memcpy(p,&seq[2],6);
769
                                memcpy(buf,dtlsseq,8);
770
                                }
771
                        else
772
                                {
773
                                memcpy(buf,seq,8);
774
                                for (i=7; i>=0; i--)        /* increment */
775
                                        {
776
                                        ++seq[i];
777
                                        if (seq[i] != 0) break; 
778
                                        }
779
                                }
780

    
781
                        buf[8]=rec->type;
782
                        buf[9]=(unsigned char)(s->version>>8);
783
                        buf[10]=(unsigned char)(s->version);
784
                        buf[11]=rec->length>>8;
785
                        buf[12]=rec->length&0xff;
786
                        pad=EVP_CIPHER_CTX_ctrl(ds,EVP_CTRL_AEAD_TLS1_AAD,13,buf);
787
                        if (send)
788
                                {
789
                                l+=pad;
790
                                rec->length+=pad;
791
                                }
792
                        }
793
                else if ((bs != 1) && send)
794
                        {
795
                        i=bs-((int)l%bs);
796

    
797
                        /* Add weird padding of upto 256 bytes */
798

    
799
                        /* we need to add 'i' padding bytes of value j */
800
                        j=i-1;
801
                        if (s->options & SSL_OP_TLS_BLOCK_PADDING_BUG)
802
                                {
803
                                if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
804
                                        j++;
805
                                }
806
                        for (k=(int)l; k<(int)(l+i); k++)
807
                                rec->input[k]=j;
808
                        l+=i;
809
                        rec->length+=i;
810
                        }
811

    
812
#ifdef KSSL_DEBUG
813
                {
814
                unsigned long ui;
815
                printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n",
816
                        ds,rec->data,rec->input,l);
817
                printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n",
818
                        ds->buf_len, ds->cipher->key_len,
819
                        DES_KEY_SZ, DES_SCHEDULE_SZ,
820
                        ds->cipher->iv_len);
821
                printf("\t\tIV: ");
822
                for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]);
823
                printf("\n");
824
                printf("\trec->input=");
825
                for (ui=0; ui<l; ui++) printf(" %02x", rec->input[ui]);
826
                printf("\n");
827
                }
828
#endif        /* KSSL_DEBUG */
829

    
830
                if (!send)
831
                        {
832
                        if (l == 0 || l%bs != 0)
833
                                return 0;
834
                        }
835
                
836
                i = EVP_Cipher(ds,rec->data,rec->input,l);
837
                if ((EVP_CIPHER_flags(ds->cipher)&EVP_CIPH_FLAG_CUSTOM_CIPHER)
838
                                                ?(i<0)
839
                                                :(i==0))
840
                        return -1;        /* AEAD can fail to verify MAC */
841
                if (EVP_CIPHER_mode(enc) == EVP_CIPH_GCM_MODE && !send)
842
                        {
843
                        rec->data += EVP_GCM_TLS_EXPLICIT_IV_LEN;
844
                        rec->input += EVP_GCM_TLS_EXPLICIT_IV_LEN;
845
                        rec->length -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
846
                        }
847

    
848
#ifdef KSSL_DEBUG
849
                {
850
                unsigned long i;
851
                printf("\trec->data=");
852
                for (i=0; i<l; i++)
853
                        printf(" %02x", rec->data[i]);  printf("\n");
854
                }
855
#endif        /* KSSL_DEBUG */
856

    
857
                ret = 1;
858
                if (EVP_MD_CTX_md(s->read_hash) != NULL)
859
                        mac_size = EVP_MD_CTX_size(s->read_hash);
860
                if ((bs != 1) && !send)
861
                        ret = tls1_cbc_remove_padding(s, rec, bs, mac_size);
862
                if (pad && !send)
863
                        rec->length -= pad;
864
                }
865
        return ret;
866
        }
867

    
868
int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out)
869
        {
870
        unsigned int ret;
871
        EVP_MD_CTX ctx, *d=NULL;
872
        int i;
873

    
874
        if (s->s3->handshake_buffer) 
875
                if (!ssl3_digest_cached_records(s))
876
                        return 0;
877

    
878
        for (i=0;i<SSL_MAX_DIGEST;i++) 
879
                {
880
                  if (s->s3->handshake_dgst[i]&&EVP_MD_CTX_type(s->s3->handshake_dgst[i])==md_nid) 
881
                          {
882
                          d=s->s3->handshake_dgst[i];
883
                        break;
884
                        }
885
                }
886
        if (!d) {
887
                SSLerr(SSL_F_TLS1_CERT_VERIFY_MAC,SSL_R_NO_REQUIRED_DIGEST);
888
                return 0;
889
        }        
890

    
891
        EVP_MD_CTX_init(&ctx);
892
        EVP_MD_CTX_copy_ex(&ctx,d);
893
        EVP_DigestFinal_ex(&ctx,out,&ret);
894
        EVP_MD_CTX_cleanup(&ctx);
895
        return((int)ret);
896
        }
897

    
898
int tls1_final_finish_mac(SSL *s,
899
             const char *str, int slen, unsigned char *out)
900
        {
901
        unsigned int i;
902
        EVP_MD_CTX ctx;
903
        unsigned char buf[2*EVP_MAX_MD_SIZE];
904
        unsigned char *q,buf2[12];
905
        int idx;
906
        long mask;
907
        int err=0;
908
        const EVP_MD *md; 
909

    
910
        q=buf;
911

    
912
        if (s->s3->handshake_buffer) 
913
                if (!ssl3_digest_cached_records(s))
914
                        return 0;
915

    
916
        EVP_MD_CTX_init(&ctx);
917

    
918
        for (idx=0;ssl_get_handshake_digest(idx,&mask,&md);idx++)
919
                {
920
                if (mask & ssl_get_algorithm2(s))
921
                        {
922
                        int hashsize = EVP_MD_size(md);
923
                        EVP_MD_CTX *hdgst = s->s3->handshake_dgst[idx];
924
                        if (!hdgst || hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf)))
925
                                {
926
                                /* internal error: 'buf' is too small for this cipersuite! */
927
                                err = 1;
928
                                }
929
                        else
930
                                {
931
                                if (!EVP_MD_CTX_copy_ex(&ctx, hdgst) ||
932
                                        !EVP_DigestFinal_ex(&ctx,q,&i) ||
933
                                        (i != (unsigned int)hashsize))
934
                                        err = 1;
935
                                q+=hashsize;
936
                                }
937
                        }
938
                }
939
                
940
        if (!tls1_PRF(ssl_get_algorithm2(s),
941
                        str,slen, buf,(int)(q-buf), NULL,0, NULL,0, NULL,0,
942
                        s->session->master_key,s->session->master_key_length,
943
                        out,buf2,sizeof buf2))
944
                err = 1;
945
        EVP_MD_CTX_cleanup(&ctx);
946

    
947
        if (err)
948
                return 0;
949
        else
950
                return sizeof buf2;
951
        }
952

    
953
int tls1_mac(SSL *ssl, unsigned char *md, int send)
954
        {
955
        SSL3_RECORD *rec;
956
        unsigned char *seq;
957
        EVP_MD_CTX *hash;
958
        size_t md_size, orig_len;
959
        int i;
960
        EVP_MD_CTX hmac, *mac_ctx;
961
        unsigned char header[13];
962
        int stream_mac = (send?(ssl->mac_flags & SSL_MAC_FLAG_WRITE_MAC_STREAM):(ssl->mac_flags&SSL_MAC_FLAG_READ_MAC_STREAM));
963
        int t;
964

    
965
        if (send)
966
                {
967
                rec= &(ssl->s3->wrec);
968
                seq= &(ssl->s3->write_sequence[0]);
969
                hash=ssl->write_hash;
970
                }
971
        else
972
                {
973
                rec= &(ssl->s3->rrec);
974
                seq= &(ssl->s3->read_sequence[0]);
975
                hash=ssl->read_hash;
976
                }
977

    
978
        t=EVP_MD_CTX_size(hash);
979
        OPENSSL_assert(t >= 0);
980
        md_size=t;
981

    
982
        /* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */
983
        if (stream_mac) 
984
                {
985
                        mac_ctx = hash;
986
                }
987
                else
988
                {
989
                        if (!EVP_MD_CTX_copy(&hmac,hash))
990
                                return -1;
991
                        mac_ctx = &hmac;
992
                }
993

    
994
        if (ssl->version == DTLS1_VERSION || ssl->version == DTLS1_BAD_VER)
995
                {
996
                unsigned char dtlsseq[8],*p=dtlsseq;
997

    
998
                s2n(send?ssl->d1->w_epoch:ssl->d1->r_epoch, p);
999
                memcpy (p,&seq[2],6);
1000

    
1001
                memcpy(header, dtlsseq, 8);
1002
                }
1003
        else
1004
                memcpy(header, seq, 8);
1005

    
1006
        /* kludge: tls1_cbc_remove_padding passes padding length in rec->type */
1007
        orig_len = rec->length+md_size+((unsigned int)rec->type>>8);
1008
        rec->type &= 0xff;
1009

    
1010
        header[8]=rec->type;
1011
        header[9]=(unsigned char)(ssl->version>>8);
1012
        header[10]=(unsigned char)(ssl->version);
1013
        header[11]=(rec->length)>>8;
1014
        header[12]=(rec->length)&0xff;
1015

    
1016
        if (!send &&
1017
            EVP_CIPHER_CTX_mode(ssl->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
1018
            ssl3_cbc_record_digest_supported(mac_ctx))
1019
                {
1020
                /* This is a CBC-encrypted record. We must avoid leaking any
1021
                 * timing-side channel information about how many blocks of
1022
                 * data we are hashing because that gives an attacker a
1023
                 * timing-oracle. */
1024
                ssl3_cbc_digest_record(
1025
                        mac_ctx,
1026
                        md, &md_size,
1027
                        header, rec->input,
1028
                        rec->length + md_size, orig_len,
1029
                        ssl->s3->read_mac_secret,
1030
                        ssl->s3->read_mac_secret_size,
1031
                        0 /* not SSLv3 */);
1032
                }
1033
        else
1034
                {
1035
                EVP_DigestSignUpdate(mac_ctx,header,sizeof(header));
1036
                EVP_DigestSignUpdate(mac_ctx,rec->input,rec->length);
1037
                t=EVP_DigestSignFinal(mac_ctx,md,&md_size);
1038
                OPENSSL_assert(t > 0);
1039
#ifdef OPENSSL_FIPS
1040
                if (!send && FIPS_mode())
1041
                        tls_fips_digest_extra(
1042
                                            ssl->enc_read_ctx,
1043
                                        mac_ctx, rec->input,
1044
                                        rec->length, orig_len);
1045
#endif
1046
                }
1047
                
1048
        if (!stream_mac)
1049
                EVP_MD_CTX_cleanup(&hmac);
1050
#ifdef TLS_DEBUG
1051
printf("seq=");
1052
{int z; for (z=0; z<8; z++) printf("%02X ",seq[z]); printf("\n"); }
1053
printf("rec=");
1054
{unsigned int z; for (z=0; z<rec->length; z++) printf("%02X ",rec->data[z]); printf("\n"); }
1055
#endif
1056

    
1057
        if (ssl->version != DTLS1_VERSION && ssl->version != DTLS1_BAD_VER)
1058
                {
1059
                for (i=7; i>=0; i--)
1060
                        {
1061
                        ++seq[i];
1062
                        if (seq[i] != 0) break; 
1063
                        }
1064
                }
1065

    
1066
#ifdef TLS_DEBUG
1067
{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); }
1068
#endif
1069
        return(md_size);
1070
        }
1071

    
1072
int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
1073
             int len)
1074
        {
1075
        unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH];
1076
        const void *co = NULL, *so = NULL;
1077
        int col = 0, sol = 0;
1078

    
1079

    
1080
#ifdef KSSL_DEBUG
1081
        printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", s,out, p,len);
1082
#endif        /* KSSL_DEBUG */
1083

    
1084
#ifdef TLSEXT_TYPE_opaque_prf_input
1085
        if (s->s3->client_opaque_prf_input != NULL && s->s3->server_opaque_prf_input != NULL &&
1086
            s->s3->client_opaque_prf_input_len > 0 &&
1087
            s->s3->client_opaque_prf_input_len == s->s3->server_opaque_prf_input_len)
1088
                {
1089
                co = s->s3->client_opaque_prf_input;
1090
                col = s->s3->server_opaque_prf_input_len;
1091
                so = s->s3->server_opaque_prf_input;
1092
                sol = s->s3->client_opaque_prf_input_len; /* must be same as col (see draft-rescorla-tls-opaque-prf-input-00.txt, section 3.1) */
1093
                }
1094
#endif
1095

    
1096
        tls1_PRF(ssl_get_algorithm2(s),
1097
                TLS_MD_MASTER_SECRET_CONST,TLS_MD_MASTER_SECRET_CONST_SIZE,
1098
                s->s3->client_random,SSL3_RANDOM_SIZE,
1099
                co, col,
1100
                s->s3->server_random,SSL3_RANDOM_SIZE,
1101
                so, sol,
1102
                p,len,
1103
                s->session->master_key,buff,sizeof buff);
1104
#ifdef SSL_DEBUG
1105
        fprintf(stderr, "Premaster Secret:\n");
1106
        BIO_dump_fp(stderr, (char *)p, len);
1107
        fprintf(stderr, "Client Random:\n");
1108
        BIO_dump_fp(stderr, (char *)s->s3->client_random, SSL3_RANDOM_SIZE);
1109
        fprintf(stderr, "Server Random:\n");
1110
        BIO_dump_fp(stderr, (char *)s->s3->server_random, SSL3_RANDOM_SIZE);
1111
        fprintf(stderr, "Master Secret:\n");
1112
        BIO_dump_fp(stderr, (char *)s->session->master_key, SSL3_MASTER_SECRET_SIZE);
1113
#endif
1114

    
1115
#ifdef KSSL_DEBUG
1116
        printf ("tls1_generate_master_secret() complete\n");
1117
#endif        /* KSSL_DEBUG */
1118
        return(SSL3_MASTER_SECRET_SIZE);
1119
        }
1120

    
1121
int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen,
1122
         const char *label, size_t llen, const unsigned char *context,
1123
         size_t contextlen, int use_context)
1124
        {
1125
        unsigned char *buff;
1126
        unsigned char *val = NULL;
1127
        size_t vallen, currentvalpos;
1128
        int rv;
1129

    
1130
#ifdef KSSL_DEBUG
1131
        printf ("tls1_export_keying_material(%p,%p,%d,%s,%d,%p,%d)\n", s, out, olen, label, llen, context, contextlen);
1132
#endif        /* KSSL_DEBUG */
1133

    
1134
        buff = OPENSSL_malloc(olen);
1135
        if (buff == NULL) goto err2;
1136

    
1137
        /* construct PRF arguments
1138
         * we construct the PRF argument ourself rather than passing separate
1139
         * values into the TLS PRF to ensure that the concatenation of values
1140
         * does not create a prohibited label.
1141
         */
1142
        vallen = llen + SSL3_RANDOM_SIZE * 2;
1143
        if (use_context)
1144
                {
1145
                vallen += 2 + contextlen;
1146
                }
1147

    
1148
        val = OPENSSL_malloc(vallen);
1149
        if (val == NULL) goto err2;
1150
        currentvalpos = 0;
1151
        memcpy(val + currentvalpos, (unsigned char *) label, llen);
1152
        currentvalpos += llen;
1153
        memcpy(val + currentvalpos, s->s3->client_random, SSL3_RANDOM_SIZE);
1154
        currentvalpos += SSL3_RANDOM_SIZE;
1155
        memcpy(val + currentvalpos, s->s3->server_random, SSL3_RANDOM_SIZE);
1156
        currentvalpos += SSL3_RANDOM_SIZE;
1157

    
1158
        if (use_context)
1159
                {
1160
                val[currentvalpos] = (contextlen >> 8) & 0xff;
1161
                currentvalpos++;
1162
                val[currentvalpos] = contextlen & 0xff;
1163
                currentvalpos++;
1164
                if ((contextlen > 0) || (context != NULL))
1165
                        {
1166
                        memcpy(val + currentvalpos, context, contextlen);
1167
                        }
1168
                }
1169

    
1170
        /* disallow prohibited labels
1171
         * note that SSL3_RANDOM_SIZE > max(prohibited label len) =
1172
         * 15, so size of val > max(prohibited label len) = 15 and the
1173
         * comparisons won't have buffer overflow
1174
         */
1175
        if (memcmp(val, TLS_MD_CLIENT_FINISH_CONST,
1176
                 TLS_MD_CLIENT_FINISH_CONST_SIZE) == 0) goto err1;
1177
        if (memcmp(val, TLS_MD_SERVER_FINISH_CONST,
1178
                 TLS_MD_SERVER_FINISH_CONST_SIZE) == 0) goto err1;
1179
        if (memcmp(val, TLS_MD_MASTER_SECRET_CONST,
1180
                 TLS_MD_MASTER_SECRET_CONST_SIZE) == 0) goto err1;
1181
        if (memcmp(val, TLS_MD_KEY_EXPANSION_CONST,
1182
                 TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0) goto err1;
1183

    
1184
        rv = tls1_PRF(ssl_get_algorithm2(s),
1185
                      val, vallen,
1186
                      NULL, 0,
1187
                      NULL, 0,
1188
                      NULL, 0,
1189
                      NULL, 0,
1190
                      s->session->master_key,s->session->master_key_length,
1191
                      out,buff,olen);
1192

    
1193
#ifdef KSSL_DEBUG
1194
        printf ("tls1_export_keying_material() complete\n");
1195
#endif        /* KSSL_DEBUG */
1196
        goto ret;
1197
err1:
1198
        SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL);
1199
        rv = 0;
1200
        goto ret;
1201
err2:
1202
        SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, ERR_R_MALLOC_FAILURE);
1203
        rv = 0;
1204
ret:
1205
        if (buff != NULL) OPENSSL_free(buff);
1206
        if (val != NULL) OPENSSL_free(val);
1207
        return(rv);
1208
        }
1209

    
1210
int tls1_alert_code(int code)
1211
        {
1212
        switch (code)
1213
                {
1214
        case SSL_AD_CLOSE_NOTIFY:        return(SSL3_AD_CLOSE_NOTIFY);
1215
        case SSL_AD_UNEXPECTED_MESSAGE:        return(SSL3_AD_UNEXPECTED_MESSAGE);
1216
        case SSL_AD_BAD_RECORD_MAC:        return(SSL3_AD_BAD_RECORD_MAC);
1217
        case SSL_AD_DECRYPTION_FAILED:        return(TLS1_AD_DECRYPTION_FAILED);
1218
        case SSL_AD_RECORD_OVERFLOW:        return(TLS1_AD_RECORD_OVERFLOW);
1219
        case SSL_AD_DECOMPRESSION_FAILURE:return(SSL3_AD_DECOMPRESSION_FAILURE);
1220
        case SSL_AD_HANDSHAKE_FAILURE:        return(SSL3_AD_HANDSHAKE_FAILURE);
1221
        case SSL_AD_NO_CERTIFICATE:        return(-1);
1222
        case SSL_AD_BAD_CERTIFICATE:        return(SSL3_AD_BAD_CERTIFICATE);
1223
        case SSL_AD_UNSUPPORTED_CERTIFICATE:return(SSL3_AD_UNSUPPORTED_CERTIFICATE);
1224
        case SSL_AD_CERTIFICATE_REVOKED:return(SSL3_AD_CERTIFICATE_REVOKED);
1225
        case SSL_AD_CERTIFICATE_EXPIRED:return(SSL3_AD_CERTIFICATE_EXPIRED);
1226
        case SSL_AD_CERTIFICATE_UNKNOWN:return(SSL3_AD_CERTIFICATE_UNKNOWN);
1227
        case SSL_AD_ILLEGAL_PARAMETER:        return(SSL3_AD_ILLEGAL_PARAMETER);
1228
        case SSL_AD_UNKNOWN_CA:                return(TLS1_AD_UNKNOWN_CA);
1229
        case SSL_AD_ACCESS_DENIED:        return(TLS1_AD_ACCESS_DENIED);
1230
        case SSL_AD_DECODE_ERROR:        return(TLS1_AD_DECODE_ERROR);
1231
        case SSL_AD_DECRYPT_ERROR:        return(TLS1_AD_DECRYPT_ERROR);
1232
        case SSL_AD_EXPORT_RESTRICTION:        return(TLS1_AD_EXPORT_RESTRICTION);
1233
        case SSL_AD_PROTOCOL_VERSION:        return(TLS1_AD_PROTOCOL_VERSION);
1234
        case SSL_AD_INSUFFICIENT_SECURITY:return(TLS1_AD_INSUFFICIENT_SECURITY);
1235
        case SSL_AD_INTERNAL_ERROR:        return(TLS1_AD_INTERNAL_ERROR);
1236
        case SSL_AD_USER_CANCELLED:        return(TLS1_AD_USER_CANCELLED);
1237
        case SSL_AD_NO_RENEGOTIATION:        return(TLS1_AD_NO_RENEGOTIATION);
1238
        case SSL_AD_UNSUPPORTED_EXTENSION: return(TLS1_AD_UNSUPPORTED_EXTENSION);
1239
        case SSL_AD_CERTIFICATE_UNOBTAINABLE: return(TLS1_AD_CERTIFICATE_UNOBTAINABLE);
1240
        case SSL_AD_UNRECOGNIZED_NAME:        return(TLS1_AD_UNRECOGNIZED_NAME);
1241
        case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE: return(TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE);
1242
        case SSL_AD_BAD_CERTIFICATE_HASH_VALUE: return(TLS1_AD_BAD_CERTIFICATE_HASH_VALUE);
1243
        case SSL_AD_UNKNOWN_PSK_IDENTITY:return(TLS1_AD_UNKNOWN_PSK_IDENTITY);
1244
#if 0 /* not appropriate for TLS, not used for DTLS */
1245
        case DTLS1_AD_MISSING_HANDSHAKE_MESSAGE: return 
1246
                                          (DTLS1_AD_MISSING_HANDSHAKE_MESSAGE);
1247
#endif
1248
        default:                        return(-1);
1249
                }
1250
        }