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

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

Issue 2944008: Refactor X509Certificate caching to cache the OS handle, rather than the X509Certificate (Closed)
Patch Set: Rebase before commit Created 9 years, 5 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
« no previous file with comments | « net/base/cert_database_nss_unittest.cc ('k') | net/base/x509_certificate.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #ifndef NET_BASE_X509_CERTIFICATE_H_ 5 #ifndef NET_BASE_X509_CERTIFICATE_H_
6 #define NET_BASE_X509_CERTIFICATE_H_ 6 #define NET_BASE_X509_CERTIFICATE_H_
7 #pragma once 7 #pragma once
8 8
9 #include <string.h> 9 #include <string.h>
10 10
(...skipping 30 matching lines...) Expand all
41 class StringPiece; 41 class StringPiece;
42 class RSAPrivateKey; 42 class RSAPrivateKey;
43 } // namespace crypto 43 } // namespace crypto
44 44
45 namespace net { 45 namespace net {
46 46
47 class CertVerifyResult; 47 class CertVerifyResult;
48 48
49 typedef std::vector<scoped_refptr<X509Certificate> > CertificateList; 49 typedef std::vector<scoped_refptr<X509Certificate> > CertificateList;
50 50
51 // X509Certificate represents an X.509 certificate used by SSL. 51 // X509Certificate represents a X.509 certificate, which is comprised a
52 // particular identity or end-entity certificate, such as an SSL server
53 // identity or an SSL client certificate, and zero or more intermediate
54 // certificates that may be used to build a path to a root certificate.
52 class NET_API X509Certificate 55 class NET_API X509Certificate
53 : public base::RefCountedThreadSafe<X509Certificate> { 56 : public base::RefCountedThreadSafe<X509Certificate> {
54 public: 57 public:
55 // A handle to the certificate object in the underlying crypto library. 58 // A handle to the certificate object in the underlying crypto library.
56 // We assume that OSCertHandle is a pointer type on all platforms and 59 // We assume that OSCertHandle is a pointer type on all platforms and
57 // NULL is an invalid OSCertHandle. 60 // NULL is an invalid OSCertHandle.
58 #if defined(OS_WIN) 61 #if defined(OS_WIN)
59 typedef PCCERT_CONTEXT OSCertHandle; 62 typedef PCCERT_CONTEXT OSCertHandle;
60 #elif defined(OS_MACOSX) 63 #elif defined(OS_MACOSX)
61 typedef SecCertificateRef OSCertHandle; 64 typedef SecCertificateRef OSCertHandle;
62 #elif defined(USE_OPENSSL) 65 #elif defined(USE_OPENSSL)
63 typedef struct x509_st* OSCertHandle; 66 typedef struct x509_st* OSCertHandle;
64 #elif defined(USE_NSS) 67 #elif defined(USE_NSS)
65 typedef struct CERTCertificateStr* OSCertHandle; 68 typedef struct CERTCertificateStr* OSCertHandle;
66 #else 69 #else
67 // TODO(ericroman): not implemented 70 // TODO(ericroman): not implemented
68 typedef void* OSCertHandle; 71 typedef void* OSCertHandle;
69 #endif 72 #endif
70 73
71 typedef std::vector<OSCertHandle> OSCertHandles; 74 typedef std::vector<OSCertHandle> OSCertHandles;
72 75
73 // Predicate functor used in maps when X509Certificate is used as the key. 76 // Predicate functor used in maps when X509Certificate is used as the key.
74 class NET_API LessThan { 77 class NET_API LessThan {
75 public: 78 public:
76 bool operator() (X509Certificate* lhs, X509Certificate* rhs) const; 79 bool operator() (X509Certificate* lhs, X509Certificate* rhs) const;
77 }; 80 };
78 81
79 // Where the certificate comes from. The enumeration constants are
80 // listed in increasing order of preference.
81 enum Source {
82 SOURCE_UNUSED = 0, // The source_ member is not used.
83 SOURCE_LONE_CERT_IMPORT = 1, // From importing a certificate without
84 // any intermediate CA certificates.
85 SOURCE_FROM_CACHE = 2, // From the disk cache - which contains
86 // intermediate CA certificates, but may be
87 // stale.
88 SOURCE_FROM_NETWORK = 3, // From the network.
89 };
90
91 enum VerifyFlags { 82 enum VerifyFlags {
92 VERIFY_REV_CHECKING_ENABLED = 1 << 0, 83 VERIFY_REV_CHECKING_ENABLED = 1 << 0,
93 VERIFY_EV_CERT = 1 << 1, 84 VERIFY_EV_CERT = 1 << 1,
94 }; 85 };
95 86
96 enum Format { 87 enum Format {
97 // The data contains a single DER-encoded certificate, or a PEM-encoded 88 // The data contains a single DER-encoded certificate, or a PEM-encoded
98 // DER certificate with the PEM encoding block name of "CERTIFICATE". 89 // DER certificate with the PEM encoding block name of "CERTIFICATE".
99 // Any subsequent blocks will be ignored. 90 // Any subsequent blocks will be ignored.
100 FORMAT_SINGLE_CERTIFICATE = 1 << 0, 91 FORMAT_SINGLE_CERTIFICATE = 1 << 0,
(...skipping 28 matching lines...) Expand all
129 // |intermediate_ca_certificates_| at the time it was serialized. 120 // |intermediate_ca_certificates_| at the time it was serialized.
130 PICKLETYPE_CERTIFICATE_CHAIN, 121 PICKLETYPE_CERTIFICATE_CHAIN,
131 }; 122 };
132 123
133 // Creates a X509Certificate from the ground up. Used by tests that simulate 124 // Creates a X509Certificate from the ground up. Used by tests that simulate
134 // SSL connections. 125 // SSL connections.
135 X509Certificate(const std::string& subject, const std::string& issuer, 126 X509Certificate(const std::string& subject, const std::string& issuer,
136 base::Time start_date, base::Time expiration_date); 127 base::Time start_date, base::Time expiration_date);
137 128
138 // Create an X509Certificate from a handle to the certificate object in the 129 // Create an X509Certificate from a handle to the certificate object in the
139 // underlying crypto library. |source| specifies where |cert_handle| comes 130 // underlying crypto library. The returned pointer must be stored in a
140 // from. Given two certificate handles for the same certificate, our 131 // scoped_refptr<X509Certificate>.
141 // certificate cache prefers the handle from the network because our HTTP
142 // cache isn't caching the corresponding intermediate CA certificates yet
143 // (http://crbug.com/7065).
144 // The returned pointer must be stored in a scoped_refptr<X509Certificate>.
145 static X509Certificate* CreateFromHandle(OSCertHandle cert_handle, 132 static X509Certificate* CreateFromHandle(OSCertHandle cert_handle,
146 Source source,
147 const OSCertHandles& intermediates); 133 const OSCertHandles& intermediates);
148 134
149 // Create an X509Certificate from a chain of DER encoded certificates. The 135 // Create an X509Certificate from a chain of DER encoded certificates. The
150 // first certificate in the chain is the end-entity certificate to which a 136 // first certificate in the chain is the end-entity certificate to which a
151 // handle is returned. The other certificates in the chain are intermediate 137 // handle is returned. The other certificates in the chain are intermediate
152 // certificates. See the comment for |CreateFromHandle| about the |source| 138 // certificates. The returned pointer must be stored in a
153 // argument. 139 // scoped_refptr<X509Certificate>.
154 // The returned pointer must be stored in a scoped_refptr<X509Certificate>.
155 static X509Certificate* CreateFromDERCertChain( 140 static X509Certificate* CreateFromDERCertChain(
156 const std::vector<base::StringPiece>& der_certs); 141 const std::vector<base::StringPiece>& der_certs);
157 142
158 // Create an X509Certificate from the DER-encoded representation. 143 // Create an X509Certificate from the DER-encoded representation.
159 // Returns NULL on failure. 144 // Returns NULL on failure.
160 // 145 //
161 // The returned pointer must be stored in a scoped_refptr<X509Certificate>. 146 // The returned pointer must be stored in a scoped_refptr<X509Certificate>.
162 static X509Certificate* CreateFromBytes(const char* data, int length); 147 static X509Certificate* CreateFromBytes(const char* data, int length);
163 148
164 // Create an X509Certificate from the representation stored in the given 149 // Create an X509Certificate from the representation stored in the given
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 // by one of the given names will be included in the list. 279 // by one of the given names will be included in the list.
295 static bool GetSSLClientCertificates( 280 static bool GetSSLClientCertificates(
296 const std::string& server_domain, 281 const std::string& server_domain,
297 const std::vector<CertPrincipal>& valid_issuers, 282 const std::vector<CertPrincipal>& valid_issuers,
298 CertificateList* certs); 283 CertificateList* certs);
299 284
300 // Creates the chain of certs to use for this client identity cert. 285 // Creates the chain of certs to use for this client identity cert.
301 CFArrayRef CreateClientCertificateChain() const; 286 CFArrayRef CreateClientCertificateChain() const;
302 #endif 287 #endif
303 288
304 #if defined(OS_WIN)
305 // Returns a handle to a global, in-memory certificate store. We use it for
306 // two purposes:
307 // 1. Import server certificates into this store so that we can verify and
308 // display the certificates using CryptoAPI.
309 // 2. Copy client certificates from the "MY" system certificate store into
310 // this store so that we can close the system store when we finish
311 // searching for client certificates.
312 static HCERTSTORE cert_store();
313 #endif
314
315 #if defined(USE_OPENSSL) 289 #if defined(USE_OPENSSL)
316 // Returns a handle to a global, in-memory certificate store. We 290 // Returns a handle to a global, in-memory certificate store. We
317 // use it for test code, e.g. importing the test server's certificate. 291 // use it for test code, e.g. importing the test server's certificate.
318 static X509_STORE* cert_store(); 292 static X509_STORE* cert_store();
319 #endif 293 #endif
320 294
321 // Verifies the certificate against the given hostname. Returns OK if 295 // Verifies the certificate against the given hostname. Returns OK if
322 // successful or an error code upon failure. 296 // successful or an error code upon failure.
323 // 297 //
324 // The |*verify_result| structure, including the |verify_result->cert_status| 298 // The |*verify_result| structure, including the |verify_result->cert_status|
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 // specific |format|. Returns an empty collection on failure. 338 // specific |format|. Returns an empty collection on failure.
365 static OSCertHandles CreateOSCertHandlesFromBytes( 339 static OSCertHandles CreateOSCertHandlesFromBytes(
366 const char* data, int length, Format format); 340 const char* data, int length, Format format);
367 341
368 // Duplicates (or adds a reference to) an OS certificate handle. 342 // Duplicates (or adds a reference to) an OS certificate handle.
369 static OSCertHandle DupOSCertHandle(OSCertHandle cert_handle); 343 static OSCertHandle DupOSCertHandle(OSCertHandle cert_handle);
370 344
371 // Frees (or releases a reference to) an OS certificate handle. 345 // Frees (or releases a reference to) an OS certificate handle.
372 static void FreeOSCertHandle(OSCertHandle cert_handle); 346 static void FreeOSCertHandle(OSCertHandle cert_handle);
373 347
348 // Calculates the SHA-1 fingerprint of the certificate. Returns an empty
349 // (all zero) fingerprint on failure.
350 static SHA1Fingerprint CalculateFingerprint(OSCertHandle cert_handle);
351
374 private: 352 private:
375 friend class base::RefCountedThreadSafe<X509Certificate>; 353 friend class base::RefCountedThreadSafe<X509Certificate>;
376 friend class TestRootCerts; // For unit tests 354 friend class TestRootCerts; // For unit tests
377 FRIEND_TEST_ALL_PREFIXES(X509CertificateTest, Cache); 355 FRIEND_TEST_ALL_PREFIXES(X509CertificateTest, Cache);
378 FRIEND_TEST_ALL_PREFIXES(X509CertificateTest, IntermediateCertificates); 356 FRIEND_TEST_ALL_PREFIXES(X509CertificateTest, IntermediateCertificates);
379 FRIEND_TEST_ALL_PREFIXES(X509CertificateTest, SerialNumbers); 357 FRIEND_TEST_ALL_PREFIXES(X509CertificateTest, SerialNumbers);
380 FRIEND_TEST_ALL_PREFIXES(X509CertificateNameVerifyTest, VerifyHostname); 358 FRIEND_TEST_ALL_PREFIXES(X509CertificateNameVerifyTest, VerifyHostname);
381 359
382 // Construct an X509Certificate from a handle to the certificate object 360 // Construct an X509Certificate from a handle to the certificate object
383 // in the underlying crypto library. 361 // in the underlying crypto library.
384 X509Certificate(OSCertHandle cert_handle, Source source, 362 X509Certificate(OSCertHandle cert_handle,
385 const OSCertHandles& intermediates); 363 const OSCertHandles& intermediates);
386 364
387 ~X509Certificate(); 365 ~X509Certificate();
388 366
389 // Common object initialization code. Called by the constructors only. 367 // Common object initialization code. Called by the constructors only.
390 void Initialize(); 368 void Initialize();
391 369
392 #if defined(OS_WIN) 370 #if defined(OS_WIN)
393 bool CheckEV(PCCERT_CHAIN_CONTEXT chain_context, 371 bool CheckEV(PCCERT_CHAIN_CONTEXT chain_context,
394 const char* policy_oid) const; 372 const char* policy_oid) const;
395 static bool IsIssuedByKnownRoot(PCCERT_CHAIN_CONTEXT chain_context); 373 static bool IsIssuedByKnownRoot(PCCERT_CHAIN_CONTEXT chain_context);
396 #endif 374 #endif
397 #if defined(OS_MACOSX) 375 #if defined(OS_MACOSX)
398 static bool IsIssuedByKnownRoot(CFArrayRef chain); 376 static bool IsIssuedByKnownRoot(CFArrayRef chain);
399 #endif 377 #endif
400 #if defined(USE_NSS) 378 #if defined(USE_NSS)
401 bool VerifyEV() const; 379 bool VerifyEV() const;
402 #endif 380 #endif
403 #if defined(USE_OPENSSL) 381 #if defined(USE_OPENSSL)
404 // Resets the store returned by cert_store() to default state. Used by 382 // Resets the store returned by cert_store() to default state. Used by
405 // TestRootCerts to undo modifications. 383 // TestRootCerts to undo modifications.
406 static void ResetCertStore(); 384 static void ResetCertStore();
407 #endif 385 #endif
408 386
409 // Calculates the SHA-1 fingerprint of the certificate. Returns an empty
410 // (all zero) fingerprint on failure.
411 static SHA1Fingerprint CalculateFingerprint(OSCertHandle cert_handle);
412
413 // Verifies that |hostname| matches one of the certificate names or IP 387 // Verifies that |hostname| matches one of the certificate names or IP
414 // addresses supplied, based on TLS name matching rules - specifically, 388 // addresses supplied, based on TLS name matching rules - specifically,
415 // following http://tools.ietf.org/html/rfc6125. 389 // following http://tools.ietf.org/html/rfc6125.
416 // |cert_common_name| is the Subject CN, e.g. from X509Certificate::subject(). 390 // |cert_common_name| is the Subject CN, e.g. from X509Certificate::subject().
417 // The members of |cert_san_dns_names| and |cert_san_ipaddrs| must be filled 391 // The members of |cert_san_dns_names| and |cert_san_ipaddrs| must be filled
418 // from the dNSName and iPAddress components of the subject alternative name 392 // from the dNSName and iPAddress components of the subject alternative name
419 // extension, if present. Note these IP addresses are NOT ascii-encoded: 393 // extension, if present. Note these IP addresses are NOT ascii-encoded:
420 // they must be 4 or 16 bytes of network-ordered data, for IPv4 and IPv6 394 // they must be 4 or 16 bytes of network-ordered data, for IPv4 and IPv6
421 // addresses, respectively. 395 // addresses, respectively.
422 static bool VerifyHostname(const std::string& hostname, 396 static bool VerifyHostname(const std::string& hostname,
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 // Untrusted intermediate certificates associated with this certificate 458 // Untrusted intermediate certificates associated with this certificate
485 // that may be needed for chain building. 459 // that may be needed for chain building.
486 OSCertHandles intermediate_ca_certs_; 460 OSCertHandles intermediate_ca_certs_;
487 461
488 #if defined(OS_MACOSX) 462 #if defined(OS_MACOSX)
489 // Blocks multiple threads from verifying the cert simultaneously. 463 // Blocks multiple threads from verifying the cert simultaneously.
490 // (Marked mutable because it's used in a const method.) 464 // (Marked mutable because it's used in a const method.)
491 mutable base::Lock verification_lock_; 465 mutable base::Lock verification_lock_;
492 #endif 466 #endif
493 467
494 // Where the certificate comes from.
495 Source source_;
496
497 DISALLOW_COPY_AND_ASSIGN(X509Certificate); 468 DISALLOW_COPY_AND_ASSIGN(X509Certificate);
498 }; 469 };
499 470
500 } // namespace net 471 } // namespace net
501 472
502 #endif // NET_BASE_X509_CERTIFICATE_H_ 473 #endif // NET_BASE_X509_CERTIFICATE_H_
OLDNEW
« no previous file with comments | « net/base/cert_database_nss_unittest.cc ('k') | net/base/x509_certificate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698