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> 
   19using PSS_Params = std::tuple<size_t, MechanismType, MGF>;
 
   22const std::map<MechanismType, PSS_Params>& PssOptions() {
 
   23   static const std::map<MechanismType, PSS_Params> pss_options = {
 
   38      MechanismData(
const MechanismData& other) = 
default;
 
   39      MechanismData(MechanismData&& other) = 
default;
 
   41      MechanismData& operator=(
const MechanismData& other) = 
default;
 
   42      MechanismData& operator=(MechanismData&& other) = 
default;
 
   44      virtual ~MechanismData() = 
default;
 
   53class RSA_SignMechanism final : 
public MechanismData {
 
   57         auto pss_option = PssOptions().find(type());
 
   58         if(pss_option != PssOptions().end()) {
 
   59            m_hash = std::get<1>(pss_option->second);
 
   60            m_mgf = std::get<2>(pss_option->second);
 
   61            m_salt_size = std::get<0>(pss_option->second);
 
   67      MGF mgf()
 const { 
return m_mgf; }
 
   69      size_t salt_size()
 const { 
return m_salt_size; }
 
   88struct RSA_CryptMechanism final : 
public MechanismData {
 
   91            MechanismData(typ), m_hash(hash), m_mgf(mgf), m_padding_size(padding_size) {}
 
   98      MGF mgf()
 const { 
return m_mgf; }
 
  100      size_t padding_size()
 const { 
return m_padding_size; }
 
  110      size_t m_padding_size;
 
  120   static const std::map<std::string_view, RSA_CryptMechanism> CryptMechanisms = {
 
  135   auto mechanism_info_it = CryptMechanisms.find(padding);
 
  136   if(mechanism_info_it == CryptMechanisms.end()) {
 
  138      throw Lookup_Error(
fmt(
"PKCS#11 RSA encrypt/decrypt does not support padding with '{}'", padding));
 
  140   RSA_CryptMechanism mechanism_info = mechanism_info_it->second;
 
  144      mech.m_parameters = std::make_shared<MechanismParameters>();
 
  145      mech.m_parameters->oaep_params.hashAlg = 
static_cast<CK_MECHANISM_TYPE>(mechanism_info.hash());
 
  148      mech.m_parameters->oaep_params.pSourceData = 
nullptr;
 
  149      mech.m_parameters->oaep_params.ulSourceDataLen = 0;
 
  150      mech.m_mechanism.
pParameter = mech.m_parameters.get();
 
  153   mech.m_padding_size = mechanism_info.padding_size();
 
 
  159   static const std::map<std::string_view, RSA_SignMechanism> SignMechanisms = {
 
  230   auto mechanism_info_it = SignMechanisms.find(padding);
 
  231   if(mechanism_info_it == SignMechanisms.end()) {
 
  233      throw Lookup_Error(
fmt(
"PKCS#11 RSA sign/verify does not support padding with '{}'", padding));
 
  235   RSA_SignMechanism mechanism_info = mechanism_info_it->second;
 
  238   if(PssOptions().contains(mechanism_info.type())) {
 
  239      mech.m_parameters = std::make_shared<MechanismParameters>();
 
  240      mech.m_parameters->pss_params.hashAlg = 
static_cast<CK_MECHANISM_TYPE>(mechanism_info.hash());
 
  242      mech.m_parameters->pss_params.sLen = 
static_cast<Ulong>(mechanism_info.salt_size());
 
  243      mech.m_mechanism.
pParameter = mech.m_parameters.get();
 
 
  251   static const std::map<std::string_view, MechanismType> EcdsaHash = {{
"Raw", 
MechanismType::Ecdsa},
 
  258   const std::string hash_spec(hash_spec_view);
 
  259   auto mechanism = EcdsaHash.find(hash_spec);
 
  260   if(mechanism != EcdsaHash.end()) {
 
  267      mechanism = EcdsaHash.find(req.
arg(0));
 
  268      if(mechanism != EcdsaHash.end()) {
 
  273   throw Lookup_Error(
fmt(
"PKCS #11 ECDSA sign/verify does not support {}", hash_spec));
 
 
  278   static const std::map<std::string_view, KeyDerivation> EcdhHash = {{
"Raw", 
KeyDerivation::Null},
 
  285   std::vector<std::string> param_parts = 
split_on(params, 
',');
 
  287   if(param_parts.empty() || param_parts.size() > 2) {
 
  291   const bool use_cofactor =
 
  292      (param_parts[0] == 
"Cofactor") || (param_parts.size() == 2 && param_parts[1] == 
"Cofactor");
 
  294   std::string kdf_name = (param_parts[0] == 
"Cofactor" ? param_parts[1] : param_parts[0]);
 
  295   std::string hash = kdf_name;
 
  297   if(kdf_name != 
"Raw") {
 
  301         hash = kdf_hash.
arg(0);
 
  305   auto kdf = EcdhHash.find(hash);
 
  306   if(kdf == EcdhHash.end()) {
 
  307      throw Lookup_Error(
"PKCS#11 ECDH key derivation does not support KDF " + kdf_name);
 
  310   mech.m_parameters = std::make_shared<MechanismParameters>();
 
  311   mech.m_parameters->ecdh_params.kdf = 
static_cast<CK_EC_KDF_TYPE>(kdf->second);
 
  312   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
 
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