uint64_t PAX_validate(struct PAX_sig *sig,uint32_t timestamp,uint8_t *data,int32_t datalen) { struct PAX_sig checksig; PAX_sign(&checksig,GENESIS_PRIVKEY,sig->pubkey,timestamp,data,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)); return(0); } return(acct777_nxt64bits(sig->pubkey)); }
char *instantdex_sendcmd(struct supernet_info *myinfo,cJSON *argjson,char *cmdstr,char *ipaddr,int32_t hops) { char *reqstr,hexstr[8192]; uint8_t _msg[4096]; uint64_t nxt64bits; int32_t datalen; bits256 instantdexhash; struct instantdex_msghdr *msg; msg = (struct instantdex_msghdr *)_msg; memset(msg,0,sizeof(*msg)); instantdexhash = calc_categoryhashes(0,"InstantDEX",0); category_subscribe(myinfo,instantdexhash,GENESIS_PUBKEY); if ( ipaddr == 0 || ipaddr[0] == 0 || strncmp(ipaddr,"127.0.0.1",strlen("127.0.0.1")) == 0 ) return(clonestr("{\"error\":\"no ipaddr, need to send your ipaddr for now\"}")); jaddstr(argjson,"cmd",cmdstr); jaddstr(argjson,"agent","SuperNET"); jaddstr(argjson,"method","DHT"); jaddstr(argjson,"traderip",ipaddr); jaddbits256(argjson,"categoryhash",instantdexhash); jaddbits256(argjson,"traderpub",myinfo->myaddr.persistent); nxt64bits = acct777_nxt64bits(myinfo->myaddr.persistent); reqstr = jprint(argjson,1); datalen = (int32_t)(strlen(reqstr) + 1); memcpy(msg->serialized,reqstr,datalen); free(reqstr); if ( (datalen+sizeof(*msg))*2+1 < sizeof(hexstr) && instantdex_msgcreate(myinfo,msg,datalen) != 0 ) { printf("instantdex send.(%s)\n",cmdstr); init_hexbytes_noT(hexstr,(uint8_t *)msg,msg->sig.allocsize); return(SuperNET_categorymulticast(myinfo,0,instantdexhash,GENESIS_PUBKEY,hexstr,0,hops,1)); } else { printf("cant msgcreate\n"); return(clonestr("{\"error\":\"couldnt create instantdex message\"}")); } }
int32_t peggy_swap(struct accts777_info *accts,uint64_t signerA,uint64_t signerB,bits256 hashA,bits256 hashB) { struct peggy_unit *U,*U2; int32_t size; uint64_t nxtA,nxtB; size = sizeof(*U); if ( (U= ramkv777_read(&size,accts->hashaddrs,hashA.bytes)) != 0 && size == sizeof(U) ) { if ( (U2= ramkv777_read(&size,accts->hashaddrs,hashB.bytes)) != 0 && size == sizeof(U2) ) { nxtA = acct777_nxt64bits(hashA), nxtB = acct777_nxt64bits(hashB); if ( (nxtA == signerA && nxtB == signerB) || (nxtA == signerB && nxtB == signerA) ) { // need to verify ownership U2->lockhash = hashA, U->lockhash = hashB; return(0); } } } return(-1); }
uint64_t PAX_sign(struct PAX_sig *sig,bits256 privkey,bits256 otherpubkey,uint32_t timestamp,uint8_t *data,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; 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); return(sig->signer64bits); }