1 // Copyright 2016 The Chromium Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "cert_error_params.h"
16
17 #include <memory>
18
19 #include <openssl/base.h>
20
21 #include "input.h"
22 #include "string_util.h"
23
24 BSSL_NAMESPACE_BEGIN
25
26 namespace {
27
28 // Parameters subclass for describing (and pretty-printing) 1 or 2 DER
29 // blobs. It makes a copy of the der::Inputs.
30 class CertErrorParams2Der : public CertErrorParams {
31 public:
CertErrorParams2Der(const char * name1,der::Input der1,const char * name2,der::Input der2)32 CertErrorParams2Der(const char *name1, der::Input der1, const char *name2,
33 der::Input der2)
34 : name1_(name1),
35 der1_(BytesAsStringView(der1)),
36 name2_(name2),
37 der2_(BytesAsStringView(der2)) {}
38
39 CertErrorParams2Der(const CertErrorParams2Der &) = delete;
40 CertErrorParams2Der &operator=(const CertErrorParams2Der &) = delete;
41
ToDebugString() const42 std::string ToDebugString() const override {
43 std::string result;
44 AppendDer(name1_, der1_, &result);
45 if (name2_) {
46 result += "\n";
47 AppendDer(name2_, der2_, &result);
48 }
49 return result;
50 }
51
52 private:
AppendDer(const char * name,const std::string & der,std::string * out)53 static void AppendDer(const char *name, const std::string &der,
54 std::string *out) {
55 *out += name;
56 *out += ": ";
57 *out += bssl::string_util::HexEncode(StringAsBytes(der));
58 }
59
60 const char *name1_;
61 std::string der1_;
62
63 const char *name2_;
64 std::string der2_;
65 };
66
67 // Parameters subclass for describing (and pretty-printing) a single size_t.
68 class CertErrorParams1SizeT : public CertErrorParams {
69 public:
CertErrorParams1SizeT(const char * name,size_t value)70 CertErrorParams1SizeT(const char *name, size_t value)
71 : name_(name), value_(value) {}
72
73 CertErrorParams1SizeT(const CertErrorParams1SizeT &) = delete;
74 CertErrorParams1SizeT &operator=(const CertErrorParams1SizeT &) = delete;
75
ToDebugString() const76 std::string ToDebugString() const override {
77 return name_ + std::string(": ") +
78 bssl::string_util::NumberToDecimalString(value_);
79 }
80
81 private:
82 const char *name_;
83 size_t value_;
84 };
85
86 // Parameters subclass for describing (and pretty-printing) two size_t
87 // values.
88 class CertErrorParams2SizeT : public CertErrorParams {
89 public:
CertErrorParams2SizeT(const char * name1,size_t value1,const char * name2,size_t value2)90 CertErrorParams2SizeT(const char *name1, size_t value1, const char *name2,
91 size_t value2)
92 : name1_(name1), value1_(value1), name2_(name2), value2_(value2) {}
93
94 CertErrorParams2SizeT(const CertErrorParams2SizeT &) = delete;
95 CertErrorParams2SizeT &operator=(const CertErrorParams2SizeT &) = delete;
96
ToDebugString() const97 std::string ToDebugString() const override {
98 return name1_ + std::string(": ") +
99 bssl::string_util::NumberToDecimalString(value1_) + "\n" + name2_ +
100 std::string(": ") +
101 bssl::string_util::NumberToDecimalString(value2_);
102 }
103
104 private:
105 const char *name1_;
106 size_t value1_;
107 const char *name2_;
108 size_t value2_;
109 };
110
111 } // namespace
112
113 CertErrorParams::CertErrorParams() = default;
114 CertErrorParams::~CertErrorParams() = default;
115
CreateCertErrorParams1Der(const char * name,der::Input der)116 std::unique_ptr<CertErrorParams> CreateCertErrorParams1Der(const char *name,
117 der::Input der) {
118 BSSL_CHECK(name);
119 return std::make_unique<CertErrorParams2Der>(name, der, nullptr,
120 der::Input());
121 }
122
CreateCertErrorParams2Der(const char * name1,der::Input der1,const char * name2,der::Input der2)123 std::unique_ptr<CertErrorParams> CreateCertErrorParams2Der(const char *name1,
124 der::Input der1,
125 const char *name2,
126 der::Input der2) {
127 BSSL_CHECK(name1);
128 BSSL_CHECK(name2);
129 return std::make_unique<CertErrorParams2Der>(name1, der1, name2, der2);
130 }
131
CreateCertErrorParams1SizeT(const char * name,size_t value)132 std::unique_ptr<CertErrorParams> CreateCertErrorParams1SizeT(const char *name,
133 size_t value) {
134 BSSL_CHECK(name);
135 return std::make_unique<CertErrorParams1SizeT>(name, value);
136 }
137
CreateCertErrorParams2SizeT(const char * name1,size_t value1,const char * name2,size_t value2)138 OPENSSL_EXPORT std::unique_ptr<CertErrorParams> CreateCertErrorParams2SizeT(
139 const char *name1, size_t value1, const char *name2, size_t value2) {
140 BSSL_CHECK(name1);
141 BSSL_CHECK(name2);
142 return std::make_unique<CertErrorParams2SizeT>(name1, value1, name2, value2);
143 }
144
145 BSSL_NAMESPACE_END
146