From 310b4e0d27c67d6accd0ad48383adf5772d6494f Mon Sep 17 00:00:00 2001 From: Orson Peters Date: Mon, 4 Feb 2013 17:56:19 +0100 Subject: [PATCH] added scalar addition --- ed25519.dll | Bin 137083 -> 99328 bytes readme.md | 7 +++++++ src/add_scalar.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/ed25519.h | 1 + test.c | 32 ++++++++++++++++++++++++++++++-- 5 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 src/add_scalar.c diff --git a/ed25519.dll b/ed25519.dll index 73464684aa698d59c0933eba8cede069d9a4eea6..7adac4fe32eba4965250ff9dcf3ccc73d9ea9930 100644 GIT binary patch delta 2213 zcmYk63s6+o8OOhK*#}XI)DWbAJoH8^S?TWOu{@T$NHRVGMr;smCBj-%Dhu*hBV$Z} z0uAdU16k8!9WiK<))I>f3YeGpyw=iK{kcVI)Sq3zdEbLfLx^VZSqGe*IS=Q1gbCg5mjKk<_}BoXO|I&ZM{>v3$V z{lD?-FmJ!f7POo7p5@FQoP8TZLx4!pd0t{$9!lI=R=lmoQE|@mZ?=|Ac~(oWvcsOc zQjF)g?*7XLYxtwLh=%plndLwZ4eMkfybEr5)*4LG`ccpG2CFnM?&&imM=tslk*zn0 z+f>Ryv~vLMxlmf}lBPv=C@jGg>G#*Nj#l4z&*I*?@s4%yIDIOewcZ zj&lFAZC|LNHPo2Bde^l3>-});%ZX_kt8ZygoN&lT!+%0Z%^?jl*|HpyOV4gAyd zn)jm=YUr?haqjLY*&CG#DTYD+Bos4YUWw|-jh=`;{uw?IKX^*+6e+0oMJD84xQgUh zkrtc<+v%STl?TNnaQ7!eip-;O3Hl*i7t{SNalQpMqQ)W7;Z2*1pLzE}4ALxvvm2f3 z-|5{@P1AY{0@Ftqo2G1zrf)UZqL%BfplxkhXov9R?wZCe82!@b@cLpsXC^`=(^T*K z6C+aOFQYXLp^*6q{SZ2COg@y^(f0uao4)!BnTfyQYT-`qH zI2J^Y2b-jhU>%N@R^b5XH1DopiPAUS{6+-|ww>nDm5_&f`Q}QNp)Wh<(>|DK0zY5L z;-#<7^BeF>C;Nm<<@r0APG8dR(+d5&s@;iQ?S)Zl5z#$71)vICT*+UmWrh0tt2AvB zkHav&UG;Nu`bFaW}sC!D&Y9;@yU%J>j$+dy!>|)#Mzxzp#on?fN zg-o+7J;Ue{64l{?o`S5xCqJqZ9kLVUufo{%_}+_Fqfjm`eI73J8lo~V3Id-Z8UhbM$y%bn zfS`O#0`k#@1_uhXU_2If=ng)B+sGNm;=m*pt%0x}MhUo{eu)U|AkqgQT z-~jk7=mft9z2E{E1jFDmxC*Ah{9Z;8U=c6_6|4aHU?bQ9YQPKN0C*Mr4x9yVgZIGS zz*QYypYi8+v!BI2Mq5jjloU&PVyV;lonGuHEiJD7g~REn=^x+CB&lx?)9H+PlQu{A zpUVkKxRM1cjbk8uV2zbeLMY9dUa-9rkwRy)-`op zr7l=TZ5_6Iwz*lxdNo2#RIRE_U7@a1H>umy3bkE5p}whpq+V4g)L{EE z`x^Tm`yqRe{j&YGeaikoEZ{5ujef)&Z?>58%q8YZbBmdqUo&4Ze`7XTtd?xcO3QZ3 zbCwq^U6v0mpIYWCk;)P!MX@VSD_fKuN{zBd`IWLykzZDhC?}LIrAK*7xupD6xvX4M ZZYiHDUn~Dnq@+1X(MjecUf9Hr{SQeM*OCAL delta 36588 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 diff --git a/readme.md b/readme.md index c4f6658..ff0945c 100644 --- a/readme.md +++ b/readme.md @@ -83,6 +83,13 @@ must be a readable 64 byte buffer. `message` must have at least `message_len` bytes to be read. `public_key` must be a 32 byte public key generated by `ed25519_create_keypair`. Returns 1 if the signature matches, 0 otherwise. +```c +void ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, + const unsigned char *scalar); +``` + +Adds `scalar` to the given keypair where scalar is a 32 byte buffer (possibly generated with `ed25519_create_seed`), generating a new keypair. You can calculate the public key sum without knowing the private key and vice versa by passing in NULL. This is useful for enforcing randomness on a keypair while only knowing the public key, among other things. + Example ------- ```c diff --git a/src/add_scalar.c b/src/add_scalar.c new file mode 100644 index 0000000..1575130 --- /dev/null +++ b/src/add_scalar.c @@ -0,0 +1,46 @@ +#include "ge.h" +#include "sc.h" + + +/* see http://crypto.stackexchange.com/a/6215/4697 */ +void ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, const unsigned char *scalar) { + const unsigned char SC_1[32] = {1}; /* scalar with value 1 */ + + unsigned char n[32]; + ge_p3 nB; + ge_p1p1 A_p1p1; + ge_p3 A; + ge_p3 public_key_unpacked; + ge_cached T; + + int i; + + /* copy the scalar and clear highest bit */ + for (i = 0; i < 31; ++i) { + n[i] = scalar[i]; + } + n[31] = scalar[31] & 127; + + /* private key: a = n + t */ + if (private_key) { + sc_muladd(private_key, SC_1, n, private_key); + } + + if (public_key) { + /* unpack public key into T */ + ge_frombytes_negate_vartime(&public_key_unpacked, public_key); + fe_neg(public_key_unpacked.X, public_key_unpacked.X); // undo negate + fe_neg(public_key_unpacked.T, public_key_unpacked.T); // undo negate + ge_p3_to_cached(&T, &public_key_unpacked); + + /* calculate n*B */ + ge_scalarmult_base(&nB, n); + + /* A = n*B + T */ + ge_add(&A_p1p1, &nB, &T); + ge_p1p1_to_p3(&A, &A_p1p1); + + /* pack public key */ + ge_p3_tobytes(public_key, &A); + } +} diff --git a/src/ed25519.h b/src/ed25519.h index 1d9cfa9..c1dc0d3 100644 --- a/src/ed25519.h +++ b/src/ed25519.h @@ -27,6 +27,7 @@ int ED25519_DECLSPEC ed25519_create_seed(unsigned char *seed); void ED25519_DECLSPEC ed25519_create_keypair(unsigned char *public_key, unsigned char *private_key, const unsigned char *seed); void ED25519_DECLSPEC ed25519_sign(unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key, const unsigned char *private_key); int ED25519_DECLSPEC ed25519_verify(const unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *private_key); +void ED25519_DECLSPEC ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, const unsigned char *scalar); #ifdef __cplusplus diff --git a/test.c b/test.c index c8fc48a..3230dc0 100644 --- a/test.c +++ b/test.c @@ -3,13 +3,17 @@ #include #include -#define ED25519_DLL +//#define ED25519_DLL #include "src/ed25519.h" +#include "src/ge.h" +#include "src/sc.h" + const char message[] = "Hello, world!"; + int main(int argc, char *argv[]) { - unsigned char public_key[32], private_key[64], seed[32]; + unsigned char public_key[32], private_key[64], seed[32], scalar[32]; unsigned char signature[64]; clock_t start; @@ -30,6 +34,20 @@ int main(int argc, char *argv[]) { printf("invalid signature\n"); } + /* create scalar and add it to the keypair */ + ed25519_create_seed(scalar); + ed25519_add_scalar(public_key, private_key, scalar); + + /* create signature with the new keypair */ + ed25519_sign(signature, message, strlen(message), public_key, private_key); + + /* verify the signature with the new keypair */ + if (ed25519_verify(signature, message, strlen(message), public_key)) { + printf("valid signature\n"); + } else { + printf("invalid signature\n"); + } + /* make a slight adjustment and verify again */ signature[44] ^= 0x10; if (ed25519_verify(signature, message, strlen(message), public_key)) { @@ -66,6 +84,16 @@ int main(int argc, char *argv[]) { end = clock(); printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + + printf("testing scalar addition performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_add_scalar(public_key, private_key, scalar); + } + end = clock(); + + printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); return 0; }