Index: base/crypto/rsa_private_key_mac.cc |
diff --git a/base/crypto/rsa_private_key_mac.cc b/base/crypto/rsa_private_key_mac.cc |
index e46e93ee68c1e1618dfaf88a82f486b1c85cb242..75e09f13ea36774f53a53087c83bff5a7d8e17de 100644 |
--- a/base/crypto/rsa_private_key_mac.cc |
+++ b/base/crypto/rsa_private_key_mac.cc |
@@ -33,7 +33,7 @@ RSAPrivateKey* RSAPrivateKey::Create(uint16 num_bits) { |
crtn = CSSM_GenerateKeyPair(cc_handle, |
CSSM_KEYUSE_VERIFY, |
CSSM_KEYATTR_RETURN_DATA | CSSM_KEYATTR_EXTRACTABLE, &label, |
- &public_key, CSSM_KEYUSE_SIGN, |
+ result->public_key(), CSSM_KEYUSE_SIGN, |
CSSM_KEYATTR_RETURN_DATA | CSSM_KEYATTR_EXTRACTABLE, &label, NULL, |
result->key()); |
CSSM_DeleteContext(cc_handle); |
@@ -42,9 +42,6 @@ RSAPrivateKey* RSAPrivateKey::Create(uint16 num_bits) { |
return NULL; |
} |
- // Public key is not needed. |
- CSSM_FreeKey(GetSharedCSPHandle(), NULL, &public_key, CSSM_FALSE); |
- |
return result.release(); |
} |
@@ -131,7 +128,9 @@ RSAPrivateKey::RSAPrivateKey() { |
RSAPrivateKey::~RSAPrivateKey() { |
if (key_.KeyData.Data) { |
- CSSM_FreeKey(GetSharedCSPHandle(), NULL, &key_, CSSM_FALSE); |
+ CSSM_CSP_HANDLE csp_handle = GetSharedCSPHandle(); |
+ CSSM_FreeKey(csp_handle, NULL, &key_, CSSM_FALSE); |
+ CSSM_FreeKey(csp_handle, NULL, &public_key_, CSSM_FALSE); |
} |
} |
@@ -146,12 +145,13 @@ bool RSAPrivateKey::ExportPrivateKey(std::vector<uint8>* output) { |
} |
bool RSAPrivateKey::ExportPublicKey(std::vector<uint8>* output) { |
- PrivateKeyInfoCodec private_key_info(true); |
- std::vector<uint8> private_key_data; |
- private_key_data.assign(key_.KeyData.Data, |
- key_.KeyData.Data + key_.KeyData.Length); |
- return (private_key_info.Import(private_key_data) && |
- private_key_info.ExportPublicKeyInfo(output)); |
+ if (!public_key_.KeyData.Data || !public_key_.KeyData.Length) { |
+ return false; |
+ } |
+ output->clear(); |
+ output->insert(output->end(), public_key_.KeyData.Data, |
+ public_key_.KeyData.Data + public_key_.KeyData.Length); |
+ return true; |
} |
} // namespace base |