src/lib/BasicASN1Reader.h
branchv_0
changeset 23 8941a679299f
parent 22 9b6f86760384
child 25 ba79cebde109
--- 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();