Skip to content

Instantly share code, notes, and snippets.

@ritou
Created November 16, 2015 13:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ritou/3b586e13007823c826a1 to your computer and use it in GitHub Desktop.
Save ritou/3b586e13007823c826a1 to your computer and use it in GitHub Desktop.
Crypt::JWTを用いてESXXXなJSON Web Signatureをごにょごにょするサンプル
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";
@ritou
Copy link
Author

ritou commented Nov 16, 2015

=== Example JWS Using ECDSA P-256 SHA-256 ===
see https://tools.ietf.org/html/rfc7515#appendix-A.3
=== Private Key  ===
$VAR1 = {
          'crv' => 'P-256',
          'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
          'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
          'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
          'kty' => 'EC'
        };

=== Crypt::PK::ECC : private key ===
$VAR1 =     '{"x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","crv":"P-256","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","d":"jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI","kty":"EC"}';

=== Crypt::PK::ECC : public key ===
$VAR1 =     '{"crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","kty":"EC"}';

=== Payload ===
$VAR1 = '{"iss":"joe",
 "exp":1300819380,
 "http://example.com/is_root":true}';

=== encode(This result changes every time.) ===
$VAR1 =     'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.EJwNNmI1O8Y72cf5qKIT69Zi8qIUIud6lUhSRkHkcwKGyF1IifUdNZFl8HVpucmo9Yx6U0aPKtJ6e8xPlcwYpA';

=== decode ===
$VAR1 = {
          'exp' => 1300819380,
          'http://example.com/is_root' => bless( do{\(my $o = 1)}, 'JSON::XS::Boolean' ),
          'iss' => 'joe'
        };

=== decode sample JWS===
$VAR1 = {
          'http://example.com/is_root' => bless( do{\(my $o = 1)}, 'JSON::XS::Boolean' ),
          'iss' => 'joe',
          'exp' => 1300819380
        };

=== Example JWS Using ECDSA P-521 SHA-512 ===
see https://tools.ietf.org/html/rfc7515#appendix-A.4
=== Private Key  ===
$VAR1 = {
          'crv' => 'P-521',
          'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk',
          'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2',
          'd' => 'AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPAxerEzgdRhajnu0ferB0d53vM9mE15j2C',
          'kty' => 'EC'
        };

=== Crypt::PK::ECC : private key ===
$VAR1 = '{"kty":"EC","d":"AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPAxerEzgdRhajnu0ferB0d53vM9mE15j2C","y":"NKZEDjdnUNI3H9G9wsjztx0vTuXqNDLIFcyjFWD-XZOH7HdLVYOGMOXLv1qMvgqR3QBkxpmaH25uZ_rd7eTIyPY","x":"AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk","crv":"P-521"}';

=== Crypt::PK::ECC : public key ===
$VAR1 = '{"kty":"EC","y":"NKZEDjdnUNI3H9G9wsjztx0vTuXqNDLIFcyjFWD-XZOH7HdLVYOGMOXLv1qMvgqR3QBkxpmaH25uZ_rd7eTIyPY","x":"AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk","crv":"P-521"}';

=== Payload ===
$VAR1 = 'Payload';

=== encode(This result changes every time.) ===
$VAR1 = 'eyJhbGciOiJFUzI1NiJ9.UGF5bG9hZA.AFOnZxpBvZL-2XSM1drEeROScEnHA-X1bV1OXz_Zmr7othiHsPzpnKTlFh6PYgJoCjxlQHy4O5eYHkHiRSHvukSXAKFXkDR8XjRRW6NBJNDGSmL4AByFVY0jsTL9njK-EYp4oXscKmOoAsoSUgIgp8Eeh_M5tQ4rM-G2aD8ORQCd1-Lj';

=== decode ===
$VAR1 = 'Payload';

=== decode sample JWS===
$VAR1 = 'Payload';

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment