36#include <boost/optional.hpp>
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>
85 std::vector<public_key> keys;
90 std::vector<secret_key> keys;
138 sizeof(
signature) == 64,
"Invalid structure size");
143 void operator=(
const crypto_ops &);
180 static void generate_ring_signature(
const hash &,
const key_image &,
182 friend void generate_ring_signature(
const hash &,
const key_image &,
184 static bool check_ring_signature(
const hash &,
const key_image &,
186 friend bool check_ring_signature(
const hash &,
const key_image &,
189 static std::string sign_message(
const std::string &
message,
const std::string &
privateKey);
190 friend std::string sign_message(
const std::string &
message,
const std::string &
privateKey);
193 static bool verify_signature(
const std::string &
message, std::vector<std::string>
publicKey,
const std::string &
signature);
194 friend bool verify_signature(
const std::string &
message, std::vector<std::string>
publicKey,
const std::string &
signature);
199 static std::string base64_decode(std::string val);
201 static std::string base64_encode(std::string val);
216 typename std::enable_if<std::is_pod<T>::value,
T>::type
rand() {
217 typename std::remove_cv<T>::type
res;
235 typename std::enable_if<std::is_integral<T>::value,
T>::type
rand_range(
T range_min,
T range_max) {
237 std::uniform_int_distribution<T> dis(range_min, range_max);
244 typename std::enable_if<std::is_unsigned<T>::value,
T>::type
rand_idx(
T sz) {
251 return crypto_ops::generate_keys(pub, sec, recovery_key, recover);
257 return crypto_ops::check_key(
key);
263 return crypto_ops::secret_key_to_public_key(sec, pub);
273 return crypto_ops::generate_key_derivation(key1, key2, derivation);
277 return crypto_ops::derive_public_key(derivation,
output_index, base, derived_key);
280 return crypto_ops::derivation_to_scalar(derivation,
output_index,
res);
284 crypto_ops::derive_secret_key(derivation,
output_index, base, derived_key);
287 return crypto_ops::derive_subaddress_public_key(out_key, derivation,
output_index, result);
293 crypto_ops::generate_signature(prefix_hash, pub, sec, sig);
296 return crypto_ops::check_signature(prefix_hash, pub, sig);
300 return crypto_ops::generate_input_signature(prefix_hash, input_index, sec_view, sec_spend, sig);
304 return crypto_ops::verify_input_signature(prefix_hash, input_index, pub_view, pub_spend, sig);
312 crypto_ops::generate_tx_proof(prefix_hash, R,
A, B, D, r, sig);
315 return crypto_ops::check_tx_proof(prefix_hash, R,
A, B, D, sig);
325 crypto_ops::generate_key_image(pub, sec, image);
328 const public_key *
const *pubs, std::size_t pubs_count,
331 crypto_ops::generate_ring_signature(prefix_hash, image, pubs, pubs_count, sec, sec_index, sig);
334 const public_key *
const *pubs, std::size_t pubs_count,
336 return crypto_ops::check_ring_signature(prefix_hash, image, pubs, pubs_count, sig);
340 return crypto_ops::addKeys(
A, B);
346 const std::vector<const public_key *> &pubs,
352 const std::vector<const public_key *> &pubs,
393 using namespace boost::archive::iterators;
394 using It = transform_width<binary_from_base64<std::string::const_iterator>, 8, 6>;
395 return boost::algorithm::trim_right_copy_if(std::string(It(std::begin(val)), It(std::end(val))), [](
char c) {
401 using namespace boost::archive::iterators;
402 using It = base64_from_binary<transform_width<std::string::const_iterator, 6, 8>>;
403 auto tmp = std::string(It(std::begin(val)), It(std::end(val)));
404 return tmp.append((3 - val.size() % 3) % 3,
'=');
friend std::vector< std::string > create_ed25519_keypair()
friend std::string base64_decode(std::string val)
friend secret_key addSecretKeys(const secret_key &A, const secret_key &B)
friend std::string base64_encode(std::string val)
std::string message("Message requiring signing")
#define CRYPTO_MAKE_HASHABLE_CONSTANT_TIME(type)
#define CRYPTO_MAKE_COMPARABLE(type)
#define CRYPTO_MAKE_HASHABLE(type)
const crypto::public_key null_pkey
void generate_signature(const hash &prefix_hash, const public_key &pub, const secret_key &sec, signature &sig)
bool verify_signature(const std::string &message, const std::string &publicKey, const std::string &signature)
bool check_key(const public_key &key)
bool verify_input_signature(const hash &prefix_hash, const uint32_t input_index, const public_key pub_view, const public_key pub_spend, signature sig)
public_key addKeys(const public_key &A, const public_key &B)
void generate_random_bytes_thread_safe(size_t N, uint8_t *bytes)
std::enable_if< std::is_pod< T >::value, T >::type rand()
void hash_to_ec(const public_key &key, ge_p3 &res)
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)
const crypto::secret_key null_skey
epee::mlocked< tools::scrubbed< ec_scalar > > secret_key
std::enable_if< std::is_integral< T >::value, T >::type rand_range(T range_min, T range_max)
void generate_input_signature(const hash prefix_hash, const uint32_t input_index, const secret_key sec_view, const secret_key sec_spend, signature &sig)
bool derive_subaddress_public_key(const public_key &out_key, const key_derivation &derivation, std::size_t output_index, public_key &result)
size_t rs_comm_size(size_t pubs_count)
secret_key generate_keys(public_key &pub, secret_key &sec, const secret_key &recovery_key=secret_key(), bool recover=false)
void derive_secret_key(const key_derivation &derivation, std::size_t output_index, const secret_key &base, secret_key &derived_key)
std::vector< secret_keyV > column_vectors
unsigned __int64 uint64_t
bool generate_key_derivation(const public_key &key1, const secret_key &key2, key_derivation &derivation)
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)
void random32_unbiased(unsigned char *bytes)
bool derive_public_key(const key_derivation &derivation, std::size_t output_index, const public_key &base, public_key &derived_key)
void hash_to_point(const crypto::hash &h, crypto::ec_point &res)
std::ostream & operator<<(std::ostream &o, const crypto::public_key &v)
std::string base64_encode(const std::string &val)
bool check_signature(const hash &prefix_hash, const public_key &pub, const signature &sig)
std::string base64_decode(const std::string &val)
bool secret_key_to_public_key(const secret_key &sec, public_key &pub)
std::enable_if< std::is_unsigned< T >::value, T >::type rand_idx(T sz)
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)
void hash_to_scalar(const void *data, size_t length, ec_scalar &res)
void random_scalar(ec_scalar &res)
void generate_key_image(const public_key &pub, const secret_key &sec, key_image &image)
std::string sign_message(const std::string &message, const std::string &privateKey)
void derivation_to_scalar(const key_derivation &derivation, size_t output_index, ec_scalar &res)
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)
std::vector< std::string > create_ed25519_keypair()
span< const std::uint8_t > as_byte_span(const T &src) noexcept
static constexpr result_type min()
result_type operator()() const
static constexpr result_type max()
struct ec_point_pair ab[]
static void formatted(std::ostream &out, const span< const std::uint8_t > src)
Append < + src + > as hex to out.
#define DISABLE_VS_WARNINGS(w)