--- a/src/lib/BasicASN1Reader.h Wed Jun 30 20:11:39 2021 +0200
+++ b/src/lib/BasicASN1Reader.h Fri Jul 02 00:42:01 2021 +0200
@@ -207,16 +207,36 @@
std::string s;
s.resize(typeHeader.length);
read((uint8_t*) s.data(), typeHeader.length);
- handlers.writeString(ASN1ContentHandler::StringType::UTF8String, s);
+ handlers.writeTextString(ASN1ContentHandler::StringType::UTF8String, s);
} else if (typeHeader.tag == UniversalType::PrintableString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
// TODO: check encoding
// TODO: check available bytes before allocating buffer
std::string s;
s.resize(typeHeader.length);
read((uint8_t*) s.data(), typeHeader.length);
- handlers.writeString(ASN1ContentHandler::StringType::PrintableString, s);
+ handlers.writeTextString(ASN1ContentHandler::StringType::PrintableString, s);
+ } else if (typeHeader.tag == UniversalType::OctetString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
+ // TODO: check available bytes before allocating buffer
+ std::string s;
+ s.resize(typeHeader.length);
+ read((uint8_t*) s.data(), typeHeader.length);
+ handlers.writeOctetString(s);
+ } else if (typeHeader.tag == UniversalType::BitString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
+ // TODO: check available bytes before allocating buffer
+ std::string s;
+ s.resize(typeHeader.length);
+ read((uint8_t*) s.data(), typeHeader.length);
+ std::vector<bool> bits;
+ // TODO: throw exception on wrong padding or insufficient length?
+ if (s.size() > 1) {
+ uint8_t padding = s[0];
+ for (uint8_t j = padding; j < 8; j++) bits.push_back(s.back() & 1 << j);
+ 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);
+ }
+ handlers.writeBitString(bits);
} else if (typeHeader.tag == UniversalType::UTCTime && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
// TODO: check available bytes before allocating buffer
+ // TODO: check encoding
std::string s;
s.resize(typeHeader.length);
read((uint8_t*) s.data(), typeHeader.length);
@@ -295,7 +315,7 @@
<< " length = " << typeHeader.length
<< " definite = " << (typeHeader.definiteLength ? "true" : "false");
- handlers.writeString(ASN1ContentHandler::StringType::UTF8String, description.str());
+ handlers.writeTextString(ASN1ContentHandler::StringType::UTF8String, description.str());
}
commit();