1 // Copyright 2017 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/cert/x509_util_ios_and_mac.h" 6 7 #include "net/cert/x509_certificate.h" 8 #if defined(OS_IOS) 9 #include "net/cert/x509_util_ios.h" 10 #else 11 #include "net/cert/x509_util_mac.h" 12 #endif 13 #include "third_party/boringssl/src/include/openssl/pool.h" 14 15 namespace net { 16 17 namespace x509_util { 18 19 base::ScopedCFTypeRef<CFMutableArrayRef> CreateSecCertificateArrayForX509Certificate(X509Certificate * cert)20CreateSecCertificateArrayForX509Certificate(X509Certificate* cert) { 21 return CreateSecCertificateArrayForX509Certificate( 22 cert, InvalidIntermediateBehavior::kFail); 23 } 24 25 base::ScopedCFTypeRef<CFMutableArrayRef> CreateSecCertificateArrayForX509Certificate(X509Certificate * cert,InvalidIntermediateBehavior invalid_intermediate_behavior)26CreateSecCertificateArrayForX509Certificate( 27 X509Certificate* cert, 28 InvalidIntermediateBehavior invalid_intermediate_behavior) { 29 base::ScopedCFTypeRef<CFMutableArrayRef> cert_list( 30 CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks)); 31 if (!cert_list) 32 return base::ScopedCFTypeRef<CFMutableArrayRef>(); 33 std::string bytes; 34 base::ScopedCFTypeRef<SecCertificateRef> sec_cert( 35 CreateSecCertificateFromBytes(CRYPTO_BUFFER_data(cert->cert_buffer()), 36 CRYPTO_BUFFER_len(cert->cert_buffer()))); 37 if (!sec_cert) 38 return base::ScopedCFTypeRef<CFMutableArrayRef>(); 39 CFArrayAppendValue(cert_list, sec_cert); 40 for (const auto& intermediate : cert->intermediate_buffers()) { 41 base::ScopedCFTypeRef<SecCertificateRef> sec_cert( 42 CreateSecCertificateFromBytes(CRYPTO_BUFFER_data(intermediate.get()), 43 CRYPTO_BUFFER_len(intermediate.get()))); 44 if (!sec_cert) { 45 if (invalid_intermediate_behavior == InvalidIntermediateBehavior::kFail) 46 return base::ScopedCFTypeRef<CFMutableArrayRef>(); 47 LOG(WARNING) << "error parsing intermediate"; 48 continue; 49 } 50 CFArrayAppendValue(cert_list, sec_cert); 51 } 52 return cert_list; 53 } 54 55 } // namespace x509_util 56 57 } // namespace net 58