added new composer libraries

This commit is contained in:
2021-02-11 20:21:58 +00:00
parent 0a11a5d23d
commit f8426666ee
40 changed files with 1175 additions and 10022 deletions

4
.env
View File

@@ -10,8 +10,8 @@ DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=w4rpservices2
DB_USERNAME=minerva
DB_PASSWORD=strtmage
DB_USERNAME=w4rpservices
DB_PASSWORD=FuckingShit12
BROADCAST_DRIVER=log
CACHE_DRIVER=file

View File

@@ -18,7 +18,11 @@
"laravelcollective/html": "^6.0",
"predis/predis": "^1.1",
"spatie/laravel-rate-limited-job-middleware": "^1.5",
"twbs/bootstrap": "^4.5"
"twbs/bootstrap": "^4.5",
"web-token/jwt-easy": "^2.2",
"web-token/jwt-signature-algorithm-ecdsa": "^2.2",
"web-token/jwt-signature-algorithm-hmac": "^2.2",
"web-token/jwt-signature-algorithm-rsa": "^2.2"
},
"require-dev": {
"beyondcode/laravel-dump-server": "^1.0",

101
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "ea02a28c4e0e5b626127a2be8c62c3d9",
"content-hash": "351c6a21f60967e95e902b9f70f8ed7b",
"packages": [
{
"name": "brick/math",
@@ -5392,16 +5392,16 @@
},
{
"name": "web-token/jwt-easy",
"version": "v2.2.6",
"version": "v2.2.8",
"source": {
"type": "git",
"url": "https://github.com/web-token/jwt-easy.git",
"reference": "cc59f479dd6b5014586be5d2d40ce84bbd9b4539"
"reference": "b4d1a4581a796244fdd69694548766403daeca97"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/web-token/jwt-easy/zipball/cc59f479dd6b5014586be5d2d40ce84bbd9b4539",
"reference": "cc59f479dd6b5014586be5d2d40ce84bbd9b4539",
"url": "https://api.github.com/repos/web-token/jwt-easy/zipball/b4d1a4581a796244fdd69694548766403daeca97",
"reference": "b4d1a4581a796244fdd69694548766403daeca97",
"shasum": ""
},
"require": {
@@ -5409,9 +5409,6 @@
"web-token/jwt-encryption": "^2.1",
"web-token/jwt-signature": "^2.1"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"suggest": {
"web-token/jwt-encryption-algorithm-aescbc": "Adds AES-CBC based encryption algorithms",
"web-token/jwt-encryption-algorithm-aesgcm": "Adds AES-GCM based encryption algorithms",
@@ -5428,15 +5425,6 @@
"web-token/jwt-signature-algorithm-rsa": "Adds RSA based signature algorithms"
},
"type": "library",
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Jose\\Easy\\": ""
@@ -5477,7 +5465,7 @@
"symfony"
],
"support": {
"source": "https://github.com/web-token/jwt-easy/tree/v2.2.6"
"source": "https://github.com/web-token/jwt-easy/tree/v2.2.8"
},
"funding": [
{
@@ -5485,7 +5473,7 @@
"type": "patreon"
}
],
"time": "2020-12-07T21:10:31+00:00"
"time": "2021-01-21T19:18:03+00:00"
},
{
"name": "web-token/jwt-encryption",
@@ -5670,36 +5658,23 @@
},
{
"name": "web-token/jwt-signature-algorithm-ecdsa",
"version": "v2.2.6",
"version": "v2.2.8",
"source": {
"type": "git",
"url": "https://github.com/web-token/jwt-signature-algorithm-ecdsa.git",
"reference": "3ae6e56ccf34e8b7b65ec988497d5d1bceca9864"
"reference": "44cbbb4374c51f1cf48b82ae761efbf24e1a8591"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-ecdsa/zipball/3ae6e56ccf34e8b7b65ec988497d5d1bceca9864",
"reference": "3ae6e56ccf34e8b7b65ec988497d5d1bceca9864",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-ecdsa/zipball/44cbbb4374c51f1cf48b82ae761efbf24e1a8591",
"reference": "44cbbb4374c51f1cf48b82ae761efbf24e1a8591",
"shasum": ""
},
"require": {
"ext-openssl": "*",
"web-token/jwt-signature": "^2.0"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev",
"v2.1": "2.1.x-dev"
}
},
"autoload": {
"psr-4": {
"Jose\\Component\\Signature\\Algorithm\\": ""
@@ -5740,7 +5715,7 @@
"symfony"
],
"support": {
"source": "https://github.com/web-token/jwt-signature-algorithm-ecdsa/tree/v2.2"
"source": "https://github.com/web-token/jwt-signature-algorithm-ecdsa/tree/v2.2.8"
},
"funding": [
{
@@ -5748,39 +5723,26 @@
"type": "patreon"
}
],
"time": "2020-08-22T13:17:25+00:00"
"time": "2021-01-21T19:18:03+00:00"
},
{
"name": "web-token/jwt-signature-algorithm-hmac",
"version": "v2.2.6",
"version": "v2.2.8",
"source": {
"type": "git",
"url": "https://github.com/web-token/jwt-signature-algorithm-hmac.git",
"reference": "f4fd8166e6830298fc820a8d5776c124cc2496c4"
"reference": "d208b1c50b408fa711bfeedeed9fb5d9be1d3080"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-hmac/zipball/f4fd8166e6830298fc820a8d5776c124cc2496c4",
"reference": "f4fd8166e6830298fc820a8d5776c124cc2496c4",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-hmac/zipball/d208b1c50b408fa711bfeedeed9fb5d9be1d3080",
"reference": "d208b1c50b408fa711bfeedeed9fb5d9be1d3080",
"shasum": ""
},
"require": {
"web-token/jwt-signature": "^2.1"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev",
"v2.1": "2.1.x-dev"
}
},
"autoload": {
"psr-4": {
"Jose\\Component\\Signature\\Algorithm\\": ""
@@ -5821,7 +5783,7 @@
"symfony"
],
"support": {
"source": "https://github.com/web-token/jwt-signature-algorithm-hmac/tree/v2.2.2"
"source": "https://github.com/web-token/jwt-signature-algorithm-hmac/tree/v2.2.8"
},
"funding": [
{
@@ -5829,20 +5791,20 @@
"type": "patreon"
}
],
"time": "2020-08-01T11:48:26+00:00"
"time": "2021-01-21T19:18:03+00:00"
},
{
"name": "web-token/jwt-signature-algorithm-rsa",
"version": "v2.2.6",
"version": "v2.2.8",
"source": {
"type": "git",
"url": "https://github.com/web-token/jwt-signature-algorithm-rsa.git",
"reference": "ba94b8868bd8fdd481f448097ab900a8cb2c0eed"
"reference": "513ad90eb5ef1886ff176727a769bda4618141b0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-rsa/zipball/ba94b8868bd8fdd481f448097ab900a8cb2c0eed",
"reference": "ba94b8868bd8fdd481f448097ab900a8cb2c0eed",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-rsa/zipball/513ad90eb5ef1886ff176727a769bda4618141b0",
"reference": "513ad90eb5ef1886ff176727a769bda4618141b0",
"shasum": ""
},
"require": {
@@ -5850,24 +5812,11 @@
"ext-openssl": "*",
"web-token/jwt-signature": "^2.1"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"suggest": {
"ext-bcmath": "GMP or BCMath is highly recommended to improve the library performance",
"ext-gmp": "GMP or BCMath is highly recommended to improve the library performance"
},
"type": "library",
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev",
"v2.1": "2.1.x-dev"
}
},
"autoload": {
"psr-4": {
"Jose\\Component\\Signature\\Algorithm\\": ""
@@ -5908,7 +5857,7 @@
"symfony"
],
"support": {
"source": "https://github.com/web-token/jwt-signature-algorithm-rsa/tree/v2.2"
"source": "https://github.com/web-token/jwt-signature-algorithm-rsa/tree/v2.2.8"
},
"funding": [
{
@@ -5916,7 +5865,7 @@
"type": "patreon"
}
],
"time": "2020-08-22T13:37:56+00:00"
"time": "2021-01-21T19:18:03+00:00"
}
],
"packages-dev": [

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
{
"/app.js": "/app.js?id=216ac977397857c5c8db",
"/app.css": "/app.css?id=cefed9132a927b70fdd6",
"/app-dark.css": "/app-dark.css?id=596688837e7ffbb58e37"
"/app.js": "/app.js?id=a2e36b7a4f248973b22b",
"/app.css": "/app.css?id=9ce01eaaba790566b895",
"/app-dark.css": "/app-dark.css?id=821c845f9bf3b7853c33"
}

File diff suppressed because it is too large Load Diff

View File

@@ -29,7 +29,7 @@ private static $installed = array (
'aliases' =>
array (
),
'reference' => 'df510b86806490c95eaa14064e89e5968cc541e0',
'reference' => '0a11a5d23d14c0dbc4537b5219a99b5ffa1a03fd',
'name' => 'laravel/laravel',
),
'versions' =>
@@ -463,7 +463,7 @@ private static $installed = array (
'aliases' =>
array (
),
'reference' => 'df510b86806490c95eaa14064e89e5968cc541e0',
'reference' => '0a11a5d23d14c0dbc4537b5219a99b5ffa1a03fd',
),
'laravel/socialite' =>
array (
@@ -1284,12 +1284,12 @@ private static $installed = array (
),
'web-token/jwt-easy' =>
array (
'pretty_version' => 'v2.2.6',
'version' => '2.2.6.0',
'pretty_version' => 'v2.2.8',
'version' => '2.2.8.0',
'aliases' =>
array (
),
'reference' => 'cc59f479dd6b5014586be5d2d40ce84bbd9b4539',
'reference' => 'b4d1a4581a796244fdd69694548766403daeca97',
),
'web-token/jwt-encryption' =>
array (
@@ -1311,30 +1311,30 @@ private static $installed = array (
),
'web-token/jwt-signature-algorithm-ecdsa' =>
array (
'pretty_version' => 'v2.2.6',
'version' => '2.2.6.0',
'pretty_version' => 'v2.2.8',
'version' => '2.2.8.0',
'aliases' =>
array (
),
'reference' => '3ae6e56ccf34e8b7b65ec988497d5d1bceca9864',
'reference' => '44cbbb4374c51f1cf48b82ae761efbf24e1a8591',
),
'web-token/jwt-signature-algorithm-hmac' =>
array (
'pretty_version' => 'v2.2.6',
'version' => '2.2.6.0',
'pretty_version' => 'v2.2.8',
'version' => '2.2.8.0',
'aliases' =>
array (
),
'reference' => 'f4fd8166e6830298fc820a8d5776c124cc2496c4',
'reference' => 'd208b1c50b408fa711bfeedeed9fb5d9be1d3080',
),
'web-token/jwt-signature-algorithm-rsa' =>
array (
'pretty_version' => 'v2.2.6',
'version' => '2.2.6.0',
'pretty_version' => 'v2.2.8',
'version' => '2.2.8.0',
'aliases' =>
array (
),
'reference' => 'ba94b8868bd8fdd481f448097ab900a8cb2c0eed',
'reference' => '513ad90eb5ef1886ff176727a769bda4618141b0',
),
'webmozart/assert' =>
array (

View File

@@ -43,6 +43,8 @@ return array(
'App\\Http\\Controllers\\Logistics\\FuelController' => $baseDir . '/app/Http/Controllers/Logistics/FuelController.php',
'App\\Http\\Controllers\\Logistics\\StructureRequestAdminController' => $baseDir . '/app/Http/Controllers/Logistics/StructureRequestAdminController.php',
'App\\Http\\Controllers\\Logistics\\StructureRequestController' => $baseDir . '/app/Http/Controllers/Logistics/StructureRequestController.php',
'App\\Http\\Controllers\\MiningTaxes\\MiningTaxesAdminController' => $baseDir . '/app/Http/Controllers/MiningTaxes/MiningTaxesAdminController.php',
'App\\Http\\Controllers\\MiningTaxes\\MiningTaxesController' => $baseDir . '/app/Http/Controllers/MiningTaxes/MiningTaxesController.php',
'App\\Http\\Controllers\\Moons\\MoonLedgerController' => $baseDir . '/app/Http/Controllers/Moons/MoonLedgerController.php',
'App\\Http\\Controllers\\Moons\\MoonsAdminController' => $baseDir . '/app/Http/Controllers/Moons/MoonsAdminController.php',
'App\\Http\\Controllers\\Moons\\MoonsController' => $baseDir . '/app/Http/Controllers/Moons/MoonsController.php',
@@ -67,6 +69,7 @@ return array(
'App\\Jobs\\Commands\\Finances\\ProcessWalletJournalJob' => $baseDir . '/app/Jobs/Commands/Finances/ProcessWalletJournalJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\CalculateMiningTaxesJob' => $baseDir . '/app/Jobs/Commands/MiningTaxes/CalculateMiningTaxesJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\CreateMiningTaxesInvoiceJob' => $baseDir . '/app/Jobs/Commands/MiningTaxes/CreateMiningTaxesInvoiceJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\FetchMiningTaxesLedgersJob' => $baseDir . '/app/Jobs/Commands/MiningTaxes/FetchMiningTaxesLedgersJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\FetchMiningTaxesObserversJob' => $baseDir . '/app/Jobs/Commands/MiningTaxes/FetchMiningTaxesObserversJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\MailMiningTaxesInvoiceJob' => $baseDir . '/app/Jobs/Commands/MiningTaxes/MailMiningTaxesInvoiceJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\ProcessMiningTaxesPaymentsJob' => $baseDir . '/app/Jobs/Commands/MiningTaxes/ProcessMiningTaxesPaymentsJob.php',
@@ -2133,15 +2136,6 @@ return array(
'Jose\\Component\\Signature\\Algorithm\\RSAPKCS1' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/RSAPKCS1.php',
'Jose\\Component\\Signature\\Algorithm\\RSAPSS' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/RSAPSS.php',
'Jose\\Component\\Signature\\Algorithm\\SignatureAlgorithm' => $vendorDir . '/web-token/jwt-signature/Algorithm/SignatureAlgorithm.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\ECDSAFromRFC6979Test' => $vendorDir . '/web-token/jwt-signature-algorithm-ecdsa/Tests/ECDSAFromRFC6979Test.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\ECDSAFromRFC7520Test' => $vendorDir . '/web-token/jwt-signature-algorithm-ecdsa/Tests/ECDSAFromRFC7520Test.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\ECDSASignatureTest' => $vendorDir . '/web-token/jwt-signature-algorithm-ecdsa/Tests/ECDSASignatureTest.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\HMACFromRFC7520Test' => $vendorDir . '/web-token/jwt-signature-algorithm-hmac/Tests/HMACFromRFC7520Test.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\HMACSignatureTest' => $vendorDir . '/web-token/jwt-signature-algorithm-hmac/Tests/HMACSignatureTest.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\RSA15SignatureTest' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/Tests/RSA15SignatureTest.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\RSAKeyWithoutAllPrimesTest' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/Tests/RSAKeyWithoutAllPrimesTest.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\RSAPSSSignatureTest' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/Tests/RSAPSSSignatureTest.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\RSASignatureTest' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/Tests/RSASignatureTest.php',
'Jose\\Component\\Signature\\Algorithm\\Util\\RSA' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/Util/RSA.php',
'Jose\\Component\\Signature\\JWS' => $vendorDir . '/web-token/jwt-signature/JWS.php',
'Jose\\Component\\Signature\\JWSBuilder' => $vendorDir . '/web-token/jwt-signature/JWSBuilder.php',
@@ -2180,10 +2174,6 @@ return array(
'Jose\\Easy\\JWT' => $vendorDir . '/web-token/jwt-easy/JWT.php',
'Jose\\Easy\\Load' => $vendorDir . '/web-token/jwt-easy/Load.php',
'Jose\\Easy\\ParameterBag' => $vendorDir . '/web-token/jwt-easy/ParameterBag.php',
'Jose\\Easy\\Tests\\AlgorithmProviderTest' => $vendorDir . '/web-token/jwt-easy/Tests/AlgorithmProviderTest.php',
'Jose\\Easy\\Tests\\EncryptionTest' => $vendorDir . '/web-token/jwt-easy/Tests/EncryptionTest.php',
'Jose\\Easy\\Tests\\ParameterBagTest' => $vendorDir . '/web-token/jwt-easy/Tests/ParameterBagTest.php',
'Jose\\Easy\\Tests\\SignatureTest' => $vendorDir . '/web-token/jwt-easy/Tests/SignatureTest.php',
'Jose\\Easy\\Validate' => $vendorDir . '/web-token/jwt-easy/Validate.php',
'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
'Khill\\Lavacharts\\Builders\\ChartBuilder' => $vendorDir . '/khill/lavacharts/src/Builders/ChartBuilder.php',

View File

@@ -62,7 +62,7 @@ return array(
'Laravel\\Horizon\\' => array($vendorDir . '/laravel/horizon/src'),
'Khill\\Lavacharts\\' => array($vendorDir . '/khill/lavacharts/src'),
'Jose\\Easy\\' => array($vendorDir . '/web-token/jwt-easy'),
'Jose\\Component\\Signature\\Algorithm\\' => array($vendorDir . '/web-token/jwt-signature-algorithm-ecdsa', $vendorDir . '/web-token/jwt-signature-algorithm-hmac', $vendorDir . '/web-token/jwt-signature-algorithm-rsa'),
'Jose\\Component\\Signature\\Algorithm\\' => array($vendorDir . '/web-token/jwt-signature-algorithm-hmac', $vendorDir . '/web-token/jwt-signature-algorithm-rsa', $vendorDir . '/web-token/jwt-signature-algorithm-ecdsa'),
'Jose\\Component\\Signature\\' => array($vendorDir . '/web-token/jwt-signature'),
'Jose\\Component\\Encryption\\' => array($vendorDir . '/web-token/jwt-encryption'),
'Jose\\Component\\Core\\' => array($vendorDir . '/web-token/jwt-core'),

View File

@@ -416,9 +416,9 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9
),
'Jose\\Component\\Signature\\Algorithm\\' =>
array (
0 => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-ecdsa',
1 => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-hmac',
2 => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa',
0 => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-hmac',
1 => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa',
2 => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-ecdsa',
),
'Jose\\Component\\Signature\\' =>
array (
@@ -578,6 +578,8 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9
'App\\Http\\Controllers\\Logistics\\FuelController' => __DIR__ . '/../..' . '/app/Http/Controllers/Logistics/FuelController.php',
'App\\Http\\Controllers\\Logistics\\StructureRequestAdminController' => __DIR__ . '/../..' . '/app/Http/Controllers/Logistics/StructureRequestAdminController.php',
'App\\Http\\Controllers\\Logistics\\StructureRequestController' => __DIR__ . '/../..' . '/app/Http/Controllers/Logistics/StructureRequestController.php',
'App\\Http\\Controllers\\MiningTaxes\\MiningTaxesAdminController' => __DIR__ . '/../..' . '/app/Http/Controllers/MiningTaxes/MiningTaxesAdminController.php',
'App\\Http\\Controllers\\MiningTaxes\\MiningTaxesController' => __DIR__ . '/../..' . '/app/Http/Controllers/MiningTaxes/MiningTaxesController.php',
'App\\Http\\Controllers\\Moons\\MoonLedgerController' => __DIR__ . '/../..' . '/app/Http/Controllers/Moons/MoonLedgerController.php',
'App\\Http\\Controllers\\Moons\\MoonsAdminController' => __DIR__ . '/../..' . '/app/Http/Controllers/Moons/MoonsAdminController.php',
'App\\Http\\Controllers\\Moons\\MoonsController' => __DIR__ . '/../..' . '/app/Http/Controllers/Moons/MoonsController.php',
@@ -602,6 +604,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9
'App\\Jobs\\Commands\\Finances\\ProcessWalletJournalJob' => __DIR__ . '/../..' . '/app/Jobs/Commands/Finances/ProcessWalletJournalJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\CalculateMiningTaxesJob' => __DIR__ . '/../..' . '/app/Jobs/Commands/MiningTaxes/CalculateMiningTaxesJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\CreateMiningTaxesInvoiceJob' => __DIR__ . '/../..' . '/app/Jobs/Commands/MiningTaxes/CreateMiningTaxesInvoiceJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\FetchMiningTaxesLedgersJob' => __DIR__ . '/../..' . '/app/Jobs/Commands/MiningTaxes/FetchMiningTaxesLedgersJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\FetchMiningTaxesObserversJob' => __DIR__ . '/../..' . '/app/Jobs/Commands/MiningTaxes/FetchMiningTaxesObserversJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\MailMiningTaxesInvoiceJob' => __DIR__ . '/../..' . '/app/Jobs/Commands/MiningTaxes/MailMiningTaxesInvoiceJob.php',
'App\\Jobs\\Commands\\MiningTaxes\\ProcessMiningTaxesPaymentsJob' => __DIR__ . '/../..' . '/app/Jobs/Commands/MiningTaxes/ProcessMiningTaxesPaymentsJob.php',
@@ -2668,15 +2671,6 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9
'Jose\\Component\\Signature\\Algorithm\\RSAPKCS1' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/RSAPKCS1.php',
'Jose\\Component\\Signature\\Algorithm\\RSAPSS' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/RSAPSS.php',
'Jose\\Component\\Signature\\Algorithm\\SignatureAlgorithm' => __DIR__ . '/..' . '/web-token/jwt-signature/Algorithm/SignatureAlgorithm.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\ECDSAFromRFC6979Test' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-ecdsa/Tests/ECDSAFromRFC6979Test.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\ECDSAFromRFC7520Test' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-ecdsa/Tests/ECDSAFromRFC7520Test.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\ECDSASignatureTest' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-ecdsa/Tests/ECDSASignatureTest.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\HMACFromRFC7520Test' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-hmac/Tests/HMACFromRFC7520Test.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\HMACSignatureTest' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-hmac/Tests/HMACSignatureTest.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\RSA15SignatureTest' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/Tests/RSA15SignatureTest.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\RSAKeyWithoutAllPrimesTest' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/Tests/RSAKeyWithoutAllPrimesTest.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\RSAPSSSignatureTest' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/Tests/RSAPSSSignatureTest.php',
'Jose\\Component\\Signature\\Algorithm\\Tests\\RSASignatureTest' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/Tests/RSASignatureTest.php',
'Jose\\Component\\Signature\\Algorithm\\Util\\RSA' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/Util/RSA.php',
'Jose\\Component\\Signature\\JWS' => __DIR__ . '/..' . '/web-token/jwt-signature/JWS.php',
'Jose\\Component\\Signature\\JWSBuilder' => __DIR__ . '/..' . '/web-token/jwt-signature/JWSBuilder.php',
@@ -2715,10 +2709,6 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9
'Jose\\Easy\\JWT' => __DIR__ . '/..' . '/web-token/jwt-easy/JWT.php',
'Jose\\Easy\\Load' => __DIR__ . '/..' . '/web-token/jwt-easy/Load.php',
'Jose\\Easy\\ParameterBag' => __DIR__ . '/..' . '/web-token/jwt-easy/ParameterBag.php',
'Jose\\Easy\\Tests\\AlgorithmProviderTest' => __DIR__ . '/..' . '/web-token/jwt-easy/Tests/AlgorithmProviderTest.php',
'Jose\\Easy\\Tests\\EncryptionTest' => __DIR__ . '/..' . '/web-token/jwt-easy/Tests/EncryptionTest.php',
'Jose\\Easy\\Tests\\ParameterBagTest' => __DIR__ . '/..' . '/web-token/jwt-easy/Tests/ParameterBagTest.php',
'Jose\\Easy\\Tests\\SignatureTest' => __DIR__ . '/..' . '/web-token/jwt-easy/Tests/SignatureTest.php',
'Jose\\Easy\\Validate' => __DIR__ . '/..' . '/web-token/jwt-easy/Validate.php',
'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
'Khill\\Lavacharts\\Builders\\ChartBuilder' => __DIR__ . '/..' . '/khill/lavacharts/src/Builders/ChartBuilder.php',

View File

@@ -7214,17 +7214,17 @@
},
{
"name": "web-token/jwt-easy",
"version": "v2.2.6",
"version_normalized": "2.2.6.0",
"version": "v2.2.8",
"version_normalized": "2.2.8.0",
"source": {
"type": "git",
"url": "https://github.com/web-token/jwt-easy.git",
"reference": "cc59f479dd6b5014586be5d2d40ce84bbd9b4539"
"reference": "b4d1a4581a796244fdd69694548766403daeca97"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/web-token/jwt-easy/zipball/cc59f479dd6b5014586be5d2d40ce84bbd9b4539",
"reference": "cc59f479dd6b5014586be5d2d40ce84bbd9b4539",
"url": "https://api.github.com/repos/web-token/jwt-easy/zipball/b4d1a4581a796244fdd69694548766403daeca97",
"reference": "b4d1a4581a796244fdd69694548766403daeca97",
"shasum": ""
},
"require": {
@@ -7232,9 +7232,6 @@
"web-token/jwt-encryption": "^2.1",
"web-token/jwt-signature": "^2.1"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"suggest": {
"web-token/jwt-encryption-algorithm-aescbc": "Adds AES-CBC based encryption algorithms",
"web-token/jwt-encryption-algorithm-aesgcm": "Adds AES-GCM based encryption algorithms",
@@ -7250,17 +7247,8 @@
"web-token/jwt-signature-algorithm-none": "Adds none signature algorithms",
"web-token/jwt-signature-algorithm-rsa": "Adds RSA based signature algorithms"
},
"time": "2020-12-07T21:10:31+00:00",
"time": "2021-01-21T19:18:03+00:00",
"type": "library",
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
@@ -7302,7 +7290,7 @@
"symfony"
],
"support": {
"source": "https://github.com/web-token/jwt-easy/tree/v2.2.6"
"source": "https://github.com/web-token/jwt-easy/tree/v2.2.8"
},
"funding": [
{
@@ -7501,38 +7489,25 @@
},
{
"name": "web-token/jwt-signature-algorithm-ecdsa",
"version": "v2.2.6",
"version_normalized": "2.2.6.0",
"version": "v2.2.8",
"version_normalized": "2.2.8.0",
"source": {
"type": "git",
"url": "https://github.com/web-token/jwt-signature-algorithm-ecdsa.git",
"reference": "3ae6e56ccf34e8b7b65ec988497d5d1bceca9864"
"reference": "44cbbb4374c51f1cf48b82ae761efbf24e1a8591"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-ecdsa/zipball/3ae6e56ccf34e8b7b65ec988497d5d1bceca9864",
"reference": "3ae6e56ccf34e8b7b65ec988497d5d1bceca9864",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-ecdsa/zipball/44cbbb4374c51f1cf48b82ae761efbf24e1a8591",
"reference": "44cbbb4374c51f1cf48b82ae761efbf24e1a8591",
"shasum": ""
},
"require": {
"ext-openssl": "*",
"web-token/jwt-signature": "^2.0"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"time": "2020-08-22T13:17:25+00:00",
"time": "2021-01-21T19:18:03+00:00",
"type": "library",
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev",
"v2.1": "2.1.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
@@ -7574,7 +7549,7 @@
"symfony"
],
"support": {
"source": "https://github.com/web-token/jwt-signature-algorithm-ecdsa/tree/v2.2"
"source": "https://github.com/web-token/jwt-signature-algorithm-ecdsa/tree/v2.2.8"
},
"funding": [
{
@@ -7586,37 +7561,24 @@
},
{
"name": "web-token/jwt-signature-algorithm-hmac",
"version": "v2.2.6",
"version_normalized": "2.2.6.0",
"version": "v2.2.8",
"version_normalized": "2.2.8.0",
"source": {
"type": "git",
"url": "https://github.com/web-token/jwt-signature-algorithm-hmac.git",
"reference": "f4fd8166e6830298fc820a8d5776c124cc2496c4"
"reference": "d208b1c50b408fa711bfeedeed9fb5d9be1d3080"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-hmac/zipball/f4fd8166e6830298fc820a8d5776c124cc2496c4",
"reference": "f4fd8166e6830298fc820a8d5776c124cc2496c4",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-hmac/zipball/d208b1c50b408fa711bfeedeed9fb5d9be1d3080",
"reference": "d208b1c50b408fa711bfeedeed9fb5d9be1d3080",
"shasum": ""
},
"require": {
"web-token/jwt-signature": "^2.1"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"time": "2020-08-01T11:48:26+00:00",
"time": "2021-01-21T19:18:03+00:00",
"type": "library",
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev",
"v2.1": "2.1.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
@@ -7658,7 +7620,7 @@
"symfony"
],
"support": {
"source": "https://github.com/web-token/jwt-signature-algorithm-hmac/tree/v2.2.2"
"source": "https://github.com/web-token/jwt-signature-algorithm-hmac/tree/v2.2.8"
},
"funding": [
{
@@ -7670,17 +7632,17 @@
},
{
"name": "web-token/jwt-signature-algorithm-rsa",
"version": "v2.2.6",
"version_normalized": "2.2.6.0",
"version": "v2.2.8",
"version_normalized": "2.2.8.0",
"source": {
"type": "git",
"url": "https://github.com/web-token/jwt-signature-algorithm-rsa.git",
"reference": "ba94b8868bd8fdd481f448097ab900a8cb2c0eed"
"reference": "513ad90eb5ef1886ff176727a769bda4618141b0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-rsa/zipball/ba94b8868bd8fdd481f448097ab900a8cb2c0eed",
"reference": "ba94b8868bd8fdd481f448097ab900a8cb2c0eed",
"url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-rsa/zipball/513ad90eb5ef1886ff176727a769bda4618141b0",
"reference": "513ad90eb5ef1886ff176727a769bda4618141b0",
"shasum": ""
},
"require": {
@@ -7688,25 +7650,12 @@
"ext-openssl": "*",
"web-token/jwt-signature": "^2.1"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"suggest": {
"ext-bcmath": "GMP or BCMath is highly recommended to improve the library performance",
"ext-gmp": "GMP or BCMath is highly recommended to improve the library performance"
},
"time": "2020-08-22T13:37:56+00:00",
"time": "2021-01-21T19:18:03+00:00",
"type": "library",
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev",
"v2.1": "2.1.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
@@ -7748,7 +7697,7 @@
"symfony"
],
"support": {
"source": "https://github.com/web-token/jwt-signature-algorithm-rsa/tree/v2.2"
"source": "https://github.com/web-token/jwt-signature-algorithm-rsa/tree/v2.2.8"
},
"funding": [
{

View File

@@ -6,7 +6,7 @@
'aliases' =>
array (
),
'reference' => 'df510b86806490c95eaa14064e89e5968cc541e0',
'reference' => '0a11a5d23d14c0dbc4537b5219a99b5ffa1a03fd',
'name' => 'laravel/laravel',
),
'versions' =>
@@ -440,7 +440,7 @@
'aliases' =>
array (
),
'reference' => 'df510b86806490c95eaa14064e89e5968cc541e0',
'reference' => '0a11a5d23d14c0dbc4537b5219a99b5ffa1a03fd',
),
'laravel/socialite' =>
array (
@@ -1261,12 +1261,12 @@
),
'web-token/jwt-easy' =>
array (
'pretty_version' => 'v2.2.6',
'version' => '2.2.6.0',
'pretty_version' => 'v2.2.8',
'version' => '2.2.8.0',
'aliases' =>
array (
),
'reference' => 'cc59f479dd6b5014586be5d2d40ce84bbd9b4539',
'reference' => 'b4d1a4581a796244fdd69694548766403daeca97',
),
'web-token/jwt-encryption' =>
array (
@@ -1288,30 +1288,30 @@
),
'web-token/jwt-signature-algorithm-ecdsa' =>
array (
'pretty_version' => 'v2.2.6',
'version' => '2.2.6.0',
'pretty_version' => 'v2.2.8',
'version' => '2.2.8.0',
'aliases' =>
array (
),
'reference' => '3ae6e56ccf34e8b7b65ec988497d5d1bceca9864',
'reference' => '44cbbb4374c51f1cf48b82ae761efbf24e1a8591',
),
'web-token/jwt-signature-algorithm-hmac' =>
array (
'pretty_version' => 'v2.2.6',
'version' => '2.2.6.0',
'pretty_version' => 'v2.2.8',
'version' => '2.2.8.0',
'aliases' =>
array (
),
'reference' => 'f4fd8166e6830298fc820a8d5776c124cc2496c4',
'reference' => 'd208b1c50b408fa711bfeedeed9fb5d9be1d3080',
),
'web-token/jwt-signature-algorithm-rsa' =>
array (
'pretty_version' => 'v2.2.6',
'version' => '2.2.6.0',
'pretty_version' => 'v2.2.8',
'version' => '2.2.8.0',
'aliases' =>
array (
),
'reference' => 'ba94b8868bd8fdd481f448097ab900a8cb2c0eed',
'reference' => '513ad90eb5ef1886ff176727a769bda4618141b0',
),
'webmozart/assert' =>
array (

View File

@@ -96,16 +96,19 @@ abstract class AbstractBuilder
public function alg($alg): self
{
$clone = clone $this;
switch (true) {
case $alg instanceof JoseAlgorithm:
$clone->algorithms[] = $alg;
$clone->jwt->header->set('alg', $alg->name());
break;
case is_string($alg):
$clone->jwt->header->set('alg', $alg);
break;
default:
throw new InvalidArgumentException('Invalid parameter "alg". Shall be a string or an algorithm instance.');
}

View File

@@ -118,16 +118,19 @@ abstract class AbstractLoader
switch (true) {
case $checker instanceof Checker\ClaimChecker:
break;
case is_callable($checker):
$checker = new CallableChecker($key, $checker);
break;
case is_array($checker):
$checker = new CallableChecker($key, static function ($value) use ($checker) {return in_array($value, $checker, true); });
$checker = new CallableChecker($key, static function ($value) use ($checker): bool {return in_array($value, $checker, true); });
break;
default:
$checker = new CallableChecker($key, static function ($value) use ($checker) {return $value === $checker; });
$checker = new CallableChecker($key, static function ($value) use ($checker): bool {return $value === $checker; });
}
$clone->claimCheckers[$key] = $checker;
@@ -206,16 +209,19 @@ abstract class AbstractLoader
public function alg($alg): self
{
$clone = clone $this;
switch (true) {
case is_string($alg):
$clone->allowedAlgorithms[] = $alg;
return $clone;
case $alg instanceof Algorithm:
$clone->algorithms[$alg->name()] = $alg;
$clone->allowedAlgorithms[] = $alg->name();
return $clone;
default:
throw new InvalidArgumentException('Invalid parameter "alg". Shall be a string or an algorithm instance.');
}
@@ -249,16 +255,19 @@ abstract class AbstractLoader
switch (true) {
case $checker instanceof Checker\HeaderChecker:
break;
case is_callable($checker):
$checker = new CallableChecker($key, $checker);
break;
case is_array($checker):
$checker = new CallableChecker($key, static function ($value) use ($checker) {return in_array($value, $checker, true); });
$checker = new CallableChecker($key, static function ($value) use ($checker): bool {return in_array($value, $checker, true); });
break;
default:
$checker = new CallableChecker($key, static function ($value) use ($checker) {return $value === $checker; });
$checker = new CallableChecker($key, static function ($value) use ($checker): bool {return $value === $checker; });
}
$clone->headerCheckers[$key] = $checker;

View File

@@ -61,16 +61,19 @@ class Decrypt extends AbstractLoader
public function enc($enc): self
{
$clone = clone $this;
switch (true) {
case is_string($enc):
$clone->allowedContentEncryptionAlgorithms[] = $enc;
return $clone;
case $enc instanceof Algorithm:
$clone->algorithms[$enc->name()] = $enc;
$clone->allowedContentEncryptionAlgorithms[] = $enc->name();
return $clone;
default:
throw new InvalidArgumentException('Invalid parameter "enc". Shall be a string or an algorithm instance.');
}

View File

@@ -50,16 +50,19 @@ class JWEBuilder extends AbstractBuilder
public function enc($enc): self
{
$clone = clone $this;
switch (true) {
case $enc instanceof Algorithm:
$clone->algorithms[] = $enc;
$clone->jwt->header->set('enc', $enc->name());
break;
case is_string($enc):
$clone->jwt->header->set('enc', $enc);
break;
default:
throw new InvalidArgumentException('Invalid algorithm');
}
@@ -75,16 +78,19 @@ class JWEBuilder extends AbstractBuilder
public function zip($zip): self
{
$clone = clone $this;
switch (true) {
case $zip instanceof CompressionMethod:
$clone->compressionMethods[] = $zip;
$clone->jwt->header->set('zip', $zip->name());
break;
case is_string($zip):
$clone->jwt->header->set('zip', $zip);
break;
default:
throw new InvalidArgumentException('Invalid compression method');
}

View File

@@ -1,168 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Easy\Tests;
use BadFunctionCallException;
use function get_class;
use Jose\Component\Core\JWK;
use Jose\Component\Encryption\Algorithm\ContentEncryption;
use Jose\Component\Encryption\Algorithm\KeyEncryption;
use Jose\Component\Signature\Algorithm;
use Jose\Easy\AlgorithmProvider;
use PHPUnit\Framework\Exception;
use PHPUnit\Framework\ExpectationFailedException;
use PHPUnit\Framework\TestCase;
/**
* @group easy
*
* @internal
* @covers \Jose\Easy\AlgorithmProvider
*/
final class AlgorithmProviderTest extends TestCase
{
private const ALL_ALGORITHMS = [
Algorithm\HS256::class,
Algorithm\HS384::class,
Algorithm\HS512::class,
Algorithm\RS256::class,
Algorithm\RS384::class,
Algorithm\RS512::class,
Algorithm\PS256::class,
Algorithm\PS384::class,
Algorithm\PS512::class,
Algorithm\ES256::class,
Algorithm\ES384::class,
Algorithm\ES512::class,
Algorithm\EdDSA::class,
KeyEncryption\A128GCMKW::class,
KeyEncryption\A192GCMKW::class,
KeyEncryption\A256GCMKW::class,
KeyEncryption\A128KW::class,
KeyEncryption\A192KW::class,
KeyEncryption\A256KW::class,
KeyEncryption\Dir::class,
KeyEncryption\ECDHES::class,
KeyEncryption\ECDHESA128KW::class,
KeyEncryption\ECDHESA192KW::class,
KeyEncryption\ECDHESA256KW::class,
KeyEncryption\PBES2HS256A128KW::class,
KeyEncryption\PBES2HS384A192KW::class,
KeyEncryption\PBES2HS512A256KW::class,
KeyEncryption\RSA15::class,
KeyEncryption\RSAOAEP::class,
KeyEncryption\RSAOAEP256::class,
ContentEncryption\A128GCM::class,
ContentEncryption\A192GCM::class,
ContentEncryption\A256GCM::class,
ContentEncryption\A128CBCHS256::class,
ContentEncryption\A192CBCHS384::class,
ContentEncryption\A256CBCHS512::class,
];
/**
* @test
*
* @throws ExpectationFailedException
*/
public function itReturnsAllAlgorithmClasses(): void
{
$algorithmProvider = new AlgorithmProvider(self::ALL_ALGORITHMS);
static::assertSame(self::ALL_ALGORITHMS, $algorithmProvider->getAlgorithmClasses());
}
/**
* @test
*
* @throws Exception
* @throws ExpectationFailedException
*/
public function itReturnsTheAvailableAlgorithms(): void
{
$algorithmProvider = new AlgorithmProvider(self::ALL_ALGORITHMS);
foreach ($algorithmProvider->getAvailableAlgorithms() as $algorithm) {
static::assertContains(get_class($algorithm), self::ALL_ALGORITHMS);
}
}
/**
* @test
*
* @throws ExpectationFailedException
* @throws \Exception
*/
public function itAllowsNonExistingClasses(): void
{
$nonExistingClassName = 'NonExistingClass'.bin2hex(random_bytes(31));
$algorithmProvider = new AlgorithmProvider([$nonExistingClassName]);
static::assertSame([$nonExistingClassName], $algorithmProvider->getAlgorithmClasses());
static::assertSame([], $algorithmProvider->getAvailableAlgorithms());
}
/**
* @test
*
* @throws ExpectationFailedException
*/
public function itCanHandleClassesWithExceptions(): void
{
$test = [$this->createAlgorithmClassWithExceptionMock()];
$algorithmProvider = new AlgorithmProvider($test);
static::assertSame($test, $algorithmProvider->getAlgorithmClasses());
static::assertSame([], $algorithmProvider->getAvailableAlgorithms());
}
private function createAlgorithmClassWithExceptionMock(): string
{
$mockClass = new class() implements Algorithm\SignatureAlgorithm {
/** @var bool */
private static $throw;
public function __construct()
{
if (null === self::$throw) {
self::$throw = true;
return;
}
throw new BadFunctionCallException('should not be called');
}
public function name(): string
{
throw new BadFunctionCallException('should not be called');
}
public function allowedKeyTypes(): array
{
throw new BadFunctionCallException('should not be called');
}
public function sign(JWK $key, string $input): string
{
throw new BadFunctionCallException('should not be called');
}
public function verify(JWK $key, string $input, string $signature): bool
{
throw new BadFunctionCallException('should not be called');
}
};
return get_class($mockClass);
}
}

View File

@@ -1,141 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Easy\Tests;
use Jose\Component\Core\JWK;
use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CCM_16_128;
use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP512;
use Jose\Easy\Build;
use Jose\Easy\Load;
use PHPUnit\Framework\TestCase;
/**
* @group easy
*
* @internal
* @covers \Jose\Easy\Build
* @covers \Jose\Easy\JWEBuilder
* @covers \Jose\Easy\JWT
*/
class EncryptionTest extends TestCase
{
/**
* @test
*/
public function jweCanBeCreated(): void
{
$time = time();
$jwe = Build::jwe()
->exp($time + 3600)
->iat($time)
->nbf($time)
->jti('0123456789', true)
->iss('issuer')
->aud('audience1')
->aud('audience2')
->sub('subject')
->alg('RSA-OAEP-256')
->enc('A256GCM')
->zip('DEF')
->claim('is_root', true)
->claim('roles', ['ROLE1' => true, 'ROLE2' => 0.007])
->crit(['alg', 'enc'])
->encrypt($this->rsaKey())
;
$jwt = Load::jwe($jwe)
->algs(['RSA-OAEP', 'RSA-OAEP-256'])
->encs(['A128GCM', 'A256GCM'])
->exp()
->iat()
->nbf()
->aud('audience1')
->iss('issuer')
->sub('subject')
->jti('0123456789')
->key($this->rsaKey())
->run()
;
static::assertEquals($time, $jwt->claims->iat());
static::assertEquals($time, $jwt->claims->nbf());
static::assertEquals($time + 3600, $jwt->claims->exp());
static::assertEquals('0123456789', $jwt->claims->jti());
static::assertEquals('issuer', $jwt->claims->iss());
static::assertEquals('subject', $jwt->claims->sub());
static::assertEquals(['audience1', 'audience2'], $jwt->claims->aud());
static::assertEquals(true, $jwt->claims->is_root());
static::assertEquals(['ROLE1' => true, 'ROLE2' => 0.007], $jwt->claims->roles());
static::assertEquals(['jti' => '0123456789', 'alg' => 'RSA-OAEP-256', 'enc' => 'A256GCM', 'crit' => ['alg', 'enc'], 'zip' => 'DEF'], $jwt->header->all());
static::assertEquals('RSA-OAEP-256', $jwt->header->alg());
static::assertEquals('A256GCM', $jwt->header->enc());
static::assertEquals('0123456789', $jwt->header->jti());
}
/**
* @test
*/
public function jweCanBeCreatedWithCustomAlgorithm(): void
{
$time = time();
$jwe = Build::jwe()
->exp($time + 3600)
->iat($time)
->nbf($time)
->jti('0123456789')
->alg(new RSAOAEP512())
->enc(new A256CCM_16_128())
->encrypt($this->rsaKey())
;
$jwt = Load::jwe($jwe)
->algs(['RSA-OAEP', new RSAOAEP512()])
->encs(['A128GCM', new A256CCM_16_128()])
->exp()
->iat()
->nbf()
->aud('audience1')
->iss('issuer')
->sub('subject')
->jti('0123456789')
->key($this->rsaKey())
->run()
;
static::assertEquals($time, $jwt->claims->iat());
static::assertEquals($time, $jwt->claims->nbf());
static::assertEquals($time + 3600, $jwt->claims->exp());
static::assertEquals('0123456789', $jwt->claims->jti());
static::assertEquals('RSA-OAEP-512', $jwt->header->alg());
static::assertEquals('A256CCM-16-128', $jwt->header->enc());
}
private function rsaKey(): JWK
{
return new JWK([
'kty' => 'RSA',
'kid' => 'bilbo.baggins@hobbiton.example',
'use' => 'enc',
'n' => 'n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT-O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqVwGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuCLqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5gHdrNP5zw',
'e' => 'AQAB',
'd' => 'bWUC9B-EFRIo8kpGfh0ZuyGPvMNKvYWNtB_ikiH9k20eT-O1q_I78eiZkpXxXQ0UTEs2LsNRS-8uJbvQ-A1irkwMSMkK1J3XTGgdrhCku9gRldY7sNA_AKZGh-Q661_42rINLRCe8W-nZ34ui_qOfkLnK9QWDDqpaIsA-bMwWWSDFu2MUBYwkHTMEzLYGqOe04noqeq1hExBTHBOBdkMXiuFhUq1BU6l-DqEiWxqg82sXt2h-LMnT3046AOYJoRioz75tSUQfGCshWTBnP5uDjd18kKhyv07lhfSJdrPdM5Plyl21hsFf4L_mHCuoFau7gdsPfHPxxjVOcOpBrQzwQ',
'p' => '3Slxg_DwTXJcb6095RoXygQCAZ5RnAvZlno1yhHtnUex_fp7AZ_9nRaO7HX_-SFfGQeutao2TDjDAWU4Vupk8rw9JR0AzZ0N2fvuIAmr_WCsmGpeNqQnev1T7IyEsnh8UMt-n5CafhkikzhEsrmndH6LxOrvRJlsPp6Zv8bUq0k',
'q' => 'uKE2dh-cTf6ERF4k4e_jy78GfPYUIaUyoSSJuBzp3Cubk3OCqs6grT8bR_cu0Dm1MZwWmtdqDyI95HrUeq3MP15vMMON8lHTeZu2lmKvwqW7anV5UzhM1iZ7z4yMkuUwFWoBvyY898EXvRD-hdqRxHlSqAZ192zB3pVFJ0s7pFc',
'dp' => 'B8PVvXkvJrj2L-GYQ7v3y9r6Kw5g9SahXBwsWUzp19TVlgI-YV85q1NIb1rxQtD-IsXXR3-TanevuRPRt5OBOdiMGQp8pbt26gljYfKU_E9xn-RULHz0-ed9E9gXLKD4VGngpz-PfQ_q29pk5xWHoJp009Qf1HvChixRX59ehik',
'dq' => 'CLDmDGduhylc9o7r84rEUVn7pzQ6PF83Y-iBZx5NT-TpnOZKF1pErAMVeKzFEl41DlHHqqBLSM0W1sOFbwTxYWZDm6sI6og5iTbwQGIC3gnJKbi_7k_vJgGHwHxgPaX2PnvP-zyEkDERuf-ry4c_Z11Cq9AqC2yeL6kdKT1cYF8',
'qi' => '3PiqvXQN0zwMeE-sBvZgi289XP9XCQF3VWqPzMKnIgQp7_Tugo6-NZBKCQsMf3HaEGBjTVJs_jcK8-TRXvaKe-7ZMaQj8VfBdYkssbu0NKDDhjJ-GtiseaDVWt7dcH0cfwxgFUHpQh7FoCrjFJ6h6ZEpMF6xmujs4qMpPz8aaI4',
]);
}
}

View File

@@ -1,41 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Easy\Tests;
use Jose\Easy\ParameterBag;
use PHPUnit\Framework\TestCase;
/**
* @group easy
*
* @internal
* @covers \Jose\Easy\ParameterBag
*/
class ParameterBagTest extends TestCase
{
/**
* @test
*/
public function basicCalls(): void
{
$bag = new ParameterBag();
$bag->iss('iss');
$bag->alg('alg');
$bag->aud(['aud']);
static::assertEquals(['aud'], $bag->aud());
static::assertEquals('iss', $bag->get('iss'));
static::assertEquals('alg', $bag->get('alg'));
}
}

View File

@@ -1,268 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Easy\Tests;
use Exception;
use InvalidArgumentException;
use Jose\Component\Checker\InvalidClaimException;
use Jose\Component\Core\JWK;
use Jose\Component\Signature\Algorithm\HS1;
use Jose\Easy\Build;
use Jose\Easy\Load;
use PHPUnit\Framework\TestCase;
/**
* @group easy
*
* @covers \Jose\Easy\Build
* @covers \Jose\Easy\JWSBuilder
* @covers \Jose\Easy\JWT
* @covers \Jose\Easy\Validate
*
* @internal
*/
class SignatureTest extends TestCase
{
/**
* @test
*/
public function jwsCanBeCreated(): void
{
$time = time();
$jws = Build::jws()
->exp($time + 3600)
->iat($time)
->nbf($time)
->jti('0123456789', true)
->alg('RS512')
->iss('issuer')
->aud('audience1')
->aud('audience2')
->sub('subject')
->claim('is_root', true)
->claim('roles', ['ROLE1' => true, 'ROLE2' => 0.007])
->crit(['alg'])
->sign($this->rsaKey())
;
$jwt = Load::jws($jws)
->algs(['RS256', 'RS512'])
->exp()
->iat()
->nbf()
->aud('audience1')
->iss('issuer')
->sub('subject')
->jti('0123456789')
->key($this->rsaKey())
->run()
;
static::assertEquals($time, $jwt->claims->iat());
static::assertEquals($time, $jwt->claims->nbf());
static::assertEquals($time + 3600, $jwt->claims->exp());
static::assertEquals('0123456789', $jwt->claims->jti());
static::assertEquals('issuer', $jwt->claims->iss());
static::assertEquals('subject', $jwt->claims->sub());
static::assertEquals(['audience1', 'audience2'], $jwt->claims->aud());
static::assertEquals(true, $jwt->claims->is_root());
static::assertEquals(['ROLE1' => true, 'ROLE2' => 0.007], $jwt->claims->roles());
static::assertEquals(['jti' => '0123456789', 'alg' => 'RS512', 'crit' => ['alg']], $jwt->header->all());
static::assertEquals('RS512', $jwt->header->alg());
static::assertEquals('0123456789', $jwt->header->jti());
}
/**
* @test
*/
public function invalidSignatureRejectsTheToken(): void
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('Invalid signature');
$time = time();
$jws = Build::jws()
->exp($time + 3600)
->iat($time)
->nbf($time)
->jti('0123456789', true)
->alg('HS256')
->iss('issuer')
->aud('audience1')
->aud('audience2')
->sub('subject')
->claim('is_root', true)
->claim('roles', ['ROLE1' => true, 'ROLE2' => 0.007])
->crit(['alg'])
->sign(new JWK(['kty' => 'oct', 'k' => 'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo']))
;
Load::jws($jws)
->algs(['HS256'])
->exp()
->iat()
->nbf()
->aud('audience1')
->iss('issuer')
->sub('subject')
->jti('0123456789')
->key(new JWK(['kty' => 'oct', 'k' => 'BARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBAR']))
->run()
;
}
/**
* @test
*/
public function algorithmIsNotAllowed(): void
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('The algorithm "none" is not supported.');
$time = time();
$jws = Build::jws()
->exp($time + 3600)
->iat($time)
->nbf($time)
->jti('0123456789', true)
->alg('none')
->iss('issuer')
->aud('audience1')
->aud('audience2')
->sub('subject')
->claim('is_root', true)
->claim('roles', ['ROLE1' => true, 'ROLE2' => 0.007])
->crit(['alg'])
->sign($this->noneKey())
;
Load::jws($jws)
->algs(['HS256'])
->exp()
->iat()
->nbf()
->aud('audience1')
->iss('issuer')
->sub('subject')
->jti('0123456789')
->key(new JWK(['kty' => 'oct', 'k' => 'BARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBAR']))
->run()
;
}
/**
* @test
*/
public function tokenExpired(): void
{
$this->expectException(InvalidClaimException::class);
$this->expectExceptionMessage('The token expired.');
$time = time();
$jws = Build::jws()
->exp($time - 1)
->iat($time)
->nbf($time)
->jti('0123456789', true)
->alg('RS256')
->iss('issuer')
->aud('audience1')
->aud('audience2')
->sub('subject')
->claim('is_root', true)
->claim('roles', ['ROLE1' => true, 'ROLE2' => 0.007])
->crit(['alg'])
->sign($this->rsaKey())
;
Load::jws($jws)
->algs(['RS256'])
->exp()
->iat()
->nbf()
->aud('audience1')
->iss('issuer')
->sub('subject')
->jti('0123456789')
->key($this->rsaKey())
->run()
;
}
/**
* @test
*/
public function jwsCanBeCreatedWithCustomAlgorithm(): void
{
$time = time();
$jws = Build::jws()
->exp($time + 3600)
->iat($time)
->nbf($time)
->jti('0123456789')
->alg(new HS1())
->sign($this->octKey())
;
$jwt = Load::jws($jws)
->algs(['RS256', new HS1()])
->exp()
->iat()
->nbf()
->aud('audience1')
->iss('issuer')
->sub('subject')
->jti('0123456789')
->key($this->octKey())
->run()
;
static::assertEquals($time, $jwt->claims->iat());
static::assertEquals($time, $jwt->claims->nbf());
static::assertEquals($time + 3600, $jwt->claims->exp());
static::assertEquals('0123456789', $jwt->claims->jti());
static::assertEquals('HS1', $jwt->header->alg());
}
private function rsaKey(): JWK
{
return new JWK([
'kty' => 'RSA',
'kid' => 'bilbo.baggins@hobbiton.example',
'use' => 'sig',
'n' => 'n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT-O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqVwGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuCLqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5gHdrNP5zw',
'e' => 'AQAB',
'd' => 'bWUC9B-EFRIo8kpGfh0ZuyGPvMNKvYWNtB_ikiH9k20eT-O1q_I78eiZkpXxXQ0UTEs2LsNRS-8uJbvQ-A1irkwMSMkK1J3XTGgdrhCku9gRldY7sNA_AKZGh-Q661_42rINLRCe8W-nZ34ui_qOfkLnK9QWDDqpaIsA-bMwWWSDFu2MUBYwkHTMEzLYGqOe04noqeq1hExBTHBOBdkMXiuFhUq1BU6l-DqEiWxqg82sXt2h-LMnT3046AOYJoRioz75tSUQfGCshWTBnP5uDjd18kKhyv07lhfSJdrPdM5Plyl21hsFf4L_mHCuoFau7gdsPfHPxxjVOcOpBrQzwQ',
'p' => '3Slxg_DwTXJcb6095RoXygQCAZ5RnAvZlno1yhHtnUex_fp7AZ_9nRaO7HX_-SFfGQeutao2TDjDAWU4Vupk8rw9JR0AzZ0N2fvuIAmr_WCsmGpeNqQnev1T7IyEsnh8UMt-n5CafhkikzhEsrmndH6LxOrvRJlsPp6Zv8bUq0k',
'q' => 'uKE2dh-cTf6ERF4k4e_jy78GfPYUIaUyoSSJuBzp3Cubk3OCqs6grT8bR_cu0Dm1MZwWmtdqDyI95HrUeq3MP15vMMON8lHTeZu2lmKvwqW7anV5UzhM1iZ7z4yMkuUwFWoBvyY898EXvRD-hdqRxHlSqAZ192zB3pVFJ0s7pFc',
'dp' => 'B8PVvXkvJrj2L-GYQ7v3y9r6Kw5g9SahXBwsWUzp19TVlgI-YV85q1NIb1rxQtD-IsXXR3-TanevuRPRt5OBOdiMGQp8pbt26gljYfKU_E9xn-RULHz0-ed9E9gXLKD4VGngpz-PfQ_q29pk5xWHoJp009Qf1HvChixRX59ehik',
'dq' => 'CLDmDGduhylc9o7r84rEUVn7pzQ6PF83Y-iBZx5NT-TpnOZKF1pErAMVeKzFEl41DlHHqqBLSM0W1sOFbwTxYWZDm6sI6og5iTbwQGIC3gnJKbi_7k_vJgGHwHxgPaX2PnvP-zyEkDERuf-ry4c_Z11Cq9AqC2yeL6kdKT1cYF8',
'qi' => '3PiqvXQN0zwMeE-sBvZgi289XP9XCQF3VWqPzMKnIgQp7_Tugo6-NZBKCQsMf3HaEGBjTVJs_jcK8-TRXvaKe-7ZMaQj8VfBdYkssbu0NKDDhjJ-GtiseaDVWt7dcH0cfwxgFUHpQh7FoCrjFJ6h6ZEpMF6xmujs4qMpPz8aaI4',
]);
}
private function octKey(): JWK
{
return new JWK([
'kty' => 'oct',
'k' => 'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo',
]);
}
private function noneKey(): JWK
{
return new JWK([
'kty' => 'none',
]);
}
}

View File

@@ -38,20 +38,5 @@
"web-token/jwt-signature-algorithm-none": "Adds none signature algorithms",
"web-token/jwt-signature-algorithm-hmac": "Adds HMAC based signature algorithms",
"web-token/jwt-signature-algorithm-rsa": "Adds RSA based signature algorithms"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev"
}
},
"config": {
"sort-packages": true
}
}

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
backupGlobals="false"
backupStaticAttributes="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="true"
bootstrap="vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Test Suite">
<directory>./Tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">./</directory>
<exclude>
<directory>./vendor</directory>
<directory>./Tests</directory>
<directory suffix="Test.php">./src</directory>
</exclude>
</whitelist>
</filter>
</phpunit>

View File

@@ -1,169 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Component\Signature\Algorithm\Tests;
use Base64Url\Base64Url;
use Jose\Component\Core\JWK;
use Jose\Component\Signature\Algorithm\ES256;
use Jose\Component\Signature\Algorithm\ES384;
use Jose\Component\Signature\Algorithm\ES512;
use Jose\Component\Signature\Algorithm\SignatureAlgorithm;
use PHPUnit\Framework\TestCase;
/**
* @see https://tools.ietf.org/html/rfc6979#appendix-A.2.5
* @see https://tools.ietf.org/html/rfc6979#appendix-A.2.6
* @see https://tools.ietf.org/html/rfc6979#appendix-A.2.7
*
* Note that we only test
* * P-256 key with SHA-256
* * P-384 key with SHA-384
* * P-521 key with SHA-512
*
* Other curves or hash method combinaisons are not used by the Jot specification
*
* @group RFC6979
*
* @internal
*/
class ECDSAFromRFC6979Test extends TestCase
{
/**
* @param string $message
* @param string $signature
*
* @dataProvider dataWithVectors
*
* @test
*/
public function withVectors(SignatureAlgorithm $algorithm, $message, JWK $key, $signature): void
{
$is_valid = $algorithm->verify($key, $message, $signature);
static::assertTrue($is_valid);
}
public function dataWithVectors(): array
{
return [
[
new ES256(),
'sample',
new JWK([
'kty' => 'EC',
'crv' => 'P-256',
'd' => Base64Url::encode($this->convertHexToBin('C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721')),
'x' => Base64Url::encode($this->convertHexToBin('60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6')),
'y' => Base64Url::encode($this->convertHexToBin('7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299')),
]),
sprintf(
'%s%s',
$this->convertHexToBin('EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716'),
$this->convertHexToBin('F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8')
),
],
[
new ES256(),
'test',
new JWK([
'kty' => 'EC',
'crv' => 'P-256',
'd' => Base64Url::encode($this->convertHexToBin('C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721')),
'x' => Base64Url::encode($this->convertHexToBin('60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6')),
'y' => Base64Url::encode($this->convertHexToBin('7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299')),
]),
sprintf(
'%s%s',
$this->convertHexToBin('F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D38367'),
$this->convertHexToBin('019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083')
),
],
[
new ES384(),
'sample',
new JWK([
'kty' => 'EC',
'crv' => 'P-384',
'd' => Base64Url::encode($this->convertHexToBin('6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5')),
'x' => Base64Url::encode($this->convertHexToBin('EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC13')),
'y' => Base64Url::encode($this->convertHexToBin('8015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720')),
]),
sprintf(
'%s%s',
$this->convertHexToBin('94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE46'),
$this->convertHexToBin('99EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8')
),
],
[
new ES384(),
'test',
new JWK([
'kty' => 'EC',
'crv' => 'P-384',
'd' => Base64Url::encode($this->convertHexToBin('6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5')),
'x' => Base64Url::encode($this->convertHexToBin('EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC13')),
'y' => Base64Url::encode($this->convertHexToBin('8015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720')),
]),
sprintf(
'%s%s',
$this->convertHexToBin('8203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DB'),
$this->convertHexToBin('DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5')
),
],
// A zero has been added at the beginning of each value from the RFC (cannot convert to binary of not an even length).
[
new ES512(),
'sample',
new JWK([
'kty' => 'EC',
'crv' => 'P-521',
'd' => Base64Url::encode($this->convertHexToBin('00FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538')),
'x' => Base64Url::encode($this->convertHexToBin('01894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD371123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F5023A4')),
'y' => Base64Url::encode($this->convertHexToBin('00493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A28A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDFCF5')),
]),
sprintf(
'%s%s',
$this->convertHexToBin('00C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E377FA'),
$this->convertHexToBin('00617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A67A')
),
],
[
new ES512(),
'test',
new JWK([
'kty' => 'EC',
'crv' => 'P-521',
'd' => Base64Url::encode($this->convertHexToBin('00FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538')),
'x' => Base64Url::encode($this->convertHexToBin('01894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD371123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F5023A4')),
'y' => Base64Url::encode($this->convertHexToBin('00493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A28A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDFCF5')),
]),
sprintf(
'%s%s',
$this->convertHexToBin('013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47EE6D'),
$this->convertHexToBin('01FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4DCE3')
),
],
];
}
/**
* @param string $data
*
* @return string
*/
private function convertHexToBin($data)
{
return hex2bin($data);
}
}

View File

@@ -1,107 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Component\Signature\Algorithm\Tests;
use Jose\Component\Core\AlgorithmManager;
use Jose\Component\Core\JWK;
use Jose\Component\Signature\Algorithm\ES512;
use Jose\Component\Signature\JWSBuilder;
use Jose\Component\Signature\JWSVerifier;
use Jose\Component\Signature\Serializer;
use PHPUnit\Framework\TestCase;
/**
* @see https://tools.ietf.org/html/rfc7520#section-4.3
*
* @group RFC7520
* @group unit
*
* @internal
*/
class ECDSAFromRFC7520Test extends TestCase
{
/**
* Please note that we cannot create the signature and get the same result as the example (ECDSA signatures are always different).
* This test case create a signature and verifies it.
* Then the output given in the RFC is used and verified.
* This way, we can say that the library is able to create/verify ECDSA signatures and verify signature from test vectors.
*
* @test
*/
public function eS512(): void
{
/*
* Payload
* EC public key
* @see https://tools.ietf.org/html/rfc7520#section-3.2
* @see https://tools.ietf.org/html/rfc7520#section-4.3.1
*/
$payload = "It\xe2\x80\x99s a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there\xe2\x80\x99s no knowing where you might be swept off to.";
$private_key = new JWK([
'kty' => 'EC',
'kid' => 'bilbo.baggins@hobbiton.example',
'use' => 'sig',
'crv' => 'P-521',
'x' => 'AHKZLLOsCOzz5cY97ewNUajB957y-C-U88c3v13nmGZx6sYl_oJXu9A5RkTKqjqvjyekWF-7ytDyRXYgCF5cj0Kt',
'y' => 'AdymlHvOiLxXkEhayXQnNCvDX4h9htZaCJN34kfmC6pV5OhQHiraVySsUdaQkAgDPrwQrJmbnX9cwlGfP-HqHZR1',
'd' => 'AAhRON2r9cqXX1hg-RoI6R1tX5p2rUAYdmpHZoC1XNM56KtscrX6zbKipQrCW9CGZH3T4ubpnoTKLDYJ_fF3_rJt',
]);
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.3.2
*/
$header = [
'alg' => 'ES512',
'kid' => 'bilbo.baggins@hobbiton.example',
];
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new ES512()])
);
$jwsVerifier = new JWSVerifier(
new AlgorithmManager([new ES512()])
);
$compactSerializer = new Serializer\CompactSerializer(
);
$jsonFlattenedSerializer = new Serializer\JSONFlattenedSerializer(
);
$jsonGeneralSerializer = new Serializer\JSONGeneralSerializer(
);
$jws = $jwsBuilder
->create()->withPayload($payload)
->addSignature($private_key, $header)
->build()
;
static::assertTrue($jwsVerifier->verifyWithKey($jws, $private_key, 0));
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.3.3
*/
$expected_compact_json = 'eyJhbGciOiJFUzUxMiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.AE_R_YZCChjn4791jSQCrdPZCNYqHXCTZH0-JZGYNlaAjP2kqaluUIIUnC9qvbu9Plon7KRTzoNEuT4Va2cmL1eJAQy3mtPBu_u_sDDyYjnAMDxXPn7XrT0lw-kvAD890jl8e2puQens_IEKBpHABlsbEPX6sFY8OcGDqoRuBomu9xQ2';
$expected_flattened_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","protected":"eyJhbGciOiJFUzUxMiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"AE_R_YZCChjn4791jSQCrdPZCNYqHXCTZH0-JZGYNlaAjP2kqaluUIIUnC9qvbu9Plon7KRTzoNEuT4Va2cmL1eJAQy3mtPBu_u_sDDyYjnAMDxXPn7XrT0lw-kvAD890jl8e2puQens_IEKBpHABlsbEPX6sFY8OcGDqoRuBomu9xQ2"}';
$expected_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJFUzUxMiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"AE_R_YZCChjn4791jSQCrdPZCNYqHXCTZH0-JZGYNlaAjP2kqaluUIIUnC9qvbu9Plon7KRTzoNEuT4Va2cmL1eJAQy3mtPBu_u_sDDyYjnAMDxXPn7XrT0lw-kvAD890jl8e2puQens_IEKBpHABlsbEPX6sFY8OcGDqoRuBomu9xQ2"}]}';
$loaded_compact_json = $compactSerializer->unserialize($expected_compact_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_compact_json, $private_key, 0));
$loaded_flattened_json = $jsonFlattenedSerializer->unserialize($expected_flattened_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_flattened_json, $private_key, 0));
$loaded_json = $jsonGeneralSerializer->unserialize($expected_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $private_key, 0));
}
}

View File

@@ -1,205 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Component\Signature\Algorithm\Tests;
use Base64Url\Base64Url;
use InvalidArgumentException;
use Jose\Component\Core\JWK;
use Jose\Component\Signature\Algorithm\ES256;
use Jose\Component\Signature\Algorithm\ES384;
use Jose\Component\Signature\Algorithm\ES512;
use PHPUnit\Framework\TestCase;
/**
* @group ECDSA
* @group unit
*
* @internal
*/
class ECDSASignatureTest extends TestCase
{
/**
* @test
* @covers \Jose\Component\Signature\Algorithm\ES256
*/
public function invalidKey(): void
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Wrong key type.');
$key = new JWK([
'kty' => 'RSA',
]);
$ecdsa = new ES256();
$data = 'Live long and Prosper.';
$ecdsa->sign($key, $data);
}
/**
* @test
* @covers \Jose\Component\Signature\Algorithm\ES256
*/
public function eS256Verify(): void
{
$key = new JWK([
'kty' => 'EC',
'crv' => 'P-256',
'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
]);
$ecdsa = new ES256();
$data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
$signature = 'DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q';
$sign = $ecdsa->sign($key, $data);
static::assertTrue($ecdsa->verify($key, $data, $sign));
static::assertTrue($ecdsa->verify($key, $data, Base64Url::decode($signature)));
}
/**
* @test
* @covers \Jose\Component\Signature\Algorithm\ES256
*/
public function eS256SignVerify(): void
{
$key = new JWK([
'kty' => 'EC',
'crv' => 'P-256',
'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
]);
$ecdsa = new ES256();
$data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
$signature = $ecdsa->sign($key, $data);
static::assertTrue($ecdsa->verify($key, $data, $signature));
}
/**
* @test
* @covers \Jose\Component\Signature\Algorithm\ES256
*/
public function keyNotPrivate(): void
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('The EC key is not private');
$key = new JWK([
'kty' => 'EC',
'crv' => 'P-256',
'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
]);
$ecdsa = new ES256();
$data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
$ecdsa->sign($key, $data);
}
/**
* @test
* @covers \Jose\Component\Signature\Algorithm\ES384
*/
public function eS384SignVerify(): void
{
$key = new JWK([
'kty' => 'EC',
'crv' => 'P-384',
'd' => 'pcSSXrbeZEOaBIs7IwqcU9M_OOM81XhZuOHoGgmS_2PdECwcdQcXzv7W8-lYL0cr',
'x' => '6f-XZsg2Tvn0EoEapQ-ylMYNtsm8CPf0cb8HI2EkfY9Bqpt3QMzwlM7mVsFRmaMZ',
'y' => 'b8nOnRwmpmEnvA2U8ydS-dbnPv7bwYl-q1qNeh8Wpjor3VO-RTt4ce0Pn25oGGWU',
]);
$ecdsa = new ES384();
$data = 'eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA';
$signature = $ecdsa->sign($key, $data);
static::assertTrue($ecdsa->verify($key, $data, $signature));
}
/**
* @test
* @covers \Jose\Component\Signature\Algorithm\ES512
*/
public function eS512Verify(): void
{
$key = new JWK([
'kty' => 'EC',
'crv' => 'P-521',
'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk',
'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2',
'd' => 'AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPAxerEzgdRhajnu0ferB0d53vM9mE15j2C',
]);
$ecdsa = new ES512();
$data = 'eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA';
$signature = 'AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn';
$sign = $ecdsa->sign($key, $data);
static::assertTrue($ecdsa->verify($key, $data, $sign));
static::assertTrue($ecdsa->verify($key, $data, Base64Url::decode($signature)));
}
/**
* @test
* @covers \Jose\Component\Signature\Algorithm\ES512
*/
public function eS512SignVerify(): void
{
$key = new JWK([
'kty' => 'EC',
'crv' => 'P-521',
'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk',
'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2',
'd' => 'AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPAxerEzgdRhajnu0ferB0d53vM9mE15j2C',
]);
$ecdsa = new ES512();
$data = 'eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA';
$signature = $ecdsa->sign($key, $data);
static::assertTrue($ecdsa->verify($key, $data, $signature));
}
/**
* @test
* @covers \Jose\Component\Signature\Algorithm\ES256
*/
public function badSignature(): void
{
$key = new JWK([
'kty' => 'EC',
'crv' => 'P-256',
'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
]);
$ecdsa = new ES256();
$data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
$signature = 'DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3';
static::assertFalse($ecdsa->verify($key, $data, Base64Url::decode($signature)));
}
}

View File

@@ -22,21 +22,5 @@
"require": {
"ext-openssl": "*",
"web-token/jwt-signature": "^2.0"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev",
"v2.1": "2.1.x-dev"
}
},
"config": {
"sort-packages": true
}
}

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
backupGlobals="false"
backupStaticAttributes="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="true"
bootstrap="vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Test Suite">
<directory>./Tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">./</directory>
<exclude>
<directory>./vendor</directory>
<directory>./Tests</directory>
<directory suffix="Test.php">./src</directory>
</exclude>
</whitelist>
</filter>
</phpunit>

View File

@@ -1,317 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Component\Signature\Algorithm\Tests;
use Jose\Component\Core\AlgorithmManager;
use Jose\Component\Core\JWK;
use Jose\Component\Signature\Algorithm\HS256;
use Jose\Component\Signature\JWSBuilder;
use Jose\Component\Signature\JWSVerifier;
use Jose\Component\Signature\Serializer;
use PHPUnit\Framework\TestCase;
/**
* @see https://tools.ietf.org/html/rfc7520#section-4.4
* @see https://tools.ietf.org/html/rfc7520#section-4.5
* @see https://tools.ietf.org/html/rfc7520#section-4.6
* @see https://tools.ietf.org/html/rfc7520#section-4.7
*
* @group HMAC
* @group RFC7520
*
* @internal
*/
class HMACFromRFC7520Test extends TestCase
{
/**
* @see https://tools.ietf.org/html/rfc7520#section-4.4
*
* @test
*/
public function hS256(): void
{
/*
* Payload
* Symmetric Key
* @see https://tools.ietf.org/html/rfc7520#section-3.5
* @see https://tools.ietf.org/html/rfc7520#section-4.4.1
*/
$payload = "It\xe2\x80\x99s a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there\xe2\x80\x99s no knowing where you might be swept off to.";
$key = new JWK([
'kty' => 'oct',
'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037',
'use' => 'sig',
'alg' => 'HS256',
'k' => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg',
]);
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.4.2
*/
$header = [
'alg' => 'HS256',
'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037',
];
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new HS256()])
);
$jwsVerifier = new JWSVerifier(
new AlgorithmManager([new HS256()])
);
$compactSerializer = new Serializer\CompactSerializer(
);
$jsonFlattenedSerializer = new Serializer\JSONFlattenedSerializer(
);
$jsonGeneralSerializer = new Serializer\JSONGeneralSerializer(
);
$jws = $jwsBuilder
->create()->withPayload($payload)
->addSignature($key, $header)
->build()
;
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.4.3
*/
$expected_compact_json = 'eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0';
$expected_flattened_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","protected":"eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9","signature":"s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"}';
$expected_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9","signature":"s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"}]}';
static::assertEquals($expected_compact_json, $compactSerializer->serialize($jws, 0));
// We decode the json to compare the 2 arrays otherwise the test may fail as the order may be different
static::assertEquals(json_decode($expected_flattened_json, true), json_decode($jsonFlattenedSerializer->serialize($jws, 0), true));
static::assertEquals(json_decode($expected_json, true), json_decode($jsonGeneralSerializer->serialize($jws, 0), true));
$loaded_compact_json = $compactSerializer->unserialize($expected_compact_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_compact_json, $key, 0));
$loaded_flattened_json = $jsonFlattenedSerializer->unserialize($expected_flattened_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_flattened_json, $key, 0));
$loaded_json = $jsonGeneralSerializer->unserialize($expected_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $key, 0));
}
/**
* @see https://tools.ietf.org/html/rfc7520#section-4.5
*
* @test
*/
public function hS256WithDetachedPayload(): void
{
/*
* Payload
* Symmetric Key
* @see https://tools.ietf.org/html/rfc7520#section-3.5
* @see https://tools.ietf.org/html/rfc7520#section-4.5.1
*/
$payload = "It\xe2\x80\x99s a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there\xe2\x80\x99s no knowing where you might be swept off to.";
$key = new JWK([
'kty' => 'oct',
'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037',
'use' => 'sig',
'alg' => 'HS256',
'k' => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg',
]);
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.5.2
*/
$header = [
'alg' => 'HS256',
'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037',
];
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new HS256()])
);
$jwsVerifier = new JWSVerifier(
new AlgorithmManager([new HS256()])
);
$compactSerializer = new Serializer\CompactSerializer(
);
$jsonFlattenedSerializer = new Serializer\JSONFlattenedSerializer(
);
$jsonGeneralSerializer = new Serializer\JSONGeneralSerializer(
);
$jws = $jwsBuilder
->create()->withPayload($payload, true)
->addSignature($key, $header)
->build()
;
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.5.3
*/
$expected_compact_json = 'eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9..s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0';
$expected_flattened_json = '{"protected":"eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9","signature":"s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"}';
$expected_json = '{"signatures":[{"protected":"eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9","signature":"s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"}]}';
static::assertEquals($expected_compact_json, $compactSerializer->serialize($jws, 0));
// We decode the json to compare the 2 arrays otherwise the test may fail as the order may be different
static::assertEquals(json_decode($expected_flattened_json, true), json_decode($jsonFlattenedSerializer->serialize($jws, 0), true));
static::assertEquals(json_decode($expected_json, true), json_decode($jsonGeneralSerializer->serialize($jws, 0), true));
$loaded_compact_json = $compactSerializer->unserialize($expected_compact_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_compact_json, $key, 0, $payload));
$loaded_flattened_json = $jsonFlattenedSerializer->unserialize($expected_flattened_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_flattened_json, $key, 0, $payload));
$loaded_json = $jsonGeneralSerializer->unserialize($expected_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $key, 0, $payload));
}
/**
* @see https://tools.ietf.org/html/rfc7520#section-4.6
*
* @test
*/
public function hS256WithUnprotectedHeader(): void
{
/*
* Payload
* Symmetric Key
* @see https://tools.ietf.org/html/rfc7520#section-3.5
* @see https://tools.ietf.org/html/rfc7520#section-4.6.1
*/
$payload = "It\xe2\x80\x99s a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there\xe2\x80\x99s no knowing where you might be swept off to.";
$key = new JWK([
'kty' => 'oct',
'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037',
'use' => 'sig',
'alg' => 'HS256',
'k' => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg',
]);
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.6.2
*/
$protectedHeader = [
'alg' => 'HS256',
];
$unprotectedHeader = [
'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037',
];
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new HS256()])
);
$jwsVerifier = new JWSVerifier(
new AlgorithmManager([new HS256()])
);
$compactSerializer = new Serializer\CompactSerializer(
);
$jsonFlattenedSerializer = new Serializer\JSONFlattenedSerializer(
);
$jsonGeneralSerializer = new Serializer\JSONGeneralSerializer(
);
$jws = $jwsBuilder
->create()->withPayload($payload)
->addSignature($key, $protectedHeader, $unprotectedHeader)
->build()
;
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.6.3
*/
$expected_flattened_json = '{"payload": "SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","protected": "eyJhbGciOiJIUzI1NiJ9","header": {"kid": "018c0ae5-4d9b-471b-bfd6-eef314bc7037"},"signature": "bWUSVaxorn7bEF1djytBd0kHv70Ly5pvbomzMWSOr20"}';
$expected_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJIUzI1NiJ9","header":{"kid":"018c0ae5-4d9b-471b-bfd6-eef314bc7037"},"signature":"bWUSVaxorn7bEF1djytBd0kHv70Ly5pvbomzMWSOr20"}]}';
// We decode the json to compare the 2 arrays otherwise the test may fail as the order may be different
static::assertEquals(json_decode($expected_flattened_json, true), json_decode($jsonFlattenedSerializer->serialize($jws, 0), true));
static::assertEquals(json_decode($expected_json, true), json_decode($jsonGeneralSerializer->serialize($jws, 0), true));
$loaded_flattened_json = $jsonFlattenedSerializer->unserialize($expected_flattened_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_flattened_json, $key, 0));
$loaded_json = $jsonGeneralSerializer->unserialize($expected_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $key, 0));
}
/**
* @see https://tools.ietf.org/html/rfc7520#section-4.7
*
* @test
*/
public function hS256WithoutProtectedHeader(): void
{
/*
* Payload
* Symmetric Key
* @see https://tools.ietf.org/html/rfc7520#section-3.5
* @see https://tools.ietf.org/html/rfc7520#section-4.7.1
*/
$payload = "It\xe2\x80\x99s a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there\xe2\x80\x99s no knowing where you might be swept off to.";
$key = new JWK([
'kty' => 'oct',
'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037',
'use' => 'sig',
'alg' => 'HS256',
'k' => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg',
]);
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.7.2
*/
$unprotectedHeader = [
'alg' => 'HS256',
'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037',
];
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new HS256()])
);
$jwsVerifier = new JWSVerifier(
new AlgorithmManager([new HS256()])
);
$jsonFlattenedSerializer = new Serializer\JSONFlattenedSerializer(
);
$jsonGeneralSerializer = new Serializer\JSONGeneralSerializer(
);
$jws = $jwsBuilder
->create()->withPayload($payload)
->addSignature($key, [], $unprotectedHeader)
->build()
;
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.7.3
*/
$expected_flattened_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","header":{"alg":"HS256","kid":"018c0ae5-4d9b-471b-bfd6-eef314bc7037"},"signature":"xuLifqLGiblpv9zBpuZczWhNj1gARaLV3UxvxhJxZuk"}';
$expected_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"header":{"alg":"HS256","kid":"018c0ae5-4d9b-471b-bfd6-eef314bc7037"},"signature":"xuLifqLGiblpv9zBpuZczWhNj1gARaLV3UxvxhJxZuk"}]}';
// We decode the json to compare the 2 arrays otherwise the test may fail as the order may be different
static::assertEquals(json_decode($expected_flattened_json, true), json_decode($jsonFlattenedSerializer->serialize($jws, 0), true));
static::assertEquals(json_decode($expected_json, true), json_decode($jsonGeneralSerializer->serialize($jws, 0), true));
$loaded_flattened_json = $jsonFlattenedSerializer->unserialize($expected_flattened_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_flattened_json, $key, 0));
$loaded_json = $jsonGeneralSerializer->unserialize($expected_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $key, 0));
}
}

