|
|
@ -36,6 +36,7 @@
|
|
|
|
#include <termios.h>
|
|
|
|
#include <termios.h>
|
|
|
|
|
|
|
|
|
|
|
|
#include <sxt/errno.h>
|
|
|
|
#include <sxt/errno.h>
|
|
|
|
|
|
|
|
#include <sxt/rdb.h>
|
|
|
|
#include <sxt/sxtkey.h>
|
|
|
|
#include <sxt/sxtkey.h>
|
|
|
|
#include <sxt/sxt.h>
|
|
|
|
#include <sxt/sxt.h>
|
|
|
|
|
|
|
|
|
|
|
@ -166,10 +167,10 @@ int main(int argc, char **argv)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* check type */
|
|
|
|
/* check type */
|
|
|
|
if(keytype) type = sxt_key_type_fname(keytype);
|
|
|
|
if(keytype) type = sxtkey_type_fname(keytype);
|
|
|
|
else type = PPKP_ED25519;
|
|
|
|
else type = PPKP_ED25519;
|
|
|
|
|
|
|
|
|
|
|
|
keytype = (char *)sxt_key_name(type);
|
|
|
|
keytype = (char *)sxtkey_name(type);
|
|
|
|
|
|
|
|
|
|
|
|
if(!type) {
|
|
|
|
if(!type) {
|
|
|
|
fprintf(stderr, "Illegal keytype.\nAborting.\n");
|
|
|
|
fprintf(stderr, "Illegal keytype.\nAborting.\n");
|
|
|
@ -228,64 +229,64 @@ int main(int argc, char **argv)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* generate a key first */
|
|
|
|
/* generate a key first */
|
|
|
|
if(!(pair = sxt_key_alloc())) {
|
|
|
|
if(!(pair = sxtkey_alloc())) {
|
|
|
|
fprintf(stderr, "Not enough memory to allocate a key.\nAborting.\n");
|
|
|
|
fprintf(stderr, "Not enough memory to allocate a key.\nAborting.\n");
|
|
|
|
abort();
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fprintf(stdout, "Generating key pair ...");
|
|
|
|
fprintf(stdout, "Generating key pair ...");
|
|
|
|
if((r = sxt_key_generate(pair, type, 0)) != SXT_SUCCESS) {
|
|
|
|
if((r = sxtkey_generate(pair, type, 0)) != SXT_SUCCESS) {
|
|
|
|
fprintf(stderr, "FAIL.\nError (%d).\nAborting.\n", r);
|
|
|
|
fprintf(stderr, "FAIL.\nError (%d).\nAborting.\n", r);
|
|
|
|
sxt_key_free(pair);
|
|
|
|
sxtkey_free(pair);
|
|
|
|
abort();
|
|
|
|
abort();
|
|
|
|
} else fprintf(stdout, "DONE.\n");
|
|
|
|
} else fprintf(stdout, "DONE.\n");
|
|
|
|
|
|
|
|
|
|
|
|
/* hash */
|
|
|
|
/* hash */
|
|
|
|
if(hash) sxt_key_assign_hash(pair, hash);
|
|
|
|
if(hash) sxtkey_assign_hash(pair, hash);
|
|
|
|
|
|
|
|
|
|
|
|
/* duplicate private */
|
|
|
|
/* duplicate private */
|
|
|
|
if((r = sxt_key_dup_private(pair, &privkey)) != SXT_SUCCESS) {
|
|
|
|
if((r = sxtkey_dup_private(pair, &privkey)) != SXT_SUCCESS) {
|
|
|
|
fprintf(stderr, "Unable to duplicate private key(%d).\nAborting.\n", r);
|
|
|
|
fprintf(stderr, "Unable to duplicate private key(%d).\nAborting.\n", r);
|
|
|
|
sxt_key_free(pair);
|
|
|
|
sxtkey_free(pair);
|
|
|
|
abort();
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* get public duplicate */
|
|
|
|
/* get public duplicate */
|
|
|
|
if((r = sxt_key_dup_public(pair, &pubkey)) != SXT_SUCCESS) {
|
|
|
|
if((r = sxtkey_dup_public(pair, &pubkey)) != SXT_SUCCESS) {
|
|
|
|
fprintf(stderr, "Unable to duplicate public key(%d).\nAborting.\n", r);
|
|
|
|
fprintf(stderr, "Unable to duplicate public key(%d).\nAborting.\n", r);
|
|
|
|
sxt_key_free(pair);
|
|
|
|
sxtkey_free(pair);
|
|
|
|
sxt_key_free(privkey);
|
|
|
|
sxtkey_free(privkey);
|
|
|
|
abort();
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ok, output private key first */
|
|
|
|
/* ok, output private key first */
|
|
|
|
snprintf(fullpath, MAX_PATHNAME, "%s/%s", dir, privname);
|
|
|
|
snprintf(fullpath, MAX_PATHNAME, "%s/%s", dir, privname);
|
|
|
|
if(!encrypt) { /* will not encrypt */
|
|
|
|
if(!encrypt) { /* will not encrypt */
|
|
|
|
r = sxt_key_export_priv_file(privkey, fullpath, NULL, NULL, NULL);
|
|
|
|
r = sxtkey_export_priv_file(privkey, fullpath, NULL, NULL, NULL);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
r = sxt_key_export_priv_file(privkey, fullpath, NULL, __passkey_promt,
|
|
|
|
r = sxtkey_export_priv_file(privkey, fullpath, NULL, __passkey_promt,
|
|
|
|
(void *)"Enter passkey phrase:");
|
|
|
|
(void *)"Enter passkey phrase:");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(r != SXT_SUCCESS) {
|
|
|
|
if(r != SXT_SUCCESS) {
|
|
|
|
__failed_export:
|
|
|
|
__failed_export:
|
|
|
|
fprintf(stderr, "Unable to perform key export (%d).\nAborting.\n", r);
|
|
|
|
fprintf(stderr, "Unable to perform key export (%d).\nAborting.\n", r);
|
|
|
|
sxt_key_burn(pair);
|
|
|
|
sxtkey_burn(pair);
|
|
|
|
sxt_key_burn(privkey);
|
|
|
|
sxtkey_burn(privkey);
|
|
|
|
sxt_key_free(pair);
|
|
|
|
sxtkey_free(pair);
|
|
|
|
sxt_key_free(privkey);
|
|
|
|
sxtkey_free(privkey);
|
|
|
|
abort();
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ok, output public key */
|
|
|
|
/* ok, output public key */
|
|
|
|
snprintf(fullpath, MAX_PATHNAME, "%s/%s", dir, pubname);
|
|
|
|
snprintf(fullpath, MAX_PATHNAME, "%s/%s", dir, pubname);
|
|
|
|
r = sxt_key_export_public_file(pubkey, fullpath);
|
|
|
|
r = sxtkey_export_public_file(pubkey, fullpath);
|
|
|
|
if(r != SXT_SUCCESS) goto __failed_export;
|
|
|
|
if(r != SXT_SUCCESS) goto __failed_export;
|
|
|
|
|
|
|
|
|
|
|
|
sxt_key_burn(pair);
|
|
|
|
sxtkey_burn(pair);
|
|
|
|
sxt_key_burn(privkey);
|
|
|
|
sxtkey_burn(privkey);
|
|
|
|
sxt_key_burn(pubkey);
|
|
|
|
sxtkey_burn(pubkey);
|
|
|
|
sxt_key_free(pair);
|
|
|
|
sxtkey_free(pair);
|
|
|
|
sxt_key_free(privkey);
|
|
|
|
sxtkey_free(privkey);
|
|
|
|
sxt_key_free(pubkey);
|
|
|
|
sxtkey_free(pubkey);
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|