src/lib/BasicASN1Reader.h
branchv_0
changeset 23 8941a679299f
parent 22 9b6f86760384
child 25 ba79cebde109
equal deleted inserted replaced
22:9b6f86760384 23:8941a679299f
   205 		} else if (typeHeader.tag == UniversalType::UTF8String && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
   205 		} else if (typeHeader.tag == UniversalType::UTF8String && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
   206 			// TODO: check available bytes before allocating buffer
   206 			// TODO: check available bytes before allocating buffer
   207 			std::string s;
   207 			std::string s;
   208 			s.resize(typeHeader.length);
   208 			s.resize(typeHeader.length);
   209 			read((uint8_t*) s.data(), typeHeader.length);
   209 			read((uint8_t*) s.data(), typeHeader.length);
   210 			handlers.writeString(ASN1ContentHandler::StringType::UTF8String, s);
   210 			handlers.writeTextString(ASN1ContentHandler::StringType::UTF8String, s);
   211 		} else if (typeHeader.tag == UniversalType::PrintableString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
   211 		} else if (typeHeader.tag == UniversalType::PrintableString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
   212 			// TODO: check encoding
   212 			// TODO: check encoding
   213 			// TODO: check available bytes before allocating buffer
   213 			// TODO: check available bytes before allocating buffer
   214 			std::string s;
   214 			std::string s;
   215 			s.resize(typeHeader.length);
   215 			s.resize(typeHeader.length);
   216 			read((uint8_t*) s.data(), typeHeader.length);
   216 			read((uint8_t*) s.data(), typeHeader.length);
   217 			handlers.writeString(ASN1ContentHandler::StringType::PrintableString, s);
   217 			handlers.writeTextString(ASN1ContentHandler::StringType::PrintableString, s);
       
   218 		} else if (typeHeader.tag == UniversalType::OctetString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
       
   219 			// TODO: check available bytes before allocating buffer
       
   220 			std::string s;
       
   221 			s.resize(typeHeader.length);
       
   222 			read((uint8_t*) s.data(), typeHeader.length);
       
   223 			handlers.writeOctetString(s);
       
   224 		} else if (typeHeader.tag == UniversalType::BitString && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
       
   225 			// TODO: check available bytes before allocating buffer
       
   226 			std::string s;
       
   227 			s.resize(typeHeader.length);
       
   228 			read((uint8_t*) s.data(), typeHeader.length);
       
   229 			std::vector<bool> bits;
       
   230 			// TODO: throw exception on wrong padding or insufficient length?
       
   231 			if (s.size() > 1) {
       
   232 				uint8_t padding = s[0];
       
   233 				for (uint8_t j = padding; j < 8; j++) bits.push_back(s.back() & 1 << j);
       
   234 				for (size_t i = s.size() - 2; i > 0; i--) for (uint8_t j = 0; j < 8; j++) bits.push_back(s[i] & 1 << j);
       
   235 			}
       
   236 			handlers.writeBitString(bits);
   218 		} else if (typeHeader.tag == UniversalType::UTCTime && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
   237 		} else if (typeHeader.tag == UniversalType::UTCTime && typeHeader.tagClass == TagClass::Universal && typeHeader.definiteLength) {
   219 			// TODO: check available bytes before allocating buffer
   238 			// TODO: check available bytes before allocating buffer
       
   239 			// TODO: check encoding
   220 			std::string s;
   240 			std::string s;
   221 			s.resize(typeHeader.length);
   241 			s.resize(typeHeader.length);
   222 			read((uint8_t*) s.data(), typeHeader.length);
   242 			read((uint8_t*) s.data(), typeHeader.length);
   223 
   243 
   224 			ASN1ContentHandler::DateTime dateTime;
   244 			ASN1ContentHandler::DateTime dateTime;
   293 					<< " tagClass = " << (int) typeHeader.tagClass
   313 					<< " tagClass = " << (int) typeHeader.tagClass
   294 					<< " pc = " << (int) typeHeader.pc
   314 					<< " pc = " << (int) typeHeader.pc
   295 					<< " length = " << typeHeader.length
   315 					<< " length = " << typeHeader.length
   296 					<< " definite = " << (typeHeader.definiteLength ? "true" : "false");
   316 					<< " definite = " << (typeHeader.definiteLength ? "true" : "false");
   297 
   317 
   298 			handlers.writeString(ASN1ContentHandler::StringType::UTF8String, description.str());
   318 			handlers.writeTextString(ASN1ContentHandler::StringType::UTF8String, description.str());
   299 		}
   319 		}
   300 
   320 
   301 		commit();
   321 		commit();
   302 	}
   322 	}
   303 
   323