/* * TLS Signature Scheme * (C) 2022 Jack Lloyd * 2022 Hannes Rantzsch, René Meusel - neXenio GmbH * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_SIGNATURE_SCHEME_H_ #define BOTAN_TLS_SIGNATURE_SCHEME_H_ #include #include #include #include #include namespace Botan::TLS { class Protocol_Version; class BOTAN_PUBLIC_API(3, 0) Signature_Scheme { public: /** * Matches with wire encoding * * Note that this is intentionally left as a bare enum. It emulates the Botan 2 * API where `Signature_Scheme` was an enum class with associated free-standing * functions. Leaving it as a bare enum resembles the legacy user-facing API. */ enum Code : uint16_t { NONE = 0x0000, RSA_PKCS1_SHA1 = 0x0201, // not implemented RSA_PKCS1_SHA256 = 0x0401, RSA_PKCS1_SHA384 = 0x0501, RSA_PKCS1_SHA512 = 0x0601, ECDSA_SHA1 = 0x0203, // not implemented ECDSA_SHA256 = 0x0403, ECDSA_SHA384 = 0x0503, ECDSA_SHA512 = 0x0603, RSA_PSS_SHA256 = 0x0804, RSA_PSS_SHA384 = 0x0805, RSA_PSS_SHA512 = 0x0806, EDDSA_25519 = 0x0807, EDDSA_448 = 0x0808, }; public: /** * @return all available signature schemes */ static const std::vector& all_available_schemes(); /** * Construct an uninitialized / invalid scheme */ Signature_Scheme(); Signature_Scheme(uint16_t wire_code); Signature_Scheme(Signature_Scheme::Code wire_code); Signature_Scheme::Code wire_code() const noexcept { return m_code; } /** * @return true if support for this scheme is implemented in this Botan build */ bool is_available() const noexcept; /** * @return true if the wire_code is set to any value other than `NONE` */ bool is_set() const noexcept; std::string to_string() const noexcept; std::string hash_function_name() const noexcept; std::string padding_string() const noexcept; std::string algorithm_name() const noexcept; AlgorithmIdentifier key_algorithm_identifier() const noexcept; AlgorithmIdentifier algorithm_identifier() const noexcept; std::optional format() const noexcept; bool is_compatible_with(const Protocol_Version& protocol_version) const noexcept; bool is_suitable_for(const Private_Key& private_key) const noexcept; bool operator==(const Signature_Scheme& rhs) const { return m_code == rhs.m_code; } bool operator!=(const Signature_Scheme& rhs) const { return !(*this == rhs); } private: Signature_Scheme::Code m_code; }; std::vector to_algorithm_identifiers(const std::vector& schemes); } // namespace Botan::TLS #endif // BOTAN_TLS_SIGNATURE_SCHEME_H_