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 e80cac62 Ryan Dahl
/* 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 30e7fb73 Ben Noordhuis
 * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
60 e80cac62 Ryan Dahl
 *
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 30e7fb73 Ben Noordhuis
/* ====================================================================
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 e80cac62 Ryan Dahl
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 2cf7e5de Ben Noordhuis
#include <openssl/rand.h>
147 e80cac62 Ryan Dahl
#ifdef KSSL_DEBUG
148
#include <openssl/des.h>
149
#endif
150
151 30e7fb73 Ben Noordhuis
/* 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 e80cac62 Ryan Dahl
                        unsigned char *out, int olen)
160
        {
161 0110c903 Peter Bright
        int chunk;
162 2cf7e5de Ben Noordhuis
        size_t j;
163
        EVP_MD_CTX ctx, ctx_tmp;
164
        EVP_PKEY *mac_key;
165 e80cac62 Ryan Dahl
        unsigned char A1[EVP_MAX_MD_SIZE];
166 2cf7e5de Ben Noordhuis
        size_t A1_len;
167 30e7fb73 Ben Noordhuis
        int ret = 0;
168 e80cac62 Ryan Dahl
        
169
        chunk=EVP_MD_size(md);
170 30e7fb73 Ben Noordhuis
        OPENSSL_assert(chunk >= 0);
171 e80cac62 Ryan Dahl
172 2cf7e5de Ben Noordhuis
        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 30e7fb73 Ben Noordhuis
                goto err;
181 2cf7e5de Ben Noordhuis
        if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key))
182 30e7fb73 Ben Noordhuis
                goto err;
183 2cf7e5de Ben Noordhuis
        if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len))
184 30e7fb73 Ben Noordhuis
                goto err;
185 2cf7e5de Ben Noordhuis
        if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len))
186 30e7fb73 Ben Noordhuis
                goto err;
187 2cf7e5de Ben Noordhuis
        if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len))
188 30e7fb73 Ben Noordhuis
                goto err;
189 2cf7e5de Ben Noordhuis
        if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len))
190 30e7fb73 Ben Noordhuis
                goto err;
191 2cf7e5de Ben Noordhuis
        if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
192 30e7fb73 Ben Noordhuis
                goto err;
193 2cf7e5de Ben Noordhuis
        if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
194 30e7fb73 Ben Noordhuis
                goto err;
195 e80cac62 Ryan Dahl
196
        for (;;)
197
                {
198 2cf7e5de Ben Noordhuis
                /* Reinit mac contexts */
199
                if (!EVP_DigestSignInit(&ctx,NULL,md, NULL, mac_key))
200 30e7fb73 Ben Noordhuis
                        goto err;
201 2cf7e5de Ben Noordhuis
                if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key))
202 30e7fb73 Ben Noordhuis
                        goto err;
203 2cf7e5de Ben Noordhuis
                if (!EVP_DigestSignUpdate(&ctx,A1,A1_len))
204 30e7fb73 Ben Noordhuis
                        goto err;
205 2cf7e5de Ben Noordhuis
                if (!EVP_DigestSignUpdate(&ctx_tmp,A1,A1_len))
206 30e7fb73 Ben Noordhuis
                        goto err;
207 2cf7e5de Ben Noordhuis
                if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len))
208 30e7fb73 Ben Noordhuis
                        goto err;
209 2cf7e5de Ben Noordhuis
                if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len))
210 30e7fb73 Ben Noordhuis
                        goto err;
211 2cf7e5de Ben Noordhuis
                if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len))
212 30e7fb73 Ben Noordhuis
                        goto err;
213 2cf7e5de Ben Noordhuis
                if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len))
214 30e7fb73 Ben Noordhuis
                        goto err;
215 2cf7e5de Ben Noordhuis
                if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
216 30e7fb73 Ben Noordhuis
                        goto err;
217 e80cac62 Ryan Dahl
218
                if (olen > chunk)
219
                        {
220 2cf7e5de Ben Noordhuis
                        if (!EVP_DigestSignFinal(&ctx,out,&j))
221 30e7fb73 Ben Noordhuis
                                goto err;
222 e80cac62 Ryan Dahl
                        out+=j;
223
                        olen-=j;
224 2cf7e5de Ben Noordhuis
                        /* calc the next A1 value */
225
                        if (!EVP_DigestSignFinal(&ctx_tmp,A1,&A1_len))
226 30e7fb73 Ben Noordhuis
                                goto err;
227 e80cac62 Ryan Dahl
                        }
