src/lib/GenericASN1ContentHandler.h
branchv_0
changeset 23 8941a679299f
parent 21 705036445672
child 26 e39de9b8b3a1
--- a/src/lib/GenericASN1ContentHandler.h	Wed Jun 30 20:11:39 2021 +0200
+++ b/src/lib/GenericASN1ContentHandler.h	Fri Jul 02 00:42:01 2021 +0200
@@ -16,6 +16,9 @@
  */
 #pragma once
 
+#include <sstream>
+#include <iomanip>
+
 #include "ASN1ContentHandler.h"
 #include "XMLContentHandler.h"
 
@@ -77,13 +80,32 @@
 		handlers.writeEndElement();
 	}
 
-	void writeString(StringType type, std::string value) override {
-		handlers.writeStartElement("string");
+	void writeTextString(StringType type, std::string value) override {
+		handlers.writeStartElement("text-string",{"type", std::to_string((uint64_t) type)}); // TODO: type name, better attributes
 		handlers.writeCharacters(value);
 		handlers.writeEndElement();
 	}
 
+	void writeOctetString(std::string value) override {
+		std::stringstream hex;
+		hex << std::hex << std::setfill('0');
+		for (uint8_t b : value) hex << std::setw(2) << (int) b;
+		handlers.writeStartElement("octet-string",{"length", std::to_string(value.size())});
+		handlers.writeCharacters(hex.str());
+		handlers.writeEndElement();
+	}
+
+	void writeBitString(std::vector<bool> value) override {
+		std::stringstream bits;
+		for (bool b : value) bits << (int) b;
+		// for (bool b : value) bits << (b ? ':' : '.'); // TODO: configurable true/false symbols?
+		handlers.writeStartElement("bit-string",{"length", std::to_string(value.size())});
+		handlers.writeCharacters(bits.str());
+		handlers.writeEndElement();
+	}
+
 	void writeOID(ObjectIdentifier value) override {
+		// TODO: optionally expand into separate elements with additional metadata
 		handlers.writeStartElement("oid");
 		handlers.writeCharacters(value.toString());
 		handlers.writeEndElement();