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/ed25519_additions.c | |
parent | 3ce450fc1984ac480ae158a40d60e9d42f77f74a (diff) |
Add functions for signing and verifying messages using curve25519 keys
Diffstat (limited to 'lib/ed25519_additions.c')
-rw-r--r-- | lib/ed25519_additions.c | 43 |
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); +} |