1 // Copyright 2016 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/cert/pki/cert_error_params.h"
6
7 #include <memory>
8
9 #include "net/cert/pki/string_util.h"
10 #include "net/der/input.h"
11
12 namespace net {
13
14 namespace {
15
16 // Parameters subclass for describing (and pretty-printing) 1 or 2 DER
17 // blobs. It makes a copy of the der::Inputs.
18 class CertErrorParams2Der : public CertErrorParams {
19 public:
CertErrorParams2Der(const char * name1,const der::Input & der1,const char * name2,const der::Input & der2)20 CertErrorParams2Der(const char* name1,
21 const der::Input& der1,
22 const char* name2,
23 const der::Input& der2)
24 : name1_(name1),
25 der1_(der1.AsString()),
26 name2_(name2),
27 der2_(der2.AsString()) {}
28
29 CertErrorParams2Der(const CertErrorParams2Der&) = delete;
30 CertErrorParams2Der& operator=(const CertErrorParams2Der&) = delete;
31
ToDebugString() const32 std::string ToDebugString() const override {
33 std::string result;
34 AppendDer(name1_, der1_, &result);
35 if (name2_) {
36 result += "\n";
37 AppendDer(name2_, der2_, &result);
38 }
39 return result;
40 }
41
42 private:
AppendDer(const char * name,const std::string & der,std::string * out)43 static void AppendDer(const char* name,
44 const std::string& der,
45 std::string* out) {
46 *out += name;
47 *out +=
48 ": " + net::string_util::HexEncode(
49 reinterpret_cast<const uint8_t*>(der.data()), der.size());
50 }
51
52 const char* name1_;
53 std::string der1_;
54
55 const char* name2_;
56 std::string der2_;
57 };
58
59 // Parameters subclass for describing (and pretty-printing) a single size_t.
60 class CertErrorParams1SizeT : public CertErrorParams {
61 public:
CertErrorParams1SizeT(const char * name,size_t value)62 CertErrorParams1SizeT(const char* name, size_t value)
63 : name_(name), value_(value) {}
64
65 CertErrorParams1SizeT(const CertErrorParams1SizeT&) = delete;
66 CertErrorParams1SizeT& operator=(const CertErrorParams1SizeT&) = delete;
67
ToDebugString() const68 std::string ToDebugString() const override {
69 return name_ + std::string(": ") +
70 net::string_util::NumberToDecimalString(value_);
71 }
72
73 private:
74 const char* name_;
75 size_t value_;
76 };
77
78 // Parameters subclass for describing (and pretty-printing) two size_t
79 // values.
80 class CertErrorParams2SizeT : public CertErrorParams {
81 public:
CertErrorParams2SizeT(const char * name1,size_t value1,const char * name2,size_t value2)82 CertErrorParams2SizeT(const char* name1,
83 size_t value1,
84 const char* name2,
85 size_t value2)
86 : name1_(name1), value1_(value1), name2_(name2), value2_(value2) {}
87
88 CertErrorParams2SizeT(const CertErrorParams2SizeT&) = delete;
89 CertErrorParams2SizeT& operator=(const CertErrorParams2SizeT&) = delete;
90
ToDebugString() const91 std::string ToDebugString() const override {
92 return name1_ + std::string(": ") +
93 net::string_util::NumberToDecimalString(value1_) + "\n" + name2_ +
94 std::string(": ") + net::string_util::NumberToDecimalString(value2_);
95 }
96
97 private:
98 const char* name1_;
99 size_t value1_;
100 const char* name2_;
101 size_t value2_;
102 };
103
104 } // namespace
105
106 CertErrorParams::CertErrorParams() = default;
107 CertErrorParams::~CertErrorParams() = default;
108
CreateCertErrorParams1Der(const char * name,const der::Input & der)109 std::unique_ptr<CertErrorParams> CreateCertErrorParams1Der(
110 const char* name,
111 const der::Input& der) {
112 DCHECK(name);
113 return std::make_unique<CertErrorParams2Der>(name, der, nullptr,
114 der::Input());
115 }
116
CreateCertErrorParams2Der(const char * name1,const der::Input & der1,const char * name2,const der::Input & der2)117 std::unique_ptr<CertErrorParams> CreateCertErrorParams2Der(
118 const char* name1,
119 const der::Input& der1,
120 const char* name2,
121 const der::Input& der2) {
122 DCHECK(name1);
123 DCHECK(name2);
124 return std::make_unique<CertErrorParams2Der>(name1, der1, name2, der2);
125 }
126
CreateCertErrorParams1SizeT(const char * name,size_t value)127 std::unique_ptr<CertErrorParams> CreateCertErrorParams1SizeT(const char* name,
128 size_t value) {
129 DCHECK(name);
130 return std::make_unique<CertErrorParams1SizeT>(name, value);
131 }
132
CreateCertErrorParams2SizeT(const char * name1,size_t value1,const char * name2,size_t value2)133 NET_EXPORT std::unique_ptr<CertErrorParams> CreateCertErrorParams2SizeT(
134 const char* name1,
135 size_t value1,
136 const char* name2,
137 size_t value2) {
138 DCHECK(name1);
139 DCHECK(name2);
140 return std::make_unique<CertErrorParams2SizeT>(name1, value1, name2, value2);
141 }
142
143 } // namespace net
144