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

Side by Side Diff: net/base/x509_certificate.cc

Issue 10825211: Implement SHA-256 fingerprint support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <map> 10 #include <map>
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 Entry() : cert_handle(NULL), ref_count(0) {} 84 Entry() : cert_handle(NULL), ref_count(0) {}
85 85
86 X509Certificate::OSCertHandle cert_handle; 86 X509Certificate::OSCertHandle cert_handle;
87 87
88 // Increased by each call to InsertOrUpdate(), and balanced by each call 88 // Increased by each call to InsertOrUpdate(), and balanced by each call
89 // to Remove(). When it equals 0, all references created by 89 // to Remove(). When it equals 0, all references created by
90 // InsertOrUpdate() have been released, so the cache entry will be removed 90 // InsertOrUpdate() have been released, so the cache entry will be removed
91 // the cached OS certificate handle will be freed. 91 // the cached OS certificate handle will be freed.
92 int ref_count; 92 int ref_count;
93 }; 93 };
94 typedef std::map<SHA1Fingerprint, Entry, SHA1FingerprintLessThan> CertMap; 94 typedef std::map<SHA1HashValue, Entry, SHA1HashValueLessThan> CertMap;
95 95
96 // Obtain an instance of X509CertificateCache via a LazyInstance. 96 // Obtain an instance of X509CertificateCache via a LazyInstance.
97 X509CertificateCache() {} 97 X509CertificateCache() {}
98 ~X509CertificateCache() {} 98 ~X509CertificateCache() {}
99 friend struct base::DefaultLazyInstanceTraits<X509CertificateCache>; 99 friend struct base::DefaultLazyInstanceTraits<X509CertificateCache>;
100 100
101 // You must acquire this lock before using any private data of this object 101 // You must acquire this lock before using any private data of this object
102 // You must not block while holding this lock. 102 // You must not block while holding this lock.
103 base::Lock lock_; 103 base::Lock lock_;
104 104
105 // The certificate cache. You must acquire |lock_| before using |cache_|. 105 // The certificate cache. You must acquire |lock_| before using |cache_|.
106 CertMap cache_; 106 CertMap cache_;
107 107
108 DISALLOW_COPY_AND_ASSIGN(X509CertificateCache); 108 DISALLOW_COPY_AND_ASSIGN(X509CertificateCache);
109 }; 109 };
110 110
111 base::LazyInstance<X509CertificateCache>::Leaky 111 base::LazyInstance<X509CertificateCache>::Leaky
112 g_x509_certificate_cache = LAZY_INSTANCE_INITIALIZER; 112 g_x509_certificate_cache = LAZY_INSTANCE_INITIALIZER;
113 113
114 void X509CertificateCache::InsertOrUpdate( 114 void X509CertificateCache::InsertOrUpdate(
115 X509Certificate::OSCertHandle* cert_handle) { 115 X509Certificate::OSCertHandle* cert_handle) {
116 DCHECK(cert_handle); 116 DCHECK(cert_handle);
117 SHA1Fingerprint fingerprint = 117 SHA1HashValue fingerprint =
118 X509Certificate::CalculateFingerprint(*cert_handle); 118 X509Certificate::CalculateFingerprint(*cert_handle);
119 119
120 X509Certificate::OSCertHandle old_handle = NULL; 120 X509Certificate::OSCertHandle old_handle = NULL;
121 { 121 {
122 base::AutoLock lock(lock_); 122 base::AutoLock lock(lock_);
123 CertMap::iterator pos = cache_.find(fingerprint); 123 CertMap::iterator pos = cache_.find(fingerprint);
124 if (pos == cache_.end()) { 124 if (pos == cache_.end()) {
125 // A cached entry was not found, so initialize a new entry. The entry 125 // A cached entry was not found, so initialize a new entry. The entry
126 // assumes ownership of the current |*cert_handle|. 126 // assumes ownership of the current |*cert_handle|.
127 Entry cache_entry; 127 Entry cache_entry;
(...skipping 25 matching lines...) Expand all
153 // |old_handle| may be the only handle for this particular certificate, so 153 // |old_handle| may be the only handle for this particular certificate, so
154 // freeing it may be complex or resource-intensive and does not need to 154 // freeing it may be complex or resource-intensive and does not need to
155 // be guarded by the lock. 155 // be guarded by the lock.
156 if (old_handle) { 156 if (old_handle) {
157 X509Certificate::FreeOSCertHandle(old_handle); 157 X509Certificate::FreeOSCertHandle(old_handle);
158 DHISTOGRAM_COUNTS("X509CertificateReuseCount", 1); 158 DHISTOGRAM_COUNTS("X509CertificateReuseCount", 1);
159 } 159 }
160 } 160 }
161 161
162 void X509CertificateCache::Remove(X509Certificate::OSCertHandle cert_handle) { 162 void X509CertificateCache::Remove(X509Certificate::OSCertHandle cert_handle) {
163 SHA1Fingerprint fingerprint = 163 SHA1HashValue fingerprint =
164 X509Certificate::CalculateFingerprint(cert_handle); 164 X509Certificate::CalculateFingerprint(cert_handle);
165 base::AutoLock lock(lock_); 165 base::AutoLock lock(lock_);
166 166
167 CertMap::iterator pos = cache_.find(fingerprint); 167 CertMap::iterator pos = cache_.find(fingerprint);
168 if (pos == cache_.end()) 168 if (pos == cache_.end())
169 return; // A hash collision where the winning cert was already freed. 169 return; // A hash collision where the winning cert was already freed.
170 170
171 bool is_same_cert = X509Certificate::IsSameOSCert(cert_handle, 171 bool is_same_cert = X509Certificate::IsSameOSCert(cert_handle,
172 pos->second.cert_handle); 172 pos->second.cert_handle);
173 if (!is_same_cert) 173 if (!is_same_cert)
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 RemoveFromCache(cert_handle_); 692 RemoveFromCache(cert_handle_);
693 FreeOSCertHandle(cert_handle_); 693 FreeOSCertHandle(cert_handle_);
694 } 694 }
695 for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) { 695 for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) {
696 RemoveFromCache(intermediate_ca_certs_[i]); 696 RemoveFromCache(intermediate_ca_certs_[i]);
697 FreeOSCertHandle(intermediate_ca_certs_[i]); 697 FreeOSCertHandle(intermediate_ca_certs_[i]);
698 } 698 }
699 } 699 }
700 700
701 } // namespace net 701 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698