summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMary Ruthven <mruthven@chromium.org>2021-07-20 20:24:39 -0500
committerCommit Bot <commit-bot@chromium.org>2021-07-22 00:20:51 +0000
commit91d3cef24e0e5df5c6e025e643fbe5cb643c94ce (patch)
treeb26c245fa3db49dd92038fad0bf19a2a188a7c70
parent0ec02cb2feaf546739c96d9822d9b4ee9ac441ce (diff)
downloadchrome-ec-stabilize-14106.B-cr50_stab.tar.gz
Add necessary utilities to the FIPS boundarystabilize-14106.B-cr50_stab
BUG=none TEST=make buildall -j find -name util.o board/cr50/dcrypto/util.o is only a part of the cr50 build ./build/cr50/RO/common/util.o ./build/cr50/RO/board/cr50/dcrypto/util.o ./build/cr50/RW/common/util.o ./build/cr50/RW/board/cr50/dcrypto/util.o ./build/cr50/cryptoc/util.o Change-Id: Ib1e82922548f9ec483338baaad94c6b2cb10f371 Signed-off-by: Mary Ruthven <mruthven@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3043359 Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
-rw-r--r--Makefile1
-rw-r--r--board/cr50/board.h1
-rw-r--r--board/cr50/build.mk3
-rw-r--r--board/cr50/dcrypto/util.c205
4 files changed, 210 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index b2a68512be..acabb9a2b3 100644
--- a/Makefile
+++ b/Makefile
@@ -318,6 +318,7 @@ dirs+=$(shell find common -type d)
dirs+=$(shell find driver -type d)
common_dirs=util
+custom-ro_objs-y += $(custom-board-ro_objs-y)
ifeq ($(custom-ro_objs-y),)
ro-common-objs := $(sort $(foreach obj, $(all-obj-y), $(out)/RO/$(obj)))
ro-only-objs := $(sort $(foreach obj, $(all-obj-ro), $(out)/RO/$(obj)))
diff --git a/board/cr50/board.h b/board/cr50/board.h
index e5c09040cb..679646c861 100644
--- a/board/cr50/board.h
+++ b/board/cr50/board.h
@@ -157,6 +157,7 @@
/* Include crypto stuff, both software and hardware. Enable optimizations. */
/* Use board specific version of dcrypto */
+#define CONFIG_FIPS_UTIL
#define CONFIG_DCRYPTO_BOARD
#define CONFIG_UPTO_SHA512
#define CONFIG_DCRYPTO_RSA_SPEEDUP
diff --git a/board/cr50/build.mk b/board/cr50/build.mk
index 3f1e8e9a8f..6f163e8c39 100644
--- a/board/cr50/build.mk
+++ b/board/cr50/build.mk
@@ -86,6 +86,9 @@ endif
endif
fips-${CONFIG_DCRYPTO_BOARD} += dcrypto/x509.o
fips-${CONFIG_DCRYPTO_BOARD} += dcrypto/trng.o
+fips-${CONFIG_FIPS_UTIL} += dcrypto/util.o
+
+custom-board-ro_objs-${CONFIG_FIPS_UTIL} = $(BDIR)/dcrypto/util.o
board-y += tpm2/NVMem.o
board-y += tpm2/aes.o
diff --git a/board/cr50/dcrypto/util.c b/board/cr50/dcrypto/util.c
new file mode 100644
index 0000000000..08167bd9c5
--- /dev/null
+++ b/board/cr50/dcrypto/util.c
@@ -0,0 +1,205 @@
+/* Copyright 2021 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* Utility functions for Chrome EC within the FIPS boundary */
+
+#include "common.h"
+#include "console.h"
+#include "util.h"
+
+__stdlib_compat size_t strlen(const char *s)
+{
+ int len = 0;
+
+ while (*s++)
+ len++;
+
+ return len;
+}
+
+
+__stdlib_compat int memcmp(const void *s1, const void *s2, size_t len)
+{
+ const char *sa = s1;
+ const char *sb = s2;
+
+ int diff = 0;
+
+ while (len-- > 0) {
+ diff = *(sa++) - *(sb++);
+ if (diff)
+ return diff;
+ }
+
+ return 0;
+}
+
+
+__stdlib_compat void *memcpy(void *dest, const void *src, size_t len)
+{
+ char *d = (char *)dest;
+ const char *s = (const char *)src;
+ uint32_t *dw;
+ const uint32_t *sw;
+ char *head;
+ char * const tail = (char *)dest + len;
+ /* Set 'body' to the last word boundary */
+ uint32_t * const body = (uint32_t *)((uintptr_t)tail & ~3);
+
+ if (((uintptr_t)dest & 3) != ((uintptr_t)src & 3)) {
+ /* Misaligned. no body, no tail. */
+ head = tail;
+ } else {
+ /* Aligned */
+ if ((uintptr_t)tail < (((uintptr_t)d + 3) & ~3))
+ /* len is shorter than the first word boundary */
+ head = tail;
+ else
+ /* Set 'head' to the first word boundary */
+ head = (char *)(((uintptr_t)d + 3) & ~3);
+ }
+
+ /* Copy head */
+ while (d < head)
+ *(d++) = *(s++);
+
+ /* Copy body */
+ dw = (uint32_t *)d;
+ sw = (uint32_t *)s;
+ while (dw < body)
+ *(dw++) = *(sw++);
+
+ /* Copy tail */
+ d = (char *)dw;
+ s = (const char *)sw;
+ while (d < tail)
+ *(d++) = *(s++);
+
+ return dest;
+}
+
+
+__stdlib_compat __visible void *memset(void *dest, int c, size_t len)
+{
+ char *d = (char *)dest;
+ uint32_t cccc;
+ uint32_t *dw;
+ char *head;
+ char * const tail = (char *)dest + len;
+ /* Set 'body' to the last word boundary */
+ uint32_t * const body = (uint32_t *)((uintptr_t)tail & ~3);
+
+ c &= 0xff; /* Clear upper bits before ORing below */
+ cccc = c | (c << 8) | (c << 16) | (c << 24);
+
+ if ((uintptr_t)tail < (((uintptr_t)d + 3) & ~3))
+ /* len is shorter than the first word boundary */
+ head = tail;
+ else
+ /* Set 'head' to the first word boundary */
+ head = (char *)(((uintptr_t)d + 3) & ~3);
+
+ /* Copy head */
+ while (d < head)
+ *(d++) = c;
+
+ /* Copy body */
+ dw = (uint32_t *)d;
+ while (dw < body)
+ *(dw++) = cccc;
+
+ /* Copy tail */
+ d = (char *)dw;
+ while (d < tail)
+ *(d++) = c;
+
+ return dest;
+}
+
+
+__stdlib_compat void *memmove(void *dest, const void *src, size_t len)
+{
+ if ((uintptr_t)dest <= (uintptr_t)src ||
+ (uintptr_t)dest >= (uintptr_t)src + len) {
+ /*
+ * Start of destination doesn't overlap source, so just use
+ * memcpy().
+ */
+ return memcpy(dest, src, len);
+ }
+
+ {
+ /* Need to copy from tail because there is overlap. */
+ char *d = (char *)dest + len;
+ const char *s = (const char *)src + len;
+ uint32_t *dw;
+ const uint32_t *sw;
+ char *head;
+ char * const tail = (char *)dest;
+ /* Set 'body' to the last word boundary */
+ uint32_t * const body = (uint32_t *)(((uintptr_t)tail+3) & ~3);
+
+ if (((uintptr_t)dest & 3) != ((uintptr_t)src & 3)) {
+ /* Misaligned. no body, no tail. */
+ head = tail;
+ } else {
+ /* Aligned */
+ if ((uintptr_t)tail > ((uintptr_t)d & ~3))
+ /* Shorter than the first word boundary */
+ head = tail;
+ else
+ /* Set 'head' to the first word boundary */
+ head = (char *)((uintptr_t)d & ~3);
+ }
+
+ /* Copy head */
+ while (d > head)
+ *(--d) = *(--s);
+
+ /* Copy body */
+ dw = (uint32_t *)d;
+ sw = (uint32_t *)s;
+ while (dw > body)
+ *(--dw) = *(--sw);
+
+ /* Copy tail */
+ d = (char *)dw;
+ s = (const char *)sw;
+ while (d > tail)
+ *(--d) = *(--s);
+
+ return dest;
+ }
+}
+
+
+void reverse(void *dest, size_t len)
+{
+ int i;
+ uint8_t *start = dest;
+ uint8_t *end = start + len;
+
+ for (i = 0; i < len / 2; ++i) {
+ uint8_t tmp = *start;
+
+ *start++ = *--end;
+ *end = tmp;
+ }
+}
+
+
+__stdlib_compat int strncmp(const char *s1, const char *s2, size_t n)
+{
+ while (n--) {
+ if (*s1 != *s2)
+ return *s1 - *s2;
+ if (!*s1)
+ break;
+ s1++;
+ s2++;
+
+ }
+ return 0;
+}