Check EVP errors for handshake digests.
Partial mitigation of PR#3200
This commit is contained in:
parent
f1068a1ab7
commit
0294b2be5f
3 changed files with 15 additions and 6 deletions
|
@ -161,6 +161,8 @@ int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
|
|||
|
||||
i=s->method->ssl3_enc->final_finish_mac(s,
|
||||
sender,slen,s->s3->tmp.finish_md);
|
||||
if (i == 0)
|
||||
return 0;
|
||||
s->s3->tmp.finish_md_len = i;
|
||||
memcpy(p, s->s3->tmp.finish_md, i);
|
||||
p+=i;
|
||||
|
|
|
@ -1459,8 +1459,14 @@ int ssl3_do_change_cipher_spec(SSL *s)
|
|||
slen=s->method->ssl3_enc->client_finished_label_len;
|
||||
}
|
||||
|
||||
s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s,
|
||||
i = s->method->ssl3_enc->final_finish_mac(s,
|
||||
sender,slen,s->s3->tmp.peer_finish_md);
|
||||
if (i == 0)
|
||||
{
|
||||
SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC, ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
s->s3->tmp.peer_finish_md_len = i;
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
|
11
ssl/t1_enc.c
11
ssl/t1_enc.c
|
@ -915,18 +915,19 @@ int tls1_final_finish_mac(SSL *s,
|
|||
if (mask & ssl_get_algorithm2(s))
|
||||
{
|
||||
int hashsize = EVP_MD_size(md);
|
||||
if (hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf)))
|
||||
EVP_MD_CTX *hdgst = s->s3->handshake_dgst[idx];
|
||||
if (!hdgst || hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf)))
|
||||
{
|
||||
/* internal error: 'buf' is too small for this cipersuite! */
|
||||
err = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
EVP_MD_CTX_copy_ex(&ctx,s->s3->handshake_dgst[idx]);
|
||||
EVP_DigestFinal_ex(&ctx,q,&i);
|
||||
if (i != (unsigned int)hashsize) /* can't really happen */
|
||||
if (!EVP_MD_CTX_copy_ex(&ctx, hdgst) ||
|
||||
!EVP_DigestFinal_ex(&ctx,q,&i) ||
|
||||
(i != (unsigned int)hashsize))
|
||||
err = 1;
|
||||
q+=i;
|
||||
q+=hashsize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue