Created
November 16, 2015 13:30
-
-
Save ritou/3b586e13007823c826a1 to your computer and use it in GitHub Desktop.
Crypt::JWTを用いてESXXXなJSON Web Signatureをごにょごにょするサンプル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use Crypt::JWT qw(encode_jwt decode_jwt); | |
use Crypt::PK::ECC; | |
use MIME::Base64 qw(decode_base64url); | |
use Data::Dumper; | |
warn "=== Example JWS Using ECDSA P-256 SHA-256 ===\n"; | |
warn "see https://tools.ietf.org/html/rfc7515#appendix-A.3\n"; | |
warn "=== Private Key ===\n"; | |
my $ec_jwk_data = { | |
"kty" => "EC", | |
"crv" => "P-256", | |
"x" => "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU", | |
"y" => "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0", | |
"d" => "jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI", | |
}; | |
warn Dumper($ec_jwk_data); | |
warn "\n"; | |
my $pk = Crypt::PK::ECC->new(); | |
$pk->import_key($ec_jwk_data); | |
warn "=== Crypt::PK::ECC : private key ===\n"; | |
warn Dumper($pk->export_key_jwk('private')); | |
warn "\n"; | |
warn "=== Crypt::PK::ECC : public key ===\n"; | |
warn Dumper($pk->export_key_jwk('public')); | |
warn "\n"; | |
warn "=== Payload ===\n"; | |
my $payload = decode_base64url("eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ"); | |
warn Dumper($payload); | |
warn "\n"; | |
warn "=== encode(This result changes every time.) ===\n"; | |
my $jwt = encode_jwt(payload=>$payload, alg=>'ES256', key=>$pk); | |
warn Dumper($jwt); | |
warn "\n"; | |
warn "=== decode ===\n"; | |
my $decoded_payload = decode_jwt(token=>$jwt, key=>$pk, verify_exp=>0); | |
warn Dumper($decoded_payload); | |
warn "\n"; | |
warn "=== decode sample JWS===\n"; | |
my $jwt = "eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"; | |
my $decoded_payload = decode_jwt(token=>$jwt, key=>$pk, verify_exp=>0); | |
warn Dumper($decoded_payload); | |
warn "\n"; | |
warn "=== Example JWS Using ECDSA P-521 SHA-512 ===\n"; | |
warn "see https://tools.ietf.org/html/rfc7515#appendix-A.4\n"; | |
warn "=== Private Key ===\n"; | |
$ec_jwk_data = { | |
"kty" => "EC", | |
"crv" => "P-521", | |
"x" => "AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk", | |
"y" => "ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2", | |
"d" => "AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPAxerEzgdRhajnu0ferB0d53vM9mE15j2C", | |
}; | |
warn Dumper($ec_jwk_data); | |
warn "\n"; | |
my $pk = Crypt::PK::ECC->new(); | |
$pk->import_key($ec_jwk_data); | |
warn "=== Crypt::PK::ECC : private key ===\n"; | |
warn Dumper($pk->export_key_jwk('private')); | |
warn "\n"; | |
warn "=== Crypt::PK::ECC : public key ===\n"; | |
warn Dumper($pk->export_key_jwk('public')); | |
warn "\n"; | |
warn "=== Payload ===\n"; | |
$payload = "Payload"; | |
warn Dumper($payload); | |
warn "\n"; | |
warn "=== encode(This result changes every time.) ===\n"; | |
$jwt = encode_jwt(payload=>$payload, alg=>'ES256', key=>$pk); | |
warn Dumper($jwt); | |
warn "\n"; | |
warn "=== decode ===\n"; | |
$decoded_payload = decode_jwt(token=>$jwt, key=>$pk, verify_exp=>0); | |
warn Dumper($decoded_payload); | |
warn "\n"; | |
warn "=== decode sample JWS===\n"; | |
$jwt = "eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA.AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn"; | |
$decoded_payload = decode_jwt(token=>$jwt, key=>$pk, verify_exp=>0); | |
warn Dumper($decoded_payload); | |
warn "\n"; |
Author
ritou
commented
Nov 16, 2015
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment