From ae9d05be046a0d60ca779f695086428e048617af Mon Sep 17 00:00:00 2001 From: Orson Peters Date: Sun, 24 Mar 2013 22:37:43 +0100 Subject: [PATCH] added key exchange --- ed25519.dll | Bin 98816 -> 102400 bytes readme.md | 53 +++++++++++++++++++++--------- src/ed25519.h | 1 + src/key_exchange.c | 79 +++++++++++++++++++++++++++++++++++++++++++++ test.c | 32 ++++++++++++++++++ 5 files changed, 150 insertions(+), 15 deletions(-) create mode 100644 src/key_exchange.c diff --git a/ed25519.dll b/ed25519.dll index 3b953f63b5de46bbb610d263711410e1502501fc..2dd29d53796188a55119aa8673bdc792b19d7ad0 100644 GIT binary patch delta 7293 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 delta 4658 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 0; --pos) { + b = e[pos / 8] >> (pos & 7); + b &= 1; + swap ^= b; + fe_cswap(x2, x3, swap); + fe_cswap(z2, z3, swap); + swap = b; + + /* from montgomery.h */ + fe_sub(tmp0, x3, z3); + fe_sub(tmp1, x2, z2); + fe_add(x2, x2, z2); + fe_add(z2, x3, z3); + fe_mul(z3, tmp0, x2); + fe_mul(z2, z2, tmp1); + fe_sq(tmp0, tmp1); + fe_sq(tmp1, x2); + fe_add(x3, z3, z2); + fe_sub(z2, z3, z2); + fe_mul(x2, tmp1, tmp0); + fe_sub(tmp1, tmp1, tmp0); + fe_sq(z2, z2); + fe_mul121666(z3, tmp1); + fe_sq(x3, x3); + fe_add(tmp0, tmp0, z3); + fe_mul(z3, x1, z2); + fe_mul(z2, tmp1, tmp0); + } + + fe_cswap(x2, x3, swap); + fe_cswap(z2, z3, swap); + + fe_invert(z2, z2); + fe_mul(x2, x2, z2); + fe_tobytes(shared_secret, x2); +} diff --git a/test.c b/test.c index 3230dc0..ec1eeef 100644 --- a/test.c +++ b/test.c @@ -14,6 +14,8 @@ const char message[] = "Hello, world!"; int main(int argc, char *argv[]) { unsigned char public_key[32], private_key[64], seed[32], scalar[32]; + unsigned char other_public_key[32], other_private_key[64]; + unsigned char shared_secret[32], other_shared_secret[32]; unsigned char signature[64]; clock_t start; @@ -56,6 +58,27 @@ int main(int argc, char *argv[]) { printf("correctly detected signature change\n"); } + /* generate two keypairs for testing key exchange */ + ed25519_create_seed(seed); + ed25519_create_keypair(public_key, private_key, seed); + ed25519_create_seed(seed); + ed25519_create_keypair(other_public_key, other_private_key, seed); + + /* create two shared secrets - from both perspectives - and check if they're equal */ + ed25519_key_exchange(shared_secret, other_public_key, private_key); + ed25519_key_exchange(other_shared_secret, public_key, other_private_key); + + for (i = 0; i < 32; ++i) { + if (shared_secret[i] != other_shared_secret[i]) { + printf("key exchange was incorrect\n"); + break; + } + } + + if (i == 32) { + printf("key exchange was correct\n"); + } + /* test performance */ printf("testing key generation performance: "); start = clock(); @@ -93,6 +116,15 @@ int main(int argc, char *argv[]) { } end = clock(); + printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + printf("testing key exchange performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_key_exchange(shared_secret, other_public_key, private_key); + } + end = clock(); + printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); return 0;