diff options
author | Nicolas Boichat <drinkcat@chromium.org> | 2018-05-24 14:33:06 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-05-29 06:02:19 -0700 |
commit | ecd0d1b5767c829f4c73a79a9eb6abae343284fb (patch) | |
tree | 72be322444b05435927078bf9ac16f810c35d06e /test | |
parent | cc7889bfaec9243ff35b6a366f6f2c7c65c33a13 (diff) | |
download | chrome-ec-ecd0d1b5767c829f4c73a79a9eb6abae343284fb.tar.gz |
rsa: Further optimization of multiplications for Cortex-M0
In RSA, we often need to actually compute (a*b)+c+d: provide some
assembly optimized functions for that.
With -O3, 3072-bit exponent, lower verification time from 104 ms to
88 ms on STM32F072 @48Mhz.
BRANCH=poppy
BUG=b:35647963
BUG=b:77608104
TEST=On staff, flash, verification successful
TEST=make test-rsa, make test-rsa3
TEST=make BOARD=hammer test-utils test-rsa3, test on board
Change-Id: I80e8a7258d091e4f6adea11797729ac657dfd85d
Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1071411
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'test')
-rw-r--r-- | test/utils.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/test/utils.c b/test/utils.c index 7acf238c14..08a3511d77 100644 --- a/test/utils.c +++ b/test/utils.c @@ -360,6 +360,7 @@ static int test_cond_t(void) static int test_mula32(void) { uint64_t r = 0x0; + uint64_t r2 = 0x0; uint32_t b = 0x1; uint32_t c = 0x1; uint32_t i; @@ -368,15 +369,18 @@ static int test_mula32(void) t0 = get_time(); for (i = 0; i < 5000000; i++) { r = mula32(b, c, r + (r >> 32)); + r2 = mulaa32(b, c, r2 >> 32, r2); b = (b << 13) ^ (b >> 2) ^ i; c = (c << 16) ^ (c >> 7) ^ i; watchdog_reload(); } t1 = get_time(); - ccprintf("After %d iterations, r=%08x%08x (time: %d)\n", i, - (uint32_t)(r >> 32), (uint32_t)r, t1.le.lo-t0.le.lo); - TEST_ASSERT(r == 0x9df59b9fb0ab9d96L); + ccprintf("After %d iterations, r=%08x%08x, r2=%08x%08x (time: %d)\n", + i, (uint32_t)(r >> 32), (uint32_t)r, + (uint32_t)(r2 >> 32), (uint32_t)r2, t1.le.lo-t0.le.lo); + TEST_ASSERT(r == 0x9df59b9fb0ab9d96L); + TEST_ASSERT(r2 == 0x9df59b9fb0beabd6L); /* well okay then */ return EC_SUCCESS; |