Clean Kerberos pre-master secret
Ensure the Kerberos pre-master secret has OPENSSL_cleanse called on it. With thanks to the Open Crypto Audit Project for reporting this issue. Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
parent
3610719931
commit
4e3dbe37ca
@ -2411,6 +2411,7 @@ int ssl3_get_client_key_exchange(SSL *s)
|
|||||||
int padl, outl;
|
int padl, outl;
|
||||||
krb5_timestamp authtime = 0;
|
krb5_timestamp authtime = 0;
|
||||||
krb5_ticket_times ttimes;
|
krb5_ticket_times ttimes;
|
||||||
|
int kerr = 0;
|
||||||
|
|
||||||
EVP_CIPHER_CTX_init(&ciph_ctx);
|
EVP_CIPHER_CTX_init(&ciph_ctx);
|
||||||
|
|
||||||
@ -2514,23 +2515,27 @@ int ssl3_get_client_key_exchange(SSL *s)
|
|||||||
{
|
{
|
||||||
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
|
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
|
||||||
SSL_R_DECRYPTION_FAILED);
|
SSL_R_DECRYPTION_FAILED);
|
||||||
goto err;
|
kerr = 1;
|
||||||
|
goto kclean;
|
||||||
}
|
}
|
||||||
if (outl > SSL_MAX_MASTER_KEY_LENGTH) {
|
if (outl > SSL_MAX_MASTER_KEY_LENGTH) {
|
||||||
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
|
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
|
||||||
SSL_R_DATA_LENGTH_TOO_LONG);
|
SSL_R_DATA_LENGTH_TOO_LONG);
|
||||||
goto err;
|
kerr = 1;
|
||||||
|
goto kclean;
|
||||||
}
|
}
|
||||||
if (!EVP_DecryptFinal_ex(&ciph_ctx, &(pms[outl]), &padl)) {
|
if (!EVP_DecryptFinal_ex(&ciph_ctx, &(pms[outl]), &padl)) {
|
||||||
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
|
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
|
||||||
SSL_R_DECRYPTION_FAILED);
|
SSL_R_DECRYPTION_FAILED);
|
||||||
goto err;
|
kerr = 1;
|
||||||
|
goto kclean;
|
||||||
}
|
}
|
||||||
outl += padl;
|
outl += padl;
|
||||||
if (outl > SSL_MAX_MASTER_KEY_LENGTH) {
|
if (outl > SSL_MAX_MASTER_KEY_LENGTH) {
|
||||||
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
|
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
|
||||||
SSL_R_DATA_LENGTH_TOO_LONG);
|
SSL_R_DATA_LENGTH_TOO_LONG);
|
||||||
goto err;
|
kerr = 1;
|
||||||
|
goto kclean;
|
||||||
}
|
}
|
||||||
if (!((pms[0] == (s->client_version >> 8))
|
if (!((pms[0] == (s->client_version >> 8))
|
||||||
&& (pms[1] == (s->client_version & 0xff)))) {
|
&& (pms[1] == (s->client_version & 0xff)))) {
|
||||||
@ -2547,7 +2552,8 @@ int ssl3_get_client_key_exchange(SSL *s)
|
|||||||
if (!(s->options & SSL_OP_TLS_ROLLBACK_BUG)) {
|
if (!(s->options & SSL_OP_TLS_ROLLBACK_BUG)) {
|
||||||
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
|
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
|
||||||
SSL_AD_DECODE_ERROR);
|
SSL_AD_DECODE_ERROR);
|
||||||
goto err;
|
kerr = 1;
|
||||||
|
goto kclean;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2573,6 +2579,11 @@ int ssl3_get_client_key_exchange(SSL *s)
|
|||||||
* kssl_ctx = kssl_ctx_free(kssl_ctx);
|
* kssl_ctx = kssl_ctx_free(kssl_ctx);
|
||||||
* if (s->kssl_ctx) s->kssl_ctx = NULL;
|
* if (s->kssl_ctx) s->kssl_ctx = NULL;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
kclean:
|
||||||
|
OPENSSL_cleanse(pms, sizeof(pms));
|
||||||
|
if (kerr)
|
||||||
|
goto err;
|
||||||
} else
|
} else
|
||||||
#endif /* OPENSSL_NO_KRB5 */
|
#endif /* OPENSSL_NO_KRB5 */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user