diff options
author | Mark Haines <mark.haines@matrix.org> | 2015-03-03 11:18:07 +0000 |
---|---|---|
committer | Mark Haines <mark.haines@matrix.org> | 2015-03-03 11:18:07 +0000 |
commit | 315caaba7e83eb6680a0407ea13e04b5f7739788 (patch) | |
tree | 23141186153b59f493e9e8e09fc1f207a6f8cee4 /lib | |
parent | 3ce450fc1984ac480ae158a40d60e9d42f77f74a (diff) |
Add functions for signing and verifying messages using curve25519 keys
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ed25519/src/fe.c | 4 | ||||
-rw-r--r-- | lib/ed25519/src/sc.c | 5 | ||||
-rw-r--r-- | lib/ed25519_additions.c | 43 |
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); +} |