// Copyright 2015 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BSSL_PKI_SIGNATURE_ALGORITHM_H_ #define BSSL_PKI_SIGNATURE_ALGORITHM_H_ #include <stdint.h> #include <optional> #include <openssl/base.h> #include <openssl/evp.h> BSSL_NAMESPACE_BEGIN namespace der { class Input; } // namespace der // The digest algorithm used within a signature. enum class DigestAlgorithm { … }; // The signature algorithm used within a certificate. enum class SignatureAlgorithm { … }; // Parses AlgorithmIdentifier as defined by RFC 5280 section 4.1.1.2: // // AlgorithmIdentifier ::= SEQUENCE { // algorithm OBJECT IDENTIFIER, // parameters ANY DEFINED BY algorithm OPTIONAL } [[nodiscard]] OPENSSL_EXPORT bool ParseAlgorithmIdentifier( der::Input input, der::Input *algorithm, der::Input *parameters); // Parses a HashAlgorithm as defined by RFC 5912: // // HashAlgorithm ::= AlgorithmIdentifier{DIGEST-ALGORITHM, // {HashAlgorithms}} // // HashAlgorithms DIGEST-ALGORITHM ::= { // { IDENTIFIER id-sha1 PARAMS TYPE NULL ARE preferredPresent } | // { IDENTIFIER id-sha224 PARAMS TYPE NULL ARE preferredPresent } | // { IDENTIFIER id-sha256 PARAMS TYPE NULL ARE preferredPresent } | // { IDENTIFIER id-sha384 PARAMS TYPE NULL ARE preferredPresent } | // { IDENTIFIER id-sha512 PARAMS TYPE NULL ARE preferredPresent } // } [[nodiscard]] bool ParseHashAlgorithm(der::Input input, DigestAlgorithm *out); // Parses an AlgorithmIdentifier into a signature algorithm and returns it, or // returns `std::nullopt` if `algorithm_identifier` either cannot be parsed or // is not a recognized signature algorithm. OPENSSL_EXPORT std::optional<SignatureAlgorithm> ParseSignatureAlgorithm( der::Input algorithm_identifier); // Returns the hash to be used with the tls-server-end-point channel binding // (RFC 5929) or `std::nullopt`, if not supported for this signature algorithm. OPENSSL_EXPORT std::optional<DigestAlgorithm> GetTlsServerEndpointDigestAlgorithm(SignatureAlgorithm alg); BSSL_NAMESPACE_END #endif // BSSL_PKI_SIGNATURE_ALGORITHM_H_