1d4afb5ceSopenharmony_ci/*
2d4afb5ceSopenharmony_ci * lws-api-test-jose - RFC7516 jwe tests
3d4afb5ceSopenharmony_ci *
4d4afb5ceSopenharmony_ci * Written in 2010-2020 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 * These are the inputs and outputs from the worked example in RFC7516
14d4afb5ceSopenharmony_ci * Appendix A.1   {"alg":"RSA-OAEP","enc":"A256GCM"}
15d4afb5ceSopenharmony_ci */
16d4afb5ceSopenharmony_ci
17d4afb5ceSopenharmony_ci
18d4afb5ceSopenharmony_cistatic char
19d4afb5ceSopenharmony_ci
20d4afb5ceSopenharmony_ci*ex_a1_ptext =
21d4afb5ceSopenharmony_ci	"The true sign of intelligence is not knowledge but imagination.",
22d4afb5ceSopenharmony_ci
23d4afb5ceSopenharmony_ci*ex_a1_compact =
24d4afb5ceSopenharmony_ci	"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ."
25d4afb5ceSopenharmony_ci	"OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe"
26d4afb5ceSopenharmony_ci	"ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb"
27d4afb5ceSopenharmony_ci	"Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV"
28d4afb5ceSopenharmony_ci	"mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8"
29d4afb5ceSopenharmony_ci	"1860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi"
30d4afb5ceSopenharmony_ci	"6UklfCpIMfIjf7iGdXKHzg."
31d4afb5ceSopenharmony_ci	"48V1_ALb6US04U3b."
32d4afb5ceSopenharmony_ci	"5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji"
33d4afb5ceSopenharmony_ci	"SdiwkIr3ajwQzaBtQD_A."
34d4afb5ceSopenharmony_ci	"XFBoMYUZodetZdvTiFvSkQ",
35d4afb5ceSopenharmony_ci
36d4afb5ceSopenharmony_ci	*ex_a1_jwk_json =
37d4afb5ceSopenharmony_ci	"{\"kty\":\"RSA\","
38d4afb5ceSopenharmony_ci	  "\"n\":\"oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUW"
39d4afb5ceSopenharmony_ci		"cJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3S"
40d4afb5ceSopenharmony_ci		"psk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2a"
41d4afb5ceSopenharmony_ci		"sbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMS"
42d4afb5ceSopenharmony_ci		"tPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2dj"
43d4afb5ceSopenharmony_ci		"YgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw\","
44d4afb5ceSopenharmony_ci	  "\"e\":\"AQAB\","
45d4afb5ceSopenharmony_ci	  "\"d\":\"kLdtIj6GbDks_ApCSTYQtelcNttlKiOyPzMrXHeI-yk1F7-kpDxY4-WY5N"
46d4afb5ceSopenharmony_ci		"WV5KntaEeXS1j82E375xxhWMHXyvjYecPT9fpwR_M9gV8n9Hrh2anTpTD9"
47d4afb5ceSopenharmony_ci		"3Dt62ypW3yDsJzBnTnrYu1iwWRgBKrEYY46qAZIrA2xAwnm2X7uGR1hghk"
48d4afb5ceSopenharmony_ci		"qDp0Vqj3kbSCz1XyfCs6_LehBwtxHIyh8Ripy40p24moOAbgxVw3rxT_vl"
49d4afb5ceSopenharmony_ci		"t3UVe4WO3JkJOzlpUf-KTVI2Ptgm-dARxTEtE-id-4OJr0h-K-VFs3VSnd"
50d4afb5ceSopenharmony_ci		"VTIznSxfyrj8ILL6MG_Uv8YAu7VILSB3lOW085-4qE3DzgrTjgyQ\","
51d4afb5ceSopenharmony_ci	  "\"p\":\"1r52Xk46c-LsfB5P442p7atdPUrxQSy4mti_tZI3Mgf2EuFVbUoDBvaRQ-"
52d4afb5ceSopenharmony_ci		"SWxkbkmoEzL7JXroSBjSrK3YIQgYdMgyAEPTPjXv_hI2_1eTSPVZfzL0lf"
53d4afb5ceSopenharmony_ci		"fNn03IXqWF5MDFuoUYE0hzb2vhrlN_rKrbfDIwUbTrjjgieRbwC6Cl0\","
54d4afb5ceSopenharmony_ci	  "\"q\":\"wLb35x7hmQWZsWJmB_vle87ihgZ19S8lBEROLIsZG4ayZVe9Hi9gDVCOBm"
55d4afb5ceSopenharmony_ci		"UDdaDYVTSNx_8Fyw1YYa9XGrGnDew00J28cRUoeBB_jKI1oma0Orv1T9aX"
56d4afb5ceSopenharmony_ci		"IWxKwd4gvxFImOWr3QRL9KEBRzk2RatUBnmDZJTIAfwTs0g68UZHvtc\","
57d4afb5ceSopenharmony_ci	  "\"dp\":\"ZK-YwE7diUh0qR1tR7w8WHtolDx3MZ_OTowiFvgfeQ3SiresXjm9gZ5KL"
58d4afb5ceSopenharmony_ci		"hMXvo-uz-KUJWDxS5pFQ_M0evdo1dKiRTjVw_x4NyqyXPM5nULPkcpU827"
59d4afb5ceSopenharmony_ci		"rnpZzAJKpdhWAgqrXGKAECQH0Xt4taznjnd_zVpAmZZq60WPMBMfKcuE\","
60d4afb5ceSopenharmony_ci	  "\"dq\":\"Dq0gfgJ1DdFGXiLvQEZnuKEN0UUmsJBxkjydc3j4ZYdBiMRAy86x0vHCj"
61d4afb5ceSopenharmony_ci		"ywcMlYYg4yoC4YZa9hNVcsjqA3FeiL19rk8g6Qn29Tt0cj8qqyFpz9vNDB"
62d4afb5ceSopenharmony_ci		"UfCAiJVeESOjJDZPYHdHY8v1b-o-Z2X5tvLx-TCekf7oxyeKDUqKWjis\","
63d4afb5ceSopenharmony_ci	  "\"qi\":\"VIMpMYbPf47dT1w_zDUXfPimsSegnMOA1zTaX7aGk_8urY6R8-ZW1FxU7"
64d4afb5ceSopenharmony_ci		"AlWAyLWybqq6t16VFd7hQd0y6flUK4SlOydB61gwanOsXGOAOv82cHq0E3"
65d4afb5ceSopenharmony_ci		"eL4HrtZkUuKvnPrMnsUUFlfUdybVzxyjz9JF_XyaY14ardLSjf4L_FNY\""
66d4afb5ceSopenharmony_ci	"}"
67d4afb5ceSopenharmony_ci;
68d4afb5ceSopenharmony_ci
69d4afb5ceSopenharmony_cistatic int
70d4afb5ceSopenharmony_citest_jwe_a1(struct lws_context *context)
71d4afb5ceSopenharmony_ci{
72d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
73d4afb5ceSopenharmony_ci	char temp[2048], compact[2048];
74d4afb5ceSopenharmony_ci	int n, ret = -1, temp_len = sizeof(temp);
75d4afb5ceSopenharmony_ci
76d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
77d4afb5ceSopenharmony_ci
78d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, ex_a1_jwk_json,
79d4afb5ceSopenharmony_ci			   strlen(ex_a1_jwk_json)) < 0) {
80d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
81d4afb5ceSopenharmony_ci		goto bail;
82d4afb5ceSopenharmony_ci	}
83d4afb5ceSopenharmony_ci
84d4afb5ceSopenharmony_ci	/* converts a compact serialization to jws b64 + decoded maps */
85d4afb5ceSopenharmony_ci	if (lws_jws_compact_decode(ex_a1_compact, (int)strlen(ex_a1_compact),
86d4afb5ceSopenharmony_ci				   &jwe.jws.map, &jwe.jws.map_b64, temp,
87d4afb5ceSopenharmony_ci				   &temp_len) != 5) {
88d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jws_compact_decode failed\n", __func__);
89d4afb5ceSopenharmony_ci		goto bail;
90d4afb5ceSopenharmony_ci	}
91d4afb5ceSopenharmony_ci
92d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt(&jwe, lws_concat_temp(temp, temp_len),
93d4afb5ceSopenharmony_ci				     &temp_len);
94d4afb5ceSopenharmony_ci	if (n < 0) {
95d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_auth_and_decrypt failed\n",
96d4afb5ceSopenharmony_ci			 __func__);
97d4afb5ceSopenharmony_ci		goto bail;
98d4afb5ceSopenharmony_ci	}
99d4afb5ceSopenharmony_ci
100d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
101d4afb5ceSopenharmony_ci	if (jwe.jws.map.len[LJWE_CTXT] < strlen(ex_a1_ptext) ||
102d4afb5ceSopenharmony_ci	    lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ex_a1_ptext,
103d4afb5ceSopenharmony_ci			        (uint32_t)strlen(ex_a1_ptext))) {
104d4afb5ceSopenharmony_ci		lwsl_err("%s: plaintext AES decrypt wrong\n", __func__);
105d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(ex_a1_ptext, strlen(ex_a1_ptext));
106d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],
107d4afb5ceSopenharmony_ci				    jwe.jws.map.len[LJWE_CTXT]);
108d4afb5ceSopenharmony_ci		goto bail;
109d4afb5ceSopenharmony_ci	}
110d4afb5ceSopenharmony_ci
111d4afb5ceSopenharmony_ci	/*
112d4afb5ceSopenharmony_ci	 * Canned decrypt worked properly... let's also try encoding the
113d4afb5ceSopenharmony_ci	 * plaintext ourselves and decoding that...
114d4afb5ceSopenharmony_ci	 */
115d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
116d4afb5ceSopenharmony_ci	temp_len = sizeof(temp);
117d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
118d4afb5ceSopenharmony_ci
119d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, ex_a1_jwk_json,
120d4afb5ceSopenharmony_ci			   strlen(ex_a1_jwk_json)) < 0) {
121d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
122d4afb5ceSopenharmony_ci		goto bail;
123d4afb5ceSopenharmony_ci	}
124d4afb5ceSopenharmony_ci
125d4afb5ceSopenharmony_ci	if (lws_gencrypto_jwe_alg_to_definition("RSA-OAEP", &jwe.jose.alg)) {
126d4afb5ceSopenharmony_ci		lwsl_err("Unknown cipher alg \"RSA-OAEP\"\n");
127d4afb5ceSopenharmony_ci		goto bail;
128d4afb5ceSopenharmony_ci	}
129d4afb5ceSopenharmony_ci	if (lws_gencrypto_jwe_enc_to_definition("A256GCM", &jwe.jose.enc_alg)) {
130d4afb5ceSopenharmony_ci		lwsl_err("Unknown payload enc alg \"A256GCM\"\n");
131d4afb5ceSopenharmony_ci		goto bail;
132d4afb5ceSopenharmony_ci	}
133d4afb5ceSopenharmony_ci
134d4afb5ceSopenharmony_ci	/* we require a JOSE-formatted header to do the encryption */
135d4afb5ceSopenharmony_ci
136d4afb5ceSopenharmony_ci	jwe.jws.map.buf[LJWS_JOSE] = temp;
137d4afb5ceSopenharmony_ci	jwe.jws.map.len[LJWS_JOSE] = (uint32_t)lws_snprintf(temp, (unsigned int)temp_len,
138d4afb5ceSopenharmony_ci			"{\"alg\":\"%s\",\"enc\":\"%s\"}", "RSA-OAEP", "A256GCM");
139d4afb5ceSopenharmony_ci	temp_len -= (int)jwe.jws.map.len[LJWS_JOSE];
140d4afb5ceSopenharmony_ci
141d4afb5ceSopenharmony_ci	/*
142d4afb5ceSopenharmony_ci	 * dup the plaintext into the ciphertext element, it will be
143d4afb5ceSopenharmony_ci	 * encrypted in-place to a ciphertext of the same length
144d4afb5ceSopenharmony_ci	 */
145d4afb5ceSopenharmony_ci
146d4afb5ceSopenharmony_ci	if (lws_jws_dup_element(&jwe.jws.map, LJWE_CTXT,
147d4afb5ceSopenharmony_ci				lws_concat_temp(temp, temp_len), &temp_len,
148d4afb5ceSopenharmony_ci				ex_a1_ptext, strlen(ex_a1_ptext), 0)) {
149d4afb5ceSopenharmony_ci		lwsl_notice("%s: Not enough temp space for ptext\n", __func__);
150d4afb5ceSopenharmony_ci		goto bail;
151d4afb5ceSopenharmony_ci	}
152d4afb5ceSopenharmony_ci
153d4afb5ceSopenharmony_ci	/* CEK size is determined by hash / hmac size */
154d4afb5ceSopenharmony_ci
155d4afb5ceSopenharmony_ci	n = lws_gencrypto_bits_to_bytes(jwe.jose.enc_alg->keybits_fixed);
156d4afb5ceSopenharmony_ci	if (lws_jws_randomize_element(context, &jwe.jws.map, LJWE_EKEY,
157d4afb5ceSopenharmony_ci				      lws_concat_temp(temp, temp_len),
158d4afb5ceSopenharmony_ci				      &temp_len, (unsigned int)n,
159d4afb5ceSopenharmony_ci				      LWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {
160d4afb5ceSopenharmony_ci		lwsl_err("Problem getting random\n");
161d4afb5ceSopenharmony_ci		goto bail;
162d4afb5ceSopenharmony_ci	}
163d4afb5ceSopenharmony_ci
164d4afb5ceSopenharmony_ci	n = lws_jwe_encrypt(&jwe, lws_concat_temp(temp, temp_len),
165d4afb5ceSopenharmony_ci			    &temp_len);
166d4afb5ceSopenharmony_ci	if (n < 0) {
167d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_encrypt failed\n", __func__);
168d4afb5ceSopenharmony_ci		goto bail;
169d4afb5ceSopenharmony_ci	}
170d4afb5ceSopenharmony_ci	n = lws_jwe_render_compact(&jwe, compact, sizeof(compact));
171d4afb5ceSopenharmony_ci	if (n < 0) {
172d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_render_compact failed: %d\n",
173d4afb5ceSopenharmony_ci			 __func__, n);
174d4afb5ceSopenharmony_ci		goto bail;
175d4afb5ceSopenharmony_ci	}
176d4afb5ceSopenharmony_ci
177d4afb5ceSopenharmony_ci	// puts(compact);
178d4afb5ceSopenharmony_ci
179d4afb5ceSopenharmony_ci	/*
180d4afb5ceSopenharmony_ci	 * Okay... what happens when we try to decode what we created?
181d4afb5ceSopenharmony_ci	 */
182d4afb5ceSopenharmony_ci
183d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
184d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
185d4afb5ceSopenharmony_ci	temp_len = sizeof(temp);
186d4afb5ceSopenharmony_ci
187d4afb5ceSopenharmony_ci	/* converts a compact serialization to jws b64 + decoded maps */
188d4afb5ceSopenharmony_ci	if (lws_jws_compact_decode(compact, (int)strlen(compact), &jwe.jws.map,
189d4afb5ceSopenharmony_ci				   &jwe.jws.map_b64, temp, &temp_len) != 5) {
190d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jws_compact_decode failed\n", __func__);
191d4afb5ceSopenharmony_ci		goto bail;
192d4afb5ceSopenharmony_ci	}
193d4afb5ceSopenharmony_ci
194d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, ex_a1_jwk_json,
195d4afb5ceSopenharmony_ci			   strlen(ex_a1_jwk_json)) < 0) {
196d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
197d4afb5ceSopenharmony_ci		goto bail;
198d4afb5ceSopenharmony_ci	}
199d4afb5ceSopenharmony_ci
200d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt(&jwe, lws_concat_temp(temp, temp_len),
201d4afb5ceSopenharmony_ci				     &temp_len);
202d4afb5ceSopenharmony_ci	if (n < 0) {
203d4afb5ceSopenharmony_ci		lwsl_err("%s: generated lws_jwe_auth_and_decrypt failed\n",
204d4afb5ceSopenharmony_ci			 __func__);
205d4afb5ceSopenharmony_ci		goto bail;
206d4afb5ceSopenharmony_ci	}
207d4afb5ceSopenharmony_ci
208d4afb5ceSopenharmony_ci	ret = 0;
209d4afb5ceSopenharmony_ci
210d4afb5ceSopenharmony_cibail:
211d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
212d4afb5ceSopenharmony_ci	if (ret)
213d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed +++++++++++++++++++\n", __func__);
214d4afb5ceSopenharmony_ci	else
215d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
216d4afb5ceSopenharmony_ci
217d4afb5ceSopenharmony_ci	return ret;
218d4afb5ceSopenharmony_ci}
219d4afb5ceSopenharmony_ci
220d4afb5ceSopenharmony_ci
221d4afb5ceSopenharmony_ci/* A.2.  Example JWE using RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256
222d4afb5ceSopenharmony_ci *
223d4afb5ceSopenharmony_ci * This example encrypts the plaintext "Live long and prosper." to the
224d4afb5ceSopenharmony_ci * recipient using RSAES-PKCS1-v1_5 for key encryption and
225d4afb5ceSopenharmony_ci * AES_128_CBC_HMAC_SHA_256 for content encryption.
226d4afb5ceSopenharmony_ci */
227d4afb5ceSopenharmony_ci
228d4afb5ceSopenharmony_ci/* "Live long and prosper." */
229d4afb5ceSopenharmony_cistatic uint8_t
230d4afb5ceSopenharmony_ci
231d4afb5ceSopenharmony_ciex_a2_ptext[] = {
232d4afb5ceSopenharmony_ci	76, 105, 118, 101, 32, 108, 111, 110,
233d4afb5ceSopenharmony_ci	103, 32, 97, 110, 100, 32,  112, 114,
234d4afb5ceSopenharmony_ci	111, 115, 112, 101, 114, 46
235d4afb5ceSopenharmony_ci}, *lws_jwe_ex_a2_jwk_json = (uint8_t *)
236d4afb5ceSopenharmony_ci	"{"
237d4afb5ceSopenharmony_ci	 "\"kty\":\"RSA\","
238d4afb5ceSopenharmony_ci	 "\"n\":\"sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1Wl"
239d4afb5ceSopenharmony_ci		 "UzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDpre"
240d4afb5ceSopenharmony_ci		 "cbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_"
241d4afb5ceSopenharmony_ci		 "7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBI"
242d4afb5ceSopenharmony_ci		 "Y2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU"
243d4afb5ceSopenharmony_ci		 "7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw\","
244d4afb5ceSopenharmony_ci	 "\"e\":\"AQAB\","
245d4afb5ceSopenharmony_ci	 "\"d\":\"VFCWOqXr8nvZNyaaJLXdnNPXZKRaWCjkU5Q2egQQpTBMwhprMzWzpR8Sxq"
246d4afb5ceSopenharmony_ci		 "1OPThh_J6MUD8Z35wky9b8eEO0pwNS8xlh1lOFRRBoNqDIKVOku0aZb-ry"
247d4afb5ceSopenharmony_ci		 "nq8cxjDTLZQ6Fz7jSjR1Klop-YKaUHc9GsEofQqYruPhzSA-QgajZGPbE_"
248d4afb5ceSopenharmony_ci		 "0ZaVDJHfyd7UUBUKunFMScbflYAAOYJqVIVwaYR5zWEEceUjNnTNo_CVSj"
249d4afb5ceSopenharmony_ci		 "-VvXLO5VZfCUAVLgW4dpf1SrtZjSt34YLsRarSb127reG_DUwg9Ch-Kyvj"
250d4afb5ceSopenharmony_ci		 "T1SkHgUWRVGcyly7uvVGRSDwsXypdrNinPA4jlhoNdizK2zF2CWQ\","
251d4afb5ceSopenharmony_ci	 "\"p\":\"9gY2w6I6S6L0juEKsbeDAwpd9WMfgqFoeA9vEyEUuk4kLwBKcoe1x4HG68"
252d4afb5ceSopenharmony_ci		 "ik918hdDSE9vDQSccA3xXHOAFOPJ8R9EeIAbTi1VwBYnbTp87X-xcPWlEP"
253d4afb5ceSopenharmony_ci		 "krdoUKW60tgs1aNd_Nnc9LEVVPMS390zbFxt8TN_biaBgelNgbC95sM\","
254d4afb5ceSopenharmony_ci	 "\"q\":\"uKlCKvKv_ZJMVcdIs5vVSU_6cPtYI1ljWytExV_skstvRSNi9r66jdd9-y"
255d4afb5ceSopenharmony_ci		 "BhVfuG4shsp2j7rGnIio901RBeHo6TPKWVVykPu1iYhQXw1jIABfw-MVsN"
256d4afb5ceSopenharmony_ci		 "-3bQ76WLdt2SDxsHs7q7zPyUyHXmps7ycZ5c72wGkUwNOjYelmkiNS0\","
257d4afb5ceSopenharmony_ci	 "\"dp\":\"w0kZbV63cVRvVX6yk3C8cMxo2qCM4Y8nsq1lmMSYhG4EcL6FWbX5h9yuv"
258d4afb5ceSopenharmony_ci		 "ngs4iLEFk6eALoUS4vIWEwcL4txw9LsWH_zKI-hwoReoP77cOdSL4AVcra"
259d4afb5ceSopenharmony_ci		 "Hawlkpyd2TWjE5evgbhWtOxnZee3cXJBkAi64Ik6jZxbvk-RR3pEhnCs\","
260d4afb5ceSopenharmony_ci	 "\"dq\":\"o_8V14SezckO6CNLKs_btPdFiO9_kC1DsuUTd2LAfIIVeMZ7jn1Gus_Ff"
261d4afb5ceSopenharmony_ci		 "7B7IVx3p5KuBGOVF8L-qifLb6nQnLysgHDh132NDioZkhH7mI7hPG-PYE_"
262d4afb5ceSopenharmony_ci		 "odApKdnqECHWw0J-F0JWnUd6D2B_1TvF9mXA2Qx-iGYn8OVV1Bsmp6qU\","
263d4afb5ceSopenharmony_ci	 "\"qi\":\"eNho5yRBEBxhGBtQRww9QirZsB66TrfFReG_CcteI1aCneT0ELGhYlRlC"
264d4afb5ceSopenharmony_ci		 "tUkTRclIfuEPmNsNDPbLoLqqCVznFbvdB7x-Tl-m0l_eFTj2KiqwGqE9PZ"
265d4afb5ceSopenharmony_ci		 "B9nNTwMVvH3VRRSLWACvPnSiwP8N5Usy-WRXS-V7TbpxIhvepTfE0NNo\""
266d4afb5ceSopenharmony_ci	"}",
267d4afb5ceSopenharmony_ci
268d4afb5ceSopenharmony_ci*ex_a2_compact = (uint8_t *)
269d4afb5ceSopenharmony_ci	"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0"
270d4afb5ceSopenharmony_ci	"."
271d4afb5ceSopenharmony_ci	"UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm"
272d4afb5ceSopenharmony_ci	"1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7Pc"
273d4afb5ceSopenharmony_ci	"HALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIF"
274d4afb5ceSopenharmony_ci	"NPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8"
275d4afb5ceSopenharmony_ci	"rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv"
276d4afb5ceSopenharmony_ci	"-B3oWh2TbqmScqXMR4gp_A"
277d4afb5ceSopenharmony_ci	"."
278d4afb5ceSopenharmony_ci	"AxY8DCtDaGlsbGljb3RoZQ"
279d4afb5ceSopenharmony_ci	"."
280d4afb5ceSopenharmony_ci	"KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY"
281d4afb5ceSopenharmony_ci	"."
282d4afb5ceSopenharmony_ci	"9hH0vgRfYgPnAHOd8stkvw"
283d4afb5ceSopenharmony_ci;
284d4afb5ceSopenharmony_ci
285d4afb5ceSopenharmony_cistatic int
286d4afb5ceSopenharmony_citest_jwe_a2(struct lws_context *context)
287d4afb5ceSopenharmony_ci{
288d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
289d4afb5ceSopenharmony_ci	char temp[2048];
290d4afb5ceSopenharmony_ci	int n, ret = -1, temp_len = sizeof(temp);
291d4afb5ceSopenharmony_ci
292d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
293d4afb5ceSopenharmony_ci
294d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, (char *)lws_jwe_ex_a2_jwk_json,
295d4afb5ceSopenharmony_ci			   strlen((char *)lws_jwe_ex_a2_jwk_json)) < 0) {
296d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
297d4afb5ceSopenharmony_ci		goto bail;
298d4afb5ceSopenharmony_ci	}
299d4afb5ceSopenharmony_ci
300d4afb5ceSopenharmony_ci	/* converts a compact serialization to jws b64 + decoded maps */
301d4afb5ceSopenharmony_ci	if (lws_jws_compact_decode((const char *)ex_a2_compact,
302d4afb5ceSopenharmony_ci				   (int)strlen((char *)ex_a2_compact),
303d4afb5ceSopenharmony_ci				   &jwe.jws.map, &jwe.jws.map_b64,
304d4afb5ceSopenharmony_ci				   (char *)temp, &temp_len) != 5) {
305d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jws_compact_decode failed\n", __func__);
306d4afb5ceSopenharmony_ci		goto bail;
307d4afb5ceSopenharmony_ci	}
308d4afb5ceSopenharmony_ci
309d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt(&jwe, lws_concat_temp(temp, temp_len),
310d4afb5ceSopenharmony_ci				     &temp_len);
311d4afb5ceSopenharmony_ci	if (n < 0) {
312d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_auth_and_decrypt failed\n",
313d4afb5ceSopenharmony_ci			 __func__);
314d4afb5ceSopenharmony_ci		goto bail;
315d4afb5ceSopenharmony_ci	}
316d4afb5ceSopenharmony_ci
317d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
318d4afb5ceSopenharmony_ci	if (jwe.jws.map.len[LJWE_CTXT] < sizeof(ex_a2_ptext) ||
319d4afb5ceSopenharmony_ci	    lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ex_a2_ptext,
320d4afb5ceSopenharmony_ci			        sizeof(ex_a2_ptext))) {
321d4afb5ceSopenharmony_ci		lwsl_err("%s: plaintext AES decrypt wrong\n", __func__);
322d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(ex_a2_ptext, sizeof(ex_a2_ptext));
323d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],
324d4afb5ceSopenharmony_ci				    jwe.jws.map.len[LJWE_CTXT]);
325d4afb5ceSopenharmony_ci		goto bail;
326d4afb5ceSopenharmony_ci	}
327d4afb5ceSopenharmony_ci
328d4afb5ceSopenharmony_ci	ret = 0;
329d4afb5ceSopenharmony_ci
330d4afb5ceSopenharmony_cibail:
331d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
332d4afb5ceSopenharmony_ci	if (ret)
333d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed +++++++++++++++++++\n", __func__);
334d4afb5ceSopenharmony_ci	else
335d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
336d4afb5ceSopenharmony_ci
337d4afb5ceSopenharmony_ci	return ret;
338d4afb5ceSopenharmony_ci}
339d4afb5ceSopenharmony_ci
340d4afb5ceSopenharmony_ci/* JWE creation using RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256
341d4afb5ceSopenharmony_ci *
342d4afb5ceSopenharmony_ci * This example encrypts a different, larger plaintext using the jwk key from
343d4afb5ceSopenharmony_ci * the test above, and AES_128_CBC_HMAC_SHA_256 for content encryption.
344d4afb5ceSopenharmony_ci */
345d4afb5ceSopenharmony_ci
346d4afb5ceSopenharmony_cistatic const char *rsa256a128_jose =
347d4afb5ceSopenharmony_ci		"{ \"alg\":\"RSA1_5\",\"enc\":\"A128CBC-HS256\"}";
348d4afb5ceSopenharmony_ci
349d4afb5ceSopenharmony_cistatic uint8_t
350d4afb5ceSopenharmony_ci
351d4afb5ceSopenharmony_ci	/* plaintext is 1024 bytes from /dev/urandom */
352d4afb5ceSopenharmony_ci
353d4afb5ceSopenharmony_cira_ptext_1024[] = {
354d4afb5ceSopenharmony_ci		0xfe, 0xc6, 0x4f, 0x3e, 0x4a, 0x19, 0xe9, 0xd7,
355d4afb5ceSopenharmony_ci		0xc2, 0x13, 0xe7, 0xc5, 0x78, 0x6e, 0x71, 0xf6,
356d4afb5ceSopenharmony_ci		0x6e, 0xdd, 0x04, 0xaf, 0xaa, 0x4e, 0xa8, 0xad,
357d4afb5ceSopenharmony_ci		0xd8, 0xe0, 0xb3, 0x32, 0x97, 0x43, 0x7c, 0xd8,
358d4afb5ceSopenharmony_ci		0xd1, 0x5f, 0x56, 0xac, 0x70, 0xaf, 0x7d, 0x0b,
359d4afb5ceSopenharmony_ci		0x40, 0xa1, 0x96, 0x71, 0x7c, 0xc4, 0x4a, 0x37,
360d4afb5ceSopenharmony_ci		0x0b, 0xa6, 0x06, 0xb3, 0x8c, 0x87, 0xee, 0xb6,
361d4afb5ceSopenharmony_ci		0x15, 0xfe, 0xaa, 0x60, 0x7e, 0x7f, 0xdc, 0xb0,
362d4afb5ceSopenharmony_ci		0xff, 0x96, 0x4b, 0x30, 0x60, 0xcf, 0xc6, 0x5d,
363d4afb5ceSopenharmony_ci		0x09, 0x6a, 0x6f, 0x66, 0x0c, 0x5f, 0xb0, 0x6f,
364d4afb5ceSopenharmony_ci		0x61, 0xa6, 0x26, 0x02, 0xbd, 0x46, 0xda, 0xa3,
365d4afb5ceSopenharmony_ci		0x73, 0x19, 0x17, 0xff, 0xe0, 0x5f, 0x30, 0x72,
366d4afb5ceSopenharmony_ci		0x7d, 0x17, 0xd8, 0xb2, 0xbe, 0x84, 0x3e, 0x4d,
367d4afb5ceSopenharmony_ci		0x76, 0xbd, 0x62, 0x5d, 0x63, 0xfe, 0x11, 0x32,
368d4afb5ceSopenharmony_ci		0x11, 0x41, 0xdc, 0xed, 0x96, 0xfd, 0x31, 0x38,
369d4afb5ceSopenharmony_ci		0x6a, 0x84, 0x55, 0x7a, 0x33, 0x3f, 0x37, 0xc3,
370d4afb5ceSopenharmony_ci		0x37, 0x7b, 0xc1, 0xb7, 0x89, 0x00, 0x39, 0xa6,
371d4afb5ceSopenharmony_ci		0x94, 0x91, 0xb7, 0x19, 0x6b, 0x1d, 0x99, 0xeb,
372d4afb5ceSopenharmony_ci		0xf6, 0x10, 0xb9, 0xd2, 0xcd, 0x15, 0x0d, 0xbc,
373d4afb5ceSopenharmony_ci		0x24, 0x34, 0x9a, 0x52, 0x64, 0x21, 0x72, 0x1e,
374d4afb5ceSopenharmony_ci		0x9a, 0x00, 0xf2, 0xcf, 0xf1, 0x7d, 0x1a, 0x12,
375d4afb5ceSopenharmony_ci		0x8d, 0x39, 0xbc, 0xf9, 0x09, 0xfd, 0xd9, 0x22,
376d4afb5ceSopenharmony_ci		0x27, 0x28, 0xe1, 0x3a, 0x0b, 0x82, 0xba, 0x9a,
377d4afb5ceSopenharmony_ci		0xe5, 0x9d, 0xa8, 0x12, 0x6e, 0xf5, 0x4b, 0xc7,
378d4afb5ceSopenharmony_ci		0x2b, 0x9c, 0xdc, 0xfe, 0xf3, 0xe8, 0x74, 0x65,
379d4afb5ceSopenharmony_ci		0x3d, 0xe0, 0xaa, 0x64, 0xf3, 0x43, 0xa4, 0x88,
380d4afb5ceSopenharmony_ci		0xa8, 0xbe, 0x60, 0xdb, 0xfd, 0x2d, 0x3b, 0x84,
381d4afb5ceSopenharmony_ci		0x82, 0x8f, 0x4d, 0xbb, 0xe4, 0xa9, 0x59, 0xe3,
382d4afb5ceSopenharmony_ci		0x6c, 0x52, 0x45, 0xe4, 0x34, 0xdb, 0x28, 0x0e,
383d4afb5ceSopenharmony_ci		0x4a, 0x44, 0xb6, 0x9a, 0x25, 0x9b, 0x3b, 0xae,
384d4afb5ceSopenharmony_ci		0xe1, 0x12, 0x1d, 0x1c, 0x66, 0x7d, 0xb9, 0x5b,
385d4afb5ceSopenharmony_ci		0x5f, 0xc2, 0x4a, 0xaa, 0xd2, 0xe9, 0x65, 0xe2,
386d4afb5ceSopenharmony_ci		0x85, 0x6f, 0xf6, 0x67, 0x66, 0x8e, 0x0b, 0xd2,
387d4afb5ceSopenharmony_ci		0x60, 0xf8, 0x43, 0x60, 0x04, 0x9b, 0xa9, 0x3a,
388d4afb5ceSopenharmony_ci		0x6a, 0x3c, 0x02, 0x3c, 0x08, 0x9d, 0x60, 0x1c,
389d4afb5ceSopenharmony_ci		0xc4, 0x27, 0x3e, 0xff, 0xd0, 0x70, 0x94, 0x43,
390d4afb5ceSopenharmony_ci		0x3e, 0x9e, 0x69, 0x19, 0x22, 0xf0, 0xec, 0x26,
391d4afb5ceSopenharmony_ci		0x2d, 0xa5, 0x71, 0xf3, 0x92, 0x61, 0x95, 0xce,
392d4afb5ceSopenharmony_ci		0xc3, 0xc0, 0xa0, 0xc3, 0x98, 0x22, 0xdd, 0x32,
393d4afb5ceSopenharmony_ci		0x3c, 0x48, 0xcb, 0xd1, 0x61, 0xa0, 0xaa, 0x9a,
394d4afb5ceSopenharmony_ci		0x7e, 0x5a, 0xfa, 0x26, 0x46, 0x49, 0xfc, 0x9c,
395d4afb5ceSopenharmony_ci		0xaa, 0x21, 0x06, 0x45, 0xf1, 0xa0, 0xc9, 0xef,
396d4afb5ceSopenharmony_ci		0x6b, 0x89, 0xf2, 0x01, 0x20, 0x54, 0xfa, 0x0a,
397d4afb5ceSopenharmony_ci		0x23, 0xff, 0xbd, 0x64, 0x35, 0x94, 0xfd, 0x35,
398d4afb5ceSopenharmony_ci		0x70, 0x52, 0x94, 0x66, 0xc5, 0xd0, 0x27, 0xc1,
399d4afb5ceSopenharmony_ci		0x8f, 0x6d, 0xc4, 0xa3, 0x34, 0xc2, 0xea, 0xf0,
400d4afb5ceSopenharmony_ci		0xb3, 0x0d, 0x6c, 0x13, 0xb5, 0xc9, 0x6e, 0x5c,
401d4afb5ceSopenharmony_ci		0xeb, 0x8b, 0x7b, 0xf5, 0x21, 0x4c, 0xe3, 0xb7,
402d4afb5ceSopenharmony_ci		0x73, 0x6d, 0x07, 0xaa, 0x44, 0xc4, 0xba, 0xc5,
403d4afb5ceSopenharmony_ci		0xa5, 0x0e, 0x75, 0x28, 0xb7, 0x50, 0x22, 0x54,
404d4afb5ceSopenharmony_ci		0xa7, 0xe1, 0x2e, 0xfd, 0x20, 0xcd, 0xa4, 0x31,
405d4afb5ceSopenharmony_ci		0xa3, 0xb2, 0x73, 0x98, 0x7c, 0x3c, 0x8f, 0xa3,
406d4afb5ceSopenharmony_ci		0x40, 0x8a, 0xaf, 0x31, 0xfa, 0xf9, 0x70, 0x4d,
407d4afb5ceSopenharmony_ci		0x83, 0x10, 0xc4, 0xa0, 0x9c, 0xd6, 0xa3, 0xd5,
408d4afb5ceSopenharmony_ci		0x07, 0xaf, 0xaf, 0x35, 0x15, 0xd0, 0x84, 0x09,
409d4afb5ceSopenharmony_ci		0x20, 0x36, 0x88, 0xac, 0x6f, 0x16, 0x5e, 0x03,
410d4afb5ceSopenharmony_ci		0xa9, 0xfc, 0xb3, 0x2d, 0x01, 0x57, 0xb3, 0xed,
411d4afb5ceSopenharmony_ci		0x4b, 0x55, 0x2b, 0xbc, 0x92, 0x87, 0x3e, 0x27,
412d4afb5ceSopenharmony_ci		0xc4, 0x2c, 0x44, 0xac, 0x05, 0x5f, 0x26, 0xe7,
413d4afb5ceSopenharmony_ci		0xe9, 0xb0, 0x2d, 0x6b, 0x3c, 0x8c, 0xd2, 0xb4,
414d4afb5ceSopenharmony_ci		0x3c, 0xb4, 0x86, 0xfe, 0x68, 0x99, 0x2a, 0x42,
415d4afb5ceSopenharmony_ci		0xac, 0xa4, 0xb3, 0x89, 0x61, 0xb3, 0xd1, 0xdf,
416d4afb5ceSopenharmony_ci		0x9b, 0x58, 0xc7, 0x81, 0x62, 0x87, 0x26, 0x52,
417d4afb5ceSopenharmony_ci		0x51, 0xe7, 0x7d, 0x7c, 0x37, 0x14, 0xe5, 0x19,
418d4afb5ceSopenharmony_ci		0x28, 0x34, 0x3e, 0x95, 0x17, 0x36, 0x12, 0xf9,
419d4afb5ceSopenharmony_ci		0x5e, 0xc1, 0x3c, 0x9c, 0x28, 0x70, 0x06, 0xdf,
420d4afb5ceSopenharmony_ci		0xc4, 0x6d, 0x25, 0x04, 0x46, 0xe0, 0x95, 0xf0,
421d4afb5ceSopenharmony_ci		0xc8, 0x57, 0x48, 0x27, 0x26, 0xf3, 0xf7, 0x19,
422d4afb5ceSopenharmony_ci		0xbe, 0xea, 0xb4, 0xd4, 0x64, 0xaf, 0x67, 0x7c,
423d4afb5ceSopenharmony_ci		0xf5, 0xa9, 0xfb, 0x85, 0x4a, 0x43, 0x9c, 0x62,
424d4afb5ceSopenharmony_ci		0x06, 0x5e, 0x28, 0x2a, 0x7b, 0x1e, 0xb3, 0x07,
425d4afb5ceSopenharmony_ci		0xe7, 0x19, 0x32, 0xa4, 0x4e, 0xb4, 0xce, 0xe0,
426d4afb5ceSopenharmony_ci		0x92, 0x56, 0xf5, 0x10, 0xcb, 0x56, 0x34, 0x4b,
427d4afb5ceSopenharmony_ci		0x0d, 0xe1, 0xd3, 0x6d, 0xfe, 0xf0, 0x44, 0xf7,
428d4afb5ceSopenharmony_ci		0x22, 0x1d, 0x5e, 0x6b, 0xa7, 0xa5, 0x83, 0x2e,
429d4afb5ceSopenharmony_ci		0xeb, 0x14, 0xf2, 0xd7, 0x27, 0x5a, 0x2a, 0xd2,
430d4afb5ceSopenharmony_ci		0x55, 0x35, 0xe6, 0x7e, 0xd9, 0x3b, 0xac, 0x4e,
431d4afb5ceSopenharmony_ci		0x5a, 0x22, 0x46, 0xd5, 0x7b, 0x57, 0x9c, 0x58,
432d4afb5ceSopenharmony_ci		0xfe, 0xd0, 0xda, 0xbf, 0x7d, 0xe9, 0x8c, 0xb7,
433d4afb5ceSopenharmony_ci		0xba, 0x88, 0xf1, 0xc3, 0x82, 0x53, 0xc3, 0x66,
434d4afb5ceSopenharmony_ci		0x20, 0x51, 0x12, 0xd3, 0xf9, 0xaf, 0xe9, 0xcb,
435d4afb5ceSopenharmony_ci		0xc1, 0x7a, 0xe6, 0x22, 0x44, 0xa5, 0xdf, 0x18,
436d4afb5ceSopenharmony_ci		0xb3, 0x6e, 0x6c, 0xba, 0xf3, 0xc6, 0x24, 0x5a,
437d4afb5ceSopenharmony_ci		0x1c, 0x67, 0xa6, 0xa5, 0xb4, 0xb1, 0x35, 0xdf,
438d4afb5ceSopenharmony_ci		0x5a, 0x60, 0x5c, 0x0b, 0x66, 0xd3, 0x1f, 0x4e,
439d4afb5ceSopenharmony_ci		0x7c, 0xcb, 0x93, 0x7e, 0x2f, 0x6d, 0xbd, 0xce,
440d4afb5ceSopenharmony_ci		0x26, 0x52, 0x44, 0xee, 0xbb, 0xd8, 0x8f, 0xf2,
441d4afb5ceSopenharmony_ci		0x67, 0x38, 0x0d, 0x3b, 0xaa, 0x21, 0x73, 0xf8,
442d4afb5ceSopenharmony_ci		0x3b, 0x54, 0x9d, 0x4e, 0x5e, 0xf1, 0xa2, 0x18,
443d4afb5ceSopenharmony_ci		0x5a, 0xf1, 0x6c, 0x32, 0xbf, 0x0a, 0x73, 0x14,
444d4afb5ceSopenharmony_ci		0x48, 0x4f, 0x56, 0xc0, 0x87, 0x6d, 0x3b, 0x16,
445d4afb5ceSopenharmony_ci		0xcc, 0x3f, 0x44, 0x19, 0x85, 0x22, 0x43, 0x5f,
446d4afb5ceSopenharmony_ci		0x8c, 0x29, 0xbd, 0xa0, 0xce, 0x84, 0xd9, 0x4a,
447d4afb5ceSopenharmony_ci		0xcf, 0x00, 0x6b, 0x37, 0x35, 0xe0, 0xb3, 0xc9,
448d4afb5ceSopenharmony_ci		0xd1, 0x58, 0xd1, 0x1b, 0xc3, 0x6f, 0xe3, 0x50,
449d4afb5ceSopenharmony_ci		0xdb, 0xa6, 0x5e, 0x03, 0x18, 0xe5, 0xe2, 0xc1,
450d4afb5ceSopenharmony_ci		0x97, 0xd5, 0xf8, 0x42, 0x6f, 0xe6, 0x61, 0x80,
451d4afb5ceSopenharmony_ci		0xc9, 0x7c, 0xc6, 0x83, 0xf0, 0xad, 0x70, 0x13,
452d4afb5ceSopenharmony_ci		0x0e, 0x26, 0x75, 0xc0, 0x12, 0x23, 0x14, 0xef,
453d4afb5ceSopenharmony_ci		0x1f, 0xdf, 0xfd, 0x47, 0x99, 0x9f, 0x22, 0xf3,
454d4afb5ceSopenharmony_ci		0x57, 0x21, 0xdc, 0x38, 0xe4, 0x79, 0x87, 0x5b,
455d4afb5ceSopenharmony_ci		0x67, 0x66, 0xdd, 0x0b, 0xe0, 0xae, 0xb5, 0x97,
456d4afb5ceSopenharmony_ci		0xd8, 0xa6, 0x5d, 0x02, 0xcf, 0x6b, 0x84, 0x19,
457d4afb5ceSopenharmony_ci		0xc1, 0xbb, 0x25, 0xd2, 0x10, 0xb9, 0x63, 0xeb,
458d4afb5ceSopenharmony_ci		0x4b, 0x27, 0x8d, 0x05, 0x31, 0xce, 0x3b, 0x0c,
459d4afb5ceSopenharmony_ci		0x5f, 0xd4, 0x83, 0x47, 0xa4, 0x8b, 0xc4, 0x76,
460d4afb5ceSopenharmony_ci		0x33, 0x74, 0x1a, 0x07, 0xf8, 0x18, 0x82, 0x1c,
461d4afb5ceSopenharmony_ci		0x8e, 0x01, 0x75, 0x78, 0xea, 0xd9, 0x72, 0x61,
462d4afb5ceSopenharmony_ci		0x71, 0xa9, 0x09, 0x44, 0x7b, 0x0f, 0x12, 0xcf,
463d4afb5ceSopenharmony_ci		0x4c, 0x76, 0x7b, 0x69, 0xc8, 0x64, 0x98, 0x60,
464d4afb5ceSopenharmony_ci		0x45, 0xb6, 0xc7, 0x6b, 0xd8, 0x43, 0x99, 0x08,
465d4afb5ceSopenharmony_ci		0xc9, 0xd3, 0x6f, 0x01, 0x4f, 0x57, 0x6f, 0x49,
466d4afb5ceSopenharmony_ci		0x4f, 0x4f, 0x72, 0xa4, 0xa2, 0x45, 0xe1, 0x0e,
467d4afb5ceSopenharmony_ci		0xf2, 0x08, 0x3e, 0x67, 0xc3, 0x83, 0x5b, 0xb1,
468d4afb5ceSopenharmony_ci		0x24, 0xc0, 0xe0, 0x3a, 0xf5, 0x1f, 0xf2, 0x06,
469d4afb5ceSopenharmony_ci		0x4b, 0xa7, 0x6f, 0xd2, 0xb2, 0x81, 0x96, 0x91,
470d4afb5ceSopenharmony_ci		0x42, 0xb1, 0x53, 0x65, 0x3a, 0x12, 0xcd, 0x33,
471d4afb5ceSopenharmony_ci		0xb3, 0x7e, 0x79, 0xc0, 0x46, 0xf6, 0xd8, 0x4a,
472d4afb5ceSopenharmony_ci		0x22, 0x35, 0xb8, 0x3f, 0xe4, 0x08, 0x88, 0x49,
473d4afb5ceSopenharmony_ci		0x3c, 0x73, 0x9a, 0x44, 0xe3, 0x3b, 0xcc, 0xc4,
474d4afb5ceSopenharmony_ci		0xae, 0x7c, 0xbe, 0xfd, 0xa6, 0x4a, 0xd4, 0x26,
475d4afb5ceSopenharmony_ci		0x52, 0x58, 0x81, 0x30, 0x66, 0x44, 0x54, 0xc8,
476d4afb5ceSopenharmony_ci		0xe4, 0x7c, 0x5b, 0x63, 0x06, 0x60, 0x94, 0x62,
477d4afb5ceSopenharmony_ci		0xe5, 0x47, 0x45, 0xfb, 0x58, 0xf5, 0x6a, 0x7c,
478d4afb5ceSopenharmony_ci		0xb2, 0x35, 0x08, 0x03, 0x15, 0x68, 0xb3, 0x13,
479d4afb5ceSopenharmony_ci		0xa5, 0xbd, 0xf2, 0x1e, 0x2e, 0x1c, 0x8f, 0xc6,
480d4afb5ceSopenharmony_ci		0xc7, 0xd1, 0xa9, 0x64, 0x37, 0x2b, 0x23, 0xfa,
481d4afb5ceSopenharmony_ci		0x7e, 0x56, 0x22, 0xf0, 0x8a, 0xbd, 0xeb, 0x04
482d4afb5ceSopenharmony_ci},
483d4afb5ceSopenharmony_ci
484d4afb5ceSopenharmony_cir256a128_cek[] = {
485d4afb5ceSopenharmony_ci		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
486d4afb5ceSopenharmony_ci		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
487d4afb5ceSopenharmony_ci		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
488d4afb5ceSopenharmony_ci		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
489d4afb5ceSopenharmony_ci}
490d4afb5ceSopenharmony_ci;
491d4afb5ceSopenharmony_ci
492d4afb5ceSopenharmony_cistatic int
493d4afb5ceSopenharmony_citest_jwe_ra_ptext_1024(struct lws_context *context, char *jwk_txt, int jwk_len)
494d4afb5ceSopenharmony_ci{
495d4afb5ceSopenharmony_ci	char temp[4096], compact[4096];
496d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
497d4afb5ceSopenharmony_ci	int n, ret = -1, temp_len = sizeof(temp);
498d4afb5ceSopenharmony_ci
499d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
500d4afb5ceSopenharmony_ci
501d4afb5ceSopenharmony_ci	/* reuse the rsa private key from the JWE Appendix 2 test above */
502d4afb5ceSopenharmony_ci
503d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) < 0) {
504d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
505d4afb5ceSopenharmony_ci		goto bail;
506d4afb5ceSopenharmony_ci	}
507d4afb5ceSopenharmony_ci
508d4afb5ceSopenharmony_ci	/* dup the plaintext, it will be replaced in-situ by the ciphertext */
509d4afb5ceSopenharmony_ci
510d4afb5ceSopenharmony_ci	if (lws_jws_dup_element(&jwe.jws.map, LJWE_CTXT,
511d4afb5ceSopenharmony_ci				lws_concat_temp(temp, temp_len), &temp_len,
512d4afb5ceSopenharmony_ci				ra_ptext_1024, sizeof(ra_ptext_1024),
513d4afb5ceSopenharmony_ci				lws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,
514d4afb5ceSopenharmony_ci						      sizeof(ra_ptext_1024)))) {
515d4afb5ceSopenharmony_ci		lwsl_notice("%s: Not enough temp space for ptext\n", __func__);
516d4afb5ceSopenharmony_ci		goto bail;
517d4afb5ceSopenharmony_ci	}
518d4afb5ceSopenharmony_ci
519d4afb5ceSopenharmony_ci	/* dup the cek, since it will be replaced by the encrypted key */
520d4afb5ceSopenharmony_ci
521d4afb5ceSopenharmony_ci	if (lws_jws_dup_element(&jwe.jws.map, LJWE_EKEY,
522d4afb5ceSopenharmony_ci				lws_concat_temp(temp, temp_len), &temp_len,
523d4afb5ceSopenharmony_ci				r256a128_cek, sizeof(r256a128_cek),
524d4afb5ceSopenharmony_ci				LWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {
525d4afb5ceSopenharmony_ci		lwsl_notice("%s: Not enough temp space for EKEY\n", __func__);
526d4afb5ceSopenharmony_ci		goto bail;
527d4afb5ceSopenharmony_ci	}
528d4afb5ceSopenharmony_ci
529d4afb5ceSopenharmony_ci	jwe.jws.map.buf[LJWE_JOSE] = rsa256a128_jose;
530d4afb5ceSopenharmony_ci	jwe.jws.map.len[LJWE_JOSE] = (uint32_t)strlen(rsa256a128_jose);
531d4afb5ceSopenharmony_ci
532d4afb5ceSopenharmony_ci	n = lws_jwe_parse_jose(&jwe.jose, jwe.jws.map.buf[LJWE_JOSE],
533d4afb5ceSopenharmony_ci			       (int)jwe.jws.map.len[LJWE_JOSE],
534d4afb5ceSopenharmony_ci			       lws_concat_temp(temp, temp_len), &temp_len);
535d4afb5ceSopenharmony_ci	if (n < 0) {
536d4afb5ceSopenharmony_ci		lwsl_err("%s: JOSE parse failed\n", __func__);
537d4afb5ceSopenharmony_ci
538d4afb5ceSopenharmony_ci		goto bail;
539d4afb5ceSopenharmony_ci	}
540d4afb5ceSopenharmony_ci
541d4afb5ceSopenharmony_ci	n = lws_jwe_encrypt(&jwe, lws_concat_temp(temp, temp_len),
542d4afb5ceSopenharmony_ci			    &temp_len);
543d4afb5ceSopenharmony_ci	if (n < 0) {
544d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_encrypt failed\n", __func__);
545d4afb5ceSopenharmony_ci		goto bail;
546d4afb5ceSopenharmony_ci	}
547d4afb5ceSopenharmony_ci
548d4afb5ceSopenharmony_ci	n = lws_jwe_render_compact(&jwe, compact, sizeof(compact));
549d4afb5ceSopenharmony_ci	if (n < 0) {
550d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_render_compact failed: %d\n", __func__, n);
551d4afb5ceSopenharmony_ci		goto bail;
552d4afb5ceSopenharmony_ci	}
553d4afb5ceSopenharmony_ci
554d4afb5ceSopenharmony_ci	// puts(compact);
555d4afb5ceSopenharmony_ci
556d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
557d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
558d4afb5ceSopenharmony_ci	temp_len = sizeof(temp);
559d4afb5ceSopenharmony_ci
560d4afb5ceSopenharmony_ci	/* now we created the encrypted version, see if we can decrypt it */
561d4afb5ceSopenharmony_ci
562d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) < 0) {
563d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
564d4afb5ceSopenharmony_ci		goto bail;
565d4afb5ceSopenharmony_ci	}
566d4afb5ceSopenharmony_ci
567d4afb5ceSopenharmony_ci	if (lws_jws_compact_decode(compact, n, &jwe.jws.map, &jwe.jws.map_b64,
568d4afb5ceSopenharmony_ci				   temp, &temp_len) != 5) {
569d4afb5ceSopenharmony_ci		lwsl_err("%s: failed to parse generated compact\n", __func__);
570d4afb5ceSopenharmony_ci
571d4afb5ceSopenharmony_ci		goto bail;
572d4afb5ceSopenharmony_ci	}
573d4afb5ceSopenharmony_ci
574d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt(&jwe, lws_concat_temp(temp, temp_len),
575d4afb5ceSopenharmony_ci				     &temp_len);
576d4afb5ceSopenharmony_ci	if (n < 0) {
577d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_auth_and_decrypt failed\n",
578d4afb5ceSopenharmony_ci			 __func__);
579d4afb5ceSopenharmony_ci		goto bail;
580d4afb5ceSopenharmony_ci	}
581d4afb5ceSopenharmony_ci
582d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
583d4afb5ceSopenharmony_ci	if (jwe.jws.map.len[LJWE_CTXT] < sizeof(ra_ptext_1024) ||
584d4afb5ceSopenharmony_ci	    lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,
585d4afb5ceSopenharmony_ci			        sizeof(ra_ptext_1024))) {
586d4afb5ceSopenharmony_ci		lwsl_err("%s: plaintext AES decrypt wrong\n", __func__);
587d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));
588d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],
589d4afb5ceSopenharmony_ci				    jwe.jws.map.len[LJWE_CTXT]);
590d4afb5ceSopenharmony_ci		goto bail;
591d4afb5ceSopenharmony_ci	}
592d4afb5ceSopenharmony_ci
593d4afb5ceSopenharmony_ci	ret = 0;
594d4afb5ceSopenharmony_ci
595d4afb5ceSopenharmony_cibail:
596d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
597d4afb5ceSopenharmony_ci
598d4afb5ceSopenharmony_ci	if (ret)
599d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed +++++++++++++++++++\n", __func__);
600d4afb5ceSopenharmony_ci	else
601d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
602d4afb5ceSopenharmony_ci
603d4afb5ceSopenharmony_ci	return ret;
604d4afb5ceSopenharmony_ci}
605d4afb5ceSopenharmony_ci
606d4afb5ceSopenharmony_cistatic const char *rsa256a192_jose =
607d4afb5ceSopenharmony_ci		"{ \"alg\":\"RSA1_5\",\"enc\":\"A192CBC-HS384\"}";
608d4afb5ceSopenharmony_ci
609d4afb5ceSopenharmony_cistatic const uint8_t r256a192_cek[] = {
610d4afb5ceSopenharmony_ci		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
611d4afb5ceSopenharmony_ci		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
612d4afb5ceSopenharmony_ci		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
613d4afb5ceSopenharmony_ci		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
614d4afb5ceSopenharmony_ci		0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
615d4afb5ceSopenharmony_ci		0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
616d4afb5ceSopenharmony_ci}
617d4afb5ceSopenharmony_ci;
618d4afb5ceSopenharmony_ci
619d4afb5ceSopenharmony_cistatic int
620d4afb5ceSopenharmony_citest_jwe_r256a192_ptext(struct lws_context *context, char *jwk_txt, int jwk_len)
621d4afb5ceSopenharmony_ci{
622d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
623d4afb5ceSopenharmony_ci	char temp[4096], compact[4096];
624d4afb5ceSopenharmony_ci	int n, ret = -1, temp_len = sizeof(temp);
625d4afb5ceSopenharmony_ci
626d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
627d4afb5ceSopenharmony_ci
628d4afb5ceSopenharmony_ci	/* reuse the rsa private key from the JWE Appendix 2 test above */
629d4afb5ceSopenharmony_ci
630d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) < 0) {
631d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
632d4afb5ceSopenharmony_ci		goto bail;
633d4afb5ceSopenharmony_ci	}
634d4afb5ceSopenharmony_ci
635d4afb5ceSopenharmony_ci	/*
636d4afb5ceSopenharmony_ci	 * dup the plaintext into the ciphertext element, it will be
637d4afb5ceSopenharmony_ci	 * encrypted in-place to a ciphertext of the same length + padding
638d4afb5ceSopenharmony_ci	 */
639d4afb5ceSopenharmony_ci
640d4afb5ceSopenharmony_ci	if (lws_jws_dup_element(&jwe.jws.map, LJWE_CTXT,
641d4afb5ceSopenharmony_ci				lws_concat_temp(temp, temp_len), &temp_len,
642d4afb5ceSopenharmony_ci				ra_ptext_1024, sizeof(ra_ptext_1024),
643d4afb5ceSopenharmony_ci				lws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,
644d4afb5ceSopenharmony_ci						      sizeof(ra_ptext_1024)))) {
645d4afb5ceSopenharmony_ci		lwsl_notice("%s: Not enough temp space for ptext\n", __func__);
646d4afb5ceSopenharmony_ci		goto bail;
647d4afb5ceSopenharmony_ci	}
648d4afb5ceSopenharmony_ci
649d4afb5ceSopenharmony_ci	/* copy the cek, since it will be replaced by the encrypted key */
650d4afb5ceSopenharmony_ci
651d4afb5ceSopenharmony_ci	if (lws_jws_dup_element(&jwe.jws.map, LJWE_EKEY,
652d4afb5ceSopenharmony_ci				lws_concat_temp(temp, temp_len), &temp_len,
653d4afb5ceSopenharmony_ci				r256a192_cek, sizeof(r256a192_cek),
654d4afb5ceSopenharmony_ci				LWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {
655d4afb5ceSopenharmony_ci		lwsl_err("Problem getting random\n");
656d4afb5ceSopenharmony_ci		goto bail;
657d4afb5ceSopenharmony_ci	}
658d4afb5ceSopenharmony_ci
659d4afb5ceSopenharmony_ci	jwe.jws.map.buf[LJWE_JOSE] = rsa256a192_jose;
660d4afb5ceSopenharmony_ci	jwe.jws.map.len[LJWE_JOSE] = (uint32_t)strlen(rsa256a192_jose);
661d4afb5ceSopenharmony_ci
662d4afb5ceSopenharmony_ci	n = lws_jwe_parse_jose(&jwe.jose, jwe.jws.map.buf[LJWE_JOSE],
663d4afb5ceSopenharmony_ci			       (int)jwe.jws.map.len[LJWE_JOSE],
664d4afb5ceSopenharmony_ci			       lws_concat_temp(temp, temp_len), &temp_len);
665d4afb5ceSopenharmony_ci	if (n < 0) {
666d4afb5ceSopenharmony_ci		lwsl_err("%s: JOSE parse failed\n", __func__);
667d4afb5ceSopenharmony_ci
668d4afb5ceSopenharmony_ci		goto bail;
669d4afb5ceSopenharmony_ci	}
670d4afb5ceSopenharmony_ci
671d4afb5ceSopenharmony_ci	n = lws_jwe_encrypt(&jwe, lws_concat_temp(temp, temp_len),
672d4afb5ceSopenharmony_ci			    &temp_len);
673d4afb5ceSopenharmony_ci	if (n < 0) {
674d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_encrypt failed\n", __func__);
675d4afb5ceSopenharmony_ci		goto bail;
676d4afb5ceSopenharmony_ci	}
677d4afb5ceSopenharmony_ci
678d4afb5ceSopenharmony_ci	n = lws_jwe_render_compact(&jwe, compact, sizeof(compact));
679d4afb5ceSopenharmony_ci	if (n < 0) {
680d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_render_compact failed: %d\n", __func__, n);
681d4afb5ceSopenharmony_ci		goto bail;
682d4afb5ceSopenharmony_ci	}
683d4afb5ceSopenharmony_ci
684d4afb5ceSopenharmony_ci	// puts(compact);
685d4afb5ceSopenharmony_ci
686d4afb5ceSopenharmony_ci	/* now we created the encrypted version, see if we can decrypt it */
687d4afb5ceSopenharmony_ci
688d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
689d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
690d4afb5ceSopenharmony_ci
691d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) < 0) {
692d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
693d4afb5ceSopenharmony_ci		goto bail;
694d4afb5ceSopenharmony_ci	}
695d4afb5ceSopenharmony_ci
696d4afb5ceSopenharmony_ci	if (lws_jws_compact_decode(compact, n, &jwe.jws.map, &jwe.jws.map_b64,
697d4afb5ceSopenharmony_ci				   temp, &temp_len) != 5) {
698d4afb5ceSopenharmony_ci		lwsl_err("%s: failed to parse generated compact\n", __func__);
699d4afb5ceSopenharmony_ci
700d4afb5ceSopenharmony_ci		goto bail;
701d4afb5ceSopenharmony_ci	}
702d4afb5ceSopenharmony_ci
703d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt(&jwe, lws_concat_temp(temp, temp_len),
704d4afb5ceSopenharmony_ci				     &temp_len);
705d4afb5ceSopenharmony_ci	if (n < 0) {
706d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_auth_and_decrypt failed\n",
707d4afb5ceSopenharmony_ci			 __func__);
708d4afb5ceSopenharmony_ci		goto bail;
709d4afb5ceSopenharmony_ci	}
710d4afb5ceSopenharmony_ci
711d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
712d4afb5ceSopenharmony_ci	if (jwe.jws.map.len[LJWE_CTXT] < sizeof(ra_ptext_1024) ||
713d4afb5ceSopenharmony_ci	    lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,
714d4afb5ceSopenharmony_ci			        sizeof(ra_ptext_1024))) {
715d4afb5ceSopenharmony_ci		lwsl_err("%s: plaintext AES decrypt wrong\n", __func__);
716d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));
717d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],
718d4afb5ceSopenharmony_ci				    jwe.jws.map.len[LJWE_CTXT]);
719d4afb5ceSopenharmony_ci		goto bail;
720d4afb5ceSopenharmony_ci	}
721d4afb5ceSopenharmony_ci
722d4afb5ceSopenharmony_ci	ret = 0;
723d4afb5ceSopenharmony_ci
724d4afb5ceSopenharmony_cibail:
725d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
726d4afb5ceSopenharmony_ci
727d4afb5ceSopenharmony_ci	if (ret)
728d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed +++++++++++++++++++\n", __func__);
729d4afb5ceSopenharmony_ci	else
730d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
731d4afb5ceSopenharmony_ci
732d4afb5ceSopenharmony_ci	return ret;
733d4afb5ceSopenharmony_ci}
734d4afb5ceSopenharmony_ci
735d4afb5ceSopenharmony_ci
736d4afb5ceSopenharmony_cistatic const char *rsa256a256_jose =
737d4afb5ceSopenharmony_ci		"{ \"alg\":\"RSA1_5\",\"enc\":\"A256CBC-HS512\"}";
738d4afb5ceSopenharmony_ci
739d4afb5ceSopenharmony_cistatic const uint8_t r256a256_cek[] = {
740d4afb5ceSopenharmony_ci		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
741d4afb5ceSopenharmony_ci		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
742d4afb5ceSopenharmony_ci		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
743d4afb5ceSopenharmony_ci		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
744d4afb5ceSopenharmony_ci		0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
745d4afb5ceSopenharmony_ci		0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
746d4afb5ceSopenharmony_ci		0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
747d4afb5ceSopenharmony_ci		0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
748d4afb5ceSopenharmony_ci}
749d4afb5ceSopenharmony_ci;
750d4afb5ceSopenharmony_ci
751d4afb5ceSopenharmony_cistatic int
752d4afb5ceSopenharmony_citest_jwe_r256a256_ptext(struct lws_context *context, char *jwk_txt, int jwk_len)
753d4afb5ceSopenharmony_ci{
754d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
755d4afb5ceSopenharmony_ci	char temp[4096], compact[4096];
756d4afb5ceSopenharmony_ci	int n, ret = -1, temp_len = sizeof(temp);
757d4afb5ceSopenharmony_ci
758d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
759d4afb5ceSopenharmony_ci
760d4afb5ceSopenharmony_ci	/* reuse the rsa private key from the JWE Appendix 2 test above */
761d4afb5ceSopenharmony_ci
762d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) < 0) {
763d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
764d4afb5ceSopenharmony_ci		goto bail;
765d4afb5ceSopenharmony_ci	}
766d4afb5ceSopenharmony_ci
767d4afb5ceSopenharmony_ci	/*
768d4afb5ceSopenharmony_ci	 * dup the plaintext into the ciphertext element, it will be
769d4afb5ceSopenharmony_ci	 * encrypted in-place to a ciphertext of the same length + padding
770d4afb5ceSopenharmony_ci	 */
771d4afb5ceSopenharmony_ci
772d4afb5ceSopenharmony_ci	if (lws_jws_dup_element(&jwe.jws.map, LJWE_CTXT,
773d4afb5ceSopenharmony_ci				lws_concat_temp(temp, temp_len), &temp_len,
774d4afb5ceSopenharmony_ci				ra_ptext_1024, sizeof(ra_ptext_1024),
775d4afb5ceSopenharmony_ci				lws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,
776d4afb5ceSopenharmony_ci						      sizeof(ra_ptext_1024)))) {
777d4afb5ceSopenharmony_ci		lwsl_notice("%s: Not enough temp space for ptext\n", __func__);
778d4afb5ceSopenharmony_ci		goto bail;
779d4afb5ceSopenharmony_ci	}
780d4afb5ceSopenharmony_ci
781d4afb5ceSopenharmony_ci	/* copy the cek, since it will be replaced by the encrypted key */
782d4afb5ceSopenharmony_ci
783d4afb5ceSopenharmony_ci	if (lws_jws_dup_element(&jwe.jws.map, LJWE_EKEY,
784d4afb5ceSopenharmony_ci				lws_concat_temp(temp, temp_len), &temp_len,
785d4afb5ceSopenharmony_ci				r256a256_cek, sizeof(r256a256_cek),
786d4afb5ceSopenharmony_ci				LWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {
787d4afb5ceSopenharmony_ci		lwsl_err("Problem getting random\n");
788d4afb5ceSopenharmony_ci		goto bail;
789d4afb5ceSopenharmony_ci	}
790d4afb5ceSopenharmony_ci
791d4afb5ceSopenharmony_ci	jwe.jws.map.buf[LJWE_JOSE] = rsa256a256_jose;
792d4afb5ceSopenharmony_ci	jwe.jws.map.len[LJWE_JOSE] = (uint32_t)strlen(rsa256a256_jose);
793d4afb5ceSopenharmony_ci
794d4afb5ceSopenharmony_ci	n = lws_jwe_parse_jose(&jwe.jose, rsa256a256_jose,
795d4afb5ceSopenharmony_ci			       (int)strlen(rsa256a256_jose),
796d4afb5ceSopenharmony_ci			       lws_concat_temp(temp, temp_len), &temp_len);
797d4afb5ceSopenharmony_ci	if (n < 0) {
798d4afb5ceSopenharmony_ci		lwsl_err("%s: JOSE parse failed\n", __func__);
799d4afb5ceSopenharmony_ci
800d4afb5ceSopenharmony_ci		goto bail;
801d4afb5ceSopenharmony_ci	}
802d4afb5ceSopenharmony_ci
803d4afb5ceSopenharmony_ci	n = lws_jwe_encrypt(&jwe, lws_concat_temp(temp, temp_len),
804d4afb5ceSopenharmony_ci			    &temp_len);
805d4afb5ceSopenharmony_ci	if (n < 0) {
806d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_encrypt failed\n", __func__);
807d4afb5ceSopenharmony_ci		goto bail;
808d4afb5ceSopenharmony_ci	}
809d4afb5ceSopenharmony_ci
810d4afb5ceSopenharmony_ci	n = lws_jwe_render_compact(&jwe, compact, sizeof(compact));
811d4afb5ceSopenharmony_ci	if (n < 0) {
812d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_render_compact failed: %d\n", __func__, n);
813d4afb5ceSopenharmony_ci		goto bail;
814d4afb5ceSopenharmony_ci	}
815d4afb5ceSopenharmony_ci
816d4afb5ceSopenharmony_ci	// puts(compact);
817d4afb5ceSopenharmony_ci
818d4afb5ceSopenharmony_ci	/* now we created the encrypted version, see if we can decrypt it */
819d4afb5ceSopenharmony_ci
820d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
821d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
822d4afb5ceSopenharmony_ci
823d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) < 0) {
824d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
825d4afb5ceSopenharmony_ci		goto bail;
826d4afb5ceSopenharmony_ci	}
827d4afb5ceSopenharmony_ci
828d4afb5ceSopenharmony_ci	if (lws_jws_compact_decode(compact, n, &jwe.jws.map, &jwe.jws.map_b64,
829d4afb5ceSopenharmony_ci				   temp, &temp_len) != 5) {
830d4afb5ceSopenharmony_ci		lwsl_err("%s: failed to parse generated compact\n", __func__);
831d4afb5ceSopenharmony_ci
832d4afb5ceSopenharmony_ci		goto bail;
833d4afb5ceSopenharmony_ci	}
834d4afb5ceSopenharmony_ci
835d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt(&jwe, lws_concat_temp(temp, temp_len),
836d4afb5ceSopenharmony_ci				     &temp_len);
837d4afb5ceSopenharmony_ci	if (n < 0) {
838d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_auth_and_decrypt failed\n",
839d4afb5ceSopenharmony_ci			 __func__);
840d4afb5ceSopenharmony_ci		goto bail;
841d4afb5ceSopenharmony_ci	}
842d4afb5ceSopenharmony_ci
843d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
844d4afb5ceSopenharmony_ci	if (jwe.jws.map.len[LJWE_CTXT] < sizeof(ra_ptext_1024) ||
845d4afb5ceSopenharmony_ci	    lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,
846d4afb5ceSopenharmony_ci			        sizeof(ra_ptext_1024))) {
847d4afb5ceSopenharmony_ci		lwsl_err("%s: plaintext AES decrypt wrong\n", __func__);
848d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));
849d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],
850d4afb5ceSopenharmony_ci				    jwe.jws.map.len[LJWE_CTXT]);
851d4afb5ceSopenharmony_ci		goto bail;
852d4afb5ceSopenharmony_ci	}
853d4afb5ceSopenharmony_ci
854d4afb5ceSopenharmony_ci	ret = 0;
855d4afb5ceSopenharmony_ci
856d4afb5ceSopenharmony_cibail:
857d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
858d4afb5ceSopenharmony_ci
859d4afb5ceSopenharmony_ci	if (ret)
860d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed +++++++++++++++++++\n", __func__);
861d4afb5ceSopenharmony_ci	else
862d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
863d4afb5ceSopenharmony_ci
864d4afb5ceSopenharmony_ci	return ret;
865d4afb5ceSopenharmony_ci}
866d4afb5ceSopenharmony_ci
867d4afb5ceSopenharmony_ci/* produced by running the minimal example `lws-crypto-jwk -t RSA -b 2048 -c` */
868d4afb5ceSopenharmony_ci
869d4afb5ceSopenharmony_cistatic const char *rsa_key_2048 =
870d4afb5ceSopenharmony_ci	"{"
871d4afb5ceSopenharmony_ci		"\"e\":\"AQAB\","
872d4afb5ceSopenharmony_ci		"\"kty\":\"RSA\","
873d4afb5ceSopenharmony_ci		"\"n\":\"lBJdvUq-9_8hlcduIWuBjRb0tGzzAvS4foqoNCO7g-rOXMdeAcmq"
874d4afb5ceSopenharmony_ci		 "aSzWTbkaGIc3L1I4-Q3TOZtxn2UhuDlShZRIhM6JCQuUVNVAF3TD7oXxHtZ"
875d4afb5ceSopenharmony_ci		 "LJ7y_BqCUlrAmW31lu-nVmhY2G3xW26yXWUsDbCxz0hfLbVnXRSvVKLzYWm"
876d4afb5ceSopenharmony_ci		 "_yyrFyEWfxB8peDocvKGh879z_aPCKE3PDOEl2AsgzYfpnWCLytkgnrTeL6"
877d4afb5ceSopenharmony_ci		 "qY8HXxvvV-Jw-XMaRiwH0VldpIjs4DaoN35Kj1Ex7QOZznTkbYtMIqse8bR"
878d4afb5ceSopenharmony_ci		 "LoR8Irkxbc5ncUAuX1KSV6lpPtelsA3RtEjJ4NHV-5eEABiYh8_CFQ\","
879d4afb5ceSopenharmony_ci		"\"d\":\"DDpguQ9RVQFMoJC5z2hlkvq91kvsXPv2Y9Dcki256xYlg55H7Pre"
880d4afb5ceSopenharmony_ci		 "p__hahrABR2Jg6QVJhArt5ABjUnDQ_JL69HH6VvLD6RVVBTQ-FRBZ_3HYKY"
881d4afb5ceSopenharmony_ci		 "Oynx5BA7tJm1BRatF5FkBCvq27i8nAc4vfjAb22o9CFvEW3FLaKAgOCncQ3"
882d4afb5ceSopenharmony_ci		 "Tnbz9CddH89n7DXw4kBFI8q5ugF_aRIg5-i42W_hQinLaBhZ_zhAuE-nvlt"
883d4afb5ceSopenharmony_ci		 "ZnhDal8cX3T60lNoUrDOlirqEOXKO3gXCHpm3csZ6nabHYD1UCyHOmi2RsR"
884d4afb5ceSopenharmony_ci		 "pzjaiqjXdPbwPzQoh2DcYpavNrf1mtHiqTwLZDTJIRHWHufJzHf-sw\","
885d4afb5ceSopenharmony_ci		"\"p\":\"ySeC3FtvzduDEL-FX4JqbRN06PdBhUmosCkymmbBjriuLNpkGkG-"
886d4afb5ceSopenharmony_ci		 "1ex7r-M8neUBZbctmDdih6cpLZ8hjZv3eEDZ4b5Z2LqZnja4QvVoWLUs4Fb"
887d4afb5ceSopenharmony_ci		 "NN_PxJCR5H28uUfT6ThxqT0Nb2enb8Dyp0Qxvd7eJUeYz6jOt7pEK-ErTB4"
888d4afb5ceSopenharmony_ci		 "M\","
889d4afb5ceSopenharmony_ci		"\"q\":\"vHG2Pd6QUH7vFZjJtXwmlVnrz5tdJvUPQvz7ggeM69cqhf4vLajz"
890d4afb5ceSopenharmony_ci		 "sqP9GhJr7bEkp6vKVdZGmfEdiFRD8cssIZq651oAO5Wr7zZd2mR_hG9jZx7"
891d4afb5ceSopenharmony_ci		 "8Davfuxr4SZNN-bmoxO6dbDi-X2c7fvMI2YeJwL4groNKyiosdUYILTrYRI"
892d4afb5ceSopenharmony_ci		 "c\","
893d4afb5ceSopenharmony_ci		"\"dp\":\"h5Gqf2rcokgEQGBjuigCJDtNuskRjoxDNV6-rRL99nt_X9lcR9n"
894d4afb5ceSopenharmony_ci		 "xjOnRvowOyXeTBoN7JjCFpllBxm6ORYtNMO28KomIsimo6NmGPBJ7XfXVJe"
895d4afb5ceSopenharmony_ci		 "k6bDBrX-l4_HeJJ1FM9SHvgDYsjGQxh-rKpIqWAYBf-yOD758e5T85vndnX"
896d4afb5ceSopenharmony_ci		 "JM\","
897d4afb5ceSopenharmony_ci		"\"dq\":\"K9LiB-dfdmjenw4mMp-JtYfw8Bn4gtvQzcpZjzbETgB-8iRXwm2"
898d4afb5ceSopenharmony_ci		 "dJvk-HjcUhHWCyb-I0YeAacKKFK9MEconHDWIq87haPn4vyvMjcJ7aUgiPN"
899d4afb5ceSopenharmony_ci		 "QW1_MVl8TA4xNvudi0Z__5-jYEB9nRG0fX0gbUQU-19_-uf-9o4WkE88fQj"
900d4afb5ceSopenharmony_ci		 "bc\","
901d4afb5ceSopenharmony_ci		"\"qi\":\"LEkTRqmomn9UiASeRfAKw-Z5q7cye9CSL4luSexFvA3Du7Oin-s"
902d4afb5ceSopenharmony_ci		 "L9a7F3nJN4CuYzhtNMxQ0hM7k6ExzhDhXDlNRHxnNEDt81-CFRV98v7GVWV"
903d4afb5ceSopenharmony_ci		 "SH1KnaKf9wgegxSSm-x536ki2SI8EN4k4qkqRF0iLVHZK7CgnWMbtt6tnpp"
904d4afb5ceSopenharmony_ci		 "3k\""
905d4afb5ceSopenharmony_ci	"}";
906d4afb5ceSopenharmony_ci/* produced by running the minimal example `lws-crypto-jwk -t RSA -b 4096 -c` */
907d4afb5ceSopenharmony_ci
908d4afb5ceSopenharmony_cistatic const char *rsa_key_4096 =
909d4afb5ceSopenharmony_ci	"{"
910d4afb5ceSopenharmony_ci		"\"e\":\"AQAB\","
911d4afb5ceSopenharmony_ci		"\"kty\":\"RSA\","
912d4afb5ceSopenharmony_ci		"\"n\":\"uiLBz1SUgd4eQ0okg6tlPdk9QUhTsqXmiJXygWVFgzT45E5_Rfkq"
913d4afb5ceSopenharmony_ci		 "vZ2fwAqQ8DvxkDTUWiKpeXMpPRNWG5GxuBuq9n7xdA1vn1eQi8LoekB28dg"
914d4afb5ceSopenharmony_ci		 "3MwMfozVSKCzyxG1f81xPE5x3EMVhCcx6hshhlMEHkzNNhE07d-oRO87ZC0"
915d4afb5ceSopenharmony_ci		 "z_5L3Vh03uJBXaDKVlsgHAazoHLhn6G4odqv-ro54T6Nx1eEtyTnMmFY5ND"
916d4afb5ceSopenharmony_ci		 "V4rN0SjQvSefbZZtsrtby8Z0JmeyvynmDwOINj7FpmPmpFLoWGXntc2yxPP"
917d4afb5ceSopenharmony_ci		 "8SHnqfT9ESh94fxCMxRhDNohgpegRHyiYwj3M5ZYY6reCZYfOQONSWmc8yp"
918d4afb5ceSopenharmony_ci		 "NBMJqj4LuJ2bTMGAFS17ZP4ZZWm5RP9ax100Dgk0yxP1UrybG5dCfJRQvHC"
919d4afb5ceSopenharmony_ci		 "ncxG_aL6cSQu2o4fXqlJsNHxk3FjHtV_CMZ3tqvGTvwrs4yxvKwKv6r3fRh"
920d4afb5ceSopenharmony_ci		 "KL01bGOePzp9THkHW2-lzVj6kUwnxBdHGZE6fcAnczOdp8ZIEdV1w6ThimC"
921d4afb5ceSopenharmony_ci		 "m3Bw_TIyl3tkuxRWXpc_d6Q4iiSVKGKCvUvfAlESpTA4tIhQkij-T9FEoj2"
922d4afb5ceSopenharmony_ci		 "WE2H1D35AKmjcfLCh6yszu8cmDNedn862pwnawE2RvRFAyuI113fLQeCbCz"
923d4afb5ceSopenharmony_ci		 "tQ1JHuD8cnQt0hpGzReTa5UJ8OEOGIlyXNdWZyTpk\","
924d4afb5ceSopenharmony_ci		"\"d\":\"G2ZW582AT-6xvz-IiP5fuJ9EMloygeuEeEo0aMJO3X3cfoUknJkN"
925d4afb5ceSopenharmony_ci		 "ZtyvYa5cgBSe3la8hKkyD9_5K9WvGP9VLTAbdk4g_m-k5QyXiU9PeAGJ0Nd"
926d4afb5ceSopenharmony_ci		 "-Zqq4y0Zj2eil8u7Tz0fhFxay-zvG6VGZnsIcBTD2C7_jUwyoaqJA17A_CH"
927d4afb5ceSopenharmony_ci		 "gU-ifMqS56VgMGdlKZmf7Cg7ZGzM1DoS6vZ9bbfgoczaw4OZVHlg9Cxa0NI"
928d4afb5ceSopenharmony_ci		 "CDi1S-sJcTLGN_RLISKN5H0J54ZfzF6fUEn5kNykLTZrAvj2XV7g4UUOogn"
929d4afb5ceSopenharmony_ci		 "1cvjJYRcBVzTzQKcfxbqo2DvymDGFZbQM6pj80rYJ5HFPh2EapjggPN8hXp"
930d4afb5ceSopenharmony_ci		 "NlTNDEvC84QFv0lo2E-0nVWQqcyHtXd431O1JH2h5X822zKjXxkaztQSCj9"
931d4afb5ceSopenharmony_ci		 "YP7AdAeoxIaWOa3aO1vcwURH2WWaNV-_KXVkPJNzfo9-bGYwblMw_RIqIkN"
932d4afb5ceSopenharmony_ci		 "BDayTb8rBuQHTCE_tSEHgoSnkityGpr8j_vgA-Fa-SqmdqUlbklVpwA_Mq_"
933d4afb5ceSopenharmony_ci		 "UH7RCaqe91dWxRhS_7c85tFMRFCKOcaRXkwxEpP2LD1AYe8yvVQlr0Se8_d"
934d4afb5ceSopenharmony_ci		 "RefuQcC-BECwMW-TCgR3VxAuL7ExNTYe4bhBD8WYXsHP7wDXWX2Q4v7IRzj"
935d4afb5ceSopenharmony_ci		 "cfVIdpTNYuWEd69PvXBCuy75hmDniSmS3Xps3ItGU\","
936d4afb5ceSopenharmony_ci		"\"p\":\"961BtLSIZkHO7Vu1KfaA3urcwGpISKJiTSB5Nh6npxJr9mSjzv_f"
937d4afb5ceSopenharmony_ci		 "e8VoxCX6CWGY0SEeQNUQ6ceTnAAxkSHtZJQGed598jBtxIexAWEE7oc9s9d"
938d4afb5ceSopenharmony_ci		 "b0cWu4QWIVZYXrcOTEWmK1kWN4PXmnnQknrWQF49adn81BaOXqoL-tahe7f"
939d4afb5ceSopenharmony_ci		 "faXzXe0RXuohK543ZKbuuHQ2TxqFG7CZpXiH_qn1Syao32u0V3iDFpmmCUV"
940d4afb5ceSopenharmony_ci		 "h9O2JCzfo8sAosTrnQwC0pXz3Nvr_9Cnk6bMluJoMrwB1Ywg_DPQ1WvpYHO"
941d4afb5ceSopenharmony_ci		 "URezEOqVC8Y3zrko199TMX2COKGNFgutVpnzxs2_h0PyINUmwrY4zQ\","
942d4afb5ceSopenharmony_ci		"\"q\":\"wGQRaxy_gBafbrVJy4f32O0a2FQHzmS--WgHhoteDoF6ZAajLcV0"
943d4afb5ceSopenharmony_ci		 "GEvb-AVmFER1Wii62BFaFJOYQIegELvnBFFzD6oHJRX7bM4m36G8J_TC1o9"
944d4afb5ceSopenharmony_ci		 "T1IFnxOpaoFDf4JWf2k7DCXClGg_zueyOD8fj8F6j2nqpOfytuLmikHcWMc"
945d4afb5ceSopenharmony_ci		 "dGTHTCRtQmvOk3pm0uk2qR0cQb5L3Ocv45tCKr55tMc6Zx3DKkMt1kmUwd2"
946d4afb5ceSopenharmony_ci		 "HFfk_0WM6R7q4LNGIjwl8dwiERppLKA8xao9i3jOOdFEfAD-Zqv8H-32cyH"
947d4afb5ceSopenharmony_ci		 "Mg6Guo4tPNAYSzcsz8nbEYPtKVVm-PDuM2cx0iaKnS8BIK2XTbzc_Q\","
948d4afb5ceSopenharmony_ci		"\"dp\":\"ZXLWIwp_hEMYWyjhP9r0VlqlKTtfeEDrOuQ-Qei0iz6EclwurK8"
949d4afb5ceSopenharmony_ci		 "p_yyRCSb1D7qmOaLzHWMollllINUDeIsJDdWEAY8cz4L-sy1RV1tCBeHnaC"
950d4afb5ceSopenharmony_ci		 "6iMX5jb1Aw072y3T3qk4tDjxjWUHroh6bTCR8dckkJqNfaBAFKMlGNuyLIH"
951d4afb5ceSopenharmony_ci		 "3kSPUV3ivUM1d4NvhnJyz02HmjOgz9W-Uv65rJei_zJR9P2aCbAG00CEHXW"
952d4afb5ceSopenharmony_ci		 "zJ_uT86VdxV11WTaHu8Abt94sER8Tv6jbuyLrUjJSs9VGew32xNcEhya4ZQ"
953d4afb5ceSopenharmony_ci		 "VyimG8zri6fu7CDXXgPS8wtzB5ihl_c2ypnJQ4_GKrgEqwEAOrFqvUQ\","
954d4afb5ceSopenharmony_ci		"\"dq\":\"uzlmngcm8R6S3qi7fL7_2fG7uyPjSN5P3uR21l8QFCu6kFbJO8S"
955d4afb5ceSopenharmony_ci		 "4muBP20hds4F_dlLGqXgRYo7TjpCtmztQsKoWv_ql41hGCfeAawa41WViqm"
956d4afb5ceSopenharmony_ci		 "xmlxmrgzzRHsw1YhgZrNgTAz_E290EQT3Mbd0HnCZtbDMMNisIYAj_A3lwd"
957d4afb5ceSopenharmony_ci		 "tbHOaYyXb0dSZ_nkSUVO05tQ2aGAo8Xtl5ih0NqaQR_XNhwW2pI0lsTB__D"
958d4afb5ceSopenharmony_ci		 "15tU-O5FSdJaq2ip8KNrBzmF8IYrDKTNykKWAKRdSEX_uFoLdD8t0mxn3SM"
959d4afb5ceSopenharmony_ci		 "luffa8vdjXJfh3GiASmHUt3HcPOooQEAufoWBPVJWeGqCvWtRH8yYfQ\","
960d4afb5ceSopenharmony_ci		"\"qi\":\"h-e9es5J49OUF48gSXUI8cynZ8ydv5cThXc1deV3mil_7_7Hg8E"
961d4afb5ceSopenharmony_ci		 "jV3gAErO4l-irHJplFmHFZvU1ud4zs1gtBt5TA-EeeepYOHMSssWDvDK3WI"
962d4afb5ceSopenharmony_ci		 "zsM6C3vcNTSkT-ihaSFmPWHCVwJ1R3auWfeI2In3at0jd4t-OK-cCcGZXb7"
963d4afb5ceSopenharmony_ci		 "90-EnyyDcdFTU9WfwVSOJffRGjoUYX8DexavClv7CBzPhpdUzGoeyarNaG4"
964d4afb5ceSopenharmony_ci		 "z9MI8Q8txHyHgc_D70lZUum1cj0bZwgEj6yDzOPzSgUmICFJiLDDj93oPaI"
965d4afb5ceSopenharmony_ci		 "v-5CQ_Ckju7icexc_kuuYTKBOLTj_vfaURnV3KCHul2UljUYOxkfeNQ\""
966d4afb5ceSopenharmony_ci	"}";
967d4afb5ceSopenharmony_ci
968d4afb5ceSopenharmony_cistatic const char *rsa_key_4096_no_optional =
969d4afb5ceSopenharmony_ci	"{"
970d4afb5ceSopenharmony_ci		"\"e\":\"AQAB\","
971d4afb5ceSopenharmony_ci		"\"kty\":\"RSA\","
972d4afb5ceSopenharmony_ci		"\"n\":\"uiLBz1SUgd4eQ0okg6tlPdk9QUhTsqXmiJXygWVFgzT45E5_Rfkq"
973d4afb5ceSopenharmony_ci		 "vZ2fwAqQ8DvxkDTUWiKpeXMpPRNWG5GxuBuq9n7xdA1vn1eQi8LoekB28dg"
974d4afb5ceSopenharmony_ci		 "3MwMfozVSKCzyxG1f81xPE5x3EMVhCcx6hshhlMEHkzNNhE07d-oRO87ZC0"
975d4afb5ceSopenharmony_ci		 "z_5L3Vh03uJBXaDKVlsgHAazoHLhn6G4odqv-ro54T6Nx1eEtyTnMmFY5ND"
976d4afb5ceSopenharmony_ci		 "V4rN0SjQvSefbZZtsrtby8Z0JmeyvynmDwOINj7FpmPmpFLoWGXntc2yxPP"
977d4afb5ceSopenharmony_ci		 "8SHnqfT9ESh94fxCMxRhDNohgpegRHyiYwj3M5ZYY6reCZYfOQONSWmc8yp"
978d4afb5ceSopenharmony_ci		 "NBMJqj4LuJ2bTMGAFS17ZP4ZZWm5RP9ax100Dgk0yxP1UrybG5dCfJRQvHC"
979d4afb5ceSopenharmony_ci		 "ncxG_aL6cSQu2o4fXqlJsNHxk3FjHtV_CMZ3tqvGTvwrs4yxvKwKv6r3fRh"
980d4afb5ceSopenharmony_ci		 "KL01bGOePzp9THkHW2-lzVj6kUwnxBdHGZE6fcAnczOdp8ZIEdV1w6ThimC"
981d4afb5ceSopenharmony_ci		 "m3Bw_TIyl3tkuxRWXpc_d6Q4iiSVKGKCvUvfAlESpTA4tIhQkij-T9FEoj2"
982d4afb5ceSopenharmony_ci		 "WE2H1D35AKmjcfLCh6yszu8cmDNedn862pwnawE2RvRFAyuI113fLQeCbCz"
983d4afb5ceSopenharmony_ci		 "tQ1JHuD8cnQt0hpGzReTa5UJ8OEOGIlyXNdWZyTpk\","
984d4afb5ceSopenharmony_ci		"\"d\":\"G2ZW582AT-6xvz-IiP5fuJ9EMloygeuEeEo0aMJO3X3cfoUknJkN"
985d4afb5ceSopenharmony_ci		 "ZtyvYa5cgBSe3la8hKkyD9_5K9WvGP9VLTAbdk4g_m-k5QyXiU9PeAGJ0Nd"
986d4afb5ceSopenharmony_ci		 "-Zqq4y0Zj2eil8u7Tz0fhFxay-zvG6VGZnsIcBTD2C7_jUwyoaqJA17A_CH"
987d4afb5ceSopenharmony_ci		 "gU-ifMqS56VgMGdlKZmf7Cg7ZGzM1DoS6vZ9bbfgoczaw4OZVHlg9Cxa0NI"
988d4afb5ceSopenharmony_ci		 "CDi1S-sJcTLGN_RLISKN5H0J54ZfzF6fUEn5kNykLTZrAvj2XV7g4UUOogn"
989d4afb5ceSopenharmony_ci		 "1cvjJYRcBVzTzQKcfxbqo2DvymDGFZbQM6pj80rYJ5HFPh2EapjggPN8hXp"
990d4afb5ceSopenharmony_ci		 "NlTNDEvC84QFv0lo2E-0nVWQqcyHtXd431O1JH2h5X822zKjXxkaztQSCj9"
991d4afb5ceSopenharmony_ci		 "YP7AdAeoxIaWOa3aO1vcwURH2WWaNV-_KXVkPJNzfo9-bGYwblMw_RIqIkN"
992d4afb5ceSopenharmony_ci		 "BDayTb8rBuQHTCE_tSEHgoSnkityGpr8j_vgA-Fa-SqmdqUlbklVpwA_Mq_"
993d4afb5ceSopenharmony_ci		 "UH7RCaqe91dWxRhS_7c85tFMRFCKOcaRXkwxEpP2LD1AYe8yvVQlr0Se8_d"
994d4afb5ceSopenharmony_ci		 "RefuQcC-BECwMW-TCgR3VxAuL7ExNTYe4bhBD8WYXsHP7wDXWX2Q4v7IRzj"
995d4afb5ceSopenharmony_ci		 "cfVIdpTNYuWEd69PvXBCuy75hmDniSmS3Xps3ItGU\","
996d4afb5ceSopenharmony_ci		"\"p\":\"961BtLSIZkHO7Vu1KfaA3urcwGpISKJiTSB5Nh6npxJr9mSjzv_f"
997d4afb5ceSopenharmony_ci		 "e8VoxCX6CWGY0SEeQNUQ6ceTnAAxkSHtZJQGed598jBtxIexAWEE7oc9s9d"
998d4afb5ceSopenharmony_ci		 "b0cWu4QWIVZYXrcOTEWmK1kWN4PXmnnQknrWQF49adn81BaOXqoL-tahe7f"
999d4afb5ceSopenharmony_ci		 "faXzXe0RXuohK543ZKbuuHQ2TxqFG7CZpXiH_qn1Syao32u0V3iDFpmmCUV"
1000d4afb5ceSopenharmony_ci		 "h9O2JCzfo8sAosTrnQwC0pXz3Nvr_9Cnk6bMluJoMrwB1Ywg_DPQ1WvpYHO"
1001d4afb5ceSopenharmony_ci		 "URezEOqVC8Y3zrko199TMX2COKGNFgutVpnzxs2_h0PyINUmwrY4zQ\","
1002d4afb5ceSopenharmony_ci		"\"q\":\"wGQRaxy_gBafbrVJy4f32O0a2FQHzmS--WgHhoteDoF6ZAajLcV0"
1003d4afb5ceSopenharmony_ci		 "GEvb-AVmFER1Wii62BFaFJOYQIegELvnBFFzD6oHJRX7bM4m36G8J_TC1o9"
1004d4afb5ceSopenharmony_ci		 "T1IFnxOpaoFDf4JWf2k7DCXClGg_zueyOD8fj8F6j2nqpOfytuLmikHcWMc"
1005d4afb5ceSopenharmony_ci		 "dGTHTCRtQmvOk3pm0uk2qR0cQb5L3Ocv45tCKr55tMc6Zx3DKkMt1kmUwd2"
1006d4afb5ceSopenharmony_ci		 "HFfk_0WM6R7q4LNGIjwl8dwiERppLKA8xao9i3jOOdFEfAD-Zqv8H-32cyH"
1007d4afb5ceSopenharmony_ci		 "Mg6Guo4tPNAYSzcsz8nbEYPtKVVm-PDuM2cx0iaKnS8BIK2XTbzc_Q\""
1008d4afb5ceSopenharmony_ci	"}";
1009d4afb5ceSopenharmony_ci
1010d4afb5ceSopenharmony_ci/* This is a compact JWE containing the plaintext ra_ptext_1024 for the key
1011d4afb5ceSopenharmony_ci * lws_jwe_ex_a2_jwk_json... produced by  test test above running on OpenSSL.
1012d4afb5ceSopenharmony_ci */
1013d4afb5ceSopenharmony_ci
1014d4afb5ceSopenharmony_cistatic char *jwe_compact_rsa_cbc_openssl =
1015d4afb5ceSopenharmony_ci        "eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0."
1016d4afb5ceSopenharmony_ci        "HgQBfAg2IUpExcs74-gtuSOciw6rxh2cc4x9MVRWDZKSvMqoBYKAxl6ebSxGTReHhbvhv2Rm8stKq"
1017d4afb5ceSopenharmony_ci        "OIROhWzTNGTQPnSRMzAm9x6ms39hAIGh1KCEZ47MRYkCN7hElfDVtczOCX3ZRsG9_qYEmzcY1aJ-4"
1018d4afb5ceSopenharmony_ci        "_LS3yeP0HfqKBmcfvjVLw-KqcUuHp5YXsZEvt28nA9uBlCN0ROWy_2Fs-zlQj8pDMWo5pZrffKTUX"
1019d4afb5ceSopenharmony_ci        "gUh_UJ9eC3qNyXtQSqUH-5vDeHPhxNnIJOsmJ5ZUAjxXPm-RJZRC9THg0DzGRZn9IqfP9qcanbcZ8"
1020d4afb5ceSopenharmony_ci        "iow7gjFh1EPp3MKlpZqDKbLLei1WZvz2_A."
1021d4afb5ceSopenharmony_ci        "q4STtyu4yxZfH1HNDYlYcA."
1022d4afb5ceSopenharmony_ci        "_uRfuwWO22_auSqXHORw_e_Q6PmbpC0sv0tefVKsj3Zqnh2qUBlj10kiWBMWoMMjqsClBO0nUoup4"
1023d4afb5ceSopenharmony_ci        "c7i1YSqxlCHliXru3athv_EYtg5qvC-z2co9NiFABHCHmBDrhj7CuKN5gqFDt1EbYMLwWtU3gOnQy"
1024d4afb5ceSopenharmony_ci        "dvnzfFcQs4_jKi6tRpQzbobrkkZ2p7Y_ltjA1Wmwqrp9O8DGSRnvcomqzGHcshuyxTkjLDzD8TSMR"
1025d4afb5ceSopenharmony_ci        "S1kp-miy5eDGAcp-ymWiUKN7gswy5FPjPQYzgs7Vc0n0R1ljepRHJiHaP61z_DKWXrCE6RqAVqnaw"
1026d4afb5ceSopenharmony_ci        "TjjVOXXKKF9pz9W7pZL8diLZ0Ueev6xk8wzRRsUChM5toQNzFLXsnzSDQSzfSKpRnLjYvosiEegyx"
1027d4afb5ceSopenharmony_ci        "RrwtQwEcNCXRj0aGxG6e_W79JdUJoi4blpTtrAVn_pk7SgRiU3aly1vso5tV_0kvMOcS6Hn38mqRQ"
1028d4afb5ceSopenharmony_ci        "PQxbdIpohi8C7FFabluZqGoiji8ZTM3v-2ib2vrBFj1YvoyPG1HXJsABINzo0xOkrMFNfN_oQrCSM"
1029d4afb5ceSopenharmony_ci        "Ij49N86GXmYOnu5jtZeSMXZIR2BAXnu0upXMsvtSjU8D-LJJChy0XNYoyuJar5P3YhDStdTfmn0z-"
1030d4afb5ceSopenharmony_ci        "XLwaIHWc1L9-rmW9CZey3HxCLKEnr7-FjXsXqzAArsFqn1X_sVR5HRHng5ioc7sUaRoC1S_k0XPVC"
1031d4afb5ceSopenharmony_ci        "qCjZvkbRry2cp2313DNwjl8SK-iZA0fVUZVPM7_eZfpEgB3bBTyamtAaqQeES6lcVEtpg176Mlh64"
1032d4afb5ceSopenharmony_ci        "3JCAjroJPP4eqAA3JHnDgwlO-XhlLPTNNQ5FMLBC_dp41A-H3HFlbQUR6jX3k_H4Ggqtit50EIye3"
1033d4afb5ceSopenharmony_ci        "nnKb3emFn9KVyeZCYaBecYbicEIMKW7sWLbcE_cDGqkHZcMGTOQKRiLp-xwyEu89oDGAcGBYpmC_f"
1034d4afb5ceSopenharmony_ci        "iQ2qyFfe6tQK_5nPZbtW2mudiYZ-d0YIURSTp58S_n6w3wLDUEcuZtv-nhCaFVy8oUbAztkBIK6pu"
1035d4afb5ceSopenharmony_ci        "VamKhHVLkCtOGIdNJYbLKAedhK1lQVPbrvfcSDPPkhxSx9AjKqhKA3ZPMA_UXQb6p9c33tgi_MdZX"
1036d4afb5ceSopenharmony_ci        "-jRGXwGKWBCrv4UjttFLV-a5U7NgxQIIjwfAoutXtYardFw2d5nTJRqBrw06PSqaLzQi616_b-U0g"
1037d4afb5ceSopenharmony_ci        "6bWxrFObIWrKODkGfQcXPXIQxW_4Vh6gR2GaHSi_A_5SGH0zsBtYxisbKXLK2HiZJOXBew4-am6c0"
1038d4afb5ceSopenharmony_ci        "R1jBh7QtOWpwrYWt0d_xxrWtKezeEp3FkrFkwWCgY9dT1uV8tKUuxeeGqshkrXifT4axttpkbi-qA"
1039d4afb5ceSopenharmony_ci        "eG_C6J-H29CPqScclD-A5LIg7k-KmA9hsWrXttAvoCSawNj1tv9JHq0jgP1yZytDW1DkWdCBY0au5"
1040d4afb5ceSopenharmony_ci        "4."
1041d4afb5ceSopenharmony_ci        "qqYQEaGx-lUHoO43fOXvKQ"
1042d4afb5ceSopenharmony_ci;
1043d4afb5ceSopenharmony_ci
1044d4afb5ceSopenharmony_ci
1045d4afb5ceSopenharmony_cistatic int
1046d4afb5ceSopenharmony_citest_jwe_r256a128_jwe_openssl(struct lws_context *context)
1047d4afb5ceSopenharmony_ci{
1048d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
1049d4afb5ceSopenharmony_ci	char temp[2048];
1050d4afb5ceSopenharmony_ci	int n, ret = -1, temp_len = sizeof(temp);
1051d4afb5ceSopenharmony_ci
1052d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
1053d4afb5ceSopenharmony_ci
1054d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, (char *)lws_jwe_ex_a2_jwk_json,
1055d4afb5ceSopenharmony_ci			   strlen((char *)lws_jwe_ex_a2_jwk_json)) < 0) {
1056d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
1057d4afb5ceSopenharmony_ci		goto bail;
1058d4afb5ceSopenharmony_ci	}
1059d4afb5ceSopenharmony_ci
1060d4afb5ceSopenharmony_ci	/* converts a compact serialization to jws b64 + decoded maps */
1061d4afb5ceSopenharmony_ci	if (lws_jws_compact_decode((const char *)jwe_compact_rsa_cbc_openssl,
1062d4afb5ceSopenharmony_ci				   (int)strlen((char *)jwe_compact_rsa_cbc_openssl),
1063d4afb5ceSopenharmony_ci				   &jwe.jws.map, &jwe.jws.map_b64,
1064d4afb5ceSopenharmony_ci				   temp, &temp_len) != 5) {
1065d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jws_compact_decode failed\n", __func__);
1066d4afb5ceSopenharmony_ci		goto bail;
1067d4afb5ceSopenharmony_ci	}
1068d4afb5ceSopenharmony_ci
1069d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt(&jwe, lws_concat_temp(temp, temp_len),
1070d4afb5ceSopenharmony_ci				     &temp_len);
1071d4afb5ceSopenharmony_ci	if (n < 0) {
1072d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_auth_and_decrypt failed\n",
1073d4afb5ceSopenharmony_ci			 __func__);
1074d4afb5ceSopenharmony_ci		goto bail;
1075d4afb5ceSopenharmony_ci	}
1076d4afb5ceSopenharmony_ci
1077d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
1078d4afb5ceSopenharmony_ci	if (jwe.jws.map.len[LJWE_CTXT] < sizeof(ra_ptext_1024) ||
1079d4afb5ceSopenharmony_ci	    lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,
1080d4afb5ceSopenharmony_ci			        sizeof(ra_ptext_1024))) {
1081d4afb5ceSopenharmony_ci		lwsl_err("%s: plaintext RSA/AES decrypt wrong\n", __func__);
1082d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));
1083d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],
1084d4afb5ceSopenharmony_ci				    jwe.jws.map.len[LJWE_CTXT]);
1085d4afb5ceSopenharmony_ci		goto bail;
1086d4afb5ceSopenharmony_ci	}
1087d4afb5ceSopenharmony_ci
1088d4afb5ceSopenharmony_ci	ret = 0;
1089d4afb5ceSopenharmony_ci
1090d4afb5ceSopenharmony_cibail:
1091d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
1092d4afb5ceSopenharmony_ci	if (ret)
1093d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed +++++++++++++++++++\n", __func__);
1094d4afb5ceSopenharmony_ci	else
1095d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
1096d4afb5ceSopenharmony_ci
1097d4afb5ceSopenharmony_ci	return ret;
1098d4afb5ceSopenharmony_ci}
1099d4afb5ceSopenharmony_ci
1100d4afb5ceSopenharmony_ci
1101d4afb5ceSopenharmony_ci/* This is a compact JWE containing the plaintext ra_ptext_1024 for the key
1102d4afb5ceSopenharmony_ci * lws_jwe_ex_a2_jwk_json... produced by  test test above running on mbedTLS.
1103d4afb5ceSopenharmony_ci */
1104d4afb5ceSopenharmony_ci
1105d4afb5ceSopenharmony_cistatic char
1106d4afb5ceSopenharmony_ci*jwe_compact_rsa_cbc_mbedtls =
1107d4afb5ceSopenharmony_ci	"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.Ptg-RZjEhY1dWg7T"
1108d4afb5ceSopenharmony_ci	"v72rqRoHXBeory9ePCC5cfASTz8BH7IdSLQcPeBWHQsmd13TXPjo-dxnmkWkx9AyKdvy"
1109d4afb5ceSopenharmony_ci	"K0A6oCnsP7KfbGzPwTy5eadpaaDZ3UyXIGmusLgiXGgDZ4d13voirbRQV9nQTPsagG_k"
1110d4afb5ceSopenharmony_ci	"FGRI5dKzenG2WcbUhKG-uCmypzYqjNM3LqUzdH42jjjHFOBkmK_sWSZL7Uxqq8s08hkO"
1111d4afb5ceSopenharmony_ci	"aXeUQyeM7Z8wm1bsZAvIfGri5LMcBS8P70AyENchlchZpTeACIOWk19ddLPUt-ruEcm0"
1112d4afb5ceSopenharmony_ci	"zZV7Gjap7uG06a0m3VyR3vMpKkXnBHQxko-RICU2PDmELVXg0pZWTw.-VaaDaUiynH_t"
1113d4afb5ceSopenharmony_ci	"sh2HqKISQ.vVE8j1TQinb4anJk0ArV9ccYdlUIO20vnMa7b-JGfQ7CFi_WVt6xNaqytB"
1114d4afb5ceSopenharmony_ci	"QqiTHLtAxBDIV4m9Kwid-8Kcx7BmRqu-memxHztBSvBNOYWVPTxy5I2ORGLNEbPVrFYp"
1115d4afb5ceSopenharmony_ci	"c2nm3TnHfr-_2fuw6_HEnyqv_c6ZyzU0-lHZ1pE5Cs-lrjnj4ibNcK6XHhrO3nxUjPMZ"
1116d4afb5ceSopenharmony_ci	"rO-2B_tZwCxzKsFAqD_XGROvNGWXEgxgIr09MyuwKJnw2oZ0xOF_d3FVYjK5XMONgWPo"
1117d4afb5ceSopenharmony_ci	"lyDmbP_XLSIUXbHmLxpDB5NPLN8SKRHbMV3_qw5rFRlak2C_XlR58P-Im1PQ8gMg7lgE"
1118d4afb5ceSopenharmony_ci	"IFz2DrqF4sJA5TYbQG5KCdas0SfONlP1V692dufH5D30RGsiWNSrhiyDmUNC0SeB8VqA"
1119d4afb5ceSopenharmony_ci	"bmc02pPGgzZHxa5-_xIHKm4h6fmnZFScjliBQ5W6smxQ6m2Kby0MkOdqlRYFn8qLYLmF"
1120d4afb5ceSopenharmony_ci	"vmVNe_Q5-iLNobx-hyyeeExRXfzNOY0HHEKw67ipBWwqA0JGIggCWAFa0fpA-Wt7sNl_"
1121d4afb5ceSopenharmony_ci	"gPy96nbwuXIuRoC3wuboUlDp9k2F1vC7VY6R9jdRk1VXT_O3liBIiUIRhZiqZZ75H2RV"
1122d4afb5ceSopenharmony_ci	"pLYXGrvL5G9THdRcbsg3XUt-kF4vvGQAdNmPdRmuIG1DfGDmOZnXfrG8ckTvxoKBXdQZ"
1123d4afb5ceSopenharmony_ci	"gfwfAQFgeHjltiWZTCSBV4464sn2qLZ1MP3Ku9bOjb72RCpIF60Cqssb8gTQyXQf48ZR"
1124d4afb5ceSopenharmony_ci	"OBd242Q7Ae6PePmb_TcnG3jOguNUgmhj8iTU7QUz0uJWpJjMRPJ8vK8SnYEguGHer4qT"
1125d4afb5ceSopenharmony_ci	"EocdMzRTTZB-Pr4-Ey0Hm0zeiFvjU0Qy6crjna6SKrgms4VAJT9LiicTYFPsmFBFQ0L1"
1126d4afb5ceSopenharmony_ci	"BVDiZ3NTBIv_ajvzRpBNZ0IxEH5t6W3OY0223xUF3cq8c9HhwIxMf9a2-PmZ3mVWIRnU"
1127d4afb5ceSopenharmony_ci	"nGegoVkzd2l6el8aw57v5KKYas4-EkovHntCZZ_hkZ1uHtezKq0EvjnT5xGWjPFjOZnh"
1128d4afb5ceSopenharmony_ci	"veiozAsaMSSyTny6mcI-hjvcgd--7qlqWpt_BEkp9XVkP2k7eHLM9v4rL6hhk_n6yK3w"
1129d4afb5ceSopenharmony_ci	"qKi0xDboxU5xjuBiGKb-E8um1MUEjuLqZanKSBsgU-Vwvw0gx1r-MG6BSlrgUlT2if5k"
1130d4afb5ceSopenharmony_ci	"-Wfs6iVdpK7x1zZSsetp3NEjT4DUrfmp_E_CTXhOEP0AgzpQ4Ukx5bFN3gm5gyBZw1E8"
1131d4afb5ceSopenharmony_ci	"q20Hs01OBcMJ9wenLEQVMvO_IEIkRNBMWEgoZ148As14LNOgdh1UBrF6W4pAUjYvA3WG"
1132d4afb5ceSopenharmony_ci	"Zp7uG9ooDB1RF2aaeBqoLJflqIegsvsfaNNBDJ-U6i_jLG1FSlttEhJVdXll0gMSYlXD"
1133d4afb5ceSopenharmony_ci	"O3BBil4eiUPfiksfOmsbwoIxc-3yPTivU3DPM.O_IaktJRbdV66zfhD0LQmw"
1134d4afb5ceSopenharmony_ci;
1135d4afb5ceSopenharmony_ci
1136d4afb5ceSopenharmony_cistatic int
1137d4afb5ceSopenharmony_citest_jwe_r256a128_jwe_mbedtls(struct lws_context *context)
1138d4afb5ceSopenharmony_ci{
1139d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
1140d4afb5ceSopenharmony_ci	char temp[2048];
1141d4afb5ceSopenharmony_ci	int n, ret = -1, temp_len = sizeof(temp);
1142d4afb5ceSopenharmony_ci
1143d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
1144d4afb5ceSopenharmony_ci
1145d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, (char *)lws_jwe_ex_a2_jwk_json,
1146d4afb5ceSopenharmony_ci			   strlen((char *)lws_jwe_ex_a2_jwk_json)) < 0) {
1147d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
1148d4afb5ceSopenharmony_ci		goto bail;
1149d4afb5ceSopenharmony_ci	}
1150d4afb5ceSopenharmony_ci
1151d4afb5ceSopenharmony_ci	/* converts a compact serialization to jws b64 + decoded maps */
1152d4afb5ceSopenharmony_ci	if (lws_jws_compact_decode((const char *)jwe_compact_rsa_cbc_mbedtls,
1153d4afb5ceSopenharmony_ci				   (int)strlen((char *)jwe_compact_rsa_cbc_mbedtls),
1154d4afb5ceSopenharmony_ci				   &jwe.jws.map, &jwe.jws.map_b64,
1155d4afb5ceSopenharmony_ci				   temp, &temp_len) != 5) {
1156d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jws_compact_decode failed\n", __func__);
1157d4afb5ceSopenharmony_ci		goto bail;
1158d4afb5ceSopenharmony_ci	}
1159d4afb5ceSopenharmony_ci
1160d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt(&jwe, lws_concat_temp(temp, temp_len),
1161d4afb5ceSopenharmony_ci				     &temp_len);
1162d4afb5ceSopenharmony_ci	if (n < 0) {
1163d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_auth_and_decrypt failed\n",
1164d4afb5ceSopenharmony_ci			 __func__);
1165d4afb5ceSopenharmony_ci		goto bail;
1166d4afb5ceSopenharmony_ci	}
1167d4afb5ceSopenharmony_ci
1168d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
1169d4afb5ceSopenharmony_ci	if (jwe.jws.map.len[LJWE_CTXT] < sizeof(ra_ptext_1024) ||
1170d4afb5ceSopenharmony_ci	    lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,
1171d4afb5ceSopenharmony_ci			        sizeof(ra_ptext_1024))) {
1172d4afb5ceSopenharmony_ci		lwsl_err("%s: plaintext RSA/AES decrypt wrong\n", __func__);
1173d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));
1174d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],
1175d4afb5ceSopenharmony_ci				    jwe.jws.map.len[LJWE_CTXT]);
1176d4afb5ceSopenharmony_ci		goto bail;
1177d4afb5ceSopenharmony_ci	}
1178d4afb5ceSopenharmony_ci
1179d4afb5ceSopenharmony_ci	ret = 0;
1180d4afb5ceSopenharmony_ci
1181d4afb5ceSopenharmony_cibail:
1182d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
1183d4afb5ceSopenharmony_ci
1184d4afb5ceSopenharmony_ci	if (ret)
1185d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed +++++++++++++++++++\n", __func__);
1186d4afb5ceSopenharmony_ci	else
1187d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
1188d4afb5ceSopenharmony_ci
1189d4afb5ceSopenharmony_ci	return ret;
1190d4afb5ceSopenharmony_ci}
1191d4afb5ceSopenharmony_ci
1192d4afb5ceSopenharmony_ci
1193d4afb5ceSopenharmony_ci
1194d4afb5ceSopenharmony_ci/* A.3.  Example JWE Using AES Key Wrap and AES_128_CBC_HMAC_SHA_256
1195d4afb5ceSopenharmony_ci *
1196d4afb5ceSopenharmony_ci * This example encrypts the plaintext "Live long and prosper." to the
1197d4afb5ceSopenharmony_ci * recipient using AES Key Wrap for key encryption and
1198d4afb5ceSopenharmony_ci * AES_128_CBC_HMAC_SHA_256 for content encryption.
1199d4afb5ceSopenharmony_ci */
1200d4afb5ceSopenharmony_ci
1201d4afb5ceSopenharmony_ci/* "Live long and prosper." */
1202d4afb5ceSopenharmony_cistatic uint8_t
1203d4afb5ceSopenharmony_ci
1204d4afb5ceSopenharmony_ciex_a3_ptext[] = {
1205d4afb5ceSopenharmony_ci	76, 105, 118, 101, 32, 108, 111, 110,
1206d4afb5ceSopenharmony_ci	103, 32, 97, 110, 100, 32,  112, 114,
1207d4afb5ceSopenharmony_ci	111, 115, 112, 101, 114, 46
1208d4afb5ceSopenharmony_ci},
1209d4afb5ceSopenharmony_ci
1210d4afb5ceSopenharmony_ci*ex_a3_compact = (uint8_t *)
1211d4afb5ceSopenharmony_ci	"eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0"
1212d4afb5ceSopenharmony_ci	"."
1213d4afb5ceSopenharmony_ci	"6KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ"
1214d4afb5ceSopenharmony_ci	"."
1215d4afb5ceSopenharmony_ci	"AxY8DCtDaGlsbGljb3RoZQ"
1216d4afb5ceSopenharmony_ci	"."
1217d4afb5ceSopenharmony_ci	"KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY"
1218d4afb5ceSopenharmony_ci	"."
1219d4afb5ceSopenharmony_ci	"U0m_YmjN04DJvceFICbCVQ",
1220d4afb5ceSopenharmony_ci
1221d4afb5ceSopenharmony_ci*ex_a3_key = (uint8_t *)
1222d4afb5ceSopenharmony_ci	"{\"kty\":\"oct\","
1223d4afb5ceSopenharmony_ci	   "\"k\":\"GawgguFyGrWKav7AX4VKUg\""
1224d4afb5ceSopenharmony_ci	"}"
1225d4afb5ceSopenharmony_ci;
1226d4afb5ceSopenharmony_ci
1227d4afb5ceSopenharmony_cistatic int
1228d4afb5ceSopenharmony_citest_jwe_a3(struct lws_context *context)
1229d4afb5ceSopenharmony_ci{
1230d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
1231d4afb5ceSopenharmony_ci	char temp[2048];
1232d4afb5ceSopenharmony_ci	int n, ret = -1, temp_len = sizeof(temp);
1233d4afb5ceSopenharmony_ci
1234d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
1235d4afb5ceSopenharmony_ci
1236d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, (char *)ex_a3_key,
1237d4afb5ceSopenharmony_ci			   strlen((char *)ex_a3_key)) < 0) {
1238d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
1239d4afb5ceSopenharmony_ci		goto bail;
1240d4afb5ceSopenharmony_ci	}
1241d4afb5ceSopenharmony_ci
1242d4afb5ceSopenharmony_ci	/* converts a compact serialization to jws b64 + decoded maps */
1243d4afb5ceSopenharmony_ci	if (lws_jws_compact_decode((const char *)ex_a3_compact,
1244d4afb5ceSopenharmony_ci				   (int)strlen((char *)ex_a3_compact),
1245d4afb5ceSopenharmony_ci				   &jwe.jws.map, &jwe.jws.map_b64, temp,
1246d4afb5ceSopenharmony_ci				   &temp_len)  != 5) {
1247d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jws_compact_decode failed\n", __func__);
1248d4afb5ceSopenharmony_ci		goto bail;
1249d4afb5ceSopenharmony_ci	}
1250d4afb5ceSopenharmony_ci
1251d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt(&jwe, lws_concat_temp(temp, temp_len),
1252d4afb5ceSopenharmony_ci				     &temp_len);
1253d4afb5ceSopenharmony_ci	if (n < 0) {
1254d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_auth_and_decrypt failed\n",
1255d4afb5ceSopenharmony_ci			 __func__);
1256d4afb5ceSopenharmony_ci		goto bail;
1257d4afb5ceSopenharmony_ci	}
1258d4afb5ceSopenharmony_ci
1259d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
1260d4afb5ceSopenharmony_ci	if (jwe.jws.map.len[LJWE_CTXT] < sizeof(ex_a3_ptext) ||
1261d4afb5ceSopenharmony_ci	    lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ex_a3_ptext,
1262d4afb5ceSopenharmony_ci			        sizeof(ex_a3_ptext))) {
1263d4afb5ceSopenharmony_ci		lwsl_err("%s: plaintext AES decrypt wrong\n", __func__);
1264d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(ex_a3_ptext, sizeof(ex_a3_ptext));
1265d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],
1266d4afb5ceSopenharmony_ci				    jwe.jws.map.len[LJWE_CTXT]);
1267d4afb5ceSopenharmony_ci		goto bail;
1268d4afb5ceSopenharmony_ci	}
1269d4afb5ceSopenharmony_ci
1270d4afb5ceSopenharmony_ci	ret = 0;
1271d4afb5ceSopenharmony_ci
1272d4afb5ceSopenharmony_cibail:
1273d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
1274d4afb5ceSopenharmony_ci	if (ret)
1275d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed +++++++++++++++++++\n", __func__);
1276d4afb5ceSopenharmony_ci	else
1277d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
1278d4afb5ceSopenharmony_ci
1279d4afb5ceSopenharmony_ci	return ret;
1280d4afb5ceSopenharmony_ci}
1281d4afb5ceSopenharmony_ci
1282d4afb5ceSopenharmony_ci/* JWA B.2.  Test Cases for AES_192_CBC_HMAC_SHA_384
1283d4afb5ceSopenharmony_ci *
1284d4afb5ceSopenharmony_ci * Unfortunately JWA just gives this test case as hex literals, not
1285d4afb5ceSopenharmony_ci * inside a JWE.  So we have to prepare the inputs "by hand".
1286d4afb5ceSopenharmony_ci */
1287d4afb5ceSopenharmony_ci
1288d4afb5ceSopenharmony_cistatic uint8_t
1289d4afb5ceSopenharmony_ci
1290d4afb5ceSopenharmony_cijwa_b2_ptext[] = {
1291d4afb5ceSopenharmony_ci	0x41, 0x20, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72,
1292d4afb5ceSopenharmony_ci	0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20,
1293d4afb5ceSopenharmony_ci	0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74,
1294d4afb5ceSopenharmony_ci	0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75,
1295d4afb5ceSopenharmony_ci	0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
1296d4afb5ceSopenharmony_ci	0x62, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65,
1297d4afb5ceSopenharmony_ci	0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69,
1298d4afb5ceSopenharmony_ci	0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
1299d4afb5ceSopenharmony_ci	0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74,
1300d4afb5ceSopenharmony_ci	0x6f, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x69,
1301d4afb5ceSopenharmony_ci	0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,
1302d4afb5ceSopenharmony_ci	0x68, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x66,
1303d4afb5ceSopenharmony_ci	0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x65,
1304d4afb5ceSopenharmony_ci	0x6d, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f,
1305d4afb5ceSopenharmony_ci	0x75, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6e,
1306d4afb5ceSopenharmony_ci	0x76, 0x65, 0x6e, 0x69, 0x65, 0x6e, 0x63, 0x65
1307d4afb5ceSopenharmony_ci},
1308d4afb5ceSopenharmony_ci
1309d4afb5ceSopenharmony_cijwa_b2_rawkey[] = {
1310d4afb5ceSopenharmony_ci	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1311d4afb5ceSopenharmony_ci	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1312d4afb5ceSopenharmony_ci	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1313d4afb5ceSopenharmony_ci	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1314d4afb5ceSopenharmony_ci	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1315d4afb5ceSopenharmony_ci	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
1316d4afb5ceSopenharmony_ci},
1317d4afb5ceSopenharmony_ci
1318d4afb5ceSopenharmony_cijwa_b2_iv[] = {
1319d4afb5ceSopenharmony_ci	0x1a, 0xf3, 0x8c, 0x2d, 0xc2, 0xb9, 0x6f, 0xfd,
1320d4afb5ceSopenharmony_ci	0xd8, 0x66, 0x94, 0x09, 0x23, 0x41, 0xbc, 0x04
1321d4afb5ceSopenharmony_ci},
1322d4afb5ceSopenharmony_ci
1323d4afb5ceSopenharmony_cijwa_b2_e[] = {
1324d4afb5ceSopenharmony_ci	0xea, 0x65, 0xda, 0x6b, 0x59, 0xe6, 0x1e, 0xdb,
1325d4afb5ceSopenharmony_ci	0x41, 0x9b, 0xe6, 0x2d, 0x19, 0x71, 0x2a, 0xe5,
1326d4afb5ceSopenharmony_ci	0xd3, 0x03, 0xee, 0xb5, 0x00, 0x52, 0xd0, 0xdf,
1327d4afb5ceSopenharmony_ci	0xd6, 0x69, 0x7f, 0x77, 0x22, 0x4c, 0x8e, 0xdb,
1328d4afb5ceSopenharmony_ci	0x00, 0x0d, 0x27, 0x9b, 0xdc, 0x14, 0xc1, 0x07,
1329d4afb5ceSopenharmony_ci	0x26, 0x54, 0xbd, 0x30, 0x94, 0x42, 0x30, 0xc6,
1330d4afb5ceSopenharmony_ci	0x57, 0xbe, 0xd4, 0xca, 0x0c, 0x9f, 0x4a, 0x84,
1331d4afb5ceSopenharmony_ci	0x66, 0xf2, 0x2b, 0x22, 0x6d, 0x17, 0x46, 0x21,
1332d4afb5ceSopenharmony_ci	0x4b, 0xf8, 0xcf, 0xc2, 0x40, 0x0a, 0xdd, 0x9f,
1333d4afb5ceSopenharmony_ci	0x51, 0x26, 0xe4, 0x79, 0x66, 0x3f, 0xc9, 0x0b,
1334d4afb5ceSopenharmony_ci	0x3b, 0xed, 0x78, 0x7a, 0x2f, 0x0f, 0xfc, 0xbf,
1335d4afb5ceSopenharmony_ci	0x39, 0x04, 0xbe, 0x2a, 0x64, 0x1d, 0x5c, 0x21,
1336d4afb5ceSopenharmony_ci	0x05, 0xbf, 0xe5, 0x91, 0xba, 0xe2, 0x3b, 0x1d,
1337d4afb5ceSopenharmony_ci	0x74, 0x49, 0xe5, 0x32, 0xee, 0xf6, 0x0a, 0x9a,
1338d4afb5ceSopenharmony_ci	0xc8, 0xbb, 0x6c, 0x6b, 0x01, 0xd3, 0x5d, 0x49,
1339d4afb5ceSopenharmony_ci	0x78, 0x7b, 0xcd, 0x57, 0xef, 0x48, 0x49, 0x27,
1340d4afb5ceSopenharmony_ci	0xf2, 0x80, 0xad, 0xc9, 0x1a, 0xc0, 0xc4, 0xe7,
1341d4afb5ceSopenharmony_ci	0x9c, 0x7b, 0x11, 0xef, 0xc6, 0x00, 0x54, 0xe3
1342d4afb5ceSopenharmony_ci},
1343d4afb5ceSopenharmony_ci
1344d4afb5ceSopenharmony_cijwa_b2_a[] = { /* "The second principle of Auguste Kerckhoffs" */
1345d4afb5ceSopenharmony_ci	0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f,
1346d4afb5ceSopenharmony_ci	0x6e, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63,
1347d4afb5ceSopenharmony_ci	0x69, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20,
1348d4afb5ceSopenharmony_ci	0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x65, 0x20,
1349d4afb5ceSopenharmony_ci	0x4b, 0x65, 0x72, 0x63, 0x6b, 0x68, 0x6f, 0x66,
1350d4afb5ceSopenharmony_ci	0x66, 0x73
1351d4afb5ceSopenharmony_ci},
1352d4afb5ceSopenharmony_ci
1353d4afb5ceSopenharmony_cijwa_b2_tag[] = {
1354d4afb5ceSopenharmony_ci	0x84, 0x90, 0xac, 0x0e, 0x58, 0x94, 0x9b, 0xfe,
1355d4afb5ceSopenharmony_ci	0x51, 0x87, 0x5d, 0x73, 0x3f, 0x93, 0xac, 0x20,
1356d4afb5ceSopenharmony_ci	0x75, 0x16, 0x80, 0x39, 0xcc, 0xc7, 0x33, 0xd7
1357d4afb5ceSopenharmony_ci
1358d4afb5ceSopenharmony_ci}
1359d4afb5ceSopenharmony_ci;
1360d4afb5ceSopenharmony_ci
1361d4afb5ceSopenharmony_cistatic int
1362d4afb5ceSopenharmony_citest_jwa_b2(struct lws_context *context)
1363d4afb5ceSopenharmony_ci{
1364d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
1365d4afb5ceSopenharmony_ci	int n, ret = -1;
1366d4afb5ceSopenharmony_ci	char buf[2048];
1367d4afb5ceSopenharmony_ci
1368d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
1369d4afb5ceSopenharmony_ci
1370d4afb5ceSopenharmony_ci	/*
1371d4afb5ceSopenharmony_ci	 * normally all this is interpreted from the JWE blob.  But we don't
1372d4afb5ceSopenharmony_ci	 * have JWE test vectors for AES_256_CBC_HMAC_SHA_512, just a standalone
1373d4afb5ceSopenharmony_ci	 * one.  So we have to create it all by hand.
1374d4afb5ceSopenharmony_ci	 *
1375d4afb5ceSopenharmony_ci	 * See test_jwe_a3 above for a more normal usage pattern.
1376d4afb5ceSopenharmony_ci	 */
1377d4afb5ceSopenharmony_ci
1378d4afb5ceSopenharmony_ci	lws_jwk_dup_oct(&jwe.jwk, jwa_b2_rawkey, sizeof(jwa_b2_rawkey));
1379d4afb5ceSopenharmony_ci
1380d4afb5ceSopenharmony_ci	memcpy(buf, jwa_b2_e, sizeof(jwa_b2_e));
1381d4afb5ceSopenharmony_ci
1382d4afb5ceSopenharmony_ci	jwe.jws.map.buf[LJWE_IV] = (char *)jwa_b2_iv;
1383d4afb5ceSopenharmony_ci	jwe.jws.map.len[LJWE_IV] = sizeof(jwa_b2_iv);
1384d4afb5ceSopenharmony_ci
1385d4afb5ceSopenharmony_ci	jwe.jws.map.buf[LJWE_CTXT] = buf;
1386d4afb5ceSopenharmony_ci	jwe.jws.map.len[LJWE_CTXT] = sizeof(jwa_b2_e);
1387d4afb5ceSopenharmony_ci
1388d4afb5ceSopenharmony_ci	jwe.jws.map.buf[LJWE_ATAG] = (char *)jwa_b2_tag;
1389d4afb5ceSopenharmony_ci	jwe.jws.map.len[LJWE_ATAG] = sizeof(jwa_b2_tag);
1390d4afb5ceSopenharmony_ci
1391d4afb5ceSopenharmony_ci	/*
1392d4afb5ceSopenharmony_ci	 * Normally this comes from the JOSE header.  But this test vector
1393d4afb5ceSopenharmony_ci	 * doesn't have one... so...
1394d4afb5ceSopenharmony_ci	 */
1395d4afb5ceSopenharmony_ci
1396d4afb5ceSopenharmony_ci	if (lws_gencrypto_jwe_alg_to_definition("A128KW", &jwe.jose.alg))
1397d4afb5ceSopenharmony_ci		goto bail;
1398d4afb5ceSopenharmony_ci	if (lws_gencrypto_jwe_enc_to_definition("A192CBC-HS384",
1399d4afb5ceSopenharmony_ci						&jwe.jose.enc_alg))
1400d4afb5ceSopenharmony_ci		goto bail;
1401d4afb5ceSopenharmony_ci
1402d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt_cbc_hs(&jwe, jwa_b2_rawkey,
1403d4afb5ceSopenharmony_ci						    jwa_b2_a, sizeof(jwa_b2_a));
1404d4afb5ceSopenharmony_ci	if (n < 0) {
1405d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_a_cbc_hs_decrypt failed\n", __func__);
1406d4afb5ceSopenharmony_ci
1407d4afb5ceSopenharmony_ci		goto bail;
1408d4afb5ceSopenharmony_ci	}
1409d4afb5ceSopenharmony_ci
1410d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
1411d4afb5ceSopenharmony_ci	if (jwe.jws.map.len[LJWE_CTXT] < sizeof(jwa_b2_ptext) ||
1412d4afb5ceSopenharmony_ci	    lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT],jwa_b2_ptext,
1413d4afb5ceSopenharmony_ci			        sizeof(jwa_b2_ptext))) {
1414d4afb5ceSopenharmony_ci		lwsl_err("%s: plaintext AES decrypt wrong\n", __func__);
1415d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwa_b2_ptext, sizeof(jwa_b2_ptext));
1416d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],
1417d4afb5ceSopenharmony_ci				    jwe.jws.map.len[LJWE_CTXT]);
1418d4afb5ceSopenharmony_ci		goto bail;
1419d4afb5ceSopenharmony_ci	}
1420d4afb5ceSopenharmony_ci
1421d4afb5ceSopenharmony_ci	ret = 0;
1422d4afb5ceSopenharmony_ci
1423d4afb5ceSopenharmony_cibail:
1424d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
1425d4afb5ceSopenharmony_ci	if (ret)
1426d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed +++++++++++++++++++\n", __func__);
1427d4afb5ceSopenharmony_ci	else
1428d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
1429d4afb5ceSopenharmony_ci
1430d4afb5ceSopenharmony_ci	return ret;
1431d4afb5ceSopenharmony_ci}
1432d4afb5ceSopenharmony_ci
1433d4afb5ceSopenharmony_ci
1434d4afb5ceSopenharmony_ci
1435d4afb5ceSopenharmony_ci/* JWA B.3.  Test Cases for AES_256_CBC_HMAC_SHA_512
1436d4afb5ceSopenharmony_ci *
1437d4afb5ceSopenharmony_ci * Unfortunately JWA just gives this test case as hex literals, not
1438d4afb5ceSopenharmony_ci * inside a JWE.  So we have to prepare the inputs "by hand".
1439d4afb5ceSopenharmony_ci */
1440d4afb5ceSopenharmony_ci
1441d4afb5ceSopenharmony_cistatic uint8_t
1442d4afb5ceSopenharmony_ci
1443d4afb5ceSopenharmony_cijwa_b3_ptext[] = {
1444d4afb5ceSopenharmony_ci	0x41, 0x20, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72,
1445d4afb5ceSopenharmony_ci	0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20,
1446d4afb5ceSopenharmony_ci	0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74,
1447d4afb5ceSopenharmony_ci	0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75,
1448d4afb5ceSopenharmony_ci	0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
1449d4afb5ceSopenharmony_ci	0x62, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65,
1450d4afb5ceSopenharmony_ci	0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69,
1451d4afb5ceSopenharmony_ci	0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
1452d4afb5ceSopenharmony_ci	0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74,
1453d4afb5ceSopenharmony_ci	0x6f, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x69,
1454d4afb5ceSopenharmony_ci	0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,
1455d4afb5ceSopenharmony_ci	0x68, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x66,
1456d4afb5ceSopenharmony_ci	0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x65,
1457d4afb5ceSopenharmony_ci	0x6d, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f,
1458d4afb5ceSopenharmony_ci	0x75, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6e,
1459d4afb5ceSopenharmony_ci	0x76, 0x65, 0x6e, 0x69, 0x65, 0x6e, 0x63, 0x65
1460d4afb5ceSopenharmony_ci},
1461d4afb5ceSopenharmony_ci
1462d4afb5ceSopenharmony_ci
1463d4afb5ceSopenharmony_cijwa_b3_rawkey[] = {
1464d4afb5ceSopenharmony_ci	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1465d4afb5ceSopenharmony_ci	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1466d4afb5ceSopenharmony_ci	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1467d4afb5ceSopenharmony_ci	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1468d4afb5ceSopenharmony_ci	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1469d4afb5ceSopenharmony_ci	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
1470d4afb5ceSopenharmony_ci	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
1471d4afb5ceSopenharmony_ci	0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
1472d4afb5ceSopenharmony_ci},
1473d4afb5ceSopenharmony_ci
1474d4afb5ceSopenharmony_cijwa_b3_iv[] = {
1475d4afb5ceSopenharmony_ci	0x1a, 0xf3, 0x8c, 0x2d, 0xc2, 0xb9, 0x6f, 0xfd,
1476d4afb5ceSopenharmony_ci	0xd8, 0x66, 0x94, 0x09, 0x23, 0x41, 0xbc, 0x04
1477d4afb5ceSopenharmony_ci},
1478d4afb5ceSopenharmony_ci
1479d4afb5ceSopenharmony_cijwa_b3_e[] = {
1480d4afb5ceSopenharmony_ci	0x4a, 0xff, 0xaa, 0xad, 0xb7, 0x8c, 0x31, 0xc5,
1481d4afb5ceSopenharmony_ci	0xda, 0x4b, 0x1b, 0x59, 0x0d, 0x10, 0xff, 0xbd,
1482d4afb5ceSopenharmony_ci	0x3d, 0xd8, 0xd5, 0xd3, 0x02, 0x42, 0x35, 0x26,
1483d4afb5ceSopenharmony_ci	0x91, 0x2d, 0xa0, 0x37, 0xec, 0xbc, 0xc7, 0xbd,
1484d4afb5ceSopenharmony_ci	0x82, 0x2c, 0x30, 0x1d, 0xd6, 0x7c, 0x37, 0x3b,
1485d4afb5ceSopenharmony_ci	0xcc, 0xb5, 0x84, 0xad, 0x3e, 0x92, 0x79, 0xc2,
1486d4afb5ceSopenharmony_ci	0xe6, 0xd1, 0x2a, 0x13, 0x74, 0xb7, 0x7f, 0x07,
1487d4afb5ceSopenharmony_ci	0x75, 0x53, 0xdf, 0x82, 0x94, 0x10, 0x44, 0x6b,
1488d4afb5ceSopenharmony_ci	0x36, 0xeb, 0xd9, 0x70, 0x66, 0x29, 0x6a, 0xe6,
1489d4afb5ceSopenharmony_ci	0x42, 0x7e, 0xa7, 0x5c, 0x2e, 0x08, 0x46, 0xa1,
1490d4afb5ceSopenharmony_ci	0x1a, 0x09, 0xcc, 0xf5, 0x37, 0x0d, 0xc8, 0x0b,
1491d4afb5ceSopenharmony_ci	0xfe, 0xcb, 0xad, 0x28, 0xc7, 0x3f, 0x09, 0xb3,
1492d4afb5ceSopenharmony_ci	0xa3, 0xb7, 0x5e, 0x66, 0x2a, 0x25, 0x94, 0x41,
1493d4afb5ceSopenharmony_ci	0x0a, 0xe4, 0x96, 0xb2, 0xe2, 0xe6, 0x60, 0x9e,
1494d4afb5ceSopenharmony_ci	0x31, 0xe6, 0xe0, 0x2c, 0xc8, 0x37, 0xf0, 0x53,
1495d4afb5ceSopenharmony_ci	0xd2, 0x1f, 0x37, 0xff, 0x4f, 0x51, 0x95, 0x0b,
1496d4afb5ceSopenharmony_ci	0xbe, 0x26, 0x38, 0xd0, 0x9d, 0xd7, 0xa4, 0x93,
1497d4afb5ceSopenharmony_ci	0x09, 0x30, 0x80, 0x6d, 0x07, 0x03, 0xb1, 0xf6,
1498d4afb5ceSopenharmony_ci},
1499d4afb5ceSopenharmony_ci
1500d4afb5ceSopenharmony_cijwa_b3_a[] = { /* "The second principle of Auguste Kerckhoffs" */
1501d4afb5ceSopenharmony_ci	0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f,
1502d4afb5ceSopenharmony_ci	0x6e, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63,
1503d4afb5ceSopenharmony_ci	0x69, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20,
1504d4afb5ceSopenharmony_ci	0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x65, 0x20,
1505d4afb5ceSopenharmony_ci	0x4b, 0x65, 0x72, 0x63, 0x6b, 0x68, 0x6f, 0x66,
1506d4afb5ceSopenharmony_ci	0x66, 0x73
1507d4afb5ceSopenharmony_ci},
1508d4afb5ceSopenharmony_ci
1509d4afb5ceSopenharmony_cijws_b3_tag[] = {
1510d4afb5ceSopenharmony_ci	0x4d, 0xd3, 0xb4, 0xc0, 0x88, 0xa7, 0xf4, 0x5c,
1511d4afb5ceSopenharmony_ci	0x21, 0x68, 0x39, 0x64, 0x5b, 0x20, 0x12, 0xbf,
1512d4afb5ceSopenharmony_ci	0x2e, 0x62, 0x69, 0xa8, 0xc5, 0x6a, 0x81, 0x6d,
1513d4afb5ceSopenharmony_ci	0xbc, 0x1b, 0x26, 0x77, 0x61, 0x95, 0x5b, 0xc5
1514d4afb5ceSopenharmony_ci}
1515d4afb5ceSopenharmony_ci;
1516d4afb5ceSopenharmony_ci
1517d4afb5ceSopenharmony_cistatic int
1518d4afb5ceSopenharmony_citest_jwa_b3(struct lws_context *context)
1519d4afb5ceSopenharmony_ci{
1520d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
1521d4afb5ceSopenharmony_ci	char buf[2048];
1522d4afb5ceSopenharmony_ci	int n, ret = -1;
1523d4afb5ceSopenharmony_ci
1524d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
1525d4afb5ceSopenharmony_ci
1526d4afb5ceSopenharmony_ci	/*
1527d4afb5ceSopenharmony_ci	 * normally all this is interpreted from the JWE blob.  But we don't
1528d4afb5ceSopenharmony_ci	 * have JWE test vectors for AES_256_CBC_HMAC_SHA_512, just a standalone
1529d4afb5ceSopenharmony_ci	 * one.  So we have to create it all by hand.
1530d4afb5ceSopenharmony_ci	 *
1531d4afb5ceSopenharmony_ci	 * See test_jwe_a3 above for a more normal usage pattern.
1532d4afb5ceSopenharmony_ci	 */
1533d4afb5ceSopenharmony_ci
1534d4afb5ceSopenharmony_ci	lws_jwk_dup_oct(&jwe.jwk, jwa_b3_rawkey, sizeof(jwa_b3_rawkey));
1535d4afb5ceSopenharmony_ci
1536d4afb5ceSopenharmony_ci	memcpy(buf, jwa_b3_e, sizeof(jwa_b3_e));
1537d4afb5ceSopenharmony_ci
1538d4afb5ceSopenharmony_ci	jwe.jws.map.buf[LJWE_IV] = (char *)jwa_b3_iv;
1539d4afb5ceSopenharmony_ci	jwe.jws.map.len[LJWE_IV] = sizeof(jwa_b3_iv);
1540d4afb5ceSopenharmony_ci
1541d4afb5ceSopenharmony_ci	jwe.jws.map.buf[LJWE_CTXT] = buf;
1542d4afb5ceSopenharmony_ci	jwe.jws.map.len[LJWE_CTXT] = sizeof(jwa_b3_e);
1543d4afb5ceSopenharmony_ci
1544d4afb5ceSopenharmony_ci	jwe.jws.map.buf[LJWE_ATAG] = (char *)jws_b3_tag;
1545d4afb5ceSopenharmony_ci	jwe.jws.map.len[LJWE_ATAG] = sizeof(jws_b3_tag);
1546d4afb5ceSopenharmony_ci
1547d4afb5ceSopenharmony_ci	/*
1548d4afb5ceSopenharmony_ci	 * Normally this comes from the JOSE header.  But this test vector
1549d4afb5ceSopenharmony_ci	 * doesn't feature one...
1550d4afb5ceSopenharmony_ci	 */
1551d4afb5ceSopenharmony_ci
1552d4afb5ceSopenharmony_ci	if (lws_gencrypto_jwe_alg_to_definition("A128KW", &jwe.jose.alg))
1553d4afb5ceSopenharmony_ci		goto bail;
1554d4afb5ceSopenharmony_ci	if (lws_gencrypto_jwe_enc_to_definition("A256CBC-HS512",
1555d4afb5ceSopenharmony_ci						&jwe.jose.enc_alg))
1556d4afb5ceSopenharmony_ci		goto bail;
1557d4afb5ceSopenharmony_ci
1558d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt_cbc_hs(&jwe, jwa_b3_rawkey,
1559d4afb5ceSopenharmony_ci						    jwa_b3_a, sizeof(jwa_b3_a));
1560d4afb5ceSopenharmony_ci	if (n < 0) {
1561d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_a_cbc_hs_decrypt failed\n", __func__);
1562d4afb5ceSopenharmony_ci
1563d4afb5ceSopenharmony_ci		goto bail;
1564d4afb5ceSopenharmony_ci	}
1565d4afb5ceSopenharmony_ci
1566d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
1567d4afb5ceSopenharmony_ci	if (jwe.jws.map.len[LJWE_CTXT] < sizeof(jwa_b3_ptext) ||
1568d4afb5ceSopenharmony_ci	    lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT],jwa_b3_ptext,
1569d4afb5ceSopenharmony_ci			        sizeof(jwa_b3_ptext))) {
1570d4afb5ceSopenharmony_ci		lwsl_err("%s: plaintext AES decrypt wrong\n", __func__);
1571d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwa_b3_ptext, sizeof(jwa_b3_ptext));
1572d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],
1573d4afb5ceSopenharmony_ci				    jwe.jws.map.len[LJWE_CTXT]);
1574d4afb5ceSopenharmony_ci		goto bail;
1575d4afb5ceSopenharmony_ci	}
1576d4afb5ceSopenharmony_ci
1577d4afb5ceSopenharmony_ci	ret = 0;
1578d4afb5ceSopenharmony_ci
1579d4afb5ceSopenharmony_cibail:
1580d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
1581d4afb5ceSopenharmony_ci
1582d4afb5ceSopenharmony_ci	if (ret)
1583d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed ++++++++++++++++++++\n", __func__);
1584d4afb5ceSopenharmony_ci	else
1585d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
1586d4afb5ceSopenharmony_ci
1587d4afb5ceSopenharmony_ci	return ret;
1588d4afb5ceSopenharmony_ci}
1589d4afb5ceSopenharmony_ci
1590d4afb5ceSopenharmony_ci/* JWA C.  Example ECDH-ES Key Agreement Computation
1591d4afb5ceSopenharmony_ci *
1592d4afb5ceSopenharmony_ci * This example uses ECDH-ES Key Agreement and the Concat KDF to derive
1593d4afb5ceSopenharmony_ci * the CEK in the manner described in Section 4.6.  In this example, the
1594d4afb5ceSopenharmony_ci * ECDH-ES Direct Key Agreement mode ("alg" value "ECDH-ES") is used to
1595d4afb5ceSopenharmony_ci * produce an agreed-upon key for AES GCM with a 128-bit key ("enc"
1596d4afb5ceSopenharmony_ci * value "A128GCM").
1597d4afb5ceSopenharmony_ci *
1598d4afb5ceSopenharmony_ci * In this example, a producer Alice is encrypting content to a consumer
1599d4afb5ceSopenharmony_ci * Bob.  The producer (Alice) generates an ephemeral key for the key
1600d4afb5ceSopenharmony_ci * agreement computation.
1601d4afb5ceSopenharmony_ci *
1602d4afb5ceSopenharmony_ci * JWA Appendix C where this comes from ONLY goes as far as to confirm the
1603d4afb5ceSopenharmony_ci * direct derived key, it doesn't do any AES128-GCM.
1604d4afb5ceSopenharmony_ci */
1605d4afb5ceSopenharmony_ci
1606d4afb5ceSopenharmony_cistatic const char
1607d4afb5ceSopenharmony_ci
1608d4afb5ceSopenharmony_ci*ex_jwa_c_jose =
1609d4afb5ceSopenharmony_ci	"{\"alg\":\"ECDH-ES\","
1610d4afb5ceSopenharmony_ci	 "\"enc\":\"A128GCM\","
1611d4afb5ceSopenharmony_ci	 "\"apu\":\"QWxpY2U\","	/* b64u("Alice") */
1612d4afb5ceSopenharmony_ci	 "\"apv\":\"Qm9i\","	/* b64u("Bob") */
1613d4afb5ceSopenharmony_ci	 "\"epk\":" /* public part of A's ephemeral key */
1614d4afb5ceSopenharmony_ci	 "{\"kty\":\"EC\","
1615d4afb5ceSopenharmony_ci	  "\"crv\":\"P-256\","
1616d4afb5ceSopenharmony_ci	  "\"x\":\"gI0GAILBdu7T53akrFmMyGcsF3n5dO7MmwNBHKW5SV0\","
1617d4afb5ceSopenharmony_ci	  "\"y\":\"SLW_xSffzlPWrHEVI30DHM_4egVwt3NQqeUD7nMFpps\""
1618d4afb5ceSopenharmony_ci	 "}"
1619d4afb5ceSopenharmony_ci	"}"
1620d4afb5ceSopenharmony_ci;
1621d4afb5ceSopenharmony_ci
1622d4afb5ceSopenharmony_cistatic uint8_t
1623d4afb5ceSopenharmony_ciex_jwa_c_z[] = {
1624d4afb5ceSopenharmony_ci	158,  86, 217,  29, 129, 113,  53, 211,
1625d4afb5ceSopenharmony_ci	114, 131,  66, 131, 191, 132,  38, 156,
1626d4afb5ceSopenharmony_ci	251,  49, 110, 163, 218, 128, 106,  72,
1627d4afb5ceSopenharmony_ci	246, 218, 167, 121, 140, 254, 144, 196
1628d4afb5ceSopenharmony_ci},
1629d4afb5ceSopenharmony_ciex_jwa_c_derived_key[] = {
1630d4afb5ceSopenharmony_ci	 86, 170, 141, 234, 248,  35, 109,  32,
1631d4afb5ceSopenharmony_ci	 92,  34,  40, 205, 113, 167,  16,  26
1632d4afb5ceSopenharmony_ci};
1633d4afb5ceSopenharmony_ci
1634d4afb5ceSopenharmony_ci
1635d4afb5ceSopenharmony_cistatic int
1636d4afb5ceSopenharmony_citest_jwa_c(struct lws_context *context)
1637d4afb5ceSopenharmony_ci{
1638d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
1639d4afb5ceSopenharmony_ci	char temp[2048], *p;
1640d4afb5ceSopenharmony_ci	int ret = -1, temp_len = sizeof(temp);
1641d4afb5ceSopenharmony_ci
1642d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
1643d4afb5ceSopenharmony_ci
1644d4afb5ceSopenharmony_ci	/*
1645d4afb5ceSopenharmony_ci	 * again the JWA Appendix C test vectors are not in the form of a
1646d4afb5ceSopenharmony_ci	 * complete JWE, but just the JWE JOSE header, so we must fake up the
1647d4afb5ceSopenharmony_ci	 * pieces and perform just the (normally internal) key agreement step
1648d4afb5ceSopenharmony_ci	 * for this test.
1649d4afb5ceSopenharmony_ci	 *
1650d4afb5ceSopenharmony_ci	 * See test_jwe_a3 above for a more normal usage pattern.
1651d4afb5ceSopenharmony_ci	 */
1652d4afb5ceSopenharmony_ci
1653d4afb5ceSopenharmony_ci	if (lws_jwe_parse_jose(&jwe.jose, ex_jwa_c_jose, (int)strlen(ex_jwa_c_jose),
1654d4afb5ceSopenharmony_ci			       temp, &temp_len) < 0) {
1655d4afb5ceSopenharmony_ci		lwsl_err("%s: JOSE parse failed\n", __func__);
1656d4afb5ceSopenharmony_ci
1657d4afb5ceSopenharmony_ci		goto bail;
1658d4afb5ceSopenharmony_ci	}
1659d4afb5ceSopenharmony_ci
1660d4afb5ceSopenharmony_ci	/*
1661d4afb5ceSopenharmony_ci	 * The ephemeral key has been parsed into a jwk "jwe.jose.jwk_ephemeral"
1662d4afb5ceSopenharmony_ci	 *
1663d4afb5ceSopenharmony_ci	 *  In this example, the ECDH-ES Direct Key Agreement mode ("alg" value
1664d4afb5ceSopenharmony_ci	 *  "ECDH-ES") is used to produce an agreed-upon key for AES GCM with a
1665d4afb5ceSopenharmony_ci	 *  128-bit key ("enc" value "A128GCM").
1666d4afb5ceSopenharmony_ci	 */
1667d4afb5ceSopenharmony_ci
1668d4afb5ceSopenharmony_ci	p = lws_concat_temp(temp, temp_len);
1669d4afb5ceSopenharmony_ci
1670d4afb5ceSopenharmony_ci	if (lws_jwa_concat_kdf(&jwe, 1, (uint8_t *)p,
1671d4afb5ceSopenharmony_ci			       ex_jwa_c_z, sizeof(ex_jwa_c_z))) {
1672d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwa_concat_kdf failed\n", __func__);
1673d4afb5ceSopenharmony_ci
1674d4afb5ceSopenharmony_ci		goto bail;
1675d4afb5ceSopenharmony_ci	}
1676d4afb5ceSopenharmony_ci
1677d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
1678d4afb5ceSopenharmony_ci	if (lws_timingsafe_bcmp(p, ex_jwa_c_derived_key,
1679d4afb5ceSopenharmony_ci			        sizeof(ex_jwa_c_derived_key))) {
1680d4afb5ceSopenharmony_ci		lwsl_err("%s: ECDH-ES direct derived key wrong\n", __func__);
1681d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(ex_jwa_c_derived_key,
1682d4afb5ceSopenharmony_ci				    sizeof(ex_jwa_c_derived_key));
1683d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(p, sizeof(ex_jwa_c_derived_key));
1684d4afb5ceSopenharmony_ci		goto bail;
1685d4afb5ceSopenharmony_ci	}
1686d4afb5ceSopenharmony_ci
1687d4afb5ceSopenharmony_ci	ret = 0;
1688d4afb5ceSopenharmony_ci
1689d4afb5ceSopenharmony_cibail:
1690d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
1691d4afb5ceSopenharmony_ci
1692d4afb5ceSopenharmony_ci	if (ret)
1693d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed +++++++++++++++++++\n", __func__);
1694d4afb5ceSopenharmony_ci	else
1695d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
1696d4afb5ceSopenharmony_ci
1697d4afb5ceSopenharmony_ci	return ret;
1698d4afb5ceSopenharmony_ci}
1699d4afb5ceSopenharmony_ci
1700d4afb5ceSopenharmony_ci
1701d4afb5ceSopenharmony_ci/*
1702d4afb5ceSopenharmony_ci * ECDH-ES Homebrew Encryption test
1703d4afb5ceSopenharmony_ci */
1704d4afb5ceSopenharmony_ci
1705d4afb5ceSopenharmony_cistatic const char
1706d4afb5ceSopenharmony_ci
1707d4afb5ceSopenharmony_ci	/* peer key */
1708d4afb5ceSopenharmony_ci
1709d4afb5ceSopenharmony_ci*ecdhes_t1_peer_p256_public_key = /* as below but with d removed */
1710d4afb5ceSopenharmony_ci	"{"
1711d4afb5ceSopenharmony_ci	 "\"crv\":\"P-256\","
1712d4afb5ceSopenharmony_ci	 "\"kty\":\"EC\","
1713d4afb5ceSopenharmony_ci	 "\"x\":\"ySlIGttmXG80WPjDO01QaXg7oAzW3NE-a-GF0NDGk_E\","
1714d4afb5ceSopenharmony_ci	 "\"y\":\"i08k5z4ppqgtnLK8lh5qw4qp2FhxPdGjovgilajluuw\""
1715d4afb5ceSopenharmony_ci	"}",
1716d4afb5ceSopenharmony_ci
1717d4afb5ceSopenharmony_ci*ecdhes_t1_peer_p256_private_key = /* created by ./lws-crypto-jwk -t EC */
1718d4afb5ceSopenharmony_ci	"{"
1719d4afb5ceSopenharmony_ci	 "\"crv\":\"P-256\","
1720d4afb5ceSopenharmony_ci	 "\"d\":\"ldszv0_cGFMkjxaPspGCP6X0NAaVCVeK48oH4RzT2T0\","
1721d4afb5ceSopenharmony_ci	 "\"kty\":\"EC\","
1722d4afb5ceSopenharmony_ci	 "\"x\":\"ySlIGttmXG80WPjDO01QaXg7oAzW3NE-a-GF0NDGk_E\","
1723d4afb5ceSopenharmony_ci	 "\"y\":\"i08k5z4ppqgtnLK8lh5qw4qp2FhxPdGjovgilajluuw\""
1724d4afb5ceSopenharmony_ci	"}",
1725d4afb5ceSopenharmony_ci
1726d4afb5ceSopenharmony_ci*ecdhes_t1_peer_p384_public_key = /* as below but with d removed */
1727d4afb5ceSopenharmony_ci	"{\"crv\":\"P-384\","
1728d4afb5ceSopenharmony_ci	 "\"kty\":\"EC\","
1729d4afb5ceSopenharmony_ci	 "\"x\":\"injKcygDoG1AuP044ct88r_2DNinHr1CGqy4q2Sy5yo034Y"
1730d4afb5ceSopenharmony_ci		 "7yQ5_NT-lEUXrzlIW\","
1731d4afb5ceSopenharmony_ci	 "\"y\":\"y52QaJLhVm-ts8xa1jL8GkmwGm_dX6xV1PSq4s3pbwx2Hu9"
1732d4afb5ceSopenharmony_ci		 "X29z5WYcTPFOCPtwJ\"}",
1733d4afb5ceSopenharmony_ci
1734d4afb5ceSopenharmony_ci*ecdhes_t1_peer_p384_private_key = /* created by ./lws-crypto-jwk -t EC -v "P-384" */
1735d4afb5ceSopenharmony_ci	"{\"crv\":\"P-384\","
1736d4afb5ceSopenharmony_ci	 "\"d\":\"jYGze6ZwZxrflVx_I2lYWNf9GkfbeQNRwQCdtZhBlb85lk-"
1737d4afb5ceSopenharmony_ci		 "SAvaZuNiRUs_eWmPQ\","
1738d4afb5ceSopenharmony_ci	 "\"kty\":\"EC\","
1739d4afb5ceSopenharmony_ci	 "\"x\":\"injKcygDoG1AuP044ct88r_2DNinHr1CGqy4q2Sy5yo034Y"
1740d4afb5ceSopenharmony_ci		 "7yQ5_NT-lEUXrzlIW\","
1741d4afb5ceSopenharmony_ci	 "\"y\":\"y52QaJLhVm-ts8xa1jL8GkmwGm_dX6xV1PSq4s3pbwx2Hu9"
1742d4afb5ceSopenharmony_ci		 "X29z5WYcTPFOCPtwJ\"}",
1743d4afb5ceSopenharmony_ci
1744d4afb5ceSopenharmony_ci *ecdhes_t1_peer_p521_public_key = /* as below but with d removed */
1745d4afb5ceSopenharmony_ci	"{\"crv\":\"P-521\","
1746d4afb5ceSopenharmony_ci	 "\"kty\":\"EC\","
1747d4afb5ceSopenharmony_ci	 "\"x\":\"AYe0gAkPzzjeQW5Ek9tVrWdfi0u6k7LVUru-b2x7V9EM3d"
1748d4afb5ceSopenharmony_ci		 "L4SbQiS1p2j2gmZ2a6aDoKDRU_2E4u9EQrlswlty-g\","
1749d4afb5ceSopenharmony_ci	 "\"y\":\"AEAIIRkVL0WhtDlDSM7dciBtL1dOo5UPiW7ixIOv5K75Mo"
1750d4afb5ceSopenharmony_ci		 "uFNWO7cFmcxaCOn9459ex0giVyptmX_956C_DWabG6\"}",
1751d4afb5ceSopenharmony_ci
1752d4afb5ceSopenharmony_ci*ecdhes_t1_peer_p521_private_key = /* created by ./lws-crypto-jwk -t EC -v "P-521" */
1753d4afb5ceSopenharmony_ci	"{\"crv\":\"P-521\","
1754d4afb5ceSopenharmony_ci	 "\"d\":\"AUer7_-qJtQtDWN6CMeGB20rzTa648kpsfidTOu3lnn6__"
1755d4afb5ceSopenharmony_ci		 "yOXkMj1yTYUBjVOnUjGHiTU1rCGsw4CyF-1nDRe7SM\","
1756d4afb5ceSopenharmony_ci	 "\"kty\":\"EC\","
1757d4afb5ceSopenharmony_ci	 "\"x\":\"AYe0gAkPzzjeQW5Ek9tVrWdfi0u6k7LVUru-b2x7V9EM3d"
1758d4afb5ceSopenharmony_ci		 "L4SbQiS1p2j2gmZ2a6aDoKDRU_2E4u9EQrlswlty-g\","
1759d4afb5ceSopenharmony_ci	 "\"y\":\"AEAIIRkVL0WhtDlDSM7dciBtL1dOo5UPiW7ixIOv5K75Mo"
1760d4afb5ceSopenharmony_ci		 "uFNWO7cFmcxaCOn9459ex0giVyptmX_956C_DWabG6\"}",
1761d4afb5ceSopenharmony_ci
1762d4afb5ceSopenharmony_ci*ecdhes_t1_jose_hdr_es_128 =
1763d4afb5ceSopenharmony_ci	"{\"alg\":\"ECDH-ES\",\"enc\":\"A128CBC-HS256\"}",
1764d4afb5ceSopenharmony_ci
1765d4afb5ceSopenharmony_ci*ecdhes_t1_jose_hdr_es_192 =
1766d4afb5ceSopenharmony_ci	"{\"alg\":\"ECDH-ES\",\"enc\":\"A192CBC-HS384\"}",
1767d4afb5ceSopenharmony_ci
1768d4afb5ceSopenharmony_ci*ecdhes_t1_jose_hdr_es_256 =
1769d4afb5ceSopenharmony_ci	"{\"alg\":\"ECDH-ES\",\"enc\":\"A256CBC-HS512\"}",
1770d4afb5ceSopenharmony_ci
1771d4afb5ceSopenharmony_ci*ecdhes_t1_jose_hdr_esakw128_128 =
1772d4afb5ceSopenharmony_ci	"{\"alg\":\"ECDH-ES+A128KW\",\"enc\":\"A128CBC-HS256\"}",
1773d4afb5ceSopenharmony_ci
1774d4afb5ceSopenharmony_ci*ecdhes_t1_jose_hdr_esakw192_192 =
1775d4afb5ceSopenharmony_ci	"{\"alg\":\"ECDH-ES+A192KW\",\"enc\":\"A192CBC-HS384\"}",
1776d4afb5ceSopenharmony_ci
1777d4afb5ceSopenharmony_ci*ecdhes_t1_jose_hdr_esakw256_256 =
1778d4afb5ceSopenharmony_ci	"{\"alg\":\"ECDH-ES+A256KW\",\"enc\":\"A256CBC-HS512\"}",
1779d4afb5ceSopenharmony_ci
1780d4afb5ceSopenharmony_ci*ecdhes_t1_plaintext =
1781d4afb5ceSopenharmony_ci	"This test plaintext is exactly 64 bytes long when unencrypted..."
1782d4afb5ceSopenharmony_ci;
1783d4afb5ceSopenharmony_ci
1784d4afb5ceSopenharmony_cistatic int
1785d4afb5ceSopenharmony_citest_ecdhes_t1(struct lws_context *context, const char *jose_hdr,
1786d4afb5ceSopenharmony_ci	       const char *peer_pubkey, const char *peer_privkey)
1787d4afb5ceSopenharmony_ci{
1788d4afb5ceSopenharmony_ci	char temp[3072], compact[2048];
1789d4afb5ceSopenharmony_ci	int n, ret = -1, temp_len = sizeof(temp);
1790d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
1791d4afb5ceSopenharmony_ci
1792d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
1793d4afb5ceSopenharmony_ci
1794d4afb5ceSopenharmony_ci	/* read and interpret our canned JOSE header, setting the algorithm */
1795d4afb5ceSopenharmony_ci
1796d4afb5ceSopenharmony_ci	if (lws_jws_dup_element(&jwe.jws.map, LJWS_JOSE,
1797d4afb5ceSopenharmony_ci				lws_concat_temp(temp, temp_len), &temp_len,
1798d4afb5ceSopenharmony_ci				jose_hdr, strlen(jose_hdr), 0))
1799d4afb5ceSopenharmony_ci		goto bail;
1800d4afb5ceSopenharmony_ci
1801d4afb5ceSopenharmony_ci	if (lws_jwe_parse_jose(&jwe.jose, jose_hdr, (int)strlen(jose_hdr),
1802d4afb5ceSopenharmony_ci			       temp, &temp_len) < 0) {
1803d4afb5ceSopenharmony_ci		lwsl_err("%s: JOSE parse failed\n", __func__);
1804d4afb5ceSopenharmony_ci
1805d4afb5ceSopenharmony_ci		goto bail;
1806d4afb5ceSopenharmony_ci	}
1807d4afb5ceSopenharmony_ci
1808d4afb5ceSopenharmony_ci	/* for ecdh-es encryption, we need the peer's pubkey */
1809d4afb5ceSopenharmony_ci
1810d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, (char *)peer_pubkey,
1811d4afb5ceSopenharmony_ci			   strlen((char *)peer_pubkey)) < 0) {
1812d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
1813d4afb5ceSopenharmony_ci		goto bail;
1814d4afb5ceSopenharmony_ci	}
1815d4afb5ceSopenharmony_ci
1816d4afb5ceSopenharmony_ci	/*
1817d4afb5ceSopenharmony_ci	 * dup the plaintext into the ciphertext element, it will be
1818d4afb5ceSopenharmony_ci	 * encrypted in-place to a ciphertext of the same length + padding
1819d4afb5ceSopenharmony_ci	 */
1820d4afb5ceSopenharmony_ci
1821d4afb5ceSopenharmony_ci	if (lws_jws_dup_element(&jwe.jws.map, LJWE_CTXT,
1822d4afb5ceSopenharmony_ci				lws_concat_temp(temp, temp_len), &temp_len,
1823d4afb5ceSopenharmony_ci				ecdhes_t1_plaintext,
1824d4afb5ceSopenharmony_ci				strlen(ecdhes_t1_plaintext),
1825d4afb5ceSopenharmony_ci				lws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,
1826d4afb5ceSopenharmony_ci						strlen(ecdhes_t1_plaintext)))) {
1827d4afb5ceSopenharmony_ci		lwsl_notice("%s: Not enough temp space for ptext\n", __func__);
1828d4afb5ceSopenharmony_ci		goto bail;
1829d4afb5ceSopenharmony_ci	}
1830d4afb5ceSopenharmony_ci
1831d4afb5ceSopenharmony_ci	/*
1832d4afb5ceSopenharmony_ci	 * perform the actual encryption
1833d4afb5ceSopenharmony_ci	 */
1834d4afb5ceSopenharmony_ci
1835d4afb5ceSopenharmony_ci	n = lws_jwe_encrypt(&jwe, lws_concat_temp(temp, temp_len), &temp_len);
1836d4afb5ceSopenharmony_ci	if (n < 0) {
1837d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_encrypt failed\n", __func__);
1838d4afb5ceSopenharmony_ci		goto bail;
1839d4afb5ceSopenharmony_ci	}
1840d4afb5ceSopenharmony_ci
1841d4afb5ceSopenharmony_ci	/*
1842d4afb5ceSopenharmony_ci	 * format for output
1843d4afb5ceSopenharmony_ci	 */
1844d4afb5ceSopenharmony_ci
1845d4afb5ceSopenharmony_ci	n = lws_jwe_render_flattened(&jwe, compact, sizeof(compact));
1846d4afb5ceSopenharmony_ci	if (n < 0) {
1847d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_render_compact failed: %d\n",
1848d4afb5ceSopenharmony_ci			 __func__, n);
1849d4afb5ceSopenharmony_ci		goto bail;
1850d4afb5ceSopenharmony_ci	}
1851d4afb5ceSopenharmony_ci
1852d4afb5ceSopenharmony_ci	// puts(compact);
1853d4afb5ceSopenharmony_ci
1854d4afb5ceSopenharmony_ci	n = lws_jwe_render_compact(&jwe, compact, sizeof(compact));
1855d4afb5ceSopenharmony_ci	if (n < 0) {
1856d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_render_compact failed: %d\n",
1857d4afb5ceSopenharmony_ci			 __func__, n);
1858d4afb5ceSopenharmony_ci		goto bail;
1859d4afb5ceSopenharmony_ci	}
1860d4afb5ceSopenharmony_ci
1861d4afb5ceSopenharmony_ci	// puts(compact);
1862d4afb5ceSopenharmony_ci
1863d4afb5ceSopenharmony_ci	/* okay, let's try to decrypt the whole thing, as the recipient
1864d4afb5ceSopenharmony_ci	 * getting the compact.  jws->jwk needs to be our private key.  */
1865d4afb5ceSopenharmony_ci
1866d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
1867d4afb5ceSopenharmony_ci	temp_len = sizeof(temp);
1868d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
1869d4afb5ceSopenharmony_ci
1870d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, (char *)peer_privkey,
1871d4afb5ceSopenharmony_ci			   strlen((char *)peer_privkey)) < 0) {
1872d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
1873d4afb5ceSopenharmony_ci		goto bail;
1874d4afb5ceSopenharmony_ci	}
1875d4afb5ceSopenharmony_ci
1876d4afb5ceSopenharmony_ci	/* converts a compact serialization to jws b64 + decoded maps */
1877d4afb5ceSopenharmony_ci	if (lws_jws_compact_decode(compact, (int)strlen(compact), &jwe.jws.map,
1878d4afb5ceSopenharmony_ci				   &jwe.jws.map_b64, temp, &temp_len) != 5) {
1879d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jws_compact_decode failed\n", __func__);
1880d4afb5ceSopenharmony_ci		goto bail;
1881d4afb5ceSopenharmony_ci	}
1882d4afb5ceSopenharmony_ci
1883d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt(&jwe, lws_concat_temp(temp, temp_len),
1884d4afb5ceSopenharmony_ci				     &temp_len);
1885d4afb5ceSopenharmony_ci	if (n < 0) {
1886d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_auth_and_decrypt failed\n",
1887d4afb5ceSopenharmony_ci			 __func__);
1888d4afb5ceSopenharmony_ci		goto bail;
1889d4afb5ceSopenharmony_ci	}
1890d4afb5ceSopenharmony_ci
1891d4afb5ceSopenharmony_ci	ret = 0;
1892d4afb5ceSopenharmony_ci
1893d4afb5ceSopenharmony_cibail:
1894d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
1895d4afb5ceSopenharmony_ci	if (ret)
1896d4afb5ceSopenharmony_ci		lwsl_err("%s: %s selftest failed +++++++++++++++++++\n",
1897d4afb5ceSopenharmony_ci			 __func__, jose_hdr);
1898d4afb5ceSopenharmony_ci	else
1899d4afb5ceSopenharmony_ci		lwsl_notice("%s: %s selftest OK\n", __func__, jose_hdr);
1900d4afb5ceSopenharmony_ci
1901d4afb5ceSopenharmony_ci	return ret;
1902d4afb5ceSopenharmony_ci}
1903d4afb5ceSopenharmony_ci
1904d4afb5ceSopenharmony_ci/* AES Key Wrap and AES_XXX_CBC_HMAC_SHA_YYY variations
1905d4afb5ceSopenharmony_ci *
1906d4afb5ceSopenharmony_ci * These were created using the node-jose node.js package
1907d4afb5ceSopenharmony_ci */
1908d4afb5ceSopenharmony_cistatic const char
1909d4afb5ceSopenharmony_ci	*akw_ptext = "plaintext0123456",
1910d4afb5ceSopenharmony_ci	*akw_ct_128_128 = "eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Ii"
1911d4afb5ceSopenharmony_ci	"wia2lkIjoiLTRXTEpQNWNrYUxBUFFFNXkwYXhLT0JUSTlFTngxUXBCa0toNkdOY2loOC"
1912d4afb5ceSopenharmony_ci	"J9.h6oNSEgz3LwIMndEkPEa8H7_5zy0hh8TaU_1yWoNtu4Dh_WJpEgx9g.j7TYjj8wB0"
1913d4afb5ceSopenharmony_ci	"RS6rclTWYmqw.zm3tPzuWhXoD7IsAWbA0xz-AJXvE9gydWPRBTaO40sQ.Okf7ttWDLPM"
1914d4afb5ceSopenharmony_ci	"wIj1kUyUO_A",
1915d4afb5ceSopenharmony_ci	*akw_ct_128_192 = "eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0Ii"
1916d4afb5ceSopenharmony_ci	"wia2lkIjoiLTRXTEpQNWNrYUxBUFFFNXkwYXhLT0JUSTlFTngxUXBCa0toNkdOY2loOC"
1917d4afb5ceSopenharmony_ci	"J9.XkRTu4nP3b0KZxXjkjdHEnbf6AWZUmFvpsqZLuLxKcrONqDUsnYasnVuo6U0QKRUm"
1918d4afb5ceSopenharmony_ci	"cyBRtSPGW4.MzNxxoOp8JR2AHoLNve-vw.rdxgo6InRAxk3afG02_75l58u5m6KYHd3h"
1919d4afb5ceSopenharmony_ci	"LH16ksnZE.v7BLKaRZIwhUPhhBRTd8yPwH0xa1fOft",
1920d4afb5ceSopenharmony_ci	*akw_ct_128_256 = "eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIi"
1921d4afb5ceSopenharmony_ci	"wia2lkIjoiLTRXTEpQNWNrYUxBUFFFNXkwYXhLT0JUSTlFTngxUXBCa0toNkdOY2loOC"
1922d4afb5ceSopenharmony_ci	"J9.mueR-8XzXs2RyvzzvghpIpGS1mGl7vkSjJDF5zqhH8-ektBpCXSd7R7MS5nh2-Xf_"
1923d4afb5ceSopenharmony_ci	"8XDym1gn1QEQh5bDI3GPESnSN1TJR-h.g6plL_5L2BD8wcjZS7X79A.UTndfTFhGFaVZ"
1924d4afb5ceSopenharmony_ci	"vWqPkV7dN00gckesd_7UylosVDqjwU.-rgi0jkYuCZDMwUVLxN6e6x8fXw2U0u4-vL8u"
1925d4afb5ceSopenharmony_ci	"Kb__S8",
1926d4afb5ceSopenharmony_ci	*akw_ct_192_128 = "eyJhbGciOiJBMTkyS1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Ii"
1927d4afb5ceSopenharmony_ci	"wia2lkIjoiai10RWp2Q2JyNVlUZWtKUXlES3kyQXh5cjBWeUlUWXk4S3IycjB0cy1USS"
1928d4afb5ceSopenharmony_ci	"J9.mEURnj2NvPa3TU0uR8mcm2cMd33Y6iYYZ_LFrYS_Gz49gcdxZpdk1Q.v3csq81X9o"
1929d4afb5ceSopenharmony_ci	"mI-bcp6i-FTQ.EgroRqmqNfeH7XC9msLap1IGcqvc09SlnI4PO6RQqS0.hDi57mXD3vX"
1930d4afb5ceSopenharmony_ci	"dx2r4Kwnv9w",
1931d4afb5ceSopenharmony_ci	*akw_ct_192_192 = "eyJhbGciOiJBMTkyS1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0Ii"
1932d4afb5ceSopenharmony_ci	"wia2lkIjoiai10RWp2Q2JyNVlUZWtKUXlES3kyQXh5cjBWeUlUWXk4S3IycjB0cy1USS"
1933d4afb5ceSopenharmony_ci	"J9.QHgtusQdP7Zvw9tsCZNkJyEmzg6KUaaIyTb2BXB0ng9mxSUIQ7y_6oqasYKBUJgBn"
1934d4afb5ceSopenharmony_ci	"Koru-3CXOE.ZZXcGY35mmlAb4-IgA5XlQ.AuG2GRPeYJ80_4XoYAUgXbVY65ZQ689Grn"
1935d4afb5ceSopenharmony_ci	"x8RCNQdfc.UjfgDr4z3PGQBdftWT2gqx1Egfd9PUR4",
1936d4afb5ceSopenharmony_ci	*akw_ct_192_256 = "eyJhbGciOiJBMTkyS1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIi"
1937d4afb5ceSopenharmony_ci	"wia2lkIjoiai10RWp2Q2JyNVlUZWtKUXlES3kyQXh5cjBWeUlUWXk4S3IycjB0cy1USS"
1938d4afb5ceSopenharmony_ci	"J9.G6DziymYyU3-6unIa-Oz-0lksH05OJFDZKkFuShMuoazEMZ5ZH2S_65qD-pjpf8aN"
1939d4afb5ceSopenharmony_ci	"2thOVOYT0mdtgFM0ARUfx8ZLhRFCcn1.yEKK4eARZIo9WtGVcQmgDQ.ovan2NXDmt_Ka"
1940d4afb5ceSopenharmony_ci	"SsVJmhIMQqVz6meqz1oExfVcY8vdzA.R3T4lQIKX5cc2Ktv42e9u5PR--v_w2uK7F4Wp"
1941d4afb5ceSopenharmony_ci	"Sr5SQ8",
1942d4afb5ceSopenharmony_ci	*akw_ct_256_128 = "eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Ii"
1943d4afb5ceSopenharmony_ci	"wia2lkIjoiSDVwSzRRUU81U0tHbDA3UXhIdk9YMzVqS2FJbzA2NXVLdWRubVZFZVpJYy"
1944d4afb5ceSopenharmony_ci	"J9.ZLWrz5CE7Iav2db37VL9ZABeaRVrV9af-7-46Loc9M2D0SPSNtsxpg.ktk-VU8-5b"
1945d4afb5ceSopenharmony_ci	"XRvW_A6IqDjQ.xZVIglOhadDBHUYuxPx6Wr_YzOo0qCDH24xVe58qP9Q.pO_tME930wO"
1946d4afb5ceSopenharmony_ci	"u5fNJ8ubGrw",
1947d4afb5ceSopenharmony_ci	*akw_ct_256_192 = "eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0Ii"
1948d4afb5ceSopenharmony_ci	"wia2lkIjoiSDVwSzRRUU81U0tHbDA3UXhIdk9YMzVqS2FJbzA2NXVLdWRubVZFZVpJYy"
1949d4afb5ceSopenharmony_ci	"J9.fcblAVZ7VOXtyhymqxDBr-zgvId18p3AURNbhH5FmAvKNuUVU37xPkz6BrFopLP0J"
1950d4afb5ceSopenharmony_ci	"jqXaTyyg1s.fprTe2e0esH2w7EnLEgBZQ.g1BI0U1aKSM_JBEp9jC4BxBaFXVG5BW4nl"
1951d4afb5ceSopenharmony_ci	"bhX1MDeLo.XOLanrIkitLLDRONnfM05avahl_lJ_UY",
1952d4afb5ceSopenharmony_ci	*akw_ct_256_256 = "eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIi"
1953d4afb5ceSopenharmony_ci	"wia2lkIjoiSDVwSzRRUU81U0tHbDA3UXhIdk9YMzVqS2FJbzA2NXVLdWRubVZFZVpJYy"
1954d4afb5ceSopenharmony_ci	"J9.SpizfgtzQLJCCnYnUmNfiMMTyL8iIDi8OyUDrO00KJtfwJdNAcs-NuYQkLKx6PlDJ"
1955d4afb5ceSopenharmony_ci	"IGjucT4-IuA8k_Oc752kq1BzTHMZ-Mo.go-e8xpQoCmLD5RBQw7ruA.WqkEdM6T1_z5F"
1956d4afb5ceSopenharmony_ci	"C-8eGQfGjos7cHPy1ecZk1Ep-TYgXo.bZVHhIpe2PbjguQlK_afkYDlVmEtRAe3LUJUX"
1957d4afb5ceSopenharmony_ci	"4STOtU",
1958d4afb5ceSopenharmony_ci	*akw_key_128 = "{\"k\":\"JjVJVh8JsXvKf9qgHHWWBA\",\"kty\":\"oct\"}",
1959d4afb5ceSopenharmony_ci	*akw_key_192 = "{\"k\":\"BYF6urCMDRMKFXXRxXrDSVtW71AUZghj\",\"kty\":\"oct\"}",
1960d4afb5ceSopenharmony_ci	*akw_key_256 = "{\"k\":\"cSHyZXGEfnlgKud21cM6tAxRyXnK6xbWRTsyLUegTMk\",\"kty\":\"oct\"}"
1961d4afb5ceSopenharmony_ci;
1962d4afb5ceSopenharmony_ci
1963d4afb5ceSopenharmony_cistatic int
1964d4afb5ceSopenharmony_citest_akw_decrypt(struct lws_context *context, const char *test_name,
1965d4afb5ceSopenharmony_ci		 const char *ciphertext, const char *key)
1966d4afb5ceSopenharmony_ci{
1967d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
1968d4afb5ceSopenharmony_ci	char temp[2048];
1969d4afb5ceSopenharmony_ci	int n, ret = -1, temp_len = sizeof(temp);
1970d4afb5ceSopenharmony_ci
1971d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
1972d4afb5ceSopenharmony_ci
1973d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, key, strlen(key)) < 0) {
1974d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
1975d4afb5ceSopenharmony_ci		goto bail;
1976d4afb5ceSopenharmony_ci	}
1977d4afb5ceSopenharmony_ci
1978d4afb5ceSopenharmony_ci	/* converts a compact serialization to jws b64 + decoded maps */
1979d4afb5ceSopenharmony_ci	if (lws_jws_compact_decode(ciphertext, (int)strlen(ciphertext),
1980d4afb5ceSopenharmony_ci				   &jwe.jws.map, &jwe.jws.map_b64,
1981d4afb5ceSopenharmony_ci				   temp, &temp_len) != 5) {
1982d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jws_compact_decode failed\n", __func__);
1983d4afb5ceSopenharmony_ci		goto bail;
1984d4afb5ceSopenharmony_ci	}
1985d4afb5ceSopenharmony_ci
1986d4afb5ceSopenharmony_ci	n = lws_jwe_auth_and_decrypt(&jwe, lws_concat_temp(temp, temp_len), &temp_len);
1987d4afb5ceSopenharmony_ci	if (n < 0) {
1988d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_auth_and_decrypt failed\n",
1989d4afb5ceSopenharmony_ci			 __func__);
1990d4afb5ceSopenharmony_ci		goto bail;
1991d4afb5ceSopenharmony_ci	}
1992d4afb5ceSopenharmony_ci
1993d4afb5ceSopenharmony_ci	/* allowing for trailing padding, confirm the plaintext */
1994d4afb5ceSopenharmony_ci	if (jwe.jws.map.len[LJWE_CTXT] < strlen(akw_ptext) ||
1995d4afb5ceSopenharmony_ci	    lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], akw_ptext,
1996d4afb5ceSopenharmony_ci			        (uint32_t)strlen(akw_ptext))) {
1997d4afb5ceSopenharmony_ci		lwsl_err("%s: plaintext AES decrypt wrong\n", __func__);
1998d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(akw_ptext, strlen(akw_ptext));
1999d4afb5ceSopenharmony_ci		lwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],
2000d4afb5ceSopenharmony_ci				    jwe.jws.map.len[LJWE_CTXT]);
2001d4afb5ceSopenharmony_ci		goto bail;
2002d4afb5ceSopenharmony_ci	}
2003d4afb5ceSopenharmony_ci
2004d4afb5ceSopenharmony_ci	ret = 0;
2005d4afb5ceSopenharmony_ci
2006d4afb5ceSopenharmony_cibail:
2007d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
2008d4afb5ceSopenharmony_ci	if (ret)
2009d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest %s failed +++++++++++++++++++\n",
2010d4afb5ceSopenharmony_ci			__func__, test_name);
2011d4afb5ceSopenharmony_ci	else
2012d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest %s OK\n", __func__, test_name);
2013d4afb5ceSopenharmony_ci
2014d4afb5ceSopenharmony_ci	return ret;
2015d4afb5ceSopenharmony_ci}
2016d4afb5ceSopenharmony_ci
2017d4afb5ceSopenharmony_cistatic int
2018d4afb5ceSopenharmony_citest_akw_encrypt(struct lws_context *context, const char *test_name,
2019d4afb5ceSopenharmony_ci		 const char *alg, const char *enc, const char *ciphertext,
2020d4afb5ceSopenharmony_ci		 const char *key, char *compact, int compact_len)
2021d4afb5ceSopenharmony_ci{
2022d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
2023d4afb5ceSopenharmony_ci	char temp[4096];
2024d4afb5ceSopenharmony_ci	int ret = -1, n, temp_len = sizeof(temp);
2025d4afb5ceSopenharmony_ci
2026d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
2027d4afb5ceSopenharmony_ci
2028d4afb5ceSopenharmony_ci	if (lws_jwk_import(&jwe.jwk, NULL, NULL, key, strlen(key)) < 0) {
2029d4afb5ceSopenharmony_ci		lwsl_notice("%s: Failed to decode JWK test key\n", __func__);
2030d4afb5ceSopenharmony_ci		goto bail;
2031d4afb5ceSopenharmony_ci	}
2032d4afb5ceSopenharmony_ci
2033d4afb5ceSopenharmony_ci	if (lws_gencrypto_jwe_alg_to_definition(alg, &jwe.jose.alg)) {
2034d4afb5ceSopenharmony_ci		lwsl_err("Unknown cipher alg %s\n", alg);
2035d4afb5ceSopenharmony_ci		goto bail;
2036d4afb5ceSopenharmony_ci	}
2037d4afb5ceSopenharmony_ci	if (lws_gencrypto_jwe_enc_to_definition(enc, &jwe.jose.enc_alg)) {
2038d4afb5ceSopenharmony_ci		lwsl_err("Unknown payload enc alg %s\n", enc);
2039d4afb5ceSopenharmony_ci		goto bail;
2040d4afb5ceSopenharmony_ci	}
2041d4afb5ceSopenharmony_ci
2042d4afb5ceSopenharmony_ci	/* we require a JOSE-formatted header to do the encryption */
2043d4afb5ceSopenharmony_ci
2044d4afb5ceSopenharmony_ci	jwe.jws.map.buf[LJWS_JOSE] = temp;
2045d4afb5ceSopenharmony_ci	jwe.jws.map.len[LJWS_JOSE] = (uint32_t)lws_snprintf(temp, (unsigned int)temp_len,
2046d4afb5ceSopenharmony_ci			"{\"alg\":\"%s\", \"enc\":\"%s\"}", alg, enc);
2047d4afb5ceSopenharmony_ci	temp_len -= (int)jwe.jws.map.len[LJWS_JOSE];
2048d4afb5ceSopenharmony_ci
2049d4afb5ceSopenharmony_ci	/*
2050d4afb5ceSopenharmony_ci	 * dup the plaintext into the ciphertext element, it will be
2051d4afb5ceSopenharmony_ci	 * encrypted in-place to a ciphertext of the same length + padding
2052d4afb5ceSopenharmony_ci	 */
2053d4afb5ceSopenharmony_ci
2054d4afb5ceSopenharmony_ci	if (lws_jws_dup_element(&jwe.jws.map, LJWE_CTXT,
2055d4afb5ceSopenharmony_ci				lws_concat_temp(temp, temp_len), &temp_len,
2056d4afb5ceSopenharmony_ci				akw_ptext, strlen(akw_ptext),
2057d4afb5ceSopenharmony_ci				lws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,
2058d4afb5ceSopenharmony_ci							  strlen(akw_ptext)))) {
2059d4afb5ceSopenharmony_ci		lwsl_notice("%s: Not enough temp space for ptext\n", __func__);
2060d4afb5ceSopenharmony_ci		goto bail;
2061d4afb5ceSopenharmony_ci	}
2062d4afb5ceSopenharmony_ci
2063d4afb5ceSopenharmony_ci	/* CEK size is determined by hash / hmac size */
2064d4afb5ceSopenharmony_ci
2065d4afb5ceSopenharmony_ci	n = lws_gencrypto_bits_to_bytes(jwe.jose.enc_alg->keybits_fixed);
2066d4afb5ceSopenharmony_ci	if (lws_jws_randomize_element(context, &jwe.jws.map, LJWE_EKEY,
2067d4afb5ceSopenharmony_ci				      lws_concat_temp(temp, temp_len),
2068d4afb5ceSopenharmony_ci				      &temp_len, (unsigned int)n,
2069d4afb5ceSopenharmony_ci				      LWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {
2070d4afb5ceSopenharmony_ci		lwsl_err("Problem getting random\n");
2071d4afb5ceSopenharmony_ci		goto bail;
2072d4afb5ceSopenharmony_ci	}
2073d4afb5ceSopenharmony_ci
2074d4afb5ceSopenharmony_ci	n = lws_jwe_encrypt(&jwe, lws_concat_temp(temp, temp_len),
2075d4afb5ceSopenharmony_ci			    &temp_len);
2076d4afb5ceSopenharmony_ci	if (n < 0) {
2077d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_encrypt failed\n", __func__);
2078d4afb5ceSopenharmony_ci		goto bail;
2079d4afb5ceSopenharmony_ci	}
2080d4afb5ceSopenharmony_ci
2081d4afb5ceSopenharmony_ci	n = lws_jwe_render_compact(&jwe, compact, (unsigned int)compact_len);
2082d4afb5ceSopenharmony_ci	if (n < 0) {
2083d4afb5ceSopenharmony_ci		lwsl_err("%s: lws_jwe_render_compact failed: %d\n",
2084d4afb5ceSopenharmony_ci			 __func__, n);
2085d4afb5ceSopenharmony_ci		goto bail;
2086d4afb5ceSopenharmony_ci	}
2087d4afb5ceSopenharmony_ci
2088d4afb5ceSopenharmony_ci	ret = 0;
2089d4afb5ceSopenharmony_cibail:
2090d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
2091d4afb5ceSopenharmony_ci	if (ret)
2092d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest %s failed +++++++++++++++++++\n",
2093d4afb5ceSopenharmony_ci			__func__, test_name);
2094d4afb5ceSopenharmony_ci	else
2095d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest %s OK\n", __func__, test_name);
2096d4afb5ceSopenharmony_ci
2097d4afb5ceSopenharmony_ci	return ret;
2098d4afb5ceSopenharmony_ci}
2099d4afb5ceSopenharmony_ci
2100d4afb5ceSopenharmony_ci/*
2101d4afb5ceSopenharmony_ci * Check we can handle multi-recipient JWE
2102d4afb5ceSopenharmony_ci */
2103d4afb5ceSopenharmony_ci
2104d4afb5ceSopenharmony_cistatic char *complete =
2105d4afb5ceSopenharmony_ci    "{"
2106d4afb5ceSopenharmony_ci      "\"protected\":"
2107d4afb5ceSopenharmony_ci       "\"eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0\","
2108d4afb5ceSopenharmony_ci      "\"unprotected\":"
2109d4afb5ceSopenharmony_ci       "{\"jku\":\"https://server.example.com/keys.jwks\"},"
2110d4afb5ceSopenharmony_ci      "\"recipients\":["
2111d4afb5ceSopenharmony_ci
2112d4afb5ceSopenharmony_ci	"{\"header\":"
2113d4afb5ceSopenharmony_ci         "{\"alg\":\"RSA1_5\",\"kid\":\"2011-04-29\"},"
2114d4afb5ceSopenharmony_ci        "\"encrypted_key\":"
2115d4afb5ceSopenharmony_ci         "\"UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-"
2116d4afb5ceSopenharmony_ci          "kFm1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKx"
2117d4afb5ceSopenharmony_ci          "GHZ7PcHALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3"
2118d4afb5ceSopenharmony_ci          "YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPh"
2119d4afb5ceSopenharmony_ci          "cCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPg"
2120d4afb5ceSopenharmony_ci          "wCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A\"},"
2121d4afb5ceSopenharmony_ci
2122d4afb5ceSopenharmony_ci       "{\"header\":"
2123d4afb5ceSopenharmony_ci         "{\"alg\":\"A128KW\",\"kid\":\"7\"},"
2124d4afb5ceSopenharmony_ci        "\"encrypted_key\":"
2125d4afb5ceSopenharmony_ci         "\"6KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ\"}],"
2126d4afb5ceSopenharmony_ci
2127d4afb5ceSopenharmony_ci      "\"iv\":"
2128d4afb5ceSopenharmony_ci       "\"AxY8DCtDaGlsbGljb3RoZQ\","
2129d4afb5ceSopenharmony_ci      "\"ciphertext\":"
2130d4afb5ceSopenharmony_ci       "\"KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY\","
2131d4afb5ceSopenharmony_ci      "\"tag\":"
2132d4afb5ceSopenharmony_ci       "\"Mz-VPPyU4RlcuYv1IwIvzw\""
2133d4afb5ceSopenharmony_ci     "}\""
2134d4afb5ceSopenharmony_ci;
2135d4afb5ceSopenharmony_ci
2136d4afb5ceSopenharmony_cistatic int
2137d4afb5ceSopenharmony_citest_jwe_json_complete(struct lws_context *context)
2138d4afb5ceSopenharmony_ci{
2139d4afb5ceSopenharmony_ci	struct lws_jwe jwe;
2140d4afb5ceSopenharmony_ci	char temp[4096];
2141d4afb5ceSopenharmony_ci	int ret = -1, temp_len = sizeof(temp);
2142d4afb5ceSopenharmony_ci
2143d4afb5ceSopenharmony_ci	lws_jwe_init(&jwe, context);
2144d4afb5ceSopenharmony_ci
2145d4afb5ceSopenharmony_ci	if (lws_jwe_parse_jose(&jwe.jose, complete, (int)strlen(complete),
2146d4afb5ceSopenharmony_ci			       temp, &temp_len) < 0) {
2147d4afb5ceSopenharmony_ci		lwsl_err("%s: JOSE parse failed\n", __func__);
2148d4afb5ceSopenharmony_ci
2149d4afb5ceSopenharmony_ci		goto bail;
2150d4afb5ceSopenharmony_ci	}
2151d4afb5ceSopenharmony_ci
2152d4afb5ceSopenharmony_ci	if (jwe.jose.recipients != 2) {
2153d4afb5ceSopenharmony_ci		lwsl_err("%s: wrong recipients count %d\n", __func__,
2154d4afb5ceSopenharmony_ci			 jwe.jose.recipients);
2155d4afb5ceSopenharmony_ci		goto bail;
2156d4afb5ceSopenharmony_ci	}
2157d4afb5ceSopenharmony_ci
2158d4afb5ceSopenharmony_ci	ret = 0;
2159d4afb5ceSopenharmony_cibail:
2160d4afb5ceSopenharmony_ci	lws_jwe_destroy(&jwe);
2161d4afb5ceSopenharmony_ci	if (ret)
2162d4afb5ceSopenharmony_ci		lwsl_err("%s: selftest failed +++++++++++++++++++\n",
2163d4afb5ceSopenharmony_ci			__func__);
2164d4afb5ceSopenharmony_ci	else
2165d4afb5ceSopenharmony_ci		lwsl_notice("%s: selftest OK\n", __func__);
2166d4afb5ceSopenharmony_ci
2167d4afb5ceSopenharmony_ci	return ret;
2168d4afb5ceSopenharmony_ci}
2169d4afb5ceSopenharmony_ci
2170d4afb5ceSopenharmony_ciint
2171d4afb5ceSopenharmony_citest_jwe(struct lws_context *context)
2172d4afb5ceSopenharmony_ci{
2173d4afb5ceSopenharmony_ci	char compact[4096];
2174d4afb5ceSopenharmony_ci	int n = 0;
2175d4afb5ceSopenharmony_ci
2176d4afb5ceSopenharmony_ci	n |= test_jwe_json_complete(context);
2177d4afb5ceSopenharmony_ci
2178d4afb5ceSopenharmony_ci	n |= test_ecdhes_t1(context, ecdhes_t1_jose_hdr_es_128,
2179d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p256_public_key,
2180d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p256_private_key);
2181d4afb5ceSopenharmony_ci	n |= test_ecdhes_t1(context, ecdhes_t1_jose_hdr_es_192,
2182d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p384_public_key,
2183d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p384_private_key);
2184d4afb5ceSopenharmony_ci	n |= test_ecdhes_t1(context, ecdhes_t1_jose_hdr_es_256,
2185d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p521_public_key,
2186d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p521_private_key);
2187d4afb5ceSopenharmony_ci
2188d4afb5ceSopenharmony_ci	n |= test_ecdhes_t1(context, ecdhes_t1_jose_hdr_esakw128_128,
2189d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p256_public_key,
2190d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p256_private_key);
2191d4afb5ceSopenharmony_ci	n |= test_ecdhes_t1(context, ecdhes_t1_jose_hdr_esakw192_192,
2192d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p384_public_key,
2193d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p384_private_key);
2194d4afb5ceSopenharmony_ci	n |= test_ecdhes_t1(context, ecdhes_t1_jose_hdr_esakw256_256,
2195d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p521_public_key,
2196d4afb5ceSopenharmony_ci			    ecdhes_t1_peer_p521_private_key);
2197d4afb5ceSopenharmony_ci
2198d4afb5ceSopenharmony_ci	n |= test_jwe_a1(context);
2199d4afb5ceSopenharmony_ci
2200d4afb5ceSopenharmony_ci	n |= test_jwe_a2(context);
2201d4afb5ceSopenharmony_ci
2202d4afb5ceSopenharmony_ci	n |= test_jwe_ra_ptext_1024(context, (char *)lws_jwe_ex_a2_jwk_json,
2203d4afb5ceSopenharmony_ci				    (int)strlen((char *)lws_jwe_ex_a2_jwk_json));
2204d4afb5ceSopenharmony_ci	n |= test_jwe_r256a192_ptext(context, (char *)lws_jwe_ex_a2_jwk_json,
2205d4afb5ceSopenharmony_ci			(int)strlen((char *)lws_jwe_ex_a2_jwk_json));
2206d4afb5ceSopenharmony_ci	n |= test_jwe_r256a256_ptext(context, (char *)lws_jwe_ex_a2_jwk_json,
2207d4afb5ceSopenharmony_ci			(int)strlen((char *)lws_jwe_ex_a2_jwk_json));
2208d4afb5ceSopenharmony_ci	n |= test_jwe_ra_ptext_1024(context, (char *)rsa_key_2048,
2209d4afb5ceSopenharmony_ci			(int)strlen((char *)rsa_key_2048));
2210d4afb5ceSopenharmony_ci	n |= test_jwe_r256a192_ptext(context, (char *)rsa_key_2048,
2211d4afb5ceSopenharmony_ci			(int)strlen((char *)rsa_key_2048));
2212d4afb5ceSopenharmony_ci	n |= test_jwe_r256a256_ptext(context, (char *)rsa_key_2048,
2213d4afb5ceSopenharmony_ci			(int)strlen((char *)rsa_key_2048));
2214d4afb5ceSopenharmony_ci	n |= test_jwe_ra_ptext_1024(context, (char *)rsa_key_4096,
2215d4afb5ceSopenharmony_ci			(int)strlen((char *)rsa_key_4096));
2216d4afb5ceSopenharmony_ci	n |= test_jwe_r256a192_ptext(context, (char *)rsa_key_4096,
2217d4afb5ceSopenharmony_ci			(int)strlen((char *)rsa_key_4096));
2218d4afb5ceSopenharmony_ci	n |= test_jwe_r256a256_ptext(context, (char *)rsa_key_4096,
2219d4afb5ceSopenharmony_ci			(int)strlen((char *)rsa_key_4096));
2220d4afb5ceSopenharmony_ci	n |= test_jwe_ra_ptext_1024(context, (char *)rsa_key_4096_no_optional,
2221d4afb5ceSopenharmony_ci			(int)strlen((char *)rsa_key_4096_no_optional));
2222d4afb5ceSopenharmony_ci	n |= test_jwe_r256a192_ptext(context, (char *)rsa_key_4096_no_optional,
2223d4afb5ceSopenharmony_ci			(int)strlen((char *)rsa_key_4096_no_optional));
2224d4afb5ceSopenharmony_ci	n |= test_jwe_r256a256_ptext(context, (char *)rsa_key_4096_no_optional,
2225d4afb5ceSopenharmony_ci			(int)strlen((char *)rsa_key_4096_no_optional));
2226d4afb5ceSopenharmony_ci
2227d4afb5ceSopenharmony_ci	/* AESKW decrypt all variations */
2228d4afb5ceSopenharmony_ci
2229d4afb5ceSopenharmony_ci	n |= test_akw_decrypt(context, "d-a128kw_128", akw_ct_128_128, akw_key_128);
2230d4afb5ceSopenharmony_ci	n |= test_akw_decrypt(context, "d-a128kw_192", akw_ct_128_192, akw_key_128);
2231d4afb5ceSopenharmony_ci	n |= test_akw_decrypt(context, "d-a128kw_256", akw_ct_128_256, akw_key_128);
2232d4afb5ceSopenharmony_ci	n |= test_akw_decrypt(context, "d-a192kw_128", akw_ct_192_128, akw_key_192);
2233d4afb5ceSopenharmony_ci	n |= test_akw_decrypt(context, "d-a192kw_192", akw_ct_192_192, akw_key_192);
2234d4afb5ceSopenharmony_ci	n |= test_akw_decrypt(context, "d-a192kw_256", akw_ct_192_256, akw_key_192);
2235d4afb5ceSopenharmony_ci	n |= test_akw_decrypt(context, "d-a256kw_128", akw_ct_256_128, akw_key_256);
2236d4afb5ceSopenharmony_ci	n |= test_akw_decrypt(context, "d-a256kw_192", akw_ct_256_192, akw_key_256);
2237d4afb5ceSopenharmony_ci	n |= test_akw_decrypt(context, "d-a256kw_256", akw_ct_256_256, akw_key_256);
2238d4afb5ceSopenharmony_ci
2239d4afb5ceSopenharmony_ci	/* AESKW encrypt then confirm decrypt */
2240d4afb5ceSopenharmony_ci
2241d4afb5ceSopenharmony_ci	if (!test_akw_encrypt(context, "ed-128kw_128", "A128KW", "A128CBC-HS256",
2242d4afb5ceSopenharmony_ci			akw_ptext, akw_key_128, compact, sizeof(compact)))
2243d4afb5ceSopenharmony_ci		n |= test_akw_decrypt(context, "ed-128kw_128", compact, akw_key_128);
2244d4afb5ceSopenharmony_ci	else
2245d4afb5ceSopenharmony_ci		n = -1;
2246d4afb5ceSopenharmony_ci	if (!test_akw_encrypt(context, "ed-128kw_192", "A128KW", "A192CBC-HS384",
2247d4afb5ceSopenharmony_ci			akw_ptext, akw_key_128, compact, sizeof(compact)))
2248d4afb5ceSopenharmony_ci		n |= test_akw_decrypt(context, "ed-128kw_192", compact, akw_key_128);
2249d4afb5ceSopenharmony_ci	else
2250d4afb5ceSopenharmony_ci		n = -1;
2251d4afb5ceSopenharmony_ci	if (!test_akw_encrypt(context, "ed-128kw_256", "A128KW", "A256CBC-HS512",
2252d4afb5ceSopenharmony_ci			akw_ptext, akw_key_128, compact, sizeof(compact)))
2253d4afb5ceSopenharmony_ci		n |= test_akw_decrypt(context, "ed-128kw_256", compact, akw_key_128);
2254d4afb5ceSopenharmony_ci	else
2255d4afb5ceSopenharmony_ci		n = -1;
2256d4afb5ceSopenharmony_ci
2257d4afb5ceSopenharmony_ci	if (!test_akw_encrypt(context, "ed-192kw_128", "A192KW", "A128CBC-HS256",
2258d4afb5ceSopenharmony_ci			akw_ptext, akw_key_192, compact, sizeof(compact)))
2259d4afb5ceSopenharmony_ci		n |= test_akw_decrypt(context, "ed-192kw_128", compact, akw_key_192);
2260d4afb5ceSopenharmony_ci	else
2261d4afb5ceSopenharmony_ci		n = -1;
2262d4afb5ceSopenharmony_ci	if (!test_akw_encrypt(context, "ed-192kw_192", "A192KW", "A192CBC-HS384",
2263d4afb5ceSopenharmony_ci			akw_ptext, akw_key_192, compact, sizeof(compact)))
2264d4afb5ceSopenharmony_ci		n |= test_akw_decrypt(context, "ed-192kw_192", compact, akw_key_192);
2265d4afb5ceSopenharmony_ci	else
2266d4afb5ceSopenharmony_ci		n = -1;
2267d4afb5ceSopenharmony_ci	if (!test_akw_encrypt(context, "ed-192kw_256", "A192KW", "A256CBC-HS512",
2268d4afb5ceSopenharmony_ci			akw_ptext, akw_key_192, compact, sizeof(compact)))
2269d4afb5ceSopenharmony_ci		n |= test_akw_decrypt(context, "ed-192kw_256", compact, akw_key_192);
2270d4afb5ceSopenharmony_ci	else
2271d4afb5ceSopenharmony_ci		n = -1;
2272d4afb5ceSopenharmony_ci
2273d4afb5ceSopenharmony_ci	if (!test_akw_encrypt(context, "ed-256kw_128", "A256KW", "A128CBC-HS256",
2274d4afb5ceSopenharmony_ci			akw_ptext, akw_key_256, compact, sizeof(compact)))
2275d4afb5ceSopenharmony_ci		n |= test_akw_decrypt(context, "ed-256kw_128", compact, akw_key_256);
2276d4afb5ceSopenharmony_ci	else
2277d4afb5ceSopenharmony_ci		n = -1;
2278d4afb5ceSopenharmony_ci	if (!test_akw_encrypt(context, "ed-256kw_192", "A256KW", "A192CBC-HS384",
2279d4afb5ceSopenharmony_ci			akw_ptext, akw_key_256, compact, sizeof(compact)))
2280d4afb5ceSopenharmony_ci		n |= test_akw_decrypt(context, "ed-256kw_192", compact, akw_key_256);
2281d4afb5ceSopenharmony_ci	else
2282d4afb5ceSopenharmony_ci		n = -1;
2283d4afb5ceSopenharmony_ci	if (!test_akw_encrypt(context, "ed-256kw_256", "A256KW", "A256CBC-HS512",
2284d4afb5ceSopenharmony_ci			akw_ptext, akw_key_256, compact, sizeof(compact)))
2285d4afb5ceSopenharmony_ci		n |= test_akw_decrypt(context, "ed-256kw_256", compact, akw_key_256);
2286d4afb5ceSopenharmony_ci	else
2287d4afb5ceSopenharmony_ci		n = -1;
2288d4afb5ceSopenharmony_ci
2289d4afb5ceSopenharmony_ci	n |= test_jwe_r256a128_jwe_openssl(context);
2290d4afb5ceSopenharmony_ci	n |= test_jwe_r256a128_jwe_mbedtls(context);
2291d4afb5ceSopenharmony_ci	n |= test_jwe_a3(context);
2292d4afb5ceSopenharmony_ci	n |= test_jwa_b2(context);
2293d4afb5ceSopenharmony_ci	n |= test_jwa_b3(context);
2294d4afb5ceSopenharmony_ci	n |= test_jwa_c(context);
2295d4afb5ceSopenharmony_ci
2296d4afb5ceSopenharmony_ci	return n;
2297d4afb5ceSopenharmony_ci}
2298