mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-07-31 00:03:07 +03:00
examples: Update keygen2 example to show fingerprints
Signed-off-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
committed by
Andreas Schneider
parent
0982715bb5
commit
f193e6840d
@ -38,6 +38,7 @@ struct arguments_st {
|
|||||||
unsigned long bits;
|
unsigned long bits;
|
||||||
char *file;
|
char *file;
|
||||||
char *passphrase;
|
char *passphrase;
|
||||||
|
int action_list;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct argp_option options[] = {
|
static struct argp_option options[] = {
|
||||||
@ -88,6 +89,14 @@ static struct argp_option options[] = {
|
|||||||
"\"rsa\", \"ecdsa\", \"ed25519\", and \"dsa\".\n",
|
"\"rsa\", \"ecdsa\", \"ed25519\", and \"dsa\".\n",
|
||||||
.group = 0
|
.group = 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "list",
|
||||||
|
.key = 'l',
|
||||||
|
.arg = NULL,
|
||||||
|
.flags = 0,
|
||||||
|
.doc = "List the Fingerprint of the given key\n",
|
||||||
|
.group = 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
/* End of the options */
|
/* End of the options */
|
||||||
0
|
0
|
||||||
@ -160,6 +169,9 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
arguments->action_list = 1;
|
||||||
|
break;
|
||||||
case ARGP_KEY_ARG:
|
case ARGP_KEY_ARG:
|
||||||
if (state->arg_num > 0) {
|
if (state->arg_num > 0) {
|
||||||
/* Too many arguments. */
|
/* Too many arguments. */
|
||||||
@ -185,98 +197,103 @@ static int validate_args(struct arguments_st *args)
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(args->type) {
|
/* no other arguments needed for listing key fingerprints */
|
||||||
case SSH_KEYTYPE_RSA:
|
if (args->action_list) {
|
||||||
switch(args->bits) {
|
return 0;
|
||||||
case 0:
|
}
|
||||||
/* If not provided, use default value */
|
|
||||||
args->bits = 3072;
|
|
||||||
break;
|
|
||||||
case 1024:
|
|
||||||
case 2048:
|
|
||||||
case 3072:
|
|
||||||
case 4096:
|
|
||||||
case 8192:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Error: Invalid bits parameter provided\n");
|
|
||||||
rc = EINVAL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args->file == NULL) {
|
|
||||||
args->file = strdup("id_rsa");
|
|
||||||
if (args->file == NULL) {
|
|
||||||
rc = ENOMEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
switch (args->type) {
|
||||||
|
case SSH_KEYTYPE_RSA:
|
||||||
|
switch (args->bits) {
|
||||||
|
case 0:
|
||||||
|
/* If not provided, use default value */
|
||||||
|
args->bits = 3072;
|
||||||
break;
|
break;
|
||||||
case SSH_KEYTYPE_ECDSA:
|
case 1024:
|
||||||
switch(args->bits) {
|
case 2048:
|
||||||
case 0:
|
case 3072:
|
||||||
/* If not provided, use default value */
|
case 4096:
|
||||||
args->bits = 256;
|
case 8192:
|
||||||
break;
|
|
||||||
case 256:
|
|
||||||
case 384:
|
|
||||||
case 521:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Error: Invalid bits parameter provided\n");
|
|
||||||
rc = EINVAL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (args->file == NULL) {
|
|
||||||
args->file = strdup("id_ecdsa");
|
|
||||||
if (args->file == NULL) {
|
|
||||||
rc = ENOMEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case SSH_KEYTYPE_DSS:
|
|
||||||
switch(args->bits) {
|
|
||||||
case 0:
|
|
||||||
/* If not provided, use default value */
|
|
||||||
args->bits = 1024;
|
|
||||||
break;
|
|
||||||
case 1024:
|
|
||||||
case 2048:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Error: Invalid bits parameter provided\n");
|
|
||||||
rc = EINVAL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (args->file == NULL) {
|
|
||||||
args->file = strdup("id_dsa");
|
|
||||||
if (args->file == NULL) {
|
|
||||||
rc = ENOMEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case SSH_KEYTYPE_ED25519:
|
|
||||||
/* Ignore value and overwrite with a zero */
|
|
||||||
args->bits = 0;
|
|
||||||
|
|
||||||
if (args->file == NULL) {
|
|
||||||
args->file = strdup("id_ed25519");
|
|
||||||
if (args->file == NULL) {
|
|
||||||
rc = ENOMEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "Error: unknown key type\n");
|
fprintf(stderr, "Error: Invalid bits parameter provided\n");
|
||||||
rc = EINVAL;
|
rc = EINVAL;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args->file == NULL) {
|
||||||
|
args->file = strdup("id_rsa");
|
||||||
|
if (args->file == NULL) {
|
||||||
|
rc = ENOMEM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SSH_KEYTYPE_ECDSA:
|
||||||
|
switch (args->bits) {
|
||||||
|
case 0:
|
||||||
|
/* If not provided, use default value */
|
||||||
|
args->bits = 256;
|
||||||
|
break;
|
||||||
|
case 256:
|
||||||
|
case 384:
|
||||||
|
case 521:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Error: Invalid bits parameter provided\n");
|
||||||
|
rc = EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (args->file == NULL) {
|
||||||
|
args->file = strdup("id_ecdsa");
|
||||||
|
if (args->file == NULL) {
|
||||||
|
rc = ENOMEM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SSH_KEYTYPE_DSS:
|
||||||
|
switch (args->bits) {
|
||||||
|
case 0:
|
||||||
|
/* If not provided, use default value */
|
||||||
|
args->bits = 1024;
|
||||||
|
break;
|
||||||
|
case 1024:
|
||||||
|
case 2048:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Error: Invalid bits parameter provided\n");
|
||||||
|
rc = EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (args->file == NULL) {
|
||||||
|
args->file = strdup("id_dsa");
|
||||||
|
if (args->file == NULL) {
|
||||||
|
rc = ENOMEM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SSH_KEYTYPE_ED25519:
|
||||||
|
/* Ignore value and overwrite with a zero */
|
||||||
|
args->bits = 0;
|
||||||
|
|
||||||
|
if (args->file == NULL) {
|
||||||
|
args->file = strdup("id_ed25519");
|
||||||
|
if (args->file == NULL) {
|
||||||
|
rc = ENOMEM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Error: unknown key type\n");
|
||||||
|
rc = EINVAL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@ -289,6 +306,31 @@ static char doc[] = "Generate an SSH key pair. "
|
|||||||
/* Our argp parser */
|
/* Our argp parser */
|
||||||
static struct argp argp = {options, parse_opt, NULL, doc, NULL, NULL, NULL};
|
static struct argp argp = {options, parse_opt, NULL, doc, NULL, NULL, NULL};
|
||||||
|
|
||||||
|
static void
|
||||||
|
list_fingerprint(char *file)
|
||||||
|
{
|
||||||
|
ssh_key key = NULL;
|
||||||
|
unsigned char *hash = NULL;
|
||||||
|
size_t hlen = 0;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = ssh_pki_import_privkey_file(file, NULL, NULL, NULL, &key);
|
||||||
|
if (rc != SSH_OK) {
|
||||||
|
fprintf(stderr, "Failed to import private key %s\n", file);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = ssh_get_publickey_hash(key, SSH_PUBLICKEY_HASH_SHA256, &hash, &hlen);
|
||||||
|
if (rc != SSH_OK) {
|
||||||
|
fprintf(stderr, "Failed to get key fingerprint\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ssh_print_hash(SSH_PUBLICKEY_HASH_SHA256, hash, hlen);
|
||||||
|
|
||||||
|
ssh_clean_pubkey_hash(&hash);
|
||||||
|
ssh_key_free(key);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
ssh_key key = NULL;
|
ssh_key key = NULL;
|
||||||
@ -302,6 +344,7 @@ int main(int argc, char *argv[])
|
|||||||
.bits = 0,
|
.bits = 0,
|
||||||
.file = NULL,
|
.file = NULL,
|
||||||
.passphrase = NULL,
|
.passphrase = NULL,
|
||||||
|
.action_list = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
@ -319,6 +362,11 @@ int main(int argc, char *argv[])
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (arguments.action_list && arguments.file) {
|
||||||
|
list_fingerprint(arguments.file);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
rc = open(arguments.file, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR);
|
rc = open(arguments.file, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
|
Reference in New Issue
Block a user