summaryrefslogtreecommitdiff
path: root/pkg/wpa_supplicant/patch/0004-Add-support-for-some-BearSSL-crypto-primitives.patch
blob: de6ce6d38f60a18ab5b40913f472b6597aa0e22c (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
From ea00c8e557fe645a1ef0b6c0ebe2209514f9f94f Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Fri, 15 Nov 2019 20:19:37 -0800
Subject: [PATCH] Add support for some BearSSL crypto primitives

---
 src/crypto/crypto_bearssl.c | 83 +++++++++++++++++++++++++++++++++++++
 1 file changed, 83 insertions(+)
 create mode 100644 src/crypto/crypto_bearssl.c

diff --git a/src/crypto/crypto_bearssl.c b/src/crypto/crypto_bearssl.c
new file mode 100644
index 000000000..db2bfbc27
--- /dev/null
+++ b/src/crypto/crypto_bearssl.c
@@ -0,0 +1,83 @@
+/*
+ * Wrapper functions for BearSSL crypto
+ * Copyright (c) 2019, Michael Forney <mforney@mforney.org>
+ *
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
+ */
+
+#include "includes.h"
+#include <bearssl.h>
+
+#include "common.h"
+#include "md5.h"
+#include "crypto.h"
+
+int digest_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *out,
+                  const br_hash_class *hash)
+{
+	br_hash_compat_context ctx;
+	size_t i;
+
+	hash->init(&ctx.vtable);
+	for (i = 0; i < num_elem; ++i)
+		hash->update(&ctx.vtable, addr[i], len[i]);
+	hash->out(&ctx.vtable, out);
+
+	return 0;
+}
+
+int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *out)
+{
+	return digest_vector(num_elem, addr, len, out, &br_sha1_vtable);
+}
+
+int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *out)
+{
+	return digest_vector(num_elem, addr, len, out, &br_sha256_vtable);
+}
+
+static int hmac_vector(const u8 *key, size_t key_len, size_t num_elem,
+                       const u8 *addr[], const size_t *len, u8 *mac,
+                       const br_hash_class *type)
+{
+	br_hmac_key_context kc;
+	br_hmac_context ctx;
+	size_t i;
+
+	br_hmac_key_init(&kc, type, key, key_len);
+	br_hmac_init(&ctx, &kc, 0);
+	for (i = 0; i < num_elem; ++i)
+		br_hmac_update(&ctx, addr[i], len[i]);
+	br_hmac_out(&ctx, mac);
+
+	return 0;
+}
+
+int hmac_sha256_vector(const u8 *key, size_t key_len, size_t num_elem,
+                       const u8 *addr[], const size_t *len, u8 *mac)
+{
+	return hmac_vector(key, key_len, num_elem, addr, len, mac, &br_sha256_vtable);
+}
+
+int hmac_sha1_vector(const u8 *key, size_t key_len, size_t num_elem,
+                     const u8 *addr[], const size_t *len, u8 *mac)
+{
+	return hmac_vector(key, key_len, num_elem, addr, len, mac, &br_sha1_vtable);
+}
+
+int hmac_sha1(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
+	       u8 *mac)
+{
+	return hmac_sha1_vector(key, key_len, 1, &data, &data_len, mac);
+}
+
+int hmac_md5(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
+             u8 *mac)
+{
+	return hmac_vector(key, key_len, 1, &data, &data_len, mac, &br_md5_vtable);
+}
+
+void crypto_unload(void)
+{
+}
-- 
2.45.2