8#include <botan/assert.h>
9#include <botan/tls_signature_scheme.h>
12#include <botan/pk_keys.h>
13#include <botan/pss_params.h>
14#include <botan/tls_version.h>
15#include <botan/internal/fmt.h>
16#include <botan/internal/loadstor.h>
24 static const std::vector<Signature_Scheme> all_schemes = {
55 if(str ==
"RSA_PKCS1_SHA1") {
58 if(str ==
"RSA_PKCS1_SHA256") {
61 if(str ==
"RSA_PKCS1_SHA384") {
64 if(str ==
"RSA_PKCS1_SHA512") {
68 if(str ==
"ECDSA_SHA1") {
71 if(str ==
"ECDSA_SHA256" || str ==
"ECDSA_SECP256R1_TLS13_SHA256") {
74 if(str ==
"ECDSA_SHA384" || str ==
"ECDSA_SECP384R1_TLS13_SHA384") {
77 if(str ==
"ECDSA_SHA512" || str ==
"ECDSA_SECP521R1_TLS13_SHA512") {
81 if(str ==
"RSA_PSS_SHA256") {
84 if(str ==
"RSA_PSS_SHA384") {
87 if(str ==
"RSA_PSS_SHA512") {
91 if(str ==
"ECDSA_BRAINPOOL256R1_TLS13_SHA256") {
94 if(str ==
"ECDSA_BRAINPOOL384R1_TLS13_SHA384") {
97 if(str ==
"ECDSA_BRAINPOOL512R1_TLS13_SHA512") {
102 if(str.size() == 6 && str.starts_with(
"0x")) {
142 return m_code !=
NONE;
148 return "RSA_PKCS1_SHA1";
150 return "RSA_PKCS1_SHA256";
152 return "RSA_PKCS1_SHA384";
154 return "RSA_PKCS1_SHA512";
159 return "ECDSA_SHA256";
161 return "ECDSA_SHA384";
163 return "ECDSA_SHA512";
166 return "ECDSA_BRAINPOOL256R1_TLS13_SHA256";
168 return "ECDSA_BRAINPOOL384R1_TLS13_SHA384";
170 return "ECDSA_BRAINPOOL512R1_TLS13_SHA512";
173 return "RSA_PSS_SHA256";
175 return "RSA_PSS_SHA384";
177 return "RSA_PSS_SHA512";
180 return "EDDSA_25519";
185 return "Unknown signature scheme: " + std::to_string(m_code);
218 return "Unknown hash function";
225 return "PKCS1v15(SHA-1)";
227 return "PKCS1v15(SHA-256)";
229 return "PKCS1v15(SHA-384)";
231 return "PKCS1v15(SHA-512)";
246 return "PSS(SHA-256,MGF1,32)";
248 return "PSS(SHA-384,MGF1,48)";
250 return "PSS(SHA-512,MGF1,64)";
257 return "Unknown padding";
288 return "Unknown algorithm";
293 const auto der_encode_oid = [](
const std::string_view oid_name) {
296 return oid->BER_encode();
305 return {
"ECDSA", der_encode_oid(
"secp256r1")};
307 return {
"ECDSA", der_encode_oid(
"secp384r1")};
309 return {
"ECDSA", der_encode_oid(
"secp521r1")};
312 return {
"ECDSA", der_encode_oid(
"brainpool256r1")};
314 return {
"ECDSA", der_encode_oid(
"brainpool384r1")};
316 return {
"ECDSA", der_encode_oid(
"brainpool512r1")};
452 std::vector<AlgorithmIdentifier> result;
453 result.reserve(schemes.size());
454 for(
const auto& scheme : schemes) {
455 result.push_back(scheme.algorithm_identifier());
#define BOTAN_ASSERT_UNREACHABLE()
virtual std::string algo_name() const =0
static std::optional< OID > from_name(std::string_view name)
static OID from_string(std::string_view str)
virtual size_t key_length() const =0
std::string padding_string() const
bool is_compatible_with(const Protocol_Version &protocol_version) const noexcept
bool is_suitable_for(const Private_Key &private_key) const
std::string algorithm_name() const
AlgorithmIdentifier key_algorithm_identifier() const
@ ECDSA_SECP256R1_TLS13_SHA256
@ ECDSA_BRAINPOOL512R1_TLS13_SHA512
@ ECDSA_BRAINPOOL256R1_TLS13_SHA256
@ ECDSA_BRAINPOOL384R1_TLS13_SHA384
@ ECDSA_SECP521R1_TLS13_SHA512
@ ECDSA_SECP384R1_TLS13_SHA384
std::string to_string() const
Signature_Scheme::Code wire_code() const noexcept
std::string hash_function_name() const
std::optional< Signature_Format > format() const noexcept
static Signature_Scheme from_string(std::string_view str)
AlgorithmIdentifier algorithm_identifier() const
bool is_set() const noexcept
static const std::vector< Signature_Scheme > & all_available_schemes()
bool is_available() const noexcept
std::vector< AlgorithmIdentifier > to_algorithm_identifiers(const std::vector< Signature_Scheme > &schemes)
std::string fmt(std::string_view format, const T &... args)
size_t hex_decode(uint8_t output[], const char input[], size_t input_length, size_t &input_consumed, bool ignore_ws)
constexpr auto load_be(ParamTs &&... params)