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 "cert_error_params.h"
6
7 #include <memory>
8
9 #include <openssl/base.h>
10
11 #include "input.h"
12 #include "string_util.h"
13
14 namespace bssl {
15
16 namespace {
17
18 // Parameters subclass for describing (and pretty-printing) 1 or 2 DER
19 // blobs. It makes a copy of the der::Inputs.
20 class CertErrorParams2Der : public CertErrorParams {
21 public:
CertErrorParams2Der(const char * name1,der::Input der1,const char * name2,der::Input der2)22 CertErrorParams2Der(const char *name1, der::Input der1, const char *name2,
23 der::Input der2)
24 : name1_(name1),
25 der1_(BytesAsStringView(der1)),
26 name2_(name2),
27 der2_(BytesAsStringView(der2)) {}
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, const std::string &der,
44 std::string *out) {
45 *out += name;
46 // TODO(crbug.com/boringssl/661): Introduce a convenience function to go
47 // from a Span<const char> to a Span<const uint8_t>.
48 *out +=
49 ": " + bssl::string_util::HexEncode(MakeConstSpan(
50 reinterpret_cast<const uint8_t *>(der.data()), der.size()));
51 }
52
53 const char *name1_;
54 std::string der1_;
55
56 const char *name2_;
57 std::string der2_;
58 };
59
60 // Parameters subclass for describing (and pretty-printing) a single size_t.
61 class CertErrorParams1SizeT : public CertErrorParams {
62 public:
CertErrorParams1SizeT(const char * name,size_t value)63 CertErrorParams1SizeT(const char *name, size_t value)
64 : name_(name), value_(value) {}
65
66 CertErrorParams1SizeT(const CertErrorParams1SizeT &) = delete;
67 CertErrorParams1SizeT &operator=(const CertErrorParams1SizeT &) = delete;
68
ToDebugString() const69 std::string ToDebugString() const override {
70 return name_ + std::string(": ") +
71 bssl::string_util::NumberToDecimalString(value_);
72 }
73
74 private:
75 const char *name_;
76 size_t value_;
77 };
78
79 // Parameters subclass for describing (and pretty-printing) two size_t
80 // values.
81 class CertErrorParams2SizeT : public CertErrorParams {
82 public:
CertErrorParams2SizeT(const char * name1,size_t value1,const char * name2,size_t value2)83 CertErrorParams2SizeT(const char *name1, size_t value1, const char *name2,
84 size_t value2)
85 : name1_(name1), value1_(value1), name2_(name2), value2_(value2) {}
86
87 CertErrorParams2SizeT(const CertErrorParams2SizeT &) = delete;
88 CertErrorParams2SizeT &operator=(const CertErrorParams2SizeT &) = delete;
89
ToDebugString() const90 std::string ToDebugString() const override {
91 return name1_ + std::string(": ") +
92 bssl::string_util::NumberToDecimalString(value1_) + "\n" + name2_ +
93 std::string(": ") +
94 bssl::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,der::Input der)109 std::unique_ptr<CertErrorParams> CreateCertErrorParams1Der(const char *name,
110 der::Input der) {
111 BSSL_CHECK(name);
112 return std::make_unique<CertErrorParams2Der>(name, der, nullptr,
113 der::Input());
114 }
115
CreateCertErrorParams2Der(const char * name1,der::Input der1,const char * name2,der::Input der2)116 std::unique_ptr<CertErrorParams> CreateCertErrorParams2Der(const char *name1,
117 der::Input der1,
118 const char *name2,
119 der::Input der2) {
120 BSSL_CHECK(name1);
121 BSSL_CHECK(name2);
122 return std::make_unique<CertErrorParams2Der>(name1, der1, name2, der2);
123 }
124
CreateCertErrorParams1SizeT(const char * name,size_t value)125 std::unique_ptr<CertErrorParams> CreateCertErrorParams1SizeT(const char *name,
126 size_t value) {
127 BSSL_CHECK(name);
128 return std::make_unique<CertErrorParams1SizeT>(name, value);
129 }
130
CreateCertErrorParams2SizeT(const char * name1,size_t value1,const char * name2,size_t value2)131 OPENSSL_EXPORT std::unique_ptr<CertErrorParams> CreateCertErrorParams2SizeT(
132 const char *name1, size_t value1, const char *name2, size_t value2) {
133 BSSL_CHECK(name1);
134 BSSL_CHECK(name2);
135 return std::make_unique<CertErrorParams2SizeT>(name1, value1, name2, value2);
136 }
137
138 } // namespace bssl
139