36 #include <boost/optional.hpp>
37 #include <type_traits>
38 #include <boost/thread/mutex.hpp>
39 #include <boost/thread/lock_guard.hpp>
40 #include <boost/archive/iterators/binary_from_base64.hpp>
41 #include <boost/archive/iterators/base64_from_binary.hpp>
42 #include <boost/archive/iterators/transform_width.hpp>
43 #include <boost/algorithm/string.hpp>
44 #include <boost/algorithm/hex.hpp>
48 #include "ed25519-donna/ed25519.h"
82 using secret_key = epee::mlocked<tools::scrubbed<ec_scalar>>;
85 std::vector<public_key> keys;
90 std::vector<secret_key> keys;
134 sizeof(
signature) == 64,
"Invalid structure size");
177 static std::string
sign_message(
const std::string &message,
const std::string &privateKey);
178 friend std::string
sign_message(
const std::string &message,
const std::string &privateKey);
181 static bool verify_signature(
const std::string &message, std::vector<std::string> publicKey,
const std::string &
signature);
182 friend bool verify_signature(
const std::string &message, std::vector<std::string> publicKey,
const std::string &
signature);
197 inline void rand(
size_t N, uint8_t *bytes) {
204 typename std::enable_if<std::is_pod<T>::value,
T>::type
rand() {
205 typename std::remove_cv<T>::type res;
223 typename std::enable_if<std::is_integral<T>::value,
T>::type
rand_range(
T range_min,
T range_max) {
225 std::uniform_int_distribution<T> dis(range_min, range_max);
232 typename std::enable_if<std::is_unsigned<T>::value,
T>::type
rand_idx(
T sz) {
233 return crypto::rand_range<T>(0, sz-1);
308 const public_key *
const *pubs, std::size_t pubs_count,
314 const public_key *
const *pubs, std::size_t pubs_count,
322 const std::vector<const public_key *> &pubs,
328 const std::vector<const public_key *> &pubs,
334 epee::to_hex::formatted(o, epee::as_byte_span(v));
return o;
337 epee::to_hex::formatted(o, epee::as_byte_span(v));
return o;
340 epee::to_hex::formatted(o, epee::as_byte_span(v));
return o;
343 epee::to_hex::formatted(o, epee::as_byte_span(v));
return o;
346 epee::to_hex::formatted(o, epee::as_byte_span(v));
return o;
352 inline std::string
sign_message(
const std::string &message,
const std::string &privateKey) {
369 using namespace boost::archive::iterators;
370 using It = transform_width<binary_from_base64<std::string::const_iterator>, 8, 6>;
371 return boost::algorithm::trim_right_copy_if(std::string(It(std::begin(val)), It(std::end(val))), [](
char c) {
377 using namespace boost::archive::iterators;
378 using It = base64_from_binary<transform_width<std::string::const_iterator, 6, 8>>;
379 auto tmp = std::string(It(std::begin(val)), It(std::end(val)));
380 return tmp.append((3 - val.size() % 3) % 3,
'=');
static bool check_key(const public_key &)
Definition: crypto.cpp:158
void operator=(const crypto_ops &)
static void derive_secret_key(const key_derivation &, std::size_t, const secret_key &, secret_key &)
static std::string sign_message(const std::string &message, const std::string &privateKey)
Definition: crypto.cpp:618
friend std::string base64_decode(std::string val)
static std::string base64_decode(std::string val)
static bool check_tx_proof(const hash &, const public_key &, const public_key &, const boost::optional< public_key > &, const public_key &, const signature &)
Definition: crypto.cpp:386
static void generate_signature(const hash &, const public_key &, const secret_key &, signature &)
Definition: crypto.cpp:260
static bool derive_subaddress_public_key(const public_key &, const key_derivation &, std::size_t, public_key &)
Definition: crypto.cpp:228
static bool derive_public_key(const key_derivation &, std::size_t, const public_key &, public_key &)
crypto_ops(const crypto_ops &)
static void derivation_to_scalar(const key_derivation &derivation, size_t output_index, ec_scalar &res)
Definition: crypto.cpp:188
static bool check_signature(const hash &, const public_key &, const signature &)
Definition: crypto.cpp:290
static bool verify_signature(const std::string &message, const std::string &publicKey, const std::string &signature)
Definition: crypto.cpp:633
static void generate_ring_signature(const hash &, const key_image &, const public_key *const *, std::size_t, const secret_key &, std::size_t, signature *)
static void generate_tx_proof(const hash &, const public_key &, const public_key &, const boost::optional< public_key > &, const public_key &, const secret_key &, signature &)
Definition: crypto.cpp:314
static secret_key generate_keys(public_key &pub, secret_key &sec, const secret_key &recovery_key=secret_key(), bool recover=false)
Definition: crypto.cpp:136
static bool generate_key_derivation(const public_key &, const secret_key &, key_derivation &)
Definition: crypto.cpp:173
friend std::string base64_encode(std::string val)
static bool check_ring_signature(const hash &, const key_image &, const public_key *const *, std::size_t, const signature *)
static bool secret_key_to_public_key(const secret_key &, public_key &)
Definition: crypto.cpp:163
static std::string base64_encode(std::string val)
static std::vector< std::string > create_ed25519_keypair()
Definition: crypto.cpp:658
static void generate_key_image(const public_key &, const secret_key &, key_image &)
Definition: crypto.cpp:482
#define CRYPTO_MAKE_HASHABLE_CONSTANT_TIME(type)
Definition: generic-ops.h:80
#define CRYPTO_MAKE_COMPARABLE(type)
Definition: generic-ops.h:39
#define CRYPTO_MAKE_HASHABLE(type)
Definition: generic-ops.h:76
const uint32_t T[512]
Definition: groestl_tables.h:37
PUSH_WARNINGS
Definition: hash-ops.h:54
list B
Definition: base.py:26
int b
Definition: base.py:1
crypto namespace.
Definition: crypto.cpp:58
POD_CLASS secret_keyV
Definition: crypto.h:89
const crypto::public_key null_pkey
Definition: crypto.cpp:72
void generate_signature(const hash &prefix_hash, const public_key &pub, const secret_key &sec, signature &sig)
Definition: crypto.h:280
POD_CLASS public_keyM
Definition: crypto.h:94
bool verify_signature(const std::string &message, const std::string &publicKey, const std::string &signature)
Definition: crypto.h:356
bool check_key(const public_key &key)
Definition: crypto.h:244
void generate_random_bytes_thread_safe(size_t N, uint8_t *bytes)
Definition: crypto.cpp:91
std::vector< std::string > create_ed25519_keypair()
Definition: crypto.h:364
POD_CLASS ec_point
Definition: crypto.h:70
void hash_to_ec(const public_key &key, ge_p3 &res)
Definition: crypto.cpp:472
void generate_tx_proof(const hash &prefix_hash, const public_key &R, const public_key &A, const boost::optional< public_key > &B, const public_key &D, const secret_key &r, signature &sig)
Definition: crypto.h:291
POD_CLASS signature
Definition: crypto.h:108
const crypto::secret_key null_skey
Definition: crypto.cpp:73
POD_CLASS public_keyV
Definition: crypto.h:84
std::enable_if< std::is_integral< T >::value, T >::type rand_range(T range_min, T range_max)
Definition: crypto.h:223
epee::mlocked< tools::scrubbed< ec_scalar > > secret_key
Definition: crypto.h:82
bool derive_subaddress_public_key(const public_key &out_key, const key_derivation &derivation, std::size_t output_index, public_key &result)
Definition: crypto.h:274
size_t rs_comm_size(size_t pubs_count)
Definition: crypto.cpp:491
POD_CLASS key_derivation
Definition: crypto.h:98
secret_key generate_keys(public_key &pub, secret_key &sec, const secret_key &recovery_key=secret_key(), bool recover=false)
Definition: crypto.h:238
void derive_secret_key(const key_derivation &derivation, std::size_t output_index, const secret_key &base, secret_key &derived_key)
Definition: crypto.h:270
std::vector< secret_keyV > column_vectors
Definition: crypto.h:97
bool generate_key_derivation(const public_key &key1, const secret_key &key2, key_derivation &derivation)
Definition: crypto.h:260
void generate_ring_signature(const hash &prefix_hash, const key_image &image, const public_key *const *pubs, std::size_t pubs_count, const secret_key &sec, std::size_t sec_index, signature *sig)
Definition: crypto.h:307
POD_CLASS public_key
Definition: crypto.h:76
void random32_unbiased(unsigned char *bytes)
Definition: crypto.cpp:110
bool derive_public_key(const key_derivation &derivation, std::size_t output_index, const public_key &base, public_key &derived_key)
Definition: crypto.h:263
void rand(size_t N, uint8_t *bytes)
Definition: crypto.h:197
std::string base64_encode(const std::string &val)
Definition: crypto.h:376
POD_CLASS key_image
Definition: crypto.h:102
bool check_signature(const hash &prefix_hash, const public_key &pub, const signature &sig)
Definition: crypto.h:283
POD_CLASS ec_scalar
Definition: crypto.h:74
std::string base64_decode(const std::string &val)
Definition: crypto.h:368
std::ostream & operator<<(std::ostream &o, const crypto::public_key &v)
Definition: crypto.h:333
bool secret_key_to_public_key(const secret_key &sec, public_key &pub)
Definition: crypto.h:250
std::enable_if< std::is_unsigned< T >::value, T >::type rand_idx(T sz)
Definition: crypto.h:232
bool check_tx_proof(const hash &prefix_hash, const public_key &R, const public_key &A, const boost::optional< public_key > &B, const public_key &D, const signature &sig)
Definition: crypto.h:294
void hash_to_scalar(const void *data, size_t length, ec_scalar &res)
Definition: crypto.cpp:126
int rows
Definition: crypto.h:86
POD_CLASS hash
Definition: hash.h:50
void random_scalar(ec_scalar &res)
Definition: crypto.cpp:122
void generate_key_image(const public_key &pub, const secret_key &sec, key_image &image)
Definition: crypto.h:304
std::string sign_message(const std::string &message, const std::string &privateKey)
Definition: crypto.h:352
void derivation_to_scalar(const key_derivation &derivation, size_t output_index, ec_scalar &res)
Definition: crypto.h:267
bool check_ring_signature(const hash &prefix_hash, const key_image &image, const public_key *const *pubs, std::size_t pubs_count, const signature *sig)
Definition: crypto.h:313
#define POD_CLASS
Definition: pod-class.h:44
ec_point a
Definition: crypto.h:121
static constexpr result_type min()
Definition: crypto.h:215
result_type operator()() const
Definition: crypto.h:217
uint64_t result_type
Definition: crypto.h:214
static constexpr result_type max()
Definition: crypto.h:216
hash h
Definition: crypto.h:124
struct ec_point_pair ab[]
Definition: crypto.h:125
Definition: crypto-ops.h:46
DISABLE_VS_WARNINGS(4244 4345 4503) using namespace crypto