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  constexpr X509ExtendedKeyUsagePurpose(Value value) : m_Value(value)
49  {}
50 
52  std::string toString() const;
53 
55  std::string getOidValue() const;
56 
61 
62  // Allow switch and comparisons.
63  constexpr operator Value() const
64  {
65  return m_Value;
66  }
67 
68  // Prevent usage: if(X509ExtendedKeyUsagePurpose)
69  explicit operator bool() const = delete;
70 
71  private:
72  Value m_Value = Unknown;
73  };
74 
77  namespace X509Internal
78  {
82  {
83  protected:
84  static std::unique_ptr<Asn1Record> decodeAsn1Data(const std::string& rawData,
85  std::vector<uint8_t>& rawDataBytes);
86  };
87 
91  {
92  public:
96  static std::unique_ptr<X509BasicConstraintsDataDecoder> create(const std::string& rawData);
97 
99  bool isCA() const
100  {
101  return m_IsCA;
102  }
103 
106  {
107  return m_PathLenConstraint;
108  }
109 
110  private:
111  X509BasicConstraintsDataDecoder(bool isCA, int pathLenConstraint)
112  : m_IsCA(isCA), m_PathLenConstraint(pathLenConstraint)
113  {}
114  static constexpr int isCAOffset = 0;
115  static constexpr int pathLenConstraintOffset = 1;
116 
117  bool m_IsCA = false;
118  int m_PathLenConstraint = 0;
119  };
120 
124  {
125  public:
129  static std::unique_ptr<X509SubjectKeyIdentifierDataDecoder> create(const std::string& rawData);
130 
132  const std::string& getKeyIdentifier() const
133  {
134  return m_KeyIdentifier;
135  }
136 
137  private:
138  X509SubjectKeyIdentifierDataDecoder(const std::string& keyIdentifier) : m_KeyIdentifier(keyIdentifier)
139  {}
140  std::string m_KeyIdentifier;
141  };
142 
146  {
147  public:
151  static std::unique_ptr<X509KeyUsageDataDecoder> create(const std::string& rawData);
152 
154  const std::string& getKeyUsage() const
155  {
156  return m_KeyUsage;
157  }
158 
159  private:
160  X509KeyUsageDataDecoder(const std::string& keyUsage) : m_KeyUsage(keyUsage)
161  {}
162  std::string m_KeyUsage;
163  };
164 
168  {
169  public:
173  static std::unique_ptr<X509ExtendedKeyUsageDataDecoder> create(const std::string& rawData);
174 
176  const std::vector<Asn1ObjectIdentifier>& getExtendedKeyUsagePurposes() const
177  {
178  return m_ExtendedKeyUsagePurposes;
179  }
180 
181  private:
183  {}
184  std::vector<Asn1ObjectIdentifier> m_ExtendedKeyUsagePurposes;
185  };
186  } // namespace X509Internal
187 
188  // Forward declarations
189  class X509Extension;
190 
194  {
195  friend class X509Extension;
196 
197  public:
198  virtual ~X509ExtensionData() = default;
199 
205  template <class X509ExtensionDataType> X509ExtensionDataType* castAs()
206  {
207  auto castedExtension = dynamic_cast<X509ExtensionDataType*>(this);
208  if (castedExtension == nullptr)
209  {
210  throw std::runtime_error("Trying to cast X509 extension data to the wrong type");
211  }
212  return castedExtension;
213  }
214  };
215 
219  {
220  friend class X509Extension;
221 
222  public:
224  bool isCA() const
225  {
226  return m_IsCA;
227  }
228 
231  {
232  return m_PathLenConstraint;
233  }
234 
235  private:
236  explicit X509BasicConstraintsExtension(const std::string& rawExtensionData);
237  bool m_IsCA = false;
238  int m_PathLenConstraint = 0;
239  };
240 
244  {
245  friend class X509Extension;
246 
247  public:
249  std::string getKeyIdentifier() const
250  {
251  return m_KeyIdentifier;
252  };
253 
254  private:
255  explicit X509SubjectKeyIdentifierExtension(const std::string& rawExtensionData);
256  std::string m_KeyIdentifier;
257  };
258 
262  {
263  friend class X509Extension;
264 
265  public:
267  bool isDigitalSignature() const;
268 
270  bool isNonRepudiation() const;
271 
273  bool isKeyEncipherment() const;
274 
276  bool isDataEncipherment() const;
277 
279  bool isKeyAgreement() const;
280 
282  bool isKeyCertSign() const;
283 
285  bool isCRLSign() const;
286 
288  bool isEncipherOnly() const;
289 
291  bool isDecipherOnly() const;
292 
293  private:
294  explicit X509KeyUsageExtension(const std::string& rawExtensionData);
295 
296  static constexpr int digitalSignatureLocation = 0;
297  static constexpr int nonRepudiationLocation = 1;
298  static constexpr int keyEnciphermentLocation = 2;
299  static constexpr int dataEnciphermentLocation = 3;
300  static constexpr int keyAgreementLocation = 4;
301  static constexpr int keyCertSignLocation = 5;
302  static constexpr int crlSignLocation = 6;
303  static constexpr int encipherOnlyLocation = 7;
304  static constexpr int decipherOnlyLocation = 8;
305 
306  bool isBitSet(size_t location) const;
307  std::string m_BitString;
308  };
309 
313  {
314  friend class X509Extension;
315 
316  public:
318  const std::vector<X509ExtendedKeyUsagePurpose>& getPurposes() const
319  {
320  return m_Purposes;
321  }
322 
323  private:
324  explicit X509ExtendedKeyUsageExtension(const std::string& rawExtensionData);
325  std::vector<X509ExtendedKeyUsagePurpose> m_Purposes;
326  };
327 } // namespace pcpp
Definition: Asn1Codec.h:665
Definition: X509ExtensionDataDecoder.h:219
int getPathLenConstraint() const
Definition: X509ExtensionDataDecoder.h:230
bool isCA() const
Definition: X509ExtensionDataDecoder.h:224
Definition: X509ExtensionDataDecoder.h:313
const std::vector< X509ExtendedKeyUsagePurpose > & getPurposes() const
Definition: X509ExtensionDataDecoder.h:318
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:194
X509ExtensionDataType * castAs()
Definition: X509ExtensionDataDecoder.h:205
Definition: X509Decoder.h:705
Definition: X509ExtensionDataDecoder.h:91
bool isCA() const
Definition: X509ExtensionDataDecoder.h:99
int getPathLenConstraint() const
Definition: X509ExtensionDataDecoder.h:105
static std::unique_ptr< X509BasicConstraintsDataDecoder > create(const std::string &rawData)
Definition: X509ExtensionDataDecoder.h:168
const std::vector< Asn1ObjectIdentifier > & getExtendedKeyUsagePurposes() const
Definition: X509ExtensionDataDecoder.h:176
static std::unique_ptr< X509ExtendedKeyUsageDataDecoder > create(const std::string &rawData)
Definition: X509ExtensionDataDecoder.h:82
Definition: X509ExtensionDataDecoder.h:146
const std::string & getKeyUsage() const
Definition: X509ExtensionDataDecoder.h:154
static std::unique_ptr< X509KeyUsageDataDecoder > create(const std::string &rawData)
Definition: X509ExtensionDataDecoder.h:124
static std::unique_ptr< X509SubjectKeyIdentifierDataDecoder > create(const std::string &rawData)
const std::string & getKeyIdentifier() const
Definition: X509ExtensionDataDecoder.h:132
Definition: X509ExtensionDataDecoder.h:262
Definition: X509ExtensionDataDecoder.h:244
std::string getKeyIdentifier() const
Definition: X509ExtensionDataDecoder.h:249
The main namespace for the PcapPlusPlus lib.