~andersk/ubuntu/oneiric/openssl/spurious-reboot

« back to all changes in this revision

Viewing changes to ssl/t1_enc.c

  • Committer: Bazaar Package Importer
  • Author(s): Christoph Martin
  • Date: 2004-05-24 17:02:29 UTC
  • Revision ID: james.westby@ubuntu.com-20040524170229-ixlo08bbbly0xied
Tags: upstream-0.9.7d
ImportĀ upstreamĀ versionĀ 0.9.7d

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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-2002 The OpenSSL Project.  All rights reserved.
 
60
 *
 
61
 * Redistribution and use in source and binary forms, with or without
 
62
 * modification, are permitted provided that the following conditions
 
63
 * are met:
 
64
 *
 
65
 * 1. Redistributions of source code must retain the above copyright
 
66
 *    notice, this list of conditions and the following disclaimer. 
 
67
 *
 
68
 * 2. Redistributions in binary form must reproduce the above copyright
 
69
 *    notice, this list of conditions and the following disclaimer in
 
70
 *    the documentation and/or other materials provided with the
 
71
 *    distribution.
 
72
 *
 
73
 * 3. All advertising materials mentioning features or use of this
 
74
 *    software must display the following acknowledgment:
 
75
 *    "This product includes software developed by the OpenSSL Project
 
76
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 
77
 *
 
78
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 
79
 *    endorse or promote products derived from this software without
 
80
 *    prior written permission. For written permission, please contact
 
81
 *    openssl-core@openssl.org.
 
82
 *
 
83
 * 5. Products derived from this software may not be called "OpenSSL"
 
84
 *    nor may "OpenSSL" appear in their names without prior written
 
85
 *    permission of the OpenSSL Project.
 
86
 *
 
87
 * 6. Redistributions of any form whatsoever must retain the following
 
88
 *    acknowledgment:
 
89
 *    "This product includes software developed by the OpenSSL Project
 
90
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 
91
 *
 
92
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 
93
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
94
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 
95
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 
96
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
97
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
98
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
99
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
100
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 
101
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
102
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 
103
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 
104
 * ====================================================================
 
105
 *
 
106
 * This product includes cryptographic software written by Eric Young
 
107
 * (eay@cryptsoft.com).  This product includes software written by Tim
 
108
 * Hudson (tjh@cryptsoft.com).
 
109
 *
 
110
 */
 
111
 
 
112
#include <stdio.h>
 
113
#include "ssl_locl.h"
 
114
#include <openssl/comp.h>
 
115
#include <openssl/evp.h>
 
116
#include <openssl/hmac.h>
 
117
#include <openssl/md5.h>
 
118
 
 
119
static void tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
 
120
                        int sec_len, unsigned char *seed, int seed_len,
 
121
                        unsigned char *out, int olen)
 
122
        {
 
123
        int chunk,n;
 
124
        unsigned int j;
 
125
        HMAC_CTX ctx;
 
126
        HMAC_CTX ctx_tmp;
 
127
        unsigned char A1[EVP_MAX_MD_SIZE];
 
128
        unsigned int A1_len;
 
129
        
 
130
        chunk=EVP_MD_size(md);
 
131
 
 
132
        HMAC_CTX_init(&ctx);
 
133
        HMAC_CTX_init(&ctx_tmp);
 
134
        HMAC_Init_ex(&ctx,sec,sec_len,md, NULL);
 
135
        HMAC_Init_ex(&ctx_tmp,sec,sec_len,md, NULL);
 
136
        HMAC_Update(&ctx,seed,seed_len);
 
137
        HMAC_Final(&ctx,A1,&A1_len);
 
138
 
 
139
        n=0;
 
140
        for (;;)
 
141
                {
 
142
                HMAC_Init_ex(&ctx,NULL,0,NULL,NULL); /* re-init */
 
143
                HMAC_Init_ex(&ctx_tmp,NULL,0,NULL,NULL); /* re-init */
 
144
                HMAC_Update(&ctx,A1,A1_len);
 
145
                HMAC_Update(&ctx_tmp,A1,A1_len);
 
146
                HMAC_Update(&ctx,seed,seed_len);
 
147
 
 
148
                if (olen > chunk)
 
149
                        {
 
150
                        HMAC_Final(&ctx,out,&j);
 
151
                        out+=j;
 
152
                        olen-=j;
 
153
                        HMAC_Final(&ctx_tmp,A1,&A1_len); /* calc the next A1 value */
 
154
                        }
 
155
                else    /* last one */
 
156
                        {
 
157
                        HMAC_Final(&ctx,A1,&A1_len);
 
158
                        memcpy(out,A1,olen);
 
159
                        break;
 
160
                        }
 
161
                }
 
162
        HMAC_CTX_cleanup(&ctx);
 
163
        HMAC_CTX_cleanup(&ctx_tmp);
 
164
        OPENSSL_cleanse(A1,sizeof(A1));
 
165
        }
 
