diff --git a/.gitignore b/.gitignore index 589679feb..f1da71bbc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.exe *~ test-openssl +test_speed tests build-*/ build/ diff --git a/Makefile b/Makefile index bded2f835..683774a26 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,8 @@ CFLAGS += $(OPTFLAGS) \ CFLAGS += -Wno-sequence-point CFLAGS += -DED25519_CUSTOMRANDOM=1 CFLAGS += -DED25519_CUSTOMHASH=1 +CFLAGS += -DED25519_NO_INLINE_ASM +CFLAGS += -DED25519_FORCE_32BIT=1 CFLAGS += -Ied25519-donna -I. # disable certain optimizations and features when small footprint is required @@ -44,7 +46,7 @@ OBJS = $(SRCS:.c=.o) TESTLIBS = -lcheck -lrt -lpthread -lm TESTSSLLIBS = -lcrypto -all: tests test-openssl libtrezor-crypto.so +all: tests test-openssl libtrezor-crypto.so test_speed %.o: %.c %.h options.h $(CC) $(CFLAGS) -o $@ -c $< @@ -52,6 +54,9 @@ all: tests test-openssl libtrezor-crypto.so tests: tests.o $(OBJS) $(CC) tests.o $(OBJS) $(TESTLIBS) -o tests +test_speed: test_speed.o $(OBJS) + $(CC) test_speed.o $(OBJS) $(TESTLIBS) -o test_speed + test-openssl: test-openssl.o $(OBJS) $(CC) test-openssl.o $(OBJS) $(TESTSSLLIBS) -o test-openssl @@ -59,4 +64,4 @@ libtrezor-crypto.so: $(SRCS) $(CC) $(CFLAGS) -fPIC -shared $(SRCS) -o libtrezor-crypto.so clean: - rm -f *.o ed25519-donna/*.o tests test-openssl libtrezor-crypto.so + rm -f *.o ed25519-donna/*.o tests test_speed test-openssl libtrezor-crypto.so diff --git a/test_speed.c b/test_speed.c new file mode 100644 index 000000000..0541ef246 --- /dev/null +++ b/test_speed.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include "curves.h" +#include "ecdsa.h" +#include "secp256k1.h" +#include "ed25519.h" + +uint8_t msg[32]; + +void prepare_msg(void) +{ + for (size_t i = 0; i < sizeof(msg); i++) { + msg[i] = i * 1103515245; + } +} + +void bench_secp256k1(void) { + uint8_t sig[64], pub[33], priv[32], pby; + + const ecdsa_curve *curve = &secp256k1; + + memcpy(priv, "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5", 32); + ecdsa_get_public_key33(curve, priv, pub); + ecdsa_sign(curve, priv, msg, sizeof(msg), sig, &pby); + + clock_t t = clock(); + for (int i = 0 ; i < 500; i++) { + int res = ecdsa_verify(curve, pub, sig, msg, sizeof(msg)); + assert(res == 0); + } + printf("SECP256k1 verifying speed: %0.2f sig/s\n", 500.0f / ((float)(clock() - t) / CLOCKS_PER_SEC)); +} + +void bench_ed25519(void) { + ed25519_public_key pk; + ed25519_secret_key sk; + ed25519_signature sig; + + memcpy(pk, "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5", 32); + ed25519_publickey(sk, pk); + ed25519_sign(msg, sizeof(msg), sk, pk, sig); + + clock_t t = clock(); + for (int i = 0 ; i < 500; i++) { + int res = ed25519_sign_open(msg, sizeof(msg), pk, sig); + assert(res == 0); + } + printf("Ed25519 verifying speed: %0.2f sig/s\n", 500.0f / ((float)(clock() - t) / CLOCKS_PER_SEC)); + +} + +int main(void) { + prepare_msg(); + bench_secp256k1(); + bench_ed25519(); + return 0; +} diff --git a/tests.c b/tests.c index 32cf6be3b..16d64e9c0 100644 --- a/tests.c +++ b/tests.c @@ -47,8 +47,7 @@ uint8_t *fromhex(const char *str) { static uint8_t buf[256]; uint8_t c; - size_t i; - for (i = 0; i < strlen(str) / 2; i++) { + for (size_t i = 0; i < strlen(str) / 2; i++) { c = 0; if (str[i*2] >= '0' && str[i*2] <= '9') c += (str[i*2] - '0') << 4; if (str[i*2] >= 'a' && str[i*2] <= 'f') c += (10 + str[i*2] - 'a') << 4; @@ -65,8 +64,7 @@ char *tohex(const uint8_t *bin, size_t l) { char *buf = (char *)malloc(l * 2 + 1); static char digits[] = "0123456789abcdef"; - size_t i; - for (i = 0; i < l; i++) { + for (size_t i = 0; i < l; i++) { buf[i*2 ] = digits[(bin[i] >> 4) & 0xF]; buf[i*2+1] = digits[bin[i] & 0xF]; }