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  }