205 } else if (typeHeader.tag == UniversalType::UTF8String && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
205 } else if (typeHeader.tag == UniversalType::UTF8String && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
206 // TODO: check available bytes before allocating buffer |
206 // TODO: check available bytes before allocating buffer |
207 std::string s; |
207 std::string s; |
208 s.resize(typeHeader.length); |
208 s.resize(typeHeader.length); |
209 read((uint8_t*) s.data(), typeHeader.length); |
209 read((uint8_t*) s.data(), typeHeader.length); |
210 handlers.writeString(ASN1ContentHandler::StringType::UTF8String, s); |
210 handlers.writeTextString(ASN1ContentHandler::StringType::UTF8String, s); |
211 } else if (typeHeader.tag == UniversalType::PrintableString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
211 } else if (typeHeader.tag == UniversalType::PrintableString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
212 // TODO: check encoding |
212 // TODO: check encoding |
213 // TODO: check available bytes before allocating buffer |
213 // TODO: check available bytes before allocating buffer |
214 std::string s; |
214 std::string s; |
215 s.resize(typeHeader.length); |
215 s.resize(typeHeader.length); |
216 read((uint8_t*) s.data(), typeHeader.length); |
216 read((uint8_t*) s.data(), typeHeader.length); |
217 handlers.writeString(ASN1ContentHandler::StringType::PrintableString, s); |
217 handlers.writeTextString(ASN1ContentHandler::StringType::PrintableString, s); |
|
218 } else if (typeHeader.tag == UniversalType::OctetString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
|
219 // TODO: check available bytes before allocating buffer |
|
220 std::string s; |
|
221 s.resize(typeHeader.length); |
|
222 read((uint8_t*) s.data(), typeHeader.length); |
|
223 handlers.writeOctetString(s); |
|
224 } else if (typeHeader.tag == UniversalType::BitString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
|
225 // TODO: check available bytes before allocating buffer |
|
226 std::string s; |
|
227 s.resize(typeHeader.length); |
|
228 read((uint8_t*) s.data(), typeHeader.length); |
|
229 std::vector<bool> bits; |
|
230 // TODO: throw exception on wrong padding or insufficient length? |
|
231 if (s.size() > 1) { |
|
232 uint8_t padding = s[0]; |
|
233 for (uint8_t j = padding; j < 8; j++) bits.push_back(s.back() & 1 << j); |
|
234 for (size_t i = s.size() - 2; i > 0; i--) for (uint8_t j = 0; j < 8; j++) bits.push_back(s[i] & 1 << j); |
|
235 } |
|
236 handlers.writeBitString(bits); |
218 } else if (typeHeader.tag == UniversalType::UTCTime && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
237 } else if (typeHeader.tag == UniversalType::UTCTime && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) { |
219 // TODO: check available bytes before allocating buffer |
238 // TODO: check available bytes before allocating buffer |
|
239 // TODO: check encoding |
220 std::string s; |
240 std::string s; |
221 s.resize(typeHeader.length); |
241 s.resize(typeHeader.length); |
222 read((uint8_t*) s.data(), typeHeader.length); |
242 read((uint8_t*) s.data(), typeHeader.length); |
223 |
243 |
224 ASN1ContentHandler::DateTime dateTime; |
244 ASN1ContentHandler::DateTime dateTime; |