xref: /aosp_15_r20/external/cronet/third_party/boringssl/src/pki/cert_error_params.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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