github.com/yggdrasil-network/yggdrasil-go@v0.5.6/contrib/yggdrasil-brute-simple/yggdrasil-brute-multi-curve25519.c (about) 1 /* 2 sk: 32 random bytes 3 sk[0] &= 248; 4 sk[31] &= 127; 5 sk[31] |= 64; 6 7 increment sk 8 pk = curve25519_scalarmult_base(mysecret) 9 hash = sha512(pk) 10 11 if besthash: 12 bestsk = sk 13 besthash = hash 14 */ 15 16 #include "yggdrasil-brute.h" 17 18 19 void seed(unsigned char sk[32]) { 20 randombytes_buf(sk, 32); 21 sk[0] &= 248; 22 sk[31] &= 127; 23 sk[31] |= 64; 24 } 25 26 27 int main(int argc, char **argv) { 28 int i; 29 int j; 30 unsigned char addr[16]; 31 time_t starttime; 32 time_t requestedtime; 33 34 unsigned char bestsklist[NUMKEYS][32]; 35 unsigned char bestpklist[NUMKEYS][32]; 36 unsigned char besthashlist[NUMKEYS][64]; 37 38 unsigned char sk[32]; 39 unsigned char pk[32]; 40 unsigned char hash[64]; 41 42 unsigned int runs = 0; 43 int where; 44 45 if (argc != 2) { 46 fprintf(stderr, "usage: ./yggdrasil-brute-multi-curve25519 <seconds>\n"); 47 return 1; 48 } 49 50 if (sodium_init() < 0) { 51 /* panic! the library couldn't be initialized, it is not safe to use */ 52 printf("sodium init failed!\n"); 53 return 1; 54 } 55 56 starttime = time(NULL); 57 requestedtime = atoi(argv[1]); 58 59 if (requestedtime < 0) requestedtime = 0; 60 fprintf(stderr, "Searching for yggdrasil curve25519 keys (this will take slightly longer than %ld seconds)\n", requestedtime); 61 62 sodium_memzero(bestsklist, NUMKEYS * 32); 63 sodium_memzero(bestpklist, NUMKEYS * 32); 64 sodium_memzero(besthashlist, NUMKEYS * 64); 65 seed(sk); 66 67 do { 68 /* generate pubkey, hash, compare, increment secret. 69 * this loop should take 4 seconds on modern hardware */ 70 for (i = 0; i < (1 << 16); ++i) { 71 ++runs; 72 if (crypto_scalarmult_curve25519_base(pk, sk) != 0) { 73 printf("scalarmult to create pub failed!\n"); 74 return 1; 75 } 76 crypto_hash_sha512(hash, pk, 32); 77 78 where = find_where(hash, besthashlist); 79 if (where >= 0) { 80 insert_32(bestsklist, sk, where); 81 insert_32(bestpklist, pk, where); 82 insert_64(besthashlist, hash, where); 83 84 seed(sk); 85 } 86 for (j = 1; j < 31; ++j) if (++sk[j]) break; 87 } 88 } while (time(NULL) - starttime < requestedtime || runs < NUMKEYS); 89 90 fprintf(stderr, "--------------addr-------------- -----------------------------secret----------------------------- -----------------------------public-----------------------------\n"); 91 for (i = 0; i < NUMKEYS; ++i) { 92 make_addr(addr, besthashlist[i]); 93 for (j = 0; j < 16; ++j) printf("%02x", addr[j]); 94 printf(" "); 95 for (j = 0; j < 32; ++j) printf("%02x", bestsklist[i][j]); 96 printf(" "); 97 for (j = 0; j < 32; ++j) printf("%02x", bestpklist[i][j]); 98 printf("\n"); 99 } 100 101 sodium_memzero(bestsklist, NUMKEYS * 32); 102 sodium_memzero(sk, 32); 103 104 return 0; 105 }