diff options
author | Serguei E. Leontiev <leo@sai.msu.ru> | 2014-05-11 19:46:42 +0100 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2014-05-12 18:41:51 +0100 |
commit | d6e55b400142d3232819163cdc77b9df8561ffb6 (patch) | |
tree | 366d3be52099f640963cf363326f04ea88a2ead7 /ssl | |
parent | f710c3f198c9980a1056bac9b4b9617554254671 (diff) |
Replace manual ASN1 decoder with ASN1_get_object
Replace manual ASN.1 decoder with ASN1_get object. This
will decode the tag and length properly and check against
it does not exceed the supplied buffer length.
PR#3335
(cherry picked from commit b0308dddd1cc6a8e1de803ef29ba6da25ee072c2)
Diffstat (limited to 'ssl')
-rw-r--r-- | ssl/s3_srvr.c | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/ssl/s3_srvr.c b/ssl/s3_srvr.c index 8d0e54315f..36f34270cd 100644 --- a/ssl/s3_srvr.c +++ b/ssl/s3_srvr.c @@ -2897,6 +2897,8 @@ int ssl3_get_client_key_exchange(SSL *s) unsigned char premaster_secret[32], *start; size_t outlen=32, inlen; unsigned long alg_a; + int Ttag, Tclass; + long Tlen; /* Get our certificate private key*/ alg_a = s->s3->tmp.new_cipher->algorithm_auth; @@ -2918,26 +2920,15 @@ int ssl3_get_client_key_exchange(SSL *s) ERR_clear_error(); } /* Decrypt session key */ - if ((*p!=( V_ASN1_SEQUENCE| V_ASN1_CONSTRUCTED))) - { - SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_DECRYPTION_FAILED); - goto gerr; - } - if (p[1] == 0x81) - { - start = p+3; - inlen = p[2]; - } - else if (p[1] < 0x80) - { - start = p+2; - inlen = p[1]; - } - else + if (ASN1_get_object((const unsigned char **)&p, &Tlen, &Ttag, &Tclass, n) != V_ASN1_CONSTRUCTED || + Ttag != V_ASN1_SEQUENCE || + Tclass != V_ASN1_UNIVERSAL) { SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_DECRYPTION_FAILED); goto gerr; } + start = p; + inlen = Tlen; if (EVP_PKEY_decrypt(pkey_ctx,premaster_secret,&outlen,start,inlen) <=0) { |