9 #include <botan/p11_ecc_key.h>
11 #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO)
13 #include <botan/workfactor.h>
14 #include <botan/ber_dec.h>
20 PointGFp decode_public_point(
const secure_vector<uint8_t>& ec_point_data,
const CurveGFp& curve)
22 secure_vector<uint8_t> ec_point;
23 BER_Decoder(ec_point_data).decode(ec_point,
OCTET_STRING);
24 return OS2ECP(ec_point, curve);
28 EC_PublicKeyGenerationProperties::EC_PublicKeyGenerationProperties(
const std::vector<uint8_t>& ec_params)
29 : PublicKeyProperties(
KeyType::
Ec), m_ec_params(ec_params)
34 EC_PublicKeyImportProperties::EC_PublicKeyImportProperties(
const std::vector<uint8_t>& ec_params,
35 const std::vector<uint8_t>& ec_point)
36 : PublicKeyProperties(
KeyType::
Ec), m_ec_params(ec_params), m_ec_point(ec_point)
42 PKCS11_EC_PublicKey::PKCS11_EC_PublicKey(Session& session,
ObjectHandle handle)
43 : Object(session, handle)
46 m_domain_params = EC_Group(
unlock(ec_parameters));
47 m_public_key = decode_public_point(get_attribute_value(
AttributeType::EcPoint), m_domain_params.get_curve());
51 PKCS11_EC_PublicKey::PKCS11_EC_PublicKey(Session& session,
const EC_PublicKeyImportProperties& props)
52 : Object(session, props)
54 m_domain_params = EC_Group(props.ec_params());
56 secure_vector<uint8_t> ec_point;
58 m_public_key =
OS2ECP(ec_point, m_domain_params.get_curve());
62 EC_PrivateKeyImportProperties::EC_PrivateKeyImportProperties(
const std::vector<uint8_t>& ec_params,
const BigInt& value)
63 : PrivateKeyProperties(
KeyType::
Ec), m_ec_params(ec_params), m_value(value)
69 PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session,
ObjectHandle handle)
70 : Object(session, handle), m_domain_params(), m_public_key()
73 m_domain_params = EC_Group(
unlock(ec_parameters));
76 PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session,
const EC_PrivateKeyImportProperties& props)
77 : Object(session, props)
79 m_domain_params = EC_Group(props.ec_params());
82 PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session,
const std::vector<uint8_t>& ec_params,
83 const EC_PrivateKeyGenerationProperties& props)
86 m_domain_params = EC_Group(ec_params);
88 EC_PublicKeyGenerationProperties pub_key_props(ec_params);
89 pub_key_props.set_verify(
true);
90 pub_key_props.set_private(
false);
91 pub_key_props.set_token(
false);
96 session.module()->C_GenerateKeyPair(session.handle(), &mechanism,
97 pub_key_props.data(), pub_key_props.count(), props.data(), props.count(),
100 Object public_key(session, pub_key_handle);
101 m_public_key = decode_public_point(public_key.get_attribute_value(
AttributeType::EcPoint), m_domain_params.get_curve());
104 size_t PKCS11_EC_PrivateKey::key_length()
const
106 return m_domain_params.get_order().bits();
109 std::vector<uint8_t> PKCS11_EC_PrivateKey::public_key_bits()
const
114 size_t PKCS11_EC_PrivateKey::estimated_strength()
const
119 bool PKCS11_EC_PrivateKey::check_key(RandomNumberGenerator&,
bool)
const
121 return m_public_key.on_the_curve();
124 AlgorithmIdentifier PKCS11_EC_PrivateKey::algorithm_identifier()
const
secure_vector< uint8_t > decode(DataSource &source, std::string &label)
secure_vector< uint8_t > EC2OSP(const PointGFp &point, uint8_t format)
size_t ecp_work_factor(size_t bits)
PointGFp OS2ECP(const uint8_t data[], size_t data_len, const CurveGFp &curve)
#define CKM_EC_KEY_PAIR_GEN
CK_OBJECT_HANDLE ObjectHandle
std::vector< T > unlock(const secure_vector< T > &in)
static std::vector< uint8_t > encode(const BigInt &n, Base base=Binary)