diff --git a/src/crypto/crypto-ops.c b/src/crypto/crypto-ops.c index 2ab08dc2..caf20a07 100644 --- a/src/crypto/crypto-ops.c +++ b/src/crypto/crypto-ops.c @@ -4110,209 +4110,66 @@ void sc_muladd(unsigned char* s, const unsigned char* a, s[31] = s11 >> 17; } - -// out = z ^ -1 (= z ^ (L - 2) according to Fermat little theorem) -void sc_invert(unsigned char* out, const unsigned char* z) +/* libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c */ +void sc_sqmul(unsigned char s[32], const int n, const unsigned char a[32]) { - memcpy(out, z, 32); - for (size_t i = 0; i < 128; ++i) - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, out); - sc_mul(out, out, z); - sc_mul(out, out, out); - sc_mul(out, out, z); + int i; + for (i = 0; i < n; ++i) + sc_mul(s, s, s); + sc_mul(s, s, a); +} + +/* libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c */ +void sc_invert(unsigned char* recip, const unsigned char* s) +{ + unsigned char _10[32], _100[32], _1000[32], _10000[32], _100000[32], + _1000000[32], _10010011[32], _10010111[32], _100110[32], _1010[32], + _1010000[32], _1010011[32], _1011[32], _10110[32], _10111101[32], + _11[32], _1100011[32], _1100111[32], _11010011[32], _1101011[32], + _11100111[32], _11101011[32], _11110101[32]; + + sc_mul(_10, s, s); + sc_mul(_11, s, _10); + sc_mul(_100, s, _11); + sc_mul(_1000, _100, _100); + sc_mul(_1010, _10, _1000); + sc_mul(_1011, s, _1010); + sc_mul(_10000, _1000, _1000); + sc_mul(_10110, _1011, _1011); + sc_mul(_100000, _1010, _10110); + sc_mul(_100110, _10000, _10110); + sc_mul(_1000000, _100000, _100000); + sc_mul(_1010000, _10000, _1000000); + sc_mul(_1010011, _11, _1010000); + sc_mul(_1100011, _10000, _1010011); + sc_mul(_1100111, _100, _1100011); + sc_mul(_1101011, _100, _1100111); + sc_mul(_10010011, _1000000, _1010011); + sc_mul(_10010111, _100, _10010011); + sc_mul(_10111101, _100110, _10010111); + sc_mul(_11010011, _10110, _10111101); + sc_mul(_11100111, _1010000, _10010111); + sc_mul(_11101011, _100, _11100111); + sc_mul(_11110101, _1010, _11101011); + + sc_mul(recip, _1011, _11110101); + + sc_sqmul(recip, 126, _1010011); + + sc_sqmul(recip, 9, _10); + sc_mul(recip, recip, _11110101); + sc_sqmul(recip, 7, _1100111); + sc_sqmul(recip, 9, _11110101); + sc_sqmul(recip, 11, _10111101); + sc_sqmul(recip, 8, _11100111); + sc_sqmul(recip, 9, _1101011); + sc_sqmul(recip, 6, _1011); + sc_sqmul(recip, 14, _10010011); + sc_sqmul(recip, 10, _1100011); + sc_sqmul(recip, 9, _10010111); + sc_sqmul(recip, 10, _11110101); + sc_sqmul(recip, 8, _11010011); + sc_sqmul(recip, 8, _11101011); } /* diff --git a/tests/functional_tests/crypto_tests.cpp b/tests/functional_tests/crypto_tests.cpp index 775e9b93..ba4313fd 100644 --- a/tests/functional_tests/crypto_tests.cpp +++ b/tests/functional_tests/crypto_tests.cpp @@ -80,56 +80,208 @@ sc_sqmul(unsigned char s[32], const int n, const unsigned char a[32]) sc_mul(s, s, a); } -void sc_invert2(unsigned char* recip, const unsigned char* s) +// out = z ^ -1 (= z ^ (L - 2) according to Fermat little theorem) +void sc_invert2(unsigned char* out, const unsigned char* z) { - unsigned char _10[32], _100[32], _1000[32], _10000[32], _100000[32], - _1000000[32], _10010011[32], _10010111[32], _100110[32], _1010[32], - _1010000[32], _1010011[32], _1011[32], _10110[32], _10111101[32], - _11[32], _1100011[32], _1100111[32], _11010011[32], _1101011[32], - _11100111[32], _11101011[32], _11110101[32]; - - sc_mul(_10, s, s); - sc_mul(_11, s, _10); - sc_mul(_100, s, _11); - sc_mul(_1000, _100, _100); - sc_mul(_1010, _10, _1000); - sc_mul(_1011, s, _1010); - sc_mul(_10000, _1000, _1000); - sc_mul(_10110, _1011, _1011); - sc_mul(_100000, _1010, _10110); - sc_mul(_100110, _10000, _10110); - sc_mul(_1000000, _100000, _100000); - sc_mul(_1010000, _10000, _1000000); - sc_mul(_1010011, _11, _1010000); - sc_mul(_1100011, _10000, _1010011); - sc_mul(_1100111, _100, _1100011); - sc_mul(_1101011, _100, _1100111); - sc_mul(_10010011, _1000000, _1010011); - sc_mul(_10010111, _100, _10010011); - sc_mul(_10111101, _100110, _10010111); - sc_mul(_11010011, _10110, _10111101); - sc_mul(_11100111, _1010000, _10010111); - sc_mul(_11101011, _100, _11100111); - sc_mul(_11110101, _1010, _11101011); - - sc_mul(recip, _1011, _11110101); - - sc_sqmul(recip, 126, _1010011); - - sc_sqmul(recip, 9, _10); - sc_mul(recip, recip, _11110101); - sc_sqmul(recip, 7, _1100111); - sc_sqmul(recip, 9, _11110101); - sc_sqmul(recip, 11, _10111101); - sc_sqmul(recip, 8, _11100111); - sc_sqmul(recip, 9, _1101011); - sc_sqmul(recip, 6, _1011); - sc_sqmul(recip, 14, _10010011); - sc_sqmul(recip, 10, _1100011); - sc_sqmul(recip, 9, _10010111); - sc_sqmul(recip, 10, _11110101); - sc_sqmul(recip, 8, _11010011); - sc_sqmul(recip, 8, _11101011); + memcpy(out, z, 32); + for (size_t i = 0; i < 128; ++i) + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, out); + sc_mul(out, out, z); + sc_mul(out, out, out); + sc_mul(out, out, z); } extern void *sha3(const void *in, size_t inlen, void *md, int mdlen);