diff --git a/src/libsodium/sodium/utils.c b/src/libsodium/sodium/utils.c index ca0f6d77..d8f38393 100644 --- a/src/libsodium/sodium/utils.c +++ b/src/libsodium/sodium/utils.c @@ -145,7 +145,9 @@ sodium_compare(const unsigned char *b1_, const unsigned char *b2_, size_t len) #if HAVE_WEAK_SYMBOLS _sodium_dummy_symbol_to_prevent_compare_lto(b1, b2, len); #endif - for (i = (size_t) 0U; i < len; i++) { + i = len; + while (i != 0U) { + i--; gt |= ((b2[i] - b1[i]) >> 8) & eq; eq &= ((b2[i] ^ b1[i]) - 1) >> 8; } diff --git a/test/default/sodium_utils.c b/test/default/sodium_utils.c index b781f2c0..7a19261a 100644 --- a/test/default/sodium_utils.c +++ b/test/default/sodium_utils.c @@ -1,4 +1,3 @@ - #define TEST_NAME "sodium_utils" #include "cmptest.h" @@ -6,6 +5,8 @@ int main(void) { unsigned char buf1[1000]; unsigned char buf2[1000]; + unsigned char buf1_rev[1000]; + unsigned char buf2_rev[1000]; char buf3[33]; unsigned char buf4[4]; unsigned char nonce[24]; @@ -13,7 +14,8 @@ int main(void) const char *hex; const char *hex_end; size_t bin_len; - int i; + unsigned int i; + unsigned int j; randombytes_buf(buf1, sizeof buf1); memcpy(buf2, buf1, sizeof buf2); @@ -84,11 +86,15 @@ int main(void) sodium_increment(nonce, sizeof nonce); printf("%s\n", sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); - for (i = 0; i < 1000; i++) { + for (i = 0U; i < 1000U; i++) { bin_len = (size_t) randombytes_uniform(sizeof buf1); randombytes_buf(buf1, bin_len); randombytes_buf(buf2, bin_len); - if (memcmp(buf1, buf2, bin_len) * + for (j = 0U; j < bin_len; j++) { + buf1_rev[bin_len - 1 - j] = buf1[j]; + buf2_rev[bin_len - 1 - j] = buf2[j]; + } + if (memcmp(buf1_rev, buf2_rev, bin_len) * sodium_compare(buf1, buf2, bin_len) < 0) { printf("sodium_compare() failure with length=%u\n", (unsigned int) bin_len);