0
0
Fork 0
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:
Jason Volk 2017-10-03 03:57:18 -07:00
parent d7406d47cc
commit 234f7e34d7
2 changed files with 48 additions and 3 deletions

View file

@ -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

View file

@ -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())
};
}