github.com/yggdrasil-network/yggdrasil-go@v0.5.6/contrib/yggdrasil-brute-simple/util.c (about) 1 #include "yggdrasil-brute.h" 2 3 int find_where(unsigned char hash[64], unsigned char besthashlist[NUMKEYS][64]) { 4 /* Where to insert hash into sorted hashlist */ 5 int j; 6 int where = -1; 7 for (j = 0; j < NUMKEYS; ++j) { 8 if (memcmp(hash, besthashlist[j], 64) > 0) ++where; 9 else break; 10 } 11 return where; 12 } 13 14 void insert_64(unsigned char itemlist[NUMKEYS][64], unsigned char item[64], int where) { 15 int j; 16 for (j = 0; j < where; ++j) { 17 memcpy(itemlist[j], itemlist[j+1], 64); 18 } 19 memcpy(itemlist[where], item, 64); 20 } 21 22 void insert_32(unsigned char itemlist[NUMKEYS][32], unsigned char item[32], int where) { 23 int j; 24 for (j = 0; j < where; ++j) { 25 memcpy(itemlist[j], itemlist[j+1], 32); 26 } 27 memcpy(itemlist[where], item, 32); 28 } 29 30 void make_addr(unsigned char addr[32], unsigned char hash[64]) { 31 /* Public key hash to yggdrasil ipv6 address */ 32 int i; 33 int offset; 34 unsigned char mask; 35 unsigned char c; 36 int ones = 0; 37 unsigned char br = 0; /* false */ 38 for (i = 0; i < 64 && !br; ++i) { 39 mask = 128; 40 c = hash[i]; 41 while (mask) { 42 if (c & mask) { 43 ++ones; 44 } else { 45 br = 1; /* true */ 46 break; 47 } 48 mask >>= 1; 49 } 50 } 51 52 addr[0] = 2; 53 addr[1] = ones; 54 55 offset = ones + 1; 56 for (i = 0; i < 14; ++i) { 57 c = hash[offset/8] << (offset%8); 58 c |= hash[offset/8 + 1] >> (8 - offset%8); 59 addr[i + 2] = c; 60 offset += 8; 61 } 62 }