1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
From 37f2f6274588cad438c6fd6c7b37bd5e5ce3ae20 Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
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 <errno.h>
#include <unistd.h>
#include <time.h>
+#if defined(USE_OPENSSL)
#include <openssl/sha.h>
+#elif defined(USE_BEARSSL)
+#include <bearssl.h>
+#else
+#error "missing SHA512 implementation"
+#endif
#include <linux/types.h>
#include <linux/random.h>
@@ -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
|