diff -r 9b6f86760384 -r 8941a679299f src/lib/GenericASN1ContentHandler.h --- 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 +#include + #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 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();