summaryrefslogtreecommitdiff
path: root/ssh-ecdsa.c
diff options
context:
space:
mode:
authordjm@openbsd.org <djm@openbsd.org>2022-10-28 00:39:29 +0000
committerDamien Miller <djm@mindrot.org>2022-10-28 12:46:58 +1100
commit262647c2e920492ca57f1b9320d74f4a0f6e482b (patch)
tree1ce89f627b8230d5ce9611ebe698e5b3f4338fa1 /ssh-ecdsa.c
parent401c74e7dc15eab60540653d2f94d9306a927bab (diff)
downloadopenssh-git-262647c2e920492ca57f1b9320d74f4a0f6e482b.tar.gz
upstream: factor out key generation
feedback/ok markus@ OpenBSD-Commit-ID: 5b4211bff4de8d9adb84bc72857a8c42c44e7ceb
Diffstat (limited to 'ssh-ecdsa.c')
-rw-r--r--ssh-ecdsa.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/ssh-ecdsa.c b/ssh-ecdsa.c
index 24f66bdc..16a8ea87 100644
--- a/ssh-ecdsa.c
+++ b/ssh-ecdsa.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-ecdsa.c,v 1.19 2022/10/28 00:37:24 djm Exp $ */
+/* $OpenBSD: ssh-ecdsa.c,v 1.20 2022/10/28 00:39:29 djm Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
* Copyright (c) 2010 Damien Miller. All rights reserved.
@@ -108,6 +108,24 @@ ssh_ecdsa_serialize_public(const struct sshkey *key, struct sshbuf *b,
return 0;
}
+static int
+ssh_ecdsa_generate(struct sshkey *k, int bits)
+{
+ EC_KEY *private;
+
+ if ((k->ecdsa_nid = sshkey_ecdsa_bits_to_nid(bits)) == -1)
+ return SSH_ERR_KEY_LENGTH;
+ if ((private = EC_KEY_new_by_curve_name(k->ecdsa_nid)) == NULL)
+ return SSH_ERR_ALLOC_FAIL;
+ if (EC_KEY_generate_key(private) != 1) {
+ EC_KEY_free(private);
+ return SSH_ERR_LIBCRYPTO_ERROR;
+ }
+ EC_KEY_set_asn1_flag(private, OPENSSL_EC_NAMED_CURVE);
+ k->ecdsa = private;
+ return 0;
+}
+
/* ARGSUSED */
int
ssh_ecdsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
@@ -267,6 +285,7 @@ const struct sshkey_impl_funcs sshkey_ecdsa_funcs = {
/* .cleanup = */ ssh_ecdsa_cleanup,
/* .equal = */ ssh_ecdsa_equal,
/* .ssh_serialize_public = */ ssh_ecdsa_serialize_public,
+ /* .generate = */ ssh_ecdsa_generate,
};
const struct sshkey_impl sshkey_ecdsa_nistp256_impl = {