aboutsummaryrefslogtreecommitdiff
path: root/lib
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
parent3ce450fc1984ac480ae158a40d60e9d42f77f74a (diff)
Add functions for signing and verifying messages using curve25519 keys
Diffstat (limited to 'lib')
-rw-r--r--lib/ed25519/src/fe.c4
-rw-r--r--lib/ed25519/src/sc.c5
-rw-r--r--lib/ed25519_additions.c43
3 files changed, 51 insertions, 1 deletions
diff --git a/lib/ed25519/src/fe.c b/lib/ed25519/src/fe.c
index 448e3e9..07f9f05 100644
--- a/lib/ed25519/src/fe.c
+++ b/lib/ed25519/src/fe.c
@@ -1,6 +1,8 @@
#include "fixedint.h"
#include "fe.h"
+#ifndef ED25519_LOAD_BYTES
+#define ED25519_LOAD_BYTES
/*
helper functions
@@ -26,7 +28,7 @@ static uint64_t load_4(const unsigned char *in) {
return result;
}
-
+#endif
/*
h = 0
diff --git a/lib/ed25519/src/sc.c b/lib/ed25519/src/sc.c
index ca5bad2..a883907 100644
--- a/lib/ed25519/src/sc.c
+++ b/lib/ed25519/src/sc.c
@@ -1,6 +1,9 @@
#include "fixedint.h"
#include "sc.h"
+#ifndef ED25519_LOAD_BYTES
+#define ED25519_LOAD_BYTES
+
static uint64_t load_3(const unsigned char *in) {
uint64_t result;
@@ -22,6 +25,8 @@ static uint64_t load_4(const unsigned char *in) {
return result;
}
+#endif
+
/*
Input:
s[0]+256*s[1]+...+256^63*s[63] = s
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);
+}