blob: ebb8f61ca1155cccd5afdb274040dae26a751091 [file]
// Copyright 2015 The Chromium Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef BSSL_PKI_VERIFY_NAME_MATCH_H_
#define BSSL_PKI_VERIFY_NAME_MATCH_H_
#include <string>
#include <vector>
#include <openssl/base.h>
BSSL_NAMESPACE_BEGIN
class CertErrors;
namespace der {
class Input;
} // namespace der
// Normalizes DER-encoded X.501 Name `name_rdn_sequence` (which should not
// include the Sequence tag). If successful, returns true and stores the
// normalized DER-encoded Name into `normalized_rdn_sequence` (not including an
// outer Sequence tag). Returns false if there was an error parsing or
// normalizing the input, and adds error information to `errors`. `errors` must
// be non-null.
OPENSSL_EXPORT bool NormalizeName(der::Input name_rdn_sequence,
std::string *normalized_rdn_sequence,
CertErrors *errors);
// Compares DER-encoded X.501 Name values according to RFC 5280 rules.
// `a_rdn_sequence` and `b_rdn_sequence` should be the DER-encoded RDNSequence
// values (not including the Sequence tag).
// Returns true if `a_rdn_sequence` and `b_rdn_sequence` match.
OPENSSL_EXPORT bool VerifyNameMatch(der::Input a_rdn_sequence,
der::Input b_rdn_sequence);
// Compares `name_rdn_sequence` and `parent_rdn_sequence` and return true if
// `name_rdn_sequence` is within the subtree defined by `parent_rdn_sequence` as
// defined by RFC 5280 section 7.1. `name_rdn_sequence` and
// `parent_rdn_sequence` should be the DER-encoded sequence values (not
// including the Sequence tag).
OPENSSL_EXPORT bool VerifyNameInSubtree(der::Input name_rdn_sequence,
der::Input parent_rdn_sequence);
// Helper functions:
// Find all emailAddress attribute values in `name_rdn_sequence`.
// Returns true if parsing was successful, in which case
// `*contained_email_address` will contain zero or more values. The values
// returned in `*contained_email_addresses` will be UTF8 strings and have been
// checked that they were valid strings for the string type of the attribute
// tag, but otherwise have not been validated.
// Returns false if there was a parsing error.
[[nodiscard]] bool FindEmailAddressesInName(
der::Input name_rdn_sequence,
std::vector<std::string> *contained_email_addresses);
BSSL_NAMESPACE_END
#endif // BSSL_PKI_VERIFY_NAME_MATCH_H_