137 handlers.writeCollectionStart(typeHeader); |
137 handlers.writeCollectionStart(typeHeader); |
138 } else if (typeHeader.pc == PC::Constructed) { |
138 } else if (typeHeader.pc == PC::Constructed) { |
139 level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction |
139 level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction |
140 handlers.writeCollectionStart(typeHeader); |
140 handlers.writeCollectionStart(typeHeader); |
141 } else if (typeHeader.tag == UniversalType::Null && typeHeader.length == 0) { |
141 } else if (typeHeader.tag == UniversalType::Null && typeHeader.length == 0) { |
142 handlers.writeNull(); |
142 handlers.writeNull(typeHeader); |
143 } else if (typeHeader.tag == UniversalType::Boolean && typeHeader.definiteLength && typeHeader.length == 1) { |
143 } else if (typeHeader.tag == UniversalType::Boolean && typeHeader.definiteLength && typeHeader.length == 1) { |
144 bool value; |
144 bool value; |
145 read((uint8_t*) & value, 1); |
145 read((uint8_t*) & value, 1); |
146 handlers.writeBoolean(value); |
146 handlers.writeBoolean(typeHeader, value); |
147 } else if (typeHeader.tag == UniversalType::Integer && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
147 } else if (typeHeader.tag == UniversalType::Integer && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
148 // TODO: check available bytes before allocating buffer |
148 // TODO: check available bytes before allocating buffer |
149 std::vector<uint8_t> value(typeHeader.length, 0x00); |
149 std::vector<uint8_t> value(typeHeader.length, 0x00); |
150 read(value.data(), typeHeader.length); |
150 read(value.data(), typeHeader.length); |
151 handlers.writeInteger(ASN1ContentHandler::Integer(value)); |
151 handlers.writeInteger(typeHeader, ASN1ContentHandler::Integer(value)); |
152 } else if (typeHeader.tag == UniversalType::ObjectIdentifier && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
152 } else if (typeHeader.tag == UniversalType::ObjectIdentifier && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
153 std::vector<uint8_t> value(typeHeader.length, 0x00); |
153 std::vector<uint8_t> value(typeHeader.length, 0x00); |
154 read(value.data(), typeHeader.length); |
154 read(value.data(), typeHeader.length); |
155 handlers.writeOID({value}); |
155 handlers.writeOID(typeHeader,{value}); |
156 } else if (typeHeader.tag == UniversalType::UTF8String && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
156 } else if (typeHeader.tag == UniversalType::UTF8String && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
157 // TODO: check available bytes before allocating buffer |
157 // TODO: check available bytes before allocating buffer |
158 std::string s; |
158 std::string s; |
159 s.resize(typeHeader.length); |
159 s.resize(typeHeader.length); |
160 read((uint8_t*) s.data(), typeHeader.length); |
160 read((uint8_t*) s.data(), typeHeader.length); |
161 handlers.writeTextString(ASN1ContentHandler::StringType::UTF8String, s); |
161 handlers.writeTextString(typeHeader, s); |
162 } else if (typeHeader.tag == UniversalType::PrintableString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
162 } else if (typeHeader.tag == UniversalType::PrintableString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
163 // TODO: check encoding |
163 // TODO: check encoding |
164 // TODO: check available bytes before allocating buffer |
164 // TODO: check available bytes before allocating buffer |
165 std::string s; |
165 std::string s; |
166 s.resize(typeHeader.length); |
166 s.resize(typeHeader.length); |
167 read((uint8_t*) s.data(), typeHeader.length); |
167 read((uint8_t*) s.data(), typeHeader.length); |
168 handlers.writeTextString(ASN1ContentHandler::StringType::PrintableString, s); |
168 handlers.writeTextString(typeHeader, s); |
169 } else if (typeHeader.tag == UniversalType::OctetString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
169 } else if (typeHeader.tag == UniversalType::OctetString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
170 // TODO: check available bytes before allocating buffer |
170 // TODO: check available bytes before allocating buffer |
171 std::string s; |
171 std::string s; |
172 s.resize(typeHeader.length); |
172 s.resize(typeHeader.length); |
173 read((uint8_t*) s.data(), typeHeader.length); |
173 read((uint8_t*) s.data(), typeHeader.length); |
174 handlers.writeOctetString(s); |
174 handlers.writeOctetString(typeHeader, s); |
175 } else if (typeHeader.tag == UniversalType::BitString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
175 } else if (typeHeader.tag == UniversalType::BitString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
176 // TODO: check available bytes before allocating buffer |
176 // TODO: check available bytes before allocating buffer |
177 std::string s; |
177 std::string s; |
178 s.resize(typeHeader.length); |
178 s.resize(typeHeader.length); |
179 read((uint8_t*) s.data(), typeHeader.length); |
179 read((uint8_t*) s.data(), typeHeader.length); |