summaryrefslogtreecommitdiffstats
path: root/ssl
diff options
context:
space:
mode:
authorSerguei E. Leontiev <leo@sai.msu.ru>2014-05-11 19:46:42 +0100
committerDr. Stephen Henson <steve@openssl.org>2014-05-12 18:41:51 +0100
commitd6e55b400142d3232819163cdc77b9df8561ffb6 (patch)
tree366d3be52099f640963cf363326f04ea88a2ead7 /ssl
parentf710c3f198c9980a1056bac9b4b9617554254671 (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.c23
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)
{