# HG changeset patch # User František Kučera # Date 1624304161 -7200 # Node ID 95ca127ba8165187c7c87e3aadcccc8f36bb378b # Parent 02725d301010f466d7f9a833984b1a723ab67c22 support constructed (like a collection) diff -r 02725d301010 -r 95ca127ba816 src/lib/ASN1ContentHandler.h --- a/src/lib/ASN1ContentHandler.h Sun Jun 20 21:06:02 2021 +0200 +++ b/src/lib/ASN1ContentHandler.h Mon Jun 21 21:36:01 2021 +0200 @@ -28,6 +28,7 @@ public: enum class CollectionType : uint64_t { + Constructed, // TODO: special event? Sequence = 16, Set = 17 }; diff -r 02725d301010 -r 95ca127ba816 src/lib/BasicASN1Reader.h --- a/src/lib/BasicASN1Reader.h Sun Jun 20 21:06:02 2021 +0200 +++ b/src/lib/BasicASN1Reader.h Mon Jun 21 21:36:01 2021 +0200 @@ -72,6 +72,7 @@ if (l.definiteLength && l.length == getBytesRead() - l.start) { level.pop_back(); handlers.writeCollectionEnd(); + checkRemainingItems(); // multiple collections may end at the same point } } } @@ -123,17 +124,21 @@ handlers.writeStreamStart(); started = true; } - + // TODO: check tagClass and pc // TODO: constants, more types - if (typeHeader.tag == 0) handlers.writeCollectionEnd(); - else if (typeHeader.tag == 16) { + if (typeHeader.tag == 0 && typeHeader.tagClass == TagClass::Universal && typeHeader.pc == PC::Primitive) { + handlers.writeCollectionEnd(); + } else if (typeHeader.tag == 16) { level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction handlers.writeCollectionStart(ASN1ContentHandler::CollectionType::Sequence); } else if (typeHeader.tag == 17) { level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction handlers.writeCollectionStart(ASN1ContentHandler::CollectionType::Set); + } else if (typeHeader.pc == PC::Constructed) { + level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction + handlers.writeCollectionStart(ASN1ContentHandler::CollectionType::Constructed); } else if (typeHeader.tag == 5 && typeHeader.length == 0) { handlers.writeNull(); } else if (typeHeader.tag == 1) { @@ -190,8 +195,9 @@ public: void close() override { + checkRemainingItems(); // TODO: check the bytes remaining in the buffer - //if (started) handlers.writeStreamEnd(); + if (started) handlers.writeStreamEnd(); } }; diff -r 02725d301010 -r 95ca127ba816 src/lib/GenericASN1ContentHandler.h --- a/src/lib/GenericASN1ContentHandler.h Sun Jun 20 21:06:02 2021 +0200 +++ b/src/lib/GenericASN1ContentHandler.h Mon Jun 21 21:36:01 2021 +0200 @@ -52,6 +52,7 @@ void writeCollectionStart(CollectionType type) override { if (type == CollectionType::Sequence) handlers.writeStartElement("sequence"); else if (type == CollectionType::Set) handlers.writeStartElement("set"); + else if (type == CollectionType::Constructed) handlers.writeStartElement("constructed"); else handlers.writeStartElement("unknown-collection"); // TODO: exception? }