From 37f2f6274588cad438c6fd6c7b37bd5e5ce3ae20 Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Sat, 27 May 2017 18:49:33 -0700 Subject: [PATCH] getentropy: Support BearSSL SHA512 implementation --- lib/libcrypto/arc4random/getentropy_linux.c | 33 ++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/libcrypto/arc4random/getentropy_linux.c b/lib/libcrypto/arc4random/getentropy_linux.c index a845239eb3e..6a7fe863abb 100644 --- a/lib/libcrypto/arc4random/getentropy_linux.c +++ b/lib/libcrypto/arc4random/getentropy_linux.c @@ -47,7 +47,13 @@ #include #include #include +#if defined(USE_OPENSSL) #include +#elif defined(USE_BEARSSL) +#include +#else +#error "missing SHA512 implementation" +#endif #include #include @@ -67,9 +73,15 @@ HD(b); \ } while (0) +#if defined(USE_OPENSSL) #define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l))) #define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x))) #define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*))) +#elif defined(USE_BEARSSL) +#define HR(x, l) (br_sha512_update(&ctx, (char *)(x), (l))) +#define HD(x) (br_sha512_update(&ctx, (char *)&(x), sizeof (x))) +#define HF(x) (br_sha512_update(&ctx, (char *)&(x), sizeof (void*))) +#endif int getentropy(void *buf, size_t len); @@ -330,16 +342,28 @@ static const int cl[] = { static int getentropy_phdr(struct dl_phdr_info *info, size_t size, void *data) { +#if defined(USE_OPENSSL) SHA512_CTX *ctx = data; SHA512_Update(ctx, &info->dlpi_addr, sizeof (info->dlpi_addr)); +#elif defined(USE_BEARSSL) + br_sha512_context *ctx = data; + + br_sha512_update(ctx, &info->dlpi_addr, sizeof (info->dlpi_addr)); +#endif return (0); } static int getentropy_fallback(void *buf, size_t len) { +#if defined(USE_OPENSSL) uint8_t results[SHA512_DIGEST_LENGTH]; + SHA512_CTX ctx; +#elif defined(USE_BEARSSL) + uint8_t results[br_sha512_SIZE]; + br_sha512_context ctx; +#endif int save_errno = errno, e, pgs = getpagesize(), faster = 0, repeat; static int cnt; struct timespec ts; @@ -347,7 +371,6 @@ getentropy_fallback(void *buf, size_t len) struct rusage ru; sigset_t sigset; struct stat st; - SHA512_CTX ctx; static pid_t lastpid; pid_t pid; size_t i, ii, m; @@ -364,7 +387,11 @@ getentropy_fallback(void *buf, size_t len) } for (i = 0; i < len; ) { int j; +#if defined(USE_OPENSSL) SHA512_Init(&ctx); +#elif defined(USE_BEARSSL) + br_sha512_init(&ctx); +#endif for (j = 0; j < repeat; j++) { HX((e = gettimeofday(&tv, NULL)) == -1, tv); if (e != -1) { @@ -535,7 +562,11 @@ getentropy_fallback(void *buf, size_t len) #endif #endif +#if defined(USE_OPENSSL) SHA512_Final(results, &ctx); +#elif defined(USE_BEARSSL) + br_sha512_out(&ctx, results); +#endif memcpy((char *)buf + i, results, min(sizeof(results), len - i)); i += min(sizeof(results), len - i); } -- 2.14.2