mirror of https://github.com/openssl/openssl.git
e_aes_cbc_hmac_sha1.c: handle zero-length payload and engage empty frag
countermeasure. PR: 2778
This commit is contained in:
parent
26e6bac143
commit
fc90e42c86
|
|
@ -82,6 +82,8 @@ typedef struct
|
||||||
} aux;
|
} aux;
|
||||||
} EVP_AES_HMAC_SHA1;
|
} EVP_AES_HMAC_SHA1;
|
||||||
|
|
||||||
|
#define NO_PAYLOAD_LENGTH ((size_t)-1)
|
||||||
|
|
||||||
#if defined(AES_ASM) && ( \
|
#if defined(AES_ASM) && ( \
|
||||||
defined(__x86_64) || defined(__x86_64__) || \
|
defined(__x86_64) || defined(__x86_64__) || \
|
||||||
defined(_M_AMD64) || defined(_M_X64) || \
|
defined(_M_AMD64) || defined(_M_X64) || \
|
||||||
|
|
@ -123,7 +125,7 @@ static int aesni_cbc_hmac_sha1_init_key(EVP_CIPHER_CTX *ctx,
|
||||||
key->tail = key->head;
|
key->tail = key->head;
|
||||||
key->md = key->head;
|
key->md = key->head;
|
||||||
|
|
||||||
key->payload_length = 0;
|
key->payload_length = NO_PAYLOAD_LENGTH;
|
||||||
|
|
||||||
return ret<0?0:1;
|
return ret<0?0:1;
|
||||||
}
|
}
|
||||||
|
|
@ -184,7 +186,7 @@ static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
|
||||||
if (len%AES_BLOCK_SIZE) return 0;
|
if (len%AES_BLOCK_SIZE) return 0;
|
||||||
|
|
||||||
if (ctx->encrypt) {
|
if (ctx->encrypt) {
|
||||||
if (plen==0)
|
if (plen==NO_PAYLOAD_LENGTH)
|
||||||
plen = len;
|
plen = len;
|
||||||
else if (len!=((plen+SHA_DIGEST_LENGTH+AES_BLOCK_SIZE)&-AES_BLOCK_SIZE))
|
else if (len!=((plen+SHA_DIGEST_LENGTH+AES_BLOCK_SIZE)&-AES_BLOCK_SIZE))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -270,7 +272,7 @@ static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
key->payload_length = 0;
|
key->payload_length = NO_PAYLOAD_LENGTH;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -664,10 +664,14 @@ static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
|
||||||
if ( (sess == NULL) ||
|
if ( (sess == NULL) ||
|
||||||
(s->enc_write_ctx == NULL) ||
|
(s->enc_write_ctx == NULL) ||
|
||||||
(EVP_MD_CTX_md(s->write_hash) == NULL))
|
(EVP_MD_CTX_md(s->write_hash) == NULL))
|
||||||
|
{
|
||||||
|
#if 1
|
||||||
|
clear=s->enc_write_ctx?0:1; /* must be AEAD cipher */
|
||||||
|
#else
|
||||||
clear=1;
|
clear=1;
|
||||||
|
#endif
|
||||||
if (clear)
|
|
||||||
mac_size=0;
|
mac_size=0;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mac_size=EVP_MD_CTX_size(s->write_hash);
|
mac_size=EVP_MD_CTX_size(s->write_hash);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue