Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(162)

Unified Diff: net/base/x509_certificate_mac.cc

Issue 8374019: Record when certificates signed with md[2,4,5] are encountered on OS X. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | net/base/x509_certificate_win.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/x509_certificate_mac.cc
diff --git a/net/base/x509_certificate_mac.cc b/net/base/x509_certificate_mac.cc
index c47d1a51f675e50b61ad09c8cb4aa1890a440fab..351b8f484765aaf7cee1e695ba7ec102cb4a2db3 100644
--- a/net/base/x509_certificate_mac.cc
+++ b/net/base/x509_certificate_mac.cc
@@ -290,6 +290,62 @@ OSStatus CreateTrustPolicies(const std::string& hostname,
return noErr;
}
+// Saves some information about the certificate chain |cert_chain| in
+// |*verify_result|. The caller MUST initialize |*verify_result| before
+// calling this function.
+void GetCertChainInfo(CFArrayRef cert_chain,
+ CertVerifyResult* verify_result) {
+ SecCertificateRef verified_cert = NULL;
+ std::vector<SecCertificateRef> verified_chain;
+ for (CFIndex i = 0, count = CFArrayGetCount(cert_chain);
+ i < count; ++i) {
wtc 2011/10/25 18:24:44 Does this not fit on the previous line?
+ SecCertificateRef chain_cert = reinterpret_cast<SecCertificateRef>(
+ const_cast<void*>(CFArrayGetValueAtIndex(cert_chain, i)));
+ if (i == 0) {
+ verified_cert = chain_cert;
+ } else {
+ verified_chain.push_back(chain_cert);
+ }
+
+ CSSMFields fields;
+ OSStatus status = GetCertFields(chain_cert, &fields);
+ if (status)
+ continue;
+ for (size_t field = 0; field < fields.num_of_fields; ++field) {
+ if (!CSSMOIDEqual(&fields.fields[field].FieldOid,
palmer 2011/10/25 19:53:50 "fields fields field field oid" is baffling. Are t
+ &CSSMOID_X509V1SignatureAlgorithm)) {
+ continue;
+ }
+
+ CSSM_X509_ALGORITHM_IDENTIFIER* signature_algorithm =
+ reinterpret_cast<CSSM_X509_ALGORITHM_IDENTIFIER*>(
+ fields.fields[field].FieldValue.Data);
+ if (!signature_algorithm || (fields.fields[field].FieldValue.Length !=
+ sizeof(CSSM_X509_ALGORITHM_IDENTIFIER))) {
+ break;
wtc 2011/10/25 18:24:44 If we get here, it means the Mac OS X certificate
+ }
+ CSSM_OID_PTR alg_oid = &signature_algorithm->algorithm;
+ if (CSSMOIDEqual(alg_oid, &CSSMOID_MD2WithRSA)) {
+ verify_result->has_md2 = true;
+ if (i != 0)
+ verify_result->has_md2_ca = true;
+ } else if (CSSMOIDEqual(alg_oid, &CSSMOID_MD4WithRSA)) {
+ verify_result->has_md4 = true;
+ } else if (CSSMOIDEqual(alg_oid, &CSSMOID_MD5WithRSA)) {
palmer 2011/10/25 19:53:50 As in the other CL, we should keep track of MD4 CA
+ verify_result->has_md5 = true;
+ if (i != 0)
+ verify_result->has_md5_ca = true;
+ }
+ break;
+ }
+ }
+ if (!verified_cert)
+ return;
+
+ verify_result->verified_cert =
+ X509Certificate::CreateFromHandle(verified_cert, verified_chain);
+}
+
// Gets the issuer for a given cert, starting with the cert itself and
// including the intermediate and finally root certificates (if any).
// This function calls SecTrust but doesn't actually pay attention to the trust
@@ -839,22 +895,7 @@ int X509Certificate::VerifyInternal(const std::string& hostname,
return NetErrorFromOSStatus(status);
ScopedCFTypeRef<CFArrayRef> scoped_completed_chain(completed_chain);
- SecCertificateRef verified_cert = NULL;
- std::vector<SecCertificateRef> verified_chain;
- for (CFIndex i = 0, count = CFArrayGetCount(completed_chain);
- i < count; ++i) {
- SecCertificateRef chain_cert = reinterpret_cast<SecCertificateRef>(
- const_cast<void*>(CFArrayGetValueAtIndex(completed_chain, i)));
- if (i == 0) {
- verified_cert = chain_cert;
- } else {
- verified_chain.push_back(chain_cert);
- }
- }
- if (verified_cert) {
- verify_result->verified_cert = CreateFromHandle(verified_cert,
- verified_chain);
- }
+ GetCertChainInfo(scoped_completed_chain.get(), verify_result);
// Evaluate the results
OSStatus cssm_result;
« no previous file with comments | « no previous file | net/base/x509_certificate_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698