View File

@@ -1,116 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Component\Signature\Algorithm\Tests;
use InvalidArgumentException;
use Jose\Component\Core\JWK;
use Jose\Component\Signature\Algorithm\HS256;
use Jose\Component\Signature\Algorithm\HS384;
use Jose\Component\Signature\Algorithm\HS512;
use PHPUnit\Framework\TestCase;
/**
* @group HMAC
* @group unit
*
* @internal
*/
class HMACSignatureTest extends TestCase
{
/**
* @test
*/
public function invalidKey(): void
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Wrong key type.');
$key = new JWK([
'kty' => 'EC',
]);
$hmac = new HS256();
$data = 'Live long and Prosper.';
$hmac->hash($key, $data);
}
/**
* @test
*/
public function signatureHasBadBadLength(): void
{
$key = new JWK([
'kty' => 'oct',
'k' => 'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo',
]);
$hmac = new HS256();
$data = 'Live long and Prosper.';
static::assertFalse($hmac->verify($key, $data, hex2bin('326eb338c465d3587f3349df0b96ba81')));
}
/**
* @test
*/
public function hS256SignAndVerify(): void
{
$key = new JWK([
'kty' => 'oct',
'k' => 'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo',
]);
$hmac = new HS256();
$data = 'Live long and Prosper.';
$signature = $hmac->hash($key, $data);
static::assertEquals(hex2bin('7ed268ef179f530a4a1c56225c352a6782cf5379085c484b4f355b6744d6f19d'), $signature);
static::assertTrue($hmac->verify($key, $data, $signature));
}
/**
* @test
*/
public function hS384SignAndVerify(): void
{
$key = new JWK([
'kty' => 'oct',
'k' => 'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo',
]);
$hmac = new HS384();
$data = 'Live long and Prosper.';
$signature = $hmac->hash($key, $data);
static::assertEquals(hex2bin('903ce2ef2878090d6117f88210d5a822d260fae66760186cb3326770748b9fa47c2d4531a4d5d868f99bcf7ea45c1ab4'), $signature);
static::assertTrue($hmac->verify($key, $data, $signature));
}
/**
* @test
*/
public function hS512SignAndVerify(): void
{
$key = new JWK([
'kty' => 'oct',
'k' => 'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo',
]);
$hmac = new HS512();
$data = 'Live long and Prosper.';
$signature = $hmac->hash($key, $data);
static::assertEquals(hex2bin('e8b36712b6c6dc422eec77f31ce372ccac769450413238158bd702069630456a148d0c10dd3a661a774217fb90b0d5f94fa6c3c985438bade92ff975b9e4dc04'), $signature);
static::assertTrue($hmac->verify($key, $data, $signature));
}
}