166
 
 
167
static void tls1_PRF(const EVP_MD *md5, const EVP_MD *sha1,
 
168
                     unsigned char *label, int label_len,
 
169
                     const unsigned char *sec, int slen, unsigned char *out1,
 
170
                     unsigned char *out2, int olen)
 
171
        {
 
172
        int len,i;
 
173
        const unsigned char *S1,*S2;
 
174
 
 
175
        len=slen/2;
 
176
        S1=sec;
 
177
        S2= &(sec[len]);
 
178
        len+=(slen&1); /* add for odd, make longer */
 
179
 
 
180
        
 
181
        tls1_P_hash(md5 ,S1,len,label,label_len,out1,olen);
 
182
        tls1_P_hash(sha1,S2,len,label,label_len,out2,olen);
 
183
 
 
184
        for (i=0; i<olen; i++)
 
185
                out1[i]^=out2[i];
 
186
        }
 
187
 
 
188
static void tls1_generate_key_block(SSL *s, unsigned char *km,
 
189
             unsigned char *tmp, int num)
 
190
        {
 
191
        unsigned char *p;
 
192
        unsigned char buf[SSL3_RANDOM_SIZE*2+
 
193
                TLS_MD_MAX_CONST_SIZE];
 
194
        p=buf;
 
195
 
 
196
        memcpy(p,TLS_MD_KEY_EXPANSION_CONST,
 
197
                TLS_MD_KEY_EXPANSION_CONST_SIZE);
 
198
        p+=TLS_MD_KEY_EXPANSION_CONST_SIZE;
 
199
        memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
 
200
        p+=SSL3_RANDOM_SIZE;
 
201
        memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
 
202
        p+=SSL3_RANDOM_SIZE;
 
203
 
 
204
        tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(p-buf),
 
205
                 s->session->master_key,s->session->master_key_length,
 
206
                 km,tmp,num);
 
207
#ifdef KSSL_DEBUG
 
208
        printf("tls1_generate_key_block() ==> %d byte master_key =\n\t",
 
209
                s->session->master_key_length);
 
210
        {
 
211
        int i;
 
212
        for (i=0; i < s->session->master_key_length; i++)
 
213
                {
 
214
                printf("%02X", s->session->master_key[i]);
 
215
                }
 
216
        printf("\n");  }
 
217
#endif    /* KSSL_DEBUG */
 
218
        }
 
219
 
 
220
int tls1_change_cipher_state(SSL *s, int which)
 
