PcapPlusPlus  Next
X509ExtensionDataDecoder.h
1 #pragma once
2 #include "Asn1Codec.h"
3 
6 namespace pcpp
7 {
11  {
12  public:
14  enum Value : uint8_t
15  {
34  // Any extended key usage
35  AnyExtendedKeyUsage,
44  };
45 
46  X509ExtendedKeyUsagePurpose() = default;
47 
48  // cppcheck-suppress noExplicitConstructor
49  constexpr X509ExtendedKeyUsagePurpose(Value value) : m_Value(value)
50  {}
51 
53  std::string toString() const;
54 
56  std::string getOidValue() const;
57 
62 
63  // Allow switch and comparisons.
64  constexpr operator Value() const
65  {
66  return m_Value;
67  }
68 
69  // Prevent usage: if(X509ExtendedKeyUsagePurpose)
70  explicit operator bool() const = delete;
71 
72  private:
73  Value m_Value = Unknown;
74  };
75 
78  namespace X509Internal
79  {
83  {
84  protected:
85  static std::unique_ptr<Asn1Record> decodeAsn1Data(const std::string& rawData,
86  std::vector<uint8_t>& rawDataBytes);
87  };
88 
92  {
93  public:
97  static std::unique_ptr<X509BasicConstraintsDataDecoder> create(const std::string& rawData);
98 
100  bool isCA() const
101  {
102  return m_IsCA;
103  }
104 
107  {
108  return m_PathLenConstraint;
109  }
110 
111  private:
112  X509BasicConstraintsDataDecoder(bool isCA, int pathLenConstraint)
113  : m_IsCA(isCA), m_PathLenConstraint(pathLenConstraint)
114  {}
115  static constexpr int isCAOffset = 0;
116  static constexpr int pathLenConstraintOffset = 1;
117 
118  bool m_IsCA = false;
119  int m_PathLenConstraint = 0;
120  };
121 
125  {
126  public:
130  static std::unique_ptr<X509SubjectKeyIdentifierDataDecoder> create(const std::string& rawData);
131 
133  const std::string& getKeyIdentifier() const
134  {
135  return m_KeyIdentifier;
136  }
137 
138  private:
139  explicit X509SubjectKeyIdentifierDataDecoder(const std::string& keyIdentifier)
140  : m_KeyIdentifier(keyIdentifier)
141  {}
142  std::string m_KeyIdentifier;
143  };
144 
148  {
149  public:
153  static std::unique_ptr<X509KeyUsageDataDecoder> create(const std::string& rawData);
154 
156  const std::string& getKeyUsage() const
157  {
158  return m_KeyUsage;
159  }
160 
161  private:
162  explicit X509KeyUsageDataDecoder(const std::string& keyUsage) : m_KeyUsage(keyUsage)
163  {}
164  std::string m_KeyUsage;
165  };
166 
170  {
171  public:
175  static std::unique_ptr<X509ExtendedKeyUsageDataDecoder> create(const std::string& rawData);
176 
178  const std::vector<Asn1ObjectIdentifier>& getExtendedKeyUsagePurposes() const
179  {
180  return m_ExtendedKeyUsagePurposes;
181  }
182 
183  private:
185  {}
186  std::vector<Asn1ObjectIdentifier> m_ExtendedKeyUsagePurposes;
187  };
188  } // namespace X509Internal
189 
190  // Forward declarations
191  class X509Extension;
192 
196  {
197  friend class X509Extension;
198 
199  public:
200  virtual ~X509ExtensionData() = default;
201 
207  template <class X509ExtensionDataType> X509ExtensionDataType* castAs()
208  {
209  auto castedExtension = dynamic_cast<X509ExtensionDataType*>(this);
210  if (castedExtension == nullptr)
211  {
212  throw std::runtime_error("Trying to cast X509 extension data to the wrong type");
213  }
214  return castedExtension;
215  }
216  };
217 
221  {
222  friend class X509Extension;
223 
224  public:
226  bool isCA() const
227  {
228  return m_IsCA;
229  }
230 
233  {
234  return m_PathLenConstraint;
235  }
236 
237  private:
238  explicit X509BasicConstraintsExtension(const std::string& rawExtensionData);
239  bool m_IsCA = false;
240  int m_PathLenConstraint = 0;
241  };
242 
246  {
247  friend class X509Extension;
248 
249  public:
251  std::string getKeyIdentifier() const
252  {
253  return m_KeyIdentifier;
254  };
255 
256  private:
257  explicit X509SubjectKeyIdentifierExtension(const std::string& rawExtensionData);
258  std::string m_KeyIdentifier;
259  };
260 
264  {
265  friend class X509Extension;
266 
267  public:
269  bool isDigitalSignature() const;
270 
272  bool isNonRepudiation() const;
273 
275  bool isKeyEncipherment() const;
276 
278  bool isDataEncipherment() const;
279 
281  bool isKeyAgreement() const;
282 
284  bool isKeyCertSign() const;
285 
287  bool isCRLSign() const;
288 
290  bool isEncipherOnly() const;
291 
293  bool isDecipherOnly() const;
294 
295  private:
296  explicit X509KeyUsageExtension(const std::string& rawExtensionData);
297 
298  static constexpr int digitalSignatureLocation = 0;
299  static constexpr int nonRepudiationLocation = 1;
300  static constexpr int keyEnciphermentLocation = 2;
301  static constexpr int dataEnciphermentLocation = 3;
302  static constexpr int keyAgreementLocation = 4;
303  static constexpr int keyCertSignLocation = 5;
304  static constexpr int crlSignLocation = 6;
305  static constexpr int encipherOnlyLocation = 7;
306  static constexpr int decipherOnlyLocation = 8;
307 
308  bool isBitSet(size_t location) const;
309  std::string m_BitString;
310  };
311 
315  {
316  friend class X509Extension;
317 
318  public:
320  const std::vector<X509ExtendedKeyUsagePurpose>& getPurposes() const
321  {
322  return m_Purposes;
323  }
324 
325  private:
326  explicit X509ExtendedKeyUsageExtension(const std::string& rawExtensionData);
327  std::vector<X509ExtendedKeyUsagePurpose> m_Purposes;
328  };
329 } // namespace pcpp
Definition: Asn1Codec.h:698
Definition: X509ExtensionDataDecoder.h:221
int getPathLenConstraint() const
Definition: X509ExtensionDataDecoder.h:232
bool isCA() const
Definition: X509ExtensionDataDecoder.h:226
Definition: X509ExtensionDataDecoder.h:315
const std::vector< X509ExtendedKeyUsagePurpose > & getPurposes() const
Definition: X509ExtensionDataDecoder.h:320
Definition: X509ExtensionDataDecoder.h:11
static X509ExtendedKeyUsagePurpose fromOidValue(const Asn1ObjectIdentifier &value)
Value
Define enum types for extended key usage purposes.
Definition: X509ExtensionDataDecoder.h:15
@ IPSecUser
IPsec user.
Definition: X509ExtensionDataDecoder.h:33
@ IPSecTunnel
IPsec tunnel.
Definition: X509ExtensionDataDecoder.h:31
@ IPSecEndSystem
IPsec end system.
Definition: X509ExtensionDataDecoder.h:29
@ ClientAuth
Client authentication.
Definition: X509ExtensionDataDecoder.h:19
@ EmailProtection
Email protection.
Definition: X509ExtensionDataDecoder.h:23
@ CodeSigning
Code signing.
Definition: X509ExtensionDataDecoder.h:21
@ SmartCardLogon
Smart card logon.
Definition: X509ExtensionDataDecoder.h:37
@ ServerAuth
Server authentication.
Definition: X509ExtensionDataDecoder.h:17
@ EncryptedFileSystem
Encrypted file system.
Definition: X509ExtensionDataDecoder.h:39
@ TimeStamping
Time stamping.
Definition: X509ExtensionDataDecoder.h:25
@ Unknown
Unknown purpose value.
Definition: X509ExtensionDataDecoder.h:43
@ DocumentSigning
Document signing.
Definition: X509ExtensionDataDecoder.h:41
@ OCSPSigning
OCSP signing.
Definition: X509ExtensionDataDecoder.h:27
std::string getOidValue() const
Definition: X509ExtensionDataDecoder.h:196
X509ExtensionDataType * castAs()
Definition: X509ExtensionDataDecoder.h:207
Definition: X509Decoder.h:703
Definition: X509ExtensionDataDecoder.h:92
bool isCA() const
Definition: X509ExtensionDataDecoder.h:100
int getPathLenConstraint() const
Definition: X509ExtensionDataDecoder.h:106
static std::unique_ptr< X509BasicConstraintsDataDecoder > create(const std::string &rawData)
Definition: X509ExtensionDataDecoder.h:170
const std::vector< Asn1ObjectIdentifier > & getExtendedKeyUsagePurposes() const
Definition: X509ExtensionDataDecoder.h:178
static std::unique_ptr< X509ExtendedKeyUsageDataDecoder > create(const std::string &rawData)
Definition: X509ExtensionDataDecoder.h:83
Definition: X509ExtensionDataDecoder.h:148
const std::string & getKeyUsage() const
Definition: X509ExtensionDataDecoder.h:156
static std::unique_ptr< X509KeyUsageDataDecoder > create(const std::string &rawData)
Definition: X509ExtensionDataDecoder.h:125
static std::unique_ptr< X509SubjectKeyIdentifierDataDecoder > create(const std::string &rawData)
const std::string & getKeyIdentifier() const
Definition: X509ExtensionDataDecoder.h:133
Definition: X509ExtensionDataDecoder.h:264
Definition: X509ExtensionDataDecoder.h:246
std::string getKeyIdentifier() const
Definition: X509ExtensionDataDecoder.h:251
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19