228
                else        /* last one */
229
                        {
230 2cf7e5de Ben Noordhuis
                        if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
231 30e7fb73 Ben Noordhuis
                                goto err;
232 e80cac62 Ryan Dahl
                        memcpy(out,A1,olen);
233
                        break;
234
                        }
235
                }
236 30e7fb73 Ben Noordhuis
        ret = 1;
237
err:
238 2cf7e5de Ben Noordhuis
        EVP_PKEY_free(mac_key);
239
        EVP_MD_CTX_cleanup(&ctx);
240
        EVP_MD_CTX_cleanup(&ctx_tmp);
241 e80cac62 Ryan Dahl
        OPENSSL_cleanse(A1,sizeof(A1));
242 30e7fb73 Ben Noordhuis
        return ret;
243 e80cac62 Ryan Dahl
        }
244
245 30e7fb73 Ben Noordhuis
/* 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 e80cac62 Ryan Dahl
                     unsigned char *out2, int olen)
255
        {
256 30e7fb73 Ben Noordhuis
        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 2cf7e5de Ben Noordhuis
        if (count == 1)
269
                slen = 0;
270 e80cac62 Ryan Dahl
        S1=sec;
271 30e7fb73 Ben Noordhuis
        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 e80cac62 Ryan Dahl
        }
290 30e7fb73 Ben Noordhuis
        ret = 1;
291
err:
292
        return ret;
293
}
294
static int tls1_generate_key_block(SSL *s, unsigned char *km,
295 e80cac62 Ryan Dahl
             unsigned char *tmp, int num)
296
        {
297 30e7fb73 Ben Noordhuis
        int ret;
298 2cf7e5de Ben Noordhuis
        ret = tls1_PRF(ssl_get_algorithm2(s),
299 30e7fb73 Ben Noordhuis
                 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 e80cac62 Ryan Dahl
                 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 30e7fb73 Ben Noordhuis
        return ret;
317 e80cac62 Ryan Dahl
        }
318
319
int tls1_change_cipher_state(SSL *s, int which)
320
        {
321
        static const unsigned char empty[]="";
322 0110c903 Peter Bright
        unsigned char *p,*mac_secret;
323 30e7fb73 Ben Noordhuis
        unsigned char *exp_label;
324 e80cac62 Ryan Dahl
        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 0110c903 Peter Bright
        unsigned char *ms,*key,*iv;
329 e80cac62 Ryan Dahl
        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 30e7fb73 Ben Noordhuis
        int mac_type;
337
        int *mac_secret_size;
338
        EVP_MD_CTX *mac_ctx;
339
        EVP_PKEY *mac_key;
340 e80cac62 Ryan Dahl
        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 30e7fb73 Ben Noordhuis
        mac_type = s->s3->tmp.new_mac_pkey_type;
347 e80cac62 Ryan Dahl
#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 30e7fb73 Ben Noordhuis
        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 e80cac62 Ryan Dahl
        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 30e7fb73 Ben Noordhuis
        int i;
363
        for (i=0; i<s->s3->tmp.key_block_length; i++)
364 2cf7e5de Ben Noordhuis
                printf("%02x", s->s3->tmp.key_block[i]);  printf("\n");
365 e80cac62 Ryan Dahl
        }
366
#endif        /* KSSL_DEBUG */
367
368
        if (which & SSL3_CC_READ)
369
                {
370 30e7fb73 Ben Noordhuis
                if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
371
                        s->mac_flags |= SSL_MAC_FLAG_READ_MAC_STREAM;
372 2cf7e5de Ben Noordhuis
                else
373 30e7fb73 Ben Noordhuis
                        s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_STREAM;
374
375 e80cac62 Ryan Dahl
                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 30e7fb73 Ben Noordhuis
                mac_ctx=ssl_replace_hash(&s->read_hash,NULL);
384 e80cac62 Ryan Dahl
#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 30e7fb73 Ben Noordhuis
                mac_secret_size=&(s->s3->read_mac_secret_size);
410 e80cac62 Ryan Dahl
                }
411
        else
