Add checkpointing support for passphrases

This commit is contained in:
scribblemaniac 2021-10-15 22:53:53 -06:00
parent ff3873965f
commit 2a4afad91a
No known key found for this signature in database
GPG key ID: 7C7B792A6AD57A97
5 changed files with 67 additions and 2 deletions

19
main.c
View file

@ -112,6 +112,7 @@ static void printhelp(FILE *out,const char *progname)
#ifdef PASSPHRASE
"\t-p passphrase - use passphrase to initialize the random seed with\n"
"\t-P - same as -p, but takes passphrase from PASSPHRASE environment variable\n"
"\t-c filename - load/save checkpoint of progress to specified file (requires passphrase)\n"
#endif
,progname,progname);
fflush(out);
@ -393,6 +394,12 @@ int main(int argc,char **argv)
setpassphrase(pass);
deterministic = 1;
}
else if (*arg == 'c') {
if (argc--)
checkpointfile = *argv++;
else
e_additional();
}
#endif // PASSPHRASE
else {
fprintf(stderr,"unrecognised argument: -%c\n",*arg);
@ -465,6 +472,18 @@ int main(int argc,char **argv)
goto done;
}
if (checkpointfile) {
// Read current checkpoint position if file exists
FILE *checkout = fopen(checkpointfile, "r");
if (checkout) {
if(fread(checkpoint, 1, SEED_LEN, checkout) != SEED_LEN) {
fprintf(stderr,"failed to read checkpoint file\n");
exit(1);
}
fclose(checkout);
}
}
filters_prepare();
filters_print();

View file

@ -63,6 +63,8 @@ void worker_init(void)
pthread_mutex_t determseed_mutex;
u8 determseed[SEED_LEN];
u8 checkpoint[SEED_LEN];
const char *checkpointfile = 0;
#endif

View file

@ -33,6 +33,8 @@ VEC_STRUCT(statsvec,struct statstruct);
#ifdef PASSPHRASE
extern pthread_mutex_t determseed_mutex;
extern u8 determseed[SEED_LEN];
extern u8 checkpoint[SEED_LEN];
extern const char *checkpointfile;
#endif
extern void worker_init(void);

View file

@ -36,18 +36,39 @@ void *worker_batch_pass(void *task)
sname = makesname();
// load checkpoint
pthread_mutex_lock(&determseed_mutex);
for (int i = 0; i < SEED_LEN; i++)
determseed[i] += checkpoint[i];
pthread_mutex_unlock(&determseed_mutex);
initseed:
#ifdef STATISTICS
++st->numrestart.v;
#endif
pthread_mutex_lock(&determseed_mutex);
for (int i = 0; i < SEED_LEN; i++)
for (int i = 0; i < SEED_LEN; i++) {
++checkpoint[i];
if (++determseed[i])
break;
}
memcpy(seed, determseed, SEED_LEN);
pthread_mutex_unlock(&determseed_mutex);
if (checkpointfile) {
FILE *checkout = fopen(checkpointfile, "w");
if (!checkout) {
fprintf(stderr,"cannot open checkpoint file for writing\n");
exit(1);
}
if(fwrite(checkpoint, 1, SEED_LEN, checkout) != SEED_LEN) {
fprintf(stderr,"cannot write to checkpoint file\n");
exit(1);
}
fclose(checkout);
}
ed25519_seckey_expand(sk,seed);
ge_scalarmult_base(&ge_public,sk);

View file

@ -33,18 +33,39 @@ void *worker_fast_pass(void *task)
sname = makesname();
// load checkpoint
pthread_mutex_lock(&determseed_mutex);
for (int i = 0; i < SEED_LEN; i++)
determseed[i] += checkpoint[i];
pthread_mutex_unlock(&determseed_mutex);
initseed:
#ifdef STATISTICS
++st->numrestart.v;
#endif
pthread_mutex_lock(&determseed_mutex);
for (int i = 0; i < SEED_LEN; i++)
for (int i = 0; i < SEED_LEN; i++) {
++checkpoint[i];
if (++determseed[i])
break;
}
memcpy(seed, determseed, SEED_LEN);
pthread_mutex_unlock(&determseed_mutex);
if (checkpointfile) {
FILE *checkout = fopen(checkpointfile, "w");
if (!checkout) {
fprintf(stderr,"cannot open checkpoint file for writing\n");
exit(1);
}
if(fwrite(checkpoint, 1, SEED_LEN, checkout) != SEED_LEN) {
fprintf(stderr,"cannot write to checkpoint file\n");
exit(1);
}
fclose(checkout);
}
ed25519_seckey_expand(sk,seed);
ge_scalarmult_base(&ge_public,sk);