35 class BasicASN1Reader : public ASN1Reader { |
35 class BasicASN1Reader : public ASN1Reader { |
36 private: |
36 private: |
37 |
37 |
38 bool started = false; |
38 bool started = false; |
39 |
39 |
40 enum UniversalType : uint64_t { |
|
41 EndOfContent = 0x00, |
|
42 Boolean = 0x01, |
|
43 Integer = 0x02, |
|
44 BitString = 0x03, |
|
45 OctetString = 0x04, |
|
46 Null = 0x05, |
|
47 ObjectIdentifier = 0x06, |
|
48 ObjectDescriptor = 0x07, |
|
49 External = 0x08, |
|
50 Real = 0x09, |
|
51 Enumerated = 0xA, |
|
52 Embedded = 0xB, |
|
53 UTF8String = 0xC, |
|
54 RelativeObjectIdentifier = 0xD, |
|
55 Time = 0xE, |
|
56 Reserved = 0xF, |
|
57 Sequence = 0x10, |
|
58 Set = 0x11, |
|
59 NumericString = 0x12, |
|
60 PrintableString = 0x13, |
|
61 T61String = 0x14, |
|
62 VideotexString = 0x15, |
|
63 IA5String = 0x16, |
|
64 UTCTime = 0x17, |
|
65 GeneralizedTime = 0x18, |
|
66 GraphicString = 0x19, |
|
67 VisibleString = 0x1A, |
|
68 GeneralString = 0x1B, |
|
69 UniversalString = 0x1C, |
|
70 CharacterString = 0x1D, |
|
71 BMPString = 0x1E, |
|
72 Date = 0x1F, |
|
73 TimeOfDay = 0x20, |
|
74 DateTime = 0x21, |
|
75 Duration = 0x22, |
|
76 ObjectIdentifierIRI = 0x23, |
|
77 RelativeObjectIdentifierIRI = 0x24, |
|
78 }; |
|
79 |
|
80 class BasicHeader : public ASN1ContentHandler::Header { |
40 class BasicHeader : public ASN1ContentHandler::Header { |
81 public: |
41 public: |
82 bool definiteLength; |
42 bool definiteLength; |
83 size_t length; |
43 size_t length; |
84 }; |
44 }; |
169 // TODO: constants, more types |
129 // TODO: constants, more types |
170 if (typeHeader.tag == UniversalType::EndOfContent && typeHeader.tagClass == TagClass::Universal && typeHeader.pc == PC::Primitive) { |
130 if (typeHeader.tag == UniversalType::EndOfContent && typeHeader.tagClass == TagClass::Universal && typeHeader.pc == PC::Primitive) { |
171 handlers.writeCollectionEnd(); |
131 handlers.writeCollectionEnd(); |
172 } else if (typeHeader.tag == UniversalType::Sequence) { |
132 } else if (typeHeader.tag == UniversalType::Sequence) { |
173 level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction |
133 level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction |
174 handlers.writeCollectionStart(ASN1ContentHandler::CollectionType::Sequence); |
134 handlers.writeCollectionStart(typeHeader); |
175 } else if (typeHeader.tag == UniversalType::Set) { |
135 } else if (typeHeader.tag == UniversalType::Set) { |
176 level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction |
136 level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction |
177 handlers.writeCollectionStart(ASN1ContentHandler::CollectionType::Set); |
137 handlers.writeCollectionStart(typeHeader); |
178 } else if (typeHeader.pc == PC::Constructed) { |
138 } else if (typeHeader.pc == PC::Constructed) { |
179 level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction |
139 level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction |
180 handlers.writeCollectionStart(ASN1ContentHandler::CollectionType::Constructed); |
140 handlers.writeCollectionStart(typeHeader); |
181 } else if (typeHeader.tag == UniversalType::Null && typeHeader.length == 0) { |
141 } else if (typeHeader.tag == UniversalType::Null && typeHeader.length == 0) { |
182 handlers.writeNull(); |
142 handlers.writeNull(); |
183 } else if (typeHeader.tag == UniversalType::Boolean && typeHeader.definiteLength && typeHeader.length == 1) { |
143 } else if (typeHeader.tag == UniversalType::Boolean && typeHeader.definiteLength && typeHeader.length == 1) { |
184 bool value; |
144 bool value; |
185 read((uint8_t*) & value, 1); |
145 read((uint8_t*) & value, 1); |