src/lib/BasicASN1Reader.h
branchv_0
changeset 26 e39de9b8b3a1
parent 25 ba79cebde109
child 27 d9cc2d356cdb
equal deleted inserted replaced
25:ba79cebde109 26:e39de9b8b3a1
    35 class BasicASN1Reader : public ASN1Reader {
    35 class BasicASN1Reader : public ASN1Reader {
    36 private:
    36 private:
    37 
    37 
    38 	bool started = false;
    38 	bool started = false;
    39 
    39 
    40 	enum UniversalType : uint64_t {
       
    41 		EndOfContent = 0x00,
       
    42 		Boolean = 0x01,
       
    43 		Integer = 0x02,
       
    44 		BitString = 0x03,
       
    45 		OctetString = 0x04,
       
    46 		Null = 0x05,
       
    47 		ObjectIdentifier = 0x06,
       
    48 		ObjectDescriptor = 0x07,
       
    49 		External = 0x08,
       
    50 		Real = 0x09,
       
    51 		Enumerated = 0xA,
       
    52 		Embedded = 0xB,
       
    53 		UTF8String = 0xC,
       
    54 		RelativeObjectIdentifier = 0xD,
       
    55 		Time = 0xE,
       
    56 		Reserved = 0xF,
       
    57 		Sequence = 0x10,
       
    58 		Set = 0x11,
       
    59 		NumericString = 0x12,
       
    60 		PrintableString = 0x13,
       
    61 		T61String = 0x14,
       
    62 		VideotexString = 0x15,
       
    63 		IA5String = 0x16,
       
    64 		UTCTime = 0x17,
       
    65 		GeneralizedTime = 0x18,
       
    66 		GraphicString = 0x19,
       
    67 		VisibleString = 0x1A,
       
    68 		GeneralString = 0x1B,
       
    69 		UniversalString = 0x1C,
       
    70 		CharacterString = 0x1D,
       
    71 		BMPString = 0x1E,
       
    72 		Date = 0x1F,
       
    73 		TimeOfDay = 0x20,
       
    74 		DateTime = 0x21,
       
    75 		Duration = 0x22,
       
    76 		ObjectIdentifierIRI = 0x23,
       
    77 		RelativeObjectIdentifierIRI = 0x24,
       
    78 	};
       
    79 
       
    80 	class BasicHeader : public ASN1ContentHandler::Header {
    40 	class BasicHeader : public ASN1ContentHandler::Header {
    81 	public:
    41 	public:
    82 		bool definiteLength;
    42 		bool definiteLength;
    83 		size_t length;
    43 		size_t length;
    84 	};
    44 	};
   169 		// TODO: constants, more types
   129 		// TODO: constants, more types
   170 		if (typeHeader.tag == UniversalType::EndOfContent && typeHeader.tagClass == TagClass::Universal && typeHeader.pc == PC::Primitive) {
   130 		if (typeHeader.tag == UniversalType::EndOfContent && typeHeader.tagClass == TagClass::Universal && typeHeader.pc == PC::Primitive) {
   171 			handlers.writeCollectionEnd();
   131 			handlers.writeCollectionEnd();
   172 		} else if (typeHeader.tag == UniversalType::Sequence) {
   132 		} else if (typeHeader.tag == UniversalType::Sequence) {
   173 			level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction
   133 			level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction
   174 			handlers.writeCollectionStart(ASN1ContentHandler::CollectionType::Sequence);
   134 			handlers.writeCollectionStart(typeHeader);
   175 		} else if (typeHeader.tag == UniversalType::Set) {
   135 		} else if (typeHeader.tag == UniversalType::Set) {
   176 			level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction
   136 			level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction
   177 			handlers.writeCollectionStart(ASN1ContentHandler::CollectionType::Set);
   137 			handlers.writeCollectionStart(typeHeader);
   178 		} else if (typeHeader.pc == PC::Constructed) {
   138 		} else if (typeHeader.pc == PC::Constructed) {
   179 			level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction
   139 			level.push_back({typeHeader.definiteLength, typeHeader.length, getBytesRead()}); // TODO: transaction
   180 			handlers.writeCollectionStart(ASN1ContentHandler::CollectionType::Constructed);
   140 			handlers.writeCollectionStart(typeHeader);
   181 		} else if (typeHeader.tag == UniversalType::Null && typeHeader.length == 0) {
   141 		} else if (typeHeader.tag == UniversalType::Null && typeHeader.length == 0) {
   182 			handlers.writeNull();
   142 			handlers.writeNull();
   183 		} else if (typeHeader.tag == UniversalType::Boolean && typeHeader.definiteLength && typeHeader.length == 1) {
   143 		} else if (typeHeader.tag == UniversalType::Boolean && typeHeader.definiteLength && typeHeader.length == 1) {
   184 			bool value;
   144 			bool value;
   185 			read((uint8_t*) & value, 1);
   145 			read((uint8_t*) & value, 1);