mirror of
https://github.com/cwinfo/yggdrasil-go.git
synced 2024-11-25 15:01:34 +00:00
63 lines
1.3 KiB
C
63 lines
1.3 KiB
C
|
#include "yggdrasil-brute.h"
|
||
|
|
||
|
int find_where(unsigned char hash[64], unsigned char besthashlist[NUMKEYS][64]) {
|
||
|
/* Where to insert hash into sorted hashlist */
|
||
|
int j;
|
||
|
int where = -1;
|
||
|
for (j = 0; j < NUMKEYS; ++j) {
|
||
|
if (memcmp(hash, besthashlist[j], 64) > 0) ++where;
|
||
|
else break;
|
||
|
}
|
||
|
return where;
|
||
|
}
|
||
|
|
||
|
void insert_64(unsigned char itemlist[NUMKEYS][64], unsigned char item[64], int where) {
|
||
|
int j;
|
||
|
for (j = 0; j < where; ++j) {
|
||
|
memcpy(itemlist[j], itemlist[j+1], 64);
|
||
|
}
|
||
|
memcpy(itemlist[where], item, 64);
|
||
|
}
|
||
|
|
||
|
void insert_32(unsigned char itemlist[NUMKEYS][32], unsigned char item[32], int where) {
|
||
|
int j;
|
||
|
for (j = 0; j < where; ++j) {
|
||
|
memcpy(itemlist[j], itemlist[j+1], 32);
|
||
|
}
|
||
|
memcpy(itemlist[where], item, 32);
|
||
|
}
|
||
|
|
||
|
void make_addr(unsigned char addr[32], unsigned char hash[64]) {
|
||
|
/* Public key hash to yggdrasil ipv6 address */
|
||
|
int i;
|
||
|
int offset;
|
||
|
unsigned char mask;
|
||
|
unsigned char c;
|
||
|
int ones = 0;
|
||
|
unsigned char br = 0; /* false */
|
||
|
for (i = 0; i < 64 && !br; ++i) {
|
||
|
mask = 128;
|
||
|
c = hash[i];
|
||
|
while (mask) {
|
||
|
if (c & mask) {
|
||
|
++ones;
|
||
|
} else {
|
||
|
br = 1; /* true */
|
||
|
break;
|
||
|
}
|
||
|
mask >>= 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
addr[0] = 2;
|
||
|
addr[1] = ones;
|
||
|
|
||
|
offset = ones + 1;
|
||
|
for (i = 0; i < 14; ++i) {
|
||
|
c = hash[offset/8] << (offset%8);
|
||
|
c |= hash[offset/8 + 1] >> (8 - offset%8);
|
||
|
addr[i + 2] = c;
|
||
|
offset += 8;
|
||
|
}
|
||
|
}
|