source: trunk/third/openssl/ssl/s3_enc.c @ 18442

Revision 18442, 20.0 KB checked in by zacheiss, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18441, which included commits to RCS files with non-trunk default branches.
Line 
1/* ssl/s3_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/evp.h>
115#include <openssl/md5.h>
116
117static unsigned char ssl3_pad_1[48]={
118        0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
119        0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
120        0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
121        0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
122        0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
123        0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 };
124
125static unsigned char ssl3_pad_2[48]={
126        0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
127        0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
128        0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
129        0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
130        0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
131        0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c };
132
133static int ssl3_handshake_mac(SSL *s, EVP_MD_CTX *in_ctx,
134        const char *sender, int len, unsigned char *p);
135
136static int ssl3_generate_key_block(SSL *s, unsigned char *km, int num)
137        {
138        EVP_MD_CTX m5;
139        EVP_MD_CTX s1;
140        unsigned char buf[16],smd[SHA_DIGEST_LENGTH];
141        unsigned char c='A';
142        int i,j,k;
143
144#ifdef CHARSET_EBCDIC
145        c = os_toascii[c]; /*'A' in ASCII */
146#endif
147        k=0;
148        EVP_MD_CTX_init(&m5);
149        EVP_MD_CTX_init(&s1);
150        for (i=0; i<num; i+=MD5_DIGEST_LENGTH)
151                {
152                k++;
153                if (k > sizeof buf)
154                        {
155                        /* bug: 'buf' is too small for this ciphersuite */
156                        SSLerr(SSL_F_SSL3_GENERATE_KEY_BLOCK, ERR_R_INTERNAL_ERROR);
157                        return 0;
158                        }
159               
160                for (j=0; j<k; j++)
161                        buf[j]=c;
162                c++;
163                EVP_DigestInit_ex(&s1,EVP_sha1(), NULL);
164                EVP_DigestUpdate(&s1,buf,k);
165                EVP_DigestUpdate(&s1,s->session->master_key,
166                        s->session->master_key_length);
167                EVP_DigestUpdate(&s1,s->s3->server_random,SSL3_RANDOM_SIZE);
168                EVP_DigestUpdate(&s1,s->s3->client_random,SSL3_RANDOM_SIZE);
169                EVP_DigestFinal_ex(&s1,smd,NULL);
170
171                EVP_DigestInit_ex(&m5,EVP_md5(), NULL);
172                EVP_DigestUpdate(&m5,s->session->master_key,
173                        s->session->master_key_length);
174                EVP_DigestUpdate(&m5,smd,SHA_DIGEST_LENGTH);
175                if ((i+MD5_DIGEST_LENGTH) > num)
176                        {
177                        EVP_DigestFinal_ex(&m5,smd,NULL);
178                        memcpy(km,smd,(num-i));
179                        }
180                else
181                        EVP_DigestFinal_ex(&m5,km,NULL);
182
183                km+=MD5_DIGEST_LENGTH;
184                }
185        OPENSSL_cleanse(smd,SHA_DIGEST_LENGTH);
186        EVP_MD_CTX_cleanup(&m5);
187        EVP_MD_CTX_cleanup(&s1);
188        return 1;
189        }
190
191int ssl3_change_cipher_state(SSL *s, int which)
192        {
193        unsigned char *p,*key_block,*mac_secret;
194        unsigned char exp_key[EVP_MAX_KEY_LENGTH];
195        unsigned char exp_iv[EVP_MAX_IV_LENGTH];
196        unsigned char *ms,*key,*iv,*er1,*er2;
197        EVP_CIPHER_CTX *dd;
198        const EVP_CIPHER *c;
199        COMP_METHOD *comp;
200        const EVP_MD *m;
201        EVP_MD_CTX md;
202        int exp,n,i,j,k,cl;
203        int reuse_dd = 0;
204
205        exp=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
206        c=s->s3->tmp.new_sym_enc;
207        m=s->s3->tmp.new_hash;
208        if (s->s3->tmp.new_compression == NULL)
209                comp=NULL;
210        else
211                comp=s->s3->tmp.new_compression->method;
212        key_block=s->s3->tmp.key_block;
213
214        if (which & SSL3_CC_READ)
215                {
216                if (s->enc_read_ctx != NULL)
217                        reuse_dd = 1;
218                else if ((s->enc_read_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
219                        goto err;
220                dd= s->enc_read_ctx;
221                s->read_hash=m;
222                /* COMPRESS */
223                if (s->expand != NULL)
224                        {
225                        COMP_CTX_free(s->expand);
226                        s->expand=NULL;
227                        }
228                if (comp != NULL)
229                        {
230                        s->expand=COMP_CTX_new(comp);
231                        if (s->expand == NULL)
232                                {
233                                SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
234                                goto err2;
235                                }
236                        if (s->s3->rrec.comp == NULL)
237                                s->s3->rrec.comp=(unsigned char *)
238                                        OPENSSL_malloc(SSL3_RT_MAX_PLAIN_LENGTH);
239                        if (s->s3->rrec.comp == NULL)
240                                goto err;
241                        }
242                memset(&(s->s3->read_sequence[0]),0,8);
243                mac_secret= &(s->s3->read_mac_secret[0]);
244                }
245        else
246                {
247                if (s->enc_write_ctx != NULL)
248                        reuse_dd = 1;
249                else if ((s->enc_write_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
250                        goto err;
251                dd= s->enc_write_ctx;
252                s->write_hash=m;
253                /* COMPRESS */
254                if (s->compress != NULL)
255                        {
256                        COMP_CTX_free(s->compress);
257                        s->compress=NULL;
258                        }
259                if (comp != NULL)
260                        {
261                        s->compress=COMP_CTX_new(comp);
262                        if (s->compress == NULL)
263                                {
264                                SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
265                                goto err2;
266                                }
267                        }
268                memset(&(s->s3->write_sequence[0]),0,8);
269                mac_secret= &(s->s3->write_mac_secret[0]);
270                }
271
272        if (reuse_dd)
273                EVP_CIPHER_CTX_cleanup(dd);
274        EVP_CIPHER_CTX_init(dd);
275
276        p=s->s3->tmp.key_block;
277        i=EVP_MD_size(m);
278        cl=EVP_CIPHER_key_length(c);
279        j=exp ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ?
280                 cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl;
281        /* Was j=(exp)?5:EVP_CIPHER_key_length(c); */
282        k=EVP_CIPHER_iv_length(c);
283        if (    (which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
284                (which == SSL3_CHANGE_CIPHER_SERVER_READ))
285                {
286                ms=  &(p[ 0]); n=i+i;
287                key= &(p[ n]); n+=j+j;
288                iv=  &(p[ n]); n+=k+k;
289                er1= &(s->s3->client_random[0]);
290                er2= &(s->s3->server_random[0]);
291                }
292        else
293                {
294                n=i;
295                ms=  &(p[ n]); n+=i+j;
296                key= &(p[ n]); n+=j+k;
297                iv=  &(p[ n]); n+=k;
298                er1= &(s->s3->server_random[0]);
299                er2= &(s->s3->client_random[0]);
300                }
301
302        if (n > s->s3->tmp.key_block_length)
303                {
304                SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,ERR_R_INTERNAL_ERROR);
305                goto err2;
306                }
307
308        EVP_MD_CTX_init(&md);
309        memcpy(mac_secret,ms,i);
310        if (exp)
311                {
312                /* In here I set both the read and write key/iv to the
313                 * same value since only the correct one will be used :-).
314                 */
315                EVP_DigestInit_ex(&md,EVP_md5(), NULL);
316                EVP_DigestUpdate(&md,key,j);
317                EVP_DigestUpdate(&md,er1,SSL3_RANDOM_SIZE);
318                EVP_DigestUpdate(&md,er2,SSL3_RANDOM_SIZE);
319                EVP_DigestFinal_ex(&md,&(exp_key[0]),NULL);
320                key= &(exp_key[0]);
321
322                if (k > 0)
323                        {
324                        EVP_DigestInit_ex(&md,EVP_md5(), NULL);
325                        EVP_DigestUpdate(&md,er1,SSL3_RANDOM_SIZE);
326                        EVP_DigestUpdate(&md,er2,SSL3_RANDOM_SIZE);
327                        EVP_DigestFinal_ex(&md,&(exp_iv[0]),NULL);
328                        iv= &(exp_iv[0]);
329                        }
330                }
331
332        s->session->key_arg_length=0;
333
334        EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE));
335
336        OPENSSL_cleanse(&(exp_key[0]),sizeof(exp_key));
337        OPENSSL_cleanse(&(exp_iv[0]),sizeof(exp_iv));
338        EVP_MD_CTX_cleanup(&md);
339        return(1);
340err:
341        SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,ERR_R_MALLOC_FAILURE);
342err2:
343        return(0);
344        }
345
346int ssl3_setup_key_block(SSL *s)
347        {
348        unsigned char *p;
349        const EVP_CIPHER *c;
350        const EVP_MD *hash;
351        int num;
352        int ret = 0;
353        SSL_COMP *comp;
354
355        if (s->s3->tmp.key_block_length != 0)
356                return(1);
357
358        if (!ssl_cipher_get_evp(s->session,&c,&hash,&comp))
359                {
360                SSLerr(SSL_F_SSL3_SETUP_KEY_BLOCK,SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
361                return(0);
362                }
363
364        s->s3->tmp.new_sym_enc=c;
365        s->s3->tmp.new_hash=hash;
366        s->s3->tmp.new_compression=comp;
367
368        num=EVP_CIPHER_key_length(c)+EVP_MD_size(hash)+EVP_CIPHER_iv_length(c);
369        num*=2;
370
371        ssl3_cleanup_key_block(s);
372
373        if ((p=OPENSSL_malloc(num)) == NULL)
374                goto err;
375
376        s->s3->tmp.key_block_length=num;
377        s->s3->tmp.key_block=p;
378
379        ret = ssl3_generate_key_block(s,p,num);
380
381        if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS))
382                {
383                /* enable vulnerability countermeasure for CBC ciphers with
384                 * known-IV problem (http://www.openssl.org/~bodo/tls-cbc.txt)
385                 */
386                s->s3->need_empty_fragments = 1;
387
388                if (s->session->cipher != NULL)
389                        {
390                        if ((s->session->cipher->algorithms & SSL_ENC_MASK) == SSL_eNULL)
391                                s->s3->need_empty_fragments = 0;
392                       
393#ifndef OPENSSL_NO_RC4
394                        if ((s->session->cipher->algorithms & SSL_ENC_MASK) == SSL_RC4)
395                                s->s3->need_empty_fragments = 0;
396#endif
397                        }
398                }
399
400        return ret;
401               
402err:
403        SSLerr(SSL_F_SSL3_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
404        return(0);
405        }
406
407void ssl3_cleanup_key_block(SSL *s)
408        {
409        if (s->s3->tmp.key_block != NULL)
410                {
411                OPENSSL_cleanse(s->s3->tmp.key_block,
412                        s->s3->tmp.key_block_length);
413                OPENSSL_free(s->s3->tmp.key_block);
414                s->s3->tmp.key_block=NULL;
415                }
416        s->s3->tmp.key_block_length=0;
417        }
418
419int ssl3_enc(SSL *s, int send)
420        {
421        SSL3_RECORD *rec;
422        EVP_CIPHER_CTX *ds;
423        unsigned long l;
424        int bs,i;
425        const EVP_CIPHER *enc;
426
427        if (send)
428                {
429                ds=s->enc_write_ctx;
430                rec= &(s->s3->wrec);
431                if (s->enc_write_ctx == NULL)
432                        enc=NULL;
433                else
434                        enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
435                }
436        else
437                {
438                ds=s->enc_read_ctx;
439                rec= &(s->s3->rrec);
440                if (s->enc_read_ctx == NULL)
441                        enc=NULL;
442                else
443                        enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
444                }
445
446        if ((s->session == NULL) || (ds == NULL) ||
447                (enc == NULL))
448                {
449                memmove(rec->data,rec->input,rec->length);
450                rec->input=rec->data;
451                }
452        else
453                {
454                l=rec->length;
455                bs=EVP_CIPHER_block_size(ds->cipher);
456
457                /* COMPRESS */
458
459                if ((bs != 1) && send)
460                        {
461                        i=bs-((int)l%bs);
462
463                        /* we need to add 'i-1' padding bytes */
464                        l+=i;
465                        rec->length+=i;
466                        rec->input[l-1]=(i-1);
467                        }
468               
469                if (!send)
470                        {
471                        if (l == 0 || l%bs != 0)
472                                {
473                                SSLerr(SSL_F_SSL3_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
474                                ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED);
475                                return 0;
476                                }
477                        }
478               
479                EVP_Cipher(ds,rec->data,rec->input,l);
480
481                if ((bs != 1) && !send)
482                        {
483                        i=rec->data[l-1]+1;
484                        /* SSL 3.0 bounds the number of padding bytes by the block size;
485                         * padding bytes (except that last) are arbitrary */
486                        if (i > bs)
487                                {
488                                /* Incorrect padding. SSLerr() and ssl3_alert are done
489                                 * by caller: we don't want to reveal whether this is
490                                 * a decryption error or a MAC verification failure
491                                 * (see http://www.openssl.org/~bodo/tls-cbc.txt) */
492                                return -1;
493                                }
494                        rec->length-=i;
495                        }
496                }
497        return(1);
498        }
499
500void ssl3_init_finished_mac(SSL *s)
501        {
502        EVP_DigestInit_ex(&(s->s3->finish_dgst1),s->ctx->md5, NULL);
503        EVP_DigestInit_ex(&(s->s3->finish_dgst2),s->ctx->sha1, NULL);
504        }
505
506void ssl3_finish_mac(SSL *s, const unsigned char *buf, int len)
507        {
508        EVP_DigestUpdate(&(s->s3->finish_dgst1),buf,len);
509        EVP_DigestUpdate(&(s->s3->finish_dgst2),buf,len);
510        }
511
512int ssl3_cert_verify_mac(SSL *s, EVP_MD_CTX *ctx, unsigned char *p)
513        {
514        return(ssl3_handshake_mac(s,ctx,NULL,0,p));
515        }
516
517int ssl3_final_finish_mac(SSL *s, EVP_MD_CTX *ctx1, EVP_MD_CTX *ctx2,
518             const char *sender, int len, unsigned char *p)
519        {
520        int ret;
521
522        ret=ssl3_handshake_mac(s,ctx1,sender,len,p);
523        p+=ret;
524        ret+=ssl3_handshake_mac(s,ctx2,sender,len,p);
525        return(ret);
526        }
527
528static int ssl3_handshake_mac(SSL *s, EVP_MD_CTX *in_ctx,
529             const char *sender, int len, unsigned char *p)
530        {
531        unsigned int ret;
532        int npad,n;
533        unsigned int i;
534        unsigned char md_buf[EVP_MAX_MD_SIZE];
535        EVP_MD_CTX ctx;
536
537        EVP_MD_CTX_init(&ctx);
538        EVP_MD_CTX_copy_ex(&ctx,in_ctx);
539
540        n=EVP_MD_CTX_size(&ctx);
541        npad=(48/n)*n;
542
543        if (sender != NULL)
544                EVP_DigestUpdate(&ctx,sender,len);
545        EVP_DigestUpdate(&ctx,s->session->master_key,
546                s->session->master_key_length);
547        EVP_DigestUpdate(&ctx,ssl3_pad_1,npad);
548        EVP_DigestFinal_ex(&ctx,md_buf,&i);
549
550        EVP_DigestInit_ex(&ctx,EVP_MD_CTX_md(&ctx), NULL);
551        EVP_DigestUpdate(&ctx,s->session->master_key,
552                s->session->master_key_length);
553        EVP_DigestUpdate(&ctx,ssl3_pad_2,npad);
554        EVP_DigestUpdate(&ctx,md_buf,i);
555        EVP_DigestFinal_ex(&ctx,p,&ret);
556
557        EVP_MD_CTX_cleanup(&ctx);
558
559        return((int)ret);
560        }
561
562int ssl3_mac(SSL *ssl, unsigned char *md, int send)
563        {
564        SSL3_RECORD *rec;
565        unsigned char *mac_sec,*seq;
566        EVP_MD_CTX md_ctx;
567        const EVP_MD *hash;
568        unsigned char *p,rec_char;
569        unsigned int md_size;
570        int npad,i;
571
572        if (send)
573                {
574                rec= &(ssl->s3->wrec);
575                mac_sec= &(ssl->s3->write_mac_secret[0]);
576                seq= &(ssl->s3->write_sequence[0]);
577                hash=ssl->write_hash;
578                }
579        else
580                {
581                rec= &(ssl->s3->rrec);
582                mac_sec= &(ssl->s3->read_mac_secret[0]);
583                seq= &(ssl->s3->read_sequence[0]);
584                hash=ssl->read_hash;
585                }
586
587        md_size=EVP_MD_size(hash);
588        npad=(48/md_size)*md_size;
589
590        /* Chop the digest off the end :-) */
591        EVP_MD_CTX_init(&md_ctx);
592
593        EVP_DigestInit_ex(  &md_ctx,hash, NULL);
594        EVP_DigestUpdate(&md_ctx,mac_sec,md_size);
595        EVP_DigestUpdate(&md_ctx,ssl3_pad_1,npad);
596        EVP_DigestUpdate(&md_ctx,seq,8);
597        rec_char=rec->type;
598        EVP_DigestUpdate(&md_ctx,&rec_char,1);
599        p=md;
600        s2n(rec->length,p);
601        EVP_DigestUpdate(&md_ctx,md,2);
602        EVP_DigestUpdate(&md_ctx,rec->input,rec->length);
603        EVP_DigestFinal_ex( &md_ctx,md,NULL);
604
605        EVP_DigestInit_ex(  &md_ctx,hash, NULL);
606        EVP_DigestUpdate(&md_ctx,mac_sec,md_size);
607        EVP_DigestUpdate(&md_ctx,ssl3_pad_2,npad);
608        EVP_DigestUpdate(&md_ctx,md,md_size);
609        EVP_DigestFinal_ex( &md_ctx,md,&md_size);
610
611        EVP_MD_CTX_cleanup(&md_ctx);
612
613        for (i=7; i>=0; i--)
614                {
615                ++seq[i];
616                if (seq[i] != 0) break;
617                }
618
619        return(md_size);
620        }
621
622int ssl3_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
623             int len)
624        {
625        static const unsigned char *salt[3]={
626#ifndef CHARSET_EBCDIC
627                (const unsigned char *)"A",
628                (const unsigned char *)"BB",
629                (const unsigned char *)"CCC",
630#else
631                (const unsigned char *)"\x41",
632                (const unsigned char *)"\x42\x42",
633                (const unsigned char *)"\x43\x43\x43",
634#endif
635                };
636        unsigned char buf[EVP_MAX_MD_SIZE];
637        EVP_MD_CTX ctx;
638        int i,ret=0;
639        unsigned int n;
640
641        EVP_MD_CTX_init(&ctx);
642        for (i=0; i<3; i++)
643                {
644                EVP_DigestInit_ex(&ctx,s->ctx->sha1, NULL);
645                EVP_DigestUpdate(&ctx,salt[i],strlen((const char *)salt[i]));
646                EVP_DigestUpdate(&ctx,p,len);
647                EVP_DigestUpdate(&ctx,&(s->s3->client_random[0]),
648                        SSL3_RANDOM_SIZE);
649                EVP_DigestUpdate(&ctx,&(s->s3->server_random[0]),
650                        SSL3_RANDOM_SIZE);
651                EVP_DigestFinal_ex(&ctx,buf,&n);
652
653                EVP_DigestInit_ex(&ctx,s->ctx->md5, NULL);
654                EVP_DigestUpdate(&ctx,p,len);
655                EVP_DigestUpdate(&ctx,buf,n);
656                EVP_DigestFinal_ex(&ctx,out,&n);
657                out+=n;
658                ret+=n;
659                }
660        EVP_MD_CTX_cleanup(&ctx);
661        return(ret);
662        }
663
664int ssl3_alert_code(int code)
665        {
666        switch (code)
667                {
668        case SSL_AD_CLOSE_NOTIFY:       return(SSL3_AD_CLOSE_NOTIFY);
669        case SSL_AD_UNEXPECTED_MESSAGE: return(SSL3_AD_UNEXPECTED_MESSAGE);
670        case SSL_AD_BAD_RECORD_MAC:     return(SSL3_AD_BAD_RECORD_MAC);
671        case SSL_AD_DECRYPTION_FAILED:  return(SSL3_AD_BAD_RECORD_MAC);
672        case SSL_AD_RECORD_OVERFLOW:    return(SSL3_AD_BAD_RECORD_MAC);
673        case SSL_AD_DECOMPRESSION_FAILURE:return(SSL3_AD_DECOMPRESSION_FAILURE);
674        case SSL_AD_HANDSHAKE_FAILURE:  return(SSL3_AD_HANDSHAKE_FAILURE);
675        case SSL_AD_NO_CERTIFICATE:     return(SSL3_AD_NO_CERTIFICATE);
676        case SSL_AD_BAD_CERTIFICATE:    return(SSL3_AD_BAD_CERTIFICATE);
677        case SSL_AD_UNSUPPORTED_CERTIFICATE:return(SSL3_AD_UNSUPPORTED_CERTIFICATE);
678        case SSL_AD_CERTIFICATE_REVOKED:return(SSL3_AD_CERTIFICATE_REVOKED);
679        case SSL_AD_CERTIFICATE_EXPIRED:return(SSL3_AD_CERTIFICATE_EXPIRED);
680        case SSL_AD_CERTIFICATE_UNKNOWN:return(SSL3_AD_CERTIFICATE_UNKNOWN);
681        case SSL_AD_ILLEGAL_PARAMETER:  return(SSL3_AD_ILLEGAL_PARAMETER);
682        case SSL_AD_UNKNOWN_CA:         return(SSL3_AD_BAD_CERTIFICATE);
683        case SSL_AD_ACCESS_DENIED:      return(SSL3_AD_HANDSHAKE_FAILURE);
684        case SSL_AD_DECODE_ERROR:       return(SSL3_AD_HANDSHAKE_FAILURE);
685        case SSL_AD_DECRYPT_ERROR:      return(SSL3_AD_HANDSHAKE_FAILURE);
686        case SSL_AD_EXPORT_RESTRICTION: return(SSL3_AD_HANDSHAKE_FAILURE);
687        case SSL_AD_PROTOCOL_VERSION:   return(SSL3_AD_HANDSHAKE_FAILURE);
688        case SSL_AD_INSUFFICIENT_SECURITY:return(SSL3_AD_HANDSHAKE_FAILURE);
689        case SSL_AD_INTERNAL_ERROR:     return(SSL3_AD_HANDSHAKE_FAILURE);
690        case SSL_AD_USER_CANCELLED:     return(SSL3_AD_HANDSHAKE_FAILURE);
691        case SSL_AD_NO_RENEGOTIATION:   return(-1); /* Don't send it :-) */
692        default:                        return(-1);
693                }
694        }
695
Note: See TracBrowser for help on using the repository browser.