Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mRemoteNG/PuTTYNG.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'keygen/ecdsa.c')
-rw-r--r--keygen/ecdsa.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/keygen/ecdsa.c b/keygen/ecdsa.c
new file mode 100644
index 00000000..28a723b2
--- /dev/null
+++ b/keygen/ecdsa.c
@@ -0,0 +1,37 @@
+/*
+ * EC key generation.
+ */
+
+#include "ssh.h"
+#include "sshkeygen.h"
+#include "mpint.h"
+
+int ecdsa_generate(struct ecdsa_key *ek, int bits)
+{
+ if (!ec_nist_alg_and_curve_by_bits(bits, &ek->curve, &ek->sshk.vt))
+ return 0;
+
+ mp_int *one = mp_from_integer(1);
+ ek->privateKey = mp_random_in_range(one, ek->curve->w.G_order);
+ mp_free(one);
+
+ ek->publicKey = ecdsa_public(ek->privateKey, ek->sshk.vt);
+
+ return 1;
+}
+
+int eddsa_generate(struct eddsa_key *ek, int bits)
+{
+ if (!ec_ed_alg_and_curve_by_bits(bits, &ek->curve, &ek->sshk.vt))
+ return 0;
+
+ /* EdDSA secret keys are just 32 bytes of hash preimage; the
+ * 64-byte SHA-512 hash of that key will be used when signing,
+ * but the form of the key stored on disk is the preimage
+ * only. */
+ ek->privateKey = mp_random_bits(bits);
+
+ ek->publicKey = eddsa_public(ek->privateKey, ek->sshk.vt);
+
+ return 1;
+}