View File

@@ -21,21 +21,5 @@
},
"require": {
"web-token/jwt-signature": "^2.1"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev",
"v2.1": "2.1.x-dev"
}
},
"config": {
"sort-packages": true
}
}

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
backupGlobals="false"
backupStaticAttributes="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="true"
bootstrap="vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Test Suite">
<directory>./Tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">./</directory>
<exclude>
<directory>./vendor</directory>
<directory>./Tests</directory>
<directory suffix="Test.php">./src</directory>
</exclude>
</whitelist>
</filter>
</phpunit>

View File

@@ -1,109 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Component\Signature\Algorithm\Tests;
use Jose\Component\Core\AlgorithmManager;
use Jose\Component\Core\JWK;
use Jose\Component\Signature\Algorithm\RS256;
use Jose\Component\Signature\JWSBuilder;
use Jose\Component\Signature\JWSVerifier;
use Jose\Component\Signature\Serializer;
use PHPUnit\Framework\TestCase;
/**
* @see https://tools.ietf.org/html/rfc7520#section-4.1
*
* @group RFC7520
*
* @internal
*/
class RSA15SignatureTest extends TestCase
{
/**
* @test
*/
public function rS256(): void
{
/*
* Payload,
* RSA private key
* @see https://tools.ietf.org/html/rfc7520#section-3.4
* @see https://tools.ietf.org/html/rfc7520#section-4.1.1
*/
$payload = "It\xe2\x80\x99s a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there\xe2\x80\x99s no knowing where you might be swept off to.";
$privateKey = new JWK([
'kty' => 'RSA',
'kid' => 'bilbo.baggins@hobbiton.example',
'use' => 'sig',
'n' => 'n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT-O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqVwGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuCLqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5gHdrNP5zw',
'e' => 'AQAB',
'd' => 'bWUC9B-EFRIo8kpGfh0ZuyGPvMNKvYWNtB_ikiH9k20eT-O1q_I78eiZkpXxXQ0UTEs2LsNRS-8uJbvQ-A1irkwMSMkK1J3XTGgdrhCku9gRldY7sNA_AKZGh-Q661_42rINLRCe8W-nZ34ui_qOfkLnK9QWDDqpaIsA-bMwWWSDFu2MUBYwkHTMEzLYGqOe04noqeq1hExBTHBOBdkMXiuFhUq1BU6l-DqEiWxqg82sXt2h-LMnT3046AOYJoRioz75tSUQfGCshWTBnP5uDjd18kKhyv07lhfSJdrPdM5Plyl21hsFf4L_mHCuoFau7gdsPfHPxxjVOcOpBrQzwQ',
'p' => '3Slxg_DwTXJcb6095RoXygQCAZ5RnAvZlno1yhHtnUex_fp7AZ_9nRaO7HX_-SFfGQeutao2TDjDAWU4Vupk8rw9JR0AzZ0N2fvuIAmr_WCsmGpeNqQnev1T7IyEsnh8UMt-n5CafhkikzhEsrmndH6LxOrvRJlsPp6Zv8bUq0k',
'q' => 'uKE2dh-cTf6ERF4k4e_jy78GfPYUIaUyoSSJuBzp3Cubk3OCqs6grT8bR_cu0Dm1MZwWmtdqDyI95HrUeq3MP15vMMON8lHTeZu2lmKvwqW7anV5UzhM1iZ7z4yMkuUwFWoBvyY898EXvRD-hdqRxHlSqAZ192zB3pVFJ0s7pFc',
'dp' => 'B8PVvXkvJrj2L-GYQ7v3y9r6Kw5g9SahXBwsWUzp19TVlgI-YV85q1NIb1rxQtD-IsXXR3-TanevuRPRt5OBOdiMGQp8pbt26gljYfKU_E9xn-RULHz0-ed9E9gXLKD4VGngpz-PfQ_q29pk5xWHoJp009Qf1HvChixRX59ehik',
'dq' => 'CLDmDGduhylc9o7r84rEUVn7pzQ6PF83Y-iBZx5NT-TpnOZKF1pErAMVeKzFEl41DlHHqqBLSM0W1sOFbwTxYWZDm6sI6og5iTbwQGIC3gnJKbi_7k_vJgGHwHxgPaX2PnvP-zyEkDERuf-ry4c_Z11Cq9AqC2yeL6kdKT1cYF8',
'qi' => '3PiqvXQN0zwMeE-sBvZgi289XP9XCQF3VWqPzMKnIgQp7_Tugo6-NZBKCQsMf3HaEGBjTVJs_jcK8-TRXvaKe-7ZMaQj8VfBdYkssbu0NKDDhjJ-GtiseaDVWt7dcH0cfwxgFUHpQh7FoCrjFJ6h6ZEpMF6xmujs4qMpPz8aaI4',
]);
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.1.2
*/
$header = [
'alg' => 'RS256',
'kid' => 'bilbo.baggins@hobbiton.example',
];
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new RS256()])
);
$jwsVerifier = new JWSVerifier(
new AlgorithmManager([new RS256()])
);
$compactSerializer = new Serializer\CompactSerializer(
);
$jsonFlattenedSerializer = new Serializer\JSONFlattenedSerializer(
);
$jsonGeneralSerializer = new Serializer\JSONGeneralSerializer(
);
$jws = $jwsBuilder
->create()->withPayload($payload)
->addSignature($privateKey, $header)
->build()
;
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.1.3
*/
$expected_compact_json = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.MRjdkly7_-oTPTS3AXP41iQIGKa80A0ZmTuV5MEaHoxnW2e5CZ5NlKtainoFmKZopdHM1O2U4mwzJdQx996ivp83xuglII7PNDi84wnB-BDkoBwA78185hX-Es4JIwmDLJK3lfWRa-XtL0RnltuYv746iYTh_qHRD68BNt1uSNCrUCTJDt5aAE6x8wW1Kt9eRo4QPocSadnHXFxnt8Is9UzpERV0ePPQdLuW3IS_de3xyIrDaLGdjluPxUAhb6L2aXic1U12podGU0KLUQSE_oI-ZnmKJ3F4uOZDnd6QZWJushZ41Axf_fcIe8u9ipH84ogoree7vjbU5y18kDquDg';
$expected_flattened_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","protected":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"MRjdkly7_-oTPTS3AXP41iQIGKa80A0ZmTuV5MEaHoxnW2e5CZ5NlKtainoFmKZopdHM1O2U4mwzJdQx996ivp83xuglII7PNDi84wnB-BDkoBwA78185hX-Es4JIwmDLJK3lfWRa-XtL0RnltuYv746iYTh_qHRD68BNt1uSNCrUCTJDt5aAE6x8wW1Kt9eRo4QPocSadnHXFxnt8Is9UzpERV0ePPQdLuW3IS_de3xyIrDaLGdjluPxUAhb6L2aXic1U12podGU0KLUQSE_oI-ZnmKJ3F4uOZDnd6QZWJushZ41Axf_fcIe8u9ipH84ogoree7vjbU5y18kDquDg"}';
$expected_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"MRjdkly7_-oTPTS3AXP41iQIGKa80A0ZmTuV5MEaHoxnW2e5CZ5NlKtainoFmKZopdHM1O2U4mwzJdQx996ivp83xuglII7PNDi84wnB-BDkoBwA78185hX-Es4JIwmDLJK3lfWRa-XtL0RnltuYv746iYTh_qHRD68BNt1uSNCrUCTJDt5aAE6x8wW1Kt9eRo4QPocSadnHXFxnt8Is9UzpERV0ePPQdLuW3IS_de3xyIrDaLGdjluPxUAhb6L2aXic1U12podGU0KLUQSE_oI-ZnmKJ3F4uOZDnd6QZWJushZ41Axf_fcIe8u9ipH84ogoree7vjbU5y18kDquDg"}]}';
static::assertEquals($expected_compact_json, $compactSerializer->serialize($jws, 0));
// We decode the json to compare the 2 arrays otherwise the test may fail as the order may be different
static::assertEquals(json_decode($expected_flattened_json, true), json_decode($jsonFlattenedSerializer->serialize($jws, 0), true));
static::assertEquals(json_decode($expected_json, true), json_decode($jsonGeneralSerializer->serialize($jws, 0), true));
$loaded_compact_json = $compactSerializer->unserialize($expected_compact_json);
$jwsVerifier->verifyWithKey($loaded_compact_json, $privateKey, 0);
$loaded_flattened_json = $jsonFlattenedSerializer->unserialize($expected_flattened_json);
$jwsVerifier->verifyWithKey($loaded_flattened_json, $privateKey, 0);
$loaded_json = $jsonGeneralSerializer->unserialize($expected_json);
$jwsVerifier->verifyWithKey($loaded_json, $privateKey, 0);
}
}