221
        {
 
222
        static const unsigned char empty[]="";
 
223
        unsigned char *p,*key_block,*mac_secret;
 
224
        unsigned char *exp_label,buf[TLS_MD_MAX_CONST_SIZE+
 
225
                SSL3_RANDOM_SIZE*2];
 
226
        unsigned char tmp1[EVP_MAX_KEY_LENGTH];
 
227
        unsigned char tmp2[EVP_MAX_KEY_LENGTH];
 
228
        unsigned char iv1[EVP_MAX_IV_LENGTH*2];
 
229
        unsigned char iv2[EVP_MAX_IV_LENGTH*2];
 
230
        unsigned char *ms,*key,*iv,*er1,*er2;
 
231
        int client_write;
 
232
        EVP_CIPHER_CTX *dd;
 
233
        const EVP_CIPHER *c;
 
234
        const SSL_COMP *comp;
 
235
        const EVP_MD *m;
 
236
        int is_export,n,i,j,k,exp_label_len,cl;
 
237
        int reuse_dd = 0;
 
238
 
 
239
        is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
 
240
        c=s->s3->tmp.new_sym_enc;
 
241
        m=s->s3->tmp.new_hash;
 
242
        comp=s->s3->tmp.new_compression;
 
243
        key_block=s->s3->tmp.key_block;
 
244
 
 
245
#ifdef KSSL_DEBUG
 
246
        printf("tls1_change_cipher_state(which= %d) w/\n", which);
 
247
        printf("\talg= %ld, comp= %p\n", s->s3->tmp.new_cipher->algorithms,
 
248
                comp);
 
249
        printf("\tevp_cipher == %p ==? &d_cbc_ede_cipher3\n", c);
 
250
        printf("\tevp_cipher: nid, blksz= %d, %d, keylen=%d, ivlen=%d\n",
 
251
                c->nid,c->block_size,c->key_len,c->iv_len);
 
252
        printf("\tkey_block: len= %d, data= ", s->s3->tmp.key_block_length);
 
253
        {
 
254
        int i;
 
255
        for (i=0; i<s->s3->tmp.key_block_length; i++)
 
256
                printf("%02x", key_block[i]);  printf("\n");
 
257
        }
 
258
#endif  /* KSSL_DEBUG */
 
259
 
 
260
        if (which & SSL3_CC_READ)
 
261
                {
 
262
                if (s->enc_read_ctx != NULL)
 
263
                        reuse_dd = 1;
 
264
                else if ((s->enc_read_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
 
265
                        goto err;
 
266
                dd= s->enc_read_ctx;
 
267
                s->read_hash=m;
 
268
                if (s->expand != NULL)
 
269
                        {
 
270
                        COMP_CTX_free(s->expand);
 
271
                        s->expand=NULL;
 
272
                        }
 
273
                if (comp != NULL)
 
274
                        {
 
275
                        s->expand=COMP_CTX_new(comp->method);
 
276
                        if (s->expand == NULL)
 
277
                                {
 
278
                                SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
 
279
                                goto err2;
 
280
                                }
 
281
                        if (s->s3->rrec.comp == NULL)
 
282
                                s->s3->rrec.comp=(unsigned char *)
 
283
                                        OPENSSL_malloc(SSL3_RT_MAX_ENCRYPTED_LENGTH);
 
284
                        if (s->s3->rrec.comp == NULL)
 
285
                                goto err;
 
286
                        }
 
287
                memset(&(s->s3->read_sequence[0]),0,8);
 
288
                mac_secret= &(s->s3->read_mac_secret[0]);
 
289
                }
 
290
        else
 
291
                {
 
292
                if (s->enc_write_ctx != NULL)
 
293
                        reuse_dd = 1;
 
294
                else if ((s->enc_write_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
 
295
                        goto err;
 
296
                if ((s->enc_write_ctx == NULL) &&
 
297
                        ((s->enc_write_ctx=(EVP_CIPHER_CTX *)
 
298
                        OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL))
 
299
                        goto err;
 
300
                dd= s->enc_write_ctx;
 
301
                s->write_hash=m;
 
302
                if (s->compress != NULL)
 
303
                        {
 
304
                        COMP_CTX_free(s->compress);
 
305
                        s->compress=NULL;
 
306
                        }
 
307
                if (comp != NULL)
 
308
                        {
 
309
                        s->compress=COMP_CTX_new(comp->method);
 
310
                        if (s->compress == NULL)
 
311
                                {
 
312
                                SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
 
313
                                goto err2;
 
314
                                }
 
315
                        }
 
316
                memset(&(s->s3->write_sequence[0]),0,8);
 
317
                mac_secret= &(s->s3->write_mac_secret[0]);
 
318
                }
 
319
 
 
320
        if (reuse_dd)
 
321
                EVP_CIPHER_CTX_cleanup(dd);
 
322
        EVP_CIPHER_CTX_init(dd);
 
323
 
 
324
        p=s->s3->tmp.key_block;
 
325
        i=EVP_MD_size(m);
 
326
        cl=EVP_CIPHER_key_length(c);
 
327
        j=is_export ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ?
 
328
                       cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl;
 
329
        /* Was j=(exp)?5:EVP_CIPHER_key_length(c); */
 
330
        k=EVP_CIPHER_iv_length(c);
 
331
        er1= &(s->s3->client_random[0]);
 
332
        er2= &(s->s3->server_random[0]);
 
333
        if (    (which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
 
334
                (which == SSL3_CHANGE_CIPHER_SERVER_READ))
 
335
                {
 
336
                ms=  &(p[ 0]); n=i+i;
 
337
                key= &(p[ n]); n+=j+j;
 
338
                iv=  &(p[ n]); n+=k+k;
 
339
                exp_label=(unsigned char *)TLS_MD_CLIENT_WRITE_KEY_CONST;
 
340
                exp_label_len=TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE;
 
341
                client_write=1;
 
342
                }
 
343
        else
 
344
                {
 
345
                n=i;
 
346
                ms=  &(p[ n]); n+=i+j;
 
347
                key= &(p[ n]); n+=j+k;
 
348
                iv=  &(p[ n]); n+=k;
 
349
                exp_label=(unsigned char *)TLS_MD_SERVER_WRITE_KEY_CONST;
 
350
                exp_label_len=TLS_MD_SERVER_WRITE_KEY_CONST_SIZE;
 
351
                client_write=0;
 
352
                }
 
353
 
 
354
        if (n > s->s3->tmp.key_block_length)
 
355
                {
 
356
                SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_INTERNAL_ERROR);
 
357
                goto err2;
 
358
                }
 
359
 
 
360
        memcpy(mac_secret,ms,i);
 
361
#ifdef TLS_DEBUG
 
362
printf("which = %04X\nmac key=",which);
 
363
{ int z; for (z=0; z<i; z++) printf("%02X%c",ms[z],((z+1)%16)?' ':'\n'); }
 
364
#endif
 
365
        if (is_export)
 
366
                {
 
367
                /* In here I set both the read and write key/iv to the
 
368
                 * same value since only the correct one will be used :-).
 
369
                 */
 
370
                p=buf;
 
371
                memcpy(p,exp_label,exp_label_len);
 
372
                p+=exp_label_len;
 
373
                memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
 
374
                p+=SSL3_RANDOM_SIZE;
 
375
                memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
 
376
                p+=SSL3_RANDOM_SIZE;
 
377
                tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(p-buf),key,j,
 
378
                         tmp1,tmp2,EVP_CIPHER_key_length(c));
 
379
                key=tmp1;
 
380
 
 
381
                if (k > 0)
 
382
                        {
 
383
                        p=buf;
 
384
                        memcpy(p,TLS_MD_IV_BLOCK_CONST,
 
385
                                TLS_MD_IV_BLOCK_CONST_SIZE);
 
386
                        p+=TLS_MD_IV_BLOCK_CONST_SIZE;
 
387
                        memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
 
388
                        p+=SSL3_RANDOM_SIZE;
 
389
                        memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
 
390
                        p+=SSL3_RANDOM_SIZE;
 
391
                        tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,p-buf,empty,0,
 
392
                                 iv1,iv2,k*2);
 
393
                        if (client_write)
 
394
                                iv=iv1;
 
395
                        else
 
396
                                iv= &(iv1[k]);
 
397
                        }
 
398
                }
 
399
 
 
400
        s->session->key_arg_length=0;
 
401
#ifdef KSSL_DEBUG
 
402
        {
 
403
        int i;
 
404
        printf("EVP_CipherInit_ex(dd,c,key=,iv=,which)\n");
 
405
        printf("\tkey= "); for (i=0; i<c->key_len; i++) printf("%02x", key[i]);
 
406
        printf("\n");
 
407
        printf("\t iv= "); for (i=0; i<c->iv_len; i++) printf("%02x", iv[i]);
 
408
        printf("\n");
 
409
        }
 
410
#endif  /* KSSL_DEBUG */
 
411
 
 
412
        EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE));
 
413
#ifdef TLS_DEBUG
 
414
printf("which = %04X\nkey=",which);
 
415
{ int z; for (z=0; z<EVP_CIPHER_key_length(c); z++) printf("%02X%c",key[z],((z+1)%16)?' ':'\n'); }
 
416
printf("\niv=");
 
417
{ int z; for (z=0; z<k; z++) printf("%02X%c",iv[z],((z+1)%16)?' ':'\n'); }
 
418
printf("\n");
 
419
#endif
 
420
 
 
421
        OPENSSL_cleanse(tmp1,sizeof(tmp1));
 
422
        OPENSSL_cleanse(tmp2,sizeof(tmp1));
 
423
        OPENSSL_cleanse(iv1,sizeof(iv1));
 
424
        OPENSSL_cleanse(iv2,sizeof(iv2));
 
425
        return(1);
 
426
err:
 
427
        SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_MALLOC_FAILURE);
 
428
err2:
 
429
        return(0);
 
430
        }
 
