8#include <botan/curve25519.h>
10#include <botan/ber_dec.h>
11#include <botan/der_enc.h>
13#include <botan/internal/fmt.h>
14#include <botan/internal/pk_ops_impl.h>
19 const uint8_t basepoint[32] = {9};
25void size_check(
size_t size,
const char* thing) {
27 throw Decoding_Error(
fmt(
"Invalid size {} for Curve2551 {}", size, thing));
31secure_vector<uint8_t> curve25519(
const secure_vector<uint8_t>& secret,
const uint8_t pubval[32]) {
32 secure_vector<uint8_t> out(32);
48 m_public.assign(key_bits.begin(), key_bits.end());
50 size_check(
m_public.size(),
"public key");
58 return std::make_unique<Curve25519_PrivateKey>(rng);
62 if(secret_key.size() != 32) {
67 m_private = secret_key;
80 size_check(m_private.size(),
"private key");
86 return std::make_unique<Curve25519_PublicKey>(
public_value());
94 std::vector<uint8_t> public_point(32);
100 size_check(w_len,
"public value");
101 return curve25519(m_private, w);
112 PK_Ops::Key_Agreement_with_KDF(kdf), m_key(key) {}
114 size_t agreed_value_size()
const override {
return 32; }
116 secure_vector<uint8_t> raw_agree(
const uint8_t w[],
size_t w_len)
override {
return m_key.agree(w, w_len); }
119 const Curve25519_PrivateKey& m_key;
125 std::string_view params,
126 std::string_view provider)
const {
127 if(provider ==
"base" || provider.empty()) {
128 return std::make_unique<Curve25519_KA_Operation>(*
this, params);
virtual OID object_identifier() const
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, std::string_view params, std::string_view provider) const override
Curve25519_PrivateKey(const AlgorithmIdentifier &alg_id, std::span< const 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
std::unique_ptr< Private_Key > generate_another(RandomNumberGenerator &rng) const final
secure_vector< uint8_t > get_contents()
DER_Encoder & encode(bool b)
void random_vec(std::span< uint8_t > v)
int(* final)(unsigned char *, CTX *)
std::string fmt(std::string_view format, const T &... args)
void curve25519_donna(uint8_t mypublic[32], const uint8_t secret[32], const uint8_t basepoint[32])
std::vector< T, secure_allocator< T > > secure_vector
void curve25519_basepoint(uint8_t mypublic[32], const uint8_t secret[32])