• 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 "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