Add support for new TLS export ciphersuites.
[openssl.git] / ssl / s3_enc.c
index 116b09615524fc3b8db40347a0d788a0cc4a7015..d79d9272d6526447797ba5513d84b28c3660d5e0 100644 (file)
@@ -139,12 +139,15 @@ int which;
        COMP_METHOD *comp;
        EVP_MD *m;
        MD5_CTX md;
-       int exp,n,i,j,k;
+       int exp,n,i,j,k,cl;
 
-       exp=(s->s3->tmp.new_cipher->algorithms & SSL_EXPORT)?1:0;
+       exp=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
        c=s->s3->tmp.new_sym_enc;
        m=s->s3->tmp.new_hash;
-       comp=s->s3->tmp.new_compression;
+       if (s->s3->tmp.new_compression == NULL)
+               comp=NULL;
+       else
+               comp=s->s3->tmp.new_compression->method;
        key_block=s->s3->tmp.key_block;
 
        if (which & SSL3_CC_READ)
@@ -169,8 +172,9 @@ int which;
                                SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
                                goto err2;
                                }
-                       s->s3->rrec.comp=(unsigned char *)
-                               Malloc(SSL3_RT_MAX_PLAIN_LENGTH);
+                       if (s->s3->rrec.comp == NULL)
+                               s->s3->rrec.comp=(unsigned char *)
+                                       Malloc(SSL3_RT_MAX_PLAIN_LENGTH);
                        if (s->s3->rrec.comp == NULL)
                                goto err;
                        }
@@ -208,7 +212,10 @@ int which;
 
        p=s->s3->tmp.key_block;
        i=EVP_MD_size(m);
-       j=(exp)?5:EVP_CIPHER_key_length(c);
+       cl=EVP_CIPHER_key_length(c);
+       j=exp ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ?
+                cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl;
+       /* Was j=(exp)?5:EVP_CIPHER_key_length(c); */
        k=EVP_CIPHER_iv_length(c);
        if (    (which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
                (which == SSL3_CHANGE_CIPHER_SERVER_READ))
@@ -277,12 +284,13 @@ SSL *s;
        unsigned char *p;
        EVP_CIPHER *c;
        EVP_MD *hash;
-       int num,exp;
+       int num;
+       SSL_COMP *comp;
 
        if (s->s3->tmp.key_block_length != 0)
                return(1);
 
-       if (!ssl_cipher_get_evp(s->session->cipher,&c,&hash))
+       if (!ssl_cipher_get_evp(s->session,&c,&hash,&comp))
                {
                SSLerr(SSL_F_SSL3_SETUP_KEY_BLOCK,SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
                return(0);
@@ -290,13 +298,7 @@ SSL *s;
 
        s->s3->tmp.new_sym_enc=c;
        s->s3->tmp.new_hash=hash;
-#ifdef ZLIB
-       s->s3->tmp.new_compression=COMP_zlib();
-#endif
-/*     s->s3->tmp.new_compression=COMP_rle(); */
-/*     s->session->compress_meth= xxxxx */
-
-       exp=(s->session->cipher->algorithms & SSL_EXPORT)?1:0;
+       s->s3->tmp.new_compression=comp;
 
        num=EVP_CIPHER_key_length(c)+EVP_MD_size(hash)+EVP_CIPHER_iv_length(c);
        num*=2;
@@ -452,7 +454,7 @@ unsigned char *p;
        unsigned char md_buf[EVP_MAX_MD_SIZE];
        EVP_MD_CTX ctx;
 
-       memcpy(&ctx,in_ctx,sizeof(EVP_MD_CTX));
+       EVP_MD_CTX_copy(&ctx,in_ctx);
 
        n=EVP_MD_CTX_size(&ctx);
        npad=(48/n)*n;