summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/sha256.c26
-rw-r--r--include/config.h3
-rw-r--r--test/build.mk2
l---------test/sha256_unrolled.tasklist1
-rw-r--r--test/test_config.h5
5 files changed, 37 insertions, 0 deletions
diff --git a/common/sha256.c b/common/sha256.c
index 06478708b0..2d6eaa43f2 100644
--- a/common/sha256.c
+++ b/common/sha256.c
@@ -131,12 +131,37 @@ static void SHA256_transform(struct sha256_ctx *ctx, const uint8_t *message,
for (j = 0; j < 16; j++)
PACK32(&sub_block[j << 2], &w[j]);
+#ifdef CONFIG_SHA256_UNROLLED
+ for (j = 16; j < 64; j += 8) {
+ SHA256_SCR(j);
+ SHA256_SCR(j+1);
+ SHA256_SCR(j+2);
+ SHA256_SCR(j+3);
+ SHA256_SCR(j+4);
+ SHA256_SCR(j+5);
+ SHA256_SCR(j+6);
+ SHA256_SCR(j+7);
+ }
+#else
for (j = 16; j < 64; j++)
SHA256_SCR(j);
+#endif
for (j = 0; j < 8; j++)
wv[j] = ctx->h[j];
+#ifdef CONFIG_SHA256_UNROLLED
+ for (j = 0; j < 64; j += 8) {
+ SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, j);
+ SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, j+1);
+ SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, j+2);
+ SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, j+3);
+ SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, j+4);
+ SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, j+5);
+ SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, j+6);
+ SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, j+7);
+ }
+#else
for (j = 0; j < 64; j++) {
t1 = wv[7] + SHA256_F2(wv[4]) + CH(wv[4], wv[5], wv[6])
+ sha256_k[j] + w[j];
@@ -150,6 +175,7 @@ static void SHA256_transform(struct sha256_ctx *ctx, const uint8_t *message,
wv[1] = wv[0];
wv[0] = t1 + t2;
}
+#endif
for (j = 0; j < 8; j++)
ctx->h[j] += wv[j];
diff --git a/include/config.h b/include/config.h
index 4a7b82ab45..81141eaa3a 100644
--- a/include/config.h
+++ b/include/config.h
@@ -1836,6 +1836,9 @@
/* Support computing of other hash sizes (without the VBOOT code) */
#undef CONFIG_SHA256
+/* Unroll some loops in SHA256_transform for better performance. */
+#undef CONFIG_SHA256_UNROLLED
+
/* Emulate the CLZ (Count Leading Zeros) in software for CPU lacking support */
#undef CONFIG_SOFTWARE_CLZ
diff --git a/test/build.mk b/test/build.mk
index aa3e1a051b..b114794dbf 100644
--- a/test/build.mk
+++ b/test/build.mk
@@ -64,6 +64,7 @@ test-list-host += rsa
test-list-host += rsa3
test-list-host += sbs_charging_v2
test-list-host += sha256
+test-list-host += sha256_unrolled
test-list-host += shmalloc
test-list-host += system
test-list-host += thermal
@@ -109,6 +110,7 @@ rsa3-y=rsa.o
sbs_charging-y=sbs_charging.o
sbs_charging_v2-y=sbs_charging_v2.o
sha256-y=sha256.o
+sha256_unrolled-y=sha256.o
shmalloc-y=shmalloc.o
stress-y=stress.o
system-y=system.o
diff --git a/test/sha256_unrolled.tasklist b/test/sha256_unrolled.tasklist
new file mode 120000
index 0000000000..06d8620957
--- /dev/null
+++ b/test/sha256_unrolled.tasklist
@@ -0,0 +1 @@
+sha256.tasklist \ No newline at end of file
diff --git a/test/test_config.h b/test/test_config.h
index 54864de83e..5079b173fd 100644
--- a/test/test_config.h
+++ b/test/test_config.h
@@ -75,6 +75,11 @@
#define CONFIG_SHA256
#endif
+#ifdef TEST_SHA256_UNROLLED
+#define CONFIG_SHA256
+#define CONFIG_SHA256_UNROLLED
+#endif
+
#ifdef TEST_SHMALLOC
#define CONFIG_MALLOC
#endif