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 "fillins/openssl_util.h"
6 #include "cert_error_params.h"
7
8 #include <memory>
9
10 #include "string_util.h"
11 #include "input.h"
12 #include <openssl/base.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,const der::Input & der1,const char * name2,const der::Input & der2)22 CertErrorParams2Der(const char* name1,
23 const der::Input& der1,
24 const char* name2,
25 const der::Input& der2)
26 : name1_(name1),
27 der1_(der1.AsString()),
28 name2_(name2),
29 der2_(der2.AsString()) {}
30
31 CertErrorParams2Der(const CertErrorParams2Der&) = delete;
32 CertErrorParams2Der& operator=(const CertErrorParams2Der&) = delete;
33
ToDebugString() const34 std::string ToDebugString() const override {
35 std::string result;
36 AppendDer(name1_, der1_, &result);
37 if (name2_) {
38 result += "\n";
39 AppendDer(name2_, der2_, &result);
40 }
41 return result;
42 }
43
44 private:
AppendDer(const char * name,const std::string & der,std::string * out)45 static void AppendDer(const char* name,
46 const std::string& der,
47 std::string* out) {
48 *out += name;
49 *out +=
50 ": " + bssl::string_util::HexEncode(
51 reinterpret_cast<const uint8_t*>(der.data()), der.size());
52 }
53
54 const char* name1_;
55 std::string der1_;
56
57 const char* name2_;
58 std::string der2_;
59 };
60
61 // Parameters subclass for describing (and pretty-printing) a single size_t.
62 class CertErrorParams1SizeT : public CertErrorParams {
63 public:
CertErrorParams1SizeT(const char * name,size_t value)64 CertErrorParams1SizeT(const char* name, size_t value)
65 : name_(name), value_(value) {}
66
67 CertErrorParams1SizeT(const CertErrorParams1SizeT&) = delete;
68 CertErrorParams1SizeT& operator=(const CertErrorParams1SizeT&) = delete;
69
ToDebugString() const70 std::string ToDebugString() const override {
71 return name_ + std::string(": ") +
72 bssl::string_util::NumberToDecimalString(value_);
73 }
74
75 private:
76 const char* name_;
77 size_t value_;
78 };
79
80 // Parameters subclass for describing (and pretty-printing) two size_t
81 // values.
82 class CertErrorParams2SizeT : public CertErrorParams {
83 public:
CertErrorParams2SizeT(const char * name1,size_t value1,const char * name2,size_t value2)84 CertErrorParams2SizeT(const char* name1,
85 size_t value1,
86 const char* name2,
87 size_t value2)
88 : name1_(name1), value1_(value1), name2_(name2), value2_(value2) {}
89
90 CertErrorParams2SizeT(const CertErrorParams2SizeT&) = delete;
91 CertErrorParams2SizeT& operator=(const CertErrorParams2SizeT&) = delete;
92
ToDebugString() const93 std::string ToDebugString() const override {
94 return name1_ + std::string(": ") +
95 bssl::string_util::NumberToDecimalString(value1_) + "\n" + name2_ +
96 std::string(": ") + bssl::string_util::NumberToDecimalString(value2_);
97 }
98
99 private:
100 const char* name1_;
101 size_t value1_;
102 const char* name2_;
103 size_t value2_;
104 };
105
106 } // namespace
107
108 CertErrorParams::CertErrorParams() = default;
109 CertErrorParams::~CertErrorParams() = default;
110
CreateCertErrorParams1Der(const char * name,const der::Input & der)111 std::unique_ptr<CertErrorParams> CreateCertErrorParams1Der(
112 const char* name,
113 const der::Input& der) {
114 BSSL_CHECK(name);
115 return std::make_unique<CertErrorParams2Der>(name, der, nullptr,
116 der::Input());
117 }
118
CreateCertErrorParams2Der(const char * name1,const der::Input & der1,const char * name2,const der::Input & der2)119 std::unique_ptr<CertErrorParams> CreateCertErrorParams2Der(
120 const char* name1,
121 const der::Input& der1,
122 const char* name2,
123 const der::Input& der2) {
124 BSSL_CHECK(name1);
125 BSSL_CHECK(name2);
126 return std::make_unique<CertErrorParams2Der>(name1, der1, name2, der2);
127 }
128
CreateCertErrorParams1SizeT(const char * name,size_t value)129 std::unique_ptr<CertErrorParams> CreateCertErrorParams1SizeT(const char* name,
130 size_t value) {
131 BSSL_CHECK(name);
132 return std::make_unique<CertErrorParams1SizeT>(name, value);
133 }
134
CreateCertErrorParams2SizeT(const char * name1,size_t value1,const char * name2,size_t value2)135 OPENSSL_EXPORT std::unique_ptr<CertErrorParams> CreateCertErrorParams2SizeT(
136 const char* name1,
137 size_t value1,
138 const char* name2,
139 size_t value2) {
140 BSSL_CHECK(name1);
141 BSSL_CHECK(name2);
142 return std::make_unique<CertErrorParams2SizeT>(name1, value1, name2, value2);
143 }
144
145 } // namespace net
146