From: Andreas Schneider Date: Fri, 1 Apr 2016 08:09:45 +0000 (+0200) Subject: util: Add memcmp_const_time() X-Git-Tag: talloc-2.1.7~224 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ba6e39076bdc5222f77c4d7615e44db0aac14e91;p=thirdparty%2Fsamba.git util: Add memcmp_const_time() Signed-off-by: Andreas Schneider Reviewed-by: Jeremy Allison --- 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; +}