• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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