Browse Source

encrypted/compressed packets

release/v0.1
jl777 9 years ago
parent
commit
d9f05f26e1
  1. 7
      crypto777/ramcoder.c
  2. 103
      iguana/SuperNET.c
  3. 2
      iguana/SuperNET.h
  4. 4
      iguana/iguana777.h
  5. 6
      iguana/iguana_msg.c
  6. 5
      iguana/iguana_peers.c
  7. 37
      iguana/main.c

7
crypto777/ramcoder.c

@ -49,7 +49,7 @@ int32_t init_ramcoder(struct ramcoder *coder,HUFF *hp,bits256 *seed);
int32_t ramcoder_emit(HUFF *hp,struct ramcoder *coder,int32_t updateprobs,uint8_t *buf,int32_t len); int32_t ramcoder_emit(HUFF *hp,struct ramcoder *coder,int32_t updateprobs,uint8_t *buf,int32_t len);
int32_t ramcoder_decompress(uint8_t *data,int32_t maxlen,uint8_t *bits,uint32_t numbits,bits256 seed); int32_t ramcoder_decompress(uint8_t *data,int32_t maxlen,uint8_t *bits,uint32_t numbits,bits256 seed);
int32_t ramcoder_compress(uint8_t *bits,int32_t maxlen,uint8_t *data,int32_t datalen); int32_t ramcoder_compress(uint8_t *bits,int32_t maxlen,uint8_t *data,int32_t datalen,bits256 seed);
uint64_t hconv_bitlen(uint64_t bitlen); uint64_t hconv_bitlen(uint64_t bitlen);
void _init_HUFF(HUFF *hp,int32_t allocsize,void *buf); void _init_HUFF(HUFF *hp,int32_t allocsize,void *buf);
@ -439,10 +439,9 @@ int32_t ramcoder_decoder(struct ramcoder *coder,int32_t updateprobs,uint8_t *buf
return(n); return(n);
} }
int32_t ramcoder_compress(uint8_t *bits,int32_t maxlen,uint8_t *data,int32_t datalen) int32_t ramcoder_compress(uint8_t *bits,int32_t maxlen,uint8_t *data,int32_t datalen,bits256 seed)
{ {
int32_t numbits; bits256 seed; HUFF H,*hp = &H; int32_t numbits; HUFF H,*hp = &H;
memset(seed.bytes,0,sizeof(seed));
_init_HUFF(hp,maxlen,bits); _init_HUFF(hp,maxlen,bits);
if ( ramcoder_encoder(0,1,data,datalen,hp,0,&seed) < 0 ) if ( ramcoder_encoder(0,1,data,datalen,hp,0,&seed) < 0 )
return(-1); return(-1);

103
iguana/SuperNET.c

@ -92,9 +92,10 @@ void SuperNET_myipaddr(struct supernet_info *myinfo,struct iguana_peer *addr,cha
} }
} }
int32_t SuperNET_json2bits(struct supernet_info *myinfo,uint8_t *serialized,int32_t maxsize,char *destip,bits256 destpub,cJSON *json) int32_t SuperNET_json2bits(struct supernet_info *myinfo,uint8_t *serialized,int32_t *complenp,uint8_t *compressed,int32_t maxsize,char *destip,bits256 destpub,cJSON *json)
{ {
uint32_t ipbits; uint64_t tag; char *hexmsg; int32_t n,len = 0; uint16_t apinum; uint32_t ipbits; uint64_t tag; bits256 seed,seed2; char *hexmsg; int32_t n,numbits,len = 0;
*complenp = -1;
if ( (tag= j64bits(json,"tag")) == 0 ) if ( (tag= j64bits(json,"tag")) == 0 )
OS_randombytes((uint8_t *)&tag,sizeof(tag)); OS_randombytes((uint8_t *)&tag,sizeof(tag));
ipbits = (uint32_t)calc_ipbits(destip); ipbits = (uint32_t)calc_ipbits(destip);
@ -103,6 +104,9 @@ int32_t SuperNET_json2bits(struct supernet_info *myinfo,uint8_t *serialized,int3
len += iguana_rwnum(1,&serialized[len],sizeof(uint32_t),&ipbits); len += iguana_rwnum(1,&serialized[len],sizeof(uint32_t),&ipbits);
len += iguana_rwbignum(1,&serialized[len],sizeof(myinfo->myaddr.pubkey),myinfo->myaddr.pubkey.bytes); len += iguana_rwbignum(1,&serialized[len],sizeof(myinfo->myaddr.pubkey),myinfo->myaddr.pubkey.bytes);
len += iguana_rwnum(1,&serialized[len],sizeof(tag),&tag); len += iguana_rwnum(1,&serialized[len],sizeof(tag),&tag);
if ( (apinum= SuperNET_API2num(jstr(json,"agent"),jstr(json,"method"))) == 0xffff )
return(-1);
len += iguana_rwnum(1,&serialized[len],sizeof(apinum),&apinum);
if ( (hexmsg= jstr(json,"message")) != 0 ) if ( (hexmsg= jstr(json,"message")) != 0 )
{ {
n = (int32_t)strlen(hexmsg); n = (int32_t)strlen(hexmsg);
@ -110,48 +114,83 @@ int32_t SuperNET_json2bits(struct supernet_info *myinfo,uint8_t *serialized,int3
{ {
n >>= 1; n >>= 1;
decode_hex(&serialized[len],n,hexmsg); decode_hex(&serialized[len],n,hexmsg);
len += n;
} else return(-1); } else return(-1);
} }
compressed[0] = (len & 0xff);
compressed[1] = ((len>>8) & 0xff);
compressed[2] = ((len>>16) & 0xff);
memset(seed.bytes,0,sizeof(seed));
numbits = ramcoder_compress(&compressed[3],maxsize-3,serialized,len,seed);
*complenp = (int32_t)hconv_bitlen(numbits);
seed = curve25519_shared(myinfo->privkey,destpub);
vcalc_sha256(0,seed2.bytes,seed.bytes,sizeof(seed));
int32_t seedlen; seedlen = ramcoder_compress(&compressed[3],maxsize-3,serialized,len,seed2);
printf("strlen.%d len.%d -> complen.%d seedlen.%d\n",(int32_t)strlen(jprint(json,0)),len,*complenp,seedlen);
return(len); return(len);
} }
cJSON *SuperNET_bits2json(struct supernet_info *myinfo,bits256 prevpub,uint8_t *serialized,int32_t datalen) cJSON *SuperNET_bits2json(struct supernet_info *myinfo,bits256 prevpub,uint8_t *serialized,uint8_t *space,int32_t datalen,int32_t iscompressed)
{ {
char destip[64],myipaddr[64],str[65],*hexmsg; uint64_t tag; int32_t len = 0; char destip[64],method[64],agent[64],myipaddr[64],str[65],*hexmsg; uint64_t tag; int32_t len = 0;
uint32_t destipbits,myipbits; bits256 senderpub; cJSON *json = cJSON_CreateObject(); uint16_t apinum; uint32_t destipbits,myipbits; bits256 seed,seed2,senderpub; cJSON *json = cJSON_CreateObject();
int32_t i; for (i=0; i<datalen; i++) //int32_t i; for (i=0; i<datalen; i++)
printf("%02x ",serialized[i]); // printf("%02x ",serialized[i]);
printf("bits[%d]\n",datalen); //printf("bits[%d]\n",datalen);
if ( iscompressed != 0 )
{
len = serialized[0];
len = (len << 8) + serialized[1];
len = (len << 8) + serialized[2];
seed = curve25519_shared(myinfo->privkey,prevpub);
vcalc_sha256(0,seed2.bytes,seed.bytes,sizeof(seed));
datalen = ramcoder_decompress(space,datalen,serialized,datalen<<3,seed2);
serialized = space;
}
len += iguana_rwnum(0,&serialized[len],sizeof(uint32_t),&destipbits); len += iguana_rwnum(0,&serialized[len],sizeof(uint32_t),&destipbits);
len += iguana_rwnum(0,&serialized[len],sizeof(uint32_t),&myipbits); len += iguana_rwnum(0,&serialized[len],sizeof(uint32_t),&myipbits);
len += iguana_rwbignum(0,&serialized[len],sizeof(bits256),senderpub.bytes); len += iguana_rwbignum(0,&serialized[len],sizeof(bits256),senderpub.bytes);
len += iguana_rwnum(0,&serialized[len],sizeof(tag),&tag); len += iguana_rwnum(0,&serialized[len],sizeof(tag),&tag);
printf("-> dest.%x myip.%x senderpub.%llx tag.%llu\n",destipbits,myipbits,(long long)senderpub.txid,(long long)tag); len += iguana_rwnum(0,&serialized[len],sizeof(apinum),&apinum);
expand_ipbits(destip,destipbits), jaddstr(json,"yourip",destip); //printf("-> dest.%x myip.%x senderpub.%llx tag.%llu\n",destipbits,myipbits,(long long)senderpub.txid,(long long)tag);
expand_ipbits(myipaddr,myipbits), jaddstr(json,"myip",myipaddr); if ( SuperNET_num2API(agent,method,apinum) >= 0 )
jaddstr(json,"mypub",bits256_str(str,senderpub));
jadd64bits(json,"tag",tag);
if ( len < datalen )
{ {
printf("len %d vs %d datalen\n",len,datalen); jaddstr(json,"agent",agent);
hexmsg = malloc(((datalen - len)<<1) + 1); jaddstr(json,"method",method);
init_hexbytes_noT(hexmsg,&serialized[len],datalen - len); expand_ipbits(destip,destipbits), jaddstr(json,"yourip",destip);
printf("hex.(%s)\n",hexmsg); expand_ipbits(myipaddr,myipbits), jaddstr(json,"myip",myipaddr);
jaddstr(json,"message",hexmsg); jaddstr(json,"mypub",bits256_str(str,senderpub));
free(hexmsg); jadd64bits(json,"tag",tag);
if ( len < datalen )
{
printf("len %d vs %d datalen\n",len,datalen);
hexmsg = malloc(((datalen - len)<<1) + 1);
init_hexbytes_noT(hexmsg,&serialized[len],datalen - len);
printf("hex.(%s)\n",hexmsg);
jaddstr(json,"message",hexmsg);
free(hexmsg);
}
return(json);
} }
return(json); return(0);
} }
int32_t iguana_send_supernet(struct iguana_info *coin,struct iguana_peer *addr,char *jsonstr,int32_t delaymillis) int32_t iguana_send_supernet(struct iguana_info *coin,struct iguana_peer *addr,char *jsonstr,int32_t delaymillis)
{ {
int32_t datalen,qlen = -1; uint8_t *serialized; cJSON *json; int32_t datalen,complen,qlen = -1; uint8_t *serialized,*compressed; cJSON *json;
if ( (json= cJSON_Parse(jsonstr)) != 0 ) if ( (json= cJSON_Parse(jsonstr)) != 0 )
{ {
compressed = malloc(sizeof(struct iguana_msghdr) + IGUANA_MAXPACKETSIZE);
serialized = malloc(sizeof(struct iguana_msghdr) + IGUANA_MAXPACKETSIZE); serialized = malloc(sizeof(struct iguana_msghdr) + IGUANA_MAXPACKETSIZE);
datalen = SuperNET_json2bits(SuperNET_MYINFO(0),&serialized[sizeof(struct iguana_msghdr)],IGUANA_MAXPACKETSIZE,addr->ipaddr,addr->pubkey,json); datalen = SuperNET_json2bits(SuperNET_MYINFO(0),&serialized[sizeof(struct iguana_msghdr)],&complen,&compressed[sizeof(struct iguana_msghdr)],IGUANA_MAXPACKETSIZE,addr->ipaddr,addr->pubkey,json);
printf("SUPERSEND.(%s) -> (%s) delaymillis.%d\n",jsonstr,addr->ipaddr,delaymillis); printf("SUPERSEND.(%s) -> (%s) delaymillis.%d datalen.%d\n",jsonstr,addr->ipaddr,delaymillis,datalen);
qlen = iguana_queue_send(coin,addr,delaymillis,serialized,"SuperNET",datalen,0,1); if ( datalen >= 0 )
{
if ( complen >= 0 && complen < (((datalen-3) * 7) >> 3) )
qlen = iguana_queue_send(coin,addr,delaymillis,compressed,"SuperNETb",complen,0,0);
else qlen = iguana_queue_send(coin,addr,delaymillis,serialized,"SuperNET",datalen,0,0);
}
free(compressed);
free(serialized); free(serialized);
} }
return(qlen); return(qlen);
@ -316,12 +355,14 @@ char *SuperNET_JSON(struct supernet_info *myinfo,cJSON *json,char *remoteaddr)
return(retstr); return(retstr);
} }
char *SuperNET_p2p(struct iguana_info *coin,struct iguana_peer *addr,int32_t *delaymillisp,char *ipaddr,uint8_t *data,int32_t datalen) char *SuperNET_p2p(struct iguana_info *coin,struct iguana_peer *addr,int32_t *delaymillisp,char *ipaddr,uint8_t *data,int32_t datalen,int32_t compressed)
{ {
cJSON *json; bits256 senderpub; char *myipaddr,*method,*retstr = 0; int32_t maxdelay; struct supernet_info *myinfo; cJSON *json; bits256 senderpub; char *myipaddr,*method,*retstr = 0; int32_t maxdelay; struct supernet_info *myinfo; uint8_t *space = 0;
myinfo = SuperNET_MYINFO(0); myinfo = SuperNET_MYINFO(0);
*delaymillisp = 0; *delaymillisp = 0;
if ( (json= SuperNET_bits2json(myinfo,addr->pubkey,data,datalen)) != 0 ) if ( compressed != 0 )
space = malloc(datalen);
if ( (json= SuperNET_bits2json(myinfo,addr->pubkey,data,space,datalen,compressed)) != 0 )
{ {
maxdelay = juint(json,"maxdelay"); maxdelay = juint(json,"maxdelay");
printf("GOT >>>>>>>> SUPERNET P2P.(%s) from.%s\n",jprint(json,0),coin->symbol); printf("GOT >>>>>>>> SUPERNET P2P.(%s) from.%s\n",jprint(json,0),coin->symbol);
@ -336,13 +377,15 @@ char *SuperNET_p2p(struct iguana_info *coin,struct iguana_peer *addr,int32_t *de
{ {
addr->dead = (uint32_t)time(NULL); addr->dead = (uint32_t)time(NULL);
free_json(json); free_json(json);
if ( space != 0 )
free(space);
return(clonestr("{\"result\":\"peer marked as dead\"}")); return(clonestr("{\"result\":\"peer marked as dead\"}"));
} }
retstr = SuperNET_JSON(myinfo,json,ipaddr); retstr = SuperNET_JSON(myinfo,json,ipaddr);
printf("call delaymillis\n");
*delaymillisp = SuperNET_delaymillis(myinfo,maxdelay); *delaymillisp = SuperNET_delaymillis(myinfo,maxdelay);
free_json(json); free_json(json);
} else retstr = clonestr("{\"error\":\"p2p cant parse json\"}"); } else retstr = clonestr("{\"error\":\"p2p cant parse json\"}");
printf("P2PRET.(%s)\n",retstr); if ( space != 0 )
free(space);
return(retstr); return(retstr);
} }

2
iguana/SuperNET.h

@ -111,6 +111,8 @@ char *SuperNET_DHTencode(struct supernet_info *myinfo,char *destip,bits256 destp
char *SuperNET_parser(struct supernet_info *myinfo,char *agent,char *method,cJSON *json,char *remoteaddr); char *SuperNET_parser(struct supernet_info *myinfo,char *agent,char *method,cJSON *json,char *remoteaddr);
char *SuperNET_processJSON(struct supernet_info *myinfo,cJSON *json,char *remoteaddr); char *SuperNET_processJSON(struct supernet_info *myinfo,cJSON *json,char *remoteaddr);
char *SuperNET_DHTsend(struct supernet_info *myinfo,bits256 routehash,char *hexmessage,int32_t maxdelay); char *SuperNET_DHTsend(struct supernet_info *myinfo,bits256 routehash,char *hexmessage,int32_t maxdelay);
uint16_t SuperNET_API2num(char *agent,char *method);
int32_t SuperNET_num2API(char *agent,char *method,uint16_t num);
#endif #endif

4
iguana/iguana777.h

@ -529,7 +529,7 @@ int32_t iguana_updatewaiting(struct iguana_info *coin,int32_t starti,int32_t max
// recvbits // recvbits
int32_t iguana_recvinit(struct iguana_info *coin,int32_t initialheight); int32_t iguana_recvinit(struct iguana_info *coin,int32_t initialheight);
int32_t ramcoder_decompress(uint8_t *data,int32_t maxlen,uint8_t *bits,uint32_t numbits,bits256 seed); int32_t ramcoder_decompress(uint8_t *data,int32_t maxlen,uint8_t *bits,uint32_t numbits,bits256 seed);
int32_t ramcoder_compress(uint8_t *bits,int32_t maxlen,uint8_t *data,int32_t datalen); int32_t ramcoder_compress(uint8_t *bits,int32_t maxlen,uint8_t *data,int32_t datalen,bits256 seed);
uint64_t hconv_bitlen(uint64_t bitlen); uint64_t hconv_bitlen(uint64_t bitlen);
struct iguana_block *iguana_blockptr(struct iguana_info *coin,int32_t height); struct iguana_block *iguana_blockptr(struct iguana_info *coin,int32_t height);
int32_t iguana_processrecv(struct iguana_info *coin); // single threaded int32_t iguana_processrecv(struct iguana_info *coin); // single threaded
@ -562,7 +562,7 @@ double dxblend(double *destp,double val,double decay);
// json // json
int32_t iguana_processjsonQ(struct iguana_info *coin); // reentrant, can be called during any idletime int32_t iguana_processjsonQ(struct iguana_info *coin); // reentrant, can be called during any idletime
char *iguana_JSON(char *jsonstr); char *iguana_JSON(char *jsonstr);
char *SuperNET_p2p(struct iguana_info *coin,struct iguana_peer *addr,int32_t *delaymillisp,char *ipaddr,uint8_t *data,int32_t datalen); char *SuperNET_p2p(struct iguana_info *coin,struct iguana_peer *addr,int32_t *delaymillisp,char *ipaddr,uint8_t *data,int32_t datalen,int32_t compressed);
char *mbstr(char *str,double); char *mbstr(char *str,double);
int init_hexbytes_noT(char *hexbytes,unsigned char *message,long len); int init_hexbytes_noT(char *hexbytes,unsigned char *message,long len);

6
iguana/iguana_msg.c

@ -430,17 +430,17 @@ int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struc
} }
retval = 0; retval = 0;
//printf("iguana_msgparser %s parse.(%s)\n",addr->ipaddr,H->command); //printf("iguana_msgparser %s parse.(%s)\n",addr->ipaddr,H->command);
if ( strcmp(H->command,"SuperNET") == 0 ) if ( strncmp(H->command,"SuperNET",strlen("SuperNET")) == 0 )
{ {
addr->supernet = 1; addr->supernet = 1;
addr->msgcounts.verack++; addr->msgcounts.verack++;
len = recvlen; len = recvlen;
if ( (retstr= SuperNET_p2p(coin,addr,&delay,addr->ipaddr,data,recvlen)) != 0 ) if ( (retstr= SuperNET_p2p(coin,addr,&delay,addr->ipaddr,data,recvlen,H->command[strlen("SuperNET")]=='b')) != 0 )
{ {
iguana_send_supernet(coin,addr,retstr,delay); iguana_send_supernet(coin,addr,retstr,delay);
free(retstr); free(retstr);
} }
printf("GOT.(%s) [%s] len.%d from %s -> (%s)\n",H->command,data,recvlen,addr->ipaddr,retstr==0?"null":retstr); //printf("GOT.(%s) [%s] len.%d from %s -> (%s)\n",H->command,data,recvlen,addr->ipaddr,retstr==0?"null":retstr);
} }
else if ( strcmp(H->command,"version") == 0 ) else if ( strcmp(H->command,"version") == 0 )
{ {

5
iguana/iguana_peers.c

@ -434,9 +434,6 @@ void iguana_parsebuf(struct iguana_info *coin,struct iguana_peer *addr,struct ig
iguana_sethdr(&checkH,coin->chain->netmagic,H->command,buf,len); iguana_sethdr(&checkH,coin->chain->netmagic,H->command,buf,len);
if ( memcmp(&checkH,H,sizeof(checkH)) == 0 ) if ( memcmp(&checkH,H,sizeof(checkH)) == 0 )
{ {
//if ( strcmp(addr->ipaddr,"127.0.0.1") == 0 )
//printf("%s parse.(%s) len.%d\n",addr->ipaddr,H->command,len);
//printf("addr->dead.%u\n",addr->dead);
if ( strcmp(H->command,"block") == 0 || strcmp(H->command,"tx") == 0 ) if ( strcmp(H->command,"block") == 0 || strcmp(H->command,"tx") == 0 )
{ {
if ( addr->RAWMEM.ptr == 0 ) if ( addr->RAWMEM.ptr == 0 )
@ -977,7 +974,7 @@ void iguana_dedicatedloop(struct iguana_info *coin,struct iguana_peer *addr)
} }
if ( flag != 0 ) if ( flag != 0 )
run = 0; run = 0;
else if ( addr->supernet != 0 && time(NULL) > lastping+600 ) else if ( addr->supernet != 0 && time(NULL) > lastping+60 )
{ {
iguana_send_supernet(coin,addr,"{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}",0); iguana_send_supernet(coin,addr,"{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}",0);
lastping = (uint32_t)time(NULL); lastping = (uint32_t)time(NULL);

37
iguana/main.c

@ -33,6 +33,7 @@ uint64_t IGUANA_MY64BITS;
queue_t helperQ,jsonQ,finishedQ,bundlesQ; queue_t helperQ,jsonQ,finishedQ,bundlesQ;
struct supernet_info MYINFO; struct supernet_info MYINFO;
static int32_t initflag; static int32_t initflag;
cJSON *API_json;
#ifdef __linux__ #ifdef __linux__
int32_t IGUANA_NUMHELPERS = 8; int32_t IGUANA_NUMHELPERS = 8;
#else #else
@ -40,6 +41,33 @@ int32_t IGUANA_NUMHELPERS = 1;
#endif #endif
struct iguana_jsonitem { struct queueitem DL; struct supernet_info *myinfo; uint32_t fallback,expired,allocsize; char **retjsonstrp; char remoteaddr[64]; char jsonstr[]; }; struct iguana_jsonitem { struct queueitem DL; struct supernet_info *myinfo; uint32_t fallback,expired,allocsize; char **retjsonstrp; char remoteaddr[64]; char jsonstr[]; };
uint16_t SuperNET_API2num(char *agent,char *method)
{
int32_t i,n = 0; cJSON *item;
if ( agent != 0 && method != 0 && API_json != 0 && (n= cJSON_GetArraySize(API_json)) > 0 )
{
for (i=0; i<n; i++)
{
item = jitem(API_json,i);
if ( strcmp(agent,jstr(item,"agent")) == 0 && strcmp(method,jstr(item,"method")) == 0 )
return(i);
}
}
return(-1);
}
int32_t SuperNET_num2API(char *agent,char *method,uint16_t num)
{
int32_t n; cJSON *item;
if ( API_json != 0 && (n= cJSON_GetArraySize(API_json)) > 0 && num < n )
{
item = jitem(API_json,num);
strcpy(agent,jstr(item,"agent"));
strcpy(method,jstr(item,"method"));
return(num);
}
return(-1);
}
struct supernet_info *SuperNET_MYINFO(char *passphrase) struct supernet_info *SuperNET_MYINFO(char *passphrase)
{ {
@ -215,7 +243,7 @@ void sigcontinue_func() { printf("\nSIGCONT\n"); signal(SIGCONT,sigcontinue_func
void iguana_main(void *arg) void iguana_main(void *arg)
{ {
char helperstr[64],*helperargs,*ipaddr,*coinargs=0,*secret,*jsonstr = arg; char helperstr[64],*tmpstr,*helperargs,*ipaddr,*coinargs=0,*secret,*jsonstr = arg;
int32_t i,len,flag,c; cJSON *json; uint8_t secretbuf[512]; int64_t allocsize; int32_t i,len,flag,c; cJSON *json; uint8_t secretbuf[512]; int64_t allocsize;
if ( (ipaddr= OS_filestr(&allocsize,"ipaddr")) != 0 ) if ( (ipaddr= OS_filestr(&allocsize,"ipaddr")) != 0 )
{ {
@ -245,6 +273,12 @@ void iguana_main(void *arg)
OS_ensure_directory("confs"); OS_ensure_directory("confs");
OS_ensure_directory("DB"); OS_ensure_directory("DB");
OS_ensure_directory("tmp"); OS_ensure_directory("tmp");
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");
free(tmpstr);
}
memset(&MYINFO,0,sizeof(MYINFO)); memset(&MYINFO,0,sizeof(MYINFO));
OS_randombytes(MYINFO.privkey.bytes,sizeof(MYINFO.privkey)); OS_randombytes(MYINFO.privkey.bytes,sizeof(MYINFO.privkey));
if ( jsonstr != 0 && (json= cJSON_Parse(jsonstr)) != 0 ) if ( jsonstr != 0 && (json= cJSON_Parse(jsonstr)) != 0 )
@ -264,6 +298,7 @@ void iguana_main(void *arg)
if ( jobj(json,"coins") != 0 ) if ( jobj(json,"coins") != 0 )
coinargs = jsonstr; coinargs = jsonstr;
} }
MYINFO.myaddr.pubkey = curve25519(MYINFO.privkey,curve25519_basepoint9());
if ( IGUANA_NUMHELPERS == 0 ) if ( IGUANA_NUMHELPERS == 0 )
IGUANA_NUMHELPERS = 1; IGUANA_NUMHELPERS = 1;
for (i=0; i<IGUANA_NUMHELPERS; i++) for (i=0; i<IGUANA_NUMHELPERS; i++)

Loading…
Cancel
Save