Index: net/cert/cert_verify_proc_mac.cc |
diff --git a/net/cert/cert_verify_proc_mac.cc b/net/cert/cert_verify_proc_mac.cc |
index 388d0fc41a93b81ba84d8565bec4996fbe0b31f7..b84612ba4eecefb3d239f5b284e4df965aeaecc4 100644 |
--- a/net/cert/cert_verify_proc_mac.cc |
+++ b/net/cert/cert_verify_proc_mac.cc |
@@ -178,13 +178,14 @@ OSStatus CreateTrustPolicies(const std::string& hostname, |
// Stores the constructed certificate chain |cert_chain| and information about |
// the signature algorithms used into |*verify_result|. If the leaf cert in |
// |cert_chain| contains a weak (MD2, MD4, MD5, SHA-1) signature, stores that |
-// in |*leaf_is_weak|. |
+// in |*leaf_is_weak|. |cert_chain| must not be empty. |
void GetCertChainInfo(CFArrayRef cert_chain, |
CSSM_TP_APPLE_EVIDENCE_INFO* chain_info, |
CertVerifyResult* verify_result, |
bool* leaf_is_weak) { |
+ DCHECK_LT(0, CFArrayGetCount(cert_chain)); |
+ |
*leaf_is_weak = false; |
- verify_result->verified_cert = nullptr; |
verify_result->has_md2 = false; |
verify_result->has_md4 = false; |
verify_result->has_md5 = false; |
@@ -253,8 +254,10 @@ void GetCertChainInfo(CFArrayRef cert_chain, |
*leaf_is_weak = true; |
} |
} |
- if (!verified_cert) |
+ if (!verified_cert) { |
+ NOTREACHED(); |
return; |
+ } |
verify_result->verified_cert = |
X509Certificate::CreateFromHandle(verified_cert, verified_chain); |
@@ -561,17 +564,23 @@ int CertVerifyProcMac::VerifyInternal( |
if (rv != OK) |
return rv; |
- CertVerifyResult temp_verify_result; |
- bool leaf_is_weak = false; |
- GetCertChainInfo(temp_chain, temp_chain_info, &temp_verify_result, |
- &leaf_is_weak); |
- |
bool untrusted = (temp_trust_result != kSecTrustResultUnspecified && |
temp_trust_result != kSecTrustResultProceed); |
- bool weak_chain = |
- !leaf_is_weak && |
- (temp_verify_result.has_md2 || temp_verify_result.has_md4 || |
- temp_verify_result.has_md5 || temp_verify_result.has_sha1); |
+ bool weak_chain = false; |
+ if (CFArrayGetCount(temp_chain) == 0) { |
+ // If the chain is empty, it cannot be trusted or have recoverable |
+ // errors. |
+ DCHECK(untrusted); |
+ DCHECK_NE(kSecTrustResultRecoverableTrustFailure, temp_trust_result); |
+ } else { |
+ CertVerifyResult temp_verify_result; |
+ bool leaf_is_weak = false; |
+ GetCertChainInfo(temp_chain, temp_chain_info, &temp_verify_result, |
+ &leaf_is_weak); |
+ weak_chain = !leaf_is_weak && |
+ (temp_verify_result.has_md2 || temp_verify_result.has_md4 || |
+ temp_verify_result.has_md5 || temp_verify_result.has_sha1); |
+ } |
// Set the result to the current chain if: |
// - This is the first verification attempt. This ensures that if |
// everything is awful (e.g. it may just be an untrusted cert), that |
@@ -609,9 +618,11 @@ int CertVerifyProcMac::VerifyInternal( |
if (crl_set && !CheckRevocationWithCRLSet(completed_chain, crl_set)) |
verify_result->cert_status |= CERT_STATUS_REVOKED; |
- bool leaf_is_weak_unused = false; |
- GetCertChainInfo(completed_chain, chain_info, verify_result, |
- &leaf_is_weak_unused); |
+ if (CFArrayGetCount(completed_chain) > 0) { |
+ bool leaf_is_weak_unused = false; |
+ GetCertChainInfo(completed_chain, chain_info, verify_result, |
+ &leaf_is_weak_unused); |
+ } |
// As of Security Update 2012-002/OS X 10.7.4, when an RSA key < 1024 bits |
// is encountered, CSSM returns CSSMERR_TP_VERIFY_ACTION_FAILED and adds |