8#include <botan/curve25519.h>
9#include <botan/internal/pk_ops_impl.h>
10#include <botan/ber_dec.h>
11#include <botan/der_enc.h>
18 const uint8_t basepoint[32] = { 9 };
24void size_check(
size_t size,
const char* thing)
27 throw Decoding_Error(
"Invalid size " +
std::to_string(size) +
" for Curve25519 " + thing);
30secure_vector<uint8_t> curve25519(
const secure_vector<uint8_t>& secret,
31 const uint8_t pubval[32])
33 secure_vector<uint8_t> out(32);
51 const std::vector<uint8_t>& key_bits)
55 size_check(
m_public.size(),
"public key");
65 if(secret_key.size() != 32)
69 m_private = secret_key;
85 size_check(m_private.size(),
"private key");
92 return std::make_unique<Curve25519_PublicKey>(
public_value());
102 std::vector<uint8_t> public_point(32);
109 size_check(w_len,
"public value");
110 return curve25519(m_private, w);
123 PK_Ops::Key_Agreement_with_KDF(kdf),
126 size_t agreed_value_size()
const override {
return 32; }
128 secure_vector<uint8_t> raw_agree(
const uint8_t w[],
size_t w_len)
override
130 return m_key.agree(w, w_len);
133 const Curve25519_PrivateKey& m_key;
138std::unique_ptr<PK_Ops::Key_Agreement>
140 const std::string& params,
141 const std::string& provider)
const
143 if(provider ==
"base" || provider.empty())
144 return std::make_unique<Curve25519_KA_Operation>(*
this, params);
BER_Decoder & decode(bool &out)
BER_Decoder & discard_remaining()
std::unique_ptr< Public_Key > public_key() const override
std::vector< uint8_t > public_value() const override
secure_vector< uint8_t > private_key_bits() const override
secure_vector< uint8_t > agree(const uint8_t w[], size_t w_len) const
std::unique_ptr< PK_Ops::Key_Agreement > create_key_agreement_op(RandomNumberGenerator &rng, const std::string ¶ms, const std::string &provider) const override
Curve25519_PrivateKey(const AlgorithmIdentifier &alg_id, const secure_vector< uint8_t > &key_bits)
bool check_key(RandomNumberGenerator &rng, bool strong) const override
std::vector< uint8_t > public_key_bits() const override
std::vector< uint8_t > m_public
bool check_key(RandomNumberGenerator &rng, bool strong) const override
Curve25519_PublicKey()=default
AlgorithmIdentifier algorithm_identifier() const override
std::string algo_name() const override
secure_vector< uint8_t > get_contents()
DER_Encoder & encode(bool b)
virtual OID get_oid() const
secure_vector< uint8_t > random_vec(size_t bytes)
int(* final)(unsigned char *, CTX *)
std::string to_string(const BER_Object &obj)
void curve25519_donna(uint8_t mypublic[32], const uint8_t secret[32], const uint8_t basepoint[32])
void curve25519_basepoint(uint8_t mypublic[32], const uint8_t secret[32])
std::vector< T, secure_allocator< T > > secure_vector