431
 
 
432
int tls1_setup_key_block(SSL *s)
 
433
        {
 
434
        unsigned char *p1,*p2;
 
435
        const EVP_CIPHER *c;
 
436
        const EVP_MD *hash;
 
437
        int num;
 
438
        SSL_COMP *comp;
 
439
 
 
440
#ifdef KSSL_DEBUG
 
441
        printf ("tls1_setup_key_block()\n");
 
442
#endif  /* KSSL_DEBUG */
 
443
 
 
444
        if (s->s3->tmp.key_block_length != 0)
 
445
                return(1);
 
446
 
 
447
        if (!ssl_cipher_get_evp(s->session,&c,&hash,&comp))
 
448
                {
 
449
                SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
 
450
                return(0);
 
451
                }
 
452
 
 
453
        s->s3->tmp.new_sym_enc=c;
 
454
        s->s3->tmp.new_hash=hash;
 
455
 
 
456
        num=EVP_CIPHER_key_length(c)+EVP_MD_size(hash)+EVP_CIPHER_iv_length(c);
 
457
        num*=2;
 
458
 
 
459
        ssl3_cleanup_key_block(s);
 
460
 
 
461
        if ((p1=(unsigned char *)OPENSSL_malloc(num)) == NULL)
 
462
                goto err;
 
463
        if ((p2=(unsigned char *)OPENSSL_malloc(num)) == NULL)
 
464
                goto err;
 
465
 
 
466
        s->s3->tmp.key_block_length=num;
 
467
        s->s3->tmp.key_block=p1;
 
468
 
 
469
 
 
470
#ifdef TLS_DEBUG
 
471
printf("client random\n");
 
472
{ int z; for (z=0; z<SSL3_RANDOM_SIZE; z++) printf("%02X%c",s->s3->client_random[z],((z+1)%16)?' ':'\n'); }
 
473
printf("server random\n");
 
474
{ int z; for (z=0; z<SSL3_RANDOM_SIZE; z++) printf("%02X%c",s->s3->server_random[z],((z+1)%16)?' ':'\n'); }
 
475
printf("pre-master\n");
 
476
{ int z; for (z=0; z<s->session->master_key_length; z++) printf("%02X%c",s->session->master_key[z],((z+1)%16)?' ':'\n'); }
 
477
#endif
 
478
        tls1_generate_key_block(s,p1,p2,num);
 
479
        OPENSSL_cleanse(p2,num);
 
480
        OPENSSL_free(p2);
 
481
#ifdef TLS_DEBUG
 
482
printf("\nkey block\n");
 
483
{ int z; for (z=0; z<num; z++) printf("%02X%c",p1[z],((z+1)%16)?' ':'\n'); }
 
484
#endif
 
485
 
 
486
        if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS))
 
