|
|
|
// Copyright 2016 The Chromium Authors
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
|
|
|
#ifndef BSSL_PKI_TRUST_STORE_H_
|
|
|
|
#define BSSL_PKI_TRUST_STORE_H_
|
|
|
|
|
|
|
|
#include <optional>
|
|
|
|
|
|
|
|
#include <openssl/base.h>
|
|
|
|
|
|
|
|
#include "cert_issuer_source.h"
|
|
|
|
#include "parsed_certificate.h"
|
|
|
|
|
|
|
|
namespace bssl {
|
|
|
|
|
|
|
|
enum class CertificateTrustType {
|
|
|
|
// This certificate is explicitly blocked (distrusted).
|
|
|
|
DISTRUSTED,
|
|
|
|
|
|
|
|
// The trustedness of this certificate is unknown (inherits trust from
|
|
|
|
// its issuer).
|
|
|
|
UNSPECIFIED,
|
|
|
|
|
|
|
|
// This certificate is a trust anchor (as defined by RFC 5280).
|
|
|
|
TRUSTED_ANCHOR,
|
|
|
|
|
|
|
|
// This certificate can be used as a trust anchor (as defined by RFC 5280) or
|
|
|
|
// a trusted leaf, depending on context.
|
|
|
|
TRUSTED_ANCHOR_OR_LEAF,
|
|
|
|
|
|
|
|
// This certificate is a directly trusted leaf.
|
|
|
|
TRUSTED_LEAF,
|
|
|
|
|
|
|
|
LAST = TRUSTED_ANCHOR
|
|
|
|
};
|
|
|
|
|
|
|
|
// Describes the level of trust in a certificate.
|
|
|
|
struct OPENSSL_EXPORT CertificateTrust {
|
|
|
|
static constexpr CertificateTrust ForTrustAnchor() {
|
|
|
|
CertificateTrust result;
|
|
|
|
result.type = CertificateTrustType::TRUSTED_ANCHOR;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
static constexpr CertificateTrust ForTrustAnchorOrLeaf() {
|
|
|
|
CertificateTrust result;
|
|
|
|
result.type = CertificateTrustType::TRUSTED_ANCHOR_OR_LEAF;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
static constexpr CertificateTrust ForTrustedLeaf() {
|
|
|
|
CertificateTrust result;
|
|
|
|
result.type = CertificateTrustType::TRUSTED_LEAF;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
static constexpr CertificateTrust ForUnspecified() {
|
|
|
|
CertificateTrust result;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
static constexpr CertificateTrust ForDistrusted() {
|
|
|
|
CertificateTrust result;
|
|
|
|
result.type = CertificateTrustType::DISTRUSTED;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
constexpr CertificateTrust WithEnforceAnchorExpiry(bool value = true) const {
|
|
|
|
CertificateTrust result = *this;
|
|
|
|
result.enforce_anchor_expiry = value;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
constexpr CertificateTrust WithEnforceAnchorConstraints(
|
|
|
|
bool value = true) const {
|
|
|
|
CertificateTrust result = *this;
|
|
|
|
result.enforce_anchor_constraints = value;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
constexpr CertificateTrust WithRequireAnchorBasicConstraints(
|
|
|
|
bool value = true) const {
|
|
|
|
CertificateTrust result = *this;
|
|
|
|
result.require_anchor_basic_constraints = value;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
constexpr CertificateTrust WithRequireLeafSelfSigned(
|
|
|
|
bool value = true) const {
|
|
|
|
CertificateTrust result = *this;
|
|
|
|
result.require_leaf_selfsigned = value;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool IsTrustAnchor() const;
|
|
|
|
bool IsTrustLeaf() const;
|
|
|
|
bool IsDistrusted() const;
|
|
|
|
bool HasUnspecifiedTrust() const;
|
|
|
|
|
|
|
|
std::string ToDebugString() const;
|
|
|
|
|
|
|
|
static std::optional<CertificateTrust> FromDebugString(
|
|
|
|
const std::string &trust_string);
|
|
|
|
|
|
|
|
// The overall type of trust.
|
|
|
|
CertificateTrustType type = CertificateTrustType::UNSPECIFIED;
|
|
|
|
|
|
|
|
// Optionally, enforce extra bits on trust anchors. If these are false, the
|
|
|
|
// only fields in a trust anchor certificate that are meaningful are its
|
|
|
|
// name and SPKI.
|
|
|
|
bool enforce_anchor_expiry = false;
|
|
|
|
bool enforce_anchor_constraints = false;
|
|
|
|
// Require that X.509v3 trust anchors have a basicConstraints extension.
|
|
|
|
// X.509v1 and X.509v2 trust anchors do not support basicConstraints and are
|
|
|
|
// not affected.
|
|
|
|
// Additionally, this setting only has effect if `enforce_anchor_constraints`
|
|
|
|
// is true, which also requires that the extension assert CA=true.
|
|
|
|
bool require_anchor_basic_constraints = false;
|
|
|
|
|
|
|
|
// Optionally, require trusted leafs to be self-signed to be trusted.
|
|
|
|
bool require_leaf_selfsigned = false;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Interface for finding intermediates / trust anchors, and testing the
|
|
|
|
// trustedness of certificates.
|
|
|
|
class OPENSSL_EXPORT TrustStore : public CertIssuerSource {
|
|
|
|
public:
|
|
|
|
TrustStore();
|
|
|
|
|
|
|
|
TrustStore(const TrustStore &) = delete;
|
|
|
|
TrustStore &operator=(const TrustStore &) = delete;
|
|
|
|
|
|
|
|
// Returns the trusted of |cert|, which must be non-null.
|
|
|
|
virtual CertificateTrust GetTrust(const ParsedCertificate *cert) = 0;
|
|
|
|
|
|
|
|
// Disable async issuers for TrustStore, as it isn't needed.
|
|
|
|
void AsyncGetIssuersOf(const ParsedCertificate *cert,
|
|
|
|
std::unique_ptr<Request> *out_req) final;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace bssl
|
|
|
|
|
|
|
|
#endif // BSSL_PKI_TRUST_STORE_H_
|