| Index: net/cert/x509_certificate_mac.cc
|
| diff --git a/net/cert/x509_certificate_mac.cc b/net/cert/x509_certificate_mac.cc
|
| index d36b36c1cad9c8c6fff1460d506c5be09a5a6854..73dbe464f021e119349d9310d982a7e7dff5d925 100644
|
| --- a/net/cert/x509_certificate_mac.cc
|
| +++ b/net/cert/x509_certificate_mac.cc
|
| @@ -117,23 +117,6 @@ std::string GetCertSerialNumber(
|
| serial_number.field()->Length);
|
| }
|
|
|
| -// Test that a given |cert_handle| is actually a valid X.509 certificate, and
|
| -// return true if it is.
|
| -//
|
| -// On OS X, SecCertificateCreateFromData() does not return any errors if
|
| -// called with invalid data, as long as data is present. The actual decoding
|
| -// of the certificate does not happen until an API that requires a CSSM
|
| -// handle is called. While SecCertificateGetCLHandle is the most likely
|
| -// candidate, as it performs the parsing, it does not check whether the
|
| -// parsing was actually successful. Instead, SecCertificateGetSubject is
|
| -// used (supported since 10.3), as a means to check that the certificate
|
| -// parsed as a valid X.509 certificate.
|
| -bool IsValidOSCertHandle(SecCertificateRef cert_handle) {
|
| - const CSSM_X509_NAME* sanity_check = NULL;
|
| - OSStatus status = SecCertificateGetSubject(cert_handle, &sanity_check);
|
| - return status == noErr && sanity_check;
|
| -}
|
| -
|
| // Parses |data| of length |length|, attempting to decode it as the specified
|
| // |format|. If |data| is in the specified format, any certificates contained
|
| // within are stored into |output|.
|
| @@ -182,7 +165,7 @@ void AddCertificatesFromBytes(const char* data, size_t length,
|
| // |input_format|, causing decode to succeed. On OS X 10.6, the data
|
| // is properly decoded as a PKCS#7, whether PEM or not, which avoids
|
| // the need to fallback to internal decoding.
|
| - if (IsValidOSCertHandle(cert)) {
|
| + if (x509_util::IsValidSecCertificate(cert)) {
|
| CFRetain(cert);
|
| output->push_back(cert);
|
| }
|
| @@ -298,22 +281,9 @@ bool X509Certificate::IsSameOSCert(X509Certificate::OSCertHandle a,
|
| X509Certificate::OSCertHandle X509Certificate::CreateOSCertHandleFromBytes(
|
| const char* data,
|
| size_t length) {
|
| - CSSM_DATA cert_data;
|
| - cert_data.Data = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(data));
|
| - cert_data.Length = length;
|
| -
|
| - OSCertHandle cert_handle = NULL;
|
| - OSStatus status = SecCertificateCreateFromData(&cert_data,
|
| - CSSM_CERT_X_509v3,
|
| - CSSM_CERT_ENCODING_DER,
|
| - &cert_handle);
|
| - if (status != noErr)
|
| - return NULL;
|
| - if (!IsValidOSCertHandle(cert_handle)) {
|
| - CFRelease(cert_handle);
|
| - return NULL;
|
| - }
|
| - return cert_handle;
|
| + return x509_util::CreateSecCertificateFromBytes(
|
| + reinterpret_cast<const uint8_t*>(data), length)
|
| + .release();
|
| }
|
|
|
| // static
|
| @@ -357,20 +327,7 @@ void X509Certificate::FreeOSCertHandle(OSCertHandle cert_handle) {
|
|
|
| // static
|
| SHA256HashValue X509Certificate::CalculateFingerprint256(OSCertHandle cert) {
|
| - SHA256HashValue sha256;
|
| - memset(sha256.data, 0, sizeof(sha256.data));
|
| -
|
| - CSSM_DATA cert_data;
|
| - OSStatus status = SecCertificateGetData(cert, &cert_data);
|
| - if (status)
|
| - return sha256;
|
| -
|
| - DCHECK(cert_data.Data);
|
| - DCHECK_NE(cert_data.Length, 0U);
|
| -
|
| - CC_SHA256(cert_data.Data, cert_data.Length, sha256.data);
|
| -
|
| - return sha256;
|
| + return x509_util::CalculateFingerprint256(cert);
|
| }
|
|
|
| // static
|
| @@ -395,20 +352,6 @@ SHA256HashValue X509Certificate::CalculateCAFingerprint256(
|
| return sha256;
|
| }
|
|
|
| -CFMutableArrayRef X509Certificate::CreateOSCertChainForCert() const {
|
| - CFMutableArrayRef cert_list =
|
| - CFArrayCreateMutable(kCFAllocatorDefault, 0,
|
| - &kCFTypeArrayCallBacks);
|
| - if (!cert_list)
|
| - return NULL;
|
| -
|
| - CFArrayAppendValue(cert_list, os_cert_handle());
|
| - for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i)
|
| - CFArrayAppendValue(cert_list, intermediate_ca_certs_[i]);
|
| -
|
| - return cert_list;
|
| -}
|
| -
|
| // static
|
| X509Certificate::OSCertHandle X509Certificate::ReadOSCertHandleFromPickle(
|
| base::PickleIterator* pickle_iter) {
|
| @@ -481,39 +424,7 @@ void X509Certificate::GetPublicKeyInfo(OSCertHandle cert_handle,
|
|
|
| // static
|
| bool X509Certificate::IsSelfSigned(OSCertHandle cert_handle) {
|
| - x509_util::CSSMCachedCertificate cached_cert;
|
| - OSStatus status = cached_cert.Init(cert_handle);
|
| - if (status != noErr)
|
| - return false;
|
| -
|
| - x509_util::CSSMFieldValue subject;
|
| - status = cached_cert.GetField(&CSSMOID_X509V1SubjectNameStd, &subject);
|
| - if (status != CSSM_OK || !subject.field())
|
| - return false;
|
| -
|
| - x509_util::CSSMFieldValue issuer;
|
| - status = cached_cert.GetField(&CSSMOID_X509V1IssuerNameStd, &issuer);
|
| - if (status != CSSM_OK || !issuer.field())
|
| - return false;
|
| -
|
| - if (subject.field()->Length != issuer.field()->Length ||
|
| - memcmp(subject.field()->Data, issuer.field()->Data,
|
| - issuer.field()->Length) != 0) {
|
| - return false;
|
| - }
|
| -
|
| - CSSM_CL_HANDLE cl_handle = CSSM_INVALID_HANDLE;
|
| - status = SecCertificateGetCLHandle(cert_handle, &cl_handle);
|
| - if (status)
|
| - return false;
|
| - CSSM_DATA cert_data;
|
| - status = SecCertificateGetData(cert_handle, &cert_data);
|
| - if (status)
|
| - return false;
|
| -
|
| - if (CSSM_CL_CertVerify(cl_handle, 0, &cert_data, &cert_data, NULL, 0))
|
| - return false;
|
| - return true;
|
| + return x509_util::IsSelfSigned(cert_handle);
|
| }
|
|
|
| #pragma clang diagnostic pop // "-Wdeprecated-declarations"
|
|
|