diff --git a/base16_from.c b/base16_from.c index 9260621..4e991f9 100644 --- a/base16_from.c +++ b/base16_from.c @@ -53,7 +53,8 @@ size_t base16_from(u8 *dst,u8 *dmask,const char *src) if (!src[j]) { if (k != (size_t)-1) dst[k] &= cmask; - *dmask = cmask; + if (dmask) + *dmask = cmask; return k + 1; } l = i%8; diff --git a/base32_from.c b/base32_from.c index f66c1e8..843c01c 100644 --- a/base32_from.c +++ b/base32_from.c @@ -59,7 +59,8 @@ size_t base32_from(u8 *dst,u8 *dmask,const char *src) if (!src[j]) { if (k != (size_t)-1) dst[k] &= cmask; - *dmask = cmask; + if (dmask) + *dmask = cmask; return k + 1; } l = i%8; diff --git a/ed25519/amd64-51-30k/crypto_sign.h b/ed25519/amd64-51-30k/crypto_sign.h index 2694d07..ad34a9e 100644 --- a/ed25519/amd64-51-30k/crypto_sign.h +++ b/ed25519/amd64-51-30k/crypto_sign.h @@ -4,5 +4,6 @@ #define crypto_sign_seckey_expand ed25519_amd64_51_30k_seckey_expand #define crypto_sign_pubkey ed25519_amd64_51_30k_pubkey #define crypto_sign_open ed25519_amd64_51_30k_open +#define crypto_sign_open_batch ed25519_amd64_51_30k_open_batch #include "ed25519.h" diff --git a/ed25519/amd64-51-30k/ed25519.h b/ed25519/amd64-51-30k/ed25519.h index fe64c12..973bca6 100644 --- a/ed25519/amd64-51-30k/ed25519.h +++ b/ed25519/amd64-51-30k/ed25519.h @@ -2,3 +2,19 @@ int ed25519_amd64_51_30k_seckey(unsigned char *sk); int ed25519_amd64_51_30k_seckey_expand(unsigned char *sk,const unsigned char *seed); int ed25519_amd64_51_30k_pubkey(unsigned char *pk,const unsigned char *sk); int ed25519_amd64_51_30k_keygen(unsigned char *pk,unsigned char *sk); +int ed25519_amd64_51_30k_sign( + unsigned char *sm,unsigned long long *smlen, + const unsigned char *m,unsigned long long mlen, + const unsigned char *sk +); +int ed25519_amd64_51_30k_open( + unsigned char *m,unsigned long long *mlen, + const unsigned char *sm,unsigned long long smlen, + const unsigned char *pk +); +int ed25519_amd64_51_30k_batch( + unsigned char* const m[],unsigned long long mlen[], + unsigned char* const sm[],const unsigned long long smlen[], + unsigned char* const pk[], + unsigned long long num +); diff --git a/ed25519/amd64-51-30k/randombytes.h b/ed25519/amd64-51-30k/randombytes.h index efa3b00..b82e1ec 100644 --- a/ed25519/amd64-51-30k/randombytes.h +++ b/ed25519/amd64-51-30k/randombytes.h @@ -1,3 +1,8 @@ #include -#define randombytes(b,n) \ - (randombytes(b,n), 0) + +static inline int randombytes_wrap(unsigned char *b,size_t l) +{ + randombytes(b,l); + return 0; +} +#define randombytes randombytes_wrap diff --git a/ed25519/amd64-51-30k/sign.c b/ed25519/amd64-51-30k/sign.c index f00348a..dcac8c8 100644 --- a/ed25519/amd64-51-30k/sign.c +++ b/ed25519/amd64-51-30k/sign.c @@ -10,24 +10,18 @@ int crypto_sign( ) { unsigned char pk[32]; - unsigned char az[64]; unsigned char nonce[64]; unsigned char hram[64]; sc25519 sck, scs, scsk; ge25519 ger; - memmove(pk,sk + 32,32); + /* sk: 32-byte scalar a, 32-byte randomizer z */ + crypto_sign_pubkey(pk,sk); /* pk: 32-byte public key A */ - crypto_hash_sha512(az,sk,32); - az[0] &= 248; - az[31] &= 127; - az[31] |= 64; - /* az: 32-byte scalar a, 32-byte randomizer z */ - *smlen = mlen + 64; memmove(sm + 64,m,mlen); - memmove(sm + 32,az + 32,32); + memmove(sm + 32,sk + 32,32); /* sm: 32-byte uninit, 32-byte z, mlen-byte m */ crypto_hash_sha512(nonce, sm+32, mlen+32); @@ -45,7 +39,7 @@ int crypto_sign( /* hram: 64-byte H(R,A,m) */ sc25519_from64bytes(&scs, hram); - sc25519_from32bytes(&scsk, az); + sc25519_from32bytes(&scsk, sk); sc25519_mul(&scs, &scs, &scsk); sc25519_add(&scs, &scs, &sck); /* scs: S = nonce + H(R,A,m)a */ diff --git a/ed25519/amd64-64-24k/crypto_sign.h b/ed25519/amd64-64-24k/crypto_sign.h index bc1406c..ec6efa1 100644 --- a/ed25519/amd64-64-24k/crypto_sign.h +++ b/ed25519/amd64-64-24k/crypto_sign.h @@ -4,5 +4,6 @@ #define crypto_sign_seckey_expand ed25519_amd64_64_seckey_expand #define crypto_sign_pubkey ed25519_amd64_64_pubkey #define crypto_sign_open ed25519_amd64_64_open +#define crypto_sign_open_batch ed25519_amd64_64_open_batch #include "ed25519.h" diff --git a/ed25519/amd64-64-24k/ed25519.h b/ed25519/amd64-64-24k/ed25519.h index 3016a7f..8916c9b 100644 --- a/ed25519/amd64-64-24k/ed25519.h +++ b/ed25519/amd64-64-24k/ed25519.h @@ -2,3 +2,19 @@ int ed25519_amd64_64_seckey(unsigned char *sk); int ed25519_amd64_64_seckey_expand(unsigned char *sk,const unsigned char *seed); int ed25519_amd64_64_pubkey(unsigned char *pk,const unsigned char *sk); int ed25519_amd64_64_keygen(unsigned char *pk,unsigned char *sk); +int ed25519_amd64_64_sign( + unsigned char *sm,unsigned long long *smlen, + const unsigned char *m,unsigned long long mlen, + const unsigned char *sk +); +int ed25519_amd64_64_open( + unsigned char *m,unsigned long long *mlen, + const unsigned char *sm,unsigned long long smlen, + const unsigned char *pk +); +int ed25519_amd64_64_open_batch( + unsigned char* const m[],unsigned long long mlen[], + unsigned char* const sm[],const unsigned long long smlen[], + unsigned char* const pk[], + unsigned long long num +); diff --git a/ed25519/amd64-64-24k/randombytes.h b/ed25519/amd64-64-24k/randombytes.h index efa3b00..b82e1ec 100644 --- a/ed25519/amd64-64-24k/randombytes.h +++ b/ed25519/amd64-64-24k/randombytes.h @@ -1,3 +1,8 @@ #include -#define randombytes(b,n) \ - (randombytes(b,n), 0) + +static inline int randombytes_wrap(unsigned char *b,size_t l) +{ + randombytes(b,l); + return 0; +} +#define randombytes randombytes_wrap diff --git a/ed25519/amd64-64-24k/sign.c b/ed25519/amd64-64-24k/sign.c index f00348a..dcac8c8 100644 --- a/ed25519/amd64-64-24k/sign.c +++ b/ed25519/amd64-64-24k/sign.c @@ -10,24 +10,18 @@ int crypto_sign( ) { unsigned char pk[32]; - unsigned char az[64]; unsigned char nonce[64]; unsigned char hram[64]; sc25519 sck, scs, scsk; ge25519 ger; - memmove(pk,sk + 32,32); + /* sk: 32-byte scalar a, 32-byte randomizer z */ + crypto_sign_pubkey(pk,sk); /* pk: 32-byte public key A */ - crypto_hash_sha512(az,sk,32); - az[0] &= 248; - az[31] &= 127; - az[31] |= 64; - /* az: 32-byte scalar a, 32-byte randomizer z */ - *smlen = mlen + 64; memmove(sm + 64,m,mlen); - memmove(sm + 32,az + 32,32); + memmove(sm + 32,sk + 32,32); /* sm: 32-byte uninit, 32-byte z, mlen-byte m */ crypto_hash_sha512(nonce, sm+32, mlen+32); @@ -45,7 +39,7 @@ int crypto_sign( /* hram: 64-byte H(R,A,m) */ sc25519_from64bytes(&scs, hram); - sc25519_from32bytes(&scsk, az); + sc25519_from32bytes(&scsk, sk); sc25519_mul(&scs, &scs, &scsk); sc25519_add(&scs, &scs, &sck); /* scs: S = nonce + H(R,A,m)a */ diff --git a/ed25519/ed25519.h b/ed25519/ed25519.h index e67add1..56bac15 100644 --- a/ed25519/ed25519.h +++ b/ed25519/ed25519.h @@ -9,6 +9,30 @@ #define ed25519_pubkey ed25519_ref10_pubkey #define ed25519_keygen ed25519_ref10_keygen #include "ref10/ge.h" + +/* The basepoint multiplied by 8. */ +static const ge_cached ge_eightpoint = { + /* YplusX */ + { + 48496028, -16430416, 15164263, 11885335, 60784617, -4866353, 46481863, + -2771805, 9708580, 2387263 + }, + /* YmunusX */ + { + -10173472, -5540046, 21277639, 4080693, 1932823, -14916249, -9515873, + -21787995, -36575460, 29827857 + }, + /* Z */ + { + 25143927, -10256223, -3515585, 5715072, 19432778, -14905909, 22462083, + -8862871, 13226552, 743677 + }, + /* T2d */ + { + -784818, -8208065, -28479270, 5551579, 15746872, 4911053, 19117091, + 11267669, -24569594, 14624995 + } +}; #endif #ifdef ED25519_amd64_51_30k @@ -24,6 +48,7 @@ #define ge_p1p1_to_p3 ge25519_p1p1_to_p3 #define ge_p3_tobytes ge25519_pack #define ge_add ge25519_pnielsadd_p1p1 + static inline void ge_scalarmult_base(ge_p3 *gepk,const unsigned char *sk) { sc25519 scsk; @@ -31,6 +56,18 @@ static inline void ge_scalarmult_base(ge_p3 *gepk,const unsigned char *sk) sc25519_from32bytes(&scsk,sk); ge25519_scalarmult_base(gepk,&scsk); } + +/* The basepoint multiplied by 8. */ +static const ge25519_pniels ge_eightpoint = { + // ysubx + {{ 1880013609944032, 273850692840390, 1250787290086935, 789632210881694, 2001713562248987 }}, + // xaddy + {{ 1149173309373852, 797611345273702, 1925224452816873, 2065787175387590, 160206517707811 }}, + // z + {{ 1563516364368503, 383531986082622, 1251481213240650, 1657022631558786, 49907331879479 }}, + // t2d + {{ 1700965895112270, 372560131616985, 329575203620664, 756160485635107, 981466775886086 }}, +}; #endif #ifdef ED25519_amd64_64_24k @@ -46,6 +83,7 @@ static inline void ge_scalarmult_base(ge_p3 *gepk,const unsigned char *sk) #define ge_p1p1_to_p3 ge25519_p1p1_to_p3 #define ge_p3_tobytes ge25519_pack #define ge_add ge25519_pnielsadd_p1p1 + static inline void ge_scalarmult_base(ge_p3 *gepk,const unsigned char *sk) { sc25519 scsk; @@ -53,4 +91,16 @@ static inline void ge_scalarmult_base(ge_p3 *gepk,const unsigned char *sk) sc25519_from32bytes(&scsk,sk); ge25519_scalarmult_base(gepk,&scsk); } + +/* The basepoint multiplied by 8. */ +static const ge25519_pniels ge_eightpoint = { + // ysubx + {{ 6788804652057281504U, 531290374162262565U, 6135835192563885415U, 8199018750971852188U }}, + // xaddy + {{ 1960215011215539612U, 16708348392717346619U, 11897818088205565647U, 656205896531197613U }}, + // z + {{ 15705615417005288055U, 5341641389565279826U, 1966574939768917451U, 204420431378348998U }}, + // t2d + {{ 9713713562319586894U, 4328467261753610859U, 8262494979546083277U, 4020087914029409631U }}, +}; #endif diff --git a/ed25519/ref10/ed25519.h b/ed25519/ref10/ed25519.h index b5e2a8a..406aafc 100644 --- a/ed25519/ref10/ed25519.h +++ b/ed25519/ref10/ed25519.h @@ -2,3 +2,13 @@ int ed25519_ref10_seckey(unsigned char *sk); int ed25519_ref10_seckey_expand(unsigned char *sk,const unsigned char *seed); int ed25519_ref10_pubkey(unsigned char *pk,const unsigned char *sk); int ed25519_ref10_keygen(unsigned char *pk,unsigned char *sk); +int ed25519_ref10_sign( + unsigned char *sm,unsigned long long *smlen, + const unsigned char *m,unsigned long long mlen, + const unsigned char *sk +); +int ed25519_ref10_open( + unsigned char *m,unsigned long long *mlen, + const unsigned char *sm,unsigned long long smlen, + const unsigned char *pk +); diff --git a/ed25519/ref10/randombytes.h b/ed25519/ref10/randombytes.h index efa3b00..b82e1ec 100644 --- a/ed25519/ref10/randombytes.h +++ b/ed25519/ref10/randombytes.h @@ -1,3 +1,8 @@ #include -#define randombytes(b,n) \ - (randombytes(b,n), 0) + +static inline int randombytes_wrap(unsigned char *b,size_t l) +{ + randombytes(b,l); + return 0; +} +#define randombytes randombytes_wrap diff --git a/ed25519/ref10/sign.c b/ed25519/ref10/sign.c index de53742..3906217 100644 --- a/ed25519/ref10/sign.c +++ b/ed25519/ref10/sign.c @@ -11,21 +11,15 @@ int crypto_sign( ) { unsigned char pk[32]; - unsigned char az[64]; unsigned char nonce[64]; unsigned char hram[64]; ge_p3 R; - memmove(pk,sk + 32,32); - - crypto_hash_sha512(az,sk,32); - az[0] &= 248; - az[31] &= 63; - az[31] |= 64; + crypto_sign_pubkey(pk,sk); *smlen = mlen + 64; memmove(sm + 64,m,mlen); - memmove(sm + 32,az + 32,32); + memmove(sm + 32,sk + 32,32); crypto_hash_sha512(nonce,sm + 32,mlen + 32); memmove(sm + 32,pk,32); @@ -35,7 +29,7 @@ int crypto_sign( crypto_hash_sha512(hram,sm,mlen + 64); sc_reduce(hram); - sc_muladd(sm + 32,hram,az,nonce); + sc_muladd(sm + 32,hram,sk,nonce); return 0; } diff --git a/hex.h b/hex.h index c2f9c44..3f904e7 100644 --- a/hex.h +++ b/hex.h @@ -1,11 +1,11 @@ #include static const char hext[] = "0123456789ABCDEF"; -static void printhex(const char *z, size_t l) +static void printhex(const unsigned char *z,size_t l) { printf("["); - for (size_t i = 0; i < l; ++i) { - printf("%c%c", hext[*z >> 4], hext[*z & 0xF]); + for (size_t i = 0;i < l;++i) { + printf("%c%c",hext[*z >> 4],hext[*z & 0xF]); ++z; } printf("]\n"); diff --git a/main.c b/main.c index 84c9db0..f3c2bf5 100644 --- a/main.c +++ b/main.c @@ -266,30 +266,6 @@ end: return 0; } -/* The basepoint multiplied by 8. */ -static const ge_cached ge_eightpoint = { - /* YplusX */ - { - 48496028, -16430416, 15164263, 11885335, 60784617, -4866353, 46481863, - -2771805, 9708580, 2387263 - }, - /* YmunusX */ - { - -10173472, -5540046, 21277639, 4080693, 1932823, -14916249, -9515873, - -21787995, -36575460, 29827857 - }, - /* Z */ - { - 25143927, -10256223, -3515585, 5715072, 19432778, -14905909, 22462083, - -8862871, 13226552, 743677 - }, - /* T2d */ - { - -784818, -8208065, -28479270, 5551579, 15746872, 4911053, 19117091, - 11267669, -24569594, 14624995 - } -}; - static void addu64toscalar32(u8 *dst, u64 v) { int i; @@ -437,9 +413,9 @@ int main(int argc, char **argv) int fastkeygen = 0; struct threadvec threads; int tret; - + filters_init(); - + fout = stdout; pthread_mutex_init(&keysgenerated_mutex, 0); pthread_mutex_init(&fout_mutex, 0);