13 #include <secp256k1.h> 21 namespace fc {
namespace ecc {
25 static secp256k1_context_t* ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY | SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_RANGEPROOF | SECP256K1_CONTEXT_COMMIT );
42 memset(
_key.data(), 0,
_key.size() );
72 (
unsigned char*) my->_key.data() ) );
99 return my->_key != empty_pub;
106 memcpy( new_key.data(), my->_key.data(), new_key.size() );
108 (
unsigned char*) digest.
data() ) );
128 unsigned int pk_len = my->_key.size();
129 memcpy( dat.data(), my->_key.data(), pk_len );
137 const unsigned char* front = dat.data();
141 EC_KEY *key = EC_KEY_new_by_curve_name( NID_secp256k1 );
142 key = o2i_ECPublicKey( &key, &front,
sizeof(dat) );
144 EC_KEY_set_conv_form( key, POINT_CONVERSION_COMPRESSED );
145 unsigned char* buffer = my->_key.data();
146 i2o_ECPublicKey( key, &buffer );
162 if( check_canonical )
164 FC_ASSERT( is_canonical( c ),
"signature is not canonical" );
169 c.data() + 1, my->_key.data(), (
int*) &pk_len, 1,
170 (*c.data() - 27) & 3 ) );
175 int child,
int parent, uint8_t depth )
176 :
public_key(k), c(c), child_num(child), parent_fp(parent), depth(depth) { }
182 const detail::chr37 data = detail::_derive_message( key, i );
187 (
unsigned char*) left.
data() ) > 0 );
194 int child,
int parent, uint8_t depth )
195 :
private_key(k), c(c), child_num(child), parent_fp(parent), depth(depth) { }
218 std::vector<const unsigned char*> blinds(blinds_in.size());
219 for( uint32_t i = 0; i < blinds_in.size(); ++i ) blinds[i] = (
unsigned char*) blinds_in[i].
data();
225 bool verify_sum(
const std::vector<commitment_type>& commits_in,
const std::vector<commitment_type>& neg_commits_in, int64_t excess )
227 std::vector<const unsigned char*> commits(commits_in.size());
228 for( uint32_t i = 0; i < commits_in.size(); ++i ) commits[i] = commits_in[i].data();
229 std::vector<const unsigned char*> neg_commits(neg_commits_in.size());
230 for( uint32_t i = 0; i < neg_commits_in.size(); ++i ) neg_commits[i] = neg_commits_in[i].data();
232 return secp256k1_pedersen_verify_tally(
detail::_get_context(), commits.data(), commits.size(), neg_commits.data(), neg_commits.size(), excess );
237 return secp256k1_rangeproof_verify(
detail::_get_context(), &min_val, &max_val, commit.data(), (
const unsigned char*)proof.data(), proof.size() );
246 uint64_t actual_value
249 int proof_len = 5134;
250 std::vector<char> proof(proof_len);
253 (
unsigned char*)proof.data(),
254 &proof_len, min_value,
256 (
unsigned char*) commit_blind.
data(),
257 (
unsigned char*) nonce.
data(),
258 base10_exp, min_bits, actual_value ) );
259 proof.resize(proof_len);
271 const std::vector<char>& proof )
276 (
unsigned char*) blind_out.
data(),
278 (
unsigned char*) msg,
280 (
unsigned char*) nonce.
data(),
284 (
const unsigned char*)proof.data(),
287 message_out = std::string( msg, mlen );
299 (
const unsigned char*)proof.data(),
300 (int)proof.size() ) );
bool verify_range(uint64_t &min_val, uint64_t &max_val, const commitment_type &commit, const range_proof_type &proof)
const secp256k1_context_t * _get_context()
static constexpr size_t data_size()
fc::sha512 get_shared_secret(const public_key &pub) const
unsigned int fingerprint() const
bool verify_sum(const std::vector< commitment_type > &commits, const std::vector< commitment_type > &neg_commits, int64_t excess)
const ec_group & get_curve()
range_proof_info range_get_info(const range_proof_type &proof)
public_key_data serialize() const
unsigned int fingerprint() const
Used to generate a useful error report when an exception is thrown.At each level in the stack where t...
const private_key_secret & get_half_curve_order()
extended_public_key derive_normal_child(int i) const
static sha512 hash(const char *d, uint32_t dlen)
public_key & operator=(public_key &&pk)
extended_public_key(const public_key &k, const sha256 &c, int child=0, int parent_fp=0, uint8_t depth=0)
fc::sha256 _left(const fc::sha512 &v)
public_key add(const fc::sha256 &offset) const
H digest(const char *c, uint32_t c_len, const char *d, uint32_t d_len)
public_key child(const fc::sha256 &offset) const
public_key_impl(const public_key_impl &cpy) BOOST_NOEXCEPT
commitment_type blind(const blind_factor_type &blind, uint64_t value)
fc::sha256 digest(const T &value)
std::string to_base58() const
Allows to convert current public key object into base58 number.
contains only the public point of an elliptic curve key.
chr37 _derive_message(const public_key_data &key, int i)
#define FC_ASSERT(TEST,...)
Checks a condition and throws an assert_exception if the test is FALSE.
fc::sha256 _right(const fc::sha512 &v)
public_key_point_data serialize_ecc_point() const
static private_key regenerate(const fc::sha256 &secret)
#define FC_THROW_EXCEPTION(EXCEPTION, FORMAT,...)
const private_key_secret & get_curve_order()
bool verify_range_proof_rewind(blind_factor_type &blind_out, uint64_t &value_out, string &message_out, const blind_factor_type &nonce, uint64_t &min_val, uint64_t &max_val, commitment_type commit, const range_proof_type &proof)
Defines exception's used by fc.
zero_initialized_array< unsigned char, 37 > chr37
private_key_secret get_secret() const
range_proof_type range_proof_sign(uint64_t min_value, const commitment_type &commit, const blind_factor_type &commit_blind, const blind_factor_type &nonce, int8_t base10_exp, uint8_t min_bits, uint64_t actual_value)
blind_factor_type blind_sum(const std::vector< blind_factor_type > &blinds, uint32_t non_neg)
extended_private_key(const private_key &k, const sha256 &c, int child=0, int parent_fp=0, uint8_t depth=0)
an elliptic curve private key.
public_key_impl() BOOST_NOEXCEPT