412
                {
413 30e7fb73 Ben Noordhuis
                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 d6fd1187 Fedor Indutny
                if (s->enc_write_ctx != NULL && !SSL_IS_DTLS(s))
418 e80cac62 Ryan Dahl
                        reuse_dd = 1;
419 d6fd1187 Fedor Indutny
                else if ((s->enc_write_ctx=EVP_CIPHER_CTX_new()) == NULL)
420 e80cac62 Ryan Dahl
                        goto err;
421
                dd= s->enc_write_ctx;
422 d6fd1187 Fedor Indutny
                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 e80cac62 Ryan Dahl
#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 30e7fb73 Ben Noordhuis
                mac_secret_size = &(s->s3->write_mac_secret_size);
452 e80cac62 Ryan Dahl
                }
453
454
        if (reuse_dd)
455
                EVP_CIPHER_CTX_cleanup(dd);
456
457
        p=s->s3->tmp.key_block;
458 30e7fb73 Ben Noordhuis
        i=*mac_secret_size=s->s3->tmp.new_mac_secret_size;
459
460 e80cac62 Ryan Dahl
        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 2cf7e5de Ben Noordhuis
        /* 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 e80cac62 Ryan Dahl
        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 2cf7e5de Ben Noordhuis
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 e80cac62 Ryan Dahl
#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 2cf7e5de Ben Noordhuis
                if (!tls1_PRF(ssl_get_algorithm2(s),
515 30e7fb73 Ben Noordhuis
                                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 e80cac62 Ryan Dahl
                key=tmp1;
522
523
                if (k > 0)
524
                        {
525 2cf7e5de Ben Noordhuis
                        if (!tls1_PRF(ssl_get_algorithm2(s),
526 30e7fb73 Ben Noordhuis
                                        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 e80cac62 Ryan Dahl
                        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 30e7fb73 Ben Noordhuis
        int i;
543 e80cac62 Ryan Dahl
        printf("EVP_CipherInit_ex(dd,c,key=,iv=,which)\n");
544 30e7fb73 Ben Noordhuis
        printf("\tkey= "); for (i=0; i<c->key_len; i++) printf("%02x", key[i]);
545 e80cac62 Ryan Dahl
        printf("\n");
546 30e7fb73 Ben Noordhuis
        printf("\t iv= "); for (i=0; i<c->iv_len; i++) printf("%02x", iv[i]);
547 e80cac62 Ryan Dahl
        printf("\n");
548
        }
549
#endif        /* KSSL_DEBUG */
550
551 2cf7e5de Ben Noordhuis
        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 e80cac62 Ryan Dahl
#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 30e7fb73 Ben Noordhuis
        unsigned char *p1,*p2=NULL;
586 e80cac62 Ryan Dahl
        const EVP_CIPHER *c;
587
        const EVP_MD *hash;
588
        int num;
589
        SSL_COMP *comp;
590 30e7fb73 Ben Noordhuis
        int mac_type= NID_undef,mac_secret_size=0;
591
        int ret=0;
592 e80cac62 Ryan Dahl
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 30e7fb73 Ben Noordhuis
        if (!ssl_cipher_get_evp(s->session,&c,&hash,&mac_type,&mac_secret_size,&comp))
601 e80cac62 Ryan Dahl
                {
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 30e7fb73 Ben Noordhuis
        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 e80cac62 Ryan Dahl
        num*=2;
612
613
        ssl3_cleanup_key_block(s);
614
615
        if ((p1=(unsigned char *)OPENSSL_malloc(num)) == NULL)
616 30e7fb73 Ben Noordhuis
                {
617
                SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
618 e80cac62 Ryan Dahl
                goto err;
619 30e7fb73 Ben Noordhuis
                }
620 e80cac62 Ryan Dahl
621
        s->s3->tmp.key_block_length=num;
622
        s->s3->tmp.key_block=p1;
623
624 30e7fb73 Ben Noordhuis
        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 e80cac62 Ryan Dahl
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 30e7fb73 Ben Noordhuis
        if (!tls1_generate_key_block(s,p1,p2,num))
639
                goto err;
640 e80cac62 Ryan Dahl
#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 2cf7e5de Ben Noordhuis
        if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)
646
                && s->method->version <= TLS1_VERSION)
647 e80cac62 Ryan Dahl
                {
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 30e7fb73 Ben Noordhuis
                        if (s->session->cipher->algorithm_enc == SSL_eNULL)
656 e80cac62 Ryan Dahl
                                s->s3->need_empty_fragments = 0;
657
                        
658
#ifndef OPENSSL_NO_RC4
659 30e7fb73 Ben Noordhuis
                        if (s->session->cipher->algorithm_enc == SSL_RC4)
660 e80cac62 Ryan Dahl
                                s->s3->need_empty_fragments = 0;
661
#endif
662
                        }
