summaryrefslogtreecommitdiff
path: root/pkg/openbsd/patch/0018-getentropy-Support-BearSSL-SHA512-implementation.patch
blob: 5d4c234e1fc2920601dfe2fd4750fd8fea52a506 (plain)
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