View File

@@ -1,97 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Component\Signature\Algorithm\Tests;
use Jose\Component\Core\AlgorithmManager;
use Jose\Component\Core\JWK;
use Jose\Component\Signature\Algorithm;
use Jose\Component\Signature\JWSBuilder;
use Jose\Component\Signature\JWSVerifier;
use Jose\Component\Signature\Serializer\CompactSerializer;
use PHPUnit\Framework\TestCase;
/**
* @group RSA2
* @group unit
*
* @internal
*/
class RSAKeyWithoutAllPrimesTest extends TestCase
{
/**
* @dataProvider dataSignatureAlgorithms
*
* @test
*/
public function signatureAlgorithms(string $signature_algorithm): void
{
$algorithm = new $signature_algorithm();
$key = $this->getPrivateKey();
$claims = json_encode(['foo' => 'bar']);
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([$algorithm])
);
$jwsVerifier = new JWSVerifier(
new AlgorithmManager([$algorithm])
);
$serializer = new CompactSerializer(
);
$jws = $jwsBuilder
->create()->withPayload($claims)
->addSignature($key, ['alg' => $algorithm->name()])
->build()
;
$jws = $serializer->serialize($jws, 0);
$loaded = $serializer->unserialize($jws);
static::assertTrue($jwsVerifier->verifyWithKey($loaded, $key, 0));
}
public function dataSignatureAlgorithms(): array
{
return [
[Algorithm\RS256::class],
[Algorithm\RS384::class],
[Algorithm\RS512::class],
[Algorithm\PS256::class],
[Algorithm\PS384::class],
[Algorithm\PS512::class],
];
}
public function dataSignatureAlgorithmsWithSimpleKey(): array
{
return [
[Algorithm\PS256::class],
[Algorithm\PS384::class],
[Algorithm\PS512::class],
];
}
private function getPrivateKey(): JWK
{
return new JWK([
'kty' => 'RSA',
'kid' => 'private',
'n' => '2NRPORHXd7wPU6atHqmSfWgEPvsP8HVUkY2AwQQAc8x1J509X5HFxeSXnQym9eAnZHl0JCPbvHoPH4QHlvITYoh0MSgFm2aOPyqOD-XcNdKWtnNX2JIurUCyVlwSwtlmy2ZbCz8YuUmFO0iacahfK1wbWT5QoY-pU3UxnMzDhlBslZN5uL7nRE8Sh_8BthsrMdYeGIMY55kh-P7xTs3MHzpOKhFSrOhdN6aO3HWYUuMAdoMNB-hJvckb2PbCy0_K1Wm3SBHtXn-cuMIUF00W9AR3amp3u3hLa2rcz29jEFXTr2FxKyLH4SdlnFFMJl2vaXuxM4PXgLN33Kj34PfKgc8ljDJ7oaSI9bKt7gunXOLv_o4XWYDq91cvUkOIDAsvqxzzHPZBt0Hru7roW3btkUOiqR6RWy-Cw272yiSEC5QA93m_vklD1KajoFeWN0BW2lWGlfGieZldvKX0sumk1TZuLhlHPHSKYcpeCfahT-jLr1yAeHql6qRN_a0BiHu-SSSjts6InmF1pAELznZ3Jn9-QXX78LsY3xaqOlYqHbCohxXorlYRi4so6eMGILtXjqHOoISb13Ez4YNOQmV4ygmyABRkE0AQG5KLy5cZB7LZn7zqw869UjXxWrmiOaBeDqOkxww6qiWIEDwPIouRLwOfPFtC4LGlb9LmG9Hlhp8',
'e' => 'AQAB',
'd' => 'PsMls2VAsz3SSepjDg8Tgg1LvVc6w-WSdxc4f6ZC40H5X2AaVcGCN8f1QtZYta8Od_zX62Ydwq6qFftHnx-vEMRirZ_iD5td7VbKDDwCw-mTCnjUorGdpTSm6mx4WcJICPQ1wkmfRHLNh916JxAPjCN7Hxf0iu9kme3AUJzMs-IvrBQmFZ3cn18sBAWCX0358NEDoSDBYrhmpwZUnvTe8uMToQWmoroX0XX6wEGht8xRY_yHFxTb032U-_ZhaCxOj_uru8bEqKfTm39CBYSg8j0gu8LZqYAmhI9IHxsk16OgRJG2CkBlDv0yYk799dUEY0oUfs7Y4D4SoeKe7ZWMHgKMEqa7ONz18ORznxqKSQhi4hfNVgwMzaM0IoYP4KOfHuaK263zhJU0hMzURJ8KifECeOsDHBR6BhLJ9TYzUe4c9UU55nFNgRBwknKHFFrRAsgVETEzmZWHzWwGQIFtKIAVZ1cjkdMEL3BlbzzXVofXfbbCrPQqcABYx2BZ-J_P8-UFjeMo83VLrR5IHj0_8IhQZUmxZYJcpTIwrf-1A4JGlN2_eLqRymF8tZI6zIPJyo1C0M1CIB3EeHzi-70SbF8xFtGUB7hR234yo_SM-KqVdIk2Sjjta2bQ1KXjSEcvrS_358AMiP0-9JT_fHxTCyzra-SNYoZhdnrEFzoVwQE',
'p' => '6fWvnj34kJtfMnO1j-qbPjFnaTevREBGAypMvUBU3Fx1Xx0nE7zdc7lln2Qq5-yTQtOQ2lpiE69HkQLR4pMU6V44SjFgVzcTzbFCnNgknEV54S5dyp4KojSWxBi6bt5GwaACkiElDEw9wgc-8JgaEkv4F7e-w44HBwPDECTjE_N0vIawpbD_y6zpifB8ziaAI3xTG4ssA1dt8WZuyQW8SR4FRsYnfkqy0twwHn02gs7XSl4NepkhSO7CY5-YC3U6LazAEZi2NTiUuZSw7F6KaRhsA8CnXTDE5JqFks_fXfLNCbtClON2JtrB1zY-l-2bHyh2a6unDtGn9ZN-Ec7BXw',
'q' => '7UF_NblAyTxmj7Z2Jz1sZmz-Q3YHOcta00DjmHBhR9ItYRMQFMj-SUGPAtwvN-sk3_ThugaQt46SLT_I3Gy8433cHdW7o3So6HiMYVunyfhqnWznSWs6SvIoEh8rJOXkkIZ-DlRP8XyW5OOvi0cbWEQ1f1jbFyistMmnBClPvf2TKKPvShUl9qmvLxuU87j-_bgQmjVmtwZadnPOyPAxQ4_qqSfIiTOvMSxSycr58rTyu3khHQapGHkS5-2Y_w40GUSfVJ3XP48delYpK-PZP71hn89MJTnnfPOtvJAk1wbEev5wQFTJd-PGOudkGkuEIXryF4TGxRPltl5UeF0CwQ',
]);
}
}