663
                }
664
                
665 30e7fb73 Ben Noordhuis
        ret = 1;
666 e80cac62 Ryan Dahl
err:
667 30e7fb73 Ben Noordhuis
        if (p2)
668
                {
669
                OPENSSL_cleanse(p2,num);
670
                OPENSSL_free(p2);
671
                }
672
        return(ret);
673 e80cac62 Ryan Dahl
        }
674
675 2cf7e5de Ben Noordhuis
/* 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 e80cac62 Ryan Dahl
int tls1_enc(SSL *s, int send)
685
        {
686
        SSL3_RECORD *rec;
687
        EVP_CIPHER_CTX *ds;
688
        unsigned long l;
689 2cf7e5de Ben Noordhuis
        int bs,i,j,k,pad=0,ret,mac_size=0;
690 e80cac62 Ryan Dahl
        const EVP_CIPHER *enc;
691
692
        if (send)
693
                {
694 30e7fb73 Ben Noordhuis
                if (EVP_MD_CTX_md(s->write_hash))
695
                        {
696 2cf7e5de Ben Noordhuis
                        int n=EVP_MD_CTX_size(s->write_hash);
697 30e7fb73 Ben Noordhuis
                        OPENSSL_assert(n >= 0);
698
                        }
699 e80cac62 Ryan Dahl
                ds=s->enc_write_ctx;
700
                rec= &(s->s3->wrec);
701
                if (s->enc_write_ctx == NULL)
702
                        enc=NULL;
703
                else
704 2cf7e5de Ben Noordhuis
                        {
705
                        int ivlen;
706 e80cac62 Ryan Dahl
                        enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
707 2cf7e5de Ben Noordhuis
                        /* 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 e80cac62 Ryan Dahl
                }
727
        else
728
                {
729 30e7fb73 Ben Noordhuis
                if (EVP_MD_CTX_md(s->read_hash))
730
                        {
731 2cf7e5de Ben Noordhuis
                        int n=EVP_MD_CTX_size(s->read_hash);
732 30e7fb73 Ben Noordhuis
                        OPENSSL_assert(n >= 0);
733
                        }
734 e80cac62 Ryan Dahl
                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 2cf7e5de Ben Noordhuis
        if ((s->session == NULL) || (ds == NULL) || (enc == NULL))
747 e80cac62 Ryan Dahl
                {
748
                memmove(rec->data,rec->input,rec->length);
749
                rec->input=rec->data;
750 2cf7e5de Ben Noordhuis
                ret = 1;
751 e80cac62 Ryan Dahl
                }
752
        else
753
                {
754
                l=rec->length;
755
                bs=EVP_CIPHER_block_size(ds->cipher);
756
757 2cf7e5de Ben Noordhuis
                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 e80cac62 Ryan Dahl
                        {
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 2cf7e5de Ben Noordhuis
                unsigned long ui;
815 e80cac62 Ryan Dahl
                printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n",
816 2cf7e5de Ben Noordhuis
                        ds,rec->data,rec->input,l);
817 30e7fb73 Ben Noordhuis
                printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n",
818 2cf7e5de Ben Noordhuis
                        ds->buf_len, ds->cipher->key_len,
819
                        DES_KEY_SZ, DES_SCHEDULE_SZ,
820
                        ds->cipher->iv_len);
821 e80cac62 Ryan Dahl
                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 2cf7e5de Ben Noordhuis
                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 e80cac62 Ryan Dahl
848
#ifdef KSSL_DEBUG
849
                {
850 2cf7e5de Ben Noordhuis
                unsigned long i;
851
                printf("\trec->data=");
852 30e7fb73 Ben Noordhuis
                for (i=0; i<l; i++)
853 2cf7e5de Ben Noordhuis
                        printf(" %02x", rec->data[i]);  printf("\n");
854
                }
855 e80cac62 Ryan Dahl
#endif        /* KSSL_DEBUG */
856
857 2cf7e5de Ben Noordhuis
                ret = 1;
858
                if (EVP_MD_CTX_md(s->read_hash) != NULL)
859
                        mac_size = EVP_MD_CTX_size(s->read_hash);
