diff options
author | Mary Ruthven <mruthven@chromium.org> | 2021-07-20 20:24:39 -0500 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-07-22 00:20:51 +0000 |
commit | 91d3cef24e0e5df5c6e025e643fbe5cb643c94ce (patch) | |
tree | b26c245fa3db49dd92038fad0bf19a2a188a7c70 | |
parent | 0ec02cb2feaf546739c96d9822d9b4ee9ac441ce (diff) | |
download | chrome-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-- | Makefile | 1 | ||||
-rw-r--r-- | board/cr50/board.h | 1 | ||||
-rw-r--r-- | board/cr50/build.mk | 3 | ||||
-rw-r--r-- | board/cr50/dcrypto/util.c | 205 |
4 files changed, 210 insertions, 0 deletions
@@ -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; +} |