Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
c59f7562ec
  1. 146
      crypto777/iguana_secp.c
  2. 4
      iguana/exchanges/bitcoin.h
  3. 3
      iguana/iguana777.c
  4. 4
      iguana/iguana777.h
  5. 7
      iguana/iguana_payments.c
  6. 4
      iguana/iguana_sign.c

146
crypto777/iguana_secp.c

@ -16,14 +16,12 @@
#include <ctype.h>
#include <string.h>
#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);
}

4
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

3
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);
}

4
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);

7
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);

4
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));

Loading…
Cancel
Save