diff options
Diffstat (limited to 'src/pki/parse_name.cc')
-rw-r--r-- | src/pki/parse_name.cc | 117 |
1 files changed, 63 insertions, 54 deletions
diff --git a/src/pki/parse_name.cc b/src/pki/parse_name.cc index db116f8..f1b3a91 100644 --- a/src/pki/parse_name.cc +++ b/src/pki/parse_name.cc @@ -6,11 +6,12 @@ #include <cassert> -#include "string_util.h" -#include "parse_values.h" #include <openssl/bytestring.h> #include <openssl/mem.h> +#include "parse_values.h" +#include "string_util.h" + namespace bssl { namespace { @@ -19,29 +20,30 @@ namespace { // string on error. std::string OidToString(der::Input oid) { CBS cbs; - CBS_init(&cbs, oid.UnsafeData(), oid.Length()); + CBS_init(&cbs, oid.data(), oid.size()); bssl::UniquePtr<char> text(CBS_asn1_oid_to_text(&cbs)); - if (!text) + if (!text) { return std::string(); + } return text.get(); } } // namespace -bool X509NameAttribute::ValueAsString(std::string* out) const { +bool X509NameAttribute::ValueAsString(std::string *out) const { switch (value_tag) { - case der::kTeletexString: + case CBS_ASN1_T61STRING: return der::ParseTeletexStringAsLatin1(value, out); - case der::kIA5String: + case CBS_ASN1_IA5STRING: return der::ParseIA5String(value, out); - case der::kPrintableString: + case CBS_ASN1_PRINTABLESTRING: return der::ParsePrintableString(value, out); - case der::kUtf8String: - *out = value.AsString(); + case CBS_ASN1_UTF8STRING: + *out = BytesAsStringView(value); return true; - case der::kUniversalString: + case CBS_ASN1_UNIVERSALSTRING: return der::ParseUniversalString(value, out); - case der::kBmpString: + case CBS_ASN1_BMPSTRING: return der::ParseBmpString(value, out); default: return false; @@ -49,27 +51,26 @@ bool X509NameAttribute::ValueAsString(std::string* out) const { } bool X509NameAttribute::ValueAsStringWithUnsafeOptions( - PrintableStringHandling printable_string_handling, - std::string* out) const { + PrintableStringHandling printable_string_handling, std::string *out) const { if (printable_string_handling == PrintableStringHandling::kAsUTF8Hack && - value_tag == der::kPrintableString) { - *out = value.AsString(); + value_tag == CBS_ASN1_PRINTABLESTRING) { + *out = BytesAsStringView(value); return true; } return ValueAsString(out); } -bool X509NameAttribute::ValueAsStringUnsafe(std::string* out) const { +bool X509NameAttribute::ValueAsStringUnsafe(std::string *out) const { switch (value_tag) { - case der::kIA5String: - case der::kPrintableString: - case der::kTeletexString: - case der::kUtf8String: - *out = value.AsString(); + case CBS_ASN1_IA5STRING: + case CBS_ASN1_PRINTABLESTRING: + case CBS_ASN1_T61STRING: + case CBS_ASN1_UTF8STRING: + *out = BytesAsStringView(value); return true; - case der::kUniversalString: + case CBS_ASN1_UNIVERSALSTRING: return der::ParseUniversalString(value, out); - case der::kBmpString: + case CBS_ASN1_BMPSTRING: return der::ParseBmpString(value, out); default: assert(0); // NOTREACHED @@ -77,7 +78,7 @@ bool X509NameAttribute::ValueAsStringUnsafe(std::string* out) const { } } -bool X509NameAttribute::AsRFC2253String(std::string* out) const { +bool X509NameAttribute::AsRFC2253String(std::string *out) const { std::string type_string; std::string value_string; // TODO(mattm): Add streetAddress and domainComponent here? @@ -101,20 +102,21 @@ bool X509NameAttribute::AsRFC2253String(std::string* out) const { type_string = "emailAddress"; } else { type_string = OidToString(type); - if (type_string.empty()) + if (type_string.empty()) { return false; - value_string = - "#" + bssl::string_util::HexEncode(value.UnsafeData(), value.Length()); + } + value_string = "#" + bssl::string_util::HexEncode(value); } if (value_string.empty()) { std::string unescaped; - if (!ValueAsStringUnsafe(&unescaped)) + if (!ValueAsStringUnsafe(&unescaped)) { return false; + } bool nonprintable = false; for (unsigned int i = 0; i < unescaped.length(); ++i) { - unsigned char c = static_cast<unsigned char>(unescaped[i]); + uint8_t c = static_cast<uint8_t>(unescaped[i]); if (i == 0 && c == '#') { value_string += "\\#"; } else if (i == 0 && c == ' ') { @@ -127,11 +129,8 @@ bool X509NameAttribute::AsRFC2253String(std::string* out) const { value_string += c; } else if (c < 32 || c > 126) { nonprintable = true; - std::string h; - h += c; value_string += - "\\" + bssl::string_util::HexEncode( - reinterpret_cast<const uint8_t*>(h.data()), h.length()); + "\\" + bssl::string_util::HexEncode(MakeConstSpan(&c, 1)); } else { value_string += c; } @@ -139,35 +138,39 @@ bool X509NameAttribute::AsRFC2253String(std::string* out) const { // If we have non-printable characters in a TeletexString, we hex encode // since we don't handle Teletex control codes. - if (nonprintable && value_tag == der::kTeletexString) - value_string = - "#" + bssl::string_util::HexEncode(value.UnsafeData(), value.Length()); + if (nonprintable && value_tag == CBS_ASN1_T61STRING) { + value_string = "#" + bssl::string_util::HexEncode(value); + } } *out = type_string + "=" + value_string; return true; } -bool ReadRdn(der::Parser* parser, RelativeDistinguishedName* out) { +bool ReadRdn(der::Parser *parser, RelativeDistinguishedName *out) { while (parser->HasMore()) { der::Parser attr_type_and_value; - if (!parser->ReadSequence(&attr_type_and_value)) + if (!parser->ReadSequence(&attr_type_and_value)) { return false; + } // Read the attribute type, which must be an OBJECT IDENTIFIER. der::Input type; - if (!attr_type_and_value.ReadTag(der::kOid, &type)) + if (!attr_type_and_value.ReadTag(CBS_ASN1_OBJECT, &type)) { return false; + } // Read the attribute value. - der::Tag tag; + CBS_ASN1_TAG tag; der::Input value; - if (!attr_type_and_value.ReadTagAndValue(&tag, &value)) + if (!attr_type_and_value.ReadTagAndValue(&tag, &value)) { return false; + } // There should be no more elements in the sequence after reading the // attribute type and value. - if (attr_type_and_value.HasMore()) + if (attr_type_and_value.HasMore()) { return false; + } out->push_back(X509NameAttribute(type, tag, value)); } @@ -177,45 +180,51 @@ bool ReadRdn(der::Parser* parser, RelativeDistinguishedName* out) { return out->size() != 0; } -bool ParseName(const der::Input& name_tlv, RDNSequence* out) { +bool ParseName(der::Input name_tlv, RDNSequence *out) { der::Parser name_parser(name_tlv); der::Input name_value; - if (!name_parser.ReadTag(der::kSequence, &name_value)) + if (!name_parser.ReadTag(CBS_ASN1_SEQUENCE, &name_value)) { return false; + } return ParseNameValue(name_value, out); } -bool ParseNameValue(const der::Input& name_value, RDNSequence* out) { +bool ParseNameValue(der::Input name_value, RDNSequence *out) { der::Parser rdn_sequence_parser(name_value); while (rdn_sequence_parser.HasMore()) { der::Parser rdn_parser; - if (!rdn_sequence_parser.ReadConstructed(der::kSet, &rdn_parser)) + if (!rdn_sequence_parser.ReadConstructed(CBS_ASN1_SET, &rdn_parser)) { return false; + } RelativeDistinguishedName type_and_values; - if (!ReadRdn(&rdn_parser, &type_and_values)) + if (!ReadRdn(&rdn_parser, &type_and_values)) { return false; + } out->push_back(type_and_values); } return true; } -bool ConvertToRFC2253(const RDNSequence& rdn_sequence, std::string* out) { +bool ConvertToRFC2253(const RDNSequence &rdn_sequence, std::string *out) { std::string rdns_string; size_t size = rdn_sequence.size(); for (size_t i = 0; i < size; ++i) { RelativeDistinguishedName rdn = rdn_sequence[size - i - 1]; std::string rdn_string; - for (const auto& atv : rdn) { - if (!rdn_string.empty()) + for (const auto &atv : rdn) { + if (!rdn_string.empty()) { rdn_string += "+"; + } std::string atv_string; - if (!atv.AsRFC2253String(&atv_string)) + if (!atv.AsRFC2253String(&atv_string)) { return false; + } rdn_string += atv_string; } - if (!rdns_string.empty()) + if (!rdns_string.empty()) { rdns_string += ","; + } rdns_string += rdn_string; } @@ -223,4 +232,4 @@ bool ConvertToRFC2253(const RDNSequence& rdn_sequence, std::string* out) { return true; } -} // namespace net +} // namespace bssl |