retdec
asn1.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_FILEFORMAT_UTILS_ASN1_H
8 #define RETDEC_FILEFORMAT_UTILS_ASN1_H
9 
10 #include <cstdint>
11 #include <memory>
12 #include <vector>
13 
14 namespace retdec {
15 namespace fileformat {
16 
17 const std::uint8_t Asn1TagMask_Class = 0xC0;
18 const std::uint8_t Asn1TagMask_Primitive = 0x20;
19 const std::uint8_t Asn1TagMask_Type = 0x1F;
20 
21 const std::uint8_t Asn1Tag_Universal = 0x00;
22 const std::uint8_t Asn1Tag_Application = 0x40;
23 const std::uint8_t Asn1Tag_ContextSpecific = 0x80;
24 const std::uint8_t Asn1Tag_Private = 0xC0;
25 
26 const std::uint8_t Asn1Tag_Constructed = 0x20;
27 
28 const std::uint8_t Asn1Tag_BitString = 0x03;
29 const std::uint8_t Asn1Tag_OctetString = 0x04;
30 const std::uint8_t Asn1Tag_Null = 0x05;
31 const std::uint8_t Asn1Tag_Object = 0x06;
32 const std::uint8_t Asn1Tag_Sequence = 0x10;
33 
34 const std::string DigestAlgorithmOID_Sha1 = "1.3.14.3.2.26";
35 const std::string DigestAlgorithmOID_Sha256 = "2.16.840.1.101.3.4.2.1";
36 const std::string DigestAlgorithmOID_Md5 = "1.2.840.113549.2.5";
37 
38 enum class Asn1Type
39 {
40  Null,
41  BitString,
43  Sequence,
44  Object,
46 };
47 
48 class Asn1Item
49 {
50 public:
51  virtual ~Asn1Item() = default;
52 
53  static std::shared_ptr<Asn1Item> parse(const std::vector<std::uint8_t>& data);
54 
55  std::size_t getLength() const;
56  const std::vector<std::uint8_t>& getData() const;
57 
58  std::size_t getContentLength() const;
59  std::vector<std::uint8_t> getContentData() const;
60 
61  bool isNull() const;
62  bool isBitString() const;
63  bool isOctetString() const;
64  bool isSequence() const;
65  bool isObject() const;
66  bool isContextSpecific() const;
67 
68 protected:
69  Asn1Item(Asn1Type type, const std::vector<std::uint8_t>& data);
70 
72  std::vector<std::uint8_t> _data;
73 
74 private:
75  void init();
76 
77  std::vector<std::uint8_t>::const_iterator _contentBegin;
78  std::size_t _contentLength;
79 };
80 
81 class Asn1Null : public Asn1Item
82 {
83 public:
84  Asn1Null(const std::vector<std::uint8_t>& data);
85 };
86 
87 class Asn1BitString : public Asn1Item
88 {
89 public:
90  Asn1BitString(const std::vector<std::uint8_t>& data);
91 
92  std::string getString() const;
93 
94 private:
95  void init();
96 
97  std::string _string;
98 };
99 
100 class Asn1OctetString : public Asn1Item
101 {
102 public:
103  Asn1OctetString(const std::vector<std::uint8_t>& data);
104 
105  std::string getString() const;
106 
107 private:
108  void init();
109 
110  std::string _string;
111 };
112 
113 class Asn1Object : public Asn1Item
114 {
115 public:
116  Asn1Object(const std::vector<std::uint8_t>& data);
117 
118  std::string getIdentifier() const;
119 
120 private:
121  void init();
122 
123  std::string _identifier;
124 };
125 
126 class Asn1Sequence : public Asn1Item
127 {
128 public:
129  Asn1Sequence(const std::vector<std::uint8_t>& data);
130 
131  std::size_t getNumberOfElements() const;
132  std::shared_ptr<Asn1Item> getElement(std::size_t index) const;
133 
134 private:
135  void init();
136 
137  std::vector<std::shared_ptr<Asn1Item>> _elements;
138 };
139 
141 {
142 public:
143  Asn1ContextSpecific(const std::vector<std::uint8_t>& data);
144 
145  const std::shared_ptr<Asn1Item>& getItem() const;
146 
147 private:
148  void init();
149 
150  std::shared_ptr<Asn1Item> _item;
151 };
152 
153 } // namespace fileformat
154 } // namespace retdec
155 
156 #endif
void init()
Definition: asn1.cpp:161
Asn1BitString(const std::vector< std::uint8_t > &data)
Definition: asn1.cpp:151
std::string getString() const
Definition: asn1.cpp:156
std::string _string
Definition: asn1.h:97
void init()
Definition: asn1.cpp:271
const std::shared_ptr< Asn1Item > & getItem() const
Definition: asn1.cpp:266
std::shared_ptr< Asn1Item > _item
Definition: asn1.h:150
Asn1ContextSpecific(const std::vector< std::uint8_t > &data)
Definition: asn1.cpp:261
Definition: asn1.h:49
bool isObject() const
Definition: asn1.cpp:86
const std::vector< std::uint8_t > & getData() const
Definition: asn1.cpp:101
std::vector< std::uint8_t >::const_iterator _contentBegin
Definition: asn1.h:77
void init()
Definition: asn1.cpp:116
std::size_t getContentLength() const
Definition: asn1.cpp:106
virtual ~Asn1Item()=default
std::size_t getLength() const
Definition: asn1.cpp:96
std::vector< std::uint8_t > getContentData() const
Definition: asn1.cpp:111
static std::shared_ptr< Asn1Item > parse(const std::vector< std::uint8_t > &data)
Definition: asn1.cpp:20
bool isContextSpecific() const
Definition: asn1.cpp:91
std::vector< std::uint8_t > _data
Definition: asn1.h:72
bool isOctetString() const
Definition: asn1.cpp:76
bool isSequence() const
Definition: asn1.cpp:81
Asn1Item(Asn1Type type, const std::vector< std::uint8_t > &data)
Definition: asn1.cpp:15
bool isBitString() const
Definition: asn1.cpp:71
Asn1Type _type
Definition: asn1.h:71
std::size_t _contentLength
Definition: asn1.h:78
Definition: asn1.h:82
Asn1Null(const std::vector< std::uint8_t > &data)
Definition: asn1.cpp:147
Definition: asn1.h:114
std::string _identifier
Definition: asn1.h:123
Asn1Object(const std::vector< std::uint8_t > &data)
Definition: asn1.cpp:181
void init()
Definition: asn1.cpp:191
std::string getIdentifier() const
Definition: asn1.cpp:186
std::string _string
Definition: asn1.h:110
std::string getString() const
Definition: asn1.cpp:171
void init()
Definition: asn1.cpp:176
Asn1OctetString(const std::vector< std::uint8_t > &data)
Definition: asn1.cpp:166
Definition: asn1.h:127
std::vector< std::shared_ptr< Asn1Item > > _elements
Definition: asn1.h:137
std::shared_ptr< Asn1Item > getElement(std::size_t index) const
Definition: asn1.cpp:236
std::size_t getNumberOfElements() const
Definition: asn1.cpp:231
Asn1Sequence(const std::vector< std::uint8_t > &data)
Definition: asn1.cpp:226
void init()
Definition: asn1.cpp:241
const std::uint8_t Asn1Tag_OctetString
Definition: asn1.h:29
const std::uint8_t Asn1Tag_Universal
Definition: asn1.h:21
const std::uint8_t Asn1Tag_Constructed
Definition: asn1.h:26
const std::uint8_t Asn1TagMask_Type
Definition: asn1.h:19
const std::uint8_t Asn1Tag_ContextSpecific
Definition: asn1.h:23
const std::string DigestAlgorithmOID_Sha256
Definition: asn1.h:35
const std::uint8_t Asn1Tag_Private
Definition: asn1.h:24
const std::uint8_t Asn1TagMask_Primitive
Definition: asn1.h:18
const std::uint8_t Asn1Tag_Null
Definition: asn1.h:30
const std::uint8_t Asn1Tag_BitString
Definition: asn1.h:28
const std::uint8_t Asn1Tag_Object
Definition: asn1.h:31
const std::uint8_t Asn1TagMask_Class
Definition: asn1.h:17
const std::uint8_t Asn1Tag_Sequence
Definition: asn1.h:32
const std::uint8_t Asn1Tag_Application
Definition: asn1.h:22
const std::string DigestAlgorithmOID_Md5
Definition: asn1.h:36
Asn1Type
Definition: asn1.h:39
const std::string DigestAlgorithmOID_Sha1
Definition: asn1.h:34
Definition: archive_wrapper.h:19