src/lib/ASN1ContentHandler.h
branchv_0
changeset 26 e39de9b8b3a1
parent 25 ba79cebde109
child 27 d9cc2d356cdb
equal deleted inserted replaced
25:ba79cebde109 26:e39de9b8b3a1
    27 namespace relpipe {
    27 namespace relpipe {
    28 namespace in {
    28 namespace in {
    29 namespace asn1 {
    29 namespace asn1 {
    30 namespace lib {
    30 namespace lib {
    31 
    31 
       
    32 namespace UniversalType {
       
    33 static const uint64_t EndOfContent = 0x00;
       
    34 static const uint64_t Boolean = 0x01;
       
    35 static const uint64_t Integer = 0x02;
       
    36 static const uint64_t BitString = 0x03;
       
    37 static const uint64_t OctetString = 0x04;
       
    38 static const uint64_t Null = 0x05;
       
    39 static const uint64_t ObjectIdentifier = 0x06;
       
    40 static const uint64_t ObjectDescriptor = 0x07;
       
    41 static const uint64_t External = 0x08;
       
    42 static const uint64_t Real = 0x09;
       
    43 static const uint64_t Enumerated = 0xA;
       
    44 static const uint64_t Embedded = 0xB;
       
    45 static const uint64_t UTF8String = 0xC;
       
    46 static const uint64_t RelativeObjectIdentifier = 0xD;
       
    47 static const uint64_t Time = 0xE;
       
    48 static const uint64_t Reserved = 0xF;
       
    49 static const uint64_t Sequence = 0x10;
       
    50 static const uint64_t Set = 0x11;
       
    51 static const uint64_t NumericString = 0x12;
       
    52 static const uint64_t PrintableString = 0x13;
       
    53 static const uint64_t T61String = 0x14;
       
    54 static const uint64_t VideotexString = 0x15;
       
    55 static const uint64_t IA5String = 0x16;
       
    56 static const uint64_t UTCTime = 0x17;
       
    57 static const uint64_t GeneralizedTime = 0x18;
       
    58 static const uint64_t GraphicString = 0x19;
       
    59 static const uint64_t VisibleString = 0x1A;
       
    60 static const uint64_t GeneralString = 0x1B;
       
    61 static const uint64_t UniversalString = 0x1C;
       
    62 static const uint64_t CharacterString = 0x1D;
       
    63 static const uint64_t BMPString = 0x1E;
       
    64 static const uint64_t Date = 0x1F;
       
    65 static const uint64_t TimeOfDay = 0x20;
       
    66 static const uint64_t DateTime = 0x21;
       
    67 static const uint64_t Duration = 0x22;
       
    68 static const uint64_t ObjectIdentifierIRI = 0x23;
       
    69 static const uint64_t RelativeObjectIdentifierIRI = 0x24;
       
    70 }
       
    71 
    32 class ASN1ContentHandler {
    72 class ASN1ContentHandler {
    33 public:
    73 public:
    34 
    74 
    35 	enum class TagClass : uint8_t {
    75 	enum class TagClass : uint8_t {
    36 		Universal = 0,
    76 		Universal = 0,
    47 	class Header {
    87 	class Header {
    48 	public:
    88 	public:
    49 		TagClass tagClass;
    89 		TagClass tagClass;
    50 		PC pc;
    90 		PC pc;
    51 		uint64_t tag;
    91 		uint64_t tag;
    52 	};
       
    53 
       
    54 	enum class CollectionType : uint64_t {
       
    55 		Constructed, // TODO: special event?
       
    56 		Sequence = 16,
       
    57 		Set = 17
       
    58 	};
    92 	};
    59 
    93 
    60 	enum class StringType : uint64_t {
    94 	enum class StringType : uint64_t {
    61 		UTF8String = 0xC,
    95 		UTF8String = 0xC,
    62 		NumericString = 0x12,
    96 		NumericString = 0x12,
    80 		TimeOfDay,
   114 		TimeOfDay,
    81 		DateTime,
   115 		DateTime,
    82 		Duration,
   116 		Duration,
    83 		// TODO: review date/time types
   117 		// TODO: review date/time types
    84 	};
   118 	};
       
   119 
       
   120 
       
   121 	// TODO: separate implementation of particular types from the interface, separate SPI from API?
    85 
   122 
    86 	class Integer {
   123 	class Integer {
    87 	private:
   124 	private:
    88 		// TODO: use std::string (of octets, not ASCII) instead of std::vector?
   125 		// TODO: use std::string (of octets, not ASCII) instead of std::vector?
    89 		// TODO: use this class as BigInteger across Relational pipes?
   126 		// TODO: use this class as BigInteger across Relational pipes?
   251 	// TODO: support also extension extractor plug-ins? (could decode some opaque structures like octet strings and replace them with nested elements) e.g. subjectAltName in https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.6
   288 	// TODO: support also extension extractor plug-ins? (could decode some opaque structures like octet strings and replace them with nested elements) e.g. subjectAltName in https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.6
   252 
   289 
   253 	virtual void writeStreamStart() = 0;
   290 	virtual void writeStreamStart() = 0;
   254 	virtual void writeStreamEnd() = 0;
   291 	virtual void writeStreamEnd() = 0;
   255 
   292 
   256 	virtual void writeCollectionStart(CollectionType type) = 0;
   293 	virtual void writeCollectionStart(const Header& header) = 0;
   257 	virtual void writeCollectionEnd() = 0;
   294 	virtual void writeCollectionEnd() = 0;
   258 	virtual void writeBoolean(bool value) = 0;
   295 	virtual void writeBoolean(bool value) = 0;
   259 	virtual void writeNull() = 0;
   296 	virtual void writeNull() = 0;
   260 	virtual void writeInteger(Integer value) = 0;
   297 	virtual void writeInteger(Integer value) = 0;
   261 	/**
   298 	/**
   298 
   335 
   299 	void writeStreamEnd() override {
   336 	void writeStreamEnd() override {
   300 		handlers.forward(&ASN1ContentHandler::writeStreamEnd);
   337 		handlers.forward(&ASN1ContentHandler::writeStreamEnd);
   301 	}
   338 	}
   302 
   339 
   303 	void writeCollectionStart(CollectionType type) override {
   340 	void writeCollectionStart(const Header& header) override {
   304 		handlers.forward(&ASN1ContentHandler::writeCollectionStart, type);
   341 		handlers.forward(&ASN1ContentHandler::writeCollectionStart, header);
   305 	}
   342 	}
   306 
   343 
   307 	void writeCollectionEnd() override {
   344 	void writeCollectionEnd() override {
   308 		handlers.forward(&ASN1ContentHandler::writeCollectionEnd);
   345 		handlers.forward(&ASN1ContentHandler::writeCollectionEnd);
   309 	}
   346 	}