From 3b57f77262403d27102f5881ac5dd93bf693d600 Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Fri, 19 Apr 2013 12:54:05 +0200 Subject: [PATCH] Pick the best working poly1305 implementation at runtime. --- src/libsodium/Makefile.am | 1 + .../include/sodium/crypto_onetimeauth_poly1305.h | 5 ++++- src/libsodium/include/sodium/utils.h | 5 +++-- src/libsodium/sodium/core.c | 9 +++++++++ src/libsodium/sodium/utils.c | 8 ++++---- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/libsodium/Makefile.am b/src/libsodium/Makefile.am index 11501e9d..6876deb8 100644 --- a/src/libsodium/Makefile.am +++ b/src/libsodium/Makefile.am @@ -53,6 +53,7 @@ libsodium_la_SOURCES = \ crypto_stream/xsalsa20/ref/stream_xsalsa20.c \ crypto_stream/xsalsa20/ref/xor_xsalsa20.c \ crypto_onetimeauth/poly1305/onetimeauth_poly1305.c \ + crypto_onetimeauth/poly1305/onetimeauth_poly1305_try.c \ crypto_onetimeauth/poly1305/53/auth_poly1305_53.c \ crypto_onetimeauth/poly1305/53/crypto_onetimeauth.h \ crypto_onetimeauth/poly1305/53/verify_poly1305_53.c \ diff --git a/src/libsodium/include/sodium/crypto_onetimeauth_poly1305.h b/src/libsodium/include/sodium/crypto_onetimeauth_poly1305.h index 791dc1d3..7e6883e6 100644 --- a/src/libsodium/include/sodium/crypto_onetimeauth_poly1305.h +++ b/src/libsodium/include/sodium/crypto_onetimeauth_poly1305.h @@ -25,9 +25,12 @@ typedef struct crypto_onetimeauth_poly1305_implementation { } crypto_onetimeauth_poly1305_implementation; const char *crypto_onetimeauth_poly1305_ref_implementation_name(void); - + int crypto_onetimeauth_poly1305_set_implementation(crypto_onetimeauth_poly1305_implementation *impl); +crypto_onetimeauth_poly1305_implementation * + crypto_onetimeauth_pick_best_implementation(void); + int crypto_onetimeauth_poly1305(unsigned char *out, const unsigned char *in, unsigned long long inlen, diff --git a/src/libsodium/include/sodium/utils.h b/src/libsodium/include/sodium/utils.h index 1572a960..1dae4aba 100644 --- a/src/libsodium/include/sodium/utils.h +++ b/src/libsodium/include/sodium/utils.h @@ -8,9 +8,10 @@ extern "C" { #endif -void sodium_memzero(void * const pnt, const size_t size); +void sodium_memzero(void * const pnt, const size_t len); -void *_sodium_alignedcalloc(void ** const unaligned_p, const size_t len); +void *_sodium_alignedcalloc(unsigned char ** const unaligned_p, + const size_t len); #ifdef __cplusplus } diff --git a/src/libsodium/sodium/core.c b/src/libsodium/sodium/core.c index 09267b76..f354f1fa 100644 --- a/src/libsodium/sodium/core.c +++ b/src/libsodium/sodium/core.c @@ -1,9 +1,18 @@ #include "core.h" +#include "crypto_onetimeauth.h" + +static char initialized; int sodium_init(void) { + if (__sync_lock_test_and_set(&initialized, 1) != 0) { + return 1; + } + if (crypto_onetimeauth_pick_best_implementation() == NULL) { + return -1; + } return 0; } diff --git a/src/libsodium/sodium/utils.c b/src/libsodium/sodium/utils.c index 3b95d707..08d65237 100644 --- a/src/libsodium/sodium/utils.c +++ b/src/libsodium/sodium/utils.c @@ -13,22 +13,22 @@ #endif void -sodium_memzero(void * const pnt, const size_t size) +sodium_memzero(void * const pnt, const size_t len) { #ifdef HAVE_SECUREZEROMEMORY - SecureZeroMemory(pnt, size); + SecureZeroMemory(pnt, len); #else volatile unsigned char *pnt_ = (volatile unsigned char *) pnt; size_t i = (size_t) 0U; - while (i < size) { + while (i < len) { pnt_[i++] = 0U; } #endif } void * -_sodium_alignedcalloc(void ** const unaligned_p, const size_t len) +_sodium_alignedcalloc(unsigned char ** const unaligned_p, const size_t len) { unsigned char *aligned; unsigned char *unaligned;