Index: net/base/x509_certificate.h |
=================================================================== |
--- net/base/x509_certificate.h (revision 42829) |
+++ net/base/x509_certificate.h (working copy) |
@@ -15,15 +15,13 @@ |
#include "base/ref_counted.h" |
#include "base/singleton.h" |
#include "base/time.h" |
-#include "net/base/x509_cert_types.h" |
#include "testing/gtest/include/gtest/gtest_prod.h" |
#if defined(OS_WIN) |
#include <windows.h> |
#include <wincrypt.h> |
#elif defined(OS_MACOSX) |
-#include <CoreFoundation/CFArray.h> |
-#include <Security/SecBase.h> |
+#include <Security/Security.h> |
#elif defined(USE_NSS) |
// Forward declaration; real one in <cert.h> |
struct CERTCertificateStr; |
@@ -38,6 +36,28 @@ |
// X509Certificate represents an X.509 certificate used by SSL. |
class X509Certificate : public base::RefCountedThreadSafe<X509Certificate> { |
public: |
+ // SHA-1 fingerprint (160 bits) of a certificate. |
+ struct Fingerprint { |
+ bool Equals(const Fingerprint& other) const { |
+ return memcmp(data, other.data, sizeof(data)) == 0; |
+ } |
+ |
+ unsigned char data[20]; |
+ }; |
+ |
+ class FingerprintLessThan |
+ : public std::binary_function<Fingerprint, Fingerprint, bool> { |
+ public: |
+ bool operator() (const Fingerprint& lhs, const Fingerprint& rhs) const; |
+ }; |
+ |
+ // Predicate functor used in maps when X509Certificate is used as the key. |
+ class LessThan |
+ : public std::binary_function<X509Certificate*, X509Certificate*, bool> { |
+ public: |
+ bool operator() (X509Certificate* lhs, X509Certificate* rhs) const; |
+ }; |
+ |
// 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. |
@@ -54,18 +74,62 @@ |
typedef std::vector<OSCertHandle> OSCertHandles; |
- // Legacy names for types now defined in x509_cert_types.h. |
- // TODO(snej): Clean up existing code using these names to use the new names. |
- typedef CertPrincipal Principal; |
- typedef CertPolicy Policy; |
- typedef SHA1Fingerprint Fingerprint; |
- typedef SHA1FingerprintLessThan FingerprintLessThan; |
+ // Principal represent an X.509 principal. |
+ struct Principal { |
+ Principal() { } |
+ explicit Principal(const std::string& name) : common_name(name) { } |
- // Predicate functor used in maps when X509Certificate is used as the key. |
- class LessThan |
- : public std::binary_function<X509Certificate*, X509Certificate*, bool> { |
+ // The different attributes for a principal. They may be "". |
+ // Note that some of them can have several values. |
+ |
+ std::string common_name; |
+ std::string locality_name; |
+ std::string state_or_province_name; |
+ std::string country_name; |
+ |
+ std::vector<std::string> street_addresses; |
+ std::vector<std::string> organization_names; |
+ std::vector<std::string> organization_unit_names; |
+ std::vector<std::string> domain_components; |
+ }; |
+ |
+ // This class is useful for maintaining policies about which certificates are |
+ // permitted or forbidden for a particular purpose. |
+ class Policy { |
public: |
- bool operator() (X509Certificate* lhs, X509Certificate* rhs) const; |
+ // The judgments this policy can reach. |
+ enum Judgment { |
+ // We don't have policy information for this certificate. |
+ UNKNOWN, |
+ |
+ // This certificate is allowed. |
+ ALLOWED, |
+ |
+ // This certificate is denied. |
+ DENIED, |
+ }; |
+ |
+ // Returns the judgment this policy makes about this certificate. |
+ Judgment Check(X509Certificate* cert) const; |
+ |
+ // Causes the policy to allow this certificate. |
+ void Allow(X509Certificate* cert); |
+ |
+ // Causes the policy to deny this certificate. |
+ void Deny(X509Certificate* cert); |
+ |
+ // Returns true if this policy has allowed at least one certificate. |
+ bool HasAllowedCert() const; |
+ |
+ // Returns true if this policy has denied at least one certificate. |
+ bool HasDeniedCert() const; |
+ |
+ private: |
+ // The set of fingerprints of allowed certificates. |
+ std::set<Fingerprint, FingerprintLessThan> allowed_; |
+ |
+ // The set of fingerprints of denied certificates. |
+ std::set<Fingerprint, FingerprintLessThan> denied_; |
}; |
// Where the certificate comes from. The enumeration constants are |
@@ -167,9 +231,6 @@ |
// Does this certificate's usage allow SSL client authentication? |
bool SupportsSSLClientAuth() const; |
- // Do any of the given issuer names appear in this cert's chain of trust? |
- bool IsIssuedBy(const std::vector<CertPrincipal>& valid_issuers); |
- |
// Creates a security policy for SSL client certificates. |
static OSStatus CreateSSLClientPolicy(SecPolicyRef* outPolicy); |
@@ -177,11 +238,8 @@ |
// |server_domain| is a hint for which domain the cert is to be sent to |
// (a cert previously specified as the default for that domain will be given |
// precedence and returned first in the output vector.) |
- // If valid_issuers is non-empty, only certs that were transitively issued by |
- // one of the given names will be included in the list. |
static bool GetSSLClientCertificates( |
const std::string& server_domain, |
- const std::vector<CertPrincipal>& valid_issuers, |
std::vector<scoped_refptr<X509Certificate> >* certs); |
// Creates the chain of certs to use for this client identity cert. |