From ba6e39076bdc5222f77c4d7615e44db0aac14e91 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 1 Apr 2016 10:09:45 +0200 Subject: [PATCH] util: Add memcmp_const_time() Signed-off-by: Andreas Schneider Reviewed-by: Jeremy Allison --- lib/util/samba_util.h | 13 +++++++++++++ lib/util/util_str.c | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h index 9d6f0d8bf26..387e957ceca 100644 --- a/lib/util/samba_util.h +++ b/lib/util/samba_util.h @@ -279,6 +279,19 @@ limited by 'n' bytes _PUBLIC_ size_t utf16_len_n(const void *src, size_t n); _PUBLIC_ size_t ucs2_align(const void *base_ptr, const void *p, int flags); +/** + * @brief Constant time compare to memory regions. + * + * @param[in] s1 The first memory region to compare. + * + * @param[in] s2 The second memory region to compare. + * + * @param[in] n The length of the memory to comapre. + * + * @return 0 when the memory regions are equal, 0 if not. + */ +_PUBLIC_ int memcmp_const_time(const void *s1, const void *s2, size_t n); + /** Do a case-insensitive, whitespace-ignoring string compare. **/ diff --git a/lib/util/util_str.c b/lib/util/util_str.c index 673fbc7c6b5..c7d91ca3744 100644 --- a/lib/util/util_str.c +++ b/lib/util/util_str.c @@ -333,3 +333,15 @@ _PUBLIC_ size_t utf16_len_n(const void *src, size_t n) return len; } + +_PUBLIC_ int memcmp_const_time(const void *s1, const void *s2, size_t n) +{ + const uint8_t *p1 = s1, *p2 = s2; + size_t i, sum = 0; + + for (i = 0; i < n; i++) { + sum |= (p1[i] ^ p2[i]); + } + + return sum != 0; +} -- 2.47.3