1d4afb5ceSopenharmony_ci/*
2d4afb5ceSopenharmony_ci * lws-api-test-gencrypto - lws-genaes
3d4afb5ceSopenharmony_ci *
4d4afb5ceSopenharmony_ci * Written in 2010-2018 by Andy Green <andy@warmcat.com>
5d4afb5ceSopenharmony_ci *
6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0
7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication.
8d4afb5ceSopenharmony_ci */
9d4afb5ceSopenharmony_ci
10d4afb5ceSopenharmony_ci#include <libwebsockets.h>
11d4afb5ceSopenharmony_ci
12d4afb5ceSopenharmony_ci
13d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CBC))) || \
14d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cbc))
15d4afb5ceSopenharmony_ci
16d4afb5ceSopenharmony_cistatic const uint8_t
17d4afb5ceSopenharmony_ci	/*
18d4afb5ceSopenharmony_ci	 * produced with (plaintext.txt contains "test plaintext\0\0")
19d4afb5ceSopenharmony_ci	 *
20d4afb5ceSopenharmony_ci	 * openssl enc -aes256 \
21d4afb5ceSopenharmony_ci	 *   -K "0123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210" \
22d4afb5ceSopenharmony_ci	 *   -iv "0123456789abcdeffedcba9876543210"
23d4afb5ceSopenharmony_ci	 *   -in plaintext.txt -out out.enc
24d4afb5ceSopenharmony_ci	 *
25d4afb5ceSopenharmony_ci	 */
26d4afb5ceSopenharmony_ci	*cbc256	= (uint8_t *)"test plaintext\0\0",
27d4afb5ceSopenharmony_ci	cbc256_enc[] = {
28d4afb5ceSopenharmony_ci		0x2b, 0x5d, 0xb2, 0xa8, 0x5a, 0x5a, 0xf4, 0x2e,
29d4afb5ceSopenharmony_ci		0xf7, 0xf9, 0xc5, 0x3c, 0x73, 0xef, 0x40, 0x88,
30d4afb5ceSopenharmony_ci	}, cbc256_iv[] = {
31d4afb5ceSopenharmony_ci		0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
32d4afb5ceSopenharmony_ci		0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
33d4afb5ceSopenharmony_ci	}, cbc256_key[] = {
34d4afb5ceSopenharmony_ci		0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
35d4afb5ceSopenharmony_ci		0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
36d4afb5ceSopenharmony_ci		0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
37d4afb5ceSopenharmony_ci		0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
38d4afb5ceSopenharmony_ci	}
39d4afb5ceSopenharmony_ci;
40d4afb5ceSopenharmony_ci
41d4afb5ceSopenharmony_cistatic int
42d4afb5ceSopenharmony_citest_genaes_cbc(void)
43d4afb5ceSopenharmony_ci{
44d4afb5ceSopenharmony_ci	struct lws_genaes_ctx ctx;
45d4afb5ceSopenharmony_ci	struct lws_gencrypto_keyelem e;
46d4afb5ceSopenharmony_ci	uint8_t res[32], res1[32];
47d4afb5ceSopenharmony_ci
48d4afb5ceSopenharmony_ci	/*
49d4afb5ceSopenharmony_ci	 * As part of a jwk, these are allocated.  But here we just use one as
50d4afb5ceSopenharmony_ci	 * a wrapper on a static binary key.
51d4afb5ceSopenharmony_ci	 */
52d4afb5ceSopenharmony_ci	e.buf = (uint8_t *)cbc256_key;
53d4afb5ceSopenharmony_ci	e.len = sizeof(cbc256_key);
54d4afb5ceSopenharmony_ci
55d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_CBC, &e, 0, NULL)) {
56d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create failed\n", __func__);
57d4afb5ceSopenharmony_ci		return 1;
58d4afb5ceSopenharmony_ci	}
59d4afb5ceSopenharmony_ci
60d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, cbc256, 16, res, (uint8_t *)cbc256_iv,
61d4afb5ceSopenharmony_ci			     NULL, NULL, 0)) {
62d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt failed\n", __func__);
63d4afb5ceSopenharmony_ci		goto bail;
64d4afb5ceSopenharmony_ci	}
65d4afb5ceSopenharmony_ci
66d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
67d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy enc failed\n", __func__);
68d4afb5ceSopenharmony_ci		return -1;
69d4afb5ceSopenharmony_ci	}
70d4afb5ceSopenharmony_ci
71d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(cbc256_enc, res, 16)) {
72d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__);
73d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, 16);
74d4afb5ceSopenharmony_ci		return -1;
75d4afb5ceSopenharmony_ci	}
76d4afb5ceSopenharmony_ci
77d4afb5ceSopenharmony_ci
78d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_CBC, &e, 0, NULL)) {
79d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create dec failed\n", __func__);
80d4afb5ceSopenharmony_ci		return -1;
81d4afb5ceSopenharmony_ci	}
82d4afb5ceSopenharmony_ci
83d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, res, 16, res1, (uint8_t *)cbc256_iv,
84d4afb5ceSopenharmony_ci			     NULL, NULL, 0)) {
85d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__);
86d4afb5ceSopenharmony_ci		goto bail;
87d4afb5ceSopenharmony_ci	}
88d4afb5ceSopenharmony_ci
89d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
90d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy dec failed\n", __func__);
91d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res1, 16);
92d4afb5ceSopenharmony_ci		return -1;
93d4afb5ceSopenharmony_ci	}
94d4afb5ceSopenharmony_ci
95d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(cbc256, res1, 16)) {
96d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__);
97d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, 16);
98d4afb5ceSopenharmony_ci		return -1;
99d4afb5ceSopenharmony_ci	}
100d4afb5ceSopenharmony_ci
101d4afb5ceSopenharmony_ci	return 0;
102d4afb5ceSopenharmony_ci
103d4afb5ceSopenharmony_cibail:
104d4afb5ceSopenharmony_ci	lws_genaes_destroy(&ctx, NULL, 0);
105d4afb5ceSopenharmony_ci
106d4afb5ceSopenharmony_ci	return -1;
107d4afb5ceSopenharmony_ci}
108d4afb5ceSopenharmony_ci#endif
109d4afb5ceSopenharmony_ci
110d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \
111d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cfb128))
112d4afb5ceSopenharmony_cistatic const uint8_t
113d4afb5ceSopenharmony_ci/*
114d4afb5ceSopenharmony_ci * produced with (plaintext.txt contains "test plaintext\0\0")
115d4afb5ceSopenharmony_ci *
116d4afb5ceSopenharmony_ci * openssl enc -aes-128-cfb \
117d4afb5ceSopenharmony_ci *   -K "0123456789abcdeffedcba9876543210" \
118d4afb5ceSopenharmony_ci *   -iv "0123456789abcdeffedcba9876543210"
119d4afb5ceSopenharmony_ci *   -in plaintext.txt -out out.enc
120d4afb5ceSopenharmony_ci *
121d4afb5ceSopenharmony_ci */
122d4afb5ceSopenharmony_ci*cfb128	= (uint8_t *)"test plaintext\0\0",
123d4afb5ceSopenharmony_cicfb128_enc[] = {
124d4afb5ceSopenharmony_ci	0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04,
125d4afb5ceSopenharmony_ci	0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71
126d4afb5ceSopenharmony_ci}, cfb128_iv[] = {
127d4afb5ceSopenharmony_ci	0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
128d4afb5ceSopenharmony_ci	0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
129d4afb5ceSopenharmony_ci}, cfb128_key[] = {
130d4afb5ceSopenharmony_ci	0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
131d4afb5ceSopenharmony_ci	0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
132d4afb5ceSopenharmony_ci};
133d4afb5ceSopenharmony_ci
134d4afb5ceSopenharmony_cistatic int
135d4afb5ceSopenharmony_citest_genaes_cfb128(void)
136d4afb5ceSopenharmony_ci{
137d4afb5ceSopenharmony_ci	struct lws_genaes_ctx ctx;
138d4afb5ceSopenharmony_ci	struct lws_gencrypto_keyelem e;
139d4afb5ceSopenharmony_ci	uint8_t res[32], res1[32];
140d4afb5ceSopenharmony_ci	size_t iv_off = 0;
141d4afb5ceSopenharmony_ci
142d4afb5ceSopenharmony_ci	e.buf = (uint8_t *)cfb128_key;
143d4afb5ceSopenharmony_ci	e.len = sizeof(cfb128_key);
144d4afb5ceSopenharmony_ci
145d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_CFB128, &e, 0, NULL)) {
146d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create failed\n", __func__);
147d4afb5ceSopenharmony_ci		return 1;
148d4afb5ceSopenharmony_ci	}
149d4afb5ceSopenharmony_ci
150d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, cfb128, 16, res, (uint8_t *)cfb128_iv,
151d4afb5ceSopenharmony_ci			     NULL, &iv_off, 0)) {
152d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt failed\n", __func__);
153d4afb5ceSopenharmony_ci		goto bail;
154d4afb5ceSopenharmony_ci	}
155d4afb5ceSopenharmony_ci
156d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
157d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
158d4afb5ceSopenharmony_ci		return -1;
159d4afb5ceSopenharmony_ci	}
160d4afb5ceSopenharmony_ci
161d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(cfb128_enc, res, 16)) {
162d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__);
163d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, 16);
164d4afb5ceSopenharmony_ci		return -1;
165d4afb5ceSopenharmony_ci	}
166d4afb5ceSopenharmony_ci
167d4afb5ceSopenharmony_ci	iv_off = 0;
168d4afb5ceSopenharmony_ci
169d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_CFB128, &e, 0, NULL)) {
170d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create dec failed\n", __func__);
171d4afb5ceSopenharmony_ci		return -1;
172d4afb5ceSopenharmony_ci	}
173d4afb5ceSopenharmony_ci
174d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, res, 16, res1, (uint8_t *)cfb128_iv,
175d4afb5ceSopenharmony_ci			     NULL, &iv_off, 0)) {
176d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__);
177d4afb5ceSopenharmony_ci		goto bail;
178d4afb5ceSopenharmony_ci	}
179d4afb5ceSopenharmony_ci
180d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
181d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
182d4afb5ceSopenharmony_ci		return -1;
183d4afb5ceSopenharmony_ci	}
184d4afb5ceSopenharmony_ci
185d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(cfb128, res1, 16)) {
186d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__);
187d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res1, 16);
188d4afb5ceSopenharmony_ci		return -1;
189d4afb5ceSopenharmony_ci	}
190d4afb5ceSopenharmony_ci
191d4afb5ceSopenharmony_ci	return 0;
192d4afb5ceSopenharmony_ci
193d4afb5ceSopenharmony_cibail:
194d4afb5ceSopenharmony_ci	lws_genaes_destroy(&ctx, NULL, 0);
195d4afb5ceSopenharmony_ci
196d4afb5ceSopenharmony_ci	return -1;
197d4afb5ceSopenharmony_ci}
198d4afb5ceSopenharmony_ci#endif
199d4afb5ceSopenharmony_ci
200d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \
201d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cfb8))
202d4afb5ceSopenharmony_ci
203d4afb5ceSopenharmony_cistatic const uint8_t
204d4afb5ceSopenharmony_ci/*
205d4afb5ceSopenharmony_ci * produced with (plaintext.txt contains "test plaintext\0\0")
206d4afb5ceSopenharmony_ci *
207d4afb5ceSopenharmony_ci * openssl enc -aes-128-cfb8 \
208d4afb5ceSopenharmony_ci *   -K "0123456789abcdeffedcba9876543210" \
209d4afb5ceSopenharmony_ci *   -iv "0123456789abcdeffedcba9876543210"
210d4afb5ceSopenharmony_ci *   -in plaintext.txt -out out.enc
211d4afb5ceSopenharmony_ci *
212d4afb5ceSopenharmony_ci */
213d4afb5ceSopenharmony_ci*cfb8	= (uint8_t *)"test plaintext\0\0",
214d4afb5ceSopenharmony_cicfb8_enc[] = {
215d4afb5ceSopenharmony_ci	0xd2, 0x91, 0x06, 0x2d, 0x1b, 0x1e, 0x9b, 0x39,
216d4afb5ceSopenharmony_ci	0xa6, 0x65, 0x8e, 0xbe, 0x68, 0x32, 0x3d, 0xab
217d4afb5ceSopenharmony_ci}, cfb8_iv[] = {
218d4afb5ceSopenharmony_ci	0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
219d4afb5ceSopenharmony_ci	0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
220d4afb5ceSopenharmony_ci}, cfb8_key[] = {
221d4afb5ceSopenharmony_ci	0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
222d4afb5ceSopenharmony_ci	0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
223d4afb5ceSopenharmony_ci};
224d4afb5ceSopenharmony_ci
225d4afb5ceSopenharmony_cistatic int
226d4afb5ceSopenharmony_citest_genaes_cfb8(void)
227d4afb5ceSopenharmony_ci{
228d4afb5ceSopenharmony_ci	struct lws_genaes_ctx ctx;
229d4afb5ceSopenharmony_ci	struct lws_gencrypto_keyelem e;
230d4afb5ceSopenharmony_ci	uint8_t res[32], res1[32];
231d4afb5ceSopenharmony_ci
232d4afb5ceSopenharmony_ci	e.buf = (uint8_t *)cfb8_key;
233d4afb5ceSopenharmony_ci	e.len = sizeof(cfb8_key);
234d4afb5ceSopenharmony_ci
235d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_CFB8, &e, 0, NULL)) {
236d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create failed\n", __func__);
237d4afb5ceSopenharmony_ci		return 1;
238d4afb5ceSopenharmony_ci	}
239d4afb5ceSopenharmony_ci
240d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, cfb8, 16, res, (uint8_t *)cfb8_iv,
241d4afb5ceSopenharmony_ci			     NULL, NULL, 0)) {
242d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt failed\n", __func__);
243d4afb5ceSopenharmony_ci		goto bail;
244d4afb5ceSopenharmony_ci	}
245d4afb5ceSopenharmony_ci
246d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
247d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
248d4afb5ceSopenharmony_ci		return -1;
249d4afb5ceSopenharmony_ci	}
250d4afb5ceSopenharmony_ci
251d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(cfb8_enc, res, 16)) {
252d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__);
253d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, 16);
254d4afb5ceSopenharmony_ci		return -1;
255d4afb5ceSopenharmony_ci	}
256d4afb5ceSopenharmony_ci
257d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_CFB8, &e, 0, NULL)) {
258d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create dec failed\n", __func__);
259d4afb5ceSopenharmony_ci		return -1;
260d4afb5ceSopenharmony_ci	}
261d4afb5ceSopenharmony_ci
262d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, res, 16, res1, (uint8_t *)cfb8_iv,
263d4afb5ceSopenharmony_ci			     NULL, NULL, 0)) {
264d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__);
265d4afb5ceSopenharmony_ci		goto bail;
266d4afb5ceSopenharmony_ci	}
267d4afb5ceSopenharmony_ci
268d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
269d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
270d4afb5ceSopenharmony_ci		return -1;
271d4afb5ceSopenharmony_ci	}
272d4afb5ceSopenharmony_ci
273d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(cfb8, res1, 16)) {
274d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__);
275d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res1, 16);
276d4afb5ceSopenharmony_ci		return -1;
277d4afb5ceSopenharmony_ci	}
278d4afb5ceSopenharmony_ci
279d4afb5ceSopenharmony_ci	return 0;
280d4afb5ceSopenharmony_ci
281d4afb5ceSopenharmony_cibail:
282d4afb5ceSopenharmony_ci	lws_genaes_destroy(&ctx, NULL, 0);
283d4afb5ceSopenharmony_ci
284d4afb5ceSopenharmony_ci	return -1;
285d4afb5ceSopenharmony_ci}
286d4afb5ceSopenharmony_ci#endif
287d4afb5ceSopenharmony_ci
288d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CTR))) || \
289d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ctr))
290d4afb5ceSopenharmony_cistatic const uint8_t
291d4afb5ceSopenharmony_ci/*
292d4afb5ceSopenharmony_ci * produced with (plaintext.txt contains "test plaintext\0\0")
293d4afb5ceSopenharmony_ci *
294d4afb5ceSopenharmony_ci * openssl enc -aes-128-ctr \
295d4afb5ceSopenharmony_ci *   -K "0123456789abcdeffedcba9876543210" \
296d4afb5ceSopenharmony_ci *   -iv "0123456789abcdeffedcba9876543210"
297d4afb5ceSopenharmony_ci *   -in plaintext.txt -out out.enc
298d4afb5ceSopenharmony_ci *
299d4afb5ceSopenharmony_ci */
300d4afb5ceSopenharmony_ci*ctr	= (uint8_t *)"test plaintext\0\0",
301d4afb5ceSopenharmony_cictr_enc[] = {
302d4afb5ceSopenharmony_ci	0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04,
303d4afb5ceSopenharmony_ci	0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71
304d4afb5ceSopenharmony_ci}, ctr_iv[] = {
305d4afb5ceSopenharmony_ci	0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
306d4afb5ceSopenharmony_ci	0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
307d4afb5ceSopenharmony_ci}, ctr_key[] = {
308d4afb5ceSopenharmony_ci	0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
309d4afb5ceSopenharmony_ci	0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
310d4afb5ceSopenharmony_ci};
311d4afb5ceSopenharmony_ci
312d4afb5ceSopenharmony_cistatic int
313d4afb5ceSopenharmony_citest_genaes_ctr(void)
314d4afb5ceSopenharmony_ci{
315d4afb5ceSopenharmony_ci	uint8_t nonce_counter[16], sb[16];
316d4afb5ceSopenharmony_ci	struct lws_genaes_ctx ctx;
317d4afb5ceSopenharmony_ci	struct lws_gencrypto_keyelem e;
318d4afb5ceSopenharmony_ci	uint8_t res[32], res1[32];
319d4afb5ceSopenharmony_ci	size_t nc_off = 0;
320d4afb5ceSopenharmony_ci
321d4afb5ceSopenharmony_ci	e.buf = (uint8_t *)ctr_key;
322d4afb5ceSopenharmony_ci	e.len = sizeof(ctr_key);
323d4afb5ceSopenharmony_ci
324d4afb5ceSopenharmony_ci	memset(sb, 0, sizeof(nonce_counter));
325d4afb5ceSopenharmony_ci	memcpy(nonce_counter, ctr_iv, sizeof(ctr_iv));
326d4afb5ceSopenharmony_ci
327d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_CTR, &e, 0, NULL)) {
328d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create failed\n", __func__);
329d4afb5ceSopenharmony_ci		return 1;
330d4afb5ceSopenharmony_ci	}
331d4afb5ceSopenharmony_ci
332d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, ctr, 16, res, nonce_counter, sb, &nc_off, 0)) {
333d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt failed\n", __func__);
334d4afb5ceSopenharmony_ci		goto bail;
335d4afb5ceSopenharmony_ci	}
336d4afb5ceSopenharmony_ci
337d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
338d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
339d4afb5ceSopenharmony_ci		return -1;
340d4afb5ceSopenharmony_ci	}
341d4afb5ceSopenharmony_ci
342d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(ctr_enc, res, 16)) {
343d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__);
344d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, 16);
345d4afb5ceSopenharmony_ci		return -1;
346d4afb5ceSopenharmony_ci	}
347d4afb5ceSopenharmony_ci
348d4afb5ceSopenharmony_ci	nc_off = 0;
349d4afb5ceSopenharmony_ci	memset(sb , 0, sizeof(nonce_counter));
350d4afb5ceSopenharmony_ci	memcpy(nonce_counter, ctr_iv, sizeof(ctr_iv));
351d4afb5ceSopenharmony_ci
352d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_CTR, &e, 0, NULL)) {
353d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create dec failed\n", __func__);
354d4afb5ceSopenharmony_ci		return -1;
355d4afb5ceSopenharmony_ci	}
356d4afb5ceSopenharmony_ci
357d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, res, 16, res1, nonce_counter, sb, &nc_off, 0)) {
358d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__);
359d4afb5ceSopenharmony_ci		goto bail;
360d4afb5ceSopenharmony_ci	}
361d4afb5ceSopenharmony_ci
362d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
363d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
364d4afb5ceSopenharmony_ci		return -1;
365d4afb5ceSopenharmony_ci	}
366d4afb5ceSopenharmony_ci
367d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(ctr, res1, 16)) {
368d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__);
369d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res1, 16);
370d4afb5ceSopenharmony_ci		return -1;
371d4afb5ceSopenharmony_ci	}
372d4afb5ceSopenharmony_ci
373d4afb5ceSopenharmony_ci	lws_explicit_bzero(sb, sizeof(sb));
374d4afb5ceSopenharmony_ci
375d4afb5ceSopenharmony_ci	return 0;
376d4afb5ceSopenharmony_ci
377d4afb5ceSopenharmony_cibail:
378d4afb5ceSopenharmony_ci	lws_genaes_destroy(&ctx, NULL, 0);
379d4afb5ceSopenharmony_ci
380d4afb5ceSopenharmony_ci	return -1;
381d4afb5ceSopenharmony_ci}
382d4afb5ceSopenharmony_ci#endif
383d4afb5ceSopenharmony_ci
384d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS)) || \
385d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ecb))
386d4afb5ceSopenharmony_cistatic const uint8_t
387d4afb5ceSopenharmony_ci/*
388d4afb5ceSopenharmony_ci * produced with (plaintext.txt contains "test plaintext\0\0")
389d4afb5ceSopenharmony_ci *
390d4afb5ceSopenharmony_ci * openssl enc -aes-128-ecb \
391d4afb5ceSopenharmony_ci *   -K "0123456789abcdeffedcba9876543210" \
392d4afb5ceSopenharmony_ci *   -in plaintext.txt -out out.enc
393d4afb5ceSopenharmony_ci *
394d4afb5ceSopenharmony_ci */
395d4afb5ceSopenharmony_ci*ecb	= (uint8_t *)"test plaintext\0\0",
396d4afb5ceSopenharmony_ciecb_enc[] = {
397d4afb5ceSopenharmony_ci	0xf3, 0xe5, 0x6c, 0x80, 0x3a, 0xf1, 0xc4, 0xa0,
398d4afb5ceSopenharmony_ci	0x7e, 0xdf, 0x86, 0x0f, 0x6d, 0xca, 0x5d, 0x36,
399d4afb5ceSopenharmony_ci	0x17, 0x22, 0x37, 0x42, 0x47, 0x41, 0x67, 0x7d,
400d4afb5ceSopenharmony_ci	0x99, 0x25, 0x02, 0x6b, 0x6b, 0x8f, 0x9c, 0x7f
401d4afb5ceSopenharmony_ci}, ecb_key[] = {
402d4afb5ceSopenharmony_ci	0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
403d4afb5ceSopenharmony_ci	0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
404d4afb5ceSopenharmony_ci};
405d4afb5ceSopenharmony_ci
406d4afb5ceSopenharmony_cistatic int
407d4afb5ceSopenharmony_citest_genaes_ecb(void)
408d4afb5ceSopenharmony_ci{
409d4afb5ceSopenharmony_ci	struct lws_genaes_ctx ctx;
410d4afb5ceSopenharmony_ci	struct lws_gencrypto_keyelem e;
411d4afb5ceSopenharmony_ci	uint8_t res[32], res1[32];
412d4afb5ceSopenharmony_ci
413d4afb5ceSopenharmony_ci	/*
414d4afb5ceSopenharmony_ci	 * As part of a jwk, these are allocated.  But here we just use one as
415d4afb5ceSopenharmony_ci	 * a wrapper on a static binary key.
416d4afb5ceSopenharmony_ci	 */
417d4afb5ceSopenharmony_ci	e.buf = (uint8_t *)ecb_key;
418d4afb5ceSopenharmony_ci	e.len = sizeof(ecb_key);
419d4afb5ceSopenharmony_ci
420d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_ECB, &e, 0, NULL)) {
421d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create failed\n", __func__);
422d4afb5ceSopenharmony_ci		return 1;
423d4afb5ceSopenharmony_ci	}
424d4afb5ceSopenharmony_ci
425d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, ecb, 16, res, NULL, NULL, NULL, 0)) {
426d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt failed\n", __func__);
427d4afb5ceSopenharmony_ci		goto bail;
428d4afb5ceSopenharmony_ci	}
429d4afb5ceSopenharmony_ci
430d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
431d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
432d4afb5ceSopenharmony_ci		return -1;
433d4afb5ceSopenharmony_ci	}
434d4afb5ceSopenharmony_ci
435d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(ecb_enc, res, 16)) {
436d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__);
437d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, 16);
438d4afb5ceSopenharmony_ci		return -1;
439d4afb5ceSopenharmony_ci	}
440d4afb5ceSopenharmony_ci
441d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_ECB, &e, 0, NULL)) {
442d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create dec failed\n", __func__);
443d4afb5ceSopenharmony_ci		return -1;
444d4afb5ceSopenharmony_ci	}
445d4afb5ceSopenharmony_ci
446d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, res, 16, res1, NULL, NULL, NULL, 0)) {
447d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__);
448d4afb5ceSopenharmony_ci		goto bail;
449d4afb5ceSopenharmony_ci	}
450d4afb5ceSopenharmony_ci
451d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
452d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
453d4afb5ceSopenharmony_ci		return -1;
454d4afb5ceSopenharmony_ci	}
455d4afb5ceSopenharmony_ci
456d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(ecb, res1, 16)) {
457d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__);
458d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, 16);
459d4afb5ceSopenharmony_ci		return -1;
460d4afb5ceSopenharmony_ci	}
461d4afb5ceSopenharmony_ci
462d4afb5ceSopenharmony_ci	return 0;
463d4afb5ceSopenharmony_ci
464d4afb5ceSopenharmony_cibail:
465d4afb5ceSopenharmony_ci	lws_genaes_destroy(&ctx, NULL, 0);
466d4afb5ceSopenharmony_ci
467d4afb5ceSopenharmony_ci	return -1;
468d4afb5ceSopenharmony_ci}
469d4afb5ceSopenharmony_ci#endif
470d4afb5ceSopenharmony_ci
471d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_OFB))) || \
472d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ofb))
473d4afb5ceSopenharmony_cistatic const uint8_t
474d4afb5ceSopenharmony_ci	/*
475d4afb5ceSopenharmony_ci	 * produced with (plaintext.txt contains "test plaintext\0\0")
476d4afb5ceSopenharmony_ci	 *
477d4afb5ceSopenharmony_ci	 * openssl enc -aes-128-ofb \
478d4afb5ceSopenharmony_ci	 *   -K "0123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210" \
479d4afb5ceSopenharmony_ci	 *   -iv "0123456789abcdeffedcba9876543210"
480d4afb5ceSopenharmony_ci	 *   -in plaintext.txt -out out.enc
481d4afb5ceSopenharmony_ci	 *
482d4afb5ceSopenharmony_ci	 */
483d4afb5ceSopenharmony_ci	*ofb	= (uint8_t *)"test plaintext\0\0",
484d4afb5ceSopenharmony_ci	ofb_enc[] = {
485d4afb5ceSopenharmony_ci		/* !!! ugh... openssl app produces this... */
486d4afb5ceSopenharmony_ci		// 0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04,
487d4afb5ceSopenharmony_ci		// 0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71,
488d4afb5ceSopenharmony_ci		/* but both OpenSSL and mbedTLS produce this */
489d4afb5ceSopenharmony_ci		0x11, 0x33, 0x6D, 0xFC, 0x88, 0x4C, 0x28, 0xBA,
490d4afb5ceSopenharmony_ci		0xD0, 0xF2, 0x6C, 0xBC, 0xDE, 0x4A, 0x56, 0x20
491d4afb5ceSopenharmony_ci	}, ofb_iv[] = {
492d4afb5ceSopenharmony_ci		0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
493d4afb5ceSopenharmony_ci		0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
494d4afb5ceSopenharmony_ci	}, ofb_key[] = {
495d4afb5ceSopenharmony_ci		0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
496d4afb5ceSopenharmony_ci		0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
497d4afb5ceSopenharmony_ci		0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
498d4afb5ceSopenharmony_ci		0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
499d4afb5ceSopenharmony_ci	}
500d4afb5ceSopenharmony_ci;
501d4afb5ceSopenharmony_cistatic int
502d4afb5ceSopenharmony_citest_genaes_ofb(void)
503d4afb5ceSopenharmony_ci{
504d4afb5ceSopenharmony_ci	struct lws_genaes_ctx ctx;
505d4afb5ceSopenharmony_ci	struct lws_gencrypto_keyelem e;
506d4afb5ceSopenharmony_ci	uint8_t res[32], res1[32];
507d4afb5ceSopenharmony_ci	size_t iv_off = 0;
508d4afb5ceSopenharmony_ci
509d4afb5ceSopenharmony_ci	e.buf = (uint8_t *)ofb_key;
510d4afb5ceSopenharmony_ci	e.len = sizeof(ofb_key);
511d4afb5ceSopenharmony_ci
512d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_OFB, &e, 0, NULL)) {
513d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create failed\n", __func__);
514d4afb5ceSopenharmony_ci		return 1;
515d4afb5ceSopenharmony_ci	}
516d4afb5ceSopenharmony_ci
517d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, ofb, 16, res, (uint8_t *)ofb_iv, NULL,
518d4afb5ceSopenharmony_ci			     &iv_off, 0)) {
519d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt failed\n", __func__);
520d4afb5ceSopenharmony_ci		goto bail;
521d4afb5ceSopenharmony_ci	}
522d4afb5ceSopenharmony_ci
523d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
524d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
525d4afb5ceSopenharmony_ci		return -1;
526d4afb5ceSopenharmony_ci	}
527d4afb5ceSopenharmony_ci
528d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(ofb_enc, res, 16)) {
529d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__);
530d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, 16);
531d4afb5ceSopenharmony_ci		return -1;
532d4afb5ceSopenharmony_ci	}
533d4afb5ceSopenharmony_ci
534d4afb5ceSopenharmony_ci	iv_off = 0;
535d4afb5ceSopenharmony_ci
536d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_OFB, &e, 0, NULL)) {
537d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create dec failed\n", __func__);
538d4afb5ceSopenharmony_ci		return -1;
539d4afb5ceSopenharmony_ci	}
540d4afb5ceSopenharmony_ci
541d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, res, 16, res1, (uint8_t *)ofb_iv, NULL,
542d4afb5ceSopenharmony_ci			     &iv_off, 0)) {
543d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__);
544d4afb5ceSopenharmony_ci		goto bail;
545d4afb5ceSopenharmony_ci	}
546d4afb5ceSopenharmony_ci
547d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
548d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
549d4afb5ceSopenharmony_ci		return -1;
550d4afb5ceSopenharmony_ci	}
551d4afb5ceSopenharmony_ci
552d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(ofb, res1, 16)) {
553d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__);
554d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, 16);
555d4afb5ceSopenharmony_ci		return -1;
556d4afb5ceSopenharmony_ci	}
557d4afb5ceSopenharmony_ci
558d4afb5ceSopenharmony_ci	return 0;
559d4afb5ceSopenharmony_ci
560d4afb5ceSopenharmony_cibail:
561d4afb5ceSopenharmony_ci	lws_genaes_destroy(&ctx, NULL, 0);
562d4afb5ceSopenharmony_ci
563d4afb5ceSopenharmony_ci	return -1;
564d4afb5ceSopenharmony_ci}
565d4afb5ceSopenharmony_ci
566d4afb5ceSopenharmony_ci#endif
567d4afb5ceSopenharmony_ci
568d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_XTS))) || \
569d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_xts))
570d4afb5ceSopenharmony_ci
571d4afb5ceSopenharmony_cistatic const uint8_t
572d4afb5ceSopenharmony_ci	/*
573d4afb5ceSopenharmony_ci	 * Fedora openssl tool doesn't support xts... this data produced
574d4afb5ceSopenharmony_ci	 * by testing on mbedtls + OpenSSL and getting the same result
575d4afb5ceSopenharmony_ci	 *
576d4afb5ceSopenharmony_ci	 * NOTICE that xts requires a double-length key... OpenSSL now checks
577d4afb5ceSopenharmony_ci	 * the key for duplication so we use a random key
578d4afb5ceSopenharmony_ci	 */
579d4afb5ceSopenharmony_ci	*xts	= (uint8_t *)"test plaintext\0\0",
580d4afb5ceSopenharmony_ci	xts_enc[] = {
581d4afb5ceSopenharmony_ci		0x87, 0x83, 0x20, 0x8B, 0x15, 0x89, 0xA1, 0x13,
582d4afb5ceSopenharmony_ci		0xDC, 0xEA, 0x82, 0xB6, 0xFF, 0x8D, 0x76, 0x3A
583d4afb5ceSopenharmony_ci	}, xts_key[] = {
584d4afb5ceSopenharmony_ci		0xa4, 0xd6, 0xa2, 0x1a, 0x3b, 0x34, 0x34, 0x43,
585d4afb5ceSopenharmony_ci		0x9a, 0xe2, 0x6a, 0x01, 0x1c, 0x73, 0x80, 0x3b,
586d4afb5ceSopenharmony_ci		0xdd, 0xf6, 0xd4, 0x37, 0x5e, 0x0e, 0x1c, 0x72,
587d4afb5ceSopenharmony_ci		0x8e, 0xe5, 0x18, 0x69, 0xfd, 0x08, 0x40, 0x2b,
588d4afb5ceSopenharmony_ci		0x98, 0xf9, 0x75, 0xa8, 0x36, 0xd5, 0x0f, 0xa2,
589d4afb5ceSopenharmony_ci		0x20, 0x04, 0x43, 0xa7, 0x3a, 0xa6, 0x4a, 0xdc,
590d4afb5ceSopenharmony_ci		0xe9, 0x54, 0x50, 0xfa, 0x38, 0xad, 0x6d, 0x96,
591d4afb5ceSopenharmony_ci		0x5f, 0x31, 0x9e, 0xcd, 0x33, 0x08, 0xa0, 0x44
592d4afb5ceSopenharmony_ci	}
593d4afb5ceSopenharmony_ci;
594d4afb5ceSopenharmony_cistatic int
595d4afb5ceSopenharmony_citest_genaes_xts(void)
596d4afb5ceSopenharmony_ci{
597d4afb5ceSopenharmony_ci
598d4afb5ceSopenharmony_ci	struct lws_genaes_ctx ctx;
599d4afb5ceSopenharmony_ci	struct lws_gencrypto_keyelem e;
600d4afb5ceSopenharmony_ci	uint8_t res[32], res1[32], data_unit[16];
601d4afb5ceSopenharmony_ci
602d4afb5ceSopenharmony_ci	memset(data_unit, 0, sizeof(data_unit));
603d4afb5ceSopenharmony_ci
604d4afb5ceSopenharmony_ci	e.buf = (uint8_t *)xts_key;
605d4afb5ceSopenharmony_ci	e.len = sizeof(xts_key);
606d4afb5ceSopenharmony_ci
607d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_XTS, &e, 0, NULL)) {
608d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create failed\n", __func__);
609d4afb5ceSopenharmony_ci		return 1;
610d4afb5ceSopenharmony_ci	}
611d4afb5ceSopenharmony_ci
612d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, xts, 16, res, data_unit, NULL, NULL, 0)) {
613d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt failed\n", __func__);
614d4afb5ceSopenharmony_ci		goto bail;
615d4afb5ceSopenharmony_ci	}
616d4afb5ceSopenharmony_ci
617d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
618d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
619d4afb5ceSopenharmony_ci		return -1;
620d4afb5ceSopenharmony_ci	}
621d4afb5ceSopenharmony_ci
622d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(xts_enc, res, 16)) {
623d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__);
624d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, 16);
625d4afb5ceSopenharmony_ci		return -1;
626d4afb5ceSopenharmony_ci	}
627d4afb5ceSopenharmony_ci
628d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_XTS, &e, 0, NULL)) {
629d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create dec failed\n", __func__);
630d4afb5ceSopenharmony_ci		return -1;
631d4afb5ceSopenharmony_ci	}
632d4afb5ceSopenharmony_ci
633d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, res, 16, res1, data_unit, NULL, NULL, 0)) {
634d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__);
635d4afb5ceSopenharmony_ci		goto bail;
636d4afb5ceSopenharmony_ci	}
637d4afb5ceSopenharmony_ci
638d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, NULL, 0)) {
639d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy failed\n", __func__);
640d4afb5ceSopenharmony_ci		return -1;
641d4afb5ceSopenharmony_ci	}
642d4afb5ceSopenharmony_ci
643d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(xts, res1, 16)) {
644d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__);
645d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, 16);
646d4afb5ceSopenharmony_ci		return -1;
647d4afb5ceSopenharmony_ci	}
648d4afb5ceSopenharmony_ci
649d4afb5ceSopenharmony_ci	return 0;
650d4afb5ceSopenharmony_ci
651d4afb5ceSopenharmony_cibail:
652d4afb5ceSopenharmony_ci	lws_genaes_destroy(&ctx, NULL, 0);
653d4afb5ceSopenharmony_ci
654d4afb5ceSopenharmony_ci	return -1;
655d4afb5ceSopenharmony_ci}
656d4afb5ceSopenharmony_ci#endif
657d4afb5ceSopenharmony_ci
658d4afb5ceSopenharmony_cistatic const uint8_t
659d4afb5ceSopenharmony_ci	/*
660d4afb5ceSopenharmony_ci	 * https://csrc.nist.gov/CSRC/media/Projects/
661d4afb5ceSopenharmony_ci	 * Cryptographic-Algorithm-Validation-Program/
662d4afb5ceSopenharmony_ci	 * documents/mac/gcmtestvectors.zip
663d4afb5ceSopenharmony_ci	 */
664d4afb5ceSopenharmony_ci
665d4afb5ceSopenharmony_ci	gcm_ct[] = {
666d4afb5ceSopenharmony_ci		0xf7, 0x26, 0x44, 0x13, 0xa8, 0x4c, 0x0e, 0x7c,
667d4afb5ceSopenharmony_ci		0xd5, 0x36, 0x86, 0x7e, 0xb9, 0xf2, 0x17, 0x36
668d4afb5ceSopenharmony_ci	}, gcm_iv[] = {
669d4afb5ceSopenharmony_ci		0x99, 0xaa, 0x3e, 0x68, 0xed, 0x81, 0x73, 0xa0,
670d4afb5ceSopenharmony_ci		0xee, 0xd0, 0x66, 0x84
671d4afb5ceSopenharmony_ci	}, gcm_key[] = {
672d4afb5ceSopenharmony_ci		0xee, 0xbc, 0x1f, 0x57, 0x48, 0x7f, 0x51, 0x92,
673d4afb5ceSopenharmony_ci		0x1c, 0x04, 0x65, 0x66, 0x5f, 0x8a, 0xe6, 0xd1,
674d4afb5ceSopenharmony_ci		0x65, 0x8b, 0xb2, 0x6d, 0xe6, 0xf8, 0xa0, 0x69,
675d4afb5ceSopenharmony_ci		0xa3, 0x52, 0x02, 0x93, 0xa5, 0x72, 0x07, 0x8f
676d4afb5ceSopenharmony_ci	}, gcm_pt[] = {
677d4afb5ceSopenharmony_ci		0xf5, 0x6e, 0x87, 0x05, 0x5b, 0xc3, 0x2d, 0x0e,
678d4afb5ceSopenharmony_ci		0xeb, 0x31, 0xb2, 0xea, 0xcc, 0x2b, 0xf2, 0xa5
679d4afb5ceSopenharmony_ci	}, gcm_aad[] = {
680d4afb5ceSopenharmony_ci		0x4d, 0x23, 0xc3, 0xce, 0xc3, 0x34, 0xb4, 0x9b,
681d4afb5ceSopenharmony_ci		0xdb, 0x37, 0x0c, 0x43, 0x7f, 0xec, 0x78, 0xde
682d4afb5ceSopenharmony_ci	}, gcm_tag[] = {
683d4afb5ceSopenharmony_ci		0x67, 0xba, 0x05, 0x10, 0x26, 0x2a, 0xe4, 0x87,
684d4afb5ceSopenharmony_ci		0xd7, 0x37, 0xee, 0x62, 0x98, 0xf7, 0x7e, 0x0c
685d4afb5ceSopenharmony_ci	};
686d4afb5ceSopenharmony_ci
687d4afb5ceSopenharmony_cistatic int
688d4afb5ceSopenharmony_citest_genaes_gcm(void)
689d4afb5ceSopenharmony_ci{
690d4afb5ceSopenharmony_ci	uint8_t res[sizeof(gcm_ct)], tag[sizeof(gcm_tag)];
691d4afb5ceSopenharmony_ci	struct lws_genaes_ctx ctx;
692d4afb5ceSopenharmony_ci	struct lws_gencrypto_keyelem e;
693d4afb5ceSopenharmony_ci	size_t iv_off = 0;
694d4afb5ceSopenharmony_ci
695d4afb5ceSopenharmony_ci	e.buf = (uint8_t *)gcm_key;
696d4afb5ceSopenharmony_ci	e.len = sizeof(gcm_key);
697d4afb5ceSopenharmony_ci
698d4afb5ceSopenharmony_ci	/* Encrypt */
699d4afb5ceSopenharmony_ci
700d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_GCM, &e, 0, NULL)) {
701d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create failed\n", __func__);
702d4afb5ceSopenharmony_ci		return 1;
703d4afb5ceSopenharmony_ci	}
704d4afb5ceSopenharmony_ci
705d4afb5ceSopenharmony_ci	/* first we set the iv and aad */
706d4afb5ceSopenharmony_ci
707d4afb5ceSopenharmony_ci	iv_off = sizeof(gcm_iv);
708d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, gcm_aad, sizeof(gcm_aad), NULL,
709d4afb5ceSopenharmony_ci			     (uint8_t *)gcm_iv, (uint8_t *)gcm_tag,
710d4afb5ceSopenharmony_ci			     &iv_off, sizeof(gcm_tag))) {
711d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt 1 failed\n", __func__);
712d4afb5ceSopenharmony_ci		goto bail;
713d4afb5ceSopenharmony_ci	}
714d4afb5ceSopenharmony_ci
715d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, gcm_pt, sizeof(gcm_pt), res,
716d4afb5ceSopenharmony_ci			     NULL, NULL, NULL, 0)) {
717d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt 2 failed\n", __func__);
718d4afb5ceSopenharmony_ci		goto bail;
719d4afb5ceSopenharmony_ci	}
720d4afb5ceSopenharmony_ci
721d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, tag, sizeof(tag))) {
722d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy enc failed\n", __func__);
723d4afb5ceSopenharmony_ci		return -1;
724d4afb5ceSopenharmony_ci	}
725d4afb5ceSopenharmony_ci
726d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(gcm_ct, res, sizeof(gcm_ct))) {
727d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__);
728d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, sizeof(gcm_ct));
729d4afb5ceSopenharmony_ci		return -1;
730d4afb5ceSopenharmony_ci	}
731d4afb5ceSopenharmony_ci
732d4afb5ceSopenharmony_ci
733d4afb5ceSopenharmony_ci	/* Decrypt */
734d4afb5ceSopenharmony_ci
735d4afb5ceSopenharmony_ci	if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_GCM, &e, 0, NULL)) {
736d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_create failed\n", __func__);
737d4afb5ceSopenharmony_ci		return 1;
738d4afb5ceSopenharmony_ci	}
739d4afb5ceSopenharmony_ci
740d4afb5ceSopenharmony_ci	iv_off = sizeof(gcm_iv); /* initial call sets iv + aad + tag */
741d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, gcm_aad, sizeof(gcm_aad), NULL,
742d4afb5ceSopenharmony_ci			     (uint8_t *)gcm_iv, (uint8_t *)gcm_tag,
743d4afb5ceSopenharmony_ci			     &iv_off, sizeof(gcm_tag))) {
744d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt 1 failed\n", __func__);
745d4afb5ceSopenharmony_ci		goto bail;
746d4afb5ceSopenharmony_ci	}
747d4afb5ceSopenharmony_ci
748d4afb5ceSopenharmony_ci	if (lws_genaes_crypt(&ctx, gcm_ct, sizeof(gcm_ct), res,
749d4afb5ceSopenharmony_ci			     NULL, NULL, NULL, 0)) {
750d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt 2 failed\n", __func__);
751d4afb5ceSopenharmony_ci		goto bail;
752d4afb5ceSopenharmony_ci	}
753d4afb5ceSopenharmony_ci
754d4afb5ceSopenharmony_ci	if (lws_genaes_destroy(&ctx, tag, sizeof(tag))) {
755d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_destroy dec failed\n", __func__);
756d4afb5ceSopenharmony_ci		return -1;
757d4afb5ceSopenharmony_ci	}
758d4afb5ceSopenharmony_ci
759d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(gcm_pt, res, sizeof(gcm_pt))) {
760d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__);
761d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(res, sizeof(gcm_ct));
762d4afb5ceSopenharmony_ci		return -1;
763d4afb5ceSopenharmony_ci	}
764d4afb5ceSopenharmony_ci
765d4afb5ceSopenharmony_ci	return 0;
766d4afb5ceSopenharmony_ci
767d4afb5ceSopenharmony_cibail:
768d4afb5ceSopenharmony_ci	lws_genaes_destroy(&ctx, NULL, 0);
769d4afb5ceSopenharmony_ci
770d4afb5ceSopenharmony_ci	return -1;
771d4afb5ceSopenharmony_ci}
772d4afb5ceSopenharmony_ci
773d4afb5ceSopenharmony_ciint
774d4afb5ceSopenharmony_citest_genaes(struct lws_context *context)
775d4afb5ceSopenharmony_ci{
776d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CBC))) || \
777d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cbc))
778d4afb5ceSopenharmony_ci	if (test_genaes_cbc())
779d4afb5ceSopenharmony_ci		goto bail;
780d4afb5ceSopenharmony_ci#endif
781d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \
782d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cfb128))
783d4afb5ceSopenharmony_ci	if (test_genaes_cfb128())
784d4afb5ceSopenharmony_ci		goto bail;
785d4afb5ceSopenharmony_ci#endif
786d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \
787d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cfb8))
788d4afb5ceSopenharmony_ci	if (test_genaes_cfb8())
789d4afb5ceSopenharmony_ci		goto bail;
790d4afb5ceSopenharmony_ci#endif
791d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CTR))) || \
792d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ctr))
793d4afb5ceSopenharmony_ci	if (test_genaes_ctr())
794d4afb5ceSopenharmony_ci		goto bail;
795d4afb5ceSopenharmony_ci#endif
796d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS)) || \
797d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ecb))
798d4afb5ceSopenharmony_ci	if (test_genaes_ecb())
799d4afb5ceSopenharmony_ci		goto bail;
800d4afb5ceSopenharmony_ci#endif
801d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_OFB))) || \
802d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ofb))
803d4afb5ceSopenharmony_ci	if (test_genaes_ofb())
804d4afb5ceSopenharmony_ci		goto bail;
805d4afb5ceSopenharmony_ci#endif
806d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_XTS))) || \
807d4afb5ceSopenharmony_ci    (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_xts))
808d4afb5ceSopenharmony_ci	if (test_genaes_xts())
809d4afb5ceSopenharmony_ci		goto bail;
810d4afb5ceSopenharmony_ci#endif
811d4afb5ceSopenharmony_ci
812d4afb5ceSopenharmony_ci	if (test_genaes_gcm())
813d4afb5ceSopenharmony_ci		goto bail;
814d4afb5ceSopenharmony_ci
815d4afb5ceSopenharmony_ci	/* end */
816d4afb5ceSopenharmony_ci
817d4afb5ceSopenharmony_ci	lwsl_notice("%s: selftest OK\n", __func__);
818d4afb5ceSopenharmony_ci
819d4afb5ceSopenharmony_ci	return 0;
820d4afb5ceSopenharmony_ci
821d4afb5ceSopenharmony_cibail:
822d4afb5ceSopenharmony_ci	lwsl_err("%s: selftest failed ++++++++++++++++++++\n", __func__);
823d4afb5ceSopenharmony_ci
824d4afb5ceSopenharmony_ci	return 1;
825d4afb5ceSopenharmony_ci}
826