View File

@@ -1,110 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Component\Signature\Algorithm\Tests;
use Jose\Component\Core\AlgorithmManager;
use Jose\Component\Core\JWK;
use Jose\Component\Signature\Algorithm\PS384;
use Jose\Component\Signature\JWSBuilder;
use Jose\Component\Signature\JWSVerifier;
use Jose\Component\Signature\Serializer;
use PHPUnit\Framework\TestCase;
/**
* @see https://tools.ietf.org/html/rfc7520#section-4.2
*
* @group RFC7520
*
* @internal
*/
class RSAPSSSignatureTest extends TestCase
{
/**
* Please note that we cannot create the signature and get the same result as the example (RSA-PSS signatures are always different).
* This test case create a signature and verifies it.
* Then the output given in the RFC is used and verified.
* This way, we can say that the library is able to create/verify RSA-PSS signatures and verify signature from test vectors.
*
* @test
*/
public function pS384(): void
{
/*
* Payload,
* RSA private key
* @see https://tools.ietf.org/html/rfc7520#section-3.4
* @see https://tools.ietf.org/html/rfc7520#section-4.2.1
*/
$payload = "It\xe2\x80\x99s a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there\xe2\x80\x99s no knowing where you might be swept off to.";
$privateKey = new JWK([
'kty' => 'RSA',
'kid' => 'bilbo.baggins@hobbiton.example',
'use' => 'sig',
'n' => 'n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT-O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqVwGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuCLqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5gHdrNP5zw',
'e' => 'AQAB',
'd' => 'bWUC9B-EFRIo8kpGfh0ZuyGPvMNKvYWNtB_ikiH9k20eT-O1q_I78eiZkpXxXQ0UTEs2LsNRS-8uJbvQ-A1irkwMSMkK1J3XTGgdrhCku9gRldY7sNA_AKZGh-Q661_42rINLRCe8W-nZ34ui_qOfkLnK9QWDDqpaIsA-bMwWWSDFu2MUBYwkHTMEzLYGqOe04noqeq1hExBTHBOBdkMXiuFhUq1BU6l-DqEiWxqg82sXt2h-LMnT3046AOYJoRioz75tSUQfGCshWTBnP5uDjd18kKhyv07lhfSJdrPdM5Plyl21hsFf4L_mHCuoFau7gdsPfHPxxjVOcOpBrQzwQ',
'p' => '3Slxg_DwTXJcb6095RoXygQCAZ5RnAvZlno1yhHtnUex_fp7AZ_9nRaO7HX_-SFfGQeutao2TDjDAWU4Vupk8rw9JR0AzZ0N2fvuIAmr_WCsmGpeNqQnev1T7IyEsnh8UMt-n5CafhkikzhEsrmndH6LxOrvRJlsPp6Zv8bUq0k',
'q' => 'uKE2dh-cTf6ERF4k4e_jy78GfPYUIaUyoSSJuBzp3Cubk3OCqs6grT8bR_cu0Dm1MZwWmtdqDyI95HrUeq3MP15vMMON8lHTeZu2lmKvwqW7anV5UzhM1iZ7z4yMkuUwFWoBvyY898EXvRD-hdqRxHlSqAZ192zB3pVFJ0s7pFc',
'dp' => 'B8PVvXkvJrj2L-GYQ7v3y9r6Kw5g9SahXBwsWUzp19TVlgI-YV85q1NIb1rxQtD-IsXXR3-TanevuRPRt5OBOdiMGQp8pbt26gljYfKU_E9xn-RULHz0-ed9E9gXLKD4VGngpz-PfQ_q29pk5xWHoJp009Qf1HvChixRX59ehik',
'dq' => 'CLDmDGduhylc9o7r84rEUVn7pzQ6PF83Y-iBZx5NT-TpnOZKF1pErAMVeKzFEl41DlHHqqBLSM0W1sOFbwTxYWZDm6sI6og5iTbwQGIC3gnJKbi_7k_vJgGHwHxgPaX2PnvP-zyEkDERuf-ry4c_Z11Cq9AqC2yeL6kdKT1cYF8',
'qi' => '3PiqvXQN0zwMeE-sBvZgi289XP9XCQF3VWqPzMKnIgQp7_Tugo6-NZBKCQsMf3HaEGBjTVJs_jcK8-TRXvaKe-7ZMaQj8VfBdYkssbu0NKDDhjJ-GtiseaDVWt7dcH0cfwxgFUHpQh7FoCrjFJ6h6ZEpMF6xmujs4qMpPz8aaI4',
]);
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.2.2
*/
$header = [
'alg' => 'PS384',
'kid' => 'bilbo.baggins@hobbiton.example',
];
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new PS384()])
);
$jwsVerifier = new JWSVerifier(
new AlgorithmManager([new PS384()])
);
$compactSerializer = new Serializer\CompactSerializer(
);
$jsonFlattenedSerializer = new Serializer\JSONFlattenedSerializer(
);
$jsonGeneralSerializer = new Serializer\JSONGeneralSerializer(
);
$jws = $jwsBuilder
->create()->withPayload($payload)
->addSignature($privateKey, $header)
->build()
;
$jwsVerifier->verifyWithKey($jws, $privateKey, 0);
/*
* Header
* @see https://tools.ietf.org/html/rfc7520#section-4.2.3
*/
$expected_compact_json = 'eyJhbGciOiJQUzM4NCIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.cu22eBqkYDKgIlTpzDXGvaFfz6WGoz7fUDcfT0kkOy42miAh2qyBzk1xEsnk2IpN6-tPid6VrklHkqsGqDqHCdP6O8TTB5dDDItllVo6_1OLPpcbUrhiUSMxbbXUvdvWXzg-UD8biiReQFlfz28zGWVsdiNAUf8ZnyPEgVFn442ZdNqiVJRmBqrYRXe8P_ijQ7p8Vdz0TTrxUeT3lm8d9shnr2lfJT8ImUjvAA2Xez2Mlp8cBE5awDzT0qI0n6uiP1aCN_2_jLAeQTlqRHtfa64QQSUmFAAjVKPbByi7xho0uTOcbH510a6GYmJUAfmWjwZ6oD4ifKo8DYM-X72Eaw';
$expected_flattened_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","protected":"eyJhbGciOiJQUzM4NCIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"cu22eBqkYDKgIlTpzDXGvaFfz6WGoz7fUDcfT0kkOy42miAh2qyBzk1xEsnk2IpN6-tPid6VrklHkqsGqDqHCdP6O8TTB5dDDItllVo6_1OLPpcbUrhiUSMxbbXUvdvWXzg-UD8biiReQFlfz28zGWVsdiNAUf8ZnyPEgVFn442ZdNqiVJRmBqrYRXe8P_ijQ7p8Vdz0TTrxUeT3lm8d9shnr2lfJT8ImUjvAA2Xez2Mlp8cBE5awDzT0qI0n6uiP1aCN_2_jLAeQTlqRHtfa64QQSUmFAAjVKPbByi7xho0uTOcbH510a6GYmJUAfmWjwZ6oD4ifKo8DYM-X72Eaw"}';
$expected_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJQUzM4NCIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"cu22eBqkYDKgIlTpzDXGvaFfz6WGoz7fUDcfT0kkOy42miAh2qyBzk1xEsnk2IpN6-tPid6VrklHkqsGqDqHCdP6O8TTB5dDDItllVo6_1OLPpcbUrhiUSMxbbXUvdvWXzg-UD8biiReQFlfz28zGWVsdiNAUf8ZnyPEgVFn442ZdNqiVJRmBqrYRXe8P_ijQ7p8Vdz0TTrxUeT3lm8d9shnr2lfJT8ImUjvAA2Xez2Mlp8cBE5awDzT0qI0n6uiP1aCN_2_jLAeQTlqRHtfa64QQSUmFAAjVKPbByi7xho0uTOcbH510a6GYmJUAfmWjwZ6oD4ifKo8DYM-X72Eaw"}]}';
$loaded_compact_json = $compactSerializer->unserialize($expected_compact_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_compact_json, $privateKey, 0));
$loaded_flattened_json = $jsonFlattenedSerializer->unserialize($expected_flattened_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_flattened_json, $privateKey, 0));
$loaded_json = $jsonGeneralSerializer->unserialize($expected_json);
static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $privateKey, 0));
}
}

