blob: 27faf43a04e4f0c04e9b47ab06a46e21c2266f76 [file] [log] [blame]
// 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 <vector>
#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<X509NameAttribute> RelativeDistinguishedName;
typedef std::vector<RelativeDistinguishedName> 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_