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