View File

@@ -1,599 +0,0 @@
<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2020 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Jose\Component\Signature\Algorithm\Tests;
use Base64Url\Base64Url;
use InvalidArgumentException;
use Jose\Component\Core\AlgorithmManager;
use Jose\Component\Core\JWK;
use Jose\Component\Core\JWKSet;
use Jose\Component\Signature\Algorithm;
use Jose\Component\Signature\JWSBuilder;
use Jose\Component\Signature\JWSVerifier;
use Jose\Component\Signature\Serializer\CompactSerializer;
use Jose\Component\Signature\Serializer\JSONGeneralSerializer;
use PHPUnit\Framework\TestCase;
/**
* @group RSA
* @group unit
*
* @internal
*/
class RSASignatureTest extends TestCase
{
/**
* @test
*/
public function completeRS256Sign(): void
{
$key = new JWK([
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
'p' => '5BGU1c7af_5sFyfsa-onIJgo5BZu8uHvz3Uyb8OA0a-G9UPO1ShLYjX0wUfhZcFB7fwPtgmmYAN6wKGVce9eMAbX4PliPk3r-BcpZuPKkuLk_wFvgWAQ5Hqw2iEuwXLV0_e8c2gaUt_hyMC5-nFc4v0Bmv6NT6Pfry-UrK3BKWc',
'd' => 'Kp0KuZwCZGL1BLgsVM-N0edMNitl9wN5Hf2WOYDoIqOZNAEKzdJuenIMhITJjRFUX05GVL138uyp2js_pqDdY9ipA7rAKThwGuDdNphZHech9ih3DGEPXs-YpmHqvIbCd3GoGm38MKwxYkddEpFnjo8rKna1_BpJthrFxjDRhw9DxJBycOdH2yWTyp62ZENPvneK40H2a57W4QScTgfecZqD59m2fGUaWaX5uUmIxaEmtGoJnd9RE4oywKhgN7_TK7wXRlqA4UoRPiH2ACrdU-_cLQL9Jc0u0GqZJK31LDbOeN95QgtSCc72k3Vtzy3CrVpp5TAA67s1Gj9Skn-CAQ',
'q' => 'zPD-B-nrngwF-O99BHvb47XGKR7ON8JCI6JxavzIkusMXCB8rMyYW8zLs68L8JLAzWZ34oMq0FPUnysBxc5nTF8Nb4BZxTZ5-9cHfoKrYTI3YWsmVW2FpCJFEjMs4NXZ28PBkS9b4zjfS2KhNdkmCeOYU0tJpNfwmOTI90qeUdU',
'dp' => 'aJrzw_kjWK9uDlTeaES2e4muv6bWbopYfrPHVWG7NPGoGdhnBnd70-jhgMEiTZSNU8VXw2u7prAR3kZ-kAp1DdwlqedYOzFsOJcPA0UZhbORyrBy30kbll_7u6CanFm6X4VyJxCpejd7jKNw6cCTFP1sfhWg5NVJ5EUTkPwE66M',
'dq' => 'Swz1-m_vmTFN_pu1bK7vF7S5nNVrL4A0OFiEsGliCmuJWzOKdL14DiYxctvnw3H6qT2dKZZfV2tbse5N9-JecdldUjfuqAoLIe7dD7dKi42YOlTC9QXmqvTh1ohnJu8pmRFXEZQGUm_BVhoIb2_WPkjav6YSkguCUHt4HRd2YwE',
'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os',
]);
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new Algorithm\RS256()])
);
$serializer = new CompactSerializer(
);
$jws = $jwsBuilder
->create()->withPayload('Live long and Prosper.')
->addSignature(
$key,
[
'alg' => 'RS256',
'jwk' => [
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
],
]
)
->build()
;
static::assertEquals('eyJhbGciOiJSUzI1NiIsImp3ayI6eyJrdHkiOiJSU0EiLCJuIjoidHBTMVptZlZLVlA1S29mSWhNQlAwdFNXYzRxbGg2Zm0ybHJaU2t1S3hVakVhV2p6WlN6czcyZ0VJR3hyYVd1c01kb1J1VjU0eHNXUnlmNUtlWlQwUy1JNVBybGUzSWRpM2dJQ2lPNE53dk1rNkp3U0JjSld3bVNMRkVLeVVTbkIyQ3RmaUdjMF81clFDcGNFdF9EbjVpTS1CTm43ZnFwb0xJYmtzOHJYS1VJajgtcU1WcWtUWHNFS2VLaW5FMjN0MXlrTWxkc05hYU9ILWh2R3RpNUp0MkRNbkgxSmpvWGREWGZ4dlNQXzBnalVZYjBla3R1ZFlGWG9BNndla21ReUplSW12Z3g0TXl6MUk0aUh0a1lfQ3A3SjRNbjFlalo2SE5teXZvVEVfNE91WTF1Q2VZdjRVeVhGYzFzMXVVeVl0ajR6NTdxc0hHc1M0ZFEzQTJNSnN3IiwiZSI6IkFRQUIifX0.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.QyRlOCcNBMvCEkJRCQA71y2bVX690g0A6wsC2YXf9_VxOYK-g9-xy-1KjghVXkDPe1gDvYSYnL9oWs1PaFKV0_-ijvvJQE6_5pheKTfIVN3Qbkzjxsm4qXTeChBI5MKeBR8z8iWLFT4xPO8NkelwbS2tSUCHrejio6lDDlWhsqSUP8NjHJhqCSZuCDGu3fMMA24cZrYev3tQRc7HHjyi3q_17NZri7feBd7w3NEDkJp7wT_ZclJrYoucHIo1ypaDPJtM-W1-W-lAVREka6Xq4Bg60zdSZ83ODRQTP_IwQrv7hrIcbrRwn1Za_ORZPRPQDP0CMgkb7TkWDZnbPsAzlQ', $serializer->serialize($jws, 0));
$jws = $serializer->serialize($jws, 0);
$result = $serializer->unserialize($jws);
static::assertEquals('Live long and Prosper.', $result->getPayload());
static::assertEquals(1, $result->countSignatures());
static::assertEquals('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
}
/**
* @test
*/
public function completeRS256SignWithDetachedPayload(): void
{
$key = new JWK([
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
'p' => '5BGU1c7af_5sFyfsa-onIJgo5BZu8uHvz3Uyb8OA0a-G9UPO1ShLYjX0wUfhZcFB7fwPtgmmYAN6wKGVce9eMAbX4PliPk3r-BcpZuPKkuLk_wFvgWAQ5Hqw2iEuwXLV0_e8c2gaUt_hyMC5-nFc4v0Bmv6NT6Pfry-UrK3BKWc',
'd' => 'Kp0KuZwCZGL1BLgsVM-N0edMNitl9wN5Hf2WOYDoIqOZNAEKzdJuenIMhITJjRFUX05GVL138uyp2js_pqDdY9ipA7rAKThwGuDdNphZHech9ih3DGEPXs-YpmHqvIbCd3GoGm38MKwxYkddEpFnjo8rKna1_BpJthrFxjDRhw9DxJBycOdH2yWTyp62ZENPvneK40H2a57W4QScTgfecZqD59m2fGUaWaX5uUmIxaEmtGoJnd9RE4oywKhgN7_TK7wXRlqA4UoRPiH2ACrdU-_cLQL9Jc0u0GqZJK31LDbOeN95QgtSCc72k3Vtzy3CrVpp5TAA67s1Gj9Skn-CAQ',
'q' => 'zPD-B-nrngwF-O99BHvb47XGKR7ON8JCI6JxavzIkusMXCB8rMyYW8zLs68L8JLAzWZ34oMq0FPUnysBxc5nTF8Nb4BZxTZ5-9cHfoKrYTI3YWsmVW2FpCJFEjMs4NXZ28PBkS9b4zjfS2KhNdkmCeOYU0tJpNfwmOTI90qeUdU',
'dp' => 'aJrzw_kjWK9uDlTeaES2e4muv6bWbopYfrPHVWG7NPGoGdhnBnd70-jhgMEiTZSNU8VXw2u7prAR3kZ-kAp1DdwlqedYOzFsOJcPA0UZhbORyrBy30kbll_7u6CanFm6X4VyJxCpejd7jKNw6cCTFP1sfhWg5NVJ5EUTkPwE66M',
'dq' => 'Swz1-m_vmTFN_pu1bK7vF7S5nNVrL4A0OFiEsGliCmuJWzOKdL14DiYxctvnw3H6qT2dKZZfV2tbse5N9-JecdldUjfuqAoLIe7dD7dKi42YOlTC9QXmqvTh1ohnJu8pmRFXEZQGUm_BVhoIb2_WPkjav6YSkguCUHt4HRd2YwE',
'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os',
]);
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new Algorithm\RS256()])
);
$serializer = new CompactSerializer(
);
$jws = $jwsBuilder
->create()->withPayload('Live long and Prosper.', true)
->addSignature(
$key,
[
'alg' => 'RS256',
'jwk' => [
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
],
]
)
->build()
;
static::assertEquals('eyJhbGciOiJSUzI1NiIsImp3ayI6eyJrdHkiOiJSU0EiLCJuIjoidHBTMVptZlZLVlA1S29mSWhNQlAwdFNXYzRxbGg2Zm0ybHJaU2t1S3hVakVhV2p6WlN6czcyZ0VJR3hyYVd1c01kb1J1VjU0eHNXUnlmNUtlWlQwUy1JNVBybGUzSWRpM2dJQ2lPNE53dk1rNkp3U0JjSld3bVNMRkVLeVVTbkIyQ3RmaUdjMF81clFDcGNFdF9EbjVpTS1CTm43ZnFwb0xJYmtzOHJYS1VJajgtcU1WcWtUWHNFS2VLaW5FMjN0MXlrTWxkc05hYU9ILWh2R3RpNUp0MkRNbkgxSmpvWGREWGZ4dlNQXzBnalVZYjBla3R1ZFlGWG9BNndla21ReUplSW12Z3g0TXl6MUk0aUh0a1lfQ3A3SjRNbjFlalo2SE5teXZvVEVfNE91WTF1Q2VZdjRVeVhGYzFzMXVVeVl0ajR6NTdxc0hHc1M0ZFEzQTJNSnN3IiwiZSI6IkFRQUIifX0..QyRlOCcNBMvCEkJRCQA71y2bVX690g0A6wsC2YXf9_VxOYK-g9-xy-1KjghVXkDPe1gDvYSYnL9oWs1PaFKV0_-ijvvJQE6_5pheKTfIVN3Qbkzjxsm4qXTeChBI5MKeBR8z8iWLFT4xPO8NkelwbS2tSUCHrejio6lDDlWhsqSUP8NjHJhqCSZuCDGu3fMMA24cZrYev3tQRc7HHjyi3q_17NZri7feBd7w3NEDkJp7wT_ZclJrYoucHIo1ypaDPJtM-W1-W-lAVREka6Xq4Bg60zdSZ83ODRQTP_IwQrv7hrIcbrRwn1Za_ORZPRPQDP0CMgkb7TkWDZnbPsAzlQ', $serializer->serialize($jws, 0));
$jws = $serializer->serialize($jws, 0);
$result = $serializer->unserialize($jws);
static::assertNull($result->getPayload());
static::assertEquals(1, $result->countSignatures());
static::assertEquals('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
}
/**
* @test
*/
public function completeRS384Sign(): void
{
$key = new JWK([
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
'p' => '5BGU1c7af_5sFyfsa-onIJgo5BZu8uHvz3Uyb8OA0a-G9UPO1ShLYjX0wUfhZcFB7fwPtgmmYAN6wKGVce9eMAbX4PliPk3r-BcpZuPKkuLk_wFvgWAQ5Hqw2iEuwXLV0_e8c2gaUt_hyMC5-nFc4v0Bmv6NT6Pfry-UrK3BKWc',
'd' => 'Kp0KuZwCZGL1BLgsVM-N0edMNitl9wN5Hf2WOYDoIqOZNAEKzdJuenIMhITJjRFUX05GVL138uyp2js_pqDdY9ipA7rAKThwGuDdNphZHech9ih3DGEPXs-YpmHqvIbCd3GoGm38MKwxYkddEpFnjo8rKna1_BpJthrFxjDRhw9DxJBycOdH2yWTyp62ZENPvneK40H2a57W4QScTgfecZqD59m2fGUaWaX5uUmIxaEmtGoJnd9RE4oywKhgN7_TK7wXRlqA4UoRPiH2ACrdU-_cLQL9Jc0u0GqZJK31LDbOeN95QgtSCc72k3Vtzy3CrVpp5TAA67s1Gj9Skn-CAQ',
'q' => 'zPD-B-nrngwF-O99BHvb47XGKR7ON8JCI6JxavzIkusMXCB8rMyYW8zLs68L8JLAzWZ34oMq0FPUnysBxc5nTF8Nb4BZxTZ5-9cHfoKrYTI3YWsmVW2FpCJFEjMs4NXZ28PBkS9b4zjfS2KhNdkmCeOYU0tJpNfwmOTI90qeUdU',
'dp' => 'aJrzw_kjWK9uDlTeaES2e4muv6bWbopYfrPHVWG7NPGoGdhnBnd70-jhgMEiTZSNU8VXw2u7prAR3kZ-kAp1DdwlqedYOzFsOJcPA0UZhbORyrBy30kbll_7u6CanFm6X4VyJxCpejd7jKNw6cCTFP1sfhWg5NVJ5EUTkPwE66M',
'dq' => 'Swz1-m_vmTFN_pu1bK7vF7S5nNVrL4A0OFiEsGliCmuJWzOKdL14DiYxctvnw3H6qT2dKZZfV2tbse5N9-JecdldUjfuqAoLIe7dD7dKi42YOlTC9QXmqvTh1ohnJu8pmRFXEZQGUm_BVhoIb2_WPkjav6YSkguCUHt4HRd2YwE',
'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os',
]);
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new Algorithm\RS384()])
);
$serializer = new CompactSerializer(
);
$jws = $jwsBuilder
->create()->withPayload('Live long and Prosper.')
->addSignature(
$key,
[
'alg' => 'RS384',
'jwk' => [
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
],
]
)
->build()
;
static::assertEquals('eyJhbGciOiJSUzM4NCIsImp3ayI6eyJrdHkiOiJSU0EiLCJuIjoidHBTMVptZlZLVlA1S29mSWhNQlAwdFNXYzRxbGg2Zm0ybHJaU2t1S3hVakVhV2p6WlN6czcyZ0VJR3hyYVd1c01kb1J1VjU0eHNXUnlmNUtlWlQwUy1JNVBybGUzSWRpM2dJQ2lPNE53dk1rNkp3U0JjSld3bVNMRkVLeVVTbkIyQ3RmaUdjMF81clFDcGNFdF9EbjVpTS1CTm43ZnFwb0xJYmtzOHJYS1VJajgtcU1WcWtUWHNFS2VLaW5FMjN0MXlrTWxkc05hYU9ILWh2R3RpNUp0MkRNbkgxSmpvWGREWGZ4dlNQXzBnalVZYjBla3R1ZFlGWG9BNndla21ReUplSW12Z3g0TXl6MUk0aUh0a1lfQ3A3SjRNbjFlalo2SE5teXZvVEVfNE91WTF1Q2VZdjRVeVhGYzFzMXVVeVl0ajR6NTdxc0hHc1M0ZFEzQTJNSnN3IiwiZSI6IkFRQUIifX0.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.gsBhyBOEDPpHBR8OM2Xb5tybKGeijREZN-smEkvI2188pytujFevbDQJ10afbcdjh5LNKO7U_VD3hGPrC7MIkdtJw4c2d0JnVyhiZT5sFnncnCFjll-Y9GkK7a7jWJJTgF_5LmVEeJSFEEgwT1Stxb-TtZCGqc5ExYizLiuQ2IGB6Sq-hTkpWAXJfmHchE_TxV9A4iLWCMTVM6LsLV6NzDtf2a0iu9XvN1MEdzqM7FNdqNCGN43FveTA0hX8OoFfB2ZjYAjbixUCT4VVI2PuuRyu_Lr8cA73eisolBQLQemPyrCo1s560v2tKD7ICS8Teo1PCJ4HnCuO8bvufI2dKA', $serializer->serialize($jws, 0));
$jws = $serializer->serialize($jws, 0);
$result = $serializer->unserialize($jws);
static::assertEquals('Live long and Prosper.', $result->getPayload());
static::assertEquals(1, $result->countSignatures());
static::assertEquals('RS384', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
}
/**
* @test
*/
public function completeRS512Sign(): void
{
$key = new JWK([
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
'p' => '5BGU1c7af_5sFyfsa-onIJgo5BZu8uHvz3Uyb8OA0a-G9UPO1ShLYjX0wUfhZcFB7fwPtgmmYAN6wKGVce9eMAbX4PliPk3r-BcpZuPKkuLk_wFvgWAQ5Hqw2iEuwXLV0_e8c2gaUt_hyMC5-nFc4v0Bmv6NT6Pfry-UrK3BKWc',
'd' => 'Kp0KuZwCZGL1BLgsVM-N0edMNitl9wN5Hf2WOYDoIqOZNAEKzdJuenIMhITJjRFUX05GVL138uyp2js_pqDdY9ipA7rAKThwGuDdNphZHech9ih3DGEPXs-YpmHqvIbCd3GoGm38MKwxYkddEpFnjo8rKna1_BpJthrFxjDRhw9DxJBycOdH2yWTyp62ZENPvneK40H2a57W4QScTgfecZqD59m2fGUaWaX5uUmIxaEmtGoJnd9RE4oywKhgN7_TK7wXRlqA4UoRPiH2ACrdU-_cLQL9Jc0u0GqZJK31LDbOeN95QgtSCc72k3Vtzy3CrVpp5TAA67s1Gj9Skn-CAQ',
'q' => 'zPD-B-nrngwF-O99BHvb47XGKR7ON8JCI6JxavzIkusMXCB8rMyYW8zLs68L8JLAzWZ34oMq0FPUnysBxc5nTF8Nb4BZxTZ5-9cHfoKrYTI3YWsmVW2FpCJFEjMs4NXZ28PBkS9b4zjfS2KhNdkmCeOYU0tJpNfwmOTI90qeUdU',
'dp' => 'aJrzw_kjWK9uDlTeaES2e4muv6bWbopYfrPHVWG7NPGoGdhnBnd70-jhgMEiTZSNU8VXw2u7prAR3kZ-kAp1DdwlqedYOzFsOJcPA0UZhbORyrBy30kbll_7u6CanFm6X4VyJxCpejd7jKNw6cCTFP1sfhWg5NVJ5EUTkPwE66M',
'dq' => 'Swz1-m_vmTFN_pu1bK7vF7S5nNVrL4A0OFiEsGliCmuJWzOKdL14DiYxctvnw3H6qT2dKZZfV2tbse5N9-JecdldUjfuqAoLIe7dD7dKi42YOlTC9QXmqvTh1ohnJu8pmRFXEZQGUm_BVhoIb2_WPkjav6YSkguCUHt4HRd2YwE',
'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os',
]);
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new Algorithm\RS512()])
);
$serializer = new CompactSerializer(
);
$jws = $jwsBuilder
->create()->withPayload('Live long and Prosper.')
->addSignature(
$key,
[
'alg' => 'RS512',
'jwk' => [
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
],
]
)
->build()
;
static::assertEquals('eyJhbGciOiJSUzUxMiIsImp3ayI6eyJrdHkiOiJSU0EiLCJuIjoidHBTMVptZlZLVlA1S29mSWhNQlAwdFNXYzRxbGg2Zm0ybHJaU2t1S3hVakVhV2p6WlN6czcyZ0VJR3hyYVd1c01kb1J1VjU0eHNXUnlmNUtlWlQwUy1JNVBybGUzSWRpM2dJQ2lPNE53dk1rNkp3U0JjSld3bVNMRkVLeVVTbkIyQ3RmaUdjMF81clFDcGNFdF9EbjVpTS1CTm43ZnFwb0xJYmtzOHJYS1VJajgtcU1WcWtUWHNFS2VLaW5FMjN0MXlrTWxkc05hYU9ILWh2R3RpNUp0MkRNbkgxSmpvWGREWGZ4dlNQXzBnalVZYjBla3R1ZFlGWG9BNndla21ReUplSW12Z3g0TXl6MUk0aUh0a1lfQ3A3SjRNbjFlalo2SE5teXZvVEVfNE91WTF1Q2VZdjRVeVhGYzFzMXVVeVl0ajR6NTdxc0hHc1M0ZFEzQTJNSnN3IiwiZSI6IkFRQUIifX0.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.OMttEbx9fWoJl4gJwp8m249P87nNENhy5RzH84S1iR8b-upQNy8dqHoIVsQ6qINDjDL5YTl4UWvChIr5AO433LjNUimIeEp2cfiqrszTTwhv-EF3Lp3Ft9NmTb-3ZWvDo1WwwUrD0qro7bynaz5O06DxQfTROcrC6hNX05y6nW_-21exs2_w2OoOWA0Ebx9ev1ayZJh1AQ6q18Ajb0Gk1RST1PFjz0Sk_YiUIYRSVJzgv2Lf7R_Lyi5A5OkIfLOyJmKBi6m0FOLoynq_fT96wCbf5Nkhx-RiuFEcefGhgDav7Wfim3zA3ZAHeNWe58BZOf-8v1kXsV-yd6zQlVa8iw', $serializer->serialize($jws, 0));
$jws = $serializer->serialize($jws, 0);
$result = $serializer->unserialize($jws);
static::assertEquals('Live long and Prosper.', $result->getPayload());
static::assertEquals(1, $result->countSignatures());
static::assertEquals('RS512', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
}
/**
* @test
*/
public function completePS256Sign(): void
{
$key = new JWK([
'kty' => 'RSA',
'key_ops' => ['sign'],
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
'p' => '5BGU1c7af_5sFyfsa-onIJgo5BZu8uHvz3Uyb8OA0a-G9UPO1ShLYjX0wUfhZcFB7fwPtgmmYAN6wKGVce9eMAbX4PliPk3r-BcpZuPKkuLk_wFvgWAQ5Hqw2iEuwXLV0_e8c2gaUt_hyMC5-nFc4v0Bmv6NT6Pfry-UrK3BKWc',
'd' => 'Kp0KuZwCZGL1BLgsVM-N0edMNitl9wN5Hf2WOYDoIqOZNAEKzdJuenIMhITJjRFUX05GVL138uyp2js_pqDdY9ipA7rAKThwGuDdNphZHech9ih3DGEPXs-YpmHqvIbCd3GoGm38MKwxYkddEpFnjo8rKna1_BpJthrFxjDRhw9DxJBycOdH2yWTyp62ZENPvneK40H2a57W4QScTgfecZqD59m2fGUaWaX5uUmIxaEmtGoJnd9RE4oywKhgN7_TK7wXRlqA4UoRPiH2ACrdU-_cLQL9Jc0u0GqZJK31LDbOeN95QgtSCc72k3Vtzy3CrVpp5TAA67s1Gj9Skn-CAQ',
'q' => 'zPD-B-nrngwF-O99BHvb47XGKR7ON8JCI6JxavzIkusMXCB8rMyYW8zLs68L8JLAzWZ34oMq0FPUnysBxc5nTF8Nb4BZxTZ5-9cHfoKrYTI3YWsmVW2FpCJFEjMs4NXZ28PBkS9b4zjfS2KhNdkmCeOYU0tJpNfwmOTI90qeUdU',
'dp' => 'aJrzw_kjWK9uDlTeaES2e4muv6bWbopYfrPHVWG7NPGoGdhnBnd70-jhgMEiTZSNU8VXw2u7prAR3kZ-kAp1DdwlqedYOzFsOJcPA0UZhbORyrBy30kbll_7u6CanFm6X4VyJxCpejd7jKNw6cCTFP1sfhWg5NVJ5EUTkPwE66M',
'dq' => 'Swz1-m_vmTFN_pu1bK7vF7S5nNVrL4A0OFiEsGliCmuJWzOKdL14DiYxctvnw3H6qT2dKZZfV2tbse5N9-JecdldUjfuqAoLIe7dD7dKi42YOlTC9QXmqvTh1ohnJu8pmRFXEZQGUm_BVhoIb2_WPkjav6YSkguCUHt4HRd2YwE',
'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os',
]);
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new Algorithm\PS256()])
);
$serializer = new CompactSerializer(
);
$jws = $jwsBuilder
->create()->withPayload('Live long and Prosper.')
->addSignature(
$key,
[
'alg' => 'PS256',
'jwk' => [
'kty' => 'RSA',
'key_ops' => ['verify'],
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
],
]
)
->build()
;
$jws = $serializer->serialize($jws, 0);
$result = $serializer->unserialize($jws);
static::assertEquals('Live long and Prosper.', $result->getPayload());
static::assertEquals(1, $result->countSignatures());
static::assertEquals('PS256', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
}
/**
* @test
*/
public function completePS384Sign(): void
{
$key = new JWK([
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
'p' => '5BGU1c7af_5sFyfsa-onIJgo5BZu8uHvz3Uyb8OA0a-G9UPO1ShLYjX0wUfhZcFB7fwPtgmmYAN6wKGVce9eMAbX4PliPk3r-BcpZuPKkuLk_wFvgWAQ5Hqw2iEuwXLV0_e8c2gaUt_hyMC5-nFc4v0Bmv6NT6Pfry-UrK3BKWc',
'd' => 'Kp0KuZwCZGL1BLgsVM-N0edMNitl9wN5Hf2WOYDoIqOZNAEKzdJuenIMhITJjRFUX05GVL138uyp2js_pqDdY9ipA7rAKThwGuDdNphZHech9ih3DGEPXs-YpmHqvIbCd3GoGm38MKwxYkddEpFnjo8rKna1_BpJthrFxjDRhw9DxJBycOdH2yWTyp62ZENPvneK40H2a57W4QScTgfecZqD59m2fGUaWaX5uUmIxaEmtGoJnd9RE4oywKhgN7_TK7wXRlqA4UoRPiH2ACrdU-_cLQL9Jc0u0GqZJK31LDbOeN95QgtSCc72k3Vtzy3CrVpp5TAA67s1Gj9Skn-CAQ',
'q' => 'zPD-B-nrngwF-O99BHvb47XGKR7ON8JCI6JxavzIkusMXCB8rMyYW8zLs68L8JLAzWZ34oMq0FPUnysBxc5nTF8Nb4BZxTZ5-9cHfoKrYTI3YWsmVW2FpCJFEjMs4NXZ28PBkS9b4zjfS2KhNdkmCeOYU0tJpNfwmOTI90qeUdU',
'dp' => 'aJrzw_kjWK9uDlTeaES2e4muv6bWbopYfrPHVWG7NPGoGdhnBnd70-jhgMEiTZSNU8VXw2u7prAR3kZ-kAp1DdwlqedYOzFsOJcPA0UZhbORyrBy30kbll_7u6CanFm6X4VyJxCpejd7jKNw6cCTFP1sfhWg5NVJ5EUTkPwE66M',
'dq' => 'Swz1-m_vmTFN_pu1bK7vF7S5nNVrL4A0OFiEsGliCmuJWzOKdL14DiYxctvnw3H6qT2dKZZfV2tbse5N9-JecdldUjfuqAoLIe7dD7dKi42YOlTC9QXmqvTh1ohnJu8pmRFXEZQGUm_BVhoIb2_WPkjav6YSkguCUHt4HRd2YwE',
'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os',
]);
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new Algorithm\PS384()])
);
$serializer = new CompactSerializer(
);
$jws = $jwsBuilder
->create()->withPayload('Live long and Prosper.')
->addSignature(
$key,
[
'alg' => 'PS384',
'jwk' => [
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
],
]
)
->build()
;
$jws = $serializer->serialize($jws, 0);
$result = $serializer->unserialize($jws);
static::assertEquals('Live long and Prosper.', $result->getPayload());
static::assertEquals(1, $result->countSignatures());
static::assertEquals('PS384', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
}
/**
* @test
*/
public function completePS512Sign(): void
{
$key = new JWK([
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
'p' => '5BGU1c7af_5sFyfsa-onIJgo5BZu8uHvz3Uyb8OA0a-G9UPO1ShLYjX0wUfhZcFB7fwPtgmmYAN6wKGVce9eMAbX4PliPk3r-BcpZuPKkuLk_wFvgWAQ5Hqw2iEuwXLV0_e8c2gaUt_hyMC5-nFc4v0Bmv6NT6Pfry-UrK3BKWc',
'd' => 'Kp0KuZwCZGL1BLgsVM-N0edMNitl9wN5Hf2WOYDoIqOZNAEKzdJuenIMhITJjRFUX05GVL138uyp2js_pqDdY9ipA7rAKThwGuDdNphZHech9ih3DGEPXs-YpmHqvIbCd3GoGm38MKwxYkddEpFnjo8rKna1_BpJthrFxjDRhw9DxJBycOdH2yWTyp62ZENPvneK40H2a57W4QScTgfecZqD59m2fGUaWaX5uUmIxaEmtGoJnd9RE4oywKhgN7_TK7wXRlqA4UoRPiH2ACrdU-_cLQL9Jc0u0GqZJK31LDbOeN95QgtSCc72k3Vtzy3CrVpp5TAA67s1Gj9Skn-CAQ',
'q' => 'zPD-B-nrngwF-O99BHvb47XGKR7ON8JCI6JxavzIkusMXCB8rMyYW8zLs68L8JLAzWZ34oMq0FPUnysBxc5nTF8Nb4BZxTZ5-9cHfoKrYTI3YWsmVW2FpCJFEjMs4NXZ28PBkS9b4zjfS2KhNdkmCeOYU0tJpNfwmOTI90qeUdU',
'dp' => 'aJrzw_kjWK9uDlTeaES2e4muv6bWbopYfrPHVWG7NPGoGdhnBnd70-jhgMEiTZSNU8VXw2u7prAR3kZ-kAp1DdwlqedYOzFsOJcPA0UZhbORyrBy30kbll_7u6CanFm6X4VyJxCpejd7jKNw6cCTFP1sfhWg5NVJ5EUTkPwE66M',
'dq' => 'Swz1-m_vmTFN_pu1bK7vF7S5nNVrL4A0OFiEsGliCmuJWzOKdL14DiYxctvnw3H6qT2dKZZfV2tbse5N9-JecdldUjfuqAoLIe7dD7dKi42YOlTC9QXmqvTh1ohnJu8pmRFXEZQGUm_BVhoIb2_WPkjav6YSkguCUHt4HRd2YwE',
'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os',
]);
$jwsBuilder = new JWSBuilder(
new AlgorithmManager([new Algorithm\PS512()])
);
$serializer = new CompactSerializer(
);
$jws = $jwsBuilder
->create()->withPayload('Live long and Prosper.')
->addSignature(
$key,
[
'alg' => 'PS512',
'jwk' => [
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
],
]
)
->build()
;
$jws = $serializer->serialize($jws, 0);
$result = $serializer->unserialize($jws);
static::assertEquals('Live long and Prosper.', $result->getPayload());
static::assertEquals(1, $result->countSignatures());
static::assertEquals('PS512', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
}
/**
* @see https://tools.ietf.org/html/rfc7516#appendix-A.4
*
* @test
*/
public function loadJWSJSONSerialization(): void
{
$serializer = new JSONGeneralSerializer(
);
$result = $serializer->unserialize('{"payload":"eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ","signatures":[{"protected":"eyJhbGciOiJSUzI1NiJ9","header":{"kid":"2010-12-29"},"signature":"cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw"},{"protected":"eyJhbGciOiJFUzI1NiJ9","header":{"kid":"e9bc097a-ce51-4036-9562-d2ade882db0d"},"signature":"DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"}]}');
$claims = json_decode($result->getPayload(), true);
static::assertEquals(['iss' => 'joe', 'exp' => 1300819380, 'http://example.com/is_root' => true], $claims);
static::assertEquals(2, $result->countSignatures());
static::assertEquals('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
static::assertEquals('ES256', $result->getSignature(1)->getProtectedHeaderParameter('alg'));
}
/**
* @see https://tools.ietf.org/html/rfc7516#appendix-A.4
*
* @test
*/
public function loadJWSJSONSerializationWithDetachedPayload(): void
{
$jwsVerifier = new JWSVerifier(
new AlgorithmManager([new Algorithm\RS256()])
);
$serializer = new JSONGeneralSerializer(
);
$result = $serializer->unserialize('{"signatures":[{"protected":"eyJhbGciOiJSUzI1NiJ9","header":{"kid":"2010-12-29"},"signature":"cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw"},{"protected":"eyJhbGciOiJFUzI1NiJ9","header":{"kid":"e9bc097a-ce51-4036-9562-d2ade882db0d"},"signature":"DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"}]}');
static::assertEquals(2, $result->countSignatures());
static::assertEquals('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
static::assertEquals('ES256', $result->getSignature(1)->getProtectedHeaderParameter('alg'));
$jwsVerifier->verifyWithKeySet($result, $this->getPrivateKeySet(), 0, Base64Url::decode('eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ'));
}
/**
* @test
*/
public function loadJWSJSONSerializationWithDetachedPayloadAndPayloadInJWS(): void
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('A detached payload is set, but the JWS already has a payload');
$jwsVerifier = new JWSVerifier(
new AlgorithmManager([new Algorithm\RS256()])
);
$serializer = new JSONGeneralSerializer(
);
$result = $serializer->unserialize('{"payload":"eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ","signatures":[{"protected":"eyJhbGciOiJSUzI1NiJ9","header":{"kid":"2010-12-29"},"signature":"cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw"},{"protected":"eyJhbGciOiJFUzI1NiJ9","header":{"kid":"e9bc097a-ce51-4036-9562-d2ade882db0d"},"signature":"DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"}]}');
static::assertEquals(2, $result->countSignatures());
static::assertEquals('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
$jwsVerifier->verifyWithKeySet($result, $this->getPrivateKeySet(), 0, 'eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ');
}
/**
* @test
*/
public function loadInvalidInput(): void
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Unsupported input');
$serializer = new CompactSerializer(
);
$serializer->unserialize('DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q');
}
/**
* @test
*/
public function loadInvalidInput2(): void
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Unsupported input');
$serializer = new CompactSerializer(
);
$serializer->unserialize('DtEhU3ljb.Eg8L.38VWAf.UAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q');
}
/**
* @see https://tools.ietf.org/html/rfc7515#appendix-A.1
*
* @test
*/
public function loadIETFExample1(): void
{
$serializer = new CompactSerializer(
);
$result = $serializer->unserialize('eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk');
static::assertEquals(['iss' => 'joe', 'exp' => 1300819380, 'http://example.com/is_root' => true], json_decode($result->getPayload(), true));
static::assertEquals(1, $result->countSignatures());
static::assertEquals('HS256', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
}
/**
* @see https://tools.ietf.org/html/rfc7515#appendix-A.2
*
* @test
*/
public function loadIETFExample2(): void
{
$serializer = new CompactSerializer(
);
$result = $serializer->unserialize('eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw');
static::assertEquals(['iss' => 'joe', 'exp' => 1300819380, 'http://example.com/is_root' => true], json_decode($result->getPayload(), true));
static::assertEquals(1, $result->countSignatures());
static::assertEquals('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
}
/**
* @see https://tools.ietf.org/html/rfc7515#appendix-A.3
*
* @test
*/
public function loadIETFExample3(): void
{
$serializer = new CompactSerializer(
);
$result = $serializer->unserialize('eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q');
static::assertEquals(['iss' => 'joe', 'exp' => 1300819380, 'http://example.com/is_root' => true], json_decode($result->getPayload(), true));
static::assertEquals(1, $result->countSignatures());
static::assertEquals('ES256', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
}
/**
* @see https://tools.ietf.org/html/rfc7515#appendix-A.4
*
* @test
*/
public function loadIETFExample4(): void
{
$serializer = new CompactSerializer(
);
$result = $serializer->unserialize('eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA.AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn');
static::assertEquals('Payload', $result->getPayload());
static::assertEquals(1, $result->countSignatures());
static::assertEquals('ES512', $result->getSignature(0)->getProtectedHeaderParameter('alg'));
}
private function getPrivateKeySet(): JWKSet
{
$keys = ['keys' => [
[
'kty' => 'EC',
'crv' => 'P-256',
'x' => 'weNJy2HscCSM6AEDTDg04biOvhFhyyWvOHQfeF_PxMQ',
'y' => 'e8lnCO-AlStT-NJVX-crhB7QRYhiix03illJOVAOyck',
'd' => 'VEmDZpDXXK8p8N0Cndsxs924q6nS1RXFASRl6BfUqdw',
],
[
'kty' => 'EC',
'crv' => 'P-256',
'x' => 'gI0GAILBdu7T53akrFmMyGcsF3n5dO7MmwNBHKW5SV0',
'y' => 'SLW_xSffzlPWrHEVI30DHM_4egVwt3NQqeUD7nMFpps',
'd' => '0_NxaRPUMQoAJt50Gz8YiTr8gRTwyEaCumd-MToTmIo',
],
[
'kid' => '2010-12-29',
'kty' => 'RSA',
'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ',
'e' => 'AQAB',
'd' => 'Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ',
],
[
'kid' => 'e9bc097a-ce51-4036-9562-d2ade882db0d',
'kty' => 'EC',
'crv' => 'P-256',
'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
],
[
'kid' => '123456789',
'kty' => 'RSA',
'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw',
'e' => 'AQAB',
'p' => '5BGU1c7af_5sFyfsa-onIJgo5BZu8uHvz3Uyb8OA0a-G9UPO1ShLYjX0wUfhZcFB7fwPtgmmYAN6wKGVce9eMAbX4PliPk3r-BcpZuPKkuLk_wFvgWAQ5Hqw2iEuwXLV0_e8c2gaUt_hyMC5-nFc4v0Bmv6NT6Pfry-UrK3BKWc',
'd' => 'Kp0KuZwCZGL1BLgsVM-N0edMNitl9wN5Hf2WOYDoIqOZNAEKzdJuenIMhITJjRFUX05GVL138uyp2js_pqDdY9ipA7rAKThwGuDdNphZHech9ih3DGEPXs-YpmHqvIbCd3GoGm38MKwxYkddEpFnjo8rKna1_BpJthrFxjDRhw9DxJBycOdH2yWTyp62ZENPvneK40H2a57W4QScTgfecZqD59m2fGUaWaX5uUmIxaEmtGoJnd9RE4oywKhgN7_TK7wXRlqA4UoRPiH2ACrdU-_cLQL9Jc0u0GqZJK31LDbOeN95QgtSCc72k3Vtzy3CrVpp5TAA67s1Gj9Skn-CAQ',
'q' => 'zPD-B-nrngwF-O99BHvb47XGKR7ON8JCI6JxavzIkusMXCB8rMyYW8zLs68L8JLAzWZ34oMq0FPUnysBxc5nTF8Nb4BZxTZ5-9cHfoKrYTI3YWsmVW2FpCJFEjMs4NXZ28PBkS9b4zjfS2KhNdkmCeOYU0tJpNfwmOTI90qeUdU',
'dp' => 'aJrzw_kjWK9uDlTeaES2e4muv6bWbopYfrPHVWG7NPGoGdhnBnd70-jhgMEiTZSNU8VXw2u7prAR3kZ-kAp1DdwlqedYOzFsOJcPA0UZhbORyrBy30kbll_7u6CanFm6X4VyJxCpejd7jKNw6cCTFP1sfhWg5NVJ5EUTkPwE66M',
'dq' => 'Swz1-m_vmTFN_pu1bK7vF7S5nNVrL4A0OFiEsGliCmuJWzOKdL14DiYxctvnw3H6qT2dKZZfV2tbse5N9-JecdldUjfuqAoLIe7dD7dKi42YOlTC9QXmqvTh1ohnJu8pmRFXEZQGUm_BVhoIb2_WPkjav6YSkguCUHt4HRd2YwE',
'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os',
],
[
'kty' => 'RSA',
'n' => 'oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3Spsk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMStPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw',
'e' => 'AQAB',
'd' => 'kLdtIj6GbDks_ApCSTYQtelcNttlKiOyPzMrXHeI-yk1F7-kpDxY4-WY5NWV5KntaEeXS1j82E375xxhWMHXyvjYecPT9fpwR_M9gV8n9Hrh2anTpTD93Dt62ypW3yDsJzBnTnrYu1iwWRgBKrEYY46qAZIrA2xAwnm2X7uGR1hghkqDp0Vqj3kbSCz1XyfCs6_LehBwtxHIyh8Ripy40p24moOAbgxVw3rxT_vlt3UVe4WO3JkJOzlpUf-KTVI2Ptgm-dARxTEtE-id-4OJr0h-K-VFs3VSndVTIznSxfyrj8ILL6MG_Uv8YAu7VILSB3lOW085-4qE3DzgrTjgyQ',
'p' => '1r52Xk46c-LsfB5P442p7atdPUrxQSy4mti_tZI3Mgf2EuFVbUoDBvaRQ-SWxkbkmoEzL7JXroSBjSrK3YIQgYdMgyAEPTPjXv_hI2_1eTSPVZfzL0lffNn03IXqWF5MDFuoUYE0hzb2vhrlN_rKrbfDIwUbTrjjgieRbwC6Cl0',
'q' => 'wLb35x7hmQWZsWJmB_vle87ihgZ19S8lBEROLIsZG4ayZVe9Hi9gDVCOBmUDdaDYVTSNx_8Fyw1YYa9XGrGnDew00J28cRUoeBB_jKI1oma0Orv1T9aXIWxKwd4gvxFImOWr3QRL9KEBRzk2RatUBnmDZJTIAfwTs0g68UZHvtc',
'dp' => 'ZK-YwE7diUh0qR1tR7w8WHtolDx3MZ_OTowiFvgfeQ3SiresXjm9gZ5KLhMXvo-uz-KUJWDxS5pFQ_M0evdo1dKiRTjVw_x4NyqyXPM5nULPkcpU827rnpZzAJKpdhWAgqrXGKAECQH0Xt4taznjnd_zVpAmZZq60WPMBMfKcuE',
'dq' => 'Dq0gfgJ1DdFGXiLvQEZnuKEN0UUmsJBxkjydc3j4ZYdBiMRAy86x0vHCjywcMlYYg4yoC4YZa9hNVcsjqA3FeiL19rk8g6Qn29Tt0cj8qqyFpz9vNDBUfCAiJVeESOjJDZPYHdHY8v1b-o-Z2X5tvLx-TCekf7oxyeKDUqKWjis',
'qi' => 'VIMpMYbPf47dT1w_zDUXfPimsSegnMOA1zTaX7aGk_8urY6R8-ZW1FxU7AlWAyLWybqq6t16VFd7hQd0y6flUK4SlOydB61gwanOsXGOAOv82cHq0E3eL4HrtZkUuKvnPrMnsUUFlfUdybVzxyjz9JF_XyaY14ardLSjf4L_FNY',
],
[
'kty' => 'RSA',
'n' => 'sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1WlUzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDprecbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBIY2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw',
'e' => 'AQAB',
'd' => 'VFCWOqXr8nvZNyaaJLXdnNPXZKRaWCjkU5Q2egQQpTBMwhprMzWzpR8Sxq1OPThh_J6MUD8Z35wky9b8eEO0pwNS8xlh1lOFRRBoNqDIKVOku0aZb-rynq8cxjDTLZQ6Fz7jSjR1Klop-YKaUHc9GsEofQqYruPhzSA-QgajZGPbE_0ZaVDJHfyd7UUBUKunFMScbflYAAOYJqVIVwaYR5zWEEceUjNnTNo_CVSj-VvXLO5VZfCUAVLgW4dpf1SrtZjSt34YLsRarSb127reG_DUwg9Ch-KyvjT1SkHgUWRVGcyly7uvVGRSDwsXypdrNinPA4jlhoNdizK2zF2CWQ',
'p' => '9gY2w6I6S6L0juEKsbeDAwpd9WMfgqFoeA9vEyEUuk4kLwBKcoe1x4HG68ik918hdDSE9vDQSccA3xXHOAFOPJ8R9EeIAbTi1VwBYnbTp87X-xcPWlEPkrdoUKW60tgs1aNd_Nnc9LEVVPMS390zbFxt8TN_biaBgelNgbC95sM',
'q' => 'uKlCKvKv_ZJMVcdIs5vVSU_6cPtYI1ljWytExV_skstvRSNi9r66jdd9-yBhVfuG4shsp2j7rGnIio901RBeHo6TPKWVVykPu1iYhQXw1jIABfw-MVsN-3bQ76WLdt2SDxsHs7q7zPyUyHXmps7ycZ5c72wGkUwNOjYelmkiNS0',
'dp' => 'w0kZbV63cVRvVX6yk3C8cMxo2qCM4Y8nsq1lmMSYhG4EcL6FWbX5h9yuvngs4iLEFk6eALoUS4vIWEwcL4txw9LsWH_zKI-hwoReoP77cOdSL4AVcraHawlkpyd2TWjE5evgbhWtOxnZee3cXJBkAi64Ik6jZxbvk-RR3pEhnCs',
'dq' => 'o_8V14SezckO6CNLKs_btPdFiO9_kC1DsuUTd2LAfIIVeMZ7jn1Gus_Ff7B7IVx3p5KuBGOVF8L-qifLb6nQnLysgHDh132NDioZkhH7mI7hPG-PYE_odApKdnqECHWw0J-F0JWnUd6D2B_1TvF9mXA2Qx-iGYn8OVV1Bsmp6qU',
'qi' => 'eNho5yRBEBxhGBtQRww9QirZsB66TrfFReG_CcteI1aCneT0ELGhYlRlCtUkTRclIfuEPmNsNDPbLoLqqCVznFbvdB7x-Tl-m0l_eFTj2KiqwGqE9PZB9nNTwMVvH3VRRSLWACvPnSiwP8N5Usy-WRXS-V7TbpxIhvepTfE0NNo',
],
[
'kty' => 'RSA',
'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ',
'e' => 'AQAB',
'd' => 'Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ',
'p' => '4BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdiYrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPGBY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc',
'q' => 'uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxaewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc',
'dp' => 'BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3QCLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb34MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0',
'dq' => 'h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa7I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-kyNlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU',
'qi' => 'IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2oy26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLUW0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U',
],
[
'kty' => 'EC',
'crv' => 'P-521',
'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk',
'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2',
'd' => 'AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPAxerEzgdRhajnu0ferB0d53vM9mE15j2C',
],
]];
return JWKSet::createFromKeyData($keys);
}
}

View File

@@ -45,6 +45,7 @@ class RSA
switch ($mode) {
case self::SIGNATURE_PSS:
return self::signWithPSS($key, $message, $hash);
case self::SIGNATURE_PKCS1:
$result = openssl_sign($message, $signature, $key->toPEM(), $hash);
if (true !== $result) {
@@ -52,6 +53,7 @@ class RSA
}
return $signature;
default:
throw new InvalidArgumentException('Unsupported mode.');
}
@@ -91,8 +93,10 @@ class RSA
switch ($mode) {
case self::SIGNATURE_PSS:
return self::verifyWithPSS($key, $message, $signature, $hash);
case self::SIGNATURE_PKCS1:
return 1 === openssl_verify($message, $signature, $key->toPEM(), $hash);
default:
throw new InvalidArgumentException('Unsupported mode.');
}

View File

@@ -27,21 +27,5 @@
"suggest": {
"ext-gmp": "GMP or BCMath is highly recommended to improve the library performance",
"ext-bcmath": "GMP or BCMath is highly recommended to improve the library performance"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"extra": {
"branch-alias": {
"v1.0": "1.0.x-dev",
"v1.1": "1.1.x-dev",
"v1.2": "1.2.x-dev",
"v1.3": "1.3.x-dev",
"v2.0": "2.0.x-dev",
"v2.1": "2.1.x-dev"
}
},
"config": {
"sort-packages": true
}
}

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
backupGlobals="false"
backupStaticAttributes="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="true"
bootstrap="vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Test Suite">
<directory>./Tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">./</directory>
<exclude>
<directory>./vendor</directory>
<directory>./Tests</directory>
<directory suffix="Test.php">./src</directory>
</exclude>
</whitelist>
</filter>
</phpunit>