diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index 960250d72..b99fc7f78 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -62,7 +62,7 @@ static char* cJSON_strdup(const char* str) char* copy; len = strlen(str) + 1; - if (!(copy = (char*)cJSON_malloc(len))) return 0; + if (!(copy = (char*)cJSON_malloc(len+1))) return 0; memcpy(copy,str,len); return copy; } @@ -137,7 +137,7 @@ static char *print_number(cJSON *item) } else { - str = (char *)cJSON_malloc(64); /* This is a nice tradeoff. */ + str = (char *)cJSON_malloc(66); /* This is a nice tradeoff. */ if ( str != 0 ) { if ( fabs(floor(d) - d) <= DBL_EPSILON && fabs(d) < 1.0e60 ) @@ -172,7 +172,7 @@ static const char *parse_string(cJSON *item,const char *str) while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; /* Skip escaped quotes. */ - out=(char*)cJSON_malloc(len+1); /* This is how long we need for the string, roughly. */ + out=(char*)cJSON_malloc(len+2); /* This is how long we need for the string, roughly. */ if (!out) return 0; ptr=str+1;ptr2=out; @@ -232,7 +232,7 @@ static char *print_string_ptr(const char *str) if (!str) return cJSON_strdup(""); ptr=str;while ((token=*ptr) && ++len) {if (strchr("\"\\\b\f\n\r\t",token)) len++; else if (token<32) len+=5;ptr++;} - out=(char*)cJSON_malloc(len+3); + out=(char*)cJSON_malloc(len+3+1); if (!out) return 0; ptr2=out;ptr=str; @@ -376,12 +376,12 @@ static char *print_array(cJSON *item,int32_t depth,int32_t fmt) /* Explicitly handle numentries==0 */ if (!numentries) { - out=(char*)cJSON_malloc(3); + out=(char*)cJSON_malloc(3+1); if (out) strcpy(out,"[]"); return out; } /* Allocate an array to hold the values for each */ - entries=(char**)cJSON_malloc(numentries*sizeof(char*)); + entries=(char**)cJSON_malloc((1+numentries)*sizeof(char*)); if (!entries) return 0; memset(entries,0,numentries*sizeof(char*)); /* Retrieve all the results: */ @@ -395,7 +395,7 @@ static char *print_array(cJSON *item,int32_t depth,int32_t fmt) } /* If we didn't fail, try to malloc the output string */ - if (!fail) out=(char*)cJSON_malloc(len); + if (!fail) out=(char*)cJSON_malloc(len+1); /* If that fails, we fail. */ if (!out) fail=1; @@ -469,7 +469,7 @@ static char *print_object(cJSON *item,int32_t depth,int32_t fmt) /* Explicitly handle empty object case */ if (!numentries) { - out=(char*)cJSON_malloc(fmt?depth+4:3); + out=(char*)cJSON_malloc(fmt?depth+4+1:3+1); if (!out) return 0; ptr=out;*ptr++='{'; if (fmt) {*ptr++='\n';for (i=0;i>=8) - buf[i] = (t & 0xff); - sig->timestamp = timestamp; + int32_t len = 0; bits256 pubkey; bits256 shared; uint8_t buf[sizeof(*sig)]; + pubkey = acct777_pubkey(privkey); + if ( memcmp(sig->pubkey.bytes,otherpubkey.bytes,sizeof(bits256)) != 0 ) + { + //char str[65],str2[65]; + //printf("set sig fields.(%s) != (%s)\n",bits256_str(str,sig->pubkey),bits256_str(str2,otherpubkey)); + sig->pubkey = pubkey; + sig->timestamp = timestamp; + sig->allocsize = (int32_t)(datalen + sizeof(*sig)); + sig->signer64bits = acct777_nxt64bits(sig->pubkey); + } shared = curve25519(privkey,otherpubkey); - memcpy(&buf[sizeof(timestamp)],shared.bytes,sizeof(shared)); - vcalc_sha256cat(sig->sigbits.bytes,buf,sizeof(buf),data,datalen); - sig->pubkey = acct777_pubkey(privkey), sig->signer64bits = acct777_nxt64bits(sig->pubkey); - //printf(" calcsig.%llx pubkey.%llx signer.%llu | t%u crc.%08x len.%d shared.%llx <- %llx * %llx\n",(long long)sig->sigbits.txid,(long long)sig->pubkey.txid,(long long)sig->signer64bits,timestamp,_crc32(0,data,datalen),datalen,(long long)shared.txid,(long long)privkey.txid,(long long)otherpubkey.txid); + memset(buf,0,sizeof(buf)); + iguana_rwbignum(1,&buf[len],sizeof(bits256),shared.bytes), len += sizeof(bits256); + iguana_rwbignum(1,&buf[len],sizeof(bits256),sig->pubkey.bytes),len += sizeof(bits256); + iguana_rwnum(1,&buf[len],sizeof(sig->signer64bits),&sig->signer64bits),len += sizeof(sig->signer64bits); + iguana_rwnum(1,&buf[len],sizeof(sig->timestamp),&sig->timestamp),len += sizeof(sig->timestamp); + iguana_rwnum(1,&buf[len],sizeof(sig->allocsize),&sig->allocsize),len += sizeof(sig->allocsize); + //int32_t i; for (i=0; isigbits.bytes,buf,sizeof(buf),serialized,datalen); + //printf(" calcsig.%llx pubkey.%llx signer.%llu | t%u crc.%08x len.%d shared.%llx <- %llx * %llx\n",(long long)sig->sigbits.txid,(long long)sig->pubkey.txid,(long long)sig->signer64bits,timestamp,calc_crc32(0,serialized,datalen),datalen,(long long)shared.txid,(long long)privkey.txid,(long long)otherpubkey.txid); return(sig->signer64bits); } -uint64_t acct777_validate(struct acct777_sig *sig,uint32_t timestamp,uint8_t *data,int32_t datalen) +uint64_t acct777_validate(struct acct777_sig *sig,bits256 privkey,bits256 pubkey) { - struct acct777_sig checksig; uint64_t signerbits; - acct777_sign(&checksig,acct777_msgpubkey(data,datalen),sig->pubkey,timestamp,data,datalen); + struct acct777_sig checksig; uint64_t signerbits; int32_t datalen; + datalen = (int32_t)(sig->allocsize - sizeof(*sig)); + checksig = *sig; + acct777_sign(&checksig,privkey,pubkey,sig->timestamp,sig->serialized,datalen); if ( memcmp(checksig.sigbits.bytes,sig->sigbits.bytes,sizeof(checksig.sigbits)) != 0 ) { printf("sig compare error using sig->pub from %llu\n",(long long)acct777_nxt64bits(sig->pubkey)); @@ -1786,12 +1809,12 @@ uint64_t acct777_signtx(struct acct777_sig *sig,bits256 privkey,uint32_t timesta return(acct777_sign(sig,privkey,acct777_msgpubkey(data,datalen),timestamp,data,datalen)); } -uint64_t acct777_swaptx(bits256 privkey,struct acct777_sig *sig,uint32_t timestamp,uint8_t *data,int32_t datalen) +/*uint64_t acct777_swaptx(bits256 privkey,struct acct777_sig *sig,uint32_t timestamp,uint8_t *data,int32_t datalen) { uint64_t othernxt; - if ( (othernxt= acct777_validate(sig,timestamp,data,datalen)) != sig->signer64bits ) + if ( (othernxt= acct777_validate(sig)) != sig->signer64bits ) return(0); return(acct777_sign(sig,privkey,acct777_msgpubkey(data,datalen),timestamp,data,datalen)); -} +}*/ #undef force_inline diff --git a/crypto777/iguana_utils.c b/crypto777/iguana_utils.c index bb182a9e3..075cce138 100755 --- a/crypto777/iguana_utils.c +++ b/crypto777/iguana_utils.c @@ -289,8 +289,11 @@ int32_t decode_hex(unsigned char *bytes,int32_t n,char *hex) } if ( n == 0 || (hex[n*2+1] == 0 && hex[n*2] != 0) ) { - bytes[0] = unhex(hex[0]); - printf("decode_hex n.%d hex[0] (%c) -> %d hex.(%s) [n*2+1: %d] [n*2: %d %c] len.%ld\n",n,hex[0],bytes[0],hex,hex[n*2+1],hex[n*2],hex[n*2],(long)strlen(hex)); + if ( n > 0 ) + { + bytes[0] = unhex(hex[0]); + printf("decode_hex n.%d hex[0] (%c) -> %d hex.(%s) [n*2+1: %d] [n*2: %d %c] len.%ld\n",n,hex[0],bytes[0],hex,hex[n*2+1],hex[n*2],hex[n*2],(long)strlen(hex)); + } #ifdef __APPLE__ getchar(); #endif diff --git a/iguana/SuperNET_hexmsg.c b/iguana/SuperNET_hexmsg.c index 623461f60..0fe2b33a4 100644 --- a/iguana/SuperNET_hexmsg.c +++ b/iguana/SuperNET_hexmsg.c @@ -26,7 +26,7 @@ int32_t SuperNET_hexmsgfind(struct supernet_info *myinfo,bits256 category,bits25 if ( bits256_nonz(subhash) == 0 ) subhash = GENESIS_PUBKEY; packethash = curve25519(category,packethash); - printf("addflag.%d packethash.%llx dest.%llx\n",addflag,(long long)packethash.txid,(long long)category.txid); + //printf("addflag.%d packethash.%llx dest.%llx\n",addflag,(long long)packethash.txid,(long long)category.txid); for (i=0; iprivkey,bits256_str(str,myinfo->privkey)); if ( (json= cJSON_Parse(jsonstr)) != 0 ) { method = jstr(json,"method"); @@ -149,7 +151,7 @@ int32_t iguana_jsonQ() } if ( (ptr= queue_dequeue(&jsonQ,0)) != 0 ) { - //printf("process.(%s)\n",ptr->jsonstr); + char str[65]; printf("ptr %p %s\n",&ptr->myinfo->privkey,bits256_str(str,ptr->myinfo->privkey)); if ( *ptr->retjsonstrp != 0 && (*ptr->retjsonstrp= SuperNET_jsonstr(ptr->myinfo,ptr->jsonstr,ptr->remoteaddr)) == 0 ) *ptr->retjsonstrp = clonestr("{\"error\":\"null return from iguana_jsonstr\"}"); //printf("finished.(%s) -> (%s)\n",ptr->jsonstr,*ptr->retjsonstrp!=0?*ptr->retjsonstrp:"null return"); @@ -192,7 +194,7 @@ char *iguana_blockingjsonstr(struct supernet_info *myinfo,char *jsonstr,uint64_t char *SuperNET_processJSON(struct supernet_info *myinfo,cJSON *json,char *remoteaddr) { cJSON *retjson; uint64_t tag; uint32_t timeout; char *jsonstr,*method; char *retjsonstr,*retstr = 0; - //printf("SuperNET_JSON.(%s) remoteaddr.(%s)\n",jprint(json,0),remoteaddr!=0?remoteaddr:""); + //char str[65]; printf("processJSON %p %s\n",&myinfo->privkey,bits256_str(str,myinfo->privkey)); if ( json != 0 ) { if ( (tag= j64bits(json,"tag")) == 0 ) @@ -272,14 +274,15 @@ void iguana_main(void *arg) { FILE *fp; cJSON *json; uint8_t *space,secretbuf[512]; uint32_t r; long allocsize; char helperstr[64],fname[512],*wallet2,*wallet2str,*tmpstr,*confstr,*helperargs,*ipaddr,*coinargs=0,*secret,*jsonstr = arg; + struct supernet_info *myinfo; int32_t i,len,flag,c; bits256 acct,seed,checkhash,wallethash,walletpub,wallet2shared,wallet2priv,wallet2pub; - memset(&MYINFO,0,sizeof(MYINFO)); + myinfo = SuperNET_MYINFO(0); mycalloc(0,0,0); iguana_initQ(&helperQ,"helperQ"); OS_ensure_directory("confs"); OS_ensure_directory("DB"); OS_ensure_directory("tmp"); - if ( (tmpstr= SuperNET_JSON(&MYINFO,cJSON_Parse("{\"agent\":\"SuperNET\",\"method\":\"help\"}"),0)) != 0 ) + if ( (tmpstr= SuperNET_JSON(myinfo,cJSON_Parse("{\"agent\":\"SuperNET\",\"method\":\"help\"}"),0)) != 0 ) { if ( (API_json= cJSON_Parse(tmpstr)) != 0 && (API_json= jobj(API_json,"result")) != 0 ) API_json = jobj(API_json,"API"); @@ -326,11 +329,11 @@ void iguana_main(void *arg) walletpub = curve25519(wallethash,curve25519_basepoint9()); seed = curve25519_shared(wallethash,wallet2pub); vcalc_sha256(0,wallet2shared.bytes,seed.bytes,sizeof(bits256)); - OS_randombytes(MYINFO.persistent_priv.bytes,sizeof(MYINFO.privkey)); - MYINFO.myaddr.persistent = curve25519(MYINFO.persistent_priv,curve25519_basepoint9()); - vcalc_sha256(0,acct.bytes,(void *)MYINFO.myaddr.persistent.bytes,sizeof(bits256)); - MYINFO.myaddr.nxt64bits = acct.txid; - RS_encode(MYINFO.myaddr.NXTADDR,MYINFO.myaddr.nxt64bits); + OS_randombytes(myinfo->persistent_priv.bytes,sizeof(myinfo->privkey)); + myinfo->myaddr.persistent = curve25519(myinfo->persistent_priv,curve25519_basepoint9()); + vcalc_sha256(0,acct.bytes,(void *)myinfo->myaddr.persistent.bytes,sizeof(bits256)); + myinfo->myaddr.nxt64bits = acct.txid; + RS_encode(myinfo->myaddr.NXTADDR,myinfo->myaddr.nxt64bits); if ( bits256_nonz(wallet2shared) > 0 ) sprintf(fname,"confs/iguana.%llu",(long long)wallet2shared.txid); else sprintf(fname,"confs/iguana.conf"); @@ -348,28 +351,28 @@ void iguana_main(void *arg) if ( json != 0 ) { if ( (ipaddr= jstr(json,"ipaddr")) != 0 && is_ipaddr(ipaddr) != 0 ) - strcpy(MYINFO.ipaddr,ipaddr); + strcpy(myinfo->ipaddr,ipaddr); if ( (secret= jstr(json,"secret")) != 0 ) { - MYINFO.myaddr.nxt64bits = conv_NXTpassword(MYINFO.persistent_priv.bytes,MYINFO.myaddr.persistent.bytes,(uint8_t *)secret,(int32_t)strlen(secret)); - RS_encode(MYINFO.myaddr.NXTADDR,MYINFO.myaddr.nxt64bits); + myinfo->myaddr.nxt64bits = conv_NXTpassword(myinfo->persistent_priv.bytes,myinfo->myaddr.persistent.bytes,(uint8_t *)secret,(int32_t)strlen(secret)); + RS_encode(myinfo->myaddr.NXTADDR,myinfo->myaddr.nxt64bits); } else { - MYINFO.persistent_priv = jbits256(json,"persistent_priv"); - if ( bits256_nonz(MYINFO.persistent_priv) == 0 ) + myinfo->persistent_priv = jbits256(json,"persistent_priv"); + if ( bits256_nonz(myinfo->persistent_priv) == 0 ) { printf("null persistent_priv? generate new one\n"); - OS_randombytes(MYINFO.persistent_priv.bytes,sizeof(MYINFO.privkey)); + OS_randombytes(myinfo->persistent_priv.bytes,sizeof(myinfo->privkey)); } - MYINFO.myaddr.persistent = jbits256(json,"persistent_pub"); - checkhash = curve25519(MYINFO.persistent_priv,curve25519_basepoint9()); + myinfo->myaddr.persistent = jbits256(json,"persistent_pub"); + checkhash = curve25519(myinfo->persistent_priv,curve25519_basepoint9()); } free_json(json); - if ( memcmp(checkhash.bytes,MYINFO.myaddr.persistent.bytes,sizeof(checkhash)) != 0 ) + if ( memcmp(checkhash.bytes,myinfo->myaddr.persistent.bytes,sizeof(checkhash)) != 0 ) { printf("persistent pubkey mismatches one in iguana.conf\n"); - MYINFO.myaddr.persistent = checkhash; + myinfo->myaddr.persistent = checkhash; confstr = 0; } } else printf("Cant parse.(%s)\n",confstr), confstr = 0; @@ -385,37 +388,37 @@ void iguana_main(void *arg) printf("got ipaddr.(%s) %x\n",ipaddr,is_ipaddr(ipaddr)); if ( is_ipaddr(ipaddr) != 0 ) { - strcpy(MYINFO.ipaddr,ipaddr); - MYINFO.myaddr.selfipbits = (uint32_t)calc_ipbits(ipaddr); + strcpy(myinfo->ipaddr,ipaddr); + myinfo->myaddr.selfipbits = (uint32_t)calc_ipbits(ipaddr); } free(ipaddr); } - if ( MYINFO.myaddr.selfipbits == 0 ) + if ( myinfo->myaddr.selfipbits == 0 ) { - strcpy(MYINFO.ipaddr,"127.0.0.1"); - MYINFO.myaddr.selfipbits = (uint32_t)calc_ipbits(MYINFO.ipaddr); + strcpy(myinfo->ipaddr,"127.0.0.1"); + myinfo->myaddr.selfipbits = (uint32_t)calc_ipbits(myinfo->ipaddr); } - OS_randombytes(MYINFO.privkey.bytes,sizeof(MYINFO.privkey)); - MYINFO.myaddr.pubkey = curve25519(MYINFO.privkey,curve25519_basepoint9()); - vcalc_sha256(0,acct.bytes,(void *)MYINFO.myaddr.persistent.bytes,sizeof(bits256)); - MYINFO.myaddr.nxt64bits = acct.txid; - RS_encode(MYINFO.myaddr.NXTADDR,MYINFO.myaddr.nxt64bits); - char str[65],str2[65]; printf("%s %llu PRIV.%s PUB.%s persistent.%llx %llx\n",MYINFO.myaddr.NXTADDR,(long long)MYINFO.myaddr.nxt64bits,bits256_str(str,MYINFO.privkey),bits256_str(str2,MYINFO.myaddr.pubkey),(long long)MYINFO.persistent_priv.txid,(long long)MYINFO.myaddr.persistent.txid); + OS_randombytes(myinfo->privkey.bytes,sizeof(myinfo->privkey)); + myinfo->myaddr.pubkey = curve25519(myinfo->privkey,curve25519_basepoint9()); + vcalc_sha256(0,acct.bytes,(void *)myinfo->myaddr.persistent.bytes,sizeof(bits256)); + myinfo->myaddr.nxt64bits = acct.txid; + RS_encode(myinfo->myaddr.NXTADDR,myinfo->myaddr.nxt64bits); + char str[65],str2[65]; printf("%s %llu %p PRIV.%s PUB.%s persistent.%llx %llx\n",myinfo->myaddr.NXTADDR,(long long)myinfo->myaddr.nxt64bits,&myinfo->privkey,bits256_str(str,myinfo->privkey),bits256_str(str2,myinfo->myaddr.pubkey),(long long)myinfo->persistent_priv.txid,(long long)myinfo->myaddr.persistent.txid); if ( confstr == 0 ) { uint8_t *compressed,*serialized; int32_t complen,maxsize = IGUANA_MAXPACKETSIZE; json = cJSON_CreateObject(); jaddstr(json,"agent","SuperNET"); jaddstr(json,"method","saveconf"); - jaddstr(json,"myipaddr",MYINFO.ipaddr); - jaddbits256(json,"persistent_priv",MYINFO.persistent_priv); - jaddbits256(json,"persistent_pub",MYINFO.myaddr.persistent); + jaddstr(json,"myipaddr",myinfo->ipaddr); + jaddbits256(json,"persistent_priv",myinfo->persistent_priv); + jaddbits256(json,"persistent_pub",myinfo->myaddr.persistent); compressed = calloc(1,maxsize); serialized = calloc(1,maxsize); if ( strcmp("confs/iguana.conf",fname) != 0 ) { //sprintf(fname,"confs/iguana.%llu",(long long)wallet2shared.txid); - //if ( SuperNET_json2bits(MYINFO.ipaddr,wallethash,walletpub,wallet2shared,serialized,&complen,compressed,maxsize,MYINFO.ipaddr,wallet2pub,json) > 0 ) + //if ( SuperNET_json2bits(myinfo->ipaddr,wallethash,walletpub,wallet2shared,serialized,&complen,compressed,maxsize,myinfo->ipaddr,wallet2pub,json) > 0 ) { complen = (int32_t)strlen(jprint(json,0)); printf("save (%s) <- %d\n",fname,complen); @@ -459,7 +462,7 @@ void iguana_main(void *arg) helperargs = clonestr(helperstr); iguana_launch(iguana_coinadd("BTCD"),"iguana_helper",iguana_helper,helperargs,IGUANA_PERMTHREAD); } - iguana_launch(iguana_coinadd("BTCD"),"rpcloop",iguana_rpcloop,iguana_coinadd("BTCD"),IGUANA_PERMTHREAD); + iguana_launch(iguana_coinadd("BTCD"),"rpcloop",iguana_rpcloop,SuperNET_MYINFO(0),IGUANA_PERMTHREAD); if ( coinargs != 0 ) iguana_launch(iguana_coinadd("BTCD"),"iguana_coins",iguana_coins,coinargs,IGUANA_PERMTHREAD); else if ( 1 ) diff --git a/iguana/pangea_api.c b/iguana/pangea_api.c index 588638557..db3aad74f 100755 --- a/iguana/pangea_api.c +++ b/iguana/pangea_api.c @@ -20,10 +20,6 @@ struct pangea_msghdr { struct acct777_sig sig __attribute__((packed)); - int32_t allocsize __attribute__((packed)); - bits256 tablehash __attribute__((packed)); - uint32_t ipbits __attribute__((packed)); - uint8_t data[]; } __attribute__((packed)); cJSON *pangea_lobbyjson(struct supernet_info *myinfo) @@ -37,36 +33,26 @@ int32_t pangea_updatemsg(struct supernet_info *myinfo,struct pangea_msghdr *pm,i return(0); } - -int32_t pangea_validate(struct pangea_msghdr *pm,int32_t size) +int32_t pangea_validate(struct pangea_msghdr *pm,bits256 privkey,bits256 pubkey) { uint64_t signerbits; - if ( size == pm->allocsize ) - { - printf("pangea message size mismatch %d != %d\n",size,pm->allocsize); - return(-1); - } - if ( (signerbits = acct777_validate(&pm->sig,pm->sig.timestamp,&((uint8_t *)pm)[sizeof(pm->sig)],pm->allocsize-sizeof(pm->sig))) != 0 ) + if ( (signerbits= acct777_validate(&pm->sig,privkey,pubkey)) != 0 ) { return(0); } return(-1); } -struct pangea_msghdr *pangea_msgcreate(struct supernet_info *myinfo,uint8_t *space,bits256 tablehash,uint8_t *data,int32_t datalen) +struct pangea_msghdr *pangea_msgcreate(struct supernet_info *myinfo,uint8_t *space,bits256 tablehash,uint8_t *serialized,int32_t datalen) { - struct pangea_msghdr *pm = (struct pangea_msghdr *)space; + bits256 otherpubkey; uint32_t timestamp; struct pangea_msghdr *pm = (struct pangea_msghdr *)space; memset(pm,0,sizeof(*pm)); - pm->sig.pubkey = myinfo->myaddr.pubkey; - pm->sig.signer64bits = acct777_nxt64bits(pm->sig.pubkey); - pm->sig.timestamp = (uint32_t)time(NULL); + otherpubkey = acct777_msgpubkey(serialized,datalen); if ( datalen > 0 ) - memcpy(pm->data,data,datalen); - pm->allocsize = (int32_t)(sizeof(*pm) + datalen); - pm->tablehash = tablehash; - pm->ipbits = myinfo->myaddr.myipbits; - acct777_sign(&pm->sig,myinfo->privkey,tablehash,pm->sig.timestamp,&space[sizeof(pm->sig)],pm->allocsize); - if ( pangea_validate(pm,pm->allocsize) == 0 ) + memcpy(pm->sig.serialized,serialized,datalen); + timestamp = (uint32_t)time(NULL); + acct777_sign(&pm->sig,myinfo->privkey,otherpubkey,timestamp,serialized,datalen); + if ( pangea_validate(pm,acct777_msgprivkey(serialized,datalen),pm->sig.pubkey) == 0 ) return(pm); else printf("error validating pangea msg\n"); return(0); @@ -78,8 +64,7 @@ void pangea_update(struct supernet_info *myinfo) pangeahash = calc_categoryhashes(0,"pangea",0); while ( (m= category_gethexmsg(myinfo,pangeahash,GENESIS_PUBKEY)) != 0 ) { - if ( pangea_validate((struct pangea_msghdr *)m->msg,m->len) == 0 ) - pangea_updatemsg(myinfo,(struct pangea_msghdr *)m->msg,m->len); + pangea_updatemsg(myinfo,(struct pangea_msghdr *)m->msg,m->len); free(m); } } @@ -476,134 +461,134 @@ char *Pangea_bypass(uint64_t my64bits,uint8_t myprivkey[32],cJSON *json) #include "../includes/iguana_apidefs.h" -INT_AND_ARRAY(pangea,newhand,senderind,args) +INT_AND_ARRAY(pangea,newhand,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,ping,senderind,args) +INT_AND_ARRAY(pangea,ping,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,gotdeck,senderind,args) +INT_AND_ARRAY(pangea,gotdeck,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,ready,senderind,args) +INT_AND_ARRAY(pangea,ready,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,encoded,senderind,args) +INT_AND_ARRAY(pangea,encoded,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,final,senderind,args) +INT_AND_ARRAY(pangea,final,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,addedfunds,senderind,args) +INT_AND_ARRAY(pangea,addedfunds,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,preflop,senderind,args) +INT_AND_ARRAY(pangea,preflop,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,decoded,senderind,args) +INT_AND_ARRAY(pangea,decoded,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,card,senderind,args) +INT_AND_ARRAY(pangea,card,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,facedown,senderind,args) +INT_AND_ARRAY(pangea,facedown,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,faceup,senderind,args) +INT_AND_ARRAY(pangea,faceup,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,turn,senderind,args) +INT_AND_ARRAY(pangea,turn,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,confirmturn,senderind,args) +INT_AND_ARRAY(pangea,confirmturn,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,chat,senderind,args) +INT_AND_ARRAY(pangea,chat,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,action,senderind,args) +INT_AND_ARRAY(pangea,action,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,showdown,senderind,args) +INT_AND_ARRAY(pangea,showdown,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -INT_AND_ARRAY(pangea,handsummary,senderind,args) +INT_AND_ARRAY(pangea,handsummary,senderind,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -HASH_AND_ARRAY(pangea,status,tablehash,args) +HASH_AND_ARRAY(pangea,status,tablehash,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -HASH_AND_ARRAY(pangea,mode,tablehash,args) +HASH_AND_ARRAY(pangea,mode,tablehash,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -HASH_AND_ARRAY(pangea,buyin,tablehash,args) +HASH_AND_ARRAY(pangea,buyin,tablehash,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); } -HASH_AND_ARRAY(pangea,history,tablehash,args) +HASH_AND_ARRAY(pangea,history,tablehash,params) { cJSON *retjson = cJSON_CreateObject(); return(jprint(retjson,1)); @@ -615,23 +600,35 @@ ZERO_ARGS(pangea,lobby) return(jprint(pangea_lobbyjson(myinfo),1)); } -INT_AND_ARRAY(pangea,host,minplayers,args) +INT_AND_ARRAY(pangea,host,minplayers,params) { - char *req = "{\"host\":\"table\"}"; + cJSON *retjson; char *str,hexstr[1024],*req = "{\"host\":\"table\"}"; bits256 pangeahash,tablehash; struct pangea_msghdr *pm; uint8_t space[sizeof(*pm) + 512]; pangeahash = calc_categoryhashes(0,"pangea",0); OS_randombytes(tablehash.bytes,sizeof(tablehash)); - pm = pangea_msgcreate(myinfo,space,tablehash,(void *)req,(int32_t)strlen(req)); - return(SuperNET_categorymulticast(myinfo,0,pangeahash,tablehash,(void *)pm,0,1,1)); + if ( (pm= pangea_msgcreate(myinfo,space,tablehash,(void *)req,(int32_t)strlen(req))) != 0 ) + { + init_hexbytes_noT(hexstr,(uint8_t *)pm,pm->sig.allocsize); + str = SuperNET_categorymulticast(myinfo,0,pangeahash,tablehash,hexstr,0,1,1); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","table created"); + jaddstr(retjson,"multicast",str); + jaddbits256(retjson,"tablehash",tablehash); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"couldnt create pangea message\"}")); } -HASH_AND_ARRAY(pangea,join,tablehash,args) +HASH_AND_ARRAY(pangea,join,tablehash,params) { - char *req = "{\"lobby\":\"join\"}"; + char hexstr[512],*req = "{\"lobby\":\"join\"}"; bits256 pangeahash; struct pangea_msghdr *pm; uint8_t space[sizeof(*pm) + 512]; pangeahash = calc_categoryhashes(0,"pangea",0); - pm = pangea_msgcreate(myinfo,space,tablehash,(void *)req,(int32_t)strlen(req)); - return(SuperNET_categorymulticast(myinfo,0,pangeahash,tablehash,(void *)pm,0,1,1)); + if ( (pm= pangea_msgcreate(myinfo,space,tablehash,(void *)req,(int32_t)strlen(req))) != 0 ) + { + init_hexbytes_noT(hexstr,(uint8_t *)pm,pm->sig.allocsize); + return(SuperNET_categorymulticast(myinfo,0,pangeahash,tablehash,hexstr,0,1,1)); + } else return(clonestr("{\"error\":\"couldnt create pangea message\"}")); + } #undef IGUANA_ARGS diff --git a/includes/curve25519.h b/includes/curve25519.h index 68f6d4bf2..3eb8c1deb 100755 --- a/includes/curve25519.h +++ b/includes/curve25519.h @@ -34,7 +34,7 @@ typedef union _bits384 bits384; struct sha256_vstate { uint64_t length; uint32_t state[8],curlen; uint8_t buf[64]; }; struct rmd160_vstate { uint64_t length; uint8_t buf[64]; uint32_t curlen, state[5]; }; -struct acct777_sig { bits256 sigbits,pubkey; uint64_t signer64bits; uint32_t timestamp; }; +struct acct777_sig { bits256 sigbits,pubkey; uint64_t signer64bits; uint32_t timestamp,allocsize; uint8_t serialized[]; }; #undef force_inline #define force_inline __attribute__((always_inline)) @@ -55,19 +55,23 @@ void vcalc_sha256(char hashstr[(256 >> 3) * 2 + 1],uint8_t hash[256 >> 3],uint8_ void vcalc_sha256cat(uint8_t hash[256 >> 3],uint8_t *src,int32_t len,uint8_t *src2,int32_t len2); void vupdate_sha256(uint8_t hash[256 >> 3],struct sha256_vstate *state,uint8_t *src,int32_t len); bits256 curve25519_shared(bits256 privkey,bits256 otherpub); +int32_t iguana_rwnum(int32_t rwflag,uint8_t *serialized,int32_t len,void *endianedp); +int32_t iguana_rwbignum(int32_t rwflag,uint8_t *serialized,int32_t len,uint8_t *endianedp); uint32_t calc_crc32(uint32_t crc,const void *buf,size_t size); uint64_t conv_NXTpassword(unsigned char *mysecret,unsigned char *mypublic,uint8_t *pass,int32_t passlen); bits128 calc_md5(char digeststr[33],void *buf,int32_t len); +bits256 acct777_msgprivkey(uint8_t *data,int32_t datalen); +bits256 acct777_msgpubkey(uint8_t *data,int32_t datalen); bits256 acct777_pubkey(bits256 privkey); uint64_t acct777_nxt64bits(bits256 pubkey); bits256 acct777_hashiter(bits256 privkey,bits256 pubkey,int32_t lockdays,uint8_t chainlen); bits256 acct777_lockhash(bits256 pubkey,int32_t lockdays,uint8_t chainlen); bits256 acct777_invoicehash(bits256 *invoicehash,uint16_t lockdays,uint8_t chainlen); -uint64_t acct777_sign(struct acct777_sig *sig,bits256 privkey,bits256 otherpubkey,uint32_t timestamp,uint8_t *data,int32_t datalen); -uint64_t acct777_validate(struct acct777_sig *sig,uint32_t timestamp,uint8_t *data,int32_t datalen); +uint64_t acct777_sign(struct acct777_sig *sig,bits256 privkey,bits256 otherpubkey,uint32_t timestamp,uint8_t *serialized,int32_t datalen); +uint64_t acct777_validate(struct acct777_sig *sig,bits256 privkey,bits256 pubkey); uint64_t acct777_signtx(struct acct777_sig *sig,bits256 privkey,uint32_t timestamp,uint8_t *data,int32_t datalen); uint64_t acct777_swaptx(bits256 privkey,struct acct777_sig *sig,uint32_t timestamp,uint8_t *data,int32_t datalen); diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 61b211ed8..9d5bef9dc 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -52,33 +52,33 @@ ZERO_ARGS(SuperNET,stop); HASH_AND_STRING(SuperNET,saveconf,wallethash,confjsonstr); HASH_ARRAY_STRING(SuperNET,layer,mypriv,otherpubs,str); -INT_AND_ARRAY(pangea,newhand,senderind,args); -INT_AND_ARRAY(pangea,ping,senderind,args); -INT_AND_ARRAY(pangea,gotdeck,senderind,args); -INT_AND_ARRAY(pangea,ready,senderind,args); -INT_AND_ARRAY(pangea,encoded,senderind,args); -INT_AND_ARRAY(pangea,final,senderind,args); -INT_AND_ARRAY(pangea,addedfunds,senderind,args); -INT_AND_ARRAY(pangea,preflop,senderind,args); -INT_AND_ARRAY(pangea,decoded,senderind,args); -INT_AND_ARRAY(pangea,card,senderind,args); -INT_AND_ARRAY(pangea,facedown,senderind,args); -INT_AND_ARRAY(pangea,faceup,senderind,args); -INT_AND_ARRAY(pangea,turn,senderind,args); -INT_AND_ARRAY(pangea,confirmturn,senderind,args); -INT_AND_ARRAY(pangea,chat,senderind,args); -INT_AND_ARRAY(pangea,action,senderind,args); -INT_AND_ARRAY(pangea,showdown,senderind,args); -INT_AND_ARRAY(pangea,handsummary,senderind,args); - -HASH_AND_ARRAY(pangea,status,tableid,args); -HASH_AND_ARRAY(pangea,mode,tableid,args); -HASH_AND_ARRAY(pangea,buyin,tableid,args); -HASH_AND_ARRAY(pangea,history,tableid,args); +INT_AND_ARRAY(pangea,newhand,senderind,params); +INT_AND_ARRAY(pangea,ping,senderind,params); +INT_AND_ARRAY(pangea,gotdeck,senderind,params); +INT_AND_ARRAY(pangea,ready,senderind,params); +INT_AND_ARRAY(pangea,encoded,senderind,params); +INT_AND_ARRAY(pangea,final,senderind,params); +INT_AND_ARRAY(pangea,addedfunds,senderind,params); +INT_AND_ARRAY(pangea,preflop,senderind,params); +INT_AND_ARRAY(pangea,decoded,senderind,params); +INT_AND_ARRAY(pangea,card,senderind,params); +INT_AND_ARRAY(pangea,facedown,senderind,params); +INT_AND_ARRAY(pangea,faceup,senderind,params); +INT_AND_ARRAY(pangea,turn,senderind,params); +INT_AND_ARRAY(pangea,confirmturn,senderind,params); +INT_AND_ARRAY(pangea,chat,senderind,params); +INT_AND_ARRAY(pangea,action,senderind,params); +INT_AND_ARRAY(pangea,showdown,senderind,params); +INT_AND_ARRAY(pangea,handsummary,senderind,params); + +HASH_AND_ARRAY(pangea,status,tableid,params); +HASH_AND_ARRAY(pangea,mode,tableid,params); +HASH_AND_ARRAY(pangea,buyin,tableid,params); +HASH_AND_ARRAY(pangea,history,tableid,params); ZERO_ARGS(pangea,lobby); -INT_AND_ARRAY(pangea,host,minplayers,args); -HASH_AND_ARRAY(pangea,join,tablehash,args); +INT_AND_ARRAY(pangea,host,minplayers,params); +HASH_AND_ARRAY(pangea,join,tablehash,params); STRING_ARG(iguana,peers,activecoin); STRING_AND_INT(iguana,maxpeers,activecoin,max);