| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/base/x509_certificate.h" | 5 #include "net/base/x509_certificate.h" |
| 6 | 6 |
| 7 #include <CommonCrypto/CommonDigest.h> | 7 #include <CommonCrypto/CommonDigest.h> |
| 8 #include <Security/Security.h> | 8 #include <Security/Security.h> |
| 9 #include <time.h> | 9 #include <time.h> |
| 10 | 10 |
| (...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 result = CopyCertChain(os_cert_handle(), &cert_chain); | 728 result = CopyCertChain(os_cert_handle(), &cert_chain); |
| 729 if (result != noErr) | 729 if (result != noErr) |
| 730 return false; | 730 return false; |
| 731 scoped_cftyperef<CFArrayRef> scoped_cert_chain(cert_chain); | 731 scoped_cftyperef<CFArrayRef> scoped_cert_chain(cert_chain); |
| 732 | 732 |
| 733 // Check all the certs in the chain for a match. | 733 // Check all the certs in the chain for a match. |
| 734 int n = CFArrayGetCount(cert_chain); | 734 int n = CFArrayGetCount(cert_chain); |
| 735 for (int i = 0; i < n; ++i) { | 735 for (int i = 0; i < n; ++i) { |
| 736 SecCertificateRef cert_handle = reinterpret_cast<SecCertificateRef>( | 736 SecCertificateRef cert_handle = reinterpret_cast<SecCertificateRef>( |
| 737 const_cast<void*>(CFArrayGetValueAtIndex(cert_chain, i))); | 737 const_cast<void*>(CFArrayGetValueAtIndex(cert_chain, i))); |
| 738 CFRetain(cert_handle); | |
| 739 scoped_refptr<X509Certificate> cert = X509Certificate::CreateFromHandle( | 738 scoped_refptr<X509Certificate> cert = X509Certificate::CreateFromHandle( |
| 740 cert_handle, | 739 cert_handle, |
| 741 X509Certificate::SOURCE_LONE_CERT_IMPORT, | 740 X509Certificate::SOURCE_LONE_CERT_IMPORT, |
| 742 X509Certificate::OSCertHandles()); | 741 X509Certificate::OSCertHandles()); |
| 743 for (unsigned j = 0; j < valid_issuers.size(); j++) { | 742 for (unsigned j = 0; j < valid_issuers.size(); j++) { |
| 744 if (cert->subject().Matches(valid_issuers[j])) | 743 if (cert->subject().Matches(valid_issuers[j])) |
| 745 return true; | 744 return true; |
| 746 } | 745 } |
| 747 } | 746 } |
| 748 return false; | 747 return false; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 788 SecIdentityRef identity = NULL; | 787 SecIdentityRef identity = NULL; |
| 789 err = SecIdentitySearchCopyNext(search, &identity); | 788 err = SecIdentitySearchCopyNext(search, &identity); |
| 790 if (err) | 789 if (err) |
| 791 break; | 790 break; |
| 792 scoped_cftyperef<SecIdentityRef> scoped_identity(identity); | 791 scoped_cftyperef<SecIdentityRef> scoped_identity(identity); |
| 793 | 792 |
| 794 SecCertificateRef cert_handle; | 793 SecCertificateRef cert_handle; |
| 795 err = SecIdentityCopyCertificate(identity, &cert_handle); | 794 err = SecIdentityCopyCertificate(identity, &cert_handle); |
| 796 if (err != noErr) | 795 if (err != noErr) |
| 797 continue; | 796 continue; |
| 797 scoped_cftyperef<SecCertificateRef> scoped_cert_handle(cert_handle); |
| 798 | 798 |
| 799 scoped_refptr<X509Certificate> cert( | 799 scoped_refptr<X509Certificate> cert( |
| 800 CreateFromHandle(cert_handle, SOURCE_LONE_CERT_IMPORT, | 800 CreateFromHandle(cert_handle, SOURCE_LONE_CERT_IMPORT, |
| 801 OSCertHandles())); | 801 OSCertHandles())); |
| 802 // cert_handle is adoped by cert, so I don't need to release it myself. | 802 // cert_handle is adoped by cert, so I don't need to release it myself. |
| 803 if (cert->HasExpired() || !cert->SupportsSSLClientAuth()) | 803 if (cert->HasExpired() || !cert->SupportsSSLClientAuth()) |
| 804 continue; | 804 continue; |
| 805 | 805 |
| 806 // Skip duplicates (a cert may be in multiple keychains). | 806 // Skip duplicates (a cert may be in multiple keychains). |
| 807 X509Certificate::Fingerprint fingerprint = cert->fingerprint(); | 807 X509Certificate::Fingerprint fingerprint = cert->fingerprint(); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 867 } | 867 } |
| 868 CFRelease(cert_chain); | 868 CFRelease(cert_chain); |
| 869 } | 869 } |
| 870 exit: | 870 exit: |
| 871 if (result) | 871 if (result) |
| 872 LOG(ERROR) << "CreateIdentityCertificateChain error " << result; | 872 LOG(ERROR) << "CreateIdentityCertificateChain error " << result; |
| 873 return chain.release(); | 873 return chain.release(); |
| 874 } | 874 } |
| 875 | 875 |
| 876 } // namespace net | 876 } // namespace net |
| OLD | NEW |