Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
|
mattm
2016/08/29 22:15:11
2016
eroman
2016/08/29 22:55:18
Done.
| |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // ---------------------------- | |
| 6 // Overview of error design | |
| 7 // ---------------------------- | |
| 8 // | |
| 9 // Certificate path validation may emit a sequence of errors/warnings. These | |
| 10 // are represented by |CertErrors|. | |
| 11 // | |
| 12 // |CertErrors| is basically just a sequence of errors. The order of the errors | |
| 13 // reflects when they were added. | |
| 14 // | |
| 15 // Each |CertError| has three parts: | |
| 16 // | |
| 17 // * A unique identifier for the error/warning | |
| 18 // - essentially an error code | |
| 19 // | |
| 20 // * Optional parameters specific to this error type | |
| 21 // - May identify relevant DER or OIDs in the certificate | |
| 22 // | |
| 23 // * Optional context that describes where the error happened | |
| 24 // - Which certificate or trust anchor were we processing when the error | |
| 25 // was encountered? | |
| 26 // | |
| 27 | |
| 28 #ifndef NET_CERT_INTERNAL_CERT_ERRORS_H_ | |
| 29 #define NET_CERT_INTERNAL_CERT_ERRORS_H_ | |
| 30 | |
| 31 #include <memory> | |
| 32 #include <vector> | |
| 33 | |
| 34 #include "base/compiler_specific.h" | |
| 35 #include "base/memory/ref_counted.h" | |
| 36 #include "net/base/net_export.h" | |
| 37 #include "net/der/input.h" | |
| 38 | |
| 39 namespace base { | |
| 40 class Value; | |
| 41 } | |
| 42 | |
| 43 namespace net { | |
| 44 | |
| 45 class ParsedCertificate; | |
| 46 class TrustAnchor; | |
| 47 | |
| 48 // Certificate error types are identified by null-terminated C-strings, with | |
| 49 // unique pointer values. | |
| 50 // | |
| 51 // Equality of CertErrorType is done using (pointer) equality and not string | |
| 52 // comparison. | |
| 53 // | |
| 54 // To ensure uniqueness define errors using the macro DEFINE_CERT_ERROR_TYPE(). | |
| 55 using CertErrorType = const char*; | |
| 56 | |
| 57 // TODO(crbug.com/634443): Implement this -- add magic to ensure that storage | |
| 58 // of identical strings isn't pool. | |
| 59 #define DEFINE_CERT_ERROR_TYPE(name, c_str_literal) \ | |
| 60 CertErrorType name = c_str_literal | |
| 61 | |
| 62 // CertErrorParams is a base class for describing parameters for a particular | |
| 63 // CertErrorType. | |
| 64 // | |
| 65 // Parameters may be used to associate extra information with an error. An | |
| 66 // example use for parameters is to identify the OID for an unconsumed critical | |
| 67 // extension. | |
| 68 class NET_EXPORT CertErrorParams { | |
| 69 public: | |
| 70 CertErrorParams(); | |
| 71 virtual ~CertErrorParams(); | |
| 72 | |
| 73 // Creates a representation of this parameter as a base::Value, which may be | |
| 74 // used for pretty printing the error. | |
| 75 virtual std::unique_ptr<base::Value> ToValue() const = 0; | |
| 76 | |
| 77 // TODO(crbug.com/634443): Add methods access the underlying structure. | |
| 78 // ToValue() alone is not a great way to get at the data. | |
| 79 | |
| 80 private: | |
| 81 DISALLOW_COPY_AND_ASSIGN(CertErrorParams); | |
| 82 }; | |
| 83 | |
| 84 // CertError represents a single error during path validation. | |
| 85 struct NET_EXPORT CertError { | |
| 86 CertError(); | |
| 87 CertError(CertError&& other); | |
| 88 ~CertError(); | |
| 89 | |
| 90 // The "type" of the error. This describes the error class -- what is | |
| 91 // typically done using an integer error code. | |
| 92 CertErrorType type = nullptr; | |
| 93 | |
| 94 // This describes any parameter relevant to the error. | |
| 95 std::unique_ptr<CertErrorParams> params; | |
| 96 | |
| 97 // TODO(crbug.com/634443): Add context (i.e. associated certificate/trust | |
| 98 // anchor). | |
| 99 }; | |
| 100 | |
| 101 class NET_EXPORT CertErrors { | |
| 102 public: | |
| 103 CertErrors(); | |
| 104 ~CertErrors(); | |
| 105 | |
| 106 void Add(CertErrorType type); | |
| 107 | |
| 108 void AddWithParam(CertErrorType type, | |
| 109 std::unique_ptr<CertErrorParams> params); | |
| 110 | |
| 111 void AddWith1DerParam(CertErrorType type, const der::Input& der1); | |
| 112 void AddWith2DerParams(CertErrorType type, | |
| 113 const der::Input& der1, | |
| 114 const der::Input& der2); | |
| 115 | |
| 116 const std::vector<CertError>& errors() const { return errors_; } | |
| 117 | |
| 118 private: | |
| 119 std::vector<CertError> errors_; | |
| 120 | |
| 121 DISALLOW_COPY_AND_ASSIGN(CertErrors); | |
| 122 }; | |
| 123 | |
| 124 // -------------------------- | |
| 125 // Context scopers | |
| 126 // -------------------------- | |
| 127 | |
| 128 // TODO(crbug.com/634443): Implement. | |
| 129 class NET_EXPORT ScopedCertErrorsCertContext { | |
| 130 public: | |
| 131 ScopedCertErrorsCertContext(CertErrors* parent, | |
| 132 const ParsedCertificate* cert, | |
| 133 size_t i); | |
| 134 ~ScopedCertErrorsCertContext(); | |
| 135 | |
| 136 private: | |
| 137 DISALLOW_COPY_AND_ASSIGN(ScopedCertErrorsCertContext); | |
| 138 }; | |
| 139 | |
| 140 // TODO(crbug.com/634443): Implement. | |
| 141 class NET_EXPORT ScopedCertErrorsTrustAnchorContext { | |
| 142 public: | |
| 143 ScopedCertErrorsTrustAnchorContext(CertErrors* parent, | |
| 144 const TrustAnchor* trust_anchor); | |
| 145 ~ScopedCertErrorsTrustAnchorContext(); | |
| 146 | |
| 147 private: | |
| 148 DISALLOW_COPY_AND_ASSIGN(ScopedCertErrorsTrustAnchorContext); | |
| 149 }; | |
| 150 | |
| 151 // -------------------------- | |
| 152 // Error parameters | |
| 153 // -------------------------- | |
| 154 | |
| 155 class NET_EXPORT CertErrorParamsDer1 : public CertErrorParams { | |
| 156 public: | |
| 157 explicit CertErrorParamsDer1(const der::Input& der1); | |
| 158 | |
| 159 std::unique_ptr<base::Value> ToValue() const override; | |
| 160 | |
| 161 private: | |
| 162 const std::string der1_; | |
| 163 | |
| 164 DISALLOW_COPY_AND_ASSIGN(CertErrorParamsDer1); | |
| 165 }; | |
| 166 | |
| 167 class NET_EXPORT CertErrorParamsDer2 : public CertErrorParams { | |
| 168 public: | |
| 169 CertErrorParamsDer2(const der::Input& der1, const der::Input& der2); | |
| 170 | |
| 171 std::unique_ptr<base::Value> ToValue() const override; | |
| 172 | |
| 173 private: | |
| 174 const std::string der1_; | |
| 175 const std::string der2_; | |
| 176 | |
| 177 DISALLOW_COPY_AND_ASSIGN(CertErrorParamsDer2); | |
| 178 }; | |
| 179 | |
| 180 } // namespace net | |
| 181 | |
| 182 #endif // NET_CERT_INTERNAL_CERT_ERRORS_H_ | |
| OLD | NEW |