Add Symfony Deprecation Contracts package

- Created CHANGELOG.md to maintain version history.
- Added README.md with usage instructions for the trigger_deprecation() function.
- Initialized composer.json for the Symfony Deprecation Contracts library, specifying dependencies and autoloading.
This commit is contained in:
2025-12-15 08:43:18 +01:00
parent 0eedc919db
commit 778ee26fe4
643 changed files with 113899 additions and 109267 deletions

View File

@@ -0,0 +1,105 @@
# Changelog
## [6.4.0](https://github.com/firebase/php-jwt/compare/v6.3.2...v6.4.0) (2023-02-08)
### Features
* add support for W3C ES256K ([#462](https://github.com/firebase/php-jwt/issues/462)) ([213924f](https://github.com/firebase/php-jwt/commit/213924f51936291fbbca99158b11bd4ae56c2c95))
* improve caching by only decoding jwks when necessary ([#486](https://github.com/firebase/php-jwt/issues/486)) ([78d3ed1](https://github.com/firebase/php-jwt/commit/78d3ed1073553f7d0bbffa6c2010009a0d483d5c))
## [6.3.2](https://github.com/firebase/php-jwt/compare/v6.3.1...v6.3.2) (2022-11-01)
### Bug Fixes
* check kid before using as array index ([bad1b04](https://github.com/firebase/php-jwt/commit/bad1b040d0c736bbf86814c6b5ae614f517cf7bd))
## [6.3.1](https://github.com/firebase/php-jwt/compare/v6.3.0...v6.3.1) (2022-11-01)
### Bug Fixes
* casing of GET for PSR compat ([#451](https://github.com/firebase/php-jwt/issues/451)) ([60b52b7](https://github.com/firebase/php-jwt/commit/60b52b71978790eafcf3b95cfbd83db0439e8d22))
* string interpolation format for php 8.2 ([#446](https://github.com/firebase/php-jwt/issues/446)) ([2e07d8a](https://github.com/firebase/php-jwt/commit/2e07d8a1524d12b69b110ad649f17461d068b8f2))
## 6.3.0 / 2022-07-15
- Added ES256 support to JWK parsing ([#399](https://github.com/firebase/php-jwt/pull/399))
- Fixed potential caching error in `CachedKeySet` by caching jwks as strings ([#435](https://github.com/firebase/php-jwt/pull/435))
## 6.2.0 / 2022-05-14
- Added `CachedKeySet` ([#397](https://github.com/firebase/php-jwt/pull/397))
- Added `$defaultAlg` parameter to `JWT::parseKey` and `JWT::parseKeySet` ([#426](https://github.com/firebase/php-jwt/pull/426)).
## 6.1.0 / 2022-03-23
- Drop support for PHP 5.3, 5.4, 5.5, 5.6, and 7.0
- Add parameter typing and return types where possible
## 6.0.0 / 2022-01-24
- **Backwards-Compatibility Breaking Changes**: See the [Release Notes](https://github.com/firebase/php-jwt/releases/tag/v6.0.0) for more information.
- New Key object to prevent key/algorithm type confusion (#365)
- Add JWK support (#273)
- Add ES256 support (#256)
- Add ES384 support (#324)
- Add Ed25519 support (#343)
## 5.0.0 / 2017-06-26
- Support RS384 and RS512.
See [#117](https://github.com/firebase/php-jwt/pull/117). Thanks [@joostfaassen](https://github.com/joostfaassen)!
- Add an example for RS256 openssl.
See [#125](https://github.com/firebase/php-jwt/pull/125). Thanks [@akeeman](https://github.com/akeeman)!
- Detect invalid Base64 encoding in signature.
See [#162](https://github.com/firebase/php-jwt/pull/162). Thanks [@psignoret](https://github.com/psignoret)!
- Update `JWT::verify` to handle OpenSSL errors.
See [#159](https://github.com/firebase/php-jwt/pull/159). Thanks [@bshaffer](https://github.com/bshaffer)!
- Add `array` type hinting to `decode` method
See [#101](https://github.com/firebase/php-jwt/pull/101). Thanks [@hywak](https://github.com/hywak)!
- Add all JSON error types.
See [#110](https://github.com/firebase/php-jwt/pull/110). Thanks [@gbalduzzi](https://github.com/gbalduzzi)!
- Bugfix 'kid' not in given key list.
See [#129](https://github.com/firebase/php-jwt/pull/129). Thanks [@stampycode](https://github.com/stampycode)!
- Miscellaneous cleanup, documentation and test fixes.
See [#107](https://github.com/firebase/php-jwt/pull/107), [#115](https://github.com/firebase/php-jwt/pull/115),
[#160](https://github.com/firebase/php-jwt/pull/160), [#161](https://github.com/firebase/php-jwt/pull/161), and
[#165](https://github.com/firebase/php-jwt/pull/165). Thanks [@akeeman](https://github.com/akeeman),
[@chinedufn](https://github.com/chinedufn), and [@bshaffer](https://github.com/bshaffer)!
## 4.0.0 / 2016-07-17
- Add support for late static binding. See [#88](https://github.com/firebase/php-jwt/pull/88) for details. Thanks to [@chappy84](https://github.com/chappy84)!
- Use static `$timestamp` instead of `time()` to improve unit testing. See [#93](https://github.com/firebase/php-jwt/pull/93) for details. Thanks to [@josephmcdermott](https://github.com/josephmcdermott)!
- Fixes to exceptions classes. See [#81](https://github.com/firebase/php-jwt/pull/81) for details. Thanks to [@Maks3w](https://github.com/Maks3w)!
- Fixes to PHPDoc. See [#76](https://github.com/firebase/php-jwt/pull/76) for details. Thanks to [@akeeman](https://github.com/akeeman)!
## 3.0.0 / 2015-07-22
- Minimum PHP version updated from `5.2.0` to `5.3.0`.
- Add `\Firebase\JWT` namespace. See
[#59](https://github.com/firebase/php-jwt/pull/59) for details. Thanks to
[@Dashron](https://github.com/Dashron)!
- Require a non-empty key to decode and verify a JWT. See
[#60](https://github.com/firebase/php-jwt/pull/60) for details. Thanks to
[@sjones608](https://github.com/sjones608)!
- Cleaner documentation blocks in the code. See
[#62](https://github.com/firebase/php-jwt/pull/62) for details. Thanks to
[@johanderuijter](https://github.com/johanderuijter)!
## 2.2.0 / 2015-06-22
- Add support for adding custom, optional JWT headers to `JWT::encode()`. See
[#53](https://github.com/firebase/php-jwt/pull/53/files) for details. Thanks to
[@mcocaro](https://github.com/mcocaro)!
## 2.1.0 / 2015-05-20
- Add support for adding a leeway to `JWT:decode()` that accounts for clock skew
between signing and verifying entities. Thanks to [@lcabral](https://github.com/lcabral)!
- Add support for passing an object implementing the `ArrayAccess` interface for
`$keys` argument in `JWT::decode()`. Thanks to [@aztech-dev](https://github.com/aztech-dev)!
## 2.0.0 / 2015-04-01
- **Note**: It is strongly recommended that you update to > v2.0.0 to address
known security vulnerabilities in prior versions when both symmetric and
asymmetric keys are used together.
- Update signature for `JWT::decode(...)` to require an array of supported
algorithms to use when verifying token signatures.

View File

@@ -0,0 +1,332 @@
![Build Status](https://github.com/firebase/php-jwt/actions/workflows/tests.yml/badge.svg)
[![Latest Stable Version](https://poser.pugx.org/firebase/php-jwt/v/stable)](https://packagist.org/packages/firebase/php-jwt)
[![Total Downloads](https://poser.pugx.org/firebase/php-jwt/downloads)](https://packagist.org/packages/firebase/php-jwt)
[![License](https://poser.pugx.org/firebase/php-jwt/license)](https://packagist.org/packages/firebase/php-jwt)
PHP-JWT
=======
A simple library to encode and decode JSON Web Tokens (JWT) in PHP, conforming to [RFC 7519](https://tools.ietf.org/html/rfc7519).
Installation
------------
Use composer to manage your dependencies and download PHP-JWT:
```bash
composer require firebase/php-jwt
```
Optionally, install the `paragonie/sodium_compat` package from composer if your
php is < 7.2 or does not have libsodium installed:
```bash
composer require paragonie/sodium_compat
```
Example
-------
```php
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
$key = 'example_key';
$payload = [
'iss' => 'http://example.org',
'aud' => 'http://example.com',
'iat' => 1356999524,
'nbf' => 1357000000
];
/**
* IMPORTANT:
* You must specify supported algorithms for your application. See
* https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
* for a list of spec-compliant algorithms.
*/
$jwt = JWT::encode($payload, $key, 'HS256');
$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
print_r($decoded);
/*
NOTE: This will now be an object instead of an associative array. To get
an associative array, you will need to cast it as such:
*/
$decoded_array = (array) $decoded;
/**
* You can add a leeway to account for when there is a clock skew times between
* the signing and verifying servers. It is recommended that this leeway should
* not be bigger than a few minutes.
*
* Source: http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#nbfDef
*/
JWT::$leeway = 60; // $leeway in seconds
$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
```
Example with RS256 (openssl)
----------------------------
```php
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
$privateKey = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC8kGa1pSjbSYZVebtTRBLxBz5H4i2p/llLCrEeQhta5kaQu/Rn
vuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t0tyazyZ8JXw+KgXTxldMPEL9
5+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4ehde/zUxo6UvS7UrBQIDAQAB
AoGAb/MXV46XxCFRxNuB8LyAtmLDgi/xRnTAlMHjSACddwkyKem8//8eZtw9fzxz
bWZ/1/doQOuHBGYZU8aDzzj59FZ78dyzNFoF91hbvZKkg+6wGyd/LrGVEB+Xre0J
Nil0GReM2AHDNZUYRv+HYJPIOrB0CRczLQsgFJ8K6aAD6F0CQQDzbpjYdx10qgK1
cP59UHiHjPZYC0loEsk7s+hUmT3QHerAQJMZWC11Qrn2N+ybwwNblDKv+s5qgMQ5
5tNoQ9IfAkEAxkyffU6ythpg/H0Ixe1I2rd0GbF05biIzO/i77Det3n4YsJVlDck
ZkcvY3SK2iRIL4c9yY6hlIhs+K9wXTtGWwJBAO9Dskl48mO7woPR9uD22jDpNSwe
k90OMepTjzSvlhjbfuPN1IdhqvSJTDychRwn1kIJ7LQZgQ8fVz9OCFZ/6qMCQGOb
qaGwHmUK6xzpUbbacnYrIM6nLSkXgOAwv7XXCojvY614ILTK3iXiLBOxPu5Eu13k
eUz9sHyD6vkgZzjtxXECQAkp4Xerf5TGfQXGXhxIX52yH+N2LtujCdkQZjXAsGdm
B2zNzvrlgRmgBrklMTrMYgm1NPcW+bRLGcwgW2PTvNM=
-----END RSA PRIVATE KEY-----
EOD;
$publicKey = <<<EOD
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8kGa1pSjbSYZVebtTRBLxBz5H
4i2p/llLCrEeQhta5kaQu/RnvuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t
0tyazyZ8JXw+KgXTxldMPEL95+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4
ehde/zUxo6UvS7UrBQIDAQAB
-----END PUBLIC KEY-----
EOD;
$payload = [
'iss' => 'example.org',
'aud' => 'example.com',
'iat' => 1356999524,
'nbf' => 1357000000
];
$jwt = JWT::encode($payload, $privateKey, 'RS256');
echo "Encode:\n" . print_r($jwt, true) . "\n";
$decoded = JWT::decode($jwt, new Key($publicKey, 'RS256'));
/*
NOTE: This will now be an object instead of an associative array. To get
an associative array, you will need to cast it as such:
*/
$decoded_array = (array) $decoded;
echo "Decode:\n" . print_r($decoded_array, true) . "\n";
```
Example with a passphrase
-------------------------
```php
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
// Your passphrase
$passphrase = '[YOUR_PASSPHRASE]';
// Your private key file with passphrase
// Can be generated with "ssh-keygen -t rsa -m pem"
$privateKeyFile = '/path/to/key-with-passphrase.pem';
// Create a private key of type "resource"
$privateKey = openssl_pkey_get_private(
file_get_contents($privateKeyFile),
$passphrase
);
$payload = [
'iss' => 'example.org',
'aud' => 'example.com',
'iat' => 1356999524,
'nbf' => 1357000000
];
$jwt = JWT::encode($payload, $privateKey, 'RS256');
echo "Encode:\n" . print_r($jwt, true) . "\n";
// Get public key from the private key, or pull from from a file.
$publicKey = openssl_pkey_get_details($privateKey)['key'];
$decoded = JWT::decode($jwt, new Key($publicKey, 'RS256'));
echo "Decode:\n" . print_r((array) $decoded, true) . "\n";
```
Example with EdDSA (libsodium and Ed25519 signature)
----------------------------
```php
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
// Public and private keys are expected to be Base64 encoded. The last
// non-empty line is used so that keys can be generated with
// sodium_crypto_sign_keypair(). The secret keys generated by other tools may
// need to be adjusted to match the input expected by libsodium.
$keyPair = sodium_crypto_sign_keypair();
$privateKey = base64_encode(sodium_crypto_sign_secretkey($keyPair));
$publicKey = base64_encode(sodium_crypto_sign_publickey($keyPair));
$payload = [
'iss' => 'example.org',
'aud' => 'example.com',
'iat' => 1356999524,
'nbf' => 1357000000
];
$jwt = JWT::encode($payload, $privateKey, 'EdDSA');
echo "Encode:\n" . print_r($jwt, true) . "\n";
$decoded = JWT::decode($jwt, new Key($publicKey, 'EdDSA'));
echo "Decode:\n" . print_r((array) $decoded, true) . "\n";
````
Using JWKs
----------
```php
use Firebase\JWT\JWK;
use Firebase\JWT\JWT;
// Set of keys. The "keys" key is required. For example, the JSON response to
// this endpoint: https://www.gstatic.com/iap/verify/public_key-jwk
$jwks = ['keys' => []];
// JWK::parseKeySet($jwks) returns an associative array of **kid** to Firebase\JWT\Key
// objects. Pass this as the second parameter to JWT::decode.
JWT::decode($payload, JWK::parseKeySet($jwks));
```
Using Cached Key Sets
---------------------
The `CachedKeySet` class can be used to fetch and cache JWKS (JSON Web Key Sets) from a public URI.
This has the following advantages:
1. The results are cached for performance.
2. If an unrecognized key is requested, the cache is refreshed, to accomodate for key rotation.
3. If rate limiting is enabled, the JWKS URI will not make more than 10 requests a second.
```php
use Firebase\JWT\CachedKeySet;
use Firebase\JWT\JWT;
// The URI for the JWKS you wish to cache the results from
$jwksUri = 'https://www.gstatic.com/iap/verify/public_key-jwk';
// Create an HTTP client (can be any PSR-7 compatible HTTP client)
$httpClient = new GuzzleHttp\Client();
// Create an HTTP request factory (can be any PSR-17 compatible HTTP request factory)
$httpFactory = new GuzzleHttp\Psr\HttpFactory();
// Create a cache item pool (can be any PSR-6 compatible cache item pool)
$cacheItemPool = Phpfastcache\CacheManager::getInstance('files');
$keySet = new CachedKeySet(
$jwksUri,
$httpClient,
$httpFactory,
$cacheItemPool,
null, // $expiresAfter int seconds to set the JWKS to expire
true // $rateLimit true to enable rate limit of 10 RPS on lookup of invalid keys
);
$jwt = 'eyJhbGci...'; // Some JWT signed by a key from the $jwkUri above
$decoded = JWT::decode($jwt, $keySet);
```
Miscellaneous
-------------
#### Exception Handling
When a call to `JWT::decode` is invalid, it will throw one of the following exceptions:
```php
use Firebase\JWT\JWT;
use Firebase\JWT\SignatureInvalidException;
use Firebase\JWT\BeforeValidException;
use Firebase\JWT\ExpiredException;
use DomainException;
use InvalidArgumentException;
use UnexpectedValueException;
try {
$decoded = JWT::decode($payload, $keys);
} catch (InvalidArgumentException $e) {
// provided key/key-array is empty or malformed.
} catch (DomainException $e) {
// provided algorithm is unsupported OR
// provided key is invalid OR
// unknown error thrown in openSSL or libsodium OR
// libsodium is required but not available.
} catch (SignatureInvalidException $e) {
// provided JWT signature verification failed.
} catch (BeforeValidException $e) {
// provided JWT is trying to be used before "nbf" claim OR
// provided JWT is trying to be used before "iat" claim.
} catch (ExpiredException $e) {
// provided JWT is trying to be used after "exp" claim.
} catch (UnexpectedValueException $e) {
// provided JWT is malformed OR
// provided JWT is missing an algorithm / using an unsupported algorithm OR
// provided JWT algorithm does not match provided key OR
// provided key ID in key/key-array is empty or invalid.
}
```
All exceptions in the `Firebase\JWT` namespace extend `UnexpectedValueException`, and can be simplified
like this:
```php
try {
$decoded = JWT::decode($payload, $keys);
} catch (LogicException $e) {
// errors having to do with environmental setup or malformed JWT Keys
} catch (UnexpectedValueException $e) {
// errors having to do with JWT signature and claims
}
```
#### Casting to array
The return value of `JWT::decode` is the generic PHP object `stdClass`. If you'd like to handle with arrays
instead, you can do the following:
```php
// return type is stdClass
$decoded = JWT::decode($payload, $keys);
// cast to array
$decoded = json_decode(json_encode($decoded), true);
```
Tests
-----
Run the tests using phpunit:
```bash
$ pear install PHPUnit
$ phpunit --configuration phpunit.xml.dist
PHPUnit 3.7.10 by Sebastian Bergmann.
.....
Time: 0 seconds, Memory: 2.50Mb
OK (5 tests, 5 assertions)
```
New Lines in private keys
-----
If your private key contains `\n` characters, be sure to wrap it in double quotes `""`
and not single quotes `''` in order to properly interpret the escaped characters.
License
-------
[3-Clause BSD](http://opensource.org/licenses/BSD-3-Clause).

View File

@@ -0,0 +1,42 @@
{
"name": "firebase/php-jwt",
"description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
"homepage": "https://github.com/firebase/php-jwt",
"keywords": [
"php",
"jwt"
],
"authors": [
{
"name": "Neuman Vong",
"email": "neuman+pear@twilio.com",
"role": "Developer"
},
{
"name": "Anant Narayanan",
"email": "anant@php.net",
"role": "Developer"
}
],
"license": "BSD-3-Clause",
"require": {
"php": "^7.1||^8.0"
},
"suggest": {
"paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present",
"ext-sodium": "Support EdDSA (Ed25519) signatures"
},
"autoload": {
"psr-4": {
"Firebase\\JWT\\": "src"
}
},
"require-dev": {
"guzzlehttp/guzzle": "^6.5||^7.4",
"phpspec/prophecy-phpunit": "^1.1",
"phpunit/phpunit": "^7.5||^9.5",
"psr/cache": "^1.0||^2.0",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0"
}
}

View File

@@ -1,63 +1,7 @@
<?php //ICB0 74:0 81:63b 82:be3 ?><?php //000ab
// Copyright prestashow.com 2025. All Rights Reserved.
// @authors prestashow.com <contact@prestashow.com>
// @license https://prestashow.com/license
return;
?>
HR+cPtd29tCI5vn4JdgoKAsiiB02nTdniXOPvV9SWUjTR1ouGluWynAPsaRb6rjI2fZUGgjztgVM
zwVNKDw+jxAlujmjp8+cdjK29GDPDhRTGXR4s6auw5UOxJ9Jl/coi5nbO6NK0R7/ou4WTlVsKidQ
Bv2XIKLB9pkSmCbEAWK8oEVvLzdfaQ1pEL2q5qnI7+dDBwfopVK5Zm1TsF4mTf9fZIhXsEpHfa2s
m9EeXKL4Ee1N72ENKAQFsgLixdBipnEr79Dqju5PmQ5c7ylffYvSBFWoJmYI5zSNeGdrTyGvke2x
URF3ghRnXYnf9cnGBi+4SyagfO5G9smPAaU4BVBS9h462UkLGGjwyAjKhLUmeVhwKoCqIErxPKxH
NVWiPh5AyuFtZs3VbU5I2ECjOC8aln7UrRpIJllVZasYQvIrWkBB/iYRLmQ7kQq+/tp9GDwQNwLz
llvrWt0cXE7VsBV6plLD9p1sL39nqdsd7AtX26jOMq27tWXSZDzvrMevLawksuO2Apuf0RGBFs3r
7Ti9eRNHInvORCKX6rGB9BWDxk7Fu9gWDNPlzrHEMrfnFcwDNDgmrivRrl405xqq2bjs2AE++rp8
diKz5atOFNIwAM237oAdGSG8Qe6vr2yhARqvgnOpd0kvavaHRS3AtwJ0x6fdNjlI/0h5XnVWgesW
oqPGnudc9V6GK04ldsAPlLzpZkQl8jrJX4HGKKgm110eh+e6Q8aKQBQimsGDuGSUerj+CFa2v10o
8+sRzdxpnBPBDgxJfJxA5dPNOZd/vaePFqallIZD07fsuEgwCXZG0Y7BWdelkk9x3f574qjDjHBu
aLQIEbl5wajPw1wSY27IZbIqOLMV0xRP6KSW7GjFjlHqBX9EuXTJZlKwCMQD7jdwKn3KWyIqMXCm
0oNZKKjY5BUBk9RhibKxzptXz1L3UTWqtgY9D2CMWVEyR7VjL0uoxAQx5s1Y7pXnD5xMWnfMZdTq
aVNamBcgHLWfmCAAuwcoieLD1rX3aEwXUq1H7nzRkXBKUJzawnwJoei099VPtLtpECh1AImsv3Y6
0MhOb6MhCPuvYF4EMC2rb+Fjdi7bwkT814M9xKc+voKFne5Xe194BurKO4Icnub69GN4HsD3u8Mg
6RlhKA8hE9Jv7co033+gd5Iv7y7D6OPAjqJWMopVA7cW/1rJwFQ5+4b5ycNZzONs/k2m7vsGA0Z2
tkBfu47NFlByfgIKp/qSULe5sLs17Wororh3/oKOQtItgO8XC14g8x118RjnJ9UknD7FiVpCUOk3
K2dRLzL0uMJ79mJsUlF4RJGjSpPyXeAkWUlfylpLSz50rh5luOaPxTij2Bvbo20aQsAPlQQE1ZAa
eaAe+CFAkyKmc+EshvZoaQwvk4zY02O==
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
<?php
namespace PShowSsoScoped\Firebase\JWT;
class BeforeValidException extends \UnexpectedValueException
{
}

View File

@@ -1,385 +1,258 @@
<?php //ICB0 74:0 81:27b2 82:4d0c ?><?php //000ab
// Copyright prestashow.com 2025. All Rights Reserved.
// @authors prestashow.com <contact@prestashow.com>
// @license https://prestashow.com/license
return;
?>
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
OknpgJiTiAa==
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
<?php
namespace PShowSsoScoped\Firebase\JWT;
use ArrayAccess;
use InvalidArgumentException;
use LogicException;
use OutOfBoundsException;
use Psr\Cache\CacheItemInterface;
use Psr\Cache\CacheItemPoolInterface;
use PShowSsoScoped\Psr\Http\Client\ClientInterface;
use PShowSsoScoped\Psr\Http\Message\RequestFactoryInterface;
use RuntimeException;
use UnexpectedValueException;
/**
* @implements ArrayAccess<string, Key>
*/
class CachedKeySet implements ArrayAccess
{
/**
* @var string
*/
private $jwksUri;
/**
* @var ClientInterface
*/
private $httpClient;
/**
* @var RequestFactoryInterface
*/
private $httpFactory;
/**
* @var CacheItemPoolInterface
*/
private $cache;
/**
* @var ?int
*/
private $expiresAfter;
/**
* @var ?CacheItemInterface
*/
private $cacheItem;
/**
* @var array<string, array<mixed>>
*/
private $keySet;
/**
* @var string
*/
private $cacheKey;
/**
* @var string
*/
private $cacheKeyPrefix = 'jwks';
/**
* @var int
*/
private $maxKeyLength = 64;
/**
* @var bool
*/
private $rateLimit;
/**
* @var string
*/
private $rateLimitCacheKey;
/**
* @var int
*/
private $maxCallsPerMinute = 10;
/**
* @var string|null
*/
private $defaultAlg;
public function __construct(
string $jwksUri,
ClientInterface $httpClient,
RequestFactoryInterface $httpFactory,
CacheItemPoolInterface $cache,
int $expiresAfter = null,
bool $rateLimit = false,
string $defaultAlg = null
) {
$this->jwksUri = $jwksUri;
$this->httpClient = $httpClient;
$this->httpFactory = $httpFactory;
$this->cache = $cache;
$this->expiresAfter = $expiresAfter;
$this->rateLimit = $rateLimit;
$this->defaultAlg = $defaultAlg;
$this->setCacheKeys();
}
/**
* @param string $keyId
* @return Key
*/
public function offsetGet($keyId): Key
{
if (!$this->keyIdExists($keyId)) {
throw new OutOfBoundsException('Key ID not found');
}
return JWK::parseKey($this->keySet[$keyId], $this->defaultAlg);
}
/**
* @param string $keyId
* @return bool
*/
public function offsetExists($keyId): bool
{
return $this->keyIdExists($keyId);
}
/**
* @param string $offset
* @param Key $value
*/
public function offsetSet($offset, $value): void
{
throw new LogicException('Method not implemented');
}
/**
* @param string $offset
*/
public function offsetUnset($offset): void
{
throw new LogicException('Method not implemented');
}
/**
* @return array<mixed>
*/
private function formatJwksForCache(string $jwks): array
{
$jwks = json_decode($jwks, true);
if (!isset($jwks['keys'])) {
throw new UnexpectedValueException('"keys" member must exist in the JWK Set');
}
if (empty($jwks['keys'])) {
throw new InvalidArgumentException('JWK Set did not contain any keys');
}
$keys = [];
foreach ($jwks['keys'] as $k => $v) {
$kid = isset($v['kid']) ? $v['kid'] : $k;
$keys[(string) $kid] = $v;
}
return $keys;
}
private function keyIdExists(string $keyId): bool
{
if (null === $this->keySet) {
$item = $this->getCacheItem();
// Try to load keys from cache
if ($item->isHit()) {
// item found! retrieve it
$this->keySet = $item->get();
// If the cached item is a string, the JWKS response was cached (previous behavior).
// Parse this into expected format array<kid, jwk> instead.
if (\is_string($this->keySet)) {
$this->keySet = $this->formatJwksForCache($this->keySet);
}
}
}
if (!isset($this->keySet[$keyId])) {
if ($this->rateLimitExceeded()) {
return false;
}
$request = $this->httpFactory->createRequest('GET', $this->jwksUri);
$jwksResponse = $this->httpClient->sendRequest($request);
$this->keySet = $this->formatJwksForCache((string) $jwksResponse->getBody());
if (!isset($this->keySet[$keyId])) {
return false;
}
$item = $this->getCacheItem();
$item->set($this->keySet);
if ($this->expiresAfter) {
$item->expiresAfter($this->expiresAfter);
}
$this->cache->save($item);
}
return true;
}
private function rateLimitExceeded(): bool
{
if (!$this->rateLimit) {
return false;
}
$cacheItem = $this->cache->getItem($this->rateLimitCacheKey);
if (!$cacheItem->isHit()) {
$cacheItem->expiresAfter(1); // # of calls are cached each minute
}
$callsPerMinute = (int) $cacheItem->get();
if (++$callsPerMinute > $this->maxCallsPerMinute) {
return true;
}
$cacheItem->set($callsPerMinute);
$this->cache->save($cacheItem);
return false;
}
private function getCacheItem(): CacheItemInterface
{
if (\is_null($this->cacheItem)) {
$this->cacheItem = $this->cache->getItem($this->cacheKey);
}
return $this->cacheItem;
}
private function setCacheKeys(): void
{
if (empty($this->jwksUri)) {
throw new RuntimeException('JWKS URI is empty');
}
// ensure we do not have illegal characters
$key = preg_replace('|[^a-zA-Z0-9_\.!]|', '', $this->jwksUri);
// add prefix
$key = $this->cacheKeyPrefix . $key;
// Hash keys if they exceed $maxKeyLength of 64
if (\strlen($key) > $this->maxKeyLength) {
$key = substr(hash('sha256', $key), 0, $this->maxKeyLength);
}
$this->cacheKey = $key;
if ($this->rateLimit) {
// add prefix
$rateLimitKey = $this->cacheKeyPrefix . 'ratelimit' . $key;
// Hash keys if they exceed $maxKeyLength of 64
if (\strlen($rateLimitKey) > $this->maxKeyLength) {
$rateLimitKey = substr(hash('sha256', $rateLimitKey), 0, $this->maxKeyLength);
}
$this->rateLimitCacheKey = $rateLimitKey;
}
}
}

View File

@@ -1,63 +1,7 @@
<?php //ICB0 74:0 81:633 82:bbb ?><?php //000ab
// Copyright prestashow.com 2025. All Rights Reserved.
// @authors prestashow.com <contact@prestashow.com>
// @license https://prestashow.com/license
return;
?>
HR+cPoqAuEofxzZ34R9rps7eysw0L7RPS0RxDSSc3pjCv9Au3ggEAmoe5/DzRzKuJLYzfH7R6vR+
VDjUEkw/26sgiT9lyDW+BR4jWAmOOWLnMO4Pi/XnfuJmNDmYpRRGDMnerKp7iJl3Q0CXQbpHjm6N
h8W7veA9TrF0UOtDznVHqTps9VzZBVI+ry6i0ZPXyz20hsU7EjJElQ4xQCC8SyPEWs+MTYDJuuyv
ybR9OyT7iToYzNK0vaRbWvZx7y/RYgEERErO8MWBhqFHDqV3gojItVh7Q8oN1xusm8Xjg2O5fLpT
lFhd1zqYr+TfqRkkj4loC7XGpYHpz/auEp0rwZHTV0GYHEIIBQiB4n12A2qzyWWTxnICpRBqcU3B
l0oMtCjmYiC1uF+bW1D0Jh08uorWmYI/4TxLlD9E+z+EeQI7VY0zxPiVIcYX1iUrhNclI4o0Q2eS
oEvOWXxZOpArR65KRDGlzOkZZAc/Kym995j3usBEzc+6iJfDeCJJRQAAz3g/jjERuw0qdK9oOGB7
1LhH7nJ3DrVVyR8oiAGYqEX/3vIx0yLRyoV/JKAxf4Wqd/8xFTI2oi1wDTsREjOabIGj+F9RNGnp
XuQ5imQNgmThX4o2hQ/QtpWwuj4iDf/8tF0bqVe1N2ke89de8tEqohPEKc3sU9iTxBoyzf80SvcM
Qq+OnljILPX7h8dWd9cqqGafpYn7jzXixEChukiu007Rn6ogsijzfyPROp/n970pxj9qkDU2ps4A
irC2xRrA3Py+DmqICFH7RmIm926aMClA21jBw+jvmPHiJdIxK9dTKL/zMBr2vgKo+yf7E1w8dKvK
OcSBEU2wH5fYON5kH5uNsh4xvWr6N/SmdVmjng2qYO6EMBHvTj0N/Ursu5/XDm7Kb2oMBqa371BC
7Ngn4AEpMdVVDt+ISgrcL76L2Un201k0PXZvZXyI6MPWobacPm5GL1UNYS4dU8oZ2y01wWG6nUYI
UvLxJNCIaPkdIwJs9u1cbrn1HB+4VR/xC/yBD2FK8VNIaqv2QmsDgdXJyJYWnYI7GM5u2WwoW87D
5OBOfxk/xAxyekzxVxmUrn87SMngAh+TanJap6xqaEkeBjBMMp3IW+B4xpztZYxRjjGdiEPaN6Pc
ojMSCHqF1KD4s+Hmvbt5wiZbPgRdWJ6G6mIlpRbIG86/AE3MlA97jrWv4g+4bnKMo7zvAgvY8zmj
eh1iC5lgcyNTXLn+GUloxAVcXIDBPrSJzRepbRxOKIi/0rqPuFnvcwqn1zUBCBxYODbLjAH7ap9J
Gex7/d4QDiFgsvuWuebuMRfPhDs0pVm3qlA6PVeQhPWj7EhYn5ins8aLMUCQalnvtz/qpqZBtPPQ
ZY3zrKLWAjnjlnwhj6Hyf0===
HR+cPplLAvbk9f3Uqcs+kc61p1G3+i/2x0F51M/fpv/puE6ViYljpG6WFs18t+S4smDCipGs4X/J
EhcQAK0/ARJeklCMaOO4aw6JV8y0LBHP7r1d0b84QpslgqDFbW+qCKxdbfc1APhIh8jq351Fmq2b
lVc6VVttXqq7YzSJ7oapdKn7ZpVhRcXQ+GZQJReLYlNOclHKz94G9l+S2VCQ2Wpi9np1Gd+EJ+3V
mOI0xUZfb9ax/xJgoYeuXAa6nn/n6tJdmhQ8qjY0G8GT3fBTNUpDSG4Kv/uER9c/GXru1EeLbLTG
BLK/g1bI3Sb3mP+spBDhDQlimf2Qa83JPqeKf6AsEcFfqopIJ1sBiIiariWXzZ799UQ0zKbkBl96
jGB+ZN5cWVRA3rPU/53E2lErmoRV4ePpsXEb8OQYcSyFdHIKn74eP32iAExtwdmj7l/reDPhLrk+
eb7o5ncXYXri5I8IiigWHk0ps5dQhCo+wqFyzgcTFX9bZhkSN9pEP7uEZ5faHdEI75UoISDfDRNZ
4+GMCNfPHcv6FyIXGeNkgMxsaKA3Ov2SQiOu040Obvf5Ql3YOrXg0MGN8xWeYAG/1A8zoDV3855w
kI/cHy8iTbWwybmmBFwrPDe82F0nTNSE6C3ZmiuVgvaS8OcjD6N7LkojZCtRy4QA3sNpXrqhwolc
BEwr12tzQ/b13TuoDzJmkB0W0R2yurz2R638m0HQErmRq5ptsUG8uPlzWqgph2bMNf3nzofNKWRy
3bDo420V2iwLuAHTX73lsWkjMICt/oeCHGO5guVIfyomRaU8SYMCBnoPL6zCKC2R+ML3EVMWzoWB
2qnfaL80rk1XMQqNWgBncVwhrMYdP3NgNn7W3aKdog8TBAXQdeFT2QHRv1O6Sewd5SBGT+1AnQMe
ShQdOIlmMl3NtaylUJEEccLrz8Yriwk8r0gOltMS+ZyHW8CcrvdI7sthkM08CAXQXqGUneequr+4
KSNd28rIOCFPPr23XqjmBxI1L68sS52770bNV9tk11rzAzs5XwgSw9h/MSlp8uURylxDbl+wgkEC
xxcHHzqoXSBWwomnpowTpuQCcGpl3IPTZtdq+pegELuolHRfpWxrmolmBq/9AXa1S4TneE9B/WXs
v2flij2t+cTgQZT+8CSMLHR0Z0ZSIzz/5XiU3Aa3U8oF1TkTo2yOVHQoq+1NfnDDyYHWDnNLAQBc
miTzuLieVrZ7jyzFcW9kLueQUH1WO2Rf+3QljCrmsMMxf3SBDgA06nq83HBpoOlSWfc73MzBLnHd
wp+5f42iP0F6H7zW7GrxshYC1ATEi3V97+QTD/aYdsvNxJUFUGXzH7++fII783RBt5EBKyTJV4QL
vJdxI2WwkHIpqYGZKaXKgLnM5IC==
HR+cPqtwcgHgNt+Bra8FXvVIb/EiMwtHSb/vh6ZN3vtK6bvE7pUctr+4KDFAFa1U7DzCN4TuOpTU
pjw3ZHvkkFSt97w7zou2ID4ZgZSmgKfI024YCc7CcF6bKFfu6VPXGsWir1KlOM0iTyM8kxnxmTf0
E3vsnzGW2xiSBSPQNhCSNJPoe1amNhR6jBdu7M76MSRU8/RaZ0REj0AssqdeiDORSaBKEaHoROl8
2L+FebKJQOGVw9WS2VN1EEJTL/fteIcImQMCgO2hBC2/OdyeYK/2UJMsgFzDCJMH3xBy5KhFosmq
OQZrxLTk7gL7OmRRi5n7LXD/KQ2QzjdvXu1f5mQOEd6uqom58ql3GsZUM42G+7TnDF99Pwp7Ywb+
6WBCeVV8zMn9kSL51MGjVvvi/eq0PrbF5BGNyaUan/G1cSfqjqkYCmJmvhgdGvlENV+WPc6n0YY/
7XA11f6zrkY7DvJvCF6eVggTMhjVlJkMii049PkqJDb8GECJyAQ91VJ1Mt/tSJh3fZ2ROpFZTO6Z
ZoTcSo47xGH+jQd7PK5oZ64ESCO8hxxyqetjR7vXICdK1+d5qi9TxkCeiG5uhndhNNwB5akueJhm
jJwT5eKvytqIkAvFiII0RkKFvlckAoH9ceom2xaBP6fds1SQztC0Qvt9SyoiAMtTRD1iPlQnQAlm
P3bBOt9Sd6SaLUCmrYmcM2MrZDsQBiSWjL/9+8MMrKGQjRwlwHBXIkNP+qwQjX0PLKfDgbTQSnjt
EuH1OJC4LI9gSYQ0132hpM4WwEDG2DVAtTHguXjXaEnXKPLVnxLJz8u3/cLuFeOa3o2A2NW7Sm0r
A56VSE4CBy9NZbdBUXmJ3PFrT+JqK2TBDQ0Ilht7vsmOOpthyyDfg5NqPm+jpGKIN3eANrXwhChl
Xu6m4Gkrf2iu0DPh1Wy6lv7gBH6QKa7+vpRSQO6I7WoI7ZNR1Oss18QSCKwTdrFDXNJpQth98rBy
KocpdCS4TRkQWN6rfKuFV2S/ZDPiDOjPr5qF8xbdWqAyiXTVEkklGOUjUjJP6tUizsOlYZC63eIv
ig/nvP3yjv875rdHvVj2jMN/h3k5SLSPEADWvUE5DyKvlNdmiAeD3gMaHrI2BZaevcaJnpSbo07l
BGbIu28c1kR0ilgSOrrWm9FG5sg5KOCJ5DdQSk333aZSeTwqfiXwjqlTTKs2+HgO88ephzAe7O9K
SvDJM1D+EBKrChkoN4TmNlJPeURB9DPaWbmVWzw9RfY3724PaSdn4UeBRswa0a/aVt5LZpEiq8RZ
3pCG0vtztFog85OO3JucaSAShnz7ul+wK64iUTX7HPxFF+stx4/+P5NpZI71/bFT1ODEhe3yomUs
Mc0ngDO4SQQwmSXO821WkiEArxgwSevpXuqvXfspBs384G==
<?php
namespace PShowSsoScoped\Firebase\JWT;
class ExpiredException extends \UnexpectedValueException
{
}

View File

@@ -1,491 +1,323 @@
<?php //ICB0 74:0 81:325e 82:6247 ?><?php //000ab
// Copyright prestashow.com 2025. All Rights Reserved.
// @authors prestashow.com <contact@prestashow.com>
// @license https://prestashow.com/license
return;
?>
HR+cPquV+yFKsz/q1CPkuAwefp+MR8+mdgSHdTjaRcPUmOO+SNgjvLXgQYxsAN9zKnVh/KWXpftV
6AN+DJIznazQoNg3wwuW1AkZwvZTEZP0JBRIHFa+Xxurl9LLWjfOCb16xoRVOKPY0tnDtw+dDBXC
ZnuAlAmfnlNYXclVt4PgE9wuPr1Va8PJJYqxpIHkUMy2/Ae553JXqZTJLjjUvX/fujDJt+D9yxSX
Su4c968gZx+8PGw7gf3EBk+hnC+h8T43+mE0Evgu6PJ/A8cj3XBKSe8RY8cpS5kHH/1U1vQu7aHp
k+PEbJknmLGlo+ygfEb071/3sdFSe4/5McZj2VHDyD/tMjh9njjZmuatnW2adu506wHhRyf09ViG
KNIYC76pSe6nKFSUTAKE2ECjOC8aln7UrRpIJllVZXIW1bZbun8w1z2xUmO7jQqK+C8+0UDpKT/j
ZbqJY7uNfp8TA8HZkBMcEkkjqDLxv1HJZunYYzcc3mDAD0Fj0I/NLMa7SjoJz2oI/IEWDqEzDURg
Zc6IhZEib+qGuie9zltee7PYtPQ8G+IbjoD4ibdCGfFtotHkekZzkFctrz/tvHSVZSC3pld+4F1U
YXF0ZRUBL5GmwOS9hIeBE5oYxWkVkgLs1EAK+3FExqDqMt2JfB4E/CfvsVulwtrh8piTnkhMRuNw
o6Pr6ZqHGWUe/usciT3QnWxsAWsDURc8YU1gRPDWhpwctZ/E3hbMQKu0mW9jC/f3CDADQhjH630C
N1XCs/mNYjXIE7HKbEbP1W7oal17lcIb9r91r/NBfRhQKdVb1BMNeDnHYRDVnvYr2bY4BONT3z9y
wjAVVOyqCsDqdci+zo1Babnc8AK3HDM0jy55kAtNj84YCEPqtvWcXiJHjVRZy/MlGfqTwOPEkPWr
b7aNrJhF/BqW3oJmZyMIx4B6QaMOAibq4b28SQNRCS/ZnOzTJoBh1XoBEvBrX6mLSPnXlfXIxH14
/hLo88CPG/eFpv6dBRCiEKu1XDe8Bm7YfA6fQ4MD9UmRtr4Qq0Rc8GpVEm5GvMyFGqHoxLj15fd/
wVFw+68dln+kSsC9Y3HmAUJgByebz+MFPDfymc/d2P/FA/zvcaQ2txqdzqgmJL2EOP1L7XAly4FU
L/yZOt21E7GmWtOzp4gAgOITR/Id7v9Yy02ckEzG0OOUUA3It/jNqDSHjCE3YwoAKfFsu55lTfUQ
Y6Gi85OnKozKofwH2fBwe0BSDeb+Vpz4UlktjFQ/7B8A3W4CYvWTz/ako0+m15YxhEFtyvSS7e3D
L0pl3OzR96iZnji3QRlnW4OKvbzHQhNHSs2z/K3Bi52WcLv2RuRIAtrX33sfmdPeilKVfW2vvNsE
0DrUBClO086ONVrfyuMSnSnc6SsxdhktSKqqQOwCdrDnR8qHUenVMIfkgSsfs6uIdv0EaKPvrFT8
Z8g2tr7j6FMrOaOcmhvuQMsGARREq+QVB8qQiarU//sJRWOlggX9CHqawkhUbn0o92BKlWEPx3Mr
fQazfpgMWPL6Zpce3NWZX7OD6zQDH0sHVHTostISZTBE5ho8kzSIE4BiAkyzFIfQ0sQqRI6Uf0D0
ERl/1ZDgnyxtPBmQSUJOqMPvsDADkLhYFgCuHADNMJWbwLgTYDq4ayr8cCbMP4mjaUNqfkCoYYr4
W5MFrqDaBCGPP0QvnaG1275lsYJeQAPiU8vnf447JmLhI3BZWREuyhip3xnftLYuNbqVxZKHzPKq
8Z9DeowDR9xBeCWXCZGbGIKA/4c7FumkWcBNxD8a55tNnenrKoXznLoS+RwRi7ASjHpXdUQ1Tzsi
8YSweVg+6xTvJ4Tsa27Z9EX8My8Y+Js2UQBngdcKXkGC2JNAEiI4qq5CDfe/nFdDD2wNLFHmqvWK
X3OTiuT7KSIK1vAQAiuzalvKxQ3gjyc8SjfrpxMbpn76L7DRCQ5OZennjYLS31WbCKykDAV47HZ7
TPugWYYmKOrY03JTSauPZk3r+hVbR/0Gwllizw3vzvxYLv3X3oVF8IbhxSO5kb1X/ziXQgz8hRS/
erNmNL/ZvIjCgaIzufV0wz0gKUSG1SUtd3FEqCfCLROzIyvy5g3IOurtklZzTw3NWXrsNDVOzkFo
WTWktH3jYPEnfyl2/Hq0Iq9ACZ8/v8MDNjuoy7K173bi1qacYDPPUM9ztStckNTJ2MmDRTiFGwqU
HPrc24hTYdc0TycqLTpk9SNQ3X02kQUfhfC6kd5BZhbG7fcHwngbOC62npFRatBt800DXtDyjQA4
w8SOqJE7GDdTPgmmE5CVjSwKJDG2evrDY4/nvYBt+cN/7jSt+x/g9JbWtoLi3ftPltKv2kRDpT4X
fuQ+uZdetL58wZ1iSKkHZYFHIfdkKa/1fYbEBANbn5YljngGdRewshCPXg60QgoVTExupbZnn1bk
DruJtEBsnO6CsiAc/GROcRT2IazMNOJtkhl6GEoR8DFu9sVpLy208gTQLj/nAsJcSxTk2+0Z1FJU
xA2/KCu+4uOzK4A0wkKnjGDB6QkN3sD7u1/6dn4hmH6bsdGiSQxGQGWGkDcNqVYKqONpsi9BJbZW
Msc/hfJzpWTTYgvtwXqgTF7iS/A64VKNCfEPoc1ri3sKdHKDhbm/ts/wr4u1KXbRtThmQHh/7Mvz
B0XdrD5+bVi5UqZG8Bn7+otyM0gH+aS1+FMpuWJHm5TUXBnCMUUrZavd44IhShnzhIOZ55SiYm9c
a/iQdOb3Vy1TEEX7hDkZa+3wuni5fCUM0De8NAV/q7vfIWiC0hK8tQZW/qB+o4tUH3Fi65CYFGZJ
uesYo4QfxE+c1ZXxuN82pOh0wref+z57hv0EQcSDGrVMW6dGhzyuioVOl9B8SS/QI2S0g+phBq/f
57Jumjgk45dVBUPROPJ+16CHplZXvyyCk+J0alRSHb+IyOMdFewi/xlW0mqnkgRjWuop751ozZ4R
eBK8VzK16VEfP1n9+6n8eG73S00fmRaQhJjThu3MVNqQrxeiQpP+Y9DtK7iB+L0t8VRcijAtAAEk
IvNl8eDO/H5t01wlzZr9zSWwhKAlgSx/zniMEDmwyFya82yutFx7Lw3LtYCzbdVZF+viA+pNnt6h
kaLiUeOTEBxosTBIhEnknEy9eXUIW8a30UNNbQlWXtDh9W9HndMQ03TKk+3Xl4w1xbYie2kKKrS6
8j4imlksDPu/fU/8tEreDl/Eo9FYSNswCoJvdhUjT06oZ3EvQLrk16Y0lCwg00iIw1g2Xt06+6cU
ivYmsPHLp2aM9nE0CV0ke+Jo0FmqG20YO2TofuZJKQRrQrb4wnp5ibwgyMun8Nw603TB+p9paC4x
WhgQ/arD8BsI1MNHielAfZEd9liP5Hjk27s89zFlo5/lEavS3i4V2Uk/Few9eCLwcbKuvCro5fjE
XqRPQvyZMhfL4uWK+FYdRhToUw+v2kht7TKE0WE6PRt3bvd2xdX8G4aAtls8GigSJi5/+PtTu0N/
ZH+4H7KT4WQvKL+gw3yLgzuEHtzsyIdhyoI8IPbDMpsIQDIRWwBO7vbImezm2c45I6tyOjSeWUcG
01hq6+5tl5B2nKICXp2CdLhmhfP1UpE6CNSxOBjbU4bTnsjRxE500OSYTFSAbjGnDs4e59JzTU6Z
LPAfdqq8A2Va3/GRYz++lIztRO2Y673iZLLaGk7kzPwuB8M5FM72pGQp9KM6O3AYtYe0UYhEzBxe
W1yUKPeGg9IQPNjXIqdFw91g2fwjCDFAFd2qXJXpx8Oxgmhvan4WQHGN3wslQcCi81afJKtNX3LC
JLtgXj26IhqwaZ93/rqiRIRPaNucBNjzq7jJqBh8vExC+YLX8jBwzoJexdwRw/A+J8+q9r9nbYZh
icaured42OC0vRkqfo1zNVafNW7/t2+gBNtUujJjxODvIwFIuecqbnoLto4cSbLKxTwlvHSsqnKF
KFbudA1XMXrDpzVhd/PUadS6PVm6YAf1OiVyNy9GAdnNtaRggNpAEDALfczDmzOSDuu9VI2ZIksG
10TCtAVc9OTHgIp1sHG7OgaR63i12OT4TpucLKzhCA5o5iMPmHPePa+edV5mCk1UqlQ8XsZ6euv+
O1amzd8HaQi2cocimBXga4kkqiFSQhkghhqBG3YjRyzrfOPPaLpWMEf8H/SI8Tj34l2mDRLVfI8g
8TFOJedynP1Y9qYpeoRgAMZ2uO8YmwBLZeD/ziqxI8abRoqa2DGvpdIJr9c1mnCrE6aWh0pLdpSj
JYLkbebhyqua56wVBn87dHa+hhqFZ/HWYfU0+WMqD7sWAD6eAJrfLklmNaMzn5oL3R6PlasHLTzJ
g5qAIXDVawTfpNGP0xEsjxc99qlzSYjvjKTar1dX/fML+aqlb/tPG16OI3MLYvtRUBb4c+rNP+os
nxc2vD5b2L+w5+R1yxVW8xRfxybR3UJ9BDc1aCwcI2MjfiNK2zZs2byfGwno6qGhBuplKCERtaYx
JSr8WwStA0AHqikQOVVPMNMnOZN/JmY/Zyz8t4mxsRQHuuZINRaAHxh+wG3t66FXSGVg0v54M1tZ
je+3Uo6kPfXaWjTIbI4lnba5k9l/nt9a/+zUbFY0BLt8EX8+0++zyKj0CIbha8tKp5FvmiFd4IBt
EDzD4JEuOOQc2m8n2GIB+o+qwmv1q0FpQctCiTb2LkbdsMGc7XkZDHrR3dxsjbQNqK2S02qIuFNm
gEwbl3BBA/61U7PgwMIug7gn2Ktf4qHuOs4jnG2qrg5izsG8RjgfbiakO0P4CA5Dk+RJIGgvyWLi
kCrGqaBcK05Kf6HJ6rS1iXdvPeQL5rqlWyV04JzdLPsf4fhg9N86M4Qzy0/+q67vl65iU/bm+dlm
D2e5DoWNJh8NtJHBn+TL8dRZvJqcYupUNsw2/tbBIw13GnOw2cWWQaOoRDhg+TXqaeUx/6jJattz
xIAv6JZ7nzEDPMng6Gya5s1pqO0WEB97ghT+l8k9bWGNSwtCEYTN6RbWdhCdjoY1GKDxMUxHYOoV
x2+A9JiJefVlkfrzfSCtFt6tCerRGVEBd0aKgJz6PIFAx0XFirL4mscVjAXJlvU9HdoMwHT9OcTm
0WeMbeKWMEf2pwlSm03eCv08JBzoY83H1tpf2+ecXDanNDOIisExBTrJHDasU6zgYExIeSuRU3ad
uqXE64BVkVHgUTvSRIJ0Lda1tE6NDQ3rXGUmfxaudvkMbLLr0+/+4kZY7VI9AncGGGHpCN5Y6rRK
iQuFJyHq626m4TVtgXH1zOdsskzMvZW2qWt9MU+GQl/my6GWPfmhxFKKq9Rrb+qEPe+RjVl3NrfB
LjOl/xwuDUNQn6qLK/bSdOWWsVcTwhsgLjb7DdojVDyT/T69+MR7osTsy9BwTi5EuBzE+G0Moo7Z
to37AeQPsMglTykgZ1AW0cdVzLIVcd86mhHeW8ZoXTjNjUrqEFQJgwRPOwQxQpCFLdlen7SrBhSS
wijLh9ORjUMQrChNIFdUpFSzqYuG78v9Dx/WO0M7p/+POBTfAZhu7AF/yxrLyUjCKiokVmGFCCzr
2LHFwwIb374zrQ8kquWRm0plVKf3xCJ+E5gS2WZJeBWVFyJ/f/lbX1LWTyPpz0pCZbeBOOuHzm9U
+4GjGITXIu/QJP7Rb3sIAVPM9l78d7lLm8hyMaP/EqhPxQPhPe5LLRQGvhe1kzgla7nCua3SXr0N
Z7BrV9vs5tfatW7mZQWZlN65DAu1u5GeHIOdU4uL+hgHh9m0NwF74jSPIehLkDIDi6stA7OIc9lD
1FbnpHLF+63rG5PZjb8Ng+Qj8XSc8YUCSouwHhJ1z4l+rdFSD7wJwwAIR3aOCkjJcqx8QTbi8qoW
tvdp9M9uqU7BCxI7cbGBeJ1euRbsh1Du9Tt5nUHftGqdSRD7C94ia+8BkJDT1cYCvzYKg24JNcaq
oQsQJLdYsIQ74k6FbkD/H3gBFXXAVbnJFbriDiP5CUsdodN/n2/JT2z7ydgKr9yPKBOB/Pg1w5SM
RH2JLFTSGsGbCZT5MebZKf/kfhc/pCA7mOohTm+rkIfZvptWEThnxyg4B3CMQ0kOaDDcHh5vaexX
4RCk9BtYXWA77ud11g5YLWDYB4BVOwyRDJWtIk8Zvazo6k9Sr2Jj8qjuawuSh2pX16qSc+li3KPB
4JF2nkZ6EXJtmxHBxTKgWNWFqXbo4r8jJT4Nx3bZvLSDWXlxFsz0/ww7ugOKJT1o1NOM6OwkO2Xn
IdYZCjxz20pq1aYh1AxzHQsX9pw+38Vh57FwzgktlBcI3pKCg8RG0dz6vs570ic5ib7SjKfteZBk
a3rFTssWPtMH5C1eCQNqahI9oV3tA23iBZXgWVZ2dKHqBe2w3xRNDEFsXLrjZXJ1aLiOO0hsJIJa
Zblkh9zuc4bRXCc0deLQUrj2fy1qe6F9o43HJ9tKRExJrrXFTK10vJhRTt8H2g9+lpU5eBZuXIYP
xcbEDtUx4X0iZxw7inbK4UMD/OnKQo3ZWdjtXpr6bpWqVKh4vhVCIvORnztCR7tlF/IOVWtS9aEQ
Rs8UxmkXmWKXoRhK/shSoN2krZzCjMPSM9jCJgs2nfQ+jMA2hReQD0SDcTP5DA5+MRCrMsWYz6mi
j9ZFQA1DOQQiv65oX3QZ2f1pr6yNdzR2UZQH1PLZtX/buPZYIxVhKH4W/vnf5KCwjg0X2EQEw2IO
40Bma/+3WSs1qMMyrXbWUJIlx4rJpoPEqGd6ovzyAmPfAVbsxpyOeZ5piY1U1+2DSm/Jc+pE3mED
3HTYpxAMYf4caLJsLXIPuk+8Bsw/b/nBe+R+6HibWKPmFZtvIFLAEJ5Eg07ZXs79YAzK8PB8JoEw
oiytw2Y3RuyVbLgKe0H4uKtZE9Pnp6RzIWng5R67da2Jjid55pGFEwXM69po31ihV7JbPHtyzXJG
CD7qgqFMNsnZ9eKcePxfzzVpyiwZOR16sw2yP9+kCuEHtGVKGgQC6YUQ2QX/k89UJYNZbxQVgJwd
2dhgB9bCN7ucu3+7WNnkIfm2b1/lKwhNcolHZMEfFM7FN8xO9xEMtTer53MoQyM1eRseCL+vSyfp
Szx+SWvMZr3WxFIdhva7Dw7j+vFCmXsK/V+ZKzdl7BuHp5ZJ46ELfrW6/BE9v97a44m9S/OjGE18
VMUtSdl+S6PLL52SiIEGwURe4xIYOPqG0ZJWQeTWUU7UWu+i8dIJ88mRUEnU4h5va5lUSqItsEyC
jGquMEeLqqENPw74XJzzyfY0VdIMJmyUAnOg5QBc8wBfXAd/xFCZXv5rRcXkdmavgsMelnMHYRxE
TZEqNNLxYKdBfWeZZYWQBL6ha+GUJwwvBEhujjXQ+nOlAno/6j/9Sb5vTfylFOOHqvx5H44I2aSp
7ZUgKpB7zGqjvMDnL27CUdyoD+n+c0pUXf9Up2D0ybDbBRxMypWK7rh5UXVGewKRQxUOc7jM/cfq
z1xFhqbRMpbtOtVVUiPO8uCT2EGZkj5nFJPCGBW2YCCY6ZY1lVi3ZekO+7bGC/gOblNrK3+oXKzJ
ObFKhrOW70mEyfsrFXbugOinxawRBjpW/IOlU8rdqKNXVmrfczjydhTXEn5CYZXuCtg36JLkJC33
KGkimOlP5sfaSk4sYd8ioP0AU1BvaxQvFIbaXj7kvM6whQHA8rr+RoO8PnElWPjX8ZAg8tFN/E1E
2L9Pd0f1Rn5smwIapO0KNgTVLjN9FhgCLVDuDHG6bqFbLuQN1drmSvXmjy1j7MV+/h7dGTvTBIPE
dwpp46cZWNTXk0QlXFNRwe1WByLjFdnrc9vgbDa3zmVYFkwHG9IEw/BCCRWnv3geFR1+sQM0atOM
pjZ903loTOA4lOgxYhPGuUlMj+xBZ+rjeuKZENYL2hIB7TApJRrqmAK7iFfGNi2kMDlXpeqV3xUM
kb3xFJ5HW3JUQTtlAzp5XmAE+Rc1asO5XeUebA0tNHDlfk73lXSN8RjskXG1MEvCQHGu2Bj9KWGj
935g5m2AptWqCxz7Uf2kz1KxGoZEUhZoEQZVqAmVtWnKFQ8LtWxPtKwTPoBGoFTtihA5m4PXRGZh
gFEIVYh/NWlwyzox1T5Xx9RQSF0xE9BVt6SHcFVRQxeTe/WGG0bc20WgBBSDB1lEZAmEwOnCsYBU
k5cfU/ApxPG8fBbJudi8s4iQK8SMrWm31g9/WTLs+zBDqFxAljkB44OWfc2ut0sIsWGM5Qo4fLAC
wh3T1qkFndUwaBLf7MBCDDPNZ3G7JrtugyHEpvW932ifwEZw9EDGbPqaNXi+L0LF5eVlKchztPNQ
CKNTuA4CZGBO6nUlfg+rkmrkpywXq97SyaGwIWFNnBcXlNkja+/OrjnpLl39Dd8B7tyPiCbV5yaT
7MINzSXn2aQYYK091GF2epNReo13whu3pMCvKNnqi91h4WSlR8/6eTZhakOpBNo585HerKEl4qoX
G2gtgUhzNlK+ICBm7pFvLV0z1YlTbKnhqNR6fLQJz68njvFwJycFiUDbC+l6DYXBtzlOv2ZvvV6+
DQHOacuMjpKp6sADpYe5Ay35ga5eOKL5KaKzxqZB5fnvn7i8yOjSYTmXeg26ZIT2qL1N814EeCD4
AoHeSCHUt5p3Toi2D55wNjXvUY3l3q/OGlwTNy7cXW2Wm2Rntwg8VxfPIa9bWJ2hbzY8vlS45JA0
tgF6xo1ctt/En3005JA4wy7pqnrcQIwMc9vjc91hX8IcnwAOpaLq/iWeAF0mYxlen649GwhK6+V9
OzvruKQvMcYUtAOh/zf/I8BWmC8NMBlvfo54CoFM6oumqizM2OIU18eAyA/I0zMFpYiWbwtXJZP3
sh92Z68UzCCi60nMD/Uap6ig29I89o6ZqJ8CWtav+SpNxvVSI26u2x8utY5BrbENkiuup7Lbm46f
x6mrLHeQq6WXDLhqa192XAwQacoTvr/IDyYpPFBH52IYzgR6tLKS4JAxkfEMGcMZ2/YuqkFBkYlK
C4qBeanaaDPjyjwRpk2Gn1TVWcywgY39ctPOdYYfWvqkNVqWgVVbljYI02jdi/BljfFlhYOeNlD+
Ea7TY4BT5KXswlF0A8kpWr2zGAskFLqNDkQ6G36JVNAIJ3xL9q5wRHH1a8XqvwpiX5E88dj8fCmE
mZdStxsIK6AKzwdRjcAzEX/hkoPt0BoIoMDRFc/IYQYng9MD5j8mVaCU/fJWzse0ylUKanazjTRx
veJU1ojiSJfMDeprxba8vNrzXM9LcVCxt0YhhDQgZj+egBXRyp30q8NxlqAPO3garyTjiXy6UioE
d9cl7NzrmSfUp9wCgfPwFln8bedM/S/RsmAwqUF6DhfQQSYoqFPM68YZ6mOMn5vYzE2w/Sr+GaK2
rWleKIzCZW/zdrVavmbBQXPfikY01MhsLNChLaiZMOmtKdRIISR+SoboN/CFB/Wm2BCOK+wHT7t+
14EdqHw0mvYMTcRJdKevebNiTW6AbkGb/JrUrBPWG7JxkfF3ImDwGuG4BvoHwT12s5hVBzO9sbbO
guICRrJlV+HtLw1KsJ/3qYnnyHRAdTrubgVSWpJGi3tYZFX/8XQ1+09hu2o6vY2wNE7feevNLA/O
Ng6ISVq3d7PRQm+TXniVlI7mJkWuwA6l3AeKTm/w/kqiJiARlzR7pygrzNNlSlSA0hoiVy7s7I1o
mb5xmRXL4wC9aqUdZ7NoIJT+ePzN32zYR3AmSHRdrnJlRWxIrjdkvjUJxJOtY4qsJ7kYMf+rT+9l
EaObf4SzM3UdgRJr3s9BZjfNkXeLCOTu1ZW8WIWoT6W2Hv9DadwAv3Q+GUa5B74XnD5A/sSqSNHF
7hLncswYUN6RRAiSZcM0VGgbzc3Jx07VYa5yRTnkQmosvOWWcIbUsDHzrWMXXdE+nsAh63RiIcLq
H9YZTsHP39IXOzZ/VXTPqx7sRyS/k4+VReubmzc54GqeLYd0TAM0lN5Fui0UvUF3Q832jzsDP19e
rVC4w1cRaayo6lyfodpc8B/kj5kLhlI+rxZ+x98t+tPW4g1SFaQoC+GUK/OjnK2kUltlFJU5eD00
G6LdfGaSrNq2VE2sA9GPO9vgAMR5bbvUXl64l7BjFiR7449ZkFMDSbMmK6B9/AEkyAYZSIifjPY2
gcQMiJVa6MAndYWcEquafokt5NUUrZldD1fQJGA3PujEEytvGBR7S/Mh2NBAyY7Ot1vy3ZRucBpA
w6RfBoEwMgypz699EK+HptsnnfhAMbPpqKD/kVl9S3sMyd40lWa83IYEIGZ4D7UemZuejwrigBt+
5lZqYLS2pm703YaQZjpNMXU/cvnIow9KK2kKOS1xKAnfxRwYhaknfiHZAvqvYetIHijUPDTZsKJd
e8tHdIKLFip2TzTxj5TQpsC/JgykpFDpYUxWpAxD7DW5WBO3L1uV+n83G4OrwpNF1Kx3eFltV5Ch
s8TvQ/S7SvIyWCwuxsDtZ14V6j7bUv9VgbYjcn175xcIfJI/5jKoSCexXLUfkj86oVZm0C//MW9h
MPfCMlU7DQwIfd8Pzz6J/3THYWc7exQGOk3ZOjvwa00a8cj0mBYG/6RKjhIl4G252W3aqjoGbim2
winLiIMlboskJSl//g7oaHmpsvcyHmGpbH2kPFG3uf88Qh/UXfIyp1Vca6AnyeN2Szb/bxTrBV50
NTFCEW9nafGB6QfrvVgCrIdgrgZIyFL3ecw6yRN+nkAVvAoSyZtl93S7AIdnx8n3kuxZ7sFD0OuS
9tqfMy7sAJKgMW49FbZPqc2F/iDCxuSLqzYo9WMK3cNgIUSfyxQNZ/MnOYThzuaglu+NVDHkmvwA
sWjjKNQYv0R9ZYbz8ZTi7j/UMHyCnB92cZD+14Kj088zRoYlI2V2pPgQ4TIr+WSYIKELLxsE1jv9
SMEFgAfwhNa8ML2xCQ64EqmqZbSodaNc1RXpdBlN5Gkh2KaISshypLLuzO+Dk5gW+qzLVqM1zS++
IgCrMKCLQm/8PFhjwJiKVwoA2C/exI3r5usQhTlIBvraSZQvPl4CetxovR9bP7M622Wm5f712gzO
pgY5IU9iz70txECN987AHchDJuVeUr7kVDDSKgpxuYYIVH1OCTfh+XuMe7zxMC4lhbqVs9yRJdYO
q1SUB2qwOFVBDVfYZF0k1aD0oMoqLVkhJirN4G71SdyWy38VghodguaHB+tISP9U6P1mwEE8c4xb
+Ptoeld9rPlw9Qu4sdEBJFzK8pb0bbTou8JcXQJpeBZvhoiiy8W2f2/IeUuN7S5VFqITkgrO7YDW
7DoRtmBnrkQ9c4i8u56lT7G1N9bl4F+Syu/vvitdTcvcghwztXHZxjrkgZQiQp44cGhrB2wTp4xG
o/7b8QcR90ntPLlk6HYzN/tqfrPWi9anQV3K3vUIgWEhYU/vfBGDHfKOYjIuKC9Wk7JWLO8zZvC5
rnFDuXmaxH5YGvawKM7BkfmUk1FJQqOt/lbdneUno7Vv1RXfantMKtS3S0vrPxzXbUENkRMRBsDu
CENyyJ/RPNXbglE/FonhjyUyju4EVLhgNSJKn0AYEmOzdyyHKqH/nrBuXg9W/wLEjpAxAYs2br2T
+bH2tx6TVWsYOQVPv73KoUESj47MqvKm+LJaovEwSKiXQK1q98/0YUzLC8Z5+K7GhNYmM8gInvb1
MpGWkWAxta5KY4auEDvtAnC8GtTFC/j3b1OGWc+xx8mLRlApbONaFHhg/xX7Tqhuk2RV0HxfGZAR
y6LuHOqq1opC9sr6HPleP09AllW5cL5i9GMwBAKaCQHm5AjKzXsbFGHGUVHmybwtql7/YtULCqmc
U32/w8V/6ZcpnyPDJj3pCLUOOSBfdII/qaa4HvAtwslaL/CeqttMPt7ML7Pj5K524pqkOa6tfEWQ
1HYE2it697pQak/2pDSpOHHSkqGEN7+FvPqk8f+cKcHaEM2Y6xvbq4RWrngHzzHhla4Ujuq32HMq
aFya3ZSbrHkATWyBGW+0fMlkNR7kFiEdLxKAi4AnATxn1JyiLzc4IjEURUJk/f5hnnUOFv6Kntfs
R+WPdIVKYtUeT17KMy619jCIgW6Uwgyj5F0YiVMruPlBqGJS9v6LkkPoDoFkoBqJviW0OrVlLzUx
Nq7vEwLyekXp/1X4W1SmfFc6gA+9GT/DPm4B+iyGma8XQtPgEhuBLSMqyKEp+9d42oSffQLmsu+T
2Knpj9gEA1oCN9B2OvAlk/WshHjV3Bz9PJhtUuqx8d+Vq4QMY8Ki3ewceNjP9B9wYL1qkt8IBESI
l/u9Mk0IPIyEAW8BECr+3LjjihwW9jaijwLXDeM2lKS0+Tibrc72+Kf2OL4NARIYOEphI0kIIpuM
6rMWH+JPHdD9ROyWKk1Xgp+1lSq68/Fc8iwUvGx0wVwDr3UOFmC35S8wUlCFwVv9gqivtXjU8muA
NxH1AV+fHJOn6ZWv8ze0/846EN9iNjknNwsy9ElrAYvcZfDT2BsDXfKL84W05PiQVMGYPzYI9IoM
FcAEmy/z9gG6pE4f9uhpbwghWLhZLBUmzIW+ab/9E8qHUvvMeeGwP9E37b1bYUXB3bcCgUwYDumF
RSEcLSkHYG===
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
6VQ6K6Q+GeqtMAOrzAe1=
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
<?php
namespace PShowSsoScoped\Firebase\JWT;
use DomainException;
use InvalidArgumentException;
use UnexpectedValueException;
/**
* JSON Web Key implementation, based on this spec:
* https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41
*
* PHP version 5
*
* @category Authentication
* @package Authentication_JWT
* @author Bui Sy Nguyen <nguyenbs@gmail.com>
* @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
* @link https://github.com/firebase/php-jwt
*/
class JWK
{
private const OID = '1.2.840.10045.2.1';
private const ASN1_OBJECT_IDENTIFIER = 0x06;
private const ASN1_SEQUENCE = 0x10; // also defined in JWT
private const ASN1_BIT_STRING = 0x03;
private const EC_CURVES = [
'P-256' => '1.2.840.10045.3.1.7', // Len: 64
'secp256k1' => '1.3.132.0.10', // Len: 64
// 'P-384' => '1.3.132.0.34', // Len: 96 (not yet supported)
// 'P-521' => '1.3.132.0.35', // Len: 132 (not supported)
];
/**
* Parse a set of JWK keys
*
* @param array<mixed> $jwks The JSON Web Key Set as an associative array
* @param string $defaultAlg The algorithm for the Key object if "alg" is not set in the
* JSON Web Key Set
*
* @return array<string, Key> An associative array of key IDs (kid) to Key objects
*
* @throws InvalidArgumentException Provided JWK Set is empty
* @throws UnexpectedValueException Provided JWK Set was invalid
* @throws DomainException OpenSSL failure
*
* @uses parseKey
*/
public static function parseKeySet(array $jwks, string $defaultAlg = null): array
{
$keys = [];
if (!isset($jwks['keys'])) {
throw new UnexpectedValueException('"keys" member must exist in the JWK Set');
}
if (empty($jwks['keys'])) {
throw new InvalidArgumentException('JWK Set did not contain any keys');
}
foreach ($jwks['keys'] as $k => $v) {
$kid = isset($v['kid']) ? $v['kid'] : $k;
if ($key = self::parseKey($v, $defaultAlg)) {
$keys[(string) $kid] = $key;
}
}
if (0 === \count($keys)) {
throw new UnexpectedValueException('No supported algorithms found in JWK Set');
}
return $keys;
}
/**
* Parse a JWK key
*
* @param array<mixed> $jwk An individual JWK
* @param string $defaultAlg The algorithm for the Key object if "alg" is not set in the
* JSON Web Key Set
*
* @return Key The key object for the JWK
*
* @throws InvalidArgumentException Provided JWK is empty
* @throws UnexpectedValueException Provided JWK was invalid
* @throws DomainException OpenSSL failure
*
* @uses createPemFromModulusAndExponent
*/
public static function parseKey(array $jwk, string $defaultAlg = null): ?Key
{
if (empty($jwk)) {
throw new InvalidArgumentException('JWK must not be empty');
}
if (!isset($jwk['kty'])) {
throw new UnexpectedValueException('JWK must contain a "kty" parameter');
}
if (!isset($jwk['alg'])) {
if (\is_null($defaultAlg)) {
// The "alg" parameter is optional in a KTY, but an algorithm is required
// for parsing in this library. Use the $defaultAlg parameter when parsing the
// key set in order to prevent this error.
// @see https://datatracker.ietf.org/doc/html/rfc7517#section-4.4
throw new UnexpectedValueException('JWK must contain an "alg" parameter');
}
$jwk['alg'] = $defaultAlg;
}
switch ($jwk['kty']) {
case 'RSA':
if (!empty($jwk['d'])) {
throw new UnexpectedValueException('RSA private keys are not supported');
}
if (!isset($jwk['n']) || !isset($jwk['e'])) {
throw new UnexpectedValueException('RSA keys must contain values for both "n" and "e"');
}
$pem = self::createPemFromModulusAndExponent($jwk['n'], $jwk['e']);
$publicKey = \openssl_pkey_get_public($pem);
if (false === $publicKey) {
throw new DomainException(
'OpenSSL error: ' . \openssl_error_string()
);
}
return new Key($publicKey, $jwk['alg']);
case 'EC':
if (isset($jwk['d'])) {
// The key is actually a private key
throw new UnexpectedValueException('Key data must be for a public key');
}
if (empty($jwk['crv'])) {
throw new UnexpectedValueException('crv not set');
}
if (!isset(self::EC_CURVES[$jwk['crv']])) {
throw new DomainException('Unrecognised or unsupported EC curve');
}
if (empty($jwk['x']) || empty($jwk['y'])) {
throw new UnexpectedValueException('x and y not set');
}
$publicKey = self::createPemFromCrvAndXYCoordinates($jwk['crv'], $jwk['x'], $jwk['y']);
return new Key($publicKey, $jwk['alg']);
default:
// Currently only RSA is supported
break;
}
return null;
}
/**
* Converts the EC JWK values to pem format.
*
* @param string $crv The EC curve (only P-256 is supported)
* @param string $x The EC x-coordinate
* @param string $y The EC y-coordinate
*
* @return string
*/
private static function createPemFromCrvAndXYCoordinates(string $crv, string $x, string $y): string
{
$pem =
self::encodeDER(
self::ASN1_SEQUENCE,
self::encodeDER(
self::ASN1_SEQUENCE,
self::encodeDER(
self::ASN1_OBJECT_IDENTIFIER,
self::encodeOID(self::OID)
)
. self::encodeDER(
self::ASN1_OBJECT_IDENTIFIER,
self::encodeOID(self::EC_CURVES[$crv])
)
) .
self::encodeDER(
self::ASN1_BIT_STRING,
\chr(0x00) . \chr(0x04)
. JWT::urlsafeB64Decode($x)
. JWT::urlsafeB64Decode($y)
)
);
return sprintf(
"-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----\n",
wordwrap(base64_encode($pem), 64, "\n", true)
);
}
/**
* Create a public key represented in PEM format from RSA modulus and exponent information
*
* @param string $n The RSA modulus encoded in Base64
* @param string $e The RSA exponent encoded in Base64
*
* @return string The RSA public key represented in PEM format
*
* @uses encodeLength
*/
private static function createPemFromModulusAndExponent(
string $n,
string $e
): string {
$mod = JWT::urlsafeB64Decode($n);
$exp = JWT::urlsafeB64Decode($e);
$modulus = \pack('Ca*a*', 2, self::encodeLength(\strlen($mod)), $mod);
$publicExponent = \pack('Ca*a*', 2, self::encodeLength(\strlen($exp)), $exp);
$rsaPublicKey = \pack(
'Ca*a*a*',
48,
self::encodeLength(\strlen($modulus) + \strlen($publicExponent)),
$modulus,
$publicExponent
);
// sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption.
$rsaOID = \pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
$rsaPublicKey = \chr(0) . $rsaPublicKey;
$rsaPublicKey = \chr(3) . self::encodeLength(\strlen($rsaPublicKey)) . $rsaPublicKey;
$rsaPublicKey = \pack(
'Ca*a*',
48,
self::encodeLength(\strlen($rsaOID . $rsaPublicKey)),
$rsaOID . $rsaPublicKey
);
return "-----BEGIN PUBLIC KEY-----\r\n" .
\chunk_split(\base64_encode($rsaPublicKey), 64) .
'-----END PUBLIC KEY-----';
}
/**
* DER-encode the length
*
* DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See
* {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
*
* @param int $length
* @return string
*/
private static function encodeLength(int $length): string
{
if ($length <= 0x7F) {
return \chr($length);
}
$temp = \ltrim(\pack('N', $length), \chr(0));
return \pack('Ca*', 0x80 | \strlen($temp), $temp);
}
/**
* Encodes a value into a DER object.
* Also defined in Firebase\JWT\JWT
*
* @param int $type DER tag
* @param string $value the value to encode
* @return string the encoded object
*/
private static function encodeDER(int $type, string $value): string
{
$tag_header = 0;
if ($type === self::ASN1_SEQUENCE) {
$tag_header |= 0x20;
}
// Type
$der = \chr($tag_header | $type);
// Length
$der .= \chr(\strlen($value));
return $der . $value;
}
/**
* Encodes a string into a DER-encoded OID.
*
* @param string $oid the OID string
* @return string the binary DER-encoded OID
*/
private static function encodeOID(string $oid): string
{
$octets = explode('.', $oid);
// Get the first octet
$first = (int) array_shift($octets);
$second = (int) array_shift($octets);
$oid = \chr($first * 40 + $second);
// Iterate over subsequent octets
foreach ($octets as $octet) {
if ($octet == 0) {
$oid .= \chr(0x00);
continue;
}
$bin = '';
while ($octet) {
$bin .= \chr(0x80 | ($octet & 0x7f));
$octet >>= 7;
}
$bin[0] = $bin[0] & \chr(0x7f);
// Convert to big endian if necessary
if (pack('V', 65534) == pack('L', 65534)) {
$oid .= strrev($bin);
} else {
$oid .= $bin;
}
}
return $oid;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,108 +1,64 @@
<?php //ICB0 74:0 81:ae2 82:1505 ?><?php //000ab
// Copyright prestashow.com 2025. All Rights Reserved.
// @authors prestashow.com <contact@prestashow.com>
// @license https://prestashow.com/license
return;
?>
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=
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
mop2ovmkr6yp3BWE8KWxsbzXKSJAEwij2mQg
<?php
namespace PShowSsoScoped\Firebase\JWT;
use InvalidArgumentException;
use OpenSSLAsymmetricKey;
use OpenSSLCertificate;
use TypeError;
class Key
{
/** @var string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate */
private $keyMaterial;
/** @var string */
private $algorithm;
/**
* @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial
* @param string $algorithm
*/
public function __construct(
$keyMaterial,
string $algorithm
) {
if (
!\is_string($keyMaterial)
&& !$keyMaterial instanceof OpenSSLAsymmetricKey
&& !$keyMaterial instanceof OpenSSLCertificate
&& !\is_resource($keyMaterial)
) {
throw new TypeError('Key material must be a string, resource, or OpenSSLAsymmetricKey');
}
if (empty($keyMaterial)) {
throw new InvalidArgumentException('Key material must not be empty');
}
if (empty($algorithm)) {
throw new InvalidArgumentException('Algorithm must not be empty');
}
// TODO: Remove in PHP 8.0 in favor of class constructor property promotion
$this->keyMaterial = $keyMaterial;
$this->algorithm = $algorithm;
}
/**
* Return the algorithm valid for this key
*
* @return string
*/
public function getAlgorithm(): string
{
return $this->algorithm;
}
/**
* @return string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate
*/
public function getKeyMaterial()
{
return $this->keyMaterial;
}
}

View File

@@ -1,66 +1,7 @@
<?php //ICB0 74:0 81:670 82:c29 ?><?php //000ab
// Copyright prestashow.com 2025. All Rights Reserved.
// @authors prestashow.com <contact@prestashow.com>
// @license https://prestashow.com/license
return;
?>
HR+cPvgyah7adcU6L0K7aj6nmfCQGfBy3OsCbZv2CR1iDOIE5p4PeQ2yd/6mEZkyL7QUTMpQdemv
shs0U6+MkiJERiAPle+/hDgB+MYE0IXqIKak+w5hMUG+oSgW5K6WpVdStKwMa/J1OTl8kSLB8f0U
y0vHqB2GV7slxh+aKfhPA9uuJswMLayXAxGVv8zuylnSbMEM3E0WUZRSKEb4/03TfpAlNyon5HHZ
glrHLbwi9f64pLMJrvQmMuh387fFKNPTWOgfztTkPh6ejoMbbNZE9KyCf8YLyzChW1/I4KBEdZ15
BmoIK+8U9ilwjXCFzlpJmkUeVEPg6ekOvb0OJY6IEbNoRinBGXlRD98DquOfqvZ9TC1REHzfMEAp
Q1wz9jZvUrixiGkcPdnRtGZZBM329ByHtjMyqaxxtuwceGuAjEaZJO7WB9C6nxwj6uywxXzpcjT3
T1YzGXQgeQlKAjvCP+sVrP0IWMQIb/oVXYGNvRWmKtK9rl10zF/EY2qTqQcCIbI+CkMcK/+mYn0a
g+c9HOz2MYVLV8GitGEEaB2MdGYbaFNdp6CdMHGoZ20lbmx68eJkJuf7WSbm90fguFgs2Wo/zDOD
BzBzg1qhaEsiROJKZ1i3KqLBklhNFvlD4mZN9FiPk3IQIPDA0nzPInzUvy7QU4iT3e52Dr6iiHXd
gTlK7k5sCgd19EpTW/8OHe58yKqUGxynQ7pTXeRdpLIM20sHHA2Ykgryut1BwgilVLw8oBxmmUzH
+RsuYqMMH87uEmyxi4/BXt2DPfwbfJBF45f4ROmY6kUnDNPK5Z6tDROfA8qLu1ahncIpjvh1z12N
WkvwbIPuhesuUReuRCfp/X8D8+xXk++Xa104sH2tMuBeO//ZMtoqzk5Ts9wu6qGSN7xBXM+t/T0l
dg7mnqDYSnT6b5JdHrvnwMkI1vqmdY5gSfVVO5CDQ6QxSzjKTaz7xBXFiQnMLnXWsB0G/N6VexbA
q0iMyX1mlERyxaqukrMq9F725f2YCNYufGKNJhtHY3AHKmbPX3E3chjpBhxFQr70kVQZuyroA5fK
e2kVDxMqO7vg6jZC60T4XLWbgojx6nYFvnH6sQ3dzucJ+p0VRlj0OauBnbtHhulL0lQjWK+e0xTF
cQix2uT8Ogh/CXVOWlQ30Nl2mxua+OtmQmso+wTE+iSmN+T8GRkoii5rx7k0a7LEPhGVkrSm7M3d
caEFJZKY74V+972euKAKd5ObUvzy4DluBGuaLMYGZoo52VztXU99Zn3ZQq7z1P6M1hy3JJQpAYOn
U0uBYoxM58Qw32cz72O0c8uNg7WctXMQAsnSrCQ9JDGl9V+Zp2gq+m1/taR3H/kGBe2ay9pr2zoO
SLyUz1rb64mSWqrRg+FsS1OR5+liPt+PRWsz3bTRRgLmGnXmwGaupeK1yyYfv71qzKpjk+sMq6tl
jRXmn40==
HR+cPq5IHmYVfhilm+hIAxQ7Tl9c5k4sqX6VczYoONyt/0HrPBcMmzKroWPGuGV1yL7KalIF9D+Z
BBq2RVewgYC6Fzh5ljEOnrJOsynsb6CQ+AF5B6YyOoSXutedogU7RpzrC/ZRPH90x9OVeCPnvyd3
ItJqAG77jP1v2uAKMVMRKlJta7tEGNX3vUo0KPqjdxVaFTILY+o78ngqT8/tlx9E+TK9zdm9Cqm8
l9aQw5TTafHJk1Ss7R2yeGoiZJVi9fTZvoqx6WdC65OVtus2yOPgLKOM1U+vaS/DUTeVxsKqzeLp
heG4UijQCYD5e+ikbNzfakWaqAZ1tQwL/ovaXjVhr2PtRhmhZ0hMG9eD+ne6Jyh5Nq1GNvUXWFfF
KLN56sg5mEJ3JUdYoNMEyxN39jyIXdFQ4wKXXgAPpsQYgufPGeYvALmlO/TgX2rb/tAmpc0eFWpC
Zq7HikomL3/h6pRQbWHTYp/RSpAtQNKGHHOE+FR1fqfvb0montXquptOFwQl+lpmOG0Ly99tY+Gd
JSDIaGUQJtSIvJvG8tOYlrsSgwIh+TBVSPpXXq7W0dMJQmeLIM5C0Q6wTF7LOU3YXuoCoq3Z8Zy3
XbpKT+lWmVTF18ZJnIYzyQYfKjuOkW7Sbrux5bFGQ7vDRLjN/inP5E8G4rLNpmwsNpMcPN20we5J
EtfoenVwC4/1bJT1xcbiwJRmG110ASdML2kBE59cw5sjGMjNAS+gNdVOJ6AMlvQLjn3XSBZXS4bK
sMrJFgemr410LmbVdV7WJPbNvKMkyckX3x5ZsuWKGJWQemtmONetT2H+1eaInJt+Y4O/mRqkykb2
lZx005/MTtnP+LSLnjCU+BKWJxEsqSmr7cGgA7uUYf781IXaelUwlFvIMB5jwfVfIb4bSk3vtKjE
35QQyFj/7YWPiWch/oyhEyHcbENV578Tffs2xQckUKEs07pe9OxunUwWgPwPqoLPCUCUJJH2r1O5
uetCIH62AIZIBhAdvejWlwQKq8kwLirwXLyHKCNtAuCg4s8piu7h0SWq4AofGHI3aUMUVdy3B7t5
FfPVXAaini3Z5FmB7pj8Ip2KpCcaKVAu3NHOiL0GwbcEL2gc8sTM5CKvy/hO3CZO48KJ2EEXE1mh
oCuWjqaxGhObwt9chwcT0MsBh9FfBj9FGQ/5yEkVQ3FrwtKtIcDrin7PfsKZJ+ui33CFnYDPgLAo
k/FPem0/abG8ww6+20wzuZ97FTRsgukNs+hT44gowzGnLpU6pbAMqGpJWx2k34QHPjAOLxP9TKtI
3Xxet9zVfJQqStzTbZ9BCj6Tbe7z0XCBbsoxj7gwHWBIEvP8R+X+u63qno94soisofJiKFBVWhuV
aHFbjAtJhA9DCCyZQpA+wKMxoBw4JQIO6US+VivkoGXz+y6xvoTxmXU8i3QxLT3sanXRNBrySkLj
=
HR+cPsKVMAHf+A2BqQVDXs7OwRacGl1OPxSt/Mcj2ZQLqMcPilN74/Np5BqSsn5P/381I5uHadCk
BPjurLxNWUj3C7vY39U+BrcT5UNGnXuQgkTOaagEReND+pqL6snJDLlISSvfeTdA2uAFAKEV+AEq
lMq+hvegWDwhLGyYt/k11NW9aSuFD3VkI5pr7qWPWyveKNck8WNMPORmfKM2wKfjmCqaj1BIHsFn
VF4u+rK46V3tXyQoOqKneANJnlEeeCNOgEgsQcKl+zf8s9kKSu0NXfGYBX3k5TSYuCSB1/pnzNH4
a3sRvsnIcPDYCfYJViqU5A/+RFFoKF07JJ8O8ckpEcD5m+/P5CyI2mt60XN3/SmSG+NpZtsFy/ai
Gtdc7v9RGzuJLdu7jRt96fvi/eq0PrbF5BGNyaUan/G0dcGnM1AWoBRvsUAdmwBEUXd9Te5b5PS+
cllyz+35W6yJ+CFsih5NdmufcWq6qK53fUeVjjKX1pGDph7pg7RXz1cyDMbEqhb23HCNLR9EYLNB
ar79/LM1jmFAWnW0kMgVCTTGUp8JE6HV6Jc+72GFi1HEVgjnX6dIv99yd3su40m5yd6xmBfI1sVe
8vgwe+TaSIt/o0EMBca+84esC8cds/v+edQriI5s0WNJfU+Kjd99CZ274Mt43uHvuiZu02KupCzH
vVc5ZI8qf6L2a4Tiubb0KjQ0nwQHmLFb/aRlwA3jcC8d1b88seJpWCk40sN7bRj3xT5xXI4zWILv
2H5GXhL74p1SWtXKvKBJjy/CqoZpiOsmTtqJf7ee1mUd7QGdubXKx8giM7Z+04VuD+sKfqSdfJWe
vmS6L/jWGOF0PVq3rDLzyMAsjYILZqH70CZdVJGhEKw/pElMPWyPv5NUclqqRXLmEFdRxPedAvwL
MRWLuyLhzeLLczG2zy4nO4l2qZ/rYRSwwIntdiTPhG6ZoTmDV9bTlWAzXCiRfih+qSruNAhCXIks
2PRnpQ2iawdnsUKCnDoabitDQF+qaww2ha1PEpsx0OX2bpdxGZxVRms2g5XhSs90iLNrHW0a7VRD
XJ68S8Hoyr+ie0Crc0Pi7omWlF8vzTgVjCEDWzcIdz7SbzbqowXnT/Pq1/E7kw7b/AJj33244Jfm
cdGRim8oIuGtmi9V97h8PSJzWMpI+1d4jtNJnQ+xN7urudY+36xahDfl3PKKwclbRn3lZ3rTIZ6r
qNGDK9zObCl1ZFIpZangaMshGZfwtnkociK2n+NwSx7axgQ5G9tf/4P57NQXi0x5SfaZqYadBCMT
n0oI0dEnnCp+OdbKwJNKaWRa23exVrrxZGJxx16bEQfq7LXDWmg6KQB6TWcKUgqWRSGTpcyBFb4G
OMz9Jufjgnz98nHccpzACYQa3pVMEw2vI3w0nMsAu0uBq1LQkBITbRCfkdsl2YQIFH5k6BUKgCGN
roSDqufNjsMWhtrvTyS=
<?php
namespace PShowSsoScoped\Firebase\JWT;
class SignatureInvalidException extends \UnexpectedValueException
{
}