11#include <botan/ed25519.h>
13#include <botan/hash.h>
15#include <botan/internal/ct_utils.h>
16#include <botan/internal/ed25519_internal.h>
24 sha512->update(seed, 32);
40 const uint8_t domain_sep[],
41 size_t domain_sep_len) {
48 sha512->update(sk, 32);
54 sha512->update(domain_sep, domain_sep_len);
55 sha512->update(az + 32, 32);
56 sha512->update(m, mlen);
62 sha512->update(domain_sep, domain_sep_len);
63 sha512->update(sig, 32);
64 sha512->update(sk + 32, 32);
65 sha512->update(m, mlen);
74 const uint8_t sig[64],
76 const uint8_t domain_sep[],
77 size_t domain_sep_len) {
78 if((sig[63] & 0xE0) != 0x00) {
82 const uint64_t CURVE25519_ORDER[4] = {
96 for(
size_t i = 0; i != 4; ++i) {
97 if(s[i] > CURVE25519_ORDER[i]) {
100 if(s[i] < CURVE25519_ORDER[i]) {
111 sha512->update(domain_sep, domain_sep_len);
112 sha512->update(sig, 32);
113 sha512->update(pk, 32);
114 sha512->update(m, mlen);
118 return signature_check(std::span<const uint8_t, 32>{pk, 32}, h, sig, sig + 32);
static std::unique_ptr< HashFunction > create_or_throw(std::string_view algo_spec, std::string_view provider="")
void ed25519_basepoint_mul(std::span< uint8_t, 32 > out, const uint8_t in[32])
constexpr void copy_mem(T *out, const T *in, size_t n)
void sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b, const uint8_t *c)
void ed25519_sign(uint8_t sig[64], const uint8_t m[], size_t mlen, const uint8_t sk[64], const uint8_t domain_sep[], size_t domain_sep_len)
bool signature_check(std::span< const uint8_t, 32 > pk, const uint8_t h[32], const uint8_t r[32], const uint8_t s[32])
void sc_reduce(uint8_t *s)
constexpr auto load_le(ParamTs &&... params)
void ed25519_gen_keypair(uint8_t pk[32], uint8_t sk[64], const uint8_t seed[32])
bool ed25519_verify(const uint8_t *m, size_t mlen, const uint8_t sig[64], const uint8_t *pk, const uint8_t domain_sep[], size_t domain_sep_len)