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

Unified Diff: net/base/x509_certificate.h

Issue 7324039: Ensure X509Certificate::OSCertHandles are safe to be used on both UI and IO threads on Win (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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 side-by-side diff with in-line comments
Download patch
Index: net/base/x509_certificate.h
diff --git a/net/base/x509_certificate.h b/net/base/x509_certificate.h
index 208d8f61455786b57649746dffaf0d64f0a0b57c..0b46dd222482a1e09eb1a9c5926a5b5519444127 100644
--- a/net/base/x509_certificate.h
+++ b/net/base/x509_certificate.h
@@ -27,8 +27,10 @@
#include "base/synchronization/lock.h"
#elif defined(USE_OPENSSL)
+#include <openssl/safestack.h>
// Forward declaration; real one in <x509.h>
-struct x509_st;
+typedef struct x509_st X509;
+PREDECLARE_STACK_OF(X509);
typedef struct x509_store_st X509_STORE;
#elif defined(USE_NSS)
// Forward declaration; real one in <cert.h>
@@ -55,20 +57,41 @@ typedef std::vector<scoped_refptr<X509Certificate> > CertificateList;
class NET_API X509Certificate
: public base::RefCountedThreadSafe<X509Certificate> {
public:
- // A handle to the certificate object in the underlying crypto library.
- // We assume that OSCertHandle is a pointer type on all platforms and
- // NULL is an invalid OSCertHandle.
+ // An OSCertHandle is a handle to the certificate object in the underlying
+ // crypto library. We assume that OSCertHandle is a pointer type on all
+ // platforms and that NULL represents an invalid OSCertHandle.
+ //
+ // An OSCertListHandle is a handle to the underlying crypto library that
wtc 2011/10/04 00:26:34 Add "the object in" before "the underlying crypto
+ // represents a collection of certificates, with one of the certificates
+ // marked as an identity certificate and the remaining certificates marked
wtc 2011/10/04 00:26:34 I suggest changing "an identity certificate" to "a
Ryan Sleevi 2011/10/04 03:38:07 Does the explanation on line 53-54 provide the nec
wtc 2011/10/04 18:00:51 This is fine. My complaint about this comment is
+ // as supplementary certificates for path building. Like OSCertHandle, it
+ // is assumed to be a pointer type on all platforms and that NULL
+ // represents an invalid OSCertListHandle.
+ //
+ // It should be noted that depending on the underlying cryptographic
wtc 2011/10/04 00:26:34 Nit: for brevity, change "It should be noted that"
+ // library, an OSCertHandle or OSCertListHandle may not be thread-safe.
wtc 2011/10/04 00:26:34 Please add a comment to motivate OSCertListHandle.
#if defined(OS_WIN)
typedef PCCERT_CONTEXT OSCertHandle;
+ // Though the same type as an OSCertHandle, a unique HCERTSTORE member is
+ // used for the certificate containing just the subset of related
wtc 2011/10/04 00:26:34 Add "store" after "certificate". Change "related"
+ // certificates.
+ typedef PCCERT_CONTEXT OSCertListHandle;
#elif defined(OS_MACOSX)
typedef SecCertificateRef OSCertHandle;
+ typedef CFArrayRef OSCertListHandle;
#elif defined(USE_OPENSSL)
typedef struct x509_st* OSCertHandle;
wtc 2011/10/04 00:26:34 Change "struct x509_st" to X509.
+ typedef STACK_OF(X509)* OSCertListHandle;
#elif defined(USE_NSS)
typedef struct CERTCertificateStr* OSCertHandle;
+ // TODO(rsleevi): With NSS, it is not currently necessary to use a
+ // separate type, because of how certificate path building/verification is
+ // implemented.
+ typedef OSCertHandle OSCertListHandle;
#else
// TODO(ericroman): not implemented
typedef void* OSCertHandle;
+ typedef void* OSCertListHandle;
wtc 2011/10/04 00:26:34 Nit: it would be nice to use the same style of typ
#endif
typedef std::vector<OSCertHandle> OSCertHandles;
@@ -235,6 +258,12 @@ class NET_API X509Certificate
// Returns true if I already contain all the given intermediate certs.
bool HasIntermediateCertificates(const OSCertHandles& certs);
+ // Returns a new OSCertListHandle representing the certificate and any
+ // associated intermediates, or NULL on failure. Ownership is transferred
wtc 2011/10/04 00:26:34 Nit: intermediates => intermediate certificates
+ // to the caller and may be released by calling FreeOSCertListHandle()
+ // with the returned value.
+ OSCertListHandle CreateOSCertListHandle() const;
+
#if defined(OS_MACOSX)
// Does this certificate's usage allow SSL client authentication?
bool SupportsSSLClientAuth() const;
@@ -345,6 +374,9 @@ class NET_API X509Certificate
// Frees (or releases a reference to) an OS certificate handle.
static void FreeOSCertHandle(OSCertHandle cert_handle);
+ // Frees (or releases a reference to) an OS certificate list handle.
+ static void FreeOSCertListHandle(OSCertListHandle cert_list);
wtc 2011/10/04 00:26:34 cert_list => cert_list_handle
+
// Calculates the SHA-1 fingerprint of the certificate. Returns an empty
// (all zero) fingerprint on failure.
static SHA1Fingerprint CalculateFingerprint(OSCertHandle cert_handle);

Powered by Google App Engine
This is Rietveld 408576698