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