860 e80cac62 Ryan Dahl
                if ((bs != 1) && !send)
861 2cf7e5de Ben Noordhuis
                        ret = tls1_cbc_remove_padding(s, rec, bs, mac_size);
862
                if (pad && !send)
863
                        rec->length -= pad;
864 e80cac62 Ryan Dahl
                }
865 2cf7e5de Ben Noordhuis
        return ret;
866 e80cac62 Ryan Dahl
        }
867 2cf7e5de Ben Noordhuis
868 30e7fb73 Ben Noordhuis
int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out)
869 e80cac62 Ryan Dahl
        {
870
        unsigned int ret;
871 30e7fb73 Ben Noordhuis
        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 e80cac62 Ryan Dahl
891
        EVP_MD_CTX_init(&ctx);
892 30e7fb73 Ben Noordhuis
        EVP_MD_CTX_copy_ex(&ctx,d);
893 e80cac62 Ryan Dahl
        EVP_DigestFinal_ex(&ctx,out,&ret);
894
        EVP_MD_CTX_cleanup(&ctx);
895
        return((int)ret);
896
        }
897
898 30e7fb73 Ben Noordhuis
int tls1_final_finish_mac(SSL *s,
899 e80cac62 Ryan Dahl
             const char *str, int slen, unsigned char *out)
900
        {
901
        unsigned int i;
902
        EVP_MD_CTX ctx;
903 30e7fb73 Ben Noordhuis
        unsigned char buf[2*EVP_MAX_MD_SIZE];
904 e80cac62 Ryan Dahl
        unsigned char *q,buf2[12];
905 30e7fb73 Ben Noordhuis
        int idx;
906
        long mask;
907
        int err=0;
908
        const EVP_MD *md; 
909 e80cac62 Ryan Dahl
910
        q=buf;
911 30e7fb73 Ben Noordhuis
912
        if (s->s3->handshake_buffer) 
913
                if (!ssl3_digest_cached_records(s))
914
                        return 0;
915 e80cac62 Ryan Dahl
916
        EVP_MD_CTX_init(&ctx);
917 30e7fb73 Ben Noordhuis
918
        for (idx=0;ssl_get_handshake_digest(idx,&mask,&md);idx++)
919
                {
920 2cf7e5de Ben Noordhuis
                if (mask & ssl_get_algorithm2(s))
921 30e7fb73 Ben Noordhuis
                        {
922
                        int hashsize = EVP_MD_size(md);
923 d6fd1187 Fedor Indutny
                        EVP_MD_CTX *hdgst = s->s3->handshake_dgst[idx];
924
                        if (!hdgst || hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf)))
925 30e7fb73 Ben Noordhuis
                                {
926
                                /* internal error: 'buf' is too small for this cipersuite! */
927
                                err = 1;
928
                                }
929
                        else
930
                                {
931 d6fd1187 Fedor Indutny
                                if (!EVP_MD_CTX_copy_ex(&ctx, hdgst) ||
932
                                        !EVP_DigestFinal_ex(&ctx,q,&i) ||
933
                                        (i != (unsigned int)hashsize))
934 30e7fb73 Ben Noordhuis
                                        err = 1;
935 d6fd1187 Fedor Indutny
                                q+=hashsize;
936 30e7fb73 Ben Noordhuis
                                }
937
                        }
938
                }
939
                
