Botan 3.3.0
Crypto and TLS for C&
Public Member Functions | List of all members
Botan::ECIES_KA_Operation Class Reference

#include <ecies.h>

Public Member Functions

SymmetricKey derive_secret (const std::vector< uint8_t > &eph_public_key_bin, const EC_Point &other_public_key_point) const
 
 ECIES_KA_Operation (const PK_Key_Agreement_Key &private_key, const ECIES_KA_Params &ecies_params, bool for_encryption, RandomNumberGenerator &rng)
 

Detailed Description

ECIES secret derivation according to ISO 18033-2

Definition at line 166 of file ecies.h.

Constructor & Destructor Documentation

◆ ECIES_KA_Operation()

Botan::ECIES_KA_Operation::ECIES_KA_Operation ( const PK_Key_Agreement_Key & private_key,
const ECIES_KA_Params & ecies_params,
bool for_encryption,
RandomNumberGenerator & rng )
Parameters
private_keythe (ephemeral) private key which is used to derive the secret
ecies_paramssettings for ecies
for_encryptiondisable cofactor mode if the secret will be used for encryption (according to ISO 18033 cofactor mode is only used during decryption)
rngthe RNG to use

Definition at line 126 of file ecies.cpp.

129 :
130 m_ka(create_key_agreement(private_key, ecies_params, for_encryption, rng)), m_params(ecies_params) {}

Member Function Documentation

◆ derive_secret()

SymmetricKey Botan::ECIES_KA_Operation::derive_secret ( const std::vector< uint8_t > & eph_public_key_bin,
const EC_Point & other_public_key_point ) const

Performs a key agreement with the provided keys and derives the secret from the result

Parameters
eph_public_key_binthe encoded (ephemeral) public key which belongs to the used (ephemeral) private key
other_public_key_pointpublic key point of the other party

ECIES secret derivation according to ISO 18033-2

Definition at line 135 of file ecies.cpp.

136 {
137 if(other_public_key_point.is_zero()) {
138 throw Invalid_Argument("ECIES: other public key point is zero");
139 }
140
141 auto kdf = KDF::create_or_throw(m_params.kdf_spec());
142
143 EC_Point other_point = other_public_key_point;
144
145 // ISO 18033: step b
146 if(m_params.old_cofactor_mode()) {
147 other_point *= m_params.domain().get_cofactor();
148 }
149
150 secure_vector<uint8_t> derivation_input;
151
152 // ISO 18033: encryption step e / decryption step g
153 if(!m_params.single_hash_mode()) {
154 derivation_input += eph_public_key_bin;
155 }
156
157 // ISO 18033: encryption step f / decryption step h
158 std::vector<uint8_t> other_public_key_bin = other_point.encode(m_params.compression_type());
159 // Note: the argument `m_params.secret_length()` passed for `key_len` will only be used by providers because
160 // "Raw" is passed to the `PK_Key_Agreement` if the implementation of botan is used.
161 const SymmetricKey peh =
162 m_ka.derive_key(m_params.domain().get_order().bytes(), other_public_key_bin.data(), other_public_key_bin.size());
163 derivation_input.insert(derivation_input.end(), peh.begin(), peh.end());
164
165 // ISO 18033: encryption step g / decryption step i
166 return SymmetricKey(kdf->derive_key(m_params.secret_length(), derivation_input));
167}
static std::vector< uint8_t > encode(const BigInt &n)
Definition bigint.h:749
size_t bytes() const
Definition bigint.cpp:277
size_t secret_length() const
Definition ecies.h:78
bool old_cofactor_mode() const
Definition ecies.h:86
EC_Point_Format compression_type() const
Definition ecies.h:92
bool single_hash_mode() const
Definition ecies.h:80
const std::string & kdf_spec() const
Definition ecies.h:94
const EC_Group & domain() const
Definition ecies.h:76
const BigInt & get_cofactor() const
Definition ec_group.cpp:520
const BigInt & get_order() const
Definition ec_group.cpp:508
static std::unique_ptr< KDF > create_or_throw(std::string_view algo_spec, std::string_view provider="")
Definition kdf.cpp:193
SymmetricKey derive_key(size_t key_len, const uint8_t in[], size_t in_len, const uint8_t params[], size_t params_len) const
Definition pubkey.cpp:231
OctetString SymmetricKey
Definition symkey.h:141

References Botan::OctetString::begin(), Botan::BigInt::bytes(), Botan::ECIES_KA_Params::compression_type(), Botan::KDF::create_or_throw(), Botan::PK_Key_Agreement::derive_key(), Botan::ECIES_KA_Params::domain(), Botan::EC_Point::encode(), Botan::OctetString::end(), Botan::EC_Group::get_cofactor(), Botan::EC_Group::get_order(), Botan::EC_Point::is_zero(), Botan::ECIES_KA_Params::kdf_spec(), Botan::ECIES_KA_Params::old_cofactor_mode(), Botan::ECIES_KA_Params::secret_length(), and Botan::ECIES_KA_Params::single_hash_mode().


The documentation for this class was generated from the following files: