// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_CERT_INTERNAL_PARSE_NAME_H_ #define NET_CERT_INTERNAL_PARSE_NAME_H_ #include #include "net/base/net_export.h" #include "net/der/input.h" #include "net/der/parser.h" #include "net/der/tag.h" namespace net { NET_EXPORT der::Input TypeCommonNameOid(); NET_EXPORT der::Input TypeSurnameOid(); NET_EXPORT der::Input TypeSerialNumberOid(); NET_EXPORT der::Input TypeCountryNameOid(); NET_EXPORT der::Input TypeLocalityNameOid(); NET_EXPORT der::Input TypeStateOrProvinceNameOid(); NET_EXPORT der::Input TypeStreetAddressOid(); NET_EXPORT der::Input TypeOrganizationNameOid(); NET_EXPORT der::Input TypeOrganizationUnitNameOid(); NET_EXPORT der::Input TypeTitleOid(); NET_EXPORT der::Input TypeNameOid(); NET_EXPORT der::Input TypeGivenNameOid(); NET_EXPORT der::Input TypeInitialsOid(); NET_EXPORT der::Input TypeGenerationQualifierOid(); NET_EXPORT der::Input TypeDomainComponentOid(); // X509NameAttribute contains a representation of a DER-encoded RFC 2253 // "AttributeTypeAndValue". // // AttributeTypeAndValue ::= SEQUENCE { // type AttributeType, // value AttributeValue // } struct NET_EXPORT X509NameAttribute { X509NameAttribute(der::Input in_type, der::Tag in_value_tag, der::Input in_value) : type(in_type), value_tag(in_value_tag), value(in_value) {} // Configures handling of PrintableString in the attribute value. Do // not use non-default handling without consulting //net owners. With // kAsUTF8Hack, PrintableStrings are interpreted as UTF-8 strings. enum class PrintableStringHandling { kDefault, kAsUTF8Hack }; // Attempts to convert the value represented by this struct into a // UTF-8 string and store it in |out|, returning whether the conversion // was successful. bool ValueAsString(std::string* out) const WARN_UNUSED_RESULT; // Attempts to convert the value represented by this struct into a // UTF-8 string and store it in |out|, returning whether the conversion // was successful. Allows configuring some non-standard string handling // options. // // Do not use without consulting //net owners. bool ValueAsStringWithUnsafeOptions( PrintableStringHandling printable_string_handling, std::string* out) const WARN_UNUSED_RESULT; // Attempts to convert the value represented by this struct into a // std::string and store it in |out|, returning whether the conversion was // successful. Due to some encodings being incompatible, the caller must // verify the attribute |value_tag|. // // Note: Don't use this function unless you know what you're doing. Use // ValueAsString instead. // // Note: The conversion doesn't verify that the value corresponds to the // ASN.1 definition of the value type. bool ValueAsStringUnsafe(std::string* out) const WARN_UNUSED_RESULT; // Formats the NameAttribute per RFC2253 into an ASCII string and stores // the result in |out|, returning whether the conversion was successful. bool AsRFC2253String(std::string* out) const WARN_UNUSED_RESULT; der::Input type; der::Tag value_tag; der::Input value; }; typedef std::vector RelativeDistinguishedName; typedef std::vector RDNSequence; // Parses all the ASN.1 AttributeTypeAndValue elements in |parser| and stores // each as an AttributeTypeAndValue object in |out|. // // AttributeTypeAndValue is defined in RFC 5280 section 4.1.2.4: // // AttributeTypeAndValue ::= SEQUENCE { // type AttributeType, // value AttributeValue } // // AttributeType ::= OBJECT IDENTIFIER // // AttributeValue ::= ANY -- DEFINED BY AttributeType // // DirectoryString ::= CHOICE { // teletexString TeletexString (SIZE (1..MAX)), // printableString PrintableString (SIZE (1..MAX)), // universalString UniversalString (SIZE (1..MAX)), // utf8String UTF8String (SIZE (1..MAX)), // bmpString BMPString (SIZE (1..MAX)) } // // The type of the component AttributeValue is determined by the AttributeType; // in general it will be a DirectoryString. NET_EXPORT bool ReadRdn(der::Parser* parser, RelativeDistinguishedName* out) WARN_UNUSED_RESULT; // Parses a DER-encoded "Name" as specified by 5280. Returns true on success // and sets the results in |out|. NET_EXPORT bool ParseName(const der::Input& name_tlv, RDNSequence* out) WARN_UNUSED_RESULT; // Parses a DER-encoded "Name" value (without the sequence tag & length) as // specified by 5280. Returns true on success and sets the results in |out|. NET_EXPORT bool ParseNameValue(const der::Input& name_value, RDNSequence* out) WARN_UNUSED_RESULT; // Formats a RDNSequence |rdn_sequence| per RFC2253 as an ASCII string and // stores the result into |out|, and returns whether the conversion was // successful. NET_EXPORT bool ConvertToRFC2253(const RDNSequence& rdn_sequence, std::string* out) WARN_UNUSED_RESULT; } // namespace net #endif // NET_CERT_INTERNAL_PARSE_NAME_H_