jwe.c 78 KB

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