From bff020fc6b25fe5dc0245c811d9f53b7c518aa08 Mon Sep 17 00:00:00 2001 From: Vincent Palatin Date: Wed, 22 Feb 2017 10:37:39 +0100 Subject: [PATCH] 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 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 Tested-by: Vincent Palatin Reviewed-by: Randall Spangler --- common/util.c | 19 +++++++++++++++++++ include/util.h | 1 + 2 files changed, 20 insertions(+) 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);