mirror of
https://github.com/matrix-construct/construct
synced 2024-06-02 10:08:56 +02:00
ircd::ed25519: Add filesystem related for sk; add seed constructor; various.
This commit is contained in:
parent
d7406d47cc
commit
234f7e34d7
|
@ -27,8 +27,10 @@
|
|||
|
||||
namespace ircd::ed25519
|
||||
{
|
||||
const size_t SK_SZ { 32 + 32 };
|
||||
const size_t PK_SZ { 32 };
|
||||
const size_t SIG_SZ { 64 };
|
||||
const size_t SEED_SZ { 32 };
|
||||
|
||||
struct pk;
|
||||
struct sk;
|
||||
|
@ -42,7 +44,9 @@ class ircd::ed25519::sk
|
|||
public:
|
||||
sig sign(const const_raw_buffer &msg) const;
|
||||
|
||||
sk(const string_view &filename, pk *const & = nullptr);
|
||||
sk(const std::string &filename, pk *const & = nullptr);
|
||||
sk(pk *const &, const const_raw_buffer &seed);
|
||||
sk(): key{nullptr, std::free} {}
|
||||
};
|
||||
|
||||
struct ircd::ed25519::pk
|
||||
|
@ -53,6 +57,7 @@ struct ircd::ed25519::pk
|
|||
bool verify(const const_raw_buffer &msg, const sig &) const;
|
||||
|
||||
using array_type::array_type;
|
||||
pk(): array_type{0} {}
|
||||
};
|
||||
|
||||
struct ircd::ed25519::sig
|
||||
|
|
|
@ -74,9 +74,31 @@ ircd::buffer::zero(const mutable_raw_buffer &buf)
|
|||
// ircd/ed25519
|
||||
//
|
||||
|
||||
static_assert(ircd::ed25519::SK_SZ == crypto_sign_ed25519_SECRETKEYBYTES);
|
||||
static_assert(ircd::ed25519::PK_SZ == crypto_sign_ed25519_PUBLICKEYBYTES);
|
||||
|
||||
ircd::ed25519::sk::sk(const string_view &filename,
|
||||
ircd::ed25519::sk::sk(pk *const &pk_arg,
|
||||
const const_raw_buffer &seed)
|
||||
:key
|
||||
{
|
||||
reinterpret_cast<uint8_t *>(::sodium_malloc(crypto_sign_ed25519_SECRETKEYBYTES)),
|
||||
&::sodium_free
|
||||
}
|
||||
{
|
||||
assert(size(seed) >= SEED_SZ);
|
||||
|
||||
pk discard, &pk
|
||||
{
|
||||
pk_arg? *pk_arg : discard
|
||||
};
|
||||
|
||||
throw_on_error
|
||||
{
|
||||
::crypto_sign_ed25519_seed_keypair(pk.data(), key.get(), data(seed))
|
||||
};
|
||||
}
|
||||
|
||||
ircd::ed25519::sk::sk(const std::string &filename,
|
||||
pk *const &pk_arg)
|
||||
:key
|
||||
{
|
||||
|
@ -89,9 +111,27 @@ ircd::ed25519::sk::sk(const string_view &filename,
|
|||
pk_arg? *pk_arg : discard
|
||||
};
|
||||
|
||||
const auto existing
|
||||
{
|
||||
fs::read(filename, mutable_raw_buffer{key.get(), SK_SZ})
|
||||
};
|
||||
|
||||
if(!existing)
|
||||
{
|
||||
if(fs::exists(filename))
|
||||
throw error("Failed to read existing ed25519 secret key in: %s", filename);
|
||||
|
||||
throw_on_error
|
||||
{
|
||||
::crypto_sign_ed25519_keypair(pk.data(), key.get())
|
||||
};
|
||||
|
||||
fs::write(filename, const_raw_buffer{key.get(), SK_SZ});
|
||||
}
|
||||
|
||||
throw_on_error
|
||||
{
|
||||
::crypto_sign_ed25519_keypair(pk.data(), key.get())
|
||||
::crypto_sign_ed25519_sk_to_pk(pk.data(), key.get())
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue