9#include <botan/p11_ecc_key.h>
10#include <botan/pk_keys.h>
12#if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO)
14#include <botan/workfactor.h>
15#include <botan/ber_dec.h>
21PointGFp decode_public_point(
const secure_vector<uint8_t>& ec_point_data,
const EC_Group& group)
23 secure_vector<uint8_t> ec_point;
24 BER_Decoder(ec_point_data).decode(ec_point,
OCTET_STRING);
25 return group.OS2ECP(ec_point);
29EC_PublicKeyGenerationProperties::EC_PublicKeyGenerationProperties(
const std::vector<uint8_t>& ec_params)
30 : PublicKeyProperties(
KeyType::
Ec), m_ec_params(ec_params)
32 add_binary(AttributeType::EcParams, m_ec_params);
35EC_PublicKeyImportProperties::EC_PublicKeyImportProperties(
const std::vector<uint8_t>& ec_params,
36 const std::vector<uint8_t>& ec_point)
37 : PublicKeyProperties(
KeyType::
Ec), m_ec_params(ec_params), m_ec_point(ec_point)
39 add_binary(AttributeType::EcParams, m_ec_params);
40 add_binary(AttributeType::EcPoint, m_ec_point);
43PKCS11_EC_PublicKey::PKCS11_EC_PublicKey(Session& session, ObjectHandle handle)
44 : Object(session, handle)
46 secure_vector<uint8_t> ec_parameters = get_attribute_value(AttributeType::EcParams);
47 m_domain_params = EC_Group(
unlock(ec_parameters));
48 m_public_key = decode_public_point(get_attribute_value(AttributeType::EcPoint), m_domain_params);
52PKCS11_EC_PublicKey::PKCS11_EC_PublicKey(Session& session,
const EC_PublicKeyImportProperties& props)
53 : Object(session, props)
55 m_domain_params = EC_Group(props.ec_params());
57 secure_vector<uint8_t> ec_point;
58 BER_Decoder(props.ec_point()).decode(ec_point, OCTET_STRING);
59 m_public_key = m_domain_params.OS2ECP(ec_point);
63EC_PrivateKeyImportProperties::EC_PrivateKeyImportProperties(
const std::vector<uint8_t>& ec_params,
const BigInt& value)
64 : PrivateKeyProperties(
KeyType::
Ec), m_ec_params(ec_params), m_value(value)
66 add_binary(AttributeType::EcParams, m_ec_params);
67 add_binary(AttributeType::Value, BigInt::encode(m_value));
70PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session, ObjectHandle handle)
71 : Object(session, handle), m_domain_params(), m_public_key()
73 secure_vector<uint8_t> ec_parameters = get_attribute_value(AttributeType::EcParams);
74 m_domain_params = EC_Group(
unlock(ec_parameters));
77PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session,
const EC_PrivateKeyImportProperties& props)
78 : Object(session, props)
80 m_domain_params = EC_Group(props.ec_params());
83PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session,
const std::vector<uint8_t>& ec_params,
84 const EC_PrivateKeyGenerationProperties& props)
87 m_domain_params = EC_Group(ec_params);
89 EC_PublicKeyGenerationProperties pub_key_props(ec_params);
90 pub_key_props.set_verify(
true);
91 pub_key_props.set_private(
false);
92 pub_key_props.set_token(
false);
97 session.module()->C_GenerateKeyPair(session.handle(), &mechanism,
98 pub_key_props.data(),
static_cast<Ulong>(pub_key_props.count()),
99 props.data(),
static_cast<Ulong>(props.count()),
100 &pub_key_handle, &priv_key_handle);
102 this->reset_handle(priv_key_handle);
104 Object public_key(session, pub_key_handle);
105 m_public_key = decode_public_point(public_key.get_attribute_value(AttributeType::EcPoint), m_domain_params);
108size_t PKCS11_EC_PrivateKey::key_length()
const
110 return m_domain_params.get_order().bits();
113std::vector<uint8_t> PKCS11_EC_PrivateKey::public_key_bits()
const
115 return public_point().encode(PointGFp::COMPRESSED);
118size_t PKCS11_EC_PrivateKey::estimated_strength()
const
123bool PKCS11_EC_PrivateKey::check_key(RandomNumberGenerator&,
bool)
const
125 return m_public_key.on_the_curve();
128AlgorithmIdentifier PKCS11_EC_PrivateKey::algorithm_identifier()
const
130 return AlgorithmIdentifier(get_oid(), domain().DER_encode(EC_DOMPAR_ENC_EXPLICIT));
CK_OBJECT_HANDLE ObjectHandle
size_t ecp_work_factor(size_t bits)
std::vector< T > unlock(const secure_vector< T > &in)
#define CK_INVALID_HANDLE
#define CKM_EC_KEY_PAIR_GEN