487
                {
 
488
                /* enable vulnerability countermeasure for CBC ciphers with
 
489
                 * known-IV problem (http://www.openssl.org/~bodo/tls-cbc.txt)
 
490
                 */
 
491
                s->s3->need_empty_fragments = 1;
 
492
 
 
493
                if (s->session->cipher != NULL)
 
494
                        {
 
495
                        if ((s->session->cipher->algorithms & SSL_ENC_MASK) == SSL_eNULL)
 
496
                                s->s3->need_empty_fragments = 0;
 
497
                        
 
498
#ifndef OPENSSL_NO_RC4
 
499
                        if ((s->session->cipher->algorithms & SSL_ENC_MASK) == SSL_RC4)
 
500
                                s->s3->need_empty_fragments = 0;
 
501
#endif
 
502
                        }
 
503
                }
 
504
 
 
505
        return(1);
 
506
err:
 
507
        SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
 
508
        return(0);
 
509
        }
 
510
 
 
511
int tls1_enc(SSL *s, int send)
 
512
        {
 
513
        SSL3_RECORD *rec;
 
514
        EVP_CIPHER_CTX *ds;
 
515
        unsigned long l;
 
516
        int bs,i,ii,j,k,n=0;
 
517
        const EVP_CIPHER *enc;
 
518
 
 
519
        if (send)
 
520
                {
 
521
                if (s->write_hash != NULL)
 
522
                        n=EVP_MD_size(s->write_hash);
 
523
                ds=s->enc_write_ctx;
 
524
                rec= &(s->s3->wrec);
 
525
                if (s->enc_write_ctx == NULL)
 
526
                        enc=NULL;
 
527
                else
 
528
                        enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
 
529
                }
 
530
        else
 
531
                {
 
532
                if (s->read_hash != NULL)
 
533
                        n=EVP_MD_size(s->read_hash);
 
534
                ds=s->enc_read_ctx;
 
535
                rec= &(s->s3->rrec);
 
536
                if (s->enc_read_ctx == NULL)
 
537
                        enc=NULL;
 
538
                else
 
539
                        enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
 
540
                }
 
541
 
 
542
#ifdef KSSL_DEBUG
 
543
        printf("tls1_enc(%d)\n", send);
 
544
#endif    /* KSSL_DEBUG */
 
545
 
 
546
        if ((s->session == NULL) || (ds == NULL) ||
 
547
                (enc == NULL))
 
548
                {
 
549
                memmove(rec->data,rec->input,rec->length);
 
550
                rec->input=rec->data;
 
551
                }
 
552
        else
 
553
                {
 
554
                l=rec->length;
 
555
                bs=EVP_CIPHER_block_size(ds->cipher);
 
556
 
 
557
                if ((bs != 1) && send)
 
558
                        {
 
559
                        i=bs-((int)l%bs);
 
560
 
 
561
                        /* Add weird padding of upto 256 bytes */
 
562
 
 
563
                        /* we need to add 'i' padding bytes of value j */
 
564
                        j=i-1;
 
565
                        if (s->options & SSL_OP_TLS_BLOCK_PADDING_BUG)
 
566
                                {
 
567
                                if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
 
568
                                        j++;
 
569
                                }
 
570
                        for (k=(int)l; k<(int)(l+i); k++)
 
571
                                rec->input[k]=j;
 
572
                        l+=i;
 
573
                        rec->length+=i;
 
574
                        }
 
575
 
 
576
#ifdef KSSL_DEBUG
 
577
                {
 
578
                unsigned long ui;
 
579
                printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n",
 
580
                        ds,rec->data,rec->input,l);
 
581
                printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n",
 
582
                        ds->buf_len, ds->cipher->key_len,
 
583
                        DES_KEY_SZ, DES_SCHEDULE_SZ,
 
584
                        ds->cipher->iv_len);
 
585
                printf("\t\tIV: ");
 
586
                for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]);
 
587
                printf("\n");
 
588
                printf("\trec->input=");
 
589
                for (ui=0; ui<l; ui++) printf(" %02x", rec->input[ui]);
 
590
                printf("\n");
 
591
                }
 
592
#endif  /* KSSL_DEBUG */
 
593
 
 
594
                if (!send)
 
595
                        {
 
596
                        if (l == 0 || l%bs != 0)
 
597
                                {
 
598
                                SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
 
599
                                ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED);
 
600
                                return 0;
 
601
                                }
 
602
                        }
 
603
                
 
604
                EVP_Cipher(ds,rec->data,rec->input,l);
 
605
 
 
606
#ifdef KSSL_DEBUG
 
607
                {
 
608
                unsigned long i;
 
609
                printf("\trec->data=");
 
610
                for (i=0; i<l; i++)
 
611
                        printf(" %02x", rec->data[i]);  printf("\n");
 
612
                }
 
613
#endif  /* KSSL_DEBUG */
 
614
 
 
615
                if ((bs != 1) && !send)
 
616
                        {
 
617
                        ii=i=rec->data[l-1]; /* padding_length */
 
618
                        i++;
 
619
                        if (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG)
 
620
                                {
 
621
                                /* First packet is even in size, so check */
 
622
                                if ((memcmp(s->s3->read_sequence,
 
623
                                        "\0\0\0\0\0\0\0\0",8) == 0) && !(ii & 1))
 
624
                                        s->s3->flags|=TLS1_FLAGS_TLS_PADDING_BUG;
 
625
                                if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
 
626
                                        i--;
 
627
                                }
 
628
                        /* TLS 1.0 does not bound the number of padding bytes by the block size.
 
629
                         * All of them must have value 'padding_length'. */
 
630
                        if (i > (int)rec->length)
 
631
                                {
 
632
                                /* Incorrect padding. SSLerr() and ssl3_alert are done
 
633
                                 * by caller: we don't want to reveal whether this is
 
634
                                 * a decryption error or a MAC verification failure
 
635
                                 * (see http://www.openssl.org/~bodo/tls-cbc.txt) */
 
636
                                return -1;
 
637
                                }
 
638
                        for (j=(int)(l-i); j<(int)l; j++)
 
639
                                {
 
640
                                if (rec->data[j] != ii)
 
641
                                        {
 
642
                                        /* Incorrect padding */
 
643
                                        return -1;
 
644
                                        }
 
645
                                }
 
646
                        rec->length-=i;
 
647
                        }
 
648
                }
 
649
        return(1);
 
650
        }
 
651
 
 
652
int tls1_cert_verify_mac(SSL *s, EVP_MD_CTX *in_ctx, unsigned char *out)
 
653
        {
 
654
        unsigned int ret;
 
655
        EVP_MD_CTX ctx;
 
656
 
 
657
        EVP_MD_CTX_init(&ctx);
 
658
        EVP_MD_CTX_copy_ex(&ctx,in_ctx);
 
659
        EVP_DigestFinal_ex(&ctx,out,&ret);
 
660
        EVP_MD_CTX_cleanup(&ctx);
 
661
        return((int)ret);
 
662
        }
 
