Crypt-JWT
view release on metacpan or search on metacpan
t/rfc7520.t view on Meta::CPAN
dp => "19oDkBh1AXelMIxQFm2zZTqUhAzCIr4xNIGEPNoDt1jK83_FJA-xnx5kA7-1erdHdms_Ef67HsONNv5A60JaR7w8LHnDiBGnjdaUmmuO8XAxQJ_ia5mxjxNjS6E2yD44USo2JmHvzeeNczq25elqbTPLhUpGo1IZuG72FZQ5gTjXoTXC2-xtCDEUZfaUNh4IeAipfLugbpe0JAFlFfrTDAMUFpC3iXjxqzbEanflwPvj6V9...
dq => "S6p59KrlmzGzaQYQM3o0XfHCGvfqHLYjCO557HYQf72O9kLMCfd_1VBEqeD-1jjwELKDjck8kOBl5UvohK1oDfSP1DleAy-cnmL29DqWmhgwM1ip0CCNmkmsmDSlqkUXDi6sAaZuntyukyflI-qSQ3C_BafPyFaKrt1fgdyEwYa08pESKwwWisy7KnmoUvaJ3SaHmohFS78TJ25cfc10wZ9hQNOrIChZlkiOdFCtxDqdmCq...
qi => "FZhClBMywVVjnuUud-05qd5CYU0dK79akAgy9oX6RX6I3IIIPckCciRrokxglZn-omAY5CnCe4KdrnjFOT5YUZE7G_Pg44XgCXaarLQf4hl80oPEf6-jJ5Iy6wPRx7G2e8qLxnh9cOdf-kRqgOS3F48Ucvw3ma5V6KGMwQqWFeV31XtZ8l5cVI-I3NzBS7qltpUVgz2Ju021eyc7IlqgzR98qKONl27DuEES0aK0WE97jns...
};
{
my $jwe =
"eyJhbGciOiJSU0EtT0FFUCIsImtpZCI6InNhbXdpc2UuZ2FtZ2VlQGhvYmJpdG9uLmV4YW1wbGUiLCJlbmMiOiJBMjU2R0NNIn0".
".rT99rwrBTbTI7IJM8fU3Eli7226HEB7IchCxNuh7lCiud48LxeolRdtFF4nzQibeYOl5S_PJsAXZwSXtDePz9hk-BbtsTBqC2UsPOdwjC9NhNupNNu9uHIVftDyucvI6hvALeZ6OGnhNV4v1zx2k7O1D89mAzfw-_kT3tkuorpDU-CpBENfIHX1Q58-Aad3FzMuo3Fn9buEP2yXakLXYa15BUXQsupM4A1GD4_H4Bd7V3u9h...
".-nBoKLH0YkLZPSI9".
".o4k2cnGN8rSSw3IDo1YuySkqeS_t2m1GXklSgqBdpACm6UJuJowOHC5ytjqYgRL-I-soPlwqMUf4UgRWWeaOGNw6vGW-xyM01lTYxrXfVzIIaRdhYtEMRBvBWbEwP7ua1DRfvaOjgZv6Ifa3brcAM64d8p5lhhNcizPersuhw5f-pGYzseva-TUaL8iWnctc-sSwy7SQmRkfhDjwbz0fz6kFovEgj64X1I5s7E6GLp5fnbYG...
".UCGiqJxhBI3IFVdPalHHvA";
my ($header, $payload) = decode_jwt(token=>$jwe, key=>$jwk_rsa_samwise, decode_header=>1, decode_payload=>0);
is($header->{alg}, "RSA-OAEP", "§5.2 header alg");
is($header->{enc}, "A256GCM", "§5.2 header enc");
is($payload, $rfc7520_plaintext, "§5.2 plaintext recovered");
}
#----------------------------------------------------------------------
# §5.3 PBES2-HS512+A256KW + A128CBC-HS256 â decode-only
#----------------------------------------------------------------------
{
my $password = "entrap_o\x{2013}peter_long\x{2013}credit_tun";
utf8::encode($password);
my $jwe =
"eyJhbGciOiJQQkVTMi1IUzUxMitBMjU2S1ciLCJwMnMiOiI4UTFTemluYXNSM3hjaFl6NlpaY0hBIiwicDJjIjo4MTkyLCJjdHkiOiJqd2stc2V0K2pzb24iLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0".
".d3qNhUWfqheyPp4H8sjOWsDYajoej4c5Je6rlUtFPWdgtURtmeDV1g".
".VBiCzVHNoLiR3F4V82uoTQ".
".23i-Tb1AV4n0WKVSSgcQrdg6GRqsUKxjruHXYsTHAJLZ2nsnGIX86vMXqIi6IRsfywCRFzLxEcZBRnTvG3nhzPk0GDD7FMyXhUHpDjEYCNA_XOmzg8yZR9oyjo6lTF6si4q9FZ2EhzgFQCLO_6h5EVg3vR75_hkBsnuoqoM3dwejXBtIodN84PeqMb6asmas_dpSsz7H10fC5ni9xIz424givB1YLldF6exVmL93R3fOoOJb...
".0HlwodAhOCILG5SQ2LQ9dg";
my ($header, $payload) = decode_jwt(token=>$jwe, key=>$password,
decode_header=>1, decode_payload=>0);
is($header->{alg}, "PBES2-HS512+A256KW", "§5.3 header alg");
is($header->{enc}, "A128CBC-HS256", "§5.3 header enc");
is($header->{p2c}, 8192, "§5.3 PBES2 iteration count");
is($header->{cty}, "jwk-set+json", "§5.3 cty");
like($payload, qr/"keys"\s*:/, "§5.3 plaintext is a JWK Set");
}
#----------------------------------------------------------------------
# §5.4 ECDH-ES+A128KW + A128GCM â decode-only (random ephemeral)
#----------------------------------------------------------------------
my $jwk_ec_p384 = {
kty => "EC",
kid => "peregrin.took\@tuckborough.example",
use => "enc",
crv => "P-384",
x => "YU4rRUzdmVqmRtWOs2OpDE_T5fsNIodcG8G5FWPrTPMyxpzsSOGaQLpe2FpxBmu2",
y => "A8-yxCHxkfBz3hKZfI1jUYMjUhsEveZ9THuwFjH2sCNdtksRJU7D5-SkgaFL1ETP",
d => "iTx2pk7wW-GqJkHcEkFQb2EFyYcO7RugmaW3mRrQVAOUiPommT0IdnYK2xDlZh-j",
};
{
my $jwe =
"eyJhbGciOiJFQ0RILUVTK0ExMjhLVyIsImtpZCI6InBlcmVncmluLnRvb2tAdHVja2Jvcm91Z2guZXhhbXBsZSIsImVwayI6eyJrdHkiOiJFQyIsImNydiI6IlAtMzg0IiwieCI6InVCbzRrSFB3Nmtiang1bDB4b3dyZF9vWXpCbWF6LUdLRlp1NHhBRkZrYllpV2d1dEVLNml1RURzUTZ3TmROZzMiLCJ5Ijoic3AzcDVTR...
".0DJjBXri_kBcC46IkU5_Jk9BqaQeHdv2".
".mH-G2zVqgztUtnW_".
".tkZuOO9h95OgHJmkkrfLBisku8rGf6nzVxhRM3sVOhXgz5NJ76oID7lpnAi_cPWJRCjSpAaUZ5dOR3Spy7QuEkmKx8-3RCMhSYMzsXaEwDdXta9Mn5B7cCBoJKB0IgEnj_qfo1hIi-uEkUpOZ8aLTZGHfpl05jMwbKkTe2yK3mjF6SBAsgicQDVCkcY9BLluzx1RmC3ORXaM0JaHPB93YcdSDGgpgBWMVrNU1ErkjcMqMoT_...
".WuGzxmcreYjpHGJoa17EBg";
my ($header, $payload) = decode_jwt(token=>$jwe, key=>$jwk_ec_p384,
decode_header=>1, decode_payload=>0);
is($header->{alg}, "ECDH-ES+A128KW", "§5.4 header alg");
is($header->{enc}, "A128GCM", "§5.4 header enc");
is($header->{epk}{crv}, "P-384", "§5.4 epk uses P-384");
is($payload, $rfc7520_plaintext, "§5.4 plaintext recovered");
}
#----------------------------------------------------------------------
# §5.8 A128KW + A128GCM â decode (deterministic key wrap, but encode
# can't pin the IV; verify-only suffices)
#----------------------------------------------------------------------
my $jwk_a128kw = {
kty => "oct",
kid => "81b20965-8332-43d9-a468-82160ad91ac8",
use => "enc",
alg => "A128KW",
k => "GZy6sIZ6wl9NJOKB-jnmVQ",
};
{
my $jwe =
"eyJhbGciOiJBMTI4S1ciLCJraWQiOiI4MWIyMDk2NS04MzMyLTQzZDktYTQ2OC04MjE2MGFkOTFhYzgiLCJlbmMiOiJBMTI4R0NNIn0".
".CBI6oDw8MydIx1IBntf_lQcw2MmJKIQx".
".Qx0pmsDa8KnJc9Jo".
".AwliP-KmWgsZ37BvzCefNen6VTbRK3QMA4TkvRkH0tP1bTdhtFJgJxeVmJkLD61A1hnWGetdg11c9ADsnWgL56NyxwSYjU1ZEHcGkd3EkU0vjHi9gTlb90qSYFfeF0LwkcTtjbYKCsiNJQkcIp1yeM03OmuiYSoYJVSpf7ej6zaYcMv3WwdxDFl8REwOhNImk2Xld2JXq6BR53TSFkyT7PwVLuq-1GwtGHlQeg7gDT6xW0Jq...
".ER7MWJZ1FBI_NKvn7Zb1Lw";
my ($header, $payload) = decode_jwt(token=>$jwe, key=>$jwk_a128kw,
decode_header=>1, decode_payload=>0);
is($header->{alg}, "A128KW", "§5.8 header alg");
is($header->{enc}, "A128GCM", "§5.8 header enc");
is($payload, $rfc7520_plaintext, "§5.8 plaintext recovered");
}
#----------------------------------------------------------------------
# §5.9 A128KW + A128GCM with DEFLATE compression â decode (zip=DEF)
#----------------------------------------------------------------------
{
my $jwe =
"eyJhbGciOiJBMTI4S1ciLCJraWQiOiI4MWIyMDk2NS04MzMyLTQzZDktYTQ2OC04MjE2MGFkOTFhYzgiLCJlbmMiOiJBMTI4R0NNIiwiemlwIjoiREVGIn0".
".5vUT2WOtQxKWcekM_IzVQwkGgzlFDwPi".
".p9pUq6XHY0jfEZIl".
".HbDtOsdai1oYziSx25KEeTxmwnh8L8jKMFNc1k3zmMI6VB8hry57tDZ61jXyezSPt0fdLVfe6Jf5y5-JaCap_JQBcb5opbmT60uWGml8blyiMQmOn9J--XhhlYg0m-BHaqfDO5iTOWxPxFMUedx7WCy8mxgDHj0aBMG6152PsM-w5E_o2B3jDbrYBKhpYA7qi3AyijnCJ7BP9rr3U8kxExCpG3mK420TjOw".
".VILuUwuIxaLVmh5X-T7kmA";
my ($header, $payload) = decode_jwt(token=>$jwe, key=>$jwk_a128kw,
decode_header=>1, decode_payload=>0);
is($header->{alg}, "A128KW", "§5.9 header alg");
is($header->{enc}, "A128GCM", "§5.9 header enc");
is($header->{zip}, "DEF", "§5.9 zip header");
is($payload, $rfc7520_plaintext, "§5.9 compressed plaintext recovered");
}
done_testing;
( run in 0.388 second using v1.01-cache-2.11-cpan-e1769b4cff6 )