Adding seed derivation functions.

This commit is contained in:
clemahieu 2017-12-18 22:24:19 -06:00
commit c55c1bc90f
6 changed files with 62 additions and 31 deletions

View file

@ -23,7 +23,7 @@ void xrb_uint512_to_string (xrb_uint512 source, char * destination)
strncpy (destination, number.to_string ().c_str (), 129);
}
int xrb_uint256_from_string (char * source, xrb_uint256 destination)
int xrb_uint256_from_string (const char * source, xrb_uint256 destination)
{
auto & number (*reinterpret_cast <rai::uint256_union *> (destination));
auto error (number.decode_hex (source));
@ -31,7 +31,7 @@ int xrb_uint256_from_string (char * source, xrb_uint256 destination)
return result;
}
int xrb_uint512_from_string (char * source, xrb_uint512 destination)
int xrb_uint512_from_string (const char * source, xrb_uint512 destination)
{
auto & number (*reinterpret_cast <rai::uint512_union *> (destination));
auto error (number.decode_hex (source));
@ -39,7 +39,7 @@ int xrb_uint512_from_string (char * source, xrb_uint512 destination)
return result;
}
int xrb_valid_address (char * account_a)
int xrb_valid_address (const char * account_a)
{
rai::uint256_union account;
auto error (account.decode_account (account_a));
@ -47,7 +47,25 @@ int xrb_valid_address (char * account_a)
return result;
}
char * sign_transaction (char * transaction, xrb_uint256 private_key, xrb_uint512 signature)
void xrb_seed_create (xrb_uint256 seed)
{
auto & number (*reinterpret_cast <rai::uint256_union *> (seed));
rai::random_pool.GenerateBlock (number.bytes.data (), number.bytes.size ());
}
void xrb_seed_key (xrb_uint256 seed, int index, xrb_uint256 destination)
{
auto & seed_l (*reinterpret_cast <rai::uint256_union *> (seed));
auto & destination_l (*reinterpret_cast <rai::uint256_union *> (destination));
rai::deterministic_key (seed_l, index, destination_l);
}
void xrb_key_account (const xrb_uint256 key, xrb_uint256 pub)
{
ed25519_publickey (key, pub);
}
char * sign_transaction (const char * transaction, const xrb_uint256 private_key, xrb_uint512 signature)
{
return nullptr;
}

View file

@ -5,28 +5,35 @@
extern "C" {
#endif
typedef char * xrb_uint256; // 32byte array for public and private keys
typedef char * xrb_uint512; // 64byte array for signatures
typedef unsigned char * xrb_uint256; // 32byte array for public and private keys
typedef unsigned char * xrb_uint512; // 64byte array for signatures
typedef void * xrb_transaction;
// Convert public/private key bytes 'source' to a 64 byte not-null-terminated hex string 'destination'
void xrb_uint256_to_string (xrb_uint256 source, char * destination);
void xrb_uint256_to_string (const xrb_uint256 source, char * destination);
// Convert public/private key bytes 'source' to a 128 byte not-null-terminated hex string 'destination'
void xrb_uint512_to_string (xrb_uint512 source, char * destination);
void xrb_uint512_to_string (const xrb_uint512 source, char * destination);
// Convert 64 byte hex string 'source' to a byte array 'destination'
// Return 0 on success, nonzero on error
int xrb_uint256_from_string (char * source, xrb_uint256 destination);
int xrb_uint256_from_string (const char * source, xrb_uint256 destination);
// Convert 128 byte hex string 'source' to a byte array 'destination'
// Return 0 on success, nonzero on error
int xrb_uint512_from_string (char * source, xrb_uint512 destination);
int xrb_uint512_from_string (const char * source, xrb_uint512 destination);
// Check if the null-terminated string 'account' is a valid xrb account number
// Return 0 on correct, nonzero on invalid
int xrb_valid_address (char * account);
int xrb_valid_address (const char * account);
// Create a new random seed in 'seed'
void xrb_seed_create (xrb_uint256 seed);
// Retrieve the detereministic private key for 'seed' at 'index'
void xrb_seed_key (const xrb_uint256 seed, int index, xrb_uint256);
// Derive the public key 'pub' from 'key'
void xrb_key_account (xrb_uint256 key, xrb_uint256 pub);
// Sign 'transaction' using 'private_key' and write to 'signature'
char * sign_transaction (char * transaction, xrb_uint256 private_key, xrb_uint512 signature);
char * sign_transaction (const char * transaction, const xrb_uint256 private_key, xrb_uint512 signature);
#if __cplusplus
} // extern "C"