663
 
 
664
int tls1_final_finish_mac(SSL *s, EVP_MD_CTX *in1_ctx, EVP_MD_CTX *in2_ctx,
 
665
             const char *str, int slen, unsigned char *out)
 
666
        {
 
667
        unsigned int i;
 
668
        EVP_MD_CTX ctx;
 
669
        unsigned char buf[TLS_MD_MAX_CONST_SIZE+MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
 
670
        unsigned char *q,buf2[12];
 
671
 
 
672
        q=buf;
 
673
        memcpy(q,str,slen);
 
674
        q+=slen;
 
675
 
 
676
        EVP_MD_CTX_init(&ctx);
 
677
        EVP_MD_CTX_copy_ex(&ctx,in1_ctx);
 
678
        EVP_DigestFinal_ex(&ctx,q,&i);
 
679
        q+=i;
 
680
        EVP_MD_CTX_copy_ex(&ctx,in2_ctx);
 
681
        EVP_DigestFinal_ex(&ctx,q,&i);
 
682
        q+=i;
 
683
 
 
684
        tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(q-buf),
 
685
                s->session->master_key,s->session->master_key_length,
 
686
                out,buf2,sizeof buf2);
 
687
        EVP_MD_CTX_cleanup(&ctx);
 
688
 
 
689
        return sizeof buf2;
 
690
        }
 
691
 
 
692
int tls1_mac(SSL *ssl, unsigned char *md, int send)
 
693
        {
 
694
        SSL3_RECORD *rec;
 
695
        unsigned char *mac_sec,*seq;
 
696
        const EVP_MD *hash;
 
697
        unsigned int md_size;
 
698
        int i;
 
699
        HMAC_CTX hmac;
 
700
        unsigned char buf[5]; 
 
701
 
 
702
        if (send)
 
703
                {
 
704
                rec= &(ssl->s3->wrec);
 
705
                mac_sec= &(ssl->s3->write_mac_secret[0]);
 
706
                seq= &(ssl->s3->write_sequence[0]);
 
707
                hash=ssl->write_hash;
 
708
                }
 
709
        else
 
710
                {
 
711
                rec= &(ssl->s3->rrec);
 
712
                mac_sec= &(ssl->s3->read_mac_secret[0]);
 
713
                seq= &(ssl->s3->read_sequence[0]);
 
714
                hash=ssl->read_hash;
 
715
                }
 
716
 
 
717
        md_size=EVP_MD_size(hash);
 
718
 
 
719
        buf[0]=rec->type;
 
720
        buf[1]=TLS1_VERSION_MAJOR;
 
721
        buf[2]=TLS1_VERSION_MINOR;
 
722
        buf[3]=rec->length>>8;
 
723
        buf[4]=rec->length&0xff;
 
724
 
 
725
        /* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */
 
726
        HMAC_CTX_init(&hmac);
 
727
        HMAC_Init_ex(&hmac,mac_sec,EVP_MD_size(hash),hash,NULL);
 
728
        HMAC_Update(&hmac,seq,8);
 
729
        HMAC_Update(&hmac,buf,5);
 
730
        HMAC_Update(&hmac,rec->input,rec->length);
 
731
        HMAC_Final(&hmac,md,&md_size);
 
732
        HMAC_CTX_cleanup(&hmac);
 
733
 
 
734
#ifdef TLS_DEBUG
 
735
printf("sec=");
 
736
{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); }
 
737
printf("seq=");
 
738
{int z; for (z=0; z<8; z++) printf("%02X ",seq[z]); printf("\n"); }
 
739
printf("buf=");
 
740
{int z; for (z=0; z<5; z++) printf("%02X ",buf[z]); printf("\n"); }
 
741
printf("rec=");
 
742
{unsigned int z; for (z=0; z<rec->length; z++) printf("%02X ",buf[z]); printf("\n"); }
 
743
#endif
 
744
 
 
745
        for (i=7; i>=0; i--)
 
746
                {
 
747
                ++seq[i];
 
748
                if (seq[i] != 0) break; 
 
749
                }
 
750
 
 
751
#ifdef TLS_DEBUG
 
752
{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); }
 
753
#endif
 
754
        return(md_size);
 
755
        }
 
756
 
 
757
int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
 
758
             int len)
 
759
        {
 
760
        unsigned char buf[SSL3_RANDOM_SIZE*2+TLS_MD_MASTER_SECRET_CONST_SIZE];
 
761
        unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH];
 
762
 
 
763
#ifdef KSSL_DEBUG
 
764
        printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", s,out, p,len);
 
