Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
cc4e3bc63d
  1. 18
      crypto777/cJSON.c
  2. 57
      crypto777/curve25519.c
  3. 7
      crypto777/iguana_utils.c
  4. 2
      iguana/SuperNET_hexmsg.c
  5. 73
      iguana/main.c
  6. 107
      iguana/pangea_api.c
  7. 10
      includes/curve25519.h
  8. 50
      includes/iguana_apideclares.h

18
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<depth-1;i++) *ptr++='\t';}
@ -495,7 +495,7 @@ static char *print_object(cJSON *item,int32_t depth,int32_t fmt)
}
/* Try to allocate the output string */
if (!fail) out=(char*)cJSON_malloc(len);
if (!fail) out=(char*)cJSON_malloc(len+1);
if (!out) fail=1;
/* Handle failure */

57
crypto777/curve25519.c

@ -1714,11 +1714,16 @@ uint64_t acct777_nxt64bits(bits256 pubkey)
return(acct.txid);
}
bits256 acct777_msgpubkey(uint8_t *data,int32_t datalen)
bits256 acct777_msgprivkey(uint8_t *data,int32_t datalen)
{
bits256 hash;
vcalc_sha256(0,hash.bytes,data,datalen);
return(acct777_pubkey(hash));
return(hash);
}
bits256 acct777_msgpubkey(uint8_t *data,int32_t datalen)
{
return(acct777_pubkey(acct777_msgprivkey(data,datalen)));
}
bits256 acct777_hashiter(bits256 privkey,bits256 pubkey,int32_t lockdays,uint8_t chainlen)
@ -1752,24 +1757,42 @@ bits256 acct777_invoicehash(bits256 *invoicehash,uint16_t lockdays,uint8_t chain
return(privkey);
}
uint64_t acct777_sign(struct acct777_sig *sig,bits256 privkey,bits256 otherpubkey,uint32_t timestamp,uint8_t *data,int32_t datalen)
//char *bits256_str();
//struct acct777_sig { bits256 sigbits,pubkey; uint64_t signer64bits; uint32_t timestamp,allocsize; };
uint64_t acct777_sign(struct acct777_sig *sig,bits256 privkey,bits256 otherpubkey,uint32_t timestamp,uint8_t *serialized,int32_t datalen)
{
int32_t i; bits256 shared; uint8_t buf[sizeof(shared) + sizeof(timestamp)]; uint32_t t = timestamp;
for (i=0; i<sizeof(t); i++,t>>=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; i<sizeof(*sig); i++)
// printf("%02x ",buf[i]);
//char str[65]; printf("shared.(%s) crc.%u datalen.%d\n",bits256_str(str,shared),calc_crc32(0,buf,sizeof(buf)),datalen);
vcalc_sha256cat(sig->sigbits.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

7
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

2
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; i<sizeof(Packetcache)/sizeof(*Packetcache); i++)
{
if ( Packetcache[i] == 0 )

73
iguana/main.c

@ -104,6 +104,7 @@ struct supernet_info *SuperNET_MYINFO(char *passphrase)
{
// search saved accounts
}
return(&MYINFO);
return(0);
}
@ -123,6 +124,7 @@ char *iguana_JSON(char *jsonstr)
char *SuperNET_jsonstr(struct supernet_info *myinfo,char *jsonstr,char *remoteaddr)
{
cJSON *json; char *agent,*method;
//char str[65]; printf("SuperNET_jsonstr %p %s\n",&myinfo->privkey,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 )

107
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

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

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

Loading…
Cancel
Save