aboutsummaryrefslogtreecommitdiff
path: root/src/pki/parse_name.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/pki/parse_name.cc')
-rw-r--r--src/pki/parse_name.cc117
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