aboutsummaryrefslogtreecommitdiff
path: root/src/pki_crypto.c
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2011-12-28 18:21:47 +0100
committerAndreas Schneider <asn@cryptomilk.org>2012-02-04 18:37:04 +0100
commitf35c284761359b4b71c0f8228126fa920430ad66 (patch)
treedaf2aa48e326644b673352045effdd14d9369c7e /src/pki_crypto.c
parentfa37965ab08ce66875be15f340e54f4c283075d9 (diff)
downloadlibssh-f35c284761359b4b71c0f8228126fa920430ad66.tar.gz
libssh-f35c284761359b4b71c0f8228126fa920430ad66.tar.xz
libssh-f35c284761359b4b71c0f8228126fa920430ad66.zip
pki: Add support to import ecdsa pubkeys.
Diffstat (limited to 'src/pki_crypto.c')
-rw-r--r--src/pki_crypto.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/pki_crypto.c b/src/pki_crypto.c
index 4f6db1cf..6c5f104d 100644
--- a/src/pki_crypto.c
+++ b/src/pki_crypto.c
@@ -121,6 +121,19 @@ static const char *pki_key_ecdsa_nid_to_char(int nid)
return "unknown";
}
+int pki_key_ecdsa_nid_from_name(const char *name)
+{
+ if (strcmp(name, "nistp256") == 0) {
+ return NID_X9_62_prime256v1;
+ } else if (strcmp(name, "nistp384") == 0) {
+ return NID_secp384r1;
+ } else if (strcmp(name, "nistp521") == 0) {
+ return NID_secp521r1;
+ }
+
+ return -1;
+}
+
static ssh_string make_ecpoint_string(const EC_GROUP *g,
const EC_POINT *p)
{
@@ -155,6 +168,45 @@ static ssh_string make_ecpoint_string(const EC_GROUP *g,
return s;
}
+
+int pki_pubkey_build_ecdsa(ssh_key key, int nid, ssh_string e)
+{
+ EC_POINT *p;
+ const EC_GROUP *g;
+ int ok;
+
+ key->ecdsa_nid = nid;
+ key->type_c = pki_key_ecdsa_nid_to_name(nid);
+
+ key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid);
+ if (key->ecdsa == NULL) {
+ return -1;
+ }
+
+ g = EC_KEY_get0_group(key->ecdsa);
+
+ p = EC_POINT_new(g);
+ if (p == NULL) {
+ return -1;
+ }
+
+ ok = EC_POINT_oct2point(g,
+ p,
+ ssh_string_data(e),
+ ssh_string_len(e),
+ NULL);
+ if (!ok) {
+ EC_POINT_free(p);
+ return -1;
+ }
+
+ ok = EC_KEY_set_public_key(key->ecdsa, p);
+ if (!ok) {
+ EC_POINT_free(p);
+ }
+
+ return 0;
+}
#endif
ssh_key pki_key_dup(const ssh_key key, int demote)