From c59f7562ecf49cc004d60198f93a6b3e16c2b6a9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 30 Apr 2016 21:21:48 -0500 Subject: [PATCH] test --- crypto777/iguana_secp.c | 146 ++++++++++++++++++------------------- iguana/exchanges/bitcoin.h | 4 +- iguana/iguana777.c | 3 + iguana/iguana777.h | 4 +- iguana/iguana_payments.c | 7 +- iguana/iguana_sign.c | 4 +- 6 files changed, 86 insertions(+), 82 deletions(-) diff --git a/crypto777/iguana_secp.c b/crypto777/iguana_secp.c index 32f508b7d..1328871db 100755 --- a/crypto777/iguana_secp.c +++ b/crypto777/iguana_secp.c @@ -16,14 +16,12 @@ #include #include #include "../includes/curve25519.h" -#include "../includes/curve25519.h" #include "../includes/openssl/ec.h" #include "../includes/openssl/ecdsa.h" #include "../includes/openssl/obj_mac.h" #include "../../secp256k1-zkp/include/secp256k1.h" static const char base58_chars[] = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; -struct bp_key { EC_KEY *k; }; void bn_mpi2bn(BIGNUM *vo,uint8_t *data,int32_t datalen) { @@ -139,7 +137,52 @@ out: return(be_sz); } -EC_KEY *bitcoin_privkeyset(uint8_t *oddevenp,bits256 *pubkeyp,bits256 privkey) +bits256 bitcoin_pubkey33(secp256k1_context_t *ctx,uint8_t *data,bits256 privkey) +{ + int32_t plen,flag=0; bits256 pubkey; secp256k1_pubkey_t secppub; + memset(pubkey.bytes,0,sizeof(pubkey)); + if ( ctx == 0 ) + ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY), flag++; + if ( ctx != 0 ) + { + if ( secp256k1_ec_pubkey_create(ctx,&secppub,privkey.bytes) > 0 ) + { + secp256k1_ec_pubkey_serialize(ctx,data,&plen,&secppub,1); + if ( plen == 33 ) + memcpy(pubkey.bytes,data+1,sizeof(pubkey)); + } + if ( flag != 0 ) + secp256k1_context_destroy(ctx); + } + return(pubkey); +} + +int32_t bitcoin_sign(void *ctx,uint8_t *sig,int32_t maxlen,bits256 txhash2,bits256 privkey) +{ + secp256k1_ecdsa_signature_t SIG; bits256 extra_entropy,seed; int32_t flag = 0,retval = -1,siglen = 72; + seed = rand256(0); + extra_entropy = rand256(0); + if ( ctx == 0 ) + ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY), flag++; + if ( ctx != 0 ) + { + if ( secp256k1_context_randomize(ctx,seed.bytes) > 0 ) + { + if ( secp256k1_ecdsa_sign(ctx,txhash2.bytes,&SIG,privkey.bytes,secp256k1_nonce_function_rfc6979,extra_entropy.bytes) > 0 ) + { + if ( secp256k1_ecdsa_signature_serialize_der(ctx,sig,&siglen,&SIG) > 0 ) + retval = siglen; + } + } + if ( flag != 0 ) + secp256k1_context_destroy(ctx); + } + return(retval); +} + +struct bp_key { EC_KEY *k; }; + +EC_KEY *oldbitcoin_privkeyset(uint8_t *oddevenp,bits256 *pubkeyp,bits256 privkey) { BIGNUM *bn; BN_CTX *ctx = NULL; uint8_t *ptr,tmp[33]; EC_POINT *pub_key = NULL; const EC_GROUP *group; EC_KEY *KEY = EC_KEY_new_by_curve_name(NID_secp256k1); @@ -171,31 +214,7 @@ EC_KEY *bitcoin_privkeyset(uint8_t *oddevenp,bits256 *pubkeyp,bits256 privkey) return(KEY); } -bits256 bitcoin_pubkey33(uint8_t *data,bits256 privkey) -{ - uint8_t oddeven,data2[65]; int32_t plen; bits256 pubkey; secp256k1_pubkey_t secppub; secp256k1_context_t *ctx; - EC_KEY *KEY; - if ( (KEY= bitcoin_privkeyset(&oddeven,&pubkey,privkey)) != 0 ) - { - data[0] = oddeven; - memcpy(data+1,pubkey.bytes,sizeof(pubkey)); - EC_KEY_free(KEY); - if ( (ctx= secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY)) != 0 ) - { - if ( secp256k1_ec_pubkey_create(ctx,&secppub,privkey.bytes) > 0 ) - { - secp256k1_ec_pubkey_serialize(ctx,data2,&plen,&secppub,1); - if ( memcmp(data2,data,plen) != 0 ) - printf("pubkey compare error plen.%d\n",plen); - else printf("pubkey verified\n"); - } //else printf("error secp256k1_ec_pubkey_create\n"); - secp256k1_context_destroy(ctx); - } - } else memset(pubkey.bytes,0,sizeof(pubkey)); - return(pubkey); -} - -int32_t bitcoin_verify(uint8_t *sig,int32_t siglen,uint8_t *data,int32_t datalen,uint8_t *pubkey,int32_t len) +int32_t oldbitcoin_verify(uint8_t *sig,int32_t siglen,uint8_t *data,int32_t datalen,uint8_t *pubkey,int32_t len) { ECDSA_SIG *esig; int32_t retval = -1; uint8_t tmp[33],*ptr,*sigptr = sig; EC_KEY *KEY = 0; if ( len < 0 ) @@ -236,55 +255,11 @@ int32_t bitcoin_verify(uint8_t *sig,int32_t siglen,uint8_t *data,int32_t datalen return(retval); } -/*secp256k1_context_t *secp256k1_ctx(secp256k1_context_t *ctx,uint32_t flags) -{ - //ctx->illegal_callback = default_illegal_callback; - //ctx->error_callback = default_error_callback; - secp256k1_ecmult_context_init(&ctx->ecmult_ctx); - secp256k1_ecmult_gen_context_init(&ctx->ecmult_gen_ctx); -#ifdef ENABLE_MODULE_RANGEPROOF - secp256k1_pedersen_context_init(&ctx->pedersen_ctx); - secp256k1_rangeproof_context_init(&ctx->rangeproof_ctx); -#endif - if ( (flags & SECP256K1_CONTEXT_SIGN) != 0 ) - secp256k1_ecmult_gen_context_build(&ctx->ecmult_gen_ctx,&ctx->error_callback); - if ( (flags & SECP256K1_CONTEXT_VERIFY) != 0 ) - secp256k1_ecmult_context_build(&ctx->ecmult_ctx,&ctx->error_callback); - return(ctx); -}*/ - -int32_t bitcoin_sign(uint8_t *sig,int32_t maxlen,uint8_t *data,int32_t datalen,bits256 privkey) -{ - secp256k1_context_t *ctx; secp256k1_ecdsa_signature_t SIG; bits256 extra_entropy,seed; int32_t retval = -1,siglen = 72; - if ( datalen == sizeof(bits256) ) - { - { - uint8_t pubkey[65]; - bitcoin_pubkey33(pubkey,privkey); - } - seed = rand256(0); - extra_entropy = rand256(0); - if ( (ctx= secp256k1_context_create(SECP256K1_CONTEXT_SIGN)) != 0 ) - { - if ( secp256k1_context_randomize(ctx,seed.bytes) > 0 ) - { - if ( secp256k1_ecdsa_sign(ctx,data,&SIG,privkey.bytes,secp256k1_nonce_function_rfc6979,extra_entropy.bytes) > 0 ) - { - if ( secp256k1_ecdsa_signature_serialize_der(ctx,sig,&siglen,&SIG) > 0 ) - retval = siglen; - } - } - secp256k1_context_destroy(ctx); - } - } - return(retval); -} - int32_t oldbitcoin_sign(uint8_t *sig,int32_t maxlen,uint8_t *data,int32_t datalen,bits256 privkey) { EC_KEY *KEY; uint8_t oddeven; bits256 pubkey; uint8_t *ptr; int32_t siglen,retval = -1; ECDSA_SIG *SIG; BN_CTX *ctx; const EC_GROUP *group; BIGNUM *order,*halforder; - if ( (KEY= bitcoin_privkeyset(&oddeven,&pubkey,privkey)) != 0 ) + if ( (KEY= oldbitcoin_privkeyset(&oddeven,&pubkey,privkey)) != 0 ) { if ( (SIG= ECDSA_do_sign(data,datalen,KEY)) != 0 ) { @@ -321,3 +296,28 @@ int32_t oldbitcoin_sign(uint8_t *sig,int32_t maxlen,uint8_t *data,int32_t datale } return(retval); } + +bits256 oldbitcoin_pubkey33(uint8_t *data,bits256 privkey) +{ + uint8_t oddeven,data2[65]; int32_t plen; bits256 pubkey; secp256k1_pubkey_t secppub; secp256k1_context_t *ctx; + EC_KEY *KEY; + if ( (KEY= oldbitcoin_privkeyset(&oddeven,&pubkey,privkey)) != 0 ) + { + data[0] = oddeven; + memcpy(data+1,pubkey.bytes,sizeof(pubkey)); + EC_KEY_free(KEY); + if ( (ctx= secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY)) != 0 ) + { + if ( secp256k1_ec_pubkey_create(ctx,&secppub,privkey.bytes) > 0 ) + { + secp256k1_ec_pubkey_serialize(ctx,data2,&plen,&secppub,1); + if ( memcmp(data2,data,plen) != 0 ) + printf("pubkey compare error plen.%d\n",plen); + else printf("pubkey verified\n"); + } //else printf("error secp256k1_ec_pubkey_create\n"); + secp256k1_context_destroy(ctx); + } + } else memset(pubkey.bytes,0,sizeof(pubkey)); + return(pubkey); +} + diff --git a/iguana/exchanges/bitcoin.h b/iguana/exchanges/bitcoin.h index d3739c54b..91fdd0aa3 100755 --- a/iguana/exchanges/bitcoin.h +++ b/iguana/exchanges/bitcoin.h @@ -76,8 +76,8 @@ char *iguana_scriptget(struct iguana_info *coin,char *scriptstr,char *asmstr,int int32_t bitcoin_base58decode(uint8_t *data,char *coinaddr); char *bitcoin_base58encode(char *coinaddr,uint8_t *data_,int32_t datalen); -int32_t bitcoin_sign(uint8_t *sig,int32_t maxlen,uint8_t *data,int32_t datalen,bits256 privkey); -int32_t bitcoin_verify(uint8_t *sig,int32_t siglen,uint8_t *data,int32_t datalen,uint8_t *pubkey,int32_t len); +int32_t bitcoin_sign(void *ctx,uint8_t *sig,bits256 txhash2,bits256 privkey); +int32_t oldbitcoin_verify(uint8_t *sig,int32_t siglen,uint8_t *data,int32_t datalen,uint8_t *pubkey,int32_t len); #endif diff --git a/iguana/iguana777.c b/iguana/iguana777.c index c3fd3cea7..fba4586d4 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -15,6 +15,8 @@ #include "iguana777.h" +#include "../../secp256k1-zkp/include/secp256k1.h" + const char *Hardcoded_coins[][3] = { { "BTC", "bitcoin", "0" }, { "BTCD", "BitcoinDark", "129" }, { "VPN", "VPNcoin", "129" }, { "LTC", "litecoin", "129" } , { "endmarker", "", "" } }; struct iguana_info *iguana_coinfind(const char *symbol) @@ -72,6 +74,7 @@ struct iguana_info *iguana_coinadd(const char *symbol,cJSON *argjson) else strcpy(coin->name,symbol); } coin->chain = iguana_chainfind((char *)symbol,argjson,1); + coin->ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); strcpy(coin->symbol,symbol); iguana_initcoin(coin,argjson); } diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 12d80f74c..f22d4f141 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -496,7 +496,7 @@ struct iguana_info struct tai starttime; double startmillis; struct iguana_chain *chain; struct iguana_iAddr *iAddrs; - + void *ctx; struct iguana_bitmap screen; //struct pollfd fds[IGUANA_MAXPEERS]; struct iguana_peer bindaddr; int32_t numsocks; struct OS_memspace TXMEM,MEM,MEMB[IGUANA_MAXBUNDLESIZE]; @@ -919,7 +919,7 @@ int32_t iguana_process_msgrequestQ(struct iguana_info *coin); uint32_t iguana_fastfindinit(struct iguana_info *coin); int32_t iguana_unspentindfind(struct iguana_info *coin,char *coinaddr,uint8_t *spendscript,int32_t *scriptlenp,uint64_t *valuep,int32_t *heightp,bits256 txid,int32_t vout,int32_t lasthdrsi); int32_t iguana_addressvalidate(struct iguana_info *coin,uint8_t *addrtypep,uint8_t rmd160[20],char *address); -int32_t bitcoin_sign(uint8_t *sig,int32_t maxlen,uint8_t *data,int32_t datalen,bits256 privkey); +int32_t bitcoin_sign(void *ctx,uint8_t *sig,bits256 txhash2,bits256 privkey); bits256 iguana_str2priv(struct supernet_info *myinfo,struct iguana_info *coin,char *str); int32_t iguana_spentflag(struct iguana_info *coin,int64_t *RTspendp,int32_t *spentheightp,struct iguana_ramchain *ramchain,int16_t spent_hdrsi,uint32_t spent_unspentind,int32_t height,int32_t minconf,int32_t maxconf,uint64_t amount); int32_t iguana_voutscript(struct iguana_info *coin,struct iguana_bundle *bp,uint8_t *scriptspace,char *asmstr,struct iguana_unspent *u,struct iguana_pkhash *p,int32_t txi); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index e86a407db..998359ddc 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -389,7 +389,7 @@ HASH_AND_TWOINTS(bitcoinrpc,gettxout,txid,vout,mempool) TWO_STRINGS(bitcoinrpc,signmessage,address,messagestr) { - bits256 privkey; int32_t n,len,siglen; char sigstr[256],sig64str[256]; uint8_t sig[128],*message=0; cJSON *retjson = cJSON_CreateObject(); + bits256 privkey,hash2; int32_t n,len,siglen; char sigstr[256],sig64str[256]; uint8_t sig[128],*message=0; cJSON *retjson = cJSON_CreateObject(); if ( coin != 0 ) { privkey = iguana_str2priv(myinfo,coin,address); @@ -400,9 +400,10 @@ TWO_STRINGS(bitcoinrpc,signmessage,address,messagestr) { message = malloc(n-2); decode_hex(message,n-2,messagestr+2); - n -= 2; + n--; } else message = (uint8_t *)messagestr, n <<= 1; - if ( (siglen= bitcoin_sign(sig,sizeof(sig),message,n,privkey)) > 0 ) + hash2 = bits256_doublesha256(0,message,n); + if ( (siglen= bitcoin_sign(coin->ctx,sig,hash2,privkey)) > 0 ) { sigstr[0] = sig64str[0] = 0; //init_hexbytes_noT(sigstr,sig,siglen); diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index b7af16d94..4a06dd42e 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -696,7 +696,7 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,bits256 *signedtxidp,char ** sigtxid.bytes[31-i] = revsigtxid.bytes[i]; if ( 1 && bits256_nonz(vp->signers[j].privkey) != 0 ) { - siglen = bitcoin_sign(vp->signers[j].sig,sizeof(vp->signers[j].sig),sigtxid.bytes,sizeof(sigtxid),vp->signers[j].privkey); + siglen = bitcoin_sign(coin->ctx,vp->signers[j].sig,sigtxid,vp->signers[j].privkey); sig = vp->signers[j].sig; sig[siglen++] = hashtype; vp->signers[j].siglen = siglen; @@ -707,7 +707,7 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,bits256 *signedtxidp,char ** // s2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1; printf(" SIGNEDTX.[%02x] plen.%d siglen.%d\n",sig[siglen-1],plen,siglen); } - if ( bitcoin_verify(sig,siglen,sigtxid.bytes,sizeof(sigtxid),vp->signers[j].pubkey,bitcoin_pubkeylen(vp->signers[j].pubkey)) < 0 ) + if ( oldbitcoin_verify(sig,siglen,sigtxid.bytes,sizeof(sigtxid),vp->signers[j].pubkey,bitcoin_pubkeylen(vp->signers[j].pubkey)) < 0 ) { init_hexbytes_noT(bigstr,serialized,n2); printf("(%s) doesnt verify hash2.%s\n",bigstr,bits256_str(str,sigtxid));