Index: net/ssl/ssl_platform_key_mac.cc |
diff --git a/net/ssl/ssl_platform_key_mac.cc b/net/ssl/ssl_platform_key_mac.cc |
index e7313c07d2d0ff72c902e4462458f72f15953b7c..029c0f36fecbbf6aecb82a5ee7eb40e9c81cada5 100644 |
--- a/net/ssl/ssl_platform_key_mac.cc |
+++ b/net/ssl/ssl_platform_key_mac.cc |
@@ -29,7 +29,7 @@ |
#include "crypto/openssl_util.h" |
#include "net/base/net_errors.h" |
#include "net/cert/x509_certificate.h" |
-#include "net/ssl/ssl_platform_key_task_runner.h" |
+#include "net/ssl/ssl_platform_key_util.h" |
#include "net/ssl/ssl_private_key.h" |
#include "net/ssl/threaded_ssl_private_key.h" |
@@ -91,22 +91,18 @@ SecKeyRef FetchSecKeyRefForCertificate(const X509Certificate* certificate) { |
class SSLPlatformKeyMac : public ThreadedSSLPrivateKey::Delegate { |
public: |
- SSLPlatformKeyMac(SecKeyRef key, const CSSM_KEY* cssm_key) |
- : key_(key, base::scoped_policy::RETAIN), cssm_key_(cssm_key) { |
- DCHECK(cssm_key_->KeyHeader.AlgorithmId == CSSM_ALGID_RSA || |
- cssm_key_->KeyHeader.AlgorithmId == CSSM_ALGID_ECDSA); |
- } |
+ SSLPlatformKeyMac(SSLPrivateKey::Type type, |
+ size_t max_length, |
+ SecKeyRef key, |
+ const CSSM_KEY* cssm_key) |
+ : type_(type), |
+ max_length_(max_length), |
+ key_(key, base::scoped_policy::RETAIN), |
+ cssm_key_(cssm_key) {} |
~SSLPlatformKeyMac() override {} |
- SSLPrivateKey::Type GetType() override { |
- if (cssm_key_->KeyHeader.AlgorithmId == CSSM_ALGID_RSA) { |
- return SSLPrivateKey::Type::RSA; |
- } else { |
- DCHECK_EQ(CSSM_ALGID_ECDSA, cssm_key_->KeyHeader.AlgorithmId); |
- return SSLPrivateKey::Type::ECDSA; |
- } |
- } |
+ SSLPrivateKey::Type GetType() override { return type_; } |
std::vector<SSLPrivateKey::Hash> GetDigestPreferences() override { |
static const SSLPrivateKey::Hash kHashes[] = { |
@@ -116,17 +112,7 @@ class SSLPlatformKeyMac : public ThreadedSSLPrivateKey::Delegate { |
kHashes + arraysize(kHashes)); |
} |
- size_t GetMaxSignatureLengthInBytes() override { |
- if (cssm_key_->KeyHeader.AlgorithmId == CSSM_ALGID_RSA) { |
- return (cssm_key_->KeyHeader.LogicalKeySizeInBits + 7) / 8; |
- } else { |
- // LogicalKeySizeInBits is the size of an EC public key. But an |
- // ECDSA signature length depends on the size of the base point's |
- // order. For P-256, P-384, and P-521, these two sizes are the same. |
- return ECDSA_SIG_max_len((cssm_key_->KeyHeader.LogicalKeySizeInBits + 7) / |
- 8); |
- } |
- } |
+ size_t GetMaxSignatureLengthInBytes() override { return max_length_; } |
Error SignDigest(SSLPrivateKey::Hash hash, |
const base::StringPiece& input, |
@@ -202,7 +188,7 @@ class SSLPlatformKeyMac : public ThreadedSSLPrivateKey::Delegate { |
} |
} |
- signature->resize(GetMaxSignatureLengthInBytes()); |
+ signature->resize(max_length_); |
CSSM_DATA signature_data; |
signature_data.Length = signature->size(); |
signature_data.Data = signature->data(); |
@@ -216,6 +202,8 @@ class SSLPlatformKeyMac : public ThreadedSSLPrivateKey::Delegate { |
} |
private: |
+ SSLPrivateKey::Type type_; |
+ size_t max_length_; |
base::ScopedCFTypeRef<SecKeyRef> key_; |
const CSSM_KEY* cssm_key_; |
@@ -237,13 +225,14 @@ scoped_refptr<SSLPrivateKey> FetchClientCertPrivateKey( |
if (status != noErr) |
return nullptr; |
- if (cssm_key->KeyHeader.AlgorithmId != CSSM_ALGID_RSA && |
- cssm_key->KeyHeader.AlgorithmId != CSSM_ALGID_ECDSA) { |
- LOG(ERROR) << "Unknown key type: " << cssm_key->KeyHeader.AlgorithmId; |
+ SSLPrivateKey::Type key_type; |
+ size_t max_length; |
+ if (!GetClientCertInfo(certificate, &key_type, &max_length)) |
return nullptr; |
- } |
+ |
return make_scoped_refptr(new ThreadedSSLPrivateKey( |
- base::MakeUnique<SSLPlatformKeyMac>(private_key.get(), cssm_key), |
+ base::MakeUnique<SSLPlatformKeyMac>(key_type, max_length, |
+ private_key.get(), cssm_key), |
GetSSLPlatformKeyTaskRunner())); |
} |