aboutsummaryrefslogtreecommitdiff
path: root/lib/ed25519_additions.c
diff options
context:
space:
mode:
authorMark Haines <mark.haines@matrix.org>2015-03-03 11:18:07 +0000
committerMark Haines <mark.haines@matrix.org>2015-03-03 11:18:07 +0000
commit315caaba7e83eb6680a0407ea13e04b5f7739788 (patch)
tree23141186153b59f493e9e8e09fc1f207a6f8cee4 /lib/ed25519_additions.c
parent3ce450fc1984ac480ae158a40d60e9d42f77f74a (diff)
Add functions for signing and verifying messages using curve25519 keys
Diffstat (limited to 'lib/ed25519_additions.c')
-rw-r--r--lib/ed25519_additions.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/ed25519_additions.c b/lib/ed25519_additions.c
new file mode 100644
index 0000000..5fa0c68
--- /dev/null
+++ b/lib/ed25519_additions.c
@@ -0,0 +1,43 @@
+void convert_curve25519_to_ed25519(
+ unsigned char * public_key,
+ unsigned char * signature
+) {
+ fe mont_x, mont_x_minus_one, mont_x_plus_one, inv_mont_x_plus_one;
+ fe one;
+ fe ed_y;
+
+ fe_frombytes(mont_x, public_key);
+ fe_1(one);
+ fe_sub(mont_x_minus_one, mont_x, one);
+ fe_add(mont_x_plus_one, mont_x, one);
+ fe_invert(inv_mont_x_plus_one, mont_x_plus_one);
+ fe_mul(ed_y, mont_x_minus_one, inv_mont_x_plus_one);
+ fe_tobytes(public_key, ed_y);
+
+ public_key[31] &= 0x7F;
+ public_key[31] |= (signature[63] & 0x80);
+ signature[63] &= 0x7F;
+}
+
+
+void convert_ed25519_to_curve25519(
+ unsigned char const * public_key,
+ unsigned char * signature
+) {
+ unsigned char sign_bit = public_key[31] & 0x80;
+ signature[63] &= 0x7F;
+ signature[63] |= sign_bit;
+}
+
+
+void ed25519_keypair(
+ unsigned char * private_key,
+ unsigned char * public_key
+) {
+ ge_p3 A;
+ private_key[0] &= 248;
+ private_key[31] &= 63;
+ private_key[31] |= 64;
+ ge_scalarmult_base(&A, private_key);
+ ge_p3_tobytes(public_key, &A);
+}