765
#endif  /* KSSL_DEBUG */
 
766
 
 
767
        /* Setup the stuff to munge */
 
768
        memcpy(buf,TLS_MD_MASTER_SECRET_CONST,
 
769
                TLS_MD_MASTER_SECRET_CONST_SIZE);
 
770
        memcpy(&(buf[TLS_MD_MASTER_SECRET_CONST_SIZE]),
 
771
                s->s3->client_random,SSL3_RANDOM_SIZE);
 
772
        memcpy(&(buf[SSL3_RANDOM_SIZE+TLS_MD_MASTER_SECRET_CONST_SIZE]),
 
773
                s->s3->server_random,SSL3_RANDOM_SIZE);
 
774
        tls1_PRF(s->ctx->md5,s->ctx->sha1,
 
775
                buf,TLS_MD_MASTER_SECRET_CONST_SIZE+SSL3_RANDOM_SIZE*2,p,len,
 
776
                s->session->master_key,buff,sizeof buff);
 
777
#ifdef KSSL_DEBUG
 
778
        printf ("tls1_generate_master_secret() complete\n");
 
779
#endif  /* KSSL_DEBUG */
 
780
        return(SSL3_MASTER_SECRET_SIZE);
 
781
        }
 
782
 
 
783
int tls1_alert_code(int code)
 
784
        {
 
785
        switch (code)
 
786
                {
 
787
        case SSL_AD_CLOSE_NOTIFY:       return(SSL3_AD_CLOSE_NOTIFY);
 
788
        case SSL_AD_UNEXPECTED_MESSAGE: return(SSL3_AD_UNEXPECTED_MESSAGE);
 
789
        case SSL_AD_BAD_RECORD_MAC:     return(SSL3_AD_BAD_RECORD_MAC);
 
790
        case SSL_AD_DECRYPTION_FAILED:  return(TLS1_AD_DECRYPTION_FAILED);
 
791
        case SSL_AD_RECORD_OVERFLOW:    return(TLS1_AD_RECORD_OVERFLOW);
 
792
        case SSL_AD_DECOMPRESSION_FAILURE:return(SSL3_AD_DECOMPRESSION_FAILURE);
 
793
        case SSL_AD_HANDSHAKE_FAILURE:  return(SSL3_AD_HANDSHAKE_FAILURE);
 
794
        case SSL_AD_NO_CERTIFICATE:     return(-1);
 
795
        case SSL_AD_BAD_CERTIFICATE:    return(SSL3_AD_BAD_CERTIFICATE);
 
796
        case SSL_AD_UNSUPPORTED_CERTIFICATE:return(SSL3_AD_UNSUPPORTED_CERTIFICATE);
 
797
        case SSL_AD_CERTIFICATE_REVOKED:return(SSL3_AD_CERTIFICATE_REVOKED);
 
798
        case SSL_AD_CERTIFICATE_EXPIRED:return(SSL3_AD_CERTIFICATE_EXPIRED);
 
799
        case SSL_AD_CERTIFICATE_UNKNOWN:return(SSL3_AD_CERTIFICATE_UNKNOWN);
 
800
        case SSL_AD_ILLEGAL_PARAMETER:  return(SSL3_AD_ILLEGAL_PARAMETER);
 
801
        case SSL_AD_UNKNOWN_CA:         return(TLS1_AD_UNKNOWN_CA);
 
802
        case SSL_AD_ACCESS_DENIED:      return(TLS1_AD_ACCESS_DENIED);
 
803
        case SSL_AD_DECODE_ERROR:       return(TLS1_AD_DECODE_ERROR);
 
804
        case SSL_AD_DECRYPT_ERROR:      return(TLS1_AD_DECRYPT_ERROR);
 
805
        case SSL_AD_EXPORT_RESTRICTION: return(TLS1_AD_EXPORT_RESTRICTION);
 
806
        case SSL_AD_PROTOCOL_VERSION:   return(TLS1_AD_PROTOCOL_VERSION);
 
807
        case SSL_AD_INSUFFICIENT_SECURITY:return(TLS1_AD_INSUFFICIENT_SECURITY);
 
808
        case SSL_AD_INTERNAL_ERROR:     return(TLS1_AD_INTERNAL_ERROR);
 
809
        case SSL_AD_USER_CANCELLED:     return(TLS1_AD_USER_CANCELLED);
 
810
        case SSL_AD_NO_RENEGOTIATION:   return(TLS1_AD_NO_RENEGOTIATION);
 
811
        default:                        return(-1);
 
812
                }
 
813
        }
 
814