mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-13 12:33:42 +02:00
Update to new libsecp256k1-zkp
This commit is contained in:
parent
631d43f64f
commit
d4be62106b
10 changed files with 217 additions and 108 deletions
|
|
@ -914,7 +914,7 @@ PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR"
|
|||
unset PKG_CONFIG_LIBDIR
|
||||
PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP"
|
||||
|
||||
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-module-schnorr --enable-module-ecdh --enable-module-rangeproof"
|
||||
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-experimental --enable-module-recovery --enable-module-schnorr --enable-module-ecdh --enable-module-rangeproof"
|
||||
AC_CONFIG_SUBDIRS([src/secp256k1])
|
||||
|
||||
AC_OUTPUT
|
||||
|
|
|
|||
|
|
@ -8,30 +8,30 @@
|
|||
#include <secp256k1.h>
|
||||
#include <secp256k1_rangeproof.h>
|
||||
|
||||
static secp256k1_context_t* secp256k1_context = NULL;
|
||||
static secp256k1_context* secp256k1_blind_context = NULL;
|
||||
|
||||
void ECC_Blinding_Start() {
|
||||
assert(secp256k1_context == NULL);
|
||||
assert(secp256k1_blind_context == NULL);
|
||||
|
||||
secp256k1_context_t *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
|
||||
secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
|
||||
assert(ctx != NULL);
|
||||
secp256k1_pedersen_context_initialize(ctx);
|
||||
secp256k1_rangeproof_context_initialize(ctx);
|
||||
|
||||
secp256k1_context = ctx;
|
||||
secp256k1_blind_context = ctx;
|
||||
}
|
||||
|
||||
void ECC_Blinding_Stop() {
|
||||
secp256k1_context_t *ctx = secp256k1_context;
|
||||
secp256k1_context = NULL;
|
||||
secp256k1_context *ctx = secp256k1_blind_context;
|
||||
secp256k1_blind_context = NULL;
|
||||
|
||||
if (ctx) {
|
||||
secp256k1_context_destroy(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
const secp256k1_context_t* ECC_Blinding_Context() {
|
||||
return secp256k1_context;
|
||||
const secp256k1_context* ECC_Blinding_Context() {
|
||||
return secp256k1_blind_context;
|
||||
}
|
||||
|
||||
int UnblindOutput(const CKey &key, const CTxOut& txout, CAmount& amount_out, std::vector<unsigned char>& blinding_factor_out)
|
||||
|
|
@ -51,7 +51,7 @@ int UnblindOutput(const CKey &key, const CTxOut& txout, CAmount& amount_out, std
|
|||
int msg_size;
|
||||
uint64_t min_value, max_value, amount;
|
||||
blinding_factor_out.resize(32);
|
||||
int res = secp256k1_rangeproof_rewind(secp256k1_context, &blinding_factor_out[0], &amount, msg, &msg_size, nonce.begin(), &min_value, &max_value, &txout.nValue.vchCommitment[0], &txout.nValue.vchRangeproof[0], txout.nValue.vchRangeproof.size());
|
||||
int res = secp256k1_rangeproof_rewind(secp256k1_blind_context, &blinding_factor_out[0], &amount, msg, &msg_size, nonce.begin(), &min_value, &max_value, &txout.nValue.vchCommitment[0], &txout.nValue.vchRangeproof[0], txout.nValue.vchRangeproof.size());
|
||||
if (!res || amount > (uint64_t)MAX_MONEY || !MoneyRange((CAmount)amount)) {
|
||||
amount_out = 0;
|
||||
blinding_factor_out.resize(0);
|
||||
|
|
|
|||
|
|
@ -253,7 +253,7 @@ const CTxOut &CCoinsViewCache::GetOutputFor(const CTxIn& input) const
|
|||
return coins->vout[input.prevout.n];
|
||||
}
|
||||
|
||||
extern secp256k1_context_t* secp256k1_bitcoin_verify_context;
|
||||
extern secp256k1_context* secp256k1_bitcoin_verify_context;
|
||||
|
||||
bool CCoinsViewCache::VerifyAmounts(const CTransaction& tx, const CAmount& excess) const
|
||||
{
|
||||
|
|
|
|||
155
src/key.cpp
155
src/key.cpp
|
|
@ -14,8 +14,113 @@
|
|||
#include <secp256k1.h>
|
||||
#include <secp256k1_ecdh.h>
|
||||
#include <secp256k1_schnorr.h>
|
||||
#include <secp256k1_recovery.h>
|
||||
|
||||
static secp256k1_context_t* secp256k1_context = NULL;
|
||||
static secp256k1_context* secp256k1_context_sign = NULL;
|
||||
|
||||
/** These functions are taken from the libsecp256k1 distribution and are very ugly. */
|
||||
static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen) {
|
||||
const unsigned char *end = privkey + privkeylen;
|
||||
int lenb = 0;
|
||||
int len = 0;
|
||||
memset(out32, 0, 32);
|
||||
/* sequence header */
|
||||
if (end < privkey+1 || *privkey != 0x30) {
|
||||
return 0;
|
||||
}
|
||||
privkey++;
|
||||
/* sequence length constructor */
|
||||
if (end < privkey+1 || !(*privkey & 0x80)) {
|
||||
return 0;
|
||||
}
|
||||
lenb = *privkey & ~0x80; privkey++;
|
||||
if (lenb < 1 || lenb > 2) {
|
||||
return 0;
|
||||
}
|
||||
if (end < privkey+lenb) {
|
||||
return 0;
|
||||
}
|
||||
/* sequence length */
|
||||
len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0);
|
||||
privkey += lenb;
|
||||
if (end < privkey+len) {
|
||||
return 0;
|
||||
}
|
||||
/* sequence element 0: version number (=1) */
|
||||
if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) {
|
||||
return 0;
|
||||
}
|
||||
privkey += 3;
|
||||
/* sequence element 1: octet string, up to 32 bytes */
|
||||
if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) {
|
||||
return 0;
|
||||
}
|
||||
memcpy(out32 + 32 - privkey[1], privkey + 2, privkey[1]);
|
||||
if (!secp256k1_ec_seckey_verify(ctx, out32)) {
|
||||
memset(out32, 0, 32);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) {
|
||||
secp256k1_pubkey pubkey;
|
||||
size_t pubkeylen = 0;
|
||||
if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) {
|
||||
*privkeylen = 0;
|
||||
return 0;
|
||||
}
|
||||
if (compressed) {
|
||||
static const unsigned char begin[] = {
|
||||
0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20
|
||||
};
|
||||
static const unsigned char middle[] = {
|
||||
0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48,
|
||||
0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04,
|
||||
0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87,
|
||||
0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8,
|
||||
0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E,
|
||||
0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00
|
||||
};
|
||||
unsigned char *ptr = privkey;
|
||||
memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin);
|
||||
memcpy(ptr, key32, 32); ptr += 32;
|
||||
memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle);
|
||||
pubkeylen = 33;
|
||||
secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED);
|
||||
ptr += pubkeylen;
|
||||
*privkeylen = ptr - privkey;
|
||||
} else {
|
||||
static const unsigned char begin[] = {
|
||||
0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20
|
||||
};
|
||||
static const unsigned char middle[] = {
|
||||
0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48,
|
||||
0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04,
|
||||
0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87,
|
||||
0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8,
|
||||
0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11,
|
||||
0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10,
|
||||
0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E,
|
||||
0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00
|
||||
};
|
||||
unsigned char *ptr = privkey;
|
||||
memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin);
|
||||
memcpy(ptr, key32, 32); ptr += 32;
|
||||
memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle);
|
||||
pubkeylen = 65;
|
||||
secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_UNCOMPRESSED);
|
||||
ptr += pubkeylen;
|
||||
*privkeylen = ptr - privkey;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool CKey::Check(const unsigned char *vch) {
|
||||
return eccrypto::Check(vch);
|
||||
|
|
@ -30,7 +135,7 @@ void CKey::MakeNewKey(bool fCompressedIn) {
|
|||
}
|
||||
|
||||
bool CKey::SetPrivKey(const CPrivKey &privkey, bool fCompressedIn) {
|
||||
if (!secp256k1_ec_privkey_import(secp256k1_context, (unsigned char*)begin(), &privkey[0], privkey.size()))
|
||||
if (!ec_privkey_import_der(secp256k1_context_sign, (unsigned char*)begin(), &privkey[0], privkey.size()))
|
||||
return false;
|
||||
fCompressed = fCompressedIn;
|
||||
fValid = true;
|
||||
|
|
@ -40,10 +145,11 @@ bool CKey::SetPrivKey(const CPrivKey &privkey, bool fCompressedIn) {
|
|||
CPrivKey CKey::GetPrivKey() const {
|
||||
assert(fValid);
|
||||
CPrivKey privkey;
|
||||
int privkeylen, ret;
|
||||
int ret;
|
||||
size_t privkeylen;
|
||||
privkey.resize(279);
|
||||
privkeylen = 279;
|
||||
ret = secp256k1_ec_privkey_export(secp256k1_context, begin(), (unsigned char*)&privkey[0], &privkeylen, fCompressed);
|
||||
ret = ec_privkey_export_der(secp256k1_context_sign, (unsigned char*)&privkey[0], &privkeylen, begin(), fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED);
|
||||
assert(ret);
|
||||
privkey.resize(privkeylen);
|
||||
return privkey;
|
||||
|
|
@ -52,11 +158,11 @@ CPrivKey CKey::GetPrivKey() const {
|
|||
CPubKey CKey::GetPubKey() const {
|
||||
assert(fValid);
|
||||
CPubKey result;
|
||||
int clen = 65;
|
||||
secp256k1_pubkey_t pubkey;
|
||||
int ret = secp256k1_ec_pubkey_create(secp256k1_context, &pubkey, begin());
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_context, (unsigned char*)result.begin(), &clen, &pubkey, fCompressed);
|
||||
assert((int)result.size() == clen);
|
||||
size_t clen = 65;
|
||||
secp256k1_pubkey pubkey;
|
||||
int ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &pubkey, begin());
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_context_sign, (unsigned char*)result.begin(), &clen, &pubkey, fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED);
|
||||
assert(result.size() == clen);
|
||||
assert(ret);
|
||||
assert(result.IsValid());
|
||||
return result;
|
||||
|
|
@ -65,9 +171,9 @@ CPubKey CKey::GetPubKey() const {
|
|||
uint256 CKey::ECDH(const CPubKey& pubkey) const {
|
||||
assert(fValid);
|
||||
uint256 result;
|
||||
secp256k1_pubkey_t pkey;
|
||||
assert(secp256k1_ec_pubkey_parse(secp256k1_context, &pkey, pubkey.begin(), pubkey.size()));
|
||||
assert(secp256k1_ecdh(secp256k1_context, result.begin(), &pkey, begin()));
|
||||
secp256k1_pubkey pkey;
|
||||
assert(secp256k1_ec_pubkey_parse(secp256k1_context_sign, &pkey, pubkey.begin(), pubkey.size()));
|
||||
assert(secp256k1_ecdh(secp256k1_context_sign, result.begin(), &pkey, begin()));
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -78,7 +184,7 @@ bool CKey::Sign(const uint256 &hash, std::vector<unsigned char>& vchSig, uint32_
|
|||
int nSigLen = 64;
|
||||
unsigned char extra_entropy[32] = {0};
|
||||
WriteLE32(extra_entropy, test_case);
|
||||
int ret = secp256k1_schnorr_sign(secp256k1_context, hash.begin(), (unsigned char*)&vchSig[0], begin(), secp256k1_nonce_function_rfc6979, test_case ? extra_entropy : NULL);
|
||||
int ret = secp256k1_schnorr_sign(secp256k1_context_sign, (unsigned char*)&vchSig[0], hash.begin(), begin(), secp256k1_nonce_function_rfc6979, test_case ? extra_entropy : NULL);
|
||||
assert(ret);
|
||||
vchSig.resize(nSigLen);
|
||||
return true;
|
||||
|
|
@ -103,15 +209,18 @@ bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig)
|
|||
return false;
|
||||
vchSig.resize(65);
|
||||
int rec = -1;
|
||||
secp256k1_ecdsa_signature_t sig;
|
||||
assert(secp256k1_ecdsa_sign(secp256k1_context, hash.begin(), &sig, begin(), secp256k1_nonce_function_rfc6979, NULL));
|
||||
assert(secp256k1_ecdsa_signature_serialize_compact(secp256k1_context, &vchSig[1], &rec, &sig));
|
||||
secp256k1_ecdsa_recoverable_signature sig;
|
||||
int ret = secp256k1_ecdsa_sign_recoverable(secp256k1_context_sign, &sig, hash.begin(), begin(), secp256k1_nonce_function_rfc6979, NULL);
|
||||
assert(ret);
|
||||
secp256k1_ecdsa_recoverable_signature_serialize_compact(secp256k1_context_sign, (unsigned char*)&vchSig[1], &rec, &sig);
|
||||
assert(ret);
|
||||
assert(rec != -1);
|
||||
vchSig[0] = 27 + rec + (fCompressed ? 4 : 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CKey::Load(CPrivKey &privkey, CPubKey &vchPubKey, bool fSkipCheck=false) {
|
||||
if (!secp256k1_ec_privkey_import(secp256k1_context, (unsigned char*)begin(), &privkey[0], privkey.size()))
|
||||
if (!ec_privkey_import_der(secp256k1_context_sign, (unsigned char*)begin(), &privkey[0], privkey.size()))
|
||||
return false;
|
||||
fCompressed = vchPubKey.IsCompressed();
|
||||
fValid = true;
|
||||
|
|
@ -137,7 +246,7 @@ bool CKey::Derive(CKey& keyChild, unsigned char ccChild[32], unsigned int nChild
|
|||
}
|
||||
memcpy(ccChild, out+32, 32);
|
||||
memcpy((unsigned char*)keyChild.begin(), begin(), 32);
|
||||
bool ret = secp256k1_ec_privkey_tweak_add(secp256k1_context, (unsigned char*)keyChild.begin(), out);
|
||||
bool ret = secp256k1_ec_privkey_tweak_add(secp256k1_context_sign, (unsigned char*)keyChild.begin(), out);
|
||||
UnlockObject(out);
|
||||
keyChild.fCompressed = true;
|
||||
keyChild.fValid = ret;
|
||||
|
|
@ -203,9 +312,9 @@ bool ECC_InitSanityCheck() {
|
|||
|
||||
|
||||
void ECC_Start() {
|
||||
assert(secp256k1_context == NULL);
|
||||
assert(secp256k1_context_sign == NULL);
|
||||
|
||||
secp256k1_context_t *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);
|
||||
secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);
|
||||
assert(ctx != NULL);
|
||||
|
||||
{
|
||||
|
|
@ -218,12 +327,12 @@ void ECC_Start() {
|
|||
UnlockObject(seed);
|
||||
}
|
||||
|
||||
secp256k1_context = ctx;
|
||||
secp256k1_context_sign = ctx;
|
||||
}
|
||||
|
||||
void ECC_Stop() {
|
||||
secp256k1_context_t *ctx = secp256k1_context;
|
||||
secp256k1_context = NULL;
|
||||
secp256k1_context *ctx = secp256k1_context_sign;
|
||||
secp256k1_context_sign = NULL;
|
||||
|
||||
if (ctx) {
|
||||
secp256k1_context_destroy(ctx);
|
||||
|
|
|
|||
|
|
@ -7,19 +7,19 @@
|
|||
#include <secp256k1.h>
|
||||
#include <secp256k1_rangeproof.h>
|
||||
#include <secp256k1_schnorr.h>
|
||||
#include <secp256k1_recovery.h>
|
||||
|
||||
secp256k1_context_t* secp256k1_bitcoin_verify_context = NULL;
|
||||
static secp256k1_context_t*& secp256k1_context = secp256k1_bitcoin_verify_context;
|
||||
secp256k1_context* secp256k1_bitcoin_verify_context = NULL;
|
||||
|
||||
bool CPubKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchSig) const {
|
||||
if (!IsValid())
|
||||
return false;
|
||||
if (vchSig.size() != 64)
|
||||
return false;
|
||||
secp256k1_pubkey_t pubkey;
|
||||
if (!secp256k1_ec_pubkey_parse(secp256k1_context, &pubkey, begin(), size()))
|
||||
secp256k1_pubkey pubkey;
|
||||
if (!secp256k1_ec_pubkey_parse(secp256k1_bitcoin_verify_context, &pubkey, begin(), size()))
|
||||
return false;
|
||||
if (secp256k1_schnorr_verify(secp256k1_context, (const unsigned char*)&hash, &vchSig[0], &pubkey) != 1)
|
||||
if (secp256k1_schnorr_verify(secp256k1_bitcoin_verify_context, &vchSig[0], (const unsigned char*)&hash, &pubkey) != 1)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
|
@ -29,17 +29,17 @@ bool CPubKey::RecoverCompact(const uint256 &hash, const std::vector<unsigned cha
|
|||
return false;
|
||||
int recid = (vchSig[0] - 27) & 3;
|
||||
bool fComp = ((vchSig[0] - 27) & 4) != 0;
|
||||
secp256k1_pubkey_t pubkey;
|
||||
secp256k1_ecdsa_signature_t sig;
|
||||
if (!secp256k1_ecdsa_signature_parse_compact(secp256k1_context, &sig, &vchSig[1], recid)) {
|
||||
secp256k1_pubkey pubkey;
|
||||
secp256k1_ecdsa_recoverable_signature sig;
|
||||
if (!secp256k1_ecdsa_recoverable_signature_parse_compact(secp256k1_bitcoin_verify_context, &sig, &vchSig[1], recid)) {
|
||||
return false;
|
||||
}
|
||||
if (!secp256k1_ecdsa_recover(secp256k1_context, hash.begin(), &sig, &pubkey)) {
|
||||
if (!secp256k1_ecdsa_recover(secp256k1_bitcoin_verify_context, &pubkey, &sig, hash.begin())) {
|
||||
return false;
|
||||
}
|
||||
unsigned char pub[65];
|
||||
int publen = 0;
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_context, pub, &publen, &pubkey, fComp);
|
||||
size_t publen = 65;
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_bitcoin_verify_context, pub, &publen, &pubkey, fComp ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED);
|
||||
Set(pub, pub + publen);
|
||||
return true;
|
||||
}
|
||||
|
|
@ -47,8 +47,8 @@ bool CPubKey::RecoverCompact(const uint256 &hash, const std::vector<unsigned cha
|
|||
bool CPubKey::IsFullyValid() const {
|
||||
if (!IsValid())
|
||||
return false;
|
||||
secp256k1_pubkey_t pubkey;
|
||||
if (!secp256k1_ec_pubkey_parse(secp256k1_context, &pubkey, begin(), size()))
|
||||
secp256k1_pubkey pubkey;
|
||||
if (!secp256k1_ec_pubkey_parse(secp256k1_bitcoin_verify_context, &pubkey, begin(), size()))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
|
@ -56,13 +56,13 @@ bool CPubKey::IsFullyValid() const {
|
|||
bool CPubKey::Decompress() {
|
||||
if (!IsValid())
|
||||
return false;
|
||||
secp256k1_pubkey_t pubkey;
|
||||
if (!secp256k1_ec_pubkey_parse(secp256k1_context, &pubkey, &(*this)[0], size())) {
|
||||
secp256k1_pubkey pubkey;
|
||||
if (!secp256k1_ec_pubkey_parse(secp256k1_bitcoin_verify_context, &pubkey, &(*this)[0], size())) {
|
||||
return false;
|
||||
}
|
||||
unsigned char pub[65];
|
||||
int publen = 0;
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_context, pub, &publen, &pubkey, false);
|
||||
size_t publen = 0;
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_bitcoin_verify_context, pub, &publen, &pubkey, SECP256K1_EC_UNCOMPRESSED);
|
||||
Set(pub, pub + publen);
|
||||
return true;
|
||||
}
|
||||
|
|
@ -74,16 +74,16 @@ bool CPubKey::Derive(CPubKey& pubkeyChild, unsigned char ccChild[32], unsigned i
|
|||
unsigned char out[64];
|
||||
BIP32Hash(cc, nChild, *begin(), begin()+1, out);
|
||||
memcpy(ccChild, out+32, 32);
|
||||
secp256k1_pubkey_t pubkey;
|
||||
if (!secp256k1_ec_pubkey_parse(secp256k1_context, &pubkey, &(*this)[0], size())) {
|
||||
secp256k1_pubkey pubkey;
|
||||
if (!secp256k1_ec_pubkey_parse(secp256k1_bitcoin_verify_context, &pubkey, &(*this)[0], size())) {
|
||||
return false;
|
||||
}
|
||||
if (!secp256k1_ec_pubkey_tweak_add(secp256k1_context, &pubkey, out)) {
|
||||
if (!secp256k1_ec_pubkey_tweak_add(secp256k1_bitcoin_verify_context, &pubkey, out)) {
|
||||
return false;
|
||||
}
|
||||
unsigned char pub[33];
|
||||
int publen = 0;
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_context, pub, &publen, &pubkey, 1);
|
||||
size_t publen = 0;
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_bitcoin_verify_context, pub, &publen, &pubkey, SECP256K1_EC_COMPRESSED);
|
||||
pubkeyChild.Set(pub, pub + publen);
|
||||
return true;
|
||||
}
|
||||
|
|
@ -115,19 +115,19 @@ bool CExtPubKey::Derive(CExtPubKey &out, unsigned int nChild) const {
|
|||
}
|
||||
|
||||
void ECC_Verify_Start() {
|
||||
assert(secp256k1_context == NULL);
|
||||
assert(secp256k1_bitcoin_verify_context == NULL);
|
||||
|
||||
secp256k1_context_t *ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY);
|
||||
secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY);
|
||||
assert(ctx != NULL);
|
||||
secp256k1_pedersen_context_initialize(ctx);
|
||||
secp256k1_rangeproof_context_initialize(ctx);
|
||||
|
||||
secp256k1_context = ctx;
|
||||
secp256k1_bitcoin_verify_context = ctx;
|
||||
}
|
||||
|
||||
void ECC_Verify_Stop() {
|
||||
secp256k1_context_t *ctx = secp256k1_context;
|
||||
secp256k1_context = NULL;
|
||||
secp256k1_context *ctx = secp256k1_bitcoin_verify_context;
|
||||
secp256k1_bitcoin_verify_context = NULL;
|
||||
|
||||
if (ctx) {
|
||||
secp256k1_context_destroy(ctx);
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ using namespace boost::assign;
|
|||
using namespace json_spirit;
|
||||
using namespace std;
|
||||
|
||||
extern secp256k1_context_t* secp256k1_bitcoin_verify_context;
|
||||
extern secp256k1_context* secp256k1_bitcoin_verify_context;
|
||||
|
||||
void ScriptPubKeyToJSON(const CScript& scriptPubKey, Object& out, bool fIncludeHex)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -35,22 +35,22 @@ typedef vector<unsigned char> valtype;
|
|||
//! anonymous namespace
|
||||
namespace {
|
||||
|
||||
static secp256k1_context_t* secp256k1_context = NULL;
|
||||
static secp256k1_context* secp256k1_interpreter_context = NULL;
|
||||
|
||||
class CSecp256k1Init {
|
||||
public:
|
||||
CSecp256k1Init() {
|
||||
assert(secp256k1_context == NULL);
|
||||
assert(secp256k1_interpreter_context == NULL);
|
||||
|
||||
secp256k1_context_t *ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY);
|
||||
secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY);
|
||||
assert(ctx != NULL);
|
||||
|
||||
secp256k1_context = ctx;
|
||||
secp256k1_interpreter_context = ctx;
|
||||
}
|
||||
|
||||
~CSecp256k1Init() {
|
||||
secp256k1_context_t *ctx = secp256k1_context;
|
||||
secp256k1_context = NULL;
|
||||
secp256k1_context *ctx = secp256k1_interpreter_context;
|
||||
secp256k1_interpreter_context = NULL;
|
||||
|
||||
if (ctx) {
|
||||
secp256k1_context_destroy(ctx);
|
||||
|
|
@ -1462,11 +1462,11 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
|
|||
unsigned char *pub_start = &(*(sdpc - 33));
|
||||
CHMAC_SHA256(pub_start, 33).Write(&vcontract[0], 40).Finalize(tweak);
|
||||
// If someone creates a tweak that makes this fail, they broke SHA256
|
||||
secp256k1_pubkey_t pubkey;
|
||||
int pubkeylen = 33;
|
||||
assert(secp256k1_ec_pubkey_parse(secp256k1_context, &pubkey, pub_start, 33));
|
||||
assert(secp256k1_ec_pubkey_tweak_add(secp256k1_context, &pubkey, tweak) != 0);
|
||||
assert(secp256k1_ec_pubkey_serialize(secp256k1_context, pub_start, &pubkeylen, &pubkey, 1));
|
||||
secp256k1_pubkey pubkey;
|
||||
size_t pubkeylen = 33;
|
||||
assert(secp256k1_ec_pubkey_parse(secp256k1_interpreter_context, &pubkey, pub_start, 33));
|
||||
assert(secp256k1_ec_pubkey_tweak_add(secp256k1_interpreter_context, &pubkey, tweak) != 0);
|
||||
assert(secp256k1_ec_pubkey_serialize(secp256k1_interpreter_context, pub_start, &pubkeylen, &pubkey, 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -519,115 +519,115 @@
|
|||
|
||||
["Automatically generated test cases"],
|
||||
[
|
||||
"0x41 0x0d676d409b7e64a10317ee8ede493482f90c3cdbf81cefe3c22f1326c53087352fa61ba8a289273706c3d80b3030b679be674ec2e40c3692067d063b1c3c06b801",
|
||||
"0x41 0x6863d8947a48d1de1023e80fbbda9bcc39c6d51f7d20aa487d6dd712ee9d2faece2f3baed30776dcb7d858d5123be1652eccb284fb0c79a59787093afb67613e01",
|
||||
"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"",
|
||||
"P2PK, bad sig"
|
||||
],
|
||||
[
|
||||
"0x41 0x82501cd8c9032f48e70e698cc4553b3e546be50657ea31322e0a2435918c7f682e790b98b7e337c51fee33e81c5d8bcb28efbf623258ec94b2d7afac09bb550901 0x21 0x03363d90d446b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
|
||||
"0x41 0x98ff11789ee5f9a71af7328289e9a46aec0bd87b99050c8ac6b03c9dc3f9c59d18357cd7e10627cf428bff1864aef8d8eb3be014faa9dd54438435d9fbad6e3f01 0x21 0x03363d90d446b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
|
||||
"DUP HASH160 0x14 0xc0834c0c158f53be706d234c38fd52de7eece656 EQUALVERIFY CHECKSIG",
|
||||
"",
|
||||
"P2PKH, bad pubkey"
|
||||
],
|
||||
[
|
||||
"0x41 0x040f320c2201b8aa7daa5e30d2be94564e6aac8cf6d9c74bd19e39839b4405a3bbcce62918cd7f1b8e26965c9634543c806fc032277be0b198f21ab106ee90ca01",
|
||||
"0x41 0x24a1b836adccc99fe3f4a7f867d7fb23abc8d75e82da17ddd02bd672534052c178d601c92f6d1a4469b1c20f92ed02f0be0166393a3f58a571b465b2a8580f3101",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"",
|
||||
"P2PK anyonecanpay marked with normal hashtype"
|
||||
],
|
||||
[
|
||||
"0x41 0xa6637f9b08d85bab62929779dc1d0d7627e542d27a9b83e81b1f5dea098b9f56913be9fbeca898a60e26c18969d9458e83f782a7832f3d0346dddc79447d078301 0x23 0x210279be667ef9dcbbac54a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
|
||||
"0x41 0xcb1e1098bb0ddaf5d6a6f50db6413215650b4e835491fce4298e8184cacde6db43ce6ff01009da60261f3d1f2b44a9f88cac3dbf49376903c126af9752e6010301 0x23 0x210279be667ef9dcbbac54a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
|
||||
"HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL",
|
||||
"P2SH",
|
||||
"P2SH(P2PK), bad redeemscript"
|
||||
],
|
||||
[
|
||||
"0x41 0xa594654c074e82156a9d47a46fd78f105e0d200eae1fb198c95edb297fbf4bbbe7292da1c68fa7563ee1f448ffb1cc00757c4e9b52930bef0bcef3cc7f044ce701 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
|
||||
"0x41 0x2ad332eb13e9a12fb8523f3fc111f24f1cda20640d18e4d919e2eea55787577db86ca96927864bef877392002877102ffa9758b4229d551605d1ba2dd4cf0c3e01 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
|
||||
"HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL",
|
||||
"P2SH",
|
||||
"P2SH(P2PKH), bad sig"
|
||||
],
|
||||
[
|
||||
"0 0x41 0xb852c8c7207c813acd1e002fb98a63327324db6474782558f1726750df6544a3b898c43bb0ddee5848c34e45b719cee1559d8d74b789eef83665d43dca5f243c01 0x41 0xd8bf0745999d38500ecc503ca0941c5d7103272428ca6733cad1ae4b19e97d0b021479b53242476dbab1b19d10c065d0373ffa01f0bfeb15e72c941ab7bc8c1b01 0",
|
||||
"0 0x41 0x082a5b36197f3ef39b4ea265f4097060fe417ab1aa20fc05242a839d348ba17637c3cc8c1b9f7c450f89fe9e97d8fdb1920c96032e96ecebfebb19e556acdb7501 0x41 0x8146998a3deda65def2fd9c86ca5d890e662068ebffe6b678c8c9e2860460f5580ec3974d07f319b98b760e97457896b4a235c270f3ec2f2a0b96cf1013a972801 0",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
|
||||
"",
|
||||
"3-of-3, 2 sigs"
|
||||
],
|
||||
[
|
||||
"0 0x41 0xc98cdd05746c1232eee979e134680a47b53f14f484a35aaf4ece9487e1010f4240ed76d2acf6dc641b66ed1c1d331d663ff47ba749f8f50f7188f9e6c230944b01 0 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
|
||||
"0 0x41 0xee6fd0ab43c8119f331c973f25b9e546d02dea5611114d06ec1a041f59713bcc3fa8bb5e2bb866169f40524bf774fdfb5915765f7140da74c3f1ae556f8bd8e301 0 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
|
||||
"HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL",
|
||||
"P2SH",
|
||||
"P2SH(2-of-3), 1 sig"
|
||||
],
|
||||
[
|
||||
"0x41 0x4196ce2d3cfbb5f81aa894153cbf59a6a07281a8b2beb14f0d5ba034f9a5c41de0f5f4a2d9d932c961e1e500bdae14dac64cc0ed5ede10cb7df62a2616a618cd01",
|
||||
"0x41 0x985b28b02ac1e49e31d6b299606793792ea66b400853bab3189a851b558f5b4732faf7ffda7e238517d26117b50b609bd89eb8071529c0d7c91419914c4fc4ed01",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"STRICTENC",
|
||||
"P2PK with hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x41 0x710f8d3e4abdeffc9c715aa660f76243d0b219e3a0087b8bdd928a709870e9781a43a6bd870beefc5865d2a548d11439ac51aa7e2e57f287471ed215f0f6e70801",
|
||||
"0x41 0x80a861c6a095e1e69d2505430b1b44b935ddffd39b4bc5b1dc4fbe98ded4f571721d87e56928475115519ffbb5b6670196c19c33362c3779183ef694cd31194401",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
|
||||
"",
|
||||
"P2PK NOT with hybrid pubkey but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0x41 0x710f8d3e4abdeffc9c715aa660f76243d0b219e3a0087b8bdd928a709870e9781a43a6bd870beefc5865d2a548d11439ac51aa7e2e57f287471ed215f0f6e70801",
|
||||
"0x41 0x80a861c6a095e1e69d2505430b1b44b935ddffd39b4bc5b1dc4fbe98ded4f571721d87e56928475115519ffbb5b6670196c19c33362c3779183ef694cd31194401",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
|
||||
"STRICTENC",
|
||||
"P2PK NOT with hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x41 0x710f8d3e4abdeffc9c715ba660f76243d0b219e3a0087b8bdd928a709870e9781a43a6bd870beefc5865d2a548d11439ac51aa7e2e57f287471ed215f0f6e70801",
|
||||
"0x41 0x80a861c6a095e1e69d2504430b1b44b935ddffd39b4bc5b1dc4fbe98ded4f571721d87e56928475115519ffbb5b6670196c19c33362c3779183ef694cd31194401",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
|
||||
"STRICTENC",
|
||||
"P2PK NOT with invalid hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0 0x41 0x099981456a47f7d9dbe190985794ae28449b3cda259c40db07ad3b5b6c8fa1dab4506a5d519b8fab88a097ef45bbad8b880594596132cfa34b913929bc98c1ef01",
|
||||
"0 0x41 0x21a03de07f902ac03755ba1a39ffc9f7ca99dc0dba841af056e1662a819f4d7c2a3677800041148f003ce89a43a40cccaa9f0ab8fae98857e08e8f6898efd97601",
|
||||
"1 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 2 CHECKMULTISIG",
|
||||
"STRICTENC",
|
||||
"1-of-2 with the first 1 hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x41 0x91896eb451aa34bedeedeb8e042c5de0d1774fa6151705eec402aa949523fad55c7067d80542f01892ff89ba1a703aca6adc9038f1d4e8541c66212512f4620505",
|
||||
"0x41 0x363b42595805a7ce5a43626f0c6ede3b10100df481870c92fd08f1bf5934c5ee8e57be83ffdb63d4456a994ede9ec8f31b90b0e82cace0dbeb1a6cdefd405fbc05",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"STRICTENC",
|
||||
"P2PK with undefined hashtype"
|
||||
],
|
||||
[
|
||||
"0x41 0xe2ae57ffe4b6858a9b097023835e4ee68faf7f8406b149790ba76892cbc650513a4a76f86aef2b94e85dc9dee3edb835488e70a9db0383adaca5441ac4e6a75105",
|
||||
"0x41 0xce7fe6391f5c5bee94a12ebaec43545c239a1672040549b56c0959172dd15fe0c317befd2f35bb81e8763e98a5f1a6b41978b74c3b32662fa0681cb8dd9f52d105",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT",
|
||||
"STRICTENC",
|
||||
"P2PK NOT with invalid sig and undefined hashtype"
|
||||
],
|
||||
[
|
||||
"1 0x41 0xb852c8c7207c813acd1e002fb98a63327324db6474782558f1726750df6544a3b898c43bb0ddee5848c34e45b719cee1559d8d74b789eef83665d43dca5f243c01 0x41 0xd8bf0745999d38500ecc503ca0941c5d7103272428ca6733cad1ae4b19e97d0b021479b53242476dbab1b19d10c065d0373ffa01f0bfeb15e72c941ab7bc8c1b01 0x41 0xaaa573ffdcf283a4aa608b81540e0bab4a8d2aa2e8bffe030736831c3399e360c78eab9ebf8da9d98c6306409ad752fcbc762222828dc3e54a7d2594d7fb728b01",
|
||||
"1 0x41 0x082a5b36197f3ef39b4ea265f4097060fe417ab1aa20fc05242a839d348ba17637c3cc8c1b9f7c450f89fe9e97d8fdb1920c96032e96ecebfebb19e556acdb7501 0x41 0x8146998a3deda65def2fd9c86ca5d890e662068ebffe6b678c8c9e2860460f5580ec3974d07f319b98b760e97457896b4a235c270f3ec2f2a0b96cf1013a972801 0x41 0xaacbc3c37cbef61dc7fd3c8a10fad5c6980100b2ed665a1e43ab7560527e550f188a2203c24ef8a68638bc2ce628ea30a0706f62ac6731deb07829d4266ee6fe01",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
|
||||
"NULLDUMMY",
|
||||
"3-of-3 with nonzero dummy"
|
||||
],
|
||||
[
|
||||
"1 0x41 0xc5ade7edc471ebf6f93cfdcd081efc826e42c90b9608257336917fe19dd49f1f9d9025cf85851990010e76f90fa2a10091aa20d7b4714c1dbbe35d7ab4ae7af901 0x41 0x636bac4be2a9d2bb9efb027b3455a09b942904b15f421d1578f058fb35ec8116a80690cbc2f994596d3ce9469bff6aa0a6a5a850abec57f70c32a51cd6175b1401 0x41 0x0dfa9ea0fd70ff9a86a83d9e41408b90e26797549977698b4362c8f41ce7201caea6c53a79b99065d09cd338bf7f262756b81ddae4e4d1626e41f7945272576801",
|
||||
"1 0x41 0x84ac522998336dd40c0a2c3a2457f654c37464b31db8585c5f90c58a63357037390618aaaf9fc8b082a89fc6f93aad43a4371c23b256780f6eb906ad1ed6ebdb01 0x41 0xe5f9f8716c641f7f03fd1297277c66c674d147fc46298b338259556a874c25301c0b9ef736fa50c93f064219bf9f09bb00a3aa26a790a61c4de0e0defeb8c46f01 0x41 0x0d2bf3b5b70b67496d10d2a9f0f6e9d49dda2b2ca48804f65ec2d31421a991836a7b8b74219ceb2cd26c0b85faabff5b58f69e99ac70350ef4b3289c8d4971e701",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG NOT",
|
||||
"NULLDUMMY",
|
||||
"3-of-3 NOT with invalid sig with nonzero dummy"
|
||||
],
|
||||
[
|
||||
"0 0x41 0xde2fb5c3ac521e16c92a44a31bffc213dbafbf39fc370ec3aab76e2af7e4be6d33f1dea322991d3921ca483fd3db8b9f5f3f9a42b6ca3e9b561d963887d7c8b101 DUP",
|
||||
"0 0x41 0x8838a35a1b419f133675e6ef0a613a89f22992d9ca8277f63b737994e7c850bfd73055e480fcdcb62485db8c155d1d4dc0b10fa218c65794c36325ed882437f401 DUP",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"SIGPUSHONLY",
|
||||
"2-of-2 with two identical keys and sigs pushed using OP_DUP"
|
||||
],
|
||||
[
|
||||
"0x41 0x2e3cee81c63207d7f4730be4be45c9b5cec7316494d5d10da84e26196a270051542401318e8871020a60f7beedf68202327358fdb3303945d6f793f1232bc2fb01 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
|
||||
"0x41 0xf6a6842282c43f8332d00e5931d333befcd5816330a297ef0e057f54a4f56dbcc618a0ece107f1081c10d9f7bc805ffeae9efaae5636a6610ac94c1749d6f59101 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
"",
|
||||
"P2SH(P2PK) with non-push scriptSig but no SIGPUSHONLY"
|
||||
],
|
||||
[
|
||||
"0x41 0x2e3cee81c63207d7f4730be4be45c9b5cec7316494d5d10da84e26196a270051542401318e8871020a60f7beedf68202327358fdb3303945d6f793f1232bc2fb01 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
|
||||
"0x41 0xf6a6842282c43f8332d00e5931d333befcd5816330a297ef0e057f54a4f56dbcc618a0ece107f1081c10d9f7bc805ffeae9efaae5636a6610ac94c1749d6f59101 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
"SIGPUSHONLY",
|
||||
"P2SH(P2PK) with non-push scriptSig"
|
||||
|
|
|
|||
|
|
@ -767,85 +767,85 @@
|
|||
|
||||
["Automatically generated test cases"],
|
||||
[
|
||||
"0x41 0x0d676d409b7e64a10317ef8ede493482f90c3cdbf81cefe3c22f1326c53087352fa61ba8a289273706c3d80b3030b679be674ec2e40c3692067d063b1c3c06b801",
|
||||
"0x41 0x6863d8947a48d1de1023e90fbbda9bcc39c6d51f7d20aa487d6dd712ee9d2faece2f3baed30776dcb7d858d5123be1652eccb284fb0c79a59787093afb67613e01",
|
||||
"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"",
|
||||
"P2PK"
|
||||
],
|
||||
[
|
||||
"0x41 0x5f4a78c77c1b27aa28abc0f33c9fc0dc4a959fb554d73d8356c79f6db5083537cb195f7ca14644300dbe0b206789838f6ed6e336f8bd62ccc240f77c1921fe0901 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
|
||||
"0x41 0xe14f9c272b2c0c4315a9a3a961452bdfe1c85393250894d8705435a92a1d507fb417b04b17672fc36599f8989a1501db6adf49f872c2129b053e1ee4d19a2fee01 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
|
||||
"DUP HASH160 0x14 0x1018853670f9f3b0582c5b9ee8ce93764ac32b93 EQUALVERIFY CHECKSIG",
|
||||
"",
|
||||
"P2PKH"
|
||||
],
|
||||
[
|
||||
"0x41 0x040f320c2201b8aa7daa5e30d2be94564e6aac8cf6d9c74bd19e39839b4405a3bbcce62918cd7f1b8e26965c9634543c806fc032277be0b198f21ab106ee90ca81",
|
||||
"0x41 0x24a1b836adccc99fe3f4a7f867d7fb23abc8d75e82da17ddd02bd672534052c178d601c92f6d1a4469b1c20f92ed02f0be0166393a3f58a571b465b2a8580f3181",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"",
|
||||
"P2PK anyonecanpay"
|
||||
],
|
||||
[
|
||||
"0x41 0xa6637f9b08d85bab62929779dc1d0d7627e542d27a9b83e81b1f5dea098b9f56913be9fbeca898a60e26c18969d9458e83f782a7832f3d0346dddc79447d078301 0x23 0x210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
|
||||
"0x41 0xcb1e1098bb0ddaf5d6a6f50db6413215650b4e835491fce4298e8184cacde6db43ce6ff01009da60261f3d1f2b44a9f88cac3dbf49376903c126af9752e6010301 0x23 0x210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
|
||||
"HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL",
|
||||
"P2SH",
|
||||
"P2SH(P2PK)"
|
||||
],
|
||||
[
|
||||
"0x41 0xa594654c074e82156a9d47a46fd78f105e0d200eae1fb198c95edb297fbf4bbbe7292da1c68fa7563ee1f448ffb1cc00757c4e9b52930bef0bcef3cc7f044ce701 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
|
||||
"0x41 0x2ad332eb13e9a12fb8523f3fc111f24f1cda20640d18e4d919e2eea55787577db86ca96927864bef877392002877102ffa9758b4229d551605d1ba2dd4cf0c3e01 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
|
||||
"HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL",
|
||||
"",
|
||||
"P2SH(P2PKH), bad sig but no VERIFY_P2SH"
|
||||
],
|
||||
[
|
||||
"0 0x41 0xb852c8c7207c813acd1e002fb98a63327324db6474782558f1726750df6544a3b898c43bb0ddee5848c34e45b719cee1559d8d74b789eef83665d43dca5f243c01 0x41 0xd8bf0745999d38500ecc503ca0941c5d7103272428ca6733cad1ae4b19e97d0b021479b53242476dbab1b19d10c065d0373ffa01f0bfeb15e72c941ab7bc8c1b01 0x41 0xaaa573ffdcf283a4aa608b81540e0bab4a8d2aa2e8bffe030736831c3399e360c78eab9ebf8da9d98c6306409ad752fcbc762222828dc3e54a7d2594d7fb728b01",
|
||||
"0 0x41 0x082a5b36197f3ef39b4ea265f4097060fe417ab1aa20fc05242a839d348ba17637c3cc8c1b9f7c450f89fe9e97d8fdb1920c96032e96ecebfebb19e556acdb7501 0x41 0x8146998a3deda65def2fd9c86ca5d890e662068ebffe6b678c8c9e2860460f5580ec3974d07f319b98b760e97457896b4a235c270f3ec2f2a0b96cf1013a972801 0x41 0xaacbc3c37cbef61dc7fd3c8a10fad5c6980100b2ed665a1e43ab7560527e550f188a2203c24ef8a68638bc2ce628ea30a0706f62ac6731deb07829d4266ee6fe01",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
|
||||
"",
|
||||
"3-of-3"
|
||||
],
|
||||
[
|
||||
"0 0x41 0xc98cdd05746c1232eee979e134680a47b53f14f484a35aaf4ece9487e1010f4240ed76d2acf6dc641b66ed1c1d331d663ff47ba749f8f50f7188f9e6c230944b01 0x41 0xe586a5bd52a49f3a7be3dbd3d03f5401f8d0d5b512e0d338a594cd09caad40234af81dca46da41e9926ec601655635af8d1ec75e8864808885ecf1c2555afdf801 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
|
||||
"0 0x41 0xee6fd0ab43c8119f331c973f25b9e546d02dea5611114d06ec1a041f59713bcc3fa8bb5e2bb866169f40524bf774fdfb5915765f7140da74c3f1ae556f8bd8e301 0x41 0xfe509993538960f7283ae7e2bd522dbae231d82df5747362acdd5bb5a8af7a6111175adcb712e19e413dea5b2fefeea12c5be84c8fa9244475eed443e835e1aa01 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
|
||||
"HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL",
|
||||
"P2SH",
|
||||
"P2SH(2-of-3)"
|
||||
],
|
||||
[
|
||||
"0x41 0x4196ce2d3cfbb5f81aa894153cbf59a6a07281a8b2beb14f0d5ba034f9a5c41de0f5f4a2d9d932c961e1e500bdae14dac64cc0ed5ede10cb7df62a2616a618cd01",
|
||||
"0x41 0x985b28b02ac1e49e31d6b299606793792ea66b400853bab3189a851b558f5b4732faf7ffda7e238517d26117b50b609bd89eb8071529c0d7c91419914c4fc4ed01",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"",
|
||||
"P2PK with hybrid pubkey but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0 0x41 0x5d781335e74c423e6b5b26b20b3fe6760e0ce4395f16462a8f69c019661618af0550aad9d20c56b8b156a33aa428f3b026a4b79c807a500df5f9c4de3b3cc21d01",
|
||||
"0 0x41 0x89030f48b7bbecea19c6342eb6d06cff8e9c77bef4d42baee29c233e98d6b07c9dcc81e8b23f66c21fcbfb343a4e98e892e3c2fbe88db6f36a40699db678be8901",
|
||||
"1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"",
|
||||
"1-of-2 with the second 1 hybrid pubkey and no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0 0x41 0x5d781335e74c423e6b5b26b20b3fe6760e0ce4395f16462a8f69c019661618af0550aad9d20c56b8b156a33aa428f3b026a4b79c807a500df5f9c4de3b3cc21d01",
|
||||
"0 0x41 0x89030f48b7bbecea19c6342eb6d06cff8e9c77bef4d42baee29c233e98d6b07c9dcc81e8b23f66c21fcbfb343a4e98e892e3c2fbe88db6f36a40699db678be8901",
|
||||
"1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"STRICTENC",
|
||||
"1-of-2 with the second 1 hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x41 0x91896eb451aa34bedeedeb8e042c5de0d1774fa6151705eec402aa949523fad55c7067d80542f01892ff89ba1a703aca6adc9038f1d4e8541c66212512f4620505",
|
||||
"0x41 0x363b42595805a7ce5a43626f0c6ede3b10100df481870c92fd08f1bf5934c5ee8e57be83ffdb63d4456a994ede9ec8f31b90b0e82cace0dbeb1a6cdefd405fbc05",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"",
|
||||
"P2PK with undefined hashtype but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"1 0x41 0xb852c8c7207c813acd1e002fb98a63327324db6474782558f1726750df6544a3b898c43bb0ddee5848c34e45b719cee1559d8d74b789eef83665d43dca5f243c01 0x41 0xd8bf0745999d38500ecc503ca0941c5d7103272428ca6733cad1ae4b19e97d0b021479b53242476dbab1b19d10c065d0373ffa01f0bfeb15e72c941ab7bc8c1b01 0x41 0xaaa573ffdcf283a4aa608b81540e0bab4a8d2aa2e8bffe030736831c3399e360c78eab9ebf8da9d98c6306409ad752fcbc762222828dc3e54a7d2594d7fb728b01",
|
||||
"1 0x41 0x082a5b36197f3ef39b4ea265f4097060fe417ab1aa20fc05242a839d348ba17637c3cc8c1b9f7c450f89fe9e97d8fdb1920c96032e96ecebfebb19e556acdb7501 0x41 0x8146998a3deda65def2fd9c86ca5d890e662068ebffe6b678c8c9e2860460f5580ec3974d07f319b98b760e97457896b4a235c270f3ec2f2a0b96cf1013a972801 0x41 0xaacbc3c37cbef61dc7fd3c8a10fad5c6980100b2ed665a1e43ab7560527e550f188a2203c24ef8a68638bc2ce628ea30a0706f62ac6731deb07829d4266ee6fe01",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
|
||||
"",
|
||||
"3-of-3 with nonzero dummy but no NULLDUMMY"
|
||||
],
|
||||
[
|
||||
"0 0x41 0xde2fb5c3ac521e16c92a44a31bffc213dbafbf39fc370ec3aab76e2af7e4be6d33f1dea322991d3921ca483fd3db8b9f5f3f9a42b6ca3e9b561d963887d7c8b101 DUP",
|
||||
"0 0x41 0x8838a35a1b419f133675e6ef0a613a89f22992d9ca8277f63b737994e7c850bfd73055e480fcdcb62485db8c155d1d4dc0b10fa218c65794c36325ed882437f401 DUP",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"",
|
||||
"2-of-2 with two identical keys and sigs pushed using OP_DUP but no SIGPUSHONLY"
|
||||
],
|
||||
[
|
||||
"0 0x41 0xde2fb5c3ac521e16c92a44a31bffc213dbafbf39fc370ec3aab76e2af7e4be6d33f1dea322991d3921ca483fd3db8b9f5f3f9a42b6ca3e9b561d963887d7c8b101 0x41 0xde2fb5c3ac521e16c92a44a31bffc213dbafbf39fc370ec3aab76e2af7e4be6d33f1dea322991d3921ca483fd3db8b9f5f3f9a42b6ca3e9b561d963887d7c8b101",
|
||||
"0 0x41 0x8838a35a1b419f133675e6ef0a613a89f22992d9ca8277f63b737994e7c850bfd73055e480fcdcb62485db8c155d1d4dc0b10fa218c65794c36325ed882437f401 0x41 0x8838a35a1b419f133675e6ef0a613a89f22992d9ca8277f63b737994e7c850bfd73055e480fcdcb62485db8c155d1d4dc0b10fa218c65794c36325ed882437f401",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"SIGPUSHONLY",
|
||||
"2-of-2 with two identical keys and sigs pushed"
|
||||
|
|
|
|||
|
|
@ -172,11 +172,11 @@ BOOST_AUTO_TEST_CASE(key_test1)
|
|||
BOOST_CHECK(key1.Sign(hashMsg, detsig));
|
||||
BOOST_CHECK(key1C.Sign(hashMsg, detsigc));
|
||||
BOOST_CHECK(detsig == detsigc);
|
||||
BOOST_CHECK_EQUAL(HexStr(detsig), "66fd0c716c5d11ecc91fc2197af0e66cfd262ec2e6fb2819706930532d07b0236e43dd1586d12b6498173318c99e95413c8e9763b59a33cccd1328e880151e57");
|
||||
BOOST_CHECK_EQUAL(HexStr(detsig), "2c56731ac2f7a7e7f11518fc7722a166b02438924ca9d8b4d111347b81d0717543fee8d9b4c4e6130357d733b7f552f1ec620c98f3e8114f63daac6d157bf254");
|
||||
BOOST_CHECK(key2.Sign(hashMsg, detsig));
|
||||
BOOST_CHECK(key2C.Sign(hashMsg, detsigc));
|
||||
BOOST_CHECK(detsig == detsigc);
|
||||
BOOST_CHECK_EQUAL(HexStr(detsig), "f7a0ff919b2c2282846f60bc319b99ddd82ee7f88b75a053a5005de5a992eea56413aa2f5c6167babac05c8a2171253aa63b6b16a0a1e72587bfc4c5e6c32547");
|
||||
BOOST_CHECK_EQUAL(HexStr(detsig), "e7167ae0afbba6019b4c7fcfe6de79165d555e8295bd72da1b8aa1a5b54305882cd0759e456c8fd27a147f041d168357c30a8fa08b37e2e56becaebc8e904c31");
|
||||
BOOST_CHECK(key1.SignCompact(hashMsg, detsig));
|
||||
BOOST_CHECK(key1C.SignCompact(hashMsg, detsigc));
|
||||
BOOST_CHECK_EQUAL(HexStr(detsig), "1c5dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d14ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue