9#include <botan/p11_ecc_key.h>
11#include <botan/pk_keys.h>
13#if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO)
15 #include <botan/ber_dec.h>
16 #include <botan/internal/ec_key_data.h>
17 #include <botan/internal/workfactor.h>
24EC_AffinePoint decode_public_point(
const EC_Group& group, std::span<const uint8_t> ec_point_data) {
25 std::vector<uint8_t> ec_point;
28 return EC_AffinePoint(group, ec_point);
33EC_PublicKeyGenerationProperties::EC_PublicKeyGenerationProperties(
const std::vector<uint8_t>& ec_params) :
34 PublicKeyProperties(
KeyType::
Ec), m_ec_params(ec_params) {
35 add_binary(AttributeType::EcParams, m_ec_params);
38EC_PublicKeyImportProperties::EC_PublicKeyImportProperties(
const std::vector<uint8_t>& ec_params,
39 const std::vector<uint8_t>& ec_point) :
40 PublicKeyProperties(
KeyType::
Ec), m_ec_params(ec_params), m_ec_point(ec_point) {
41 add_binary(AttributeType::EcParams, m_ec_params);
42 add_binary(AttributeType::EcPoint, m_ec_point);
45PKCS11_EC_PublicKey::PKCS11_EC_PublicKey(Session& session, ObjectHandle handle) : Object(session, handle) {
46 auto ec_parameters = get_attribute_value(AttributeType::EcParams);
47 auto pt_bytes = get_attribute_value(AttributeType::EcPoint);
49 EC_Group group(ec_parameters);
50 auto pt = decode_public_point(group, pt_bytes);
51 m_public_key = std::make_shared<EC_PublicKey_Data>(std::move(group), std::move(pt));
54PKCS11_EC_PublicKey::PKCS11_EC_PublicKey(Session& session,
const EC_PublicKeyImportProperties& props) :
55 Object(session, props) {
56 EC_Group group(props.ec_params());
57 auto pt = decode_public_point(group, props.ec_point());
58 m_public_key = std::make_shared<EC_PublicKey_Data>(std::move(group), std::move(pt));
61EC_PrivateKeyImportProperties::EC_PrivateKeyImportProperties(
const std::vector<uint8_t>& ec_params,
62 const BigInt& value) :
63 PrivateKeyProperties(
KeyType::
Ec), m_ec_params(ec_params), m_value(value) {
64 add_binary(AttributeType::EcParams, m_ec_params);
65 add_binary(AttributeType::Value, m_value.serialize());
68PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session, ObjectHandle handle) :
71PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session,
const EC_PrivateKeyImportProperties& props) :
72 Object(session, props), m_domain_params(EC_Group(props.ec_params())) {}
74PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session,
75 const std::vector<uint8_t>& ec_params,
76 const EC_PrivateKeyGenerationProperties& props) :
77 Object(session), m_domain_params(ec_params) {
78 EC_PublicKeyGenerationProperties pub_key_props(ec_params);
79 pub_key_props.set_verify(
true);
80 pub_key_props.set_private(
false);
81 pub_key_props.set_token(
false);
86 session.module()->C_GenerateKeyPair(session.handle(),
89 static_cast<Ulong>(pub_key_props.count()),
91 static_cast<Ulong>(props.count()),
95 this->reset_handle(priv_key_handle);
96 Object public_key(session, pub_key_handle);
98 auto pt_bytes = public_key.get_attribute_value(AttributeType::EcPoint);
99 m_public_key = decode_public_point(m_domain_params, pt_bytes);
102size_t PKCS11_EC_PrivateKey::key_length()
const {
103 return m_domain_params.get_order_bits();
106std::vector<uint8_t> PKCS11_EC_PrivateKey::raw_public_key_bits()
const {
107 return public_ec_point().serialize_compressed();
110std::vector<uint8_t> PKCS11_EC_PrivateKey::public_key_bits()
const {
111 return raw_public_key_bits();
114size_t PKCS11_EC_PrivateKey::estimated_strength()
const {
118bool PKCS11_EC_PrivateKey::check_key(RandomNumberGenerator& ,
bool )
const {
122AlgorithmIdentifier PKCS11_EC_PrivateKey::algorithm_identifier()
const {
123 return AlgorithmIdentifier(object_identifier(), domain().DER_encode());
CK_OBJECT_HANDLE ObjectHandle
size_t ecp_work_factor(size_t bits)
#define CK_INVALID_HANDLE
#define CKM_EC_KEY_PAIR_GEN