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  }