certificate read_pem_certificate(std::istream& is) { auto cert_der_data = read_pem_data(is, cert_begin_line, cert_end_line); assert(cert_der_data.size()); util::buffer_view cert_buf(&cert_der_data[0], cert_der_data.size()); return certificate::parse(asn1::read_der_encoded_value(cert_buf)); }
/** * Deserialize a Certificate message */ Certificate::Certificate(const std::vector<byte>& buf) { if(buf.size() < 3) throw Decoding_Error("Certificate: Message malformed"); const size_t total_size = make_u32bit(0, buf[0], buf[1], buf[2]); if(total_size != buf.size() - 3) throw Decoding_Error("Certificate: Message malformed"); const byte* certs = buf.data() + 3; while(size_t remaining_bytes = buf.data() + buf.size() - certs) { if(remaining_bytes < 3) throw Decoding_Error("Certificate: Message malformed"); const size_t cert_size = make_u32bit(0, certs[0], certs[1], certs[2]); if(remaining_bytes < (3 + cert_size)) throw Decoding_Error("Certificate: Message malformed"); DataSource_Memory cert_buf(&certs[3], cert_size); m_certs.push_back(X509_Certificate(cert_buf)); certs += cert_size + 3; } }