mirror of
https://github.com/openssl/openssl.git
synced 2025-01-18 13:44:20 +08:00
Don't create an ECX key with short keys
If an ECX key is created and the private key is too short, a fromdata call would create the key, and then later detect the error and report it after freeing the key. However freeing the key was calling OPENSSL_secure_clear_free() and assuming that the private key was of the correct length. If it was actually too short this will write over memory that it shouldn't. Fixes #17017 Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/17041)
This commit is contained in:
parent
c9007bda79
commit
50938aec35
@ -70,11 +70,23 @@ int ossl_ecx_key_fromdata(ECX_KEY *ecx, const OSSL_PARAM params[],
|
||||
if (param_pub_key == NULL && param_priv_key == NULL)
|
||||
return 0;
|
||||
|
||||
if (param_priv_key != NULL
|
||||
&& !OSSL_PARAM_get_octet_string(param_priv_key,
|
||||
(void **)&ecx->privkey, ecx->keylen,
|
||||
&privkeylen))
|
||||
return 0;
|
||||
if (param_priv_key != NULL) {
|
||||
if (!OSSL_PARAM_get_octet_string(param_priv_key,
|
||||
(void **)&ecx->privkey, ecx->keylen,
|
||||
&privkeylen))
|
||||
return 0;
|
||||
if (privkeylen != ecx->keylen) {
|
||||
/*
|
||||
* Invalid key length. We will clear what we've received now. We
|
||||
* can't leave it to ossl_ecx_key_free() because that will call
|
||||
* OPENSSL_secure_clear_free() and assume the correct key length
|
||||
*/
|
||||
OPENSSL_secure_clear_free(ecx->privkey, privkeylen);
|
||||
ecx->privkey = NULL;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pubkey = ecx->pubkey;
|
||||
if (param_pub_key != NULL
|
||||
@ -83,8 +95,7 @@ int ossl_ecx_key_fromdata(ECX_KEY *ecx, const OSSL_PARAM params[],
|
||||
sizeof(ecx->pubkey), &pubkeylen))
|
||||
return 0;
|
||||
|
||||
if ((param_pub_key != NULL && pubkeylen != ecx->keylen)
|
||||
|| (param_priv_key != NULL && privkeylen != ecx->keylen))
|
||||
if ((param_pub_key != NULL && pubkeylen != ecx->keylen))
|
||||
return 0;
|
||||
|
||||
if (param_pub_key == NULL && !ossl_ecx_public_from_private(ecx))
|
||||
|
Loading…
Reference in New Issue
Block a user