9#include <botan/p11_mechanism.h>
11#include <botan/internal/fmt.h>
12#include <botan/internal/parsing.h>
13#include <botan/internal/scan_name.h>
14#include <botan/internal/stl_util.h>
20using PSS_Params = std::tuple<size_t, MechanismType, MGF>;
23const std::map<MechanismType, PSS_Params>& PssOptions() {
24 static const std::map<MechanismType, PSS_Params> pss_options = {
39 MechanismData(
const MechanismData& other) =
default;
40 MechanismData(MechanismData&& other) =
default;
42 MechanismData& operator=(
const MechanismData& other) =
default;
43 MechanismData& operator=(MechanismData&& other) =
default;
45 virtual ~MechanismData() =
default;
54class RSA_SignMechanism final :
public MechanismData {
58 auto pss_option = PssOptions().find(type());
59 if(pss_option != PssOptions().end()) {
60 m_hash = std::get<1>(pss_option->second);
61 m_mgf = std::get<2>(pss_option->second);
62 m_salt_size = std::get<0>(pss_option->second);
68 MGF mgf()
const {
return m_mgf; }
70 size_t salt_size()
const {
return m_salt_size; }
89struct RSA_CryptMechanism final :
public MechanismData {
92 MechanismData(typ), m_hash(hash), m_mgf(mgf), m_padding_size(padding_size) {}
99 MGF mgf()
const {
return m_mgf; }
101 size_t padding_size()
const {
return m_padding_size; }
111 size_t m_padding_size;
121 static const std::map<std::string_view, RSA_CryptMechanism> CryptMechanisms = {
136 auto mechanism_info_it = CryptMechanisms.find(padding);
137 if(mechanism_info_it == CryptMechanisms.end()) {
139 throw Lookup_Error(
fmt(
"PKCS#11 RSA encrypt/decrypt does not support padding with '{}'", padding));
141 const RSA_CryptMechanism mechanism_info = mechanism_info_it->second;
145 mech.m_parameters = std::make_shared<MechanismParameters>();
146 mech.m_parameters->oaep_params.hashAlg =
static_cast<CK_MECHANISM_TYPE>(mechanism_info.hash());
149 mech.m_parameters->oaep_params.pSourceData =
nullptr;
150 mech.m_parameters->oaep_params.ulSourceDataLen = 0;
151 mech.m_mechanism.
pParameter = mech.m_parameters.get();
154 mech.m_padding_size = mechanism_info.padding_size();
160 static const std::map<std::string_view, RSA_SignMechanism> SignMechanisms = {
231 auto mechanism_info_it = SignMechanisms.find(padding);
232 if(mechanism_info_it == SignMechanisms.end()) {
234 throw Lookup_Error(
fmt(
"PKCS#11 RSA sign/verify does not support padding with '{}'", padding));
236 const RSA_SignMechanism mechanism_info = mechanism_info_it->second;
239 if(PssOptions().contains(mechanism_info.type())) {
240 mech.m_parameters = std::make_shared<MechanismParameters>();
241 mech.m_parameters->pss_params.hashAlg =
static_cast<CK_MECHANISM_TYPE>(mechanism_info.hash());
244 mech.m_mechanism.
pParameter = mech.m_parameters.get();
252 static const std::map<std::string_view, MechanismType> EcdsaHash = {{
"Raw",
MechanismType::Ecdsa},
259 const std::string hash_spec(hash_spec_view);
260 auto mechanism = EcdsaHash.find(hash_spec);
261 if(mechanism != EcdsaHash.end()) {
268 mechanism = EcdsaHash.find(req.
arg(0));
269 if(mechanism != EcdsaHash.end()) {
274 throw Lookup_Error(
fmt(
"PKCS #11 ECDSA sign/verify does not support {}", hash_spec));
279 static const std::map<std::string_view, KeyDerivation> EcdhHash = {{
"Raw",
KeyDerivation::Null},
286 const std::vector<std::string> param_parts =
split_on(params,
',');
288 if(param_parts.empty() || param_parts.size() > 2) {
293 bool use_cofactor =
false;
294 std::string kdf_name;
295 for(
const auto& part : param_parts) {
296 if(part ==
"Cofactor") {
302 if(!kdf_name.empty()) {
309 if(kdf_name.empty()) {
313 auto kdf = EcdhHash.find(kdf_name);
314 if(kdf == EcdhHash.end()) {
315 throw Lookup_Error(
"PKCS#11 ECDH key derivation does not support KDF " + kdf_name);
318 mech.m_parameters = std::make_shared<MechanismParameters>();
319 mech.m_parameters->ecdh_params.kdf =
static_cast<CK_EC_KDF_TYPE>(kdf->second);
320 mech.m_mechanism.
pParameter = mech.m_parameters.get();
static MechanismWrapper create_rsa_sign_mechanism(std::string_view padding)
static MechanismWrapper create_ecdh_mechanism(std::string_view params)
MechanismType mechanism_type() const
static MechanismWrapper create_rsa_crypt_mechanism(std::string_view padding)
static MechanismWrapper create_ecdsa_mechanism(std::string_view hash)
MechanismWrapper(MechanismType mechanism_type)
std::string arg(size_t i) const
const std::string & algo_name() const
CK_RSA_PKCS_OAEP_PARAMS RsaPkcsOaepParams
Ulong checked_ulong_cast(size_t v)
CK_ECDH1_DERIVE_PARAMS Ecdh1DeriveParams
CK_RSA_PKCS_PSS_PARAMS RsaPkcsPssParams
std::string fmt(std::string_view format, const T &... args)
std::vector< std::string > split_on(std::string_view str, char delim)
#define CKZ_DATA_SPECIFIED
CK_ULONG CK_RSA_PKCS_MGF_TYPE
CK_ULONG CK_MECHANISM_TYPE