Comment out old public/private keys when generating new ones.
This commit is contained in:
parent
38dbc63f11
commit
f70cbc9d3e
1 changed files with 79 additions and 12 deletions
|
@ -217,6 +217,83 @@ static bool parse_options(int argc, char **argv) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void disable_old_keys(const char *filename, const char *what) {
|
||||||
|
char tmpfile[PATH_MAX] = "";
|
||||||
|
char buf[1024];
|
||||||
|
bool disabled = false;
|
||||||
|
bool block = false;
|
||||||
|
bool error = false;
|
||||||
|
FILE *r, *w;
|
||||||
|
|
||||||
|
r = fopen(filename, "r");
|
||||||
|
if(!r)
|
||||||
|
return;
|
||||||
|
|
||||||
|
snprintf(tmpfile, sizeof tmpfile, "%s.tmp", filename);
|
||||||
|
|
||||||
|
w = fopen(tmpfile, "w");
|
||||||
|
|
||||||
|
while(fgets(buf, sizeof buf, r)) {
|
||||||
|
if(!block && !strncmp(buf, "-----BEGIN ", 11)) {
|
||||||
|
if((strstr(buf, " EC ") && strstr(what, "ECDSA")) || (strstr(buf, " RSA ") && strstr(what, "RSA"))) {
|
||||||
|
disabled = true;
|
||||||
|
block = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ecdsapubkey = !strncasecmp(buf, "ECDSAPublicKey", 14) && strchr(" \t=", buf[14]) && strstr(what, "ECDSA");
|
||||||
|
|
||||||
|
if(ecdsapubkey)
|
||||||
|
disabled = true;
|
||||||
|
|
||||||
|
if(w) {
|
||||||
|
if(block || ecdsapubkey)
|
||||||
|
fputc('#', w);
|
||||||
|
if(fputs(buf, w) < 0) {
|
||||||
|
error = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(block && !strncmp(buf, "-----END ", 9))
|
||||||
|
block = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(w)
|
||||||
|
if(fclose(w) < 0)
|
||||||
|
error = true;
|
||||||
|
if(ferror(r) || fclose(r) < 0)
|
||||||
|
error = true;
|
||||||
|
|
||||||
|
if(disabled) {
|
||||||
|
if(!w || error) {
|
||||||
|
fprintf(stderr, "Warning: old key(s) found, remove them by hand!\n");
|
||||||
|
if(w)
|
||||||
|
unlink(tmpfile);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_MINGW
|
||||||
|
// We cannot atomically replace files on Windows.
|
||||||
|
char bakfile[PATH_MAX] = "";
|
||||||
|
snprintf(bakfile, sizeof bakfile, "%s.bak", filename);
|
||||||
|
if(rename(filename, bakfile) || rename(tmpfile, filename)) {
|
||||||
|
rename(bakfile, filename);
|
||||||
|
#else
|
||||||
|
if(rename(tmpfile, filename)) {
|
||||||
|
#endif
|
||||||
|
fprintf(stderr, "Warning: old key(s) found, remove them by hand!\n");
|
||||||
|
} else {
|
||||||
|
#ifdef HAVE_MINGW
|
||||||
|
unlink(bakfile);
|
||||||
|
#endif
|
||||||
|
fprintf(stderr, "Warning: old key(s) found and disabled.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unlink(tmpfile);
|
||||||
|
}
|
||||||
|
|
||||||
static FILE *ask_and_open(const char *filename, const char *what, const char *mode, bool ask) {
|
static FILE *ask_and_open(const char *filename, const char *what, const char *mode, bool ask) {
|
||||||
FILE *r;
|
FILE *r;
|
||||||
char *directory;
|
char *directory;
|
||||||
|
@ -257,6 +334,8 @@ static FILE *ask_and_open(const char *filename, const char *what, const char *mo
|
||||||
|
|
||||||
umask(0077); /* Disallow everything for group and other */
|
umask(0077); /* Disallow everything for group and other */
|
||||||
|
|
||||||
|
disable_old_keys(filename, what);
|
||||||
|
|
||||||
/* Open it first to keep the inode busy */
|
/* Open it first to keep the inode busy */
|
||||||
|
|
||||||
r = fopen(filename, mode);
|
r = fopen(filename, mode);
|
||||||
|
@ -297,9 +376,6 @@ static bool ecdsa_keygen(bool ask) {
|
||||||
fchmod(fileno(f), 0600);
|
fchmod(fileno(f), 0600);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(ftell(f))
|
|
||||||
fprintf(stderr, "Appending key to existing contents.\nMake sure only one key is stored in the file.\n");
|
|
||||||
|
|
||||||
ecdsa_write_pem_private_key(&key, f);
|
ecdsa_write_pem_private_key(&key, f);
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
@ -315,9 +391,6 @@ static bool ecdsa_keygen(bool ask) {
|
||||||
if(!f)
|
if(!f)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(ftell(f))
|
|
||||||
fprintf(stderr, "Appending key to existing contents.\nMake sure only one key is stored in the file.\n");
|
|
||||||
|
|
||||||
char *pubkey = ecdsa_get_base64_public_key(&key);
|
char *pubkey = ecdsa_get_base64_public_key(&key);
|
||||||
fprintf(f, "ECDSAPublicKey = %s\n", pubkey);
|
fprintf(f, "ECDSAPublicKey = %s\n", pubkey);
|
||||||
free(pubkey);
|
free(pubkey);
|
||||||
|
@ -356,9 +429,6 @@ static bool rsa_keygen(int bits, bool ask) {
|
||||||
fchmod(fileno(f), 0600);
|
fchmod(fileno(f), 0600);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(ftell(f))
|
|
||||||
fprintf(stderr, "Appending key to existing contents.\nMake sure only one key is stored in the file.\n");
|
|
||||||
|
|
||||||
rsa_write_pem_private_key(&key, f);
|
rsa_write_pem_private_key(&key, f);
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
@ -374,9 +444,6 @@ static bool rsa_keygen(int bits, bool ask) {
|
||||||
if(!f)
|
if(!f)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(ftell(f))
|
|
||||||
fprintf(stderr, "Appending key to existing contents.\nMake sure only one key is stored in the file.\n");
|
|
||||||
|
|
||||||
rsa_write_pem_public_key(&key, f);
|
rsa_write_pem_public_key(&key, f);
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
Loading…
Reference in a new issue