--- 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();