View file

@ -256,12 +256,7 @@ void rai::wallet_store::deterministic_key (rai::raw_key & prv_a, MDB_txn * trans
assert (valid_password (transaction_a));
rai::raw_key seed_l;
seed (seed_l, transaction_a);
blake2b_state hash;
blake2b_init (&hash, prv_a.data.bytes.size ());
blake2b_update (&hash, seed_l.data.bytes.data (), seed_l.data.bytes.size ());
rai::uint256_union index (index_a);
blake2b_update (&hash, reinterpret_cast <uint8_t *> (&index.dwords [7]), sizeof (uint32_t));
blake2b_final (&hash, prv_a.data.bytes.data (), prv_a.data.bytes.size ());
rai::deterministic_key (seed_l.data, index_a, prv_a.data);
}
uint32_t rai::wallet_store::deterministic_index_get (MDB_txn * transaction_a)

View file

@ -439,3 +439,26 @@ void rai::raw_key::decrypt (rai::uint256_union const & ciphertext, rai::raw_key
dec.ProcessData (data.bytes.data (), ciphertext.bytes.data (), sizeof (ciphertext.bytes));
}
rai::uint512_union rai::sign_message (rai::raw_key const & private_key, rai::public_key const & public_key, rai::uint256_union const & message)
{
rai::uint512_union result;
ed25519_sign (message.bytes.data (), sizeof (message.bytes), private_key.data.bytes.data (), public_key.bytes.data (), result.bytes.data ());
return result;
}
void rai::deterministic_key (rai::uint256_union const & seed_a, uint32_t index_a, rai::uint256_union & prv_a)
{
blake2b_state hash;
blake2b_init (&hash, prv_a.bytes.size ());
blake2b_update (&hash, seed_a.bytes.data (), seed_a.bytes.size ());
rai::uint256_union index (index_a);
blake2b_update (&hash, reinterpret_cast <uint8_t *> (&index.dwords [7]), sizeof (uint32_t));
blake2b_final (&hash, prv_a.bytes.data (), prv_a.bytes.size ());
}
bool rai::validate_message (rai::public_key const & public_key, rai::uint256_union const & message, rai::uint512_union const & signature)
{
auto result (0 != ed25519_sign_open (message.bytes.data (), sizeof (message.bytes), public_key.bytes.data (), signature.bytes.data ()));
return result;
}

View file

@ -121,6 +121,7 @@ using signature = uint512_union;
rai::uint512_union sign_message (rai::raw_key const &, rai::public_key const &, rai::uint256_union const &);
bool validate_message (rai::public_key const &, rai::uint256_union const &, rai::uint512_union const &);
void deterministic_key (rai::uint256_union const &, uint32_t, rai::uint256_union &);
}
namespace std

View file

@ -305,19 +305,6 @@ std::string rai::uint128_union::to_string_dec () const
return result;
}
rai::uint512_union rai::sign_message (rai::raw_key const & private_key, rai::public_key const & public_key, rai::uint256_union const & message)
{
rai::uint512_union result;
ed25519_sign (message.bytes.data (), sizeof (message.bytes), private_key.data.bytes.data (), public_key.bytes.data (), result.bytes.data ());
return result;
}
bool rai::validate_message (rai::public_key const & public_key, rai::uint256_union const & message, rai::uint512_union const & signature)
{
auto result (0 != ed25519_sign_open (message.bytes.data (), sizeof (message.bytes), public_key.bytes.data (), signature.bytes.data ()));
return result;
}
void rai::open_or_create (std::fstream & stream_a, std::string const & path_a)
{
stream_a.open (path_a, std::ios_base::in);