940 2cf7e5de Ben Noordhuis
        if (!tls1_PRF(ssl_get_algorithm2(s),
941 30e7fb73 Ben Noordhuis
                        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 e80cac62 Ryan Dahl
        EVP_MD_CTX_cleanup(&ctx);
946
947 30e7fb73 Ben Noordhuis
        if (err)
948
                return 0;
949
        else
950
                return sizeof buf2;
951 e80cac62 Ryan Dahl
        }
952
953
int tls1_mac(SSL *ssl, unsigned char *md, int send)
954
        {
955
        SSL3_RECORD *rec;
956 30e7fb73 Ben Noordhuis
        unsigned char *seq;
957
        EVP_MD_CTX *hash;
958 2cf7e5de Ben Noordhuis
        size_t md_size, orig_len;
959 e80cac62 Ryan Dahl
        int i;
960 30e7fb73 Ben Noordhuis
        EVP_MD_CTX hmac, *mac_ctx;
961 2cf7e5de Ben Noordhuis
        unsigned char header[13];
962 30e7fb73 Ben Noordhuis
        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 e80cac62 Ryan Dahl
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 30e7fb73 Ben Noordhuis
        t=EVP_MD_CTX_size(hash);
979
        OPENSSL_assert(t >= 0);
980
        md_size=t;
981 e80cac62 Ryan Dahl
982
        /* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */
983 30e7fb73 Ben Noordhuis
        if (stream_mac) 
984
                {
985
                        mac_ctx = hash;
986
                }
987
                else
988
                {
989 d6fd1187 Fedor Indutny
                        if (!EVP_MD_CTX_copy(&hmac,hash))
990
                                return -1;
991 30e7fb73 Ben Noordhuis
                        mac_ctx = &hmac;
992
                }
993 e80cac62 Ryan Dahl
994 30e7fb73 Ben Noordhuis
        if (ssl->version == DTLS1_VERSION || ssl->version == DTLS1_BAD_VER)
995 e80cac62 Ryan Dahl
                {
996
                unsigned char dtlsseq[8],*p=dtlsseq;
997 30e7fb73 Ben Noordhuis
998 e80cac62 Ryan Dahl
                s2n(send?ssl->d1->w_epoch:ssl->d1->r_epoch, p);
999
                memcpy (p,&seq[2],6);
1000
1001 2cf7e5de Ben Noordhuis
                memcpy(header, dtlsseq, 8);
1002 e80cac62 Ryan Dahl
                }
1003
        else
1004 2cf7e5de Ben Noordhuis
                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 f317f5ae Fedor Indutny
1016 2cf7e5de Ben Noordhuis
        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 30e7fb73 Ben Noordhuis
                
1048 2cf7e5de Ben Noordhuis
        if (!stream_mac)
1049
                EVP_MD_CTX_cleanup(&hmac);
1050 e80cac62 Ryan Dahl
#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 a7dd0e51 Fedor Indutny
{unsigned int z; for (z=0; z<rec->length; z++) printf("%02X ",rec->data[z]); printf("\n"); }
1055 e80cac62 Ryan Dahl
#endif
1056
1057 30e7fb73 Ben Noordhuis
        if (ssl->version != DTLS1_VERSION && ssl->version != DTLS1_BAD_VER)
1058 e80cac62 Ryan Dahl
                {
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 30e7fb73 Ben Noordhuis
        const void *co = NULL, *so = NULL;
1077
        int col = 0, sol = 0;
1078 e80cac62 Ryan Dahl
1079 2cf7e5de Ben Noordhuis
1080 e80cac62 Ryan Dahl
#ifdef KSSL_DEBUG
1081 30e7fb73 Ben Noordhuis
        printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", s,out, p,len);
1082 e80cac62 Ryan Dahl
#endif        /* KSSL_DEBUG */
1083
1084 30e7fb73 Ben Noordhuis
#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 2cf7e5de Ben Noordhuis
        tls1_PRF(ssl_get_algorithm2(s),
1097 30e7fb73 Ben Noordhuis
                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 e80cac62 Ryan Dahl
                s->session->master_key,buff,sizeof buff);
1104 2cf7e5de Ben Noordhuis
#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 30e7fb73 Ben Noordhuis
1115 e80cac62 Ryan Dahl
#ifdef KSSL_DEBUG
1116
        printf ("tls1_generate_master_secret() complete\n");
1117
#endif        /* KSSL_DEBUG */
1118
        return(SSL3_MASTER_SECRET_SIZE);
1119
        }
1120
1121 30e7fb73 Ben Noordhuis
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 aa3b4b4d Fedor Indutny
        printf ("tls1_export_keying_material(%p,%p,%d,%s,%d,%p,%d)\n", s, out, olen, label, llen, context, contextlen);
1132 30e7fb73 Ben Noordhuis
#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 a7dd0e51 Fedor Indutny
        rv = tls1_PRF(ssl_get_algorithm2(s),
1185 30e7fb73 Ben Noordhuis
                      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 e80cac62 Ryan Dahl
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 30e7fb73 Ben Noordhuis
        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 e80cac62 Ryan Dahl
        case DTLS1_AD_MISSING_HANDSHAKE_MESSAGE: return 
1246
                                          (DTLS1_AD_MISSING_HANDSHAKE_MESSAGE);
1247
#endif
1248
        default:                        return(-1);
1249
                }
1250
        }