diff options
author | Shawn Willden <swillden@google.com> | 2014-06-20 16:20:41 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-06-20 02:04:52 +0000 |
commit | 4bbc12a092008b14ca8db6487435de42d1e54ec1 (patch) | |
tree | 5919ebfdd510d97eea95c9c075b383dd51017fe5 | |
parent | 9f64567d9f5e7c7db3b62869a1c199f4ff7d3691 (diff) | |
parent | 18a00e163f4c107a2c88d51455c4963be783333a (diff) | |
download | security-4bbc12a092008b14ca8db6487435de42d1e54ec1.tar.gz |
Merge "Fix softkeymaster EC group memory leak."
-rw-r--r-- | softkeymaster/keymaster_openssl.cpp | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/softkeymaster/keymaster_openssl.cpp b/softkeymaster/keymaster_openssl.cpp index 5a25b657..85ecc6e7 100644 --- a/softkeymaster/keymaster_openssl.cpp +++ b/softkeymaster/keymaster_openssl.cpp @@ -71,6 +71,13 @@ struct EC_KEY_Delete { }; typedef UniquePtr<EC_KEY, EC_KEY_Delete> Unique_EC_KEY; +struct EC_GROUP_Delete { + void operator()(EC_GROUP* p) const { + EC_GROUP_free(p); + } +}; +typedef UniquePtr<EC_GROUP, EC_GROUP_Delete> Unique_EC_GROUP; + struct RSA_Delete { void operator()(RSA* p) const { RSA_free(p); @@ -282,35 +289,34 @@ static int generate_dsa_keypair(EVP_PKEY* pkey, const keymaster_dsa_keygen_param } static int generate_ec_keypair(EVP_PKEY* pkey, const keymaster_ec_keygen_params_t* ec_params) { - EC_GROUP* group; + Unique_EC_GROUP group; switch (ec_params->field_size) { case 192: - group = EC_GROUP_new_by_curve_name(NID_X9_62_prime192v1); + group.reset(EC_GROUP_new_by_curve_name(NID_X9_62_prime192v1)); break; case 224: - group = EC_GROUP_new_by_curve_name(NID_secp224r1); + group.reset(EC_GROUP_new_by_curve_name(NID_secp224r1)); break; case 256: - group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1); + group.reset(EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)); break; case 384: - group = EC_GROUP_new_by_curve_name(NID_secp384r1); + group.reset(EC_GROUP_new_by_curve_name(NID_secp384r1)); break; case 521: - group = EC_GROUP_new_by_curve_name(NID_secp521r1); + group.reset(EC_GROUP_new_by_curve_name(NID_secp521r1)); break; default: - group = NULL; break; } - if (group == NULL) { + if (group.get() == NULL) { logOpenSSLError("generate_ec_keypair"); return -1; } - EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_UNCOMPRESSED); - EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE); + EC_GROUP_set_point_conversion_form(group.get(), POINT_CONVERSION_UNCOMPRESSED); + EC_GROUP_set_asn1_flag(group.get(), OPENSSL_EC_NAMED_CURVE); /* initialize EC key */ Unique_EC_KEY eckey(EC_KEY_new()); @@ -319,7 +325,7 @@ static int generate_ec_keypair(EVP_PKEY* pkey, const keymaster_ec_keygen_params_ return -1; } - if (EC_KEY_set_group(eckey.get(), group) != 1) { + if (EC_KEY_set_group(eckey.get(), group.get()) != 1) { logOpenSSLError("generate_ec_keypair"); return -1; } |