summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Palatin <vpalatin@chromium.org>2017-02-22 10:37:39 +0100
committerchrome-bot <chrome-bot@chromium.org>2017-02-23 16:02:02 -0800
commitbff020fc6b25fe5dc0245c811d9f53b7c518aa08 (patch)
tree562e1fbd78c7155a4ca17dd3e5a134ab5242ebed
parentb8c4f23f75e7994b419f17301b18837487ab597e (diff)
downloadchrome-ec-bff020fc6b25fe5dc0245c811d9f53b7c518aa08.tar.gz
util: add constant-time memcmp
Import from vboot_reference the constant-time memcmp implementation for safer usage in cryptography code. Signed-off-by: Vincent Palatin <vpalatin@chromium.org> BRANCH=none BUG=chrome-os-partner:62991 TEST=run curve25519 test Change-Id: I9c4c61e15912c978e13b6cc002af879c8ae8f630 Reviewed-on: https://chromium-review.googlesource.com/446098 Commit-Ready: Vincent Palatin <vpalatin@chromium.org> Tested-by: Vincent Palatin <vpalatin@chromium.org> Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--common/util.c19
-rw-r--r--include/util.h1
2 files changed, 20 insertions, 0 deletions
diff --git a/common/util.c b/common/util.c
index 042523d2b9..bc4001ee22 100644
--- a/common/util.c
+++ b/common/util.c
@@ -188,6 +188,25 @@ int memcmp(const void *s1, const void *s2, size_t len)
return 0;
}
+/* Constant-time memory comparison */
+int safe_memcmp(const void *s1, const void *s2, size_t size)
+{
+ const uint8_t *us1 = s1;
+ const uint8_t *us2 = s2;
+ int result = 0;
+
+ if (size == 0)
+ return 0;
+
+ /*
+ * Code snippet without data-dependent branch due to Nate Lawson
+ * (nate@root.org) of Root Labs.
+ */
+ while (size--)
+ result |= *us1++ ^ *us2++;
+
+ return result != 0;
+}
void *memcpy(void *dest, const void *src, size_t len)
{
diff --git a/include/util.h b/include/util.h
index 62c9bceb25..5b6b554854 100644
--- a/include/util.h
+++ b/include/util.h
@@ -66,6 +66,7 @@ int isspace(int c);
int isalpha(int c);
int isprint(int c);
int memcmp(const void *s1, const void *s2, size_t len);
+int safe_memcmp(const void *s1, const void *s2, size_t len);
void *memcpy(void *dest, const void *src, size_t len);
__visible void *memset(void *dest, int c, size_t len);
void *memmove(void *dest, const void *src, size_t len);