src/lib/BasicASN1Reader.h
branchv_0
changeset 17 f5281ab3e68f
parent 16 bb457bb5b515
child 19 b7431bc6069b
equal deleted inserted replaced
16:bb457bb5b515 17:f5281ab3e68f
   143 			handlers.writeNull();
   143 			handlers.writeNull();
   144 		} else if (typeHeader.tag == 1) {
   144 		} else if (typeHeader.tag == 1) {
   145 			bool value;
   145 			bool value;
   146 			read((uint8_t*) & value, 1);
   146 			read((uint8_t*) & value, 1);
   147 			handlers.writeBoolean(value);
   147 			handlers.writeBoolean(value);
   148 		} else if (typeHeader.tag == 12 && typeHeader.tagClass == TagClass::Universal) {
   148 		} else if (typeHeader.tag == 2 && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
       
   149 			// TODO: check available bytes before allocating buffer
       
   150 			std::vector<uint8_t> value(typeHeader.length, 0x00);
       
   151 			read(value.data(), typeHeader.length);
       
   152 			handlers.writeInteger(ASN1ContentHandler::Integer(value));
       
   153 		} else if (typeHeader.tag == 12 && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
       
   154 			// TODO: check available bytes before allocating buffer
   149 			std::string s;
   155 			std::string s;
   150 			s.resize(typeHeader.length);
   156 			s.resize(typeHeader.length);
   151 			read((uint8_t*) s.data(), typeHeader.length);
   157 			read((uint8_t*) s.data(), typeHeader.length);
   152 			handlers.writeString(ASN1ContentHandler::StringType::UTF8String, s);
   158 			handlers.writeString(ASN1ContentHandler::StringType::UTF8String, s);
   153 		} else if (typeHeader.tag == 19 && typeHeader.tagClass == TagClass::Universal) {
   159 		} else if (typeHeader.tag == 19 && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
   154 			// TODO: check encoding
   160 			// TODO: check encoding
       
   161 			// TODO: check available bytes before allocating buffer
   155 			std::string s;
   162 			std::string s;
   156 			s.resize(typeHeader.length);
   163 			s.resize(typeHeader.length);
   157 			read((uint8_t*) s.data(), typeHeader.length);
   164 			read((uint8_t*) s.data(), typeHeader.length);
   158 			handlers.writeString(ASN1ContentHandler::StringType::PrintableString, s);
   165 			handlers.writeString(ASN1ContentHandler::StringType::PrintableString, s);
   159 		} else {
   166 		} else {
   172 
   179 
   173 			handlers.writeString(ASN1ContentHandler::StringType::UTF8String, description.str());
   180 			handlers.writeString(ASN1ContentHandler::StringType::UTF8String, description.str());
   174 		}
   181 		}
   175 
   182 
   176 		commit();
   183 		commit();
   177 
       
   178 
       
   179 		// TODO: remove debug/demo output:
       
   180 		return;
       
   181 		handlers.writeCollectionStart(ASN1ContentHandler::CollectionType::Sequence);
       
   182 		handlers.writeNull();
       
   183 		handlers.writeBoolean(true);
       
   184 
       
   185 		handlers.writeString(ASN1ContentHandler::StringType::UTF8String, "tagClass:");
       
   186 		handlers.writeInteger((int64_t) typeHeader.tagClass);
       
   187 		handlers.writeString(ASN1ContentHandler::StringType::UTF8String, "pc:");
       
   188 		handlers.writeInteger((int64_t) typeHeader.pc);
       
   189 		handlers.writeString(ASN1ContentHandler::StringType::UTF8String, "tag:");
       
   190 		handlers.writeInteger((int64_t) typeHeader.tag);
       
   191 		handlers.writeString(ASN1ContentHandler::StringType::UTF8String, "definiteLength:");
       
   192 		handlers.writeBoolean(typeHeader.definiteLength);
       
   193 		handlers.writeString(ASN1ContentHandler::StringType::UTF8String, "length:");
       
   194 		handlers.writeInteger((int64_t) typeHeader.length);
       
   195 
       
   196 		handlers.writeString(ASN1ContentHandler::StringType::UTF8String, "relational pipes");
       
   197 		handlers.writeCollectionEnd();
       
   198 	}
   184 	}
   199 
   185 
   200 protected:
   186 protected:
   201 
   187 
   202 	void update() override {
   188 	void update() override {