From d11503f69f94dc8c4dd3dda872bae8c51ad3ae41 Mon Sep 17 00:00:00 2001 From: Spomky Date: Thu, 14 Oct 2021 16:59:40 +0200 Subject: [PATCH 1/4] Preparation 3.0 --- composer.json | 2 +- .../DataCollector/JWECollector.php | 2 +- src/Component/Checker/AlgorithmChecker.php | 4 +- src/Component/Core/composer.json | 2 +- src/Component/Encryption/JWEBuilder.php | 107 +++++------------- .../KeyEncryption/PBES2/PBES2AESKW.php | 2 +- .../KeyEncryption/PBES2/PBES2HS512A256KW.php | 2 +- src/SignatureAlgorithm/RSA/RSA.php | 74 ------------ src/SignatureAlgorithm/RSA/Util/RSA.php | 50 -------- 9 files changed, 37 insertions(+), 208 deletions(-) delete mode 100644 src/SignatureAlgorithm/RSA/RSA.php diff --git a/composer.json b/composer.json index 030bdead..03da5a5a 100644 --- a/composer.json +++ b/composer.json @@ -58,7 +58,7 @@ } }, "require": { - "php": ">=7.2", + "php": ">=8.0", "ext-json": "*", "ext-mbstring": "*", "ext-openssl": "*", diff --git a/src/Bundle/JoseFramework/DataCollector/JWECollector.php b/src/Bundle/JoseFramework/DataCollector/JWECollector.php index 4642fa32..82b4099e 100644 --- a/src/Bundle/JoseFramework/DataCollector/JWECollector.php +++ b/src/Bundle/JoseFramework/DataCollector/JWECollector.php @@ -169,7 +169,7 @@ private function collectSupportedJWEBuilders(array &$data): void $data['jwe']['jwe_builders'] = []; foreach ($this->jweBuilders as $id => $jweBuilder) { $data['jwe']['jwe_builders'][$id] = [ - 'key_encryption_algorithms' => $jweBuilder->getKeyEncryptionAlgorithmManager()->list(), + 'key_encryption_algorithms' => $jweBuilder->getAlgorithmManager()->list(), 'content_encryption_algorithms' => $jweBuilder->getContentEncryptionAlgorithmManager()->list(), 'compression_methods' => $jweBuilder->getCompressionMethodManager()->list(), ]; diff --git a/src/Component/Checker/AlgorithmChecker.php b/src/Component/Checker/AlgorithmChecker.php index cdd4adfc..eb9df0c5 100644 --- a/src/Component/Checker/AlgorithmChecker.php +++ b/src/Component/Checker/AlgorithmChecker.php @@ -27,12 +27,12 @@ final class AlgorithmChecker implements HeaderChecker /** * @var bool */ - private $protectedHeader = false; + private bool $protectedHeader = false; /** * @var string[] */ - private $supportedAlgorithms; + private array $supportedAlgorithms; /** * @param string[] $supportedAlgorithms diff --git a/src/Component/Core/composer.json b/src/Component/Core/composer.json index 30bf70fa..fbe8e210 100644 --- a/src/Component/Core/composer.json +++ b/src/Component/Core/composer.json @@ -20,7 +20,7 @@ } }, "require": { - "php": ">=7.2", + "php": ">=8.0", "ext-json": "*", "ext-mbstring": "*", "brick/math": "^0.8.17|^0.9", diff --git a/src/Component/Encryption/JWEBuilder.php b/src/Component/Encryption/JWEBuilder.php index 6353b205..a4042b35 100644 --- a/src/Component/Encryption/JWEBuilder.php +++ b/src/Component/Encryption/JWEBuilder.php @@ -35,65 +35,19 @@ class JWEBuilder { - /** - * @var null|string - */ - protected $payload; - - /** - * @var null|string - */ - protected $aad; - - /** - * @var array - */ - protected $recipients = []; - - /** - * @var array - */ - protected $sharedProtectedHeader = []; - - /** - * @var array - */ - protected $sharedHeader = []; - - /** - * @var AlgorithmManager - */ - private $keyEncryptionAlgorithmManager; - - /** - * @var AlgorithmManager - */ - private $contentEncryptionAlgorithmManager; - - /** - * @var CompressionMethodManager - */ - private $compressionManager; - - /** - * @var null|CompressionMethod - */ - private $compressionMethod; - - /** - * @var null|ContentEncryptionAlgorithm - */ - private $contentEncryptionAlgorithm; - - /** - * @var null|string - */ - private $keyManagementMode; - - public function __construct(AlgorithmManager $keyEncryptionAlgorithmManager, AlgorithmManager $contentEncryptionAlgorithmManager, CompressionMethodManager $compressionManager) + protected ?string $payload; + protected ?string $aad; + protected array $recipients = []; + protected array $sharedProtectedHeader = []; + protected array $sharedHeader = []; + private AlgorithmManager $algorithmManager; + private CompressionMethodManager $compressionManager; + private ?CompressionMethod $compressionMethod; + private ?string $keyManagementMode; + + public function __construct(AlgorithmManager $keyEncryptionAlgorithmManager, CompressionMethodManager $compressionManager) { - $this->keyEncryptionAlgorithmManager = $keyEncryptionAlgorithmManager; - $this->contentEncryptionAlgorithmManager = $contentEncryptionAlgorithmManager; + $this->algorithmManager = $keyEncryptionAlgorithmManager; $this->compressionManager = $compressionManager; } @@ -110,7 +64,6 @@ public function create(): self $this->sharedProtectedHeader = []; $this->sharedHeader = []; $this->compressionMethod = null; - $this->contentEncryptionAlgorithm = null; $this->keyManagementMode = null; return $this; @@ -119,9 +72,9 @@ public function create(): self /** * Returns the key encryption algorithm manager. */ - public function getKeyEncryptionAlgorithmManager(): AlgorithmManager + public function getAlgorithmManager(): AlgorithmManager { - return $this->keyEncryptionAlgorithmManager; + return $this->algorithmManager; } /** @@ -129,7 +82,7 @@ public function getKeyEncryptionAlgorithmManager(): AlgorithmManager */ public function getContentEncryptionAlgorithmManager(): AlgorithmManager { - return $this->contentEncryptionAlgorithmManager; + return $this->algorithmManager; } /** @@ -292,9 +245,9 @@ public function build(): JWE private function checkAndSetContentEncryptionAlgorithm(array $completeHeader): void { $contentEncryptionAlgorithm = $this->getContentEncryptionAlgorithm($completeHeader); - if (null === $this->contentEncryptionAlgorithm) { - $this->contentEncryptionAlgorithm = $contentEncryptionAlgorithm; - } elseif ($contentEncryptionAlgorithm->name() !== $this->contentEncryptionAlgorithm->name()) { + if (null === $this->algorithm) { + $this->algorithm = $contentEncryptionAlgorithm; + } elseif ($contentEncryptionAlgorithm->name() !== $this->algorithm->name()) { throw new InvalidArgumentException('Inconsistent content encryption algorithm'); } } @@ -324,14 +277,14 @@ private function processRecipient(array $recipient, string $cek, array &$additio */ private function encryptJWE(string $cek, string $encodedSharedProtectedHeader): array { - if (!$this->contentEncryptionAlgorithm instanceof ContentEncryptionAlgorithm) { + if (!$this->algorithm instanceof ContentEncryptionAlgorithm) { throw new InvalidArgumentException('The content encryption algorithm is not valid'); } - $iv_size = $this->contentEncryptionAlgorithm->getIVSize(); + $iv_size = $this->algorithm->getIVSize(); $iv = $this->createIV($iv_size); $payload = $this->preparePayload(); $tag = null; - $ciphertext = $this->contentEncryptionAlgorithm->encryptContent($payload, $cek, $iv, $this->aad, $encodedSharedProtectedHeader, $tag); + $ciphertext = $this->algorithm->encryptContent($payload, $cek, $iv, $this->aad, $encodedSharedProtectedHeader, $tag); return [$ciphertext, $iv, $tag]; } @@ -378,11 +331,11 @@ private function getEncryptedKey(array $completeHeader, string $cek, KeyEncrypti */ private function getEncryptedKeyFromKeyAgreementAndKeyWrappingAlgorithm(array $completeHeader, string $cek, KeyAgreementWithKeyWrapping $keyEncryptionAlgorithm, array &$additionalHeader, JWK $recipientKey, ?JWK $senderKey): string { - if (null === $this->contentEncryptionAlgorithm) { + if (null === $this->algorithm) { throw new InvalidArgumentException('Invalid content encryption algorithm'); } - return $keyEncryptionAlgorithm->wrapAgreementKey($recipientKey, $senderKey, $cek, $this->contentEncryptionAlgorithm->getCEKSize(), $completeHeader, $additionalHeader); + return $keyEncryptionAlgorithm->wrapAgreementKey($recipientKey, $senderKey, $cek, $this->algorithm->getCEKSize(), $completeHeader, $additionalHeader); } private function getEncryptedKeyFromKeyEncryptionAlgorithm(array $completeHeader, string $cek, KeyEncryption $keyEncryptionAlgorithm, JWK $recipientKey, array &$additionalHeader): string @@ -402,7 +355,7 @@ private function getEncryptedKeyFromKeyWrappingAlgorithm(array $completeHeader, */ private function checkKey(KeyEncryptionAlgorithm $keyEncryptionAlgorithm, JWK $recipientKey): void { - if (null === $this->contentEncryptionAlgorithm) { + if (null === $this->algorithm) { throw new InvalidArgumentException('Invalid content encryption algorithm'); } @@ -410,20 +363,20 @@ private function checkKey(KeyEncryptionAlgorithm $keyEncryptionAlgorithm, JWK $r if ('dir' !== $keyEncryptionAlgorithm->name()) { KeyChecker::checkKeyAlgorithm($recipientKey, $keyEncryptionAlgorithm->name()); } else { - KeyChecker::checkKeyAlgorithm($recipientKey, $this->contentEncryptionAlgorithm->name()); + KeyChecker::checkKeyAlgorithm($recipientKey, $this->algorithm->name()); } } private function determineCEK(array &$additionalHeader): string { - if (null === $this->contentEncryptionAlgorithm) { + if (null === $this->algorithm) { throw new InvalidArgumentException('Invalid content encryption algorithm'); } switch ($this->keyManagementMode) { case KeyEncryption::MODE_ENCRYPT: case KeyEncryption::MODE_WRAP: - return $this->createCEK($this->contentEncryptionAlgorithm->getCEKSize()); + return $this->createCEK($this->algorithm->getCEKSize()); case KeyEncryption::MODE_AGREEMENT: if (1 !== count($this->recipients)) { @@ -437,7 +390,7 @@ private function determineCEK(array &$additionalHeader): string } $completeHeader = array_merge($this->sharedHeader, $this->recipients[0]['header'], $this->sharedProtectedHeader); - return $algorithm->getAgreementKey($this->contentEncryptionAlgorithm->getCEKSize(), $this->contentEncryptionAlgorithm->name(), $recipientKey, $senderKey, $completeHeader, $additionalHeader); + return $algorithm->getAgreementKey($this->algorithm->getCEKSize(), $this->algorithm->name(), $recipientKey, $senderKey, $completeHeader, $additionalHeader); case KeyEncryption::MODE_DIRECT: if (1 !== count($this->recipients)) { @@ -499,7 +452,7 @@ private function getKeyEncryptionAlgorithm(array $completeHeader): KeyEncryption if (!isset($completeHeader['alg'])) { throw new InvalidArgumentException('Parameter "alg" is missing.'); } - $keyEncryptionAlgorithm = $this->keyEncryptionAlgorithmManager->get($completeHeader['alg']); + $keyEncryptionAlgorithm = $this->algorithmManager->get($completeHeader['alg']); if (!$keyEncryptionAlgorithm instanceof KeyEncryptionAlgorithm) { throw new InvalidArgumentException(sprintf('The key encryption algorithm "%s" is not supported or not a key encryption algorithm instance.', $completeHeader['alg'])); } @@ -516,7 +469,7 @@ private function getContentEncryptionAlgorithm(array $completeHeader): ContentEn if (!isset($completeHeader['enc'])) { throw new InvalidArgumentException('Parameter "enc" is missing.'); } - $contentEncryptionAlgorithm = $this->contentEncryptionAlgorithmManager->get($completeHeader['enc']); + $contentEncryptionAlgorithm = $this->algorithmManager->get($completeHeader['enc']); if (!$contentEncryptionAlgorithm instanceof ContentEncryptionAlgorithm) { throw new InvalidArgumentException(sprintf('The content encryption algorithm "%s" is not supported or not a content encryption algorithm instance.', $completeHeader['enc'])); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2AESKW.php b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2AESKW.php index 56e51a45..01086e05 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2AESKW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2AESKW.php @@ -138,7 +138,7 @@ protected function checkHeaderAdditionalParameters(array $header): void /** * @return \AESKW\A128KW|\AESKW\A192KW|\AESKW\A256KW */ - abstract protected function getWrapper(); + abstract protected function getWrapper(): \AESKW\A256KW|\AESKW\A128KW|\AESKW\A192KW; abstract protected function getHashAlgorithm(): string; diff --git a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS512A256KW.php b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS512A256KW.php index f6cad868..1830a4e3 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS512A256KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS512A256KW.php @@ -22,7 +22,7 @@ public function name(): string return 'PBES2-HS512+A256KW'; } - protected function getWrapper() + protected function getWrapper(): Wrapper { return new Wrapper(); } diff --git a/src/SignatureAlgorithm/RSA/RSA.php b/src/SignatureAlgorithm/RSA/RSA.php deleted file mode 100644 index 7890686b..00000000 --- a/src/SignatureAlgorithm/RSA/RSA.php +++ /dev/null @@ -1,74 +0,0 @@ -checkKey($key); - $pub = RSAKey::createFromJWK($key->toPublic()); - - return JoseRSA::verify($pub, $input, $signature, $this->getAlgorithm(), $this->getSignatureMethod()); - } - - /** - * @throws InvalidArgumentException if the key is not private - */ - public function sign(JWK $key, string $input): string - { - $this->checkKey($key); - if (!$key->has('d')) { - throw new InvalidArgumentException('The key is not a private key.'); - } - - $priv = RSAKey::createFromJWK($key); - - return JoseRSA::sign($priv, $input, $this->getAlgorithm(), $this->getSignatureMethod()); - } - - abstract protected function getAlgorithm(): string; - - abstract protected function getSignatureMethod(): int; - - /** - * @throws InvalidArgumentException if the key type is not allowed - * @throws InvalidArgumentException if the key is invalid - */ - private function checkKey(JWK $key): void - { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { - throw new InvalidArgumentException('Wrong key type.'); - } - foreach (['n', 'e'] as $k) { - if (!$key->has($k)) { - throw new InvalidArgumentException(sprintf('The key parameter "%s" is missing.', $k)); - } - } - } -} diff --git a/src/SignatureAlgorithm/RSA/Util/RSA.php b/src/SignatureAlgorithm/RSA/Util/RSA.php index b0f7e313..735be1dd 100644 --- a/src/SignatureAlgorithm/RSA/Util/RSA.php +++ b/src/SignatureAlgorithm/RSA/Util/RSA.php @@ -71,20 +71,6 @@ public static function signWithPSS(RSAKey $key, string $message, string $hash): return self::convertIntegerToOctetString($signature, $key->getModulusLength()); } - /** - * Create a signature. - * - * @deprecated Please use openssl_sign - */ - public static function signWithPKCS15(RSAKey $key, string $message, string $hash): string - { - $em = self::encodeEMSA15($message, $key->getModulusLength(), Hash::$hash()); - $message = BigInteger::createFromBinaryString($em); - $signature = RSAKey::exponentiate($key, $message); - - return self::convertIntegerToOctetString($signature, $key->getModulusLength()); - } - /** * @throws InvalidArgumentException if the signature mode is not supported */ @@ -120,25 +106,6 @@ public static function verifyWithPSS(RSAKey $key, string $message, string $signa return self::verifyEMSAPSS($message, $em, $modBits - 1, Hash::$hash()); } - /** - * Verifies a signature. - * - * @deprecated Please use openssl_sign - * - * @throws RuntimeException if the signature cannot be verified - */ - public static function verifyWithPKCS15(RSAKey $key, string $message, string $signature, string $hash): bool - { - if (mb_strlen($signature, '8bit') !== $key->getModulusLength()) { - throw new RuntimeException(); - } - $signature = BigInteger::createFromBinaryString($signature); - $m2 = RSAKey::exponentiate($key, $signature); - $em = self::convertIntegerToOctetString($m2, $key->getModulusLength()); - - return hash_equals($em, self::encodeEMSA15($message, $key->getModulusLength(), Hash::$hash())); - } - /** * @throws RuntimeException if the value cannot be converted */ @@ -231,21 +198,4 @@ private static function verifyEMSAPSS(string $m, string $em, int $emBits, Hash $ return hash_equals($h, $h2); } - - /** - * @throws RuntimeException if the value cannot be encoded - */ - private static function encodeEMSA15(string $m, int $emBits, Hash $hash): string - { - $h = $hash->hash($m); - $t = $hash->t(); - $t .= $h; - $tLen = mb_strlen($t, '8bit'); - if ($emBits < $tLen + 11) { - throw new RuntimeException(); - } - $ps = str_repeat(chr(0xFF), $emBits - $tLen - 3); - - return "\0\1{$ps}\0{$t}"; - } } From 3f0e14f4409420fcac85f487521c78c81f30f601 Mon Sep 17 00:00:00 2001 From: Spomky Date: Wed, 8 Dec 2021 13:38:19 +0100 Subject: [PATCH 2/4] Update with ECS and Rector --- .php_cs.dist | 80 -- composer.json | 33 +- performance/JWE/A128GCMKWBench.php | 53 +- performance/JWE/A128KWBench.php | 53 +- performance/JWE/A192GCMKWBench.php | 53 +- performance/JWE/A192KWBench.php | 53 +- performance/JWE/A256GCMKWBench.php | 53 +- performance/JWE/A256KWBench.php | 53 +- performance/JWE/ECDHESA128KWBench.php | 185 ++-- performance/JWE/ECDHESA192KWBench.php | 185 ++-- performance/JWE/ECDHESA256KWBench.php | 185 ++-- performance/JWE/ECDHESBench.php | 281 ++++-- performance/JWE/EncryptionBench.php | 16 +- performance/JWE/PBES2HS256A128KWBench.php | 53 +- performance/JWE/PBES2HS384A192KWBench.php | 53 +- performance/JWE/PBES2HS512A256KWBench.php | 53 +- performance/JWE/RSA1_5Bench.php | 175 ++-- performance/JWE/RSAOAEP256Bench.php | 175 ++-- performance/JWE/RSAOAEPBench.php | 175 ++-- performance/JWS/ES256Bench.php | 17 +- performance/JWS/ES384Bench.php | 17 +- performance/JWS/ES512Bench.php | 17 +- performance/JWS/EdDSABench.php | 17 +- performance/JWS/HS256Bench.php | 13 +- performance/JWS/HS384Bench.php | 13 +- performance/JWS/HS512Bench.php | 13 +- performance/JWS/NoneBench.php | 13 +- performance/JWS/PS256Bench.php | 17 +- performance/JWS/PS384Bench.php | 17 +- performance/JWS/PS512Bench.php | 17 +- performance/JWS/RS256Bench.php | 17 +- performance/JWS/RS384Bench.php | 17 +- performance/JWS/RS512Bench.php | 17 +- performance/JWS/SignatureBench.php | 15 +- .../Controller/JWKSetController.php | 20 +- .../Controller/JWKSetControllerFactory.php | 9 - .../DataCollector/AlgorithmCollector.php | 41 +- .../DataCollector/CheckerCollector.php | 55 +- .../JoseFramework/DataCollector/Collector.php | 9 - .../DataCollector/JWECollector.php | 90 +- .../DataCollector/JWSCollector.php | 61 +- .../DataCollector/JoseCollector.php | 16 +- .../DataCollector/KeyCollector.php | 37 +- .../Compiler/AlgorithmCompilerPass.php | 20 +- .../Compiler/CheckerCollectorCompilerPass.php | 19 +- .../Compiler/ClaimCheckerCompilerPass.php | 20 +- .../CompressionMethodCompilerPass.php | 20 +- .../Compiler/DataCollectorCompilerPass.php | 11 +- .../EncryptionSerializerCompilerPass.php | 11 +- .../EventDispatcherAliasCompilerPass.php | 11 +- .../Compiler/HeaderCheckerCompilerPass.php | 21 +- .../Compiler/JWECollectorCompilerPass.php | 19 +- .../Compiler/JWSCollectorCompilerPass.php | 19 +- .../Compiler/KeyAnalyzerCompilerPass.php | 11 +- .../Compiler/KeyCollectorCompilerPass.php | 19 +- .../Compiler/KeySetControllerCompilerPass.php | 20 +- .../Compiler/KeysetAnalyzerCompilerPass.php | 11 +- .../SignatureSerializerCompilerPass.php | 11 +- .../SymfonySerializerCompilerPass.php | 11 +- .../DependencyInjection/Configuration.php | 27 +- .../JoseFrameworkExtension.php | 29 +- .../Source/AbstractSource.php | 14 +- .../Source/Checker/CheckerSource.php | 37 +- .../Source/Checker/ClaimChecker.php | 22 +- .../Source/Checker/HeaderChecker.php | 22 +- .../Source/Console/ConsoleSource.php | 13 +- .../Source/Core/CoreSource.php | 32 +- .../Encryption/AbstractEncryptionSource.php | 21 +- .../Source/Encryption/EncryptionSource.php | 41 +- .../Source/Encryption/JWEBuilder.php | 11 +- .../Source/Encryption/JWEDecrypter.php | 11 +- .../Source/Encryption/JWELoader.php | 29 +- .../Source/Encryption/JWESerializer.php | 17 +- .../Source/KeyManagement/JKUSource.php | 13 +- .../Source/KeyManagement/JWKSetSource.php | 28 +- .../Source/KeyManagement/JWKSetSource/JKU.php | 22 +- .../KeyManagement/JWKSetSource/JWKSet.php | 18 +- .../JWKSetSource/JWKSetSource.php | 9 - .../Source/KeyManagement/JWKSetSource/X5U.php | 22 +- .../Source/KeyManagement/JWKSource.php | 30 +- .../JWKSource/CertificateFile.php | 25 +- .../Source/KeyManagement/JWKSource/JWK.php | 18 +- .../Source/KeyManagement/JWKSource/JWKSet.php | 20 +- .../KeyManagement/JWKSource/JWKSource.php | 9 - .../KeyManagement/JWKSource/KeyFile.php | 26 +- .../Source/KeyManagement/JWKSource/P12.php | 26 +- .../Source/KeyManagement/JWKSource/Secret.php | 25 +- .../Source/KeyManagement/JWKSource/Values.php | 24 +- .../Source/KeyManagement/JWKSource/X5C.php | 25 +- .../Source/KeyManagement/JWKUriSource.php | 22 +- .../KeyManagement/KeyManagementSource.php | 41 +- .../Source/NestedToken/NestedToken.php | 29 +- .../Source/NestedToken/NestedTokenBuilder.php | 32 +- .../Source/NestedToken/NestedTokenLoader.php | 38 +- .../Signature/AbstractSignatureSource.php | 15 +- .../Source/Signature/JWSBuilder.php | 11 +- .../Source/Signature/JWSLoader.php | 23 +- .../Source/Signature/JWSSerializer.php | 17 +- .../Source/Signature/JWSVerifier.php | 15 +- .../Source/Signature/SignatureSource.php | 43 +- .../DependencyInjection/Source/Source.php | 9 - .../Source/SourceWithCompilerPasses.php | 9 - .../EnvVarProcessor/KeyEnvVarProcessor.php | 28 +- .../Event/ClaimCheckedFailureEvent.php | 22 +- .../Event/ClaimCheckedSuccessEvent.php | 9 - .../Event/HeaderCheckedFailureEvent.php | 35 +- .../Event/HeaderCheckedSuccessEvent.php | 28 +- .../Event/JWEBuiltFailureEvent.php | 37 +- .../Event/JWEBuiltSuccessEvent.php | 20 +- .../Event/JWEDecryptionFailureEvent.php | 27 +- .../Event/JWEDecryptionSuccessEvent.php | 41 +- .../Event/JWELoadingFailureEvent.php | 34 +- .../Event/JWELoadingSuccessEvent.php | 41 +- .../Event/JWSBuiltFailureEvent.php | 41 +- .../Event/JWSBuiltSuccessEvent.php | 20 +- .../Event/JWSLoadingFailureEvent.php | 34 +- .../Event/JWSLoadingSuccessEvent.php | 41 +- .../Event/JWSVerificationFailureEvent.php | 34 +- .../Event/JWSVerificationSuccessEvent.php | 48 +- .../Event/NestedTokenIssuedEvent.php | 20 +- .../Event/NestedTokenLoadingFailureEvent.php | 41 +- .../Event/NestedTokenLoadingSuccessEvent.php | 48 +- .../Helper/ConfigurationHelper.php | 170 +++- .../JoseFramework/JoseFrameworkBundle.php | 35 +- .../Normalizer/JWENormalizer.php | 25 +- .../Normalizer/JWSNormalizer.php | 33 +- .../config/Algorithms/encryption_aescbc.php | 25 +- .../config/Algorithms/encryption_aesgcm.php | 25 +- .../config/Algorithms/encryption_aesgcmkw.php | 25 +- .../config/Algorithms/encryption_aeskw.php | 25 +- .../config/Algorithms/encryption_dir.php | 11 +- .../config/Algorithms/encryption_ecdhes.php | 32 +- .../Algorithms/encryption_experimental.php | 96 +- ...ryption_experimental_chacha20_poly1305.php | 11 +- .../config/Algorithms/encryption_pbes2.php | 25 +- .../config/Algorithms/encryption_rsa.php | 25 +- .../config/Algorithms/signature_ecdsa.php | 25 +- .../config/Algorithms/signature_eddsa.php | 11 +- .../Algorithms/signature_experimental.php | 32 +- .../config/Algorithms/signature_hmac.php | 25 +- .../config/Algorithms/signature_none.php | 11 +- .../config/Algorithms/signature_rsa.php | 46 +- .../Resources/config/analyzers.php | 54 +- .../Resources/config/checkers.php | 32 +- .../Resources/config/commands.php | 73 +- .../Resources/config/compression_methods.php | 14 +- .../Resources/config/dev_services.php | 22 +- .../Resources/config/env_var.php | 7 +- .../Resources/config/jku_commands.php | 10 +- .../Resources/config/jku_source.php | 28 +- .../Resources/config/jwe_serializers.php | 16 +- .../Resources/config/jwe_services.php | 17 +- .../Resources/config/jwk_factory.php | 12 +- .../Resources/config/jwk_services.php | 12 +- .../Resources/config/jwk_sources.php | 28 +- .../Resources/config/jwkset_sources.php | 13 +- .../Resources/config/jws_serializers.php | 16 +- .../Resources/config/jws_services.php | 17 +- .../Resources/config/nested_token.php | 10 +- .../config/routing/jwkset_controller.php | 9 - .../Resources/config/services.php | 12 +- .../JoseFramework/Routing/JWKSetLoader.php | 20 +- .../JoseFramework/Serializer/JWEEncoder.php | 36 +- .../JoseFramework/Serializer/JWSEncoder.php | 36 +- .../Services/ClaimCheckerManager.php | 25 +- .../Services/ClaimCheckerManagerFactory.php | 31 +- .../Services/HeaderCheckerManager.php | 25 +- .../Services/HeaderCheckerManagerFactory.php | 40 +- .../JoseFramework/Services/JWEBuilder.php | 25 +- .../Services/JWEBuilderFactory.php | 48 +- .../JoseFramework/Services/JWEDecrypter.php | 44 +- .../Services/JWEDecrypterFactory.php | 48 +- .../JoseFramework/Services/JWELoader.php | 36 +- .../Services/JWELoaderFactory.php | 58 +- .../JoseFramework/Services/JWSBuilder.php | 21 +- .../Services/JWSBuilderFactory.php | 27 +- .../JoseFramework/Services/JWSLoader.php | 44 +- .../Services/JWSLoaderFactory.php | 47 +- .../JoseFramework/Services/JWSVerifier.php | 36 +- .../Services/JWSVerifierFactory.php | 27 +- .../Services/NestedTokenBuilder.php | 47 +- .../Services/NestedTokenBuilderFactory.php | 72 +- .../Services/NestedTokenLoader.php | 22 +- .../Services/NestedTokenLoaderFactory.php | 54 +- src/Bundle/JoseFramework/composer.json | 8 +- src/Component/Checker/AlgorithmChecker.php | 35 +- src/Component/Checker/AudienceChecker.php | 41 +- src/Component/Checker/ClaimChecker.php | 17 +- src/Component/Checker/ClaimCheckerManager.php | 32 +- .../Checker/ClaimCheckerManagerFactory.php | 20 +- .../Checker/ClaimExceptionInterface.php | 9 - .../Checker/ExpirationTimeChecker.php | 40 +- src/Component/Checker/HeaderChecker.php | 17 +- .../Checker/HeaderCheckerManager.php | 76 +- .../Checker/HeaderCheckerManagerFactory.php | 29 +- .../Checker/InvalidClaimException.php | 34 +- .../Checker/InvalidHeaderException.php | 34 +- src/Component/Checker/IssuedAtChecker.php | 40 +- src/Component/Checker/IssuerChecker.php | 51 +- .../MissingMandatoryClaimException.php | 9 - ...ssingMandatoryHeaderParameterException.php | 9 - src/Component/Checker/NotBeforeChecker.php | 42 +- src/Component/Checker/TokenTypeSupport.php | 24 +- .../Checker/UnencodedPayloadChecker.php | 16 +- .../Console/AddKeyIntoKeysetCommand.php | 29 +- .../Console/EcKeyGeneratorCommand.php | 20 +- .../Console/EcKeysetGeneratorCommand.php | 23 +- src/Component/Console/GeneratorCommand.php | 23 +- .../Console/GetThumbprintCommand.php | 24 +- src/Component/Console/JKULoaderCommand.php | 30 +- src/Component/Console/KeyAnalyzerCommand.php | 54 +- .../Console/KeyFileLoaderCommand.php | 23 +- .../Console/KeysetAnalyzerCommand.php | 61 +- src/Component/Console/MergeKeysetCommand.php | 24 +- .../Console/NoneKeyGeneratorCommand.php | 17 +- src/Component/Console/ObjectOutputCommand.php | 9 - .../Console/OctKeyGeneratorCommand.php | 20 +- .../Console/OctKeysetGeneratorCommand.php | 23 +- .../Console/OkpKeyGeneratorCommand.php | 20 +- .../Console/OkpKeysetGeneratorCommand.php | 23 +- .../Console/OptimizeRsaKeyCommand.php | 22 +- .../Console/P12CertificateLoaderCommand.php | 23 +- src/Component/Console/PemConverterCommand.php | 42 +- src/Component/Console/PublicKeyCommand.php | 22 +- src/Component/Console/PublicKeysetCommand.php | 24 +- src/Component/Console/RotateKeysetCommand.php | 35 +- .../Console/RsaKeyGeneratorCommand.php | 20 +- .../Console/RsaKeysetGeneratorCommand.php | 23 +- .../Console/SecretKeyGeneratorCommand.php | 32 +- .../Console/X509CertificateLoaderCommand.php | 22 +- src/Component/Console/X5ULoaderCommand.php | 34 +- src/Component/Console/composer.json | 2 +- src/Component/Core/Algorithm.php | 9 - src/Component/Core/AlgorithmManager.php | 18 +- .../Core/AlgorithmManagerFactory.php | 28 +- src/Component/Core/JWK.php | 38 +- src/Component/Core/JWKSet.php | 139 +-- src/Component/Core/JWT.php | 12 +- src/Component/Core/Util/BigInteger.php | 84 +- src/Component/Core/Util/ECKey.php | 305 +++--- src/Component/Core/Util/ECSignature.php | 48 +- src/Component/Core/Util/Hash.php | 54 +- src/Component/Core/Util/JsonConverter.php | 23 +- src/Component/Core/Util/KeyChecker.php | 44 +- src/Component/Core/Util/RSAKey.php | 101 +- src/Component/Core/composer.json | 2 +- .../Algorithm/ContentEncryptionAlgorithm.php | 35 +- .../KeyEncryption/DirectEncryption.php | 9 - .../Algorithm/KeyEncryption/KeyAgreement.php | 18 +- .../KeyAgreementWithKeyWrapping.php | 26 +- .../Algorithm/KeyEncryption/KeyEncryption.php | 9 - .../Algorithm/KeyEncryption/KeyWrapping.php | 9 - .../Algorithm/KeyEncryptionAlgorithm.php | 9 - .../Compression/CompressionMethod.php | 15 +- .../Compression/CompressionMethodManager.php | 19 +- .../CompressionMethodManagerFactory.php | 27 +- .../Encryption/Compression/Deflate.php | 33 +- src/Component/Encryption/JWE.php | 95 +- src/Component/Encryption/JWEBuilder.php | 331 ++++--- .../Encryption/JWEBuilderFactory.php | 46 +- src/Component/Encryption/JWEDecrypter.php | 168 ++-- .../Encryption/JWEDecrypterFactory.php | 43 +- src/Component/Encryption/JWELoader.php | 53 +- src/Component/Encryption/JWELoaderFactory.php | 54 +- src/Component/Encryption/JWETokenSupport.php | 20 +- src/Component/Encryption/Recipient.php | 29 +- .../Serializer/CompactSerializer.php | 47 +- .../Serializer/JSONFlattenedSerializer.php | 30 +- .../Serializer/JSONGeneralSerializer.php | 37 +- .../Encryption/Serializer/JWESerializer.php | 17 +- .../Serializer/JWESerializerManager.php | 27 +- .../JWESerializerManagerFactory.php | 13 +- .../Analyzer/AlgorithmAnalyzer.php | 11 +- .../Analyzer/ES256KeyAnalyzer.php | 24 +- .../Analyzer/ES384KeyAnalyzer.php | 24 +- .../Analyzer/ES512KeyAnalyzer.php | 24 +- .../Analyzer/HS256KeyAnalyzer.php | 13 +- .../Analyzer/HS384KeyAnalyzer.php | 13 +- .../Analyzer/HS512KeyAnalyzer.php | 13 +- .../KeyManagement/Analyzer/KeyAnalyzer.php | 9 - .../Analyzer/KeyAnalyzerManager.php | 14 +- .../Analyzer/KeyIdentifierAnalyzer.php | 11 +- .../KeyManagement/Analyzer/KeysetAnalyzer.php | 9 - .../Analyzer/KeysetAnalyzerManager.php | 15 +- .../KeyManagement/Analyzer/Message.php | 35 +- .../KeyManagement/Analyzer/MessageBag.php | 9 - .../KeyManagement/Analyzer/MixedKeyTypes.php | 11 +- .../Analyzer/MixedPublicAndPrivateKeys.php | 11 +- .../KeyManagement/Analyzer/NoneAnalyzer.php | 17 +- .../KeyManagement/Analyzer/OctAnalyzer.php | 11 +- .../KeyManagement/Analyzer/RsaAnalyzer.php | 23 +- .../KeyManagement/Analyzer/UsageAnalyzer.php | 34 +- .../Analyzer/ZxcvbnKeyAnalyzer.php | 19 +- src/Component/KeyManagement/JKUFactory.php | 16 +- src/Component/KeyManagement/JWKFactory.php | 95 +- .../KeyManagement/KeyConverter/ECKey.php | 116 +-- .../KeyConverter/KeyConverter.php | 117 +-- .../KeyManagement/KeyConverter/RSAKey.php | 81 +- .../KeyManagement/UrlKeySetFactory.php | 37 +- src/Component/KeyManagement/X5UFactory.php | 21 +- .../NestedToken/NestedTokenBuilder.php | 77 +- .../NestedToken/NestedTokenBuilderFactory.php | 60 +- .../NestedToken/NestedTokenLoader.php | 69 +- .../NestedToken/NestedTokenLoaderFactory.php | 50 +- .../Signature/Algorithm/MacAlgorithm.php | 9 - .../Algorithm/SignatureAlgorithm.php | 9 - src/Component/Signature/JWS.php | 64 +- src/Component/Signature/JWSBuilder.php | 117 +-- src/Component/Signature/JWSBuilderFactory.php | 20 +- src/Component/Signature/JWSLoader.php | 63 +- src/Component/Signature/JWSLoaderFactory.php | 40 +- src/Component/Signature/JWSTokenSupport.php | 22 +- src/Component/Signature/JWSVerifier.php | 88 +- .../Signature/JWSVerifierFactory.php | 20 +- .../Serializer/CompactSerializer.php | 42 +- .../Serializer/JSONFlattenedSerializer.php | 38 +- .../Serializer/JSONGeneralSerializer.php | 47 +- .../Signature/Serializer/JWSSerializer.php | 9 - .../Serializer/JWSSerializerManager.php | 21 +- .../JWSSerializerManagerFactory.php | 13 +- .../Signature/Serializer/Serializer.php | 11 +- src/Component/Signature/Signature.php | 36 +- src/Easy/AbstractBuilder.php | 34 +- src/Easy/AbstractLoader.php | 134 ++- src/Easy/AlgorithmProvider.php | 15 +- src/Easy/Build.php | 9 - src/Easy/CallableChecker.php | 30 +- .../ContentEncryptionAlgorithmChecker.php | 37 +- src/Easy/Decrypt.php | 119 +-- src/Easy/JWEBuilder.php | 110 ++- src/Easy/JWSBuilder.php | 49 +- src/Easy/JWT.php | 19 +- src/Easy/Load.php | 9 - src/Easy/ParameterBag.php | 28 +- src/Easy/Validate.php | 63 +- src/Ecc/Curve.php | 134 +-- src/Ecc/EcDH.php | 15 +- src/Ecc/Math.php | 11 +- src/Ecc/ModularArithmetic.php | 19 +- src/Ecc/NistCurve.php | 98 +- src/Ecc/Point.php | 83 +- src/Ecc/PrivateKey.php | 49 +- src/Ecc/PublicKey.php | 49 +- src/Ecc/composer.json | 2 +- .../ContentEncryption/AESCBC/A128CBCHS256.php | 9 - .../ContentEncryption/AESCBC/A192CBCHS384.php | 9 - .../ContentEncryption/AESCBC/A256CBCHS512.php | 9 - .../ContentEncryption/AESCBC/AESCBCHS.php | 70 +- .../ContentEncryption/AESGCM/A128GCM.php | 9 - .../ContentEncryption/AESGCM/A192GCM.php | 9 - .../ContentEncryption/AESGCM/A256GCM.php | 9 - .../ContentEncryption/AESGCM/AESGCM.php | 48 +- .../ContentEncryption/A128CCM_16_128.php | 9 - .../ContentEncryption/A128CCM_16_64.php | 9 - .../ContentEncryption/A128CCM_64_128.php | 9 - .../ContentEncryption/A128CCM_64_64.php | 9 - .../ContentEncryption/A256CCM_16_128.php | 9 - .../ContentEncryption/A256CCM_16_64.php | 9 - .../ContentEncryption/A256CCM_64_128.php | 9 - .../ContentEncryption/A256CCM_64_64.php | 9 - .../Experimental/ContentEncryption/AESCCM.php | 59 +- .../Experimental/KeyEncryption/A128CTR.php | 9 - .../Experimental/KeyEncryption/A192CTR.php | 9 - .../Experimental/KeyEncryption/A256CTR.php | 9 - .../Experimental/KeyEncryption/AESCTR.php | 36 +- .../KeyEncryption/Chacha20Poly1305.php | 44 +- .../Experimental/KeyEncryption/RSAOAEP384.php | 9 - .../Experimental/KeyEncryption/RSAOAEP512.php | 9 - .../KeyEncryption/AESGCMKW/A128GCMKW.php | 9 - .../KeyEncryption/AESGCMKW/A192GCMKW.php | 9 - .../KeyEncryption/AESGCMKW/A256GCMKW.php | 9 - .../KeyEncryption/AESGCMKW/AESGCMKW.php | 36 +- .../KeyEncryption/AESKW/A128KW.php | 11 +- .../KeyEncryption/AESKW/A192KW.php | 11 +- .../KeyEncryption/AESKW/A256KW.php | 11 +- .../KeyEncryption/AESKW/AESKW.php | 26 +- .../KeyEncryption/Direct/Dir.php | 18 +- .../KeyEncryption/ECDHES/ECDHES.php | 92 +- .../KeyEncryption/ECDHES/ECDHESA128KW.php | 11 +- .../KeyEncryption/ECDHES/ECDHESA192KW.php | 11 +- .../KeyEncryption/ECDHES/ECDHESA256KW.php | 11 +- .../KeyEncryption/ECDHES/ECDHESAESKW.php | 53 +- .../KeyEncryption/ECDHES/Util/ConcatKDF.php | 35 +- .../KeyEncryption/PBES2/PBES2AESKW.php | 75 +- .../KeyEncryption/PBES2/PBES2HS256A128KW.php | 11 +- .../KeyEncryption/PBES2/PBES2HS384A192KW.php | 11 +- .../KeyEncryption/PBES2/PBES2HS512A256KW.php | 9 - .../KeyEncryption/RSA/RSA.php | 19 +- .../KeyEncryption/RSA/RSA15.php | 9 - .../KeyEncryption/RSA/RSAOAEP.php | 9 - .../KeyEncryption/RSA/RSAOAEP256.php | 9 - .../KeyEncryption/RSA/Util/RSACrypt.php | 71 +- .../KeyEncryption/RSA/composer.json | 2 +- src/SignatureAlgorithm/ECDSA/ECDSA.php | 21 +- src/SignatureAlgorithm/ECDSA/ES256.php | 9 - src/SignatureAlgorithm/ECDSA/ES384.php | 9 - src/SignatureAlgorithm/ECDSA/ES512.php | 9 - src/SignatureAlgorithm/EdDSA/EdDSA.php | 60 +- .../Experimental/ES256K.php | 9 - src/SignatureAlgorithm/Experimental/HS1.php | 9 - .../Experimental/HS256_64.php | 9 - src/SignatureAlgorithm/Experimental/RS1.php | 9 - src/SignatureAlgorithm/HMAC/HMAC.php | 18 +- src/SignatureAlgorithm/HMAC/HS256.php | 12 - src/SignatureAlgorithm/HMAC/HS384.php | 12 - src/SignatureAlgorithm/HMAC/HS512.php | 12 - src/SignatureAlgorithm/None/None.php | 16 +- src/SignatureAlgorithm/RSA/PS256.php | 9 - src/SignatureAlgorithm/RSA/PS384.php | 9 - src/SignatureAlgorithm/RSA/PS512.php | 9 - src/SignatureAlgorithm/RSA/RS256.php | 9 - src/SignatureAlgorithm/RSA/RS384.php | 9 - src/SignatureAlgorithm/RSA/RS512.php | 9 - src/SignatureAlgorithm/RSA/RSAPKCS1.php | 27 +- src/SignatureAlgorithm/RSA/RSAPSS.php | 22 +- src/SignatureAlgorithm/RSA/Util/RSA.php | 58 +- src/SignatureAlgorithm/RSA/composer.json | 2 +- tests/Bundle/JoseFramework/AppKernel.php | 20 +- .../Functional/Checker/ClaimCheckerTest.php | 16 +- .../Functional/Checker/ConfigurationTest.php | 106 +-- .../Functional/Checker/HeaderCheckerTest.php | 16 +- .../Functional/Console/ConsoleTest.php | 16 +- .../Functional/Encryption/JWEBuilderTest.php | 16 +- .../Encryption/JWEComputationTest.php | 18 +- .../Encryption/JWEDecrypterTest.php | 16 +- .../Functional/Encryption/JWELoaderTest.php | 24 +- .../Encryption/JWESerializerTest.php | 16 +- .../JweBuilderConfigurationTest.php | 60 +- .../JweDecrypterConfigurationTest.php | 60 +- .../SerializerConfigurationTest.php | 60 +- .../KeyManagement/JKUAndX5UFactoriesTest.php | 17 +- .../KeyManagement/JWKLoaderTest.php | 27 +- .../KeyManagement/JWKSetLoaderTest.php | 62 +- .../KeyManagement/JwkUriConfigurationTest.php | 48 +- .../KeyManagement/KeyConfigurationTest.php | 48 +- .../KeyManagement/KeySetConfigurationTest.php | 48 +- .../NestedTokenBuilderConfigurationTest.php | 69 +- .../NestedToken/NestedTokenBuilderTest.php | 34 +- .../NestedTokenLoaderConfigurationTest.php | 69 +- .../NestedToken/NestedTokenLoaderTest.php | 34 +- .../Normalizer/JWENormalizerTest.php | 25 +- .../Normalizer/JWSNormalizerTest.php | 24 +- .../Functional/Serializer/JWEEncoderTest.php | 58 +- .../Functional/Serializer/JWSEncoderTest.php | 143 ++- .../Functional/Signature/JWSBuilderTest.php | 16 +- .../Signature/JWSComputationTest.php | 16 +- .../Functional/Signature/JWSLoaderTest.php | 20 +- .../Signature/JWSSerializerTest.php | 16 +- .../Functional/Signature/JWSVerifierTest.php | 16 +- .../Signature/JwsBuilderConfigurationTest.php | 60 +- .../JwsVerifierConfigurationTest.php | 60 +- .../Signature/SerializerConfigurationTest.php | 60 +- .../TestBundle/Checker/CustomChecker.php | 13 +- .../DependencyInjection/TestExtension.php | 67 +- .../TestBundle/Resources/config/services.php | 20 +- .../TestBundle/Service/MockClientCallback.php | 16 +- .../JoseFramework/TestBundle/TestBundle.php | 12 - .../JoseFramework/config/config_test.yml | 3 +- .../Checker/AlgorithmHeaderCheckerTest.php | 16 +- .../Checker/AudienceClaimCheckerTest.php | 16 +- .../Checker/AudienceHeaderCheckerTest.php | 16 +- .../ClaimCheckerManagerFactoryTest.php | 44 +- .../Checker/ClaimCheckerManagerTest.php | 23 +- .../ExpirationTimeClaimCheckerTest.php | 16 +- .../HeaderCheckerManagerFactoryTest.php | 111 ++- .../Checker/IssuedAtClaimCheckerTest.php | 16 +- .../Checker/NotBeforeClaimCheckerTest.php | 21 +- tests/Component/Checker/Stub/OtherToken.php | 22 +- tests/Component/Checker/Stub/Token.php | 22 +- tests/Component/Checker/Stub/TokenSupport.php | 14 +- .../UnencodedPayloadHeaderCheckerTest.php | 19 +- .../Component/Console/AnalyzeCommandTest.php | 98 +- .../Console/KeyConversionCommandTest.php | 91 +- .../Console/KeyCreationCommandTest.php | 62 +- .../Console/KeySetCreationCommandTest.php | 39 +- .../Core/AlgorithmManagerFactoryTest.php | 30 +- tests/Component/Core/FooAlgorithm.php | 9 - tests/Component/Core/JWKSetTest.php | 119 +-- tests/Component/Core/JWKTest.php | 41 +- tests/Component/Core/JsonConverterTest.php | 22 +- .../Component/Encryption/CompressionTest.php | 27 +- .../ECDHESWithX25519EncryptionTest.php | 35 +- tests/Component/Encryption/EncrypterTest.php | 622 +++++++----- tests/Component/Encryption/EncryptionTest.php | 171 ++-- .../Encryption/InvalidCurveAttackTest.php | 30 +- .../Component/Encryption/JWEFlattenedTest.php | 71 +- tests/Component/Encryption/JWELoaderTest.php | 50 +- tests/Component/Encryption/JWESplitTest.php | 39 +- ...8GCMEncryptionProtectedContentOnlyTest.php | 109 ++- .../A128KWAndA128GCMEncryptionTest.php | 127 ++- ...ionWithAdditionalAuthenticatedDataTest.php | 99 +- ...ndA128GCMEncryptionWithCompressionTest.php | 127 ++- ...nWithSpecificProtectedHeaderValuesTest.php | 103 +- ...256GCMKWAndA128CBC_HS256EncryptionTest.php | 121 ++- .../RFC7520/DirAndA128GCMEncryptionTest.php | 85 +- ...ECDH_ES_A128KWAndA128GCMEncryptionTest.php | 115 ++- ...ECDH_ES_AndA128CBC_HS256EncryptionTest.php | 71 +- .../MultipleRecipientEncryptionTest.php | 108 ++- ...2_A256KWAndA128CBC_HS256EncryptionTest.php | 199 ++-- .../RSA1_5AndA128CBC_HS256EncryptionTest.php | 127 ++- .../RSA_OAEPAndA256GCMEncryptionTest.php | 127 ++- .../Encryption/RSAEncryptionTest.php | 216 ++--- .../Encryption/RSAKeyEncryptionTest.php | 397 +++++--- .../Encryption/RSAKeyWithoutAllPrimesTest.php | 81 +- .../KeyManagement/CertificateTest.php | 148 +-- .../Component/KeyManagement/FooAlgorithm.php | 13 - .../KeyManagement/JWKAnalyzerTest.php | 72 +- .../KeyManagement/JWKFactoryTest.php | 137 +-- .../KeyManagement/JWKSetAnalyzerTest.php | 133 ++- tests/Component/KeyManagement/JWKSetTest.php | 130 ++- tests/Component/KeyManagement/JWKTest.php | 69 +- .../KeyManagement/Keys/ECKeysTest.php | 92 +- .../KeyManagement/Keys/NoneKeysTest.php | 40 +- .../KeyManagement/Keys/OKPKeysTest.php | 56 +- .../KeyManagement/Keys/OctKeysTest.php | 16 +- .../KeyManagement/Keys/RSAKeysTest.php | 49 +- .../KeyManagement/MessageBagTest.php | 36 +- .../KeyManagement/UrlKeySetFactoryTest.php | 158 +-- .../Component/NestedToken/NestedTokenTest.php | 171 ++-- tests/Component/NestedToken/NestingTest.php | 41 +- .../NestedToken/NestingTokenBuilderTest.php | 96 +- ...NestingTokenUsingNestedTokenLoaderTest.php | 139 ++- tests/Component/Signature/ForeignJWTTest.php | 24 +- .../Component/Signature/JWSFlattenedTest.php | 27 +- tests/Component/Signature/JWSLoaderTest.php | 48 +- tests/Component/Signature/JWSSplitTest.php | 34 +- tests/Component/Signature/JWSTest.php | 74 +- .../RFC7520/MultipleSignaturesTest.php | 55 +- .../Signature/RFC7520/NestingTest.php | 25 +- tests/Component/Signature/SignatureTest.php | 138 ++- tests/Component/Signature/SignerTest.php | 900 ++++++++++++------ tests/ComposerJsonTest.php | 54 +- tests/Easy/AlgorithmProviderTest.php | 150 +-- tests/Easy/EncryptionTest.php | 68 +- tests/Easy/ParameterBagTest.php | 20 +- tests/Easy/SignatureTest.php | 94 +- .../AESCBC/AESCBC_HSContentEncryptionTest.php | 243 ++++- .../AESGCM/AESGCMContentEncryptionTest.php | 162 +++- .../AESCTRContentEncryptionTest.php | 23 +- .../Chacha20Poly1305ContentEncryptionTest.php | 19 +- .../Experimental/RSAOAEPKeyEncryptionTest.php | 18 +- .../AESGCMKW/AESGCMKWKeyEncryptionTest.php | 31 +- .../AESKW/AESKWKeyEncryptionTest.php | 45 +- .../KeyEncryption/Direct/DirAlgorithmTest.php | 19 +- .../ECDHES/ECDHESKeyAgreementTest.php | 164 +++- .../PBES2/PBES2_HS_AESKWKeyEncryptionTest.php | 749 ++++++++++++++- .../ECDSA/ECDSAFromRFC6979Test.php | 143 ++- .../ECDSA/ECDSAFromRFC7520Test.php | 62 +- .../ECDSA/ECDSASignatureTest.php | 24 +- .../EdDSA/EdDSASignatureTest.php | 35 +- .../ExperimentalHMACSignatureTest.php | 20 +- .../Experimental/P256KSignatureTest.php | 38 +- .../HMAC/HMACFromRFC7520Test.php | 204 ++-- .../HMAC/HMACSignatureTest.php | 28 +- .../None/NoneSignatureTest.php | 38 +- .../RSA/RSA15SignatureTest.php | 65 +- .../RSA/RSAKeyWithoutAllPrimesTest.php | 58 +- .../RSA/RSAPSSSignatureTest.php | 61 +- .../RSA/RSASignatureTest.php | 446 +++++---- 559 files changed, 11575 insertions(+), 14183 deletions(-) delete mode 100644 .php_cs.dist diff --git a/.php_cs.dist b/.php_cs.dist deleted file mode 100644 index a4333568..00000000 --- a/.php_cs.dist +++ /dev/null @@ -1,80 +0,0 @@ -in(__DIR__.'/src') - ->in(__DIR__.'/performance') -; - -return PhpCsFixer\Config::create() - ->setRules([ - '@PSR1' => true, - '@PSR2' => true, - '@Symfony' => true, - '@PhpCsFixer' => true, - '@DoctrineAnnotation' => true, - '@PHP70Migration' => true, - '@PHP71Migration' => true, - 'strict_param' => true, - 'strict_comparison' => true, - 'array_syntax' => ['syntax' => 'short'], - 'array_indentation' => true, - 'ordered_imports' => true, - 'protected_to_private' => true, - 'declare_strict_types' => true, - 'native_function_invocation' => [ - 'include' => ['@compiler_optimized'], - 'scope' => 'namespaced', - 'strict' => true, - ], - 'mb_str_functions' => true, - 'method_chaining_indentation' => true, - 'linebreak_after_opening_tag' => true, - 'combine_consecutive_issets' => true, - 'combine_consecutive_unsets' => true, - 'compact_nullable_typehint' => true, - 'no_superfluous_elseif' => true, - 'phpdoc_trim_consecutive_blank_line_separation' => true, - 'phpdoc_order' => true, - 'pow_to_exponentiation' => true, - 'simplified_null_return' => true, - 'header_comment' => [ - 'header' => $header, - ], - 'align_multiline_comment' => [ - 'comment_type' => 'all_multiline', - ], - 'php_unit_test_annotation' => [ - 'case' => 'snake', - 'style' => 'annotation', - ], - 'php_unit_test_case_static_method_calls' => true, - 'php_unit_expectation' => true, - 'php_unit_test_class_requires_covers' => false, - 'global_namespace_import' => [ - 'import_classes' => true, - 'import_constants' => true, - 'import_functions' => true, - ], - ]) - ->setRiskyAllowed(true) - ->setUsingCache(true) - ->setFinder($finder) - ; diff --git a/composer.json b/composer.json index 85306aca..eac539c4 100644 --- a/composer.json +++ b/composer.json @@ -63,18 +63,18 @@ "ext-mbstring": "*", "ext-openssl": "*", "ext-sodium": "*", - "brick/math": "^0.8.17|^0.9", + "brick/math": "^0.9", "fgrosse/phpasn1": "^2.0", "paragonie/constant_time_encoding": "^2.4", "psr/event-dispatcher": "^1.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", "spomky-labs/aes-key-wrap": "^5.0|^6.0", - "symfony/config": "^4.2|^5.0", - "symfony/console": "^4.2|^5.0", - "symfony/dependency-injection": "^4.2|^5.0", - "symfony/event-dispatcher": "^4.2|^5.0", - "symfony/http-kernel": "^4.2|^5.0", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "symfony/polyfill-mbstring": "^1.12" }, "require-dev": { @@ -82,8 +82,7 @@ "ext-gmp": "*", "bjeavons/zxcvbn-php": "^1.0", "blackfire/php-sdk": "^1.14", - "friendsofphp/php-cs-fixer": "^2.16", - "infection/infection": "^0.15|^0.16|^0.17|^0.18|^0.19|^0.20", + "infection/infection": "^0.25", "matthiasnoback/symfony-config-test": "^3.1|^4.0", "nyholm/psr7": "^1.3", "php-http/mock-client": "^1.0", @@ -93,15 +92,17 @@ "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^8.0|^9.0", + "rector/rector": "^0.12.5", "roave/security-advisories": "dev-latest", - "symfony/browser-kit": "^4.2|^5.0", - "symfony/finder": "^4.2|^5.0", - "symfony/framework-bundle": "^4.2|^5.0", - "symfony/http-client": "^5.2", - "symfony/phpunit-bridge": "^4.2|^5.0", - "symfony/serializer": "^4.2|^5.0", - "symfony/var-dumper": "^4.2|^5.0", - "symfony/yaml": "^4.2|^5.0" + "symfony/browser-kit": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/framework-bundle": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/phpunit-bridge": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0", + "symplify/easy-coding-standard": "^10.0" }, "replace": { "web-token/jwt-easy": "self.version", diff --git a/performance/JWE/A128GCMKWBench.php b/performance/JWE/A128GCMKWBench.php index b299ef29..2bb55609 100644 --- a/performance/JWE/A128GCMKWBench.php +++ b/performance/JWE/A128GCMKWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'A128GCMKW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'A128GCMKW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A128GCMKW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'A128GCMKW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A128GCMKW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'A128GCMKW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A128GCMKW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'A128GCMKW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A128GCMKW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'A128GCMKW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A128GCMKW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'A128GCMKW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,7 +67,9 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"crbOdBQqlc8WJZ9ZTb42xYoy2i5_KBoSOeJSg_6aeG0V1gxfVqe_AIkS9Nv8Vmil785R909ntom9Fo1GPZnt9mv-UfBeON7V1shRYjtOog6KouOvnA0YROvNr32AhE_tVrxzFyFVLRwJE0kfXvG29GhwTxhz2ugCqNZdIPJL5awM5BXosxlSiZRsHRMYSsULvfOTPqb2JkWbT1Z7bgCmm885-U01uaA","iv":"RUYx0bI8ywiHbgOI","tag":"rRPgmpp8UvOOhT_SVOGaIg","aad":"QSxCLEMsRA","protected":"eyJpdiI6Ikd4V1R2ZG96Zk1KZUcxQmMiLCJ0YWciOiJXYlM1Nk93NnUwUl9oZDZJQzZaZU9RIiwiYWxnIjoiQTEyOEdDTUtXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"r3zhEPolUXhQ0kHvg-wyxOYDDilfL4WJWAlfxlwIIm4"}'], + [ + 'input' => '{"ciphertext":"crbOdBQqlc8WJZ9ZTb42xYoy2i5_KBoSOeJSg_6aeG0V1gxfVqe_AIkS9Nv8Vmil785R909ntom9Fo1GPZnt9mv-UfBeON7V1shRYjtOog6KouOvnA0YROvNr32AhE_tVrxzFyFVLRwJE0kfXvG29GhwTxhz2ugCqNZdIPJL5awM5BXosxlSiZRsHRMYSsULvfOTPqb2JkWbT1Z7bgCmm885-U01uaA","iv":"RUYx0bI8ywiHbgOI","tag":"rRPgmpp8UvOOhT_SVOGaIg","aad":"QSxCLEMsRA","protected":"eyJpdiI6Ikd4V1R2ZG96Zk1KZUcxQmMiLCJ0YWciOiJXYlM1Nk93NnUwUl9oZDZJQzZaZU9RIiwiYWxnIjoiQTEyOEdDTUtXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"r3zhEPolUXhQ0kHvg-wyxOYDDilfL4WJWAlfxlwIIm4"}', + ], ]; } @@ -66,10 +77,12 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'oct', - 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'oct', + 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', + ]], + ], ], ]; } diff --git a/performance/JWE/A128KWBench.php b/performance/JWE/A128KWBench.php index 93616747..d20b99df 100644 --- a/performance/JWE/A128KWBench.php +++ b/performance/JWE/A128KWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'A128KW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'A128KW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A128KW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'A128KW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A128KW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'A128KW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A128KW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'A128KW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A128KW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'A128KW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A128KW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'A128KW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,7 +67,9 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"CGRKzNX-H6vQCdP3T_1ftzz6hFMMBWKSysDWPVmTG9TCviDXZh0u8k9WX42PiX-BrdRxxjIw9JMKgq3pxw8kQu4KyHeta4iio8OHr1Qjy24LPGRg9_Dv4Yt2i_ytHV_QbUX1Dg_YPMcca9G4BJA56927fvtGXA0ke0pjmPYceWSdZGxKO4MLLGJCHmi5xceIxhCy7QZnEfQOEv5bR2v_G0UDAi_eQM8","iv":"_PsWB_V0xIxq8ulL","tag":"RkfU2WT1DKGXFLgGZeCTnA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"BX5Kx_b0rd5qUH0UqJe3h8Tu6bAPHLg-ZMFi7qHnEO7t46orRoW-xQ"}'], + [ + 'input' => '{"ciphertext":"CGRKzNX-H6vQCdP3T_1ftzz6hFMMBWKSysDWPVmTG9TCviDXZh0u8k9WX42PiX-BrdRxxjIw9JMKgq3pxw8kQu4KyHeta4iio8OHr1Qjy24LPGRg9_Dv4Yt2i_ytHV_QbUX1Dg_YPMcca9G4BJA56927fvtGXA0ke0pjmPYceWSdZGxKO4MLLGJCHmi5xceIxhCy7QZnEfQOEv5bR2v_G0UDAi_eQM8","iv":"_PsWB_V0xIxq8ulL","tag":"RkfU2WT1DKGXFLgGZeCTnA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"BX5Kx_b0rd5qUH0UqJe3h8Tu6bAPHLg-ZMFi7qHnEO7t46orRoW-xQ"}', + ], ]; } @@ -66,10 +77,12 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'oct', - 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'oct', + 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', + ]], + ], ], ]; } diff --git a/performance/JWE/A192GCMKWBench.php b/performance/JWE/A192GCMKWBench.php index 5101406f..594555b8 100644 --- a/performance/JWE/A192GCMKWBench.php +++ b/performance/JWE/A192GCMKWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'A192GCMKW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'A192GCMKW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A192GCMKW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'A192GCMKW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A192GCMKW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'A192GCMKW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A192GCMKW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'A192GCMKW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A192GCMKW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'A192GCMKW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A192GCMKW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'A192GCMKW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,7 +67,9 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"8-zEiA24sXMcmZl33nvu7sdP5gIupkNAcWkg2qE5bfRdReOiocGlYOr0GPj9SjJDEJUCdbMbsn3qx6cFkZaPmV_G5w7dNfX8ALhLVhSkbypW2C2TGGxaEEAnGJgjwBhi-wDd-k1bAU0htRszUi_RsY3sfb5ssDJZQkyslxtubVSTqWkpH0tuotxQxac2mDHrWAp0VYnpGSJSKPy3q3UGlxY812zaEOc","iv":"dCoOw5_olUz_kCjN","tag":"TGiZO1fqeb0pfdTlc5VYJQ","aad":"QSxCLEMsRA","protected":"eyJpdiI6IkNST0xGWS1CbVVUSmoxQlIiLCJ0YWciOiJVVTFtdExPcldCeFRaYW5OM2FKZWpBIiwiYWxnIjoiQTE5MkdDTUtXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"Z8_qLErKWsleFJuq1jBXWcJovvHUdhvJfZa9ecDbLJw"}'], + [ + 'input' => '{"ciphertext":"8-zEiA24sXMcmZl33nvu7sdP5gIupkNAcWkg2qE5bfRdReOiocGlYOr0GPj9SjJDEJUCdbMbsn3qx6cFkZaPmV_G5w7dNfX8ALhLVhSkbypW2C2TGGxaEEAnGJgjwBhi-wDd-k1bAU0htRszUi_RsY3sfb5ssDJZQkyslxtubVSTqWkpH0tuotxQxac2mDHrWAp0VYnpGSJSKPy3q3UGlxY812zaEOc","iv":"dCoOw5_olUz_kCjN","tag":"TGiZO1fqeb0pfdTlc5VYJQ","aad":"QSxCLEMsRA","protected":"eyJpdiI6IkNST0xGWS1CbVVUSmoxQlIiLCJ0YWciOiJVVTFtdExPcldCeFRaYW5OM2FKZWpBIiwiYWxnIjoiQTE5MkdDTUtXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"Z8_qLErKWsleFJuq1jBXWcJovvHUdhvJfZa9ecDbLJw"}', + ], ]; } @@ -66,10 +77,12 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'oct', - 'k' => 'KuFiR-n2ngkDNZfBXWS6cCGXrYonVUiH', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'oct', + 'k' => 'KuFiR-n2ngkDNZfBXWS6cCGXrYonVUiH', + ]], + ], ], ]; } diff --git a/performance/JWE/A192KWBench.php b/performance/JWE/A192KWBench.php index f5d48184..b5f98ba0 100644 --- a/performance/JWE/A192KWBench.php +++ b/performance/JWE/A192KWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'A192KW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'A192KW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A192KW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'A192KW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A192KW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'A192KW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A192KW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'A192KW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A192KW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'A192KW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A192KW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'A192KW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,7 +67,9 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"0TnU-JWyzWNe_u5lzwI1PmI1P1A_9rDJSy-1-aVqgu5I4h9L7nGaqMpfJ2VRnEky8BG8khRJ9ytdgPEr5xlMw5Me1OHhcALIvjdtUO_yQvj4ndn6VWSAuyfC4WzyBdRhwufh4RYPhXhh4mXYmvCzfQYD9KCiCB2PyA-WFg6vOgp5_kBbm1auxsarPkqFwfqNAMBavnKnuliaZviJE0708kWMJE8PuBA","iv":"4K9DpGqWCJ6MNNRn","tag":"s5EsBBRfzlFMnLuUU8TMPg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJBMTkyS1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"GU6WSPFGiMK2hMXOQv6jbSZlTQ0p1hQL3KOIPTr9BYw6PtoTbrdUrg"}'], + [ + 'input' => '{"ciphertext":"0TnU-JWyzWNe_u5lzwI1PmI1P1A_9rDJSy-1-aVqgu5I4h9L7nGaqMpfJ2VRnEky8BG8khRJ9ytdgPEr5xlMw5Me1OHhcALIvjdtUO_yQvj4ndn6VWSAuyfC4WzyBdRhwufh4RYPhXhh4mXYmvCzfQYD9KCiCB2PyA-WFg6vOgp5_kBbm1auxsarPkqFwfqNAMBavnKnuliaZviJE0708kWMJE8PuBA","iv":"4K9DpGqWCJ6MNNRn","tag":"s5EsBBRfzlFMnLuUU8TMPg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJBMTkyS1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"GU6WSPFGiMK2hMXOQv6jbSZlTQ0p1hQL3KOIPTr9BYw6PtoTbrdUrg"}', + ], ]; } @@ -66,10 +77,12 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'oct', - 'k' => 'KuFiR-n2ngkDNZfBXWS6cCGXrYonVUiH', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'oct', + 'k' => 'KuFiR-n2ngkDNZfBXWS6cCGXrYonVUiH', + ]], + ], ], ]; } diff --git a/performance/JWE/A256GCMKWBench.php b/performance/JWE/A256GCMKWBench.php index cb73152c..06808b29 100644 --- a/performance/JWE/A256GCMKWBench.php +++ b/performance/JWE/A256GCMKWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'A256GCMKW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'A256GCMKW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A256GCMKW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'A256GCMKW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A256GCMKW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'A256GCMKW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A256GCMKW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'A256GCMKW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A256GCMKW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'A256GCMKW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A256GCMKW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'A256GCMKW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,7 +67,9 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"mdruX2DotBCFo0eYa0Hb1yOCdv2Dpg6tWBgTWUZ6Y9dLvZ2N-rJRjqgbyV3otZ_fpCurFdY5cX4Nk2G6A4tSw9Ixp5aQDaZgXasR_EhQjjiPSDjcSbQmpz0w8qGYmPX6OhH2G0iKtp2aFjgHK4tHvTl4abu72mqmJgoOTzYCiyin0BujbTB33v1TsM-0uPWdY9LziVkf4z2DV81ehj9iHbj7_cq9ABk","iv":"aeHHwTKalLxq-s_2","tag":"9lF1kYUWyvkXFT-r9hwsoA","aad":"QSxCLEMsRA","protected":"eyJpdiI6IjdHVEJDcXBjQktORnktN20iLCJ0YWciOiJGV29vY1dESDhSb1NfZVVQREQ1UVlBIiwiYWxnIjoiQTI1NkdDTUtXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"3nTasDHjqnzYhjJRwcxpCfs_lnrrT2YUzI8EdnbVI4I"}'], + [ + 'input' => '{"ciphertext":"mdruX2DotBCFo0eYa0Hb1yOCdv2Dpg6tWBgTWUZ6Y9dLvZ2N-rJRjqgbyV3otZ_fpCurFdY5cX4Nk2G6A4tSw9Ixp5aQDaZgXasR_EhQjjiPSDjcSbQmpz0w8qGYmPX6OhH2G0iKtp2aFjgHK4tHvTl4abu72mqmJgoOTzYCiyin0BujbTB33v1TsM-0uPWdY9LziVkf4z2DV81ehj9iHbj7_cq9ABk","iv":"aeHHwTKalLxq-s_2","tag":"9lF1kYUWyvkXFT-r9hwsoA","aad":"QSxCLEMsRA","protected":"eyJpdiI6IjdHVEJDcXBjQktORnktN20iLCJ0YWciOiJGV29vY1dESDhSb1NfZVVQREQ1UVlBIiwiYWxnIjoiQTI1NkdDTUtXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"3nTasDHjqnzYhjJRwcxpCfs_lnrrT2YUzI8EdnbVI4I"}', + ], ]; } @@ -66,10 +77,12 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'oct', - 'k' => 'OgUyABAPIkI-zFg3doqsv_GH-4GTGOu3HGnuG9wdxCo', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'oct', + 'k' => 'OgUyABAPIkI-zFg3doqsv_GH-4GTGOu3HGnuG9wdxCo', + ]], + ], ], ]; } diff --git a/performance/JWE/A256KWBench.php b/performance/JWE/A256KWBench.php index 4e88d509..b7cb0c9a 100644 --- a/performance/JWE/A256KWBench.php +++ b/performance/JWE/A256KWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'A256KW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'A256KW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A256KW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'A256KW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A256KW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'A256KW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A256KW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'A256KW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A256KW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'A256KW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'A256KW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'A256KW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,7 +67,9 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"Js4OCNZs2s0En9-JTEzHntCLjUYHwd9mgEuMgTlQQCACrTcwctobqEyEXIEnHhFqQb6FDi7z6gXrY4pJdMnZAbY-DF2KlzPewPJdPCtncGMJ6Q-tJ7_aNoBQbR9yFpcdPqzZKG5l_g3JjI5n2z1pP2T3-tvwFN6UJvUBy-gQJgkosXlEXEcDcpGcGl41wLUwv-uVg-T6_i52_MDHg4CqST_5qugu6_Y","iv":"nqT3ZOuxL5i-6zFa","tag":"6XRD6atZ3kX1AXMFw9Np5g","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"L7ZhHtUPPSyrxyE36QFyt7dlb6GSmPZSoP-1HUkAe0d8PDKIXLwjAw"}'], + [ + 'input' => '{"ciphertext":"Js4OCNZs2s0En9-JTEzHntCLjUYHwd9mgEuMgTlQQCACrTcwctobqEyEXIEnHhFqQb6FDi7z6gXrY4pJdMnZAbY-DF2KlzPewPJdPCtncGMJ6Q-tJ7_aNoBQbR9yFpcdPqzZKG5l_g3JjI5n2z1pP2T3-tvwFN6UJvUBy-gQJgkosXlEXEcDcpGcGl41wLUwv-uVg-T6_i52_MDHg4CqST_5qugu6_Y","iv":"nqT3ZOuxL5i-6zFa","tag":"6XRD6atZ3kX1AXMFw9Np5g","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"L7ZhHtUPPSyrxyE36QFyt7dlb6GSmPZSoP-1HUkAe0d8PDKIXLwjAw"}', + ], ]; } @@ -66,10 +77,12 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'oct', - 'k' => 'OgUyABAPIkI-zFg3doqsv_GH-4GTGOu3HGnuG9wdxCo', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'oct', + 'k' => 'OgUyABAPIkI-zFg3doqsv_GH-4GTGOu3HGnuG9wdxCo', + ]], + ], ], ]; } diff --git a/performance/JWE/ECDHESA128KWBench.php b/performance/JWE/ECDHESA128KWBench.php index cc693de9..4eaff11d 100644 --- a/performance/JWE/ECDHESA128KWBench.php +++ b/performance/JWE/ECDHESA128KWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A128KW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A128KW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A128KW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A128KW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A128KW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A128KW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A128KW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A128KW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A128KW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A128KW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A128KW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A128KW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,30 +67,78 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"8WWzoKIrl16O3boPiTvVivn28js5b6S3JbOMySZ-ujmMCvOeyoEIdLXSxycB0gQeTFsHZ6g-oZqkuJDPNBTbSZznmLjRZQoarfVfxe5jzzJfvK3t89Rkd-phVyUgD4-RNXjuUItMjje3fMTTpw_E1ai6PuGmrZedvscj6BuSkvS4qWzxcZ9234xZzlCRgMzEBG3h4IUu5sWhXwictyMwVUHMBeq0mLSBJO9FEk_TyHI","iv":"aSNbaiq7SIh-6u9FjvhV_w","tag":"uf32NOEXoG-kHG19cc3T6A","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiI3bUFZY0VKWkJXYTR5Yk0tT1JsaFBnSUtMeFh4OEszNXU2S0FjNzZBUFVJIiwieSI6InhESzQ3eVJFYlI1OGdHNF9FTVdCTnZ0UThZVXRCN2dTc2pSeld1aG1iQVEifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"TTZg275GMEwpqiuHVwBi_1vu1hmR5juJOPRB_pPWjUUQ7zUtDAIp3w"}'], - ['input' => '{"ciphertext":"--WXckNnEfBZgO50CgXLkNSwAHnWhzBlwyMl-JlPYzicmw_P5I9oX5kb-Hz8nstSyhwgrepcX1Q0ALDOD3Pdbf-wVuA-AryGP-dT9aWkgtopsHZv0bI1Hvreb6tmtI2qDq5zwM03bBlKzVMort6g3NXqvIBto1wskRsTmfDVnBwGXbEPWVPAHDHCxFJGZ6iQ8DeGjEgwQNdt565ZgOsgTqBV3dNUY0hhnXYDkEmteiE","iv":"L8ZADssAMXIy8bSmHF7B4Q","tag":"l0fPMEEIiml_GoAPppneYQafGgrvCHvM","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJoT3NXMzRIeWRTZEswcHNmd09sbW81ZFlMaU9UNllBX2tOU3RUN1BxQ0I4IiwieSI6ImE0c2RqMTBJakYzcUpCVWJwcS13NEh6QzI2ODF1UjY5TXl2MVFYNVFQX1UifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"6edmcKAhRI1HkZssnFGMDHkYwwlzZ_d8Ij6ZoW27BMtOmueRI7JXivdikiB4Te7HzGPyoygN3X0"}'], - ['input' => '{"ciphertext":"ElP-FfX2PlRU6xQL4auDQejBqnwYcDLXMpyY7snEtoSj4ITHwJmNpGSD1yh0N_yDeSPf5HFqLDlzM8JZZQ83pOY_Sn5iO452WFeWtjNYOD9XB1AwPOQdBg25MSZxIdwKvzbYAs3FILw1swuHgXfdomGDJhIKQbKSBinAziGuvrCAio1phqwLrRG2vJApmWBHXjbuJzwv_K2ZBDLf8SDFvmTbuZZ6mm4fPZSWyEo71p4","iv":"w2LROvAqZDdkyiTv5CTMIg","tag":"QF0y2Be8wRWiAONqVwYFfoPQjc0NRrL8lO3if-SpBq4","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiIxTWtRWlc3MzRqZ1l1V0tFSjFrWXdNa1lGclZJeXd2QVJaMXdvTEhNOUg0IiwieSI6ImdSTktaOFZpQ2hJM3Y0RXhiVzUzYmNSY3diS1MxYlQxLVRQc0p5TURfaU0ifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"r0cwT0y_zzbV4zVXEY5Sh66bKtX32971vZ5ygeoCTtpN1oEuTANEZ9bWzJMuC3EPnuYO4XWopaac5FFJxBQt3hX4wvah9kkJ"}'], - ['input' => '{"ciphertext":"vxE_6ULATftYhRAW86hSchRc49VscHXtg3bLhSFHZns3tVd6zIMo0xG0q6psAEGRmGs2Z4DwUAbrrZ-6YSPn1xjMEgMhSyXqZSM7rEca0bFeaM5N9cIKuiaSOLKGNiJ8SATtoUlg9wu3CU_ycCYoXo1dlmfwaRHD419ycqVDI2DVZDg6iuhPR2rIW4FZujn-psbQhZClozNOWkORkJSp2lJGIOs0jkI","iv":"lAOeapEH6BRLDmQl","tag":"6RoKYl11I-iu_-nn_qxTPQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiItSHlUVWhHUXR1dDVxTUJrdGIyLUVyQTRrRnFQZ2dYU1ppN2ZkMjJ6YXZVIiwieSI6ImpsUGhad0w3S0I4YmJtZ1Y2eC05R2JJZFh0N1NaaFJlZldFYUVCWTN5YXcifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"HzkOCsTSv-V9-QwEJbMt7rpHoU-rPgIE"}'], - ['input' => '{"ciphertext":"L2Z_gtDHQyWWcI6VMZzje4dxVbKGX6tS6DsJITn5HzkaaQlXK8w2h4RD7VGNVbA2lg1yeGWf3i2Z_3gZPTYKLUMtDEUIJMSOyNZHzRWvcaCkgBLp3vBbkJevH0Wc-P1QIdhIByUvgPTo6OrTKMT1yonlQ8U3g6_xovTID1yoc2qdEVB0inx3Tq7HVRlto7nMI6Z48VT9CN5r4SmS3jXAZsortsG2k54","iv":"wol3soUEVXh0OYxF","tag":"tYvCovXomiyroVCYT74iig","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJhQXQ2V1FIVFduVDdUV0JPaHBPNEN4ZmNXUUFUNFhMcFl6Y3lpTTluZmZjIiwieSI6IjFwWEpmVkZwamQ1QWdSTEY4UUprNEZ5QUN3TElJaE90U0plb1FIQnU1NWsifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"FiU_lrERwsTL4qvnevyf2DxkjhxQ5v-ArGaHg7G4D24"}'], - ['input' => '{"ciphertext":"6G-SHyO3wk8rAnYTGwxIOmG-1Aq7ujSC__aqG5iaDI6RX9YtcZdOAqIjtzKG_itRHa1uxGMzJqROG7haHEJpA62NGt8et5njC6oqsYNl2RC8YwwtJysK6_hvcHlxaIDFKp7ZQ3vgKvips4Ro8AkR58XpH1GF_Rk1RsFbJONWMDe_vK98tf6CSruK9LLu6LYU8JlwL0bUGptsdHPJRKQkM02yg4jA9nM","iv":"ih0vR-rb80lr_WVg","tag":"L7-8h3JG_st0sedwDHC4iA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJOWU1lbjlQcmE0Nm5XZFlBbW5KQ0FmcmNtZjBfT243cEVkWllkMFhBSmZjIiwieSI6InZYYXZxQmlNblhUUkZud2N3OXg5WVc5NDk1enQ3X3hBbDNFN2ZBdkxvYTAifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"Bgdqgux6pY8oUbufB7iHfMgb-EsffDBtOIOEDOqS45K85QY5dmotPw"}'], - ['input' => '{"ciphertext":"f3sJ-VeUMSCDCs6_ym7mG0bGOJZwD54qu6xTULFgV_LZHLhLpzUFG1MX38EHSLay70c6g1Ob9nxFYc-EYiULNkfUfvpTFK6E146zQZmuKCS2u04KpDHrriBPutvJue60HWVuejkscDiP2-wzRuU4qskGzWCDTzj-YvZw5ftdhYztgolCZQDDfe67yC6ywpdOS4WLsk6s4yZJfK4TIRlsVxCPueU6wyQvkvO_EF8_PY0","iv":"eGtwRbrxNeaBdTp6yIiZtg","tag":"ur27HEz8ch7Oqs2uZKpybw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJ2b1dyQkd5SGJ2R1ZJR0piOU5lV3lPcm9VRkZZWl83ZkN6TE1sV1dlQUROSU8za09BMU4zNkZnelVaYW93eUdkIiwieSI6InlqWGtWUVdKQi0yWWl3azdDRFpySk1yd2NPald6dEV2czVUVzdYV2pZSVFYTTMtOFZncW1BMGt4d3ZsSjZFQm8ifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"d8JZuYKkoEYF-DveajkvDTUouMun6X4OmsAGDb9p1qOMX2KmwNfvUQ"}'], - ['input' => '{"ciphertext":"TiMVN3-mo0Rcu2SG04FNiYqDSIk60BH-soXYLQgq4J457UFWDCMPBf6oVRAYTZJwiDEONWdc2iFEW7CfRU_dMc2DsO0kHMME3w5Uqptm5Nay5dcIJrcoICptnlPxupM_qyDgKOmF-x5oelgWdy5erSrQ-JX7bxTTw5TAHQ-iRlSZFb_eecYaf92V8CKqS9K2KqPTiZ_1fIiZnqQHyLmggqmifeWPHiO8ox3kI-LtebA","iv":"B9a80FX3up3SuV1Qqs9ydQ","tag":"rsvZ-bvbD2pMoCvYT8Hsag4STmKjcAi2","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiI3SDhjU0xzeWFmck5McFlZWFRTWmRLMlIwLURZUFFfVkkzNFA5WkgtM0VPSGV3aU0tdk41SkxxSE1HMzRFay1VIiwieSI6ImoxR0FmMjVCNm1SUE1lT3lwS2VpQk50ZmphNVZYMV9DRE1YcGIyRmlaajhxckc1WnBFOWtKZlV2Q3M0VC1PVU4ifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"yELqAjD6BDP4BjRf8Wbfb9vLj4tWpjjUiYLyb69Zo7x2BP7Dp1LhpWSDwKugswmRK5Tmhlqt1OM"}'], - ['input' => '{"ciphertext":"NssjbtiTmnZrm5A5QMC-wS8oY8jVNRhs3b0cZWpEYdbFhtMMEOv0yI2JNLEkaA2utQs2O_GnIZbodCp6Dr1UoirPmX5GPiBa3wRQo4hflfCLY_tZ2JBaXB0ZFSokUEOZSOnbSNZ1Pa6EAy8QhAOwCgj5yrPbq6bvBv-JMfBS6YxhA3b7q1PV6VSkLWHn-FTvsMp3HMjzMRgj_l_Fz5n5Z-st0td8rq45PR0nlKgEnKI","iv":"l8XxXvQp-M8rIgA-_xkuCg","tag":"c2GrOJR84Xdjp-i4QtIYrjIbtDKtPvQ3Or4g9cGQP5Y","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJ4NHBOLWEwd2NkbVl5RW1kb09uUUJFR1o2OHVXNmVPUUlaZ29sMHhDaGU4V0pjcU1lMkQ0MC1UcEc5S2VhSzZqIiwieSI6ImVfQXNZM3pPSktYYUcwNG15RFFmUFdZSkJ3eUlXRVJyNGJZMTExTnJsc2x4VWRTT2laa0ZLTWtGdzUtQkF2VmYifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"jWzJiC_cdSHreMdQ2MChUWDGiE_QFY7KkTtLTEuHHzG7E-5PCFMfnkSeZ75vrqtawqm0XwsVBPir1lDkC-mKMUe7mHEr1dPQ"}'], - ['input' => '{"ciphertext":"Mi_2P4e8uiptwMNQrUfTeQyY9-UpHdCsqTtCgHyX2k2wkKCEksmO5uGqgFS4vP9js76i-baltDNes-xH2tGYEFZpv9hpT5Mh784RpChxPC_LneCsN9_52SibnJO8u4umCyF3pJfkUUB9QXPIQQ4qTuuBgzfAXthK9cMxNZPP94hRRZgj3ZnbE3I36_NgANfQ2XVuGF3q6KQ-55KIFDL837SPRuNfzEM","iv":"O6u6sfSNvozzYC7k","tag":"e55FLRLwxKbKh5uudliVCA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJueU9UVURWUTBmV3RmcHFWc2lCZC1jLWdBRFdhVExoZEFiTmNiazBaMjVWc3Jhd29uQkZyQVVIYk51Tl95Z181IiwieSI6Im9nWkZlWVhVS25CUkhpbzJLYWJvTllNXzVCU3l0UzFDVHZ0SzZqMkxXb2JjWGhjSzJvU2cwdGJpQS1YRmxGNl8ifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"6hywjs7eY_AGzE0r4AcmM1pw_ET6hwFO"}'], - ['input' => '{"ciphertext":"B---FvtsBS1ABH1Fz6PbtVU5t_WxpPGUhIRvrpEP3_YKVu36i4TImczF-L3cgeeFjypkmbM6hblJQmek2QFL5x9GJF6KzobCv_3g5KkFBNfEH8NwOcdUbmsSsPOEI_5ZTwcno-hHcc1PrEueUREwpLyJ0oP-1IgOHJn4j8NqeqWEAtcxzvQbWonBDF6o2c70SgPzCGZy01dJvSEosudOGpJtsCm4hvE","iv":"WUxQgfmtQWZtX3Bk","tag":"B08AHwCsv5zO1ZmX9wbQHw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJYbUlNX1NVY3J0Ymd0VjBYOERrY19zVFl3bHphdnJPRGJFRFhmb1NNaF9FU2pFN185UkIwNXhIaWw5R29zTFNwIiwieSI6InlEZmdzSEFWaVdxVUZHaWdSNy1XYml3UWRhWldOLTFyeFpyNVJCR2dTV1NBdXVuUnRoQzRxQ3JOQ2FiblV0bVYifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"04KAt72HccxdDIiSjuzRXm9hpNwJcRkRLG6dzuQvBcw"}'], - ['input' => '{"ciphertext":"2l8m7S7WgvbAgg5JvvxpHTkpIeHTVcJDDjZdJX3a-pakoEqw9UDbsIHGJE_W6Gl4bMaRhRTMTsg8_xoqoIiif-NYGZKhKvJ2CBifeVaTZJjdcQJKovjvpJGUBMtev7F4pPnTnLPnRnLax4MXgpkOTv9ryh69Knn8zbcktnO93kO6ImzRCK5hwRE9hS82Bg-2Y4eNBsnsHAfkFCU8UX5z9nTOLDyQVns","iv":"aWjEAIckOJ5SxsrB","tag":"UNJ1ghRwzGG9wDzbnAdwrg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJ4UUNhckRYU0tRMG81TlZOTVE1RmptWFFoNWFFdWpzV2pJRUM2Q24zdGdybG92OHl1VlkxWEh1cUdpTXF4MUplIiwieSI6IjQxMG9vLUsxRDVoTGxPekxIV0NjREV0eGsybnJVYkVLTUdoMEpZYWxZaFNiR0pXWkd1Vy1OV09zeDY4dzR1dHgifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"M1FUr3rtiak6u_GUN0gm3Ahn7sjIMon5RmO3lVOrgXhnmHvLfgw6Uw"}'], - ['input' => '{"ciphertext":"7kFxr0VKVbmJg_ro-7Fj8e6sQBKsQefPB1xQ-_FuUL1wS8w5CA7lnIpQTXoAwbFMClP3U62mrfz26d3EVHDi1b5sWoUui3V2OnLD6CxqpmJdAHQUgHeYaOglgfJWLJryqn6b1X2CJ8qcg5vy8rqPHHghAY0tgA3iA_OcPuYc9383yLWTcLmghRKwa5yw6zbYKXBXdT2WY8Leum9nqvZT4rTMeO0_QiOlgn-qFk2n5yM","iv":"FluGprT7jlECz74k2s6R_g","tag":"nNRf2uQSRZwNNubODrXSrQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBWlI2VEdpbFRVdmxoZFVnWktyYjNIbkZ6alp6LTRJMzdrSDBxR3BQaUlYenQ5bEwtSnh4QVRiV09sblNLSm5FbUJVVFZ0empYS0l6cFA5eklfUGR1TTFSIiwieSI6IkFid1VHaTVTaFRtR2dEaVlGSko5LThjUGh4b1U0elZ3clQwWmtmLXpkZWIxYy1nRk8yUWF4a0JVYTFqT3FQeGxnUDJYeEpXSlBqNHlGS21ISlR6bzN4NWEifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"ZJAvb1EpUU7CI7Kr8NkGswvdCsumf1JVUF2IaAKGrxOdIJEbTocVPw"}'], - ['input' => '{"ciphertext":"eUpwHP_TPDMYTRJl7rPvo1UI0EqM8JJtdcJ-D1MWmwF-xQFxSvnWz5P761SgRCu82FlMrrByl25n_XUo1GQs07FqeKWa4eGhOGGxVH3aKW_z6lfAG9inr_-Qh7iwZ2wZsvUsNyCJJJstFqRWSZSxplEeju-e-WOIJ-ztMNVn91DHfeTIiOvXfC1ZOgrrs5S9PpNA_NYXlzrMbgNTrq_i40CUcWKDZbKKNMQ3Fziegrc","iv":"gbzsDnsImZqjm_orj5JmYQ","tag":"MVARiMCpmzlErYES9-DfIWHAJbh0pwvz","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVXNDYWFtVzBsQW5XQWRlekZfZjU2Ml9yaTA5TllYcC1CRE1pU202OV9LakJqSkpwX2t1bWFrZVdTb1RGaEdVSnVONkVsYTl6WUZPVEUxdTVFSWJ4ZHQzIiwieSI6IkFBRnl1WEpuWlVOMnBrb3l2NHdLODhvaWJ3UENXckNYbGFUdkFVVXp2YlR3UUVmYnUtS0NxaUx5aFJZXzVCZkVvajJyZEVTU3ZJY1V0aE9tNFJNc3RjVncifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"8YEgqLWBvvBqyMymZ-Kpq9Bu_Z_NI01IqhJoSd8w2tTkTZTD4L95bSqa8JV-0z3sHjTiMYk6CwQ"}'], - ['input' => '{"ciphertext":"w6l_-xk8sPZQALFwL_9P-PgatydHCrtTLk0adnp0f82x4uNGyViSq89VlOVYoztGr3nhklu7MjpoWXndPOYTEGWkZgfakAoWx_6ISGkz6D37__xDgJGdbbtzICJm-4Y3LeHJeuIQiO-CNiB3Rm2y6tvDjSEy9_xiy8D3c7ysZf9SeBNJDpQxSF3OKl4uc4OMa2om5DL_StA-AscWfDJOBLAJui3647g-SB-K4YWEkgk","iv":"bKfRWGKG6UPNSszCasPinQ","tag":"4VA0oS4q3qjwiqNjj4TI56qGlpIuG0D7UElG5DzisJo","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBYkgyUWxfd045Rkh5MzdzUmQwYlN4Y0N3aGRZRnFzY0ZfRXR5TmxXOWxtUy00ZHlSTTdibXFFVEcwSlZXMUp4SkpLZFF6eThMX2FIdUNLNUtzN01OdDR2IiwieSI6IkFIbXJmeDVrRS1kb0dfSGliM1FzV004QmROaVhZcDBQdUM5Rl9PRVI0cGhSM0hDMGRkSHRodnZrSmlWd1E4U0U0QW9IeVNKb2JDbUlxUzYyU1ZFT1BjMXIifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"kKII7fRYCmcPPEawSTbo3owo4zF2vDBSXNuDf3C-iqwqeF3GH8Fniz_nrWm5KW0Sed3lOtqI_1Hd24-coM-S7V6LAr4Cj2hU"}'], - ['input' => '{"ciphertext":"JKi2Jhq-aOlzScwO3jc5rgcKGbtKwpnhsX1AxyfI9Wa2-AyKItYk3SBwRrHLjN0_xZ5eHXdIDHijcEy1dS03nAwY-skEejCcb8RAW2vmezBEzM0gBCciJ1s6kndKOHn8Jmz2-GmhD6JCK9by0J9BX9_Es0346tXe8d78lPjOxoGloJU2gnFJAU-bdSROAq9YSRo-_vUCzfoAT1f3PykDbZyiIaFlPow","iv":"wv9ZZWV6ifGu4vS3","tag":"tYQxcfD_FyTNNXI9a71Ffg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBTGJoYXNDektjbzBOeFhyUkhHNjFCOWFWQnJVSDRSYklGcnZ0VFJRMVliSDFHTjdhVVFLVktnc2pBM2tuY2tIMmRtOGJ2RDVFSVR6TnhkRUpyV0RyXzZHIiwieSI6IkFlY2xFZmtoRzlvSk9BQk44VjBqREh5Y0hZa3RjRjhsV3FIcVBXekxzNEJla0xURy11c1d2WmF6ZVFlbllsMndTbzBBVE81VFU0MGVzNmg5a1J5QVA5TDIifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"jANGIh49o4xDo0TQMPgf4duV4YGmtgon"}'], - ['input' => '{"ciphertext":"OWkwZ0i9ldnjtjkBgZ93lsg3xm0l4OnP87tRuejocgTq6WYjs0QJ2U41A2akSVIG9T37T0SYnNKi41QGPWPeDpUcmp6u_xEg3-fsLn80eg6_xbjzU0lUNc42hSgRY2ADWM6osW4z0PKVGd22a2cH1be9wUn1BemDbop2RjKRTtocfVtJrqdjgIpVSelezRozQU22rM4GeF8bqLyc1VRaDkkKpkYkjXw","iv":"ihJleRGdOQ-v4d0M","tag":"yEqVOwAw4q1RodSCCWAVzA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBQkZlenV0NVFTWjdMM2hXZXliTmttbVZRQW5YNnduY01XUC1CU1JJYktkUmF2YlpIbDR3eTNDTkdGWTVpMG9YWHJaR0l3U3A0MVNXMWdOVTlVQm15UFVTIiwieSI6IkFUeW5yMmlMTV9wcXBSdUxkX3B5WlN4S2NYTEpBS2loZHZkRkszbkJJemhOWnhfMV8wZHlENGpVX2xqeHZUdm4xc1NUUHY4cmlOVzFpdmJCeFVvWmhsM1QifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"IKXDD3gFCARveeX9ziSCe0r31nCDv6Uwj4OILcAlvbU"}'], - ['input' => '{"ciphertext":"mb1uW7cpr4CtkWbmp6r7sX9hNX12jZZTOwGg-5XQJsVQ3PQPkkn_N8Dr2EoKd9IyLqe9OYWrE_LBDd34mZKHYxhOYGXFR9xABwhop6fiBwDp7VGm5Oj_wv9cl2X3dCJ29WmAUTnGh4OEhBygBM39M9wUNib78Gmjz-iv5N5jceCEN-RMfnuIB0WL1OLq9n-bkRLDTXjSqFUxCkgrE9_nS_Sejoc4KsM","iv":"rnCX9ilzmkw1aose","tag":"K5bqlN1JpPHSQlMv7zFaWg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBU2FJT2FHZGNKWUZtaWtNREFRNkgwdVNZRkRuRGwwY01qYkxobnloN0ppUy1qZWQ3bDlENGc1R19vMUV1M0RCNEc5QVd5UEFmWEhJWWtWYmU3WV95YTBHIiwieSI6IkFWcDZUOG1taGxCSjZRdFBrSW81elFXOVlzd3FVQzRGTEUxVnE0VVhHTDRENjNxSWg4aWpWLVYwa0NZMndGWktKMkVzWTUyYnlMX1lENi1rcTJVaXNOUUUifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"n5DIQLcd4xliTvB-NioJe0A-STuCOVuU-JcHe70BCnWyoPvu4Xe9Dw"}'], - ['input' => '{"ciphertext":"TTjx6GrYn8IphU_XqrzpnLscpDxvG0GTlb1UPulp9m6PwYwSE5IyqwyJef1UQ6-bHLSlWm7CSkp243d0QM3ysv-cdGwRkOG7aMmdUVoZkg6T_grmbm7nO-mvmmxawwwYOQI2Bxv0IPjR_-NdEldbMYf3HE_ZTNcBVvh-uWjYngHC7KqyVFeDc5Ye8FJp5tfr1ujrxAAjTXjRG5mkB6gF1QzMTUaP3PtrB6CIiUNfXJ8","iv":"ZJgv-pIn5y02EdJrLDykFg","tag":"WWOLFNkHRp042hZTLNzN5w","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6InRaZUVkYnZnWnUxQXhVU1NPZTZwcXJpUlF1d2IzdnZXNXQ1Z2ZtNWU2QjQifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"M7-Ghrpqtc3MWKvgfuzUrZY9ZOLsnX3u83WxPR--m2VoKsmmNueKpQ"}'], - ['input' => '{"ciphertext":"YW-S0VU-C7aILn2lTDae6eDVB-1PBx3-xtjGNMIgkAhDmKw5h90HZa8Bf1xMPOYXDfJpD-_IZczeJE9v_nVjRXKux6ki8ldmPgchk48YA3rULAChVv5wwdzJWKQQ-MbrVeJLlBGfRKxrUKiUdLYOiYPaSHpE5eD3HAVhjh1HCw2emlSeyrFjB2ms8LaO9pFc4KHL0r0XBiGnui3We9buky4pYhsXazJq0JW5dO4yUUE","iv":"IlnmwXuwhzGvSxa330IzUQ","tag":"avy5dCCba8TduBUIdS59yQa39P3OhNyw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkxjRnpxaDRjcnJGai1mcmhjVVNCcmUwcnRrakZJbVgxZEh0TlJYVnpqM1EifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"h7UDx4lLIhRBxrLweTs6pn5xYfvC3dLmmgZbPzxyEE4lkx0ANdsKIluO3EDhAZylmgMtSDaB4X8"}'], - ['input' => '{"ciphertext":"_jUi2qOplWRy_udDIRaMFbzGtdNzT4YuoXzR7CKy5FEJfVdO26zZuBjqqxC1Pd-WUyhVdEh13AdfPV7ZToeG8kCGFZU_OrgrFB1gAbeQKoNOdiflFSI2KcjpoY4MH_UAeUPsmuBHJtDDogCCVrte4gYm1On9-6tLamq4pu3RPDKWLQZD_s2oHdgPdqi7vEptgvM7Uah3YDOdz5GRJnBEJKoimrxFEmvzIVGvQkSzmnM","iv":"wPRiBUHyAVQl9LgSEG6_EQ","tag":"kTRaUSmoyWuRWz18rBWibRY5F5qBWgEVDU3MQtfo418","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Ik1hOVRrMGJqeUJCVWtESnMwSjhibGw5dFluTHlrenptZzdiRFdJSWVIVkEifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"vTnxL_DFkfYJv_KxgbyqaWL0HQm2EnMLcFMf6ctT0T-BdhjZklCfo4kyJjCcrS1PP3ai1dKAlsENKHs4S2NPazriAoHrFpYQ"}'], - ['input' => '{"ciphertext":"IK1g25wS9-ZrhP0F3UFvuX_mmy9V4Zc7QLpZ2rjIAyH3RQAcW2Lo3uC1VcG9MBHfvvehHYymtuHaS-jfHTkqlkAM8Umw9NfmUIjQvRyiW-1CECei2R-l1dlKAkoRwAgyj49CED3YkPb6PbybjHl0OCgLo4rUbimOxiRFayuLx51J4sODu-L8QmW2HKKqL0R9ULKKqhhIplGZWiLIdETXnkJPvX2y_uc","iv":"6LVsbG7JkJksn_eM","tag":"4GVV0TtMTLkKXriNKPspvg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlVYWVdDNk9PdHlsZzZqTVpidVFqblhSX2FpdXdVdzg0dDRSS3ZyRy1TMkkifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"9yDT0CM9r87O8RgN7tMLlMRT0J-PCN0b"}'], - ['input' => '{"ciphertext":"S_NBXzk1YBP8AQURXaNk0fhLaIJWygBT2y51fQQRS26y2QgHoeF1uuC-anNPOQBDvWzYaz1dqvsqYjQ2Mr3TZr-i5VtFSxgQsIKBpSqiTw8-lAH3I2VCJFtlAWgL1rksAlVZqm0EzJJMWhhRVIgBOFlFX4bm4-osO-um2jU0y6YGvUknmoE4rk2yckTgNFbxJGgXlCg8eqAdBw6L7JmJH2GKFKluRk8","iv":"CFPOv1KwEy_rQsxq","tag":"2QNLpLlRtHCH4qdvrflUcQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6ImYyWkl4R1hNS3VIOXoyOC1hUTVLdzJYSjBLUlZ3VWhuYVBRdE9NUkd2aGsifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"A0CdqfbHoJUsAy53D_Zawqm_GvgcMIRLEuROny57LAs"}'], - ['input' => '{"ciphertext":"U0YAR0NAlroFurFBi4JW6RcAIaWTEIhhoc-onI9cql6y2Az7g-Da5z0ZZXP-dmDAnEqdxLMdz9sSFou1_uvimrLWftlcxyYr1yzkFFbIblPw-hKkNUJNwbq6maTbFLuDeinCQYo7Z18qjihH22BCIhzcNGDUIOPtH9gnhtWlTx_FTNF2d85fUqDKU48vzWE_KU7jEPwLUM7mbldC6u-my95UaPkCeTE","iv":"qYDygzVjWQq9MHdb","tag":"GqfBJ_ucdjWKSLYMZKe-yA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlBXdE81ank0Yi1hQTU1b3V1eXoyT0FUek5WVFpyb1FpcXpqR1ZKSGlYWEkifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"nAXozH72PRPzt1qQNZbHdII6I7Pcbxxg7wqymlMNiWKh-_cILuFC0w"}'], + [ + 'input' => '{"ciphertext":"8WWzoKIrl16O3boPiTvVivn28js5b6S3JbOMySZ-ujmMCvOeyoEIdLXSxycB0gQeTFsHZ6g-oZqkuJDPNBTbSZznmLjRZQoarfVfxe5jzzJfvK3t89Rkd-phVyUgD4-RNXjuUItMjje3fMTTpw_E1ai6PuGmrZedvscj6BuSkvS4qWzxcZ9234xZzlCRgMzEBG3h4IUu5sWhXwictyMwVUHMBeq0mLSBJO9FEk_TyHI","iv":"aSNbaiq7SIh-6u9FjvhV_w","tag":"uf32NOEXoG-kHG19cc3T6A","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiI3bUFZY0VKWkJXYTR5Yk0tT1JsaFBnSUtMeFh4OEszNXU2S0FjNzZBUFVJIiwieSI6InhESzQ3eVJFYlI1OGdHNF9FTVdCTnZ0UThZVXRCN2dTc2pSeld1aG1iQVEifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"TTZg275GMEwpqiuHVwBi_1vu1hmR5juJOPRB_pPWjUUQ7zUtDAIp3w"}', + ], + [ + 'input' => '{"ciphertext":"--WXckNnEfBZgO50CgXLkNSwAHnWhzBlwyMl-JlPYzicmw_P5I9oX5kb-Hz8nstSyhwgrepcX1Q0ALDOD3Pdbf-wVuA-AryGP-dT9aWkgtopsHZv0bI1Hvreb6tmtI2qDq5zwM03bBlKzVMort6g3NXqvIBto1wskRsTmfDVnBwGXbEPWVPAHDHCxFJGZ6iQ8DeGjEgwQNdt565ZgOsgTqBV3dNUY0hhnXYDkEmteiE","iv":"L8ZADssAMXIy8bSmHF7B4Q","tag":"l0fPMEEIiml_GoAPppneYQafGgrvCHvM","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJoT3NXMzRIeWRTZEswcHNmd09sbW81ZFlMaU9UNllBX2tOU3RUN1BxQ0I4IiwieSI6ImE0c2RqMTBJakYzcUpCVWJwcS13NEh6QzI2ODF1UjY5TXl2MVFYNVFQX1UifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"6edmcKAhRI1HkZssnFGMDHkYwwlzZ_d8Ij6ZoW27BMtOmueRI7JXivdikiB4Te7HzGPyoygN3X0"}', + ], + [ + 'input' => '{"ciphertext":"ElP-FfX2PlRU6xQL4auDQejBqnwYcDLXMpyY7snEtoSj4ITHwJmNpGSD1yh0N_yDeSPf5HFqLDlzM8JZZQ83pOY_Sn5iO452WFeWtjNYOD9XB1AwPOQdBg25MSZxIdwKvzbYAs3FILw1swuHgXfdomGDJhIKQbKSBinAziGuvrCAio1phqwLrRG2vJApmWBHXjbuJzwv_K2ZBDLf8SDFvmTbuZZ6mm4fPZSWyEo71p4","iv":"w2LROvAqZDdkyiTv5CTMIg","tag":"QF0y2Be8wRWiAONqVwYFfoPQjc0NRrL8lO3if-SpBq4","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiIxTWtRWlc3MzRqZ1l1V0tFSjFrWXdNa1lGclZJeXd2QVJaMXdvTEhNOUg0IiwieSI6ImdSTktaOFZpQ2hJM3Y0RXhiVzUzYmNSY3diS1MxYlQxLVRQc0p5TURfaU0ifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"r0cwT0y_zzbV4zVXEY5Sh66bKtX32971vZ5ygeoCTtpN1oEuTANEZ9bWzJMuC3EPnuYO4XWopaac5FFJxBQt3hX4wvah9kkJ"}', + ], + [ + 'input' => '{"ciphertext":"vxE_6ULATftYhRAW86hSchRc49VscHXtg3bLhSFHZns3tVd6zIMo0xG0q6psAEGRmGs2Z4DwUAbrrZ-6YSPn1xjMEgMhSyXqZSM7rEca0bFeaM5N9cIKuiaSOLKGNiJ8SATtoUlg9wu3CU_ycCYoXo1dlmfwaRHD419ycqVDI2DVZDg6iuhPR2rIW4FZujn-psbQhZClozNOWkORkJSp2lJGIOs0jkI","iv":"lAOeapEH6BRLDmQl","tag":"6RoKYl11I-iu_-nn_qxTPQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiItSHlUVWhHUXR1dDVxTUJrdGIyLUVyQTRrRnFQZ2dYU1ppN2ZkMjJ6YXZVIiwieSI6ImpsUGhad0w3S0I4YmJtZ1Y2eC05R2JJZFh0N1NaaFJlZldFYUVCWTN5YXcifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"HzkOCsTSv-V9-QwEJbMt7rpHoU-rPgIE"}', + ], + [ + 'input' => '{"ciphertext":"L2Z_gtDHQyWWcI6VMZzje4dxVbKGX6tS6DsJITn5HzkaaQlXK8w2h4RD7VGNVbA2lg1yeGWf3i2Z_3gZPTYKLUMtDEUIJMSOyNZHzRWvcaCkgBLp3vBbkJevH0Wc-P1QIdhIByUvgPTo6OrTKMT1yonlQ8U3g6_xovTID1yoc2qdEVB0inx3Tq7HVRlto7nMI6Z48VT9CN5r4SmS3jXAZsortsG2k54","iv":"wol3soUEVXh0OYxF","tag":"tYvCovXomiyroVCYT74iig","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJhQXQ2V1FIVFduVDdUV0JPaHBPNEN4ZmNXUUFUNFhMcFl6Y3lpTTluZmZjIiwieSI6IjFwWEpmVkZwamQ1QWdSTEY4UUprNEZ5QUN3TElJaE90U0plb1FIQnU1NWsifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"FiU_lrERwsTL4qvnevyf2DxkjhxQ5v-ArGaHg7G4D24"}', + ], + [ + 'input' => '{"ciphertext":"6G-SHyO3wk8rAnYTGwxIOmG-1Aq7ujSC__aqG5iaDI6RX9YtcZdOAqIjtzKG_itRHa1uxGMzJqROG7haHEJpA62NGt8et5njC6oqsYNl2RC8YwwtJysK6_hvcHlxaIDFKp7ZQ3vgKvips4Ro8AkR58XpH1GF_Rk1RsFbJONWMDe_vK98tf6CSruK9LLu6LYU8JlwL0bUGptsdHPJRKQkM02yg4jA9nM","iv":"ih0vR-rb80lr_WVg","tag":"L7-8h3JG_st0sedwDHC4iA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJOWU1lbjlQcmE0Nm5XZFlBbW5KQ0FmcmNtZjBfT243cEVkWllkMFhBSmZjIiwieSI6InZYYXZxQmlNblhUUkZud2N3OXg5WVc5NDk1enQ3X3hBbDNFN2ZBdkxvYTAifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"Bgdqgux6pY8oUbufB7iHfMgb-EsffDBtOIOEDOqS45K85QY5dmotPw"}', + ], + [ + 'input' => '{"ciphertext":"f3sJ-VeUMSCDCs6_ym7mG0bGOJZwD54qu6xTULFgV_LZHLhLpzUFG1MX38EHSLay70c6g1Ob9nxFYc-EYiULNkfUfvpTFK6E146zQZmuKCS2u04KpDHrriBPutvJue60HWVuejkscDiP2-wzRuU4qskGzWCDTzj-YvZw5ftdhYztgolCZQDDfe67yC6ywpdOS4WLsk6s4yZJfK4TIRlsVxCPueU6wyQvkvO_EF8_PY0","iv":"eGtwRbrxNeaBdTp6yIiZtg","tag":"ur27HEz8ch7Oqs2uZKpybw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJ2b1dyQkd5SGJ2R1ZJR0piOU5lV3lPcm9VRkZZWl83ZkN6TE1sV1dlQUROSU8za09BMU4zNkZnelVaYW93eUdkIiwieSI6InlqWGtWUVdKQi0yWWl3azdDRFpySk1yd2NPald6dEV2czVUVzdYV2pZSVFYTTMtOFZncW1BMGt4d3ZsSjZFQm8ifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"d8JZuYKkoEYF-DveajkvDTUouMun6X4OmsAGDb9p1qOMX2KmwNfvUQ"}', + ], + [ + 'input' => '{"ciphertext":"TiMVN3-mo0Rcu2SG04FNiYqDSIk60BH-soXYLQgq4J457UFWDCMPBf6oVRAYTZJwiDEONWdc2iFEW7CfRU_dMc2DsO0kHMME3w5Uqptm5Nay5dcIJrcoICptnlPxupM_qyDgKOmF-x5oelgWdy5erSrQ-JX7bxTTw5TAHQ-iRlSZFb_eecYaf92V8CKqS9K2KqPTiZ_1fIiZnqQHyLmggqmifeWPHiO8ox3kI-LtebA","iv":"B9a80FX3up3SuV1Qqs9ydQ","tag":"rsvZ-bvbD2pMoCvYT8Hsag4STmKjcAi2","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiI3SDhjU0xzeWFmck5McFlZWFRTWmRLMlIwLURZUFFfVkkzNFA5WkgtM0VPSGV3aU0tdk41SkxxSE1HMzRFay1VIiwieSI6ImoxR0FmMjVCNm1SUE1lT3lwS2VpQk50ZmphNVZYMV9DRE1YcGIyRmlaajhxckc1WnBFOWtKZlV2Q3M0VC1PVU4ifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"yELqAjD6BDP4BjRf8Wbfb9vLj4tWpjjUiYLyb69Zo7x2BP7Dp1LhpWSDwKugswmRK5Tmhlqt1OM"}', + ], + [ + 'input' => '{"ciphertext":"NssjbtiTmnZrm5A5QMC-wS8oY8jVNRhs3b0cZWpEYdbFhtMMEOv0yI2JNLEkaA2utQs2O_GnIZbodCp6Dr1UoirPmX5GPiBa3wRQo4hflfCLY_tZ2JBaXB0ZFSokUEOZSOnbSNZ1Pa6EAy8QhAOwCgj5yrPbq6bvBv-JMfBS6YxhA3b7q1PV6VSkLWHn-FTvsMp3HMjzMRgj_l_Fz5n5Z-st0td8rq45PR0nlKgEnKI","iv":"l8XxXvQp-M8rIgA-_xkuCg","tag":"c2GrOJR84Xdjp-i4QtIYrjIbtDKtPvQ3Or4g9cGQP5Y","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJ4NHBOLWEwd2NkbVl5RW1kb09uUUJFR1o2OHVXNmVPUUlaZ29sMHhDaGU4V0pjcU1lMkQ0MC1UcEc5S2VhSzZqIiwieSI6ImVfQXNZM3pPSktYYUcwNG15RFFmUFdZSkJ3eUlXRVJyNGJZMTExTnJsc2x4VWRTT2laa0ZLTWtGdzUtQkF2VmYifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"jWzJiC_cdSHreMdQ2MChUWDGiE_QFY7KkTtLTEuHHzG7E-5PCFMfnkSeZ75vrqtawqm0XwsVBPir1lDkC-mKMUe7mHEr1dPQ"}', + ], + [ + 'input' => '{"ciphertext":"Mi_2P4e8uiptwMNQrUfTeQyY9-UpHdCsqTtCgHyX2k2wkKCEksmO5uGqgFS4vP9js76i-baltDNes-xH2tGYEFZpv9hpT5Mh784RpChxPC_LneCsN9_52SibnJO8u4umCyF3pJfkUUB9QXPIQQ4qTuuBgzfAXthK9cMxNZPP94hRRZgj3ZnbE3I36_NgANfQ2XVuGF3q6KQ-55KIFDL837SPRuNfzEM","iv":"O6u6sfSNvozzYC7k","tag":"e55FLRLwxKbKh5uudliVCA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJueU9UVURWUTBmV3RmcHFWc2lCZC1jLWdBRFdhVExoZEFiTmNiazBaMjVWc3Jhd29uQkZyQVVIYk51Tl95Z181IiwieSI6Im9nWkZlWVhVS25CUkhpbzJLYWJvTllNXzVCU3l0UzFDVHZ0SzZqMkxXb2JjWGhjSzJvU2cwdGJpQS1YRmxGNl8ifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"6hywjs7eY_AGzE0r4AcmM1pw_ET6hwFO"}', + ], + [ + 'input' => '{"ciphertext":"B---FvtsBS1ABH1Fz6PbtVU5t_WxpPGUhIRvrpEP3_YKVu36i4TImczF-L3cgeeFjypkmbM6hblJQmek2QFL5x9GJF6KzobCv_3g5KkFBNfEH8NwOcdUbmsSsPOEI_5ZTwcno-hHcc1PrEueUREwpLyJ0oP-1IgOHJn4j8NqeqWEAtcxzvQbWonBDF6o2c70SgPzCGZy01dJvSEosudOGpJtsCm4hvE","iv":"WUxQgfmtQWZtX3Bk","tag":"B08AHwCsv5zO1ZmX9wbQHw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJYbUlNX1NVY3J0Ymd0VjBYOERrY19zVFl3bHphdnJPRGJFRFhmb1NNaF9FU2pFN185UkIwNXhIaWw5R29zTFNwIiwieSI6InlEZmdzSEFWaVdxVUZHaWdSNy1XYml3UWRhWldOLTFyeFpyNVJCR2dTV1NBdXVuUnRoQzRxQ3JOQ2FiblV0bVYifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"04KAt72HccxdDIiSjuzRXm9hpNwJcRkRLG6dzuQvBcw"}', + ], + [ + 'input' => '{"ciphertext":"2l8m7S7WgvbAgg5JvvxpHTkpIeHTVcJDDjZdJX3a-pakoEqw9UDbsIHGJE_W6Gl4bMaRhRTMTsg8_xoqoIiif-NYGZKhKvJ2CBifeVaTZJjdcQJKovjvpJGUBMtev7F4pPnTnLPnRnLax4MXgpkOTv9ryh69Knn8zbcktnO93kO6ImzRCK5hwRE9hS82Bg-2Y4eNBsnsHAfkFCU8UX5z9nTOLDyQVns","iv":"aWjEAIckOJ5SxsrB","tag":"UNJ1ghRwzGG9wDzbnAdwrg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJ4UUNhckRYU0tRMG81TlZOTVE1RmptWFFoNWFFdWpzV2pJRUM2Q24zdGdybG92OHl1VlkxWEh1cUdpTXF4MUplIiwieSI6IjQxMG9vLUsxRDVoTGxPekxIV0NjREV0eGsybnJVYkVLTUdoMEpZYWxZaFNiR0pXWkd1Vy1OV09zeDY4dzR1dHgifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"M1FUr3rtiak6u_GUN0gm3Ahn7sjIMon5RmO3lVOrgXhnmHvLfgw6Uw"}', + ], + [ + 'input' => '{"ciphertext":"7kFxr0VKVbmJg_ro-7Fj8e6sQBKsQefPB1xQ-_FuUL1wS8w5CA7lnIpQTXoAwbFMClP3U62mrfz26d3EVHDi1b5sWoUui3V2OnLD6CxqpmJdAHQUgHeYaOglgfJWLJryqn6b1X2CJ8qcg5vy8rqPHHghAY0tgA3iA_OcPuYc9383yLWTcLmghRKwa5yw6zbYKXBXdT2WY8Leum9nqvZT4rTMeO0_QiOlgn-qFk2n5yM","iv":"FluGprT7jlECz74k2s6R_g","tag":"nNRf2uQSRZwNNubODrXSrQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBWlI2VEdpbFRVdmxoZFVnWktyYjNIbkZ6alp6LTRJMzdrSDBxR3BQaUlYenQ5bEwtSnh4QVRiV09sblNLSm5FbUJVVFZ0empYS0l6cFA5eklfUGR1TTFSIiwieSI6IkFid1VHaTVTaFRtR2dEaVlGSko5LThjUGh4b1U0elZ3clQwWmtmLXpkZWIxYy1nRk8yUWF4a0JVYTFqT3FQeGxnUDJYeEpXSlBqNHlGS21ISlR6bzN4NWEifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"ZJAvb1EpUU7CI7Kr8NkGswvdCsumf1JVUF2IaAKGrxOdIJEbTocVPw"}', + ], + [ + 'input' => '{"ciphertext":"eUpwHP_TPDMYTRJl7rPvo1UI0EqM8JJtdcJ-D1MWmwF-xQFxSvnWz5P761SgRCu82FlMrrByl25n_XUo1GQs07FqeKWa4eGhOGGxVH3aKW_z6lfAG9inr_-Qh7iwZ2wZsvUsNyCJJJstFqRWSZSxplEeju-e-WOIJ-ztMNVn91DHfeTIiOvXfC1ZOgrrs5S9PpNA_NYXlzrMbgNTrq_i40CUcWKDZbKKNMQ3Fziegrc","iv":"gbzsDnsImZqjm_orj5JmYQ","tag":"MVARiMCpmzlErYES9-DfIWHAJbh0pwvz","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVXNDYWFtVzBsQW5XQWRlekZfZjU2Ml9yaTA5TllYcC1CRE1pU202OV9LakJqSkpwX2t1bWFrZVdTb1RGaEdVSnVONkVsYTl6WUZPVEUxdTVFSWJ4ZHQzIiwieSI6IkFBRnl1WEpuWlVOMnBrb3l2NHdLODhvaWJ3UENXckNYbGFUdkFVVXp2YlR3UUVmYnUtS0NxaUx5aFJZXzVCZkVvajJyZEVTU3ZJY1V0aE9tNFJNc3RjVncifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"8YEgqLWBvvBqyMymZ-Kpq9Bu_Z_NI01IqhJoSd8w2tTkTZTD4L95bSqa8JV-0z3sHjTiMYk6CwQ"}', + ], + [ + 'input' => '{"ciphertext":"w6l_-xk8sPZQALFwL_9P-PgatydHCrtTLk0adnp0f82x4uNGyViSq89VlOVYoztGr3nhklu7MjpoWXndPOYTEGWkZgfakAoWx_6ISGkz6D37__xDgJGdbbtzICJm-4Y3LeHJeuIQiO-CNiB3Rm2y6tvDjSEy9_xiy8D3c7ysZf9SeBNJDpQxSF3OKl4uc4OMa2om5DL_StA-AscWfDJOBLAJui3647g-SB-K4YWEkgk","iv":"bKfRWGKG6UPNSszCasPinQ","tag":"4VA0oS4q3qjwiqNjj4TI56qGlpIuG0D7UElG5DzisJo","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBYkgyUWxfd045Rkh5MzdzUmQwYlN4Y0N3aGRZRnFzY0ZfRXR5TmxXOWxtUy00ZHlSTTdibXFFVEcwSlZXMUp4SkpLZFF6eThMX2FIdUNLNUtzN01OdDR2IiwieSI6IkFIbXJmeDVrRS1kb0dfSGliM1FzV004QmROaVhZcDBQdUM5Rl9PRVI0cGhSM0hDMGRkSHRodnZrSmlWd1E4U0U0QW9IeVNKb2JDbUlxUzYyU1ZFT1BjMXIifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"kKII7fRYCmcPPEawSTbo3owo4zF2vDBSXNuDf3C-iqwqeF3GH8Fniz_nrWm5KW0Sed3lOtqI_1Hd24-coM-S7V6LAr4Cj2hU"}', + ], + [ + 'input' => '{"ciphertext":"JKi2Jhq-aOlzScwO3jc5rgcKGbtKwpnhsX1AxyfI9Wa2-AyKItYk3SBwRrHLjN0_xZ5eHXdIDHijcEy1dS03nAwY-skEejCcb8RAW2vmezBEzM0gBCciJ1s6kndKOHn8Jmz2-GmhD6JCK9by0J9BX9_Es0346tXe8d78lPjOxoGloJU2gnFJAU-bdSROAq9YSRo-_vUCzfoAT1f3PykDbZyiIaFlPow","iv":"wv9ZZWV6ifGu4vS3","tag":"tYQxcfD_FyTNNXI9a71Ffg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBTGJoYXNDektjbzBOeFhyUkhHNjFCOWFWQnJVSDRSYklGcnZ0VFJRMVliSDFHTjdhVVFLVktnc2pBM2tuY2tIMmRtOGJ2RDVFSVR6TnhkRUpyV0RyXzZHIiwieSI6IkFlY2xFZmtoRzlvSk9BQk44VjBqREh5Y0hZa3RjRjhsV3FIcVBXekxzNEJla0xURy11c1d2WmF6ZVFlbllsMndTbzBBVE81VFU0MGVzNmg5a1J5QVA5TDIifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"jANGIh49o4xDo0TQMPgf4duV4YGmtgon"}', + ], + [ + 'input' => '{"ciphertext":"OWkwZ0i9ldnjtjkBgZ93lsg3xm0l4OnP87tRuejocgTq6WYjs0QJ2U41A2akSVIG9T37T0SYnNKi41QGPWPeDpUcmp6u_xEg3-fsLn80eg6_xbjzU0lUNc42hSgRY2ADWM6osW4z0PKVGd22a2cH1be9wUn1BemDbop2RjKRTtocfVtJrqdjgIpVSelezRozQU22rM4GeF8bqLyc1VRaDkkKpkYkjXw","iv":"ihJleRGdOQ-v4d0M","tag":"yEqVOwAw4q1RodSCCWAVzA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBQkZlenV0NVFTWjdMM2hXZXliTmttbVZRQW5YNnduY01XUC1CU1JJYktkUmF2YlpIbDR3eTNDTkdGWTVpMG9YWHJaR0l3U3A0MVNXMWdOVTlVQm15UFVTIiwieSI6IkFUeW5yMmlMTV9wcXBSdUxkX3B5WlN4S2NYTEpBS2loZHZkRkszbkJJemhOWnhfMV8wZHlENGpVX2xqeHZUdm4xc1NUUHY4cmlOVzFpdmJCeFVvWmhsM1QifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"IKXDD3gFCARveeX9ziSCe0r31nCDv6Uwj4OILcAlvbU"}', + ], + [ + 'input' => '{"ciphertext":"mb1uW7cpr4CtkWbmp6r7sX9hNX12jZZTOwGg-5XQJsVQ3PQPkkn_N8Dr2EoKd9IyLqe9OYWrE_LBDd34mZKHYxhOYGXFR9xABwhop6fiBwDp7VGm5Oj_wv9cl2X3dCJ29WmAUTnGh4OEhBygBM39M9wUNib78Gmjz-iv5N5jceCEN-RMfnuIB0WL1OLq9n-bkRLDTXjSqFUxCkgrE9_nS_Sejoc4KsM","iv":"rnCX9ilzmkw1aose","tag":"K5bqlN1JpPHSQlMv7zFaWg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBU2FJT2FHZGNKWUZtaWtNREFRNkgwdVNZRkRuRGwwY01qYkxobnloN0ppUy1qZWQ3bDlENGc1R19vMUV1M0RCNEc5QVd5UEFmWEhJWWtWYmU3WV95YTBHIiwieSI6IkFWcDZUOG1taGxCSjZRdFBrSW81elFXOVlzd3FVQzRGTEUxVnE0VVhHTDRENjNxSWg4aWpWLVYwa0NZMndGWktKMkVzWTUyYnlMX1lENi1rcTJVaXNOUUUifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"n5DIQLcd4xliTvB-NioJe0A-STuCOVuU-JcHe70BCnWyoPvu4Xe9Dw"}', + ], + [ + 'input' => '{"ciphertext":"TTjx6GrYn8IphU_XqrzpnLscpDxvG0GTlb1UPulp9m6PwYwSE5IyqwyJef1UQ6-bHLSlWm7CSkp243d0QM3ysv-cdGwRkOG7aMmdUVoZkg6T_grmbm7nO-mvmmxawwwYOQI2Bxv0IPjR_-NdEldbMYf3HE_ZTNcBVvh-uWjYngHC7KqyVFeDc5Ye8FJp5tfr1ujrxAAjTXjRG5mkB6gF1QzMTUaP3PtrB6CIiUNfXJ8","iv":"ZJgv-pIn5y02EdJrLDykFg","tag":"WWOLFNkHRp042hZTLNzN5w","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6InRaZUVkYnZnWnUxQXhVU1NPZTZwcXJpUlF1d2IzdnZXNXQ1Z2ZtNWU2QjQifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"M7-Ghrpqtc3MWKvgfuzUrZY9ZOLsnX3u83WxPR--m2VoKsmmNueKpQ"}', + ], + [ + 'input' => '{"ciphertext":"YW-S0VU-C7aILn2lTDae6eDVB-1PBx3-xtjGNMIgkAhDmKw5h90HZa8Bf1xMPOYXDfJpD-_IZczeJE9v_nVjRXKux6ki8ldmPgchk48YA3rULAChVv5wwdzJWKQQ-MbrVeJLlBGfRKxrUKiUdLYOiYPaSHpE5eD3HAVhjh1HCw2emlSeyrFjB2ms8LaO9pFc4KHL0r0XBiGnui3We9buky4pYhsXazJq0JW5dO4yUUE","iv":"IlnmwXuwhzGvSxa330IzUQ","tag":"avy5dCCba8TduBUIdS59yQa39P3OhNyw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkxjRnpxaDRjcnJGai1mcmhjVVNCcmUwcnRrakZJbVgxZEh0TlJYVnpqM1EifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"h7UDx4lLIhRBxrLweTs6pn5xYfvC3dLmmgZbPzxyEE4lkx0ANdsKIluO3EDhAZylmgMtSDaB4X8"}', + ], + [ + 'input' => '{"ciphertext":"_jUi2qOplWRy_udDIRaMFbzGtdNzT4YuoXzR7CKy5FEJfVdO26zZuBjqqxC1Pd-WUyhVdEh13AdfPV7ZToeG8kCGFZU_OrgrFB1gAbeQKoNOdiflFSI2KcjpoY4MH_UAeUPsmuBHJtDDogCCVrte4gYm1On9-6tLamq4pu3RPDKWLQZD_s2oHdgPdqi7vEptgvM7Uah3YDOdz5GRJnBEJKoimrxFEmvzIVGvQkSzmnM","iv":"wPRiBUHyAVQl9LgSEG6_EQ","tag":"kTRaUSmoyWuRWz18rBWibRY5F5qBWgEVDU3MQtfo418","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Ik1hOVRrMGJqeUJCVWtESnMwSjhibGw5dFluTHlrenptZzdiRFdJSWVIVkEifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"vTnxL_DFkfYJv_KxgbyqaWL0HQm2EnMLcFMf6ctT0T-BdhjZklCfo4kyJjCcrS1PP3ai1dKAlsENKHs4S2NPazriAoHrFpYQ"}', + ], + [ + 'input' => '{"ciphertext":"IK1g25wS9-ZrhP0F3UFvuX_mmy9V4Zc7QLpZ2rjIAyH3RQAcW2Lo3uC1VcG9MBHfvvehHYymtuHaS-jfHTkqlkAM8Umw9NfmUIjQvRyiW-1CECei2R-l1dlKAkoRwAgyj49CED3YkPb6PbybjHl0OCgLo4rUbimOxiRFayuLx51J4sODu-L8QmW2HKKqL0R9ULKKqhhIplGZWiLIdETXnkJPvX2y_uc","iv":"6LVsbG7JkJksn_eM","tag":"4GVV0TtMTLkKXriNKPspvg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlVYWVdDNk9PdHlsZzZqTVpidVFqblhSX2FpdXdVdzg0dDRSS3ZyRy1TMkkifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"9yDT0CM9r87O8RgN7tMLlMRT0J-PCN0b"}', + ], + [ + 'input' => '{"ciphertext":"S_NBXzk1YBP8AQURXaNk0fhLaIJWygBT2y51fQQRS26y2QgHoeF1uuC-anNPOQBDvWzYaz1dqvsqYjQ2Mr3TZr-i5VtFSxgQsIKBpSqiTw8-lAH3I2VCJFtlAWgL1rksAlVZqm0EzJJMWhhRVIgBOFlFX4bm4-osO-um2jU0y6YGvUknmoE4rk2yckTgNFbxJGgXlCg8eqAdBw6L7JmJH2GKFKluRk8","iv":"CFPOv1KwEy_rQsxq","tag":"2QNLpLlRtHCH4qdvrflUcQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6ImYyWkl4R1hNS3VIOXoyOC1hUTVLdzJYSjBLUlZ3VWhuYVBRdE9NUkd2aGsifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"A0CdqfbHoJUsAy53D_Zawqm_GvgcMIRLEuROny57LAs"}', + ], + [ + 'input' => '{"ciphertext":"U0YAR0NAlroFurFBi4JW6RcAIaWTEIhhoc-onI9cql6y2Az7g-Da5z0ZZXP-dmDAnEqdxLMdz9sSFou1_uvimrLWftlcxyYr1yzkFFbIblPw-hKkNUJNwbq6maTbFLuDeinCQYo7Z18qjihH22BCIhzcNGDUIOPtH9gnhtWlTx_FTNF2d85fUqDKU48vzWE_KU7jEPwLUM7mbldC6u-my95UaPkCeTE","iv":"qYDygzVjWQq9MHdb","tag":"GqfBJ_ucdjWKSLYMZKe-yA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlBXdE81ank0Yi1hQTU1b3V1eXoyT0FUek5WVFpyb1FpcXpqR1ZKSGlYWEkifSwiYWxnIjoiRUNESC1FUytBMTI4S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"nAXozH72PRPzt1qQNZbHdII6I7Pcbxxg7wqymlMNiWKh-_cILuFC0w"}', + ], ]; } @@ -89,30 +146,32 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'crv' => 'P-256', - 'kty' => 'EC', - 'd' => '_gUgAjx9zU5BKlHq--TiCjZmsdNQAgrv536DCTUM2vo', - 'x' => 'Kuh77MGkweIENgR_3WjzJ4gEF47yn6yQWAeeNqYC5qo', - 'y' => '1koAqIfb5C2PkCT1GYEcW4IcIEdrgOdMcua6G0Eyhtc', - ], [ - 'crv' => 'P-384', - 'kty' => 'EC', - 'd' => 'Fn_Le74znJfY33TkqCoskx1pkgA_1sLnKvfvM_78lTZT2zfj4XC6uY_L8iRknOii', - 'x' => 'o5CqgE0jIlCVwGKMXDsQmkOgxohJcod4hv7jo4h7qeRoysAV0YPtokMgv7CUpSCG', - 'y' => 'Z3ZGVhyv3T-MudQI5fYNmkO1BzqlHQJHCQ9RQzqa05QOsUZo39gjVC2EhRv1Z9kz', - ], [ - 'crv' => 'P-521', - 'kty' => 'EC', - 'd' => 'ACebnk5N5RV4VFhrCmvp-5w6rsQJvHdvvBdJkIKmq3pDDreKC0vU-K2oYrQaX5vPuI1umnVw9qxFq6QCsShJ38Fh', - 'x' => 'AR05Z1Xe74_lcrJbhKg12jijs5LPbLwcpHDGETssYKRgbO3-4l7egk_WtLjSeXmDvRfkww9kKpFdKHTqmDYSIzxf', - 'y' => 'AL7NyrGpwcXqfvmQb4d7N6vO7REegUaFv8ea-_EXyA2eJciZJSmvipwpxRnoSfkNuJ5yJUGdjg_FtaddKaLdJEf_', - ], [ - 'crv' => 'X25519', - 'kty' => 'OKP', - 'x' => 'LD7PfRPxq03bd0WJyf_1z-LQevmrbcYx7jJafep3gmk', - 'd' => 'pSdgXFRYMvOa7giAm3Rrf5Mf8GnvLz7HtZKu_KN06KY', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'crv' => 'P-256', + 'kty' => 'EC', + 'd' => '_gUgAjx9zU5BKlHq--TiCjZmsdNQAgrv536DCTUM2vo', + 'x' => 'Kuh77MGkweIENgR_3WjzJ4gEF47yn6yQWAeeNqYC5qo', + 'y' => '1koAqIfb5C2PkCT1GYEcW4IcIEdrgOdMcua6G0Eyhtc', + ], [ + 'crv' => 'P-384', + 'kty' => 'EC', + 'd' => 'Fn_Le74znJfY33TkqCoskx1pkgA_1sLnKvfvM_78lTZT2zfj4XC6uY_L8iRknOii', + 'x' => 'o5CqgE0jIlCVwGKMXDsQmkOgxohJcod4hv7jo4h7qeRoysAV0YPtokMgv7CUpSCG', + 'y' => 'Z3ZGVhyv3T-MudQI5fYNmkO1BzqlHQJHCQ9RQzqa05QOsUZo39gjVC2EhRv1Z9kz', + ], [ + 'crv' => 'P-521', + 'kty' => 'EC', + 'd' => 'ACebnk5N5RV4VFhrCmvp-5w6rsQJvHdvvBdJkIKmq3pDDreKC0vU-K2oYrQaX5vPuI1umnVw9qxFq6QCsShJ38Fh', + 'x' => 'AR05Z1Xe74_lcrJbhKg12jijs5LPbLwcpHDGETssYKRgbO3-4l7egk_WtLjSeXmDvRfkww9kKpFdKHTqmDYSIzxf', + 'y' => 'AL7NyrGpwcXqfvmQb4d7N6vO7REegUaFv8ea-_EXyA2eJciZJSmvipwpxRnoSfkNuJ5yJUGdjg_FtaddKaLdJEf_', + ], [ + 'crv' => 'X25519', + 'kty' => 'OKP', + 'x' => 'LD7PfRPxq03bd0WJyf_1z-LQevmrbcYx7jJafep3gmk', + 'd' => 'pSdgXFRYMvOa7giAm3Rrf5Mf8GnvLz7HtZKu_KN06KY', + ]], + ], ], ]; } diff --git a/performance/JWE/ECDHESA192KWBench.php b/performance/JWE/ECDHESA192KWBench.php index 114c59a3..0c2ac8c4 100644 --- a/performance/JWE/ECDHESA192KWBench.php +++ b/performance/JWE/ECDHESA192KWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A192KW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A192KW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A192KW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A192KW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A192KW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A192KW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A192KW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A192KW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A192KW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A192KW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A192KW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A192KW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,30 +67,78 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"239HNO--jJWqy20I6I9aQ5x86whqVQjFPlN9YRYjOi8ekbOM5YGIuyhbYF3Gdo2-MTqxjFZPOQ8VZVN8hdIL0n1hPIeD0IKl7Um1NcKShGtQtu2Sduyxa4hi6jAqf8LwvzjpVtI7o9DXE8HHUr1-XG4J4-mzDxSBFgbmIR3O0pWqp5-NdaGNOVkVlfbcTRimuDBsKZdJ6jWF6dM0SLq91rHC5mgtfPtYgvV38U8shvE","iv":"3iT5_YJ5uoslgv6uTlRgSw","tag":"Cxpt_nE_2RFs44A2G92Cow","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJpWVRydzFaaXZtdGh2TjVIYndGX3d4WkNoNVJmNFV0WTJjV04waVlVeHlvIiwieSI6ImRISlVpdDFkSVVFM0hjOS1OaUtHS1FNNnp1djBaY3Rwa045NDdxOWxFZkkifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"Gvg1uxRX6GpWKaLL6Bry2q454RfZR7psyruGv3kuf9kNPJD5-j0RWg"}'], - ['input' => '{"ciphertext":"RDFW5wr_AqtcHGKv654vUBzFzHE9DQHExhS9r3uPxSDjI9NikzsjHEV8YjXVX9if06gzoHHb-cGXuJRoJI1gC9TY6kx77oll12fEu3FgXVuL1gZ7U9Ujj5wgI-scT5UmdxgUravP9Qim0kwTmTqXAn0RRuI2jVIZUhshzHUhuj-QsPDR4wrccMjmjyk6HLGpPpsegQb-f9u_GSg8EhUQuMWr1GYbHU4jawm9WtzOOh4","iv":"DGyn-kYAyVxGw3fJ1pGZ8A","tag":"AeF6-aceyQDUOtJreAS-BBWjGUu4T_re","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ2RHdRMXc0eWhZY29QLUlSX05zY254bUhmRnFGdWp1bUFFTWVJaVo3ZVJZIiwieSI6IjJyUHRWVkJiZmlwN21ZMTktb2Q2YjdiX0w5SjFNZ0FfQ2U4NTc2VUQzbDAifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"6c67kMrZe11m540xts24zTVGWeTq-H8MTIzWW_pRVXcrGEHyc7N4PeZHngPDY_Mxi1GiW1r5e0s"}'], - ['input' => '{"ciphertext":"lKWsvlYaWoSsnw-NuywVrHgp0LaC8_g6ZRcCHJmnCErqApTi4Sn2sfz9Ew23xguK3qH5bwYqhqQQSpihQ-BLMZ8XkUrwWTPcp6UsQ1QlEevaBi9_cichIl81-HQyPINgIM-t6klxXK9X2n9DB-BKmhVHYbdwyBsHvWgbS3PHOyBKwGa-pb5thQLcPC0fJn9tRmCbGXoMuAFLtm86TFq20hMBoNNLmwW122x--zz8XUg","iv":"FXV6iLlbpLaFDFoYgUo4Ig","tag":"5aTUQ9M79YYJHROzeQozQI6QvUaxqYPOOomrz7s7CuE","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJubS1vZ0N6TmdKUjc1MHdlWWlFcnRHNUE5Y2U4X3pOYWp0dFozcVZfeUg0IiwieSI6Ii1ta3dKU1pidTlFV05sS256cXBQRFZkU293TUpOVXA4Mmstc1VVcURZbHcifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"NNqou4kIX5HdcXCauOIg8T2gj7OMnZs4fNOuKBV7C1oue44ctUO6wZfbh5U-0pwt3Y4q5l73JGCisLaQICJGVnRcFmk2ZfHo"}'], - ['input' => '{"ciphertext":"F_zLcuR6OO3TBQ7uouORvGAvdNT_6eMt_ck0U-nXSQ5sqMEgKYuFMP7FMLRYTKZyzYQjj5DNCntbdQb5_31ifDCuOIVIRG9SsD0M9ZhKEXm3hM9pDCb90MbC3FD6fwcR6HbQfriq73WmBFbM1xtfVPsrAnrdNRlAaSJtV1Owf5yAvv7qx0vebMrOAOi_SBO0Qd_Gx9RjbHHEEZG18a_ZlLgwfrP1Ihs","iv":"FST1A5XpZBVfvn0B","tag":"lH1Q_KJUrPbp5r2n0P2WIg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ5cFhDYXJ2VUZWVS1CeDBiVkVITDZGRjZXQ3dkSm5WMndfa0NlREFnN1hVIiwieSI6Ik9hYWdraDJ1ckxZZkRrVWZQZ1VhRXNCcWs2dDBHaUZWd19BSWxjZFJnZ2cifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"tzWnuZV3HCXQbXSxkN6TryKZVVK57PHE"}'], - ['input' => '{"ciphertext":"YJDo9qQwMeCiCqiJykAPUae1LPzMTGq7DoxaV9bagXlys1Z_SZqek70xY1gVH2Q1vV19IPuVHQR4gSt4yFv2ePgvVXA-xegNn5qxIKznA_i2JaIMAGUp3AqILexDL6G6ZUtd26-FWTuTxbCs74PU8MnXFikRzPUg-G7fEl7VFusBdGFpJMWRGPOf_ks1o7qsJ9SwWILm09cg-ocGdlxeExDSXQmv90E","iv":"So5obfP02IyBbwEJ","tag":"r3L8mDu9XB7um6nqIiEBbA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ0cEFvWng5MDRtSGV6TTRWRjNVdm9CaGxXb1RLZDV1NUFVMjF4ME5YNVhJIiwieSI6InJpcEM3SFhTWEpYY0JrdHZJREd0MnFrY0RvYnNUbzZ2WGg3MUdyazV3OEUifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"0cR22N7j0lVozgmmL3btagXSeM7CrOkVPJ-XPTrxq9Q"}'], - ['input' => '{"ciphertext":"HODrPL6IRoK0wuith9tf-LauitCaYxthq_l0DKwT6b8ez0uxg6EDCAK9tI0qoU6ajTZSaULiRxZZO5L5TJ6rWg7uCNO6dKWLmBNjiHXqa2GrlSP4KU8CuaIKvmUYO3CU7YvrL8MIOxeSTzV4Ka-uYx3PgBHYpGU-wsqUFF4r-YEzMbzKZ2nwdaGJo4E6CWWFrJKhz5UJZ0YdeLrZl45cN3W4sqDNvBE","iv":"4Fjj5FMKqndJJyk0","tag":"L68T5CnQ8aWfs5sodrIn-g","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJORnA3YWZ6bWM4ZlBIc3NwNUwyNjU1UktoQ2VwTG9PZjZyVk50LTREYThzIiwieSI6IkVJOGVrTktNbXFUeXFsVHk5YWRjY2xLT3JqYzFMZGh5LWZrXzQzejN5U2sifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"nhk7cste11u4dffZrnc1j4h5W33sZvq9WSAplivutVp0CQe-lZRHKg"}'], - ['input' => '{"ciphertext":"GYce4M2vWZY8CUCr53v-mKvCqCPofaopLtLBrZJ78ddZ5pTdcR66t9dG943IyzdOEeEuRLp_4ynpyyXR0GWkiMmj7kEZRFPRboM5XzmeOomcnUAVW3Sm69WBYFLzs0DAottiT1RBz4S3vHZI68hhXF6NIyIFHD-8jD3zSlGzN_ubaEaWLb0WrlpSnCMm50T-zwuofyQtIxca0mkOWag4_AYC0bDJRxnOJh3G1t_X6ow","iv":"eFr9ZZlankeXbKpd05JpVw","tag":"LN9E6S9vjgqcOjq3-zrvyg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJDWExfbUFqRUhCaWVRazBHOWlyNzZ6em5RNFd3Qm9TdXRld2l2ZWh2YVhJekh3YS1UbjRjanJmRVZJS1J6ZWN2IiwieSI6Ik9sX20yX3BYVFVWNDlDbklBNXpMMTR3R2IxT203Y0U1VFlnaG0zRGtuYjlHb0RnTUJGVVFwZUstR3VJWHpYOG0ifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"vJ07JrMlgmu-iH6fbq9KJ77QGGt8w1V899c24zNThQczborr2uEsig"}'], - ['input' => '{"ciphertext":"l3wx9_nYWMb3JDPKA5gwEm_rjdpgbHO5qLhuz8DXoLjV-lLYculNw9FWS8_nJ9xC_xzBP0-IpjWLAYkGRXFZ7lbGHfDmQkWdUJsy_obgT945Vp38hwEqsstWFJO-7c09CnJYl9UVzP2grTg3oAM6TV__ZHg6ITHq3OsixVHJTSnlh11VRCOP3rjFONpnUJtDxoT9VZTR5goxj5hgwFGpoj-xcfmIFK2wiRehQqgPLPs","iv":"YQ7KrEk1MkbaTv3hQMwbVw","tag":"TdR4YFqBGQcchKlBgxsI4_m_1uzHx7y9","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJTS3NUVGN2VHB0ZFNPcmxnZ3hNakxVWWZyZzdZcE5rbVNuSG90a2ZpMU1LbER3R0VoLXdSX0I0T2p0WWptVUM5IiwieSI6IkZWY2Q2bmNWWDhBZUJiTEtiMllheHJUUlJoVHhrczNqelAzUnlKdHliSXRjSEZZc1NYcEFERWlTV1pzWkd2Wm4ifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"AtxkQKn58RtEUCj1hxL60bji2uB8IvbUWqpDSM_s5L-TRa93jnSptN0pRDyv3CDaqAPgrOPd64o"}'], - ['input' => '{"ciphertext":"wZb26S54HHh970h3uuQ_t7zZUWAJPBTdLkps6Am5lgwzDEoYk7jz_xHt4PZspPaCgdJv8BDxvAZw-wJ3uSu42Rus6uAXNOm_x0hHDAFvKxw-uyvnWB-Afp_BDpdjjOuESwVrP-QOSKVfVdWiR57J0NwQ3q3JOKAJuH70GtefdJufCdEN-WhGlJ-PM82D4TcWo-ZK52PoE-M_bktCj0h3FekNmH7NBuB45mBTHqshCnI","iv":"T6SPZ_ZNi8RGWpcRN1Ht4A","tag":"y1IHOEbLxyYvI7NIRCEaDi3HWon9_mOTdNMz7Vr3DzA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJzOFg2WDNjYlMyVjQtb2dQQWhjZW5YTGg0T1VJazhqZFVLdkFCdzB5YXlZLWExUGxNR0JuLTk4S1hLcUI0OU1GIiwieSI6ImV1Zm1uN2NaVDNzT192d0RyNjh5WDc1UTVXSm5mRGw0THVoSjhucF9LVlREZ29WSktyVTJhVDVZVHl2SmdmNmUifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"Bkx_LYfu8Oq-VrhX5WaWmNwafhCyKX-UWXdF22pX86PHaKaPwR60EWFapuCfMZfAK69RShDv0qWYhqe2AyGu7AWmz94Q0HVn"}'], - ['input' => '{"ciphertext":"yfsGSfJFyDHot5QyTfOssDQaXOcLGKGL8Z6pMApnCpmqLIUpghj8uIS2eLmKSaS4S2v-pcQ6nIVpCet1FdHLbGOghQuRzfUz24nBJuJ_q4QP8A9dCqfZEeRqXmRXoEbEQUb0H-TuSlLO6B7zLPWno7I7hm6kd93vGlqzpUNFnpJ4sCaNoOhYOQhb82HE7jHpi2ZLThOGWaV_ES8qa8jMAJRoV7DECTU","iv":"wUSgo24M5Qg_d6ZZ","tag":"4YpxsSQfzf-fcJS5Vl6t_Q","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiI2R3ZrT0VWam5MVm9RVHF6enpTLXFHUktFRDRTT1ZxQUZ4V21mdW5ieUlMX0hneGx1Q1RIcU95YUdKMkNjNEZvIiwieSI6IjJLWWRMMmx6ZmdlWVE4NURlQW9lYk9VU055RmZHd0NGVkI4VUVvMlZxN2pQSW5femV4MDZHME10eW9rUnYtRWcifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"2qqa5QibBfaz3nxk672G683yLNyJYV9F"}'], - ['input' => '{"ciphertext":"TNqwuqUzTB08s7Z7hfq_OyHsNCvUVp0Xxd3kdD0YFjtCFk7WVWn30Pjq4nB7cnHyeqPqrg-Fo4h1NRf0lb7Zs1N_zLgykncOloskS6BS8AhwAq-W2VSOI3r5QLqqfpTSAwSOtzwrU2L4HB6_ECxOK84z3g4Ful42BQZIWZWk8QFz8PCmbZNYimFPgJsxAFjuFLpN1Yb5o175OEOWjbRzOKyUcQK1OBk","iv":"Q6AywXdiikOweOOt","tag":"sTJ1Sm40q8pNITtcCRR1Cw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJoZm1jRmNvNWhNM0VOc1dXMVJIdmFnN0JDNi0tR19NZkxPVURPazE2ajB6VkZYb2JJS0REeXhDdnRaaFN0ZWxTIiwieSI6InMxR2pJWk1LTVYxMkQ0XzNjQ3dCeS1ncnJyTEZpSlVOQjFtWnVpblRrSW1va3pNamxnbGppMkQ0YTRoQlFLWk0ifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"g-aHetEzX4KdFm4_Nvu9G0IrAx_5KqVW3-4FItNh7Ac"}'], - ['input' => '{"ciphertext":"oZOcfdA_CMch6AnzcdbOrCoYTl33Iw2FFDvtv2dxlyARM-0bNUDZ0pBC3Kdih8NiX-sVkSHVP0h_AulUcZcq0DDCqx04Un-GXaisRouJFQXiM6sGLYuCCqXGBzGCs48b_V8OVdo0-QLtfjO4rFs0ENqwBdBDOlAr4IwYMKbvzQyBfM73_CZ6lqC5CzVUwp4esKqUDwEMW4GKllTxhkQ16g5V_342fxI","iv":"Keo2DAQHmBUhz5ys","tag":"Knq8qFH8MD6m8iHnsAtjHw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJUb0gyeWQxYlZHUFpUdFVrb0NaRjlYaTIzTEk4WXBUc1lUNXpSalRFbkJTdmN1a2M2SnhjNDhUc0RxR2djV2NQIiwieSI6IjRHb19ycWpDMUhZNGhseWlaTGktT0poY3BCUFNuOXBHeXltakxMTVlTMURPOTNGa0o4OHgtcFJYSk5CSE5BcDEifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"rDj5fMM4frMBQbFokE9JQ8p7QEA8RWlYwf5gwtagaLnxYEkJrvXlnA"}'], - ['input' => '{"ciphertext":"0yIJmTaLfA-nnb4FpziO5DZVjX4eHkKPz0Fa1tG_wFMKm11JGa-HdiYXXeN2_dORth7NlhhEcIHu50kQL9u2rFe0E5wFZ3oDDp-M5DTwKjQNSKGxfzIaD4l2fT6Ou9YgWXYMBuI9b7i3gGrOPLPFc5kuVpKrHsV6ynXTlgmMc9NyhQpt2WFCH4CCBohv9LpKQu0hx_U1nf6Q7JXpr79JKU5W_nCwIyhmhaKmFNs1Zdg","iv":"2NkLaDO6rEjiJ6GQEYCY5A","tag":"YKTqfroqK9o0OYtsPl-NOg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBTkFlSENrQy05LUlXeWlzeThHTG9yYjZYb3JtMXFIOGR0TTBVeC1YWV9LWDlqWXY0bk04VUdfa1JkS0hsaHF3WUg1QnJ1U09oUVBKZmNYVHlxdzQzNGEzIiwieSI6IkFEdUZRQWVRT19hdF9xWlE1SFJ3aWlkT2dmaGhZMVFIR0pOMjNUNnUwUnktSHlFZ3l5dmhmVjhFVUJZcFNUVmNKblJBVTRyZzZST1ZkSG4tNmFEZWpCVlIifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"2P_Hjy1PpS6TJN6zjzx7dQSDdy4OFz7qCzvEv7PZkTXfe9dNkHTvAQ"}'], - ['input' => '{"ciphertext":"Y1ld7kIgk-lvVL3YoW-qO8WWfXi92WmI24b5gCHMD1TDXcQob46ldsqQ9J3LSohrm5VqUbHg5oSa9JBW9W0uGzZdvyEDEnUYkg2qY4o-el7-Wnda8z9rm7XCO8xK6IICPnOSMSWiu8A3rwn81nHKOGHC68H7WLazCZgaxaLgmgLcP5Do17Wgi3carjjxm4iN4ohXSGA9ZJDzHkNsT2V-GmMzl4cKbyGqD-SspzfHsIA","iv":"4hkKVXthg1p_4LIx658vqg","tag":"KlLLT77fB60fxfRUYoG3-BNTgP8_D19M","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBT0l6SlM5cmZvdGxCWTZweXpKNGttQlpuMFdFN2plQkpzVVFpUWduQzQzNjdyZW1rYU9IbFI2cFZoWlNfZlVMSnVvNXo2SnBKYzNGSTJxazJqNW41TkVBIiwieSI6IkFCd2ZjQThzekYxVVAxS1ZERmFiX3ZJQXo4NVVtVlRRRlJpVi1lckZwNFBHc3lmSUNyZVVNZk5ISHhFdUpsUEdJN3RtZWpUcFJYVjlmRm41YWxScVZxaHkifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"ju9tngs61CQuw3Ii9iXY0wkrz6TocdyzvjG7PldRiom9n8yfL8ZB6cQsDzHsrbxrplQfcyMc74I"}'], - ['input' => '{"ciphertext":"QeGhuHxKId6XeFggipgUpvwn-xLZEpTOdq2LnBq9KQ21uLdkcbLfAQNEdRdilIspMAhE6WzqCKODowj2EyBOVWLddDqn8wff6OXEv0_5j_zqJDJBXVTTxWeip4FkVnygHWO4VG0VW_XLQR0k2JAShiS_uR5sAZwT9CJXlxyQV7BcZSfqfpLw-eJtWe_mhgTbbqFrnYFI5Cf5jI4Hdl1c8E7h7BUrwzfgnPP6TXjyxoI","iv":"CYYW0DMM4pUOtH8iA1T88w","tag":"DPcpOlTfxxTFbn_s4VakwM0lby-Fp3yBQxd8nM2JaDU","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBUm5qRDRjdlJEenREdnF2TW42YTRlZkZoeG5DcGRqRzFzaExFU1BLWHNxZDFSbUdERTRqZDN1ZVpZUFlKaGZlMEhLX2tKQ1BHMmxpNE5HRF9vQmd6eEdEIiwieSI6IkFibGQteWtadjNnei0xaXNvMkpqVTlNWnY0VENscVY5T3E5ZVZuQktWWTExSVJDc18waTVXY1JNV2lnS3NvVXVwR2lOUDVTb3Q3REFBSkhoektQSGxacksifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"gLE_kfglbHj0lkBRrEAIouunrpGjomr4cCNSOYeZTOLtphojXyYB5hhHQjwnk0-FmMIEj-JHLVogstn-qY9keVajYAMqf9Rc"}'], - ['input' => '{"ciphertext":"t-U9vLZqvJWJdJLBXuYDR4OO3mqBVfc8ITGXk5ciVFsslWTp2fO7_yFdcEcK_QX2o8bg0YTa5Jl3EjYKDSA73u3_KzzPJMLTWD4wYqL8LO9MM7H-Fuu3y6NFggqceTX0CJezI4ZoiEhhhWJSy3aZBaQlqtIKUI4xGe-tnUgjVuYOS9JaDgFVgfQG4EFW9zFDFfu30lkKYKMqaPth2dWxFDLCFwX3yVg","iv":"VhUPBzS216Xo5H_h","tag":"t9tPsHH90Ary6G_jmMGKWA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBSjhoNGRTdXhLTmRLaVpWZEI2QnctX2h0TmE0ZFVHdlZsTGRvd2hjci1hR0tnX0VYdjNqUFZUYkM5OFIzbWpTbEh1bU5OZUZoOEp4cG5KZXN4RkZpeWlCIiwieSI6IkFEb2JvNzBaOGRYbFVQdGNZMHpKVXNLZndram51OEJkRXRDZDlSbmxFSFpxOGtMd1AwSDQxdERyZENGYmJ4MWp6Y1hUSUNsMzBxSFlxb2hvZXFrTlBHNVkifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"ntSlDVjrsvlVyGPqWeMIr7g_dVLCDivi"}'], - ['input' => '{"ciphertext":"l6zDd7w1JND51dGDutFYoxn-seZdShpYz5tlFr0KsllMLPoi6wEpeGywz-1BTU3-e-BazdTB7KPlVMmb6F-rGCD7h1rqsxlZU9JH_Zs6TjspqQasMTKVOl3MH_oTgMKS-DI60lFmLUAj-KwdXjIVTPqqSEmxXxme_udtQFk6LNXKkIAS_u3rXObfbG_WA3xIi-2ZiY8ea2GOl42ZIddqpuFc-teiGYw","iv":"X4YYyKC6S2EAq5e7","tag":"SYFTMuHqADqfHw_mUxX8UQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVlBBbERkUDRpbHRNM2pKOGVycDcyc0VqVWVmLV9EVXdZMUt6NjhWZHo2dG1RNDJqVEx5T0NsM2JsNjY5bmpHZnhDeVRieVI5VkJ0QWlDcGFpWENrdFZRIiwieSI6IkFYVDFPWks0X200cjJSOHYwUlE3cEZPQXZJV1E3TFhsSmtyOGo0dzJrQURrR1JtR2Y0a0xLRnJqUXZ4UmNGNFJ2dUd4YWtMRlAwV2Y0eHpVUjNYc29LZTcifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"5dMOaFexxy32yZuMhgqO6mJEGdQ16_rw5etgRSiH11w"}'], - ['input' => '{"ciphertext":"zHKGZ3lcidk_ED9M9NHr-CgZ8i9OWMXo3IKWaxmf5f6w5Hy_9rrbY-E4NTyRi9pySEN6Qyi6gIT7n6nFWeROLIsOpp8vRlKRbkmGnOjbUs2QvjGiH8CV81HRvYCXLa6DwFUI_J9bmAhuB79CuEVBzxE7F2IT6GNimxxkW5Tg-Kwc_VL4mboOkE0ngHAdTdWQJrVzNFINl2E3KEYsWtY3lbt1pojH6XQ","iv":"i8SZR0geZRtCWk5_","tag":"tP_C7rRSn8mqUVD29r9LUw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBSmZyNnhibmpjRlZqQjR1TkM0MTkwaTJNZ1JRZng1NXhlY0tkZmNGeTRmY29tSlJqYWItSWRHQTFYcFBVN3VUSnpuajI4RXBLSkttWFFnZEhvTHdja3FSIiwieSI6IkFiOVlYbENZQWk2dUhhazRWV015d2pfdFcxUWs1Y1RabS1VVmZtNWRKVUZTTzVHZDJZM3VCZklyY0NLZko1Y2NLLXl1X2NNanp0T0F0TlRvS0IxNTE3M1YifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"jr2rPS0sxlRi_oeIBT0B8XlxJOUZJREKDpJd0FoAgRM0OsjwKbwRow"}'], - ['input' => '{"ciphertext":"86pUnoLJhflU8LURtiF5RjyZKa5QpppQaUkih4huZDYR6xAHcb_Ou5hl7GHfMvWZW8BkeaPPV3QV4C7jcFlnFfyHdGDLE7KyPzEQ_YMHxzhG4LsO_d5PxMaQBYe8cJJDXvgaE6_8iXTlBxjqxoNuETTr5VZxQtrP27m4j2lklykZibyvFydZNGx9lP-QUdTM_hv0M-M7_Zy2PXHZJsrhcyPgUAVtVIOLxoK3d0nL1e0","iv":"UiBIMQwpjZP6HyfxVbw7MQ","tag":"Z5x6KIETZMcul0LvFufeKw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Ik5KUFVVbHlYem9RSE81dEJKckFEOWVnZXVsclZCYkJwMXIycUY3UzdNbm8ifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"cM5amByozetCbGao__aREhlUcJdUIFZWqBxcSa1WeYAUeHaA8welag"}'], - ['input' => '{"ciphertext":"ZYX7Y1H0tmnso16nn-9s_Rhiw9E0CcjpKn6Mef5UHZxvZFFZlH-ndeeMi-T2O0NLagJcA72dCZycelmKnQ3B_junRnj0pg_1Izy4_XagmWL3T2bgZQY7RA5YXBzNbZrPV_Tfh93STo3w1CoDsYGJ5KPh-cfwaKXRhzCaeaxLbcSES0LiT_4Xpr1f4-XTwwyJsnENoxNrTX_GMqNFHC861HZhcY54pDBrVywXn7_TiIU","iv":"E5HkYh-_3Cu7b3J2RDp1Hw","tag":"K_Tjr-bxbTGGrEgZ4MyNJmbo_QppAKTP","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Inpfd2ZKVFVUU0pjUFROWkkxZlFldGdwTWI4NFU0UHJhZFgwWm92NDl6a2sifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"8O9y0-Ugge5rEp3-mpVL3oL1R2uC90TYQy7f0-wa9tuSFAF5vi5tg438PTfxoviFGHxForj3_VI"}'], - ['input' => '{"ciphertext":"yK78enqyEQEvwujprdQ00IT9eyuKOcA4_VuUaogLJKxehTZRSznsh4lb0RjWomV37v-crUbUklvxXpaKYd0W6xN64J5VV2c3lqWn5-7FDspDLn5Hrsi0qX2RuJvhr4-2tiL3QCxataw6MtiVSj8ib7d7BARFS0lorRXW6S0IVwbzdyuasHIul9W4hx_ervrJ4MHPs83KMWOZuDppXjNj_ym46VpmC9XpWxfDVTyKlKQ","iv":"O0hq-ZfavALet7EQdKPtPA","tag":"Q2u3JBdq_mJM8vOnhw_MLZWw8OHrerRFcO44m18Fnrc","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IjQ4NDRSWUpxQWQ3Mzk1YmlrbmJGZHpNRWJZRTk1UXU1TTZXY2tsejFublEifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"1hnj3G3e8zqJMNyW2JgLtQvr76-idfysmqX7Z_K5AAxpen6UmT4jwfCxuUjKfdw1k33u7hz4U6hTCgRDzvIGhnpwAWXKIjaX"}'], - ['input' => '{"ciphertext":"pncq1HNXbejvYCVFvzXn2I8XwBqE3ol07_qus64hlEIb7VcOxiMl1t7mVo4lsSEyipgYZCFxEVgR_C-auI36XdYqvKCQdbzTFzETBsb8y6WbBFQjCupYUa8IkDRsa7ZaT0ooy6meARQoDsomSH0ubEXIBSowJpygNjkBlCTmwP2RyWYKYboyjK5awI6nTDM92a3ZfFxdOJ2dA3ydlaJLicVfbqBSIlk","iv":"7m-i5f9Wer32W6mU","tag":"36R98AoUarAAJTTyuaBikw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkNTQU5TZkJucGtQSkZyVGw3ajNZYzEyWjRqU3AtR0NBWUJvYXJicVg4VEUifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"M_beaZXdtVd63YAMgGaUmLxPzqCIVO-K"}'], - ['input' => '{"ciphertext":"gVrYYC1cq5Q7aV9QTBeH83R7PTbXnH6tHRauApdcn-Knd5W6j4TyOM4wtSldO34ycjB_o0dsjZ_HPHtMw9e-a14qT5LQCeNDSb9cMb-MU399HDiT5QQ5kst0MX_ZpJXGvNx7uwAWYe1Rz58U-QG6J5J0wiSwqPtpI4SqFEXzrf88PExpLkiQ23IEjW4CnCmDrKpafaE6-ngKzkSmoc3j90Hh3NlIsdc","iv":"d_xuS_WzYJJsACgD","tag":"632n9At2zamWTVRGr08aKg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Ii1CS003UTNZTGZ2T083NVN1M2lkUEhFTnNfdVlBMFgwdDJZU0pXeHo1akkifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"OEJ6fL_dz-jXjfe0w3h1yAWAkUC0Vd0k9hgtf5iwfqY"}'], - ['input' => '{"ciphertext":"zk3qRHTYEdyLMh9JPEDaicjGnieRpP-AOKMNJlPioZ1w2WOR5Fts3356R9dDGxI1HuUC-g6_D5kQjROwxbeAtycj8G4CBQVhh8f6bM2eXNv9SgIyIePe6wpc8NcFNJ7mx4TsvAKly2RR0b67u3n__tUkTsiJxiVbZoRC9T4Ez7wX-TmphmFRLtsMQxxIdJEcFmUkS42toechllYS0EjqX-Yeqb8MAQM","iv":"UlDeGbl5QXgpTOUn","tag":"gsupckNy1QZFPqDVfYhkfA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6ImE3MjhSbEw5a04tX0JYOHE2OS1VcHdqQ3RldnFCMHdZYlhhMy11eXUyQk0ifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"DNpDD2Q3JEgZce6kP8lt-YPcKf0HdSiHvDeM0OaQ4-j6YkPLMBZ00A"}'], + [ + 'input' => '{"ciphertext":"239HNO--jJWqy20I6I9aQ5x86whqVQjFPlN9YRYjOi8ekbOM5YGIuyhbYF3Gdo2-MTqxjFZPOQ8VZVN8hdIL0n1hPIeD0IKl7Um1NcKShGtQtu2Sduyxa4hi6jAqf8LwvzjpVtI7o9DXE8HHUr1-XG4J4-mzDxSBFgbmIR3O0pWqp5-NdaGNOVkVlfbcTRimuDBsKZdJ6jWF6dM0SLq91rHC5mgtfPtYgvV38U8shvE","iv":"3iT5_YJ5uoslgv6uTlRgSw","tag":"Cxpt_nE_2RFs44A2G92Cow","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJpWVRydzFaaXZtdGh2TjVIYndGX3d4WkNoNVJmNFV0WTJjV04waVlVeHlvIiwieSI6ImRISlVpdDFkSVVFM0hjOS1OaUtHS1FNNnp1djBaY3Rwa045NDdxOWxFZkkifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"Gvg1uxRX6GpWKaLL6Bry2q454RfZR7psyruGv3kuf9kNPJD5-j0RWg"}', + ], + [ + 'input' => '{"ciphertext":"RDFW5wr_AqtcHGKv654vUBzFzHE9DQHExhS9r3uPxSDjI9NikzsjHEV8YjXVX9if06gzoHHb-cGXuJRoJI1gC9TY6kx77oll12fEu3FgXVuL1gZ7U9Ujj5wgI-scT5UmdxgUravP9Qim0kwTmTqXAn0RRuI2jVIZUhshzHUhuj-QsPDR4wrccMjmjyk6HLGpPpsegQb-f9u_GSg8EhUQuMWr1GYbHU4jawm9WtzOOh4","iv":"DGyn-kYAyVxGw3fJ1pGZ8A","tag":"AeF6-aceyQDUOtJreAS-BBWjGUu4T_re","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ2RHdRMXc0eWhZY29QLUlSX05zY254bUhmRnFGdWp1bUFFTWVJaVo3ZVJZIiwieSI6IjJyUHRWVkJiZmlwN21ZMTktb2Q2YjdiX0w5SjFNZ0FfQ2U4NTc2VUQzbDAifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"6c67kMrZe11m540xts24zTVGWeTq-H8MTIzWW_pRVXcrGEHyc7N4PeZHngPDY_Mxi1GiW1r5e0s"}', + ], + [ + 'input' => '{"ciphertext":"lKWsvlYaWoSsnw-NuywVrHgp0LaC8_g6ZRcCHJmnCErqApTi4Sn2sfz9Ew23xguK3qH5bwYqhqQQSpihQ-BLMZ8XkUrwWTPcp6UsQ1QlEevaBi9_cichIl81-HQyPINgIM-t6klxXK9X2n9DB-BKmhVHYbdwyBsHvWgbS3PHOyBKwGa-pb5thQLcPC0fJn9tRmCbGXoMuAFLtm86TFq20hMBoNNLmwW122x--zz8XUg","iv":"FXV6iLlbpLaFDFoYgUo4Ig","tag":"5aTUQ9M79YYJHROzeQozQI6QvUaxqYPOOomrz7s7CuE","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJubS1vZ0N6TmdKUjc1MHdlWWlFcnRHNUE5Y2U4X3pOYWp0dFozcVZfeUg0IiwieSI6Ii1ta3dKU1pidTlFV05sS256cXBQRFZkU293TUpOVXA4Mmstc1VVcURZbHcifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"NNqou4kIX5HdcXCauOIg8T2gj7OMnZs4fNOuKBV7C1oue44ctUO6wZfbh5U-0pwt3Y4q5l73JGCisLaQICJGVnRcFmk2ZfHo"}', + ], + [ + 'input' => '{"ciphertext":"F_zLcuR6OO3TBQ7uouORvGAvdNT_6eMt_ck0U-nXSQ5sqMEgKYuFMP7FMLRYTKZyzYQjj5DNCntbdQb5_31ifDCuOIVIRG9SsD0M9ZhKEXm3hM9pDCb90MbC3FD6fwcR6HbQfriq73WmBFbM1xtfVPsrAnrdNRlAaSJtV1Owf5yAvv7qx0vebMrOAOi_SBO0Qd_Gx9RjbHHEEZG18a_ZlLgwfrP1Ihs","iv":"FST1A5XpZBVfvn0B","tag":"lH1Q_KJUrPbp5r2n0P2WIg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ5cFhDYXJ2VUZWVS1CeDBiVkVITDZGRjZXQ3dkSm5WMndfa0NlREFnN1hVIiwieSI6Ik9hYWdraDJ1ckxZZkRrVWZQZ1VhRXNCcWs2dDBHaUZWd19BSWxjZFJnZ2cifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"tzWnuZV3HCXQbXSxkN6TryKZVVK57PHE"}', + ], + [ + 'input' => '{"ciphertext":"YJDo9qQwMeCiCqiJykAPUae1LPzMTGq7DoxaV9bagXlys1Z_SZqek70xY1gVH2Q1vV19IPuVHQR4gSt4yFv2ePgvVXA-xegNn5qxIKznA_i2JaIMAGUp3AqILexDL6G6ZUtd26-FWTuTxbCs74PU8MnXFikRzPUg-G7fEl7VFusBdGFpJMWRGPOf_ks1o7qsJ9SwWILm09cg-ocGdlxeExDSXQmv90E","iv":"So5obfP02IyBbwEJ","tag":"r3L8mDu9XB7um6nqIiEBbA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ0cEFvWng5MDRtSGV6TTRWRjNVdm9CaGxXb1RLZDV1NUFVMjF4ME5YNVhJIiwieSI6InJpcEM3SFhTWEpYY0JrdHZJREd0MnFrY0RvYnNUbzZ2WGg3MUdyazV3OEUifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"0cR22N7j0lVozgmmL3btagXSeM7CrOkVPJ-XPTrxq9Q"}', + ], + [ + 'input' => '{"ciphertext":"HODrPL6IRoK0wuith9tf-LauitCaYxthq_l0DKwT6b8ez0uxg6EDCAK9tI0qoU6ajTZSaULiRxZZO5L5TJ6rWg7uCNO6dKWLmBNjiHXqa2GrlSP4KU8CuaIKvmUYO3CU7YvrL8MIOxeSTzV4Ka-uYx3PgBHYpGU-wsqUFF4r-YEzMbzKZ2nwdaGJo4E6CWWFrJKhz5UJZ0YdeLrZl45cN3W4sqDNvBE","iv":"4Fjj5FMKqndJJyk0","tag":"L68T5CnQ8aWfs5sodrIn-g","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJORnA3YWZ6bWM4ZlBIc3NwNUwyNjU1UktoQ2VwTG9PZjZyVk50LTREYThzIiwieSI6IkVJOGVrTktNbXFUeXFsVHk5YWRjY2xLT3JqYzFMZGh5LWZrXzQzejN5U2sifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"nhk7cste11u4dffZrnc1j4h5W33sZvq9WSAplivutVp0CQe-lZRHKg"}', + ], + [ + 'input' => '{"ciphertext":"GYce4M2vWZY8CUCr53v-mKvCqCPofaopLtLBrZJ78ddZ5pTdcR66t9dG943IyzdOEeEuRLp_4ynpyyXR0GWkiMmj7kEZRFPRboM5XzmeOomcnUAVW3Sm69WBYFLzs0DAottiT1RBz4S3vHZI68hhXF6NIyIFHD-8jD3zSlGzN_ubaEaWLb0WrlpSnCMm50T-zwuofyQtIxca0mkOWag4_AYC0bDJRxnOJh3G1t_X6ow","iv":"eFr9ZZlankeXbKpd05JpVw","tag":"LN9E6S9vjgqcOjq3-zrvyg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJDWExfbUFqRUhCaWVRazBHOWlyNzZ6em5RNFd3Qm9TdXRld2l2ZWh2YVhJekh3YS1UbjRjanJmRVZJS1J6ZWN2IiwieSI6Ik9sX20yX3BYVFVWNDlDbklBNXpMMTR3R2IxT203Y0U1VFlnaG0zRGtuYjlHb0RnTUJGVVFwZUstR3VJWHpYOG0ifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"vJ07JrMlgmu-iH6fbq9KJ77QGGt8w1V899c24zNThQczborr2uEsig"}', + ], + [ + 'input' => '{"ciphertext":"l3wx9_nYWMb3JDPKA5gwEm_rjdpgbHO5qLhuz8DXoLjV-lLYculNw9FWS8_nJ9xC_xzBP0-IpjWLAYkGRXFZ7lbGHfDmQkWdUJsy_obgT945Vp38hwEqsstWFJO-7c09CnJYl9UVzP2grTg3oAM6TV__ZHg6ITHq3OsixVHJTSnlh11VRCOP3rjFONpnUJtDxoT9VZTR5goxj5hgwFGpoj-xcfmIFK2wiRehQqgPLPs","iv":"YQ7KrEk1MkbaTv3hQMwbVw","tag":"TdR4YFqBGQcchKlBgxsI4_m_1uzHx7y9","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJTS3NUVGN2VHB0ZFNPcmxnZ3hNakxVWWZyZzdZcE5rbVNuSG90a2ZpMU1LbER3R0VoLXdSX0I0T2p0WWptVUM5IiwieSI6IkZWY2Q2bmNWWDhBZUJiTEtiMllheHJUUlJoVHhrczNqelAzUnlKdHliSXRjSEZZc1NYcEFERWlTV1pzWkd2Wm4ifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"AtxkQKn58RtEUCj1hxL60bji2uB8IvbUWqpDSM_s5L-TRa93jnSptN0pRDyv3CDaqAPgrOPd64o"}', + ], + [ + 'input' => '{"ciphertext":"wZb26S54HHh970h3uuQ_t7zZUWAJPBTdLkps6Am5lgwzDEoYk7jz_xHt4PZspPaCgdJv8BDxvAZw-wJ3uSu42Rus6uAXNOm_x0hHDAFvKxw-uyvnWB-Afp_BDpdjjOuESwVrP-QOSKVfVdWiR57J0NwQ3q3JOKAJuH70GtefdJufCdEN-WhGlJ-PM82D4TcWo-ZK52PoE-M_bktCj0h3FekNmH7NBuB45mBTHqshCnI","iv":"T6SPZ_ZNi8RGWpcRN1Ht4A","tag":"y1IHOEbLxyYvI7NIRCEaDi3HWon9_mOTdNMz7Vr3DzA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJzOFg2WDNjYlMyVjQtb2dQQWhjZW5YTGg0T1VJazhqZFVLdkFCdzB5YXlZLWExUGxNR0JuLTk4S1hLcUI0OU1GIiwieSI6ImV1Zm1uN2NaVDNzT192d0RyNjh5WDc1UTVXSm5mRGw0THVoSjhucF9LVlREZ29WSktyVTJhVDVZVHl2SmdmNmUifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"Bkx_LYfu8Oq-VrhX5WaWmNwafhCyKX-UWXdF22pX86PHaKaPwR60EWFapuCfMZfAK69RShDv0qWYhqe2AyGu7AWmz94Q0HVn"}', + ], + [ + 'input' => '{"ciphertext":"yfsGSfJFyDHot5QyTfOssDQaXOcLGKGL8Z6pMApnCpmqLIUpghj8uIS2eLmKSaS4S2v-pcQ6nIVpCet1FdHLbGOghQuRzfUz24nBJuJ_q4QP8A9dCqfZEeRqXmRXoEbEQUb0H-TuSlLO6B7zLPWno7I7hm6kd93vGlqzpUNFnpJ4sCaNoOhYOQhb82HE7jHpi2ZLThOGWaV_ES8qa8jMAJRoV7DECTU","iv":"wUSgo24M5Qg_d6ZZ","tag":"4YpxsSQfzf-fcJS5Vl6t_Q","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiI2R3ZrT0VWam5MVm9RVHF6enpTLXFHUktFRDRTT1ZxQUZ4V21mdW5ieUlMX0hneGx1Q1RIcU95YUdKMkNjNEZvIiwieSI6IjJLWWRMMmx6ZmdlWVE4NURlQW9lYk9VU055RmZHd0NGVkI4VUVvMlZxN2pQSW5femV4MDZHME10eW9rUnYtRWcifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"2qqa5QibBfaz3nxk672G683yLNyJYV9F"}', + ], + [ + 'input' => '{"ciphertext":"TNqwuqUzTB08s7Z7hfq_OyHsNCvUVp0Xxd3kdD0YFjtCFk7WVWn30Pjq4nB7cnHyeqPqrg-Fo4h1NRf0lb7Zs1N_zLgykncOloskS6BS8AhwAq-W2VSOI3r5QLqqfpTSAwSOtzwrU2L4HB6_ECxOK84z3g4Ful42BQZIWZWk8QFz8PCmbZNYimFPgJsxAFjuFLpN1Yb5o175OEOWjbRzOKyUcQK1OBk","iv":"Q6AywXdiikOweOOt","tag":"sTJ1Sm40q8pNITtcCRR1Cw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJoZm1jRmNvNWhNM0VOc1dXMVJIdmFnN0JDNi0tR19NZkxPVURPazE2ajB6VkZYb2JJS0REeXhDdnRaaFN0ZWxTIiwieSI6InMxR2pJWk1LTVYxMkQ0XzNjQ3dCeS1ncnJyTEZpSlVOQjFtWnVpblRrSW1va3pNamxnbGppMkQ0YTRoQlFLWk0ifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"g-aHetEzX4KdFm4_Nvu9G0IrAx_5KqVW3-4FItNh7Ac"}', + ], + [ + 'input' => '{"ciphertext":"oZOcfdA_CMch6AnzcdbOrCoYTl33Iw2FFDvtv2dxlyARM-0bNUDZ0pBC3Kdih8NiX-sVkSHVP0h_AulUcZcq0DDCqx04Un-GXaisRouJFQXiM6sGLYuCCqXGBzGCs48b_V8OVdo0-QLtfjO4rFs0ENqwBdBDOlAr4IwYMKbvzQyBfM73_CZ6lqC5CzVUwp4esKqUDwEMW4GKllTxhkQ16g5V_342fxI","iv":"Keo2DAQHmBUhz5ys","tag":"Knq8qFH8MD6m8iHnsAtjHw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJUb0gyeWQxYlZHUFpUdFVrb0NaRjlYaTIzTEk4WXBUc1lUNXpSalRFbkJTdmN1a2M2SnhjNDhUc0RxR2djV2NQIiwieSI6IjRHb19ycWpDMUhZNGhseWlaTGktT0poY3BCUFNuOXBHeXltakxMTVlTMURPOTNGa0o4OHgtcFJYSk5CSE5BcDEifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"rDj5fMM4frMBQbFokE9JQ8p7QEA8RWlYwf5gwtagaLnxYEkJrvXlnA"}', + ], + [ + 'input' => '{"ciphertext":"0yIJmTaLfA-nnb4FpziO5DZVjX4eHkKPz0Fa1tG_wFMKm11JGa-HdiYXXeN2_dORth7NlhhEcIHu50kQL9u2rFe0E5wFZ3oDDp-M5DTwKjQNSKGxfzIaD4l2fT6Ou9YgWXYMBuI9b7i3gGrOPLPFc5kuVpKrHsV6ynXTlgmMc9NyhQpt2WFCH4CCBohv9LpKQu0hx_U1nf6Q7JXpr79JKU5W_nCwIyhmhaKmFNs1Zdg","iv":"2NkLaDO6rEjiJ6GQEYCY5A","tag":"YKTqfroqK9o0OYtsPl-NOg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBTkFlSENrQy05LUlXeWlzeThHTG9yYjZYb3JtMXFIOGR0TTBVeC1YWV9LWDlqWXY0bk04VUdfa1JkS0hsaHF3WUg1QnJ1U09oUVBKZmNYVHlxdzQzNGEzIiwieSI6IkFEdUZRQWVRT19hdF9xWlE1SFJ3aWlkT2dmaGhZMVFIR0pOMjNUNnUwUnktSHlFZ3l5dmhmVjhFVUJZcFNUVmNKblJBVTRyZzZST1ZkSG4tNmFEZWpCVlIifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"2P_Hjy1PpS6TJN6zjzx7dQSDdy4OFz7qCzvEv7PZkTXfe9dNkHTvAQ"}', + ], + [ + 'input' => '{"ciphertext":"Y1ld7kIgk-lvVL3YoW-qO8WWfXi92WmI24b5gCHMD1TDXcQob46ldsqQ9J3LSohrm5VqUbHg5oSa9JBW9W0uGzZdvyEDEnUYkg2qY4o-el7-Wnda8z9rm7XCO8xK6IICPnOSMSWiu8A3rwn81nHKOGHC68H7WLazCZgaxaLgmgLcP5Do17Wgi3carjjxm4iN4ohXSGA9ZJDzHkNsT2V-GmMzl4cKbyGqD-SspzfHsIA","iv":"4hkKVXthg1p_4LIx658vqg","tag":"KlLLT77fB60fxfRUYoG3-BNTgP8_D19M","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBT0l6SlM5cmZvdGxCWTZweXpKNGttQlpuMFdFN2plQkpzVVFpUWduQzQzNjdyZW1rYU9IbFI2cFZoWlNfZlVMSnVvNXo2SnBKYzNGSTJxazJqNW41TkVBIiwieSI6IkFCd2ZjQThzekYxVVAxS1ZERmFiX3ZJQXo4NVVtVlRRRlJpVi1lckZwNFBHc3lmSUNyZVVNZk5ISHhFdUpsUEdJN3RtZWpUcFJYVjlmRm41YWxScVZxaHkifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"ju9tngs61CQuw3Ii9iXY0wkrz6TocdyzvjG7PldRiom9n8yfL8ZB6cQsDzHsrbxrplQfcyMc74I"}', + ], + [ + 'input' => '{"ciphertext":"QeGhuHxKId6XeFggipgUpvwn-xLZEpTOdq2LnBq9KQ21uLdkcbLfAQNEdRdilIspMAhE6WzqCKODowj2EyBOVWLddDqn8wff6OXEv0_5j_zqJDJBXVTTxWeip4FkVnygHWO4VG0VW_XLQR0k2JAShiS_uR5sAZwT9CJXlxyQV7BcZSfqfpLw-eJtWe_mhgTbbqFrnYFI5Cf5jI4Hdl1c8E7h7BUrwzfgnPP6TXjyxoI","iv":"CYYW0DMM4pUOtH8iA1T88w","tag":"DPcpOlTfxxTFbn_s4VakwM0lby-Fp3yBQxd8nM2JaDU","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBUm5qRDRjdlJEenREdnF2TW42YTRlZkZoeG5DcGRqRzFzaExFU1BLWHNxZDFSbUdERTRqZDN1ZVpZUFlKaGZlMEhLX2tKQ1BHMmxpNE5HRF9vQmd6eEdEIiwieSI6IkFibGQteWtadjNnei0xaXNvMkpqVTlNWnY0VENscVY5T3E5ZVZuQktWWTExSVJDc18waTVXY1JNV2lnS3NvVXVwR2lOUDVTb3Q3REFBSkhoektQSGxacksifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"gLE_kfglbHj0lkBRrEAIouunrpGjomr4cCNSOYeZTOLtphojXyYB5hhHQjwnk0-FmMIEj-JHLVogstn-qY9keVajYAMqf9Rc"}', + ], + [ + 'input' => '{"ciphertext":"t-U9vLZqvJWJdJLBXuYDR4OO3mqBVfc8ITGXk5ciVFsslWTp2fO7_yFdcEcK_QX2o8bg0YTa5Jl3EjYKDSA73u3_KzzPJMLTWD4wYqL8LO9MM7H-Fuu3y6NFggqceTX0CJezI4ZoiEhhhWJSy3aZBaQlqtIKUI4xGe-tnUgjVuYOS9JaDgFVgfQG4EFW9zFDFfu30lkKYKMqaPth2dWxFDLCFwX3yVg","iv":"VhUPBzS216Xo5H_h","tag":"t9tPsHH90Ary6G_jmMGKWA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBSjhoNGRTdXhLTmRLaVpWZEI2QnctX2h0TmE0ZFVHdlZsTGRvd2hjci1hR0tnX0VYdjNqUFZUYkM5OFIzbWpTbEh1bU5OZUZoOEp4cG5KZXN4RkZpeWlCIiwieSI6IkFEb2JvNzBaOGRYbFVQdGNZMHpKVXNLZndram51OEJkRXRDZDlSbmxFSFpxOGtMd1AwSDQxdERyZENGYmJ4MWp6Y1hUSUNsMzBxSFlxb2hvZXFrTlBHNVkifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"ntSlDVjrsvlVyGPqWeMIr7g_dVLCDivi"}', + ], + [ + 'input' => '{"ciphertext":"l6zDd7w1JND51dGDutFYoxn-seZdShpYz5tlFr0KsllMLPoi6wEpeGywz-1BTU3-e-BazdTB7KPlVMmb6F-rGCD7h1rqsxlZU9JH_Zs6TjspqQasMTKVOl3MH_oTgMKS-DI60lFmLUAj-KwdXjIVTPqqSEmxXxme_udtQFk6LNXKkIAS_u3rXObfbG_WA3xIi-2ZiY8ea2GOl42ZIddqpuFc-teiGYw","iv":"X4YYyKC6S2EAq5e7","tag":"SYFTMuHqADqfHw_mUxX8UQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVlBBbERkUDRpbHRNM2pKOGVycDcyc0VqVWVmLV9EVXdZMUt6NjhWZHo2dG1RNDJqVEx5T0NsM2JsNjY5bmpHZnhDeVRieVI5VkJ0QWlDcGFpWENrdFZRIiwieSI6IkFYVDFPWks0X200cjJSOHYwUlE3cEZPQXZJV1E3TFhsSmtyOGo0dzJrQURrR1JtR2Y0a0xLRnJqUXZ4UmNGNFJ2dUd4YWtMRlAwV2Y0eHpVUjNYc29LZTcifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"5dMOaFexxy32yZuMhgqO6mJEGdQ16_rw5etgRSiH11w"}', + ], + [ + 'input' => '{"ciphertext":"zHKGZ3lcidk_ED9M9NHr-CgZ8i9OWMXo3IKWaxmf5f6w5Hy_9rrbY-E4NTyRi9pySEN6Qyi6gIT7n6nFWeROLIsOpp8vRlKRbkmGnOjbUs2QvjGiH8CV81HRvYCXLa6DwFUI_J9bmAhuB79CuEVBzxE7F2IT6GNimxxkW5Tg-Kwc_VL4mboOkE0ngHAdTdWQJrVzNFINl2E3KEYsWtY3lbt1pojH6XQ","iv":"i8SZR0geZRtCWk5_","tag":"tP_C7rRSn8mqUVD29r9LUw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBSmZyNnhibmpjRlZqQjR1TkM0MTkwaTJNZ1JRZng1NXhlY0tkZmNGeTRmY29tSlJqYWItSWRHQTFYcFBVN3VUSnpuajI4RXBLSkttWFFnZEhvTHdja3FSIiwieSI6IkFiOVlYbENZQWk2dUhhazRWV015d2pfdFcxUWs1Y1RabS1VVmZtNWRKVUZTTzVHZDJZM3VCZklyY0NLZko1Y2NLLXl1X2NNanp0T0F0TlRvS0IxNTE3M1YifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"jr2rPS0sxlRi_oeIBT0B8XlxJOUZJREKDpJd0FoAgRM0OsjwKbwRow"}', + ], + [ + 'input' => '{"ciphertext":"86pUnoLJhflU8LURtiF5RjyZKa5QpppQaUkih4huZDYR6xAHcb_Ou5hl7GHfMvWZW8BkeaPPV3QV4C7jcFlnFfyHdGDLE7KyPzEQ_YMHxzhG4LsO_d5PxMaQBYe8cJJDXvgaE6_8iXTlBxjqxoNuETTr5VZxQtrP27m4j2lklykZibyvFydZNGx9lP-QUdTM_hv0M-M7_Zy2PXHZJsrhcyPgUAVtVIOLxoK3d0nL1e0","iv":"UiBIMQwpjZP6HyfxVbw7MQ","tag":"Z5x6KIETZMcul0LvFufeKw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Ik5KUFVVbHlYem9RSE81dEJKckFEOWVnZXVsclZCYkJwMXIycUY3UzdNbm8ifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"cM5amByozetCbGao__aREhlUcJdUIFZWqBxcSa1WeYAUeHaA8welag"}', + ], + [ + 'input' => '{"ciphertext":"ZYX7Y1H0tmnso16nn-9s_Rhiw9E0CcjpKn6Mef5UHZxvZFFZlH-ndeeMi-T2O0NLagJcA72dCZycelmKnQ3B_junRnj0pg_1Izy4_XagmWL3T2bgZQY7RA5YXBzNbZrPV_Tfh93STo3w1CoDsYGJ5KPh-cfwaKXRhzCaeaxLbcSES0LiT_4Xpr1f4-XTwwyJsnENoxNrTX_GMqNFHC861HZhcY54pDBrVywXn7_TiIU","iv":"E5HkYh-_3Cu7b3J2RDp1Hw","tag":"K_Tjr-bxbTGGrEgZ4MyNJmbo_QppAKTP","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Inpfd2ZKVFVUU0pjUFROWkkxZlFldGdwTWI4NFU0UHJhZFgwWm92NDl6a2sifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"8O9y0-Ugge5rEp3-mpVL3oL1R2uC90TYQy7f0-wa9tuSFAF5vi5tg438PTfxoviFGHxForj3_VI"}', + ], + [ + 'input' => '{"ciphertext":"yK78enqyEQEvwujprdQ00IT9eyuKOcA4_VuUaogLJKxehTZRSznsh4lb0RjWomV37v-crUbUklvxXpaKYd0W6xN64J5VV2c3lqWn5-7FDspDLn5Hrsi0qX2RuJvhr4-2tiL3QCxataw6MtiVSj8ib7d7BARFS0lorRXW6S0IVwbzdyuasHIul9W4hx_ervrJ4MHPs83KMWOZuDppXjNj_ym46VpmC9XpWxfDVTyKlKQ","iv":"O0hq-ZfavALet7EQdKPtPA","tag":"Q2u3JBdq_mJM8vOnhw_MLZWw8OHrerRFcO44m18Fnrc","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IjQ4NDRSWUpxQWQ3Mzk1YmlrbmJGZHpNRWJZRTk1UXU1TTZXY2tsejFublEifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"1hnj3G3e8zqJMNyW2JgLtQvr76-idfysmqX7Z_K5AAxpen6UmT4jwfCxuUjKfdw1k33u7hz4U6hTCgRDzvIGhnpwAWXKIjaX"}', + ], + [ + 'input' => '{"ciphertext":"pncq1HNXbejvYCVFvzXn2I8XwBqE3ol07_qus64hlEIb7VcOxiMl1t7mVo4lsSEyipgYZCFxEVgR_C-auI36XdYqvKCQdbzTFzETBsb8y6WbBFQjCupYUa8IkDRsa7ZaT0ooy6meARQoDsomSH0ubEXIBSowJpygNjkBlCTmwP2RyWYKYboyjK5awI6nTDM92a3ZfFxdOJ2dA3ydlaJLicVfbqBSIlk","iv":"7m-i5f9Wer32W6mU","tag":"36R98AoUarAAJTTyuaBikw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkNTQU5TZkJucGtQSkZyVGw3ajNZYzEyWjRqU3AtR0NBWUJvYXJicVg4VEUifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"M_beaZXdtVd63YAMgGaUmLxPzqCIVO-K"}', + ], + [ + 'input' => '{"ciphertext":"gVrYYC1cq5Q7aV9QTBeH83R7PTbXnH6tHRauApdcn-Knd5W6j4TyOM4wtSldO34ycjB_o0dsjZ_HPHtMw9e-a14qT5LQCeNDSb9cMb-MU399HDiT5QQ5kst0MX_ZpJXGvNx7uwAWYe1Rz58U-QG6J5J0wiSwqPtpI4SqFEXzrf88PExpLkiQ23IEjW4CnCmDrKpafaE6-ngKzkSmoc3j90Hh3NlIsdc","iv":"d_xuS_WzYJJsACgD","tag":"632n9At2zamWTVRGr08aKg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Ii1CS003UTNZTGZ2T083NVN1M2lkUEhFTnNfdVlBMFgwdDJZU0pXeHo1akkifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"OEJ6fL_dz-jXjfe0w3h1yAWAkUC0Vd0k9hgtf5iwfqY"}', + ], + [ + 'input' => '{"ciphertext":"zk3qRHTYEdyLMh9JPEDaicjGnieRpP-AOKMNJlPioZ1w2WOR5Fts3356R9dDGxI1HuUC-g6_D5kQjROwxbeAtycj8G4CBQVhh8f6bM2eXNv9SgIyIePe6wpc8NcFNJ7mx4TsvAKly2RR0b67u3n__tUkTsiJxiVbZoRC9T4Ez7wX-TmphmFRLtsMQxxIdJEcFmUkS42toechllYS0EjqX-Yeqb8MAQM","iv":"UlDeGbl5QXgpTOUn","tag":"gsupckNy1QZFPqDVfYhkfA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6ImE3MjhSbEw5a04tX0JYOHE2OS1VcHdqQ3RldnFCMHdZYlhhMy11eXUyQk0ifSwiYWxnIjoiRUNESC1FUytBMTkyS1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"DNpDD2Q3JEgZce6kP8lt-YPcKf0HdSiHvDeM0OaQ4-j6YkPLMBZ00A"}', + ], ]; } @@ -89,30 +146,32 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'crv' => 'P-256', - 'kty' => 'EC', - 'd' => '_gUgAjx9zU5BKlHq--TiCjZmsdNQAgrv536DCTUM2vo', - 'x' => 'Kuh77MGkweIENgR_3WjzJ4gEF47yn6yQWAeeNqYC5qo', - 'y' => '1koAqIfb5C2PkCT1GYEcW4IcIEdrgOdMcua6G0Eyhtc', - ], [ - 'crv' => 'P-384', - 'kty' => 'EC', - 'd' => 'Fn_Le74znJfY33TkqCoskx1pkgA_1sLnKvfvM_78lTZT2zfj4XC6uY_L8iRknOii', - 'x' => 'o5CqgE0jIlCVwGKMXDsQmkOgxohJcod4hv7jo4h7qeRoysAV0YPtokMgv7CUpSCG', - 'y' => 'Z3ZGVhyv3T-MudQI5fYNmkO1BzqlHQJHCQ9RQzqa05QOsUZo39gjVC2EhRv1Z9kz', - ], [ - 'crv' => 'P-521', - 'kty' => 'EC', - 'd' => 'ACebnk5N5RV4VFhrCmvp-5w6rsQJvHdvvBdJkIKmq3pDDreKC0vU-K2oYrQaX5vPuI1umnVw9qxFq6QCsShJ38Fh', - 'x' => 'AR05Z1Xe74_lcrJbhKg12jijs5LPbLwcpHDGETssYKRgbO3-4l7egk_WtLjSeXmDvRfkww9kKpFdKHTqmDYSIzxf', - 'y' => 'AL7NyrGpwcXqfvmQb4d7N6vO7REegUaFv8ea-_EXyA2eJciZJSmvipwpxRnoSfkNuJ5yJUGdjg_FtaddKaLdJEf_', - ], [ - 'crv' => 'X25519', - 'kty' => 'OKP', - 'x' => 'LD7PfRPxq03bd0WJyf_1z-LQevmrbcYx7jJafep3gmk', - 'd' => 'pSdgXFRYMvOa7giAm3Rrf5Mf8GnvLz7HtZKu_KN06KY', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'crv' => 'P-256', + 'kty' => 'EC', + 'd' => '_gUgAjx9zU5BKlHq--TiCjZmsdNQAgrv536DCTUM2vo', + 'x' => 'Kuh77MGkweIENgR_3WjzJ4gEF47yn6yQWAeeNqYC5qo', + 'y' => '1koAqIfb5C2PkCT1GYEcW4IcIEdrgOdMcua6G0Eyhtc', + ], [ + 'crv' => 'P-384', + 'kty' => 'EC', + 'd' => 'Fn_Le74znJfY33TkqCoskx1pkgA_1sLnKvfvM_78lTZT2zfj4XC6uY_L8iRknOii', + 'x' => 'o5CqgE0jIlCVwGKMXDsQmkOgxohJcod4hv7jo4h7qeRoysAV0YPtokMgv7CUpSCG', + 'y' => 'Z3ZGVhyv3T-MudQI5fYNmkO1BzqlHQJHCQ9RQzqa05QOsUZo39gjVC2EhRv1Z9kz', + ], [ + 'crv' => 'P-521', + 'kty' => 'EC', + 'd' => 'ACebnk5N5RV4VFhrCmvp-5w6rsQJvHdvvBdJkIKmq3pDDreKC0vU-K2oYrQaX5vPuI1umnVw9qxFq6QCsShJ38Fh', + 'x' => 'AR05Z1Xe74_lcrJbhKg12jijs5LPbLwcpHDGETssYKRgbO3-4l7egk_WtLjSeXmDvRfkww9kKpFdKHTqmDYSIzxf', + 'y' => 'AL7NyrGpwcXqfvmQb4d7N6vO7REegUaFv8ea-_EXyA2eJciZJSmvipwpxRnoSfkNuJ5yJUGdjg_FtaddKaLdJEf_', + ], [ + 'crv' => 'X25519', + 'kty' => 'OKP', + 'x' => 'LD7PfRPxq03bd0WJyf_1z-LQevmrbcYx7jJafep3gmk', + 'd' => 'pSdgXFRYMvOa7giAm3Rrf5Mf8GnvLz7HtZKu_KN06KY', + ]], + ], ], ]; } diff --git a/performance/JWE/ECDHESA256KWBench.php b/performance/JWE/ECDHESA256KWBench.php index df48275e..0e3e0a6d 100644 --- a/performance/JWE/ECDHESA256KWBench.php +++ b/performance/JWE/ECDHESA256KWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A256KW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A256KW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A256KW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A256KW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A256KW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A256KW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A256KW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A256KW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A256KW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A256KW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES+A256KW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES+A256KW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,30 +67,78 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"_2ZDM1eBLjU6k1XygQn5q8FcTZf9Bu_dlbjQ-MPh1jyQ14YplP2r1iZSnVke-UbDTFUGj97RZw4ab5PRxaWdo--OEY9MBDK-PK4HaLuM8mgxM_VY2VNLROSuZZc2Rk0UYWr5JLAq9l3N-6Ayjbn4L1EAslENOArzG05EdNcUFzkYjEm4dk5lN0_1ueL-8sy4CN088iUBm2ypygiVt00dnWd3d0W3zwgZiH53GE7zzQs","iv":"11dtOFD32AesbnRi4DKTMA","tag":"naveS2vDGMoeTyV0_eEv9w","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJmRDhiSXJkZEFkQUpSMEhsajV2eHdSSFl0eE44QU95c2loX2phcWtNLXFFIiwieSI6IjFZbmZmcGNiVzNWOXhmYU9mcWg0REZ1d1NFblhwaWdESnFvS2k0V25BejQifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"-lbBek3DTQlQm9LY7NoBdSdiLUsea94bCjEq__slnG1oAnO3OugDow"}'], - ['input' => '{"ciphertext":"5IBzhh0acduGMoWjyRw0RTqI8byRTqE7jIR9So25ioKmYRRzHTUi2rIKvQzWY80u8wGe1hh7bX_nK5HyQztvyMZnECR2Z1xAWmZlNqEcV_QH6VUqfvnw0w6od2FMkraq7b-MFXTyVtUyqaW87OeDo1WTRrMOc64SfsVpQ5xLhhppC_LM3iTFOG7R-ldjyzWpoSqy6VkYGqTM5_EYnYiMfdPikr752uUnO97HiXQ3bcY","iv":"UJpFJkgRWQ2FDDHuHsizpg","tag":"ANvdf48Jr6ixFdCTgzj512kksNmKdV0L","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxNjI2TTBFaG9jalRFVmNwSVZvNWduNmxuRWpOVXVIbHgzb05mU0pJTndFIiwieSI6IkFCOHZJR0RWWU5HNkhBSi1jMU91RjVUd0d0TkhVNUJqUzlKbUs1UVBCYVEifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"CTUn875mWqvFzSqrz3YEpIXscd6pgMurvMjESuFNUmjE3E_CBrdq6IngiJVByr-z20PczS-ovD4"}'], - ['input' => '{"ciphertext":"2-ph7JTQllkn5k59nLjyCvPFmC9Wo2-t9ec671GNRJ21CGDoCcevjESNfP_3cXnPBRneKotf8h7Vz1oC0hcZeMPXVGZUD5LXmgMrsWrXGF0vFN910E3ToOnOPhduYe1dM61DoYzwrgoP0t13IFWG7KQU0SjLDgAkiC2QChTIhLk81G52u1DWshpQdc7UT9Lfv8RBPCkltsfu3NlT8fpB4JABXDIJbXv_1M2ybfqqg24","iv":"tc8wFvNZ2I-fcHNhFxJtzA","tag":"9iJNeBy0m2JkHfHSMFT9j1rGj_RwdjDB5X4VQssehvQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiI0cWFsb0dBWUVHRFhQVThmWVQ4UzhtU3N0SUFXcUtHb1FKUlhkRVcwaW1ZIiwieSI6Im5lUGhqc1UzNlRGYV8tZFR6R1RlR1hZTjFnNmNIMTBkVk44WmpEcmZYU1EifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"zEVPN1GHM033Q7Ghz6uBSdgjC3CJZZOca89-iG8lIPdiIwI0OPoIOMWiPIGs_hwR_RMgdhnPa70MV4XtmMgo8FyyjOkwOsfF"}'], - ['input' => '{"ciphertext":"2EZFKdOiXzI0ZXAd7F8eOM1csiDF5eJCKusj7jVGYEQgj3uJy4Tdm372CynBIop5jHQgCk_o4lGcJzQvnUC03x5ayR0u9g-6PYr7lvpPcJ5NSr1mfehN4whG4K33wGR9YY3FigDOZMWCSj3-qnTcw4mKvixnrhNd_lEYbcXp_foBH7L2kIs7YkoiLLr8__2va8aWBIY8vw7W6_44p4YjDU_i0JS2-GA","iv":"ZflD-9NFEjppvYSx","tag":"mcdC1NSqbjmD_imWCZxbYA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJDSFpiT0xQYXhReU9pMndpem8tUjh3QjAtRVFFTHhBQnJ6bS1TdVRHMFZnIiwieSI6IjFNOHZyVnRINVE0QnFjSWROUnVfNkctbVBWVDFqaEw2LWxkdHBDQzBSckUifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"ZFrUs0U01E3Sccm31VHeHAnzDaYMAO6i"}'], - ['input' => '{"ciphertext":"3Hi4-hGfQ9CNzmkhKPg-uAAHiEzjxMz4jtSDmTuYkEo3-Ribc8H4M_Bqj0adpAS58mnPz9I-uEqrflUXeHAJ-d2Vb90gf1R8RKVjV-7Mqi5Bxhv98GFIZrHGFqmQuJ95yh8TdxSJXvMvKDkhe8u8rA2MgxNKbs63EVBr4GMCqRWGqagfOVHpkcobTdcDDpS6RKXwBfNyLVv4QdqyBUyjGAH-FgF2Ims","iv":"LV_MzlgZlIuEXYxQ","tag":"ui3S0bL6TSCgNaCSov7Vvg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ1NUhFLWRIV2FyU2NzdDRQQWlDZ1RKUVlnbWFCdDR6SE5aZkduV1NqTlIwIiwieSI6IllRQzAwUnpOWUNSWl8wNXdHelN5WmVwY2t0bTRaV3JQemtOdmtGbEExSEEifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"8dCnxob-1n2tC6HgfsLTFvc41WzriaHlV_qIbdjKY0g"}'], - ['input' => '{"ciphertext":"pt41hd0_vaDa0O5HMf6E78OtCZlZ_r4-lwtUl48kZqqoz7k9tdmu_zrAIFA_wW7ieCp8-GBu9R_Ny2vH4FFvvQgMtSXx2h_YBAH8oPCDKBoiNRM2AFlC4T7palBNkFS-01y9eJkxwjmRgdJJYXWnCDSK6AyEsPEVZMOqVNK-fnp9-U3bUPBPSGFTH48Bs7NTB7hAMuLZWbMoJKQAQdz-wius40-nof4","iv":"dkYB6DStRMEOOT1v","tag":"XA304bY0KsYBu39T2IDjBA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJtVExiaF9LaFpKaGR0SWVXYXZENi16Nmg4blJjSHNrUWhXcU9VMUNiVWg4IiwieSI6Im53VnRYSmcwSU1WbFpXM2NYaU9ReXFmSGFvMFVXNXY0czNhOGtsT3BXV1EifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"C1B2p6_G8v2HuDH4ElWQzdCbaTepSxLNh9l_a3Nw-vTkwQgXtzDq9A"}'], - ['input' => '{"ciphertext":"9qoT_yY1nVIwztNUHOfP6dtTfJQpvcrQ1uLAm8aFSZhSpIyg9xyJ_BVtAAyv7Grtfxt1f4N5YUK6M5zMf-ybhK-0ybudJHkLWoj0YtAvP1KkM3Wvq_GTCQ2ZdBjqIVKJTnUEfWmlGV6BXPVXLWM0X3svSJBCEwEOSQEufX_cI-mfcUi92VLN9rTTkDokvTLVntSGThcqydm8ZtmOg8u02liuHqEhXy0_gYFC_XY4Am0","iv":"abExYU1ldE0GO8_K-Wy4_A","tag":"uSMzfuP6WQzmTWn0OHa10Q","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJjSVlwT3RfVFR5X015UE96VjNJQ3gxd0prdGZZLTM3SWV2bmFVNnRtaWZJdG9qNWpkTkwxZmd0VkplMDRfXzJrIiwieSI6Ik1ZM1B6LTQzeUNjdlUzYmUwMExrMnBIel9IaTZQYl9RTWUxeXk4MWpvMDB6Qm5sUHFMdVg2d29uaGhGWTFnNE8ifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"zw5MEB3t4bAJ8GIa7x0DGQzybmnhR_ADOb9kNZI2-F87hHLi1-LTPg"}'], - ['input' => '{"ciphertext":"GKfqg-1I9ItJSCsiDY9yIhYxnGuskdxPy_rXbz9MYOtmDNnRWNez8DlVmPf0AWhJSkYvCIohhCmbtighJJNJq0wGbriU9MjZogtWTzrUUhzEkKaZqgg-ofHcF_eow9h3GsQ1TEdBk3bOFLVxqBkauOR4qw7KFi42l5MNjJs1zLRihJvB3FxqJ79Dbc-1KZBcMmdNyoWFlzDCQazaZBpgPz5OYmN60SzhWcIkfaWXwX8","iv":"7AsW-AFjgNJyxSeLNQ5WdA","tag":"_E3l8ER_XQmNeFGrZnaE5HB6cOFs2gQf","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJoUUVxMVNaX3dpQ3k0enlNeVRJU2k0WmpfSGhNVXk5ZWo2TVVWYUhvelUxV1JJNXZ0QjdWUGFGVHc2QmUxejhLIiwieSI6Ijh3S2dhbVpLWW9EQUsydVFCeXpMWnBCaTRUVGpfZE5XR0dXbzZTSVc4RkRIaExPSjY1M2RFZ3VmREREVFI2WFIifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"en1pp2tN0ZgevdS8KwYpbcnTgxyKKbIs1qsETtGEbXJ8dUz59q4dw5P5LNGgs3ITQkKyAHIy-po"}'], - ['input' => '{"ciphertext":"Q-FDEcUo_6zIyfnH_NApjUH7V4A4eQ8XJ6BF8SHg7qP6a8gjweAdYtHmy7CxvWOcvRdmyLNvfz93muQvHihRMZKvM7Cyl0BLuqKlQkwVmln94PypmsoYxoopl97zcdCTpkFYNvL4PLBomAVaagX-q9Xs7LL6r1hi1kf_drgoivfVQxRGrOkVw7Hm6us3dWG57Wpe8wWAGmJAY_I97owJC8-8zczJTMDLTiIFmPIo2pU","iv":"9aC-2rcP3gIKjMe4M_iOtg","tag":"IPNDjw-b6cbTuNuj8DWWhJTFW38IQQQbjuq9ftxCVms","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJBRmVfajJ3WDBNaFJMbmMyUVBwMjZrR1FEOXBTUUtiYW16a0xYX2l2NEFKeGsyVU55cnkwd3NZZ2JMeTREQUdFIiwieSI6IlJ1YlhZM0tvaXM1UzVZeVhOczhLTER1aDhTQThwYV9ocm44ajdNc0t0OWdKRnFWcDhVaUFDcVJDR2VnNzNtcG0ifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"43lvgJ17neOuzGkKKe-4FJi7YKkoXpfVNJsqdjBUzRD9FNkun8cmVuVS1TBt-PsQJIugykuhCv5tMihMzSODbZk8P46_4oG3"}'], - ['input' => '{"ciphertext":"tqQ3LzEqIGZE94SoOskld4xuAmX3kguPPN26_Bj_MTrWEqUlbQ7D6dI1jcbXZZb-iOnIuto9CYb7uSniY4pR-klRH-9hrTX7dMGhZzuzY3hLn6JL-zlr5bZcbGl0Wsd5TZ8jxPJx6BMQ6ncCFCi4EhraSt2ty5Z3H5RaGXKhMOcER0vqfIxIQ7ij-yrJ_e11zRRxCxPgWjpNIkvvZzMC3XMMLgSHjls","iv":"kdmy4535OG2eGe5t","tag":"XwtRf4h8Bry_NAh2ReW-zg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJQQ1JXelloWDF2RTA0Sm9LNTlzQkN2UVloRWRKc0NhbWRTV1oxSlVhWGVHZWs4T1plNjJaNGdxVkRMMVF2aVAzIiwieSI6IndsVEZjMDJFdW5kUnFnTDBEbmFqcnFHYWMxbjEtNWx3TlgtOFVGWnZzQ2F0OFpyMFcxbWVvcDdzckRTdnliLXkifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"wRHEx-f-GthCfVhqjVJNF-h8PKLt8smF"}'], - ['input' => '{"ciphertext":"_s0KJ5Wqqk2xsM4zlACqSX-VGZHsXhyGisdymCnGMuLh3oJnAX6hSDCVHCxNxduRXCF2WSsTAUfa1yLWs3GsN5ndbqLZZYDVHGSjtCSI4oBODo3Xp8NLpf676xjGJUem_VtqmiLLiV9etJieOB7kfZOa-DwGVc3RQkOabne_EmsornckgS0YXN2s61qOMCrZehPqP_Jj4JjzRIxuDKYVtyIN5rCGe4s","iv":"1XPPKja0ZDqv0o4G","tag":"bS5OAUL4-sK4Vo2bmMt7wQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJxTGVQUnVNNmtaTkZuUGhMMC01QktpOVBIZGJKdDJxZUM1REpiMXhlUTNWbThpNllwUmc4SFJqZVZPdmpJeWIwIiwieSI6InpiTlk3YnhtZ3FyZ1hxQ3IxdDNPVkZxdXgyY1lqRl85YUNOV1RvcDBXaV9HY0tNREJkLTVqZGNvZG1KcUhxZk0ifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"cA5I7NM1g16i1K3fFNapEajLRWlTY8Xi7ICLD9iICPk"}'], - ['input' => '{"ciphertext":"7bAhp0XwPvbnVoLW7CD51u86heDUrp2CpUKSQXtcouS-LtY6ytvf7rC7ZVfe_-t6apo1jUIGaswxTl-ma_xOxuG2oybLwhXirKnRRryDHQsPwyMMLPMt2t-cXSW9QCa21KtkY-mxTpn0JZusIrT7F2zzovJmIR-4jlBqd_YlTT_BsoB8TWgSBoUMeoeZ9RFW-uBSeqCWBWeNyZH1lzjefYALYJ333Ns","iv":"4RZE4V9VHKPDIvIP","tag":"zQ27iVw3u6CW9JHhKvTdsw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJvTmRQNV9LT2lEWG9sMWhFNmRaakxnZURIOU5kREJfQ3paWEtqWC1VWkRaLWQ4NmhxN3hGWUwyWHhac2Y3dll0IiwieSI6Il9pZGpKLThiUjhnSVl2cWdzZDU1QUJkTl9pSmluSURETXBBb25uMnRFRE5KZ2dOajgwYVgwN0hYS194SVlhZUcifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"O2qIqAxybaUIEAC3NKq450ptzk3pHJ33DOg0xfajJ9sv_w4_OfHrgg"}'], - ['input' => '{"ciphertext":"cEE2ph6vE0gyDsCGsJZ_N6cRRxvJtuFiLIwLMHntzIDrAiJb3DR0ks1dtgjTpAm4hKmkgG4ftZQ8zDQRk9mDMCKabO-eXo-evzxerqKIQBV5EysgmKojXfiG1f5MH5wKK-UwPgcMmnodQ_AAZMflrXXo2PbXL8OQIyIMbm7Mdx1NxbDKhFP00qS2ad0fdhNRL1dB5yzLHDMNPenYL3A1sDyAWcItRj8u-mP6V9z3K5w","iv":"ol8jKetABAiwv2QDNEJLUg","tag":"GFZsZlXowylyG5OTrzhcvA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBSGJlY2VBTEcxbVBXWmtuLWlqdjI1RkZFS0xnS1hqczVpMzgwRi1KdWZmd0lZYmx4ZklfanRCWnlBZnhBdFZFWDdkQWJqbGp1WFBPbFk0aTJGWFRfSmV3IiwieSI6IkFXc1Z2Q3d0Nk5SblBQMWlqTXNFd285RnlxbzFEV2dEeGlZbmdSLXZFTFIyQW1lVV82UWRwQlY4VUI4cnA2RndER1d4Mlc1aW93bkd5TmM0azJTeF8wcmEifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"RbuaR9R6aYWKqWBOFi517v8P5IjBjOmj9ev0T4EsNHuDACV4Zh_xoQ"}'], - ['input' => '{"ciphertext":"tX2AOnAGCPECJc6w9zlsW_MAq9XC3JOQ6wg6zxDll3vmnRJ9j9CXkr56DMMFD-C1zmeiDgEIhcpMCPfkgJzdYz5hTygm-gK0EHNiwoNjHoNTMY1l-W2dy4J1ICxC_2ZRuZIs__ePHwcmvQE-JZhbxi087akNRIZ6A5Ujz8Y6MKdLODxL48Hr-qd1gyle-1QRodceu1deqmnLC62k0n_WNy7dyy9M0FUF-YHnHO_MLnY","iv":"vr_5AlQqrn4pS1T67DgzwQ","tag":"0tqhT1oHgUpKqWag0Rge49L4Ktrw2fA-","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVzZPTjFOVzNiaWFYMWlWTXA1dWJZRjJKc0VzRE5JWW82MFdkdVBVaHBwTWg5UUNpNkl2bWtSTWd3SWhtX29icUo5WmhkU2I1cWpsOTdUYmdrLUpqYnV4IiwieSI6IkFFR0VFSVlYMkJEZ2xCSlF0SC1idFlIRV8tbXBKUWRpdGFpVFhndkNXQWpRZEp3cnU4VVU3S0JvdC1od0pCWVBYMjlKUEdzOEE5TTlfUW1Za0diMEZzb2EifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"EM3zGRZ3IXp58aqF9-ISJVmYyDrp19fCd2UHpWD3HPukYsYgZHzqHo8v0vlVsYFvGlahiStIfKc"}'], - ['input' => '{"ciphertext":"__hNdjyA4YeCtHlz1fNjcajEx4S32PjNs1uKdgXKmas5UbNNFpuY2ITR6bu31EGs4FTOokFfxkf0FanWbqLOT0FFqSbh0jB5y_gg32xLrXpNWUZrSHsb6Q8WaNfl5j-lWnKowrSPxPXATZhSBCgDFbRp1Y-nck77x7qdvk4u7qAxpUImvQ3bOWdoOjAyxxj6BU-uP-yNJgml3BzEya-qU-8nGTxnlTjyvaeLDDjXPX8","iv":"OOuRSCC7nvWaZaYXOcXnwA","tag":"Jl9rPZU04Do3bJMvHTS9DEuOlVkQ31Z9b39qWfxZvp0","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVXhfaUVwV1ZQUGk3Ui1Vbm02UlE1dEdRX3hqNWZIQUJXeldkMEdfVWdSOC1UeldvbDZRUXVBZW9mdVRxbm5KbHYyajZFTE9ScjI4Tnc2MVZ6UTcxdkFFIiwieSI6IkFFWG91RXB3bjBMcU5DcHJIYnpsby11WHRQazZWUXd0TkE2WTY1S05uZkhUVXpDWF9lVGVUY3pwTmRnY0dPaWE4RklRZ3A4OXRlUWw2Q1c2eVZFeFZiZWIifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"Q-hZp5Ts6maPrD7e5GhOfw8eMxEWlWmR256N7LH--4yIRVhfIcs7KGF0LfmiovdlLIGLPDPCI5UOBWj7V5lt4q4QNx_qHWqu"}'], - ['input' => '{"ciphertext":"5eU_XuShpboU9NilrZWfcPlUMSN-VNw-aF9BMioU7aq-CllNT0y0l_JQYw8Z6L0QJN1Xd8zG6-EOVVlwZDTGgmfcl8xPdDbhmDqkZKIE__ejHs05wkE9d-VVDaPMBr6-qz9PMZh_rI-Io7jlbRL6b4E25okNlB4vfmv21hWP6-V4FDefqk-KI8-8uhcX3TXTTjvIm6XN9T9qjHxGC3V5AwqdM9vS2ns","iv":"kuM67zZvVGjHCp-l","tag":"FJxF24EhYJfRceXxPThaiw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBQ2QzWi1GNURGdXdvUWhRS21uR2R1M2Jza0paeG1yN2pWMVRHLXhFeXluWTV3bFM1REhVRU1FX3dtVkV4d0FEd09HMzdYZGx3ZUI2THZpR1JhWUR3VjZsIiwieSI6IkFYM1dGM25VYl9sZktfelhyYjQ4OEdtQmYzYlVSck5jZjdPc2RGSGlDMk5UYUVzZkd4aFhOdjNEdWxEcUdwUVBxMWtOSmVKb2l5N3NLcVpGWm5KeDM5SloifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"YcVE0diKwm0751TE9PnT-Y5SlowoRhg_"}'], - ['input' => '{"ciphertext":"uei5DL8ETBiQkCrCBSHCrkpMKYGKf5pnG5DfY2LQO0rCub8t72uQy_9_M0mxN-2KymlIJ2xXzevaciv1AiJKKZ2dw_MqAotMKkbY3-CWoLcui3J621DTPdInRWa_yBfEaZjcAyROkMXGCCwSFstSi6NxJCoepw_-N4DEpHnNOdDp18AmSEZyiUVVEoWyVzGKNnNi1IZfpPiUPlGUoMhMqcdO5N9l0QY","iv":"9-6zjl-SYClhgSMH","tag":"vGghyBNPbX0b4WAZ_yGOLg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBV1oxSnlEbjBieVJfQ2VYUjRvak04Tkd4ekt3R0xsandNeDNuY0VzbG90eXM1eFVWZG1zQzd5V3NFSkVZdG5sNllJQ2lUdC1QeUZUTkp1NkdZb3FpNThjIiwieSI6IkFCR1g1NC1MNEhEc3FZSkY0dFpZMVFyUi1ndVhyajh6dVZmZnlUbXJBQU9QWDExdXk2R3g2YXdxNkVZMWRjb3l0SnkxN05ZZUxFZHlvdV9tMXlZTW1FWTYifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"zGy_4_TYMQrn9t-8oJCB4YngUFGj2jSpMnMTCosDLyQ"}'], - ['input' => '{"ciphertext":"lzyAnuakQHLY86oQDPvNBov7rCZ14F8jCbsGhqAAakAi5I25s3qdIrUQkCL4gf8odOtsXYIDV7aQfgE8KFr9cU4dz57f76kuHoOxSpcoAS95nWdsUVyEIngmIxA2-zsP_9XlCvxR10MdcJMRc1rJBx7cl__DLcv5gPXQExETloHEBEgZsY1CX_RQ6KQhY36MPHVyWTg_UA-2hlJECg2y9drTMTaKp5w","iv":"eYdDBftinJCe944e","tag":"2UJDc2WZ0_cKQ3ARMxBM4A","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBUFVDYlhQeEVlbUllc1Q2UGNvUkM5VzZFMVcxaUMtc3VqdTBUQ0o0N3NZV19qMTdobHdidWhtRzBSSTdUdzZfQTRic3JFMXU5WEwwanBQMUN3RmNXRmRpIiwieSI6IkFRc3NfT05JaXZxMnhYeWg2YkZPYzE3b2U4RVNxV21Kb2VTZnk3Qy1tSDFUX1g3SEZ1eFVuSS0tbkF4ZkRlbVNfOVZhQmhXLVhDSjBJSU5BMXNmYVFvS2wifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"VESVX1LZuNBiAIbwRmkpVRcnJJl9pZW28nLqqLo9F2EWz6tMYa6t8g"}'], - ['input' => '{"ciphertext":"8qZDYzB4oNkaZ9fuP7VbBq_tgav-f4GRlm1LqlfSjru8CjaJlazysmCyTmiLMnlzRK8SBsJJHl3cD6mzE9th3cUXNnZDv8zWDyGJG1cqSBN9l1eNjm211wApKYS0Br4VeYvmCe-UqicQ9oY9HSTGfvOmoS2muUOcjq_E3NoaMBy9aCfCxpI0zbLToU1Pi6XX0067COb2-bYdubqkvvWv8hp8PHjWaXvL43IHQnzhopo","iv":"YS-zbeYANkS6GEVpMpJIew","tag":"1DnLg_8Ih2ZCSFUplq12QA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkQtWGk1Wm10TWU0bDh1cVZfc3ZBUmdxa3NYRFFnMl9adGVncG5LbFYza0UifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"u9-hFbvn6zywUw5BXi-bq4xyGRSnfnZWwptY6M4yoO9LyKHsocB6Gw"}'], - ['input' => '{"ciphertext":"Xuc77DY9PAIQ_yoVkKToDlhW9uk0Uzfaz9MciGY8eWGh9VrFcmuNG2H8gSsUStt-baNm-4VDeQMHslrsitzbr5J_oOidGO8W9zbkzPmBPTZC_5QjXnbXzjt9K7nV-Hj_gm1GCrvWWUhV_3wBqu_ImGvxBKwok7lbDuGzPl34emq9fuwgZm1hMsVB1ceG4GdT7gyWI-l3_ZWiPZ9PnohNiiEweOqXPIxM3SKlfZccUeA","iv":"B_4Jk2jT8k1gbL7kBA4UGw","tag":"014BQVWe_gTnHHO2KiTjvXTQkmjcQGDR","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkljUDBwQVdVX2xhdHRSZnFLYzg5NnRWdHN3b3FMVGdpbkR0Nmo2RGZyV0EifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"rLPSUu69AesWy5JDXfVWf_013-rTvXTJ4Oee6kGkGMU9dE8HvoH_i71r8DeSso8-U2jys27HL-o"}'], - ['input' => '{"ciphertext":"3WxZ-AFPhFmAFyB-pVPIexSD4WE2oLLPkUx03a_-CQFauAssjHo0qVANrolX_orqi1mv_bpy9BHN448JkWPmR67ceGh9QA0wJFf7murMjMQDsc7tOcmUUx6_r8stuT7otp8HpDER9-p9tIIStAFcHmfOoS7e47Zim3dl7dp9aiN4KJIobVnlURd3ea5IgDxWRA_h6GEZsZR30X-DWkMgxzy3Ww6JB3t5RNOp4cLghlw","iv":"U5mvwDvMQo2jUg8KE9eUmw","tag":"R3AXFz5R1u7hsdo4hs-LdbNKSn-l3YkMr0itx8yRYKU","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlhUXzU5SVltd3FnM0dYX3NVZ0p3V2h2ZjRwVWxVNjk5YU9wS3BQRGV1dzAifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"YXkavPBVx5ofJMT-KFm_ejahySbtIl8zYgZYM7ldnE4RXRdd0uTyVrpe-IQPXiw1GwulX6Wru0_yx53KhhHm0dreUdNlDhKf"}'], - ['input' => '{"ciphertext":"WAdVz48yPbEzv5v1V9HNMoF5VaBhPwz5vRseWAPZKTIyNqdA6umpTZ9qm96yWuqYb2yH0w5Cxe9dpR5YmLFPSqOs3Gps_kjJR-jOxwgQ8HcF7NM03H8RuBFHbDmUJnbmDTmsGL7zd2ETcTFojzZGw3mH-WGpb4DngVGVB7N9NtKLA7fo8DkO80pcjz0KXAPVQZ521NitqLf3XMwOoT3VPC-MAl4_6C4","iv":"LzUS-9qKaROPKhDT","tag":"CcYTnLTMuA5yy04akakr7Q","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6InRYeXp4QjR0M3h1aEQtdEd3MW9teVhCb2xpbVlWRFVBMXVUVDV0UlVxa2MifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"TmWcX0cXisnCFjD_cWaBYmkKkruAx9Vk"}'], - ['input' => '{"ciphertext":"SXzp2Qqa5YD1JrO4OSkrCSDvPc2zggmY3cu1hbKm-gLCGPsaEyx1HB3M9mWGJRUV2puLfx9YgKqwSaEtVfb8K2eMh1DcX21UYGl6ZJnL6nYhWOQ-VXqXgMme8aQxoG0-pv_i_ktUcH0Q8Y9X-dO5NxHYR250-TC3K3DdvBXguqAZaNxXt6QZLAJR70NUS0ckmI1G0-_HgAQ9otf5kl5XuJCCiwTpTn4","iv":"LflxldeSJrkcI-sa","tag":"Qtb2B4ya3Y80Asrbt2ZPTg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Il90Mk9yamEwUWQ4Y250TndwTEJWemdlRmxJek9GbE12MmNnZTFUZ2NIU00ifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"XVGVJ_M9SqL7mCdWsytLbhy9yVkjnBHwcnG0880GSx0"}'], - ['input' => '{"ciphertext":"3RiKN4NFaGrmu9o4VJqqt1VfH6HtVhIyTkY5BPFOgGefdUrmLZ6i7pnz9CXwrajoroFyyISUqMe-qJqhZgnzE6n-WPnYRd6pyYRlqfqK5W63YtWWNCKvRI33Cyoro4EITxACqzU58hH7I9Q1UNETkT5UcrK3ICZKngsTafTfhAC-YitjnXc_AmRsycRK75bUiNJeutyaPBTwAFCqB_IA-4FlGwtV79U","iv":"1zrIIE5dPwAA7RcB","tag":"mlFjdaJAn5bB9Yvk71GvFw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Ik05ZVpVQlQ5OWU3bHNmUlBCZGs4b0kxaW5ERjRPUzZhUHJpaDQ4dGlSVVkifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"jMlWsTieWwXF7Izuj0pa-g-bwJadXhV6EtFEcGZBbWIRcNgeO7tUNg"}'], + [ + 'input' => '{"ciphertext":"_2ZDM1eBLjU6k1XygQn5q8FcTZf9Bu_dlbjQ-MPh1jyQ14YplP2r1iZSnVke-UbDTFUGj97RZw4ab5PRxaWdo--OEY9MBDK-PK4HaLuM8mgxM_VY2VNLROSuZZc2Rk0UYWr5JLAq9l3N-6Ayjbn4L1EAslENOArzG05EdNcUFzkYjEm4dk5lN0_1ueL-8sy4CN088iUBm2ypygiVt00dnWd3d0W3zwgZiH53GE7zzQs","iv":"11dtOFD32AesbnRi4DKTMA","tag":"naveS2vDGMoeTyV0_eEv9w","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJmRDhiSXJkZEFkQUpSMEhsajV2eHdSSFl0eE44QU95c2loX2phcWtNLXFFIiwieSI6IjFZbmZmcGNiVzNWOXhmYU9mcWg0REZ1d1NFblhwaWdESnFvS2k0V25BejQifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"-lbBek3DTQlQm9LY7NoBdSdiLUsea94bCjEq__slnG1oAnO3OugDow"}', + ], + [ + 'input' => '{"ciphertext":"5IBzhh0acduGMoWjyRw0RTqI8byRTqE7jIR9So25ioKmYRRzHTUi2rIKvQzWY80u8wGe1hh7bX_nK5HyQztvyMZnECR2Z1xAWmZlNqEcV_QH6VUqfvnw0w6od2FMkraq7b-MFXTyVtUyqaW87OeDo1WTRrMOc64SfsVpQ5xLhhppC_LM3iTFOG7R-ldjyzWpoSqy6VkYGqTM5_EYnYiMfdPikr752uUnO97HiXQ3bcY","iv":"UJpFJkgRWQ2FDDHuHsizpg","tag":"ANvdf48Jr6ixFdCTgzj512kksNmKdV0L","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxNjI2TTBFaG9jalRFVmNwSVZvNWduNmxuRWpOVXVIbHgzb05mU0pJTndFIiwieSI6IkFCOHZJR0RWWU5HNkhBSi1jMU91RjVUd0d0TkhVNUJqUzlKbUs1UVBCYVEifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"CTUn875mWqvFzSqrz3YEpIXscd6pgMurvMjESuFNUmjE3E_CBrdq6IngiJVByr-z20PczS-ovD4"}', + ], + [ + 'input' => '{"ciphertext":"2-ph7JTQllkn5k59nLjyCvPFmC9Wo2-t9ec671GNRJ21CGDoCcevjESNfP_3cXnPBRneKotf8h7Vz1oC0hcZeMPXVGZUD5LXmgMrsWrXGF0vFN910E3ToOnOPhduYe1dM61DoYzwrgoP0t13IFWG7KQU0SjLDgAkiC2QChTIhLk81G52u1DWshpQdc7UT9Lfv8RBPCkltsfu3NlT8fpB4JABXDIJbXv_1M2ybfqqg24","iv":"tc8wFvNZ2I-fcHNhFxJtzA","tag":"9iJNeBy0m2JkHfHSMFT9j1rGj_RwdjDB5X4VQssehvQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiI0cWFsb0dBWUVHRFhQVThmWVQ4UzhtU3N0SUFXcUtHb1FKUlhkRVcwaW1ZIiwieSI6Im5lUGhqc1UzNlRGYV8tZFR6R1RlR1hZTjFnNmNIMTBkVk44WmpEcmZYU1EifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"zEVPN1GHM033Q7Ghz6uBSdgjC3CJZZOca89-iG8lIPdiIwI0OPoIOMWiPIGs_hwR_RMgdhnPa70MV4XtmMgo8FyyjOkwOsfF"}', + ], + [ + 'input' => '{"ciphertext":"2EZFKdOiXzI0ZXAd7F8eOM1csiDF5eJCKusj7jVGYEQgj3uJy4Tdm372CynBIop5jHQgCk_o4lGcJzQvnUC03x5ayR0u9g-6PYr7lvpPcJ5NSr1mfehN4whG4K33wGR9YY3FigDOZMWCSj3-qnTcw4mKvixnrhNd_lEYbcXp_foBH7L2kIs7YkoiLLr8__2va8aWBIY8vw7W6_44p4YjDU_i0JS2-GA","iv":"ZflD-9NFEjppvYSx","tag":"mcdC1NSqbjmD_imWCZxbYA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJDSFpiT0xQYXhReU9pMndpem8tUjh3QjAtRVFFTHhBQnJ6bS1TdVRHMFZnIiwieSI6IjFNOHZyVnRINVE0QnFjSWROUnVfNkctbVBWVDFqaEw2LWxkdHBDQzBSckUifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"ZFrUs0U01E3Sccm31VHeHAnzDaYMAO6i"}', + ], + [ + 'input' => '{"ciphertext":"3Hi4-hGfQ9CNzmkhKPg-uAAHiEzjxMz4jtSDmTuYkEo3-Ribc8H4M_Bqj0adpAS58mnPz9I-uEqrflUXeHAJ-d2Vb90gf1R8RKVjV-7Mqi5Bxhv98GFIZrHGFqmQuJ95yh8TdxSJXvMvKDkhe8u8rA2MgxNKbs63EVBr4GMCqRWGqagfOVHpkcobTdcDDpS6RKXwBfNyLVv4QdqyBUyjGAH-FgF2Ims","iv":"LV_MzlgZlIuEXYxQ","tag":"ui3S0bL6TSCgNaCSov7Vvg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ1NUhFLWRIV2FyU2NzdDRQQWlDZ1RKUVlnbWFCdDR6SE5aZkduV1NqTlIwIiwieSI6IllRQzAwUnpOWUNSWl8wNXdHelN5WmVwY2t0bTRaV3JQemtOdmtGbEExSEEifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"8dCnxob-1n2tC6HgfsLTFvc41WzriaHlV_qIbdjKY0g"}', + ], + [ + 'input' => '{"ciphertext":"pt41hd0_vaDa0O5HMf6E78OtCZlZ_r4-lwtUl48kZqqoz7k9tdmu_zrAIFA_wW7ieCp8-GBu9R_Ny2vH4FFvvQgMtSXx2h_YBAH8oPCDKBoiNRM2AFlC4T7palBNkFS-01y9eJkxwjmRgdJJYXWnCDSK6AyEsPEVZMOqVNK-fnp9-U3bUPBPSGFTH48Bs7NTB7hAMuLZWbMoJKQAQdz-wius40-nof4","iv":"dkYB6DStRMEOOT1v","tag":"XA304bY0KsYBu39T2IDjBA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJtVExiaF9LaFpKaGR0SWVXYXZENi16Nmg4blJjSHNrUWhXcU9VMUNiVWg4IiwieSI6Im53VnRYSmcwSU1WbFpXM2NYaU9ReXFmSGFvMFVXNXY0czNhOGtsT3BXV1EifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"C1B2p6_G8v2HuDH4ElWQzdCbaTepSxLNh9l_a3Nw-vTkwQgXtzDq9A"}', + ], + [ + 'input' => '{"ciphertext":"9qoT_yY1nVIwztNUHOfP6dtTfJQpvcrQ1uLAm8aFSZhSpIyg9xyJ_BVtAAyv7Grtfxt1f4N5YUK6M5zMf-ybhK-0ybudJHkLWoj0YtAvP1KkM3Wvq_GTCQ2ZdBjqIVKJTnUEfWmlGV6BXPVXLWM0X3svSJBCEwEOSQEufX_cI-mfcUi92VLN9rTTkDokvTLVntSGThcqydm8ZtmOg8u02liuHqEhXy0_gYFC_XY4Am0","iv":"abExYU1ldE0GO8_K-Wy4_A","tag":"uSMzfuP6WQzmTWn0OHa10Q","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJjSVlwT3RfVFR5X015UE96VjNJQ3gxd0prdGZZLTM3SWV2bmFVNnRtaWZJdG9qNWpkTkwxZmd0VkplMDRfXzJrIiwieSI6Ik1ZM1B6LTQzeUNjdlUzYmUwMExrMnBIel9IaTZQYl9RTWUxeXk4MWpvMDB6Qm5sUHFMdVg2d29uaGhGWTFnNE8ifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"zw5MEB3t4bAJ8GIa7x0DGQzybmnhR_ADOb9kNZI2-F87hHLi1-LTPg"}', + ], + [ + 'input' => '{"ciphertext":"GKfqg-1I9ItJSCsiDY9yIhYxnGuskdxPy_rXbz9MYOtmDNnRWNez8DlVmPf0AWhJSkYvCIohhCmbtighJJNJq0wGbriU9MjZogtWTzrUUhzEkKaZqgg-ofHcF_eow9h3GsQ1TEdBk3bOFLVxqBkauOR4qw7KFi42l5MNjJs1zLRihJvB3FxqJ79Dbc-1KZBcMmdNyoWFlzDCQazaZBpgPz5OYmN60SzhWcIkfaWXwX8","iv":"7AsW-AFjgNJyxSeLNQ5WdA","tag":"_E3l8ER_XQmNeFGrZnaE5HB6cOFs2gQf","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJoUUVxMVNaX3dpQ3k0enlNeVRJU2k0WmpfSGhNVXk5ZWo2TVVWYUhvelUxV1JJNXZ0QjdWUGFGVHc2QmUxejhLIiwieSI6Ijh3S2dhbVpLWW9EQUsydVFCeXpMWnBCaTRUVGpfZE5XR0dXbzZTSVc4RkRIaExPSjY1M2RFZ3VmREREVFI2WFIifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"en1pp2tN0ZgevdS8KwYpbcnTgxyKKbIs1qsETtGEbXJ8dUz59q4dw5P5LNGgs3ITQkKyAHIy-po"}', + ], + [ + 'input' => '{"ciphertext":"Q-FDEcUo_6zIyfnH_NApjUH7V4A4eQ8XJ6BF8SHg7qP6a8gjweAdYtHmy7CxvWOcvRdmyLNvfz93muQvHihRMZKvM7Cyl0BLuqKlQkwVmln94PypmsoYxoopl97zcdCTpkFYNvL4PLBomAVaagX-q9Xs7LL6r1hi1kf_drgoivfVQxRGrOkVw7Hm6us3dWG57Wpe8wWAGmJAY_I97owJC8-8zczJTMDLTiIFmPIo2pU","iv":"9aC-2rcP3gIKjMe4M_iOtg","tag":"IPNDjw-b6cbTuNuj8DWWhJTFW38IQQQbjuq9ftxCVms","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJBRmVfajJ3WDBNaFJMbmMyUVBwMjZrR1FEOXBTUUtiYW16a0xYX2l2NEFKeGsyVU55cnkwd3NZZ2JMeTREQUdFIiwieSI6IlJ1YlhZM0tvaXM1UzVZeVhOczhLTER1aDhTQThwYV9ocm44ajdNc0t0OWdKRnFWcDhVaUFDcVJDR2VnNzNtcG0ifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"43lvgJ17neOuzGkKKe-4FJi7YKkoXpfVNJsqdjBUzRD9FNkun8cmVuVS1TBt-PsQJIugykuhCv5tMihMzSODbZk8P46_4oG3"}', + ], + [ + 'input' => '{"ciphertext":"tqQ3LzEqIGZE94SoOskld4xuAmX3kguPPN26_Bj_MTrWEqUlbQ7D6dI1jcbXZZb-iOnIuto9CYb7uSniY4pR-klRH-9hrTX7dMGhZzuzY3hLn6JL-zlr5bZcbGl0Wsd5TZ8jxPJx6BMQ6ncCFCi4EhraSt2ty5Z3H5RaGXKhMOcER0vqfIxIQ7ij-yrJ_e11zRRxCxPgWjpNIkvvZzMC3XMMLgSHjls","iv":"kdmy4535OG2eGe5t","tag":"XwtRf4h8Bry_NAh2ReW-zg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJQQ1JXelloWDF2RTA0Sm9LNTlzQkN2UVloRWRKc0NhbWRTV1oxSlVhWGVHZWs4T1plNjJaNGdxVkRMMVF2aVAzIiwieSI6IndsVEZjMDJFdW5kUnFnTDBEbmFqcnFHYWMxbjEtNWx3TlgtOFVGWnZzQ2F0OFpyMFcxbWVvcDdzckRTdnliLXkifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"wRHEx-f-GthCfVhqjVJNF-h8PKLt8smF"}', + ], + [ + 'input' => '{"ciphertext":"_s0KJ5Wqqk2xsM4zlACqSX-VGZHsXhyGisdymCnGMuLh3oJnAX6hSDCVHCxNxduRXCF2WSsTAUfa1yLWs3GsN5ndbqLZZYDVHGSjtCSI4oBODo3Xp8NLpf676xjGJUem_VtqmiLLiV9etJieOB7kfZOa-DwGVc3RQkOabne_EmsornckgS0YXN2s61qOMCrZehPqP_Jj4JjzRIxuDKYVtyIN5rCGe4s","iv":"1XPPKja0ZDqv0o4G","tag":"bS5OAUL4-sK4Vo2bmMt7wQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJxTGVQUnVNNmtaTkZuUGhMMC01QktpOVBIZGJKdDJxZUM1REpiMXhlUTNWbThpNllwUmc4SFJqZVZPdmpJeWIwIiwieSI6InpiTlk3YnhtZ3FyZ1hxQ3IxdDNPVkZxdXgyY1lqRl85YUNOV1RvcDBXaV9HY0tNREJkLTVqZGNvZG1KcUhxZk0ifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"cA5I7NM1g16i1K3fFNapEajLRWlTY8Xi7ICLD9iICPk"}', + ], + [ + 'input' => '{"ciphertext":"7bAhp0XwPvbnVoLW7CD51u86heDUrp2CpUKSQXtcouS-LtY6ytvf7rC7ZVfe_-t6apo1jUIGaswxTl-ma_xOxuG2oybLwhXirKnRRryDHQsPwyMMLPMt2t-cXSW9QCa21KtkY-mxTpn0JZusIrT7F2zzovJmIR-4jlBqd_YlTT_BsoB8TWgSBoUMeoeZ9RFW-uBSeqCWBWeNyZH1lzjefYALYJ333Ns","iv":"4RZE4V9VHKPDIvIP","tag":"zQ27iVw3u6CW9JHhKvTdsw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJvTmRQNV9LT2lEWG9sMWhFNmRaakxnZURIOU5kREJfQ3paWEtqWC1VWkRaLWQ4NmhxN3hGWUwyWHhac2Y3dll0IiwieSI6Il9pZGpKLThiUjhnSVl2cWdzZDU1QUJkTl9pSmluSURETXBBb25uMnRFRE5KZ2dOajgwYVgwN0hYS194SVlhZUcifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"O2qIqAxybaUIEAC3NKq450ptzk3pHJ33DOg0xfajJ9sv_w4_OfHrgg"}', + ], + [ + 'input' => '{"ciphertext":"cEE2ph6vE0gyDsCGsJZ_N6cRRxvJtuFiLIwLMHntzIDrAiJb3DR0ks1dtgjTpAm4hKmkgG4ftZQ8zDQRk9mDMCKabO-eXo-evzxerqKIQBV5EysgmKojXfiG1f5MH5wKK-UwPgcMmnodQ_AAZMflrXXo2PbXL8OQIyIMbm7Mdx1NxbDKhFP00qS2ad0fdhNRL1dB5yzLHDMNPenYL3A1sDyAWcItRj8u-mP6V9z3K5w","iv":"ol8jKetABAiwv2QDNEJLUg","tag":"GFZsZlXowylyG5OTrzhcvA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBSGJlY2VBTEcxbVBXWmtuLWlqdjI1RkZFS0xnS1hqczVpMzgwRi1KdWZmd0lZYmx4ZklfanRCWnlBZnhBdFZFWDdkQWJqbGp1WFBPbFk0aTJGWFRfSmV3IiwieSI6IkFXc1Z2Q3d0Nk5SblBQMWlqTXNFd285RnlxbzFEV2dEeGlZbmdSLXZFTFIyQW1lVV82UWRwQlY4VUI4cnA2RndER1d4Mlc1aW93bkd5TmM0azJTeF8wcmEifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"RbuaR9R6aYWKqWBOFi517v8P5IjBjOmj9ev0T4EsNHuDACV4Zh_xoQ"}', + ], + [ + 'input' => '{"ciphertext":"tX2AOnAGCPECJc6w9zlsW_MAq9XC3JOQ6wg6zxDll3vmnRJ9j9CXkr56DMMFD-C1zmeiDgEIhcpMCPfkgJzdYz5hTygm-gK0EHNiwoNjHoNTMY1l-W2dy4J1ICxC_2ZRuZIs__ePHwcmvQE-JZhbxi087akNRIZ6A5Ujz8Y6MKdLODxL48Hr-qd1gyle-1QRodceu1deqmnLC62k0n_WNy7dyy9M0FUF-YHnHO_MLnY","iv":"vr_5AlQqrn4pS1T67DgzwQ","tag":"0tqhT1oHgUpKqWag0Rge49L4Ktrw2fA-","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVzZPTjFOVzNiaWFYMWlWTXA1dWJZRjJKc0VzRE5JWW82MFdkdVBVaHBwTWg5UUNpNkl2bWtSTWd3SWhtX29icUo5WmhkU2I1cWpsOTdUYmdrLUpqYnV4IiwieSI6IkFFR0VFSVlYMkJEZ2xCSlF0SC1idFlIRV8tbXBKUWRpdGFpVFhndkNXQWpRZEp3cnU4VVU3S0JvdC1od0pCWVBYMjlKUEdzOEE5TTlfUW1Za0diMEZzb2EifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"EM3zGRZ3IXp58aqF9-ISJVmYyDrp19fCd2UHpWD3HPukYsYgZHzqHo8v0vlVsYFvGlahiStIfKc"}', + ], + [ + 'input' => '{"ciphertext":"__hNdjyA4YeCtHlz1fNjcajEx4S32PjNs1uKdgXKmas5UbNNFpuY2ITR6bu31EGs4FTOokFfxkf0FanWbqLOT0FFqSbh0jB5y_gg32xLrXpNWUZrSHsb6Q8WaNfl5j-lWnKowrSPxPXATZhSBCgDFbRp1Y-nck77x7qdvk4u7qAxpUImvQ3bOWdoOjAyxxj6BU-uP-yNJgml3BzEya-qU-8nGTxnlTjyvaeLDDjXPX8","iv":"OOuRSCC7nvWaZaYXOcXnwA","tag":"Jl9rPZU04Do3bJMvHTS9DEuOlVkQ31Z9b39qWfxZvp0","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVXhfaUVwV1ZQUGk3Ui1Vbm02UlE1dEdRX3hqNWZIQUJXeldkMEdfVWdSOC1UeldvbDZRUXVBZW9mdVRxbm5KbHYyajZFTE9ScjI4Tnc2MVZ6UTcxdkFFIiwieSI6IkFFWG91RXB3bjBMcU5DcHJIYnpsby11WHRQazZWUXd0TkE2WTY1S05uZkhUVXpDWF9lVGVUY3pwTmRnY0dPaWE4RklRZ3A4OXRlUWw2Q1c2eVZFeFZiZWIifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"Q-hZp5Ts6maPrD7e5GhOfw8eMxEWlWmR256N7LH--4yIRVhfIcs7KGF0LfmiovdlLIGLPDPCI5UOBWj7V5lt4q4QNx_qHWqu"}', + ], + [ + 'input' => '{"ciphertext":"5eU_XuShpboU9NilrZWfcPlUMSN-VNw-aF9BMioU7aq-CllNT0y0l_JQYw8Z6L0QJN1Xd8zG6-EOVVlwZDTGgmfcl8xPdDbhmDqkZKIE__ejHs05wkE9d-VVDaPMBr6-qz9PMZh_rI-Io7jlbRL6b4E25okNlB4vfmv21hWP6-V4FDefqk-KI8-8uhcX3TXTTjvIm6XN9T9qjHxGC3V5AwqdM9vS2ns","iv":"kuM67zZvVGjHCp-l","tag":"FJxF24EhYJfRceXxPThaiw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBQ2QzWi1GNURGdXdvUWhRS21uR2R1M2Jza0paeG1yN2pWMVRHLXhFeXluWTV3bFM1REhVRU1FX3dtVkV4d0FEd09HMzdYZGx3ZUI2THZpR1JhWUR3VjZsIiwieSI6IkFYM1dGM25VYl9sZktfelhyYjQ4OEdtQmYzYlVSck5jZjdPc2RGSGlDMk5UYUVzZkd4aFhOdjNEdWxEcUdwUVBxMWtOSmVKb2l5N3NLcVpGWm5KeDM5SloifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"YcVE0diKwm0751TE9PnT-Y5SlowoRhg_"}', + ], + [ + 'input' => '{"ciphertext":"uei5DL8ETBiQkCrCBSHCrkpMKYGKf5pnG5DfY2LQO0rCub8t72uQy_9_M0mxN-2KymlIJ2xXzevaciv1AiJKKZ2dw_MqAotMKkbY3-CWoLcui3J621DTPdInRWa_yBfEaZjcAyROkMXGCCwSFstSi6NxJCoepw_-N4DEpHnNOdDp18AmSEZyiUVVEoWyVzGKNnNi1IZfpPiUPlGUoMhMqcdO5N9l0QY","iv":"9-6zjl-SYClhgSMH","tag":"vGghyBNPbX0b4WAZ_yGOLg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBV1oxSnlEbjBieVJfQ2VYUjRvak04Tkd4ekt3R0xsandNeDNuY0VzbG90eXM1eFVWZG1zQzd5V3NFSkVZdG5sNllJQ2lUdC1QeUZUTkp1NkdZb3FpNThjIiwieSI6IkFCR1g1NC1MNEhEc3FZSkY0dFpZMVFyUi1ndVhyajh6dVZmZnlUbXJBQU9QWDExdXk2R3g2YXdxNkVZMWRjb3l0SnkxN05ZZUxFZHlvdV9tMXlZTW1FWTYifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"zGy_4_TYMQrn9t-8oJCB4YngUFGj2jSpMnMTCosDLyQ"}', + ], + [ + 'input' => '{"ciphertext":"lzyAnuakQHLY86oQDPvNBov7rCZ14F8jCbsGhqAAakAi5I25s3qdIrUQkCL4gf8odOtsXYIDV7aQfgE8KFr9cU4dz57f76kuHoOxSpcoAS95nWdsUVyEIngmIxA2-zsP_9XlCvxR10MdcJMRc1rJBx7cl__DLcv5gPXQExETloHEBEgZsY1CX_RQ6KQhY36MPHVyWTg_UA-2hlJECg2y9drTMTaKp5w","iv":"eYdDBftinJCe944e","tag":"2UJDc2WZ0_cKQ3ARMxBM4A","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBUFVDYlhQeEVlbUllc1Q2UGNvUkM5VzZFMVcxaUMtc3VqdTBUQ0o0N3NZV19qMTdobHdidWhtRzBSSTdUdzZfQTRic3JFMXU5WEwwanBQMUN3RmNXRmRpIiwieSI6IkFRc3NfT05JaXZxMnhYeWg2YkZPYzE3b2U4RVNxV21Kb2VTZnk3Qy1tSDFUX1g3SEZ1eFVuSS0tbkF4ZkRlbVNfOVZhQmhXLVhDSjBJSU5BMXNmYVFvS2wifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"VESVX1LZuNBiAIbwRmkpVRcnJJl9pZW28nLqqLo9F2EWz6tMYa6t8g"}', + ], + [ + 'input' => '{"ciphertext":"8qZDYzB4oNkaZ9fuP7VbBq_tgav-f4GRlm1LqlfSjru8CjaJlazysmCyTmiLMnlzRK8SBsJJHl3cD6mzE9th3cUXNnZDv8zWDyGJG1cqSBN9l1eNjm211wApKYS0Br4VeYvmCe-UqicQ9oY9HSTGfvOmoS2muUOcjq_E3NoaMBy9aCfCxpI0zbLToU1Pi6XX0067COb2-bYdubqkvvWv8hp8PHjWaXvL43IHQnzhopo","iv":"YS-zbeYANkS6GEVpMpJIew","tag":"1DnLg_8Ih2ZCSFUplq12QA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkQtWGk1Wm10TWU0bDh1cVZfc3ZBUmdxa3NYRFFnMl9adGVncG5LbFYza0UifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"u9-hFbvn6zywUw5BXi-bq4xyGRSnfnZWwptY6M4yoO9LyKHsocB6Gw"}', + ], + [ + 'input' => '{"ciphertext":"Xuc77DY9PAIQ_yoVkKToDlhW9uk0Uzfaz9MciGY8eWGh9VrFcmuNG2H8gSsUStt-baNm-4VDeQMHslrsitzbr5J_oOidGO8W9zbkzPmBPTZC_5QjXnbXzjt9K7nV-Hj_gm1GCrvWWUhV_3wBqu_ImGvxBKwok7lbDuGzPl34emq9fuwgZm1hMsVB1ceG4GdT7gyWI-l3_ZWiPZ9PnohNiiEweOqXPIxM3SKlfZccUeA","iv":"B_4Jk2jT8k1gbL7kBA4UGw","tag":"014BQVWe_gTnHHO2KiTjvXTQkmjcQGDR","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkljUDBwQVdVX2xhdHRSZnFLYzg5NnRWdHN3b3FMVGdpbkR0Nmo2RGZyV0EifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"rLPSUu69AesWy5JDXfVWf_013-rTvXTJ4Oee6kGkGMU9dE8HvoH_i71r8DeSso8-U2jys27HL-o"}', + ], + [ + 'input' => '{"ciphertext":"3WxZ-AFPhFmAFyB-pVPIexSD4WE2oLLPkUx03a_-CQFauAssjHo0qVANrolX_orqi1mv_bpy9BHN448JkWPmR67ceGh9QA0wJFf7murMjMQDsc7tOcmUUx6_r8stuT7otp8HpDER9-p9tIIStAFcHmfOoS7e47Zim3dl7dp9aiN4KJIobVnlURd3ea5IgDxWRA_h6GEZsZR30X-DWkMgxzy3Ww6JB3t5RNOp4cLghlw","iv":"U5mvwDvMQo2jUg8KE9eUmw","tag":"R3AXFz5R1u7hsdo4hs-LdbNKSn-l3YkMr0itx8yRYKU","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlhUXzU5SVltd3FnM0dYX3NVZ0p3V2h2ZjRwVWxVNjk5YU9wS3BQRGV1dzAifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"YXkavPBVx5ofJMT-KFm_ejahySbtIl8zYgZYM7ldnE4RXRdd0uTyVrpe-IQPXiw1GwulX6Wru0_yx53KhhHm0dreUdNlDhKf"}', + ], + [ + 'input' => '{"ciphertext":"WAdVz48yPbEzv5v1V9HNMoF5VaBhPwz5vRseWAPZKTIyNqdA6umpTZ9qm96yWuqYb2yH0w5Cxe9dpR5YmLFPSqOs3Gps_kjJR-jOxwgQ8HcF7NM03H8RuBFHbDmUJnbmDTmsGL7zd2ETcTFojzZGw3mH-WGpb4DngVGVB7N9NtKLA7fo8DkO80pcjz0KXAPVQZ521NitqLf3XMwOoT3VPC-MAl4_6C4","iv":"LzUS-9qKaROPKhDT","tag":"CcYTnLTMuA5yy04akakr7Q","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6InRYeXp4QjR0M3h1aEQtdEd3MW9teVhCb2xpbVlWRFVBMXVUVDV0UlVxa2MifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"TmWcX0cXisnCFjD_cWaBYmkKkruAx9Vk"}', + ], + [ + 'input' => '{"ciphertext":"SXzp2Qqa5YD1JrO4OSkrCSDvPc2zggmY3cu1hbKm-gLCGPsaEyx1HB3M9mWGJRUV2puLfx9YgKqwSaEtVfb8K2eMh1DcX21UYGl6ZJnL6nYhWOQ-VXqXgMme8aQxoG0-pv_i_ktUcH0Q8Y9X-dO5NxHYR250-TC3K3DdvBXguqAZaNxXt6QZLAJR70NUS0ckmI1G0-_HgAQ9otf5kl5XuJCCiwTpTn4","iv":"LflxldeSJrkcI-sa","tag":"Qtb2B4ya3Y80Asrbt2ZPTg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Il90Mk9yamEwUWQ4Y250TndwTEJWemdlRmxJek9GbE12MmNnZTFUZ2NIU00ifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"XVGVJ_M9SqL7mCdWsytLbhy9yVkjnBHwcnG0880GSx0"}', + ], + [ + 'input' => '{"ciphertext":"3RiKN4NFaGrmu9o4VJqqt1VfH6HtVhIyTkY5BPFOgGefdUrmLZ6i7pnz9CXwrajoroFyyISUqMe-qJqhZgnzE6n-WPnYRd6pyYRlqfqK5W63YtWWNCKvRI33Cyoro4EITxACqzU58hH7I9Q1UNETkT5UcrK3ICZKngsTafTfhAC-YitjnXc_AmRsycRK75bUiNJeutyaPBTwAFCqB_IA-4FlGwtV79U","iv":"1zrIIE5dPwAA7RcB","tag":"mlFjdaJAn5bB9Yvk71GvFw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Ik05ZVpVQlQ5OWU3bHNmUlBCZGs4b0kxaW5ERjRPUzZhUHJpaDQ4dGlSVVkifSwiYWxnIjoiRUNESC1FUytBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"jMlWsTieWwXF7Izuj0pa-g-bwJadXhV6EtFEcGZBbWIRcNgeO7tUNg"}', + ], ]; } @@ -89,30 +146,32 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'crv' => 'P-256', - 'kty' => 'EC', - 'd' => '_gUgAjx9zU5BKlHq--TiCjZmsdNQAgrv536DCTUM2vo', - 'x' => 'Kuh77MGkweIENgR_3WjzJ4gEF47yn6yQWAeeNqYC5qo', - 'y' => '1koAqIfb5C2PkCT1GYEcW4IcIEdrgOdMcua6G0Eyhtc', - ], [ - 'crv' => 'P-384', - 'kty' => 'EC', - 'd' => 'Fn_Le74znJfY33TkqCoskx1pkgA_1sLnKvfvM_78lTZT2zfj4XC6uY_L8iRknOii', - 'x' => 'o5CqgE0jIlCVwGKMXDsQmkOgxohJcod4hv7jo4h7qeRoysAV0YPtokMgv7CUpSCG', - 'y' => 'Z3ZGVhyv3T-MudQI5fYNmkO1BzqlHQJHCQ9RQzqa05QOsUZo39gjVC2EhRv1Z9kz', - ], [ - 'crv' => 'P-521', - 'kty' => 'EC', - 'd' => 'ACebnk5N5RV4VFhrCmvp-5w6rsQJvHdvvBdJkIKmq3pDDreKC0vU-K2oYrQaX5vPuI1umnVw9qxFq6QCsShJ38Fh', - 'x' => 'AR05Z1Xe74_lcrJbhKg12jijs5LPbLwcpHDGETssYKRgbO3-4l7egk_WtLjSeXmDvRfkww9kKpFdKHTqmDYSIzxf', - 'y' => 'AL7NyrGpwcXqfvmQb4d7N6vO7REegUaFv8ea-_EXyA2eJciZJSmvipwpxRnoSfkNuJ5yJUGdjg_FtaddKaLdJEf_', - ], [ - 'crv' => 'X25519', - 'kty' => 'OKP', - 'x' => 'LD7PfRPxq03bd0WJyf_1z-LQevmrbcYx7jJafep3gmk', - 'd' => 'pSdgXFRYMvOa7giAm3Rrf5Mf8GnvLz7HtZKu_KN06KY', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'crv' => 'P-256', + 'kty' => 'EC', + 'd' => '_gUgAjx9zU5BKlHq--TiCjZmsdNQAgrv536DCTUM2vo', + 'x' => 'Kuh77MGkweIENgR_3WjzJ4gEF47yn6yQWAeeNqYC5qo', + 'y' => '1koAqIfb5C2PkCT1GYEcW4IcIEdrgOdMcua6G0Eyhtc', + ], [ + 'crv' => 'P-384', + 'kty' => 'EC', + 'd' => 'Fn_Le74znJfY33TkqCoskx1pkgA_1sLnKvfvM_78lTZT2zfj4XC6uY_L8iRknOii', + 'x' => 'o5CqgE0jIlCVwGKMXDsQmkOgxohJcod4hv7jo4h7qeRoysAV0YPtokMgv7CUpSCG', + 'y' => 'Z3ZGVhyv3T-MudQI5fYNmkO1BzqlHQJHCQ9RQzqa05QOsUZo39gjVC2EhRv1Z9kz', + ], [ + 'crv' => 'P-521', + 'kty' => 'EC', + 'd' => 'ACebnk5N5RV4VFhrCmvp-5w6rsQJvHdvvBdJkIKmq3pDDreKC0vU-K2oYrQaX5vPuI1umnVw9qxFq6QCsShJ38Fh', + 'x' => 'AR05Z1Xe74_lcrJbhKg12jijs5LPbLwcpHDGETssYKRgbO3-4l7egk_WtLjSeXmDvRfkww9kKpFdKHTqmDYSIzxf', + 'y' => 'AL7NyrGpwcXqfvmQb4d7N6vO7REegUaFv8ea-_EXyA2eJciZJSmvipwpxRnoSfkNuJ5yJUGdjg_FtaddKaLdJEf_', + ], [ + 'crv' => 'X25519', + 'kty' => 'OKP', + 'x' => 'LD7PfRPxq03bd0WJyf_1z-LQevmrbcYx7jJafep3gmk', + 'd' => 'pSdgXFRYMvOa7giAm3Rrf5Mf8GnvLz7HtZKu_KN06KY', + ]], + ], ], ]; } diff --git a/performance/JWE/ECDHESBench.php b/performance/JWE/ECDHESBench.php index 7b5a398d..841f703e 100644 --- a/performance/JWE/ECDHESBench.php +++ b/performance/JWE/ECDHESBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'ECDH-ES', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'ECDH-ES', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'ECDH-ES', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,54 +67,150 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"KsRIKGTIm8Zf_AgLI5D1ymISA63OIamKsYk1VB7xsw4j2mwDuKR9MA1mhUbc-Ps_s7VIOzK0qaKwPhdEjDcIb-Vut2yQ0E_HxpFyjNr5T-RbbJ1kdy1hXK3THo-Fcdrw2i3SoLYKi7pTh06CmYyv42iePtr1tq2t68MiUeRI9ZElD4Maf4ONcPWsG9QwmQzzui8kGdEJ58IzpAaqLzXAzYsj6K6Dd6rFHA9Gdd8lCtA","iv":"Ssta2D7cbN7ohhZ_IEirGQ","tag":"FOYasMqq5L_D7McwEcFbUg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiItT3czODhtbDc0dEhkbDd6TDFwbENoTFFyVHdyOWRNRnN0VmlUUFFEWGJBIiwieSI6IjJSSmlpMF9xVmJxZGhtV3dWbUhzUDN6X2hFeFpRNUZJaElGWEg3d2hXRFkifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}'], - ['input' => '{"ciphertext":"AbyYGNhmhfPp1losLrlcwLupvYHOpq_qUj3fCWYRGUwqE8z6G8ZKMC6kPaKfN7cepJIgxi6vP7Dxb_X-e0uJlD8mofiramMujc5w5gS91H_4LDfjA0hPsQNZsevvQ6H9Wb6KQfEH_ADw3Qo2lq-C9gjZdtpvOosvoph8D3E6jA9-DdC3Q1X0vSHgTKKwUVOiCAGXVUxclSvSIwkai1jIEKQDdch2So4ZGg2jGM9Mu0Q","iv":"QNuVRp1d7frRChaUKCFwOw","tag":"8zf7asVXbIBlD5M5_tGvynUDYCHkxCks","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJNWDhyTWthUHVzcHlMem12RFJUMWFzSmE4ZGVSQWZ0eEF5WVVqWFJWOUtvIiwieSI6ImlsaHFZRnF3eGRqZGM5UWQwYUp6Y0N5U1Y4U054endpVFdqUE9QWEtJa2sifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}'], - ['input' => '{"ciphertext":"UTHlayhPiU24oSypsNfRxpcbbCEJCrF3AtjNShs0LwflvY2m6CgwBLhKulw8HHtnDaxcLYjXutm5pXgzbgflwtHoAwh5WOwpnXkceAYm9vVUkRPwcRCeczvYy8__FSAzjJXRfFloy4E9cZtv8culFh5I-kbaEEs_E-3RQD3fvlbo3JLB4rrhccWjgM-qyF8eIHGFhAWa2Ez87dXCde9d8dvnn6StnfV4u-lTleOe5wE","iv":"6AnITEM_hi0oTJSI1EroVQ","tag":"pgFbCS8Jchp1z0qrdIS2mgiheApFT3aG20iyFOXk7_U","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJzd0ktbThvY2tNZlg3MjhxQkRoRkJ6MjNta1JZS2xJSXd2S1ZObmdZYmpnIiwieSI6IjNIb05TWHZ0QkdRX3pKTlE1ZmM3RVNqUmVhVFU1WF9pc0kxVzV2MG0zUG8ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}'], - ['input' => '{"ciphertext":"j0e5K7z08DEb8rkYCdtQimnNlO5VJ8OCipL1LmBxDWJ3FIxq2yxunhbzqYr5OsbBu2nsi26enhgxdf9utxYcUMhXY1BV-VOSaFVZHkKowSCco0H95a6sNhJVVGaLHFE2dLUl-Ooxlc0g6tDJC-Lyi9cBFuJlm-KeDZwrhd25g2Dpk38DSFN5ZUujstiLq-gibsm97DB5FDZvhk-elgJ5sBsM-k8wz3s","iv":"KG2bIjAFOXMY2_A0","tag":"4lrGURacjerWUN_szorv5Q","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJTaUxhQ2cya0ZuRldoOHFvZTJoblM1UXhPQy1BbUY1X0I4UkVhSkZzZEVZIiwieSI6IjhEOXJPaXQwbjh4ZjcxekZsallXRnhjMVI2SjUySlpvNFNvaGNuNFNmUTQifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}'], - ['input' => '{"ciphertext":"EmExZLBtuOMeu436MGmVpPGL1Oxl0pE8viy88rlyll-K4o7rWViqqxms7V4UgPs2FnZgdL8CJ6W_NY2QlPQlzrANPc9oUinD_OjScH-0Ff6Lb-LskWlGNebqyyl74XStzGO7K67jCnc0oXoU36yfuZFcjf5t3RI1Wh0hL_RL22OxVIk3k_WkurIgA-F2WkXDVuxlRW-nWkoNoxpRceZgDQmBVD0cfb0","iv":"lk2StauExilwOfql","tag":"1fXcCfufql4eRHvfsvRoNA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJqRG8wN0t6TkRuUjJrVERDVEFFWWZpclpKR1h6V2EwcE00UFlUWjg5ZUlrIiwieSI6IlNIaUpFNGdDUzBvZG1sdTNrcTF0VXNFenFoQnNvOWxtaHZpREE2Y2xoMVEifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}'], - ['input' => '{"ciphertext":"m8LhdFezEohHDHP1MR8mY26PF2qP1Ay9KHfQGXeCGJmLwR2U_V50MFP9_ehlHq3QrMXlM6EpbGEaa7BSuiZg9bhNbVWAHx9_S-NmZ8NcimPuRAexc6303fNoIyIwMBkAHdHED4IbRMfzdsJg9v05aMTzv3SqW7dJezyTPN_rWuFpYDFlqPg-c5HK90OOY5BR_zW5OK5XAVz5bxsi21HW0Ti0yHBiCgg","iv":"X6u2KRH0g-OOH2M5","tag":"h_xvwqzXIu5HRJn5OTy6zQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJDZ25yYklpWmVXb00xUzJVRDdXcHVhRnNHeW50RzI2b1Y3Wm0tWHRRODVBIiwieSI6IkZiTkZLdEZDaDdoUTNyV2tfZWVTNnNiemUwQ01SZkNCbkdsOHBKbU5YMEEifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}'], - ['input' => '{"ciphertext":"DmmkxBraJ0QZj5ZWb2QA0XMopoqxLVOC3DI1DmDLkrFOlqu1kTZhvI0Hx9EcST1YbvZ0Z77s9SpvXlHNW36vWBOqZQxWpGysh1lazijSYjN28lw5wKkhqBDEu_6_K__S6I-EA6PI8cl2wdA3LOIauA9_0smfmVcA2Ka3umN1EayDMIaMuwU2B45zuJrhHDxVk_9mV51fmVq7-lKyyAeu5sVy3KTn9FLWxcnkrZ3ajog","iv":"eoG62aPTiTdhUg1ZCt_QUw","tag":"IrYMVE6U87oo_LsNr0nHDg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJBNDZpY3FwRjNYX2h3R3RRQndkOUw2d1NlajdiZGk0WnlRaVBsLVNlMllBS1BMT0kwbU9hQmw0SFZNNl9uMWJPIiwieSI6Im44cjZjSEpKOTF0SlFLLWhscnlGUlROQXo1SVNfbThkR05wVHcyd1lxMXVnRlVfc19nSGczUkJhTnFiblZ1c3MifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}'], - ['input' => '{"ciphertext":"S81Z4p-qRKFcMNqQwG-pKd8dGhy1wuYG5tQN8FvEyW0A3R2d9jmChe71LEU7p4cdljlZPI19f7eVH6GvJ8drY-bcck5MobZuePcs2bCJVR4u2UGGQKiowbaeuquzErDKSq8p59yRCsEuIKfEHOUEQiLILs7dMUTFUgrv22vn6UVI781h3qOrSa74tGuwthTdSvaTgTE17Wfc3jj7BTgngY828updPsXEsDdSLs-qrMo","iv":"JJeemphZk_34coLYqxoyNQ","tag":"dq93EO-2TId_55J3GJ5gLAPKVEsHLJoI","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJMNU9EYmRQdmZmOU9RZWROYU5sVmtPUk94VlNCY01RUEtLN29PWnRZU3RZaXpFTi1sZzhNbTFSMHR5bmtZVWwxIiwieSI6IjhTYmc1WXJZbnljVzl1QVBZYndCYXNvTERnbXdFUk12Y0VnUHN6dmFPNTdIMUxLWF9hTmpnXzg3aGw5ZUNJcXkifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}'], - ['input' => '{"ciphertext":"r-Fr1h9QP-jkTQr_72bTxMEfZeL7loJSfuam2ifuR6nxkfWLsmPFvtuTPlNW2qpddP3b2vVl-MUFjzj5KSkM9FeTMlDzcYhrdWnsnPzpnKlR_dmqnQqtpH1mudHLjzBxOylL3TAao4RRZGFWhPSgplqjR-bkxI0TgMLi3UIjI_8xaTOE7OLfw-xf5a99oegPzodcKw2J1_Hbcg8XWwTXkNHdpVdm-p_OfZXsABYRKe8","iv":"vjiEqMMHjngniUPvbgBWDw","tag":"_wcGyo5Kgwu6Bx4gQtIC2B37br443LevIA6sveBG7_k","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJzenExTmtBN3MtanpfN3BmTENXMzgtR3hxcmRCc2drUHNVX0pheFBmanpwTmdoYkFCcGIxYzVJd0NDTG80VHRqIiwieSI6IlVxRlNtb2RDa3EtV1pqZzYxLXplQ21vMF9mb0tnQXItVzgzRlhYQWpONG9mQi1UUmt1d25HbFlVM3hEN2x6VGwifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}'], - ['input' => '{"ciphertext":"YaBX6UK6DiJHZEx0VcHIiiLIIsgotyKhBpcXzKc5mGx-adCb29Fvz1mHz6NEaR-MGs_Lbyr1_Iz63fAgH4MHbeLVhLNR986suo9t6kIXghe6jBHFuzwubEW41w3HwFXTGTQAdAP1VdDzrNp3YiwTO9sxugGNaO7QcxUCoogT60a3sNc1bMe16Hf3adrj58eWYZccnpTRnNWULfiu_fb_e_0vDfKjtek","iv":"ExgS-jAeC0B8cFoe","tag":"eD6oYHjnAgbQivjazEpR_w","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiI1VHVGcE9GaUtWb0czdWRKd3ZVM1JfM01OSVdhdWxJZm44ekg2a3l4MEhscWE2QktISjFxWHlVNlVlWm5hdzVtIiwieSI6IjJTX0tfYkttN0xtdHI5MG14V1YxNHNTaW1Nczh5WUtDdWNqZnZpZmc2Q1UybjBMMTQ5cG5aamx1MEdBSnM5akUifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}'], - ['input' => '{"ciphertext":"tsFjmeszfXnah0CPF2_2xAWHD_P8isIhVShnJ1AQ15IR4aTXB37l5nIo4kVXCLaNgR4N-CjR6pumn7NLNFzfgqQpbQeXFx8dqCMkbDlQBMAuPeu4AoxhVGaDqRsHM_k2H51WVayAjkFpgrItc6XEjIu2y4o8Hy0-_hD6c3-lK22U6ZRLg-10Cq-pDN1Nq6ZRxTZx3mvzWeRIrko8t-k9p4yKcJVmOpk","iv":"wD7u4GcP0EjHR_mm","tag":"I8g2nTz3UaLDqrLWsuN4pQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJ2V0dQOGJRRDVwdTZHTkxYWkpCNnlfN3hzQ1J0TjZCeDdDRU1DR1lRRWxuQTZUYjFXOUkzRklyak40eDFLZ3c4IiwieSI6ImVodWExdE05bzF5OHhXS3ljUU1sby0waVctell1bVBUYmxPbUlZaWxKVkVadDVpbGg4VU9FTDNZZjRrU1RxTFYifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}'], - ['input' => '{"ciphertext":"ZT1Nli-gjvAtYCmEWyMsuQ792N6Shse-YVEcKBdg5iJzK5Xjpt8ZfhGnLoeBcpYZIiFxmNbXvwJLnRrtzl_Yvt5KYVu4XAQY5CyMUfJi5i35j3SY0C9PT-TymiwOj_8fLmmookDbQpgWeQs3RcHCUCR3OpjSrlR3Xf3nVzhFMaC4MYOoS1TTL6Cq0bSxPRE74i_lvL6cR9sBgPIIUvW5I4EkmzgCokk","iv":"Pw4u5IW-j6TCPEpP","tag":"kndBhMtDYRX4rEp01ndQFQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJkZUJOazd4ZUN0R1ZtUk1RSDJSVUw2Q2twNXFCWS1OU2Q3Tjd0TjNPbmwzRGMwaXJvMm1faGVqUG1KUGJyYkNkIiwieSI6Iks2S0RRMklwMENubTcwaGxkSnRMM2t5R0wzdGgtUjFYOTdQNVFVS3VnWlkwMnZ2QUpvbGE4Q1FZQ1AtTHlEYUUifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}'], - ['input' => '{"ciphertext":"VP3msKx3uJKdWkeC6Cz5gM2thvDzSyGyccTgQbxHemaO6Egq8afzTnoj841yY5EczIRfBT9QsSlhu7nWFUY5i8RXHhIgAQHaBPv7sutT6_ISDRWdxgpd27tTMP5bzsPsAyX2jvtQx4gCvte1BI-RR19qCQRiRanq3JvbStpgYYRSzo5b4BhP5ik1WJy_b2_NK2mAXXtYo0WgBqjBDXm7t46euLxScMBhwRtuUWddGis","iv":"qfyMAIJhyeROiM_u5DBLHQ","tag":"CVs13nkHgx1IJ67NvcAYJw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBU3VpVEtOSzVsejZQcnBoWFlhNDdWcXZtT0RDbk84clRQUUU5aExkM19TRm5RQ2JoU1Rua3NYZktYb0RaZ2lTa3hqWkpXOGh4Q0VNVkFkWDlnUzl2M0x5IiwieSI6IkFPWXJEZ082VGFwQ2hzc0c4NFJEWXNGejVzT1NBR056MURsLWtHQnFSRVUwNkZYbkVkYUVxSF9vOXdkUkxmY01QZWxkaEpGR3ZnT0k1bGowU0p0OUZ4aXkifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}'], - ['input' => '{"ciphertext":"JzSiCguosSsOArvPlmaLyZIfOfPIKjwU4bhHmkMtRmgFk2Go4spQT1WF9vHXBVZSf6itljYZAHSMrERLAjNwovX69anddc3eaZSNvgvKb1oH_bcHb-uDLVIcktEVqIopajbBaDOU57tQEWSuHN88odCJTjolchcwqSYmXtPjS6J1nOxy7ulapbWgMGqFMqiZtX0Iq6YcyzJVimvOvshERVy6Y3BwYAaLARrOugWSB2E","iv":"BM1ts9JitMS3izCW0YJy1Q","tag":"mcfyHYGEuiynDfnod-yHU8Uoe_SrSaHf","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBUU9pdklxVi0ycnU3MDNaYVRxTEpMQlRwVUVKdWhQMXhPaGNlOWdOS2lkLVJ5LUtEY1JCNVZkR3c0TE4xNHlNOGVHcmZUN2NqVXFVWlBaMkJqMUpSQVczIiwieSI6IkFXRGxrcHRXNWl0Q3h6MEEtbmN1SmpFWDhoWlUxUElwQ3RJWkRobDBYVThUMFVqeEFsdzUwRGx3TlRtUzdUcmM0dEtRdjd0cTRPNVFHdFdOWW96eHJxbE0ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}'], - ['input' => '{"ciphertext":"BriyWYaD3yOINglVHQmdOaveAUZYHU5zS46aTYvLA1pzP0-S5r_MBF3qgZOH9iLEdl8KgTCOolKBDjLXOG5YsL9KqMTHAmTBTxvIhIx-O57KBvl12MsGxb65TU6IX2bLVkc8Zg7A8-m6A2v2zb_DsfVZ1chxW7fsTKl218R6_0TTwtP_7T-4ctlc81vEZqOLquTpaieWoG-ASOehfB3CN4J7Dp_sJ-okeqNArmWq3tE","iv":"Ly3eUiXkIGMok1n4SjSfOg","tag":"RDj7osy5t7NREXO0I5eULOP5So1s_A3X2dbQHws9Qtk","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBYTQzUDdEblhyS2Fwc2hZNmZMWTJXbV9ScHRqUVc1MklpT20tb0VDV080elZtSVV1ZGtNeE4zSV9IY0psbThmR1hFeEp3NUx4MHp4V2lDZm9sRG05eGVmIiwieSI6IkFmSUNkY0dqTlEtdmZDUXl2M1k4bG1kckhVV1hZQjdoaU9rQUp4UUVlYVpJNjJuZnpMeHdBcUg1VnhIQTFNTHhYSWhJb3J4TkV5Y2RPRmo0aGZCbXhRT0EifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}'], - ['input' => '{"ciphertext":"UbVIUUAKozSZNbzQd6PCP7WK6o_sE2bo30UYWdyn1YDw1_trpfmaI3w-YnlyOiGwPr-zC_vmZ454W_Ryn0AGXKXqiTaekS53WbG8Th8wDlwS14AQultrF9qk9OnOvkTrOJP_O5iQD2TcqRGKTayVuDCmqdoQuy75peY-9l0aFhEEvt11DaDxCPjghE2oeL7tJZeOkWJklW3C4fXhzO1JApC88yeNNGM","iv":"eQprJb7oLn_UofHS","tag":"nn2X8aNEZi4tyhFMa1wxfQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBWTBLc0JobmlJcmRzZUZNMWtYcTh4bmdyNFhkbEphZHNxTF96SjI2TUc2VWY2STFlbkhOTDN0R3ZrU3Bqa2Q4Sm1HR1pZR2pfQXI2cnd0V28tS2FVRmd2IiwieSI6IkFWN19fUzJqLXQ1TE9ndHRnNEtlLXQ0SlpaUVMzb1llak51anRYSTJLU2pGVXBhUkdGRUNxUmh6TlBoMnVpU1Jya3kwMEx4X18tSWNSS3htclhTVndaR0IifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}'], - ['input' => '{"ciphertext":"kbNXtTo5NBpqdJB5eF4gq2wYrVfytSoq7fRsbZ8jCwMeHc3WwM3HsrHPwQk5FfQRPLlTkNsMausVpV28n-aYHevMXL4RI-8_IbuMgXVtJGY2aJ-9KhuEAV3O8Wr1Pcrc_2QF7GRQph0X3dVoQduPpiOqzclcKQqmWjKNx7LWMtUoAkKjMxLaMPkFGm0APFqaDyNomQp4Xtzw9r3PW88PSrne4LMGDYY","iv":"O5M7KXZc2lUSaMXz","tag":"z0BQpTdE94FETudknErpLQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBV0hfSFd2SDNXanIwOGx5OG5MRzlpUXlwb1JsVDNZS2JBc1h0YXdKcE5UYlhjVWJKOWpmYXlieWVRYzJmeWJYUEhCNF9CVnBodU1nQTBzSFBrandESFd6IiwieSI6IkFBSDJhaTZJdkdNYXRNTFZNa1RMSlplQTJuZC1rZm5Ydk93Yi10Q0pwMzRsVGozdlZYVmhMZWNqRTM5M2NrYTczWGQwYXh0VWpqdFRiR1ZacmJ6dkswd1YifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}'], - ['input' => '{"ciphertext":"Va0dxUmDCHgUIILlr7ynQgIx7sejkmPc4C5KtTBx8mSPsOh0RHKuSpG_Kl0_T4xG7_kB6V1L0sr_3GZ1VQyOk55gzt5VuhJbaJGur8le_0tzxzxdunUPut2Dg28qCk4x0EIftxaqRojhne5okleBx9AJdbeAALVpiPnNU5AmThU3648Go9LnrcPDUS__pNxI7Jmoo3o6CtW8nCy-EZI-bBi9nx2sr1E","iv":"T_Wkl0uQ6EILdiGo","tag":"niqwhxpUw5T8nqXIIvkwag","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVU5tRDJFbDZ6X3B6aFNhTE5qcDVuNUJtNDJDSDl0b0JiTmFCWko3eHJCUm15bFlWUmpfcHU4VVlfeTlsQ0Q5U19wWDFlRllwLTFaY1NYc09XSjBWM2FPIiwieSI6IkFSeDh5WkNmTHgxN2U0ZHAydS1mNmJ0eXg2eFZkY1l1Y0o5a1R6YU5RRGpEZ3NDNFc4cGN4UmlQeUduWnN2bHNSeG5aNXRLb3VSUldqWXpQaEZ1WnJ3TFMifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}'], - ['input' => '{"ciphertext":"lpybkrid_-PJmz9mbc7tN0ILbiN7O_5p69Py8v7zdZ7eWsMpARzVsZDh4cS3Pr6PEo644h9cdonDZT3X-E5C_pLiquR44wti9djlZkz_DVuC8V2owUuY7J3KtNsJ0wgAzw4IKB52XAvZ_k8B8DkO_HizPh9GOlLvfiq0JZavLxUlDUa4liMM87d4Ab09A9syExrb2AF73f2h9Fh6t5zaoEut5qiwLKapaRNg_qm5zy4","iv":"Jf-mYDmKK3ted8lok_GIGw","tag":"DT90e1pDUOnMevNQA1CMDA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkRpMmFYalpMTDBvb2lJSW9uODVsOVh4WmJRQ2FHbVdLVlU4azJIeXRYR00ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}'], - ['input' => '{"ciphertext":"XMtu-ILvqQAw34cvWxFAjcla3BPp_b_V6I_4WG-htpcMpwgu-gG-LVrb_82b8PF52DhH6Ddb6LTXvgLo61Fmu3NnE9JKuxK9x3rKS1FwMaRjfLOHQxDjWfvc6sBhtCkXptcyb6PGu7Cf_Gqefc6EUtuv1mg8oFRcHHyh3oKwodfejhKv498BBOapYpMbShvJ_vFm_-POK166Ar6lXkT2J2v_hcLgvEqdg9cblhbq6fY","iv":"0-53nsstdwvjKg-2AiQ39w","tag":"5B6nXRG3VcnQ77uooFvuu6hbKkYW7buD","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlBqTXhyNHpfcWp3NXJjQmFWMTBlS1MtWWJFLTBVQWVrYjNDWkpfOVptbncifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}'], - ['input' => '{"ciphertext":"frDISfZ73cpq6Dr3fZrV30NFvVhpIg4BqW6sBHiGqKi69vsLyXKGvtrl1VHK27_6PO3xmApdLPfHITEFuwmyggOX4_bSVgArkWgpgXlUJzwbDgbCsJKf7FuVXK5O1wy4_I_JYSiO0J1YUONjUrt6Ex343Ibq3vDB2KiHeemoGRKLhoM6ejdyY_YPeHKr7fOopYviZGPPh2bt8dEXe8lNpAJVDh8cgGIkVvDrmjzDk6I","iv":"xzKxcIuy56ORbMN21dVk2g","tag":"Y_OPobOVDz_lIwDoMqsXcosVQFCvCfMSmWCpY3W7nN8","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Il96QzJ3QTUyYmZtTFllTUlObUc0NWVYRkJhWndpV3c2bWk1dm05NmM3WHcifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}'], - ['input' => '{"ciphertext":"_5muNolwL4qVUB_a2Sc5jxJXDyLOoiXUWKGshvhtK9pnEEvlHKUirPuFV5hAd4x8nw4zt3vrh7ELEUBeMQ_z252svnMVrStFWg7Bg5qbI6h63IEM4o9XlnyXcwoYcm967H-3-UZ8j66Y2R9ztc2pRR2zs2pO0pNhJP78VjWL6j2tyRu3Qr3Ifxf3Y69tzDCZXzUs6y1KEsmay4X75OrUZbFrs7Kbg6Q","iv":"Ifn2b8VX6mfBEdmd","tag":"N60_66GG2jMw9NBYHIGaGw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IldVeHQwUGFUMmkzalp2Vkx2MHNac2ZOYkg1cnpPVGFnYmU3V2JpV0Z6bGMifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}'], - ['input' => '{"ciphertext":"IUmY2ePgZiNynhrTxcNbDJtNBL59UEJ2ocggcuXrLF0ucFNORX0CVOO1GN28Ymre9C8SRQkMB1fLel7i33Zi03QT_znEguRo0Ytx2QpCWItxjqzbCuOd9506xSQjA09-ydriciNFHgbnxFMm91W-5ETNg-gNMCNBLg2fYNVjUFLXPSUe-yfcGViFTUcCJzPwnw60GhOTbxI5VkQPZicZM_u_hTVOWhk","iv":"YqKvjace4bjVQjjc","tag":"uhBYYEQ3SuIAFMzjhmT7Mg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6ImZya2RpdmdKZUFacHB5MGdSME9lcjM4ZXZ3TDVjbENmaXJxRXFDcFR5VFUifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}'], - ['input' => '{"ciphertext":"QbcGBRt2ARS1K3k4A1mktK4ks4WYuoga06gHjGMvEIesam5sFMOS8bqgSI4rOa_a_TLkSNCHlSOXFy2gs_zaXg3YEgwTWNdtH1B47D3Wc8DRTygbwdTAsnGMB1aVnvj2qb2OvSRCk4uMg-oD8WvFkTgp0iyxYw97IKyhH8FU6PjzKwiYGAUTCNcia6iyAzTFStlicyH7VvhLzXInS49X4EzlptNjtS0","iv":"O3HOMyDYmyFi9-L1","tag":"dODnhRWtPxEBE_PtBZrENg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IndsYnVwRzJuaUpxOTR2U0pCaWt5RXl5NXoyRzNhcDhBWHJjWVdOdFgxZ28ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}'], - ['input' => '{"ciphertext":"ACg_nLboBecsud2uTRPZE9lhnGFXdNwdWzykX50dXKU2UBc68T1XSS_YsqGH_XuEKheWa-gwgMxbLsvBpbnelkm84UiavaefBlKGDjTZZZfzJmEE0UdWzSsfJ6DZQ66qk-denN-K_Va46Om7Pkv5Z2CNpIF7miAHeCCHnF2z4O7D6IRrw5pQUUnvHzrUz72lKPZDYj8JlOYENjFblP32cKl011ve1Cwk-pgAhoJ0FBE","iv":"aF28SnQOmrc-gEdIlTewWw","tag":"wTECGcrV42tlC7RON78stg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ4MEJvVHhfXzJITnhRQVd2UDNBa1A5TDRFeHA1ZlJzdy10RjlfdEZMTk5RIiwieSI6IlNDREpNYXlJRlBrdW5URkIzV1FvQWZYbEc5MFN2ZkUxN1U4TkxMWTFib2sifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}'], - ['input' => '{"ciphertext":"wzktIqgfTWJk5-6h9pt9_djnVmt9XL4Zf1kX84xg14_EmES9peZgu1dBq0omUfTP10QgXPPvHEwhzJn6tcLPEpmgvH4UenDvPul6ZoQemLxQKojERrJROD9FTRITKCKe1K0jrRAkKXlzeYs0et6Ju_rHtUHq3I97hmT6mQkwkeJFXQ-qkBaItRLVbXBq5Ph3TTYjDubOBoCHWAKZ-pPiJ-4f6Whx7fDDVsV_hXdooJc","iv":"bDZvQ89OmNYHEREWyBYPZw","tag":"k5NO-VRlL8MaijOD_C8jHSB9dq_0L3Wk","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJrdkNVbHF5aGY1YTM1N3YyN1ZwV1l3Y1RsdTdvLUtQUEt0QXBQN0ZLc0wwIiwieSI6IkxwdDlRalZwcW9JUEJzUFJQY1VCb0o0OFExR050cXg5QWxRM0ZoZHhIMGsifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}'], - ['input' => '{"ciphertext":"d1au1N8eU8qMQ4D93HYnb5-cFtqyIdrJXV2OdaJCcA65s2g2rEM1k261lnnbJ-C_OgK60oQQxTc70d_YOXZOMsBDmraDmpjr2AODtwohSSe9e35QpyD0S2TT-FL64CiSk0TodtitlQ00UTCs0vHSDy7gesHvwG5cmiXKBr0_2ybW2LnOwpJZZpZGTIX5cuocfVVecoN_cS5G6RIVTEsT6YS0WAnVUAiWsifdvuJp1tg","iv":"XloO4Wm_70slo5FVj-lHUQ","tag":"LBuBOaorE7-XSFf0ed-s7cugHaNbtrsOmFCXa8lsZLM","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJvSmZobld0SjRGOGxCUENic1p5cGRWbjZUZERxUEZZX2dlWXdpQmxLZlRBIiwieSI6IjB5ckFhRXlnQkNhYW80bE51eEgtVUtXZUJuODVNNmEyTXdsTnhJQVpleEkifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}'], - ['input' => '{"ciphertext":"vnoovMxbZ_Ie878pnkzg1MftrJOyKxlj53qwxtCdUduyQVx1IYZTcpmC3bqqLm3Tm4A1VPi3U1uFp8X_tHUNW_AkIlCQvtlISjUmlq2VZqvQodynYzcLE_bEf49b0gky39Jk-U7uq51pZdkCn_Dnm-2k8xQKtnrkISsl96JjTw69D_pGBR0DdQFcEfJO1HpUsUQlOOX8fsdW2DURmNsvEAtSBn0faCg","iv":"NstpkansL9xPOrad","tag":"cXTsEsWSV2Ipy1EGVzfcow","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ1V2NLajVDdl9vdzZZTWlMdVlfLUNWMFJxeGhSZDdLQ3FWMC1LNmtwYlk0IiwieSI6IlItMlF0U1FxUWpSOEpYT0NYa1hkSnROM0VycHpDNjJEbVhoREl3b3dkWXMifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}'], - ['input' => '{"ciphertext":"FR74oS4SHGmbgi2qb-DNgQ5i37g2JZlVy47AR40MoGfoVGgrcL0i_7sDlWBeC8RWCVCkBMBNUR7-fkp8rwNvwC9DN1E8GoiFVtmi5D-wYXVwMksx8oeFGT0FeDRKHDa2ZDUzcVttDSmU0xiYi_2wjkW6q1CozlZGB_1Mu9xEogd3e749LJx4FNm22EGI7JM4ioyKCxNQfBDMxt6XXFqtEaQFIUY4Y2g","iv":"KAJVHEqL0ZafC7Nf","tag":"_XkJWzjIqfW3AVlvl7fHww","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ3d3RUUXN6MlFMX2t3aURIMkRVMXhzQ09lT19haFlvZU41NFhZa0xibXlvIiwieSI6Ik5CZ0RFV2syZTJlaGNramZXVnl5V3hCYy1fVk9zWVpadHJlZlhibTZGU1kifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}'], - ['input' => '{"ciphertext":"1gjDAJA1A9K3IJ_nQZiZCND1kP94iTELtYwti-qX893MS7ggBYrlrCNqotCvwKgmn_CMRcWd9y04U2IMQnL-R2juVIkEC3vZvfOH9c_UTLxjKN-CPyRj9frk7uP2EyQWNet9rjPsMoO25cmorlwtSwusQ5AIuZRXhRjtE26W1O1wbBK5CBg0ybf4B37N50beFRo_DzcBiUQsvJJLJyo_ehDVxgjW4gg","iv":"h5m9rU_ULBMdfb45","tag":"LgYeq5xlP3TMXMG5PduO6A","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ6TlhNU0RIdktSdmRkNzRvdHFHRzRwU1RPV09MR1RkVWlESTY1bXJWcHkwIiwieSI6InNCaTJSbXdHQmhjTC1IaS1PZVF1WWFCYndYLTlTaDV4ZXhGM2htaEtWbGMifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}'], - ['input' => '{"ciphertext":"IxQQfxuR1TZ6ntuADjsnvtgZTL3yIHobBImiIhM2OXkh0yoM1MZXwSC_c1UlJdf6cGdacPIgmcJlsZdAbsi7WzZ5JxZQOL-pjAeab5t_L_4e2Lqtu10l812w_yXQ-szKc2meyj3o928lg9AwyNi48GVXCCGAuGZUBfAbXCp0ORC9UP4Q0pVIAo7XhWCVvxk8Vl2XR7kPVofEwr2mvMJ8OoCAmYAIKfnw3AfkkIzyLCw","iv":"r9WX61qWE40c5oqAu9b7Sg","tag":"vo65keQh_Q_ID8O4y0zINQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJiRGlIR0JRMmNmWGQzTm5ua1ZQcVdtYXpHUHJVcWwzVGRMYXNDcDJVQUhwMXVlUWtxU2xpdjhSUnIxQ0U3SjZBIiwieSI6IlBzU0p2ekJCRDRPUU1qLWFXMHZaalBySFlwU1NhYnZMWGtaUmxZSXA4Mm11cTFZaUg0OE1ha3MwTXNvSnk5UGEifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}'], - ['input' => '{"ciphertext":"m50AsW6xfm1_u5fGHbPRg6Im8bpWA-uNjl6sek90seFgGuV21HQssW4n6ksAFH-1CGloNngHxQUAO6nYgAPuGJpGJyYARLEjIZhP6RYcW2wk8TVK-8MHQ3o07Uhui_jb6vVvwX8NHWNlZQDupeEfS19GEzE6s---C4IA_U8BP9Vd_UVjgtE9TyOCPntIuUr0frJTDAEffesDvPQEgtUNtMr4M-uhb0G0M7BkaIvgSJU","iv":"C4923TvD5M_TIie45JPBHA","tag":"HoMhtMrjJ5GDsMLGjo_WUryqilRnRsLA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJNbEZVdWVEWmYxZlFma2I0ZFUwdFQ0eGlOdHVlbDAtQ1htdVE5VktOVjh1S3NaS19ORmFuRjlSODYwYUptS3dGIiwieSI6IlNMRUZCX0FnMjhhWWRwaUJ4SlU4NzBYaVRkXy1DeURRNTVZTWluZWhBd2FpNGJNWFlqMUdHMmd5ai1EQ0h6TFYifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}'], - ['input' => '{"ciphertext":"_7FRQBjsuN4kY2iOBO4ObmO5AlMoCzSsNXPJsdryxgjTpPLR84xN2oYoU4g_oPAssTFzUJh8yXp-Fx-AH0mnf5lVP_NIexF_NHLrFar35F9d94PJBkwiv7CtNefXeuO_XsMjZn7TWB0Qhw_oX52JWVsybS23M3zSM8iSVrYCDUgLdivrc4x5-BCMBgUmHz_Efee-iFjnPRUGPg-oqwYZ9RzmVdMjV9-zbyfWGs9T2bM","iv":"gCKV_Z0VgExxHOfkxNJ5dg","tag":"ALFmpaym_S7k4eGPfUpJGm9GG-JbH_N9xOd_JJ_RpRk","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiItakhrN2FtbTI5OXExdHd1UVJaS0JnbWU1Ny1Td2lJdjVQZWNta2VHOWVNMi0wb0NkWExHWDRXUnFLQUttNXQxIiwieSI6IlNkeXl4MWVjZThpY01FT0pNZ2ljMjhrMWdzUjkzQmJJa281UFptSFN0ajRqbHZPYVFZYlJNVm9vSFotYVA4M1MifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}'], - ['input' => '{"ciphertext":"eajyqCw1RJ8ev7RuWyhaqaRIJg72QibdSryd36CMxhhOUB2fIzGX9gZ8hHp_D7Pd7tRHFGt4ydavddqGaaCBjaMizHFdcZxMJQ6t_57BFFTTn3t_Vh08HVyE5caBariXMKb-0YGBwh8shLrBHEYTYE_LMbEJI-sBWePbtCbXb6n8ObzI7hVNq5Brq7ZmKBrGVZGPp1w64bJzGNPol9IRY_sBekHMmcw","iv":"-4w0zo1ACWTWK_lw","tag":"OPBIsx9UaSjxE2mrPlb88g","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJ6T1NOcE1EOE9aMkR3YWVFamFDTFFCNXZ5NlFWaklGYmNmbE0wOXMwRmZqRlduQUpwNFk3ckVPWl9CYkszVlAzIiwieSI6Ii03SEt0Um5kNlN5LVd6c01KVHBNSzltSU5adFVSSE82dmZKV1N5MWR0NWdPWWVqZmxKLXgxcWE1dE13SUVER2EifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}'], - ['input' => '{"ciphertext":"SRBspbq8aCKsLjyb4ZwkU7bNf5387pvKDJt95MonIP2IVsI_yLQyn9RC0cOe_INnF9kfaE2nPyjYX7d4D4i70kdxOkmWK9UBWMyXUOHuyolWPJ8zooTbV6TgN-of21Xty_S2d_fxpQmrpwrrNfTFW2NRxiiRZeeIUVzuQD5CVqMEut1H0WgRGbUsKKMFEAhSMSfY3sGeZGsbAfRjneGJrEiA6A9FZWw","iv":"KgtjGk7lEaJVhvXe","tag":"1TtHcxNEG1Ie12vHEHxikw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiIzLVJ2QmdsQWhta211QjNaNUk0NHMxQ0stY25hX1YzaUFlWlgwUVhBZWoxVF9XN2Y5RDFsNXZMcmlJUWJTMl9KIiwieSI6InhJRTJORHQzNW1VN0QyVzhQUHA5SHlrVVJRWnN2NEJOVHBCamRidVZ5TzJWYWxjdlFmQkg0ZjJla2hQb3hvRW4ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}'], - ['input' => '{"ciphertext":"uRubb-NLklXJ9LeTeT7SbOUBj8iWksOohM0EAbxFSP7U7Q--SSNzp4kJxjTDweT1njB7soMNEPPIKHe3Je7e6JofQVhG17SmNKOo3VKvDCYRB8B_Ky2o4y5ZKpm8RzgvnfWLXRMu6497m_jNaQifaiWCCVsTedJiBT8F71gE_HYCQ-0mpAnbNwGwrQHCbNjXf2xjUbHWROF2hVASIjHCon_vXQPb0BI","iv":"K2PUZUoPd4v5gajx","tag":"IP9kcdZ7PWVaIJwTYDub4g","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJOZndiVF9BcnVzRk1pNkdKWkFiR0dHQXlPZ2ZkQVNaaDg4RXNEMkJReEFKRy1xOGFEcHAtc1NOYTViRy1kMDhBIiwieSI6Imwzei11b1daUzhzT1Y3SHZiVkZwTDF5VnhPY0duYkhiWEMyVlBHUVV6aV82VEpPLXdYT0dKcHlPaFJTVmdfSmYifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}'], - ['input' => '{"ciphertext":"evFbDMHEqVePkdpNlexRjAyX5mf0RCjYH2SfEI5BrW1Qz09z5T8OvsQDdy2UDvoDKnJQXZNAyEicA-N1QMjsAeMD6xRZ7WcPb4jbGWsnk5Da2xYdVvKOlqa35D7s2eQsmxFI8nzPydT0V9I-M6J-sljp6kIbQYhkRzlF-1Yj3P0pD6ExNOEJiqqneei0CpxiUMDo_mH3Yqxv4aLevfhOLSGfL_RNlA41wvL7pqvmpnU","iv":"0gChfHukWucTP9jDU2sOHA","tag":"jytdfKao99CTm-QxlgUADg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVHNOSWdJNFgzLVk2dXNBT2tRTHhjemtTX2k5amtWQnhiRHBmQlVzMEl1QjJpR1BwNWZkUFl5RHh4Y0QxMHhXdXZpVFF4TW1GODExS2NTaXNlUVlGX2dWIiwieSI6IkFHT1ltc0ZRY0UwOVFZYTZxQWFNbVh4bS1BRGMwcTVPSHk0aUdnNUppVTZ6UHRrQUFyQlVoaGNvR2pfUm85OUloTEJqbEVtc0J3amtsUzZPLWdaYkk4X3AifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}'], - ['input' => '{"ciphertext":"sQGLMdFoGIU6hBqLqd5mScIvv7JL5YOVX_a2fPdk1nSMhT6Qzp16Gfc_hCUAUCjrhgMOXYt6ENH0efgCR9WTOp6OI2PUJY-cF425yW7w2uQ7cng86FzqEr6gx0JOhSMED3BJ2lwUNJ1hX3XyZi9zm7SeMYxibbEtrioFzvr5QriESsSw9O46_pJg_JmrUywJECJtmGhve-4xjhbX3J3WfFvQIB69S8t5N9FynjZ_Cx8","iv":"E3J-49EPWe3yG_S5uXXDpA","tag":"wO0cMmpjutiE5QMvJl-jj-GqGld0otfg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBV0JWR05GdzBYR1RaVEhyYlpTNFJrOTZlLW52M25WVTdzLWwxY1lJeXJmVi1sZXpvc2h6bF9SN1M3ejg5ajhxWVFhY25kOGN0V3F1d2F4aW1zZHlBYzRyIiwieSI6IkFFRzcxWWVweWMwZlNtZVo2VGxGaTNENUVnMVBYdWg5SnZ5ZXJVOEVZMkt3Wkx4Y25ydG1rQng1ZllRNlVkcGRTbDJESjkwNFhnMWhoMVRPY2tSTTFhV1MifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}'], - ['input' => '{"ciphertext":"SQBbU-lyu_CtmFf7pHYukUfAEo8T-ck2WslHQ62APpJ480LuM9yZwzPlwTHG1uvQextL4cbFj9vvyLMeh3wYLj5AEhUHEVrpdvtlRi1rbEFqQiZUEooEPN2qJoxH2mWtn8nh2DjsuWpod8UDee-8hOrW3xc-qHcZvcSrmehZmpVWbBLEiylEAineyRPYYwTMvlLA3PcHqXARPO-41K8xUzrrXJI7xBiNLmOQlYA1z6s","iv":"jw_8tRsVnCFVKGS9IIzG4g","tag":"OcFTJXfkTicHumLC50Gmb63D8nDqwanhIOxH6fMLKNc","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBT1hpa3dFRTZ6Q3JBaEc1aU9tLXV6c0hmZjBHTnhxOXdWVTFFbWtobEh1OG04Zm5wRTlRS2hfdEc1cHhRMkR2N0ZCemFkR3RzajJESXlzT0wyMUdKNXNYIiwieSI6IkFhd0FZcjV0UzVLQ2NfSXJfLS1qN3ZjeDRFVzJpeTVRWVV1b1FQUlJvRmpGREFqT0twX3ZaLWhYTnFHbnlqREQ1VnV1QzlrdDNPVUJjVHNZeTVfallESkgifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}'], - ['input' => '{"ciphertext":"MReNRX6Nce0_UQYaLxDa4AR2b-db9_FMVUXD73qAvENn-oXx4jJog4X76oVfl1-nqta5RBWg5mCT04TMRG7QtGxCEgpsS0w5ELKTJughVn9XHuPx3XXrjgSbiZZgYr69wx2hS7qnxTgdmVH1xo1Cpp-SH_9aE5CT9PwROcJOYkg5GhUTkKmDHXb1jdPMlrUzLxTaVl9Ric-YpGxcNy84Llgm6JA2FhA","iv":"uTLsVACz4yoGmTC3","tag":"igbfFg0uysWev5Uk5qm5lw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBT0luVjk4a2tjUW9sTUVWTk5wQlhQUkUzdXkyZm00ZzZKU1RKMnJYSFpYMnlac0lic2lqLU1tNEpXNVlJeUpJY3kzRTdheFFuRENpeDZUMEpKdGhWMXNIIiwieSI6IkFDVFJaTkNxYllSeTgySTR2b1pubktVVV8yTEdyVXNUZjVIOGxCTDdSZ1NfNVJ0UEFqU3RQSjRraU41QUtneWkteDB3VXBEX2JXUllKa096SmdFeHB5clkifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}'], - ['input' => '{"ciphertext":"JrZd5PNga94b7YDyXyqNOrcPhEr2zEKyjC4e-iqdqcJw2zgjK_7zzw3e-MBVJ5JWRh8iepeveux8sMbZJoXB9v8R_72ykjadHXhXgwliPqcFA4wDg1NKGG99ZKnvPydlg2_0SAqxvX8C0aJVG25x4CdU2D2k4AWISgJMU1sgEk3buMGG3UuIYqwtOv6uhGsY0OMxMy4D-_02mR4V9NZDTHql9kXYESQ","iv":"b2W4yc1XDBs56hDP","tag":"VJD86DkO8ZEMsP4Xp3MJ-g","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVmYxc1NWekVsZzNkNVJvMVJDdzI2by1hdi1kRjVVdENwQXJiMlJfVkRjZ1hCbWthakdOdTZnLXBDTHlBS04tVkc3dWJKNzd1WWxjSnNaS0tYa2l3aGhmIiwieSI6IkFLc1pheGQzOU92N3VMT1drU2tzYjZnRTY4c3NMRGpTekt1NGVhaWlZYUlpelhXNGFxUEM3TWl1LXg0bzcxOTlUV3J4MU10b2pRQ05SelZBcVJkTmhDT2IifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}'], - ['input' => '{"ciphertext":"QLLxRxkzsJIaVXT5fjX8Nq0qsXOB4hRcxu-91dDvVji3nruAlMYEeHEZOZIUqq0Y1AaJRJQmN2kDZL2mmdRuRcpzvHXI4pbwlLnZLtIqnAA77lEVMHXzWPYHvQ0kHWtnkr0-6Iq0TvVduJOZQUaTDhjWy7wIDN-bsZV6XIjcNRMgI7df6L3h5D5CrKR2DIPEiFKg-Ijl3lwcvgV7q1tMySQmiV5xRTw","iv":"vnVi5xfl5HFCclqT","tag":"eqT0exOdsEPeULmdG-wklw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBSzEtYk9DSVoxV2JFaFE0ODR2THRzLWliTGdNOU43eG0yUTBnLVpxMWkzcjhXdF8tdTZBenRCMzNWMjhRVjh0MGJ3TmZYZUE4cVZjZnJSR1hGNXZSeHRLIiwieSI6IkFQcFk0V3M0Y01UQU5GNURiTzRZN0QtSDZ0UjVOWnQ4aGR2bWsza1dHYlJKeXNpdkE4ZVk3aFFlV3BmbVdQQm9IQ0FUYTdUQmRhcHlqQS1VZ1lIMWRRVEcifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}'], - ['input' => '{"ciphertext":"cy6eI7vOAEC1PXvkVQcea1rl73JB_Se3busbGZ4PUy7VPVeIzYFcdHbe9qzqE2xwNigmja79m3DaduWyD5GDrywm0kUG3FVnNF5FkKsKzKBpdX5ubEDfXisfh4CGIu6ncESr7llGX5d4rCHd6If7NBvE9dsmonnOr28D6LpsrGFHS1vTs1mZW0IJ9ZIJJODO6l4nnTtpW4qw6WhIs5ZHVrTf18QtRdV0Zn2dqIlbjw4","iv":"JfjmVUk0rt5wgjxtJG9dcQ","tag":"dWe9-40TN3xItxfaVDJOvA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlFORWtJZmtMamozVjhxV1l6VFBob3c2T3dRY0JSb3RVb0RiX0RvTDYtVzQifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}'], - ['input' => '{"ciphertext":"o1AEWAYqwcfcK9gdrK9BJMc1-3sbbQsfmNbDRiFYPLM-ikkbhkkwvR5Jj-E_qwKhvix6D4nK6NMvO8h0Rjjg4taj1EPtvBOA-Ppl_tI023O-VOlOBVaaiPNTuRjeHdWnFnbZ2NOf7r9SUaXnKQlhboBqmzAlV_9iId04A2U52jV9YCe-QRC4PMiwiB7QaLOIWAp3pZDg_cdVqIOFegrHiZx2gcwhPTdCRl6xjF86YTQ","iv":"sgrJT1GnLW6GPZxQ2sE4fA","tag":"M4WVnIMxLAK3oVaqsVKZ4KqvgGObGAw9","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlJYWFZQNHoyS2RjR1Zfb1Nrc0c5emdKQVhLWlJTR1ZfSWl2NDZHRklDaG8ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}'], - ['input' => '{"ciphertext":"1b0hOYd2iw-p6_BEkP6bwkc-ghNzU-8c0oz9Lk9-ksIKn3_uO3jaiCSPpgzrIWdtwM2shJuiS2awtVsVqqap2kUBI_mLxMUkNu8vIdLVMDOG4JnGu8xQekzOyEJnh3t8iJqukVeHXBOHSahuOSJm1wT9I7c94qziBxWcBfUTnPhk2erZID51iUcgXXT6ccnX3bVhGh7MRAh7Ayub9N7vhIlET_drNv1-nDytpP1VHI8","iv":"XfKwJSAkFOMfbhIzok1ViQ","tag":"b_kD9-BadXRR7VVlArO2NbJ57JDk5q69d-6V9izO8pU","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6ImdLSHp0UW1IdzgwcE05MkhjMkxZVUtzN2RGU2hEWWtBRkhWZ21nU3JReE0ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}'], - ['input' => '{"ciphertext":"XR-qBJ6l7-VNRgTzLsVkniRY7oDNd0r_ooUofbMqNDSXTHqcSQWhBayA88gfRybwITBuM2TcOClRQ1LPiGW8PceWgu-kXzRU3U0oUkhgwRdk19ZMbtBHkg-g8GX3VEr4rawUri4ofCFBL7dV9WshLolOY6R_L4IGXSGhpH7HPTht4It773TfAo2LPTFllfN0NYcRJD180VSAYtTEpK-BiwneRhHd6O0","iv":"T8_T58NnIjrQ3v0B","tag":"Xg2J1jQNHlpVGow6NWEopQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6InI1TXJlSmlFNDdLSkcydGdzTWI0LUkzajgtS3lLbzNMU3E3SHM0aFoyakEifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}'], - ['input' => '{"ciphertext":"fkavWJbNKcmu6HkbHjOyjAEylDh2EyLcJSLry-bHi8t2g31UZimNTW7aKPgGVN97T3_jJkOpSdOYoRWs9nparpNce0Fqd79LaGgB0a_XOeRZNRzkfXZkTr71r-o7XRC2xTNHdqMQEd8mWXeFmsZD9I_ZTjyF6FCW_ljWtccJ1VBPe4bvTdnuHCFNzHLcp334LJTxuc0sgwlTb4Mby8acJkS4LNt1S8o","iv":"-eYt0kU6UUhUZccg","tag":"P-PGnb40IoWdhX2VluueSw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlVnLWlGcWdpWHJ4VmlCWGxaUEN6UXVydWR2T2U2LW1UaHd6YzJJVlZyMzQifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}'], - ['input' => '{"ciphertext":"u42pqwl2jiwX6oRjilAdTjlE8-0I6WXXi5DxjdT3NjAG1F6tFhn0WHDRZZVmzLfA5JKciwW7_GhBFL8EqWksLDu84PWATcsJwS2PEp3P3B9QGkqgoNoRstExXpYHHpPoFsgBhyO7mxGJ-0RWdKLPf9Ck2Z6Hn8JoSVLbIa28FGTNj46rhYg5Aep8BxYJf9csTRfPQQ33ZgupifET9oamSF32HVq6gO4","iv":"0cIuo8Jv_Vv0kyiV","tag":"8lebqo_Vzy8Xf8OPiuNNVA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6ImpMR09HTUl6QmtRVzkxWElSV0VtM1pyV25WOEpqRExlZjFsRVBvRTBNa1kifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}'], + [ + 'input' => '{"ciphertext":"KsRIKGTIm8Zf_AgLI5D1ymISA63OIamKsYk1VB7xsw4j2mwDuKR9MA1mhUbc-Ps_s7VIOzK0qaKwPhdEjDcIb-Vut2yQ0E_HxpFyjNr5T-RbbJ1kdy1hXK3THo-Fcdrw2i3SoLYKi7pTh06CmYyv42iePtr1tq2t68MiUeRI9ZElD4Maf4ONcPWsG9QwmQzzui8kGdEJ58IzpAaqLzXAzYsj6K6Dd6rFHA9Gdd8lCtA","iv":"Ssta2D7cbN7ohhZ_IEirGQ","tag":"FOYasMqq5L_D7McwEcFbUg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiItT3czODhtbDc0dEhkbDd6TDFwbENoTFFyVHdyOWRNRnN0VmlUUFFEWGJBIiwieSI6IjJSSmlpMF9xVmJxZGhtV3dWbUhzUDN6X2hFeFpRNUZJaElGWEg3d2hXRFkifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}', + ], + [ + 'input' => '{"ciphertext":"AbyYGNhmhfPp1losLrlcwLupvYHOpq_qUj3fCWYRGUwqE8z6G8ZKMC6kPaKfN7cepJIgxi6vP7Dxb_X-e0uJlD8mofiramMujc5w5gS91H_4LDfjA0hPsQNZsevvQ6H9Wb6KQfEH_ADw3Qo2lq-C9gjZdtpvOosvoph8D3E6jA9-DdC3Q1X0vSHgTKKwUVOiCAGXVUxclSvSIwkai1jIEKQDdch2So4ZGg2jGM9Mu0Q","iv":"QNuVRp1d7frRChaUKCFwOw","tag":"8zf7asVXbIBlD5M5_tGvynUDYCHkxCks","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJNWDhyTWthUHVzcHlMem12RFJUMWFzSmE4ZGVSQWZ0eEF5WVVqWFJWOUtvIiwieSI6ImlsaHFZRnF3eGRqZGM5UWQwYUp6Y0N5U1Y4U054endpVFdqUE9QWEtJa2sifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}', + ], + [ + 'input' => '{"ciphertext":"UTHlayhPiU24oSypsNfRxpcbbCEJCrF3AtjNShs0LwflvY2m6CgwBLhKulw8HHtnDaxcLYjXutm5pXgzbgflwtHoAwh5WOwpnXkceAYm9vVUkRPwcRCeczvYy8__FSAzjJXRfFloy4E9cZtv8culFh5I-kbaEEs_E-3RQD3fvlbo3JLB4rrhccWjgM-qyF8eIHGFhAWa2Ez87dXCde9d8dvnn6StnfV4u-lTleOe5wE","iv":"6AnITEM_hi0oTJSI1EroVQ","tag":"pgFbCS8Jchp1z0qrdIS2mgiheApFT3aG20iyFOXk7_U","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJzd0ktbThvY2tNZlg3MjhxQkRoRkJ6MjNta1JZS2xJSXd2S1ZObmdZYmpnIiwieSI6IjNIb05TWHZ0QkdRX3pKTlE1ZmM3RVNqUmVhVFU1WF9pc0kxVzV2MG0zUG8ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}', + ], + [ + 'input' => '{"ciphertext":"j0e5K7z08DEb8rkYCdtQimnNlO5VJ8OCipL1LmBxDWJ3FIxq2yxunhbzqYr5OsbBu2nsi26enhgxdf9utxYcUMhXY1BV-VOSaFVZHkKowSCco0H95a6sNhJVVGaLHFE2dLUl-Ooxlc0g6tDJC-Lyi9cBFuJlm-KeDZwrhd25g2Dpk38DSFN5ZUujstiLq-gibsm97DB5FDZvhk-elgJ5sBsM-k8wz3s","iv":"KG2bIjAFOXMY2_A0","tag":"4lrGURacjerWUN_szorv5Q","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJTaUxhQ2cya0ZuRldoOHFvZTJoblM1UXhPQy1BbUY1X0I4UkVhSkZzZEVZIiwieSI6IjhEOXJPaXQwbjh4ZjcxekZsallXRnhjMVI2SjUySlpvNFNvaGNuNFNmUTQifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"EmExZLBtuOMeu436MGmVpPGL1Oxl0pE8viy88rlyll-K4o7rWViqqxms7V4UgPs2FnZgdL8CJ6W_NY2QlPQlzrANPc9oUinD_OjScH-0Ff6Lb-LskWlGNebqyyl74XStzGO7K67jCnc0oXoU36yfuZFcjf5t3RI1Wh0hL_RL22OxVIk3k_WkurIgA-F2WkXDVuxlRW-nWkoNoxpRceZgDQmBVD0cfb0","iv":"lk2StauExilwOfql","tag":"1fXcCfufql4eRHvfsvRoNA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJqRG8wN0t6TkRuUjJrVERDVEFFWWZpclpKR1h6V2EwcE00UFlUWjg5ZUlrIiwieSI6IlNIaUpFNGdDUzBvZG1sdTNrcTF0VXNFenFoQnNvOWxtaHZpREE2Y2xoMVEifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"m8LhdFezEohHDHP1MR8mY26PF2qP1Ay9KHfQGXeCGJmLwR2U_V50MFP9_ehlHq3QrMXlM6EpbGEaa7BSuiZg9bhNbVWAHx9_S-NmZ8NcimPuRAexc6303fNoIyIwMBkAHdHED4IbRMfzdsJg9v05aMTzv3SqW7dJezyTPN_rWuFpYDFlqPg-c5HK90OOY5BR_zW5OK5XAVz5bxsi21HW0Ti0yHBiCgg","iv":"X6u2KRH0g-OOH2M5","tag":"h_xvwqzXIu5HRJn5OTy6zQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJDZ25yYklpWmVXb00xUzJVRDdXcHVhRnNHeW50RzI2b1Y3Wm0tWHRRODVBIiwieSI6IkZiTkZLdEZDaDdoUTNyV2tfZWVTNnNiemUwQ01SZkNCbkdsOHBKbU5YMEEifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"DmmkxBraJ0QZj5ZWb2QA0XMopoqxLVOC3DI1DmDLkrFOlqu1kTZhvI0Hx9EcST1YbvZ0Z77s9SpvXlHNW36vWBOqZQxWpGysh1lazijSYjN28lw5wKkhqBDEu_6_K__S6I-EA6PI8cl2wdA3LOIauA9_0smfmVcA2Ka3umN1EayDMIaMuwU2B45zuJrhHDxVk_9mV51fmVq7-lKyyAeu5sVy3KTn9FLWxcnkrZ3ajog","iv":"eoG62aPTiTdhUg1ZCt_QUw","tag":"IrYMVE6U87oo_LsNr0nHDg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJBNDZpY3FwRjNYX2h3R3RRQndkOUw2d1NlajdiZGk0WnlRaVBsLVNlMllBS1BMT0kwbU9hQmw0SFZNNl9uMWJPIiwieSI6Im44cjZjSEpKOTF0SlFLLWhscnlGUlROQXo1SVNfbThkR05wVHcyd1lxMXVnRlVfc19nSGczUkJhTnFiblZ1c3MifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}', + ], + [ + 'input' => '{"ciphertext":"S81Z4p-qRKFcMNqQwG-pKd8dGhy1wuYG5tQN8FvEyW0A3R2d9jmChe71LEU7p4cdljlZPI19f7eVH6GvJ8drY-bcck5MobZuePcs2bCJVR4u2UGGQKiowbaeuquzErDKSq8p59yRCsEuIKfEHOUEQiLILs7dMUTFUgrv22vn6UVI781h3qOrSa74tGuwthTdSvaTgTE17Wfc3jj7BTgngY828updPsXEsDdSLs-qrMo","iv":"JJeemphZk_34coLYqxoyNQ","tag":"dq93EO-2TId_55J3GJ5gLAPKVEsHLJoI","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJMNU9EYmRQdmZmOU9RZWROYU5sVmtPUk94VlNCY01RUEtLN29PWnRZU3RZaXpFTi1sZzhNbTFSMHR5bmtZVWwxIiwieSI6IjhTYmc1WXJZbnljVzl1QVBZYndCYXNvTERnbXdFUk12Y0VnUHN6dmFPNTdIMUxLWF9hTmpnXzg3aGw5ZUNJcXkifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}', + ], + [ + 'input' => '{"ciphertext":"r-Fr1h9QP-jkTQr_72bTxMEfZeL7loJSfuam2ifuR6nxkfWLsmPFvtuTPlNW2qpddP3b2vVl-MUFjzj5KSkM9FeTMlDzcYhrdWnsnPzpnKlR_dmqnQqtpH1mudHLjzBxOylL3TAao4RRZGFWhPSgplqjR-bkxI0TgMLi3UIjI_8xaTOE7OLfw-xf5a99oegPzodcKw2J1_Hbcg8XWwTXkNHdpVdm-p_OfZXsABYRKe8","iv":"vjiEqMMHjngniUPvbgBWDw","tag":"_wcGyo5Kgwu6Bx4gQtIC2B37br443LevIA6sveBG7_k","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJzenExTmtBN3MtanpfN3BmTENXMzgtR3hxcmRCc2drUHNVX0pheFBmanpwTmdoYkFCcGIxYzVJd0NDTG80VHRqIiwieSI6IlVxRlNtb2RDa3EtV1pqZzYxLXplQ21vMF9mb0tnQXItVzgzRlhYQWpONG9mQi1UUmt1d25HbFlVM3hEN2x6VGwifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}', + ], + [ + 'input' => '{"ciphertext":"YaBX6UK6DiJHZEx0VcHIiiLIIsgotyKhBpcXzKc5mGx-adCb29Fvz1mHz6NEaR-MGs_Lbyr1_Iz63fAgH4MHbeLVhLNR986suo9t6kIXghe6jBHFuzwubEW41w3HwFXTGTQAdAP1VdDzrNp3YiwTO9sxugGNaO7QcxUCoogT60a3sNc1bMe16Hf3adrj58eWYZccnpTRnNWULfiu_fb_e_0vDfKjtek","iv":"ExgS-jAeC0B8cFoe","tag":"eD6oYHjnAgbQivjazEpR_w","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiI1VHVGcE9GaUtWb0czdWRKd3ZVM1JfM01OSVdhdWxJZm44ekg2a3l4MEhscWE2QktISjFxWHlVNlVlWm5hdzVtIiwieSI6IjJTX0tfYkttN0xtdHI5MG14V1YxNHNTaW1Nczh5WUtDdWNqZnZpZmc2Q1UybjBMMTQ5cG5aamx1MEdBSnM5akUifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"tsFjmeszfXnah0CPF2_2xAWHD_P8isIhVShnJ1AQ15IR4aTXB37l5nIo4kVXCLaNgR4N-CjR6pumn7NLNFzfgqQpbQeXFx8dqCMkbDlQBMAuPeu4AoxhVGaDqRsHM_k2H51WVayAjkFpgrItc6XEjIu2y4o8Hy0-_hD6c3-lK22U6ZRLg-10Cq-pDN1Nq6ZRxTZx3mvzWeRIrko8t-k9p4yKcJVmOpk","iv":"wD7u4GcP0EjHR_mm","tag":"I8g2nTz3UaLDqrLWsuN4pQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJ2V0dQOGJRRDVwdTZHTkxYWkpCNnlfN3hzQ1J0TjZCeDdDRU1DR1lRRWxuQTZUYjFXOUkzRklyak40eDFLZ3c4IiwieSI6ImVodWExdE05bzF5OHhXS3ljUU1sby0waVctell1bVBUYmxPbUlZaWxKVkVadDVpbGg4VU9FTDNZZjRrU1RxTFYifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"ZT1Nli-gjvAtYCmEWyMsuQ792N6Shse-YVEcKBdg5iJzK5Xjpt8ZfhGnLoeBcpYZIiFxmNbXvwJLnRrtzl_Yvt5KYVu4XAQY5CyMUfJi5i35j3SY0C9PT-TymiwOj_8fLmmookDbQpgWeQs3RcHCUCR3OpjSrlR3Xf3nVzhFMaC4MYOoS1TTL6Cq0bSxPRE74i_lvL6cR9sBgPIIUvW5I4EkmzgCokk","iv":"Pw4u5IW-j6TCPEpP","tag":"kndBhMtDYRX4rEp01ndQFQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJkZUJOazd4ZUN0R1ZtUk1RSDJSVUw2Q2twNXFCWS1OU2Q3Tjd0TjNPbmwzRGMwaXJvMm1faGVqUG1KUGJyYkNkIiwieSI6Iks2S0RRMklwMENubTcwaGxkSnRMM2t5R0wzdGgtUjFYOTdQNVFVS3VnWlkwMnZ2QUpvbGE4Q1FZQ1AtTHlEYUUifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"VP3msKx3uJKdWkeC6Cz5gM2thvDzSyGyccTgQbxHemaO6Egq8afzTnoj841yY5EczIRfBT9QsSlhu7nWFUY5i8RXHhIgAQHaBPv7sutT6_ISDRWdxgpd27tTMP5bzsPsAyX2jvtQx4gCvte1BI-RR19qCQRiRanq3JvbStpgYYRSzo5b4BhP5ik1WJy_b2_NK2mAXXtYo0WgBqjBDXm7t46euLxScMBhwRtuUWddGis","iv":"qfyMAIJhyeROiM_u5DBLHQ","tag":"CVs13nkHgx1IJ67NvcAYJw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBU3VpVEtOSzVsejZQcnBoWFlhNDdWcXZtT0RDbk84clRQUUU5aExkM19TRm5RQ2JoU1Rua3NYZktYb0RaZ2lTa3hqWkpXOGh4Q0VNVkFkWDlnUzl2M0x5IiwieSI6IkFPWXJEZ082VGFwQ2hzc0c4NFJEWXNGejVzT1NBR056MURsLWtHQnFSRVUwNkZYbkVkYUVxSF9vOXdkUkxmY01QZWxkaEpGR3ZnT0k1bGowU0p0OUZ4aXkifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}', + ], + [ + 'input' => '{"ciphertext":"JzSiCguosSsOArvPlmaLyZIfOfPIKjwU4bhHmkMtRmgFk2Go4spQT1WF9vHXBVZSf6itljYZAHSMrERLAjNwovX69anddc3eaZSNvgvKb1oH_bcHb-uDLVIcktEVqIopajbBaDOU57tQEWSuHN88odCJTjolchcwqSYmXtPjS6J1nOxy7ulapbWgMGqFMqiZtX0Iq6YcyzJVimvOvshERVy6Y3BwYAaLARrOugWSB2E","iv":"BM1ts9JitMS3izCW0YJy1Q","tag":"mcfyHYGEuiynDfnod-yHU8Uoe_SrSaHf","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBUU9pdklxVi0ycnU3MDNaYVRxTEpMQlRwVUVKdWhQMXhPaGNlOWdOS2lkLVJ5LUtEY1JCNVZkR3c0TE4xNHlNOGVHcmZUN2NqVXFVWlBaMkJqMUpSQVczIiwieSI6IkFXRGxrcHRXNWl0Q3h6MEEtbmN1SmpFWDhoWlUxUElwQ3RJWkRobDBYVThUMFVqeEFsdzUwRGx3TlRtUzdUcmM0dEtRdjd0cTRPNVFHdFdOWW96eHJxbE0ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}', + ], + [ + 'input' => '{"ciphertext":"BriyWYaD3yOINglVHQmdOaveAUZYHU5zS46aTYvLA1pzP0-S5r_MBF3qgZOH9iLEdl8KgTCOolKBDjLXOG5YsL9KqMTHAmTBTxvIhIx-O57KBvl12MsGxb65TU6IX2bLVkc8Zg7A8-m6A2v2zb_DsfVZ1chxW7fsTKl218R6_0TTwtP_7T-4ctlc81vEZqOLquTpaieWoG-ASOehfB3CN4J7Dp_sJ-okeqNArmWq3tE","iv":"Ly3eUiXkIGMok1n4SjSfOg","tag":"RDj7osy5t7NREXO0I5eULOP5So1s_A3X2dbQHws9Qtk","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBYTQzUDdEblhyS2Fwc2hZNmZMWTJXbV9ScHRqUVc1MklpT20tb0VDV080elZtSVV1ZGtNeE4zSV9IY0psbThmR1hFeEp3NUx4MHp4V2lDZm9sRG05eGVmIiwieSI6IkFmSUNkY0dqTlEtdmZDUXl2M1k4bG1kckhVV1hZQjdoaU9rQUp4UUVlYVpJNjJuZnpMeHdBcUg1VnhIQTFNTHhYSWhJb3J4TkV5Y2RPRmo0aGZCbXhRT0EifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}', + ], + [ + 'input' => '{"ciphertext":"UbVIUUAKozSZNbzQd6PCP7WK6o_sE2bo30UYWdyn1YDw1_trpfmaI3w-YnlyOiGwPr-zC_vmZ454W_Ryn0AGXKXqiTaekS53WbG8Th8wDlwS14AQultrF9qk9OnOvkTrOJP_O5iQD2TcqRGKTayVuDCmqdoQuy75peY-9l0aFhEEvt11DaDxCPjghE2oeL7tJZeOkWJklW3C4fXhzO1JApC88yeNNGM","iv":"eQprJb7oLn_UofHS","tag":"nn2X8aNEZi4tyhFMa1wxfQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBWTBLc0JobmlJcmRzZUZNMWtYcTh4bmdyNFhkbEphZHNxTF96SjI2TUc2VWY2STFlbkhOTDN0R3ZrU3Bqa2Q4Sm1HR1pZR2pfQXI2cnd0V28tS2FVRmd2IiwieSI6IkFWN19fUzJqLXQ1TE9ndHRnNEtlLXQ0SlpaUVMzb1llak51anRYSTJLU2pGVXBhUkdGRUNxUmh6TlBoMnVpU1Jya3kwMEx4X18tSWNSS3htclhTVndaR0IifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"kbNXtTo5NBpqdJB5eF4gq2wYrVfytSoq7fRsbZ8jCwMeHc3WwM3HsrHPwQk5FfQRPLlTkNsMausVpV28n-aYHevMXL4RI-8_IbuMgXVtJGY2aJ-9KhuEAV3O8Wr1Pcrc_2QF7GRQph0X3dVoQduPpiOqzclcKQqmWjKNx7LWMtUoAkKjMxLaMPkFGm0APFqaDyNomQp4Xtzw9r3PW88PSrne4LMGDYY","iv":"O5M7KXZc2lUSaMXz","tag":"z0BQpTdE94FETudknErpLQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBV0hfSFd2SDNXanIwOGx5OG5MRzlpUXlwb1JsVDNZS2JBc1h0YXdKcE5UYlhjVWJKOWpmYXlieWVRYzJmeWJYUEhCNF9CVnBodU1nQTBzSFBrandESFd6IiwieSI6IkFBSDJhaTZJdkdNYXRNTFZNa1RMSlplQTJuZC1rZm5Ydk93Yi10Q0pwMzRsVGozdlZYVmhMZWNqRTM5M2NrYTczWGQwYXh0VWpqdFRiR1ZacmJ6dkswd1YifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"Va0dxUmDCHgUIILlr7ynQgIx7sejkmPc4C5KtTBx8mSPsOh0RHKuSpG_Kl0_T4xG7_kB6V1L0sr_3GZ1VQyOk55gzt5VuhJbaJGur8le_0tzxzxdunUPut2Dg28qCk4x0EIftxaqRojhne5okleBx9AJdbeAALVpiPnNU5AmThU3648Go9LnrcPDUS__pNxI7Jmoo3o6CtW8nCy-EZI-bBi9nx2sr1E","iv":"T_Wkl0uQ6EILdiGo","tag":"niqwhxpUw5T8nqXIIvkwag","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVU5tRDJFbDZ6X3B6aFNhTE5qcDVuNUJtNDJDSDl0b0JiTmFCWko3eHJCUm15bFlWUmpfcHU4VVlfeTlsQ0Q5U19wWDFlRllwLTFaY1NYc09XSjBWM2FPIiwieSI6IkFSeDh5WkNmTHgxN2U0ZHAydS1mNmJ0eXg2eFZkY1l1Y0o5a1R6YU5RRGpEZ3NDNFc4cGN4UmlQeUduWnN2bHNSeG5aNXRLb3VSUldqWXpQaEZ1WnJ3TFMifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"lpybkrid_-PJmz9mbc7tN0ILbiN7O_5p69Py8v7zdZ7eWsMpARzVsZDh4cS3Pr6PEo644h9cdonDZT3X-E5C_pLiquR44wti9djlZkz_DVuC8V2owUuY7J3KtNsJ0wgAzw4IKB52XAvZ_k8B8DkO_HizPh9GOlLvfiq0JZavLxUlDUa4liMM87d4Ab09A9syExrb2AF73f2h9Fh6t5zaoEut5qiwLKapaRNg_qm5zy4","iv":"Jf-mYDmKK3ted8lok_GIGw","tag":"DT90e1pDUOnMevNQA1CMDA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkRpMmFYalpMTDBvb2lJSW9uODVsOVh4WmJRQ2FHbVdLVlU4azJIeXRYR00ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}', + ], + [ + 'input' => '{"ciphertext":"XMtu-ILvqQAw34cvWxFAjcla3BPp_b_V6I_4WG-htpcMpwgu-gG-LVrb_82b8PF52DhH6Ddb6LTXvgLo61Fmu3NnE9JKuxK9x3rKS1FwMaRjfLOHQxDjWfvc6sBhtCkXptcyb6PGu7Cf_Gqefc6EUtuv1mg8oFRcHHyh3oKwodfejhKv498BBOapYpMbShvJ_vFm_-POK166Ar6lXkT2J2v_hcLgvEqdg9cblhbq6fY","iv":"0-53nsstdwvjKg-2AiQ39w","tag":"5B6nXRG3VcnQ77uooFvuu6hbKkYW7buD","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlBqTXhyNHpfcWp3NXJjQmFWMTBlS1MtWWJFLTBVQWVrYjNDWkpfOVptbncifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}', + ], + [ + 'input' => '{"ciphertext":"frDISfZ73cpq6Dr3fZrV30NFvVhpIg4BqW6sBHiGqKi69vsLyXKGvtrl1VHK27_6PO3xmApdLPfHITEFuwmyggOX4_bSVgArkWgpgXlUJzwbDgbCsJKf7FuVXK5O1wy4_I_JYSiO0J1YUONjUrt6Ex343Ibq3vDB2KiHeemoGRKLhoM6ejdyY_YPeHKr7fOopYviZGPPh2bt8dEXe8lNpAJVDh8cgGIkVvDrmjzDk6I","iv":"xzKxcIuy56ORbMN21dVk2g","tag":"Y_OPobOVDz_lIwDoMqsXcosVQFCvCfMSmWCpY3W7nN8","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6Il96QzJ3QTUyYmZtTFllTUlObUc0NWVYRkJhWndpV3c2bWk1dm05NmM3WHcifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}', + ], + [ + 'input' => '{"ciphertext":"_5muNolwL4qVUB_a2Sc5jxJXDyLOoiXUWKGshvhtK9pnEEvlHKUirPuFV5hAd4x8nw4zt3vrh7ELEUBeMQ_z252svnMVrStFWg7Bg5qbI6h63IEM4o9XlnyXcwoYcm967H-3-UZ8j66Y2R9ztc2pRR2zs2pO0pNhJP78VjWL6j2tyRu3Qr3Ifxf3Y69tzDCZXzUs6y1KEsmay4X75OrUZbFrs7Kbg6Q","iv":"Ifn2b8VX6mfBEdmd","tag":"N60_66GG2jMw9NBYHIGaGw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IldVeHQwUGFUMmkzalp2Vkx2MHNac2ZOYkg1cnpPVGFnYmU3V2JpV0Z6bGMifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"IUmY2ePgZiNynhrTxcNbDJtNBL59UEJ2ocggcuXrLF0ucFNORX0CVOO1GN28Ymre9C8SRQkMB1fLel7i33Zi03QT_znEguRo0Ytx2QpCWItxjqzbCuOd9506xSQjA09-ydriciNFHgbnxFMm91W-5ETNg-gNMCNBLg2fYNVjUFLXPSUe-yfcGViFTUcCJzPwnw60GhOTbxI5VkQPZicZM_u_hTVOWhk","iv":"YqKvjace4bjVQjjc","tag":"uhBYYEQ3SuIAFMzjhmT7Mg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6ImZya2RpdmdKZUFacHB5MGdSME9lcjM4ZXZ3TDVjbENmaXJxRXFDcFR5VFUifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"QbcGBRt2ARS1K3k4A1mktK4ks4WYuoga06gHjGMvEIesam5sFMOS8bqgSI4rOa_a_TLkSNCHlSOXFy2gs_zaXg3YEgwTWNdtH1B47D3Wc8DRTygbwdTAsnGMB1aVnvj2qb2OvSRCk4uMg-oD8WvFkTgp0iyxYw97IKyhH8FU6PjzKwiYGAUTCNcia6iyAzTFStlicyH7VvhLzXInS49X4EzlptNjtS0","iv":"O3HOMyDYmyFi9-L1","tag":"dODnhRWtPxEBE_PtBZrENg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IndsYnVwRzJuaUpxOTR2U0pCaWt5RXl5NXoyRzNhcDhBWHJjWVdOdFgxZ28ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"ACg_nLboBecsud2uTRPZE9lhnGFXdNwdWzykX50dXKU2UBc68T1XSS_YsqGH_XuEKheWa-gwgMxbLsvBpbnelkm84UiavaefBlKGDjTZZZfzJmEE0UdWzSsfJ6DZQ66qk-denN-K_Va46Om7Pkv5Z2CNpIF7miAHeCCHnF2z4O7D6IRrw5pQUUnvHzrUz72lKPZDYj8JlOYENjFblP32cKl011ve1Cwk-pgAhoJ0FBE","iv":"aF28SnQOmrc-gEdIlTewWw","tag":"wTECGcrV42tlC7RON78stg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ4MEJvVHhfXzJITnhRQVd2UDNBa1A5TDRFeHA1ZlJzdy10RjlfdEZMTk5RIiwieSI6IlNDREpNYXlJRlBrdW5URkIzV1FvQWZYbEc5MFN2ZkUxN1U4TkxMWTFib2sifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}', + ], + [ + 'input' => '{"ciphertext":"wzktIqgfTWJk5-6h9pt9_djnVmt9XL4Zf1kX84xg14_EmES9peZgu1dBq0omUfTP10QgXPPvHEwhzJn6tcLPEpmgvH4UenDvPul6ZoQemLxQKojERrJROD9FTRITKCKe1K0jrRAkKXlzeYs0et6Ju_rHtUHq3I97hmT6mQkwkeJFXQ-qkBaItRLVbXBq5Ph3TTYjDubOBoCHWAKZ-pPiJ-4f6Whx7fDDVsV_hXdooJc","iv":"bDZvQ89OmNYHEREWyBYPZw","tag":"k5NO-VRlL8MaijOD_C8jHSB9dq_0L3Wk","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJrdkNVbHF5aGY1YTM1N3YyN1ZwV1l3Y1RsdTdvLUtQUEt0QXBQN0ZLc0wwIiwieSI6IkxwdDlRalZwcW9JUEJzUFJQY1VCb0o0OFExR050cXg5QWxRM0ZoZHhIMGsifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}', + ], + [ + 'input' => '{"ciphertext":"d1au1N8eU8qMQ4D93HYnb5-cFtqyIdrJXV2OdaJCcA65s2g2rEM1k261lnnbJ-C_OgK60oQQxTc70d_YOXZOMsBDmraDmpjr2AODtwohSSe9e35QpyD0S2TT-FL64CiSk0TodtitlQ00UTCs0vHSDy7gesHvwG5cmiXKBr0_2ybW2LnOwpJZZpZGTIX5cuocfVVecoN_cS5G6RIVTEsT6YS0WAnVUAiWsifdvuJp1tg","iv":"XloO4Wm_70slo5FVj-lHUQ","tag":"LBuBOaorE7-XSFf0ed-s7cugHaNbtrsOmFCXa8lsZLM","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJvSmZobld0SjRGOGxCUENic1p5cGRWbjZUZERxUEZZX2dlWXdpQmxLZlRBIiwieSI6IjB5ckFhRXlnQkNhYW80bE51eEgtVUtXZUJuODVNNmEyTXdsTnhJQVpleEkifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}', + ], + [ + 'input' => '{"ciphertext":"vnoovMxbZ_Ie878pnkzg1MftrJOyKxlj53qwxtCdUduyQVx1IYZTcpmC3bqqLm3Tm4A1VPi3U1uFp8X_tHUNW_AkIlCQvtlISjUmlq2VZqvQodynYzcLE_bEf49b0gky39Jk-U7uq51pZdkCn_Dnm-2k8xQKtnrkISsl96JjTw69D_pGBR0DdQFcEfJO1HpUsUQlOOX8fsdW2DURmNsvEAtSBn0faCg","iv":"NstpkansL9xPOrad","tag":"cXTsEsWSV2Ipy1EGVzfcow","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ1V2NLajVDdl9vdzZZTWlMdVlfLUNWMFJxeGhSZDdLQ3FWMC1LNmtwYlk0IiwieSI6IlItMlF0U1FxUWpSOEpYT0NYa1hkSnROM0VycHpDNjJEbVhoREl3b3dkWXMifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"FR74oS4SHGmbgi2qb-DNgQ5i37g2JZlVy47AR40MoGfoVGgrcL0i_7sDlWBeC8RWCVCkBMBNUR7-fkp8rwNvwC9DN1E8GoiFVtmi5D-wYXVwMksx8oeFGT0FeDRKHDa2ZDUzcVttDSmU0xiYi_2wjkW6q1CozlZGB_1Mu9xEogd3e749LJx4FNm22EGI7JM4ioyKCxNQfBDMxt6XXFqtEaQFIUY4Y2g","iv":"KAJVHEqL0ZafC7Nf","tag":"_XkJWzjIqfW3AVlvl7fHww","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ3d3RUUXN6MlFMX2t3aURIMkRVMXhzQ09lT19haFlvZU41NFhZa0xibXlvIiwieSI6Ik5CZ0RFV2syZTJlaGNramZXVnl5V3hCYy1fVk9zWVpadHJlZlhibTZGU1kifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"1gjDAJA1A9K3IJ_nQZiZCND1kP94iTELtYwti-qX893MS7ggBYrlrCNqotCvwKgmn_CMRcWd9y04U2IMQnL-R2juVIkEC3vZvfOH9c_UTLxjKN-CPyRj9frk7uP2EyQWNet9rjPsMoO25cmorlwtSwusQ5AIuZRXhRjtE26W1O1wbBK5CBg0ybf4B37N50beFRo_DzcBiUQsvJJLJyo_ehDVxgjW4gg","iv":"h5m9rU_ULBMdfb45","tag":"LgYeq5xlP3TMXMG5PduO6A","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJ6TlhNU0RIdktSdmRkNzRvdHFHRzRwU1RPV09MR1RkVWlESTY1bXJWcHkwIiwieSI6InNCaTJSbXdHQmhjTC1IaS1PZVF1WWFCYndYLTlTaDV4ZXhGM2htaEtWbGMifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"IxQQfxuR1TZ6ntuADjsnvtgZTL3yIHobBImiIhM2OXkh0yoM1MZXwSC_c1UlJdf6cGdacPIgmcJlsZdAbsi7WzZ5JxZQOL-pjAeab5t_L_4e2Lqtu10l812w_yXQ-szKc2meyj3o928lg9AwyNi48GVXCCGAuGZUBfAbXCp0ORC9UP4Q0pVIAo7XhWCVvxk8Vl2XR7kPVofEwr2mvMJ8OoCAmYAIKfnw3AfkkIzyLCw","iv":"r9WX61qWE40c5oqAu9b7Sg","tag":"vo65keQh_Q_ID8O4y0zINQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJiRGlIR0JRMmNmWGQzTm5ua1ZQcVdtYXpHUHJVcWwzVGRMYXNDcDJVQUhwMXVlUWtxU2xpdjhSUnIxQ0U3SjZBIiwieSI6IlBzU0p2ekJCRDRPUU1qLWFXMHZaalBySFlwU1NhYnZMWGtaUmxZSXA4Mm11cTFZaUg0OE1ha3MwTXNvSnk5UGEifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}', + ], + [ + 'input' => '{"ciphertext":"m50AsW6xfm1_u5fGHbPRg6Im8bpWA-uNjl6sek90seFgGuV21HQssW4n6ksAFH-1CGloNngHxQUAO6nYgAPuGJpGJyYARLEjIZhP6RYcW2wk8TVK-8MHQ3o07Uhui_jb6vVvwX8NHWNlZQDupeEfS19GEzE6s---C4IA_U8BP9Vd_UVjgtE9TyOCPntIuUr0frJTDAEffesDvPQEgtUNtMr4M-uhb0G0M7BkaIvgSJU","iv":"C4923TvD5M_TIie45JPBHA","tag":"HoMhtMrjJ5GDsMLGjo_WUryqilRnRsLA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJNbEZVdWVEWmYxZlFma2I0ZFUwdFQ0eGlOdHVlbDAtQ1htdVE5VktOVjh1S3NaS19ORmFuRjlSODYwYUptS3dGIiwieSI6IlNMRUZCX0FnMjhhWWRwaUJ4SlU4NzBYaVRkXy1DeURRNTVZTWluZWhBd2FpNGJNWFlqMUdHMmd5ai1EQ0h6TFYifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}', + ], + [ + 'input' => '{"ciphertext":"_7FRQBjsuN4kY2iOBO4ObmO5AlMoCzSsNXPJsdryxgjTpPLR84xN2oYoU4g_oPAssTFzUJh8yXp-Fx-AH0mnf5lVP_NIexF_NHLrFar35F9d94PJBkwiv7CtNefXeuO_XsMjZn7TWB0Qhw_oX52JWVsybS23M3zSM8iSVrYCDUgLdivrc4x5-BCMBgUmHz_Efee-iFjnPRUGPg-oqwYZ9RzmVdMjV9-zbyfWGs9T2bM","iv":"gCKV_Z0VgExxHOfkxNJ5dg","tag":"ALFmpaym_S7k4eGPfUpJGm9GG-JbH_N9xOd_JJ_RpRk","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiItakhrN2FtbTI5OXExdHd1UVJaS0JnbWU1Ny1Td2lJdjVQZWNta2VHOWVNMi0wb0NkWExHWDRXUnFLQUttNXQxIiwieSI6IlNkeXl4MWVjZThpY01FT0pNZ2ljMjhrMWdzUjkzQmJJa281UFptSFN0ajRqbHZPYVFZYlJNVm9vSFotYVA4M1MifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}', + ], + [ + 'input' => '{"ciphertext":"eajyqCw1RJ8ev7RuWyhaqaRIJg72QibdSryd36CMxhhOUB2fIzGX9gZ8hHp_D7Pd7tRHFGt4ydavddqGaaCBjaMizHFdcZxMJQ6t_57BFFTTn3t_Vh08HVyE5caBariXMKb-0YGBwh8shLrBHEYTYE_LMbEJI-sBWePbtCbXb6n8ObzI7hVNq5Brq7ZmKBrGVZGPp1w64bJzGNPol9IRY_sBekHMmcw","iv":"-4w0zo1ACWTWK_lw","tag":"OPBIsx9UaSjxE2mrPlb88g","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJ6T1NOcE1EOE9aMkR3YWVFamFDTFFCNXZ5NlFWaklGYmNmbE0wOXMwRmZqRlduQUpwNFk3ckVPWl9CYkszVlAzIiwieSI6Ii03SEt0Um5kNlN5LVd6c01KVHBNSzltSU5adFVSSE82dmZKV1N5MWR0NWdPWWVqZmxKLXgxcWE1dE13SUVER2EifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"SRBspbq8aCKsLjyb4ZwkU7bNf5387pvKDJt95MonIP2IVsI_yLQyn9RC0cOe_INnF9kfaE2nPyjYX7d4D4i70kdxOkmWK9UBWMyXUOHuyolWPJ8zooTbV6TgN-of21Xty_S2d_fxpQmrpwrrNfTFW2NRxiiRZeeIUVzuQD5CVqMEut1H0WgRGbUsKKMFEAhSMSfY3sGeZGsbAfRjneGJrEiA6A9FZWw","iv":"KgtjGk7lEaJVhvXe","tag":"1TtHcxNEG1Ie12vHEHxikw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiIzLVJ2QmdsQWhta211QjNaNUk0NHMxQ0stY25hX1YzaUFlWlgwUVhBZWoxVF9XN2Y5RDFsNXZMcmlJUWJTMl9KIiwieSI6InhJRTJORHQzNW1VN0QyVzhQUHA5SHlrVVJRWnN2NEJOVHBCamRidVZ5TzJWYWxjdlFmQkg0ZjJla2hQb3hvRW4ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"uRubb-NLklXJ9LeTeT7SbOUBj8iWksOohM0EAbxFSP7U7Q--SSNzp4kJxjTDweT1njB7soMNEPPIKHe3Je7e6JofQVhG17SmNKOo3VKvDCYRB8B_Ky2o4y5ZKpm8RzgvnfWLXRMu6497m_jNaQifaiWCCVsTedJiBT8F71gE_HYCQ-0mpAnbNwGwrQHCbNjXf2xjUbHWROF2hVASIjHCon_vXQPb0BI","iv":"K2PUZUoPd4v5gajx","tag":"IP9kcdZ7PWVaIJwTYDub4g","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC0zODQiLCJrdHkiOiJFQyIsIngiOiJOZndiVF9BcnVzRk1pNkdKWkFiR0dHQXlPZ2ZkQVNaaDg4RXNEMkJReEFKRy1xOGFEcHAtc1NOYTViRy1kMDhBIiwieSI6Imwzei11b1daUzhzT1Y3SHZiVkZwTDF5VnhPY0duYkhiWEMyVlBHUVV6aV82VEpPLXdYT0dKcHlPaFJTVmdfSmYifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"evFbDMHEqVePkdpNlexRjAyX5mf0RCjYH2SfEI5BrW1Qz09z5T8OvsQDdy2UDvoDKnJQXZNAyEicA-N1QMjsAeMD6xRZ7WcPb4jbGWsnk5Da2xYdVvKOlqa35D7s2eQsmxFI8nzPydT0V9I-M6J-sljp6kIbQYhkRzlF-1Yj3P0pD6ExNOEJiqqneei0CpxiUMDo_mH3Yqxv4aLevfhOLSGfL_RNlA41wvL7pqvmpnU","iv":"0gChfHukWucTP9jDU2sOHA","tag":"jytdfKao99CTm-QxlgUADg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVHNOSWdJNFgzLVk2dXNBT2tRTHhjemtTX2k5amtWQnhiRHBmQlVzMEl1QjJpR1BwNWZkUFl5RHh4Y0QxMHhXdXZpVFF4TW1GODExS2NTaXNlUVlGX2dWIiwieSI6IkFHT1ltc0ZRY0UwOVFZYTZxQWFNbVh4bS1BRGMwcTVPSHk0aUdnNUppVTZ6UHRrQUFyQlVoaGNvR2pfUm85OUloTEJqbEVtc0J3amtsUzZPLWdaYkk4X3AifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}', + ], + [ + 'input' => '{"ciphertext":"sQGLMdFoGIU6hBqLqd5mScIvv7JL5YOVX_a2fPdk1nSMhT6Qzp16Gfc_hCUAUCjrhgMOXYt6ENH0efgCR9WTOp6OI2PUJY-cF425yW7w2uQ7cng86FzqEr6gx0JOhSMED3BJ2lwUNJ1hX3XyZi9zm7SeMYxibbEtrioFzvr5QriESsSw9O46_pJg_JmrUywJECJtmGhve-4xjhbX3J3WfFvQIB69S8t5N9FynjZ_Cx8","iv":"E3J-49EPWe3yG_S5uXXDpA","tag":"wO0cMmpjutiE5QMvJl-jj-GqGld0otfg","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBV0JWR05GdzBYR1RaVEhyYlpTNFJrOTZlLW52M25WVTdzLWwxY1lJeXJmVi1sZXpvc2h6bF9SN1M3ejg5ajhxWVFhY25kOGN0V3F1d2F4aW1zZHlBYzRyIiwieSI6IkFFRzcxWWVweWMwZlNtZVo2VGxGaTNENUVnMVBYdWg5SnZ5ZXJVOEVZMkt3Wkx4Y25ydG1rQng1ZllRNlVkcGRTbDJESjkwNFhnMWhoMVRPY2tSTTFhV1MifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}', + ], + [ + 'input' => '{"ciphertext":"SQBbU-lyu_CtmFf7pHYukUfAEo8T-ck2WslHQ62APpJ480LuM9yZwzPlwTHG1uvQextL4cbFj9vvyLMeh3wYLj5AEhUHEVrpdvtlRi1rbEFqQiZUEooEPN2qJoxH2mWtn8nh2DjsuWpod8UDee-8hOrW3xc-qHcZvcSrmehZmpVWbBLEiylEAineyRPYYwTMvlLA3PcHqXARPO-41K8xUzrrXJI7xBiNLmOQlYA1z6s","iv":"jw_8tRsVnCFVKGS9IIzG4g","tag":"OcFTJXfkTicHumLC50Gmb63D8nDqwanhIOxH6fMLKNc","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBT1hpa3dFRTZ6Q3JBaEc1aU9tLXV6c0hmZjBHTnhxOXdWVTFFbWtobEh1OG04Zm5wRTlRS2hfdEc1cHhRMkR2N0ZCemFkR3RzajJESXlzT0wyMUdKNXNYIiwieSI6IkFhd0FZcjV0UzVLQ2NfSXJfLS1qN3ZjeDRFVzJpeTVRWVV1b1FQUlJvRmpGREFqT0twX3ZaLWhYTnFHbnlqREQ1VnV1QzlrdDNPVUJjVHNZeTVfallESkgifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}', + ], + [ + 'input' => '{"ciphertext":"MReNRX6Nce0_UQYaLxDa4AR2b-db9_FMVUXD73qAvENn-oXx4jJog4X76oVfl1-nqta5RBWg5mCT04TMRG7QtGxCEgpsS0w5ELKTJughVn9XHuPx3XXrjgSbiZZgYr69wx2hS7qnxTgdmVH1xo1Cpp-SH_9aE5CT9PwROcJOYkg5GhUTkKmDHXb1jdPMlrUzLxTaVl9Ric-YpGxcNy84Llgm6JA2FhA","iv":"uTLsVACz4yoGmTC3","tag":"igbfFg0uysWev5Uk5qm5lw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBT0luVjk4a2tjUW9sTUVWTk5wQlhQUkUzdXkyZm00ZzZKU1RKMnJYSFpYMnlac0lic2lqLU1tNEpXNVlJeUpJY3kzRTdheFFuRENpeDZUMEpKdGhWMXNIIiwieSI6IkFDVFJaTkNxYllSeTgySTR2b1pubktVVV8yTEdyVXNUZjVIOGxCTDdSZ1NfNVJ0UEFqU3RQSjRraU41QUtneWkteDB3VXBEX2JXUllKa096SmdFeHB5clkifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"JrZd5PNga94b7YDyXyqNOrcPhEr2zEKyjC4e-iqdqcJw2zgjK_7zzw3e-MBVJ5JWRh8iepeveux8sMbZJoXB9v8R_72ykjadHXhXgwliPqcFA4wDg1NKGG99ZKnvPydlg2_0SAqxvX8C0aJVG25x4CdU2D2k4AWISgJMU1sgEk3buMGG3UuIYqwtOv6uhGsY0OMxMy4D-_02mR4V9NZDTHql9kXYESQ","iv":"b2W4yc1XDBs56hDP","tag":"VJD86DkO8ZEMsP4Xp3MJ-g","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBVmYxc1NWekVsZzNkNVJvMVJDdzI2by1hdi1kRjVVdENwQXJiMlJfVkRjZ1hCbWthakdOdTZnLXBDTHlBS04tVkc3dWJKNzd1WWxjSnNaS0tYa2l3aGhmIiwieSI6IkFLc1pheGQzOU92N3VMT1drU2tzYjZnRTY4c3NMRGpTekt1NGVhaWlZYUlpelhXNGFxUEM3TWl1LXg0bzcxOTlUV3J4MU10b2pRQ05SelZBcVJkTmhDT2IifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"QLLxRxkzsJIaVXT5fjX8Nq0qsXOB4hRcxu-91dDvVji3nruAlMYEeHEZOZIUqq0Y1AaJRJQmN2kDZL2mmdRuRcpzvHXI4pbwlLnZLtIqnAA77lEVMHXzWPYHvQ0kHWtnkr0-6Iq0TvVduJOZQUaTDhjWy7wIDN-bsZV6XIjcNRMgI7df6L3h5D5CrKR2DIPEiFKg-Ijl3lwcvgV7q1tMySQmiV5xRTw","iv":"vnVi5xfl5HFCclqT","tag":"eqT0exOdsEPeULmdG-wklw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiUC01MjEiLCJrdHkiOiJFQyIsIngiOiJBSzEtYk9DSVoxV2JFaFE0ODR2THRzLWliTGdNOU43eG0yUTBnLVpxMWkzcjhXdF8tdTZBenRCMzNWMjhRVjh0MGJ3TmZYZUE4cVZjZnJSR1hGNXZSeHRLIiwieSI6IkFQcFk0V3M0Y01UQU5GNURiTzRZN0QtSDZ0UjVOWnQ4aGR2bWsza1dHYlJKeXNpdkE4ZVk3aFFlV3BmbVdQQm9IQ0FUYTdUQmRhcHlqQS1VZ1lIMWRRVEcifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"cy6eI7vOAEC1PXvkVQcea1rl73JB_Se3busbGZ4PUy7VPVeIzYFcdHbe9qzqE2xwNigmja79m3DaduWyD5GDrywm0kUG3FVnNF5FkKsKzKBpdX5ubEDfXisfh4CGIu6ncESr7llGX5d4rCHd6If7NBvE9dsmonnOr28D6LpsrGFHS1vTs1mZW0IJ9ZIJJODO6l4nnTtpW4qw6WhIs5ZHVrTf18QtRdV0Zn2dqIlbjw4","iv":"JfjmVUk0rt5wgjxtJG9dcQ","tag":"dWe9-40TN3xItxfaVDJOvA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlFORWtJZmtMamozVjhxV1l6VFBob3c2T3dRY0JSb3RVb0RiX0RvTDYtVzQifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ"}', + ], + [ + 'input' => '{"ciphertext":"o1AEWAYqwcfcK9gdrK9BJMc1-3sbbQsfmNbDRiFYPLM-ikkbhkkwvR5Jj-E_qwKhvix6D4nK6NMvO8h0Rjjg4taj1EPtvBOA-Ppl_tI023O-VOlOBVaaiPNTuRjeHdWnFnbZ2NOf7r9SUaXnKQlhboBqmzAlV_9iId04A2U52jV9YCe-QRC4PMiwiB7QaLOIWAp3pZDg_cdVqIOFegrHiZx2gcwhPTdCRl6xjF86YTQ","iv":"sgrJT1GnLW6GPZxQ2sE4fA","tag":"M4WVnIMxLAK3oVaqsVKZ4KqvgGObGAw9","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlJYWFZQNHoyS2RjR1Zfb1Nrc0c5emdKQVhLWlJTR1ZfSWl2NDZHRklDaG8ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJDQkMtSFMzODQifQ"}', + ], + [ + 'input' => '{"ciphertext":"1b0hOYd2iw-p6_BEkP6bwkc-ghNzU-8c0oz9Lk9-ksIKn3_uO3jaiCSPpgzrIWdtwM2shJuiS2awtVsVqqap2kUBI_mLxMUkNu8vIdLVMDOG4JnGu8xQekzOyEJnh3t8iJqukVeHXBOHSahuOSJm1wT9I7c94qziBxWcBfUTnPhk2erZID51iUcgXXT6ccnX3bVhGh7MRAh7Ayub9N7vhIlET_drNv1-nDytpP1VHI8","iv":"XfKwJSAkFOMfbhIzok1ViQ","tag":"b_kD9-BadXRR7VVlArO2NbJ57JDk5q69d-6V9izO8pU","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6ImdLSHp0UW1IdzgwcE05MkhjMkxZVUtzN2RGU2hEWWtBRkhWZ21nU3JReE0ifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ"}', + ], + [ + 'input' => '{"ciphertext":"XR-qBJ6l7-VNRgTzLsVkniRY7oDNd0r_ooUofbMqNDSXTHqcSQWhBayA88gfRybwITBuM2TcOClRQ1LPiGW8PceWgu-kXzRU3U0oUkhgwRdk19ZMbtBHkg-g8GX3VEr4rawUri4ofCFBL7dV9WshLolOY6R_L4IGXSGhpH7HPTht4It773TfAo2LPTFllfN0NYcRJD180VSAYtTEpK-BiwneRhHd6O0","iv":"T8_T58NnIjrQ3v0B","tag":"Xg2J1jQNHlpVGow6NWEopQ","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6InI1TXJlSmlFNDdLSkcydGdzTWI0LUkzajgtS3lLbzNMU3E3SHM0aFoyakEifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExMjhHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"fkavWJbNKcmu6HkbHjOyjAEylDh2EyLcJSLry-bHi8t2g31UZimNTW7aKPgGVN97T3_jJkOpSdOYoRWs9nparpNce0Fqd79LaGgB0a_XOeRZNRzkfXZkTr71r-o7XRC2xTNHdqMQEd8mWXeFmsZD9I_ZTjyF6FCW_ljWtccJ1VBPe4bvTdnuHCFNzHLcp334LJTxuc0sgwlTb4Mby8acJkS4LNt1S8o","iv":"-eYt0kU6UUhUZccg","tag":"P-PGnb40IoWdhX2VluueSw","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IlVnLWlGcWdpWHJ4VmlCWGxaUEN6UXVydWR2T2U2LW1UaHd6YzJJVlZyMzQifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkExOTJHQ00ifQ"}', + ], + [ + 'input' => '{"ciphertext":"u42pqwl2jiwX6oRjilAdTjlE8-0I6WXXi5DxjdT3NjAG1F6tFhn0WHDRZZVmzLfA5JKciwW7_GhBFL8EqWksLDu84PWATcsJwS2PEp3P3B9QGkqgoNoRstExXpYHHpPoFsgBhyO7mxGJ-0RWdKLPf9Ck2Z6Hn8JoSVLbIa28FGTNj46rhYg5Aep8BxYJf9csTRfPQQ33ZgupifET9oamSF32HVq6gO4","iv":"0cIuo8Jv_Vv0kyiV","tag":"8lebqo_Vzy8Xf8OPiuNNVA","aad":"QSxCLEMsRA","protected":"eyJlcGsiOnsiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6ImpMR09HTUl6QmtRVzkxWElSV0VtM1pyV25WOEpqRExlZjFsRVBvRTBNa1kifSwiYWxnIjoiRUNESC1FUyIsImVuYyI6IkEyNTZHQ00ifQ"}', + ], ]; } @@ -113,30 +218,32 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'crv' => 'P-256', - 'kty' => 'EC', - 'd' => '_gUgAjx9zU5BKlHq--TiCjZmsdNQAgrv536DCTUM2vo', - 'x' => 'Kuh77MGkweIENgR_3WjzJ4gEF47yn6yQWAeeNqYC5qo', - 'y' => '1koAqIfb5C2PkCT1GYEcW4IcIEdrgOdMcua6G0Eyhtc', - ], [ - 'crv' => 'P-384', - 'kty' => 'EC', - 'd' => 'Fn_Le74znJfY33TkqCoskx1pkgA_1sLnKvfvM_78lTZT2zfj4XC6uY_L8iRknOii', - 'x' => 'o5CqgE0jIlCVwGKMXDsQmkOgxohJcod4hv7jo4h7qeRoysAV0YPtokMgv7CUpSCG', - 'y' => 'Z3ZGVhyv3T-MudQI5fYNmkO1BzqlHQJHCQ9RQzqa05QOsUZo39gjVC2EhRv1Z9kz', - ], [ - 'crv' => 'P-521', - 'kty' => 'EC', - 'd' => 'ACebnk5N5RV4VFhrCmvp-5w6rsQJvHdvvBdJkIKmq3pDDreKC0vU-K2oYrQaX5vPuI1umnVw9qxFq6QCsShJ38Fh', - 'x' => 'AR05Z1Xe74_lcrJbhKg12jijs5LPbLwcpHDGETssYKRgbO3-4l7egk_WtLjSeXmDvRfkww9kKpFdKHTqmDYSIzxf', - 'y' => 'AL7NyrGpwcXqfvmQb4d7N6vO7REegUaFv8ea-_EXyA2eJciZJSmvipwpxRnoSfkNuJ5yJUGdjg_FtaddKaLdJEf_', - ], [ - 'crv' => 'X25519', - 'kty' => 'OKP', - 'x' => 'LD7PfRPxq03bd0WJyf_1z-LQevmrbcYx7jJafep3gmk', - 'd' => 'pSdgXFRYMvOa7giAm3Rrf5Mf8GnvLz7HtZKu_KN06KY', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'crv' => 'P-256', + 'kty' => 'EC', + 'd' => '_gUgAjx9zU5BKlHq--TiCjZmsdNQAgrv536DCTUM2vo', + 'x' => 'Kuh77MGkweIENgR_3WjzJ4gEF47yn6yQWAeeNqYC5qo', + 'y' => '1koAqIfb5C2PkCT1GYEcW4IcIEdrgOdMcua6G0Eyhtc', + ], [ + 'crv' => 'P-384', + 'kty' => 'EC', + 'd' => 'Fn_Le74znJfY33TkqCoskx1pkgA_1sLnKvfvM_78lTZT2zfj4XC6uY_L8iRknOii', + 'x' => 'o5CqgE0jIlCVwGKMXDsQmkOgxohJcod4hv7jo4h7qeRoysAV0YPtokMgv7CUpSCG', + 'y' => 'Z3ZGVhyv3T-MudQI5fYNmkO1BzqlHQJHCQ9RQzqa05QOsUZo39gjVC2EhRv1Z9kz', + ], [ + 'crv' => 'P-521', + 'kty' => 'EC', + 'd' => 'ACebnk5N5RV4VFhrCmvp-5w6rsQJvHdvvBdJkIKmq3pDDreKC0vU-K2oYrQaX5vPuI1umnVw9qxFq6QCsShJ38Fh', + 'x' => 'AR05Z1Xe74_lcrJbhKg12jijs5LPbLwcpHDGETssYKRgbO3-4l7egk_WtLjSeXmDvRfkww9kKpFdKHTqmDYSIzxf', + 'y' => 'AL7NyrGpwcXqfvmQb4d7N6vO7REegUaFv8ea-_EXyA2eJciZJSmvipwpxRnoSfkNuJ5yJUGdjg_FtaddKaLdJEf_', + ], [ + 'crv' => 'X25519', + 'kty' => 'OKP', + 'x' => 'LD7PfRPxq03bd0WJyf_1z-LQevmrbcYx7jJafep3gmk', + 'd' => 'pSdgXFRYMvOa7giAm3Rrf5Mf8GnvLz7HtZKu_KN06KY', + ]], + ], ], ]; } diff --git a/performance/JWE/EncryptionBench.php b/performance/JWE/EncryptionBench.php index 5208eaf7..ff1bcfce 100644 --- a/performance/JWE/EncryptionBench.php +++ b/performance/JWE/EncryptionBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; use Jose\Component\Core\AlgorithmManager; @@ -35,8 +26,11 @@ abstract class EncryptionBench { private $contentEncryptionAlgorithmsManager; + private $keyEncryptionAlgorithmsManager; + private $compressionMethodsManager; + private $serializerManager; public function init() @@ -68,9 +62,7 @@ public function init() new ContentEncryption\A192GCM(), new ContentEncryption\A256GCM(), ]); - $this->compressionMethodsManager = new CompressionMethodManager([ - new Compression\Deflate(), - ]); + $this->compressionMethodsManager = new CompressionMethodManager([new Compression\Deflate()]); $this->serializerManager = new JWESerializerManager([ new CompactSerializer(), new JSONFlattenedSerializer(), diff --git a/performance/JWE/PBES2HS256A128KWBench.php b/performance/JWE/PBES2HS256A128KWBench.php index a021179d..855e0753 100644 --- a/performance/JWE/PBES2HS256A128KWBench.php +++ b/performance/JWE/PBES2HS256A128KWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'PBES2-HS256+A128KW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS256+A128KW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS256+A128KW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS256+A128KW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS256+A128KW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS256+A128KW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS256+A128KW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS256+A128KW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS256+A128KW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS256+A128KW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS256+A128KW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS256+A128KW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,7 +67,9 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"zDsBLNwrRjNHCEfiQ9exd62CC3ZF4XIXpW2pcVfME_ckTbCfrdCkMdhRLD6WZ0Ai-s2PF0esh536u56pJEWJkF5WKnCPCb4AowGleEBlh8yiR2i9KCLzIPUpyf3AH-ffKwIwEgYO33oGOJ55KBR6eYuFePhzxErgTTC4JA9KNxbRvoL-9TSqhOhYwYuMs9DoNmNTHPbh7AZiZyF-ZrZSZ7fEp4rMK8Y","iv":"B8c5oGxoX8I-7yKk","tag":"sh-wabbT17__NQqafuIKtQ","aad":"QSxCLEMsRA","protected":"eyJwMnMiOiJ2bG95RkN0MmhVc1hpQllDQVJlWGhHcjNYM3BOLWpldFFzVEFHc0doLUVBTThzbGFZMDNIUVNHQXVkaXFRV09pQndJSFdyTDdMcEFPMS1PQ0ttMEJEdyIsInAyYyI6NDA5NiwiYWxnIjoiUEJFUzItSFMyNTYrQTEyOEtXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"NYmhb9gVwG1AxG68L_jU4CuiuV7Z0UEg8vTpd0HVtkxCrF-oVzPmoQ"}'], + [ + 'input' => '{"ciphertext":"zDsBLNwrRjNHCEfiQ9exd62CC3ZF4XIXpW2pcVfME_ckTbCfrdCkMdhRLD6WZ0Ai-s2PF0esh536u56pJEWJkF5WKnCPCb4AowGleEBlh8yiR2i9KCLzIPUpyf3AH-ffKwIwEgYO33oGOJ55KBR6eYuFePhzxErgTTC4JA9KNxbRvoL-9TSqhOhYwYuMs9DoNmNTHPbh7AZiZyF-ZrZSZ7fEp4rMK8Y","iv":"B8c5oGxoX8I-7yKk","tag":"sh-wabbT17__NQqafuIKtQ","aad":"QSxCLEMsRA","protected":"eyJwMnMiOiJ2bG95RkN0MmhVc1hpQllDQVJlWGhHcjNYM3BOLWpldFFzVEFHc0doLUVBTThzbGFZMDNIUVNHQXVkaXFRV09pQndJSFdyTDdMcEFPMS1PQ0ttMEJEdyIsInAyYyI6NDA5NiwiYWxnIjoiUEJFUzItSFMyNTYrQTEyOEtXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"NYmhb9gVwG1AxG68L_jU4CuiuV7Z0UEg8vTpd0HVtkxCrF-oVzPmoQ"}', + ], ]; } @@ -66,10 +77,12 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'oct', - 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'oct', + 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', + ]], + ], ], ]; } diff --git a/performance/JWE/PBES2HS384A192KWBench.php b/performance/JWE/PBES2HS384A192KWBench.php index 386bed26..6395bef0 100644 --- a/performance/JWE/PBES2HS384A192KWBench.php +++ b/performance/JWE/PBES2HS384A192KWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'PBES2-HS384+A192KW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS384+A192KW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS384+A192KW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS384+A192KW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS384+A192KW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS384+A192KW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS384+A192KW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS384+A192KW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS384+A192KW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS384+A192KW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS384+A192KW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS384+A192KW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,7 +67,9 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"eG8lMbMf784k-Vxb9Da6jci9O6GxT2aH88RhoKkmTslRrlsP6VCPTeQVj7-J0SPfuRYid9tFIft2taBGUKcCVO_Sx7hsQUUu0dvwo1L5F5biOzg0l1EdsSgiDBYAG5-vgHTq2_1SOeqtJ-m9Yk1LV_-SwFEnHd8il02bWq20l7LazfVy4pU1NCdS3Y2qwYET7RZeNetxR09LKf4XNY5GLy-vtDzou3w","iv":"3I-Tv6gEXNbjB48h","tag":"RwNOwY8c_cTHmwyIBckSUQ","aad":"QSxCLEMsRA","protected":"eyJwMnMiOiJaZThzQnUzdnd6Y0ZmVlJXOXhXSVdKN2tGYWxvSS1OUFZZUW85NW9kemF0VFAwRzN0RkVZVGVWVWFqelJzV2xXTGoyWmJXWnpHV2pOQzBsVDRQMVdJdyIsInAyYyI6NDA5NiwiYWxnIjoiUEJFUzItSFMzODQrQTE5MktXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"eGor6-Vqm9qVKpYHTmkZtQuUFeYSdkMmM9nx8_pq_dtm4NVlaXfaZg"}'], + [ + 'input' => '{"ciphertext":"eG8lMbMf784k-Vxb9Da6jci9O6GxT2aH88RhoKkmTslRrlsP6VCPTeQVj7-J0SPfuRYid9tFIft2taBGUKcCVO_Sx7hsQUUu0dvwo1L5F5biOzg0l1EdsSgiDBYAG5-vgHTq2_1SOeqtJ-m9Yk1LV_-SwFEnHd8il02bWq20l7LazfVy4pU1NCdS3Y2qwYET7RZeNetxR09LKf4XNY5GLy-vtDzou3w","iv":"3I-Tv6gEXNbjB48h","tag":"RwNOwY8c_cTHmwyIBckSUQ","aad":"QSxCLEMsRA","protected":"eyJwMnMiOiJaZThzQnUzdnd6Y0ZmVlJXOXhXSVdKN2tGYWxvSS1OUFZZUW85NW9kemF0VFAwRzN0RkVZVGVWVWFqelJzV2xXTGoyWmJXWnpHV2pOQzBsVDRQMVdJdyIsInAyYyI6NDA5NiwiYWxnIjoiUEJFUzItSFMzODQrQTE5MktXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"eGor6-Vqm9qVKpYHTmkZtQuUFeYSdkMmM9nx8_pq_dtm4NVlaXfaZg"}', + ], ]; } @@ -66,10 +77,12 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'oct', - 'k' => 'KuFiR-n2ngkDNZfBXWS6cCGXrYonVUiH', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'oct', + 'k' => 'KuFiR-n2ngkDNZfBXWS6cCGXrYonVUiH', + ]], + ], ], ]; } diff --git a/performance/JWE/PBES2HS512A256KWBench.php b/performance/JWE/PBES2HS512A256KWBench.php index f7255e4a..4dd78960 100644 --- a/performance/JWE/PBES2HS512A256KWBench.php +++ b/performance/JWE/PBES2HS512A256KWBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'PBES2-HS512+A256KW', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS512+A256KW', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS512+A256KW', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS512+A256KW', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS512+A256KW', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS512+A256KW', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS512+A256KW', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS512+A256KW', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS512+A256KW', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS512+A256KW', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'PBES2-HS512+A256KW', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'PBES2-HS512+A256KW', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,7 +67,9 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"GwXyadX97ssIytJawPP4112MOuBSxRXpiH-Ur7wtsThL3f0QZ2mjYoLYbFCql2A4j4avuSHjZH0LrIYX5Tt6zdLPVCZtUj_R_5mlFIfQW5cSVHTKBFLNA_xsn03eU3ANIq2CUdq6Sypk3f9UqJXgxN8XTR4wsFSSM11MEfWU3uSsgR1GTUOw04BPCMONi-gi-Fx1CTlTOGOQngDCNrLEnRR5KQpZ36c","iv":"byyjW61x3VFA2Bbi","tag":"cFjxlfvdpJqDepENC0bGNA","aad":"QSxCLEMsRA","protected":"eyJwMnMiOiI1QzI2YUpCZktVR2ZMaElkY0E0OVVONnNEX05aQnpjNC1xSDc0d1BNc0xhaTZUYnU0RXJRT2JRRFZxWFdtU2JvVzd4aGxFNUJUMkZ3VHFvY21NRHoydyIsInAyYyI6NDA5NiwiYWxnIjoiUEJFUzItSFM1MTIrQTI1NktXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"mxZpygw38j8rYa_qZP3Vb2RZf6n3s--7H1oxECBZGoaC_I0-qERoww"}'], + [ + 'input' => '{"ciphertext":"GwXyadX97ssIytJawPP4112MOuBSxRXpiH-Ur7wtsThL3f0QZ2mjYoLYbFCql2A4j4avuSHjZH0LrIYX5Tt6zdLPVCZtUj_R_5mlFIfQW5cSVHTKBFLNA_xsn03eU3ANIq2CUdq6Sypk3f9UqJXgxN8XTR4wsFSSM11MEfWU3uSsgR1GTUOw04BPCMONi-gi-Fx1CTlTOGOQngDCNrLEnRR5KQpZ36c","iv":"byyjW61x3VFA2Bbi","tag":"cFjxlfvdpJqDepENC0bGNA","aad":"QSxCLEMsRA","protected":"eyJwMnMiOiI1QzI2YUpCZktVR2ZMaElkY0E0OVVONnNEX05aQnpjNC1xSDc0d1BNc0xhaTZUYnU0RXJRT2JRRFZxWFdtU2JvVzd4aGxFNUJUMkZ3VHFvY21NRHoydyIsInAyYyI6NDA5NiwiYWxnIjoiUEJFUzItSFM1MTIrQTI1NktXIiwiZW5jIjoiQTI1NkdDTSJ9","encrypted_key":"mxZpygw38j8rYa_qZP3Vb2RZf6n3s--7H1oxECBZGoaC_I0-qERoww"}', + ], ]; } @@ -66,10 +77,12 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'oct', - 'k' => 'OgUyABAPIkI-zFg3doqsv_GH-4GTGOu3HGnuG9wdxCo', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'oct', + 'k' => 'OgUyABAPIkI-zFg3doqsv_GH-4GTGOu3HGnuG9wdxCo', + ]], + ], ], ]; } diff --git a/performance/JWE/RSA1_5Bench.php b/performance/JWE/RSA1_5Bench.php index 62e6e942..e628b4fc 100644 --- a/performance/JWE/RSA1_5Bench.php +++ b/performance/JWE/RSA1_5Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'RSA1_5', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'RSA1_5', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA1_5', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'RSA1_5', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA1_5', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'RSA1_5', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA1_5', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'RSA1_5', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA1_5', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'RSA1_5', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA1_5', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'RSA1_5', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,24 +67,60 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"2z1-hUCmtdU1It5AmfiJ-3VAc5OHuF7_8fMID9U6viZOTo7prG-OHoAulMYXAuEAh_y295NRSz093E_MO2geP2D9V3goFk6mhiVgGgwVnHk6eD-CM3oQjw_n9FzNRAsVuJkrFY8dFALFfUJOghhHpnPGwAuPCsHWJzCPQ9-N9lT2YQJZKnmrsclVERw_8ITywsfPfgGU0mb8Sh24m2TtUA8RDBtVmiHfAN1aJa0OC_w","iv":"6N4gVau8qYbK3w1JA8Ntwg","tag":"dnijlOO44TBcn-fpPKbchg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"N4aLO3KjTxM3odA-CWd2pxb-EG_LHzvbSkP0hXVlQh9mvP7bQt3FdKgnQUGd6_8P2IxEgYakZi7WemhkYKlxluSEyzymNMQ1RhOPuXcZAx04FVB3uGr5Jw7ig2HrCgG9HoX2Vp_CAb1baCicn4HA9vtH7O7SfUYpBUyyEbBLdYo"}'], - ['input' => '{"ciphertext":"npQhGahpoW-x0M2zo-SMwREnoioINehE62pSP3z6AU0wQpYoDCa51r0RDjrrO290a3x0HoxCzlNUSnZJ_zhYePCTgIv7YJI0LXXcdZ0ImeoSg3OFxUJVuBBHE_tH8Xv4ttDziKUDGlQUeNtfahMtMa80ThTxnWL1jMrEwTWioBsgrAh3orLbNazdKKEzQqyE3hqdoj2BTfe5Vu18lSCUK4EZvYRTM3gUPKFJhmcYRJ4","iv":"tbj0JpNlArzfEDwjStBzfg","tag":"640hn-iRtO6tK_lLpzTB-lxKLm-xCaGk","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"hAcykh0bUdqlIrJB4RP5AiWjxeTH749gHY3giajV5NYpZa2lEXnscF5fjJWB4wXJfFI5gwoSPgoQ2ZeIjjxFqNMe3ionaG_gMmyfLcP7g43uMo9ppNeg0oHhq7LDg55AfSHsJXbMbx_3IfR8EKqpSEBd9a_NqnZX9_Zie16jQZ8"}'], - ['input' => '{"ciphertext":"AmzqGzmRbyfdN4nti5YFtFQc-rpDJTn_rzfkfOxq-Y36b2QMXW6LJbzNfkY7niDI5YpgfELi4cwqJ0eagtoNstYpyOCBCmzKKzWAH6_6Qek2yrKwjEVwEst6OeeC97lg0OuYkcgBwDz-txmdz6lEeBj0X9yJiU6V5Gj8OHjYEl_FqmDRnypeBvYIuuiVAisut4xIeZvOZRN9sn15wuWnD1AGRTZDxCtpiaryaJeOeR4","iv":"EfKTRiKxAU0FRyfyAcMmnQ","tag":"mKWAfC9J8bZ4CMxrQkUH1NKJIkXgAKHQKtPqPZoJPxk","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"oH_69gE8MbmPG61PxU99j1mbwht9aEpXg9-PWp92eHQw8A_q-eVaZ1N_LEUxzmXZ71HvH_kigMqhl7k5GzGpqCR0eka80FuUtCvcfOBtd-MIcW4OfFGyQb71sRE-N7fbqXkQdTVtSqK4ZfjLUbGDTRewkK2YqwjWiK8_20p6ANw"}'], - ['input' => '{"ciphertext":"Jyq1XGPri1anp3kXia0ElK12k6A7B7SNfLJ94g6W1DCXGPZQ-tgf6Ha7l2rezAHDjv9I595sWmTJd7eb-pum_bi2gbfMPCxX3j_7-jNRHZLVWzMZLe_5YH5Tp8I69IRQ-2fbgtGfhe77t2JugkWI03IamdjvvArSErV1neAp7g1W1WQ1SZ6p81ZODbIVlJ6kA9WRFcb9tHmzrK6DOogsyTcFbbnqJ-M","iv":"XxSTUZuJ4Izr_xMK","tag":"3HDxqZ1CdfTYi5umzknang","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"KcPwU6CsXF5kHxWHAuRl-z6qXlPfEv_HxNAp0IlbzBW4Ohk5YTd4QNHJgKhmRlRThC76HOwMLRmFjhq0ZUppvLtId0Ff1ZOxitcdxc52exyKex5tz05WlHIuTVESSoDv_65G4czpb8H3fvyRb4JA1raCfX12g5YwRK-v9wv3laM"}'], - ['input' => '{"ciphertext":"6thPEeJm29Lb7M0v2-e6PKk-ztLYEfICpgwq5kQUgsHscr7pVqxHixMylukiQMuJ14s1TSm7a0s6qaQafz1S39D8jzqSFVJ0100rxGjmQTtlHvF1zO5v-itpVjPdVfMoC6VmZCmntsibPR2GQ61GczX7_TFCGeFwZ5pY7_-oxFZe7JZNj8nbWAKRn8gWXsQKsxQ9l_keA4qg_79UATbPCvJj6D-d8CA","iv":"bsiniVmwmyyWEyN0","tag":"wdrd1r7j8Jxh61YWMMSjFw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"WmC4orIjl4wB0czXIDvE-75NAoq0XlYkDcEczuWhMFNK7sXWUta7rV4-KV8z2DZ94TePx_GXEi-WUQFhl5Py0NcnCioRza31nN368NCv4-i0BFU6RdOw_pR3u8TddZMe-HjgRoUZmNcQR-2_Xg-ccBiHqaZecTN39o_FaGeqibE"}'], - ['input' => '{"ciphertext":"VkrQfQR6Qwm7HiTIeWnVkb4KAfueOKfi4_6bthBwE0kyB1eGntSzTq_4ciFeqdlgsVvNAt4uwD_i8Ji4sOT5Nf8B5EKpDCTr7DdjyRlEzA1_bijS9LO3pwDL2T7zkIjfl_pnNtMGwAflxmTNIVobFLJdhBAVxrj1wOWod8a2aa_lpo_hyiKadng1937s7Wboz0wMlcTeUzUDCJvI57luXBLuLM0cmsI","iv":"yb1EBwSncsmKa5Km","tag":"EJKqSYbBoLxrb533aLrJHw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"SYecg8HD-cFZ-7Dv7zzBDGxa0GUrdv2GEEwcI91cqhTix-hzWDINWkV5RFbAs2KUZFxP05C4OnQKZt-NlqnOPsyoOVnNVfRGa6AGScVZOeEoTjW2ZK-zQ-AiNR-DbHHtqU5vO9j7-ChkyyWpszFdxIJ8FQaYS_RQLBMrPajUAmQ"}'], - ['input' => '{"ciphertext":"WR5oOrLE1p_D5aZeSxvXBL1YI-uzzdDPBrgiCR7Fqm8Oabc17Ak-BsnW579zozTDklDrF-761n0k1BQD4rD7pKfLqa7yCfi8iqNyiIso6WZs9nKcSKYzzIUWnmBJwSdIBZvU7qE38df13GfROWgJPx85zmnIak5GouGBeGGpMi0grCXNvz9Wi9_mbrLSJtg2DaQx7EnsvQ6KlWmHyD1yPyaePaaMhgb8GdxbuPC-cUo","iv":"fBQznXDr10w5YTRrzViD1g","tag":"Qu3XUZJAvLkEZF_1LnqRJg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"sHIFzjVKcLzGYcVv-wD0pac0i86qHLfvLniA0HNjlhk5i3__sWy2fmb4pGc6QB2CNd57RZqezGJEsD6hbO3gHfVJAQ_9z-iaDcjuaYEWaMxdD238wAzZxoWWQQPNYEH1shMNqRaKCvSno4cUG3by-LSbMiB9lknYZMME2reMDQf_yh8AeoajdebxeDnoiivBJw6Z16SyJ9bSbofo9Oam2tFTHfP3xcP7jilWGoYN-weJYkI3RaeXmYkLlMpqWA9BFDJ6e4ZRyR8luOZCfSeRYx7a8dSzm3k-CvY3xXpLSIw3yeBsrrmt5i9mL3MJEcas0kGqouQxdx_LIRFK3qif7A"}'], - ['input' => '{"ciphertext":"Nd_fAzWH92ozXLG0GOCzgeSz65AKftSKxo6crDcJpxYmHS9imQAVogivsDsQaV6yAs4d6wAq35PuT3iXrpNTKN4iXVb3jhBuXwnhz0T8BBCPApfQSHSCvCKc56is4Xk-wZm5ICXt-HYOpUJReAmGNm8JWj_6Pd7b09As9eM9P8oMgmR0Yl42zOXRo9Fcx6SeKKh9CazPmEq-r7aWv3SKJwYCt2U-JasX9Gg6nIrgIoA","iv":"kzQpYng7knFio-iXvNK8OQ","tag":"PVvTtB9RzaQXi7BXekHwdUvNiDtNX_zG","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"NS4ER8RlpoWHd2LnHGLFyx470zQoVesruOc2UQ1eGkCQek45vfjH55vipDNPrOfoEMh_nhNs80xbAZRnDbi01gCESyC7TQXXV94o2pnxNFG-g54fAWZuUr_L9-kQ7GcoCKcl5teLAoOEQevnjcM0RiL8Oo46KNTN7kYL7lXgFuwE-RqxtkcboasYRkxG4qu6MqkKWYsZiFlJ2qxgprXWusF_pc0XrKU_HVh8DU90TyUgIb0PWf25JneX3vK30aUqbmmsQ6S4BBj_ntZyD04fj7O7B2ztYZ_EEayA-c2CzK9PvgN21uuiApAvmNp6TN4d7DIAX3VEeWhgUG-nNwwtkA"}'], - ['input' => '{"ciphertext":"Vo_R3-bg5v6dvuqNuiNEtLX0RqAEfzyTFAXtH342i8yk6JrP2kJSWmvkxxozQklCk-B6geb14mWkf8AviF0WVwvztV6W1WAMQhlEbOhIDUgkiti9jTHOvzE3n3RUlQa1-KZAeIRaF2k_pa7VpjNDciURSrvYz3cuOvKZcjYhYp1ktmbg_CvPo1dcSXuCRDDMlMDjD6lTaxk6iJZwmF6J34DIX8yiF8L7-cz7O1mRxcs","iv":"kH2RiycpQv1R_nKmeNyBmg","tag":"j89wsmugLXDE_EASPMGEMuubBs81PjkJ5A_4Bl-gooY","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"NMklVXQS_cVm2AlyoPoHnFOG1ZV3SBiTQQWq8X8q3uo9lIqWA1xZM5649tgGP3FNi7lqUq5Pe5gSQLrVJmXffPnXxpG_8SBURgXo884YeJxX68KPDb66sfAeBl32saWE7aBC9dXu7HHvWC5Gd9cXa6jjaMRdbkanBdytJH4ybZHfsDvtGep9LkdocdBCLprVDExfhYkXJot10JOHllesqbDAGvZ6acEz1DtnZHKTqSWllC25akHij9aTw-hjIklYjiZKLuA1-fIKuhy_QIYL73GQPKhyHQr5JolaVKkjf4Vb0SvLJeC9uxRNk1Ssww4PR-3IrEMyU7O5iDnMgpqKhQ"}'], - ['input' => '{"ciphertext":"n-MtShwALqIo00cfsiOv8nFqKf2gP9qSxU3bU7RiaTbqNb2DT3Wwe2kR8SY0mGiqJvIv4grznWWgD4XH_WqeFbC7R9lD9kvhP55og2y1IWKtgqKXf8GGtBXW0IJ0uAkhCh78JoACXvgOMMvOkZ5BX9D4pulpn9c1TfsqirtVSZ20bSB9B1ynQQAc9cpVu9OAsqyxSK7G5HLXvmRxmIdW_Ctm1Xr4Vmc","iv":"B---hsTxog0fgWHi","tag":"5NOeOh81BKNlBO1HNCChVQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"J5JGsWDSZcPIqbuGauo23hIK2Q3Q8jAPvy5xxkwjRNu_joOsgtGlJoBZkDfh2YycEPMli5wFOR6QCU4fN9Io7dW0m5Q4fS89fIpaWNmV8u80MD3hjT0ErlVOe07U5h7ry7QiG_zx74lITsUI-2f13cpN1U9QeHhNc71yke8Io5B3ExlbMwxa2cvnoUMBrMFEQy54PIadFbt2SGaN--LTfN2WH2WbVcl7cgcQ_b77EO5KHHb2WtTxi30yH7yO-9fUnANeeP5_Mlz-rBSMXCBS0Vk0HhqmCt6SRLh2IygVH9xkyhsi6kozADcJY1T6sDX01vFAOkcAwsJDKdvREAyZjw"}'], - ['input' => '{"ciphertext":"rxI3D-d0WKE7BlBek_0zsVv6lG-uwCjapLEpMobVeArbo0FWeXOQQunxkFGdH4_I_W_zMxrFu08Ms6hxOQnsmb2BtK6d6YfcA_yMOv05jS8yLLzpDQx5XP6Nmh2oeZsdgHwOxx9P163mnLmmu0mBfNRTCHDLLLYzMhzXaE_3ZKNaLlYgfbV53T7k8PHV0kXtdxj9NeWg6ScGA4i6UdmDmCQLRgfKlkM","iv":"tSSMtSp--qHBtaYO","tag":"AM5_KKNRoEqQX7kkWt60oQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"jHMCQc9sw5MFrU8mD3r44wV9vZqbT7eqARi4WKWJsPbbYtuWtbwgWbMajPmKyMFr472ZmwbBS96VXZH4Lj_rOROSRDe90Q_z4bnnnOIT80JB5v1anp-RJSwwsPzzCw_sSvZXk3Slo3c24eQEMNX6NyV8MP8Rk1iWDaV_zERhT-dM1-PrM-aZxvJPQDmmuTaRKZ4tExONQVclfVRbIeA3AVb-vRKgB9mLJCWWBnVVyhWiTkKet8cEXj7ZVgK80yejm_mBbdQ4KAPAJni1RZa2JWey3NqGZlOimMGeDpUENsLW7ef__z6NMQnLb5vwEayhdr4OFlp59eAI5mLEZRDqpQ"}'], - ['input' => '{"ciphertext":"H1JXUesUD0F3lhxcuQoRhXjmWDvewTFtGEQe5WKZkLi-kbNeXYjmj8qcbm7T9YCRNnhCtjAcefpWZCTeF26tDPunQA0kHHhYkpqZDCpRdzf-6Mxm1IXxscnp0g3om431WQXZmf7FIQEcF6YgYWF4t9twEBfTBBguRhgJCIFZA_7-phYVEG6R1AZ52HACezdoXZIw9FeuK7KNE9LwfBxvB2QWZnxzUms","iv":"id8bvQio2jy4_4xe","tag":"Bp_RLw0GgoXyCVbDjC7_xw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"UpKgao9FkRXKRvWXI6wR1SOkc9ubNW63mmX0JP5MvWx3AZnPKXtAEdM1uB83FTrr5_k9-TGIbvspKFnLDsokFXBG5ry3YwDbbJFcKXk5PWCpZsmwECsq6eG1Ewki7DgUOWjx65ZbDIsIavsLEFtm0J1WBkMBot_mNpVvj2Opx0KaNQqbm-pudplXDzFTqByGgWkw_V5wV8f_k3kmfSncm8Ky1cPKUZTC7_jsD_tFtAIIUewKG_DqK-k-01AZCXE4tmT2CDU8xGW_EFJfbXkHswLC4552xEJ4j0265BoD7mo7-SHaeZ08cWIeEppyOw5osNWrWRhPKPiYSOqRdHsh2g"}'], - ['input' => '{"ciphertext":"G2aTfp1NVbsPZTMxx8HAXsHlrTnJbbZ_dE7hIJPgyQZeGMJXPA3cJwQ-rZN8B6LI23qRooA6lXHWZbxqLZSAUeamENgIfq8jDVFL6LxZPFnuGNT6XY69GF4aph5P4xusk4BHWDFHmQy1GaYlgKlZ2TYb1Hrfm4qWSR6GM2xpxW4RzwfDU0or1d9xsVP8VwCOzx2B9_LIkS1oa5uulzqn0HVcPn-eS1CGCvjhpHqS4EU","iv":"EGXdp5njMEo-JmSKBfjvXQ","tag":"s0qjKqKE7l0TL8oa-hVeKA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"QILFkz0sewJZAFcuKe2hVvO7uuc6kBRiNOcBzhmjKAcs-wSJn5UzFYmeLcWBb658F9YRmN6Xzhe-rtbZJOFlgce8za6V9V71h1h2SgAOGjohflAoacq-a04rcEqhBV3cnH2rMoxcP-OEMYNVa989A8agKq7noYYzRpW6bKLkkddqaQ5XNrRSRPKDWtAMftPEKApdikg1TG5xf-o651sZznZFuvMTN1uMt1A85IPZiDveW8c2sMjGdk7yQnkK8ODhcYsHNNFERsSv3gaae0X_xy8rgu51jZwPocjLaSAK70mTegsJxnk4FAbuYMkfC3ZWm5VXjZTKFhC70A0rbY6sXMTjdBh3uAJXpC7gmg_oKPFse1q3L__KlPJy5vtMFZVT4JN4h9dmOZ4ZPw7X__c8Qat0wbjf7MeFPxfXs0q2ZZ_vPenAHiPqjR26FIj446BeKkg96-NHfqSZmM5aPZCQ6bRO0ODP-uizs3-xGR9k2aCqJmj4nzfGK76fIPMFGKxQxDSq81d_WdKP0Q-0pH4FIyqEf9n8PUzx6yrflEztc4RqnBVy1OAgzF2DsX3WO9ET279WTyFTGAOtF5kpdBduCsKy-YFDyOUQnl1cXYo2iUyGIVqX0K-KwUDACjg_SwAdAT6sc0guW4r_XrSBHPsWXibTgCh8kdDtldUDHOVFcWY"}'], - ['input' => '{"ciphertext":"4P7OnC2zu2tz-kYla3rYjm0BUMaueWOrXSzyuRVwDCg39EPeV8HKMb1IKOtaIg4NVPe7M9KqbF3o3WSj7kcR0IhzMnZATucFJ-8PNkZL4rW5hB0zHTYI-Nw0fcfGzwVN_By5wyG_WQvA5Kw6rSJKnJX8LGohLv6EXQMYal7oiwsOtBw349Pc2vOJ0t6pCjGukwoymkj4l9z2D68UfwCTltfRsG3bQWWwcRtgo8L29Mc","iv":"ln7DkIIZo-pWQ4rKMnkP9w","tag":"6zmLsf0ncVJlpoRZS5Wr-1Rff1rKZD35","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"eXzUvKkJ8a29pNxfK8Q6MJdJV5txMeozw65mz1vNHMopDh-t4tPp36AUAI-EgQ-FI5cB78Eun477tetx-wKcrvkfQr_axYnE5XxWa3F-5pRJ8N7zLpCg5JievqCetBAPHqIdNSD6aFZFPu7vvpGVufoINmpI4lP_OfrWzU5fpe-K3JMkHee05Zdb0dXRsCJleaVr4WgMKvgUPLi_Fyr1vwjCKjM64WocC_Uw1h-GodvgqVI5douR3Hi5cGikUwkOUNhC3e6MhlOyScemnYsFFSVT107X-v7OjGzQvomXEAaczqR7BlgS5dHtSMoPRfsqyw2uPUXE7prZlLfIGSbyQfs7Se_aV4nstWdCmzPWR5uQ7FsSIuB70vv26jr1FoLdzURxZ-gigddet9wnjloGGsCWRYtsxh7SKpaQj1XYZ_M-lsSCWFJFKyA4xFS1SynukYHeZxwTqL_OSnmuBfoMMbuAcRly3j9saTKDtJnU7cgWe1AqIeFFqwAeQH_KWx8W2YSPJInrpAq33MluNVyJXpOFb3P_phF28pejKWJNf5GKWgEmpjQ4k16c7OlO-XOi421UV14Xy9NmIb6uMeVUcPaZzYgMcSVN0ZSeJ8I33p_OaT62rwROO7vRvm9fxuXSgeDhMvjU8pOJQGpaO_2ZGLIAa5GaW7WmnnLyaMBMUdo"}'], - ['input' => '{"ciphertext":"4IBUPfHY19C7v-safTibYSvY_QIYBsi2rfOczWDW-Zn56yL20Iayc3oP8a0gY2e0PSAn9QvOHXhnSRwvfcXggWDBlpM7MCwK6lhhbqYf08vYFibKmB0oy_AAXe8_ysGBwHhPGTFE-uEXnDN4Oa4Q4jCMQ0XNHPDhy7niMrYiz9L26ibF2weGwRue9xpmd-zlNpZ1M8vj96i5VOC1WusJi_cBpfaXQDmCTCB8lhRJnRM","iv":"iDu5jNbgx1uSlv6-nJalzA","tag":"gnOPNV-nqL3qhg-Sn_17IZAyg0fOwr9NAr2ixaly01w","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"scfdJnEBkAX8ZB6rrkzo7urgG6K8ZS2uDqt7R_3MMu8vme-J-sFzrbgMr7oBunAZFECjagB5H7UJuZLQHH23zpcA2F1Xc-YCnIzZuCHCha-elf7u8r4Nev94J_Re3V0DvKpxVhtUVEtMev7WcJ-zCOw2h7Px3qqrvpm58N2prYtPFQuUnC8nbUCCcpxre9nrs3-BzwWTrM70DPO88W-Um4xj1rqeql8ySSCPhtBIS5MWGbKPnb__DT_0_cykKbki_Q73sC5rDMIie3ukGrbzjeUx0ylbt_5ELp9qh4mxP1wz8GwMluASF_XqrTnQQBsAOP13YfeSiNp9QO0xo4FSoGEAfkrXwZG7cCkzVjdg3Zdd9tx4uSGiVkC7-gu5HcChtXuQlfO5PQTW4QbcAP3nXIvZ3bXmU5eeorOp3OPY5NZTVb5A6ypO91glV8vgQZ6pLovmFslWICrZPFktBmKVZJeJqMjlv1ECaItzQSP_qlop5UENupcoRVEyS9ucKOKUEtk8q8eRBtM3EyKC6dlJPxuSp-XCp0fTuQ1jVcIFPrbVnfpbkXAnczxgA0JIgtkil3v_NDsUjEJjR_zH2HJXrRd6cxs7j_EA7En7eNExXdcAVJhWG_yP1Ub9JFv0WQ0op6AoZ0oytq67D6VPvwNgS-A_YxoWhVbgXS8__gvsvN4"}'], - ['input' => '{"ciphertext":"ghUJEwroY_2vst0dkO6Idl8dqhPe6MqMhUmiI3enCxmJIasCSuVbYzy21UMdq0G-2cTveMtn-G8pUzkHKDbrzOFOwsXVzt9ZHag0doc27-INPv4WYkwsikGQL3PnIOzACJHOXafmxyIOI-HQxBR5gvFaK8hQs2rtIQsvmNAlP0BIm6EFBhcrGTc0uOQC2ldPcB0gEEQpTodKKAJ9DyUZcmWYeCr9lvU","iv":"GjgjMuEtJ6HNuJez","tag":"2Khni7fwgCNqJQUB0taMMA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"RfZBDKkFbqRTRm6cI8SIdO_plSKynL_odIP9wuGH9oBjQDkKzyABUKkzCWnVE_hIKgvWzd4ppqmhGog268dBVpwaZXF7berRkwKTdCmIxPydzVcIKUUSx4ib2M3sURj0d169IWkLX4KfQwdaaSkP9T8dpntUDoBW7qgj2zEqLqkI2TDlwDSg5q1PfLb_lxe8nKh4sM_BKoCmrCvyyOzS0gPRjkufj2or6NhUEqHslF2zuzLQjEd_0K2ZxRh4_juNkslIN2Mxh6VM4U7UNoHv3lniudPpG3fM3O9UFkLT50Z_Q5aIWYXIUpk1C8U4CTBPIhZjYEFg_QOrRUb9YazhP31JXMFD3ulrXEz0Q5wuvUbiTf0ijL-K9wDz8AZLg8QGs2fEX9ZVD_9XPfzDOlAzowXGGIBeapz1CWGqF4xnvE3U5knXnNA58VmKfremy-oZInEwMvUBthXnnCKfwsf5tXlXRdHr9kQGDXLU6Q0yjnP-trJzv4JgGpQbB6_IT0KunW2qDYhX6zv3BunxqkNNZTJjhgOdMX6Z22lUVPD1H0Cd9_doftnzKuTa_fl6nDRwXLRWMOlXdTLO3AOhO72nBrhMt-PBwwX9Bpg08nThEPjpD7M5E_iHI9zEf0JM9iDwy3Gph6AKiokNswcQruN_i5eTB37xZ7IeMZA0vQKymU0"}'], - ['input' => '{"ciphertext":"UWxD_tNuJpzQKQslAxWc03d_bB1b5POoImizYv--FQVFuShL-sjeWdm9L8FU87o6P43arC8WoZwrcdJvzfgVVAfuyt6cRvn33RcqhkhjhnLYl30VwaGmXn9LHdYlnVYtzzvaRooMIqX7HXsFarPVRBbGqokHGxCbKYz7ZxUaimbhhZwzkwPXZi1MjuyLgYqlKafpWaaxcLopor_Q_2pBz4OFO3LFHQ8","iv":"k2q1H8i_galIGE79","tag":"sur6mou_q_lXOsZoFz9ylw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"bBh3zO9DlvATiGKbRghq7GnUQJGMQ_vmmcE7gfmysxzHLh-TX42Zwi6JlMZZPnMtPTlkv9EnOLadl0bignpJeWL8ZyE1FwNQ3U0FOnwFA9BLESac7jlX-KExMiAoznZ8_4RIasdAjM0M6v5ED28fBKRWW9co-WAE2Ch90z_Hq-Kr2aNAaYsm3CWcZYErCSp27GCs7FPVWwIo-lGQmesizh6nYhuy3f4ib9T_Utj-vhshW-Vl7xCjqLCI4beI1jiZjRYeHl4bxIKXSVajHoCxa7-w6-xFtzKXto1GWl0lgp9jSLu3gF2wqZ2ZBEvTgCo_LzJjwFEdmVFpKkseHsi0st1DomdDEduLy2ZuL4fbeQuvAA_iTNJZILIAyoTOrmrKXCCyHZsomiw6j_QnSXu07t5clViDUxGqenZplGKPUu_6b-2aim2AEUa8_aZlpzd8xA1zmpP08oM3SaoQtH_1B_VbQoFKHDIBIGMuHiHLoGHE7vZWzPjxEw54kPXGznrRjDdibSAy3egDOMFFJxbIsAYoelgm9S8K5pO-Zi6KiDWKbXYmGmhmlBqYBtEYixbYumvcdyJ-FpwM_hKmG1DfXpqhiH07g6ko8glhIcBr4GgZ3OGugt8NWd3aiykxL1e25rg-4A6FoQMQ6ixp4-8apTapivINP1REPngACEwvAMA"}'], - ['input' => '{"ciphertext":"ImrQwhrkhCHsDqElXFAxDOcSwwv9J4I8Vn-RwYh3BuHEDX2935j-EmASf514il8mM-3KgrIhdE0_etiiSA9st5YfWlxEqAhsFf5FgGZlcyj4_rat3MMapcpfQYYf2a_dQvwQSj7tOrDAtFomYNQMuwbocLpaeQM_Qr8uoRu58fQHBZNF--dgum7gqvTm9Wd6Sdwl88sZeNhuGiU09SAP3NB2U2N-Q_Y","iv":"ZnVjlvwRIAggr5HV","tag":"grHDy7knCmF9itDDm7R9xg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"UPrNyHeO_gw9FmDrzy2nVVKxQj27zmYGiAPBB8pW-I1LbK4RSDKuocjW3ITvwKRA1WnWe3auVMh6M9_yQy7GPejXuS8lCthK3BNdP5Kv3doqQKFyfYdBZ_SS6RZ8NcXoz4FWj5iNF8pbsPCcWeWxDt1J1mPNiHhgRVUBXgqIKKyVBcOoP5ZhrJ9vJXI87PwiEt-awUrg456wI_ai9I3e-8i7hB-C_moauHNeTckMClevlfkNSnTigUNgcripbEDW1hq21ULuy2_xdf8eM_dJsiFaw6uBLJGhG2cEq2Aj0CHGP6c-HHXyBi4PYdGSXICG-RbePTcog05xXL38M7k_s62gQAG4obJJnCo8b0ZNbcUjZrfa8mxnNubFyvj6hSbJ-LaOpSLgH5FPRZcmsopuUvhCAVP-Rb3qm2m7vOrB4vxD9S8zqvfUKql8Rqxq8oPVxhpMXvlPIrOOMkLbVdddcUON_BdA520FlWgCPOXzvLpSXAydOqdy0YZju1P5u8nmHe5wLGnDGpCa7E3OTRyz874TfsHtVY-PytkXttWGS4MF5m_08Vc6NP3DLIBHaUm4UUwDSsagm6kiK3Cq2pIRbrAHGIWRpbimu6vlABNShTU2SyT5caRSVVUBaXmI49SHy7Lmg6BLp_z74p2zHCcP6i_1l6tXVgaUNeDf3D2YWxE"}'], + [ + 'input' => '{"ciphertext":"2z1-hUCmtdU1It5AmfiJ-3VAc5OHuF7_8fMID9U6viZOTo7prG-OHoAulMYXAuEAh_y295NRSz093E_MO2geP2D9V3goFk6mhiVgGgwVnHk6eD-CM3oQjw_n9FzNRAsVuJkrFY8dFALFfUJOghhHpnPGwAuPCsHWJzCPQ9-N9lT2YQJZKnmrsclVERw_8ITywsfPfgGU0mb8Sh24m2TtUA8RDBtVmiHfAN1aJa0OC_w","iv":"6N4gVau8qYbK3w1JA8Ntwg","tag":"dnijlOO44TBcn-fpPKbchg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"N4aLO3KjTxM3odA-CWd2pxb-EG_LHzvbSkP0hXVlQh9mvP7bQt3FdKgnQUGd6_8P2IxEgYakZi7WemhkYKlxluSEyzymNMQ1RhOPuXcZAx04FVB3uGr5Jw7ig2HrCgG9HoX2Vp_CAb1baCicn4HA9vtH7O7SfUYpBUyyEbBLdYo"}', + ], + [ + 'input' => '{"ciphertext":"npQhGahpoW-x0M2zo-SMwREnoioINehE62pSP3z6AU0wQpYoDCa51r0RDjrrO290a3x0HoxCzlNUSnZJ_zhYePCTgIv7YJI0LXXcdZ0ImeoSg3OFxUJVuBBHE_tH8Xv4ttDziKUDGlQUeNtfahMtMa80ThTxnWL1jMrEwTWioBsgrAh3orLbNazdKKEzQqyE3hqdoj2BTfe5Vu18lSCUK4EZvYRTM3gUPKFJhmcYRJ4","iv":"tbj0JpNlArzfEDwjStBzfg","tag":"640hn-iRtO6tK_lLpzTB-lxKLm-xCaGk","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"hAcykh0bUdqlIrJB4RP5AiWjxeTH749gHY3giajV5NYpZa2lEXnscF5fjJWB4wXJfFI5gwoSPgoQ2ZeIjjxFqNMe3ionaG_gMmyfLcP7g43uMo9ppNeg0oHhq7LDg55AfSHsJXbMbx_3IfR8EKqpSEBd9a_NqnZX9_Zie16jQZ8"}', + ], + [ + 'input' => '{"ciphertext":"AmzqGzmRbyfdN4nti5YFtFQc-rpDJTn_rzfkfOxq-Y36b2QMXW6LJbzNfkY7niDI5YpgfELi4cwqJ0eagtoNstYpyOCBCmzKKzWAH6_6Qek2yrKwjEVwEst6OeeC97lg0OuYkcgBwDz-txmdz6lEeBj0X9yJiU6V5Gj8OHjYEl_FqmDRnypeBvYIuuiVAisut4xIeZvOZRN9sn15wuWnD1AGRTZDxCtpiaryaJeOeR4","iv":"EfKTRiKxAU0FRyfyAcMmnQ","tag":"mKWAfC9J8bZ4CMxrQkUH1NKJIkXgAKHQKtPqPZoJPxk","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"oH_69gE8MbmPG61PxU99j1mbwht9aEpXg9-PWp92eHQw8A_q-eVaZ1N_LEUxzmXZ71HvH_kigMqhl7k5GzGpqCR0eka80FuUtCvcfOBtd-MIcW4OfFGyQb71sRE-N7fbqXkQdTVtSqK4ZfjLUbGDTRewkK2YqwjWiK8_20p6ANw"}', + ], + [ + 'input' => '{"ciphertext":"Jyq1XGPri1anp3kXia0ElK12k6A7B7SNfLJ94g6W1DCXGPZQ-tgf6Ha7l2rezAHDjv9I595sWmTJd7eb-pum_bi2gbfMPCxX3j_7-jNRHZLVWzMZLe_5YH5Tp8I69IRQ-2fbgtGfhe77t2JugkWI03IamdjvvArSErV1neAp7g1W1WQ1SZ6p81ZODbIVlJ6kA9WRFcb9tHmzrK6DOogsyTcFbbnqJ-M","iv":"XxSTUZuJ4Izr_xMK","tag":"3HDxqZ1CdfTYi5umzknang","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"KcPwU6CsXF5kHxWHAuRl-z6qXlPfEv_HxNAp0IlbzBW4Ohk5YTd4QNHJgKhmRlRThC76HOwMLRmFjhq0ZUppvLtId0Ff1ZOxitcdxc52exyKex5tz05WlHIuTVESSoDv_65G4czpb8H3fvyRb4JA1raCfX12g5YwRK-v9wv3laM"}', + ], + [ + 'input' => '{"ciphertext":"6thPEeJm29Lb7M0v2-e6PKk-ztLYEfICpgwq5kQUgsHscr7pVqxHixMylukiQMuJ14s1TSm7a0s6qaQafz1S39D8jzqSFVJ0100rxGjmQTtlHvF1zO5v-itpVjPdVfMoC6VmZCmntsibPR2GQ61GczX7_TFCGeFwZ5pY7_-oxFZe7JZNj8nbWAKRn8gWXsQKsxQ9l_keA4qg_79UATbPCvJj6D-d8CA","iv":"bsiniVmwmyyWEyN0","tag":"wdrd1r7j8Jxh61YWMMSjFw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"WmC4orIjl4wB0czXIDvE-75NAoq0XlYkDcEczuWhMFNK7sXWUta7rV4-KV8z2DZ94TePx_GXEi-WUQFhl5Py0NcnCioRza31nN368NCv4-i0BFU6RdOw_pR3u8TddZMe-HjgRoUZmNcQR-2_Xg-ccBiHqaZecTN39o_FaGeqibE"}', + ], + [ + 'input' => '{"ciphertext":"VkrQfQR6Qwm7HiTIeWnVkb4KAfueOKfi4_6bthBwE0kyB1eGntSzTq_4ciFeqdlgsVvNAt4uwD_i8Ji4sOT5Nf8B5EKpDCTr7DdjyRlEzA1_bijS9LO3pwDL2T7zkIjfl_pnNtMGwAflxmTNIVobFLJdhBAVxrj1wOWod8a2aa_lpo_hyiKadng1937s7Wboz0wMlcTeUzUDCJvI57luXBLuLM0cmsI","iv":"yb1EBwSncsmKa5Km","tag":"EJKqSYbBoLxrb533aLrJHw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"SYecg8HD-cFZ-7Dv7zzBDGxa0GUrdv2GEEwcI91cqhTix-hzWDINWkV5RFbAs2KUZFxP05C4OnQKZt-NlqnOPsyoOVnNVfRGa6AGScVZOeEoTjW2ZK-zQ-AiNR-DbHHtqU5vO9j7-ChkyyWpszFdxIJ8FQaYS_RQLBMrPajUAmQ"}', + ], + [ + 'input' => '{"ciphertext":"WR5oOrLE1p_D5aZeSxvXBL1YI-uzzdDPBrgiCR7Fqm8Oabc17Ak-BsnW579zozTDklDrF-761n0k1BQD4rD7pKfLqa7yCfi8iqNyiIso6WZs9nKcSKYzzIUWnmBJwSdIBZvU7qE38df13GfROWgJPx85zmnIak5GouGBeGGpMi0grCXNvz9Wi9_mbrLSJtg2DaQx7EnsvQ6KlWmHyD1yPyaePaaMhgb8GdxbuPC-cUo","iv":"fBQznXDr10w5YTRrzViD1g","tag":"Qu3XUZJAvLkEZF_1LnqRJg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"sHIFzjVKcLzGYcVv-wD0pac0i86qHLfvLniA0HNjlhk5i3__sWy2fmb4pGc6QB2CNd57RZqezGJEsD6hbO3gHfVJAQ_9z-iaDcjuaYEWaMxdD238wAzZxoWWQQPNYEH1shMNqRaKCvSno4cUG3by-LSbMiB9lknYZMME2reMDQf_yh8AeoajdebxeDnoiivBJw6Z16SyJ9bSbofo9Oam2tFTHfP3xcP7jilWGoYN-weJYkI3RaeXmYkLlMpqWA9BFDJ6e4ZRyR8luOZCfSeRYx7a8dSzm3k-CvY3xXpLSIw3yeBsrrmt5i9mL3MJEcas0kGqouQxdx_LIRFK3qif7A"}', + ], + [ + 'input' => '{"ciphertext":"Nd_fAzWH92ozXLG0GOCzgeSz65AKftSKxo6crDcJpxYmHS9imQAVogivsDsQaV6yAs4d6wAq35PuT3iXrpNTKN4iXVb3jhBuXwnhz0T8BBCPApfQSHSCvCKc56is4Xk-wZm5ICXt-HYOpUJReAmGNm8JWj_6Pd7b09As9eM9P8oMgmR0Yl42zOXRo9Fcx6SeKKh9CazPmEq-r7aWv3SKJwYCt2U-JasX9Gg6nIrgIoA","iv":"kzQpYng7knFio-iXvNK8OQ","tag":"PVvTtB9RzaQXi7BXekHwdUvNiDtNX_zG","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"NS4ER8RlpoWHd2LnHGLFyx470zQoVesruOc2UQ1eGkCQek45vfjH55vipDNPrOfoEMh_nhNs80xbAZRnDbi01gCESyC7TQXXV94o2pnxNFG-g54fAWZuUr_L9-kQ7GcoCKcl5teLAoOEQevnjcM0RiL8Oo46KNTN7kYL7lXgFuwE-RqxtkcboasYRkxG4qu6MqkKWYsZiFlJ2qxgprXWusF_pc0XrKU_HVh8DU90TyUgIb0PWf25JneX3vK30aUqbmmsQ6S4BBj_ntZyD04fj7O7B2ztYZ_EEayA-c2CzK9PvgN21uuiApAvmNp6TN4d7DIAX3VEeWhgUG-nNwwtkA"}', + ], + [ + 'input' => '{"ciphertext":"Vo_R3-bg5v6dvuqNuiNEtLX0RqAEfzyTFAXtH342i8yk6JrP2kJSWmvkxxozQklCk-B6geb14mWkf8AviF0WVwvztV6W1WAMQhlEbOhIDUgkiti9jTHOvzE3n3RUlQa1-KZAeIRaF2k_pa7VpjNDciURSrvYz3cuOvKZcjYhYp1ktmbg_CvPo1dcSXuCRDDMlMDjD6lTaxk6iJZwmF6J34DIX8yiF8L7-cz7O1mRxcs","iv":"kH2RiycpQv1R_nKmeNyBmg","tag":"j89wsmugLXDE_EASPMGEMuubBs81PjkJ5A_4Bl-gooY","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"NMklVXQS_cVm2AlyoPoHnFOG1ZV3SBiTQQWq8X8q3uo9lIqWA1xZM5649tgGP3FNi7lqUq5Pe5gSQLrVJmXffPnXxpG_8SBURgXo884YeJxX68KPDb66sfAeBl32saWE7aBC9dXu7HHvWC5Gd9cXa6jjaMRdbkanBdytJH4ybZHfsDvtGep9LkdocdBCLprVDExfhYkXJot10JOHllesqbDAGvZ6acEz1DtnZHKTqSWllC25akHij9aTw-hjIklYjiZKLuA1-fIKuhy_QIYL73GQPKhyHQr5JolaVKkjf4Vb0SvLJeC9uxRNk1Ssww4PR-3IrEMyU7O5iDnMgpqKhQ"}', + ], + [ + 'input' => '{"ciphertext":"n-MtShwALqIo00cfsiOv8nFqKf2gP9qSxU3bU7RiaTbqNb2DT3Wwe2kR8SY0mGiqJvIv4grznWWgD4XH_WqeFbC7R9lD9kvhP55og2y1IWKtgqKXf8GGtBXW0IJ0uAkhCh78JoACXvgOMMvOkZ5BX9D4pulpn9c1TfsqirtVSZ20bSB9B1ynQQAc9cpVu9OAsqyxSK7G5HLXvmRxmIdW_Ctm1Xr4Vmc","iv":"B---hsTxog0fgWHi","tag":"5NOeOh81BKNlBO1HNCChVQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"J5JGsWDSZcPIqbuGauo23hIK2Q3Q8jAPvy5xxkwjRNu_joOsgtGlJoBZkDfh2YycEPMli5wFOR6QCU4fN9Io7dW0m5Q4fS89fIpaWNmV8u80MD3hjT0ErlVOe07U5h7ry7QiG_zx74lITsUI-2f13cpN1U9QeHhNc71yke8Io5B3ExlbMwxa2cvnoUMBrMFEQy54PIadFbt2SGaN--LTfN2WH2WbVcl7cgcQ_b77EO5KHHb2WtTxi30yH7yO-9fUnANeeP5_Mlz-rBSMXCBS0Vk0HhqmCt6SRLh2IygVH9xkyhsi6kozADcJY1T6sDX01vFAOkcAwsJDKdvREAyZjw"}', + ], + [ + 'input' => '{"ciphertext":"rxI3D-d0WKE7BlBek_0zsVv6lG-uwCjapLEpMobVeArbo0FWeXOQQunxkFGdH4_I_W_zMxrFu08Ms6hxOQnsmb2BtK6d6YfcA_yMOv05jS8yLLzpDQx5XP6Nmh2oeZsdgHwOxx9P163mnLmmu0mBfNRTCHDLLLYzMhzXaE_3ZKNaLlYgfbV53T7k8PHV0kXtdxj9NeWg6ScGA4i6UdmDmCQLRgfKlkM","iv":"tSSMtSp--qHBtaYO","tag":"AM5_KKNRoEqQX7kkWt60oQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"jHMCQc9sw5MFrU8mD3r44wV9vZqbT7eqARi4WKWJsPbbYtuWtbwgWbMajPmKyMFr472ZmwbBS96VXZH4Lj_rOROSRDe90Q_z4bnnnOIT80JB5v1anp-RJSwwsPzzCw_sSvZXk3Slo3c24eQEMNX6NyV8MP8Rk1iWDaV_zERhT-dM1-PrM-aZxvJPQDmmuTaRKZ4tExONQVclfVRbIeA3AVb-vRKgB9mLJCWWBnVVyhWiTkKet8cEXj7ZVgK80yejm_mBbdQ4KAPAJni1RZa2JWey3NqGZlOimMGeDpUENsLW7ef__z6NMQnLb5vwEayhdr4OFlp59eAI5mLEZRDqpQ"}', + ], + [ + 'input' => '{"ciphertext":"H1JXUesUD0F3lhxcuQoRhXjmWDvewTFtGEQe5WKZkLi-kbNeXYjmj8qcbm7T9YCRNnhCtjAcefpWZCTeF26tDPunQA0kHHhYkpqZDCpRdzf-6Mxm1IXxscnp0g3om431WQXZmf7FIQEcF6YgYWF4t9twEBfTBBguRhgJCIFZA_7-phYVEG6R1AZ52HACezdoXZIw9FeuK7KNE9LwfBxvB2QWZnxzUms","iv":"id8bvQio2jy4_4xe","tag":"Bp_RLw0GgoXyCVbDjC7_xw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"UpKgao9FkRXKRvWXI6wR1SOkc9ubNW63mmX0JP5MvWx3AZnPKXtAEdM1uB83FTrr5_k9-TGIbvspKFnLDsokFXBG5ry3YwDbbJFcKXk5PWCpZsmwECsq6eG1Ewki7DgUOWjx65ZbDIsIavsLEFtm0J1WBkMBot_mNpVvj2Opx0KaNQqbm-pudplXDzFTqByGgWkw_V5wV8f_k3kmfSncm8Ky1cPKUZTC7_jsD_tFtAIIUewKG_DqK-k-01AZCXE4tmT2CDU8xGW_EFJfbXkHswLC4552xEJ4j0265BoD7mo7-SHaeZ08cWIeEppyOw5osNWrWRhPKPiYSOqRdHsh2g"}', + ], + [ + 'input' => '{"ciphertext":"G2aTfp1NVbsPZTMxx8HAXsHlrTnJbbZ_dE7hIJPgyQZeGMJXPA3cJwQ-rZN8B6LI23qRooA6lXHWZbxqLZSAUeamENgIfq8jDVFL6LxZPFnuGNT6XY69GF4aph5P4xusk4BHWDFHmQy1GaYlgKlZ2TYb1Hrfm4qWSR6GM2xpxW4RzwfDU0or1d9xsVP8VwCOzx2B9_LIkS1oa5uulzqn0HVcPn-eS1CGCvjhpHqS4EU","iv":"EGXdp5njMEo-JmSKBfjvXQ","tag":"s0qjKqKE7l0TL8oa-hVeKA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"QILFkz0sewJZAFcuKe2hVvO7uuc6kBRiNOcBzhmjKAcs-wSJn5UzFYmeLcWBb658F9YRmN6Xzhe-rtbZJOFlgce8za6V9V71h1h2SgAOGjohflAoacq-a04rcEqhBV3cnH2rMoxcP-OEMYNVa989A8agKq7noYYzRpW6bKLkkddqaQ5XNrRSRPKDWtAMftPEKApdikg1TG5xf-o651sZznZFuvMTN1uMt1A85IPZiDveW8c2sMjGdk7yQnkK8ODhcYsHNNFERsSv3gaae0X_xy8rgu51jZwPocjLaSAK70mTegsJxnk4FAbuYMkfC3ZWm5VXjZTKFhC70A0rbY6sXMTjdBh3uAJXpC7gmg_oKPFse1q3L__KlPJy5vtMFZVT4JN4h9dmOZ4ZPw7X__c8Qat0wbjf7MeFPxfXs0q2ZZ_vPenAHiPqjR26FIj446BeKkg96-NHfqSZmM5aPZCQ6bRO0ODP-uizs3-xGR9k2aCqJmj4nzfGK76fIPMFGKxQxDSq81d_WdKP0Q-0pH4FIyqEf9n8PUzx6yrflEztc4RqnBVy1OAgzF2DsX3WO9ET279WTyFTGAOtF5kpdBduCsKy-YFDyOUQnl1cXYo2iUyGIVqX0K-KwUDACjg_SwAdAT6sc0guW4r_XrSBHPsWXibTgCh8kdDtldUDHOVFcWY"}', + ], + [ + 'input' => '{"ciphertext":"4P7OnC2zu2tz-kYla3rYjm0BUMaueWOrXSzyuRVwDCg39EPeV8HKMb1IKOtaIg4NVPe7M9KqbF3o3WSj7kcR0IhzMnZATucFJ-8PNkZL4rW5hB0zHTYI-Nw0fcfGzwVN_By5wyG_WQvA5Kw6rSJKnJX8LGohLv6EXQMYal7oiwsOtBw349Pc2vOJ0t6pCjGukwoymkj4l9z2D68UfwCTltfRsG3bQWWwcRtgo8L29Mc","iv":"ln7DkIIZo-pWQ4rKMnkP9w","tag":"6zmLsf0ncVJlpoRZS5Wr-1Rff1rKZD35","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"eXzUvKkJ8a29pNxfK8Q6MJdJV5txMeozw65mz1vNHMopDh-t4tPp36AUAI-EgQ-FI5cB78Eun477tetx-wKcrvkfQr_axYnE5XxWa3F-5pRJ8N7zLpCg5JievqCetBAPHqIdNSD6aFZFPu7vvpGVufoINmpI4lP_OfrWzU5fpe-K3JMkHee05Zdb0dXRsCJleaVr4WgMKvgUPLi_Fyr1vwjCKjM64WocC_Uw1h-GodvgqVI5douR3Hi5cGikUwkOUNhC3e6MhlOyScemnYsFFSVT107X-v7OjGzQvomXEAaczqR7BlgS5dHtSMoPRfsqyw2uPUXE7prZlLfIGSbyQfs7Se_aV4nstWdCmzPWR5uQ7FsSIuB70vv26jr1FoLdzURxZ-gigddet9wnjloGGsCWRYtsxh7SKpaQj1XYZ_M-lsSCWFJFKyA4xFS1SynukYHeZxwTqL_OSnmuBfoMMbuAcRly3j9saTKDtJnU7cgWe1AqIeFFqwAeQH_KWx8W2YSPJInrpAq33MluNVyJXpOFb3P_phF28pejKWJNf5GKWgEmpjQ4k16c7OlO-XOi421UV14Xy9NmIb6uMeVUcPaZzYgMcSVN0ZSeJ8I33p_OaT62rwROO7vRvm9fxuXSgeDhMvjU8pOJQGpaO_2ZGLIAa5GaW7WmnnLyaMBMUdo"}', + ], + [ + 'input' => '{"ciphertext":"4IBUPfHY19C7v-safTibYSvY_QIYBsi2rfOczWDW-Zn56yL20Iayc3oP8a0gY2e0PSAn9QvOHXhnSRwvfcXggWDBlpM7MCwK6lhhbqYf08vYFibKmB0oy_AAXe8_ysGBwHhPGTFE-uEXnDN4Oa4Q4jCMQ0XNHPDhy7niMrYiz9L26ibF2weGwRue9xpmd-zlNpZ1M8vj96i5VOC1WusJi_cBpfaXQDmCTCB8lhRJnRM","iv":"iDu5jNbgx1uSlv6-nJalzA","tag":"gnOPNV-nqL3qhg-Sn_17IZAyg0fOwr9NAr2ixaly01w","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"scfdJnEBkAX8ZB6rrkzo7urgG6K8ZS2uDqt7R_3MMu8vme-J-sFzrbgMr7oBunAZFECjagB5H7UJuZLQHH23zpcA2F1Xc-YCnIzZuCHCha-elf7u8r4Nev94J_Re3V0DvKpxVhtUVEtMev7WcJ-zCOw2h7Px3qqrvpm58N2prYtPFQuUnC8nbUCCcpxre9nrs3-BzwWTrM70DPO88W-Um4xj1rqeql8ySSCPhtBIS5MWGbKPnb__DT_0_cykKbki_Q73sC5rDMIie3ukGrbzjeUx0ylbt_5ELp9qh4mxP1wz8GwMluASF_XqrTnQQBsAOP13YfeSiNp9QO0xo4FSoGEAfkrXwZG7cCkzVjdg3Zdd9tx4uSGiVkC7-gu5HcChtXuQlfO5PQTW4QbcAP3nXIvZ3bXmU5eeorOp3OPY5NZTVb5A6ypO91glV8vgQZ6pLovmFslWICrZPFktBmKVZJeJqMjlv1ECaItzQSP_qlop5UENupcoRVEyS9ucKOKUEtk8q8eRBtM3EyKC6dlJPxuSp-XCp0fTuQ1jVcIFPrbVnfpbkXAnczxgA0JIgtkil3v_NDsUjEJjR_zH2HJXrRd6cxs7j_EA7En7eNExXdcAVJhWG_yP1Ub9JFv0WQ0op6AoZ0oytq67D6VPvwNgS-A_YxoWhVbgXS8__gvsvN4"}', + ], + [ + 'input' => '{"ciphertext":"ghUJEwroY_2vst0dkO6Idl8dqhPe6MqMhUmiI3enCxmJIasCSuVbYzy21UMdq0G-2cTveMtn-G8pUzkHKDbrzOFOwsXVzt9ZHag0doc27-INPv4WYkwsikGQL3PnIOzACJHOXafmxyIOI-HQxBR5gvFaK8hQs2rtIQsvmNAlP0BIm6EFBhcrGTc0uOQC2ldPcB0gEEQpTodKKAJ9DyUZcmWYeCr9lvU","iv":"GjgjMuEtJ6HNuJez","tag":"2Khni7fwgCNqJQUB0taMMA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"RfZBDKkFbqRTRm6cI8SIdO_plSKynL_odIP9wuGH9oBjQDkKzyABUKkzCWnVE_hIKgvWzd4ppqmhGog268dBVpwaZXF7berRkwKTdCmIxPydzVcIKUUSx4ib2M3sURj0d169IWkLX4KfQwdaaSkP9T8dpntUDoBW7qgj2zEqLqkI2TDlwDSg5q1PfLb_lxe8nKh4sM_BKoCmrCvyyOzS0gPRjkufj2or6NhUEqHslF2zuzLQjEd_0K2ZxRh4_juNkslIN2Mxh6VM4U7UNoHv3lniudPpG3fM3O9UFkLT50Z_Q5aIWYXIUpk1C8U4CTBPIhZjYEFg_QOrRUb9YazhP31JXMFD3ulrXEz0Q5wuvUbiTf0ijL-K9wDz8AZLg8QGs2fEX9ZVD_9XPfzDOlAzowXGGIBeapz1CWGqF4xnvE3U5knXnNA58VmKfremy-oZInEwMvUBthXnnCKfwsf5tXlXRdHr9kQGDXLU6Q0yjnP-trJzv4JgGpQbB6_IT0KunW2qDYhX6zv3BunxqkNNZTJjhgOdMX6Z22lUVPD1H0Cd9_doftnzKuTa_fl6nDRwXLRWMOlXdTLO3AOhO72nBrhMt-PBwwX9Bpg08nThEPjpD7M5E_iHI9zEf0JM9iDwy3Gph6AKiokNswcQruN_i5eTB37xZ7IeMZA0vQKymU0"}', + ], + [ + 'input' => '{"ciphertext":"UWxD_tNuJpzQKQslAxWc03d_bB1b5POoImizYv--FQVFuShL-sjeWdm9L8FU87o6P43arC8WoZwrcdJvzfgVVAfuyt6cRvn33RcqhkhjhnLYl30VwaGmXn9LHdYlnVYtzzvaRooMIqX7HXsFarPVRBbGqokHGxCbKYz7ZxUaimbhhZwzkwPXZi1MjuyLgYqlKafpWaaxcLopor_Q_2pBz4OFO3LFHQ8","iv":"k2q1H8i_galIGE79","tag":"sur6mou_q_lXOsZoFz9ylw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"bBh3zO9DlvATiGKbRghq7GnUQJGMQ_vmmcE7gfmysxzHLh-TX42Zwi6JlMZZPnMtPTlkv9EnOLadl0bignpJeWL8ZyE1FwNQ3U0FOnwFA9BLESac7jlX-KExMiAoznZ8_4RIasdAjM0M6v5ED28fBKRWW9co-WAE2Ch90z_Hq-Kr2aNAaYsm3CWcZYErCSp27GCs7FPVWwIo-lGQmesizh6nYhuy3f4ib9T_Utj-vhshW-Vl7xCjqLCI4beI1jiZjRYeHl4bxIKXSVajHoCxa7-w6-xFtzKXto1GWl0lgp9jSLu3gF2wqZ2ZBEvTgCo_LzJjwFEdmVFpKkseHsi0st1DomdDEduLy2ZuL4fbeQuvAA_iTNJZILIAyoTOrmrKXCCyHZsomiw6j_QnSXu07t5clViDUxGqenZplGKPUu_6b-2aim2AEUa8_aZlpzd8xA1zmpP08oM3SaoQtH_1B_VbQoFKHDIBIGMuHiHLoGHE7vZWzPjxEw54kPXGznrRjDdibSAy3egDOMFFJxbIsAYoelgm9S8K5pO-Zi6KiDWKbXYmGmhmlBqYBtEYixbYumvcdyJ-FpwM_hKmG1DfXpqhiH07g6ko8glhIcBr4GgZ3OGugt8NWd3aiykxL1e25rg-4A6FoQMQ6ixp4-8apTapivINP1REPngACEwvAMA"}', + ], + [ + 'input' => '{"ciphertext":"ImrQwhrkhCHsDqElXFAxDOcSwwv9J4I8Vn-RwYh3BuHEDX2935j-EmASf514il8mM-3KgrIhdE0_etiiSA9st5YfWlxEqAhsFf5FgGZlcyj4_rat3MMapcpfQYYf2a_dQvwQSj7tOrDAtFomYNQMuwbocLpaeQM_Qr8uoRu58fQHBZNF--dgum7gqvTm9Wd6Sdwl88sZeNhuGiU09SAP3NB2U2N-Q_Y","iv":"ZnVjlvwRIAggr5HV","tag":"grHDy7knCmF9itDDm7R9xg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"UPrNyHeO_gw9FmDrzy2nVVKxQj27zmYGiAPBB8pW-I1LbK4RSDKuocjW3ITvwKRA1WnWe3auVMh6M9_yQy7GPejXuS8lCthK3BNdP5Kv3doqQKFyfYdBZ_SS6RZ8NcXoz4FWj5iNF8pbsPCcWeWxDt1J1mPNiHhgRVUBXgqIKKyVBcOoP5ZhrJ9vJXI87PwiEt-awUrg456wI_ai9I3e-8i7hB-C_moauHNeTckMClevlfkNSnTigUNgcripbEDW1hq21ULuy2_xdf8eM_dJsiFaw6uBLJGhG2cEq2Aj0CHGP6c-HHXyBi4PYdGSXICG-RbePTcog05xXL38M7k_s62gQAG4obJJnCo8b0ZNbcUjZrfa8mxnNubFyvj6hSbJ-LaOpSLgH5FPRZcmsopuUvhCAVP-Rb3qm2m7vOrB4vxD9S8zqvfUKql8Rqxq8oPVxhpMXvlPIrOOMkLbVdddcUON_BdA520FlWgCPOXzvLpSXAydOqdy0YZju1P5u8nmHe5wLGnDGpCa7E3OTRyz874TfsHtVY-PytkXttWGS4MF5m_08Vc6NP3DLIBHaUm4UUwDSsagm6kiK3Cq2pIRbrAHGIWRpbimu6vlABNShTU2SyT5caRSVVUBaXmI49SHy7Lmg6BLp_z74p2zHCcP6i_1l6tXVgaUNeDf3D2YWxE"}', + ], ]; } @@ -83,37 +128,39 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'RSA', - 'n' => 'p_Gffumd-Rj-hrWEKMZdfOw0JZci3dfVCkLYYISt60ajg8aktRR6Rc_1m_NMPIP2_BK5kXwWb74lqLh-x0iunfpgxHWnw4Wy00V2YwR0MtgbRW4JYyJjw9Fj7QooWdqRV7OoJb3VIpmBqr-JKjTV-91W6jPWcQNsUFYL5JsJ-sM', - 'e' => 'AQAB', - 'd' => 'pYj2sexpJj8pmfPOaTZkrZ5QJAEdf9aeiTer-S6uEqqUv22LqWSexLMfHvEn4rocNwfp2umZX9jnW69GXv1YBouBqrnN4vANPnjFp8y7ejKO_XDzKrf2c5YMgm7l4eE6aCHzEn2kFy971f97HN07KfiHNTln9boNGVsA6TpVrhk', - 'p' => '2zIyk5fQMKC7vHqDCGQ-xEXRgiTZsQ2fN5gQ7rDsvGJdDBfpeWA8H3_bidSCNfAskSyhLoEFwQplARblm74BVQ', - 'q' => 'xCRtcvPKTJ_uRZ2kxn8zMlETXcq1CBbuMLhZDl4QT6ksgAoOqnqITwckSXL2sTXTmDwgtuB1HYXk4TAXhwbrtw', - 'dp' => 'EVJfMtCtcBpTm6pmznP1jdcinlFBLr-v1FndBK_QlXaEed8t4Rycw7R76eF0RMTtEK_hMOabSM0EfFiN3ofeXQ', - 'dq' => 'rA5MWEcU0YyFhlnYHiucrGnEdEUJ8pOy09gSfvDym_6Jw7OO0-rywWhBY5DOZ_sQpv0vsVxKP-ChOwxlxxPCFw', - 'qi' => 'FKqVgknFuntcWE0b4NSoqROngDbxLd-lQ2DWg9z7G-knJTizDwj_7tSlNbqYlcbXXNf5vRnhQCePb4KqKyPh8Q', - ], [ - 'kty' => 'RSA', - 'n' => 'slVGbcg7Mr_tQmfDJAIWrlWjBWpi_JzGTjCCVZGOikH3ekkUEH8TN39WJ2HXBwSNmT4bh8eRJsUyBKYr8yz3UdEUJxloo2SVZEN0rXh2Jb84OdObom1CFbPg4yQOvLN57pE06zc7GzQ1MKF2dqRFvyEyibKcs3V6J2DjvDXbxJAnTOmxWjLRKa6v9aKrNCakK_qSRzEwR-IbNnGHSrQr1RaDQ2gQ7FuVuNOJe8rrdlP1dIdg3ElzvDgjg3NY54b8SqwThXt8gRM1VKg5O-6fRdHLPS4L0DOElDlc8lboqA6oI1187cbLq__4P8c1pordIBmHXdbSd-4Q1BYnNVqfoQ', - 'e' => 'AQAB', - 'd' => 'rhaTB06lg5ha3C2BESC81XkiCIJfmWzOJbwzL6dFd_CHz6eRX709nDrBdvaLO_2U4VkA9R67sxZkCqfRVbW6xfMN8lFalc72C4fSWhmzdIvkLodFcl2oWplb20Dy5gFq8ZptB4XGPHtNxWiJxa39rGSS-lsToBj5o4FxL-V_4bSZOLWLfUIaFS5xJ4xZ6rLAH1gd8AlUbQfcwToDCjzyWSZDHFqCtOr10tD_3OeK_SdQoG4FGpnNo4WdUstTRTIYGaN8N_ThJh-f7bWUomEuBFhKT6FCXkxHbPfq1t3q9YhQBmg2_Jw9gUWD4lukPDpvdp-_blMRqs-9JNkL8plEsQ', - 'p' => '53OBPF6RmswOMkuK8MhXjLT5NNCaFce9rKkpK-8KHK7UqVHqW006mzJ3kYVm2nIFODCqSO6RZcmEhLgrpZhAqbOl07lvh5nhhiXJyjaw6rcCumKTbjfX8dksnxHG2ik0Y8-1PHJwhIRHrjAeuf17XHgaATKOSxDVYSk-A7MClFU', - 'q' => 'xT96R1C3y4zakgYWdThV9fn4sFgrlUFWrcMiis5dldl2k8aQrRCXRzWUNMK9G12ibBnXipVT24ZOQKJ0bqeoMU6aopY4DlsyWSzCEfJ6ojSE6Jd-Wnwb5TglNhXTq2wPjkpdbGTum7UeXYhdCJdwhc1GUkIU3ctTquY4isuyih0', - 'dp' => 'f6oJbfgnzj-h0QI0KC4JhJZKI2SwqTTcnYFNMWuPo1SX_rEtWKEXo4VJyJ3RpspfsKe_Na1Jy-BE1UQU5yk8-Z4a6NcO-rfZWro7POu_2CeMPKyk75Wj6kXFRBR1H968hBWMvUPOZnnkY-Ms_6AezFl-1oxBSoyFditehoHV-WU', - 'dq' => 'eoEtMaOpMwt9KFoNkqn1gXrKAMQR9XYKHotmJa17pDjWk3ssmcAHJJvbO1WDW76wxNDb9F9AIMRuT2hWRe9s34rBMZ94mzn6sDXDJqBhl-JkdYy5Vftk290eB1RRDVNk6eu30D1zkFNR06eAmHht0zwlo6sVCJdilG69yT4v2eU', - 'qi' => '5vefHlL9JtiX-FBMYT6CSo51c-tonow5cj3Jl1crRuxod6zjXM13dr4bki40MT_ZQ8x1kjerFuoA1fYyktTAQnRgcafjYyZJIkh3RdGLf-_kDQ_up6v-k4IEile3RM_XST5lyq1ei6UuRO5NQDa5L9OctY5QWDz-rw9_51iKSUg', - ], [ - 'kty' => 'RSA', - 'n' => 'zBlgpPT7LeCKZbaRoX5iENY338bavaU-d_vw6xF4hYhqSBYoH2mt5WPeIW-lz9o1xlbxw-W6YnlHMuJfefnXOvZfFUNOK5-QGBq8ZJY7sfNJ0vxHJ2FJ8cNvpChTEqG7CRU6ZK_V2h5XuQFg4FGASbEgiJjRoPHrXwwts_e1ICIsW0Lg_YGBOk8RqlzguD-NcexYpO_N0VV-J5J5jlVxAEdVgddT-d9sGBx2Vq3PE3D8ZMTZ6UXTvmmdGK_CA-0Y7ep3UgYKVRmv2XLwwsmPWYJy8Ky9wqTnt58Lz5H6iZAGmgEztaf7hB-hRymDTFRWn2-zFhd1-TdqQ6xgZyfA4Qp7vFe1s9LZr_A-jFN2ZO7sP2x6e0dVDszzo0dJ41jrY4aP19hpOnPcXQ0sqjzahLmajekmtM3GjqBd9-bODXqCWiOhzc5Tl4Ru7_N1FEqUXVwBJhWelChez6DVTMeNdIJVw36ARtVNdsBwNTLK8q8n72cc_zwBmhFkGBdxHercMjmD1YJAaRfXfh8OJBbFJDSZkMp4N5PwK2iM4oy79xTsB61OZfEcwf1F4LKSDyyvJC5Mg1_Imc311nAdsDohBQMZquh-V73c6DhhBBRaAKk1esQoGUgLVBXsfR2RABr28WFM8RmOZKRdpI9AJO-6Z8X7a4JHCldljpyOX4mwWG8', - 'e' => 'AQAB', - 'd' => 'WS-lua-Lqyp5j6TN0oIFnFHfrJuarlBtEcU4K6BAyCkqOEHmWoO1h42yXW4KSN-TrA4GK5JRdgKFCEk_a2-vi4ZpWkNE_28EamQUeufjQgmL8vRmq2CqDUlXmaY9VuDxeDCcia8EhgHIV4GwsZUruAf8rXQJ9oiAT9JkjkXqEhacx2xcIKrcq3wtvgJD-H9c8bFTsw9PIvB25hftojLX5EVHqitL-N6Wv5qAY7Qjzt0KjYYvqu3mb0h7a3QyFcEfqadRaLhW_4TwANdnOdcWGwkT7POvIEUrNGP9p0Ck-EPFfrqTvAehssSXlx8eztXz3EvVOAwcc0Cx4MyMe8c1UtmKaXu7_v719irOXtECAtr7FfK_ycFA9dVQbKKBkj4MAidfgSLm5m9Ago8QnuyPHHktCcMzOeQNe6eY97rrBNpI3XEJJM97hnaIn1_g-poQgrnpYSZhTsDaKe9-ls8sD6RMqWHnVGe_bXsNfdi5G3iMqXAY94l0Eqrr_jTXdkmA-xTBCFfHcCLm5RDRBgc1zVYkl5d8rW822pyN4hfJsV1JR0KAltUQ2TCFR6fo0e6Ne-YbZDBHHPAD_s3m-2zSXSlODIG-bqR7beb8Ta9kjZo0advMbo4HjcY_qqd5KIY3HuyQWUGMABg96w_JxgFXEQVp3a6XQJaewQSRhsxTtGE', - 'p' => '6l8TYYzb7VxrUFtKBbF1dTFjsRmAOajL6BGNB0Yyw0smZUEZL-HHeW3NzN4qB03oVUnNeAKKOde3-8mgDxi1qzB6ytqhJqrv0iRpsDJax7OP_F47um33nWcsipCHmzczM7f8HBmzD_beoMPGvsoUAzNIv9Ka0dz-1hQqz5etiKSMMwozAnUj_TqPLedc4DG6EaW8x_vgNfW-_puK-IzwsT5YjltQ8weufNxLlrT2sx9QT05jbxe2YR2ijNgvKxo-G0wz9A8pn5wiPB3NsdsHAy3mrtjMEjwv_Z65y0XPPO1W1Bp68XICknzghgTc7nZR_31NSrtEPmQBlJqoJPis-Q', - 'q' => '3u8h8WiXSx6AtPGQpvmNebZqi66ITQcAhvdF8O_I1LdjswBTZwpXqKXb5kLBPXOAH6YqgxURNwZZ4M5Ys6iv66jVzPbSU_MMHlsiXzgeVfUxwbdOHpiZhRzoB2gzznfFDKR8bu1S07tYePeaEwplsSg2Vb5tC81uNIM1sshfeuDO5cZOH8DmuJzTjhGjb8CWmbgLnFOSBuPl-Vcr3oYVCnWzvEfCgUIy5tC9KeBC8Qe3O841SjbN3yZ8EEXwcUmo9lOt19s3LKBmtT94SXtok6-wHVWlL3YbzRg1kl8SVjN28NJd990mjPhjqBK8KyChCxoPn8lIXEUwGwFmIz4Spw', - 'dp' => 'tYIqXVscnAf-KD565kvX_ongfjCUqJL8T97_zIlmGO8jbjlrSzTdKkKKpsXL4NpKO3srwGyfJkrVdw9ggTCOyWSDRITrVyn9D08Z9tYYjh6XPUixkyFFKkbULP_ftaqbYct0WULh9VQoeHMGgY24z_2wsrZlJnCzf5Ig0aLTR0bAOWsFtDqKQ7xNVKygthRs2Ov1dx-vNbr7Tu2hQ_rLEUmKhb1cxMrHLHXjqHS_tlti8_huc4P2v-GWmON4LDZnsPZkKfhwMOdXcB1Yxwwssx6iT_kgmmK4e_-oPi_zXmkk3KEhY8n7Cf3iWIh9ncROnsIo0N6U7IjA3Jil7fQU6Q', - 'dq' => 'kYMy-5jST_Tr-69FRMfU4WIA74WPb_-nB3F1VIue4cGGMPuAdNxaVTlVbFmcOlkegwn566-fmfPqTINDgJkVotOEIhHlPWiCO3ou2EoP-vldbd0Q_4WJh0pT5SnNzvF8TAE9O0Zq7sr1N5geGFmMAPOHa7YtBSwkx9_w9-4z7Ee6pF4o9i76KfwrVisLK9FgO5vW8EXYJekxXevZNZj9OOOU2stYGPi1stUC88duylbH8iBpxjQ5cnNzPUf5Zmi3AXmjGib7P4S_JYT1JbmIjAV8Bdm2RWFpShiINy8ZD-ztsMkPDs9p70_d9IGuEtRsaYusMRa3xYpfmPDz0wMcNw', - 'qi' => 'sEHok5K2HG0q6JdNzHB7FsM9EJxY7c6Gkya3Lfr1Rr5OYPcAosEIZpl-1_hCQ3MLGKT9UlYjZrlyt6SOUvCkxFX9slDZQeagmlSNMyWs18U0MxhFpEGthqLthS6ik0kFlschiSpMMyKVI8kgQR3OjMDcA_Mr92gZ9fl-mhtl2yfXJsBIkFBD7yOyxRxawy7v05RehoDHmdy2cnzaakPvg3Cekma2mfdjYgN5JnS0A20pC1zfoqi0D3B4KGrYVZhyJRnBakOUmwvE8rfmcjThx169LiAea6SYs7k9jwUCVWrNexXItxGdbQbbrb-FUotAcAQSDr6hHU8H79gN63WoOQ', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'RSA', + 'n' => 'p_Gffumd-Rj-hrWEKMZdfOw0JZci3dfVCkLYYISt60ajg8aktRR6Rc_1m_NMPIP2_BK5kXwWb74lqLh-x0iunfpgxHWnw4Wy00V2YwR0MtgbRW4JYyJjw9Fj7QooWdqRV7OoJb3VIpmBqr-JKjTV-91W6jPWcQNsUFYL5JsJ-sM', + 'e' => 'AQAB', + 'd' => 'pYj2sexpJj8pmfPOaTZkrZ5QJAEdf9aeiTer-S6uEqqUv22LqWSexLMfHvEn4rocNwfp2umZX9jnW69GXv1YBouBqrnN4vANPnjFp8y7ejKO_XDzKrf2c5YMgm7l4eE6aCHzEn2kFy971f97HN07KfiHNTln9boNGVsA6TpVrhk', + 'p' => '2zIyk5fQMKC7vHqDCGQ-xEXRgiTZsQ2fN5gQ7rDsvGJdDBfpeWA8H3_bidSCNfAskSyhLoEFwQplARblm74BVQ', + 'q' => 'xCRtcvPKTJ_uRZ2kxn8zMlETXcq1CBbuMLhZDl4QT6ksgAoOqnqITwckSXL2sTXTmDwgtuB1HYXk4TAXhwbrtw', + 'dp' => 'EVJfMtCtcBpTm6pmznP1jdcinlFBLr-v1FndBK_QlXaEed8t4Rycw7R76eF0RMTtEK_hMOabSM0EfFiN3ofeXQ', + 'dq' => 'rA5MWEcU0YyFhlnYHiucrGnEdEUJ8pOy09gSfvDym_6Jw7OO0-rywWhBY5DOZ_sQpv0vsVxKP-ChOwxlxxPCFw', + 'qi' => 'FKqVgknFuntcWE0b4NSoqROngDbxLd-lQ2DWg9z7G-knJTizDwj_7tSlNbqYlcbXXNf5vRnhQCePb4KqKyPh8Q', + ], [ + 'kty' => 'RSA', + 'n' => 'slVGbcg7Mr_tQmfDJAIWrlWjBWpi_JzGTjCCVZGOikH3ekkUEH8TN39WJ2HXBwSNmT4bh8eRJsUyBKYr8yz3UdEUJxloo2SVZEN0rXh2Jb84OdObom1CFbPg4yQOvLN57pE06zc7GzQ1MKF2dqRFvyEyibKcs3V6J2DjvDXbxJAnTOmxWjLRKa6v9aKrNCakK_qSRzEwR-IbNnGHSrQr1RaDQ2gQ7FuVuNOJe8rrdlP1dIdg3ElzvDgjg3NY54b8SqwThXt8gRM1VKg5O-6fRdHLPS4L0DOElDlc8lboqA6oI1187cbLq__4P8c1pordIBmHXdbSd-4Q1BYnNVqfoQ', + 'e' => 'AQAB', + 'd' => 'rhaTB06lg5ha3C2BESC81XkiCIJfmWzOJbwzL6dFd_CHz6eRX709nDrBdvaLO_2U4VkA9R67sxZkCqfRVbW6xfMN8lFalc72C4fSWhmzdIvkLodFcl2oWplb20Dy5gFq8ZptB4XGPHtNxWiJxa39rGSS-lsToBj5o4FxL-V_4bSZOLWLfUIaFS5xJ4xZ6rLAH1gd8AlUbQfcwToDCjzyWSZDHFqCtOr10tD_3OeK_SdQoG4FGpnNo4WdUstTRTIYGaN8N_ThJh-f7bWUomEuBFhKT6FCXkxHbPfq1t3q9YhQBmg2_Jw9gUWD4lukPDpvdp-_blMRqs-9JNkL8plEsQ', + 'p' => '53OBPF6RmswOMkuK8MhXjLT5NNCaFce9rKkpK-8KHK7UqVHqW006mzJ3kYVm2nIFODCqSO6RZcmEhLgrpZhAqbOl07lvh5nhhiXJyjaw6rcCumKTbjfX8dksnxHG2ik0Y8-1PHJwhIRHrjAeuf17XHgaATKOSxDVYSk-A7MClFU', + 'q' => 'xT96R1C3y4zakgYWdThV9fn4sFgrlUFWrcMiis5dldl2k8aQrRCXRzWUNMK9G12ibBnXipVT24ZOQKJ0bqeoMU6aopY4DlsyWSzCEfJ6ojSE6Jd-Wnwb5TglNhXTq2wPjkpdbGTum7UeXYhdCJdwhc1GUkIU3ctTquY4isuyih0', + 'dp' => 'f6oJbfgnzj-h0QI0KC4JhJZKI2SwqTTcnYFNMWuPo1SX_rEtWKEXo4VJyJ3RpspfsKe_Na1Jy-BE1UQU5yk8-Z4a6NcO-rfZWro7POu_2CeMPKyk75Wj6kXFRBR1H968hBWMvUPOZnnkY-Ms_6AezFl-1oxBSoyFditehoHV-WU', + 'dq' => 'eoEtMaOpMwt9KFoNkqn1gXrKAMQR9XYKHotmJa17pDjWk3ssmcAHJJvbO1WDW76wxNDb9F9AIMRuT2hWRe9s34rBMZ94mzn6sDXDJqBhl-JkdYy5Vftk290eB1RRDVNk6eu30D1zkFNR06eAmHht0zwlo6sVCJdilG69yT4v2eU', + 'qi' => '5vefHlL9JtiX-FBMYT6CSo51c-tonow5cj3Jl1crRuxod6zjXM13dr4bki40MT_ZQ8x1kjerFuoA1fYyktTAQnRgcafjYyZJIkh3RdGLf-_kDQ_up6v-k4IEile3RM_XST5lyq1ei6UuRO5NQDa5L9OctY5QWDz-rw9_51iKSUg', + ], [ + 'kty' => 'RSA', + 'n' => 'zBlgpPT7LeCKZbaRoX5iENY338bavaU-d_vw6xF4hYhqSBYoH2mt5WPeIW-lz9o1xlbxw-W6YnlHMuJfefnXOvZfFUNOK5-QGBq8ZJY7sfNJ0vxHJ2FJ8cNvpChTEqG7CRU6ZK_V2h5XuQFg4FGASbEgiJjRoPHrXwwts_e1ICIsW0Lg_YGBOk8RqlzguD-NcexYpO_N0VV-J5J5jlVxAEdVgddT-d9sGBx2Vq3PE3D8ZMTZ6UXTvmmdGK_CA-0Y7ep3UgYKVRmv2XLwwsmPWYJy8Ky9wqTnt58Lz5H6iZAGmgEztaf7hB-hRymDTFRWn2-zFhd1-TdqQ6xgZyfA4Qp7vFe1s9LZr_A-jFN2ZO7sP2x6e0dVDszzo0dJ41jrY4aP19hpOnPcXQ0sqjzahLmajekmtM3GjqBd9-bODXqCWiOhzc5Tl4Ru7_N1FEqUXVwBJhWelChez6DVTMeNdIJVw36ARtVNdsBwNTLK8q8n72cc_zwBmhFkGBdxHercMjmD1YJAaRfXfh8OJBbFJDSZkMp4N5PwK2iM4oy79xTsB61OZfEcwf1F4LKSDyyvJC5Mg1_Imc311nAdsDohBQMZquh-V73c6DhhBBRaAKk1esQoGUgLVBXsfR2RABr28WFM8RmOZKRdpI9AJO-6Z8X7a4JHCldljpyOX4mwWG8', + 'e' => 'AQAB', + 'd' => 'WS-lua-Lqyp5j6TN0oIFnFHfrJuarlBtEcU4K6BAyCkqOEHmWoO1h42yXW4KSN-TrA4GK5JRdgKFCEk_a2-vi4ZpWkNE_28EamQUeufjQgmL8vRmq2CqDUlXmaY9VuDxeDCcia8EhgHIV4GwsZUruAf8rXQJ9oiAT9JkjkXqEhacx2xcIKrcq3wtvgJD-H9c8bFTsw9PIvB25hftojLX5EVHqitL-N6Wv5qAY7Qjzt0KjYYvqu3mb0h7a3QyFcEfqadRaLhW_4TwANdnOdcWGwkT7POvIEUrNGP9p0Ck-EPFfrqTvAehssSXlx8eztXz3EvVOAwcc0Cx4MyMe8c1UtmKaXu7_v719irOXtECAtr7FfK_ycFA9dVQbKKBkj4MAidfgSLm5m9Ago8QnuyPHHktCcMzOeQNe6eY97rrBNpI3XEJJM97hnaIn1_g-poQgrnpYSZhTsDaKe9-ls8sD6RMqWHnVGe_bXsNfdi5G3iMqXAY94l0Eqrr_jTXdkmA-xTBCFfHcCLm5RDRBgc1zVYkl5d8rW822pyN4hfJsV1JR0KAltUQ2TCFR6fo0e6Ne-YbZDBHHPAD_s3m-2zSXSlODIG-bqR7beb8Ta9kjZo0advMbo4HjcY_qqd5KIY3HuyQWUGMABg96w_JxgFXEQVp3a6XQJaewQSRhsxTtGE', + 'p' => '6l8TYYzb7VxrUFtKBbF1dTFjsRmAOajL6BGNB0Yyw0smZUEZL-HHeW3NzN4qB03oVUnNeAKKOde3-8mgDxi1qzB6ytqhJqrv0iRpsDJax7OP_F47um33nWcsipCHmzczM7f8HBmzD_beoMPGvsoUAzNIv9Ka0dz-1hQqz5etiKSMMwozAnUj_TqPLedc4DG6EaW8x_vgNfW-_puK-IzwsT5YjltQ8weufNxLlrT2sx9QT05jbxe2YR2ijNgvKxo-G0wz9A8pn5wiPB3NsdsHAy3mrtjMEjwv_Z65y0XPPO1W1Bp68XICknzghgTc7nZR_31NSrtEPmQBlJqoJPis-Q', + 'q' => '3u8h8WiXSx6AtPGQpvmNebZqi66ITQcAhvdF8O_I1LdjswBTZwpXqKXb5kLBPXOAH6YqgxURNwZZ4M5Ys6iv66jVzPbSU_MMHlsiXzgeVfUxwbdOHpiZhRzoB2gzznfFDKR8bu1S07tYePeaEwplsSg2Vb5tC81uNIM1sshfeuDO5cZOH8DmuJzTjhGjb8CWmbgLnFOSBuPl-Vcr3oYVCnWzvEfCgUIy5tC9KeBC8Qe3O841SjbN3yZ8EEXwcUmo9lOt19s3LKBmtT94SXtok6-wHVWlL3YbzRg1kl8SVjN28NJd990mjPhjqBK8KyChCxoPn8lIXEUwGwFmIz4Spw', + 'dp' => 'tYIqXVscnAf-KD565kvX_ongfjCUqJL8T97_zIlmGO8jbjlrSzTdKkKKpsXL4NpKO3srwGyfJkrVdw9ggTCOyWSDRITrVyn9D08Z9tYYjh6XPUixkyFFKkbULP_ftaqbYct0WULh9VQoeHMGgY24z_2wsrZlJnCzf5Ig0aLTR0bAOWsFtDqKQ7xNVKygthRs2Ov1dx-vNbr7Tu2hQ_rLEUmKhb1cxMrHLHXjqHS_tlti8_huc4P2v-GWmON4LDZnsPZkKfhwMOdXcB1Yxwwssx6iT_kgmmK4e_-oPi_zXmkk3KEhY8n7Cf3iWIh9ncROnsIo0N6U7IjA3Jil7fQU6Q', + 'dq' => 'kYMy-5jST_Tr-69FRMfU4WIA74WPb_-nB3F1VIue4cGGMPuAdNxaVTlVbFmcOlkegwn566-fmfPqTINDgJkVotOEIhHlPWiCO3ou2EoP-vldbd0Q_4WJh0pT5SnNzvF8TAE9O0Zq7sr1N5geGFmMAPOHa7YtBSwkx9_w9-4z7Ee6pF4o9i76KfwrVisLK9FgO5vW8EXYJekxXevZNZj9OOOU2stYGPi1stUC88duylbH8iBpxjQ5cnNzPUf5Zmi3AXmjGib7P4S_JYT1JbmIjAV8Bdm2RWFpShiINy8ZD-ztsMkPDs9p70_d9IGuEtRsaYusMRa3xYpfmPDz0wMcNw', + 'qi' => 'sEHok5K2HG0q6JdNzHB7FsM9EJxY7c6Gkya3Lfr1Rr5OYPcAosEIZpl-1_hCQ3MLGKT9UlYjZrlyt6SOUvCkxFX9slDZQeagmlSNMyWs18U0MxhFpEGthqLthS6ik0kFlschiSpMMyKVI8kgQR3OjMDcA_Mr92gZ9fl-mhtl2yfXJsBIkFBD7yOyxRxawy7v05RehoDHmdy2cnzaakPvg3Cekma2mfdjYgN5JnS0A20pC1zfoqi0D3B4KGrYVZhyJRnBakOUmwvE8rfmcjThx169LiAea6SYs7k9jwUCVWrNexXItxGdbQbbrb-FUotAcAQSDr6hHU8H79gN63WoOQ', + ]], + ], ], ]; } diff --git a/performance/JWE/RSAOAEP256Bench.php b/performance/JWE/RSAOAEP256Bench.php index 96a75473..04581c71 100644 --- a/performance/JWE/RSAOAEP256Bench.php +++ b/performance/JWE/RSAOAEP256Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP-256', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP-256', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP-256', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP-256', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP-256', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP-256', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP-256', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP-256', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP-256', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP-256', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP-256', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP-256', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,24 +67,60 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"Kt1bXc5RMai6lvx9jzQnER5cjHhpkrhpMA-ouMcKpyfI8tRV3rR9YhX7nFwSqjlEMDHOpo2MSFE1VKFffv6PYgSo57Go_KH1nxCAfA2VvmfNw2m57s_k-CT6lQBPbL_wP4-p-G7sBTn5G2Y8JGv97KZfxaGMjJPbG-cItZGP6lXGHMz2dzOACuYMPnhnC4DMqU1841c3-bwDbdF7zRbSNR20fTRkQnsym7XUyzWlso4","iv":"50bhctq_S8c5HSWma1Z5jg","tag":"s0HVizdCpd0Yp3aCTq6VbQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"E0oIChIIRJdY6NwHHzIeoDso3yX0bqVDrhrD3AqEnaR6NBBAAXFVfc7PwOaQHEzc8u8Pu-RrgB-4TJ32vF_OzkqemMXzj2MmvYSSE8u-llrYUj3ojpBTdx4yytoU1ufLuMAua6GOKQai5FCFmDy_jdwlmLAFcCP5ve7_vWvBGEg"}'], - ['input' => '{"ciphertext":"xHFEOVgYUCqgGcbTwJJzRfWG5Y109yYUYSrKYwRnqI8ILesl9VPq7N4XB96JHThBz1bDdWl1PFEvUUmQXh4che0jgYhnX-7DPcJknPxlgPGVTQ-I77L4QsuUSKebG_XckaQYZuCu7-gwvDZ-EkHhxYiMzg9umvuzp2CKJLcluogshvBOi7Mwq3C6R51Lcgi9OECtUhujDo3VwqUxHXU5EKkng0isgO52ITVnjReevAY","iv":"qUv69PrmNOrGNZaIB5wJMA","tag":"uN09z-ggZidiwxLhMcu6IOrlFiU-LiLf","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"Ev7I_-UEd772eVUYZTQYKWXDo9vXSp-kzyFePHftUzY-vooXwRIaN6fow-erdz8VwBnG3uXHZZ6ZJLaw6rD0b-GMNOxxcwYW9pEdAhcqVkdbUi_SdjeJSMTa9Sa7g284OyOpf2SjQoi0h0FhEyldCQUVHA_sAC_2rdzCGF9NoLI"}'], - ['input' => '{"ciphertext":"JjI_AEMydlZllOGW2MfCVGiOMuacDwWc41pevYvmYol_7MohArgSKxEAyROJd3R9O7Zz63O5cyDwgDA231VE-idmVhV5snfxNXyXRlNvXDVAWFMPRWRWOtsQdUCWMrUI1WbQVLJ04OcXbfY9R6dYrTqqqTqQV69ylKLItXkB42EmJq8vnn50nr_WhDdhskFi8gtc0cK1x_E4LHlQc4NbisIQ3N1SI0DE5GiLzLMsaiU","iv":"q0qYbdan0pR07xAyYpVkbg","tag":"h8p6aLBIZqjimpr_w3iiUWaNS56NrigEcab6uPXRCdg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"QVjgnUuKP6aNtncunJ-j7n_RTgte6uYoGJt1jBUIL8WvmHaZA5lfc5Ost_2KA6lcPCUtiYoMRKzXvOV6IWP59CETWTrvZg-Cn6Sho7eWdSr0HNg1948Tb6vR76FZSigPRn-cWjfUv9GeOBL5vJCx7aBHHXnBx8XeQch9nRNx-xMHPwEaU6qwUcyjvS4G6D0rS8rGnhlLArraew3tl4rs8s8cgU5jetXB_dAPetVUMvN2_caKVSU0g94cl_n_Qgo_G21J8mjxmZp428KSZR6_YtbonQIczenj47OV0mBIvgM4EgTFuvyFA_RMRIgun4DmeGiNgDtb7PB8myp6zc0v2g"}'], - ['input' => '{"ciphertext":"qwZIydy2JYj0hf9_J4S7tAl5xjq7dFhEHqFoldMyEkjG67Z4E9o-eklYNwZ0wMgfUFbbUuvXcXO5xesBd2JNme04YVrYsb-tcj6L37pII01XA-R93Dto6yDUv9GFa9tgrvRthRiwnwv7X9HfT9HAF32IN3CA_j1nX65XqZiH-FeywSYwbmhKzhVsvdLJxYx6RD1Ebb8Tg5Ht1gVZMs0MHYjEiCeUk6s","iv":"0ZXHoOtEL8l7Ln7X","tag":"TeVmyPlt71EcdWI5mqnP0w","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"YhyxlZ1qorCPatENA6emkBg0Wg0DQQj7jfLyf6iKZ5NrVGRXdsV5LEbsodmDGKFb_yYDlWfaI_yz4fjBA8z_-qWUyqxSbD7yaX4Kyd8HmH-D2JNHqZzdfqxnssociCSkVKya418ullYVK0juJ7ag5t24vGixAbUoF3vFZEo8H6k"}'], - ['input' => '{"ciphertext":"Ri-yczaqxmZol-a6jiYUAA2lCBDQqWXJz3uFhVreb6iGjAuCaIsTRUPc6G4r-FXXaGi1vmN4YZJQLYqVJ58poyNe8eqiqorQRreZtVF_Ugt79rPKe3Nsq7nxSH0i0Iw_5Xwzwg9tKEgrfyu4HSfx3CYhr7GXZ4Ngt9b6C7AT14RwUPMJn9s_6maxVt_mGAFYZZNowvwAX20zrTGB-9mISn2my7Kzxgk","iv":"Z3E8pNe9CQbKoVk8","tag":"KNnMD0_g0gkudMaMu0ZdMA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"mtX6HjMdgJzXFVE2ct2NysjfK-AfUzFWK_WUDg1-jTsGPexOQhvoin4pGSVVPweIL5k1ZROrHSbxocGyTjHmnox7QnVbkVnJ2Dtd6aYtiDmibEhY1v9cgIw2-NFPHJQ4b44fy_ovSHFUH3Jcs7q0l3VBrhXOZPU0HBdbjPgMBkY"}'], - ['input' => '{"ciphertext":"J7OYhHw1S5EYipkRAFFjpCYkzV_VsmmQRZXNRJHhxc0sMj_axqE023yL63ltZhil8N3rlwFHShKkCT_HbEA53RuXcHrKrkpBCCq6vmxfZO2knKHjUv_k7wzXNCi6z8TvhE6yX5NMjIetBv30CbE3aOfk9gTa2nT-A8Xu2uP78oqvoFFULfhv3vQBx2-g__eRKhaEdzZ9GrbZZLhrIPtsOo8Sgf41QyY","iv":"BjA2cnG8Vj_2FqDt","tag":"0ifI7hCpz3HtsaykvqTx-A","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"UC1F43FkAeURaolsPXKRayZDk8z05T8jOmZ8TveoQiKkHqtH_Ph0EXx6srwtvGiocMB7VOreeiHuhqePx9U7lSq15MzTtoHOPLKI9FWJ1dEYi6FndpBPkxfXxOQAfc03XslSY8TA-S0dYdWxXEgVrJ43erROJX0pS-jzzj9DcV0"}'], - ['input' => '{"ciphertext":"XnyZ7w7GFsJ_faDlBtE1p36gMcYpo3HGwFY8qkopuFRbrAqSPaNqPsUXTrI9627jEGpLBv4VuAXIUE6CZPcSYK_n8amYcL_Ji07FdMDRuR5-BQHWUKMeSVtYUAVYDe7LwZ0GK_xCfyPbcMTb6fKYsvL7TE16SZzfHFdSOhT9m77NiXiLJE-NExn-uqWf8t7xQnoi9YU0bx_a4xwNK8I1AC2VgY8T7_tp1oaAZe51lrc","iv":"0geETbnN9S9VYsn6-jMLLA","tag":"OZYNmc4UfJvSR37SUk8rmg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"WjDBeYp_H1lRkJP_0a-jP0kAVhAoIyJuQ44qJAQsJX5ElxWk6YdxX4KUaTiHHsfgmSbocZNF4YrrlLjLbevCQMIuvMCAHjg_OrbnmbcWZe8DhuqWbYegDO6l9ijj8p7FkQQ_aS3DMLxRO4dF439EKisiJMBtT_Wo3278sCCfqoKMEny2IkItzqXm_maWRTEGIQc2hmp0xTLeQJt4Dn1JQ2MQlw_0ZtraU-xblyqxEF1up8f_SHA4B4aFIbGMXbSormP4qvStwyNL94eyA8Dw9kLe1-Ii8BO8ZASlNcssWw1hpigtyill9klFPjRKxBrJbn_G1d8dgUs81BpPH_d3PA"}'], - ['input' => '{"ciphertext":"X7VkvjUSIPZEa7hk64LJ_pnONh-4E8x2HQE_9eNr8XsSUGUVz9PCuKBpIq3LrJoD2eTJA2OpKvVkm5InOH6Lvqin5hhKr43no01d1QCF81nZnU7mhaw4C_ag5YJvNqgRkX34T89_m2W0SBWk1qXDn3TXR4fz4NLKJwnZ_j3Upy_NMz5JsMtCjG0GZhIqLXHz77JA_jcSZBgdpFqD683M_b-96szPZ2QxbcxVcw5YtR8","iv":"blNjabJ8qu3kkSg3I_52kw","tag":"a4w_zKis-7yLUE5Dtr1D5rb7C68R1g6_","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"ogW4_Z0jzd2POyMx9oy4CGW7GOjL6gEHmFqdoeRtj8fQoB3ofYM0voLo-YqIlxDdTgyIqNwwTM729WMZw_uV4Pa7J9cMRAgLczsgIRvHTbYieBfqvLRU4jxrE65XM4PUGiwzwj_r-ICrXkoH-UzXUkzQdPBPgOznSzcQ2Fn5xqr_bNptKxX5b2Ppbscm37MjmEIliJavrnUmh1TGGbYSVXODUf4ER1evdT1zPWUeqcc5NJ-I2DyNPQWKVS4HI200HJ0HEGWMVTU7I6Ggjypm0azkNJskC75Os2rMoGaNy5UOtfLq97yCTPzcZ1LcBQHAJP7bh1rxSj0BHZW0mTN2GA"}'], - ['input' => '{"ciphertext":"uha6DjGNNpMcOFDgn87PMyTJrRSoTdVgCyXNO5zk8bzJ9tkYEy_81lXlBX7oQ96YgOCugrEv-4OND7y4c69GFO0m8_v_R5yIuX7Qpl2OAj30WQd6v1VC8-JBXDW357_6L-XY7vSuCvQHB1wnVABw6onKGz92raOW_xrIi_J9wx5lmzMLSth3BalXe8VhcgiRh4EciIjMynIurcVMuZ3rstSjQe2k_7BQXiXpWInwy9E","iv":"wpwbjyGnBiMvv9-bhcorpQ","tag":"z_WkrSiMw0X3EhU0JXSOu8Hm5ty9aYvAJmunXZ_eIKU","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"QRIg4N6HwngfX473i6Rp869h69EVTbjMAQ_5EV_TrWOgq4gi-ooxooOrJ2Sxm6HvX52UbQ04F-shaAwvEA3kj2Sy8zqv058uX_BUutNF-hE4pV1DyRqXAGamEQuvq8X4t8BXWS02ITQizBOy0znGsJKopKL8dR3BttcONYBfuCP58nPOLEg7Vsw4xAKC0Di11ppumBJD3eFM94ii1XecikVdMqLlHEP2oUZRWFCUUltev1Yhj_JZzElvSABvbuNVHFwJYrQzmhjq70WDVEJJIrpVVfmuwNn4MADw5B9XrT4xdTMDligt8lqIxNd5rxItxLv3n8HwLaDFoOMrgR54GA"}'], - ['input' => '{"ciphertext":"W1_OC0LkFGUPJSQetkjTGT4WAVe_5OeVVIq3YKixV8_heCA72OXJppapE58tiQktfbsxgG2PR6my2HuHK5IMdzf5ugF8ALQaGBNnHvsOCQZA1JZLc03QPRQGYgbRGhDkxOLNxwMzYPytQLYpcxHVsVId39-3IRreXaZbd3C_SvTFlPRx-6wD43ExWEpdBnxnn1xHlw3xU-HdOjZQfSRPeUGJoF_x4t8","iv":"BXm6XOtRiw0dJd94","tag":"r41IaktoReqoeamFZ9yl_w","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"IzFHtCyOENKi22ePBOtQcYRBIjGIdqP2ZE8M7nulP3Z_iaS-IB_bQjoIRQ7hPzKlr_jNHzb7hAYaHBZ7TfV1f_q0CkYtZhVP9jQGx3Bp0VVLaHhY_2wB8ojU58Y45Q7NYtTgsQLspv9PTdxtFaZhoQcJTqGfWR_X8Vh1q2vhVWKp5rNBxvQ3Cq5uDqSnzDRy4Yn6Rt800Mm1nmgToVnj0laAM-tBdvjD76ICD35GP-cxL8xZ4-xFrZ5SOuQwTARsR_ruoECUZsc3Q-ddaflSN9qBIKObId4czTBlt47aIS6Q3NuMc4TtiYWu_QAdFBviE7uPrhMSHIA-XqFOtlQGWw"}'], - ['input' => '{"ciphertext":"sq9GLKF4P-KXuxBy_LNmntSm1sZz0tYT_f-i2HGO0xl6af53QD2WaFAm5PdwSBJXZKkf1d0nNLP2XqA02zkuMSh40KBz41oHPzqTRHrLd2CbZuL8FUR0avrNMXw_7-1I2cMYS5USW1VNuUDVjwqy-ohT8-_j-VeA-3q4Jt5mPSL4GSgE5EkflJ3TpeKfTsW04G3vrsSFH6mfJPz5WOCl6vfQHzy95NQ","iv":"8YTVo5q5Fro7BTto","tag":"aAiOhoDVrprwYY2nsmO6MA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"W2KgXKz3Cym1VXSd2JNUiAFWFEDmq_kGBHVC9g-eJZC-ZztcOnh3IgYCepbhLpVvDuj42E4KorCF12Lk79OAwmmcfZ-DvsLwgp60L2Ho2qaUl32TVmHkuKzN2RwORvb6QTMyOBklt-2BEfLC4mqYYI_755MM9noUrpA3lHkx-b-lr0l8f-fhGCWKrgsOidsfJN20nDEIvJL2PqH7SXLDKDHgY9JFdF0NfZJnZIUOUJB2kCYmaJ_CqTF6fPypBNRGwh0Wr4P2Zko9RMOp3Syuo7W3NPb05jo6xR5g2wxSOnK_WDd0YhnAX1SvBtgTq_E7vfhy6A2YO9QJC5kxAoTqgA"}'], - ['input' => '{"ciphertext":"M_MGtxHwXLi350tKZBQPr1gSw_4c2NhXtxKkZtFwELSqRvmTuUJxKiU_tkr9DWfHfoxFT586LpmGjOeu7u-4asToZ3BWu8namlORdkMdOO4k1x2ydeygWdWUfzNkwoMU3Yn7_zlw2PVoDkZlEcB5cDidBbrUHbKugAN5ZBOBOYCDoonsnRVRtbs2HKhi3J-YYnS3hgQJIlYDXpasb7YxlV5NerdZQu8","iv":"YowIbccIgldZtWhM","tag":"hLaDeUhCkt24cDuIaRZPkQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"KDmm43wYSHFxTbeQ3UwfB_Grwpf7xHJbX_ytkEQ7aIr8BPXwUPRPk50Xbk7STQQjdTN4IdB47plCVcmtFVVvVr1Kb-9Z2ouQEz4XIymvNfME-48afqA77KALuxIdJyXnlaHfzagSxM_r-CwzR8qMoiZ31VCP3uWcHVaoG7A2tzHJMvvDy4BosJ7Q0j_UQN9FiS8ZsC-CCjBtSwtG9SBsAk7ni5891o8OEkVvi11Mqybz18zQ5VdL28pq0yBSicCZlPyYXVbkpv0svHU8VhZtqjwKFmEblwuou3TduM9GATSqP66PXNjEZ0IbnwBxFStNMy4r1bbGvY3cB1NLHOO0bw"}'], - ['input' => '{"ciphertext":"nYEFVB7x9GwrdWCfPopHrnZz63pUMJPiluUvP4uKjMZLmMfSXjirkPFJHLNenvAnY9N_St2MsNVRjJGVA8BKpD5Lou9as1LhQKtZvbbhSFeh3Pgtl-dWkk-pPNlUks21xhulz9-WkcUI6UDMECubhTCyks9mQYs4CGYn2-N8YqvGJW-MQY-fKmI_ANLqYmbrxDBg2nLVZwedI1a1mZTvlBmWg6y1J9iliSZmNx3E0D8","iv":"MXJVPlmpK2RmNGH8G12KzA","tag":"XP7oILWIwDQETo5svidYtw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"Gn6OkvU9Vrj4yW8bEOYQXrZ5nHNTw5NTXj4E8RtYia0XSr77p916dsgJ7ydM-Cqp3bc-FW-Dw2mJzNG9aetUBImFV-C136Zd8qZfurVR6wdmknRRVV_EYDIGEUJmUeN20if7tUP-rxUEVN6R0ROJ-8N_XwDmlxx_kxqjoNBU1GlsGSyPhVXrBPOcHyeLrTQ1Dw4K2zzlOETcIg9HNq2wOgeMl5T7cAwAPup9IYhAYQPijwbZlY2Fh1DuldZ_lrGD6jQSRGKho1aSRd7i-tVyOfLU88nmCN9lInMIXlOWoiTjbip7e0dfbh2_Q4EDg-bwsvolgsiVt9Xqrz-2E1q0xM7E086KcFFG4__xyt0Y5J-TPlrX9oL1XYikSYaJG9LkSdUbuYNqqTdx8tRvpX_-r_zP7qlvTPZEsaR-Pa_ICKohZfqxMuU4c7ZEP2ayOLDDpewAm3oKX5Ln5hjBMNrWh-chsNin2t90Morq72xsCkKhRCEczXljQpp574e5j-8eIOv4o-LNCaf1liuq-4kHl48B7IkQrhNQtSJ6sEf5NyIItesD513o1XRcLadH4VYmn_zbUXOpTWcy32EoqawV8SVamku1MBup2hme01i5UPstvJVU2TT6lPAp0Y1IQrUwY6z0CDzT9FbUvJBi07Wu0GNj1hFrrryZaI8DcEMnhpM"}'], - ['input' => '{"ciphertext":"IunHcQrdO2xEJO_DTbjfC9RodsUSE8YBHSSdtJW3DNDHfiOeioejCgXCKLWJRXhzOsC1LLcgt8n1oFncw7QnoMNGq6bhUqJ9o53CoetZTwP_aM6lKK7Fq73dRmj_ejcgphIAvlhEjMGQbi60jgBgrerilT4N_S7x3f39CSX2VnDScdHlLnLLj_822sjQoxAOFGhMQ2FSXLIISWdCxUQG13xtK-RxLRJhcL_F6rdQpNo","iv":"IOYdkjO4y9mVjiX8RNlh0w","tag":"xy6A83DIJUkEzKM8FjyoyZfxpCvGfqYK","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"ulk_x1VauBMMaN_FKe2Db6fk4RBwiZRKCvBgYz_ddJY916pYBPwZ4v9YmL9EtxU1isbzgXHTPjHHWlRI7PdqMZm5_kdzgo98uxd8cklLTDJz8dcA3-DQmcFmszOG2Wh2_vdMdUnrQxdmM8cI4k62zZ4WsCM0rGiANE7KRSieuxwkUHYXu62i9U7WT1m9re0UnNGBP_7kGSYgigSJfTsoWRH6eKGye5bXAcdOlfbo0hGu1i_9p9duClP_u9AR7LSxdUxzmTSW9yjHVMSg_PhJBIw9IBqAtfTR9K6ltzxbVPHRXzeIaxU8u14u9UE5ubIP325yot1XAdS-2r9tW_UsaPxFPn-wAuguU0vYcJoi_Lng7ZUf_KwpUXIcKplY2nThnZH8Q4GDlvrmDMUwRET9Uv5_rspX3VLL1isrJmghV4CyO18RX8bpgEYGqMhssXFPUTipcAlbWPIDRt-sjH8LpuQ777bygBFNwtBoAtK5CTL8PgdWPE7RORVKGRJGkcnsqiqyWKnaztY5XIOG57fFgQ055zjfThBKcV40Iit-FwSeq6NVyS3FSiJlQ4pJVWkcebhNIewOO2yvbQFyj_HMe5NMTPyJEZIL8P6L0b6VUsupMVkaJEM8ZbvvjOQ9iU7Cs7l9S1NWLZ7reIxNT-JSFHT2IrAYxl_BdgbBrwsJ5Hs"}'], - ['input' => '{"ciphertext":"1-42J-20SxLWe2xcuvITQFe4uOI83WEl8DH33pCZAMAaWfiPPKFT1GEHqFApj90pEigPZ1vieh150m05DDE5iE_I1Oanp3RD0JtF7kFDQGl-WthHEpid4BffTD70m8Jdy2DBaHLAnVoshQJKWTP269Xvx-avbU_SQfGUCa9uOoWaWGEZ99S4i8IMyMIx6H6H-buTBizeeMy1C14WPmi_IBu6HF_V_5hk4xIXkeN1QNs","iv":"rD3ssiyJAzK2w_NBCu3dhg","tag":"pOegUBPvh0mwRfYuiy_Xpn-QoY1iacjtNkRqY6k63dU","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"A0pMdy8sJfzd3KHguIGU9BiYL13lFsjkud3qY-1Roofxgq95jCJSg4Gt5t0ob52JC-xK7mtoLDhnkRbX7lPVaDdUOBQ1fK3eueFZigXW63XUE7xJF9cRJrWQ6aPuxgdwz-DhIbZP-bfozvSg6SqvaMNZjGgtiV2-Xd0awzF7ZtZbJEVOpgZGFV4PabGvVsZ7OA7ezQ0MUauwz4JuWDvggebiFESLwJhsP__xR2NhFWpcIBdOoKqYy1-s1cHa_TBoqq96q5OjYE8hz6NVa1A50WeudTflaObgyY2_cze_oXVbd77ve5_i1k2SyR_C8D24tCwCFq-zZnxoSqXzu1TI8ddl9yqs3DXQRGv7ow1R7QIF0V9D-2L-LcP9xsQ11j45FEoXI-TM67ob4AxkrLzGY8G8tT8ihTF9LFUyQV0qBA41Tsu-72-c_rdysigmQTjI7zj5BBi1rOPKJpewZ6QSpDP_D0Ko4Iv1WfCis8D49WqMguLI6cF2Ph5HXIbuzXSLqJlzJXXQvvxP1Pa3OVqrUUVJ2zIwoA1A3_og6LNH8qpeeSUQn9b8Vuoo6-xlGhg-iUHPHtWRQNIdDAu39kSHWLxGRdA1CKPyRk6nZoFFESSc-9nhWB4zb080Lm3YKEm-4EPVdCwdDavXTwGRS3vPx6AfFvaCn58dvU3NNQXMbOE"}'], - ['input' => '{"ciphertext":"mrk14MJdDRKyqlvjahhsHdet8oXYuqTmoJ5BeORbij3ZyyAZVEz4J42gjtG5wwlkR0rB4BazlrBcaBZdZoNK1OKBj7h3s0QUd1nMhF5qA7h8jeiwxirXOqhlwHUxpEPWwJ04XcS-eG4VI-DOSk5Tem7bRn_PlL4VC1qS_Y_ZQk6P7x-tMQLcYQWwme4-E14n8_syWyfzNqHQHRdmNmPSLZ3daOFCqsk","iv":"ppT2nVwjH0oM19hQ","tag":"edjw-7Ta4gf8w42nsucCuA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"HUGJZ2q9oPK6BTH0NBZJVKSDEq7OU1Z-8T4GLv70HbEZJ43iAjUe1-K5WDQzz2ikAtQSyTAmVySir3ziLdMUJt0vBj5iQakFtxmYD4GA_lNudh5b_12D1I4xCwjCEYKX5FByT7QYm3rU79XGNYs0gzbTKha78X9mQ5SsDgQqXvbESz-7apeAlaKa1PqyO8ow0s-Pp0wUDbP3NLjK6qozTPSf34MpDt44FAcc6TR92dXDMkvi4_SdKGKUKwvYx7KHe0hKoHub0rl_m68UAdlxJ2Hy39n-HefN2pL-M46k9SlfZiQdA_wVDg7jNMJG0pD19XWLpM3n8a_meGMt8UYcqsUagMydjJU-10I_lO--HXA4kfjulEmvXOdZrAgea28f5w_BRpoMGJnkTks-UqDfFa2KPOv2S-qYO0aNwPcuhLOIwiPRKtgcuujG6GtuBgMUleS2pNoZg6q6Gw3mQC7sBSikOqCyEx_A-CTzzXFqfN8k986QDCTx-2OT97jaaQPQ8BWVQgLzDDREj7wuv60CQL031bv27P99oZ80BK-vGiPfzjG0MNwT7BS7NC6NnhgXFS4Czo4SECk0TCmhz06IckID8xUIn_TJtQtn9gAPnyZaHV4R9YIoHx_Y7cmnc-xAd4gVk65QpviaKJ-cgyNcNuoIiklmm3CHDxaydat6xHI"}'], - ['input' => '{"ciphertext":"b4wrAX6XyHJy01y0MdUtMqLyMiNs_Q7kHUdPYaB0s83zQ5gdJfc3L0CJBdTPV5tC4QY6N8-r6QrLSj5O-QFDgCpIj7c3IYFtjKPtpsiWJ80HyZ4ZoIBCrOshhUtCMzs_L4MYVRi2kKr-wvsAKmODw62kzFVzoEEWaEK5zdbgWbS9AGa0g2LMe80Y4blTE0SAwc215KBlY-_ONYULBecP8DjLCnu4Ybs","iv":"A6eFQhv2gXcyQAwS","tag":"Y4lDzYlIGqcqNoSpSYJOdg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"pyvUtlJZBjW7SY2qIesf4wJuiHsXM6Qmd0hJxGu3GaPpSrNhj19TlcNkAAH9JFoBo1i8GS3Qw6BsWBO6FXVtXqm-ZAi03Hw5BqOlaVz5Ls_Ruj6z6GUxa9MYJAd-iIWqCD1yCyT578ZwHZaarAA2tCuZMADxaQ74pBaXUggt7UmU3D5TZiEHuh4ShjB2CJR2fxJnO-U1GyAkr7j4XbFU5xVoxgTQDYd4FlDA0KDScnGd9r2gBT6TnM2ljA1nIyEz7a5qjDODZvVWTLqEmoRNgXzXrWT0WTh1wCrh0Q15JY_qLoTW8bWTBbs1bZLtpLaU0RL84F3iaEskcHo4O4VtSzKOQyDCVchN52gFN-yJ_IUTXBgb3HWJpM9QIP_0t-sAcg37CPO-JeuvrdT5e7_s8IMdMw2QzwpFdUT86FQAdYDYLKwG8TzMwqISLKkMeRZpt2N7XgKrDSTX-HsYLzWedc7DPugHfbEl2nknTFcmfjDj20Vpr01z_jWMhr6gs9612ucx71i0qYFk0PXDUN2dWY_w_ff790KNA5EEYlQLdnJ6BH1N30I654v23KUR9gs6kDy1KyHUuw-ylfByYXYT8du22vH5DzXiyW_ldHov_WULhGupABcE800ou2TPf94LOkfam47M8CISDJCqJ-rtkCVza-wCCw4lQf7ZvtAoJUE"}'], - ['input' => '{"ciphertext":"05bmbpoOhrkgxaKrD15PJjOapFOMm5XdHCiQIpbDrbh7_yarzAOqtsnbhocrJ-3bNVgU4i7DevuNMWDdrM1BQDXUOmEKaNqx10I5k65aOE3B16--IG-RjOxdlUGj5YwQewyi98twt2SEmAwJJy7XkAaULrWYGluklqyg5XMBWmpkRG6i5lDMX7um19o4mtOkcWhp0uUnbuu-ZIe38eOivalJRQLXcRg","iv":"TibsjD24NcHTumc1","tag":"9N2CVWptZDd5IqlxuAgmJw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"aM2uxhn1345sBBAohoHchu13E10LDU79BXdO97HbAqtqQf8CBw8vt3C39CCNz46J5_IIpSYDjvhIgj4ivMCR0hPIHfYdWcAmtDnzKz1kbD4olHE0aQoOe-Vckg08J6-MEXeHL9yPNFhLPSo8-SrMAnEbSeTYB88MEpABXOW-y9cM_R9D6zO5trinfu60TjCY_28SZl54i22g_U3xx9Rzqe1nnlZmmoDTFraMv8_WF9Mnnk2S9gXwW8jHe2QSXRSiyouyNIniH2ff6BM-YmI0UEe8yBtq9BgvaQpFWq-XXUcsi6a9jhr0TvizCrX9bvqvRd8FnehZB9MwkI3nyk7CWn9cvIx4oEzNwuP0iQlPu8mZETSV5Mbaya8qsT9mpOSRqEEYcsZHnlpXHofs8HE5_sCqLQy74kc6VCJ3h82lHLoplane9xlfuPulTCnuhd9OyoyQ3hY2-ZDQdfWa7bhmOdSJtUU6e-pC11pL6VpZ-NXjNciuBtT8AZ58lMToZ0fm9RT3zhzBcWuDHbqKfWtt8NzC1y6zaVYiTuTXNzjNBf4NTQe-2HW1sfsyKbe2cxDGqxtH71CIPoVK40gqoWBNiexkZa7ZzwLVD8-97jNx0O2ndFZ3_xhY8359fbxPpUqQTnoRABYmo6CDUgH_uU7nKVfqHldUB5m2RFHfQgWMLDk"}'], + [ + 'input' => '{"ciphertext":"Kt1bXc5RMai6lvx9jzQnER5cjHhpkrhpMA-ouMcKpyfI8tRV3rR9YhX7nFwSqjlEMDHOpo2MSFE1VKFffv6PYgSo57Go_KH1nxCAfA2VvmfNw2m57s_k-CT6lQBPbL_wP4-p-G7sBTn5G2Y8JGv97KZfxaGMjJPbG-cItZGP6lXGHMz2dzOACuYMPnhnC4DMqU1841c3-bwDbdF7zRbSNR20fTRkQnsym7XUyzWlso4","iv":"50bhctq_S8c5HSWma1Z5jg","tag":"s0HVizdCpd0Yp3aCTq6VbQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"E0oIChIIRJdY6NwHHzIeoDso3yX0bqVDrhrD3AqEnaR6NBBAAXFVfc7PwOaQHEzc8u8Pu-RrgB-4TJ32vF_OzkqemMXzj2MmvYSSE8u-llrYUj3ojpBTdx4yytoU1ufLuMAua6GOKQai5FCFmDy_jdwlmLAFcCP5ve7_vWvBGEg"}', + ], + [ + 'input' => '{"ciphertext":"xHFEOVgYUCqgGcbTwJJzRfWG5Y109yYUYSrKYwRnqI8ILesl9VPq7N4XB96JHThBz1bDdWl1PFEvUUmQXh4che0jgYhnX-7DPcJknPxlgPGVTQ-I77L4QsuUSKebG_XckaQYZuCu7-gwvDZ-EkHhxYiMzg9umvuzp2CKJLcluogshvBOi7Mwq3C6R51Lcgi9OECtUhujDo3VwqUxHXU5EKkng0isgO52ITVnjReevAY","iv":"qUv69PrmNOrGNZaIB5wJMA","tag":"uN09z-ggZidiwxLhMcu6IOrlFiU-LiLf","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"Ev7I_-UEd772eVUYZTQYKWXDo9vXSp-kzyFePHftUzY-vooXwRIaN6fow-erdz8VwBnG3uXHZZ6ZJLaw6rD0b-GMNOxxcwYW9pEdAhcqVkdbUi_SdjeJSMTa9Sa7g284OyOpf2SjQoi0h0FhEyldCQUVHA_sAC_2rdzCGF9NoLI"}', + ], + [ + 'input' => '{"ciphertext":"JjI_AEMydlZllOGW2MfCVGiOMuacDwWc41pevYvmYol_7MohArgSKxEAyROJd3R9O7Zz63O5cyDwgDA231VE-idmVhV5snfxNXyXRlNvXDVAWFMPRWRWOtsQdUCWMrUI1WbQVLJ04OcXbfY9R6dYrTqqqTqQV69ylKLItXkB42EmJq8vnn50nr_WhDdhskFi8gtc0cK1x_E4LHlQc4NbisIQ3N1SI0DE5GiLzLMsaiU","iv":"q0qYbdan0pR07xAyYpVkbg","tag":"h8p6aLBIZqjimpr_w3iiUWaNS56NrigEcab6uPXRCdg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"QVjgnUuKP6aNtncunJ-j7n_RTgte6uYoGJt1jBUIL8WvmHaZA5lfc5Ost_2KA6lcPCUtiYoMRKzXvOV6IWP59CETWTrvZg-Cn6Sho7eWdSr0HNg1948Tb6vR76FZSigPRn-cWjfUv9GeOBL5vJCx7aBHHXnBx8XeQch9nRNx-xMHPwEaU6qwUcyjvS4G6D0rS8rGnhlLArraew3tl4rs8s8cgU5jetXB_dAPetVUMvN2_caKVSU0g94cl_n_Qgo_G21J8mjxmZp428KSZR6_YtbonQIczenj47OV0mBIvgM4EgTFuvyFA_RMRIgun4DmeGiNgDtb7PB8myp6zc0v2g"}', + ], + [ + 'input' => '{"ciphertext":"qwZIydy2JYj0hf9_J4S7tAl5xjq7dFhEHqFoldMyEkjG67Z4E9o-eklYNwZ0wMgfUFbbUuvXcXO5xesBd2JNme04YVrYsb-tcj6L37pII01XA-R93Dto6yDUv9GFa9tgrvRthRiwnwv7X9HfT9HAF32IN3CA_j1nX65XqZiH-FeywSYwbmhKzhVsvdLJxYx6RD1Ebb8Tg5Ht1gVZMs0MHYjEiCeUk6s","iv":"0ZXHoOtEL8l7Ln7X","tag":"TeVmyPlt71EcdWI5mqnP0w","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"YhyxlZ1qorCPatENA6emkBg0Wg0DQQj7jfLyf6iKZ5NrVGRXdsV5LEbsodmDGKFb_yYDlWfaI_yz4fjBA8z_-qWUyqxSbD7yaX4Kyd8HmH-D2JNHqZzdfqxnssociCSkVKya418ullYVK0juJ7ag5t24vGixAbUoF3vFZEo8H6k"}', + ], + [ + 'input' => '{"ciphertext":"Ri-yczaqxmZol-a6jiYUAA2lCBDQqWXJz3uFhVreb6iGjAuCaIsTRUPc6G4r-FXXaGi1vmN4YZJQLYqVJ58poyNe8eqiqorQRreZtVF_Ugt79rPKe3Nsq7nxSH0i0Iw_5Xwzwg9tKEgrfyu4HSfx3CYhr7GXZ4Ngt9b6C7AT14RwUPMJn9s_6maxVt_mGAFYZZNowvwAX20zrTGB-9mISn2my7Kzxgk","iv":"Z3E8pNe9CQbKoVk8","tag":"KNnMD0_g0gkudMaMu0ZdMA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"mtX6HjMdgJzXFVE2ct2NysjfK-AfUzFWK_WUDg1-jTsGPexOQhvoin4pGSVVPweIL5k1ZROrHSbxocGyTjHmnox7QnVbkVnJ2Dtd6aYtiDmibEhY1v9cgIw2-NFPHJQ4b44fy_ovSHFUH3Jcs7q0l3VBrhXOZPU0HBdbjPgMBkY"}', + ], + [ + 'input' => '{"ciphertext":"J7OYhHw1S5EYipkRAFFjpCYkzV_VsmmQRZXNRJHhxc0sMj_axqE023yL63ltZhil8N3rlwFHShKkCT_HbEA53RuXcHrKrkpBCCq6vmxfZO2knKHjUv_k7wzXNCi6z8TvhE6yX5NMjIetBv30CbE3aOfk9gTa2nT-A8Xu2uP78oqvoFFULfhv3vQBx2-g__eRKhaEdzZ9GrbZZLhrIPtsOo8Sgf41QyY","iv":"BjA2cnG8Vj_2FqDt","tag":"0ifI7hCpz3HtsaykvqTx-A","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"UC1F43FkAeURaolsPXKRayZDk8z05T8jOmZ8TveoQiKkHqtH_Ph0EXx6srwtvGiocMB7VOreeiHuhqePx9U7lSq15MzTtoHOPLKI9FWJ1dEYi6FndpBPkxfXxOQAfc03XslSY8TA-S0dYdWxXEgVrJ43erROJX0pS-jzzj9DcV0"}', + ], + [ + 'input' => '{"ciphertext":"XnyZ7w7GFsJ_faDlBtE1p36gMcYpo3HGwFY8qkopuFRbrAqSPaNqPsUXTrI9627jEGpLBv4VuAXIUE6CZPcSYK_n8amYcL_Ji07FdMDRuR5-BQHWUKMeSVtYUAVYDe7LwZ0GK_xCfyPbcMTb6fKYsvL7TE16SZzfHFdSOhT9m77NiXiLJE-NExn-uqWf8t7xQnoi9YU0bx_a4xwNK8I1AC2VgY8T7_tp1oaAZe51lrc","iv":"0geETbnN9S9VYsn6-jMLLA","tag":"OZYNmc4UfJvSR37SUk8rmg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"WjDBeYp_H1lRkJP_0a-jP0kAVhAoIyJuQ44qJAQsJX5ElxWk6YdxX4KUaTiHHsfgmSbocZNF4YrrlLjLbevCQMIuvMCAHjg_OrbnmbcWZe8DhuqWbYegDO6l9ijj8p7FkQQ_aS3DMLxRO4dF439EKisiJMBtT_Wo3278sCCfqoKMEny2IkItzqXm_maWRTEGIQc2hmp0xTLeQJt4Dn1JQ2MQlw_0ZtraU-xblyqxEF1up8f_SHA4B4aFIbGMXbSormP4qvStwyNL94eyA8Dw9kLe1-Ii8BO8ZASlNcssWw1hpigtyill9klFPjRKxBrJbn_G1d8dgUs81BpPH_d3PA"}', + ], + [ + 'input' => '{"ciphertext":"X7VkvjUSIPZEa7hk64LJ_pnONh-4E8x2HQE_9eNr8XsSUGUVz9PCuKBpIq3LrJoD2eTJA2OpKvVkm5InOH6Lvqin5hhKr43no01d1QCF81nZnU7mhaw4C_ag5YJvNqgRkX34T89_m2W0SBWk1qXDn3TXR4fz4NLKJwnZ_j3Upy_NMz5JsMtCjG0GZhIqLXHz77JA_jcSZBgdpFqD683M_b-96szPZ2QxbcxVcw5YtR8","iv":"blNjabJ8qu3kkSg3I_52kw","tag":"a4w_zKis-7yLUE5Dtr1D5rb7C68R1g6_","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"ogW4_Z0jzd2POyMx9oy4CGW7GOjL6gEHmFqdoeRtj8fQoB3ofYM0voLo-YqIlxDdTgyIqNwwTM729WMZw_uV4Pa7J9cMRAgLczsgIRvHTbYieBfqvLRU4jxrE65XM4PUGiwzwj_r-ICrXkoH-UzXUkzQdPBPgOznSzcQ2Fn5xqr_bNptKxX5b2Ppbscm37MjmEIliJavrnUmh1TGGbYSVXODUf4ER1evdT1zPWUeqcc5NJ-I2DyNPQWKVS4HI200HJ0HEGWMVTU7I6Ggjypm0azkNJskC75Os2rMoGaNy5UOtfLq97yCTPzcZ1LcBQHAJP7bh1rxSj0BHZW0mTN2GA"}', + ], + [ + 'input' => '{"ciphertext":"uha6DjGNNpMcOFDgn87PMyTJrRSoTdVgCyXNO5zk8bzJ9tkYEy_81lXlBX7oQ96YgOCugrEv-4OND7y4c69GFO0m8_v_R5yIuX7Qpl2OAj30WQd6v1VC8-JBXDW357_6L-XY7vSuCvQHB1wnVABw6onKGz92raOW_xrIi_J9wx5lmzMLSth3BalXe8VhcgiRh4EciIjMynIurcVMuZ3rstSjQe2k_7BQXiXpWInwy9E","iv":"wpwbjyGnBiMvv9-bhcorpQ","tag":"z_WkrSiMw0X3EhU0JXSOu8Hm5ty9aYvAJmunXZ_eIKU","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"QRIg4N6HwngfX473i6Rp869h69EVTbjMAQ_5EV_TrWOgq4gi-ooxooOrJ2Sxm6HvX52UbQ04F-shaAwvEA3kj2Sy8zqv058uX_BUutNF-hE4pV1DyRqXAGamEQuvq8X4t8BXWS02ITQizBOy0znGsJKopKL8dR3BttcONYBfuCP58nPOLEg7Vsw4xAKC0Di11ppumBJD3eFM94ii1XecikVdMqLlHEP2oUZRWFCUUltev1Yhj_JZzElvSABvbuNVHFwJYrQzmhjq70WDVEJJIrpVVfmuwNn4MADw5B9XrT4xdTMDligt8lqIxNd5rxItxLv3n8HwLaDFoOMrgR54GA"}', + ], + [ + 'input' => '{"ciphertext":"W1_OC0LkFGUPJSQetkjTGT4WAVe_5OeVVIq3YKixV8_heCA72OXJppapE58tiQktfbsxgG2PR6my2HuHK5IMdzf5ugF8ALQaGBNnHvsOCQZA1JZLc03QPRQGYgbRGhDkxOLNxwMzYPytQLYpcxHVsVId39-3IRreXaZbd3C_SvTFlPRx-6wD43ExWEpdBnxnn1xHlw3xU-HdOjZQfSRPeUGJoF_x4t8","iv":"BXm6XOtRiw0dJd94","tag":"r41IaktoReqoeamFZ9yl_w","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"IzFHtCyOENKi22ePBOtQcYRBIjGIdqP2ZE8M7nulP3Z_iaS-IB_bQjoIRQ7hPzKlr_jNHzb7hAYaHBZ7TfV1f_q0CkYtZhVP9jQGx3Bp0VVLaHhY_2wB8ojU58Y45Q7NYtTgsQLspv9PTdxtFaZhoQcJTqGfWR_X8Vh1q2vhVWKp5rNBxvQ3Cq5uDqSnzDRy4Yn6Rt800Mm1nmgToVnj0laAM-tBdvjD76ICD35GP-cxL8xZ4-xFrZ5SOuQwTARsR_ruoECUZsc3Q-ddaflSN9qBIKObId4czTBlt47aIS6Q3NuMc4TtiYWu_QAdFBviE7uPrhMSHIA-XqFOtlQGWw"}', + ], + [ + 'input' => '{"ciphertext":"sq9GLKF4P-KXuxBy_LNmntSm1sZz0tYT_f-i2HGO0xl6af53QD2WaFAm5PdwSBJXZKkf1d0nNLP2XqA02zkuMSh40KBz41oHPzqTRHrLd2CbZuL8FUR0avrNMXw_7-1I2cMYS5USW1VNuUDVjwqy-ohT8-_j-VeA-3q4Jt5mPSL4GSgE5EkflJ3TpeKfTsW04G3vrsSFH6mfJPz5WOCl6vfQHzy95NQ","iv":"8YTVo5q5Fro7BTto","tag":"aAiOhoDVrprwYY2nsmO6MA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"W2KgXKz3Cym1VXSd2JNUiAFWFEDmq_kGBHVC9g-eJZC-ZztcOnh3IgYCepbhLpVvDuj42E4KorCF12Lk79OAwmmcfZ-DvsLwgp60L2Ho2qaUl32TVmHkuKzN2RwORvb6QTMyOBklt-2BEfLC4mqYYI_755MM9noUrpA3lHkx-b-lr0l8f-fhGCWKrgsOidsfJN20nDEIvJL2PqH7SXLDKDHgY9JFdF0NfZJnZIUOUJB2kCYmaJ_CqTF6fPypBNRGwh0Wr4P2Zko9RMOp3Syuo7W3NPb05jo6xR5g2wxSOnK_WDd0YhnAX1SvBtgTq_E7vfhy6A2YO9QJC5kxAoTqgA"}', + ], + [ + 'input' => '{"ciphertext":"M_MGtxHwXLi350tKZBQPr1gSw_4c2NhXtxKkZtFwELSqRvmTuUJxKiU_tkr9DWfHfoxFT586LpmGjOeu7u-4asToZ3BWu8namlORdkMdOO4k1x2ydeygWdWUfzNkwoMU3Yn7_zlw2PVoDkZlEcB5cDidBbrUHbKugAN5ZBOBOYCDoonsnRVRtbs2HKhi3J-YYnS3hgQJIlYDXpasb7YxlV5NerdZQu8","iv":"YowIbccIgldZtWhM","tag":"hLaDeUhCkt24cDuIaRZPkQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"KDmm43wYSHFxTbeQ3UwfB_Grwpf7xHJbX_ytkEQ7aIr8BPXwUPRPk50Xbk7STQQjdTN4IdB47plCVcmtFVVvVr1Kb-9Z2ouQEz4XIymvNfME-48afqA77KALuxIdJyXnlaHfzagSxM_r-CwzR8qMoiZ31VCP3uWcHVaoG7A2tzHJMvvDy4BosJ7Q0j_UQN9FiS8ZsC-CCjBtSwtG9SBsAk7ni5891o8OEkVvi11Mqybz18zQ5VdL28pq0yBSicCZlPyYXVbkpv0svHU8VhZtqjwKFmEblwuou3TduM9GATSqP66PXNjEZ0IbnwBxFStNMy4r1bbGvY3cB1NLHOO0bw"}', + ], + [ + 'input' => '{"ciphertext":"nYEFVB7x9GwrdWCfPopHrnZz63pUMJPiluUvP4uKjMZLmMfSXjirkPFJHLNenvAnY9N_St2MsNVRjJGVA8BKpD5Lou9as1LhQKtZvbbhSFeh3Pgtl-dWkk-pPNlUks21xhulz9-WkcUI6UDMECubhTCyks9mQYs4CGYn2-N8YqvGJW-MQY-fKmI_ANLqYmbrxDBg2nLVZwedI1a1mZTvlBmWg6y1J9iliSZmNx3E0D8","iv":"MXJVPlmpK2RmNGH8G12KzA","tag":"XP7oILWIwDQETo5svidYtw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"Gn6OkvU9Vrj4yW8bEOYQXrZ5nHNTw5NTXj4E8RtYia0XSr77p916dsgJ7ydM-Cqp3bc-FW-Dw2mJzNG9aetUBImFV-C136Zd8qZfurVR6wdmknRRVV_EYDIGEUJmUeN20if7tUP-rxUEVN6R0ROJ-8N_XwDmlxx_kxqjoNBU1GlsGSyPhVXrBPOcHyeLrTQ1Dw4K2zzlOETcIg9HNq2wOgeMl5T7cAwAPup9IYhAYQPijwbZlY2Fh1DuldZ_lrGD6jQSRGKho1aSRd7i-tVyOfLU88nmCN9lInMIXlOWoiTjbip7e0dfbh2_Q4EDg-bwsvolgsiVt9Xqrz-2E1q0xM7E086KcFFG4__xyt0Y5J-TPlrX9oL1XYikSYaJG9LkSdUbuYNqqTdx8tRvpX_-r_zP7qlvTPZEsaR-Pa_ICKohZfqxMuU4c7ZEP2ayOLDDpewAm3oKX5Ln5hjBMNrWh-chsNin2t90Morq72xsCkKhRCEczXljQpp574e5j-8eIOv4o-LNCaf1liuq-4kHl48B7IkQrhNQtSJ6sEf5NyIItesD513o1XRcLadH4VYmn_zbUXOpTWcy32EoqawV8SVamku1MBup2hme01i5UPstvJVU2TT6lPAp0Y1IQrUwY6z0CDzT9FbUvJBi07Wu0GNj1hFrrryZaI8DcEMnhpM"}', + ], + [ + 'input' => '{"ciphertext":"IunHcQrdO2xEJO_DTbjfC9RodsUSE8YBHSSdtJW3DNDHfiOeioejCgXCKLWJRXhzOsC1LLcgt8n1oFncw7QnoMNGq6bhUqJ9o53CoetZTwP_aM6lKK7Fq73dRmj_ejcgphIAvlhEjMGQbi60jgBgrerilT4N_S7x3f39CSX2VnDScdHlLnLLj_822sjQoxAOFGhMQ2FSXLIISWdCxUQG13xtK-RxLRJhcL_F6rdQpNo","iv":"IOYdkjO4y9mVjiX8RNlh0w","tag":"xy6A83DIJUkEzKM8FjyoyZfxpCvGfqYK","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0In0","encrypted_key":"ulk_x1VauBMMaN_FKe2Db6fk4RBwiZRKCvBgYz_ddJY916pYBPwZ4v9YmL9EtxU1isbzgXHTPjHHWlRI7PdqMZm5_kdzgo98uxd8cklLTDJz8dcA3-DQmcFmszOG2Wh2_vdMdUnrQxdmM8cI4k62zZ4WsCM0rGiANE7KRSieuxwkUHYXu62i9U7WT1m9re0UnNGBP_7kGSYgigSJfTsoWRH6eKGye5bXAcdOlfbo0hGu1i_9p9duClP_u9AR7LSxdUxzmTSW9yjHVMSg_PhJBIw9IBqAtfTR9K6ltzxbVPHRXzeIaxU8u14u9UE5ubIP325yot1XAdS-2r9tW_UsaPxFPn-wAuguU0vYcJoi_Lng7ZUf_KwpUXIcKplY2nThnZH8Q4GDlvrmDMUwRET9Uv5_rspX3VLL1isrJmghV4CyO18RX8bpgEYGqMhssXFPUTipcAlbWPIDRt-sjH8LpuQ777bygBFNwtBoAtK5CTL8PgdWPE7RORVKGRJGkcnsqiqyWKnaztY5XIOG57fFgQ055zjfThBKcV40Iit-FwSeq6NVyS3FSiJlQ4pJVWkcebhNIewOO2yvbQFyj_HMe5NMTPyJEZIL8P6L0b6VUsupMVkaJEM8ZbvvjOQ9iU7Cs7l9S1NWLZ7reIxNT-JSFHT2IrAYxl_BdgbBrwsJ5Hs"}', + ], + [ + 'input' => '{"ciphertext":"1-42J-20SxLWe2xcuvITQFe4uOI83WEl8DH33pCZAMAaWfiPPKFT1GEHqFApj90pEigPZ1vieh150m05DDE5iE_I1Oanp3RD0JtF7kFDQGl-WthHEpid4BffTD70m8Jdy2DBaHLAnVoshQJKWTP269Xvx-avbU_SQfGUCa9uOoWaWGEZ99S4i8IMyMIx6H6H-buTBizeeMy1C14WPmi_IBu6HF_V_5hk4xIXkeN1QNs","iv":"rD3ssiyJAzK2w_NBCu3dhg","tag":"pOegUBPvh0mwRfYuiy_Xpn-QoY1iacjtNkRqY6k63dU","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0","encrypted_key":"A0pMdy8sJfzd3KHguIGU9BiYL13lFsjkud3qY-1Roofxgq95jCJSg4Gt5t0ob52JC-xK7mtoLDhnkRbX7lPVaDdUOBQ1fK3eueFZigXW63XUE7xJF9cRJrWQ6aPuxgdwz-DhIbZP-bfozvSg6SqvaMNZjGgtiV2-Xd0awzF7ZtZbJEVOpgZGFV4PabGvVsZ7OA7ezQ0MUauwz4JuWDvggebiFESLwJhsP__xR2NhFWpcIBdOoKqYy1-s1cHa_TBoqq96q5OjYE8hz6NVa1A50WeudTflaObgyY2_cze_oXVbd77ve5_i1k2SyR_C8D24tCwCFq-zZnxoSqXzu1TI8ddl9yqs3DXQRGv7ow1R7QIF0V9D-2L-LcP9xsQ11j45FEoXI-TM67ob4AxkrLzGY8G8tT8ihTF9LFUyQV0qBA41Tsu-72-c_rdysigmQTjI7zj5BBi1rOPKJpewZ6QSpDP_D0Ko4Iv1WfCis8D49WqMguLI6cF2Ph5HXIbuzXSLqJlzJXXQvvxP1Pa3OVqrUUVJ2zIwoA1A3_og6LNH8qpeeSUQn9b8Vuoo6-xlGhg-iUHPHtWRQNIdDAu39kSHWLxGRdA1CKPyRk6nZoFFESSc-9nhWB4zb080Lm3YKEm-4EPVdCwdDavXTwGRS3vPx6AfFvaCn58dvU3NNQXMbOE"}', + ], + [ + 'input' => '{"ciphertext":"mrk14MJdDRKyqlvjahhsHdet8oXYuqTmoJ5BeORbij3ZyyAZVEz4J42gjtG5wwlkR0rB4BazlrBcaBZdZoNK1OKBj7h3s0QUd1nMhF5qA7h8jeiwxirXOqhlwHUxpEPWwJ04XcS-eG4VI-DOSk5Tem7bRn_PlL4VC1qS_Y_ZQk6P7x-tMQLcYQWwme4-E14n8_syWyfzNqHQHRdmNmPSLZ3daOFCqsk","iv":"ppT2nVwjH0oM19hQ","tag":"edjw-7Ta4gf8w42nsucCuA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"HUGJZ2q9oPK6BTH0NBZJVKSDEq7OU1Z-8T4GLv70HbEZJ43iAjUe1-K5WDQzz2ikAtQSyTAmVySir3ziLdMUJt0vBj5iQakFtxmYD4GA_lNudh5b_12D1I4xCwjCEYKX5FByT7QYm3rU79XGNYs0gzbTKha78X9mQ5SsDgQqXvbESz-7apeAlaKa1PqyO8ow0s-Pp0wUDbP3NLjK6qozTPSf34MpDt44FAcc6TR92dXDMkvi4_SdKGKUKwvYx7KHe0hKoHub0rl_m68UAdlxJ2Hy39n-HefN2pL-M46k9SlfZiQdA_wVDg7jNMJG0pD19XWLpM3n8a_meGMt8UYcqsUagMydjJU-10I_lO--HXA4kfjulEmvXOdZrAgea28f5w_BRpoMGJnkTks-UqDfFa2KPOv2S-qYO0aNwPcuhLOIwiPRKtgcuujG6GtuBgMUleS2pNoZg6q6Gw3mQC7sBSikOqCyEx_A-CTzzXFqfN8k986QDCTx-2OT97jaaQPQ8BWVQgLzDDREj7wuv60CQL031bv27P99oZ80BK-vGiPfzjG0MNwT7BS7NC6NnhgXFS4Czo4SECk0TCmhz06IckID8xUIn_TJtQtn9gAPnyZaHV4R9YIoHx_Y7cmnc-xAd4gVk65QpviaKJ-cgyNcNuoIiklmm3CHDxaydat6xHI"}', + ], + [ + 'input' => '{"ciphertext":"b4wrAX6XyHJy01y0MdUtMqLyMiNs_Q7kHUdPYaB0s83zQ5gdJfc3L0CJBdTPV5tC4QY6N8-r6QrLSj5O-QFDgCpIj7c3IYFtjKPtpsiWJ80HyZ4ZoIBCrOshhUtCMzs_L4MYVRi2kKr-wvsAKmODw62kzFVzoEEWaEK5zdbgWbS9AGa0g2LMe80Y4blTE0SAwc215KBlY-_ONYULBecP8DjLCnu4Ybs","iv":"A6eFQhv2gXcyQAwS","tag":"Y4lDzYlIGqcqNoSpSYJOdg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTkyR0NNIn0","encrypted_key":"pyvUtlJZBjW7SY2qIesf4wJuiHsXM6Qmd0hJxGu3GaPpSrNhj19TlcNkAAH9JFoBo1i8GS3Qw6BsWBO6FXVtXqm-ZAi03Hw5BqOlaVz5Ls_Ruj6z6GUxa9MYJAd-iIWqCD1yCyT578ZwHZaarAA2tCuZMADxaQ74pBaXUggt7UmU3D5TZiEHuh4ShjB2CJR2fxJnO-U1GyAkr7j4XbFU5xVoxgTQDYd4FlDA0KDScnGd9r2gBT6TnM2ljA1nIyEz7a5qjDODZvVWTLqEmoRNgXzXrWT0WTh1wCrh0Q15JY_qLoTW8bWTBbs1bZLtpLaU0RL84F3iaEskcHo4O4VtSzKOQyDCVchN52gFN-yJ_IUTXBgb3HWJpM9QIP_0t-sAcg37CPO-JeuvrdT5e7_s8IMdMw2QzwpFdUT86FQAdYDYLKwG8TzMwqISLKkMeRZpt2N7XgKrDSTX-HsYLzWedc7DPugHfbEl2nknTFcmfjDj20Vpr01z_jWMhr6gs9612ucx71i0qYFk0PXDUN2dWY_w_ff790KNA5EEYlQLdnJ6BH1N30I654v23KUR9gs6kDy1KyHUuw-ylfByYXYT8du22vH5DzXiyW_ldHov_WULhGupABcE800ou2TPf94LOkfam47M8CISDJCqJ-rtkCVza-wCCw4lQf7ZvtAoJUE"}', + ], + [ + 'input' => '{"ciphertext":"05bmbpoOhrkgxaKrD15PJjOapFOMm5XdHCiQIpbDrbh7_yarzAOqtsnbhocrJ-3bNVgU4i7DevuNMWDdrM1BQDXUOmEKaNqx10I5k65aOE3B16--IG-RjOxdlUGj5YwQewyi98twt2SEmAwJJy7XkAaULrWYGluklqyg5XMBWmpkRG6i5lDMX7um19o4mtOkcWhp0uUnbuu-ZIe38eOivalJRQLXcRg","iv":"TibsjD24NcHTumc1","tag":"9N2CVWptZDd5IqlxuAgmJw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"aM2uxhn1345sBBAohoHchu13E10LDU79BXdO97HbAqtqQf8CBw8vt3C39CCNz46J5_IIpSYDjvhIgj4ivMCR0hPIHfYdWcAmtDnzKz1kbD4olHE0aQoOe-Vckg08J6-MEXeHL9yPNFhLPSo8-SrMAnEbSeTYB88MEpABXOW-y9cM_R9D6zO5trinfu60TjCY_28SZl54i22g_U3xx9Rzqe1nnlZmmoDTFraMv8_WF9Mnnk2S9gXwW8jHe2QSXRSiyouyNIniH2ff6BM-YmI0UEe8yBtq9BgvaQpFWq-XXUcsi6a9jhr0TvizCrX9bvqvRd8FnehZB9MwkI3nyk7CWn9cvIx4oEzNwuP0iQlPu8mZETSV5Mbaya8qsT9mpOSRqEEYcsZHnlpXHofs8HE5_sCqLQy74kc6VCJ3h82lHLoplane9xlfuPulTCnuhd9OyoyQ3hY2-ZDQdfWa7bhmOdSJtUU6e-pC11pL6VpZ-NXjNciuBtT8AZ58lMToZ0fm9RT3zhzBcWuDHbqKfWtt8NzC1y6zaVYiTuTXNzjNBf4NTQe-2HW1sfsyKbe2cxDGqxtH71CIPoVK40gqoWBNiexkZa7ZzwLVD8-97jNx0O2ndFZ3_xhY8359fbxPpUqQTnoRABYmo6CDUgH_uU7nKVfqHldUB5m2RFHfQgWMLDk"}', + ], ]; } @@ -83,37 +128,39 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'RSA', - 'n' => 'p_Gffumd-Rj-hrWEKMZdfOw0JZci3dfVCkLYYISt60ajg8aktRR6Rc_1m_NMPIP2_BK5kXwWb74lqLh-x0iunfpgxHWnw4Wy00V2YwR0MtgbRW4JYyJjw9Fj7QooWdqRV7OoJb3VIpmBqr-JKjTV-91W6jPWcQNsUFYL5JsJ-sM', - 'e' => 'AQAB', - 'd' => 'pYj2sexpJj8pmfPOaTZkrZ5QJAEdf9aeiTer-S6uEqqUv22LqWSexLMfHvEn4rocNwfp2umZX9jnW69GXv1YBouBqrnN4vANPnjFp8y7ejKO_XDzKrf2c5YMgm7l4eE6aCHzEn2kFy971f97HN07KfiHNTln9boNGVsA6TpVrhk', - 'p' => '2zIyk5fQMKC7vHqDCGQ-xEXRgiTZsQ2fN5gQ7rDsvGJdDBfpeWA8H3_bidSCNfAskSyhLoEFwQplARblm74BVQ', - 'q' => 'xCRtcvPKTJ_uRZ2kxn8zMlETXcq1CBbuMLhZDl4QT6ksgAoOqnqITwckSXL2sTXTmDwgtuB1HYXk4TAXhwbrtw', - 'dp' => 'EVJfMtCtcBpTm6pmznP1jdcinlFBLr-v1FndBK_QlXaEed8t4Rycw7R76eF0RMTtEK_hMOabSM0EfFiN3ofeXQ', - 'dq' => 'rA5MWEcU0YyFhlnYHiucrGnEdEUJ8pOy09gSfvDym_6Jw7OO0-rywWhBY5DOZ_sQpv0vsVxKP-ChOwxlxxPCFw', - 'qi' => 'FKqVgknFuntcWE0b4NSoqROngDbxLd-lQ2DWg9z7G-knJTizDwj_7tSlNbqYlcbXXNf5vRnhQCePb4KqKyPh8Q', - ], [ - 'kty' => 'RSA', - 'n' => 'slVGbcg7Mr_tQmfDJAIWrlWjBWpi_JzGTjCCVZGOikH3ekkUEH8TN39WJ2HXBwSNmT4bh8eRJsUyBKYr8yz3UdEUJxloo2SVZEN0rXh2Jb84OdObom1CFbPg4yQOvLN57pE06zc7GzQ1MKF2dqRFvyEyibKcs3V6J2DjvDXbxJAnTOmxWjLRKa6v9aKrNCakK_qSRzEwR-IbNnGHSrQr1RaDQ2gQ7FuVuNOJe8rrdlP1dIdg3ElzvDgjg3NY54b8SqwThXt8gRM1VKg5O-6fRdHLPS4L0DOElDlc8lboqA6oI1187cbLq__4P8c1pordIBmHXdbSd-4Q1BYnNVqfoQ', - 'e' => 'AQAB', - 'd' => 'rhaTB06lg5ha3C2BESC81XkiCIJfmWzOJbwzL6dFd_CHz6eRX709nDrBdvaLO_2U4VkA9R67sxZkCqfRVbW6xfMN8lFalc72C4fSWhmzdIvkLodFcl2oWplb20Dy5gFq8ZptB4XGPHtNxWiJxa39rGSS-lsToBj5o4FxL-V_4bSZOLWLfUIaFS5xJ4xZ6rLAH1gd8AlUbQfcwToDCjzyWSZDHFqCtOr10tD_3OeK_SdQoG4FGpnNo4WdUstTRTIYGaN8N_ThJh-f7bWUomEuBFhKT6FCXkxHbPfq1t3q9YhQBmg2_Jw9gUWD4lukPDpvdp-_blMRqs-9JNkL8plEsQ', - 'p' => '53OBPF6RmswOMkuK8MhXjLT5NNCaFce9rKkpK-8KHK7UqVHqW006mzJ3kYVm2nIFODCqSO6RZcmEhLgrpZhAqbOl07lvh5nhhiXJyjaw6rcCumKTbjfX8dksnxHG2ik0Y8-1PHJwhIRHrjAeuf17XHgaATKOSxDVYSk-A7MClFU', - 'q' => 'xT96R1C3y4zakgYWdThV9fn4sFgrlUFWrcMiis5dldl2k8aQrRCXRzWUNMK9G12ibBnXipVT24ZOQKJ0bqeoMU6aopY4DlsyWSzCEfJ6ojSE6Jd-Wnwb5TglNhXTq2wPjkpdbGTum7UeXYhdCJdwhc1GUkIU3ctTquY4isuyih0', - 'dp' => 'f6oJbfgnzj-h0QI0KC4JhJZKI2SwqTTcnYFNMWuPo1SX_rEtWKEXo4VJyJ3RpspfsKe_Na1Jy-BE1UQU5yk8-Z4a6NcO-rfZWro7POu_2CeMPKyk75Wj6kXFRBR1H968hBWMvUPOZnnkY-Ms_6AezFl-1oxBSoyFditehoHV-WU', - 'dq' => 'eoEtMaOpMwt9KFoNkqn1gXrKAMQR9XYKHotmJa17pDjWk3ssmcAHJJvbO1WDW76wxNDb9F9AIMRuT2hWRe9s34rBMZ94mzn6sDXDJqBhl-JkdYy5Vftk290eB1RRDVNk6eu30D1zkFNR06eAmHht0zwlo6sVCJdilG69yT4v2eU', - 'qi' => '5vefHlL9JtiX-FBMYT6CSo51c-tonow5cj3Jl1crRuxod6zjXM13dr4bki40MT_ZQ8x1kjerFuoA1fYyktTAQnRgcafjYyZJIkh3RdGLf-_kDQ_up6v-k4IEile3RM_XST5lyq1ei6UuRO5NQDa5L9OctY5QWDz-rw9_51iKSUg', - ], [ - 'kty' => 'RSA', - 'n' => 'zBlgpPT7LeCKZbaRoX5iENY338bavaU-d_vw6xF4hYhqSBYoH2mt5WPeIW-lz9o1xlbxw-W6YnlHMuJfefnXOvZfFUNOK5-QGBq8ZJY7sfNJ0vxHJ2FJ8cNvpChTEqG7CRU6ZK_V2h5XuQFg4FGASbEgiJjRoPHrXwwts_e1ICIsW0Lg_YGBOk8RqlzguD-NcexYpO_N0VV-J5J5jlVxAEdVgddT-d9sGBx2Vq3PE3D8ZMTZ6UXTvmmdGK_CA-0Y7ep3UgYKVRmv2XLwwsmPWYJy8Ky9wqTnt58Lz5H6iZAGmgEztaf7hB-hRymDTFRWn2-zFhd1-TdqQ6xgZyfA4Qp7vFe1s9LZr_A-jFN2ZO7sP2x6e0dVDszzo0dJ41jrY4aP19hpOnPcXQ0sqjzahLmajekmtM3GjqBd9-bODXqCWiOhzc5Tl4Ru7_N1FEqUXVwBJhWelChez6DVTMeNdIJVw36ARtVNdsBwNTLK8q8n72cc_zwBmhFkGBdxHercMjmD1YJAaRfXfh8OJBbFJDSZkMp4N5PwK2iM4oy79xTsB61OZfEcwf1F4LKSDyyvJC5Mg1_Imc311nAdsDohBQMZquh-V73c6DhhBBRaAKk1esQoGUgLVBXsfR2RABr28WFM8RmOZKRdpI9AJO-6Z8X7a4JHCldljpyOX4mwWG8', - 'e' => 'AQAB', - 'd' => 'WS-lua-Lqyp5j6TN0oIFnFHfrJuarlBtEcU4K6BAyCkqOEHmWoO1h42yXW4KSN-TrA4GK5JRdgKFCEk_a2-vi4ZpWkNE_28EamQUeufjQgmL8vRmq2CqDUlXmaY9VuDxeDCcia8EhgHIV4GwsZUruAf8rXQJ9oiAT9JkjkXqEhacx2xcIKrcq3wtvgJD-H9c8bFTsw9PIvB25hftojLX5EVHqitL-N6Wv5qAY7Qjzt0KjYYvqu3mb0h7a3QyFcEfqadRaLhW_4TwANdnOdcWGwkT7POvIEUrNGP9p0Ck-EPFfrqTvAehssSXlx8eztXz3EvVOAwcc0Cx4MyMe8c1UtmKaXu7_v719irOXtECAtr7FfK_ycFA9dVQbKKBkj4MAidfgSLm5m9Ago8QnuyPHHktCcMzOeQNe6eY97rrBNpI3XEJJM97hnaIn1_g-poQgrnpYSZhTsDaKe9-ls8sD6RMqWHnVGe_bXsNfdi5G3iMqXAY94l0Eqrr_jTXdkmA-xTBCFfHcCLm5RDRBgc1zVYkl5d8rW822pyN4hfJsV1JR0KAltUQ2TCFR6fo0e6Ne-YbZDBHHPAD_s3m-2zSXSlODIG-bqR7beb8Ta9kjZo0advMbo4HjcY_qqd5KIY3HuyQWUGMABg96w_JxgFXEQVp3a6XQJaewQSRhsxTtGE', - 'p' => '6l8TYYzb7VxrUFtKBbF1dTFjsRmAOajL6BGNB0Yyw0smZUEZL-HHeW3NzN4qB03oVUnNeAKKOde3-8mgDxi1qzB6ytqhJqrv0iRpsDJax7OP_F47um33nWcsipCHmzczM7f8HBmzD_beoMPGvsoUAzNIv9Ka0dz-1hQqz5etiKSMMwozAnUj_TqPLedc4DG6EaW8x_vgNfW-_puK-IzwsT5YjltQ8weufNxLlrT2sx9QT05jbxe2YR2ijNgvKxo-G0wz9A8pn5wiPB3NsdsHAy3mrtjMEjwv_Z65y0XPPO1W1Bp68XICknzghgTc7nZR_31NSrtEPmQBlJqoJPis-Q', - 'q' => '3u8h8WiXSx6AtPGQpvmNebZqi66ITQcAhvdF8O_I1LdjswBTZwpXqKXb5kLBPXOAH6YqgxURNwZZ4M5Ys6iv66jVzPbSU_MMHlsiXzgeVfUxwbdOHpiZhRzoB2gzznfFDKR8bu1S07tYePeaEwplsSg2Vb5tC81uNIM1sshfeuDO5cZOH8DmuJzTjhGjb8CWmbgLnFOSBuPl-Vcr3oYVCnWzvEfCgUIy5tC9KeBC8Qe3O841SjbN3yZ8EEXwcUmo9lOt19s3LKBmtT94SXtok6-wHVWlL3YbzRg1kl8SVjN28NJd990mjPhjqBK8KyChCxoPn8lIXEUwGwFmIz4Spw', - 'dp' => 'tYIqXVscnAf-KD565kvX_ongfjCUqJL8T97_zIlmGO8jbjlrSzTdKkKKpsXL4NpKO3srwGyfJkrVdw9ggTCOyWSDRITrVyn9D08Z9tYYjh6XPUixkyFFKkbULP_ftaqbYct0WULh9VQoeHMGgY24z_2wsrZlJnCzf5Ig0aLTR0bAOWsFtDqKQ7xNVKygthRs2Ov1dx-vNbr7Tu2hQ_rLEUmKhb1cxMrHLHXjqHS_tlti8_huc4P2v-GWmON4LDZnsPZkKfhwMOdXcB1Yxwwssx6iT_kgmmK4e_-oPi_zXmkk3KEhY8n7Cf3iWIh9ncROnsIo0N6U7IjA3Jil7fQU6Q', - 'dq' => 'kYMy-5jST_Tr-69FRMfU4WIA74WPb_-nB3F1VIue4cGGMPuAdNxaVTlVbFmcOlkegwn566-fmfPqTINDgJkVotOEIhHlPWiCO3ou2EoP-vldbd0Q_4WJh0pT5SnNzvF8TAE9O0Zq7sr1N5geGFmMAPOHa7YtBSwkx9_w9-4z7Ee6pF4o9i76KfwrVisLK9FgO5vW8EXYJekxXevZNZj9OOOU2stYGPi1stUC88duylbH8iBpxjQ5cnNzPUf5Zmi3AXmjGib7P4S_JYT1JbmIjAV8Bdm2RWFpShiINy8ZD-ztsMkPDs9p70_d9IGuEtRsaYusMRa3xYpfmPDz0wMcNw', - 'qi' => 'sEHok5K2HG0q6JdNzHB7FsM9EJxY7c6Gkya3Lfr1Rr5OYPcAosEIZpl-1_hCQ3MLGKT9UlYjZrlyt6SOUvCkxFX9slDZQeagmlSNMyWs18U0MxhFpEGthqLthS6ik0kFlschiSpMMyKVI8kgQR3OjMDcA_Mr92gZ9fl-mhtl2yfXJsBIkFBD7yOyxRxawy7v05RehoDHmdy2cnzaakPvg3Cekma2mfdjYgN5JnS0A20pC1zfoqi0D3B4KGrYVZhyJRnBakOUmwvE8rfmcjThx169LiAea6SYs7k9jwUCVWrNexXItxGdbQbbrb-FUotAcAQSDr6hHU8H79gN63WoOQ', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'RSA', + 'n' => 'p_Gffumd-Rj-hrWEKMZdfOw0JZci3dfVCkLYYISt60ajg8aktRR6Rc_1m_NMPIP2_BK5kXwWb74lqLh-x0iunfpgxHWnw4Wy00V2YwR0MtgbRW4JYyJjw9Fj7QooWdqRV7OoJb3VIpmBqr-JKjTV-91W6jPWcQNsUFYL5JsJ-sM', + 'e' => 'AQAB', + 'd' => 'pYj2sexpJj8pmfPOaTZkrZ5QJAEdf9aeiTer-S6uEqqUv22LqWSexLMfHvEn4rocNwfp2umZX9jnW69GXv1YBouBqrnN4vANPnjFp8y7ejKO_XDzKrf2c5YMgm7l4eE6aCHzEn2kFy971f97HN07KfiHNTln9boNGVsA6TpVrhk', + 'p' => '2zIyk5fQMKC7vHqDCGQ-xEXRgiTZsQ2fN5gQ7rDsvGJdDBfpeWA8H3_bidSCNfAskSyhLoEFwQplARblm74BVQ', + 'q' => 'xCRtcvPKTJ_uRZ2kxn8zMlETXcq1CBbuMLhZDl4QT6ksgAoOqnqITwckSXL2sTXTmDwgtuB1HYXk4TAXhwbrtw', + 'dp' => 'EVJfMtCtcBpTm6pmznP1jdcinlFBLr-v1FndBK_QlXaEed8t4Rycw7R76eF0RMTtEK_hMOabSM0EfFiN3ofeXQ', + 'dq' => 'rA5MWEcU0YyFhlnYHiucrGnEdEUJ8pOy09gSfvDym_6Jw7OO0-rywWhBY5DOZ_sQpv0vsVxKP-ChOwxlxxPCFw', + 'qi' => 'FKqVgknFuntcWE0b4NSoqROngDbxLd-lQ2DWg9z7G-knJTizDwj_7tSlNbqYlcbXXNf5vRnhQCePb4KqKyPh8Q', + ], [ + 'kty' => 'RSA', + 'n' => 'slVGbcg7Mr_tQmfDJAIWrlWjBWpi_JzGTjCCVZGOikH3ekkUEH8TN39WJ2HXBwSNmT4bh8eRJsUyBKYr8yz3UdEUJxloo2SVZEN0rXh2Jb84OdObom1CFbPg4yQOvLN57pE06zc7GzQ1MKF2dqRFvyEyibKcs3V6J2DjvDXbxJAnTOmxWjLRKa6v9aKrNCakK_qSRzEwR-IbNnGHSrQr1RaDQ2gQ7FuVuNOJe8rrdlP1dIdg3ElzvDgjg3NY54b8SqwThXt8gRM1VKg5O-6fRdHLPS4L0DOElDlc8lboqA6oI1187cbLq__4P8c1pordIBmHXdbSd-4Q1BYnNVqfoQ', + 'e' => 'AQAB', + 'd' => 'rhaTB06lg5ha3C2BESC81XkiCIJfmWzOJbwzL6dFd_CHz6eRX709nDrBdvaLO_2U4VkA9R67sxZkCqfRVbW6xfMN8lFalc72C4fSWhmzdIvkLodFcl2oWplb20Dy5gFq8ZptB4XGPHtNxWiJxa39rGSS-lsToBj5o4FxL-V_4bSZOLWLfUIaFS5xJ4xZ6rLAH1gd8AlUbQfcwToDCjzyWSZDHFqCtOr10tD_3OeK_SdQoG4FGpnNo4WdUstTRTIYGaN8N_ThJh-f7bWUomEuBFhKT6FCXkxHbPfq1t3q9YhQBmg2_Jw9gUWD4lukPDpvdp-_blMRqs-9JNkL8plEsQ', + 'p' => '53OBPF6RmswOMkuK8MhXjLT5NNCaFce9rKkpK-8KHK7UqVHqW006mzJ3kYVm2nIFODCqSO6RZcmEhLgrpZhAqbOl07lvh5nhhiXJyjaw6rcCumKTbjfX8dksnxHG2ik0Y8-1PHJwhIRHrjAeuf17XHgaATKOSxDVYSk-A7MClFU', + 'q' => 'xT96R1C3y4zakgYWdThV9fn4sFgrlUFWrcMiis5dldl2k8aQrRCXRzWUNMK9G12ibBnXipVT24ZOQKJ0bqeoMU6aopY4DlsyWSzCEfJ6ojSE6Jd-Wnwb5TglNhXTq2wPjkpdbGTum7UeXYhdCJdwhc1GUkIU3ctTquY4isuyih0', + 'dp' => 'f6oJbfgnzj-h0QI0KC4JhJZKI2SwqTTcnYFNMWuPo1SX_rEtWKEXo4VJyJ3RpspfsKe_Na1Jy-BE1UQU5yk8-Z4a6NcO-rfZWro7POu_2CeMPKyk75Wj6kXFRBR1H968hBWMvUPOZnnkY-Ms_6AezFl-1oxBSoyFditehoHV-WU', + 'dq' => 'eoEtMaOpMwt9KFoNkqn1gXrKAMQR9XYKHotmJa17pDjWk3ssmcAHJJvbO1WDW76wxNDb9F9AIMRuT2hWRe9s34rBMZ94mzn6sDXDJqBhl-JkdYy5Vftk290eB1RRDVNk6eu30D1zkFNR06eAmHht0zwlo6sVCJdilG69yT4v2eU', + 'qi' => '5vefHlL9JtiX-FBMYT6CSo51c-tonow5cj3Jl1crRuxod6zjXM13dr4bki40MT_ZQ8x1kjerFuoA1fYyktTAQnRgcafjYyZJIkh3RdGLf-_kDQ_up6v-k4IEile3RM_XST5lyq1ei6UuRO5NQDa5L9OctY5QWDz-rw9_51iKSUg', + ], [ + 'kty' => 'RSA', + 'n' => 'zBlgpPT7LeCKZbaRoX5iENY338bavaU-d_vw6xF4hYhqSBYoH2mt5WPeIW-lz9o1xlbxw-W6YnlHMuJfefnXOvZfFUNOK5-QGBq8ZJY7sfNJ0vxHJ2FJ8cNvpChTEqG7CRU6ZK_V2h5XuQFg4FGASbEgiJjRoPHrXwwts_e1ICIsW0Lg_YGBOk8RqlzguD-NcexYpO_N0VV-J5J5jlVxAEdVgddT-d9sGBx2Vq3PE3D8ZMTZ6UXTvmmdGK_CA-0Y7ep3UgYKVRmv2XLwwsmPWYJy8Ky9wqTnt58Lz5H6iZAGmgEztaf7hB-hRymDTFRWn2-zFhd1-TdqQ6xgZyfA4Qp7vFe1s9LZr_A-jFN2ZO7sP2x6e0dVDszzo0dJ41jrY4aP19hpOnPcXQ0sqjzahLmajekmtM3GjqBd9-bODXqCWiOhzc5Tl4Ru7_N1FEqUXVwBJhWelChez6DVTMeNdIJVw36ARtVNdsBwNTLK8q8n72cc_zwBmhFkGBdxHercMjmD1YJAaRfXfh8OJBbFJDSZkMp4N5PwK2iM4oy79xTsB61OZfEcwf1F4LKSDyyvJC5Mg1_Imc311nAdsDohBQMZquh-V73c6DhhBBRaAKk1esQoGUgLVBXsfR2RABr28WFM8RmOZKRdpI9AJO-6Z8X7a4JHCldljpyOX4mwWG8', + 'e' => 'AQAB', + 'd' => 'WS-lua-Lqyp5j6TN0oIFnFHfrJuarlBtEcU4K6BAyCkqOEHmWoO1h42yXW4KSN-TrA4GK5JRdgKFCEk_a2-vi4ZpWkNE_28EamQUeufjQgmL8vRmq2CqDUlXmaY9VuDxeDCcia8EhgHIV4GwsZUruAf8rXQJ9oiAT9JkjkXqEhacx2xcIKrcq3wtvgJD-H9c8bFTsw9PIvB25hftojLX5EVHqitL-N6Wv5qAY7Qjzt0KjYYvqu3mb0h7a3QyFcEfqadRaLhW_4TwANdnOdcWGwkT7POvIEUrNGP9p0Ck-EPFfrqTvAehssSXlx8eztXz3EvVOAwcc0Cx4MyMe8c1UtmKaXu7_v719irOXtECAtr7FfK_ycFA9dVQbKKBkj4MAidfgSLm5m9Ago8QnuyPHHktCcMzOeQNe6eY97rrBNpI3XEJJM97hnaIn1_g-poQgrnpYSZhTsDaKe9-ls8sD6RMqWHnVGe_bXsNfdi5G3iMqXAY94l0Eqrr_jTXdkmA-xTBCFfHcCLm5RDRBgc1zVYkl5d8rW822pyN4hfJsV1JR0KAltUQ2TCFR6fo0e6Ne-YbZDBHHPAD_s3m-2zSXSlODIG-bqR7beb8Ta9kjZo0advMbo4HjcY_qqd5KIY3HuyQWUGMABg96w_JxgFXEQVp3a6XQJaewQSRhsxTtGE', + 'p' => '6l8TYYzb7VxrUFtKBbF1dTFjsRmAOajL6BGNB0Yyw0smZUEZL-HHeW3NzN4qB03oVUnNeAKKOde3-8mgDxi1qzB6ytqhJqrv0iRpsDJax7OP_F47um33nWcsipCHmzczM7f8HBmzD_beoMPGvsoUAzNIv9Ka0dz-1hQqz5etiKSMMwozAnUj_TqPLedc4DG6EaW8x_vgNfW-_puK-IzwsT5YjltQ8weufNxLlrT2sx9QT05jbxe2YR2ijNgvKxo-G0wz9A8pn5wiPB3NsdsHAy3mrtjMEjwv_Z65y0XPPO1W1Bp68XICknzghgTc7nZR_31NSrtEPmQBlJqoJPis-Q', + 'q' => '3u8h8WiXSx6AtPGQpvmNebZqi66ITQcAhvdF8O_I1LdjswBTZwpXqKXb5kLBPXOAH6YqgxURNwZZ4M5Ys6iv66jVzPbSU_MMHlsiXzgeVfUxwbdOHpiZhRzoB2gzznfFDKR8bu1S07tYePeaEwplsSg2Vb5tC81uNIM1sshfeuDO5cZOH8DmuJzTjhGjb8CWmbgLnFOSBuPl-Vcr3oYVCnWzvEfCgUIy5tC9KeBC8Qe3O841SjbN3yZ8EEXwcUmo9lOt19s3LKBmtT94SXtok6-wHVWlL3YbzRg1kl8SVjN28NJd990mjPhjqBK8KyChCxoPn8lIXEUwGwFmIz4Spw', + 'dp' => 'tYIqXVscnAf-KD565kvX_ongfjCUqJL8T97_zIlmGO8jbjlrSzTdKkKKpsXL4NpKO3srwGyfJkrVdw9ggTCOyWSDRITrVyn9D08Z9tYYjh6XPUixkyFFKkbULP_ftaqbYct0WULh9VQoeHMGgY24z_2wsrZlJnCzf5Ig0aLTR0bAOWsFtDqKQ7xNVKygthRs2Ov1dx-vNbr7Tu2hQ_rLEUmKhb1cxMrHLHXjqHS_tlti8_huc4P2v-GWmON4LDZnsPZkKfhwMOdXcB1Yxwwssx6iT_kgmmK4e_-oPi_zXmkk3KEhY8n7Cf3iWIh9ncROnsIo0N6U7IjA3Jil7fQU6Q', + 'dq' => 'kYMy-5jST_Tr-69FRMfU4WIA74WPb_-nB3F1VIue4cGGMPuAdNxaVTlVbFmcOlkegwn566-fmfPqTINDgJkVotOEIhHlPWiCO3ou2EoP-vldbd0Q_4WJh0pT5SnNzvF8TAE9O0Zq7sr1N5geGFmMAPOHa7YtBSwkx9_w9-4z7Ee6pF4o9i76KfwrVisLK9FgO5vW8EXYJekxXevZNZj9OOOU2stYGPi1stUC88duylbH8iBpxjQ5cnNzPUf5Zmi3AXmjGib7P4S_JYT1JbmIjAV8Bdm2RWFpShiINy8ZD-ztsMkPDs9p70_d9IGuEtRsaYusMRa3xYpfmPDz0wMcNw', + 'qi' => 'sEHok5K2HG0q6JdNzHB7FsM9EJxY7c6Gkya3Lfr1Rr5OYPcAosEIZpl-1_hCQ3MLGKT9UlYjZrlyt6SOUvCkxFX9slDZQeagmlSNMyWs18U0MxhFpEGthqLthS6ik0kFlschiSpMMyKVI8kgQR3OjMDcA_Mr92gZ9fl-mhtl2yfXJsBIkFBD7yOyxRxawy7v05RehoDHmdy2cnzaakPvg3Cekma2mfdjYgN5JnS0A20pC1zfoqi0D3B4KGrYVZhyJRnBakOUmwvE8rfmcjThx169LiAea6SYs7k9jwUCVWrNexXItxGdbQbbrb-FUotAcAQSDr6hHU8H79gN63WoOQ', + ]], + ], ], ]; } diff --git a/performance/JWE/RSAOAEPBench.php b/performance/JWE/RSAOAEPBench.php index 9ed9e4e1..b11d88d2 100644 --- a/performance/JWE/RSAOAEPBench.php +++ b/performance/JWE/RSAOAEPBench.php @@ -2,15 +2,6 @@ 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\Performance\JWE; /** @@ -23,32 +14,50 @@ public function dataHeadersAndAlgorithms(): array { return [ [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP', 'enc' => 'A128CBC-HS256'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP', + 'enc' => 'A128CBC-HS256', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP', 'enc' => 'A192CBC-HS384'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP', + 'enc' => 'A192CBC-HS384', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP', 'enc' => 'A256CBC-HS512'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP', + 'enc' => 'A256CBC-HS512', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP', 'enc' => 'A128GCM'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP', + 'enc' => 'A128GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP', 'enc' => 'A192GCM'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP', + 'enc' => 'A192GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], [ - 'shared_protected_header' => ['alg' => 'RSA-OAEP', 'enc' => 'A256GCM'], + 'shared_protected_header' => [ + 'alg' => 'RSA-OAEP', + 'enc' => 'A256GCM', + ], 'shared_header' => [], 'recipient_header' => [], ], @@ -58,24 +67,60 @@ public function dataHeadersAndAlgorithms(): array public function dataInputs(): array { return [ - ['input' => '{"ciphertext":"JtdnkBM9DBLdMaPn5atpj3bT3ljoN8VhCPrdmx4zkpy_KHAE9qD6nKi6dxH7fBESp1S63_bYUIva4KZVT6wF4iGsQQJp3E5IdljeY5J470Ar4nBg2WB6MW6oUPqtnHhs87fLQSpwbDlGNygVUIo3_sGh09eGQyL3_96vQ1Sj3eOxuHyfelYw6COZTWW8o7ikaAgBY_RfMNX9jtlAfKywZJLo17YinA3wFwQpP-Twyk0","iv":"HQiumBYcqqSskMxGpmDWxA","tag":"xV5FQiaG3jTof2bWxegZlA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ","encrypted_key":"PBxpGWgGiM5aq-rUwl23M13r8we8q99HbUsTtY-maCsDM7AMrnBKctPgm0WdxncERN9hwrypI6bnI4NreTpGvPoLtKK92jeJXbkrEhCK7CxVQbShkFSCOPh2B0J8zRsgPDVs9JGU5nU47ywdw_bjqWjP6zKzPJGIz240zuTeANs"}'], - ['input' => '{"ciphertext":"Qb6T8ZcChbQF2hf2dBsTJg7E4eSd6eYIaUO7wFjMq0JZabR-T6MSUvJpd5sBvuwee0CCIMJfeDO1tWv2dSYcZZJ6_JFmUtGI4iXtK4t60fV3-ryTbU-kVtIzQoPs0WdPoH2Ly78PoQBXom5Jmd5b0s8HKY1WYDMPOTAFp6Kw3QNJDN-vYVugOh4ae8ppJw-Q-kaJsBui-y-8d6XLTPQT6ZySz4BBKLEMXxWhhTY4ghw","iv":"EK1j9a1II8gJJALo3VK4Wg","tag":"T_H6BfOD1OuQ_HHl2AJbrYGsp6j6hg2T","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJDQkMtSFMzODQifQ","encrypted_key":"TQMM8tef2w86BTdibSdNCc1OM-S3SOZ02zu304wGuE956jQD6kHUsI4ZEpbA8XXRA58ywUCkyJEE0j1IcRzah4ORAbl2Spxd56I2sU2vfpsvz7YtR8N63F0BSpvn8UcINXPbed9ECw9zwUyI-DZMoTkfLA62jIUHXl-t78l34m4"}'], - ['input' => '{"ciphertext":"VUBZeGk_obcIv9HtWPXC7JPLHuMdIuw6XRktelYczWUYhCwlCDUQ7LpDdVCV6fvqoWjoraejWZ8rvguv2k1jVnCKn6U8McjKbJybWb5GD-4KahDXo-PprZXNcPxovZ8tEvAeaaX9BFVWPVOEJPP8MWJm3STkfYWKjS9QK-icIFfSOIz9t51K5cb97woYeN9SVA7-5E6Fb6BJuqAPimkh8asPt8w3iU1iUjSkXBfsPPU","iv":"pW_0kqz1zoN1FrFIDsltUg","tag":"uCaFoOdSymyx0JGC1MEFH71kOKlsuNZa--ZN4EsdrBU","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ","encrypted_key":"n96w0hogHs8kd7DlzLyMrSsPdNHhU9Pvc8jWfFFuKC3S1qPsjngzUSsXsELSVzpc1qbl-dk8YSV1hxK7uFeTjYpCIm1tzypNsGnQCvGCsRdcOw2llgg0TrFsKROI9vUrzoUxz-5PgCAqsy-bONLVvIhuJ1I-2nosXcRTDSthFpk"}'], - ['input' => '{"ciphertext":"sYe1briI2Z2fKvfRGqK-XvCiQ6mvfwwRf_E-fOqhEhf-e72nxnmKQQWHtiBBo538s4FzVdu2J9SXAzy3KrL1lIpM3B1Pg979_u15OuiMCh8sbzahMwrtLLVJJA3p46YgVvtEJNOgPDnF9Mglzyb1dL7YN8gd9jEaXC2wChh7ihKTKAAm3HN_I6XF7XDWk0nFiZC1jzk9bgSRHfOOpGIQbVsgH7hVsek","iv":"dEajjY72o58b8hNz","tag":"qfF-5Ife5-KARIlXCDAQNg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ","encrypted_key":"RGgVxfkKItz0jztVQNX-P8r4nKz1e_4ytc14Zki4dNUu3ZiO7KnBAQxI4GEWpCMWTu-jHHQS9IMYnagPkQHdRKdl4oEG_I2-_7JzTfcE5b7CbBLyY2yHnQvgbHkkMegglZyHDfw3tQGpZT7LvFG0RzYb6_MAkvGHfLtYsMwxEpk"}'], - ['input' => '{"ciphertext":"m1F54FNjz7KYT6re99lW1EDZXaViHL2mNvjH84X2xF_A3mKibZ5KYxEytKwDKOG11wQaCbbIXlPfKqA2zRta2rAMTz5SHhwA_qNeS3ikHSfaoBhBpH1TVav5tnvgG3moSSEnX-GSHZKUzMyJODG1kGg9tnk0ln9Dp41KP_vNxcOmeKvQX27tUfgB3iDFbFaEXlS24wu0_SbF1YeX7r5yDtBpfVcakXo","iv":"MroHZRvd66Dmckxy","tag":"NyH_KPznDOXlf9izvo5sxg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJHQ00ifQ","encrypted_key":"JfnmYf1fP9weDBXzGdxrJb8VhDKVuDwdh9-uYZJAD4xGuQEP1uq1OmZ-H0V4mcQB9ZOhQoxQQ_cpUEO1pAIn99vo8OMh-uJM5Kxz-DCLV3xqdcPqjnvW8UBrU7FEV9eyu8vTkTXxKqwPF5S-3xHjp6lgU12iogbqu6JfjEqx60M"}'], - ['input' => '{"ciphertext":"HpGXQ8qM96o2dfH4Ky5XnGqT3to12AOVx3HTjPvldr__Jf2fZ5UZS1602k6X6oilBenYzs306Bnge6tQ4K1FmMXBqClCbPIzf7ul4giVi_8xq3s78uV9YcLLxQnxDcaY2JzifwmTnz0BNr9YbhoBhjsl7jjrp5ISe7m8GSneyfYDLmsRuHhjZS4c6JdjH5036LAG-oFLWScTGyLUx5s8i2VdcZI_AJw","iv":"1crBLrp08Au5BbXl","tag":"EFCk9naEr477Pv8X74zKYQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ","encrypted_key":"G6DYOpfCRSBboaciGt7-LQf2KrwEBWYbHz8a-F2-O_Cv5qpgT8eEPsEqyC8H4isXUTN_wyybii8nsIkNBFCF02WaxxUT6EgrryBhqo7BpoggL88nOTsHHuZjMONIVb3kQ3PmzsQehe9NGySOUKwgHRtw-wj0lwa9HIGB2vEDxig"}'], - ['input' => '{"ciphertext":"dxjvQRhPrS3dF_xvP7ygBeshHEepkHhJ7VF3kJJRs4tA-3IFjmgJBmmtlyCYubE-1b62yY4G7wa4xagro5Q8NYVoF2o0ghmb-mPiq0J-NvSgSB5-9KwBGN5gGc5QbU0vVEeAGxBdp4LBX4Xdq_L6-Cb2era7bqVx5LIJSf1mqxXffHRExUxt4EISVwY9CpiPnhGmuFoYR3LrlYbQy11CCaESCayH7rg39GxLHuMSz24","iv":"xoOM_UxZby4fl_nO63rqyw","tag":"CJ2b-KjT-OYRmDZJqxEJ9w","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ","encrypted_key":"bgteY2DzdUHC7CAp1pj4hEBet_sEwlcZLbQ7P3Fl41PMntmfsrPjTZX1wMm_6rrlrmVbj4Jg91DtUqRUdRbm7fUNRBK9aYFiknpEtc5i3fulVXNrBsWlqroNoha7wobqJOeK7tNrftim0xKo4njGtUizDIBSG5KahhPUMYY5j36Ij4jwViM1bax4Fp-KqoLmm4uNQCkPFgbob_Hhvl5LqsymEM3BayK6hCZY6gjkXPYy-qetscJ8wK8ndk0c2PmVl56vcmbrDbLAjrXkB-FjFY0yDmljAkNAYG2ONwPWk6UFg97367AeJEzfbelgr3SP1pnTXhyAQawsumGXIVr_RQ"}'], - ['input' => '{"ciphertext":"LX-i9m2eIjTrpjCsuTNPO6ELSduvRqF9FLG4UPN_qydlcFZeBavQSc-du8IXLZEtw8tLgMu4raGOYkpvXJzmEz9TJqnaO_sfVB_NyFUVOcsDRgdY5K4Bmp46WGVfd7L3RM3FoJWZaCA-Z-csw68_8fXiq8ZCl33aqU8WEFagOu8dSll7SiQUpl6B_Bx7-kq2OTfX5r5XPmOpMlpsJiW5n9j1SJpZTQUfZCENK39BAVg","iv":"96IFzit5OiPyS11KtUbNIQ","tag":"kWMtlRys8X668OT3StMvReWEkRQqezSy","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJDQkMtSFMzODQifQ","encrypted_key":"jVZUuMlQdN1FsekWSzdla4UihupJCJpDHtmW4WCFyOmmard7jUdKMpXWkTCcHOoIs9DsWcOmoEVzNh-YNcCzDZsWJj08cyF7J8w_74fRx3lGLSKr86qs0cGyj2qkeSrrM2nSLPOI8JnGxZMC0utVtCu9-8goJ2ETBB3bYgd73mI8krrsY_WFCkqpoSEWcpNJzykC6_FCLELt49XH8simr0jfQkswAlJaUyf1L6S-NwUxlrLljrpz-Pf5HriD5f_C_3W2KnpOm62-hqQCV-6pvqQ4bN93UWLhqsPzSW5i-m1CBJOMZJNMn1IIpL79leKSEEwHUakvy9uGS_Yyp7iixA"}'], - ['input' => '{"ciphertext":"gAdBQ7hjuMX5YtjCBfBK05PIi_nI70F2MvkXBg_ZVKsVvk7eHJh-SChbxgXBL9jj8geeDmeAmWEq2EHnKeJWijDwCVWKOYcik77sZTVt6rE2G6TO_voznLhBe2APUNIsC_PnMoXoqooQt56Nmk_RFkWF-C1y7JV-n7VyCn5_RkoTAbnsdP5oKgygpBuLCpR0RQQ4vTwaagp8YCcMY39SsxyDDu39QxNhMIKHpJFkQhg","iv":"0Toz-1TbKoLMgZY4sF8Kzg","tag":"TPjfXltcP0YiWpIkfGpMtYeCTEjzycOLLoKNb_AFaXw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ","encrypted_key":"DGz8FIspXhuS0d42vh_zGr8c1moS4aXSHQQwv_N0TGMnsi5VWy6Pb6q74hjppisC57cEDZPBihhwoKP-VCwo9q8Bmh14PB4Q_BatRYBmeuthf9zEWWU6vuMb3T-Oscf4W7Y-j6BRF-j_3vmzh_zpvPbBlCS8_PMtSIhyXUXQHm2Mms3gLPS9J0HO5TvSxlhl87E2YnF97_r6aj_Z2Q1dt1gbn40ul2mHZT2BVsqfFSGsaRZWT9TDxx2AapfVp6QpKbDGm4xof5pmcHaQLWWsxcSMfgZk4-WR3GyAb2uhGdgEwXZpA3x5CI5xYGlCfQN3G4eLhl_S8fVcAK948HNC-A"}'], - ['input' => '{"ciphertext":"ASzuUXMVZMB1u4sARjXgFy8TOLHbxRnSH83E-AqPDPEi4Vys4GGPMb586OptbihnljtSjluMXO74Ts8STpQRYh-Ayuf3_BexjZ0J5qPs48dQ4L3XATHaZJPmOfuq5oQPIBUf8yfu5HIg3pdt0NpHSHhMtIDk4qzGw04jzNjiRrO-XOvEuaUtdxyG6SzJLkC9vjGQIoqCc3lkNt_nCYdYvlawmSpVSOg","iv":"J2Gv1duwjMpYBiZl","tag":"-WIRo4aQY1u8LnuCU-U6Pw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ","encrypted_key":"dG5fw2ecXqZdzv9u1B1ycHB8WsZz6xjEVXHPKmXfX58Tjnt6ib0ujjJhiiJ1h3DAJme0J3mNGj7HPgxFgfRYjMGqKMlsflgHRSQq2Lax6L813Zlh1sW2pargM3D_Kvot8B6Anvzw7B91f7YWM0o2KtjtW-vaN_dI8IZYtzeGwTt5cw5wpSmN7GQDOwjPXCPCvZW_t0_SrOBRR_t4lJMXM9dk04cVG5EzMBUpej5VZWK4QmFQE0rQIhXEwg1D7DfPaQaD2BCYrix_xiKKGAq668F7buxblY6qcZ3xlZ5OWb_ACBQbPqUXRQjACzhhoJOUUH03naUCbFaRAKhgRuqUKQ"}'], - ['input' => '{"ciphertext":"xpRJ9HfjZNhiwa4lB3AP6zlTH73VoKbFFkxe18ZGBbwMUGnvyPDMUXqhd6xYAO6bB4jyqYPnCzrGsqSQJuMfUP1tJYWzpXp3XtfJhltc4YFZTC0B9XBs_cr5cLkKG8lMRWPjLMJJNRykRub3vd9quiRx975V7B8kaMea8VxuhqO7jiyysMrrPEJ0XD4S_cqsO0mx35V-nADDEFSPG42hRyd0eGfHZvY","iv":"p8ZRC-ygp0ZPD4I5","tag":"LpgaGEK8QNJFhWIQfeJZvQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJHQ00ifQ","encrypted_key":"FqPsHMY4Cf_nBfOX3ydQnvQ_r9uFcWPtvlMDsso0tOy3GsnXzjtMHV1MW5intPU1nrnDQ96-qkV823bvxvGMhnp4gGdPGFX75Rab8WtakrhYCR1slO2JQ1kLzWId-Q2AbrHLU12LPK10H92jIQNfhKV-S6H5Z5aM75KIPNrMltjujssBp-O0FpfuZIrEr1M2egnOvGJpTvg9rhCzqGB8mppvSqNGQzfxG9bsIaOSOgkNXbDaLJd2bDB67bx5fANrtzhH2ufPqsURcVHckSLV2jciAi6usZP0kJKF9bDAEh9TPPykN8OraFe6V43ZyBJraZPotKXwYSAz-CKeUyZnUA"}'], - ['input' => '{"ciphertext":"a0cEWXJTR2qhbkE4mQe_o6tnw5lIPIH5ta3qO0etKMME_BqAAW8psDljIIcwHdnPXwSUHk2ersqQnnUoJcgoKchsqbzv3lcr1htqjiMlAsekxXCqeIop_lGCfh8oms7J5Pdzxcf2lYWxy3jaRw46NIH-vCIfAJ6vG2n7bN_tiGwBoTkW6e8Ka03DbD5qCy7yLVgocMMeMW44fKj4NF2F0fiJiLHmbEQ","iv":"nf5j40aPEBokKvyV","tag":"dozonj7NaDgtujKnEVcjzw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ","encrypted_key":"QlCvG7s2llqAPRW8ssnH-U8BSpldsjw6HoGNzfUWmks7oGbi_4KwqqXdtdfnkbJu5VhK1tRy-f1fNCrP85Z95iTnHh1m07h7SXNlVtz_e-VRInwZaCRocYe-ysSwXdhHyBObGvACyYgE3H45l_wjSem1VxZMwvKz3Pj5s3CqYYrzI8nBjBePmxYaTwgFwJ5757V1wma81iywqc-bxRVg6CDaD6D9JThycJGFPpaYjl7JKUKlsshxjj4BPOPh5gRE6SYGQmg0fJSIMaTTz1XFYn842GzeYWTAHU0Uxap-dYTen6Sx50eNj1dxA-BiMc4sLqgrRrZ4VtJNea8upfzdJg"}'], - ['input' => '{"ciphertext":"Pj6dOq86y3q_fWIYEbm4HeWvxmrOxQaTfR0Ks8TIVQCy1FmWRmA8qa4eZIr11o_2r2TeuffvhcgHbF-vBSYctFBizgQNaV-ohmJ8R8QjhQk61GGJfOYSzsJb9zArPppCxAMqwhs6EyxYqyOywEw0lWmmLiaNvnIBnXxKJOIeiuuVUSUsBUFwQX0JOG7VxhRrblR9DSbF_HxKYHWP0K3zNiTmq0zikIESUpXS2xSVrAA","iv":"VR-xf2ijkZ6lbJLXHA_GwA","tag":"50nZKsL8ZclrlCOSi0k7Lw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ","encrypted_key":"Js33J-239Ph1hoL_dAqJeI4unEMgpyVZufkZsqVCapRWyn54ZSjVyhzsF6fVwWrCnLKZmwXX2eazsIX0eVsWpGfhvb7JuOmEwaTCtub-IqCKHP-twnCMO_dM_XdFtr8ch15TuMqCUbf_PIzKglj3uUhJbDmt_TLl0VBoAcFAuIoUYUnzxer1PIfT6WVcJ2dxvkYY-KCLUwPNpKJ9Vu7DwNbNm7HwTZlivUuMhLyb6Oc_4ssOWHHs96e_4Q0ZPJs8bhZ5oCgbugzLqYzfUirCw0xJHMimxwfMT2T8ftxr7swD94PnwNE_zpDOlY9rSv8NHnP0X_WAitwqn94-kVfVAAcrvtIbJRcaJdVDFxYiePypJYVeVYFxueWiLyUQz2nIx7fidzgFwcAFykxYjE1S_EE4gqCgtomtxuDz_daR9TM5LX8E_MWKoJC5X-BEKQDBO63pSZN13nfPWxJ_876Un_BsHjuNZIBYunqwEQ8FAKdH0kjo4WrDET1XVuBskylXpZw4JzsThRLU0sVotUwtlZZ-P3v6ATILUl63UDpQAOQxixsnpJkUiy65MmXbznVjG_PlJtXYSdDrcrLmkEdjP5Hh7BX2_kxT9Thhpt7wev_3oAnrMloLWnM3TAh0-eWGfXN85u42sgnNY8aHp0YiUFPKIM9SdRiSbd56RH5S91E"}'], - ['input' => '{"ciphertext":"SCJCZj_IpM6VC-RCQiSSScXTx6i01Rmy1MevZvpJ37AQaCZiyCajQQ4fo_Sbs83WmXVrT1Mh_h7k39uH-cy1wqqDVBuocNLynLeO5gimCv9Gc2QiP6V0B0hcParhnttkYZU_eIIxYNRSvZbZxVHDasmm5oZ71vPXOLQcakk56iUxN430SjXcd8SeK733vx6q3YOo-0rmGT0tJLI3_V7VNYtBJ6WlHQXn9eUhVUK9OxQ","iv":"6bfRRLiAJ69GJRt8ItKpcA","tag":"_AwOo7Ns-4nS1D_OYxxsePH94IYUFVg8","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJDQkMtSFMzODQifQ","encrypted_key":"pKls_LCbXnBCTOWtEkn04ymw6ci4Yw7ha5BUCtfCGYz9LvCKfEgUh8As6Ss1LYRW8wq3-3ugdK4iPFQFkO_yh4_vMwUxrCFRA6dNC-xc43h91abSL1XjNKx38glmHdrTP9se-xF3Pnzum4dmzg1SgHBe9YD6uTJRtpmggfElBcSTaNSDathKcTqbHcf4OZccVEwqOelWZo38nid5fusQ8qRNjo82KDBv_2g1yB6nHanDHqw7DLDFKC1lIlU5KB8ejdfmrh0bIKMLlu4yKLNlX15vFJnPSsusxEVwKyB2cbFJBNPvGY86r1yNAvqGc1EIqL92MT9t_S_cGL40CrwgHZAXPMTw9r6f6UwEaA5ecWJe9bsH2J-I4E5Bj-3KvODm8uKLg0K6GUTiDQl25hufZz27bX0ZQ9PYLvj0zYB_KrcG9Gf9-B2XHAPNo24GtH5zDoPBpJsJxZz-l1MxKc_UcZo7J77GSglUOHJt92-P5Vrrzzf0VMRgqPSQMRi-GjYJt22l923rdZRYdLvbEIrEemaEjOzeIPczqgTFlz8fUIZg1869IY0k-PTg9xbOxdl0g-d6lwMOcPZpztDCqFd3s12Qez2FRUWAtBwlIwayQJk34vTsAyJ0psEsfMmYXXepx2SpiLfCXbbosXzY7NzfRTq-pqb3xnylYzZNRmzsUjs"}'], - ['input' => '{"ciphertext":"I6oiXBKDe6u_kE6fbTWgU7p9PAxRAOzcHg8BY9u6yZS8hc2Bu6CpX0aDj0YZLkP6uwyJ3Yog34PR1Gx_x84gCUg3zuDYg3yHkfwc0HmFOE-4TsEPz1qBlPyZQjc-a1cY-XG5rzI6a3Z1WwdivsrbHPr_LoGmNrkNdjiDgR6qBYuhHN3o3uyCVoUGCZQLnjsD4eVqDaKqWHWzwUprhXQ_MqN3MUfUut6PXKreqx-HaSk","iv":"o93T2Wb6aPWwCaGu9x8V9Q","tag":"FT9xSVAHai49FE3vCxHLyLQ5nG0ANjxqglwC53a3AY0","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ","encrypted_key":"HvJIBCziPg3SEH-AcBOMvd8dF70XQ95ILE8BEYolxhB1Aug-HFPDjHEwGysz-5Avq3bvub6FxQb9NBACJkZXqFiHp5X4SQXs82P-4w1YtYgV2rRXvmUv9_vrlTpTjEFtDZ_BbImsyV4Nua_CHQPplEdtKCrHTKyTA5XKHw536WioVBeJVtlddedqCt2cNBEnOXDqe7B9etEElY-nM1UpFEujOA5-U9gGWCeFDkHz6iTD8EpxIPIGuWuiyliDyYekT0rauLmIxkFJufSKpw0ltjsiE57JYzfHqNHmq1w-5YVi7I6eFwcDjBcb-hWEHASX-m8ta3QCYfrba6Zha9Gpi5tiQ6tHS212EkSW83KhK2UZ9h8XqFJuYjaEH4n1RJuwD4QXhwL6tTyQBNR1F2KukZQ7XTXbQnbi8vx5NmjlF4li0APLrEcdwQOBk3KThTAptitixkgYzOf8eaYlLvxS0YjDpUU1pAw33ijhlzTm6sftUjGw1BlRFNTezk5xut5A90VP3-5KnB4DszmziZhX5B-e0C33TfyZns3gnU-xnv7PuGtqTK6FZnWNd-tgRiBAZa9jZkC9eZhFmTscnnzYg2IfbdF69uRuqrPmzczmHh9CysiW-yjY7IaYdfm6EiM_4kHaGp3rgGvqi8ner8leq7ATRmVaoTAIMuzWNGFDL00"}'], - ['input' => '{"ciphertext":"ndvL_g0t83KLzuklzpJ4KXartd1efSz3YIsI05epP1o_1KEzUizcaHarNe2g3U3dfjpeClNTG4upsjxwUJiTqLRU564CfhUrPnC0TyO8rW6y8iJgEIo3dAc907QlsLMAj5_6QMaxTOswyPMOt1wBjC6rktjuxQyWMnEo0RQKgsXf1f9bG3HGQEjdi7HpLSTOu2SrpFcMjXq3CLvV86wx5fkfHLjDABg","iv":"sT87oRGv_jLy0kRe","tag":"JhT9pf99SRCGaZniWxb5dw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ","encrypted_key":"gU3dKyI6hYr6NmJ8bPuXgacnajdum4LpRNGrYVs-WTla7izvUs070lWnwtpRgG-cdnZRn8GEXJta51p6_60njdUTfw_7dDchilJLvc3Xwhlu7LMW9X9gt7IYsoXUiRPfTKBsFE0rzIRr56TWDvpSJtrAo2k8O-1K3uLOBYTFEyEsL579TynqDCMcu7fo2-ss2yph8-NmXsxMG7GXjJwZrdqNJlJIw71x6K4eZ_t219amRFubkWMMY_pbcv0X4cwbRw0D51Oa3cFEmRthqVkUgkmATZLTWnvNukNzCuAjIbfWseRj-Sp090AIxZs34ir2GWmlf8oMDY-oX9wIK-GikSe8wSbAgUSxpu3IbeSc7GQfzRY0ah4Byh10tk13KcrOvgKwIbWyFSuS1RFbAJuHtm1_cYIDzgvyFpPMo61hmsxJxjpO-Am8SN84R1c6xtPtuzU0LCURssMRXpbS2KzJ0khWL2o18maVaN3QPyI27AAzfI3lhQT3b1OHeOigI4f7PtTkPHO1bV7h2XvTZhMDIFYjqBibV4xmJpTDTKdlSkrd5a6eHAhjoIUPsfJQSmtoSVcbNncwXL3VlwxG1u_4yv7Oad5UQp3bs5bDgGe29BzCdrAP29kJirT8uNrPERANpOS-HCxoalOeh-Wutt8cSMwGVCb4_9ImtqM3C__Turc"}'], - ['input' => '{"ciphertext":"BlH1xIp0sl06avNU6ilbAFYazGI2McXYuMVbaK5HT3G6R5Nslu4c5Pk1HdqDio48h0dzJSyg7tXQfBjiDoB6fW2M00mQYB9i1QQbuj2axdycE5R5l2NhoVhp-28DBynWAStkBiie4ND2YpAJGObFXAAHbi1OVzz-N8pnK8SguWRezQapljC-besKyQSKYcHaJFq_hhxGHBskTC89o3xBwpWQ2lchSvA","iv":"3Ilx73gx6nhs3cGy","tag":"vjk7-Ogspz8hsw37gJ-9ig","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJHQ00ifQ","encrypted_key":"EjGYVkdnnTFJ-zVcDUw0XD4PK6iKzaG_Qd0tLycGKmEY4-YXX71ld4sFaXW8bmLsrTPKeGNg44r1ZYAdM6V_1DBMc98uOksq6aYxB3I3M0l6JNOgp4CvFbDE05e10v2bLY81a3O6yav4yLq94hl2eRnlFg5meNK4xhpwRKo_VsKTbNLvbx6BARwy4-tpkJrKw9G5JiGJSrQMhx888sp-GoKLb-TWv2_5SYxpGGPKU6jAJaJXijWNfnWxHjhXJhWSLFu4As64i8uHRhF3FVSz9g-hDuU9HwPPwSxEOm_TwfZdO5BU5N16RE8l6pgDJNmvO1Rwtvthc8Ngf-9v_LDFK8radc_Ne3NJc4kORRd25Cl-rxu9_1e8SYFpEhHL9_MXylBe4rxrXg-GCutwdpm9_RotogJALd-qQKy0zBdMRQyVVoJpC8lxeOo15q9Ztnr3hkoqtPVOAh39itIlQHOzG2PEjrmcXezHAFxb6ezFOTZVUNyWRqV7jZDi17YtDUDQfPQRpy6wydCRpmkR19W-6cUJ-LQJvtU7YhN-2vc4MWZL98RCoiJ72hTgocStquEa2YWX7RZcKKBAjqw41ZZ5JtCUiIBm-4aSWRra_FNcGbIwkbt81HphLoEyCIr3U-fP0gG1H5QEXDCml7lAgcWKXHbpKuVQt2HNslCcaLBPVLs"}'], - ['input' => '{"ciphertext":"iTzfPt_ytyL-OGKtXaJLY7Y3A1tLnYuYpZoR2IWLi2xINT3U-Rw8p6KTVBUUwO0O6PrAzXr2jypJQ2g1KvFkigu1GGQgTBbvaQXAxvQjlZMqJxRkxLUofL1a_hW2X9NzSHM0v3ATFlJWyeXeEaEKknK5L7Q077zVcjO2RRVxw57WAg1rgN8mHOqKOdvqfXvvW9Vkp5kKZ6LJjiDH5YJhw9liVKEO36Q","iv":"lZGMh_o3obcO5XaG","tag":"iQB1Xd-uWtPw1uBhO9uxYg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ","encrypted_key":"pCgocOLTFZYWbxfrtR_AqKGDI7EkgVL6uBMTybiCo-ws74pcCwS21N-SOmPAZ6olnXZtoZNnVQMHhj2IKSZNOdmjnvzdJgLCmk8PyBrj4WZTU-ebPArKyeYjwSRpOKRFFpBbk78KatR8lu7wfmgKhSAjYBLZ-eSlWL9J8SUXs1zX9wyPFzvkGOSwrP__WnZdv5-J_9bggexerK1NVnZJrm8quVqmD97udcd8KSVF6ijxC81ZAcViJ6WVgFfynhaNjesuR_T6MCDyuhoMYlwkzvcou3MgYfblyLeDzbdnSdzYkzqqgZbFErKJnD7tErRqpk4w1pCmwgDdDGSp8-Y_h459-CL11xxVVkLCsPPOdpsUxMem0zmrSA7LzjTU1dld6nupcWM0ZlUEFz1pfrkVuMRmL1b-9o1AJxsLtEbx0MwFPJMKnPZCdnPITTK5MvEdG1-7CRBtjxwE98JMQ6AYEf2VKog2ji1PauDo-EZ5v8BvTbwPUrYNF-ofM_S-dzFXEt4mMRJSQWV6oCZX-OWyfULNvZywd35Y2nuQeZHzvtoBU8d8SB20iAezl135TgOKuwoNosvgUxXdwsVwyWdXoDOwcYURVgpef0qR8RfrBN3khIuhfqQOopKSJpzgFVnj121Db5qV6-0nu0Y6hkyj0EBvLug70wZF_oAfi0kCPr8"}'], + [ + 'input' => '{"ciphertext":"JtdnkBM9DBLdMaPn5atpj3bT3ljoN8VhCPrdmx4zkpy_KHAE9qD6nKi6dxH7fBESp1S63_bYUIva4KZVT6wF4iGsQQJp3E5IdljeY5J470Ar4nBg2WB6MW6oUPqtnHhs87fLQSpwbDlGNygVUIo3_sGh09eGQyL3_96vQ1Sj3eOxuHyfelYw6COZTWW8o7ikaAgBY_RfMNX9jtlAfKywZJLo17YinA3wFwQpP-Twyk0","iv":"HQiumBYcqqSskMxGpmDWxA","tag":"xV5FQiaG3jTof2bWxegZlA","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ","encrypted_key":"PBxpGWgGiM5aq-rUwl23M13r8we8q99HbUsTtY-maCsDM7AMrnBKctPgm0WdxncERN9hwrypI6bnI4NreTpGvPoLtKK92jeJXbkrEhCK7CxVQbShkFSCOPh2B0J8zRsgPDVs9JGU5nU47ywdw_bjqWjP6zKzPJGIz240zuTeANs"}', + ], + [ + 'input' => '{"ciphertext":"Qb6T8ZcChbQF2hf2dBsTJg7E4eSd6eYIaUO7wFjMq0JZabR-T6MSUvJpd5sBvuwee0CCIMJfeDO1tWv2dSYcZZJ6_JFmUtGI4iXtK4t60fV3-ryTbU-kVtIzQoPs0WdPoH2Ly78PoQBXom5Jmd5b0s8HKY1WYDMPOTAFp6Kw3QNJDN-vYVugOh4ae8ppJw-Q-kaJsBui-y-8d6XLTPQT6ZySz4BBKLEMXxWhhTY4ghw","iv":"EK1j9a1II8gJJALo3VK4Wg","tag":"T_H6BfOD1OuQ_HHl2AJbrYGsp6j6hg2T","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJDQkMtSFMzODQifQ","encrypted_key":"TQMM8tef2w86BTdibSdNCc1OM-S3SOZ02zu304wGuE956jQD6kHUsI4ZEpbA8XXRA58ywUCkyJEE0j1IcRzah4ORAbl2Spxd56I2sU2vfpsvz7YtR8N63F0BSpvn8UcINXPbed9ECw9zwUyI-DZMoTkfLA62jIUHXl-t78l34m4"}', + ], + [ + 'input' => '{"ciphertext":"VUBZeGk_obcIv9HtWPXC7JPLHuMdIuw6XRktelYczWUYhCwlCDUQ7LpDdVCV6fvqoWjoraejWZ8rvguv2k1jVnCKn6U8McjKbJybWb5GD-4KahDXo-PprZXNcPxovZ8tEvAeaaX9BFVWPVOEJPP8MWJm3STkfYWKjS9QK-icIFfSOIz9t51K5cb97woYeN9SVA7-5E6Fb6BJuqAPimkh8asPt8w3iU1iUjSkXBfsPPU","iv":"pW_0kqz1zoN1FrFIDsltUg","tag":"uCaFoOdSymyx0JGC1MEFH71kOKlsuNZa--ZN4EsdrBU","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ","encrypted_key":"n96w0hogHs8kd7DlzLyMrSsPdNHhU9Pvc8jWfFFuKC3S1qPsjngzUSsXsELSVzpc1qbl-dk8YSV1hxK7uFeTjYpCIm1tzypNsGnQCvGCsRdcOw2llgg0TrFsKROI9vUrzoUxz-5PgCAqsy-bONLVvIhuJ1I-2nosXcRTDSthFpk"}', + ], + [ + 'input' => '{"ciphertext":"sYe1briI2Z2fKvfRGqK-XvCiQ6mvfwwRf_E-fOqhEhf-e72nxnmKQQWHtiBBo538s4FzVdu2J9SXAzy3KrL1lIpM3B1Pg979_u15OuiMCh8sbzahMwrtLLVJJA3p46YgVvtEJNOgPDnF9Mglzyb1dL7YN8gd9jEaXC2wChh7ihKTKAAm3HN_I6XF7XDWk0nFiZC1jzk9bgSRHfOOpGIQbVsgH7hVsek","iv":"dEajjY72o58b8hNz","tag":"qfF-5Ife5-KARIlXCDAQNg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ","encrypted_key":"RGgVxfkKItz0jztVQNX-P8r4nKz1e_4ytc14Zki4dNUu3ZiO7KnBAQxI4GEWpCMWTu-jHHQS9IMYnagPkQHdRKdl4oEG_I2-_7JzTfcE5b7CbBLyY2yHnQvgbHkkMegglZyHDfw3tQGpZT7LvFG0RzYb6_MAkvGHfLtYsMwxEpk"}', + ], + [ + 'input' => '{"ciphertext":"m1F54FNjz7KYT6re99lW1EDZXaViHL2mNvjH84X2xF_A3mKibZ5KYxEytKwDKOG11wQaCbbIXlPfKqA2zRta2rAMTz5SHhwA_qNeS3ikHSfaoBhBpH1TVav5tnvgG3moSSEnX-GSHZKUzMyJODG1kGg9tnk0ln9Dp41KP_vNxcOmeKvQX27tUfgB3iDFbFaEXlS24wu0_SbF1YeX7r5yDtBpfVcakXo","iv":"MroHZRvd66Dmckxy","tag":"NyH_KPznDOXlf9izvo5sxg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJHQ00ifQ","encrypted_key":"JfnmYf1fP9weDBXzGdxrJb8VhDKVuDwdh9-uYZJAD4xGuQEP1uq1OmZ-H0V4mcQB9ZOhQoxQQ_cpUEO1pAIn99vo8OMh-uJM5Kxz-DCLV3xqdcPqjnvW8UBrU7FEV9eyu8vTkTXxKqwPF5S-3xHjp6lgU12iogbqu6JfjEqx60M"}', + ], + [ + 'input' => '{"ciphertext":"HpGXQ8qM96o2dfH4Ky5XnGqT3to12AOVx3HTjPvldr__Jf2fZ5UZS1602k6X6oilBenYzs306Bnge6tQ4K1FmMXBqClCbPIzf7ul4giVi_8xq3s78uV9YcLLxQnxDcaY2JzifwmTnz0BNr9YbhoBhjsl7jjrp5ISe7m8GSneyfYDLmsRuHhjZS4c6JdjH5036LAG-oFLWScTGyLUx5s8i2VdcZI_AJw","iv":"1crBLrp08Au5BbXl","tag":"EFCk9naEr477Pv8X74zKYQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ","encrypted_key":"G6DYOpfCRSBboaciGt7-LQf2KrwEBWYbHz8a-F2-O_Cv5qpgT8eEPsEqyC8H4isXUTN_wyybii8nsIkNBFCF02WaxxUT6EgrryBhqo7BpoggL88nOTsHHuZjMONIVb3kQ3PmzsQehe9NGySOUKwgHRtw-wj0lwa9HIGB2vEDxig"}', + ], + [ + 'input' => '{"ciphertext":"dxjvQRhPrS3dF_xvP7ygBeshHEepkHhJ7VF3kJJRs4tA-3IFjmgJBmmtlyCYubE-1b62yY4G7wa4xagro5Q8NYVoF2o0ghmb-mPiq0J-NvSgSB5-9KwBGN5gGc5QbU0vVEeAGxBdp4LBX4Xdq_L6-Cb2era7bqVx5LIJSf1mqxXffHRExUxt4EISVwY9CpiPnhGmuFoYR3LrlYbQy11CCaESCayH7rg39GxLHuMSz24","iv":"xoOM_UxZby4fl_nO63rqyw","tag":"CJ2b-KjT-OYRmDZJqxEJ9w","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ","encrypted_key":"bgteY2DzdUHC7CAp1pj4hEBet_sEwlcZLbQ7P3Fl41PMntmfsrPjTZX1wMm_6rrlrmVbj4Jg91DtUqRUdRbm7fUNRBK9aYFiknpEtc5i3fulVXNrBsWlqroNoha7wobqJOeK7tNrftim0xKo4njGtUizDIBSG5KahhPUMYY5j36Ij4jwViM1bax4Fp-KqoLmm4uNQCkPFgbob_Hhvl5LqsymEM3BayK6hCZY6gjkXPYy-qetscJ8wK8ndk0c2PmVl56vcmbrDbLAjrXkB-FjFY0yDmljAkNAYG2ONwPWk6UFg97367AeJEzfbelgr3SP1pnTXhyAQawsumGXIVr_RQ"}', + ], + [ + 'input' => '{"ciphertext":"LX-i9m2eIjTrpjCsuTNPO6ELSduvRqF9FLG4UPN_qydlcFZeBavQSc-du8IXLZEtw8tLgMu4raGOYkpvXJzmEz9TJqnaO_sfVB_NyFUVOcsDRgdY5K4Bmp46WGVfd7L3RM3FoJWZaCA-Z-csw68_8fXiq8ZCl33aqU8WEFagOu8dSll7SiQUpl6B_Bx7-kq2OTfX5r5XPmOpMlpsJiW5n9j1SJpZTQUfZCENK39BAVg","iv":"96IFzit5OiPyS11KtUbNIQ","tag":"kWMtlRys8X668OT3StMvReWEkRQqezSy","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJDQkMtSFMzODQifQ","encrypted_key":"jVZUuMlQdN1FsekWSzdla4UihupJCJpDHtmW4WCFyOmmard7jUdKMpXWkTCcHOoIs9DsWcOmoEVzNh-YNcCzDZsWJj08cyF7J8w_74fRx3lGLSKr86qs0cGyj2qkeSrrM2nSLPOI8JnGxZMC0utVtCu9-8goJ2ETBB3bYgd73mI8krrsY_WFCkqpoSEWcpNJzykC6_FCLELt49XH8simr0jfQkswAlJaUyf1L6S-NwUxlrLljrpz-Pf5HriD5f_C_3W2KnpOm62-hqQCV-6pvqQ4bN93UWLhqsPzSW5i-m1CBJOMZJNMn1IIpL79leKSEEwHUakvy9uGS_Yyp7iixA"}', + ], + [ + 'input' => '{"ciphertext":"gAdBQ7hjuMX5YtjCBfBK05PIi_nI70F2MvkXBg_ZVKsVvk7eHJh-SChbxgXBL9jj8geeDmeAmWEq2EHnKeJWijDwCVWKOYcik77sZTVt6rE2G6TO_voznLhBe2APUNIsC_PnMoXoqooQt56Nmk_RFkWF-C1y7JV-n7VyCn5_RkoTAbnsdP5oKgygpBuLCpR0RQQ4vTwaagp8YCcMY39SsxyDDu39QxNhMIKHpJFkQhg","iv":"0Toz-1TbKoLMgZY4sF8Kzg","tag":"TPjfXltcP0YiWpIkfGpMtYeCTEjzycOLLoKNb_AFaXw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ","encrypted_key":"DGz8FIspXhuS0d42vh_zGr8c1moS4aXSHQQwv_N0TGMnsi5VWy6Pb6q74hjppisC57cEDZPBihhwoKP-VCwo9q8Bmh14PB4Q_BatRYBmeuthf9zEWWU6vuMb3T-Oscf4W7Y-j6BRF-j_3vmzh_zpvPbBlCS8_PMtSIhyXUXQHm2Mms3gLPS9J0HO5TvSxlhl87E2YnF97_r6aj_Z2Q1dt1gbn40ul2mHZT2BVsqfFSGsaRZWT9TDxx2AapfVp6QpKbDGm4xof5pmcHaQLWWsxcSMfgZk4-WR3GyAb2uhGdgEwXZpA3x5CI5xYGlCfQN3G4eLhl_S8fVcAK948HNC-A"}', + ], + [ + 'input' => '{"ciphertext":"ASzuUXMVZMB1u4sARjXgFy8TOLHbxRnSH83E-AqPDPEi4Vys4GGPMb586OptbihnljtSjluMXO74Ts8STpQRYh-Ayuf3_BexjZ0J5qPs48dQ4L3XATHaZJPmOfuq5oQPIBUf8yfu5HIg3pdt0NpHSHhMtIDk4qzGw04jzNjiRrO-XOvEuaUtdxyG6SzJLkC9vjGQIoqCc3lkNt_nCYdYvlawmSpVSOg","iv":"J2Gv1duwjMpYBiZl","tag":"-WIRo4aQY1u8LnuCU-U6Pw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ","encrypted_key":"dG5fw2ecXqZdzv9u1B1ycHB8WsZz6xjEVXHPKmXfX58Tjnt6ib0ujjJhiiJ1h3DAJme0J3mNGj7HPgxFgfRYjMGqKMlsflgHRSQq2Lax6L813Zlh1sW2pargM3D_Kvot8B6Anvzw7B91f7YWM0o2KtjtW-vaN_dI8IZYtzeGwTt5cw5wpSmN7GQDOwjPXCPCvZW_t0_SrOBRR_t4lJMXM9dk04cVG5EzMBUpej5VZWK4QmFQE0rQIhXEwg1D7DfPaQaD2BCYrix_xiKKGAq668F7buxblY6qcZ3xlZ5OWb_ACBQbPqUXRQjACzhhoJOUUH03naUCbFaRAKhgRuqUKQ"}', + ], + [ + 'input' => '{"ciphertext":"xpRJ9HfjZNhiwa4lB3AP6zlTH73VoKbFFkxe18ZGBbwMUGnvyPDMUXqhd6xYAO6bB4jyqYPnCzrGsqSQJuMfUP1tJYWzpXp3XtfJhltc4YFZTC0B9XBs_cr5cLkKG8lMRWPjLMJJNRykRub3vd9quiRx975V7B8kaMea8VxuhqO7jiyysMrrPEJ0XD4S_cqsO0mx35V-nADDEFSPG42hRyd0eGfHZvY","iv":"p8ZRC-ygp0ZPD4I5","tag":"LpgaGEK8QNJFhWIQfeJZvQ","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJHQ00ifQ","encrypted_key":"FqPsHMY4Cf_nBfOX3ydQnvQ_r9uFcWPtvlMDsso0tOy3GsnXzjtMHV1MW5intPU1nrnDQ96-qkV823bvxvGMhnp4gGdPGFX75Rab8WtakrhYCR1slO2JQ1kLzWId-Q2AbrHLU12LPK10H92jIQNfhKV-S6H5Z5aM75KIPNrMltjujssBp-O0FpfuZIrEr1M2egnOvGJpTvg9rhCzqGB8mppvSqNGQzfxG9bsIaOSOgkNXbDaLJd2bDB67bx5fANrtzhH2ufPqsURcVHckSLV2jciAi6usZP0kJKF9bDAEh9TPPykN8OraFe6V43ZyBJraZPotKXwYSAz-CKeUyZnUA"}', + ], + [ + 'input' => '{"ciphertext":"a0cEWXJTR2qhbkE4mQe_o6tnw5lIPIH5ta3qO0etKMME_BqAAW8psDljIIcwHdnPXwSUHk2ersqQnnUoJcgoKchsqbzv3lcr1htqjiMlAsekxXCqeIop_lGCfh8oms7J5Pdzxcf2lYWxy3jaRw46NIH-vCIfAJ6vG2n7bN_tiGwBoTkW6e8Ka03DbD5qCy7yLVgocMMeMW44fKj4NF2F0fiJiLHmbEQ","iv":"nf5j40aPEBokKvyV","tag":"dozonj7NaDgtujKnEVcjzw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ","encrypted_key":"QlCvG7s2llqAPRW8ssnH-U8BSpldsjw6HoGNzfUWmks7oGbi_4KwqqXdtdfnkbJu5VhK1tRy-f1fNCrP85Z95iTnHh1m07h7SXNlVtz_e-VRInwZaCRocYe-ysSwXdhHyBObGvACyYgE3H45l_wjSem1VxZMwvKz3Pj5s3CqYYrzI8nBjBePmxYaTwgFwJ5757V1wma81iywqc-bxRVg6CDaD6D9JThycJGFPpaYjl7JKUKlsshxjj4BPOPh5gRE6SYGQmg0fJSIMaTTz1XFYn842GzeYWTAHU0Uxap-dYTen6Sx50eNj1dxA-BiMc4sLqgrRrZ4VtJNea8upfzdJg"}', + ], + [ + 'input' => '{"ciphertext":"Pj6dOq86y3q_fWIYEbm4HeWvxmrOxQaTfR0Ks8TIVQCy1FmWRmA8qa4eZIr11o_2r2TeuffvhcgHbF-vBSYctFBizgQNaV-ohmJ8R8QjhQk61GGJfOYSzsJb9zArPppCxAMqwhs6EyxYqyOywEw0lWmmLiaNvnIBnXxKJOIeiuuVUSUsBUFwQX0JOG7VxhRrblR9DSbF_HxKYHWP0K3zNiTmq0zikIESUpXS2xSVrAA","iv":"VR-xf2ijkZ6lbJLXHA_GwA","tag":"50nZKsL8ZclrlCOSi0k7Lw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhDQkMtSFMyNTYifQ","encrypted_key":"Js33J-239Ph1hoL_dAqJeI4unEMgpyVZufkZsqVCapRWyn54ZSjVyhzsF6fVwWrCnLKZmwXX2eazsIX0eVsWpGfhvb7JuOmEwaTCtub-IqCKHP-twnCMO_dM_XdFtr8ch15TuMqCUbf_PIzKglj3uUhJbDmt_TLl0VBoAcFAuIoUYUnzxer1PIfT6WVcJ2dxvkYY-KCLUwPNpKJ9Vu7DwNbNm7HwTZlivUuMhLyb6Oc_4ssOWHHs96e_4Q0ZPJs8bhZ5oCgbugzLqYzfUirCw0xJHMimxwfMT2T8ftxr7swD94PnwNE_zpDOlY9rSv8NHnP0X_WAitwqn94-kVfVAAcrvtIbJRcaJdVDFxYiePypJYVeVYFxueWiLyUQz2nIx7fidzgFwcAFykxYjE1S_EE4gqCgtomtxuDz_daR9TM5LX8E_MWKoJC5X-BEKQDBO63pSZN13nfPWxJ_876Un_BsHjuNZIBYunqwEQ8FAKdH0kjo4WrDET1XVuBskylXpZw4JzsThRLU0sVotUwtlZZ-P3v6ATILUl63UDpQAOQxixsnpJkUiy65MmXbznVjG_PlJtXYSdDrcrLmkEdjP5Hh7BX2_kxT9Thhpt7wev_3oAnrMloLWnM3TAh0-eWGfXN85u42sgnNY8aHp0YiUFPKIM9SdRiSbd56RH5S91E"}', + ], + [ + 'input' => '{"ciphertext":"SCJCZj_IpM6VC-RCQiSSScXTx6i01Rmy1MevZvpJ37AQaCZiyCajQQ4fo_Sbs83WmXVrT1Mh_h7k39uH-cy1wqqDVBuocNLynLeO5gimCv9Gc2QiP6V0B0hcParhnttkYZU_eIIxYNRSvZbZxVHDasmm5oZ71vPXOLQcakk56iUxN430SjXcd8SeK733vx6q3YOo-0rmGT0tJLI3_V7VNYtBJ6WlHQXn9eUhVUK9OxQ","iv":"6bfRRLiAJ69GJRt8ItKpcA","tag":"_AwOo7Ns-4nS1D_OYxxsePH94IYUFVg8","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJDQkMtSFMzODQifQ","encrypted_key":"pKls_LCbXnBCTOWtEkn04ymw6ci4Yw7ha5BUCtfCGYz9LvCKfEgUh8As6Ss1LYRW8wq3-3ugdK4iPFQFkO_yh4_vMwUxrCFRA6dNC-xc43h91abSL1XjNKx38glmHdrTP9se-xF3Pnzum4dmzg1SgHBe9YD6uTJRtpmggfElBcSTaNSDathKcTqbHcf4OZccVEwqOelWZo38nid5fusQ8qRNjo82KDBv_2g1yB6nHanDHqw7DLDFKC1lIlU5KB8ejdfmrh0bIKMLlu4yKLNlX15vFJnPSsusxEVwKyB2cbFJBNPvGY86r1yNAvqGc1EIqL92MT9t_S_cGL40CrwgHZAXPMTw9r6f6UwEaA5ecWJe9bsH2J-I4E5Bj-3KvODm8uKLg0K6GUTiDQl25hufZz27bX0ZQ9PYLvj0zYB_KrcG9Gf9-B2XHAPNo24GtH5zDoPBpJsJxZz-l1MxKc_UcZo7J77GSglUOHJt92-P5Vrrzzf0VMRgqPSQMRi-GjYJt22l923rdZRYdLvbEIrEemaEjOzeIPczqgTFlz8fUIZg1869IY0k-PTg9xbOxdl0g-d6lwMOcPZpztDCqFd3s12Qez2FRUWAtBwlIwayQJk34vTsAyJ0psEsfMmYXXepx2SpiLfCXbbosXzY7NzfRTq-pqb3xnylYzZNRmzsUjs"}', + ], + [ + 'input' => '{"ciphertext":"I6oiXBKDe6u_kE6fbTWgU7p9PAxRAOzcHg8BY9u6yZS8hc2Bu6CpX0aDj0YZLkP6uwyJ3Yog34PR1Gx_x84gCUg3zuDYg3yHkfwc0HmFOE-4TsEPz1qBlPyZQjc-a1cY-XG5rzI6a3Z1WwdivsrbHPr_LoGmNrkNdjiDgR6qBYuhHN3o3uyCVoUGCZQLnjsD4eVqDaKqWHWzwUprhXQ_MqN3MUfUut6PXKreqx-HaSk","iv":"o93T2Wb6aPWwCaGu9x8V9Q","tag":"FT9xSVAHai49FE3vCxHLyLQ5nG0ANjxqglwC53a3AY0","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZDQkMtSFM1MTIifQ","encrypted_key":"HvJIBCziPg3SEH-AcBOMvd8dF70XQ95ILE8BEYolxhB1Aug-HFPDjHEwGysz-5Avq3bvub6FxQb9NBACJkZXqFiHp5X4SQXs82P-4w1YtYgV2rRXvmUv9_vrlTpTjEFtDZ_BbImsyV4Nua_CHQPplEdtKCrHTKyTA5XKHw536WioVBeJVtlddedqCt2cNBEnOXDqe7B9etEElY-nM1UpFEujOA5-U9gGWCeFDkHz6iTD8EpxIPIGuWuiyliDyYekT0rauLmIxkFJufSKpw0ltjsiE57JYzfHqNHmq1w-5YVi7I6eFwcDjBcb-hWEHASX-m8ta3QCYfrba6Zha9Gpi5tiQ6tHS212EkSW83KhK2UZ9h8XqFJuYjaEH4n1RJuwD4QXhwL6tTyQBNR1F2KukZQ7XTXbQnbi8vx5NmjlF4li0APLrEcdwQOBk3KThTAptitixkgYzOf8eaYlLvxS0YjDpUU1pAw33ijhlzTm6sftUjGw1BlRFNTezk5xut5A90VP3-5KnB4DszmziZhX5B-e0C33TfyZns3gnU-xnv7PuGtqTK6FZnWNd-tgRiBAZa9jZkC9eZhFmTscnnzYg2IfbdF69uRuqrPmzczmHh9CysiW-yjY7IaYdfm6EiM_4kHaGp3rgGvqi8ner8leq7ATRmVaoTAIMuzWNGFDL00"}', + ], + [ + 'input' => '{"ciphertext":"ndvL_g0t83KLzuklzpJ4KXartd1efSz3YIsI05epP1o_1KEzUizcaHarNe2g3U3dfjpeClNTG4upsjxwUJiTqLRU564CfhUrPnC0TyO8rW6y8iJgEIo3dAc907QlsLMAj5_6QMaxTOswyPMOt1wBjC6rktjuxQyWMnEo0RQKgsXf1f9bG3HGQEjdi7HpLSTOu2SrpFcMjXq3CLvV86wx5fkfHLjDABg","iv":"sT87oRGv_jLy0kRe","tag":"JhT9pf99SRCGaZniWxb5dw","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ","encrypted_key":"gU3dKyI6hYr6NmJ8bPuXgacnajdum4LpRNGrYVs-WTla7izvUs070lWnwtpRgG-cdnZRn8GEXJta51p6_60njdUTfw_7dDchilJLvc3Xwhlu7LMW9X9gt7IYsoXUiRPfTKBsFE0rzIRr56TWDvpSJtrAo2k8O-1K3uLOBYTFEyEsL579TynqDCMcu7fo2-ss2yph8-NmXsxMG7GXjJwZrdqNJlJIw71x6K4eZ_t219amRFubkWMMY_pbcv0X4cwbRw0D51Oa3cFEmRthqVkUgkmATZLTWnvNukNzCuAjIbfWseRj-Sp090AIxZs34ir2GWmlf8oMDY-oX9wIK-GikSe8wSbAgUSxpu3IbeSc7GQfzRY0ah4Byh10tk13KcrOvgKwIbWyFSuS1RFbAJuHtm1_cYIDzgvyFpPMo61hmsxJxjpO-Am8SN84R1c6xtPtuzU0LCURssMRXpbS2KzJ0khWL2o18maVaN3QPyI27AAzfI3lhQT3b1OHeOigI4f7PtTkPHO1bV7h2XvTZhMDIFYjqBibV4xmJpTDTKdlSkrd5a6eHAhjoIUPsfJQSmtoSVcbNncwXL3VlwxG1u_4yv7Oad5UQp3bs5bDgGe29BzCdrAP29kJirT8uNrPERANpOS-HCxoalOeh-Wutt8cSMwGVCb4_9ImtqM3C__Turc"}', + ], + [ + 'input' => '{"ciphertext":"BlH1xIp0sl06avNU6ilbAFYazGI2McXYuMVbaK5HT3G6R5Nslu4c5Pk1HdqDio48h0dzJSyg7tXQfBjiDoB6fW2M00mQYB9i1QQbuj2axdycE5R5l2NhoVhp-28DBynWAStkBiie4ND2YpAJGObFXAAHbi1OVzz-N8pnK8SguWRezQapljC-besKyQSKYcHaJFq_hhxGHBskTC89o3xBwpWQ2lchSvA","iv":"3Ilx73gx6nhs3cGy","tag":"vjk7-Ogspz8hsw37gJ-9ig","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExOTJHQ00ifQ","encrypted_key":"EjGYVkdnnTFJ-zVcDUw0XD4PK6iKzaG_Qd0tLycGKmEY4-YXX71ld4sFaXW8bmLsrTPKeGNg44r1ZYAdM6V_1DBMc98uOksq6aYxB3I3M0l6JNOgp4CvFbDE05e10v2bLY81a3O6yav4yLq94hl2eRnlFg5meNK4xhpwRKo_VsKTbNLvbx6BARwy4-tpkJrKw9G5JiGJSrQMhx888sp-GoKLb-TWv2_5SYxpGGPKU6jAJaJXijWNfnWxHjhXJhWSLFu4As64i8uHRhF3FVSz9g-hDuU9HwPPwSxEOm_TwfZdO5BU5N16RE8l6pgDJNmvO1Rwtvthc8Ngf-9v_LDFK8radc_Ne3NJc4kORRd25Cl-rxu9_1e8SYFpEhHL9_MXylBe4rxrXg-GCutwdpm9_RotogJALd-qQKy0zBdMRQyVVoJpC8lxeOo15q9Ztnr3hkoqtPVOAh39itIlQHOzG2PEjrmcXezHAFxb6ezFOTZVUNyWRqV7jZDi17YtDUDQfPQRpy6wydCRpmkR19W-6cUJ-LQJvtU7YhN-2vc4MWZL98RCoiJ72hTgocStquEa2YWX7RZcKKBAjqw41ZZ5JtCUiIBm-4aSWRra_FNcGbIwkbt81HphLoEyCIr3U-fP0gG1H5QEXDCml7lAgcWKXHbpKuVQt2HNslCcaLBPVLs"}', + ], + [ + 'input' => '{"ciphertext":"iTzfPt_ytyL-OGKtXaJLY7Y3A1tLnYuYpZoR2IWLi2xINT3U-Rw8p6KTVBUUwO0O6PrAzXr2jypJQ2g1KvFkigu1GGQgTBbvaQXAxvQjlZMqJxRkxLUofL1a_hW2X9NzSHM0v3ATFlJWyeXeEaEKknK5L7Q077zVcjO2RRVxw57WAg1rgN8mHOqKOdvqfXvvW9Vkp5kKZ6LJjiDH5YJhw9liVKEO36Q","iv":"lZGMh_o3obcO5XaG","tag":"iQB1Xd-uWtPw1uBhO9uxYg","aad":"QSxCLEMsRA","protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ","encrypted_key":"pCgocOLTFZYWbxfrtR_AqKGDI7EkgVL6uBMTybiCo-ws74pcCwS21N-SOmPAZ6olnXZtoZNnVQMHhj2IKSZNOdmjnvzdJgLCmk8PyBrj4WZTU-ebPArKyeYjwSRpOKRFFpBbk78KatR8lu7wfmgKhSAjYBLZ-eSlWL9J8SUXs1zX9wyPFzvkGOSwrP__WnZdv5-J_9bggexerK1NVnZJrm8quVqmD97udcd8KSVF6ijxC81ZAcViJ6WVgFfynhaNjesuR_T6MCDyuhoMYlwkzvcou3MgYfblyLeDzbdnSdzYkzqqgZbFErKJnD7tErRqpk4w1pCmwgDdDGSp8-Y_h459-CL11xxVVkLCsPPOdpsUxMem0zmrSA7LzjTU1dld6nupcWM0ZlUEFz1pfrkVuMRmL1b-9o1AJxsLtEbx0MwFPJMKnPZCdnPITTK5MvEdG1-7CRBtjxwE98JMQ6AYEf2VKog2ji1PauDo-EZ5v8BvTbwPUrYNF-ofM_S-dzFXEt4mMRJSQWV6oCZX-OWyfULNvZywd35Y2nuQeZHzvtoBU8d8SB20iAezl135TgOKuwoNosvgUxXdwsVwyWdXoDOwcYURVgpef0qR8RfrBN3khIuhfqQOopKSJpzgFVnj121Db5qV6-0nu0Y6hkyj0EBvLug70wZF_oAfi0kCPr8"}', + ], ]; } @@ -83,37 +128,39 @@ public function dataPrivateKeys(): array { return [ [ - 'recipient_keys' => ['keys' => [[ - 'kty' => 'RSA', - 'n' => 'p_Gffumd-Rj-hrWEKMZdfOw0JZci3dfVCkLYYISt60ajg8aktRR6Rc_1m_NMPIP2_BK5kXwWb74lqLh-x0iunfpgxHWnw4Wy00V2YwR0MtgbRW4JYyJjw9Fj7QooWdqRV7OoJb3VIpmBqr-JKjTV-91W6jPWcQNsUFYL5JsJ-sM', - 'e' => 'AQAB', - 'd' => 'pYj2sexpJj8pmfPOaTZkrZ5QJAEdf9aeiTer-S6uEqqUv22LqWSexLMfHvEn4rocNwfp2umZX9jnW69GXv1YBouBqrnN4vANPnjFp8y7ejKO_XDzKrf2c5YMgm7l4eE6aCHzEn2kFy971f97HN07KfiHNTln9boNGVsA6TpVrhk', - 'p' => '2zIyk5fQMKC7vHqDCGQ-xEXRgiTZsQ2fN5gQ7rDsvGJdDBfpeWA8H3_bidSCNfAskSyhLoEFwQplARblm74BVQ', - 'q' => 'xCRtcvPKTJ_uRZ2kxn8zMlETXcq1CBbuMLhZDl4QT6ksgAoOqnqITwckSXL2sTXTmDwgtuB1HYXk4TAXhwbrtw', - 'dp' => 'EVJfMtCtcBpTm6pmznP1jdcinlFBLr-v1FndBK_QlXaEed8t4Rycw7R76eF0RMTtEK_hMOabSM0EfFiN3ofeXQ', - 'dq' => 'rA5MWEcU0YyFhlnYHiucrGnEdEUJ8pOy09gSfvDym_6Jw7OO0-rywWhBY5DOZ_sQpv0vsVxKP-ChOwxlxxPCFw', - 'qi' => 'FKqVgknFuntcWE0b4NSoqROngDbxLd-lQ2DWg9z7G-knJTizDwj_7tSlNbqYlcbXXNf5vRnhQCePb4KqKyPh8Q', - ], [ - 'kty' => 'RSA', - 'n' => 'slVGbcg7Mr_tQmfDJAIWrlWjBWpi_JzGTjCCVZGOikH3ekkUEH8TN39WJ2HXBwSNmT4bh8eRJsUyBKYr8yz3UdEUJxloo2SVZEN0rXh2Jb84OdObom1CFbPg4yQOvLN57pE06zc7GzQ1MKF2dqRFvyEyibKcs3V6J2DjvDXbxJAnTOmxWjLRKa6v9aKrNCakK_qSRzEwR-IbNnGHSrQr1RaDQ2gQ7FuVuNOJe8rrdlP1dIdg3ElzvDgjg3NY54b8SqwThXt8gRM1VKg5O-6fRdHLPS4L0DOElDlc8lboqA6oI1187cbLq__4P8c1pordIBmHXdbSd-4Q1BYnNVqfoQ', - 'e' => 'AQAB', - 'd' => 'rhaTB06lg5ha3C2BESC81XkiCIJfmWzOJbwzL6dFd_CHz6eRX709nDrBdvaLO_2U4VkA9R67sxZkCqfRVbW6xfMN8lFalc72C4fSWhmzdIvkLodFcl2oWplb20Dy5gFq8ZptB4XGPHtNxWiJxa39rGSS-lsToBj5o4FxL-V_4bSZOLWLfUIaFS5xJ4xZ6rLAH1gd8AlUbQfcwToDCjzyWSZDHFqCtOr10tD_3OeK_SdQoG4FGpnNo4WdUstTRTIYGaN8N_ThJh-f7bWUomEuBFhKT6FCXkxHbPfq1t3q9YhQBmg2_Jw9gUWD4lukPDpvdp-_blMRqs-9JNkL8plEsQ', - 'p' => '53OBPF6RmswOMkuK8MhXjLT5NNCaFce9rKkpK-8KHK7UqVHqW006mzJ3kYVm2nIFODCqSO6RZcmEhLgrpZhAqbOl07lvh5nhhiXJyjaw6rcCumKTbjfX8dksnxHG2ik0Y8-1PHJwhIRHrjAeuf17XHgaATKOSxDVYSk-A7MClFU', - 'q' => 'xT96R1C3y4zakgYWdThV9fn4sFgrlUFWrcMiis5dldl2k8aQrRCXRzWUNMK9G12ibBnXipVT24ZOQKJ0bqeoMU6aopY4DlsyWSzCEfJ6ojSE6Jd-Wnwb5TglNhXTq2wPjkpdbGTum7UeXYhdCJdwhc1GUkIU3ctTquY4isuyih0', - 'dp' => 'f6oJbfgnzj-h0QI0KC4JhJZKI2SwqTTcnYFNMWuPo1SX_rEtWKEXo4VJyJ3RpspfsKe_Na1Jy-BE1UQU5yk8-Z4a6NcO-rfZWro7POu_2CeMPKyk75Wj6kXFRBR1H968hBWMvUPOZnnkY-Ms_6AezFl-1oxBSoyFditehoHV-WU', - 'dq' => 'eoEtMaOpMwt9KFoNkqn1gXrKAMQR9XYKHotmJa17pDjWk3ssmcAHJJvbO1WDW76wxNDb9F9AIMRuT2hWRe9s34rBMZ94mzn6sDXDJqBhl-JkdYy5Vftk290eB1RRDVNk6eu30D1zkFNR06eAmHht0zwlo6sVCJdilG69yT4v2eU', - 'qi' => '5vefHlL9JtiX-FBMYT6CSo51c-tonow5cj3Jl1crRuxod6zjXM13dr4bki40MT_ZQ8x1kjerFuoA1fYyktTAQnRgcafjYyZJIkh3RdGLf-_kDQ_up6v-k4IEile3RM_XST5lyq1ei6UuRO5NQDa5L9OctY5QWDz-rw9_51iKSUg', - ], [ - 'kty' => 'RSA', - 'n' => 'zBlgpPT7LeCKZbaRoX5iENY338bavaU-d_vw6xF4hYhqSBYoH2mt5WPeIW-lz9o1xlbxw-W6YnlHMuJfefnXOvZfFUNOK5-QGBq8ZJY7sfNJ0vxHJ2FJ8cNvpChTEqG7CRU6ZK_V2h5XuQFg4FGASbEgiJjRoPHrXwwts_e1ICIsW0Lg_YGBOk8RqlzguD-NcexYpO_N0VV-J5J5jlVxAEdVgddT-d9sGBx2Vq3PE3D8ZMTZ6UXTvmmdGK_CA-0Y7ep3UgYKVRmv2XLwwsmPWYJy8Ky9wqTnt58Lz5H6iZAGmgEztaf7hB-hRymDTFRWn2-zFhd1-TdqQ6xgZyfA4Qp7vFe1s9LZr_A-jFN2ZO7sP2x6e0dVDszzo0dJ41jrY4aP19hpOnPcXQ0sqjzahLmajekmtM3GjqBd9-bODXqCWiOhzc5Tl4Ru7_N1FEqUXVwBJhWelChez6DVTMeNdIJVw36ARtVNdsBwNTLK8q8n72cc_zwBmhFkGBdxHercMjmD1YJAaRfXfh8OJBbFJDSZkMp4N5PwK2iM4oy79xTsB61OZfEcwf1F4LKSDyyvJC5Mg1_Imc311nAdsDohBQMZquh-V73c6DhhBBRaAKk1esQoGUgLVBXsfR2RABr28WFM8RmOZKRdpI9AJO-6Z8X7a4JHCldljpyOX4mwWG8', - 'e' => 'AQAB', - 'd' => 'WS-lua-Lqyp5j6TN0oIFnFHfrJuarlBtEcU4K6BAyCkqOEHmWoO1h42yXW4KSN-TrA4GK5JRdgKFCEk_a2-vi4ZpWkNE_28EamQUeufjQgmL8vRmq2CqDUlXmaY9VuDxeDCcia8EhgHIV4GwsZUruAf8rXQJ9oiAT9JkjkXqEhacx2xcIKrcq3wtvgJD-H9c8bFTsw9PIvB25hftojLX5EVHqitL-N6Wv5qAY7Qjzt0KjYYvqu3mb0h7a3QyFcEfqadRaLhW_4TwANdnOdcWGwkT7POvIEUrNGP9p0Ck-EPFfrqTvAehssSXlx8eztXz3EvVOAwcc0Cx4MyMe8c1UtmKaXu7_v719irOXtECAtr7FfK_ycFA9dVQbKKBkj4MAidfgSLm5m9Ago8QnuyPHHktCcMzOeQNe6eY97rrBNpI3XEJJM97hnaIn1_g-poQgrnpYSZhTsDaKe9-ls8sD6RMqWHnVGe_bXsNfdi5G3iMqXAY94l0Eqrr_jTXdkmA-xTBCFfHcCLm5RDRBgc1zVYkl5d8rW822pyN4hfJsV1JR0KAltUQ2TCFR6fo0e6Ne-YbZDBHHPAD_s3m-2zSXSlODIG-bqR7beb8Ta9kjZo0advMbo4HjcY_qqd5KIY3HuyQWUGMABg96w_JxgFXEQVp3a6XQJaewQSRhsxTtGE', - 'p' => '6l8TYYzb7VxrUFtKBbF1dTFjsRmAOajL6BGNB0Yyw0smZUEZL-HHeW3NzN4qB03oVUnNeAKKOde3-8mgDxi1qzB6ytqhJqrv0iRpsDJax7OP_F47um33nWcsipCHmzczM7f8HBmzD_beoMPGvsoUAzNIv9Ka0dz-1hQqz5etiKSMMwozAnUj_TqPLedc4DG6EaW8x_vgNfW-_puK-IzwsT5YjltQ8weufNxLlrT2sx9QT05jbxe2YR2ijNgvKxo-G0wz9A8pn5wiPB3NsdsHAy3mrtjMEjwv_Z65y0XPPO1W1Bp68XICknzghgTc7nZR_31NSrtEPmQBlJqoJPis-Q', - 'q' => '3u8h8WiXSx6AtPGQpvmNebZqi66ITQcAhvdF8O_I1LdjswBTZwpXqKXb5kLBPXOAH6YqgxURNwZZ4M5Ys6iv66jVzPbSU_MMHlsiXzgeVfUxwbdOHpiZhRzoB2gzznfFDKR8bu1S07tYePeaEwplsSg2Vb5tC81uNIM1sshfeuDO5cZOH8DmuJzTjhGjb8CWmbgLnFOSBuPl-Vcr3oYVCnWzvEfCgUIy5tC9KeBC8Qe3O841SjbN3yZ8EEXwcUmo9lOt19s3LKBmtT94SXtok6-wHVWlL3YbzRg1kl8SVjN28NJd990mjPhjqBK8KyChCxoPn8lIXEUwGwFmIz4Spw', - 'dp' => 'tYIqXVscnAf-KD565kvX_ongfjCUqJL8T97_zIlmGO8jbjlrSzTdKkKKpsXL4NpKO3srwGyfJkrVdw9ggTCOyWSDRITrVyn9D08Z9tYYjh6XPUixkyFFKkbULP_ftaqbYct0WULh9VQoeHMGgY24z_2wsrZlJnCzf5Ig0aLTR0bAOWsFtDqKQ7xNVKygthRs2Ov1dx-vNbr7Tu2hQ_rLEUmKhb1cxMrHLHXjqHS_tlti8_huc4P2v-GWmON4LDZnsPZkKfhwMOdXcB1Yxwwssx6iT_kgmmK4e_-oPi_zXmkk3KEhY8n7Cf3iWIh9ncROnsIo0N6U7IjA3Jil7fQU6Q', - 'dq' => 'kYMy-5jST_Tr-69FRMfU4WIA74WPb_-nB3F1VIue4cGGMPuAdNxaVTlVbFmcOlkegwn566-fmfPqTINDgJkVotOEIhHlPWiCO3ou2EoP-vldbd0Q_4WJh0pT5SnNzvF8TAE9O0Zq7sr1N5geGFmMAPOHa7YtBSwkx9_w9-4z7Ee6pF4o9i76KfwrVisLK9FgO5vW8EXYJekxXevZNZj9OOOU2stYGPi1stUC88duylbH8iBpxjQ5cnNzPUf5Zmi3AXmjGib7P4S_JYT1JbmIjAV8Bdm2RWFpShiINy8ZD-ztsMkPDs9p70_d9IGuEtRsaYusMRa3xYpfmPDz0wMcNw', - 'qi' => 'sEHok5K2HG0q6JdNzHB7FsM9EJxY7c6Gkya3Lfr1Rr5OYPcAosEIZpl-1_hCQ3MLGKT9UlYjZrlyt6SOUvCkxFX9slDZQeagmlSNMyWs18U0MxhFpEGthqLthS6ik0kFlschiSpMMyKVI8kgQR3OjMDcA_Mr92gZ9fl-mhtl2yfXJsBIkFBD7yOyxRxawy7v05RehoDHmdy2cnzaakPvg3Cekma2mfdjYgN5JnS0A20pC1zfoqi0D3B4KGrYVZhyJRnBakOUmwvE8rfmcjThx169LiAea6SYs7k9jwUCVWrNexXItxGdbQbbrb-FUotAcAQSDr6hHU8H79gN63WoOQ', - ]]], + 'recipient_keys' => [ + 'keys' => [[ + 'kty' => 'RSA', + 'n' => 'p_Gffumd-Rj-hrWEKMZdfOw0JZci3dfVCkLYYISt60ajg8aktRR6Rc_1m_NMPIP2_BK5kXwWb74lqLh-x0iunfpgxHWnw4Wy00V2YwR0MtgbRW4JYyJjw9Fj7QooWdqRV7OoJb3VIpmBqr-JKjTV-91W6jPWcQNsUFYL5JsJ-sM', + 'e' => 'AQAB', + 'd' => 'pYj2sexpJj8pmfPOaTZkrZ5QJAEdf9aeiTer-S6uEqqUv22LqWSexLMfHvEn4rocNwfp2umZX9jnW69GXv1YBouBqrnN4vANPnjFp8y7ejKO_XDzKrf2c5YMgm7l4eE6aCHzEn2kFy971f97HN07KfiHNTln9boNGVsA6TpVrhk', + 'p' => '2zIyk5fQMKC7vHqDCGQ-xEXRgiTZsQ2fN5gQ7rDsvGJdDBfpeWA8H3_bidSCNfAskSyhLoEFwQplARblm74BVQ', + 'q' => 'xCRtcvPKTJ_uRZ2kxn8zMlETXcq1CBbuMLhZDl4QT6ksgAoOqnqITwckSXL2sTXTmDwgtuB1HYXk4TAXhwbrtw', + 'dp' => 'EVJfMtCtcBpTm6pmznP1jdcinlFBLr-v1FndBK_QlXaEed8t4Rycw7R76eF0RMTtEK_hMOabSM0EfFiN3ofeXQ', + 'dq' => 'rA5MWEcU0YyFhlnYHiucrGnEdEUJ8pOy09gSfvDym_6Jw7OO0-rywWhBY5DOZ_sQpv0vsVxKP-ChOwxlxxPCFw', + 'qi' => 'FKqVgknFuntcWE0b4NSoqROngDbxLd-lQ2DWg9z7G-knJTizDwj_7tSlNbqYlcbXXNf5vRnhQCePb4KqKyPh8Q', + ], [ + 'kty' => 'RSA', + 'n' => 'slVGbcg7Mr_tQmfDJAIWrlWjBWpi_JzGTjCCVZGOikH3ekkUEH8TN39WJ2HXBwSNmT4bh8eRJsUyBKYr8yz3UdEUJxloo2SVZEN0rXh2Jb84OdObom1CFbPg4yQOvLN57pE06zc7GzQ1MKF2dqRFvyEyibKcs3V6J2DjvDXbxJAnTOmxWjLRKa6v9aKrNCakK_qSRzEwR-IbNnGHSrQr1RaDQ2gQ7FuVuNOJe8rrdlP1dIdg3ElzvDgjg3NY54b8SqwThXt8gRM1VKg5O-6fRdHLPS4L0DOElDlc8lboqA6oI1187cbLq__4P8c1pordIBmHXdbSd-4Q1BYnNVqfoQ', + 'e' => 'AQAB', + 'd' => 'rhaTB06lg5ha3C2BESC81XkiCIJfmWzOJbwzL6dFd_CHz6eRX709nDrBdvaLO_2U4VkA9R67sxZkCqfRVbW6xfMN8lFalc72C4fSWhmzdIvkLodFcl2oWplb20Dy5gFq8ZptB4XGPHtNxWiJxa39rGSS-lsToBj5o4FxL-V_4bSZOLWLfUIaFS5xJ4xZ6rLAH1gd8AlUbQfcwToDCjzyWSZDHFqCtOr10tD_3OeK_SdQoG4FGpnNo4WdUstTRTIYGaN8N_ThJh-f7bWUomEuBFhKT6FCXkxHbPfq1t3q9YhQBmg2_Jw9gUWD4lukPDpvdp-_blMRqs-9JNkL8plEsQ', + 'p' => '53OBPF6RmswOMkuK8MhXjLT5NNCaFce9rKkpK-8KHK7UqVHqW006mzJ3kYVm2nIFODCqSO6RZcmEhLgrpZhAqbOl07lvh5nhhiXJyjaw6rcCumKTbjfX8dksnxHG2ik0Y8-1PHJwhIRHrjAeuf17XHgaATKOSxDVYSk-A7MClFU', + 'q' => 'xT96R1C3y4zakgYWdThV9fn4sFgrlUFWrcMiis5dldl2k8aQrRCXRzWUNMK9G12ibBnXipVT24ZOQKJ0bqeoMU6aopY4DlsyWSzCEfJ6ojSE6Jd-Wnwb5TglNhXTq2wPjkpdbGTum7UeXYhdCJdwhc1GUkIU3ctTquY4isuyih0', + 'dp' => 'f6oJbfgnzj-h0QI0KC4JhJZKI2SwqTTcnYFNMWuPo1SX_rEtWKEXo4VJyJ3RpspfsKe_Na1Jy-BE1UQU5yk8-Z4a6NcO-rfZWro7POu_2CeMPKyk75Wj6kXFRBR1H968hBWMvUPOZnnkY-Ms_6AezFl-1oxBSoyFditehoHV-WU', + 'dq' => 'eoEtMaOpMwt9KFoNkqn1gXrKAMQR9XYKHotmJa17pDjWk3ssmcAHJJvbO1WDW76wxNDb9F9AIMRuT2hWRe9s34rBMZ94mzn6sDXDJqBhl-JkdYy5Vftk290eB1RRDVNk6eu30D1zkFNR06eAmHht0zwlo6sVCJdilG69yT4v2eU', + 'qi' => '5vefHlL9JtiX-FBMYT6CSo51c-tonow5cj3Jl1crRuxod6zjXM13dr4bki40MT_ZQ8x1kjerFuoA1fYyktTAQnRgcafjYyZJIkh3RdGLf-_kDQ_up6v-k4IEile3RM_XST5lyq1ei6UuRO5NQDa5L9OctY5QWDz-rw9_51iKSUg', + ], [ + 'kty' => 'RSA', + 'n' => 'zBlgpPT7LeCKZbaRoX5iENY338bavaU-d_vw6xF4hYhqSBYoH2mt5WPeIW-lz9o1xlbxw-W6YnlHMuJfefnXOvZfFUNOK5-QGBq8ZJY7sfNJ0vxHJ2FJ8cNvpChTEqG7CRU6ZK_V2h5XuQFg4FGASbEgiJjRoPHrXwwts_e1ICIsW0Lg_YGBOk8RqlzguD-NcexYpO_N0VV-J5J5jlVxAEdVgddT-d9sGBx2Vq3PE3D8ZMTZ6UXTvmmdGK_CA-0Y7ep3UgYKVRmv2XLwwsmPWYJy8Ky9wqTnt58Lz5H6iZAGmgEztaf7hB-hRymDTFRWn2-zFhd1-TdqQ6xgZyfA4Qp7vFe1s9LZr_A-jFN2ZO7sP2x6e0dVDszzo0dJ41jrY4aP19hpOnPcXQ0sqjzahLmajekmtM3GjqBd9-bODXqCWiOhzc5Tl4Ru7_N1FEqUXVwBJhWelChez6DVTMeNdIJVw36ARtVNdsBwNTLK8q8n72cc_zwBmhFkGBdxHercMjmD1YJAaRfXfh8OJBbFJDSZkMp4N5PwK2iM4oy79xTsB61OZfEcwf1F4LKSDyyvJC5Mg1_Imc311nAdsDohBQMZquh-V73c6DhhBBRaAKk1esQoGUgLVBXsfR2RABr28WFM8RmOZKRdpI9AJO-6Z8X7a4JHCldljpyOX4mwWG8', + 'e' => 'AQAB', + 'd' => 'WS-lua-Lqyp5j6TN0oIFnFHfrJuarlBtEcU4K6BAyCkqOEHmWoO1h42yXW4KSN-TrA4GK5JRdgKFCEk_a2-vi4ZpWkNE_28EamQUeufjQgmL8vRmq2CqDUlXmaY9VuDxeDCcia8EhgHIV4GwsZUruAf8rXQJ9oiAT9JkjkXqEhacx2xcIKrcq3wtvgJD-H9c8bFTsw9PIvB25hftojLX5EVHqitL-N6Wv5qAY7Qjzt0KjYYvqu3mb0h7a3QyFcEfqadRaLhW_4TwANdnOdcWGwkT7POvIEUrNGP9p0Ck-EPFfrqTvAehssSXlx8eztXz3EvVOAwcc0Cx4MyMe8c1UtmKaXu7_v719irOXtECAtr7FfK_ycFA9dVQbKKBkj4MAidfgSLm5m9Ago8QnuyPHHktCcMzOeQNe6eY97rrBNpI3XEJJM97hnaIn1_g-poQgrnpYSZhTsDaKe9-ls8sD6RMqWHnVGe_bXsNfdi5G3iMqXAY94l0Eqrr_jTXdkmA-xTBCFfHcCLm5RDRBgc1zVYkl5d8rW822pyN4hfJsV1JR0KAltUQ2TCFR6fo0e6Ne-YbZDBHHPAD_s3m-2zSXSlODIG-bqR7beb8Ta9kjZo0advMbo4HjcY_qqd5KIY3HuyQWUGMABg96w_JxgFXEQVp3a6XQJaewQSRhsxTtGE', + 'p' => '6l8TYYzb7VxrUFtKBbF1dTFjsRmAOajL6BGNB0Yyw0smZUEZL-HHeW3NzN4qB03oVUnNeAKKOde3-8mgDxi1qzB6ytqhJqrv0iRpsDJax7OP_F47um33nWcsipCHmzczM7f8HBmzD_beoMPGvsoUAzNIv9Ka0dz-1hQqz5etiKSMMwozAnUj_TqPLedc4DG6EaW8x_vgNfW-_puK-IzwsT5YjltQ8weufNxLlrT2sx9QT05jbxe2YR2ijNgvKxo-G0wz9A8pn5wiPB3NsdsHAy3mrtjMEjwv_Z65y0XPPO1W1Bp68XICknzghgTc7nZR_31NSrtEPmQBlJqoJPis-Q', + 'q' => '3u8h8WiXSx6AtPGQpvmNebZqi66ITQcAhvdF8O_I1LdjswBTZwpXqKXb5kLBPXOAH6YqgxURNwZZ4M5Ys6iv66jVzPbSU_MMHlsiXzgeVfUxwbdOHpiZhRzoB2gzznfFDKR8bu1S07tYePeaEwplsSg2Vb5tC81uNIM1sshfeuDO5cZOH8DmuJzTjhGjb8CWmbgLnFOSBuPl-Vcr3oYVCnWzvEfCgUIy5tC9KeBC8Qe3O841SjbN3yZ8EEXwcUmo9lOt19s3LKBmtT94SXtok6-wHVWlL3YbzRg1kl8SVjN28NJd990mjPhjqBK8KyChCxoPn8lIXEUwGwFmIz4Spw', + 'dp' => 'tYIqXVscnAf-KD565kvX_ongfjCUqJL8T97_zIlmGO8jbjlrSzTdKkKKpsXL4NpKO3srwGyfJkrVdw9ggTCOyWSDRITrVyn9D08Z9tYYjh6XPUixkyFFKkbULP_ftaqbYct0WULh9VQoeHMGgY24z_2wsrZlJnCzf5Ig0aLTR0bAOWsFtDqKQ7xNVKygthRs2Ov1dx-vNbr7Tu2hQ_rLEUmKhb1cxMrHLHXjqHS_tlti8_huc4P2v-GWmON4LDZnsPZkKfhwMOdXcB1Yxwwssx6iT_kgmmK4e_-oPi_zXmkk3KEhY8n7Cf3iWIh9ncROnsIo0N6U7IjA3Jil7fQU6Q', + 'dq' => 'kYMy-5jST_Tr-69FRMfU4WIA74WPb_-nB3F1VIue4cGGMPuAdNxaVTlVbFmcOlkegwn566-fmfPqTINDgJkVotOEIhHlPWiCO3ou2EoP-vldbd0Q_4WJh0pT5SnNzvF8TAE9O0Zq7sr1N5geGFmMAPOHa7YtBSwkx9_w9-4z7Ee6pF4o9i76KfwrVisLK9FgO5vW8EXYJekxXevZNZj9OOOU2stYGPi1stUC88duylbH8iBpxjQ5cnNzPUf5Zmi3AXmjGib7P4S_JYT1JbmIjAV8Bdm2RWFpShiINy8ZD-ztsMkPDs9p70_d9IGuEtRsaYusMRa3xYpfmPDz0wMcNw', + 'qi' => 'sEHok5K2HG0q6JdNzHB7FsM9EJxY7c6Gkya3Lfr1Rr5OYPcAosEIZpl-1_hCQ3MLGKT9UlYjZrlyt6SOUvCkxFX9slDZQeagmlSNMyWs18U0MxhFpEGthqLthS6ik0kFlschiSpMMyKVI8kgQR3OjMDcA_Mr92gZ9fl-mhtl2yfXJsBIkFBD7yOyxRxawy7v05RehoDHmdy2cnzaakPvg3Cekma2mfdjYgN5JnS0A20pC1zfoqi0D3B4KGrYVZhyJRnBakOUmwvE8rfmcjThx169LiAea6SYs7k9jwUCVWrNexXItxGdbQbbrb-FUotAcAQSDr6hHU8H79gN63WoOQ', + ]], + ], ], ]; } diff --git a/performance/JWS/ES256Bench.php b/performance/JWS/ES256Bench.php index 03966bda..b88258f1 100644 --- a/performance/JWS/ES256Bench.php +++ b/performance/JWS/ES256Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('ES256'); + return $this->getSignatureAlgorithmsManager() + ->get('ES256') + ; } protected function getInput(): string @@ -74,6 +67,8 @@ protected function getPrivateKey(): JWK protected function getPublicKey(): JWK { - return $this->getPrivateKey()->toPublic(); + return $this->getPrivateKey() + ->toPublic() + ; } } diff --git a/performance/JWS/ES384Bench.php b/performance/JWS/ES384Bench.php index 6431f051..00d81623 100644 --- a/performance/JWS/ES384Bench.php +++ b/performance/JWS/ES384Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('ES384'); + return $this->getSignatureAlgorithmsManager() + ->get('ES384') + ; } protected function getInput(): string @@ -74,6 +67,8 @@ protected function getPrivateKey(): JWK protected function getPublicKey(): JWK { - return $this->getPrivateKey()->toPublic(); + return $this->getPrivateKey() + ->toPublic() + ; } } diff --git a/performance/JWS/ES512Bench.php b/performance/JWS/ES512Bench.php index 35f4d871..7edf2ccc 100644 --- a/performance/JWS/ES512Bench.php +++ b/performance/JWS/ES512Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('ES512'); + return $this->getSignatureAlgorithmsManager() + ->get('ES512') + ; } protected function getInput(): string @@ -74,6 +67,8 @@ protected function getPrivateKey(): JWK protected function getPublicKey(): JWK { - return $this->getPrivateKey()->toPublic(); + return $this->getPrivateKey() + ->toPublic() + ; } } diff --git a/performance/JWS/EdDSABench.php b/performance/JWS/EdDSABench.php index 7df6c2bf..fc526892 100644 --- a/performance/JWS/EdDSABench.php +++ b/performance/JWS/EdDSABench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('EdDSA'); + return $this->getSignatureAlgorithmsManager() + ->get('EdDSA') + ; } protected function getInput(): string @@ -71,6 +64,8 @@ protected function getPrivateKey(): JWK protected function getPublicKey(): JWK { - return $this->getPrivateKey()->toPublic(); + return $this->getPrivateKey() + ->toPublic() + ; } } diff --git a/performance/JWS/HS256Bench.php b/performance/JWS/HS256Bench.php index d8ed63d9..ca4ffc76 100644 --- a/performance/JWS/HS256Bench.php +++ b/performance/JWS/HS256Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('HS256'); + return $this->getSignatureAlgorithmsManager() + ->get('HS256') + ; } protected function getInput(): string diff --git a/performance/JWS/HS384Bench.php b/performance/JWS/HS384Bench.php index 65a5b083..21bd67c9 100644 --- a/performance/JWS/HS384Bench.php +++ b/performance/JWS/HS384Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('HS384'); + return $this->getSignatureAlgorithmsManager() + ->get('HS384') + ; } protected function getInput(): string diff --git a/performance/JWS/HS512Bench.php b/performance/JWS/HS512Bench.php index 3d763b7f..cfab1de4 100644 --- a/performance/JWS/HS512Bench.php +++ b/performance/JWS/HS512Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('HS512'); + return $this->getSignatureAlgorithmsManager() + ->get('HS512') + ; } protected function getInput(): string diff --git a/performance/JWS/NoneBench.php b/performance/JWS/NoneBench.php index 69c6d073..67ce08ec 100644 --- a/performance/JWS/NoneBench.php +++ b/performance/JWS/NoneBench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('none'); + return $this->getSignatureAlgorithmsManager() + ->get('none') + ; } protected function getInput(): string diff --git a/performance/JWS/PS256Bench.php b/performance/JWS/PS256Bench.php index 55d1091c..8420b83d 100644 --- a/performance/JWS/PS256Bench.php +++ b/performance/JWS/PS256Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('PS256'); + return $this->getSignatureAlgorithmsManager() + ->get('PS256') + ; } protected function getInput(): string @@ -78,6 +71,8 @@ protected function getPrivateKey(): JWK protected function getPublicKey(): JWK { - return $this->getPrivateKey()->toPublic(); + return $this->getPrivateKey() + ->toPublic() + ; } } diff --git a/performance/JWS/PS384Bench.php b/performance/JWS/PS384Bench.php index 629b674a..01a2faba 100644 --- a/performance/JWS/PS384Bench.php +++ b/performance/JWS/PS384Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('PS384'); + return $this->getSignatureAlgorithmsManager() + ->get('PS384') + ; } protected function getInput(): string @@ -78,6 +71,8 @@ protected function getPrivateKey(): JWK protected function getPublicKey(): JWK { - return $this->getPrivateKey()->toPublic(); + return $this->getPrivateKey() + ->toPublic() + ; } } diff --git a/performance/JWS/PS512Bench.php b/performance/JWS/PS512Bench.php index efdd1298..218c5eb3 100644 --- a/performance/JWS/PS512Bench.php +++ b/performance/JWS/PS512Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('PS512'); + return $this->getSignatureAlgorithmsManager() + ->get('PS512') + ; } protected function getInput(): string @@ -78,6 +71,8 @@ protected function getPrivateKey(): JWK protected function getPublicKey(): JWK { - return $this->getPrivateKey()->toPublic(); + return $this->getPrivateKey() + ->toPublic() + ; } } diff --git a/performance/JWS/RS256Bench.php b/performance/JWS/RS256Bench.php index b1ce96d7..b71a6e95 100644 --- a/performance/JWS/RS256Bench.php +++ b/performance/JWS/RS256Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('RS256'); + return $this->getSignatureAlgorithmsManager() + ->get('RS256') + ; } protected function getInput(): string @@ -78,6 +71,8 @@ protected function getPrivateKey(): JWK protected function getPublicKey(): JWK { - return $this->getPrivateKey()->toPublic(); + return $this->getPrivateKey() + ->toPublic() + ; } } diff --git a/performance/JWS/RS384Bench.php b/performance/JWS/RS384Bench.php index 98885801..4cf8bf21 100644 --- a/performance/JWS/RS384Bench.php +++ b/performance/JWS/RS384Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('RS384'); + return $this->getSignatureAlgorithmsManager() + ->get('RS384') + ; } protected function getInput(): string @@ -78,6 +71,8 @@ protected function getPrivateKey(): JWK protected function getPublicKey(): JWK { - return $this->getPrivateKey()->toPublic(); + return $this->getPrivateKey() + ->toPublic() + ; } } diff --git a/performance/JWS/RS512Bench.php b/performance/JWS/RS512Bench.php index 1dc20a6a..de09b890 100644 --- a/performance/JWS/RS512Bench.php +++ b/performance/JWS/RS512Bench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\JWK; @@ -51,7 +42,9 @@ public function dataVerify(): array protected function getAlgorithm(): SignatureAlgorithm { - return $this->getSignatureAlgorithmsManager()->get('RS512'); + return $this->getSignatureAlgorithmsManager() + ->get('RS512') + ; } protected function getInput(): string @@ -78,6 +71,8 @@ protected function getPrivateKey(): JWK protected function getPublicKey(): JWK { - return $this->getPrivateKey()->toPublic(); + return $this->getPrivateKey() + ->toPublic() + ; } } diff --git a/performance/JWS/SignatureBench.php b/performance/JWS/SignatureBench.php index 9545ead0..80af6e33 100644 --- a/performance/JWS/SignatureBench.php +++ b/performance/JWS/SignatureBench.php @@ -2,15 +2,6 @@ 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\Performance\JWS; use Jose\Component\Core\AlgorithmManager; @@ -31,7 +22,9 @@ abstract class SignatureBench { private $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 $signatureAlgorithmsManager; + private $serializerManager; public function init() @@ -68,7 +61,9 @@ public function sign(array $params) $jwsBuilder = new JWSBuilder($this->signatureAlgorithmsManager); $jwsBuilder ->withPayload($this->payload) - ->addSignature($this->getPrivateKey(), ['alg' => $params['algorithm']]) + ->addSignature($this->getPrivateKey(), [ + 'alg' => $params['algorithm'], + ]) ->build() ; } diff --git a/src/Bundle/JoseFramework/Controller/JWKSetController.php b/src/Bundle/JoseFramework/Controller/JWKSetController.php index 93faa6ec..53e6c4ce 100644 --- a/src/Bundle/JoseFramework/Controller/JWKSetController.php +++ b/src/Bundle/JoseFramework/Controller/JWKSetController.php @@ -2,29 +2,15 @@ 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\Bundle\JoseFramework\Controller; use Symfony\Component\HttpFoundation\Response; class JWKSetController { - /** - * @var string - */ - private $jwkset; - - public function __construct(string $jwkset) - { - $this->jwkset = $jwkset; + public function __construct( + private string $jwkset + ) { } public function __invoke(): Response diff --git a/src/Bundle/JoseFramework/Controller/JWKSetControllerFactory.php b/src/Bundle/JoseFramework/Controller/JWKSetControllerFactory.php index 83cf178e..36bff63f 100644 --- a/src/Bundle/JoseFramework/Controller/JWKSetControllerFactory.php +++ b/src/Bundle/JoseFramework/Controller/JWKSetControllerFactory.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Controller; use Jose\Component\Core\JWKSet; diff --git a/src/Bundle/JoseFramework/DataCollector/AlgorithmCollector.php b/src/Bundle/JoseFramework/DataCollector/AlgorithmCollector.php index 72e09129..dc7bb633 100644 --- a/src/Bundle/JoseFramework/DataCollector/AlgorithmCollector.php +++ b/src/Bundle/JoseFramework/DataCollector/AlgorithmCollector.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DataCollector; use function array_key_exists; @@ -27,14 +18,9 @@ final class AlgorithmCollector implements Collector { - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; - - public function __construct(AlgorithmManagerFactory $algorithmManagerFactory) - { - $this->algorithmManagerFactory = $algorithmManagerFactory; + public function __construct( + private AlgorithmManagerFactory $algorithmManagerFactory + ) { } public function collect(array &$data, Request $request, Response $response, ?Throwable $exception = null): void @@ -49,8 +35,14 @@ public function collect(array &$data, Request $request, Response $response, ?Thr $keyEncryptionAlgorithms = 0; $contentEncryptionAlgorithms = 0; foreach ($algorithms as $alias => $algorithm) { - $type = $this->getAlgorithmType($algorithm, $signatureAlgorithms, $macAlgorithms, $keyEncryptionAlgorithms, $contentEncryptionAlgorithms); - if (!array_key_exists($type, $data['algorithm']['algorithms'])) { + $type = $this->getAlgorithmType( + $algorithm, + $signatureAlgorithms, + $macAlgorithms, + $keyEncryptionAlgorithms, + $contentEncryptionAlgorithms + ); + if (! array_key_exists($type, $data['algorithm']['algorithms'])) { $data['algorithm']['algorithms'][$type] = []; } $data['algorithm']['algorithms'][$type][$alias] = [ @@ -66,8 +58,13 @@ public function collect(array &$data, Request $request, Response $response, ?Thr ]; } - private function getAlgorithmType(Algorithm $algorithm, int &$signatureAlgorithms, int &$macAlgorithms, int &$keyEncryptionAlgorithms, int &$contentEncryptionAlgorithms): string - { + private function getAlgorithmType( + Algorithm $algorithm, + int &$signatureAlgorithms, + int &$macAlgorithms, + int &$keyEncryptionAlgorithms, + int &$contentEncryptionAlgorithms + ): string { switch (true) { case $algorithm instanceof SignatureAlgorithm: $signatureAlgorithms++; @@ -198,7 +195,7 @@ private function getAlgorithmMessages(): array 'message' => 'This algorithm is not secured (known attacks). See https://tools.ietf.org/html/draft-irtf-cfrg-webcrypto-algorithms-00#section-5.', ], ]; - if (!function_exists('openssl_pkey_derive')) { + if (! function_exists('openssl_pkey_derive')) { $messages += [ 'ECDH-ES' => [ 'severity' => 'severity-medium', diff --git a/src/Bundle/JoseFramework/DataCollector/CheckerCollector.php b/src/Bundle/JoseFramework/DataCollector/CheckerCollector.php index c4318c50..3d1432f4 100644 --- a/src/Bundle/JoseFramework/DataCollector/CheckerCollector.php +++ b/src/Bundle/JoseFramework/DataCollector/CheckerCollector.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DataCollector; use Jose\Bundle\JoseFramework\Event\ClaimCheckedFailureEvent; @@ -29,50 +20,28 @@ class CheckerCollector implements Collector, EventSubscriberInterface { - /** - * @var null|ClaimCheckerManagerFactory - */ - private $claimCheckerManagerFactory; - - /** - * @var null|HeaderCheckerManagerFactory - */ - private $headerCheckerManagerFactory; - - /** - * @var array - */ - private $headerCheckedSuccesses = []; + private array $headerCheckedSuccesses = []; - /** - * @var array - */ - private $headerCheckedFailures = []; + private array $headerCheckedFailures = []; - /** - * @var array - */ - private $claimCheckedSuccesses = []; + private array $claimCheckedSuccesses = []; - /** - * @var array - */ - private $claimCheckedFailures = []; + private array $claimCheckedFailures = []; /** * @var HeaderCheckerManager[] */ - private $headerCheckerManagers = []; + private array $headerCheckerManagers = []; /** * @var ClaimCheckerManager[] */ - private $claimCheckerManagers = []; + private array $claimCheckerManagers = []; - public function __construct(?ClaimCheckerManagerFactory $claimCheckerManagerFactory = null, ?HeaderCheckerManagerFactory $headerCheckerManagerFactory = null) - { - $this->claimCheckerManagerFactory = $claimCheckerManagerFactory; - $this->headerCheckerManagerFactory = $headerCheckerManagerFactory; + public function __construct( + private ?ClaimCheckerManagerFactory $claimCheckerManagerFactory = null, + private ?HeaderCheckerManagerFactory $headerCheckerManagerFactory = null + ) { } public function collect(array &$data, Request $request, Response $response, ?Throwable $exception = null): void @@ -145,7 +114,7 @@ private function collectHeaderCheckerManagers(array &$data): void private function collectSupportedHeaderCheckers(array &$data): void { $data['checker']['header_checkers'] = []; - if (null !== $this->headerCheckerManagerFactory) { + if ($this->headerCheckerManagerFactory !== null) { $aliases = $this->headerCheckerManagerFactory->all(); foreach ($aliases as $alias => $checker) { $data['checker']['header_checkers'][$alias] = [ @@ -172,7 +141,7 @@ private function collectClaimCheckerManagers(array &$data): void private function collectSupportedClaimCheckers(array &$data): void { $data['checker']['claim_checkers'] = []; - if (null !== $this->claimCheckerManagerFactory) { + if ($this->claimCheckerManagerFactory !== null) { $aliases = $this->claimCheckerManagerFactory->all(); foreach ($aliases as $alias => $checker) { $data['checker']['claim_checkers'][$alias] = [ diff --git a/src/Bundle/JoseFramework/DataCollector/Collector.php b/src/Bundle/JoseFramework/DataCollector/Collector.php index 9b88a8c1..65f6c9ef 100644 --- a/src/Bundle/JoseFramework/DataCollector/Collector.php +++ b/src/Bundle/JoseFramework/DataCollector/Collector.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DataCollector; use Symfony\Component\HttpFoundation\Request; diff --git a/src/Bundle/JoseFramework/DataCollector/JWECollector.php b/src/Bundle/JoseFramework/DataCollector/JWECollector.php index 82b4099e..1330913d 100644 --- a/src/Bundle/JoseFramework/DataCollector/JWECollector.php +++ b/src/Bundle/JoseFramework/DataCollector/JWECollector.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DataCollector; use Jose\Bundle\JoseFramework\Event\JWEBuiltFailureEvent; @@ -30,55 +21,33 @@ class JWECollector implements Collector, EventSubscriberInterface { - /** - * @var null|JWESerializerManagerFactory - */ - private $jweSerializerManagerFactory; - - /** - * @var null|CompressionMethodManagerFactory - */ - private $compressionMethodManagerFactory; - - /** - * @var array - */ - private $jweDecryptionSuccesses = []; + private array $jweDecryptionSuccesses = []; - /** - * @var array - */ - private $jweDecryptionFailures = []; + private array $jweDecryptionFailures = []; - /** - * @var array - */ - private $jweBuiltSuccesses = []; + private array $jweBuiltSuccesses = []; - /** - * @var array - */ - private $jweBuiltFailures = []; + private array $jweBuiltFailures = []; /** * @var JWEBuilder[] */ - private $jweBuilders = []; + private array $jweBuilders = []; /** * @var JWEDecrypter[] */ - private $jweDecrypters = []; + private array $jweDecrypters = []; /** * @var JWELoader[] */ - private $jweLoaders = []; + private array $jweLoaders = []; - public function __construct(?CompressionMethodManagerFactory $compressionMethodManagerFactory = null, ?JWESerializerManagerFactory $jweSerializerManagerFactory = null) - { - $this->compressionMethodManagerFactory = $compressionMethodManagerFactory; - $this->jweSerializerManagerFactory = $jweSerializerManagerFactory; + public function __construct( + private ?CompressionMethodManagerFactory $compressionMethodManagerFactory = null, + private ?JWESerializerManagerFactory $jweSerializerManagerFactory = null + ) { } public function collect(array &$data, Request $request, Response $response, ?Throwable $exception = null): void @@ -143,7 +112,7 @@ public function catchJweBuiltFailure(JWEBuiltFailureEvent $event): void private function collectSupportedCompressionMethods(array &$data): void { $data['jwe']['compression_methods'] = []; - if (null === $this->compressionMethodManagerFactory) { + if ($this->compressionMethodManagerFactory === null) { return; } $compressionMethods = $this->compressionMethodManagerFactory->all(); @@ -155,7 +124,7 @@ private function collectSupportedCompressionMethods(array &$data): void private function collectSupportedJWESerializations(array &$data): void { $data['jwe']['jwe_serialization'] = []; - if (null === $this->jweSerializerManagerFactory) { + if ($this->jweSerializerManagerFactory === null) { return; } $serializers = $this->jweSerializerManagerFactory->all(); @@ -169,9 +138,12 @@ private function collectSupportedJWEBuilders(array &$data): void $data['jwe']['jwe_builders'] = []; foreach ($this->jweBuilders as $id => $jweBuilder) { $data['jwe']['jwe_builders'][$id] = [ - 'key_encryption_algorithms' => $jweBuilder->getAlgorithmManager()->list(), - 'content_encryption_algorithms' => $jweBuilder->getContentEncryptionAlgorithmManager()->list(), - 'compression_methods' => $jweBuilder->getCompressionMethodManager()->list(), + 'key_encryption_algorithms' => $jweBuilder->getKeyEncryptionAlgorithmManager() + ->list(), + 'content_encryption_algorithms' => $jweBuilder->getContentEncryptionAlgorithmManager() + ->list(), + 'compression_methods' => $jweBuilder->getCompressionMethodManager() + ->list(), ]; } } @@ -181,9 +153,12 @@ private function collectSupportedJWEDecrypters(array &$data): void $data['jwe']['jwe_decrypters'] = []; foreach ($this->jweDecrypters as $id => $jweDecrypter) { $data['jwe']['jwe_decrypters'][$id] = [ - 'key_encryption_algorithms' => $jweDecrypter->getKeyEncryptionAlgorithmManager()->list(), - 'content_encryption_algorithms' => $jweDecrypter->getContentEncryptionAlgorithmManager()->list(), - 'compression_methods' => $jweDecrypter->getCompressionMethodManager()->list(), + 'key_encryption_algorithms' => $jweDecrypter->getKeyEncryptionAlgorithmManager() + ->list(), + 'content_encryption_algorithms' => $jweDecrypter->getContentEncryptionAlgorithmManager() + ->list(), + 'compression_methods' => $jweDecrypter->getCompressionMethodManager() + ->list(), ]; } } @@ -193,10 +168,17 @@ private function collectSupportedJWELoaders(array &$data): void $data['jwe']['jwe_loaders'] = []; foreach ($this->jweLoaders as $id => $jweLoader) { $data['jwe']['jwe_loaders'][$id] = [ - 'serializers' => $jweLoader->getSerializerManager()->names(), - 'key_encryption_algorithms' => $jweLoader->getJweDecrypter()->getKeyEncryptionAlgorithmManager()->list(), - 'content_encryption_algorithms' => $jweLoader->getJweDecrypter()->getContentEncryptionAlgorithmManager()->list(), - 'compression_methods' => $jweLoader->getJweDecrypter()->getCompressionMethodManager()->list(), + 'serializers' => $jweLoader->getSerializerManager() + ->names(), + 'key_encryption_algorithms' => $jweLoader->getJweDecrypter() + ->getKeyEncryptionAlgorithmManager() + ->list(), + 'content_encryption_algorithms' => $jweLoader->getJweDecrypter() + ->getContentEncryptionAlgorithmManager() + ->list(), + 'compression_methods' => $jweLoader->getJweDecrypter() + ->getCompressionMethodManager() + ->list(), ]; } } diff --git a/src/Bundle/JoseFramework/DataCollector/JWSCollector.php b/src/Bundle/JoseFramework/DataCollector/JWSCollector.php index 200c54e3..7b58bd5b 100644 --- a/src/Bundle/JoseFramework/DataCollector/JWSCollector.php +++ b/src/Bundle/JoseFramework/DataCollector/JWSCollector.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DataCollector; use Jose\Bundle\JoseFramework\Event\JWSBuiltFailureEvent; @@ -29,49 +20,32 @@ class JWSCollector implements Collector, EventSubscriberInterface { - /** - * @var null|JWSSerializerManagerFactory - */ - private $jwsSerializerManagerFactory; - /** * @var JWSBuilder[] */ - private $jwsBuilders = []; + private array $jwsBuilders = []; /** * @var JWSVerifier[] */ - private $jwsVerifiers = []; + private array $jwsVerifiers = []; /** * @var JWSLoader[] */ - private $jwsLoaders = []; + private array $jwsLoaders = []; - /** - * @var array - */ - private $jwsVerificationSuccesses = []; + private array $jwsVerificationSuccesses = []; - /** - * @var array - */ - private $jwsVerificationFailures = []; + private array $jwsVerificationFailures = []; - /** - * @var array - */ - private $jwsBuiltSuccesses = []; + private array $jwsBuiltSuccesses = []; - /** - * @var array - */ - private $jwsBuiltFailures = []; + private array $jwsBuiltFailures = []; - public function __construct(?JWSSerializerManagerFactory $jwsSerializerManagerFactory = null) - { - $this->jwsSerializerManagerFactory = $jwsSerializerManagerFactory; + public function __construct( + private ?JWSSerializerManagerFactory $jwsSerializerManagerFactory = null + ) { } public function collect(array &$data, Request $request, Response $response, ?Throwable $exception = null): void @@ -135,7 +109,7 @@ public function catchJwsBuiltFailure(JWSBuiltFailureEvent $event): void private function collectSupportedJWSSerializations(array &$data): void { $data['jws']['jws_serialization'] = []; - if (null === $this->jwsSerializerManagerFactory) { + if ($this->jwsSerializerManagerFactory === null) { return; } $serializers = $this->jwsSerializerManagerFactory->all(); @@ -149,7 +123,8 @@ private function collectSupportedJWSBuilders(array &$data): void $data['jws']['jws_builders'] = []; foreach ($this->jwsBuilders as $id => $jwsBuilder) { $data['jws']['jws_builders'][$id] = [ - 'signature_algorithms' => $jwsBuilder->getSignatureAlgorithmManager()->list(), + 'signature_algorithms' => $jwsBuilder->getSignatureAlgorithmManager() + ->list(), ]; } } @@ -159,7 +134,8 @@ private function collectSupportedJWSVerifiers(array &$data): void $data['jws']['jws_verifiers'] = []; foreach ($this->jwsVerifiers as $id => $jwsVerifier) { $data['jws']['jws_verifiers'][$id] = [ - 'signature_algorithms' => $jwsVerifier->getSignatureAlgorithmManager()->list(), + 'signature_algorithms' => $jwsVerifier->getSignatureAlgorithmManager() + ->list(), ]; } } @@ -169,8 +145,11 @@ private function collectSupportedJWSLoaders(array &$data): void $data['jws']['jws_loaders'] = []; foreach ($this->jwsLoaders as $id => $jwsLoader) { $data['jws']['jws_loaders'][$id] = [ - 'serializers' => $jwsLoader->getSerializerManager()->list(), - 'signature_algorithms' => $jwsLoader->getJwsVerifier()->getSignatureAlgorithmManager()->list(), + 'serializers' => $jwsLoader->getSerializerManager() + ->list(), + 'signature_algorithms' => $jwsLoader->getJwsVerifier() + ->getSignatureAlgorithmManager() + ->list(), ]; } } diff --git a/src/Bundle/JoseFramework/DataCollector/JoseCollector.php b/src/Bundle/JoseFramework/DataCollector/JoseCollector.php index 02929fbc..0cf6325b 100644 --- a/src/Bundle/JoseFramework/DataCollector/JoseCollector.php +++ b/src/Bundle/JoseFramework/DataCollector/JoseCollector.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DataCollector; use Symfony\Component\HttpFoundation\Request; @@ -24,7 +15,7 @@ class JoseCollector extends DataCollector /** * @var Collector[] */ - private $collectors = []; + private array $collectors = []; public function collect(Request $request, Response $response, ?Throwable $exception = null): void { @@ -43,10 +34,7 @@ public function getName() return 'jose_collector'; } - /** - * @return array|Data - */ - public function getData() + public function getData(): array|Data { return $this->data; } diff --git a/src/Bundle/JoseFramework/DataCollector/KeyCollector.php b/src/Bundle/JoseFramework/DataCollector/KeyCollector.php index b5f029c2..b10ba199 100644 --- a/src/Bundle/JoseFramework/DataCollector/KeyCollector.php +++ b/src/Bundle/JoseFramework/DataCollector/KeyCollector.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DataCollector; use Jose\Component\Core\JWK; @@ -25,30 +16,20 @@ class KeyCollector implements Collector { - /** - * @var null|KeyAnalyzerManager - */ - private $jwkAnalyzerManager; - - /** - * @var null|KeysetAnalyzerManager - */ - private $jwksetAnalyzerManager; - /** * @var JWK[] */ - private $jwks = []; + private array $jwks = []; /** * @var JWKSet[] */ - private $jwksets = []; + private array $jwksets = []; - public function __construct(?KeyAnalyzerManager $jwkAnalyzerManager = null, ?KeysetAnalyzerManager $jwksetAnalyzerManager = null) - { - $this->jwkAnalyzerManager = $jwkAnalyzerManager; - $this->jwksetAnalyzerManager = $jwksetAnalyzerManager; + public function __construct( + private ?KeyAnalyzerManager $jwkAnalyzerManager = null, + private ?KeysetAnalyzerManager $jwksetAnalyzerManager = null + ) { } public function collect(array &$data, Request $request, Response $response, ?Throwable $exception = null): void @@ -74,7 +55,7 @@ private function collectJWK(array &$data): void foreach ($this->jwks as $id => $jwk) { $data['key']['jwk'][$id] = [ 'jwk' => $cloner->cloneVar($jwk), - 'analyze' => null === $this->jwkAnalyzerManager ? [] : $this->jwkAnalyzerManager->analyze($jwk), + 'analyze' => $this->jwkAnalyzerManager === null ? [] : $this->jwkAnalyzerManager->analyze($jwk), ]; } } @@ -86,12 +67,12 @@ private function collectJWKSet(array &$data): void foreach ($this->jwksets as $id => $jwkset) { $analyze = []; $analyzeJWKSet = new MessageBag(); - if (null !== $this->jwkAnalyzerManager) { + if ($this->jwkAnalyzerManager !== null) { foreach ($jwkset as $kid => $jwk) { $analyze[$kid] = $this->jwkAnalyzerManager->analyze($jwk); } } - if (null !== $this->jwksetAnalyzerManager) { + if ($this->jwksetAnalyzerManager !== null) { $analyzeJWKSet = $this->jwksetAnalyzerManager->analyze($jwkset); } $data['key']['jwkset'][$id] = [ diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/AlgorithmCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/AlgorithmCompilerPass.php index 8dd6f0d4..21f75fa4 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/AlgorithmCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/AlgorithmCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use InvalidArgumentException; @@ -23,12 +14,10 @@ final class AlgorithmCompilerPass implements CompilerPassInterface { /** * {@inheritdoc} - * - * @throws InvalidArgumentException if the algorithm has no alias */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(AlgorithmManagerFactory::class)) { + if (! $container->hasDefinition(AlgorithmManagerFactory::class)) { return; } @@ -37,8 +26,11 @@ public function process(ContainerBuilder $container): void $taggedAlgorithmServices = $container->findTaggedServiceIds('jose.algorithm'); foreach ($taggedAlgorithmServices as $id => $tags) { foreach ($tags as $attributes) { - if (!isset($attributes['alias'])) { - throw new InvalidArgumentException(sprintf('The algorithm "%s" does not have any "alias" attribute.', $id)); + if (! isset($attributes['alias'])) { + throw new InvalidArgumentException(sprintf( + 'The algorithm "%s" does not have any "alias" attribute.', + $id + )); } $definition->addMethodCall('add', [$attributes['alias'], new Reference($id)]); } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/CheckerCollectorCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/CheckerCollectorCompilerPass.php index 8410b9cd..d80f5696 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/CheckerCollectorCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/CheckerCollectorCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use Jose\Bundle\JoseFramework\DataCollector\CheckerCollector; @@ -26,7 +17,7 @@ final class CheckerCollectorCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(CheckerCollector::class)) { + if (! $container->hasDefinition(CheckerCollector::class)) { return; } @@ -41,8 +32,12 @@ public function process(ContainerBuilder $container): void } } - private function collectServices(string $method, string $tag, Definition $definition, ContainerBuilder $container): void - { + private function collectServices( + string $method, + string $tag, + Definition $definition, + ContainerBuilder $container + ): void { $taggedCheckerServices = $container->findTaggedServiceIds($tag); foreach ($taggedCheckerServices as $id => $tags) { $definition->addMethodCall($method, [$id, new Reference($id)]); diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/ClaimCheckerCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/ClaimCheckerCompilerPass.php index d855515c..9717e07e 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/ClaimCheckerCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/ClaimCheckerCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use InvalidArgumentException; @@ -23,12 +14,10 @@ final class ClaimCheckerCompilerPass implements CompilerPassInterface { /** * {@inheritdoc} - * - * @throws InvalidArgumentException if the claim checker has no alias */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(ClaimCheckerManagerFactory::class)) { + if (! $container->hasDefinition(ClaimCheckerManagerFactory::class)) { return; } @@ -37,8 +26,11 @@ public function process(ContainerBuilder $container): void $taggedClaimCheckerServices = $container->findTaggedServiceIds('jose.checker.claim'); foreach ($taggedClaimCheckerServices as $id => $tags) { foreach ($tags as $attributes) { - if (!isset($attributes['alias'])) { - throw new InvalidArgumentException(sprintf('The claim checker "%s" does not have any "alias" attribute.', $id)); + if (! isset($attributes['alias'])) { + throw new InvalidArgumentException(sprintf( + 'The claim checker "%s" does not have any "alias" attribute.', + $id + )); } $definition->addMethodCall('add', [$attributes['alias'], new Reference($id)]); } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/CompressionMethodCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/CompressionMethodCompilerPass.php index e3d0da17..a37987a9 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/CompressionMethodCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/CompressionMethodCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use InvalidArgumentException; @@ -23,12 +14,10 @@ final class CompressionMethodCompilerPass implements CompilerPassInterface { /** * {@inheritdoc} - * - * @throws InvalidArgumentException if the compression method has no alias */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(CompressionMethodManagerFactory::class)) { + if (! $container->hasDefinition(CompressionMethodManagerFactory::class)) { return; } @@ -37,8 +26,11 @@ public function process(ContainerBuilder $container): void $taggedAlgorithmServices = $container->findTaggedServiceIds('jose.compression_method'); foreach ($taggedAlgorithmServices as $id => $tags) { foreach ($tags as $attributes) { - if (!isset($attributes['alias'])) { - throw new InvalidArgumentException(sprintf('The compression method "%s" does not have any "alias" attribute.', $id)); + if (! isset($attributes['alias'])) { + throw new InvalidArgumentException(sprintf( + 'The compression method "%s" does not have any "alias" attribute.', + $id + )); } $definition->addMethodCall('add', [$attributes['alias'], new Reference($id)]); } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/DataCollectorCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/DataCollectorCompilerPass.php index bded7883..aa34e3a6 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/DataCollectorCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/DataCollectorCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use Jose\Bundle\JoseFramework\DataCollector\JoseCollector; @@ -25,7 +16,7 @@ final class DataCollectorCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(JoseCollector::class)) { + if (! $container->hasDefinition(JoseCollector::class)) { return; } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/EncryptionSerializerCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/EncryptionSerializerCompilerPass.php index c899adcf..821f3b05 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/EncryptionSerializerCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/EncryptionSerializerCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use Jose\Component\Encryption\Serializer\JWESerializerManagerFactory; @@ -25,7 +16,7 @@ final class EncryptionSerializerCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(JWESerializerManagerFactory::class)) { + if (! $container->hasDefinition(JWESerializerManagerFactory::class)) { return; } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/EventDispatcherAliasCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/EventDispatcherAliasCompilerPass.php index 853ac892..eb9d61a9 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/EventDispatcherAliasCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/EventDispatcherAliasCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use Psr\EventDispatcher\EventDispatcherInterface; @@ -24,7 +15,7 @@ final class EventDispatcherAliasCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition('event_dispatcher') || $container->hasAlias(EventDispatcherInterface::class)) { + if (! $container->hasDefinition('event_dispatcher') || $container->hasAlias(EventDispatcherInterface::class)) { return; } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/HeaderCheckerCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/HeaderCheckerCompilerPass.php index 0580f3ac..d96884ee 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/HeaderCheckerCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/HeaderCheckerCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use InvalidArgumentException; @@ -27,7 +18,7 @@ final class HeaderCheckerCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(HeaderCheckerManagerFactory::class)) { + if (! $container->hasDefinition(HeaderCheckerManagerFactory::class)) { return; } @@ -36,16 +27,16 @@ public function process(ContainerBuilder $container): void $this->addTokenType($definition, $container); } - /** - * @throws InvalidArgumentException if a header checker is wnongly configured - */ private function addHeaderCheckers(Definition $definition, ContainerBuilder $container): void { $taggedHeaderCheckerServices = $container->findTaggedServiceIds('jose.checker.header'); foreach ($taggedHeaderCheckerServices as $id => $tags) { foreach ($tags as $attributes) { - if (!isset($attributes['alias'])) { - throw new InvalidArgumentException(sprintf('The header checker "%s" does not have any "alias" attribute.', $id)); + if (! isset($attributes['alias'])) { + throw new InvalidArgumentException(sprintf( + 'The header checker "%s" does not have any "alias" attribute.', + $id + )); } $definition->addMethodCall('add', [$attributes['alias'], new Reference($id)]); } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/JWECollectorCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/JWECollectorCompilerPass.php index 53bbcc0a..85d59e4d 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/JWECollectorCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/JWECollectorCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use Jose\Bundle\JoseFramework\DataCollector\JWECollector; @@ -26,7 +17,7 @@ final class JWECollectorCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(JWECollector::class)) { + if (! $container->hasDefinition(JWECollector::class)) { return; } @@ -42,8 +33,12 @@ public function process(ContainerBuilder $container): void } } - private function collectServices(string $method, string $tag, Definition $definition, ContainerBuilder $container): void - { + private function collectServices( + string $method, + string $tag, + Definition $definition, + ContainerBuilder $container + ): void { $taggedJWEServices = $container->findTaggedServiceIds($tag); foreach ($taggedJWEServices as $id => $tags) { $definition->addMethodCall($method, [$id, new Reference($id)]); diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/JWSCollectorCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/JWSCollectorCompilerPass.php index ed05724b..b096cc1e 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/JWSCollectorCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/JWSCollectorCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use Jose\Bundle\JoseFramework\DataCollector\JWSCollector; @@ -26,7 +17,7 @@ final class JWSCollectorCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(JWSCollector::class)) { + if (! $container->hasDefinition(JWSCollector::class)) { return; } @@ -42,8 +33,12 @@ public function process(ContainerBuilder $container): void } } - private function collectServices(string $method, string $tag, Definition $definition, ContainerBuilder $container): void - { + private function collectServices( + string $method, + string $tag, + Definition $definition, + ContainerBuilder $container + ): void { $taggedJWSServices = $container->findTaggedServiceIds($tag); foreach ($taggedJWSServices as $id => $tags) { $definition->addMethodCall($method, [$id, new Reference($id)]); diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeyAnalyzerCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeyAnalyzerCompilerPass.php index 959d5c4e..ffd44574 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeyAnalyzerCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeyAnalyzerCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use Jose\Component\KeyManagement\Analyzer\KeyAnalyzerManager; @@ -25,7 +16,7 @@ final class KeyAnalyzerCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(KeyAnalyzerManager::class)) { + if (! $container->hasDefinition(KeyAnalyzerManager::class)) { return; } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeyCollectorCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeyCollectorCompilerPass.php index d78a5353..393bc547 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeyCollectorCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeyCollectorCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use Jose\Bundle\JoseFramework\DataCollector\KeyCollector; @@ -26,7 +17,7 @@ final class KeyCollectorCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(KeyCollector::class)) { + if (! $container->hasDefinition(KeyCollector::class)) { return; } @@ -41,8 +32,12 @@ public function process(ContainerBuilder $container): void } } - private function collectServices(string $method, string $tag, Definition $definition, ContainerBuilder $container): void - { + private function collectServices( + string $method, + string $tag, + Definition $definition, + ContainerBuilder $container + ): void { $taggedJWSServices = $container->findTaggedServiceIds($tag); foreach ($taggedJWSServices as $id => $tags) { $definition->addMethodCall($method, [$id, new Reference($id)]); diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeySetControllerCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeySetControllerCompilerPass.php index 5cda6076..c924a035 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeySetControllerCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeySetControllerCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use InvalidArgumentException; @@ -22,12 +13,10 @@ final class KeySetControllerCompilerPass implements CompilerPassInterface { /** * {@inheritdoc} - * - * @throws InvalidArgumentException if a controller has no "path" attribute */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(JWKSetLoader::class)) { + if (! $container->hasDefinition(JWKSetLoader::class)) { return; } @@ -36,8 +25,11 @@ public function process(ContainerBuilder $container): void $taggedAlgorithmServices = $container->findTaggedServiceIds('jose.jwk_uri.controller'); foreach ($taggedAlgorithmServices as $id => $tags) { foreach ($tags as $attributes) { - if (!isset($attributes['path'])) { - throw new InvalidArgumentException(sprintf('The controller "%s" does not have any "path" attribute.', $id)); + if (! isset($attributes['path'])) { + throw new InvalidArgumentException(sprintf( + 'The controller "%s" does not have any "path" attribute.', + $id + )); } $definition->addMethodCall('add', [$attributes['path'], $id]); } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeysetAnalyzerCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeysetAnalyzerCompilerPass.php index 2095f7e0..2ca43d6f 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeysetAnalyzerCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/KeysetAnalyzerCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use Jose\Component\KeyManagement\Analyzer\KeysetAnalyzerManager; @@ -25,7 +16,7 @@ final class KeysetAnalyzerCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(KeysetAnalyzerManager::class)) { + if (! $container->hasDefinition(KeysetAnalyzerManager::class)) { return; } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/SignatureSerializerCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/SignatureSerializerCompilerPass.php index 7f6fc88f..4f72ecdf 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/SignatureSerializerCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/SignatureSerializerCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use Jose\Component\Signature\Serializer\JWSSerializerManagerFactory; @@ -25,7 +16,7 @@ final class SignatureSerializerCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!$container->hasDefinition(JWSSerializerManagerFactory::class)) { + if (! $container->hasDefinition(JWSSerializerManagerFactory::class)) { return; } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Compiler/SymfonySerializerCompilerPass.php b/src/Bundle/JoseFramework/DependencyInjection/Compiler/SymfonySerializerCompilerPass.php index 042aa771..afb66f02 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Compiler/SymfonySerializerCompilerPass.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Compiler/SymfonySerializerCompilerPass.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Compiler; use Jose\Bundle\JoseFramework\Normalizer\JWENormalizer; @@ -29,7 +20,7 @@ class SymfonySerializerCompilerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container): void { - if (!class_exists('Symfony\Component\Serializer\Serializer')) { + if (! class_exists('Symfony\Component\Serializer\Serializer')) { return; } if ($container->hasDefinition(JWSSerializerManagerFactory::class)) { diff --git a/src/Bundle/JoseFramework/DependencyInjection/Configuration.php b/src/Bundle/JoseFramework/DependencyInjection/Configuration.php index ec83e4de..6a994a83 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Configuration.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Configuration.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -19,23 +10,13 @@ final class Configuration implements ConfigurationInterface { - /** - * @var Source[] - */ - private $sources; - - /** - * @var string - */ - private $alias; - /** * @param Source[] $sources */ - public function __construct(string $alias, array $sources) - { - $this->alias = $alias; - $this->sources = $sources; + public function __construct( + private string $alias, + private array $sources + ) { } public function getConfigTreeBuilder(): TreeBuilder diff --git a/src/Bundle/JoseFramework/DependencyInjection/JoseFrameworkExtension.php b/src/Bundle/JoseFramework/DependencyInjection/JoseFrameworkExtension.php index 9f5a2e82..b26603cd 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/JoseFrameworkExtension.php +++ b/src/Bundle/JoseFramework/DependencyInjection/JoseFrameworkExtension.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection; use function count; @@ -22,23 +13,13 @@ final class JoseFrameworkExtension extends Extension implements PrependExtensionInterface { - /** - * @var string - */ - private $alias; - - /** - * @var Source[] - */ - private $sources = []; - /** * @param Source[] $sources */ - public function __construct(string $alias, array $sources) - { - $this->alias = $alias; - $this->sources = $sources; + public function __construct( + private string $alias, + private array $sources + ) { } public function getAlias(): string @@ -77,7 +58,7 @@ public function prepend(ContainerBuilder $container): void foreach ($this->sources as $source) { $result = $source->prepend($container, $config); - if (0 !== count($result)) { + if (count($result) !== 0) { $container->prependExtensionConfig($this->getAlias(), $result); } } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/AbstractSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/AbstractSource.php index 1677b228..ba1ed6f3 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/AbstractSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/AbstractSource.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source; use Symfony\Component\Config\Definition\Builder\NodeDefinition; @@ -28,7 +19,7 @@ public function create(ContainerBuilder $container, string $type, string $name, $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, $definition->getClass(), $name.' '.$type); + $container->registerAliasForArgument($service_id, $definition->getClass(), $name . ' ' . $type); } public function addConfiguration(NodeDefinition $node): void @@ -44,7 +35,8 @@ public function addConfiguration(NodeDefinition $node): void ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/CheckerSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/CheckerSource.php index 0d16e542..985d3a7b 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/CheckerSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/CheckerSource.php @@ -2,20 +2,12 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Checker; use function array_key_exists; use function count; -use Jose\Bundle\JoseFramework\DependencyInjection\Compiler; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\ClaimCheckerCompilerPass; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\HeaderCheckerCompilerPass; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; use Jose\Bundle\JoseFramework\DependencyInjection\Source\SourceWithCompilerPasses; use Jose\Component\Checker\ClaimCheckerManagerFactory; @@ -32,17 +24,11 @@ class CheckerSource implements SourceWithCompilerPasses /** * @var Source[] */ - private $sources; + private array $sources; - /** - * CheckerSource constructor. - */ public function __construct() { - $this->sources = [ - new ClaimChecker(), - new HeaderChecker(), - ]; + $this->sources = [new ClaimChecker(), new HeaderChecker()]; } public function name(): string @@ -52,11 +38,11 @@ public function name(): string public function load(array $configs, ContainerBuilder $container): void { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return; } $container->registerForAutoconfiguration(TokenTypeSupport::class)->addTag('jose.checker.token_type'); - $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config')); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../../../Resources/config')); $loader->load('checkers.php'); if (array_key_exists('checkers', $configs)) { @@ -68,7 +54,7 @@ public function load(array $configs, ContainerBuilder $container): void public function getNodeDefinition(NodeDefinition $node): void { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return; } $childNode = $node @@ -86,13 +72,13 @@ public function getNodeDefinition(NodeDefinition $node): void public function prepend(ContainerBuilder $container, array $config): array { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return []; } $result = []; foreach ($this->sources as $source) { $prepend = $source->prepend($container, $config); - if (0 !== count($prepend)) { + if (count($prepend) !== 0) { $result[$source->name()] = $prepend; } } @@ -105,10 +91,7 @@ public function prepend(ContainerBuilder $container, array $config): array */ public function getCompilerPasses(): array { - return [ - new Compiler\ClaimCheckerCompilerPass(), - new Compiler\HeaderCheckerCompilerPass(), - ]; + return [new ClaimCheckerCompilerPass(), new HeaderCheckerCompilerPass()]; } private function isEnabled(): bool diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/ClaimChecker.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/ClaimChecker.php index 12a2e853..600048ea 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/ClaimChecker.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/ClaimChecker.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Checker; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -35,9 +26,7 @@ public function load(array $configs, ContainerBuilder $container): void $definition = new Definition(ClaimCheckerManager::class); $definition ->setFactory([new Reference(ClaimCheckerManagerFactory::class), 'create']) - ->setArguments([ - $itemConfig['claims'], - ]) + ->setArguments([$itemConfig['claims']]) ->addTag('jose.claim_checker_manager') ->setPublic($itemConfig['is_public']) ; @@ -45,7 +34,11 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, ClaimCheckerManager::class, $name.'ClaimCheckerManager'); + $container->registerAliasForArgument( + $service_id, + ClaimCheckerManager::class, + $name . 'ClaimCheckerManager' + ); } } @@ -67,7 +60,8 @@ public function getNodeDefinition(NodeDefinition $node): void ->info('A list of claim aliases to be set in the claim checker.') ->useAttributeAsKey('name') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('tags') ->info('A list of tags to be associated to the claim checker.') diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/HeaderChecker.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/HeaderChecker.php index bf61b0cf..3e1e7c83 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/HeaderChecker.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Checker/HeaderChecker.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Checker; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -35,9 +26,7 @@ public function load(array $configs, ContainerBuilder $container): void $definition = new Definition(HeaderCheckerManager::class); $definition ->setFactory([new Reference(HeaderCheckerManagerFactory::class), 'create']) - ->setArguments([ - $itemConfig['headers'], - ]) + ->setArguments([$itemConfig['headers']]) ->addTag('jose.header_checker_manager') ->setPublic($itemConfig['is_public']) ; @@ -45,7 +34,11 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, HeaderCheckerManager::class, $name.'HeaderCheckerManager'); + $container->registerAliasForArgument( + $service_id, + HeaderCheckerManager::class, + $name . 'HeaderCheckerManager' + ); } } @@ -67,7 +60,8 @@ public function getNodeDefinition(NodeDefinition $node): void ->info('A list of header aliases to be set in the claim checker.') ->useAttributeAsKey('name') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('tags') ->info('A list of tags to be associated to the claim checker.') diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Console/ConsoleSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Console/ConsoleSource.php index 0cf2bb29..a3f0ecba 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Console/ConsoleSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Console/ConsoleSource.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Console; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -29,10 +20,10 @@ public function name(): string public function load(array $configs, ContainerBuilder $container): void { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return; } - $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config')); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../../../Resources/config')); $loader->load('commands.php'); } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Core/CoreSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Core/CoreSource.php index ddc2e6a1..c1705e8c 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Core/CoreSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Core/CoreSource.php @@ -2,19 +2,15 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Core; use Jose\Bundle\JoseFramework\DataCollector\Collector; -use Jose\Bundle\JoseFramework\DependencyInjection\Compiler; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\AlgorithmCompilerPass; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\CheckerCollectorCompilerPass; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\DataCollectorCompilerPass; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\JWECollectorCompilerPass; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\JWSCollectorCompilerPass; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\KeyCollectorCompilerPass; use Jose\Bundle\JoseFramework\DependencyInjection\Source\SourceWithCompilerPasses; use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\Config\FileLocator; @@ -32,14 +28,14 @@ public function name(): string public function load(array $config, ContainerBuilder $container): void { - $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config')); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../../../Resources/config')); $loader->load('services.php'); if (interface_exists(EnvVarProcessorInterface::class)) { $loader->load('env_var.php'); } - if (true === $container->getParameter('kernel.debug')) { + if ($container->getParameter('kernel.debug') === true) { $container->registerForAutoconfiguration(Collector::class)->addTag('jose.data_collector'); $loader->load('dev_services.php'); } @@ -60,12 +56,12 @@ public function prepend(ContainerBuilder $container, array $config): array public function getCompilerPasses(): array { return [ - new Compiler\AlgorithmCompilerPass(), - new Compiler\DataCollectorCompilerPass(), - new Compiler\CheckerCollectorCompilerPass(), - new Compiler\KeyCollectorCompilerPass(), - new Compiler\JWSCollectorCompilerPass(), - new Compiler\JWECollectorCompilerPass(), + new AlgorithmCompilerPass(), + new DataCollectorCompilerPass(), + new CheckerCollectorCompilerPass(), + new KeyCollectorCompilerPass(), + new JWSCollectorCompilerPass(), + new JWECollectorCompilerPass(), ]; } } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/AbstractEncryptionSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/AbstractEncryptionSource.php index 04ce5546..c31363e8 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/AbstractEncryptionSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/AbstractEncryptionSource.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Encryption; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -36,27 +27,31 @@ public function getNodeDefinition(NodeDefinition $node): void ->useAttributeAsKey('name') ->isRequired() ->requiresAtLeastOneElement() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('content_encryption_algorithms') ->info('A list of supported content encryption algorithms.') ->useAttributeAsKey('name') ->isRequired() ->requiresAtLeastOneElement() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('compression_methods') ->info('A list of supported compression methods.') ->useAttributeAsKey('name') ->defaultValue(['DEF']) - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('tags') ->info('A list of tags to be associated to the service.') ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ->end() diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/EncryptionSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/EncryptionSource.php index 7c5ab34e..0067e7ab 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/EncryptionSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/EncryptionSource.php @@ -2,21 +2,13 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Encryption; use function array_key_exists; use function count; use function in_array; -use Jose\Bundle\JoseFramework\DependencyInjection\Compiler; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\CompressionMethodCompilerPass; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\EncryptionSerializerCompilerPass; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; use Jose\Bundle\JoseFramework\DependencyInjection\Source\SourceWithCompilerPasses; use Jose\Component\Encryption\Algorithm\ContentEncryption\AESCBCHS; @@ -43,19 +35,11 @@ class EncryptionSource implements SourceWithCompilerPasses /** * @var Source[] */ - private $sources; + private array $sources; - /** - * EncryptionSource constructor. - */ public function __construct() { - $this->sources = [ - new JWEBuilder(), - new JWEDecrypter(), - new JWESerializer(), - new JWELoader(), - ]; + $this->sources = [new JWEBuilder(), new JWEDecrypter(), new JWESerializer(), new JWELoader()]; } public function name(): string @@ -65,16 +49,16 @@ public function name(): string public function load(array $configs, ContainerBuilder $container): void { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return; } $container->registerForAutoconfiguration(JWESerializerAlias::class)->addTag('jose.jwe.serializer'); - $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config')); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../../../Resources/config')); $loader->load('jwe_services.php'); $loader->load('jwe_serializers.php'); $loader->load('compression_methods.php'); - $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config/Algorithms/')); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../../../Resources/config/Algorithms/')); foreach ($this->getAlgorithmsFiles() as $class => $file) { if (class_exists($class)) { $loader->load($file); @@ -90,7 +74,7 @@ public function load(array $configs, ContainerBuilder $container): void public function getNodeDefinition(NodeDefinition $node): void { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return; } $childNode = $node->children() @@ -107,13 +91,13 @@ public function getNodeDefinition(NodeDefinition $node): void public function prepend(ContainerBuilder $container, array $config): array { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return []; } $result = []; foreach ($this->sources as $source) { $prepend = $source->prepend($container, $config); - if (0 !== count($prepend)) { + if (count($prepend) !== 0) { $result[$source->name()] = $prepend; } } @@ -126,10 +110,7 @@ public function prepend(ContainerBuilder $container, array $config): array */ public function getCompilerPasses(): array { - return [ - new Compiler\EncryptionSerializerCompilerPass(), - new Compiler\CompressionMethodCompilerPass(), - ]; + return [new EncryptionSerializerCompilerPass(), new CompressionMethodCompilerPass()]; } private function getAlgorithmsFiles(): array diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWEBuilder.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWEBuilder.php index df195bb4..4c0070ae 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWEBuilder.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWEBuilder.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Encryption; use Jose\Bundle\JoseFramework\Services\JWEBuilderFactory; @@ -45,7 +36,7 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, JWEBuilderService::class, $name.'JweBuilder'); + $container->registerAliasForArgument($service_id, JWEBuilderService::class, $name . 'JweBuilder'); } } } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWEDecrypter.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWEDecrypter.php index cca733c6..9b285e2d 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWEDecrypter.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWEDecrypter.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Encryption; use Jose\Bundle\JoseFramework\Services\JWEDecrypterFactory; @@ -45,7 +36,7 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, JWEDecrypterService::class, $name.'JweDecrypter'); + $container->registerAliasForArgument($service_id, JWEDecrypterService::class, $name . 'JweDecrypter'); } } } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWELoader.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWELoader.php index 4317b0bf..076acef4 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWELoader.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWELoader.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Encryption; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -50,7 +41,7 @@ public function load(array $configs, ContainerBuilder $container): void } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, JWELoaderService::class, $name.'JweLoader'); + $container->registerAliasForArgument($service_id, JWELoaderService::class, $name . 'JweLoader'); } } @@ -71,39 +62,45 @@ public function getNodeDefinition(NodeDefinition $node): void ->info('A list of key encryption algorithm aliases.') ->useAttributeAsKey('name') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('content_encryption_algorithms') ->info('A list of key encryption algorithm aliases.') ->useAttributeAsKey('name') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('compression_methods') ->info('A list of compression method aliases.') ->useAttributeAsKey('name') ->defaultValue(['DEF']) - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('serializers') ->info('A list of signature serializer aliases.') ->useAttributeAsKey('name') ->requiresAtLeastOneElement() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('header_checkers') ->info('A list of header checker aliases.') ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('tags') ->info('A list of tags to be associated to the service.') ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ->end() diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWESerializer.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWESerializer.php index 168b883a..729193f9 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWESerializer.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Encryption/JWESerializer.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Encryption; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -43,7 +34,7 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, JWESerializerManager::class, $name.'JweSerializer'); + $container->registerAliasForArgument($service_id, JWESerializerManager::class, $name . 'JweSerializer'); } } @@ -63,7 +54,8 @@ public function getNodeDefinition(NodeDefinition $node): void ->arrayNode('serializers') ->info('A list of JWE serializers aliases.') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->treatNullLike([]) ->treatFalseLike([]) ->requiresAtLeastOneElement() @@ -73,7 +65,8 @@ public function getNodeDefinition(NodeDefinition $node): void ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ->end() diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JKUSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JKUSource.php index ff659dcd..d131c8f8 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JKUSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JKUSource.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -29,8 +20,8 @@ public function name(): string public function load(array $configs, ContainerBuilder $container): void { - if (true === $configs[$this->name()]['enabled']) { - $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config')); + if ($configs[$this->name()]['enabled'] === true) { + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../../../Resources/config')); $loader->load('jku_source.php'); if (class_exists(JKULoaderCommand::class)) { $loader->load('jku_commands.php'); diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource.php index 8899392a..e5c16263 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement; use function array_key_exists; @@ -29,16 +20,13 @@ class JWKSetSource implements Source /** * @var JWKSetSourceInterface[] */ - private $jwkset_sources; + private ?array $jwkset_sources = null; public function name(): string { return 'key_sets'; } - /** - * @throws LogicException if the definition is not configured - */ public function load(array $configs, ContainerBuilder $container): void { $sources = $this->getJWKSetSources(); @@ -65,14 +53,16 @@ public function getNodeDefinition(NodeDefinition $node): void ->arrayPrototype() ->validate() ->ifTrue(function ($config): bool { - return 1 !== count($config); + return count($config) !== 1; }) ->thenInvalid('One key set type must be set.') ->end() ->children() ; foreach ($this->getJWKSetSources() as $name => $source) { - $sourceNode = $sourceNodeBuilder->arrayNode($name)->canBeUnset(); + $sourceNode = $sourceNodeBuilder->arrayNode($name) + ->canBeUnset() + ; $source->addConfiguration($sourceNode); } } @@ -83,20 +73,18 @@ public function prepend(ContainerBuilder $container, array $config): array } /** - * @throws InvalidArgumentException if the source object is not valid - * * @return JWKSetSourceInterface[] */ private function getJWKSetSources(): array { - if (null !== $this->jwkset_sources) { + if ($this->jwkset_sources !== null) { return $this->jwkset_sources; } // load bundled adapter factories $tempContainer = new ContainerBuilder(); $tempContainer->registerForAutoconfiguration(JWKSetSourceInterface::class)->addTag('jose.jwkset_source'); - $loader = new PhpFileLoader($tempContainer, new FileLocator(__DIR__.'/../../../Resources/config')); + $loader = new PhpFileLoader($tempContainer, new FileLocator(__DIR__ . '/../../../Resources/config')); $loader->load('jwkset_sources.php'); $tempContainer->compile(); @@ -104,7 +92,7 @@ private function getJWKSetSources(): array $jwkset_sources = []; foreach (array_keys($services) as $id) { $factory = $tempContainer->get($id); - if (!$factory instanceof JWKSetSourceInterface) { + if (! $factory instanceof JWKSetSourceInterface) { throw new InvalidArgumentException('Invalid object'); } $jwkset_sources[str_replace('-', '_', $factory->getKeySet())] = $factory; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JKU.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JKU.php index 23eb665f..298e1c59 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JKU.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JKU.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSetSource; use Jose\Bundle\JoseFramework\DependencyInjection\Source\AbstractSource; @@ -26,14 +17,8 @@ class JKU extends AbstractSource implements JWKSetSource public function createDefinition(ContainerBuilder $container, array $config): Definition { $definition = new Definition(JWKSet::class); - $definition->setFactory([ - new Reference(JKUFactory::class), - 'loadFromUrl', - ]); - $definition->setArguments([ - $config['url'], - $config['headers'], - ]); + $definition->setFactory([new Reference(JKUFactory::class), 'loadFromUrl']); + $definition->setArguments([$config['url'], $config['headers']]); $definition->addTag('jose.jwkset'); return $definition; @@ -58,7 +43,8 @@ public function addConfiguration(NodeDefinition $node): void ->treatFalseLike([]) ->info('Header key/value pairs added to the request.') ->useAttributeAsKey('name') - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JWKSet.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JWKSet.php index 6cf5aca9..dcc144bd 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JWKSet.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JWKSet.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSetSource; use Jose\Bundle\JoseFramework\DependencyInjection\Source\AbstractSource; @@ -26,13 +17,8 @@ class JWKSet extends AbstractSource implements JWKSetSource public function createDefinition(ContainerBuilder $container, array $config): Definition { $definition = new Definition(JWKSetAlias::class); - $definition->setFactory([ - new Reference(JWKFactory::class), - 'createFromJsonObject', - ]); - $definition->setArguments([ - $config['value'], - ]); + $definition->setFactory([new Reference(JWKFactory::class), 'createFromJsonObject']); + $definition->setArguments([$config['value']]); $definition->addTag('jose.jwkset'); return $definition; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JWKSetSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JWKSetSource.php index 49f73225..e00afaed 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JWKSetSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/JWKSetSource.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSetSource; use Symfony\Component\Config\Definition\Builder\NodeDefinition; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/X5U.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/X5U.php index 12618e24..420fdff7 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/X5U.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSetSource/X5U.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSetSource; use Jose\Bundle\JoseFramework\DependencyInjection\Source\AbstractSource; @@ -26,14 +17,8 @@ class X5U extends AbstractSource implements JWKSetSource public function createDefinition(ContainerBuilder $container, array $config): Definition { $definition = new Definition(JWKSet::class); - $definition->setFactory([ - new Reference(X5UFactory::class), - 'loadFromUrl', - ]); - $definition->setArguments([ - $config['url'], - $config['headers'], - ]); + $definition->setFactory([new Reference(X5UFactory::class), 'loadFromUrl']); + $definition->setArguments([$config['url'], $config['headers']]); $definition->addTag('jose.jwkset'); return $definition; @@ -58,7 +43,8 @@ public function addConfiguration(NodeDefinition $node): void ->treatFalseLike([]) ->info('Header key/value pairs added to the request.') ->useAttributeAsKey('name') - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource.php index ee38d2ec..217d283c 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement; use function array_key_exists; @@ -27,18 +18,15 @@ class JWKSource implements Source { /** - * @var null|JWKSourceInterface[] + * @var JWKSourceInterface[]|null */ - private $jwkSources; + private ?array $jwkSources = null; public function name(): string { return 'keys'; } - /** - * @throws LogicException if the definition is not configured - */ public function load(array $configs, ContainerBuilder $container): void { $sources = $this->getJWKSources(); @@ -65,14 +53,16 @@ public function getNodeDefinition(NodeDefinition $node): void ->arrayPrototype() ->validate() ->ifTrue(function ($config): bool { - return 1 !== count($config); + return count($config) !== 1; }) ->thenInvalid('One key type must be set.') ->end() ->children() ; foreach ($this->getJWKSources() as $name => $source) { - $sourceNode = $sourceNodeBuilder->arrayNode($name)->canBeUnset(); + $sourceNode = $sourceNodeBuilder->arrayNode($name) + ->canBeUnset() + ; $source->addConfiguration($sourceNode); } } @@ -83,20 +73,18 @@ public function prepend(ContainerBuilder $container, array $config): array } /** - * @throws InvalidArgumentException if the source object is invalid - * * @return JWKSourceInterface[] */ private function getJWKSources(): array { - if (null !== $this->jwkSources) { + if ($this->jwkSources !== null) { return $this->jwkSources; } // load bundled adapter factories $tempContainer = new ContainerBuilder(); $tempContainer->registerForAutoconfiguration(JWKSourceInterface::class)->addTag('jose.jwk_source'); - $loader = new PhpFileLoader($tempContainer, new FileLocator(__DIR__.'/../../../Resources/config')); + $loader = new PhpFileLoader($tempContainer, new FileLocator(__DIR__ . '/../../../Resources/config')); $loader->load('jwk_sources.php'); $tempContainer->compile(); @@ -104,7 +92,7 @@ private function getJWKSources(): array $jwkSources = []; foreach (array_keys($services) as $id) { $factory = $tempContainer->get($id); - if (!$factory instanceof JWKSourceInterface) { + if (! $factory instanceof JWKSourceInterface) { throw new InvalidArgumentException('Invalid object'); } $jwkSources[str_replace('-', '_', $factory->getKey())] = $factory; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/CertificateFile.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/CertificateFile.php index f449b824..ec455710 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/CertificateFile.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/CertificateFile.php @@ -2,18 +2,10 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource; use Jose\Bundle\JoseFramework\DependencyInjection\Source\AbstractSource; +use Jose\Component\Core\JWK; use Jose\Component\KeyManagement\JWKFactory; use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -24,15 +16,9 @@ class CertificateFile extends AbstractSource implements JWKSource { public function createDefinition(ContainerBuilder $container, array $config): Definition { - $definition = new Definition(\Jose\Component\Core\JWK::class); - $definition->setFactory([ - new Reference(JWKFactory::class), - 'createFromCertificateFile', - ]); - $definition->setArguments([ - $config['path'], - $config['additional_values'], - ]); + $definition = new Definition(JWK::class); + $definition->setFactory([new Reference(JWKFactory::class), 'createFromCertificateFile']); + $definition->setArguments([$config['path'], $config['additional_values']]); $definition->addTag('jose.jwk'); return $definition; @@ -56,7 +42,8 @@ public function addConfiguration(NodeDefinition $node): void ->info('Additional values to be added to the key.') ->defaultValue([]) ->useAttributeAsKey('key') - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWK.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWK.php index 811d6522..46de3fa4 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWK.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWK.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource; use Jose\Bundle\JoseFramework\DependencyInjection\Source\AbstractSource; @@ -25,13 +16,8 @@ class JWK extends AbstractSource implements JWKSource public function createDefinition(ContainerBuilder $container, array $config): Definition { $definition = new Definition(\Jose\Component\Core\JWK::class); - $definition->setFactory([ - new Reference(JWKFactory::class), - 'createFromJsonObject', - ]); - $definition->setArguments([ - $config['value'], - ]); + $definition->setFactory([new Reference(JWKFactory::class), 'createFromJsonObject']); + $definition->setArguments([$config['value']]); $definition->addTag('jose.jwk'); return $definition; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWKSet.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWKSet.php index 6db42129..cafb822c 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWKSet.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWKSet.php @@ -2,18 +2,10 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource; use Jose\Bundle\JoseFramework\DependencyInjection\Source\AbstractSource; +use Jose\Component\Core\JWK; use Jose\Component\KeyManagement\JWKFactory; use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -24,11 +16,8 @@ class JWKSet extends AbstractSource implements JWKSource { public function createDefinition(ContainerBuilder $container, array $config): Definition { - $definition = new Definition(\Jose\Component\Core\JWK::class); - $definition->setFactory([ - new Reference(JWKFactory::class), - 'createFromKeySet', - ]); + $definition = new Definition(JWK::class); + $definition->setFactory([new Reference(JWKFactory::class), 'createFromKeySet']); $definition->setArguments([new Reference($config['key_set']), $config['index']]); $definition->addTag('jose.jwk'); @@ -47,7 +36,8 @@ public function addConfiguration(NodeDefinition $node): void ->children() ->scalarNode('key_set') ->info('The key set service.') - ->isRequired()->end() + ->isRequired() + ->end() ->integerNode('index') ->info('The index of the key in the key set.') ->isRequired() diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWKSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWKSource.php index b4aebf83..5f47dfc3 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWKSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/JWKSource.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource; use Symfony\Component\Config\Definition\Builder\NodeDefinition; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/KeyFile.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/KeyFile.php index 6aa2d60d..d39d50ed 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/KeyFile.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/KeyFile.php @@ -2,18 +2,10 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource; use Jose\Bundle\JoseFramework\DependencyInjection\Source\AbstractSource; +use Jose\Component\Core\JWK; use Jose\Component\KeyManagement\JWKFactory; use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -24,16 +16,9 @@ class KeyFile extends AbstractSource implements JWKSource { public function createDefinition(ContainerBuilder $container, array $config): Definition { - $definition = new Definition(\Jose\Component\Core\JWK::class); - $definition->setFactory([ - new Reference(JWKFactory::class), - 'createFromKeyFile', - ]); - $definition->setArguments([ - $config['path'], - $config['password'], - $config['additional_values'], - ]); + $definition = new Definition(JWK::class); + $definition->setFactory([new Reference(JWKFactory::class), 'createFromKeyFile']); + $definition->setArguments([$config['path'], $config['password'], $config['additional_values']]); $definition->addTag('jose.jwk'); return $definition; @@ -61,7 +46,8 @@ public function addConfiguration(NodeDefinition $node): void ->info('Additional values to be added to the key.') ->defaultValue([]) ->useAttributeAsKey('key') - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/P12.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/P12.php index 5f0ee8f5..0341e059 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/P12.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/P12.php @@ -2,18 +2,10 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource; use Jose\Bundle\JoseFramework\DependencyInjection\Source\AbstractSource; +use Jose\Component\Core\JWK; use Jose\Component\KeyManagement\JWKFactory; use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -24,16 +16,9 @@ class P12 extends AbstractSource implements JWKSource { public function createDefinition(ContainerBuilder $container, array $config): Definition { - $definition = new Definition(\Jose\Component\Core\JWK::class); - $definition->setFactory([ - new Reference(JWKFactory::class), - 'createFromPKCS12CertificateFile', - ]); - $definition->setArguments([ - $config['path'], - $config['password'], - $config['additional_values'], - ]); + $definition = new Definition(JWK::class); + $definition->setFactory([new Reference(JWKFactory::class), 'createFromPKCS12CertificateFile']); + $definition->setArguments([$config['path'], $config['password'], $config['additional_values']]); $definition->addTag('jose.jwk'); return $definition; @@ -61,7 +46,8 @@ public function addConfiguration(NodeDefinition $node): void ->info('Additional values to be added to the key.') ->defaultValue([]) ->useAttributeAsKey('key') - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/Secret.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/Secret.php index b295c0e4..8ee0a746 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/Secret.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/Secret.php @@ -2,18 +2,10 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource; use Jose\Bundle\JoseFramework\DependencyInjection\Source\AbstractSource; +use Jose\Component\Core\JWK; use Jose\Component\KeyManagement\JWKFactory; use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -24,15 +16,9 @@ class Secret extends AbstractSource implements JWKSource { public function createDefinition(ContainerBuilder $container, array $config): Definition { - $definition = new Definition(\Jose\Component\Core\JWK::class); - $definition->setFactory([ - new Reference(JWKFactory::class), - 'createFromSecret', - ]); - $definition->setArguments([ - $config['secret'], - $config['additional_values'], - ]); + $definition = new Definition(JWK::class); + $definition->setFactory([new Reference(JWKFactory::class), 'createFromSecret']); + $definition->setArguments([$config['secret'], $config['additional_values']]); $definition->addTag('jose.jwk'); return $definition; @@ -56,7 +42,8 @@ public function addConfiguration(NodeDefinition $node): void ->info('Additional values to be added to the key.') ->defaultValue([]) ->useAttributeAsKey('key') - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/Values.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/Values.php index e4e19ba7..c21395cb 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/Values.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/Values.php @@ -2,18 +2,10 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource; use Jose\Bundle\JoseFramework\DependencyInjection\Source\AbstractSource; +use Jose\Component\Core\JWK; use Jose\Component\KeyManagement\JWKFactory; use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -24,14 +16,9 @@ class Values extends AbstractSource implements JWKSource { public function createDefinition(ContainerBuilder $container, array $config): Definition { - $definition = new Definition(\Jose\Component\Core\JWK::class); - $definition->setFactory([ - new Reference(JWKFactory::class), - 'createFromValues', - ]); - $definition->setArguments([ - $config['values'], - ]); + $definition = new Definition(JWK::class); + $definition->setFactory([new Reference(JWKFactory::class), 'createFromValues']); + $definition->setArguments([$config['values']]); $definition->addTag('jose.jwk'); return $definition; @@ -51,7 +38,8 @@ public function addConfiguration(NodeDefinition $node): void ->info('Values of the key.') ->isRequired() ->useAttributeAsKey('key') - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/X5C.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/X5C.php index 7ec0235d..4ff9ea23 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/X5C.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKSource/X5C.php @@ -2,18 +2,10 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource; use Jose\Bundle\JoseFramework\DependencyInjection\Source\AbstractSource; +use Jose\Component\Core\JWK; use Jose\Component\KeyManagement\JWKFactory; use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -24,15 +16,9 @@ class X5C extends AbstractSource implements JWKSource { public function createDefinition(ContainerBuilder $container, array $config): Definition { - $definition = new Definition(\Jose\Component\Core\JWK::class); - $definition->setFactory([ - new Reference(JWKFactory::class), - 'createFromCertificate', - ]); - $definition->setArguments([ - $config['value'], - $config['additional_values'], - ]); + $definition = new Definition(JWK::class); + $definition->setFactory([new Reference(JWKFactory::class), 'createFromCertificate']); + $definition->setArguments([$config['value'], $config['additional_values']]); $definition->addTag('jose.jwk'); return $definition; @@ -56,7 +42,8 @@ public function addConfiguration(NodeDefinition $node): void ->info('Additional values to be added to the key.') ->defaultValue([]) ->useAttributeAsKey('key') - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKUriSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKUriSource.php index d98ec16f..1ea605e2 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKUriSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/JWKUriSource.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement; use Jose\Bundle\JoseFramework\Controller\JWKSetController; @@ -35,18 +26,16 @@ public function load(array $configs, ContainerBuilder $container): void $definition = new Definition(JWKSetController::class); $definition->setFactory([new Reference(JWKSetControllerFactory::class), 'create']); $definition->setArguments([new Reference($itemConfig['id'])]); - $definition->addTag('jose.jwk_uri.controller', ['path' => $itemConfig['path']]); + $definition->addTag('jose.jwk_uri.controller', [ + 'path' => $itemConfig['path'], + ]); $definition->addTag('controller.service_arguments'); $definition->setPublic($itemConfig['is_public']); foreach ($itemConfig['tags'] as $id => $attributes) { $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument( - $service_id, - JWKSetController::class, - $name.'JwkSetController' - ); + $container->registerAliasForArgument($service_id, JWKSetController::class, $name . 'JwkSetController'); } } @@ -72,7 +61,8 @@ public function getNodeDefinition(NodeDefinition $node): void ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->booleanNode('is_public') ->info('If true, the service will be public, else private.') diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/KeyManagementSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/KeyManagementSource.php index 5c295954..a36a3b00 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/KeyManagementSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/KeyManagement/KeyManagementSource.php @@ -2,19 +2,12 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement; use function count; -use Jose\Bundle\JoseFramework\DependencyInjection\Compiler; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\KeyAnalyzerCompilerPass; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\KeysetAnalyzerCompilerPass; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\KeySetControllerCompilerPass; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; use Jose\Bundle\JoseFramework\DependencyInjection\Source\SourceWithCompilerPasses; use Jose\Component\KeyManagement\Analyzer\KeyAnalyzer; @@ -31,19 +24,11 @@ class KeyManagementSource implements SourceWithCompilerPasses /** * @var Source[] */ - private $sources; + private array $sources; - /** - * KeyManagementSource constructor. - */ public function __construct() { - $this->sources = [ - new JWKSetSource(), - new JWKSource(), - new JWKUriSource(), - new JKUSource(), - ]; + $this->sources = [new JWKSetSource(), new JWKSource(), new JWKUriSource(), new JKUSource()]; } public function name(): string @@ -53,12 +38,12 @@ public function name(): string public function load(array $configs, ContainerBuilder $container): void { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return; } $container->registerForAutoconfiguration(KeyAnalyzer::class)->addTag('jose.key_analyzer'); $container->registerForAutoconfiguration(KeysetAnalyzer::class)->addTag('jose.keyset_analyzer'); - $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config')); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../../../Resources/config')); $loader->load('analyzers.php'); $loader->load('jwk_factory.php'); $loader->load('jwk_services.php'); @@ -70,7 +55,7 @@ public function load(array $configs, ContainerBuilder $container): void public function getNodeDefinition(NodeDefinition $node): void { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return; } foreach ($this->sources as $source) { @@ -80,13 +65,13 @@ public function getNodeDefinition(NodeDefinition $node): void public function prepend(ContainerBuilder $container, array $config): array { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return []; } $result = []; foreach ($this->sources as $source) { $prepend = $source->prepend($container, $config); - if (0 !== count($prepend)) { + if (count($prepend) !== 0) { $result[$source->name()] = $prepend; } } @@ -100,9 +85,9 @@ public function prepend(ContainerBuilder $container, array $config): array public function getCompilerPasses(): array { return [ - new Compiler\KeyAnalyzerCompilerPass(), - new Compiler\KeysetAnalyzerCompilerPass(), - new Compiler\KeySetControllerCompilerPass(), + new KeyAnalyzerCompilerPass(), + new KeysetAnalyzerCompilerPass(), + new KeySetControllerCompilerPass(), ]; } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedToken.php b/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedToken.php index 7d9e4d8d..e7dfb7f7 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedToken.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedToken.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\NestedToken; use function array_key_exists; @@ -28,17 +19,11 @@ class NestedToken implements Source /** * @var Source[] */ - private $sources; + private array $sources; - /** - * EncryptionSource constructor. - */ public function __construct() { - $this->sources = [ - new NestedTokenLoader(), - new NestedTokenBuilder(), - ]; + $this->sources = [new NestedTokenLoader(), new NestedTokenBuilder()]; } public function name(): string @@ -48,10 +33,10 @@ public function name(): string public function load(array $configs, ContainerBuilder $container): void { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return; } - $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config')); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../../../Resources/config')); $loader->load('nested_token.php'); if (array_key_exists('nested_token', $configs)) { @@ -63,7 +48,7 @@ public function load(array $configs, ContainerBuilder $container): void public function getNodeDefinition(NodeDefinition $node): void { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return; } $childNode = $node->children() @@ -79,13 +64,13 @@ public function getNodeDefinition(NodeDefinition $node): void public function prepend(ContainerBuilder $container, array $config): array { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return []; } $result = []; foreach ($this->sources as $source) { $prepend = $source->prepend($container, $config); - if (0 !== count($prepend)) { + if (count($prepend) !== 0) { $result[$source->name()] = $prepend; } } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedTokenBuilder.php b/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedTokenBuilder.php index c91778ab..71f3307d 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedTokenBuilder.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedTokenBuilder.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\NestedToken; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -50,7 +41,7 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, self::class, $name.'NestedTokenBuilder'); + $container->registerAliasForArgument($service_id, self::class, $name . 'NestedTokenBuilder'); } } @@ -71,25 +62,29 @@ public function getNodeDefinition(NodeDefinition $node): void ->info('A list of signature algorithm aliases.') ->useAttributeAsKey('name') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('key_encryption_algorithms') ->info('A list of key encryption algorithm aliases.') ->useAttributeAsKey('name') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('content_encryption_algorithms') ->info('A list of key encryption algorithm aliases.') ->useAttributeAsKey('name') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('compression_methods') ->info('A list of compression method aliases.') ->useAttributeAsKey('name') ->defaultValue(['DEF']) - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('jws_serializers') ->info('A list of JWS serializer aliases.') @@ -98,7 +93,8 @@ public function getNodeDefinition(NodeDefinition $node): void ->treatFalseLike([]) ->isRequired() ->requiresAtLeastOneElement() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('jwe_serializers') ->info('A list of JWE serializer aliases.') @@ -107,14 +103,16 @@ public function getNodeDefinition(NodeDefinition $node): void ->treatFalseLike([]) ->isRequired() ->requiresAtLeastOneElement() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('tags') ->info('A list of tags to be associated to the service.') ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ->end() diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedTokenLoader.php b/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedTokenLoader.php index 453d16ff..c61ffb63 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedTokenLoader.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/NestedToken/NestedTokenLoader.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\NestedToken; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -52,7 +43,7 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, self::class, $name.'NestedTokenLoader'); + $container->registerAliasForArgument($service_id, self::class, $name . 'NestedTokenLoader'); } } @@ -73,25 +64,29 @@ public function getNodeDefinition(NodeDefinition $node): void ->info('A list of signature algorithm aliases.') ->useAttributeAsKey('name') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('key_encryption_algorithms') ->info('A list of key encryption algorithm aliases.') ->useAttributeAsKey('name') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('content_encryption_algorithms') ->info('A list of key encryption algorithm aliases.') ->useAttributeAsKey('name') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('compression_methods') ->info('A list of compression method aliases.') ->useAttributeAsKey('name') ->defaultValue(['DEF']) - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('jws_serializers') ->info('A list of JWS serializer aliases.') @@ -100,7 +95,8 @@ public function getNodeDefinition(NodeDefinition $node): void ->treatFalseLike([]) ->isRequired() ->requiresAtLeastOneElement() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('jwe_serializers') ->info('A list of JWE serializer aliases.') @@ -109,28 +105,32 @@ public function getNodeDefinition(NodeDefinition $node): void ->treatFalseLike([]) ->isRequired() ->requiresAtLeastOneElement() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('jws_header_checkers') ->info('A list of header checker aliases.') ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('jwe_header_checkers') ->info('A list of header checker aliases.') ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('tags') ->info('A list of tags to be associated to the service.') ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ->end() diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/AbstractSignatureSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/AbstractSignatureSource.php index 0e8543a7..5c57023f 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/AbstractSignatureSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/AbstractSignatureSource.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Signature; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -36,14 +27,16 @@ public function getNodeDefinition(NodeDefinition $node): void ->useAttributeAsKey('name') ->isRequired() ->requiresAtLeastOneElement() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('tags') ->info('A list of tags to be associated to the service.') ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ->end() diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSBuilder.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSBuilder.php index bf3eee1a..42cf23d6 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSBuilder.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSBuilder.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Signature; use Jose\Bundle\JoseFramework\Services\JWSBuilderFactory; @@ -41,7 +32,7 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, JWSBuilderService::class, $name.'JwsBuilder'); + $container->registerAliasForArgument($service_id, JWSBuilderService::class, $name . 'JwsBuilder'); } } } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSLoader.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSLoader.php index 290f2214..dfdf6f9e 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSLoader.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSLoader.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Signature; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -48,7 +39,7 @@ public function load(array $configs, ContainerBuilder $container): void } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, JWSLoaderService::class, $name.'JwsLoader'); + $container->registerAliasForArgument($service_id, JWSLoaderService::class, $name . 'JwsLoader'); } } @@ -69,27 +60,31 @@ public function getNodeDefinition(NodeDefinition $node): void ->info('A list of signature algorithm aliases.') ->useAttributeAsKey('name') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('serializers') ->info('A list of signature serializer aliases.') ->useAttributeAsKey('name') ->requiresAtLeastOneElement() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('header_checkers') ->info('A list of header checker aliases.') ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->end() ->arrayNode('tags') ->info('A list of tags to be associated to the service.') ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ->end() diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSSerializer.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSSerializer.php index 2a609d68..527eb3ff 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSSerializer.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSSerializer.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Signature; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; @@ -43,7 +34,7 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, JWSSerializerManager::class, $name.'JwsSerializer'); + $container->registerAliasForArgument($service_id, JWSSerializerManager::class, $name . 'JwsSerializer'); } } @@ -63,7 +54,8 @@ public function getNodeDefinition(NodeDefinition $node): void ->arrayNode('serializers') ->info('A list of JWS serializers aliases.') ->isRequired() - ->scalarPrototype()->end() + ->scalarPrototype() + ->end() ->treatNullLike([]) ->treatFalseLike([]) ->requiresAtLeastOneElement() @@ -73,7 +65,8 @@ public function getNodeDefinition(NodeDefinition $node): void ->useAttributeAsKey('name') ->treatNullLike([]) ->treatFalseLike([]) - ->variablePrototype()->end() + ->variablePrototype() + ->end() ->end() ->end() ->end() diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSVerifier.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSVerifier.php index ecf5cb5e..3048303e 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSVerifier.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/JWSVerifier.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Signature; use Jose\Bundle\JoseFramework\Services\JWSVerifierFactory; @@ -33,9 +24,7 @@ public function load(array $configs, ContainerBuilder $container): void $definition = new Definition(JWSVerifierService::class); $definition ->setFactory([new Reference(JWSVerifierFactory::class), 'create']) - ->setArguments([ - $itemConfig['signature_algorithms'], - ]) + ->setArguments([$itemConfig['signature_algorithms']]) ->addTag('jose.jws_verifier') ->setPublic($itemConfig['is_public']) ; @@ -43,7 +32,7 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, JWSVerifierService::class, $name.'JwsVerifier'); + $container->registerAliasForArgument($service_id, JWSVerifierService::class, $name . 'JwsVerifier'); } } } diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/SignatureSource.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/SignatureSource.php index acc30dc7..ac446ee1 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/SignatureSource.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Signature/SignatureSource.php @@ -2,21 +2,12 @@ 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\Bundle\JoseFramework\DependencyInjection\Source\Signature; use function array_key_exists; use function count; use function extension_loaded; -use Jose\Bundle\JoseFramework\DependencyInjection\Compiler; +use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\SignatureSerializerCompilerPass; use Jose\Bundle\JoseFramework\DependencyInjection\Source\Source; use Jose\Bundle\JoseFramework\DependencyInjection\Source\SourceWithCompilerPasses; use Jose\Component\Signature\Algorithm\ECDSA; @@ -38,19 +29,11 @@ class SignatureSource implements SourceWithCompilerPasses /** * @var Source[] */ - private $sources; + private array $sources; - /** - * SignatureSource constructor. - */ public function __construct() { - $this->sources = [ - new JWSBuilder(), - new JWSVerifier(), - new JWSSerializer(), - new JWSLoader(), - ]; + $this->sources = [new JWSBuilder(), new JWSVerifier(), new JWSSerializer(), new JWSLoader()]; } public function name(): string @@ -60,15 +43,17 @@ public function name(): string public function load(array $configs, ContainerBuilder $container): void { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return; } - $container->registerForAutoconfiguration(\Jose\Component\Signature\Serializer\JWSSerializer::class)->addTag('jose.jws.serializer'); - $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config/')); + $container->registerForAutoconfiguration(\Jose\Component\Signature\Serializer\JWSSerializer::class)->addTag( + 'jose.jws.serializer' + ); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../../../Resources/config/')); $loader->load('jws_services.php'); $loader->load('jws_serializers.php'); - $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config/Algorithms/')); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../../../Resources/config/Algorithms/')); foreach ($this->getAlgorithmsFiles() as $class => $file) { if (class_exists($class)) { $loader->load($file); @@ -84,7 +69,7 @@ public function load(array $configs, ContainerBuilder $container): void public function getNodeDefinition(NodeDefinition $node): void { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return; } $childNode = $node->children() @@ -101,13 +86,13 @@ public function getNodeDefinition(NodeDefinition $node): void public function prepend(ContainerBuilder $container, array $config): array { - if (!$this->isEnabled()) { + if (! $this->isEnabled()) { return []; } $result = []; foreach ($this->sources as $source) { $prepend = $source->prepend($container, $config); - if (0 !== count($prepend)) { + if (count($prepend) !== 0) { $result[$source->name()] = $prepend; } } @@ -120,9 +105,7 @@ public function prepend(ContainerBuilder $container, array $config): array */ public function getCompilerPasses(): array { - return [ - new Compiler\SignatureSerializerCompilerPass(), - ]; + return [new SignatureSerializerCompilerPass()]; } private function getAlgorithmsFiles(): array diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/Source.php b/src/Bundle/JoseFramework/DependencyInjection/Source/Source.php index ae0fe244..a5cc0b88 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/Source.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/Source.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source; use Symfony\Component\Config\Definition\Builder\NodeDefinition; diff --git a/src/Bundle/JoseFramework/DependencyInjection/Source/SourceWithCompilerPasses.php b/src/Bundle/JoseFramework/DependencyInjection/Source/SourceWithCompilerPasses.php index d1f42955..2eb28d0f 100644 --- a/src/Bundle/JoseFramework/DependencyInjection/Source/SourceWithCompilerPasses.php +++ b/src/Bundle/JoseFramework/DependencyInjection/Source/SourceWithCompilerPasses.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\DependencyInjection\Source; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; diff --git a/src/Bundle/JoseFramework/EnvVarProcessor/KeyEnvVarProcessor.php b/src/Bundle/JoseFramework/EnvVarProcessor/KeyEnvVarProcessor.php index ed7d3211..475a805d 100644 --- a/src/Bundle/JoseFramework/EnvVarProcessor/KeyEnvVarProcessor.php +++ b/src/Bundle/JoseFramework/EnvVarProcessor/KeyEnvVarProcessor.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\EnvVarProcessor; use Closure; @@ -23,23 +14,16 @@ final class KeyEnvVarProcessor implements EnvVarProcessorInterface { /** * {@inheritdoc} - * - * @throws RuntimeException if the prefix is not supported */ - public function getEnv($prefix, $name, Closure $getEnv) + public function getEnv(string $prefix, string $name, Closure $getEnv): mixed { $env = $getEnv($name); - switch ($prefix) { - case 'jwk': - return JWK::createFromJson($env); - - case 'jwkset': - return JWKSet::createFromJson($env); - - default: - throw new RuntimeException(sprintf('Unsupported prefix "%s".', $prefix)); - } + return match ($prefix) { + 'jwk' => JWK::createFromJson($env), + 'jwkset' => JWKSet::createFromJson($env), + default => throw new RuntimeException(sprintf('Unsupported prefix "%s".', $prefix)), + }; } public static function getProvidedTypes(): array diff --git a/src/Bundle/JoseFramework/Event/ClaimCheckedFailureEvent.php b/src/Bundle/JoseFramework/Event/ClaimCheckedFailureEvent.php index a14ab51d..a7dce720 100644 --- a/src/Bundle/JoseFramework/Event/ClaimCheckedFailureEvent.php +++ b/src/Bundle/JoseFramework/Event/ClaimCheckedFailureEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Symfony\Contracts\EventDispatcher\Event; @@ -28,16 +19,13 @@ final class ClaimCheckedFailureEvent extends Event */ private $mandatoryClaims; - /** - * @var Throwable - */ - private $throwable; - - public function __construct(array $claims, array $mandatoryClaims, Throwable $throwable) - { + public function __construct( + array $claims, + array $mandatoryClaims, + private Throwable $throwable + ) { $this->claims = $claims; $this->mandatoryClaims = $mandatoryClaims; - $this->throwable = $throwable; } public function getClaims(): array diff --git a/src/Bundle/JoseFramework/Event/ClaimCheckedSuccessEvent.php b/src/Bundle/JoseFramework/Event/ClaimCheckedSuccessEvent.php index 1687bed5..c077396c 100644 --- a/src/Bundle/JoseFramework/Event/ClaimCheckedSuccessEvent.php +++ b/src/Bundle/JoseFramework/Event/ClaimCheckedSuccessEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Symfony\Contracts\EventDispatcher\Event; diff --git a/src/Bundle/JoseFramework/Event/HeaderCheckedFailureEvent.php b/src/Bundle/JoseFramework/Event/HeaderCheckedFailureEvent.php index a32167bc..374cf393 100644 --- a/src/Bundle/JoseFramework/Event/HeaderCheckedFailureEvent.php +++ b/src/Bundle/JoseFramework/Event/HeaderCheckedFailureEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWT; @@ -19,32 +10,18 @@ final class HeaderCheckedFailureEvent extends Event { - /** - * @var JWT - */ - private $jwt; - - /** - * @var int - */ - private $index; - /** * @var array */ private $mandatoryHeaderParameters; - /** - * @var Throwable - */ - private $throwable; - - public function __construct(JWT $jwt, int $index, array $mandatoryHeaderParameters, Throwable $throwable) - { - $this->jwt = $jwt; - $this->index = $index; + public function __construct( + private JWT $jwt, + private int $index, + array $mandatoryHeaderParameters, + private Throwable $throwable + ) { $this->mandatoryHeaderParameters = $mandatoryHeaderParameters; - $this->throwable = $throwable; } public function getJwt(): JWT diff --git a/src/Bundle/JoseFramework/Event/HeaderCheckedSuccessEvent.php b/src/Bundle/JoseFramework/Event/HeaderCheckedSuccessEvent.php index 9aaf74c9..7c1d6d63 100644 --- a/src/Bundle/JoseFramework/Event/HeaderCheckedSuccessEvent.php +++ b/src/Bundle/JoseFramework/Event/HeaderCheckedSuccessEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWT; @@ -18,25 +9,16 @@ final class HeaderCheckedSuccessEvent extends Event { - /** - * @var JWT - */ - private $jwt; - - /** - * @var int - */ - private $index; - /** * @var array */ private $mandatoryHeaderParameters; - public function __construct(JWT $jwt, int $index, array $mandatoryHeaderParameters) - { - $this->jwt = $jwt; - $this->index = $index; + public function __construct( + private JWT $jwt, + private int $index, + array $mandatoryHeaderParameters + ) { $this->mandatoryHeaderParameters = $mandatoryHeaderParameters; } diff --git a/src/Bundle/JoseFramework/Event/JWEBuiltFailureEvent.php b/src/Bundle/JoseFramework/Event/JWEBuiltFailureEvent.php index b6d9dfc3..062de2fd 100644 --- a/src/Bundle/JoseFramework/Event/JWEBuiltFailureEvent.php +++ b/src/Bundle/JoseFramework/Event/JWEBuiltFailureEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Symfony\Contracts\EventDispatcher\Event; @@ -18,16 +9,6 @@ final class JWEBuiltFailureEvent extends Event { - /** - * @var Throwable - */ - private $throwable; - - /** - * @var null|string - */ - private $payload; - /** * @var array */ @@ -43,19 +24,17 @@ final class JWEBuiltFailureEvent extends Event */ private $sharedHeader; - /** - * @var null|string - */ - private $aad; - - public function __construct(?string $payload, array $recipients, array $sharedProtectedHeader, array $sharedHeader, ?string $aad, Throwable $throwable) - { - $this->throwable = $throwable; - $this->payload = $payload; + public function __construct( + private ?string $payload, + array $recipients, + array $sharedProtectedHeader, + array $sharedHeader, + private ?string $aad, + private Throwable $throwable + ) { $this->recipients = $recipients; $this->sharedProtectedHeader = $sharedProtectedHeader; $this->sharedHeader = $sharedHeader; - $this->aad = $aad; } public function getPayload(): ?string diff --git a/src/Bundle/JoseFramework/Event/JWEBuiltSuccessEvent.php b/src/Bundle/JoseFramework/Event/JWEBuiltSuccessEvent.php index c98af437..9cb83944 100644 --- a/src/Bundle/JoseFramework/Event/JWEBuiltSuccessEvent.php +++ b/src/Bundle/JoseFramework/Event/JWEBuiltSuccessEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Encryption\JWE; @@ -18,14 +9,9 @@ final class JWEBuiltSuccessEvent extends Event { - /** - * @var JWE - */ - private $jwe; - - public function __construct(JWE $jwe) - { - $this->jwe = $jwe; + public function __construct( + private JWE $jwe + ) { } public function getJwe(): JWE diff --git a/src/Bundle/JoseFramework/Event/JWEDecryptionFailureEvent.php b/src/Bundle/JoseFramework/Event/JWEDecryptionFailureEvent.php index 173b524e..a8fc345b 100644 --- a/src/Bundle/JoseFramework/Event/JWEDecryptionFailureEvent.php +++ b/src/Bundle/JoseFramework/Event/JWEDecryptionFailureEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWKSet; @@ -19,20 +10,10 @@ final class JWEDecryptionFailureEvent extends Event { - /** - * @var JWKSet - */ - private $JWKSet; - - /** - * @var JWE - */ - private $jwe; - - public function __construct(JWE $jwe, JWKSet $JWKSet) - { - $this->JWKSet = $JWKSet; - $this->jwe = $jwe; + public function __construct( + private JWE $jwe, + private JWKSet $JWKSet + ) { } public function getJWKSet(): JWKSet diff --git a/src/Bundle/JoseFramework/Event/JWEDecryptionSuccessEvent.php b/src/Bundle/JoseFramework/Event/JWEDecryptionSuccessEvent.php index f2c08006..619f364a 100644 --- a/src/Bundle/JoseFramework/Event/JWEDecryptionSuccessEvent.php +++ b/src/Bundle/JoseFramework/Event/JWEDecryptionSuccessEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWK; @@ -20,32 +11,12 @@ final class JWEDecryptionSuccessEvent extends Event { - /** - * @var JWE - */ - private $jwe; - - /** - * @var JWKSet - */ - private $JWKSet; - - /** - * @var JWK - */ - private $JWK; - - /** - * @var int - */ - private $recipient; - - public function __construct(JWE $jwe, JWKSet $JWKSet, JWK $JWK, int $recipient) - { - $this->jwe = $jwe; - $this->JWKSet = $JWKSet; - $this->JWK = $JWK; - $this->recipient = $recipient; + public function __construct( + private JWE $jwe, + private JWKSet $JWKSet, + private JWK $JWK, + private int $recipient + ) { } public function getJws(): JWE diff --git a/src/Bundle/JoseFramework/Event/JWELoadingFailureEvent.php b/src/Bundle/JoseFramework/Event/JWELoadingFailureEvent.php index c2bc6ffd..1c90b21a 100644 --- a/src/Bundle/JoseFramework/Event/JWELoadingFailureEvent.php +++ b/src/Bundle/JoseFramework/Event/JWELoadingFailureEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWKSet; @@ -19,26 +10,11 @@ final class JWELoadingFailureEvent extends Event { - /** - * @var JWKSet - */ - private $JWKSet; - - /** - * @var Throwable - */ - private $throwable; - - /** - * @var string - */ - private $token; - - public function __construct(string $token, JWKSet $JWKSet, Throwable $throwable) - { - $this->JWKSet = $JWKSet; - $this->throwable = $throwable; - $this->token = $token; + public function __construct( + private string $token, + private JWKSet $JWKSet, + private Throwable $throwable + ) { } public function getJWKSet(): JWKSet diff --git a/src/Bundle/JoseFramework/Event/JWELoadingSuccessEvent.php b/src/Bundle/JoseFramework/Event/JWELoadingSuccessEvent.php index d27c9014..f0cd82e4 100644 --- a/src/Bundle/JoseFramework/Event/JWELoadingSuccessEvent.php +++ b/src/Bundle/JoseFramework/Event/JWELoadingSuccessEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWKSet; @@ -19,32 +10,12 @@ final class JWELoadingSuccessEvent extends Event { - /** - * @var JWE - */ - private $jwe; - - /** - * @var JWKSet - */ - private $JWKSet; - - /** - * @var int - */ - private $recipient; - - /** - * @var string - */ - private $token; - - public function __construct(string $token, JWE $jwe, JWKSet $JWKSet, int $recipient) - { - $this->jwe = $jwe; - $this->JWKSet = $JWKSet; - $this->recipient = $recipient; - $this->token = $token; + public function __construct( + private string $token, + private JWE $jwe, + private JWKSet $JWKSet, + private int $recipient + ) { } public function getJws(): JWE diff --git a/src/Bundle/JoseFramework/Event/JWSBuiltFailureEvent.php b/src/Bundle/JoseFramework/Event/JWSBuiltFailureEvent.php index 2d4a6e8a..464c49dc 100644 --- a/src/Bundle/JoseFramework/Event/JWSBuiltFailureEvent.php +++ b/src/Bundle/JoseFramework/Event/JWSBuiltFailureEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Symfony\Contracts\EventDispatcher\Event; @@ -18,37 +9,19 @@ final class JWSBuiltFailureEvent extends Event { - /** - * @var null|string - */ - protected $payload; - - /** - * @var bool - */ - protected $isPayloadDetached; - /** * @var array */ protected $signatures = []; - /** - * @var null|bool - */ - protected $isPayloadEncoded; - /** - * @var Throwable - */ - private $throwable; - - public function __construct(?string $payload, array $signatures, bool $isPayloadDetached, ?bool $isPayloadEncoded, Throwable $throwable) - { - $this->throwable = $throwable; - $this->payload = $payload; + public function __construct( + protected ?string $payload, + array $signatures, + protected bool $isPayloadDetached, + protected ?bool $isPayloadEncoded, + private Throwable $throwable + ) { $this->signatures = $signatures; - $this->isPayloadDetached = $isPayloadDetached; - $this->isPayloadEncoded = $isPayloadEncoded; } public function getPayload(): ?string diff --git a/src/Bundle/JoseFramework/Event/JWSBuiltSuccessEvent.php b/src/Bundle/JoseFramework/Event/JWSBuiltSuccessEvent.php index e7aae459..3c631cc5 100644 --- a/src/Bundle/JoseFramework/Event/JWSBuiltSuccessEvent.php +++ b/src/Bundle/JoseFramework/Event/JWSBuiltSuccessEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Signature\JWS; @@ -18,14 +9,9 @@ final class JWSBuiltSuccessEvent extends Event { - /** - * @var JWS - */ - private $jws; - - public function __construct(JWS $jws) - { - $this->jws = $jws; + public function __construct( + private JWS $jws + ) { } public function getJws(): JWS diff --git a/src/Bundle/JoseFramework/Event/JWSLoadingFailureEvent.php b/src/Bundle/JoseFramework/Event/JWSLoadingFailureEvent.php index 3b8559dd..421423c1 100644 --- a/src/Bundle/JoseFramework/Event/JWSLoadingFailureEvent.php +++ b/src/Bundle/JoseFramework/Event/JWSLoadingFailureEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWKSet; @@ -19,26 +10,11 @@ final class JWSLoadingFailureEvent extends Event { - /** - * @var JWKSet - */ - private $JWKSet; - - /** - * @var Throwable - */ - private $throwable; - - /** - * @var string - */ - private $token; - - public function __construct(string $token, JWKSet $JWKSet, Throwable $throwable) - { - $this->JWKSet = $JWKSet; - $this->throwable = $throwable; - $this->token = $token; + public function __construct( + private string $token, + private JWKSet $JWKSet, + private Throwable $throwable + ) { } public function getToken(): string diff --git a/src/Bundle/JoseFramework/Event/JWSLoadingSuccessEvent.php b/src/Bundle/JoseFramework/Event/JWSLoadingSuccessEvent.php index 8603f22f..f2e593c4 100644 --- a/src/Bundle/JoseFramework/Event/JWSLoadingSuccessEvent.php +++ b/src/Bundle/JoseFramework/Event/JWSLoadingSuccessEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWKSet; @@ -19,32 +10,12 @@ final class JWSLoadingSuccessEvent extends Event { - /** - * @var JWS - */ - private $jws; - - /** - * @var JWKSet - */ - private $JWKSet; - - /** - * @var int - */ - private $signature; - - /** - * @var string - */ - private $token; - - public function __construct(string $token, JWS $jws, JWKSet $JWKSet, int $signature) - { - $this->jws = $jws; - $this->JWKSet = $JWKSet; - $this->signature = $signature; - $this->token = $token; + public function __construct( + private string $token, + private JWS $jws, + private JWKSet $JWKSet, + private int $signature + ) { } public function getJws(): JWS diff --git a/src/Bundle/JoseFramework/Event/JWSVerificationFailureEvent.php b/src/Bundle/JoseFramework/Event/JWSVerificationFailureEvent.php index 5b05cbd0..b86e453b 100644 --- a/src/Bundle/JoseFramework/Event/JWSVerificationFailureEvent.php +++ b/src/Bundle/JoseFramework/Event/JWSVerificationFailureEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWKSet; @@ -19,26 +10,11 @@ final class JWSVerificationFailureEvent extends Event { - /** - * @var JWKSet - */ - private $JWKSet; - - /** - * @var null|string - */ - private $detachedPayload; - - /** - * @var JWS - */ - private $jws; - - public function __construct(JWS $jws, JWKSet $JWKSet, ?string $detachedPayload) - { - $this->JWKSet = $JWKSet; - $this->detachedPayload = $detachedPayload; - $this->jws = $jws; + public function __construct( + private JWS $jws, + private JWKSet $JWKSet, + private ?string $detachedPayload + ) { } public function getJws(): JWS diff --git a/src/Bundle/JoseFramework/Event/JWSVerificationSuccessEvent.php b/src/Bundle/JoseFramework/Event/JWSVerificationSuccessEvent.php index 61373e72..921af3c9 100644 --- a/src/Bundle/JoseFramework/Event/JWSVerificationSuccessEvent.php +++ b/src/Bundle/JoseFramework/Event/JWSVerificationSuccessEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWK; @@ -20,38 +11,13 @@ final class JWSVerificationSuccessEvent extends Event { - /** - * @var JWS - */ - private $jws; - - /** - * @var JWKSet - */ - private $JWKSet; - - /** - * @var JWK - */ - private $JWK; - - /** - * @var int - */ - private $signature; - - /** - * @var null|string - */ - private $detachedPayload; - - public function __construct(JWS $jws, JWKSet $JWKSet, int $signature, ?string $detachedPayload, JWK $JWK) - { - $this->jws = $jws; - $this->JWKSet = $JWKSet; - $this->JWK = $JWK; - $this->signature = $signature; - $this->detachedPayload = $detachedPayload; + public function __construct( + private JWS $jws, + private JWKSet $JWKSet, + private int $signature, + private ?string $detachedPayload, + private JWK $JWK + ) { } public function getJws(): JWS diff --git a/src/Bundle/JoseFramework/Event/NestedTokenIssuedEvent.php b/src/Bundle/JoseFramework/Event/NestedTokenIssuedEvent.php index 4388f912..0a476cf4 100644 --- a/src/Bundle/JoseFramework/Event/NestedTokenIssuedEvent.php +++ b/src/Bundle/JoseFramework/Event/NestedTokenIssuedEvent.php @@ -2,29 +2,15 @@ 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\Bundle\JoseFramework\Event; use Symfony\Contracts\EventDispatcher\Event; final class NestedTokenIssuedEvent extends Event { - /** - * @var string - */ - private $nestedToken; - - public function __construct(string $nestedToken) - { - $this->nestedToken = $nestedToken; + public function __construct( + private string $nestedToken + ) { } public function getNestedToken(): string diff --git a/src/Bundle/JoseFramework/Event/NestedTokenLoadingFailureEvent.php b/src/Bundle/JoseFramework/Event/NestedTokenLoadingFailureEvent.php index 9caedd20..6413af93 100644 --- a/src/Bundle/JoseFramework/Event/NestedTokenLoadingFailureEvent.php +++ b/src/Bundle/JoseFramework/Event/NestedTokenLoadingFailureEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWKSet; @@ -19,32 +10,12 @@ final class NestedTokenLoadingFailureEvent extends Event { - /** - * @var Throwable - */ - private $throwable; - - /** - * @var string - */ - private $token; - - /** - * @var JWKSet - */ - private $signatureKeySet; - - /** - * @var JWKSet - */ - private $encryptionKeySet; - - public function __construct(string $token, JWKSet $signatureKeySet, JWKSet $encryptionKeySet, Throwable $throwable) - { - $this->throwable = $throwable; - $this->token = $token; - $this->signatureKeySet = $signatureKeySet; - $this->encryptionKeySet = $encryptionKeySet; + public function __construct( + private string $token, + private JWKSet $signatureKeySet, + private JWKSet $encryptionKeySet, + private Throwable $throwable + ) { } public function getToken(): string diff --git a/src/Bundle/JoseFramework/Event/NestedTokenLoadingSuccessEvent.php b/src/Bundle/JoseFramework/Event/NestedTokenLoadingSuccessEvent.php index 6763c76a..4d8e4dde 100644 --- a/src/Bundle/JoseFramework/Event/NestedTokenLoadingSuccessEvent.php +++ b/src/Bundle/JoseFramework/Event/NestedTokenLoadingSuccessEvent.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Event; use Jose\Component\Core\JWKSet; @@ -19,38 +10,13 @@ final class NestedTokenLoadingSuccessEvent extends Event { - /** - * @var JWS - */ - private $jws; - - /** - * @var int - */ - private $signature; - - /** - * @var string - */ - private $token; - - /** - * @var JWKSet - */ - private $signatureKeySet; - - /** - * @var JWKSet - */ - private $encryptionKeySet; - - public function __construct(string $token, JWS $jws, JWKSet $signatureKeySet, JWKSet $encryptionKeySet, int $signature) - { - $this->jws = $jws; - $this->signature = $signature; - $this->token = $token; - $this->signatureKeySet = $signatureKeySet; - $this->encryptionKeySet = $encryptionKeySet; + public function __construct( + private string $token, + private JWS $jws, + private JWKSet $signatureKeySet, + private JWKSet $encryptionKeySet, + private int $signature + ) { } public function getJws(): JWS diff --git a/src/Bundle/JoseFramework/Helper/ConfigurationHelper.php b/src/Bundle/JoseFramework/Helper/ConfigurationHelper.php index 22f0e5da..cd5f23ff 100644 --- a/src/Bundle/JoseFramework/Helper/ConfigurationHelper.php +++ b/src/Bundle/JoseFramework/Helper/ConfigurationHelper.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Helper; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -22,8 +13,13 @@ class ConfigurationHelper /** * @param string[] $signatureAlgorithms */ - public static function addJWSBuilder(ContainerBuilder $container, string $name, array $signatureAlgorithms, bool $is_public = true, array $tags = []): void - { + public static function addJWSBuilder( + ContainerBuilder $container, + string $name, + array $signatureAlgorithms, + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'jws' => [ @@ -43,8 +39,13 @@ public static function addJWSBuilder(ContainerBuilder $container, string $name, /** * @param string[] $signatureAlgorithms */ - public static function addJWSVerifier(ContainerBuilder $container, string $name, array $signatureAlgorithms, bool $is_public = true, array $tags = []): void - { + public static function addJWSVerifier( + ContainerBuilder $container, + string $name, + array $signatureAlgorithms, + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'jws' => [ @@ -65,8 +66,13 @@ public static function addJWSVerifier(ContainerBuilder $container, string $name, /** * @param string[] $serializers */ - public static function addJWSSerializer(ContainerBuilder $container, string $name, array $serializers, bool $is_public = true, array $tags = []): void - { + public static function addJWSSerializer( + ContainerBuilder $container, + string $name, + array $serializers, + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'jws' => [ @@ -89,8 +95,15 @@ public static function addJWSSerializer(ContainerBuilder $container, string $nam * @param string[] $signature_algorithms * @param string[] $header_checkers */ - public static function addJWSLoader(ContainerBuilder $container, string $name, array $serializers, array $signature_algorithms, array $header_checkers, bool $is_public = true, array $tags = []): void - { + public static function addJWSLoader( + ContainerBuilder $container, + string $name, + array $serializers, + array $signature_algorithms, + array $header_checkers, + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'jws' => [ @@ -120,8 +133,20 @@ public static function addJWSLoader(ContainerBuilder $container, string $name, a * @param string[] $signature_algorithms * @param string[] $jws_header_checkers */ - public static function addNestedTokenLoader(ContainerBuilder $container, string $name, array $jwe_serializers, array $key_encryption_algorithms, array $content_encryption_algorithms, array $compression_methods, array $jwe_header_checkers, array $jws_serializers, array $signature_algorithms, array $jws_header_checkers, bool $is_public = true, array $tags = []): void - { + public static function addNestedTokenLoader( + ContainerBuilder $container, + string $name, + array $jwe_serializers, + array $key_encryption_algorithms, + array $content_encryption_algorithms, + array $compression_methods, + array $jwe_header_checkers, + array $jws_serializers, + array $signature_algorithms, + array $jws_header_checkers, + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'nested_token' => [ @@ -154,8 +179,18 @@ public static function addNestedTokenLoader(ContainerBuilder $container, string * @param string[] $jws_serializers * @param string[] $signature_algorithms */ - public static function addNestedTokenBuilder(ContainerBuilder $container, string $name, array $jwe_serializers, array $key_encryption_algorithms, array $content_encryption_algorithms, array $compression_methods, array $jws_serializers, array $signature_algorithms, bool $is_public = true, array $tags = []): void - { + public static function addNestedTokenBuilder( + ContainerBuilder $container, + string $name, + array $jwe_serializers, + array $key_encryption_algorithms, + array $content_encryption_algorithms, + array $compression_methods, + array $jws_serializers, + array $signature_algorithms, + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'nested_token' => [ @@ -181,8 +216,13 @@ public static function addNestedTokenBuilder(ContainerBuilder $container, string /** * @param string[] $serializers */ - public static function addJWESerializer(ContainerBuilder $container, string $name, array $serializers, bool $is_public = true, array $tags = []): void - { + public static function addJWESerializer( + ContainerBuilder $container, + string $name, + array $serializers, + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'jwe' => [ @@ -207,8 +247,17 @@ public static function addJWESerializer(ContainerBuilder $container, string $nam * @param string[] $compression_methods * @param string[] $header_checkers */ - public static function addJWELoader(ContainerBuilder $container, string $name, array $serializers, array $key_encryption_algorithms, array $content_encryption_algorithms, array $compression_methods, array $header_checkers, bool $is_public = true, array $tags = []): void - { + public static function addJWELoader( + ContainerBuilder $container, + string $name, + array $serializers, + array $key_encryption_algorithms, + array $content_encryption_algorithms, + array $compression_methods, + array $header_checkers, + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'jwe' => [ @@ -233,8 +282,13 @@ public static function addJWELoader(ContainerBuilder $container, string $name, a /** * @param string[] $claimCheckers */ - public static function addClaimChecker(ContainerBuilder $container, string $name, array $claimCheckers, bool $is_public = true, array $tags = []): void - { + public static function addClaimChecker( + ContainerBuilder $container, + string $name, + array $claimCheckers, + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'checkers' => [ @@ -255,8 +309,13 @@ public static function addClaimChecker(ContainerBuilder $container, string $name /** * @param string[] $headerCheckers */ - public static function addHeaderChecker(ContainerBuilder $container, string $name, array $headerCheckers, bool $is_public = true, array $tags = []): void - { + public static function addHeaderChecker( + ContainerBuilder $container, + string $name, + array $headerCheckers, + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'checkers' => [ @@ -274,8 +333,14 @@ public static function addHeaderChecker(ContainerBuilder $container, string $nam self::updateJoseConfiguration($container, $config, 'checkers'); } - public static function addKey(ContainerBuilder $container, string $name, string $type, array $parameters, bool $is_public = true, array $tags = []): void - { + public static function addKey( + ContainerBuilder $container, + string $name, + string $type, + array $parameters, + bool $is_public = true, + array $tags = [] + ): void { $parameters['is_public'] = $is_public; $parameters['tags'] = $tags; $config = [ @@ -291,8 +356,14 @@ public static function addKey(ContainerBuilder $container, string $name, string self::updateJoseConfiguration($container, $config, 'keys'); } - public static function addKeyset(ContainerBuilder $container, string $name, string $type, array $parameters, bool $is_public = true, array $tags = []): void - { + public static function addKeyset( + ContainerBuilder $container, + string $name, + string $type, + array $parameters, + bool $is_public = true, + array $tags = [] + ): void { $parameters['is_public'] = $is_public; $parameters['tags'] = $tags; $config = [ @@ -308,8 +379,13 @@ public static function addKeyset(ContainerBuilder $container, string $name, stri self::updateJoseConfiguration($container, $config, 'key_sets'); } - public static function addKeyUri(ContainerBuilder $container, string $name, array $parameters, bool $is_public = true, array $tags = []): void - { + public static function addKeyUri( + ContainerBuilder $container, + string $name, + array $parameters, + bool $is_public = true, + array $tags = [] + ): void { $parameters['is_public'] = $is_public; $parameters['tags'] = $tags; $config = [ @@ -323,8 +399,15 @@ public static function addKeyUri(ContainerBuilder $container, string $name, arra self::updateJoseConfiguration($container, $config, 'jwk_uris'); } - public static function addJWEBuilder(ContainerBuilder $container, string $name, array $keyEncryptionAlgorithm, array $contentEncryptionAlgorithms, array $compressionMethods = ['DEF'], bool $is_public = true, array $tags = []): void - { + public static function addJWEBuilder( + ContainerBuilder $container, + string $name, + array $keyEncryptionAlgorithm, + array $contentEncryptionAlgorithms, + array $compressionMethods = ['DEF'], + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'jwe' => [ @@ -344,8 +427,15 @@ public static function addJWEBuilder(ContainerBuilder $container, string $name, self::updateJoseConfiguration($container, $config, 'jwe'); } - public static function addJWEDecrypter(ContainerBuilder $container, string $name, array $keyEncryptionAlgorithm, array $contentEncryptionAlgorithms, array $compressionMethods = ['DEF'], bool $is_public = true, array $tags = []): void - { + public static function addJWEDecrypter( + ContainerBuilder $container, + string $name, + array $keyEncryptionAlgorithm, + array $contentEncryptionAlgorithms, + array $compressionMethods = ['DEF'], + bool $is_public = true, + array $tags = [] + ): void { $config = [ self::BUNDLE_ALIAS => [ 'jwe' => [ @@ -368,7 +458,7 @@ public static function addJWEDecrypter(ContainerBuilder $container, string $name private static function updateJoseConfiguration(ContainerBuilder $container, array $config, string $element): void { $jose_config = current($container->getExtensionConfig(self::BUNDLE_ALIAS)); - if (!isset($jose_config[$element])) { + if (! isset($jose_config[$element])) { $jose_config[$element] = []; } $jose_config[$element] = array_merge($jose_config[$element], $config[self::BUNDLE_ALIAS][$element]); diff --git a/src/Bundle/JoseFramework/JoseFrameworkBundle.php b/src/Bundle/JoseFramework/JoseFrameworkBundle.php index ccca563a..9f71a015 100644 --- a/src/Bundle/JoseFramework/JoseFrameworkBundle.php +++ b/src/Bundle/JoseFramework/JoseFrameworkBundle.php @@ -2,21 +2,20 @@ 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\Bundle\JoseFramework; use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\EventDispatcherAliasCompilerPass; use Jose\Bundle\JoseFramework\DependencyInjection\Compiler\SymfonySerializerCompilerPass; use Jose\Bundle\JoseFramework\DependencyInjection\JoseFrameworkExtension; use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Checker\CheckerSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Console\ConsoleSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Encryption\EncryptionSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\KeyManagementSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\NestedToken\NestedToken; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Signature\SignatureSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\SourceWithCompilerPasses; use Symfony\Component\DependencyInjection\Compiler\PassConfig; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; @@ -27,7 +26,7 @@ final class JoseFrameworkBundle extends Bundle /** * @var Source\Source[] */ - private $sources = []; + private array $sources = []; public function __construct() { @@ -45,7 +44,7 @@ public function build(ContainerBuilder $container): void { parent::build($container); foreach ($this->sources as $source) { - if ($source instanceof Source\SourceWithCompilerPasses) { + if ($source instanceof SourceWithCompilerPasses) { $compilerPasses = $source->getCompilerPasses(); foreach ($compilerPasses as $compilerPass) { $container->addCompilerPass($compilerPass); @@ -63,13 +62,13 @@ public function build(ContainerBuilder $container): void private function getSources(): iterable { return [ - new Source\Core\CoreSource(), - new Source\Checker\CheckerSource(), - new Source\Console\ConsoleSource(), - new Source\Signature\SignatureSource(), - new Source\Encryption\EncryptionSource(), - new Source\NestedToken\NestedToken(), - new Source\KeyManagement\KeyManagementSource(), + new CoreSource(), + new CheckerSource(), + new ConsoleSource(), + new SignatureSource(), + new EncryptionSource(), + new NestedToken(), + new KeyManagementSource(), ]; } } diff --git a/src/Bundle/JoseFramework/Normalizer/JWENormalizer.php b/src/Bundle/JoseFramework/Normalizer/JWENormalizer.php index 3ccaa6bd..28d2c016 100644 --- a/src/Bundle/JoseFramework/Normalizer/JWENormalizer.php +++ b/src/Bundle/JoseFramework/Normalizer/JWENormalizer.php @@ -2,17 +2,9 @@ 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\Bundle\JoseFramework\Normalizer; +use ArrayObject; use Jose\Component\Encryption\JWE; use Jose\Component\Encryption\Serializer\JWESerializerManager; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; @@ -23,7 +15,7 @@ final class JWENormalizer implements NormalizerInterface, DenormalizerInterface /** * {@inheritDoc} */ - public function supportsNormalization($data, $format = null) + public function supportsNormalization(mixed $data, string $format = null): bool { return $data instanceof JWE && $this->componentInstalled(); } @@ -31,16 +23,19 @@ public function supportsNormalization($data, $format = null) /** * {@inheritDoc} */ - public function supportsDenormalization($data, $type, $format = null) + public function supportsDenormalization(mixed $data, string $type, string $format = null): bool { - return JWE::class === $type && $this->componentInstalled(); + return $type === JWE::class && $this->componentInstalled(); } /** * {@inheritDoc} */ - public function normalize($object, $format = null, array $context = []) - { + public function normalize( + mixed $object, + string $format = null, + array $context = [] + ): array|string|int|float|bool|ArrayObject|null { return $object; } @@ -51,7 +46,7 @@ public function normalize($object, $format = null, array $context = []) * * @return array|object */ - public function denormalize($data, $type, $format = null, array $context = []) + public function denormalize(mixed $data, string $type, string $format = null, array $context = []): mixed { return $data; } diff --git a/src/Bundle/JoseFramework/Normalizer/JWSNormalizer.php b/src/Bundle/JoseFramework/Normalizer/JWSNormalizer.php index 5c0c7922..bd0b32ca 100644 --- a/src/Bundle/JoseFramework/Normalizer/JWSNormalizer.php +++ b/src/Bundle/JoseFramework/Normalizer/JWSNormalizer.php @@ -2,17 +2,9 @@ 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\Bundle\JoseFramework\Normalizer; +use ArrayObject; use Jose\Component\Signature\JWS; use Jose\Component\Signature\Serializer\JWSSerializerManager; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; @@ -20,30 +12,25 @@ final class JWSNormalizer implements NormalizerInterface, DenormalizerInterface { - public function supportsNormalization($data, $format = null) + public function supportsNormalization(mixed $data, string $format = null): bool { return $data instanceof JWS && $this->componentInstalled(); } - public function supportsDenormalization($data, $type, $format = null) + public function supportsDenormalization(mixed $data, string $type, string $format = null): bool { - return JWS::class === $type && $this->componentInstalled(); + return $type === JWS::class && $this->componentInstalled(); } - public function normalize($object, $format = null, array $context = []) - { + public function normalize( + mixed $object, + string $format = null, + array $context = [] + ): array|string|int|float|bool|ArrayObject|null { return $object; } - /** - * @param mixed $data Data to restore - * @param string $type The expected class to instantiate - * @param string $format Format the given data was extracted from - * @param array $context Options available to the denormalizer - * - * @return array|object - */ - public function denormalize($data, $type, $format = null, array $context = []) + public function denormalize(mixed $data, string $type, string $format = null, array $context = []): mixed { return $data; } diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aescbc.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aescbc.php index d0d02f0c..75e39c53 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aescbc.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aescbc.php @@ -2,6 +2,9 @@ declare(strict_types=1); +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192CBCHS384; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CBCHS512; /* * The MIT License (MIT) * @@ -11,25 +14,31 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Algorithm\ContentEncryption; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(ContentEncryption\A128CBCHS256::class) - ->tag('jose.algorithm', ['alias' => 'A128CBC-HS256']) + $container->set(A128CBCHS256::class) + ->tag('jose.algorithm', [ + 'alias' => 'A128CBC-HS256', + ]) ; - $container->set(ContentEncryption\A192CBCHS384::class) - ->tag('jose.algorithm', ['alias' => 'A192CBC-HS384']) + $container->set(A192CBCHS384::class) + ->tag('jose.algorithm', [ + 'alias' => 'A192CBC-HS384', + ]) ; - $container->set(ContentEncryption\A256CBCHS512::class) - ->tag('jose.algorithm', ['alias' => 'A256CBC-HS512']) + $container->set(A256CBCHS512::class) + ->tag('jose.algorithm', [ + 'alias' => 'A256CBC-HS512', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aesgcm.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aesgcm.php index 36c74daa..7ba3daac 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aesgcm.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aesgcm.php @@ -2,6 +2,9 @@ declare(strict_types=1); +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM; /* * The MIT License (MIT) * @@ -11,25 +14,31 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Algorithm\ContentEncryption; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(ContentEncryption\A128GCM::class) - ->tag('jose.algorithm', ['alias' => 'A128GCM']) + $container->set(A128GCM::class) + ->tag('jose.algorithm', [ + 'alias' => 'A128GCM', + ]) ; - $container->set(ContentEncryption\A192GCM::class) - ->tag('jose.algorithm', ['alias' => 'A192GCM']) + $container->set(A192GCM::class) + ->tag('jose.algorithm', [ + 'alias' => 'A192GCM', + ]) ; - $container->set(ContentEncryption\A256GCM::class) - ->tag('jose.algorithm', ['alias' => 'A256GCM']) + $container->set(A256GCM::class) + ->tag('jose.algorithm', [ + 'alias' => 'A256GCM', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aesgcmkw.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aesgcmkw.php index 299e60c5..194fce9b 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aesgcmkw.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aesgcmkw.php @@ -2,6 +2,9 @@ declare(strict_types=1); +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256GCMKW; /* * The MIT License (MIT) * @@ -11,25 +14,31 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Algorithm\KeyEncryption; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(KeyEncryption\A128GCMKW::class) - ->tag('jose.algorithm', ['alias' => 'A128GCMKW']) + $container->set(A128GCMKW::class) + ->tag('jose.algorithm', [ + 'alias' => 'A128GCMKW', + ]) ; - $container->set(KeyEncryption\A192GCMKW::class) - ->tag('jose.algorithm', ['alias' => 'A192GCMKW']) + $container->set(A192GCMKW::class) + ->tag('jose.algorithm', [ + 'alias' => 'A192GCMKW', + ]) ; - $container->set(KeyEncryption\A256GCMKW::class) - ->tag('jose.algorithm', ['alias' => 'A256GCMKW']) + $container->set(A256GCMKW::class) + ->tag('jose.algorithm', [ + 'alias' => 'A256GCMKW', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aeskw.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aeskw.php index fa9112fb..f7498625 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aeskw.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_aeskw.php @@ -2,6 +2,9 @@ declare(strict_types=1); +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256KW; /* * The MIT License (MIT) * @@ -11,25 +14,31 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Algorithm\KeyEncryption; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(KeyEncryption\A128KW::class) - ->tag('jose.algorithm', ['alias' => 'A128KW']) + $container->set(A128KW::class) + ->tag('jose.algorithm', [ + 'alias' => 'A128KW', + ]) ; - $container->set(KeyEncryption\A192KW::class) - ->tag('jose.algorithm', ['alias' => 'A192KW']) + $container->set(A192KW::class) + ->tag('jose.algorithm', [ + 'alias' => 'A192KW', + ]) ; - $container->set(KeyEncryption\A256KW::class) - ->tag('jose.algorithm', ['alias' => 'A256KW']) + $container->set(A256KW::class) + ->tag('jose.algorithm', [ + 'alias' => 'A256KW', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_dir.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_dir.php index 300eb1c0..aa869f4c 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_dir.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_dir.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use Jose\Component\Encryption\Algorithm\KeyEncryption\Dir; /* * The MIT License (MIT) * @@ -11,17 +12,19 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Algorithm\KeyEncryption; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(KeyEncryption\Dir::class) - ->tag('jose.algorithm', ['alias' => 'dir']) + $container->set(Dir::class) + ->tag('jose.algorithm', [ + 'alias' => 'dir', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_ecdhes.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_ecdhes.php index 2a53eb4e..bf66d814 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_ecdhes.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_ecdhes.php @@ -2,6 +2,10 @@ declare(strict_types=1); +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA256KW; /* * The MIT License (MIT) * @@ -11,29 +15,37 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Algorithm\KeyEncryption; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(KeyEncryption\ECDHES::class) - ->tag('jose.algorithm', ['alias' => 'ECDH-ES']) + $container->set(ECDHES::class) + ->tag('jose.algorithm', [ + 'alias' => 'ECDH-ES', + ]) ; - $container->set(KeyEncryption\ECDHESA128KW::class) - ->tag('jose.algorithm', ['alias' => 'ECDH-ES+A128KW']) + $container->set(ECDHESA128KW::class) + ->tag('jose.algorithm', [ + 'alias' => 'ECDH-ES+A128KW', + ]) ; - $container->set(KeyEncryption\ECDHESA192KW::class) - ->tag('jose.algorithm', ['alias' => 'ECDH-ES+A192KW']) + $container->set(ECDHESA192KW::class) + ->tag('jose.algorithm', [ + 'alias' => 'ECDH-ES+A192KW', + ]) ; - $container->set(KeyEncryption\ECDHESA256KW::class) - ->tag('jose.algorithm', ['alias' => 'ECDH-ES+A256KW']) + $container->set(ECDHESA256KW::class) + ->tag('jose.algorithm', [ + 'alias' => 'ECDH-ES+A256KW', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_experimental.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_experimental.php index eb9a163e..22287b9d 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_experimental.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_experimental.php @@ -2,6 +2,19 @@ declare(strict_types=1); +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128CCM_16_128; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128CCM_16_64; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128CCM_64_128; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128CCM_64_64; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CCM_16_128; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CCM_16_64; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CCM_64_128; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CCM_64_64; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128CTR; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192CTR; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256CTR; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP384; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP512; /* * The MIT License (MIT) * @@ -11,8 +24,6 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Algorithm\ContentEncryption; -use Jose\Component\Encryption\Algorithm\KeyEncryption; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; /* @@ -24,61 +35,88 @@ * ------------------------ */ return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(KeyEncryption\A128CTR::class) - ->tag('jose.algorithm', ['alias' => 'A128CTR']) + $container->set(A128CTR::class) + ->tag('jose.algorithm', [ + 'alias' => 'A128CTR', + ]) ; - $container->set(KeyEncryption\A192CTR::class) - ->tag('jose.algorithm', ['alias' => 'A192CTR']) + $container->set(A192CTR::class) + ->tag('jose.algorithm', [ + 'alias' => 'A192CTR', + ]) ; - $container->set(KeyEncryption\A256CTR::class) - ->tag('jose.algorithm', ['alias' => 'A256CTR']) + $container->set(A256CTR::class) + ->tag('jose.algorithm', [ + 'alias' => 'A256CTR', + ]) ; - $container->set(KeyEncryption\RSAOAEP384::class) - ->tag('jose.algorithm', ['alias' => 'RSA-OAEP-384']) + $container->set(RSAOAEP384::class) + ->tag('jose.algorithm', [ + 'alias' => 'RSA-OAEP-384', + ]) ; - $container->set(KeyEncryption\RSAOAEP512::class) - ->tag('jose.algorithm', ['alias' => 'RSA-OAEP-512']) + $container->set(RSAOAEP512::class) + ->tag('jose.algorithm', [ + 'alias' => 'RSA-OAEP-512', + ]) ; - $container->set(ContentEncryption\A128CCM_16_64::class) - ->tag('jose.algorithm', ['alias' => 'A128CCM-16-64']) + $container->set(A128CCM_16_64::class) + ->tag('jose.algorithm', [ + 'alias' => 'A128CCM-16-64', + ]) ; - $container->set(ContentEncryption\A128CCM_16_128::class) - ->tag('jose.algorithm', ['alias' => 'A128CCM-16-128']) + $container->set(A128CCM_16_128::class) + ->tag('jose.algorithm', [ + 'alias' => 'A128CCM-16-128', + ]) ; - $container->set(ContentEncryption\A128CCM_64_64::class) - ->tag('jose.algorithm', ['alias' => 'A128CCM-64-64']) + $container->set(A128CCM_64_64::class) + ->tag('jose.algorithm', [ + 'alias' => 'A128CCM-64-64', + ]) ; - $container->set(ContentEncryption\A128CCM_64_128::class) - ->tag('jose.algorithm', ['alias' => 'A128CCM-64-128']) + $container->set(A128CCM_64_128::class) + ->tag('jose.algorithm', [ + 'alias' => 'A128CCM-64-128', + ]) ; - $container->set(ContentEncryption\A256CCM_16_64::class) - ->tag('jose.algorithm', ['alias' => 'A256CCM-16-64']) + $container->set(A256CCM_16_64::class) + ->tag('jose.algorithm', [ + 'alias' => 'A256CCM-16-64', + ]) ; - $container->set(ContentEncryption\A256CCM_16_128::class) - ->tag('jose.algorithm', ['alias' => 'A256CCM-16-128']) + $container->set(A256CCM_16_128::class) + ->tag('jose.algorithm', [ + 'alias' => 'A256CCM-16-128', + ]) ; - $container->set(ContentEncryption\A256CCM_64_64::class) - ->tag('jose.algorithm', ['alias' => 'A256CCM-64-64']) + $container->set(A256CCM_64_64::class) + ->tag('jose.algorithm', [ + 'alias' => 'A256CCM-64-64', + ]) ; - $container->set(ContentEncryption\A256CCM_64_128::class) - ->tag('jose.algorithm', ['alias' => 'A256CCM-64-128']) + $container->set(A256CCM_64_128::class) + ->tag('jose.algorithm', [ + 'alias' => 'A256CCM-64-128', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_experimental_chacha20_poly1305.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_experimental_chacha20_poly1305.php index 2228f30b..eb0c8fd7 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_experimental_chacha20_poly1305.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_experimental_chacha20_poly1305.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use Jose\Component\Encryption\Algorithm\KeyEncryption\Chacha20Poly1305; /* * The MIT License (MIT) * @@ -11,7 +12,6 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Algorithm\KeyEncryption; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; /* @@ -23,13 +23,16 @@ * ------------------------ */ return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(KeyEncryption\Chacha20Poly1305::class) - ->tag('jose.algorithm', ['alias' => 'chacha20-poly1305']) + $container->set(Chacha20Poly1305::class) + ->tag('jose.algorithm', [ + 'alias' => 'chacha20-poly1305', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_pbes2.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_pbes2.php index a05d2873..988ec56c 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_pbes2.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_pbes2.php @@ -2,6 +2,9 @@ declare(strict_types=1); +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS256A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS384A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS512A256KW; /* * The MIT License (MIT) * @@ -11,25 +14,31 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Algorithm\KeyEncryption; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(KeyEncryption\PBES2HS256A128KW::class) - ->tag('jose.algorithm', ['alias' => 'PBES2-HS256+A128KW']) + $container->set(PBES2HS256A128KW::class) + ->tag('jose.algorithm', [ + 'alias' => 'PBES2-HS256+A128KW', + ]) ; - $container->set(KeyEncryption\PBES2HS384A192KW::class) - ->tag('jose.algorithm', ['alias' => 'PBES2-HS384+A192KW']) + $container->set(PBES2HS384A192KW::class) + ->tag('jose.algorithm', [ + 'alias' => 'PBES2-HS384+A192KW', + ]) ; - $container->set(KeyEncryption\PBES2HS512A256KW::class) - ->tag('jose.algorithm', ['alias' => 'PBES2-HS512+A256KW']) + $container->set(PBES2HS512A256KW::class) + ->tag('jose.algorithm', [ + 'alias' => 'PBES2-HS512+A256KW', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_rsa.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_rsa.php index e7cc0b9a..7b91af98 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_rsa.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/encryption_rsa.php @@ -2,6 +2,9 @@ declare(strict_types=1); +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSA15; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP256; /* * The MIT License (MIT) * @@ -11,25 +14,31 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Algorithm\KeyEncryption; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(KeyEncryption\RSA15::class) - ->tag('jose.algorithm', ['alias' => 'RSA1_5']) + $container->set(RSA15::class) + ->tag('jose.algorithm', [ + 'alias' => 'RSA1_5', + ]) ; - $container->set(KeyEncryption\RSAOAEP::class) - ->tag('jose.algorithm', ['alias' => 'RSA-OAEP']) + $container->set(RSAOAEP::class) + ->tag('jose.algorithm', [ + 'alias' => 'RSA-OAEP', + ]) ; - $container->set(KeyEncryption\RSAOAEP256::class) - ->tag('jose.algorithm', ['alias' => 'RSA-OAEP-256']) + $container->set(RSAOAEP256::class) + ->tag('jose.algorithm', [ + 'alias' => 'RSA-OAEP-256', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_ecdsa.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_ecdsa.php index f12f776f..ce1c15dc 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_ecdsa.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_ecdsa.php @@ -2,6 +2,9 @@ declare(strict_types=1); +use Jose\Component\Signature\Algorithm\ES256; +use Jose\Component\Signature\Algorithm\ES384; +use Jose\Component\Signature\Algorithm\ES512; /* * The MIT License (MIT) * @@ -11,25 +14,31 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Signature\Algorithm; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Algorithm\ES256::class) - ->tag('jose.algorithm', ['alias' => 'ES256']) + $container->set(ES256::class) + ->tag('jose.algorithm', [ + 'alias' => 'ES256', + ]) ; - $container->set(Algorithm\ES384::class) - ->tag('jose.algorithm', ['alias' => 'ES384']) + $container->set(ES384::class) + ->tag('jose.algorithm', [ + 'alias' => 'ES384', + ]) ; - $container->set(Algorithm\ES512::class) - ->tag('jose.algorithm', ['alias' => 'ES512']) + $container->set(ES512::class) + ->tag('jose.algorithm', [ + 'alias' => 'ES512', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_eddsa.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_eddsa.php index 5152e89e..859f951d 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_eddsa.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_eddsa.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use Jose\Component\Signature\Algorithm\EdDSA; /* * The MIT License (MIT) * @@ -11,17 +12,19 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Signature\Algorithm; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Algorithm\EdDSA::class) - ->tag('jose.algorithm', ['alias' => 'EdDSA']) + $container->set(EdDSA::class) + ->tag('jose.algorithm', [ + 'alias' => 'EdDSA', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_experimental.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_experimental.php index fc464eaf..13abbe6f 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_experimental.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_experimental.php @@ -2,6 +2,10 @@ declare(strict_types=1); +use Jose\Component\Signature\Algorithm\ES256K; +use Jose\Component\Signature\Algorithm\HS1; +use Jose\Component\Signature\Algorithm\HS256_64; +use Jose\Component\Signature\Algorithm\RS1; /* * The MIT License (MIT) * @@ -11,7 +15,6 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Signature\Algorithm; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; /* @@ -23,25 +26,34 @@ * ------------------------ */ return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Algorithm\RS1::class) - ->tag('jose.algorithm', ['alias' => 'RS1']) + $container->set(RS1::class) + ->tag('jose.algorithm', [ + 'alias' => 'RS1', + ]) ; - $container->set(Algorithm\HS1::class) - ->tag('jose.algorithm', ['alias' => 'HS1']) + $container->set(HS1::class) + ->tag('jose.algorithm', [ + 'alias' => 'HS1', + ]) ; - $container->set(Algorithm\HS256_64::class) - ->tag('jose.algorithm', ['alias' => 'HS256/64']) + $container->set(HS256_64::class) + ->tag('jose.algorithm', [ + 'alias' => 'HS256/64', + ]) ; - $container->set(Algorithm\ES256K::class) - ->tag('jose.algorithm', ['alias' => 'ES256K']) + $container->set(ES256K::class) + ->tag('jose.algorithm', [ + 'alias' => 'ES256K', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_hmac.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_hmac.php index 8e4f032d..ad52d409 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_hmac.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_hmac.php @@ -2,6 +2,9 @@ declare(strict_types=1); +use Jose\Component\Signature\Algorithm\HS256; +use Jose\Component\Signature\Algorithm\HS384; +use Jose\Component\Signature\Algorithm\HS512; /* * The MIT License (MIT) * @@ -11,25 +14,31 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Signature\Algorithm; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Algorithm\HS256::class) - ->tag('jose.algorithm', ['alias' => 'HS256']) + $container->set(HS256::class) + ->tag('jose.algorithm', [ + 'alias' => 'HS256', + ]) ; - $container->set(Algorithm\HS384::class) - ->tag('jose.algorithm', ['alias' => 'HS384']) + $container->set(HS384::class) + ->tag('jose.algorithm', [ + 'alias' => 'HS384', + ]) ; - $container->set(Algorithm\HS512::class) - ->tag('jose.algorithm', ['alias' => 'HS512']) + $container->set(HS512::class) + ->tag('jose.algorithm', [ + 'alias' => 'HS512', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_none.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_none.php index 75188796..61fc8727 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_none.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_none.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use Jose\Component\Signature\Algorithm\None; /* * The MIT License (MIT) * @@ -11,17 +12,19 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Signature\Algorithm; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Algorithm\None::class) - ->tag('jose.algorithm', ['alias' => 'none']) + $container->set(None::class) + ->tag('jose.algorithm', [ + 'alias' => 'none', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_rsa.php b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_rsa.php index ccbb4462..79372acf 100644 --- a/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_rsa.php +++ b/src/Bundle/JoseFramework/Resources/config/Algorithms/signature_rsa.php @@ -2,6 +2,12 @@ declare(strict_types=1); +use Jose\Component\Signature\Algorithm\PS256; +use Jose\Component\Signature\Algorithm\PS384; +use Jose\Component\Signature\Algorithm\PS512; +use Jose\Component\Signature\Algorithm\RS256; +use Jose\Component\Signature\Algorithm\RS384; +use Jose\Component\Signature\Algorithm\RS512; /* * The MIT License (MIT) * @@ -11,37 +17,49 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Signature\Algorithm; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Algorithm\RS256::class) - ->tag('jose.algorithm', ['alias' => 'RS256']) + $container->set(RS256::class) + ->tag('jose.algorithm', [ + 'alias' => 'RS256', + ]) ; - $container->set(Algorithm\RS384::class) - ->tag('jose.algorithm', ['alias' => 'RS384']) + $container->set(RS384::class) + ->tag('jose.algorithm', [ + 'alias' => 'RS384', + ]) ; - $container->set(Algorithm\RS512::class) - ->tag('jose.algorithm', ['alias' => 'RS512']) + $container->set(RS512::class) + ->tag('jose.algorithm', [ + 'alias' => 'RS512', + ]) ; - $container->set(Algorithm\PS256::class) - ->tag('jose.algorithm', ['alias' => 'PS256']) + $container->set(PS256::class) + ->tag('jose.algorithm', [ + 'alias' => 'PS256', + ]) ; - $container->set(Algorithm\PS384::class) - ->tag('jose.algorithm', ['alias' => 'PS384']) + $container->set(PS384::class) + ->tag('jose.algorithm', [ + 'alias' => 'PS384', + ]) ; - $container->set(Algorithm\PS512::class) - ->tag('jose.algorithm', ['alias' => 'PS512']) + $container->set(PS512::class) + ->tag('jose.algorithm', [ + 'alias' => 'PS512', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/analyzers.php b/src/Bundle/JoseFramework/Resources/config/analyzers.php index 5e18c168..e2b04d16 100644 --- a/src/Bundle/JoseFramework/Resources/config/analyzers.php +++ b/src/Bundle/JoseFramework/Resources/config/analyzers.php @@ -2,6 +2,22 @@ declare(strict_types=1); +use Jose\Component\Core\Util\Ecc\NistCurve; +use Jose\Component\KeyManagement\Analyzer\AlgorithmAnalyzer; +use Jose\Component\KeyManagement\Analyzer\ES256KeyAnalyzer; +use Jose\Component\KeyManagement\Analyzer\ES384KeyAnalyzer; +use Jose\Component\KeyManagement\Analyzer\ES512KeyAnalyzer; +use Jose\Component\KeyManagement\Analyzer\HS256KeyAnalyzer; +use Jose\Component\KeyManagement\Analyzer\HS384KeyAnalyzer; +use Jose\Component\KeyManagement\Analyzer\HS512KeyAnalyzer; +use Jose\Component\KeyManagement\Analyzer\KeyAnalyzerManager; +use Jose\Component\KeyManagement\Analyzer\KeyIdentifierAnalyzer; +use Jose\Component\KeyManagement\Analyzer\KeysetAnalyzerManager; +use Jose\Component\KeyManagement\Analyzer\MixedKeyTypes; +use Jose\Component\KeyManagement\Analyzer\MixedPublicAndPrivateKeys; +use Jose\Component\KeyManagement\Analyzer\NoneAnalyzer; +use Jose\Component\KeyManagement\Analyzer\OctAnalyzer; +use Jose\Component\KeyManagement\Analyzer\UsageAnalyzer; /* * The MIT License (MIT) * @@ -11,44 +27,44 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Core\Util\Ecc\NistCurve; -use Jose\Component\KeyManagement\Analyzer; +use Jose\Component\KeyManagement\Analyzer\ZxcvbnKeyAnalyzer; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use ZxcvbnPhp\Zxcvbn; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Analyzer\KeyAnalyzerManager::class) + $container->set(KeyAnalyzerManager::class) ->public() ; - $container->set(Analyzer\KeysetAnalyzerManager::class) + $container->set(KeysetAnalyzerManager::class) ->public() ; - $container->set(Analyzer\AlgorithmAnalyzer::class); - $container->set(Analyzer\UsageAnalyzer::class); - $container->set(Analyzer\KeyIdentifierAnalyzer::class); - $container->set(Analyzer\NoneAnalyzer::class); - $container->set(Analyzer\OctAnalyzer::class); - $container->set(Analyzer\MixedKeyTypes::class); - $container->set(Analyzer\MixedPublicAndPrivateKeys::class); - $container->set(Analyzer\HS256KeyAnalyzer::class); - $container->set(Analyzer\HS384KeyAnalyzer::class); - $container->set(Analyzer\HS512KeyAnalyzer::class); + $container->set(AlgorithmAnalyzer::class); + $container->set(UsageAnalyzer::class); + $container->set(KeyIdentifierAnalyzer::class); + $container->set(NoneAnalyzer::class); + $container->set(OctAnalyzer::class); + $container->set(MixedKeyTypes::class); + $container->set(MixedPublicAndPrivateKeys::class); + $container->set(HS256KeyAnalyzer::class); + $container->set(HS384KeyAnalyzer::class); + $container->set(HS512KeyAnalyzer::class); if (class_exists(NistCurve::class)) { - $container->set(Analyzer\ES256KeyAnalyzer::class); - $container->set(Analyzer\ES384KeyAnalyzer::class); - $container->set(Analyzer\ES512KeyAnalyzer::class); + $container->set(ES256KeyAnalyzer::class); + $container->set(ES384KeyAnalyzer::class); + $container->set(ES512KeyAnalyzer::class); } if (class_exists(Zxcvbn::class)) { - $container->set(Analyzer\ZxcvbnKeyAnalyzer::class); + $container->set(ZxcvbnKeyAnalyzer::class); } }; diff --git a/src/Bundle/JoseFramework/Resources/config/checkers.php b/src/Bundle/JoseFramework/Resources/config/checkers.php index cbb02e7f..814b84f2 100644 --- a/src/Bundle/JoseFramework/Resources/config/checkers.php +++ b/src/Bundle/JoseFramework/Resources/config/checkers.php @@ -2,6 +2,11 @@ declare(strict_types=1); +use Jose\Bundle\JoseFramework\Services\ClaimCheckerManagerFactory; +use Jose\Bundle\JoseFramework\Services\HeaderCheckerManagerFactory; +use Jose\Component\Checker\ExpirationTimeChecker; +use Jose\Component\Checker\IssuedAtChecker; +use Jose\Component\Checker\NotBeforeChecker; /* * The MIT License (MIT) * @@ -11,34 +16,39 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Bundle\JoseFramework\Services; -use Jose\Component\Checker; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Services\HeaderCheckerManagerFactory::class) + $container->set(HeaderCheckerManagerFactory::class) ->public() ; - $container->set(Services\ClaimCheckerManagerFactory::class) + $container->set(ClaimCheckerManagerFactory::class) ->public() ; - $container->set(Checker\ExpirationTimeChecker::class) - ->tag('jose.checker.claim', ['alias' => 'exp']) + $container->set(ExpirationTimeChecker::class) + ->tag('jose.checker.claim', [ + 'alias' => 'exp', + ]) ; - $container->set(Checker\IssuedAtChecker::class) - ->tag('jose.checker.claim', ['alias' => 'iat']) + $container->set(IssuedAtChecker::class) + ->tag('jose.checker.claim', [ + 'alias' => 'iat', + ]) ; - $container->set(Checker\NotBeforeChecker::class) - ->tag('jose.checker.claim', ['alias' => 'nbf']) + $container->set(NotBeforeChecker::class) + ->tag('jose.checker.claim', [ + 'alias' => 'nbf', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/commands.php b/src/Bundle/JoseFramework/Resources/config/commands.php index 5299c33e..e6660562 100644 --- a/src/Bundle/JoseFramework/Resources/config/commands.php +++ b/src/Bundle/JoseFramework/Resources/config/commands.php @@ -2,6 +2,29 @@ declare(strict_types=1); +use Jose\Component\Console\AddKeyIntoKeysetCommand; +use Jose\Component\Console\EcKeyGeneratorCommand; +use Jose\Component\Console\EcKeysetGeneratorCommand; +use Jose\Component\Console\GetThumbprintCommand; +use Jose\Component\Console\KeyAnalyzerCommand; +use Jose\Component\Console\KeyFileLoaderCommand; +use Jose\Component\Console\KeysetAnalyzerCommand; +use Jose\Component\Console\MergeKeysetCommand; +use Jose\Component\Console\NoneKeyGeneratorCommand; +use Jose\Component\Console\OctKeyGeneratorCommand; +use Jose\Component\Console\OctKeysetGeneratorCommand; +use Jose\Component\Console\OkpKeyGeneratorCommand; +use Jose\Component\Console\OkpKeysetGeneratorCommand; +use Jose\Component\Console\OptimizeRsaKeyCommand; +use Jose\Component\Console\P12CertificateLoaderCommand; +use Jose\Component\Console\PemConverterCommand; +use Jose\Component\Console\PublicKeyCommand; +use Jose\Component\Console\PublicKeysetCommand; +use Jose\Component\Console\RotateKeysetCommand; +use Jose\Component\Console\RsaKeyGeneratorCommand; +use Jose\Component\Console\RsaKeysetGeneratorCommand; +use Jose\Component\Console\SecretKeyGeneratorCommand; +use Jose\Component\Console\X509CertificateLoaderCommand; /* * The MIT License (MIT) * @@ -11,37 +34,37 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Console; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Console\AddKeyIntoKeysetCommand::class); - $container->set(Console\EcKeyGeneratorCommand::class); - $container->set(Console\EcKeysetGeneratorCommand::class); - $container->set(Console\GetThumbprintCommand::class); - $container->set(Console\OptimizeRsaKeyCommand::class); - $container->set(Console\KeyAnalyzerCommand::class); - $container->set(Console\KeyFileLoaderCommand::class); - $container->set(Console\KeysetAnalyzerCommand::class); - $container->set(Console\MergeKeysetCommand::class); - $container->set(Console\NoneKeyGeneratorCommand::class); - $container->set(Console\OctKeyGeneratorCommand::class); - $container->set(Console\OctKeysetGeneratorCommand::class); - $container->set(Console\OkpKeyGeneratorCommand::class); - $container->set(Console\OkpKeysetGeneratorCommand::class); - $container->set(Console\P12CertificateLoaderCommand::class); - $container->set(Console\PemConverterCommand::class); - $container->set(Console\PublicKeyCommand::class); - $container->set(Console\PublicKeysetCommand::class); - $container->set(Console\RotateKeysetCommand::class); - $container->set(Console\RsaKeyGeneratorCommand::class); - $container->set(Console\RsaKeysetGeneratorCommand::class); - $container->set(Console\SecretKeyGeneratorCommand::class); - $container->set(Console\X509CertificateLoaderCommand::class); + $container->set(AddKeyIntoKeysetCommand::class); + $container->set(EcKeyGeneratorCommand::class); + $container->set(EcKeysetGeneratorCommand::class); + $container->set(GetThumbprintCommand::class); + $container->set(OptimizeRsaKeyCommand::class); + $container->set(KeyAnalyzerCommand::class); + $container->set(KeyFileLoaderCommand::class); + $container->set(KeysetAnalyzerCommand::class); + $container->set(MergeKeysetCommand::class); + $container->set(NoneKeyGeneratorCommand::class); + $container->set(OctKeyGeneratorCommand::class); + $container->set(OctKeysetGeneratorCommand::class); + $container->set(OkpKeyGeneratorCommand::class); + $container->set(OkpKeysetGeneratorCommand::class); + $container->set(P12CertificateLoaderCommand::class); + $container->set(PemConverterCommand::class); + $container->set(PublicKeyCommand::class); + $container->set(PublicKeysetCommand::class); + $container->set(RotateKeysetCommand::class); + $container->set(RsaKeyGeneratorCommand::class); + $container->set(RsaKeysetGeneratorCommand::class); + $container->set(SecretKeyGeneratorCommand::class); + $container->set(X509CertificateLoaderCommand::class); }; diff --git a/src/Bundle/JoseFramework/Resources/config/compression_methods.php b/src/Bundle/JoseFramework/Resources/config/compression_methods.php index 9ff5bb20..98cf53b4 100644 --- a/src/Bundle/JoseFramework/Resources/config/compression_methods.php +++ b/src/Bundle/JoseFramework/Resources/config/compression_methods.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Jose\Component\Encryption\Compression\CompressionMethodManagerFactory; +use Jose\Component\Encryption\Compression\Deflate; /* * The MIT License (MIT) * @@ -11,21 +13,23 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Compression; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Compression\CompressionMethodManagerFactory::class) + $container->set(CompressionMethodManagerFactory::class) ->public() ; - $container->set(Compression\Deflate::class) - ->tag('jose.compression_method', ['alias' => 'DEF']) + $container->set(Deflate::class) + ->tag('jose.compression_method', [ + 'alias' => 'DEF', + ]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/dev_services.php b/src/Bundle/JoseFramework/Resources/config/dev_services.php index f47b562d..792ba456 100644 --- a/src/Bundle/JoseFramework/Resources/config/dev_services.php +++ b/src/Bundle/JoseFramework/Resources/config/dev_services.php @@ -2,6 +2,12 @@ declare(strict_types=1); +use Jose\Bundle\JoseFramework\DataCollector\AlgorithmCollector; +use Jose\Bundle\JoseFramework\DataCollector\CheckerCollector; +use Jose\Bundle\JoseFramework\DataCollector\JoseCollector; +use Jose\Bundle\JoseFramework\DataCollector\JWECollector; +use Jose\Bundle\JoseFramework\DataCollector\JWSCollector; +use Jose\Bundle\JoseFramework\DataCollector\KeyCollector; /* * The MIT License (MIT) * @@ -11,26 +17,26 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Bundle\JoseFramework\DataCollector; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(DataCollector\JoseCollector::class) + $container->set(JoseCollector::class) ->tag('data_collector', [ 'id' => 'jose_collector', 'template' => '@JoseFramework/data_collector/template.html.twig', ]) ; - $container->set(DataCollector\AlgorithmCollector::class); - $container->set(DataCollector\CheckerCollector::class); - $container->set(DataCollector\JWECollector::class); - $container->set(DataCollector\JWSCollector::class); - $container->set(DataCollector\KeyCollector::class); + $container->set(AlgorithmCollector::class); + $container->set(CheckerCollector::class); + $container->set(JWECollector::class); + $container->set(JWSCollector::class); + $container->set(KeyCollector::class); }; diff --git a/src/Bundle/JoseFramework/Resources/config/env_var.php b/src/Bundle/JoseFramework/Resources/config/env_var.php index 01e91307..d0939a93 100644 --- a/src/Bundle/JoseFramework/Resources/config/env_var.php +++ b/src/Bundle/JoseFramework/Resources/config/env_var.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use Jose\Bundle\JoseFramework\EnvVarProcessor\KeyEnvVarProcessor; /* * The MIT License (MIT) * @@ -11,15 +12,15 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Bundle\JoseFramework\EnvVarProcessor; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(EnvVarProcessor\KeyEnvVarProcessor::class); + $container->set(KeyEnvVarProcessor::class); }; diff --git a/src/Bundle/JoseFramework/Resources/config/jku_commands.php b/src/Bundle/JoseFramework/Resources/config/jku_commands.php index 194a19af..c9f31814 100644 --- a/src/Bundle/JoseFramework/Resources/config/jku_commands.php +++ b/src/Bundle/JoseFramework/Resources/config/jku_commands.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Jose\Component\Console\JKULoaderCommand; +use Jose\Component\Console\X5ULoaderCommand; /* * The MIT License (MIT) * @@ -11,16 +13,16 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Console; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Console\JKULoaderCommand::class); - $container->set(Console\X5ULoaderCommand::class); + $container->set(JKULoaderCommand::class); + $container->set(X5ULoaderCommand::class); }; diff --git a/src/Bundle/JoseFramework/Resources/config/jku_source.php b/src/Bundle/JoseFramework/Resources/config/jku_source.php index d6ab6e31..fa784f5a 100644 --- a/src/Bundle/JoseFramework/Resources/config/jku_source.php +++ b/src/Bundle/JoseFramework/Resources/config/jku_source.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Jose\Component\KeyManagement\JKUFactory; +use Jose\Component\KeyManagement\X5UFactory; /* * The MIT License (MIT) * @@ -11,38 +13,24 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\KeyManagement; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; -use function Symfony\Component\DependencyInjection\Loader\Configurator\ref; -use Symfony\Component\DependencyInjection\Loader\Configurator\ReferenceConfigurator; use function Symfony\Component\DependencyInjection\Loader\Configurator\service; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $serviceClosure = static function (string $serviceId): ReferenceConfigurator { - return function_exists('Symfony\Component\DependencyInjection\Loader\Configurator\service') - ? service($serviceId) - : ref($serviceId); - }; - - $container->set(KeyManagement\JKUFactory::class) + $container->set(JKUFactory::class) ->public() - ->args([ - ($serviceClosure)('jose.http_client'), - ($serviceClosure)('jose.request_factory'), - ]) + ->args([service('jose.http_client'), service('jose.request_factory')]) ; - $container->set(KeyManagement\X5UFactory::class) + $container->set(X5UFactory::class) ->public() - ->args([ - ($serviceClosure)('jose.http_client'), - ($serviceClosure)('jose.request_factory'), - ]) + ->args([service('jose.http_client'), service('jose.request_factory')]) ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/jwe_serializers.php b/src/Bundle/JoseFramework/Resources/config/jwe_serializers.php index 3d074534..b310e3a5 100644 --- a/src/Bundle/JoseFramework/Resources/config/jwe_serializers.php +++ b/src/Bundle/JoseFramework/Resources/config/jwe_serializers.php @@ -2,6 +2,10 @@ declare(strict_types=1); +use Jose\Component\Encryption\Serializer\CompactSerializer; +use Jose\Component\Encryption\Serializer\JSONFlattenedSerializer; +use Jose\Component\Encryption\Serializer\JSONGeneralSerializer; +use Jose\Component\Encryption\Serializer\JWESerializerManagerFactory; /* * The MIT License (MIT) * @@ -11,21 +15,21 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Encryption\Serializer; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Serializer\JWESerializerManagerFactory::class) + $container->set(JWESerializerManagerFactory::class) ->public() ; - $container->set(Serializer\CompactSerializer::class); - $container->set(Serializer\JSONFlattenedSerializer::class); - $container->set(Serializer\JSONGeneralSerializer::class); + $container->set(CompactSerializer::class); + $container->set(JSONFlattenedSerializer::class); + $container->set(JSONGeneralSerializer::class); }; diff --git a/src/Bundle/JoseFramework/Resources/config/jwe_services.php b/src/Bundle/JoseFramework/Resources/config/jwe_services.php index 758696e8..f62a7569 100644 --- a/src/Bundle/JoseFramework/Resources/config/jwe_services.php +++ b/src/Bundle/JoseFramework/Resources/config/jwe_services.php @@ -2,6 +2,10 @@ declare(strict_types=1); +use Jose\Bundle\JoseFramework\Services\JWEBuilderFactory; +use Jose\Bundle\JoseFramework\Services\JWEDecrypterFactory; +use Jose\Bundle\JoseFramework\Services\JWELoaderFactory; +use Jose\Component\Encryption\JWETokenSupport; /* * The MIT License (MIT) * @@ -11,28 +15,27 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Bundle\JoseFramework\Services; -use Jose\Component\Encryption; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Services\JWEBuilderFactory::class) + $container->set(JWEBuilderFactory::class) ->public() ; - $container->set(Services\JWEDecrypterFactory::class) + $container->set(JWEDecrypterFactory::class) ->public() ; - $container->set(Services\JWELoaderFactory::class) + $container->set(JWELoaderFactory::class) ->public() ; - $container->set(Encryption\JWETokenSupport::class); + $container->set(JWETokenSupport::class); }; diff --git a/src/Bundle/JoseFramework/Resources/config/jwk_factory.php b/src/Bundle/JoseFramework/Resources/config/jwk_factory.php index 754c6981..ed8c4413 100644 --- a/src/Bundle/JoseFramework/Resources/config/jwk_factory.php +++ b/src/Bundle/JoseFramework/Resources/config/jwk_factory.php @@ -2,20 +2,12 @@ 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. - */ - use Jose\Component\KeyManagement\JWKFactory; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() diff --git a/src/Bundle/JoseFramework/Resources/config/jwk_services.php b/src/Bundle/JoseFramework/Resources/config/jwk_services.php index 3198ec18..25008a69 100644 --- a/src/Bundle/JoseFramework/Resources/config/jwk_services.php +++ b/src/Bundle/JoseFramework/Resources/config/jwk_services.php @@ -2,21 +2,13 @@ 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. - */ - use Jose\Bundle\JoseFramework\Controller\JWKSetControllerFactory; use Jose\Bundle\JoseFramework\Routing\JWKSetLoader; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() diff --git a/src/Bundle/JoseFramework/Resources/config/jwk_sources.php b/src/Bundle/JoseFramework/Resources/config/jwk_sources.php index f5db7f7a..22ae1c02 100644 --- a/src/Bundle/JoseFramework/Resources/config/jwk_sources.php +++ b/src/Bundle/JoseFramework/Resources/config/jwk_sources.php @@ -2,6 +2,14 @@ declare(strict_types=1); +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource\CertificateFile; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource\JWK; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource\JWKSet; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource\KeyFile; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource\P12; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource\Secret; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource\Values; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource\X5C; /* * The MIT License (MIT) * @@ -11,22 +19,22 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSource; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->public() ->autoconfigure() ->autowire() ; - $container->set(JWKSource\KeyFile::class); - $container->set(JWKSource\P12::class); - $container->set(JWKSource\CertificateFile::class); - $container->set(JWKSource\Values::class); - $container->set(JWKSource\Secret::class); - $container->set(JWKSource\JWK::class); - $container->set(JWKSource\X5C::class); - $container->set(JWKSource\JWKSet::class); + $container->set(KeyFile::class); + $container->set(P12::class); + $container->set(CertificateFile::class); + $container->set(Values::class); + $container->set(Secret::class); + $container->set(JWK::class); + $container->set(X5C::class); + $container->set(JWKSet::class); }; diff --git a/src/Bundle/JoseFramework/Resources/config/jwkset_sources.php b/src/Bundle/JoseFramework/Resources/config/jwkset_sources.php index ffa04985..25a63948 100644 --- a/src/Bundle/JoseFramework/Resources/config/jwkset_sources.php +++ b/src/Bundle/JoseFramework/Resources/config/jwkset_sources.php @@ -2,6 +2,9 @@ declare(strict_types=1); +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSetSource\JKU; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSetSource\JWKSet; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSetSource\X5U; /* * The MIT License (MIT) * @@ -11,17 +14,17 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\JWKSetSource; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->public() ->autoconfigure() ->autowire() ; - $container->set(JWKSetSource\JWKSet::class); - $container->set(JWKSetSource\JKU::class); - $container->set(JWKSetSource\X5U::class); + $container->set(JWKSet::class); + $container->set(JKU::class); + $container->set(X5U::class); }; diff --git a/src/Bundle/JoseFramework/Resources/config/jws_serializers.php b/src/Bundle/JoseFramework/Resources/config/jws_serializers.php index c3b918d1..849eed88 100644 --- a/src/Bundle/JoseFramework/Resources/config/jws_serializers.php +++ b/src/Bundle/JoseFramework/Resources/config/jws_serializers.php @@ -2,6 +2,10 @@ declare(strict_types=1); +use Jose\Component\Signature\Serializer\CompactSerializer; +use Jose\Component\Signature\Serializer\JSONFlattenedSerializer; +use Jose\Component\Signature\Serializer\JSONGeneralSerializer; +use Jose\Component\Signature\Serializer\JWSSerializerManagerFactory; /* * The MIT License (MIT) * @@ -11,21 +15,21 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Component\Signature\Serializer; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Serializer\JWSSerializerManagerFactory::class) + $container->set(JWSSerializerManagerFactory::class) ->public() ; - $container->set(Serializer\CompactSerializer::class); - $container->set(Serializer\JSONFlattenedSerializer::class); - $container->set(Serializer\JSONGeneralSerializer::class); + $container->set(CompactSerializer::class); + $container->set(JSONFlattenedSerializer::class); + $container->set(JSONGeneralSerializer::class); }; diff --git a/src/Bundle/JoseFramework/Resources/config/jws_services.php b/src/Bundle/JoseFramework/Resources/config/jws_services.php index fafad44f..88224487 100644 --- a/src/Bundle/JoseFramework/Resources/config/jws_services.php +++ b/src/Bundle/JoseFramework/Resources/config/jws_services.php @@ -2,6 +2,10 @@ declare(strict_types=1); +use Jose\Bundle\JoseFramework\Services\JWSBuilderFactory; +use Jose\Bundle\JoseFramework\Services\JWSLoaderFactory; +use Jose\Bundle\JoseFramework\Services\JWSVerifierFactory; +use Jose\Component\Signature\JWSTokenSupport; /* * The MIT License (MIT) * @@ -11,28 +15,27 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Bundle\JoseFramework\Services; -use Jose\Component\Signature; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Services\JWSBuilderFactory::class) + $container->set(JWSBuilderFactory::class) ->public() ; - $container->set(Services\JWSVerifierFactory::class) + $container->set(JWSVerifierFactory::class) ->public() ; - $container->set(Services\JWSLoaderFactory::class) + $container->set(JWSLoaderFactory::class) ->public() ; - $container->set(Signature\JWSTokenSupport::class); + $container->set(JWSTokenSupport::class); }; diff --git a/src/Bundle/JoseFramework/Resources/config/nested_token.php b/src/Bundle/JoseFramework/Resources/config/nested_token.php index b436043d..cc2865cd 100644 --- a/src/Bundle/JoseFramework/Resources/config/nested_token.php +++ b/src/Bundle/JoseFramework/Resources/config/nested_token.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Jose\Bundle\JoseFramework\Services\NestedTokenBuilderFactory; +use Jose\Bundle\JoseFramework\Services\NestedTokenLoaderFactory; /* * The MIT License (MIT) * @@ -11,21 +13,21 @@ * of the MIT license. See the LICENSE file for details. */ -use Jose\Bundle\JoseFramework\Services; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; - $container->set(Services\NestedTokenBuilderFactory::class) + $container->set(NestedTokenBuilderFactory::class) ->public() ; - $container->set(Services\NestedTokenLoaderFactory::class) + $container->set(NestedTokenLoaderFactory::class) ->public() ; }; diff --git a/src/Bundle/JoseFramework/Resources/config/routing/jwkset_controller.php b/src/Bundle/JoseFramework/Resources/config/routing/jwkset_controller.php index 3a0c9165..85580b1b 100644 --- a/src/Bundle/JoseFramework/Resources/config/routing/jwkset_controller.php +++ b/src/Bundle/JoseFramework/Resources/config/routing/jwkset_controller.php @@ -2,15 +2,6 @@ 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. - */ - use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; return function (RoutingConfigurator $routes): void { diff --git a/src/Bundle/JoseFramework/Resources/config/services.php b/src/Bundle/JoseFramework/Resources/config/services.php index 7ff246c1..b1a5fe2e 100644 --- a/src/Bundle/JoseFramework/Resources/config/services.php +++ b/src/Bundle/JoseFramework/Resources/config/services.php @@ -2,20 +2,12 @@ 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. - */ - use Jose\Component\Core\AlgorithmManagerFactory; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container): void { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() diff --git a/src/Bundle/JoseFramework/Routing/JWKSetLoader.php b/src/Bundle/JoseFramework/Routing/JWKSetLoader.php index 29d74f84..8553bc2d 100644 --- a/src/Bundle/JoseFramework/Routing/JWKSetLoader.php +++ b/src/Bundle/JoseFramework/Routing/JWKSetLoader.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Routing; use Symfony\Component\Config\Loader\LoaderInterface; @@ -20,10 +11,7 @@ final class JWKSetLoader implements LoaderInterface { - /** - * @var RouteCollection - */ - private $routes; + private RouteCollection $routes; public function __construct() { @@ -32,7 +20,9 @@ public function __construct() public function add(string $pattern, string $name): void { - $defaults = ['_controller' => $name]; + $defaults = [ + '_controller' => $name, + ]; $route = new Route($pattern, $defaults); $this->routes->add(sprintf('jwkset_%s', $name), $route); } @@ -50,7 +40,7 @@ public function load($resource, $type = null): RouteCollection */ public function supports($resource, $type = null): bool { - return 'jwkset' === $type; + return $type === 'jwkset'; } public function getResolver(): void diff --git a/src/Bundle/JoseFramework/Serializer/JWEEncoder.php b/src/Bundle/JoseFramework/Serializer/JWEEncoder.php index 45b1c333..27017e76 100644 --- a/src/Bundle/JoseFramework/Serializer/JWEEncoder.php +++ b/src/Bundle/JoseFramework/Serializer/JWEEncoder.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Serializer; use Exception; @@ -27,16 +18,13 @@ final class JWEEncoder implements EncoderInterface, DecoderInterface { - /** - * @var JWESerializerManager - */ - private $serializerManager; + private ?JWESerializerManager $serializerManager; public function __construct( JWESerializerManagerFactory $serializerManagerFactory, ?JWESerializerManager $serializerManager = null ) { - if (null === $serializerManager) { + if ($serializerManager === null) { $serializerManager = $serializerManagerFactory->create($serializerManagerFactory->names()); } $this->serializerManager = $serializerManager; @@ -52,17 +40,14 @@ public function supportsDecoding($format): bool return $this->supportsEncoding($format); } - /** - * @param mixed $data - * @param mixed $format - * - * @throws NotEncodableValueException if the data cannot be encoded - * @throws UnexpectedValueException if the data cannot be encoded - */ public function encode($data, $format, array $context = []): string { try { - return $this->serializerManager->serialize(mb_strtolower($format), $data, $this->getRecipientIndex($context)); + return $this->serializerManager->serialize( + mb_strtolower($format), + $data, + $this->getRecipientIndex($context) + ); } catch (Throwable $ex) { $message = sprintf('Cannot encode JWE to %s format.', $format); @@ -74,13 +59,6 @@ public function encode($data, $format, array $context = []): string } } - /** - * @param mixed $data - * @param mixed $format - * - * @throws NotEncodableValueException if the data cannot be decoded - * @throws UnexpectedValueException if the data cannot be decoded - */ public function decode($data, $format, array $context = []): JWE { try { diff --git a/src/Bundle/JoseFramework/Serializer/JWSEncoder.php b/src/Bundle/JoseFramework/Serializer/JWSEncoder.php index 6c6921b2..e852bfe0 100644 --- a/src/Bundle/JoseFramework/Serializer/JWSEncoder.php +++ b/src/Bundle/JoseFramework/Serializer/JWSEncoder.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Serializer; use Exception; @@ -26,16 +17,13 @@ final class JWSEncoder implements EncoderInterface, DecoderInterface { - /** - * @var JWSSerializerManager - */ - private $serializerManager; + private ?JWSSerializerManager $serializerManager; public function __construct( JWSSerializerManagerFactory $serializerManagerFactory, ?JWSSerializerManager $serializerManager = null ) { - if (null === $serializerManager) { + if ($serializerManager === null) { $serializerManager = $serializerManagerFactory->create($serializerManagerFactory->names()); } $this->serializerManager = $serializerManager; @@ -51,17 +39,14 @@ public function supportsDecoding($format): bool return $this->supportsEncoding($format); } - /** - * @param mixed $data - * @param mixed $format - * - * @throws NotEncodableValueException if the data cannot be encoded - * @throws UnexpectedValueException if the data cannot be encoded - */ public function encode($data, $format, array $context = []): string { try { - return $this->serializerManager->serialize(mb_strtolower($format), $data, $this->getSignatureIndex($context)); + return $this->serializerManager->serialize( + mb_strtolower($format), + $data, + $this->getSignatureIndex($context) + ); } catch (Exception $ex) { $message = sprintf('Cannot encode JWS to %s format.', $format); if (class_exists('Symfony\Component\Serializer\Exception\NotEncodableValueException')) { @@ -72,13 +57,6 @@ public function encode($data, $format, array $context = []): string } } - /** - * @param mixed $data - * @param mixed $format - * - * @throws NotEncodableValueException if the data cannot be decoded - * @throws UnexpectedValueException if the data cannot be decoded - */ public function decode($data, $format, array $context = []): JWS { try { diff --git a/src/Bundle/JoseFramework/Services/ClaimCheckerManager.php b/src/Bundle/JoseFramework/Services/ClaimCheckerManager.php index 4c186ebb..cb6f13a4 100644 --- a/src/Bundle/JoseFramework/Services/ClaimCheckerManager.php +++ b/src/Bundle/JoseFramework/Services/ClaimCheckerManager.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Bundle\JoseFramework\Event\ClaimCheckedFailureEvent; @@ -21,15 +12,11 @@ final class ClaimCheckerManager extends BaseClaimCheckerManager { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct($checkers, EventDispatcherInterface $eventDispatcher) - { + public function __construct( + $checkers, + private EventDispatcherInterface $eventDispatcher + ) { parent::__construct($checkers); - $this->eventDispatcher = $eventDispatcher; } public function check(array $claims, array $mandatoryClaims = []): array @@ -42,9 +29,7 @@ public function check(array $claims, array $mandatoryClaims = []): array return $checkedClaims; } catch (Throwable $throwable) { - $this->eventDispatcher->dispatch( - new ClaimCheckedFailureEvent($claims, $mandatoryClaims, $throwable) - ); + $this->eventDispatcher->dispatch(new ClaimCheckedFailureEvent($claims, $mandatoryClaims, $throwable)); throw $throwable; } diff --git a/src/Bundle/JoseFramework/Services/ClaimCheckerManagerFactory.php b/src/Bundle/JoseFramework/Services/ClaimCheckerManagerFactory.php index 14a68348..34493b69 100644 --- a/src/Bundle/JoseFramework/Services/ClaimCheckerManagerFactory.php +++ b/src/Bundle/JoseFramework/Services/ClaimCheckerManagerFactory.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use InvalidArgumentException; @@ -19,24 +10,19 @@ final class ClaimCheckerManagerFactory { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - /** * @var ClaimChecker[] */ private $checkers = []; - public function __construct(EventDispatcherInterface $eventDispatcher) - { - $this->eventDispatcher = $eventDispatcher; + public function __construct( + private EventDispatcherInterface $eventDispatcher + ) { } /** - * This method creates a Claim Checker Manager and populate it with the claim checkers found based on the alias. - * If the alias is not supported, an InvalidArgumentException is thrown. + * This method creates a Claim Checker Manager and populate it with the claim checkers found based on the alias. If + * the alias is not supported, an InvalidArgumentException is thrown. * * @param string[] $aliases */ @@ -44,8 +30,11 @@ public function create(array $aliases): ClaimCheckerManager { $checkers = []; foreach ($aliases as $alias) { - if (!isset($this->checkers[$alias])) { - throw new InvalidArgumentException(sprintf('The claim checker with the alias "%s" is not supported.', $alias)); + if (! isset($this->checkers[$alias])) { + throw new InvalidArgumentException(sprintf( + 'The claim checker with the alias "%s" is not supported.', + $alias + )); } $checkers[] = $this->checkers[$alias]; } diff --git a/src/Bundle/JoseFramework/Services/HeaderCheckerManager.php b/src/Bundle/JoseFramework/Services/HeaderCheckerManager.php index d1d88c62..175a2ab3 100644 --- a/src/Bundle/JoseFramework/Services/HeaderCheckerManager.php +++ b/src/Bundle/JoseFramework/Services/HeaderCheckerManager.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Bundle\JoseFramework\Event\HeaderCheckedFailureEvent; @@ -22,20 +13,14 @@ final class HeaderCheckerManager extends BaseHeaderCheckerManager { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct(array $checkers, array $tokenTypes, EventDispatcherInterface $eventDispatcher) - { + public function __construct( + array $checkers, + array $tokenTypes, + private EventDispatcherInterface $eventDispatcher + ) { parent::__construct($checkers, $tokenTypes); - $this->eventDispatcher = $eventDispatcher; } - /** - * @throws Throwable if a checker failed to verify a header parameter - */ public function check(JWT $jwt, int $index, array $mandatoryHeaderParameters = []): void { try { diff --git a/src/Bundle/JoseFramework/Services/HeaderCheckerManagerFactory.php b/src/Bundle/JoseFramework/Services/HeaderCheckerManagerFactory.php index 41f2238e..6c711349 100644 --- a/src/Bundle/JoseFramework/Services/HeaderCheckerManagerFactory.php +++ b/src/Bundle/JoseFramework/Services/HeaderCheckerManagerFactory.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use InvalidArgumentException; @@ -20,11 +11,6 @@ final class HeaderCheckerManagerFactory { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - /** * @var HeaderChecker[] */ @@ -33,27 +19,28 @@ final class HeaderCheckerManagerFactory /** * @var TokenTypeSupport[] */ - private $tokenTypes = []; + private array $tokenTypes = []; - public function __construct(EventDispatcherInterface $eventDispatcher) - { - $this->eventDispatcher = $eventDispatcher; + public function __construct( + private EventDispatcherInterface $eventDispatcher + ) { } /** - * This method creates a Header Checker Manager and populate it with the header parameter checkers found based on the alias. - * If the alias is not supported, an InvalidArgumentException is thrown. + * This method creates a Header Checker Manager and populate it with the header parameter checkers found based on + * the alias. If the alias is not supported, an InvalidArgumentException is thrown. * * @param string[] $aliases - * - * @throws InvalidArgumentException if an alias is not supported */ public function create(array $aliases): HeaderCheckerManager { $checkers = []; foreach ($aliases as $alias) { - if (!isset($this->checkers[$alias])) { - throw new InvalidArgumentException(sprintf('The header checker with the alias "%s" is not supported.', $alias)); + if (! isset($this->checkers[$alias])) { + throw new InvalidArgumentException(sprintf( + 'The header checker with the alias "%s" is not supported.', + $alias + )); } $checkers[] = $this->checkers[$alias]; } @@ -62,9 +49,8 @@ public function create(array $aliases): HeaderCheckerManager } /** - * This method adds a header parameter checker to this factory. - * The checker is uniquely identified by an alias. This allows the same header parameter checker to be added twice (or more) - * using several configuration options. + * This method adds a header parameter checker to this factory. The checker is uniquely identified by an alias. This + * allows the same header parameter checker to be added twice (or more) using several configuration options. */ public function add(string $alias, HeaderChecker $checker): void { diff --git a/src/Bundle/JoseFramework/Services/JWEBuilder.php b/src/Bundle/JoseFramework/Services/JWEBuilder.php index 03a3ffe5..200c0d4f 100644 --- a/src/Bundle/JoseFramework/Services/JWEBuilder.php +++ b/src/Bundle/JoseFramework/Services/JWEBuilder.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Bundle\JoseFramework\Event\JWEBuiltFailureEvent; @@ -24,15 +15,13 @@ final class JWEBuilder extends BaseJWEBuilder { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct(AlgorithmManager $keyEncryptionAlgorithmManager, AlgorithmManager $contentEncryptionAlgorithmManager, CompressionMethodManager $compressionManager, EventDispatcherInterface $eventDispatcher) - { - parent::__construct($keyEncryptionAlgorithmManager, $contentEncryptionAlgorithmManager, $compressionManager); - $this->eventDispatcher = $eventDispatcher; + public function __construct( + AlgorithmManager $keyEncryptionKeyEncryptionAlgorithmManager, + AlgorithmManager $contentEncryptionAlgorithmManager, + CompressionMethodManager $compressionManager, + private EventDispatcherInterface $eventDispatcher + ) { + parent::__construct($keyEncryptionKeyEncryptionAlgorithmManager, $contentEncryptionAlgorithmManager, $compressionManager); } public function build(): JWE diff --git a/src/Bundle/JoseFramework/Services/JWEBuilderFactory.php b/src/Bundle/JoseFramework/Services/JWEBuilderFactory.php index 9a3b72b1..e0774ce7 100644 --- a/src/Bundle/JoseFramework/Services/JWEBuilderFactory.php +++ b/src/Bundle/JoseFramework/Services/JWEBuilderFactory.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Component\Core\AlgorithmManagerFactory; @@ -19,26 +10,11 @@ final class JWEBuilderFactory { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; - - /** - * @var CompressionMethodManagerFactory - */ - private $compressionMethodManagerFactory; - - public function __construct(AlgorithmManagerFactory $algorithmManagerFactory, CompressionMethodManagerFactory $compressionMethodManagerFactory, EventDispatcherInterface $eventDispatcher) - { - $this->eventDispatcher = $eventDispatcher; - $this->algorithmManagerFactory = $algorithmManagerFactory; - $this->compressionMethodManagerFactory = $compressionMethodManagerFactory; + public function __construct( + private AlgorithmManagerFactory $algorithmManagerFactory, + private CompressionMethodManagerFactory $compressionMethodManagerFactory, + private EventDispatcherInterface $eventDispatcher + ) { } /** @@ -48,12 +24,20 @@ public function __construct(AlgorithmManagerFactory $algorithmManagerFactory, Co * @param string[] $contentEncryptionAlgorithm * @param string[] $compressionMethods */ - public function create(array $keyEncryptionAlgorithms, array $contentEncryptionAlgorithm, array $compressionMethods): JWEBuilder - { + public function create( + array $keyEncryptionAlgorithms, + array $contentEncryptionAlgorithm, + array $compressionMethods + ): JWEBuilder { $keyEncryptionAlgorithmManager = $this->algorithmManagerFactory->create($keyEncryptionAlgorithms); $contentEncryptionAlgorithmManager = $this->algorithmManagerFactory->create($contentEncryptionAlgorithm); $compressionMethodManager = $this->compressionMethodManagerFactory->create($compressionMethods); - return new JWEBuilder($keyEncryptionAlgorithmManager, $contentEncryptionAlgorithmManager, $compressionMethodManager, $this->eventDispatcher); + return new JWEBuilder( + $keyEncryptionAlgorithmManager, + $contentEncryptionAlgorithmManager, + $compressionMethodManager, + $this->eventDispatcher + ); } } diff --git a/src/Bundle/JoseFramework/Services/JWEDecrypter.php b/src/Bundle/JoseFramework/Services/JWEDecrypter.php index 73a62830..d3b43ff3 100644 --- a/src/Bundle/JoseFramework/Services/JWEDecrypter.php +++ b/src/Bundle/JoseFramework/Services/JWEDecrypter.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Bundle\JoseFramework\Event\JWEDecryptionFailureEvent; @@ -25,32 +16,27 @@ final class JWEDecrypter extends BaseJWEDecrypter { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct(AlgorithmManager $keyEncryptionAlgorithmManager, AlgorithmManager $contentEncryptionAlgorithmManager, CompressionMethodManager $compressionMethodManager, EventDispatcherInterface $eventDispatcher) - { + public function __construct( + AlgorithmManager $keyEncryptionAlgorithmManager, + AlgorithmManager $contentEncryptionAlgorithmManager, + CompressionMethodManager $compressionMethodManager, + private EventDispatcherInterface $eventDispatcher + ) { parent::__construct($keyEncryptionAlgorithmManager, $contentEncryptionAlgorithmManager, $compressionMethodManager); - $this->eventDispatcher = $eventDispatcher; } - public function decryptUsingKeySet(JWE &$jwe, JWKSet $jwkset, int $recipient, JWK &$jwk = null, ?JWK $senderKey = null): bool - { + public function decryptUsingKeySet( + JWE &$jwe, + JWKSet $jwkset, + int $recipient, + JWK &$jwk = null, + ?JWK $senderKey = null + ): bool { $success = parent::decryptUsingKeySet($jwe, $jwkset, $recipient, $jwk, $senderKey); if ($success) { - $this->eventDispatcher->dispatch(new JWEDecryptionSuccessEvent( - $jwe, - $jwkset, - $jwk, - $recipient - )); + $this->eventDispatcher->dispatch(new JWEDecryptionSuccessEvent($jwe, $jwkset, $jwk, $recipient)); } else { - $this->eventDispatcher->dispatch(new JWEDecryptionFailureEvent( - $jwe, - $jwkset - )); + $this->eventDispatcher->dispatch(new JWEDecryptionFailureEvent($jwe, $jwkset)); } return $success; diff --git a/src/Bundle/JoseFramework/Services/JWEDecrypterFactory.php b/src/Bundle/JoseFramework/Services/JWEDecrypterFactory.php index 0164b9a4..bf8895dd 100644 --- a/src/Bundle/JoseFramework/Services/JWEDecrypterFactory.php +++ b/src/Bundle/JoseFramework/Services/JWEDecrypterFactory.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Component\Core\AlgorithmManagerFactory; @@ -19,34 +10,27 @@ final class JWEDecrypterFactory { - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; - - /** - * @var CompressionMethodManagerFactory - */ - private $compressionMethodManagerFactory; - - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct(AlgorithmManagerFactory $algorithmManagerFactory, CompressionMethodManagerFactory $compressionMethodManagerFactory, EventDispatcherInterface $eventDispatcher) - { - $this->algorithmManagerFactory = $algorithmManagerFactory; - $this->compressionMethodManagerFactory = $compressionMethodManagerFactory; - $this->eventDispatcher = $eventDispatcher; + public function __construct( + private AlgorithmManagerFactory $algorithmManagerFactory, + private CompressionMethodManagerFactory $compressionMethodManagerFactory, + private EventDispatcherInterface $eventDispatcher + ) { } - public function create(array $keyEncryptionAlgorithms, array $contentEncryptionAlgorithms, array $compressionMethods): JWEDecrypter - { + public function create( + array $keyEncryptionAlgorithms, + array $contentEncryptionAlgorithms, + array $compressionMethods + ): JWEDecrypter { $keyEncryptionAlgorithmManager = $this->algorithmManagerFactory->create($keyEncryptionAlgorithms); $contentEncryptionAlgorithmManager = $this->algorithmManagerFactory->create($contentEncryptionAlgorithms); $compressionMethodManager = $this->compressionMethodManagerFactory->create($compressionMethods); - return new JWEDecrypter($keyEncryptionAlgorithmManager, $contentEncryptionAlgorithmManager, $compressionMethodManager, $this->eventDispatcher); + return new JWEDecrypter( + $keyEncryptionAlgorithmManager, + $contentEncryptionAlgorithmManager, + $compressionMethodManager, + $this->eventDispatcher + ); } } diff --git a/src/Bundle/JoseFramework/Services/JWELoader.php b/src/Bundle/JoseFramework/Services/JWELoader.php index e5f23d95..890bc5f3 100644 --- a/src/Bundle/JoseFramework/Services/JWELoader.php +++ b/src/Bundle/JoseFramework/Services/JWELoader.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Bundle\JoseFramework\Event\JWELoadingFailureEvent; @@ -26,35 +17,24 @@ final class JWELoader extends BaseJWELoader { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct(JWESerializerManager $serializerManager, JWEDecrypter $jweDecrypter, ?HeaderCheckerManager $headerCheckerManager, EventDispatcherInterface $eventDispatcher) - { + public function __construct( + JWESerializerManager $serializerManager, + JWEDecrypter $jweDecrypter, + ?HeaderCheckerManager $headerCheckerManager, + private EventDispatcherInterface $eventDispatcher + ) { parent::__construct($serializerManager, $jweDecrypter, $headerCheckerManager); - $this->eventDispatcher = $eventDispatcher; } public function loadAndDecryptWithKeySet(string $token, JWKSet $keyset, ?int &$recipient): JWE { try { $jwe = parent::loadAndDecryptWithKeySet($token, $keyset, $recipient); - $this->eventDispatcher->dispatch(new JWELoadingSuccessEvent( - $token, - $jwe, - $keyset, - $recipient - )); + $this->eventDispatcher->dispatch(new JWELoadingSuccessEvent($token, $jwe, $keyset, $recipient)); return $jwe; } catch (Throwable $throwable) { - $this->eventDispatcher->dispatch(new JWELoadingFailureEvent( - $token, - $keyset, - $throwable - )); + $this->eventDispatcher->dispatch(new JWELoadingFailureEvent($token, $keyset, $throwable)); throw $throwable; } diff --git a/src/Bundle/JoseFramework/Services/JWELoaderFactory.php b/src/Bundle/JoseFramework/Services/JWELoaderFactory.php index 1ac8593f..dc2bf436 100644 --- a/src/Bundle/JoseFramework/Services/JWELoaderFactory.php +++ b/src/Bundle/JoseFramework/Services/JWELoaderFactory.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Component\Encryption\Serializer\JWESerializerManagerFactory; @@ -18,39 +9,28 @@ final class JWELoaderFactory { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var JWESerializerManagerFactory - */ - private $jweSerializerManagerFactory; - - /** - * @var JWEDecrypterFactory - */ - private $jweDecrypterFactory; - - /** - * @var null|HeaderCheckerManagerFactory - */ - private $headerCheckerManagerFactory; - - public function __construct(JWESerializerManagerFactory $jweSerializerManagerFactory, JWEDecrypterFactory $jweDecrypterFactory, ?HeaderCheckerManagerFactory $headerCheckerManagerFactory, EventDispatcherInterface $eventDispatcher) - { - $this->eventDispatcher = $eventDispatcher; - $this->jweSerializerManagerFactory = $jweSerializerManagerFactory; - $this->jweDecrypterFactory = $jweDecrypterFactory; - $this->headerCheckerManagerFactory = $headerCheckerManagerFactory; + public function __construct( + private JWESerializerManagerFactory $jweSerializerManagerFactory, + private JWEDecrypterFactory $jweDecrypterFactory, + private ?HeaderCheckerManagerFactory $headerCheckerManagerFactory, + private EventDispatcherInterface $eventDispatcher + ) { } - public function create(array $serializers, array $keyEncryptionAlgorithms, array $contentEncryptionAlgorithms, array $compressionMethods, array $headerCheckers = []): JWELoader - { + public function create( + array $serializers, + array $keyEncryptionAlgorithms, + array $contentEncryptionAlgorithms, + array $compressionMethods, + array $headerCheckers = [] + ): JWELoader { $serializerManager = $this->jweSerializerManagerFactory->create($serializers); - $jweDecrypter = $this->jweDecrypterFactory->create($keyEncryptionAlgorithms, $contentEncryptionAlgorithms, $compressionMethods); - if (null !== $this->headerCheckerManagerFactory) { + $jweDecrypter = $this->jweDecrypterFactory->create( + $keyEncryptionAlgorithms, + $contentEncryptionAlgorithms, + $compressionMethods + ); + if ($this->headerCheckerManagerFactory !== null) { $headerCheckerManager = $this->headerCheckerManagerFactory->create($headerCheckers); } else { $headerCheckerManager = null; diff --git a/src/Bundle/JoseFramework/Services/JWSBuilder.php b/src/Bundle/JoseFramework/Services/JWSBuilder.php index 70fd06d0..56fe0db3 100644 --- a/src/Bundle/JoseFramework/Services/JWSBuilder.php +++ b/src/Bundle/JoseFramework/Services/JWSBuilder.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Bundle\JoseFramework\Event\JWSBuiltFailureEvent; @@ -23,15 +14,11 @@ final class JWSBuilder extends BaseJWSBuilder { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct(AlgorithmManager $signatureAlgorithmManager, EventDispatcherInterface $eventDispatcher) - { + public function __construct( + AlgorithmManager $signatureAlgorithmManager, + private EventDispatcherInterface $eventDispatcher + ) { parent::__construct($signatureAlgorithmManager); - $this->eventDispatcher = $eventDispatcher; } public function build(): JWS diff --git a/src/Bundle/JoseFramework/Services/JWSBuilderFactory.php b/src/Bundle/JoseFramework/Services/JWSBuilderFactory.php index 94f29a86..cf92e5df 100644 --- a/src/Bundle/JoseFramework/Services/JWSBuilderFactory.php +++ b/src/Bundle/JoseFramework/Services/JWSBuilderFactory.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Component\Core\AlgorithmManagerFactory; @@ -18,20 +9,10 @@ final class JWSBuilderFactory { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var AlgorithmManagerFactory - */ - private $signatureAlgorithmManagerFactory; - - public function __construct(AlgorithmManagerFactory $signatureAlgorithmManagerFactory, EventDispatcherInterface $eventDispatcher) - { - $this->signatureAlgorithmManagerFactory = $signatureAlgorithmManagerFactory; - $this->eventDispatcher = $eventDispatcher; + public function __construct( + private AlgorithmManagerFactory $signatureAlgorithmManagerFactory, + private EventDispatcherInterface $eventDispatcher + ) { } /** diff --git a/src/Bundle/JoseFramework/Services/JWSLoader.php b/src/Bundle/JoseFramework/Services/JWSLoader.php index 994f21e2..77e0aee0 100644 --- a/src/Bundle/JoseFramework/Services/JWSLoader.php +++ b/src/Bundle/JoseFramework/Services/JWSLoader.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Bundle\JoseFramework\Event\JWSLoadingFailureEvent; @@ -26,35 +17,28 @@ final class JWSLoader extends BaseJWSLoader { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct(JWSSerializerManager $serializerManager, JWSVerifier $jwsVerifier, ?HeaderCheckerManager $headerCheckerManager, EventDispatcherInterface $eventDispatcher) - { + public function __construct( + JWSSerializerManager $serializerManager, + JWSVerifier $jwsVerifier, + ?HeaderCheckerManager $headerCheckerManager, + private EventDispatcherInterface $eventDispatcher + ) { parent::__construct($serializerManager, $jwsVerifier, $headerCheckerManager); - $this->eventDispatcher = $eventDispatcher; } - public function loadAndVerifyWithKeySet(string $token, JWKSet $keyset, ?int &$signature, ?string $payload = null): JWS - { + public function loadAndVerifyWithKeySet( + string $token, + JWKSet $keyset, + ?int &$signature, + ?string $payload = null + ): JWS { try { $jws = parent::loadAndVerifyWithKeySet($token, $keyset, $signature, $payload); - $this->eventDispatcher->dispatch(new JWSLoadingSuccessEvent( - $token, - $jws, - $keyset, - $signature - )); + $this->eventDispatcher->dispatch(new JWSLoadingSuccessEvent($token, $jws, $keyset, $signature)); return $jws; } catch (Throwable $throwable) { - $this->eventDispatcher->dispatch(new JWSLoadingFailureEvent( - $token, - $keyset, - $throwable - )); + $this->eventDispatcher->dispatch(new JWSLoadingFailureEvent($token, $keyset, $throwable)); throw $throwable; } diff --git a/src/Bundle/JoseFramework/Services/JWSLoaderFactory.php b/src/Bundle/JoseFramework/Services/JWSLoaderFactory.php index 09c7117c..f0e1c3c6 100644 --- a/src/Bundle/JoseFramework/Services/JWSLoaderFactory.php +++ b/src/Bundle/JoseFramework/Services/JWSLoaderFactory.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Component\Signature\Serializer\JWSSerializerManagerFactory; @@ -18,43 +9,23 @@ final class JWSLoaderFactory { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var JWSVerifierFactory - */ - private $jwsVerifierFactory; - - /** - * @var JWSSerializerManagerFactory - */ - private $jwsSerializerManagerFactory; - - /** - * @var null|HeaderCheckerManagerFactory - */ - private $headerCheckerManagerFactory; - - public function __construct(JWSSerializerManagerFactory $jwsSerializerManagerFactory, JWSVerifierFactory $jwsVerifierFactory, ?HeaderCheckerManagerFactory $headerCheckerManagerFactory, EventDispatcherInterface $eventDispatcher) - { - $this->jwsSerializerManagerFactory = $jwsSerializerManagerFactory; - $this->jwsVerifierFactory = $jwsVerifierFactory; - $this->headerCheckerManagerFactory = $headerCheckerManagerFactory; - $this->eventDispatcher = $eventDispatcher; + public function __construct( + private JWSSerializerManagerFactory $jwsSerializerManagerFactory, + private JWSVerifierFactory $jwsVerifierFactory, + private ?HeaderCheckerManagerFactory $headerCheckerManagerFactory, + private EventDispatcherInterface $eventDispatcher + ) { } /** - * Creates a JWSLoader using the given serializer aliases, signature algorithm aliases and (optionally) - * the header checker aliases. + * Creates a JWSLoader using the given serializer aliases, signature algorithm aliases and (optionally) the header + * checker aliases. */ public function create(array $serializers, array $algorithms, array $headerCheckers = []): JWSLoader { $serializerManager = $this->jwsSerializerManagerFactory->create($serializers); $jwsVerifier = $this->jwsVerifierFactory->create($algorithms); - if (null !== $this->headerCheckerManagerFactory) { + if ($this->headerCheckerManagerFactory !== null) { $headerCheckerManager = $this->headerCheckerManagerFactory->create($headerCheckers); } else { $headerCheckerManager = null; diff --git a/src/Bundle/JoseFramework/Services/JWSVerifier.php b/src/Bundle/JoseFramework/Services/JWSVerifier.php index b40c053d..4796424f 100644 --- a/src/Bundle/JoseFramework/Services/JWSVerifier.php +++ b/src/Bundle/JoseFramework/Services/JWSVerifier.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Bundle\JoseFramework\Event\JWSVerificationFailureEvent; @@ -24,19 +15,20 @@ final class JWSVerifier extends BaseJWSVerifier { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct(AlgorithmManager $signatureAlgorithmManager, EventDispatcherInterface $eventDispatcher) - { + public function __construct( + AlgorithmManager $signatureAlgorithmManager, + private EventDispatcherInterface $eventDispatcher + ) { parent::__construct($signatureAlgorithmManager); - $this->eventDispatcher = $eventDispatcher; } - public function verifyWithKeySet(JWS $jws, JWKSet $jwkset, int $signatureIndex, ?string $detachedPayload = null, JWK &$jwk = null): bool - { + public function verifyWithKeySet( + JWS $jws, + JWKSet $jwkset, + int $signatureIndex, + ?string $detachedPayload = null, + JWK &$jwk = null + ): bool { $success = parent::verifyWithKeySet($jws, $jwkset, $signatureIndex, $detachedPayload, $jwk); if ($success) { $this->eventDispatcher->dispatch(new JWSVerificationSuccessEvent( @@ -47,11 +39,7 @@ public function verifyWithKeySet(JWS $jws, JWKSet $jwkset, int $signatureIndex, $jwk )); } else { - $this->eventDispatcher->dispatch(new JWSVerificationFailureEvent( - $jws, - $jwkset, - $detachedPayload - )); + $this->eventDispatcher->dispatch(new JWSVerificationFailureEvent($jws, $jwkset, $detachedPayload)); } return $success; diff --git a/src/Bundle/JoseFramework/Services/JWSVerifierFactory.php b/src/Bundle/JoseFramework/Services/JWSVerifierFactory.php index f3d4426d..b344d16b 100644 --- a/src/Bundle/JoseFramework/Services/JWSVerifierFactory.php +++ b/src/Bundle/JoseFramework/Services/JWSVerifierFactory.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Component\Core\AlgorithmManagerFactory; @@ -18,20 +9,10 @@ final class JWSVerifierFactory { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; - - public function __construct(AlgorithmManagerFactory $algorithmManagerFactory, EventDispatcherInterface $eventDispatcher) - { - $this->algorithmManagerFactory = $algorithmManagerFactory; - $this->eventDispatcher = $eventDispatcher; + public function __construct( + private AlgorithmManagerFactory $algorithmManagerFactory, + private EventDispatcherInterface $eventDispatcher + ) { } public function create(array $algorithms): JWSVerifier diff --git a/src/Bundle/JoseFramework/Services/NestedTokenBuilder.php b/src/Bundle/JoseFramework/Services/NestedTokenBuilder.php index 96b863c1..aba5d31e 100644 --- a/src/Bundle/JoseFramework/Services/NestedTokenBuilder.php +++ b/src/Bundle/JoseFramework/Services/NestedTokenBuilder.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Bundle\JoseFramework\Event\NestedTokenIssuedEvent; @@ -23,20 +14,36 @@ final class NestedTokenBuilder extends BaseNestedTokenBuilder { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct(JWEBuilder $jweBuilder, JWESerializerManager $jweSerializerManager, JWSBuilder $jwsBuilder, JWSSerializerManager $jwsSerializerManager, EventDispatcherInterface $eventDispatcher) - { + public function __construct( + JWEBuilder $jweBuilder, + JWESerializerManager $jweSerializerManager, + JWSBuilder $jwsBuilder, + JWSSerializerManager $jwsSerializerManager, + private EventDispatcherInterface $eventDispatcher + ) { parent::__construct($jweBuilder, $jweSerializerManager, $jwsBuilder, $jwsSerializerManager); - $this->eventDispatcher = $eventDispatcher; } - public function create(string $payload, array $signatures, string $jws_serialization_mode, array $jweSharedProtectedHeader, array $jweSharedHeader, array $recipients, string $jwe_serialization_mode, ?string $aad = null): string - { - $nestedToken = parent::create($payload, $signatures, $jws_serialization_mode, $jweSharedProtectedHeader, $jweSharedHeader, $recipients, $jwe_serialization_mode, $aad); + public function create( + string $payload, + array $signatures, + string $jws_serialization_mode, + array $jweSharedProtectedHeader, + array $jweSharedHeader, + array $recipients, + string $jwe_serialization_mode, + ?string $aad = null + ): string { + $nestedToken = parent::create( + $payload, + $signatures, + $jws_serialization_mode, + $jweSharedProtectedHeader, + $jweSharedHeader, + $recipients, + $jwe_serialization_mode, + $aad + ); $this->eventDispatcher->dispatch(new NestedTokenIssuedEvent($nestedToken)); return $nestedToken; diff --git a/src/Bundle/JoseFramework/Services/NestedTokenBuilderFactory.php b/src/Bundle/JoseFramework/Services/NestedTokenBuilderFactory.php index be40f355..2cb4cce4 100644 --- a/src/Bundle/JoseFramework/Services/NestedTokenBuilderFactory.php +++ b/src/Bundle/JoseFramework/Services/NestedTokenBuilderFactory.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Component\Encryption\Serializer\JWESerializerManagerFactory; @@ -19,47 +10,38 @@ final class NestedTokenBuilderFactory { - /** - * @var JWEBuilderFactory - */ - private $jweBuilderFactory; - - /** - * @var JWESerializerManagerFactory - */ - private $jweSerializerManagerFactory; - - /** - * @var JWSBuilderFactory - */ - private $jwsBuilderFactory; - - /** - * @var JWSSerializerManagerFactory - */ - private $jwsSerializerManagerFactory; - - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct(JWEBuilderFactory $jweBuilderFactory, JWESerializerManagerFactory $jweSerializerManagerFactory, JWSBuilderFactory $jwsBuilderFactory, JWSSerializerManagerFactory $jwsSerializerManagerFactory, EventDispatcherInterface $eventDispatcher) - { - $this->jweBuilderFactory = $jweBuilderFactory; - $this->jweSerializerManagerFactory = $jweSerializerManagerFactory; - $this->jwsBuilderFactory = $jwsBuilderFactory; - $this->jwsSerializerManagerFactory = $jwsSerializerManagerFactory; - $this->eventDispatcher = $eventDispatcher; + public function __construct( + private JWEBuilderFactory $jweBuilderFactory, + private JWESerializerManagerFactory $jweSerializerManagerFactory, + private JWSBuilderFactory $jwsBuilderFactory, + private JWSSerializerManagerFactory $jwsSerializerManagerFactory, + private EventDispatcherInterface $eventDispatcher + ) { } - public function create(array $jwe_serializers, array $keyEncryptionAlgorithms, array $contentEncryptionAlgorithms, array $compressionMethods, array $jws_serializers, array $signatureAlgorithms): NestedTokenBuilder - { - $jweBuilder = $this->jweBuilderFactory->create($keyEncryptionAlgorithms, $contentEncryptionAlgorithms, $compressionMethods); + public function create( + array $jwe_serializers, + array $keyEncryptionAlgorithms, + array $contentEncryptionAlgorithms, + array $compressionMethods, + array $jws_serializers, + array $signatureAlgorithms + ): NestedTokenBuilder { + $jweBuilder = $this->jweBuilderFactory->create( + $keyEncryptionAlgorithms, + $contentEncryptionAlgorithms, + $compressionMethods + ); $jweSerializerManager = $this->jweSerializerManagerFactory->create($jwe_serializers); $jwsBuilder = $this->jwsBuilderFactory->create($signatureAlgorithms); $jwsSerializerManager = $this->jwsSerializerManagerFactory->create($jws_serializers); - return new NestedTokenBuilder($jweBuilder, $jweSerializerManager, $jwsBuilder, $jwsSerializerManager, $this->eventDispatcher); + return new NestedTokenBuilder( + $jweBuilder, + $jweSerializerManager, + $jwsBuilder, + $jwsSerializerManager, + $this->eventDispatcher + ); } } diff --git a/src/Bundle/JoseFramework/Services/NestedTokenLoader.php b/src/Bundle/JoseFramework/Services/NestedTokenLoader.php index 8ca2aa8a..fba529c7 100644 --- a/src/Bundle/JoseFramework/Services/NestedTokenLoader.php +++ b/src/Bundle/JoseFramework/Services/NestedTokenLoader.php @@ -2,15 +2,6 @@ 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\Bundle\JoseFramework\Services; use Jose\Bundle\JoseFramework\Event\NestedTokenLoadingFailureEvent; @@ -25,15 +16,12 @@ final class NestedTokenLoader extends BaseNestedTokenLoader { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - public function __construct(JWELoader $jweLoader, JWSLoader $jwsLoader, EventDispatcherInterface $eventDispatcher) - { + public function __construct( + JWELoader $jweLoader, + JWSLoader $jwsLoader, + private EventDispatcherInterface $eventDispatcher + ) { parent::__construct($jweLoader, $jwsLoader); - $this->eventDispatcher = $eventDispatcher; } public function load(string $token, JWKSet $encryptionKeySet, JWKSet $signatureKeySet, ?int &$signature = null): JWS diff --git a/src/Bundle/JoseFramework/Services/NestedTokenLoaderFactory.php b/src/Bundle/JoseFramework/Services/NestedTokenLoaderFactory.php index 4f561c80..b36f28ca 100644 --- a/src/Bundle/JoseFramework/Services/NestedTokenLoaderFactory.php +++ b/src/Bundle/JoseFramework/Services/NestedTokenLoaderFactory.php @@ -2,46 +2,36 @@ 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\Bundle\JoseFramework\Services; use Psr\EventDispatcher\EventDispatcherInterface; final class NestedTokenLoaderFactory { - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var JWELoaderFactory - */ - private $jweLoaderFactory; - - /** - * @var JWSLoaderFactory - */ - private $jwsLoaderFactory; - - public function __construct(JWELoaderFactory $jweLoaderFactory, JWSLoaderFactory $jwsLoaderFactory, EventDispatcherInterface $eventDispatcher) - { - $this->jweLoaderFactory = $jweLoaderFactory; - $this->jwsLoaderFactory = $jwsLoaderFactory; - $this->eventDispatcher = $eventDispatcher; + public function __construct( + private JWELoaderFactory $jweLoaderFactory, + private JWSLoaderFactory $jwsLoaderFactory, + private EventDispatcherInterface $eventDispatcher + ) { } - public function create(array $jweSerializers, array $keyEncryptionAlgorithms, array $contentEncryptionAlgorithms, array $compressionMethods, array $jweHeaderCheckers, array $jwsSerializers, array $signatureAlgorithms, array $jwsHeaderCheckers): NestedTokenLoader - { - $jweLoader = $this->jweLoaderFactory->create($jweSerializers, $keyEncryptionAlgorithms, $contentEncryptionAlgorithms, $compressionMethods, $jweHeaderCheckers); + public function create( + array $jweSerializers, + array $keyEncryptionAlgorithms, + array $contentEncryptionAlgorithms, + array $compressionMethods, + array $jweHeaderCheckers, + array $jwsSerializers, + array $signatureAlgorithms, + array $jwsHeaderCheckers + ): NestedTokenLoader { + $jweLoader = $this->jweLoaderFactory->create( + $jweSerializers, + $keyEncryptionAlgorithms, + $contentEncryptionAlgorithms, + $compressionMethods, + $jweHeaderCheckers + ); $jwsLoader = $this->jwsLoaderFactory->create($jwsSerializers, $signatureAlgorithms, $jwsHeaderCheckers); return new NestedTokenLoader($jweLoader, $jwsLoader, $this->eventDispatcher); diff --git a/src/Bundle/JoseFramework/composer.json b/src/Bundle/JoseFramework/composer.json index 0125f140..86b9bcd1 100644 --- a/src/Bundle/JoseFramework/composer.json +++ b/src/Bundle/JoseFramework/composer.json @@ -21,10 +21,10 @@ }, "require": { "psr/event-dispatcher": "^1.0", - "symfony/config": "^4.2|^5.0", - "symfony/dependency-injection": "^4.2|^5.0", - "symfony/event-dispatcher": "^4.2|^5.0", - "symfony/http-kernel": "^4.2|^5.0", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "web-token/jwt-core": "^2.1" }, "suggest": { diff --git a/src/Component/Checker/AlgorithmChecker.php b/src/Component/Checker/AlgorithmChecker.php index eb9df0c5..9ff31c0d 100644 --- a/src/Component/Checker/AlgorithmChecker.php +++ b/src/Component/Checker/AlgorithmChecker.php @@ -2,45 +2,26 @@ 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\Checker; use function in_array; use function is_string; /** - * This class is a header parameter checker. - * When the "alg" header parameter is present, it will check if the value is within the allowed ones. + * This class is a header parameter checker. When the "alg" header parameter is present, it will check if the value is + * within the allowed ones. */ final class AlgorithmChecker implements HeaderChecker { private const HEADER_NAME = 'alg'; - /** - * @var bool - */ - private bool $protectedHeader = false; - - /** - * @var string[] - */ - private array $supportedAlgorithms; - /** * @param string[] $supportedAlgorithms */ - public function __construct(array $supportedAlgorithms, bool $protectedHeader = false) - { - $this->supportedAlgorithms = $supportedAlgorithms; - $this->protectedHeader = $protectedHeader; + public function __construct( + private array $supportedAlgorithms, + private bool $protectedHeader = false + ) { } /** @@ -48,10 +29,10 @@ public function __construct(array $supportedAlgorithms, bool $protectedHeader = */ public function checkHeader($value): void { - if (!is_string($value)) { + if (! is_string($value)) { throw new InvalidHeaderException('"alg" must be a string.', self::HEADER_NAME, $value); } - if (!in_array($value, $this->supportedAlgorithms, true)) { + if (! in_array($value, $this->supportedAlgorithms, true)) { throw new InvalidHeaderException('Unsupported algorithm.', self::HEADER_NAME, $value); } } diff --git a/src/Component/Checker/AudienceChecker.php b/src/Component/Checker/AudienceChecker.php index bcdea131..2469fc7f 100644 --- a/src/Component/Checker/AudienceChecker.php +++ b/src/Component/Checker/AudienceChecker.php @@ -2,15 +2,6 @@ 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\Checker; use function in_array; @@ -18,27 +9,17 @@ use function is_string; /** - * This class is a header parameter and claim checker. - * When the "aud" header parameter or claim is present, it will check if the value is within the allowed ones. + * This class is a header parameter and claim checker. When the "aud" header parameter or claim is present, it will + * check if the value is within the allowed ones. */ final class AudienceChecker implements ClaimChecker, HeaderChecker { private const CLAIM_NAME = 'aud'; - /** - * @var bool - */ - private $protectedHeader; - - /** - * @var string - */ - private $audience; - - public function __construct(string $audience, bool $protectedHeader = false) - { - $this->audience = $audience; - $this->protectedHeader = $protectedHeader; + public function __construct( + private string $audience, + private bool $protectedHeader = false + ) { } /** @@ -72,21 +53,15 @@ public function protectedHeaderOnly(): bool return $this->protectedHeader; } - /** - * @param mixed $value - * - * @throws InvalidClaimException if the claim is invalid - * @throws InvalidHeaderException if the header is invalid - */ private function checkValue($value, string $class): void { if (is_string($value) && $value !== $this->audience) { throw new $class('Bad audience.', self::CLAIM_NAME, $value); } - if (is_array($value) && !in_array($this->audience, $value, true)) { + if (is_array($value) && ! in_array($this->audience, $value, true)) { throw new $class('Bad audience.', self::CLAIM_NAME, $value); } - if (!is_array($value) && !is_string($value)) { + if (! is_array($value) && ! is_string($value)) { throw new $class('Bad audience.', self::CLAIM_NAME, $value); } } diff --git a/src/Component/Checker/ClaimChecker.php b/src/Component/Checker/ClaimChecker.php index 5de777e0..8fa596ba 100644 --- a/src/Component/Checker/ClaimChecker.php +++ b/src/Component/Checker/ClaimChecker.php @@ -2,26 +2,13 @@ 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\Checker; interface ClaimChecker { /** - * When the token has the applicable claim, the value is checked. - * If for some reason the value is not valid, an InvalidClaimException must be thrown. - * - * @param mixed $value - * - * @throws InvalidClaimException if the claim is invalid + * When the token has the applicable claim, the value is checked. If for some reason the value is not valid, an + * InvalidClaimException must be thrown. */ public function checkClaim($value): void; diff --git a/src/Component/Checker/ClaimCheckerManager.php b/src/Component/Checker/ClaimCheckerManager.php index 23af13f2..8b2bc899 100644 --- a/src/Component/Checker/ClaimCheckerManager.php +++ b/src/Component/Checker/ClaimCheckerManager.php @@ -2,15 +2,6 @@ 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\Checker; use function array_key_exists; @@ -47,17 +38,13 @@ public function getCheckers(): array } /** - * This method checks all the claims passed as argument. - * All claims are checked against the claim checkers. - * If one fails, the InvalidClaimException is thrown. + * This method checks all the claims passed as argument. All claims are checked against the claim checkers. If one + * fails, the InvalidClaimException is thrown. * - * This method returns an array with all checked claims. - * It is up to the implementor to decide use the claims that have not been checked. + * This method returns an array with all checked claims. It is up to the implementor to decide use the claims that + * have not been checked. * * @param string[] $mandatoryClaims - * - * @throws InvalidClaimException - * @throws MissingMandatoryClaimException */ public function check(array $claims, array $mandatoryClaims = []): array { @@ -81,17 +68,18 @@ private function add(ClaimChecker $checker): void /** * @param string[] $mandatoryClaims - * - * @throws MissingMandatoryClaimException */ private function checkMandatoryClaims(array $mandatoryClaims, array $claims): void { - if (0 === count($mandatoryClaims)) { + if (count($mandatoryClaims) === 0) { return; } $diff = array_keys(array_diff_key(array_flip($mandatoryClaims), $claims)); - if (0 !== count($diff)) { - throw new MissingMandatoryClaimException(sprintf('The following claims are mandatory: %s.', implode(', ', $diff)), $diff); + if (count($diff) !== 0) { + throw new MissingMandatoryClaimException(sprintf( + 'The following claims are mandatory: %s.', + implode(', ', $diff) + ), $diff); } } } diff --git a/src/Component/Checker/ClaimCheckerManagerFactory.php b/src/Component/Checker/ClaimCheckerManagerFactory.php index 192b3424..8dd5f3d1 100644 --- a/src/Component/Checker/ClaimCheckerManagerFactory.php +++ b/src/Component/Checker/ClaimCheckerManagerFactory.php @@ -2,15 +2,6 @@ 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\Checker; use InvalidArgumentException; @@ -23,8 +14,8 @@ class ClaimCheckerManagerFactory private $checkers = []; /** - * This method creates a Claim Checker Manager and populate it with the claim checkers found based on the alias. - * If the alias is not supported, an InvalidArgumentException is thrown. + * This method creates a Claim Checker Manager and populate it with the claim checkers found based on the alias. If + * the alias is not supported, an InvalidArgumentException is thrown. * * @param string[] $aliases */ @@ -32,8 +23,11 @@ public function create(array $aliases): ClaimCheckerManager { $checkers = []; foreach ($aliases as $alias) { - if (!isset($this->checkers[$alias])) { - throw new InvalidArgumentException(sprintf('The claim checker with the alias "%s" is not supported.', $alias)); + if (! isset($this->checkers[$alias])) { + throw new InvalidArgumentException(sprintf( + 'The claim checker with the alias "%s" is not supported.', + $alias + )); } $checkers[] = $this->checkers[$alias]; } diff --git a/src/Component/Checker/ClaimExceptionInterface.php b/src/Component/Checker/ClaimExceptionInterface.php index 5ffb5ee4..47971d03 100644 --- a/src/Component/Checker/ClaimExceptionInterface.php +++ b/src/Component/Checker/ClaimExceptionInterface.php @@ -2,15 +2,6 @@ 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\Checker; use Throwable; diff --git a/src/Component/Checker/ExpirationTimeChecker.php b/src/Component/Checker/ExpirationTimeChecker.php index 3fbffb37..4fdf174c 100644 --- a/src/Component/Checker/ExpirationTimeChecker.php +++ b/src/Component/Checker/ExpirationTimeChecker.php @@ -2,51 +2,30 @@ 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\Checker; use function is_float; use function is_int; /** - * This class is a claim checker. - * When the "exp" is present, it will compare the value with the current timestamp. + * This class is a claim checker. When the "exp" is present, it will compare the value with the current timestamp. */ final class ExpirationTimeChecker implements ClaimChecker, HeaderChecker { private const NAME = 'exp'; - /** - * @var int - */ - private $allowedTimeDrift; - /** - * @var bool - */ - private $protectedHeaderOnly; - - public function __construct(int $allowedTimeDrift = 0, bool $protectedHeaderOnly = false) - { - $this->allowedTimeDrift = $allowedTimeDrift; - $this->protectedHeaderOnly = $protectedHeaderOnly; + public function __construct( + private int $allowedTimeDrift = 0, + private bool $protectedHeaderOnly = false + ) { } /** * {@inheritdoc} - * - * @throws InvalidClaimException if the claim "exp" is not valid */ public function checkClaim($value): void { - if (!is_float($value) && !is_int($value)) { + if (! is_float($value) && ! is_int($value)) { throw new InvalidClaimException('"exp" must be an integer.', self::NAME, $value); } if (time() > $value + $this->allowedTimeDrift) { @@ -59,14 +38,9 @@ public function supportedClaim(): string return self::NAME; } - /** - * @param mixed $value - * - * @throws InvalidHeaderException if the claim "exp" is not valid - */ public function checkHeader($value): void { - if (!is_float($value) && !is_int($value)) { + if (! is_float($value) && ! is_int($value)) { throw new InvalidHeaderException('"exp" must be an integer.', self::NAME, $value); } if (time() > $value + $this->allowedTimeDrift) { diff --git a/src/Component/Checker/HeaderChecker.php b/src/Component/Checker/HeaderChecker.php index 03c1c697..c7a384e1 100644 --- a/src/Component/Checker/HeaderChecker.php +++ b/src/Component/Checker/HeaderChecker.php @@ -2,26 +2,13 @@ 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\Checker; interface HeaderChecker { /** - * This method is called when the header parameter is present. - * If for some reason the value is not valid, an InvalidHeaderException must be thrown. - * - * @param mixed $value - * - * @throws InvalidHeaderException if the header parameter is invalid + * This method is called when the header parameter is present. If for some reason the value is not valid, an + * InvalidHeaderException must be thrown. */ public function checkHeader($value): void; diff --git a/src/Component/Checker/HeaderCheckerManager.php b/src/Component/Checker/HeaderCheckerManager.php index 7b250cd1..4bbfe75c 100644 --- a/src/Component/Checker/HeaderCheckerManager.php +++ b/src/Component/Checker/HeaderCheckerManager.php @@ -2,15 +2,6 @@ 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\Checker; use function array_key_exists; @@ -29,7 +20,7 @@ class HeaderCheckerManager /** * @var TokenTypeSupport[] */ - private $tokenTypes = []; + private array $tokenTypes = []; /** * HeaderCheckerManager constructor. @@ -58,13 +49,10 @@ public function getCheckers(): array } /** - * This method checks all the header parameters passed as argument. - * All header parameters are checked against the header parameter checkers. - * If one fails, the InvalidHeaderException is thrown. + * This method checks all the header parameters passed as argument. All header parameters are checked against the + * header parameter checkers. If one fails, the InvalidHeaderException is thrown. * * @param string[] $mandatoryHeaderParameters - * - * @throws InvalidArgumentException if the token format is not valid */ public function check(JWT $jwt, int $index, array $mandatoryHeaderParameters = []): void { @@ -95,36 +83,39 @@ private function add(HeaderChecker $checker): void $this->checkers[$header] = $checker; } - /** - * @throws InvalidArgumentException if the header contains duplicated entries - */ private function checkDuplicatedHeaderParameters(array $header1, array $header2): void { $inter = array_intersect_key($header1, $header2); - if (0 !== count($inter)) { - throw new InvalidArgumentException(sprintf('The header contains duplicated entries: %s.', implode(', ', array_keys($inter)))); + if (count($inter) !== 0) { + throw new InvalidArgumentException(sprintf( + 'The header contains duplicated entries: %s.', + implode(', ', array_keys($inter)) + )); } } /** * @param string[] $mandatoryHeaderParameters - * - * @throws MissingMandatoryHeaderParameterException if a mandatory header parameter is missing */ - private function checkMandatoryHeaderParameters(array $mandatoryHeaderParameters, array $protected, array $unprotected): void - { - if (0 === count($mandatoryHeaderParameters)) { + private function checkMandatoryHeaderParameters( + array $mandatoryHeaderParameters, + array $protected, + array $unprotected + ): void { + if (count($mandatoryHeaderParameters) === 0) { return; } - $diff = array_keys(array_diff_key(array_flip($mandatoryHeaderParameters), array_merge($protected, $unprotected))); - if (0 !== count($diff)) { - throw new MissingMandatoryHeaderParameterException(sprintf('The following header parameters are mandatory: %s.', implode(', ', $diff)), $diff); + $diff = array_keys( + array_diff_key(array_flip($mandatoryHeaderParameters), array_merge($protected, $unprotected)) + ); + if (count($diff) !== 0) { + throw new MissingMandatoryHeaderParameterException(sprintf( + 'The following header parameters are mandatory: %s.', + implode(', ', $diff) + ), $diff); } } - /** - * @throws InvalidHeaderException if a protected header parameter is not in the protected header - */ private function checkHeaders(array $protected, array $header): void { $checkedHeaderParameters = []; @@ -134,7 +125,10 @@ private function checkHeaders(array $protected, array $header): void $checker->checkHeader($protected[$headerParameter]); $checkedHeaderParameters[] = $headerParameter; } elseif (array_key_exists($headerParameter, $header)) { - throw new InvalidHeaderException(sprintf('The header parameter "%s" must be protected.', $headerParameter), $headerParameter, $header[$headerParameter]); + throw new InvalidHeaderException(sprintf( + 'The header parameter "%s" must be protected.', + $headerParameter + ), $headerParameter, $header[$headerParameter]); } } else { if (array_key_exists($headerParameter, $protected)) { @@ -149,18 +143,22 @@ private function checkHeaders(array $protected, array $header): void $this->checkCriticalHeader($protected, $header, $checkedHeaderParameters); } - /** - * @throws InvalidHeaderException if the "crit" parameter is not valid or if a critical header parameter cannot be verified - */ private function checkCriticalHeader(array $protected, array $header, array $checkedHeaderParameters): void { if (array_key_exists('crit', $protected)) { - if (!is_array($protected['crit'])) { - throw new InvalidHeaderException('The header "crit" must be a list of header parameters.', 'crit', $protected['crit']); + if (! is_array($protected['crit'])) { + throw new InvalidHeaderException( + 'The header "crit" must be a list of header parameters.', + 'crit', + $protected['crit'] + ); } $diff = array_diff($protected['crit'], $checkedHeaderParameters); - if (0 !== count($diff)) { - throw new InvalidHeaderException(sprintf('One or more header parameters are marked as critical, but they are missing or have not been checked: %s.', implode(', ', array_values($diff))), 'crit', $protected['crit']); + if (count($diff) !== 0) { + throw new InvalidHeaderException(sprintf( + 'One or more header parameters are marked as critical, but they are missing or have not been checked: %s.', + implode(', ', array_values($diff)) + ), 'crit', $protected['crit']); } } elseif (array_key_exists('crit', $header)) { throw new InvalidHeaderException('The header parameter "crit" must be protected.', 'crit', $header['crit']); diff --git a/src/Component/Checker/HeaderCheckerManagerFactory.php b/src/Component/Checker/HeaderCheckerManagerFactory.php index 860580b8..3b71dcfb 100644 --- a/src/Component/Checker/HeaderCheckerManagerFactory.php +++ b/src/Component/Checker/HeaderCheckerManagerFactory.php @@ -2,15 +2,6 @@ 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\Checker; use InvalidArgumentException; @@ -25,22 +16,23 @@ class HeaderCheckerManagerFactory /** * @var TokenTypeSupport[] */ - private $tokenTypes = []; + private array $tokenTypes = []; /** - * This method creates a Header Checker Manager and populate it with the header parameter checkers found based on the alias. - * If the alias is not supported, an InvalidArgumentException is thrown. + * This method creates a Header Checker Manager and populate it with the header parameter checkers found based on + * the alias. If the alias is not supported, an InvalidArgumentException is thrown. * * @param string[] $aliases - * - * @throws InvalidArgumentException if an alias is not supported */ public function create(array $aliases): HeaderCheckerManager { $checkers = []; foreach ($aliases as $alias) { - if (!isset($this->checkers[$alias])) { - throw new InvalidArgumentException(sprintf('The header checker with the alias "%s" is not supported.', $alias)); + if (! isset($this->checkers[$alias])) { + throw new InvalidArgumentException(sprintf( + 'The header checker with the alias "%s" is not supported.', + $alias + )); } $checkers[] = $this->checkers[$alias]; } @@ -49,9 +41,8 @@ public function create(array $aliases): HeaderCheckerManager } /** - * This method adds a header parameter checker to this factory. - * The checker is uniquely identified by an alias. This allows the same header parameter checker to be added twice (or more) - * using several configuration options. + * This method adds a header parameter checker to this factory. The checker is uniquely identified by an alias. This + * allows the same header parameter checker to be added twice (or more) using several configuration options. */ public function add(string $alias, HeaderChecker $checker): void { diff --git a/src/Component/Checker/InvalidClaimException.php b/src/Component/Checker/InvalidClaimException.php index b834843f..2c15de89 100644 --- a/src/Component/Checker/InvalidClaimException.php +++ b/src/Component/Checker/InvalidClaimException.php @@ -2,15 +2,6 @@ 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\Checker; use Exception; @@ -20,25 +11,12 @@ */ class InvalidClaimException extends Exception implements ClaimExceptionInterface { - /** - * @var string - */ - private $claim; - - /** - * @var mixed - */ - private $value; - - /** - * @param mixed $value - */ - public function __construct(string $message, string $claim, $value) - { + public function __construct( + string $message, + private string $claim, + private $value + ) { parent::__construct($message); - - $this->claim = $claim; - $this->value = $value; } /** @@ -51,8 +29,6 @@ public function getClaim(): string /** * Returns the claim value that caused the exception. - * - * @return mixed */ public function getValue() { diff --git a/src/Component/Checker/InvalidHeaderException.php b/src/Component/Checker/InvalidHeaderException.php index 50d1e9d3..200622f5 100644 --- a/src/Component/Checker/InvalidHeaderException.php +++ b/src/Component/Checker/InvalidHeaderException.php @@ -2,15 +2,6 @@ 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\Checker; use Exception; @@ -20,25 +11,12 @@ */ class InvalidHeaderException extends Exception { - /** - * @var string - */ - private $header; - - /** - * @var mixed - */ - private $value; - - /** - * @param mixed $value - */ - public function __construct(string $message, string $header, $value) - { + public function __construct( + string $message, + private string $header, + private $value + ) { parent::__construct($message); - - $this->header = $header; - $this->value = $value; } /** @@ -51,8 +29,6 @@ public function getHeader(): string /** * Returns the header parameter value that caused the exception. - * - * @return mixed */ public function getValue() { diff --git a/src/Component/Checker/IssuedAtChecker.php b/src/Component/Checker/IssuedAtChecker.php index d005957b..21d01e21 100644 --- a/src/Component/Checker/IssuedAtChecker.php +++ b/src/Component/Checker/IssuedAtChecker.php @@ -2,51 +2,30 @@ 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\Checker; use function is_float; use function is_int; /** - * This class is a claim checker. - * When the "iat" is present, it will compare the value with the current timestamp. + * This class is a claim checker. When the "iat" is present, it will compare the value with the current timestamp. */ final class IssuedAtChecker implements ClaimChecker, HeaderChecker { private const NAME = 'iat'; - /** - * @var int - */ - private $allowedTimeDrift; - /** - * @var bool - */ - private $protectedHeaderOnly; - - public function __construct(int $allowedTimeDrift = 0, bool $protectedHeaderOnly = false) - { - $this->allowedTimeDrift = $allowedTimeDrift; - $this->protectedHeaderOnly = $protectedHeaderOnly; + public function __construct( + private int $allowedTimeDrift = 0, + private bool $protectedHeaderOnly = false + ) { } /** * {@inheritdoc} - * - * @throws InvalidClaimException if the claim is invalid */ public function checkClaim($value): void { - if (!is_float($value) && !is_int($value)) { + if (! is_float($value) && ! is_int($value)) { throw new InvalidClaimException('"iat" must be an integer.', self::NAME, $value); } if (time() < $value - $this->allowedTimeDrift) { @@ -59,14 +38,9 @@ public function supportedClaim(): string return self::NAME; } - /** - * @param mixed $value - * - * @throws InvalidHeaderException if the header parameter is invalid - */ public function checkHeader($value): void { - if (!is_float($value) && !is_int($value)) { + if (! is_float($value) && ! is_int($value)) { throw new InvalidHeaderException('The header "iat" must be an integer.', self::NAME, $value); } if (time() < $value - $this->allowedTimeDrift) { diff --git a/src/Component/Checker/IssuerChecker.php b/src/Component/Checker/IssuerChecker.php index 61476770..40789ef9 100644 --- a/src/Component/Checker/IssuerChecker.php +++ b/src/Component/Checker/IssuerChecker.php @@ -2,59 +2,30 @@ 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\Checker; use function in_array; use function is_string; /** - * This class is a header parameter and claim checker. - * When the "iss" header parameter or claim is present, it will check if the value is within the allowed ones. + * This class is a header parameter and claim checker. When the "iss" header parameter or claim is present, it will + * check if the value is within the allowed ones. */ final class IssuerChecker implements ClaimChecker, HeaderChecker { private const CLAIM_NAME = 'iss'; - /** - * @var bool - */ - private $protectedHeader = false; - - /** - * @var array - */ - private $issuers; - - public function __construct(array $issuer, bool $protectedHeader = false) - { - $this->issuers = $issuer; - $this->protectedHeader = $protectedHeader; + public function __construct( + private array $issuers, + private bool $protectedHeader = false + ) { } - /** - * @param mixed $value - * - * @throws InvalidClaimException if the claim is invalid - */ public function checkClaim($value): void { $this->checkValue($value, InvalidClaimException::class); } - /** - * @param mixed $value - * - * @throws InvalidHeaderException if the header parameter is invalid - */ public function checkHeader($value): void { $this->checkValue($value, InvalidHeaderException::class); @@ -75,18 +46,12 @@ public function protectedHeaderOnly(): bool return $this->protectedHeader; } - /** - * @param mixed $value - * - * @throws InvalidClaimException if the claim is invalid - * @throws InvalidHeaderException if the header parameter is invalid - */ private function checkValue($value, string $class): void { - if (!is_string($value)) { + if (! is_string($value)) { throw new $class('Invalid value.', self::CLAIM_NAME, $value); } - if (!in_array($value, $this->issuers, true)) { + if (! in_array($value, $this->issuers, true)) { throw new $class('Unknown issuer.', self::CLAIM_NAME, $value); } } diff --git a/src/Component/Checker/MissingMandatoryClaimException.php b/src/Component/Checker/MissingMandatoryClaimException.php index 275f9298..915372a8 100644 --- a/src/Component/Checker/MissingMandatoryClaimException.php +++ b/src/Component/Checker/MissingMandatoryClaimException.php @@ -2,15 +2,6 @@ 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\Checker; use Exception; diff --git a/src/Component/Checker/MissingMandatoryHeaderParameterException.php b/src/Component/Checker/MissingMandatoryHeaderParameterException.php index 97479b26..99a2528b 100644 --- a/src/Component/Checker/MissingMandatoryHeaderParameterException.php +++ b/src/Component/Checker/MissingMandatoryHeaderParameterException.php @@ -2,15 +2,6 @@ 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\Checker; use Exception; diff --git a/src/Component/Checker/NotBeforeChecker.php b/src/Component/Checker/NotBeforeChecker.php index 9a9e3b00..7f9c9f57 100644 --- a/src/Component/Checker/NotBeforeChecker.php +++ b/src/Component/Checker/NotBeforeChecker.php @@ -2,52 +2,30 @@ 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\Checker; use function is_float; use function is_int; /** - * This class is a claim checker. - * When the "nbf" is present, it will compare the value with the current timestamp. + * This class is a claim checker. When the "nbf" is present, it will compare the value with the current timestamp. */ final class NotBeforeChecker implements ClaimChecker, HeaderChecker { private const NAME = 'nbf'; - /** - * @var int - */ - private $allowedTimeDrift; - /** - * @var bool - */ - private $protectedHeaderOnly; - - public function __construct(int $allowedTimeDrift = 0, bool $protectedHeaderOnly = false) - { - $this->allowedTimeDrift = $allowedTimeDrift; - $this->protectedHeaderOnly = $protectedHeaderOnly; + public function __construct( + private int $allowedTimeDrift = 0, + private bool $protectedHeaderOnly = false + ) { } /** * {@inheritdoc} - * - * @throws InvalidClaimException if the claim "nbf" is not an integer - * @throws InvalidClaimException if the claim "nbf" restrict the use of the token */ public function checkClaim($value): void { - if (!is_float($value) && !is_int($value)) { + if (! is_float($value) && ! is_int($value)) { throw new InvalidClaimException('"nbf" must be an integer.', self::NAME, $value); } if (time() < $value - $this->allowedTimeDrift) { @@ -60,15 +38,9 @@ public function supportedClaim(): string return self::NAME; } - /** - * @param mixed $value - * - * @throws InvalidHeaderException if the claim "nbf" is not an integer - * @throws InvalidHeaderException if the claim "nbf" restrict the use of the token - */ public function checkHeader($value): void { - if (!is_float($value) && !is_int($value)) { + if (! is_float($value) && ! is_int($value)) { throw new InvalidHeaderException('"nbf" must be an integer.', self::NAME, $value); } if (time() < $value - $this->allowedTimeDrift) { diff --git a/src/Component/Checker/TokenTypeSupport.php b/src/Component/Checker/TokenTypeSupport.php index 14062fd5..bfa4f0b2 100644 --- a/src/Component/Checker/TokenTypeSupport.php +++ b/src/Component/Checker/TokenTypeSupport.php @@ -2,15 +2,6 @@ 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\Checker; use Jose\Component\Core\JWT; @@ -18,12 +9,17 @@ interface TokenTypeSupport { /** - * This method will retrieve the protect and unprotected headers of the token for the given index. - * The index is useful when the token is serialized using the Json General Serialization mode. - * For example the JWE Json General Serialization Mode allows several recipients to be set. - * The unprotected headers correspond to the share unprotected header and the selected recipient header. + * This method will retrieve the protect and unprotected headers of the token for the given index. The index is + * useful when the token is serialized using the Json General Serialization mode. For example the JWE Json General + * Serialization Mode allows several recipients to be set. The unprotected headers correspond to the share + * unprotected header and the selected recipient header. */ - public function retrieveTokenHeaders(JWT $jwt, int $index, array &$protectedHeader, array &$unprotectedHeader): void; + public function retrieveTokenHeaders( + JWT $jwt, + int $index, + array &$protectedHeader, + array &$unprotectedHeader + ): void; /** * This method returns true if the token in argument is supported, otherwise false. diff --git a/src/Component/Checker/UnencodedPayloadChecker.php b/src/Component/Checker/UnencodedPayloadChecker.php index 4f6e4930..fd351053 100644 --- a/src/Component/Checker/UnencodedPayloadChecker.php +++ b/src/Component/Checker/UnencodedPayloadChecker.php @@ -2,22 +2,12 @@ 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\Checker; use function is_bool; /** - * This class is a header parameter checker. - * When the "b64" is present, it will check if the value is a boolean or not. + * This class is a header parameter checker. When the "b64" is present, it will check if the value is a boolean or not. * * The use of this checker will allow the use of token with unencoded payload. */ @@ -27,12 +17,10 @@ final class UnencodedPayloadChecker implements HeaderChecker /** * {@inheritdoc} - * - * @throws InvalidHeaderException if the header parameter "b64" is not a boolean */ public function checkHeader($value): void { - if (!is_bool($value)) { + if (! is_bool($value)) { throw new InvalidHeaderException('"b64" must be a boolean.', self::HEADER_NAME, $value); } } diff --git a/src/Component/Console/AddKeyIntoKeysetCommand.php b/src/Component/Console/AddKeyIntoKeysetCommand.php index 412bb7af..63bfce35 100644 --- a/src/Component/Console/AddKeyIntoKeysetCommand.php +++ b/src/Component/Console/AddKeyIntoKeysetCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -25,12 +16,12 @@ final class AddKeyIntoKeysetCommand extends ObjectOutputCommand { + protected static $defaultName = 'keyset:add:key'; + protected function configure(): void { parent::configure(); - $this - ->setName('keyset:add:key') - ->setDescription('Add a key into a key set.') + $this->setDescription('Add a key into a key set.') ->setHelp('This command adds a key at the end of a key set.') ->addArgument('jwkset', InputArgument::REQUIRED, 'The JWKSet object') ->addArgument('jwk', InputArgument::REQUIRED, 'The new JWK object') @@ -47,34 +38,28 @@ protected function execute(InputInterface $input, OutputInterface $output): int return 0; } - /** - * @throws InvalidArgumentException if the key set is invalid - */ private function getKeyset(InputInterface $input): JWKSet { $jwkset = $input->getArgument('jwkset'); - if (!is_string($jwkset)) { + if (! is_string($jwkset)) { throw new InvalidArgumentException('The argument must be a valid JWKSet.'); } $json = JsonConverter::decode($jwkset); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('The argument must be a valid JWKSet.'); } return JWKSet::createFromKeyData($json); } - /** - * @throws InvalidArgumentException if the key is invalid - */ private function getKey(InputInterface $input): JWK { $jwk = $input->getArgument('jwk'); - if (!is_string($jwk)) { + if (! is_string($jwk)) { throw new InvalidArgumentException('The argument must be a valid JWK.'); } $json = JsonConverter::decode($jwk); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('The argument must be a valid JWK.'); } diff --git a/src/Component/Console/EcKeyGeneratorCommand.php b/src/Component/Console/EcKeyGeneratorCommand.php index c8c982f0..666f4f72 100644 --- a/src/Component/Console/EcKeyGeneratorCommand.php +++ b/src/Component/Console/EcKeyGeneratorCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -22,23 +13,20 @@ final class EcKeyGeneratorCommand extends GeneratorCommand { + protected static $defaultName = 'key:generate:ec'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:generate:ec') - ->setDescription('Generate an EC key (JWK format)') + $this->setDescription('Generate an EC key (JWK format)') ->addArgument('curve', InputArgument::REQUIRED, 'Curve of the key.') ; } - /** - * @throws InvalidArgumentException if the curve is invalid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $curve = $input->getArgument('curve'); - if (!is_string($curve)) { + if (! is_string($curve)) { throw new InvalidArgumentException('Invalid curve'); } $args = $this->getOptions($input); diff --git a/src/Component/Console/EcKeysetGeneratorCommand.php b/src/Component/Console/EcKeysetGeneratorCommand.php index e3037b84..9123e6d4 100644 --- a/src/Component/Console/EcKeysetGeneratorCommand.php +++ b/src/Component/Console/EcKeysetGeneratorCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -24,25 +15,21 @@ final class EcKeysetGeneratorCommand extends GeneratorCommand { + protected static $defaultName = 'keyset:generate:ec'; + protected function configure(): void { parent::configure(); - $this - ->setName('keyset:generate:ec') - ->setDescription('Generate an EC key set (JWKSet format)') + $this->setDescription('Generate an EC key set (JWKSet format)') ->addArgument('quantity', InputArgument::REQUIRED, 'Quantity of keys in the key set.') ->addArgument('curve', InputArgument::REQUIRED, 'Curve of the keys.') ; } - /** - * @throws InvalidArgumentException if the quantity of keys is invalid - * @throws InvalidArgumentException if the curve is invalid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $quantity = $input->getArgument('quantity'); - if (null === $quantity) { + if ($quantity === null) { $quantity = 1; } elseif (is_array($quantity)) { $quantity = 1; @@ -53,7 +40,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int throw new InvalidArgumentException('Invalid quantity'); } $curve = $input->getArgument('curve'); - if (!is_string($curve)) { + if (! is_string($curve)) { throw new InvalidArgumentException('Invalid curve'); } diff --git a/src/Component/Console/GeneratorCommand.php b/src/Component/Console/GeneratorCommand.php index cb0b2bc2..b7e97b75 100644 --- a/src/Component/Console/GeneratorCommand.php +++ b/src/Component/Console/GeneratorCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -33,18 +24,20 @@ protected function configure(): void $this ->addOption('use', 'u', InputOption::VALUE_OPTIONAL, 'Usage of the key. Must be either "sig" or "enc".') ->addOption('alg', 'a', InputOption::VALUE_OPTIONAL, 'Algorithm for the key.') - ->addOption('random_id', null, InputOption::VALUE_NONE, 'If this option is set, a random key ID (kid) will be generated.') + ->addOption( + 'random_id', + null, + InputOption::VALUE_NONE, + 'If this option is set, a random key ID (kid) will be generated.' + ) ; } - /** - * @throws InvalidArgumentException if the option "random_id" is not a valid - */ protected function getOptions(InputInterface $input): array { $args = []; $useRandomId = $input->getOption('random_id'); - if (!is_bool($useRandomId)) { + if (! is_bool($useRandomId)) { throw new InvalidArgumentException('Invalid value for option "random_id"'); } if ($useRandomId) { @@ -52,7 +45,7 @@ protected function getOptions(InputInterface $input): array } foreach (['use', 'alg'] as $key) { $value = $input->getOption($key); - if (null !== $value) { + if ($value !== null) { $args[$key] = $value; } } diff --git a/src/Component/Console/GetThumbprintCommand.php b/src/Component/Console/GetThumbprintCommand.php index b7cbd897..3d12cc8d 100644 --- a/src/Component/Console/GetThumbprintCommand.php +++ b/src/Component/Console/GetThumbprintCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -25,32 +16,29 @@ final class GetThumbprintCommand extends ObjectOutputCommand { + protected static $defaultName = 'key:thumbprint'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:thumbprint') - ->setDescription('Get the thumbprint of a JWK key.') + $this->setDescription('Get the thumbprint of a JWK key.') ->addArgument('jwk', InputArgument::REQUIRED, 'The JWK key.') ->addOption('hash', null, InputOption::VALUE_OPTIONAL, 'The hashing algorithm.', 'sha256') ; } - /** - * @throws InvalidArgumentException if the JWK or the hashing function are invalid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $jwk = $input->getArgument('jwk'); - if (!is_string($jwk)) { + if (! is_string($jwk)) { throw new InvalidArgumentException('Invalid JWK'); } $hash = $input->getOption('hash'); - if (!is_string($hash)) { + if (! is_string($hash)) { throw new InvalidArgumentException('Invalid hash algorithm'); } $json = JsonConverter::decode($jwk); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('Invalid input.'); } $key = new JWK($json); diff --git a/src/Component/Console/JKULoaderCommand.php b/src/Component/Console/JKULoaderCommand.php index 803a3de0..fe1083a9 100644 --- a/src/Component/Console/JKULoaderCommand.php +++ b/src/Component/Console/JKULoaderCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -22,35 +13,28 @@ final class JKULoaderCommand extends ObjectOutputCommand { - /** - * @var JKUFactory - */ - private $jkuFactory; + protected static $defaultName = 'keyset:load:jku'; - public function __construct(JKUFactory $jkuFactory, ?string $name = null) - { - $this->jkuFactory = $jkuFactory; + public function __construct( + private JKUFactory $jkuFactory, + ?string $name = null + ) { parent::__construct($name); } protected function configure(): void { parent::configure(); - $this - ->setName('keyset:load:jku') - ->setDescription('Loads a key set from an url.') + $this->setDescription('Loads a key set from an url.') ->setHelp('This command will try to get a key set from an URL. The distant key set is a JWKSet.') ->addArgument('url', InputArgument::REQUIRED, 'The URL') ; } - /** - * @throws InvalidArgumentException if the URL is invalid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $url = $input->getArgument('url'); - if (!is_string($url)) { + if (! is_string($url)) { throw new InvalidArgumentException('Invalid URL'); } $result = $this->jkuFactory->loadFromUrl($url); diff --git a/src/Component/Console/KeyAnalyzerCommand.php b/src/Component/Console/KeyAnalyzerCommand.php index c4a3318a..77c4ae0e 100644 --- a/src/Component/Console/KeyAnalyzerCommand.php +++ b/src/Component/Console/KeyAnalyzerCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -27,23 +18,19 @@ final class KeyAnalyzerCommand extends Command { - /** - * @var KeyAnalyzerManager - */ - private $analyzerManager; + protected static $defaultName = 'key:analyze'; - public function __construct(KeyAnalyzerManager $keysetAnalyzerManager, string $name = null) - { + public function __construct( + private KeyAnalyzerManager $analyzerManager, + string $name = null + ) { parent::__construct($name); - $this->analyzerManager = $keysetAnalyzerManager; } protected function configure(): void { parent::configure(); - $this - ->setName('key:analyze') - ->setDescription('JWK quality analyzer.') + $this->setDescription('JWK quality analyzer.') ->setHelp('This command will analyze a JWK object and find security issues.') ->addArgument('jwk', InputArgument::REQUIRED, 'The JWK object') ; @@ -51,35 +38,42 @@ protected function configure(): void protected function execute(InputInterface $input, OutputInterface $output): int { - $output->getFormatter()->setStyle('success', new OutputFormatterStyle('white', 'green')); - $output->getFormatter()->setStyle('high', new OutputFormatterStyle('white', 'red', ['bold'])); - $output->getFormatter()->setStyle('medium', new OutputFormatterStyle('yellow')); - $output->getFormatter()->setStyle('low', new OutputFormatterStyle('blue')); + $output->getFormatter() + ->setStyle('success', new OutputFormatterStyle('white', 'green')) + ; + $output->getFormatter() + ->setStyle('high', new OutputFormatterStyle('white', 'red', ['bold'])) + ; + $output->getFormatter() + ->setStyle('medium', new OutputFormatterStyle('yellow')) + ; + $output->getFormatter() + ->setStyle('low', new OutputFormatterStyle('blue')) + ; $jwk = $this->getKey($input); $result = $this->analyzerManager->analyze($jwk); - if (0 === $result->count()) { + if ($result->count() === 0) { $output->writeln('All good! No issue found.'); } else { foreach ($result->all() as $message) { - $output->writeln('<'.$message->getSeverity().'>* '.$message->getMessage().'getSeverity().'>'); + $output->writeln( + '<' . $message->getSeverity() . '>* ' . $message->getMessage() . 'getSeverity() . '>' + ); } } return 0; } - /** - * @throws InvalidArgumentException if the key is invalid - */ private function getKey(InputInterface $input): JWK { $jwk = $input->getArgument('jwk'); - if (!is_string($jwk)) { + if (! is_string($jwk)) { throw new InvalidArgumentException('Invalid JWK'); } $json = JsonConverter::decode($jwk); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('Invalid JWK.'); } diff --git a/src/Component/Console/KeyFileLoaderCommand.php b/src/Component/Console/KeyFileLoaderCommand.php index a53fe12b..95485fae 100644 --- a/src/Component/Console/KeyFileLoaderCommand.php +++ b/src/Component/Console/KeyFileLoaderCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -23,29 +14,25 @@ final class KeyFileLoaderCommand extends GeneratorCommand { + protected static $defaultName = 'key:load:key'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:load:key') - ->setDescription('Loads a key from a key file (JWK format)') + $this->setDescription('Loads a key from a key file (JWK format)') ->addArgument('file', InputArgument::REQUIRED, 'Filename of the key.') ->addOption('secret', 's', InputOption::VALUE_OPTIONAL, 'Secret if the key is encrypted.', null) ; } - /** - * @throws InvalidArgumentException if the file is invalid - * @throws InvalidArgumentException if the secret is invalid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $file = $input->getArgument('file'); $password = $input->getOption('secret'); - if (!is_string($file)) { + if (! is_string($file)) { throw new InvalidArgumentException('Invalid file'); } - if (null !== $password && !is_string($password)) { + if ($password !== null && ! is_string($password)) { throw new InvalidArgumentException('Invalid secret'); } $args = $this->getOptions($input); diff --git a/src/Component/Console/KeysetAnalyzerCommand.php b/src/Component/Console/KeysetAnalyzerCommand.php index 920795b7..67a7cce3 100644 --- a/src/Component/Console/KeysetAnalyzerCommand.php +++ b/src/Component/Console/KeysetAnalyzerCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -29,29 +20,20 @@ final class KeysetAnalyzerCommand extends Command { - /** - * @var KeysetAnalyzerManager - */ - private $keysetAnalyzerManager; - - /** - * @var KeyAnalyzerManager - */ - private $keyAnalyzerManager; + protected static $defaultName = 'keyset:analyze'; - public function __construct(KeysetAnalyzerManager $keysetAnalyzerManager, KeyAnalyzerManager $keyAnalyzerManager, string $name = null) - { + public function __construct( + private KeysetAnalyzerManager $keysetAnalyzerManager, + private KeyAnalyzerManager $keyAnalyzerManager, + string $name = null + ) { parent::__construct($name); - $this->keysetAnalyzerManager = $keysetAnalyzerManager; - $this->keyAnalyzerManager = $keyAnalyzerManager; } protected function configure(): void { parent::configure(); - $this - ->setName('keyset:analyze') - ->setDescription('JWKSet quality analyzer.') + $this->setDescription('JWKSet quality analyzer.') ->setHelp('This command will analyze a JWKSet object and find security issues.') ->addArgument('jwkset', InputArgument::REQUIRED, 'The JWKSet object') ; @@ -59,10 +41,18 @@ protected function configure(): void protected function execute(InputInterface $input, OutputInterface $output): int { - $output->getFormatter()->setStyle('success', new OutputFormatterStyle('white', 'green')); - $output->getFormatter()->setStyle('high', new OutputFormatterStyle('white', 'red', ['bold'])); - $output->getFormatter()->setStyle('medium', new OutputFormatterStyle('yellow')); - $output->getFormatter()->setStyle('low', new OutputFormatterStyle('blue')); + $output->getFormatter() + ->setStyle('success', new OutputFormatterStyle('white', 'green')) + ; + $output->getFormatter() + ->setStyle('high', new OutputFormatterStyle('white', 'red', ['bold'])) + ; + $output->getFormatter() + ->setStyle('medium', new OutputFormatterStyle('yellow')) + ; + $output->getFormatter() + ->setStyle('low', new OutputFormatterStyle('blue')) + ; $jwkset = $this->getKeyset($input); @@ -79,26 +69,25 @@ protected function execute(InputInterface $input, OutputInterface $output): int private function showMessages(MessageBag $messages, OutputInterface $output): void { - if (0 === $messages->count()) { + if ($messages->count() === 0) { $output->writeln(' All good! No issue found.'); } else { foreach ($messages->all() as $message) { - $output->writeln(' <'.$message->getSeverity().'>* '.$message->getMessage().'getSeverity().'>'); + $output->writeln( + ' <' . $message->getSeverity() . '>* ' . $message->getMessage() . 'getSeverity() . '>' + ); } } } - /** - * @throws InvalidArgumentException if the JWKSet is invalid - */ private function getKeyset(InputInterface $input): JWKSet { $jwkset = $input->getArgument('jwkset'); - if (!is_string($jwkset)) { + if (! is_string($jwkset)) { throw new InvalidArgumentException('Invalid JWKSet'); } $json = JsonConverter::decode($jwkset); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('Invalid JWKSet'); } diff --git a/src/Component/Console/MergeKeysetCommand.php b/src/Component/Console/MergeKeysetCommand.php index 2e28c82f..89530720 100644 --- a/src/Component/Console/MergeKeysetCommand.php +++ b/src/Component/Console/MergeKeysetCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -23,20 +14,19 @@ final class MergeKeysetCommand extends ObjectOutputCommand { + protected static $defaultName = 'keyset:merge'; + protected function configure(): void { parent::configure(); - $this - ->setName('keyset:merge') - ->setDescription('Merge several key sets into one.') - ->setHelp('This command merges several key sets into one. It is very useful when you generate e.g. RSA, EC and OKP keys and you want only one key set to rule them all.') + $this->setDescription('Merge several key sets into one.') + ->setHelp( + 'This command merges several key sets into one. It is very useful when you generate e.g. RSA, EC and OKP keys and you want only one key set to rule them all.' + ) ->addArgument('jwksets', InputArgument::REQUIRED | InputArgument::IS_ARRAY, 'The JWKSet objects') ; } - /** - * @throws InvalidArgumentException if the JWKSet is invalid - */ protected function execute(InputInterface $input, OutputInterface $output): int { /** @var string[] $keySets */ @@ -44,7 +34,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $newJwkset = new JWKSet([]); foreach ($keySets as $keySet) { $json = JsonConverter::decode($keySet); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('The argument must be a valid JWKSet.'); } $jwkset = JWKSet::createFromKeyData($json); diff --git a/src/Component/Console/NoneKeyGeneratorCommand.php b/src/Component/Console/NoneKeyGeneratorCommand.php index 21a9a061..8d1a18a6 100644 --- a/src/Component/Console/NoneKeyGeneratorCommand.php +++ b/src/Component/Console/NoneKeyGeneratorCommand.php @@ -2,15 +2,6 @@ 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\Console; use Jose\Component\KeyManagement\JWKFactory; @@ -19,12 +10,14 @@ final class NoneKeyGeneratorCommand extends GeneratorCommand { + protected static $defaultName = 'key:generate:none'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:generate:none') - ->setDescription('Generate a none key (JWK format). This key type is only supposed to be used with the "none" algorithm.') + $this->setDescription( + 'Generate a none key (JWK format). This key type is only supposed to be used with the "none" algorithm.' + ) ; } diff --git a/src/Component/Console/ObjectOutputCommand.php b/src/Component/Console/ObjectOutputCommand.php index 9b212427..12f0acb3 100644 --- a/src/Component/Console/ObjectOutputCommand.php +++ b/src/Component/Console/ObjectOutputCommand.php @@ -2,15 +2,6 @@ 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\Console; use Jose\Component\Core\Util\JsonConverter; diff --git a/src/Component/Console/OctKeyGeneratorCommand.php b/src/Component/Console/OctKeyGeneratorCommand.php index 1620bf9e..575b8d34 100644 --- a/src/Component/Console/OctKeyGeneratorCommand.php +++ b/src/Component/Console/OctKeyGeneratorCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -22,23 +13,20 @@ final class OctKeyGeneratorCommand extends GeneratorCommand { + protected static $defaultName = 'key:generate:oct'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:generate:oct') - ->setDescription('Generate an octet key (JWK format)') + $this->setDescription('Generate an octet key (JWK format)') ->addArgument('size', InputArgument::REQUIRED, 'Key size.') ; } - /** - * @throws InvalidArgumentException if the key size is not valid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $size = $input->getArgument('size'); - if (null === $size) { + if ($size === null) { $size = 1; } elseif (is_array($size)) { $size = 1; diff --git a/src/Component/Console/OctKeysetGeneratorCommand.php b/src/Component/Console/OctKeysetGeneratorCommand.php index d53430b2..9a2d9a3e 100644 --- a/src/Component/Console/OctKeysetGeneratorCommand.php +++ b/src/Component/Console/OctKeysetGeneratorCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -23,25 +14,21 @@ final class OctKeysetGeneratorCommand extends GeneratorCommand { + protected static $defaultName = 'keyset:generate:oct'; + protected function configure(): void { parent::configure(); - $this - ->setName('keyset:generate:oct') - ->setDescription('Generate a key set with octet keys (JWK format)') + $this->setDescription('Generate a key set with octet keys (JWK format)') ->addArgument('quantity', InputArgument::REQUIRED, 'Quantity of keys in the key set.') ->addArgument('size', InputArgument::REQUIRED, 'Key size.') ; } - /** - * @throws InvalidArgumentException if the quantity is not valid - * @throws InvalidArgumentException if the key size is not valid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $quantity = $input->getArgument('quantity'); - if (null === $quantity) { + if ($quantity === null) { $quantity = 1; } elseif (is_array($quantity)) { $quantity = 1; @@ -50,7 +37,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int } $size = $input->getArgument('size'); - if (null === $size) { + if ($size === null) { $size = 1; } elseif (is_array($size)) { $size = 1; diff --git a/src/Component/Console/OkpKeyGeneratorCommand.php b/src/Component/Console/OkpKeyGeneratorCommand.php index d38c2107..a99141be 100644 --- a/src/Component/Console/OkpKeyGeneratorCommand.php +++ b/src/Component/Console/OkpKeyGeneratorCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -22,23 +13,20 @@ final class OkpKeyGeneratorCommand extends GeneratorCommand { + protected static $defaultName = 'key:generate:okp'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:generate:okp') - ->setDescription('Generate an Octet Key Pair key (JWK format)') + $this->setDescription('Generate an Octet Key Pair key (JWK format)') ->addArgument('curve', InputArgument::REQUIRED, 'Curve of the key.') ; } - /** - * @throws InvalidArgumentException if the curve is not valid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $curve = $input->getArgument('curve'); - if (!is_string($curve)) { + if (! is_string($curve)) { throw new InvalidArgumentException('Invalid curve'); } $args = $this->getOptions($input); diff --git a/src/Component/Console/OkpKeysetGeneratorCommand.php b/src/Component/Console/OkpKeysetGeneratorCommand.php index 5446ddf2..bc3383c0 100644 --- a/src/Component/Console/OkpKeysetGeneratorCommand.php +++ b/src/Component/Console/OkpKeysetGeneratorCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -24,25 +15,21 @@ final class OkpKeysetGeneratorCommand extends GeneratorCommand { + protected static $defaultName = 'keyset:generate:okp'; + protected function configure(): void { parent::configure(); - $this - ->setName('keyset:generate:okp') - ->setDescription('Generate a key set with Octet Key Pairs keys (JWKSet format)') + $this->setDescription('Generate a key set with Octet Key Pairs keys (JWKSet format)') ->addArgument('quantity', InputArgument::REQUIRED, 'Quantity of keys in the key set.') ->addArgument('curve', InputArgument::REQUIRED, 'Curve of the keys.') ; } - /** - * @throws InvalidArgumentException if the curve is not valid - * @throws InvalidArgumentException if the quantity is not valid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $quantity = $input->getArgument('quantity'); - if (null === $quantity) { + if ($quantity === null) { $quantity = 1; } elseif (is_array($quantity)) { $quantity = 1; @@ -53,7 +40,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($quantity < 1) { throw new InvalidArgumentException('Invalid quantity'); } - if (!is_string($curve)) { + if (! is_string($curve)) { throw new InvalidArgumentException('Invalid curve'); } diff --git a/src/Component/Console/OptimizeRsaKeyCommand.php b/src/Component/Console/OptimizeRsaKeyCommand.php index 21c23644..4cfd8002 100644 --- a/src/Component/Console/OptimizeRsaKeyCommand.php +++ b/src/Component/Console/OptimizeRsaKeyCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -25,27 +16,24 @@ final class OptimizeRsaKeyCommand extends ObjectOutputCommand { + protected static $defaultName = 'key:optimize'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:optimize') - ->setDescription('Optimize a RSA key by calculating additional primes (CRT).') + $this->setDescription('Optimize a RSA key by calculating additional primes (CRT).') ->addArgument('jwk', InputArgument::REQUIRED, 'The RSA key.') ; } - /** - * @throws InvalidArgumentException if the key is not valid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $jwk = $input->getArgument('jwk'); - if (!is_string($jwk)) { + if (! is_string($jwk)) { throw new InvalidArgumentException('Invalid JWK'); } $json = JsonConverter::decode($jwk); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('Invalid JWK'); } $key = RSAKey::createFromJWK(new JWK($json)); diff --git a/src/Component/Console/P12CertificateLoaderCommand.php b/src/Component/Console/P12CertificateLoaderCommand.php index 0147cb47..a34c726f 100644 --- a/src/Component/Console/P12CertificateLoaderCommand.php +++ b/src/Component/Console/P12CertificateLoaderCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -23,29 +14,25 @@ final class P12CertificateLoaderCommand extends GeneratorCommand { + protected static $defaultName = 'key:load:p12'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:load:p12') - ->setDescription('Load a key from a P12 certificate file.') + $this->setDescription('Load a key from a P12 certificate file.') ->addArgument('file', InputArgument::REQUIRED, 'Filename of the P12 certificate.') ->addOption('secret', 's', InputOption::VALUE_OPTIONAL, 'Secret if the key is encrypted.', null) ; } - /** - * @throws InvalidArgumentException if the file is not valid - * @throws InvalidArgumentException if the secret is not valid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $file = $input->getArgument('file'); $password = $input->getOption('secret'); - if (!is_string($file)) { + if (! is_string($file)) { throw new InvalidArgumentException('Invalid file'); } - if (!is_string($password)) { + if (! is_string($password)) { throw new InvalidArgumentException('Invalid secret'); } $args = $this->getOptions($input); diff --git a/src/Component/Console/PemConverterCommand.php b/src/Component/Console/PemConverterCommand.php index d1cb063b..e063831c 100644 --- a/src/Component/Console/PemConverterCommand.php +++ b/src/Component/Console/PemConverterCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -26,46 +17,33 @@ final class PemConverterCommand extends ObjectOutputCommand { + protected static $defaultName = 'key:convert:pkcs1'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:convert:pkcs1') - ->setDescription('Converts a RSA or EC key into PKCS#1 key.') + $this->setDescription('Converts a RSA or EC key into PKCS#1 key.') ->addArgument('jwk', InputArgument::REQUIRED, 'The key') ; } - /** - * @throws InvalidArgumentException if the key is invalid - * @throws InvalidArgumentException if the key type is not RSA or EC - */ protected function execute(InputInterface $input, OutputInterface $output): int { $jwk = $input->getArgument('jwk'); - if (!is_string($jwk)) { + if (! is_string($jwk)) { throw new InvalidArgumentException('Invalid JWK'); } $json = JsonConverter::decode($jwk); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('Invalid JWK.'); } $key = new JWK($json); - switch ($key->get('kty')) { - case 'RSA': - $pem = RSAKey::createFromJWK($key)->toPEM(); - - break; - - case 'EC': - $pem = ECKey::convertToPEM($key); - - break; - - default: - throw new InvalidArgumentException('Not a RSA or EC key.'); - } + $pem = match ($key->get('kty')) { + 'RSA' => RSAKey::createFromJWK($key)->toPEM(), + 'EC' => ECKey::convertToPEM($key), + default => throw new InvalidArgumentException('Not a RSA or EC key.'), + }; $output->write($pem); return 0; diff --git a/src/Component/Console/PublicKeyCommand.php b/src/Component/Console/PublicKeyCommand.php index 1249864a..9577d240 100644 --- a/src/Component/Console/PublicKeyCommand.php +++ b/src/Component/Console/PublicKeyCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -24,12 +15,12 @@ final class PublicKeyCommand extends ObjectOutputCommand { + protected static $defaultName = 'key:convert:public'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:convert:public') - ->setDescription('Convert a private key into public key. Symmetric keys (shared keys) are not changed.') + $this->setDescription('Convert a private key into public key. Symmetric keys (shared keys) are not changed.') ->setHelp('This command converts a private key into a public key.') ->addArgument('jwk', InputArgument::REQUIRED, 'The JWK object') ; @@ -45,17 +36,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int return 0; } - /** - * @throws InvalidArgumentException if the key is invalid - */ private function getKey(InputInterface $input): JWK { $jwk = $input->getArgument('jwk'); - if (!is_string($jwk)) { + if (! is_string($jwk)) { throw new InvalidArgumentException('Invalid JWK'); } $json = JsonConverter::decode($jwk); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('Invalid JWK'); } diff --git a/src/Component/Console/PublicKeysetCommand.php b/src/Component/Console/PublicKeysetCommand.php index 2c017a10..c355cc12 100644 --- a/src/Component/Console/PublicKeysetCommand.php +++ b/src/Component/Console/PublicKeysetCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -24,12 +15,14 @@ final class PublicKeysetCommand extends ObjectOutputCommand { + protected static $defaultName = 'keyset:convert:public'; + protected function configure(): void { parent::configure(); - $this - ->setName('keyset:convert:public') - ->setDescription('Convert private keys in a key set into public keys. Symmetric keys (shared keys) are not changed.') + $this->setDescription( + 'Convert private keys in a key set into public keys. Symmetric keys (shared keys) are not changed.' + ) ->setHelp('This command converts private keys in a key set into public keys.') ->addArgument('jwkset', InputArgument::REQUIRED, 'The JWKSet object') ; @@ -48,17 +41,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int return 0; } - /** - * @throws InvalidArgumentException if the keyset is invalid - */ private function getKeyset(InputInterface $input): JWKSet { $jwkset = $input->getArgument('jwkset'); - if (!is_string($jwkset)) { + if (! is_string($jwkset)) { throw new InvalidArgumentException('Invalid JWKSet'); } $json = JsonConverter::decode($jwkset); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('Invalid JWKSet'); } diff --git a/src/Component/Console/RotateKeysetCommand.php b/src/Component/Console/RotateKeysetCommand.php index 25893ada..04c2e39c 100644 --- a/src/Component/Console/RotateKeysetCommand.php +++ b/src/Component/Console/RotateKeysetCommand.php @@ -2,15 +2,6 @@ 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\Console; use function count; @@ -26,12 +17,12 @@ final class RotateKeysetCommand extends ObjectOutputCommand { + protected static $defaultName = 'keyset:rotate'; + protected function configure(): void { parent::configure(); - $this - ->setName('keyset:rotate') - ->setDescription('Rotate a key set.') + $this->setDescription('Rotate a key set.') ->setHelp('This command removes the last key in a key set a place a new one at the beginning.') ->addArgument('jwkset', InputArgument::REQUIRED, 'The JWKSet object') ->addArgument('jwk', InputArgument::REQUIRED, 'The new JWK object') @@ -40,10 +31,12 @@ protected function configure(): void protected function execute(InputInterface $input, OutputInterface $output): int { - $jwkset = $this->getKeyset($input)->all(); + $jwkset = $this->getKeyset($input) + ->all() + ; $jwk = $this->getKey($input); - if (0 !== count($jwkset)) { + if (count($jwkset) !== 0) { array_pop($jwkset); } array_unshift($jwkset, $jwk); @@ -53,34 +46,28 @@ protected function execute(InputInterface $input, OutputInterface $output): int return self::SUCCESS; } - /** - * @throws InvalidArgumentException if the keyset is invalid - */ private function getKeyset(InputInterface $input): JWKSet { $jwkset = $input->getArgument('jwkset'); - if (!is_string($jwkset)) { + if (! is_string($jwkset)) { throw new InvalidArgumentException('Invalid JWKSet'); } $json = JsonConverter::decode($jwkset); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('Invalid JWKSet'); } return JWKSet::createFromKeyData($json); } - /** - * @throws InvalidArgumentException if the key is invalid - */ private function getKey(InputInterface $input): JWK { $jwk = $input->getArgument('jwk'); - if (!is_string($jwk)) { + if (! is_string($jwk)) { throw new InvalidArgumentException('Invalid JWK'); } $json = JsonConverter::decode($jwk); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('Invalid JWK'); } diff --git a/src/Component/Console/RsaKeyGeneratorCommand.php b/src/Component/Console/RsaKeyGeneratorCommand.php index d1779080..e6a8f53e 100644 --- a/src/Component/Console/RsaKeyGeneratorCommand.php +++ b/src/Component/Console/RsaKeyGeneratorCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -22,23 +13,20 @@ final class RsaKeyGeneratorCommand extends GeneratorCommand { + protected static $defaultName = 'key:generate:rsa'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:generate:rsa') - ->setDescription('Generate a RSA key (JWK format)') + $this->setDescription('Generate a RSA key (JWK format)') ->addArgument('size', InputArgument::REQUIRED, 'Key size.') ; } - /** - * @throws InvalidArgumentException if the key size is invalid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $size = $input->getArgument('size'); - if (null === $size) { + if ($size === null) { $size = 1; } elseif (is_array($size)) { $size = 1; diff --git a/src/Component/Console/RsaKeysetGeneratorCommand.php b/src/Component/Console/RsaKeysetGeneratorCommand.php index 93d6bb14..a3857a9b 100644 --- a/src/Component/Console/RsaKeysetGeneratorCommand.php +++ b/src/Component/Console/RsaKeysetGeneratorCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -23,25 +14,21 @@ final class RsaKeysetGeneratorCommand extends GeneratorCommand { + protected static $defaultName = 'keyset:generate:rsa'; + protected function configure(): void { parent::configure(); - $this - ->setName('keyset:generate:rsa') - ->setDescription('Generate a key set with RSA keys (JWK format)') + $this->setDescription('Generate a key set with RSA keys (JWK format)') ->addArgument('quantity', InputArgument::REQUIRED, 'Quantity of keys in the key set.') ->addArgument('size', InputArgument::REQUIRED, 'Key size.') ; } - /** - * @throws InvalidArgumentException if the quantity is invalid - * @throws InvalidArgumentException if the key size is invalid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $quantity = $input->getArgument('quantity'); - if (null === $quantity) { + if ($quantity === null) { $quantity = 1; } elseif (is_array($quantity)) { $quantity = 1; @@ -49,7 +36,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $quantity = (int) $quantity; } $size = $input->getArgument('size'); - if (null === $size) { + if ($size === null) { $size = 1; } elseif (is_array($size)) { $size = 1; diff --git a/src/Component/Console/SecretKeyGeneratorCommand.php b/src/Component/Console/SecretKeyGeneratorCommand.php index a0f7d0d6..2ea955e3 100644 --- a/src/Component/Console/SecretKeyGeneratorCommand.php +++ b/src/Component/Console/SecretKeyGeneratorCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -24,35 +15,36 @@ final class SecretKeyGeneratorCommand extends GeneratorCommand { + protected static $defaultName = 'key:generate:from_secret'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:generate:from_secret') - ->setDescription('Generate an octet key (JWK format) using an existing secret') + $this->setDescription('Generate an octet key (JWK format) using an existing secret') ->addArgument('secret', InputArgument::REQUIRED, 'The secret') - ->addOption('is_b64', 'b', InputOption::VALUE_NONE, 'Indicates if the secret is Base64 encoded (useful for binary secrets)') + ->addOption( + 'is_b64', + 'b', + InputOption::VALUE_NONE, + 'Indicates if the secret is Base64 encoded (useful for binary secrets)' + ) ; } - /** - * @throws InvalidArgumentException if the secret is invalid - * @throws InvalidArgumentException if the option "is_b4" is not a boolean - */ protected function execute(InputInterface $input, OutputInterface $output): int { $secret = $input->getArgument('secret'); - if (!is_string($secret)) { + if (! is_string($secret)) { throw new InvalidArgumentException('Invalid secret'); } $isBsae64Encoded = $input->getOption('is_b64'); - if (!is_bool($isBsae64Encoded)) { + if (! is_bool($isBsae64Encoded)) { throw new InvalidArgumentException('Invalid option value for "is_b64"'); } if ($isBsae64Encoded) { $secret = base64_decode($secret, true); } - if (!is_string($secret)) { + if (! is_string($secret)) { throw new InvalidArgumentException('Invalid secret'); } $args = $this->getOptions($input); diff --git a/src/Component/Console/X509CertificateLoaderCommand.php b/src/Component/Console/X509CertificateLoaderCommand.php index 96a0e659..f100796c 100644 --- a/src/Component/Console/X509CertificateLoaderCommand.php +++ b/src/Component/Console/X509CertificateLoaderCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -22,29 +13,26 @@ final class X509CertificateLoaderCommand extends GeneratorCommand { + protected static $defaultName = 'key:load:x509'; + protected function configure(): void { parent::configure(); - $this - ->setName('key:load:x509') - ->setDescription('Load a key from a X.509 certificate file.') + $this->setDescription('Load a key from a X.509 certificate file.') ->addArgument('file', InputArgument::REQUIRED, 'Filename of the X.509 certificate.') ; } - /** - * @throws InvalidArgumentException if the file is invalid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $file = $input->getArgument('file'); - if (!is_string($file)) { + if (! is_string($file)) { throw new InvalidArgumentException('Invalid file'); } $args = []; foreach (['use', 'alg'] as $key) { $value = $input->getOption($key); - if (null !== $value) { + if ($value !== null) { $args[$key] = $value; } } diff --git a/src/Component/Console/X5ULoaderCommand.php b/src/Component/Console/X5ULoaderCommand.php index 5bcfc0c4..a12726cd 100644 --- a/src/Component/Console/X5ULoaderCommand.php +++ b/src/Component/Console/X5ULoaderCommand.php @@ -2,15 +2,6 @@ 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\Console; use InvalidArgumentException; @@ -22,35 +13,30 @@ final class X5ULoaderCommand extends ObjectOutputCommand { - /** - * @var X5UFactory - */ - private $x5uFactory; + protected static $defaultName = 'keyset:load:x5u'; - public function __construct(X5UFactory $x5uFactory, ?string $name = null) - { - $this->x5uFactory = $x5uFactory; + public function __construct( + private X5UFactory $x5uFactory, + ?string $name = null + ) { parent::__construct($name); } protected function configure(): void { parent::configure(); - $this - ->setName('keyset:load:x5u') - ->setDescription('Loads a key set from an url.') - ->setHelp('This command will try to get a key set from an URL. The distant key set is list of X.509 certificates.') + $this->setDescription('Loads a key set from an url.') + ->setHelp( + 'This command will try to get a key set from an URL. The distant key set is list of X.509 certificates.' + ) ->addArgument('url', InputArgument::REQUIRED, 'The URL') ; } - /** - * @throws InvalidArgumentException if the URL is invalid - */ protected function execute(InputInterface $input, OutputInterface $output): int { $url = $input->getArgument('url'); - if (!is_string($url)) { + if (! is_string($url)) { throw new InvalidArgumentException('Invalid URL'); } $result = $this->x5uFactory->loadFromUrl($url); diff --git a/src/Component/Console/composer.json b/src/Component/Console/composer.json index 052ae8da..459791ea 100644 --- a/src/Component/Console/composer.json +++ b/src/Component/Console/composer.json @@ -20,7 +20,7 @@ } }, "require": { - "symfony/console": "^4.2|^5.0", + "symfony/console": "^5.4|^6.0", "web-token/jwt-key-mgmt": "^2.1" } } diff --git a/src/Component/Core/Algorithm.php b/src/Component/Core/Algorithm.php index 87e445bb..6c419cf0 100644 --- a/src/Component/Core/Algorithm.php +++ b/src/Component/Core/Algorithm.php @@ -2,15 +2,6 @@ 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\Core; interface Algorithm diff --git a/src/Component/Core/AlgorithmManager.php b/src/Component/Core/AlgorithmManager.php index 91b41a8a..1b353e25 100644 --- a/src/Component/Core/AlgorithmManager.php +++ b/src/Component/Core/AlgorithmManager.php @@ -2,15 +2,6 @@ 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\Core; use function array_key_exists; @@ -18,10 +9,7 @@ class AlgorithmManager { - /** - * @var array - */ - private $algorithms = []; + private array $algorithms = []; /** * @param Algorithm[] $algorithms @@ -57,12 +45,10 @@ public function list(): array * Returns the algorithm if supported, otherwise throw an exception. * * @param string $algorithm The algorithm - * - * @throws InvalidArgumentException if the algorithm is not supported */ public function get(string $algorithm): Algorithm { - if (!$this->has($algorithm)) { + if (! $this->has($algorithm)) { throw new InvalidArgumentException(sprintf('The algorithm "%s" is not supported.', $algorithm)); } diff --git a/src/Component/Core/AlgorithmManagerFactory.php b/src/Component/Core/AlgorithmManagerFactory.php index 34e76313..106d8867 100644 --- a/src/Component/Core/AlgorithmManagerFactory.php +++ b/src/Component/Core/AlgorithmManagerFactory.php @@ -2,15 +2,6 @@ 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\Core; use InvalidArgumentException; @@ -26,8 +17,8 @@ class AlgorithmManagerFactory /** * Adds an algorithm. * - * Each algorithm is identified by an alias hence it is allowed to have the same algorithm twice (or more). - * This can be helpful when an algorithm have several configuration options. + * Each algorithm is identified by an alias hence it is allowed to have the same algorithm twice (or more). This can + * be helpful when an algorithm have several configuration options. */ public function add(string $alias, Algorithm $algorithm): void { @@ -45,8 +36,8 @@ public function aliases(): array } /** - * Returns all algorithms supported by this factory. - * This is an associative array. Keys are the aliases of the algorithms. + * Returns all algorithms supported by this factory. This is an associative array. Keys are the aliases of the + * algorithms. * * @return Algorithm[] */ @@ -59,18 +50,19 @@ public function all(): array * Create an algorithm manager using the given aliases. * * @param string[] $aliases - * - * @throws InvalidArgumentException if the alias is invalid or is not supported */ public function create(array $aliases): AlgorithmManager { $algorithms = []; foreach ($aliases as $alias) { - if (!is_string($alias)) { + if (! is_string($alias)) { throw new InvalidArgumentException('Invalid alias'); } - if (!isset($this->algorithms[$alias])) { - throw new InvalidArgumentException(sprintf('The algorithm with the alias "%s" is not supported.', $alias)); + if (! isset($this->algorithms[$alias])) { + throw new InvalidArgumentException(sprintf( + 'The algorithm with the alias "%s" is not supported.', + $alias + )); } $algorithms[] = $this->algorithms[$alias]; } diff --git a/src/Component/Core/JWK.php b/src/Component/Core/JWK.php index 6b9ec16a..5379e2ef 100644 --- a/src/Component/Core/JWK.php +++ b/src/Component/Core/JWK.php @@ -2,21 +2,14 @@ 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\Core; use function array_key_exists; use function in_array; use InvalidArgumentException; use function is_array; +use const JSON_UNESCAPED_SLASHES; +use const JSON_UNESCAPED_UNICODE; use JsonSerializable; use ParagonIE\ConstantTime\Base64UrlSafe; @@ -28,14 +21,11 @@ class JWK implements JsonSerializable private $values = []; /** - * Creates a JWK object using the given values. - * The member "kty" is mandatory. Other members are NOT checked. - * - * @throws InvalidArgumentException if the key parameter "kty" is missing + * Creates a JWK object using the given values. The member "kty" is mandatory. Other members are NOT checked. */ public function __construct(array $values) { - if (!isset($values['kty'])) { + if (! isset($values['kty'])) { throw new InvalidArgumentException('The parameter "kty" is mandatory.'); } $this->values = $values; @@ -43,15 +33,11 @@ public function __construct(array $values) /** * Creates a JWK object using the given Json string. - * - * @throws InvalidArgumentException if the data is not valid - * - * @return JWK */ public static function createFromJson(string $json): self { $data = json_decode($json, true); - if (!is_array($data)) { + if (! is_array($data)) { throw new InvalidArgumentException('Invalid argument.'); } @@ -71,13 +57,11 @@ public function jsonSerialize(): array * * @param string $key The key * - * @throws InvalidArgumentException if the key does not exist - * - * @return null|mixed + * @return mixed|null */ public function get(string $key) { - if (!$this->has($key)) { + if (! $this->has($key)) { throw new InvalidArgumentException(sprintf('The value identified by "%s" does not exist.', $key)); } @@ -108,18 +92,16 @@ public function all(): array * Returns the thumbprint of the key. * * @see https://tools.ietf.org/html/rfc7638 - * - * @throws InvalidArgumentException if the hashing function is not supported */ public function thumbprint(string $hash_algorithm): string { - if (!in_array($hash_algorithm, hash_algos(), true)) { + if (! in_array($hash_algorithm, hash_algos(), true)) { throw new InvalidArgumentException(sprintf('The hash algorithm "%s" is not supported.', $hash_algorithm)); } $values = array_intersect_key($this->values, array_flip(['kty', 'n', 'e', 'crv', 'x', 'y', 'k'])); ksort($values); $input = json_encode($values, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - if (false === $input) { + if ($input === false) { throw new InvalidArgumentException('Unable to compute the key thumbprint'); } @@ -134,8 +116,6 @@ public function thumbprint(string $hash_algorithm): string * - unknown keys. * * Known keys are "oct", "RSA", "EC" and "OKP". - * - * @return JWK */ public function toPublic(): self { diff --git a/src/Component/Core/JWKSet.php b/src/Component/Core/JWKSet.php index c72cea23..b72646f1 100644 --- a/src/Component/Core/JWKSet.php +++ b/src/Component/Core/JWKSet.php @@ -2,20 +2,12 @@ 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\Core; use function array_key_exists; use ArrayIterator; use function count; +use const COUNT_NORMAL; use Countable; use function in_array; use InvalidArgumentException; @@ -33,13 +25,11 @@ class JWKSet implements Countable, IteratorAggregate, JsonSerializable /** * @param JWK[] $keys - * - * @throws InvalidArgumentException if the list is invalid */ public function __construct(array $keys) { foreach ($keys as $k => $key) { - if (!$key instanceof JWK) { + if (! $key instanceof JWK) { throw new InvalidArgumentException('Invalid list. Should only contains JWK objects'); } @@ -54,17 +44,13 @@ public function __construct(array $keys) /** * Creates a JWKSet object using the given values. - * - * @throws InvalidArgumentException if the keyset is not valid - * - * @return JWKSet */ public static function createFromKeyData(array $data): self { - if (!isset($data['keys'])) { + if (! isset($data['keys'])) { throw new InvalidArgumentException('Invalid data.'); } - if (!is_array($data['keys'])) { + if (! is_array($data['keys'])) { throw new InvalidArgumentException('Invalid data.'); } @@ -83,15 +69,11 @@ public static function createFromKeyData(array $data): self /** * Creates a JWKSet object using the given Json string. - * - * @throws InvalidArgumentException if the data is not valid - * - * @return JWKSet */ public static function createFromJson(string $json): self { $data = json_decode($json, true); - if (!is_array($data)) { + if (! is_array($data)) { throw new InvalidArgumentException('Invalid argument.'); } @@ -109,10 +91,7 @@ public function all(): array } /** - * Add key to store in the key set. - * This method is immutable and will return a new object. - * - * @return JWKSet + * Add key to store in the key set. This method is immutable and will return a new object. */ public function with(JWK $jwk): self { @@ -128,16 +107,13 @@ public function with(JWK $jwk): self } /** - * Remove key from the key set. - * This method is immutable and will return a new object. + * Remove key from the key set. This method is immutable and will return a new object. * * @param int|string $key Key to remove from the key set - * - * @return JWKSet */ - public function without($key): self + public function without(int|string $key): self { - if (!$this->has($key)) { + if (! $this->has($key)) { return $this; } @@ -149,24 +125,18 @@ public function without($key): self /** * Returns true if the key set contains a key with the given index. - * - * @param int|string $index */ - public function has($index): bool + public function has(int|string $index): bool { return array_key_exists($index, $this->keys); } /** * Returns the key with the given index. Throws an exception if the index is not present in the key store. - * - * @param int|string $index - * - * @throws InvalidArgumentException if the index is not defined */ - public function get($index): JWK + public function get(int|string $index): JWK { - if (!$this->has($index)) { + if (! $this->has($index)) { throw new InvalidArgumentException('Undefined index.'); } @@ -178,7 +148,9 @@ public function get($index): JWK */ public function jsonSerialize(): array { - return ['keys' => array_values($this->keys)]; + return [ + 'keys' => array_values($this->keys), + ]; } /** @@ -192,18 +164,15 @@ public function count($mode = COUNT_NORMAL): int } /** - * Try to find a key that fits on the selected requirements. - * Returns null if not found. + * Try to find a key that fits on the selected requirements. Returns null if not found. * * @param string $type Must be 'sig' (signature) or 'enc' (encryption) - * @param null|Algorithm $algorithm Specifies the algorithm to be used + * @param Algorithm|null $algorithm Specifies the algorithm to be used * @param array $restrictions More restrictions such as 'kid' or 'kty' - * - * @throws InvalidArgumentException if the key type is not valid (must be "sig" or "enc") */ public function selectKey(string $type, ?Algorithm $algorithm = null, array $restrictions = []): ?JWK { - if (!in_array($type, ['enc', 'sig'], true)) { + if (! in_array($type, ['enc', 'sig'], true)) { throw new InvalidArgumentException('Allowed key types are "sig" or "enc".'); } @@ -212,25 +181,28 @@ public function selectKey(string $type, ?Algorithm $algorithm = null, array $res $ind = 0; $can_use = $this->canKeyBeUsedFor($type, $key); - if (false === $can_use) { + if ($can_use === false) { continue; } $ind += $can_use; $alg = $this->canKeyBeUsedWithAlgorithm($algorithm, $key); - if (false === $alg) { + if ($alg === false) { continue; } $ind += $alg; - if (false === $this->doesKeySatisfyRestrictions($restrictions, $key)) { + if ($this->doesKeySatisfyRestrictions($restrictions, $key) === false) { continue; } - $result[] = ['key' => $key, 'ind' => $ind]; + $result[] = [ + 'key' => $key, + 'ind' => $ind, + ]; } - if (0 === count($result)) { + if (count($result) === 0) { return null; } @@ -264,20 +236,17 @@ public function getIterator(): Traversable return new ArrayIterator($this->keys); } - /** - * @throws InvalidArgumentException if the key does not fulfill with the "key_ops" constraint - * - * @return bool|int - */ - private function canKeyBeUsedFor(string $type, JWK $key) + private function canKeyBeUsedFor(string $type, JWK $key): bool|int { if ($key->has('use')) { return $type === $key->get('use') ? 1 : false; } if ($key->has('key_ops')) { $key_ops = $key->get('key_ops'); - if (!is_array($key_ops)) { - throw new InvalidArgumentException('Invalid key parameter "key_ops". Should be a list of key operations'); + if (! is_array($key_ops)) { + throw new InvalidArgumentException( + 'Invalid key parameter "key_ops". Should be a list of key operations' + ); } return $type === self::convertKeyOpsToKeyUse($key_ops) ? 1 : false; @@ -286,15 +255,12 @@ private function canKeyBeUsedFor(string $type, JWK $key) return 0; } - /** - * @return bool|int - */ - private function canKeyBeUsedWithAlgorithm(?Algorithm $algorithm, JWK $key) + private function canKeyBeUsedWithAlgorithm(?Algorithm $algorithm, JWK $key): bool|int { - if (null === $algorithm) { + if ($algorithm === null) { return 0; } - if (!in_array($key->get('kty'), $algorithm->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $algorithm->allowedKeyTypes(), true)) { return false; } if ($key->has('alg')) { @@ -307,7 +273,7 @@ private function canKeyBeUsedWithAlgorithm(?Algorithm $algorithm, JWK $key) private function doesKeySatisfyRestrictions(array $restrictions, JWK $key): bool { foreach ($restrictions as $k => $v) { - if (!$key->has($k) || $v !== $key->get($k)) { + if (! $key->has($k) || $v !== $key->get($k)) { return false; } } @@ -315,26 +281,23 @@ private function doesKeySatisfyRestrictions(array $restrictions, JWK $key): bool return true; } - /** - * @throws InvalidArgumentException if the key operation is not supported - */ private static function convertKeyOpsToKeyUse(array $key_ops): string { - switch (true) { - case in_array('verify', $key_ops, true): - case in_array('sign', $key_ops, true): - return 'sig'; - - case in_array('encrypt', $key_ops, true): - case in_array('decrypt', $key_ops, true): - case in_array('wrapKey', $key_ops, true): - case in_array('unwrapKey', $key_ops, true): - case in_array('deriveKey', $key_ops, true): - case in_array('deriveBits', $key_ops, true): - return 'enc'; - - default: - throw new InvalidArgumentException(sprintf('Unsupported key operation value "%s"', implode(', ', $key_ops))); - } + return match (true) { + in_array('verify', $key_ops, true), in_array('sign', $key_ops, true) => 'sig', + in_array('encrypt', $key_ops, true), in_array('decrypt', $key_ops, true), in_array( + 'wrapKey', + $key_ops, + true + ), in_array( + 'unwrapKey', + $key_ops, + true + ), in_array('deriveKey', $key_ops, true), in_array('deriveBits', $key_ops, true) => 'enc', + default => throw new InvalidArgumentException(sprintf( + 'Unsupported key operation value "%s"', + implode(', ', $key_ops) + )), + }; } } diff --git a/src/Component/Core/JWT.php b/src/Component/Core/JWT.php index d3a6065f..69e7b6b3 100644 --- a/src/Component/Core/JWT.php +++ b/src/Component/Core/JWT.php @@ -2,22 +2,12 @@ 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\Core; interface JWT { /** - * Returns the payload of the JWT. - * null is a valid payload (e.g. JWS with detached payload). + * Returns the payload of the JWT. null is a valid payload (e.g. JWS with detached payload). */ public function getPayload(): ?string; } diff --git a/src/Component/Core/Util/BigInteger.php b/src/Component/Core/Util/BigInteger.php index 198a1be5..ec2086a9 100644 --- a/src/Component/Core/Util/BigInteger.php +++ b/src/Component/Core/Util/BigInteger.php @@ -2,15 +2,6 @@ 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\Core\Util; use Brick\Math\BigInteger as BrickBigInteger; @@ -20,27 +11,17 @@ /** * @internal */ -class BigInteger +final class BigInteger { - /** - * Holds the BigInteger's value. - * - * @var BrickBigInteger - */ - private $value; - - private function __construct(BrickBigInteger $value) - { - $this->value = $value; + private function __construct( + private BrickBigInteger $value + ) { } - /** - * @return BigInteger - */ public static function createFromBinaryString(string $value): self { $res = unpack('H*', $value); - if (false === $res) { + if ($res === false) { throw new InvalidArgumentException('Unable to convert the value'); } $data = current($res); @@ -48,17 +29,11 @@ public static function createFromBinaryString(string $value): self return new self(BrickBigInteger::fromBase($data, 16)); } - /** - * @return BigInteger - */ public static function createFromDecimal(int $value): self { return new self(BrickBigInteger::of($value)); } - /** - * @return BigInteger - */ public static function createFromBigInteger(BrickBigInteger $value): self { return new self($value); @@ -74,9 +49,9 @@ public function toBytes(): string } $temp = $this->value->toBase(16); - $temp = 0 !== (mb_strlen($temp, '8bit') & 1) ? '0'.$temp : $temp; + $temp = 0 !== (mb_strlen($temp, '8bit') & 1) ? '0' . $temp : $temp; $temp = hex2bin($temp); - if (false === $temp) { + if ($temp === false) { throw new InvalidArgumentException('Unable to convert the value into bytes'); } @@ -85,10 +60,6 @@ public function toBytes(): string /** * Adds two BigIntegers. - * - * @param BigInteger $y - * - * @return BigInteger */ public function add(self $y): self { @@ -99,10 +70,6 @@ public function add(self $y): self /** * Subtracts two BigIntegers. - * - * @param BigInteger $y - * - * @return BigInteger */ public function subtract(self $y): self { @@ -113,10 +80,6 @@ public function subtract(self $y): self /** * Multiplies two BigIntegers. - * - * @param BigInteger $x - * - * @return BigInteger */ public function multiply(self $x): self { @@ -127,10 +90,6 @@ public function multiply(self $x): self /** * Divides two BigIntegers. - * - * @param BigInteger $x - * - * @return BigInteger */ public function divide(self $x): self { @@ -141,11 +100,6 @@ public function divide(self $x): self /** * Performs modular exponentiation. - * - * @param BigInteger $e - * @param BigInteger $n - * - * @return BigInteger */ public function modPow(self $e, self $n): self { @@ -156,10 +110,6 @@ public function modPow(self $e, self $n): self /** * Performs modular exponentiation. - * - * @param BigInteger $d - * - * @return BigInteger */ public function mod(self $d): self { @@ -168,52 +118,34 @@ public function mod(self $d): self return new self($value); } - public function modInverse(BigInteger $m): BigInteger + public function modInverse(self $m): self { return new self($this->value->modInverse($m->value)); } /** * Compares two numbers. - * - * @param BigInteger $y */ public function compare(self $y): int { return $this->value->compareTo($y->value); } - /** - * @param BigInteger $y - */ public function equals(self $y): bool { return $this->value->isEqualTo($y->value); } - /** - * @param BigInteger $y - * - * @return BigInteger - */ public static function random(self $y): self { return new self(BrickBigInteger::randomRange(0, $y->value)); } - /** - * @param BigInteger $y - * - * @return BigInteger - */ public function gcd(self $y): self { return new self($this->value->gcd($y->value)); } - /** - * @param BigInteger $y - */ public function lowerThan(self $y): bool { return $this->value->isLessThan($y->value); diff --git a/src/Component/Core/Util/ECKey.php b/src/Component/Core/Util/ECKey.php index 27f1477d..541e146c 100644 --- a/src/Component/Core/Util/ECKey.php +++ b/src/Component/Core/Util/ECKey.php @@ -2,28 +2,22 @@ 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\Core\Util; use function extension_loaded; use InvalidArgumentException; use function is_array; use Jose\Component\Core\JWK; +use const OPENSSL_KEYTYPE_EC; use ParagonIE\ConstantTime\Base64UrlSafe; +use const PHP_EOL; use RuntimeException; +use const STR_PAD_LEFT; /** * @internal */ -class ECKey +final class ECKey { public static function convertToPEM(JWK $jwk): string { @@ -34,76 +28,36 @@ public static function convertToPEM(JWK $jwk): string return self::convertPublicKeyToPEM($jwk); } - /** - * @throws InvalidArgumentException if the curve is not supported - */ public static function convertPublicKeyToPEM(JWK $jwk): string { - switch ($jwk->get('crv')) { - case 'P-256': - $der = self::p256PublicKey(); - - break; - - case 'secp256k1': - $der = self::p256KPublicKey(); - - break; - - case 'P-384': - $der = self::p384PublicKey(); - - break; - - case 'P-521': - $der = self::p521PublicKey(); - - break; - - default: - throw new InvalidArgumentException('Unsupported curve.'); - } + $der = match ($jwk->get('crv')) { + 'P-256' => self::p256PublicKey(), + 'secp256k1' => self::p256KPublicKey(), + 'P-384' => self::p384PublicKey(), + 'P-521' => self::p521PublicKey(), + default => throw new InvalidArgumentException('Unsupported curve.'), + }; $der .= self::getKey($jwk); - $pem = '-----BEGIN PUBLIC KEY-----'.PHP_EOL; + $pem = '-----BEGIN PUBLIC KEY-----' . PHP_EOL; $pem .= chunk_split(base64_encode($der), 64, PHP_EOL); - $pem .= '-----END PUBLIC KEY-----'.PHP_EOL; + $pem .= '-----END PUBLIC KEY-----' . PHP_EOL; return $pem; } - /** - * @throws InvalidArgumentException if the curve is not supported - */ public static function convertPrivateKeyToPEM(JWK $jwk): string { - switch ($jwk->get('crv')) { - case 'P-256': - $der = self::p256PrivateKey($jwk); - - break; - - case 'secp256k1': - $der = self::p256KPrivateKey($jwk); - - break; - - case 'P-384': - $der = self::p384PrivateKey($jwk); - - break; - - case 'P-521': - $der = self::p521PrivateKey($jwk); - - break; - - default: - throw new InvalidArgumentException('Unsupported curve.'); - } + $der = match ($jwk->get('crv')) { + 'P-256' => self::p256PrivateKey($jwk), + 'secp256k1' => self::p256KPrivateKey($jwk), + 'P-384' => self::p384PrivateKey($jwk), + 'P-521' => self::p521PrivateKey($jwk), + default => throw new InvalidArgumentException('Unsupported curve.'), + }; $der .= self::getKey($jwk); - $pem = '-----BEGIN EC PRIVATE KEY-----'.PHP_EOL; + $pem = '-----BEGIN EC PRIVATE KEY-----' . PHP_EOL; $pem .= chunk_split(base64_encode($der), 64, PHP_EOL); - $pem .= '-----END EC PRIVATE KEY-----'.PHP_EOL; + $pem .= '-----END EC PRIVATE KEY-----' . PHP_EOL; return $pem; } @@ -122,53 +76,38 @@ public static function createECKey(string $curve, array $values = []): JWK return new JWK($values); } - /** - * @throws InvalidArgumentException if the curve is not supported - */ private static function getNistCurveSize(string $curve): int { - switch ($curve) { - case 'P-256': - case 'secp256k1': - return 256; - - case 'P-384': - return 384; - - case 'P-521': - return 521; - - default: - throw new InvalidArgumentException(sprintf('The curve "%s" is not supported.', $curve)); - } + return match ($curve) { + 'P-256', 'secp256k1' => 256, + 'P-384' => 384, + 'P-521' => 521, + default => throw new InvalidArgumentException(sprintf('The curve "%s" is not supported.', $curve)), + }; } - /** - * @throws RuntimeException if the extension OpenSSL is not available - * @throws RuntimeException if the key cannot be created - */ private static function createECKeyUsingOpenSSL(string $curve): array { - if (!extension_loaded('openssl')) { + if (! extension_loaded('openssl')) { throw new RuntimeException('Please install the OpenSSL extension'); } $key = openssl_pkey_new([ 'curve_name' => self::getOpensslCurveName($curve), 'private_key_type' => OPENSSL_KEYTYPE_EC, ]); - if (false === $key) { + if ($key === false) { throw new RuntimeException('Unable to create the key'); } $result = openssl_pkey_export($key, $out); - if (false === $result) { + if ($result === false) { throw new RuntimeException('Unable to create the key'); } $res = openssl_pkey_get_private($out); - if (false === $res) { + if ($res === false) { throw new RuntimeException('Unable to create the key'); } $details = openssl_pkey_get_details($res); - if (false === $details) { + if ($details === false) { throw new InvalidArgumentException('Unable to get the key details'); } $nistCurveSize = self::getNistCurveSize($curve); @@ -176,33 +115,27 @@ private static function createECKeyUsingOpenSSL(string $curve): array return [ 'kty' => 'EC', 'crv' => $curve, - 'd' => Base64UrlSafe::encodeUnpadded(str_pad($details['ec']['d'], (int) ceil($nistCurveSize / 8), "\0", STR_PAD_LEFT)), - 'x' => Base64UrlSafe::encodeUnpadded(str_pad($details['ec']['x'], (int) ceil($nistCurveSize / 8), "\0", STR_PAD_LEFT)), - 'y' => Base64UrlSafe::encodeUnpadded(str_pad($details['ec']['y'], (int) ceil($nistCurveSize / 8), "\0", STR_PAD_LEFT)), + 'd' => Base64UrlSafe::encodeUnpadded( + str_pad($details['ec']['d'], (int) ceil($nistCurveSize / 8), "\0", STR_PAD_LEFT) + ), + 'x' => Base64UrlSafe::encodeUnpadded( + str_pad($details['ec']['x'], (int) ceil($nistCurveSize / 8), "\0", STR_PAD_LEFT) + ), + 'y' => Base64UrlSafe::encodeUnpadded( + str_pad($details['ec']['y'], (int) ceil($nistCurveSize / 8), "\0", STR_PAD_LEFT) + ), ]; } - /** - * @throws InvalidArgumentException if the curve is not supported - */ private static function getOpensslCurveName(string $curve): string { - switch ($curve) { - case 'P-256': - return 'prime256v1'; - - case 'secp256k1': - return 'secp256k1'; - - case 'P-384': - return 'secp384r1'; - - case 'P-521': - return 'secp521r1'; - - default: - throw new InvalidArgumentException(sprintf('The curve "%s" is not supported.', $curve)); - } + return match ($curve) { + 'P-256' => 'prime256v1', + 'secp256k1' => 'secp256k1', + 'P-384' => 'secp384r1', + 'P-521' => 'secp521r1', + default => throw new InvalidArgumentException(sprintf('The curve "%s" is not supported.', $curve)), + }; } private static function p256PublicKey(): string @@ -210,13 +143,13 @@ private static function p256PublicKey(): string return pack( 'H*', '3059' // SEQUENCE, length 89 - .'3013' // SEQUENCE, length 19 - .'0607' // OID, length 7 - .'2a8648ce3d0201' // 1.2.840.10045.2.1 = EC Public Key - .'0608' // OID, length 8 - .'2a8648ce3d030107' // 1.2.840.10045.3.1.7 = P-256 Curve - .'0342' // BIT STRING, length 66 - .'00' // prepend with NUL - pubkey will follow + . '3013' // SEQUENCE, length 19 + . '0607' // OID, length 7 + . '2a8648ce3d0201' // 1.2.840.10045.2.1 = EC Public Key + . '0608' // OID, length 8 + . '2a8648ce3d030107' // 1.2.840.10045.3.1.7 = P-256 Curve + . '0342' // BIT STRING, length 66 + . '00' // prepend with NUL - pubkey will follow ); } @@ -225,13 +158,13 @@ private static function p256KPublicKey(): string return pack( 'H*', '3056' // SEQUENCE, length 86 - .'3010' // SEQUENCE, length 16 - .'0607' // OID, length 7 - .'2a8648ce3d0201' // 1.2.840.10045.2.1 = EC Public Key - .'0605' // OID, length 8 - .'2B8104000A' // 1.3.132.0.10 secp256k1 - .'0342' // BIT STRING, length 66 - .'00' // prepend with NUL - pubkey will follow + . '3010' // SEQUENCE, length 16 + . '0607' // OID, length 7 + . '2a8648ce3d0201' // 1.2.840.10045.2.1 = EC Public Key + . '0605' // OID, length 8 + . '2B8104000A' // 1.3.132.0.10 secp256k1 + . '0342' // BIT STRING, length 66 + . '00' // prepend with NUL - pubkey will follow ); } @@ -240,13 +173,13 @@ private static function p384PublicKey(): string return pack( 'H*', '3076' // SEQUENCE, length 118 - .'3010' // SEQUENCE, length 16 - .'0607' // OID, length 7 - .'2a8648ce3d0201' // 1.2.840.10045.2.1 = EC Public Key - .'0605' // OID, length 5 - .'2b81040022' // 1.3.132.0.34 = P-384 Curve - .'0362' // BIT STRING, length 98 - .'00' // prepend with NUL - pubkey will follow + . '3010' // SEQUENCE, length 16 + . '0607' // OID, length 7 + . '2a8648ce3d0201' // 1.2.840.10045.2.1 = EC Public Key + . '0605' // OID, length 5 + . '2b81040022' // 1.3.132.0.34 = P-384 Curve + . '0362' // BIT STRING, length 98 + . '00' // prepend with NUL - pubkey will follow ); } @@ -255,101 +188,101 @@ private static function p521PublicKey(): string return pack( 'H*', '30819b' // SEQUENCE, length 154 - .'3010' // SEQUENCE, length 16 - .'0607' // OID, length 7 - .'2a8648ce3d0201' // 1.2.840.10045.2.1 = EC Public Key - .'0605' // OID, length 5 - .'2b81040023' // 1.3.132.0.35 = P-521 Curve - .'038186' // BIT STRING, length 134 - .'00' // prepend with NUL - pubkey will follow + . '3010' // SEQUENCE, length 16 + . '0607' // OID, length 7 + . '2a8648ce3d0201' // 1.2.840.10045.2.1 = EC Public Key + . '0605' // OID, length 5 + . '2b81040023' // 1.3.132.0.35 = P-521 Curve + . '038186' // BIT STRING, length 134 + . '00' // prepend with NUL - pubkey will follow ); } private static function p256PrivateKey(JWK $jwk): string { $d = unpack('H*', str_pad(Base64UrlSafe::decode($jwk->get('d')), 32, "\0", STR_PAD_LEFT)); - if (!is_array($d) || !isset($d[1])) { + if (! is_array($d) || ! isset($d[1])) { throw new InvalidArgumentException('Unable to get the private key'); } return pack( 'H*', '3077' // SEQUENCE, length 87+length($d)=32 - .'020101' // INTEGER, 1 - .'0420' // OCTET STRING, length($d) = 32 - .$d[1] - .'a00a' // TAGGED OBJECT #0, length 10 - .'0608' // OID, length 8 - .'2a8648ce3d030107' // 1.3.132.0.34 = P-256 Curve - .'a144' // TAGGED OBJECT #1, length 68 - .'0342' // BIT STRING, length 66 - .'00' // prepend with NUL - pubkey will follow + . '020101' // INTEGER, 1 + . '0420' // OCTET STRING, length($d) = 32 + . $d[1] + . 'a00a' // TAGGED OBJECT #0, length 10 + . '0608' // OID, length 8 + . '2a8648ce3d030107' // 1.3.132.0.34 = P-256 Curve + . 'a144' // TAGGED OBJECT #1, length 68 + . '0342' // BIT STRING, length 66 + . '00' // prepend with NUL - pubkey will follow ); } private static function p256KPrivateKey(JWK $jwk): string { $d = unpack('H*', str_pad(Base64UrlSafe::decode($jwk->get('d')), 32, "\0", STR_PAD_LEFT)); - if (!is_array($d) || !isset($d[1])) { + if (! is_array($d) || ! isset($d[1])) { throw new InvalidArgumentException('Unable to get the private key'); } return pack( 'H*', '3074' // SEQUENCE, length 84+length($d)=32 - .'020101' // INTEGER, 1 - .'0420' // OCTET STRING, length($d) = 32 - .$d[1] - .'a007' // TAGGED OBJECT #0, length 7 - .'0605' // OID, length 5 - .'2b8104000a' // 1.3.132.0.10 secp256k1 - .'a144' // TAGGED OBJECT #1, length 68 - .'0342' // BIT STRING, length 66 - .'00' // prepend with NUL - pubkey will follow + . '020101' // INTEGER, 1 + . '0420' // OCTET STRING, length($d) = 32 + . $d[1] + . 'a007' // TAGGED OBJECT #0, length 7 + . '0605' // OID, length 5 + . '2b8104000a' // 1.3.132.0.10 secp256k1 + . 'a144' // TAGGED OBJECT #1, length 68 + . '0342' // BIT STRING, length 66 + . '00' // prepend with NUL - pubkey will follow ); } private static function p384PrivateKey(JWK $jwk): string { $d = unpack('H*', str_pad(Base64UrlSafe::decode($jwk->get('d')), 48, "\0", STR_PAD_LEFT)); - if (!is_array($d) || !isset($d[1])) { + if (! is_array($d) || ! isset($d[1])) { throw new InvalidArgumentException('Unable to get the private key'); } return pack( 'H*', '3081a4' // SEQUENCE, length 116 + length($d)=48 - .'020101' // INTEGER, 1 - .'0430' // OCTET STRING, length($d) = 30 - .$d[1] - .'a007' // TAGGED OBJECT #0, length 7 - .'0605' // OID, length 5 - .'2b81040022' // 1.3.132.0.34 = P-384 Curve - .'a164' // TAGGED OBJECT #1, length 100 - .'0362' // BIT STRING, length 98 - .'00' // prepend with NUL - pubkey will follow + . '020101' // INTEGER, 1 + . '0430' // OCTET STRING, length($d) = 30 + . $d[1] + . 'a007' // TAGGED OBJECT #0, length 7 + . '0605' // OID, length 5 + . '2b81040022' // 1.3.132.0.34 = P-384 Curve + . 'a164' // TAGGED OBJECT #1, length 100 + . '0362' // BIT STRING, length 98 + . '00' // prepend with NUL - pubkey will follow ); } private static function p521PrivateKey(JWK $jwk): string { $d = unpack('H*', str_pad(Base64UrlSafe::decode($jwk->get('d')), 66, "\0", STR_PAD_LEFT)); - if (!is_array($d) || !isset($d[1])) { + if (! is_array($d) || ! isset($d[1])) { throw new InvalidArgumentException('Unable to get the private key'); } return pack( 'H*', '3081dc' // SEQUENCE, length 154 + length($d)=66 - .'020101' // INTEGER, 1 - .'0442' // OCTET STRING, length(d) = 66 - .$d[1] - .'a007' // TAGGED OBJECT #0, length 7 - .'0605' // OID, length 5 - .'2b81040023' // 1.3.132.0.35 = P-521 Curve - .'a18189' // TAGGED OBJECT #1, length 137 - .'038186' // BIT STRING, length 134 - .'00' // prepend with NUL - pubkey will follow + . '020101' // INTEGER, 1 + . '0442' // OCTET STRING, length(d) = 66 + . $d[1] + . 'a007' // TAGGED OBJECT #0, length 7 + . '0605' // OID, length 5 + . '2b81040023' // 1.3.132.0.35 = P-521 Curve + . 'a18189' // TAGGED OBJECT #1, length 137 + . '038186' // BIT STRING, length 134 + . '00' // prepend with NUL - pubkey will follow ); } @@ -360,7 +293,7 @@ private static function getKey(JWK $jwk): string return "\04" - .str_pad(Base64UrlSafe::decode($jwk->get('x')), $length, "\0", STR_PAD_LEFT) - .str_pad(Base64UrlSafe::decode($jwk->get('y')), $length, "\0", STR_PAD_LEFT); + . str_pad(Base64UrlSafe::decode($jwk->get('x')), $length, "\0", STR_PAD_LEFT) + . str_pad(Base64UrlSafe::decode($jwk->get('y')), $length, "\0", STR_PAD_LEFT); } } diff --git a/src/Component/Core/Util/ECSignature.php b/src/Component/Core/Util/ECSignature.php index 763d8cd0..1d6ac0aa 100644 --- a/src/Component/Core/Util/ECSignature.php +++ b/src/Component/Core/Util/ECSignature.php @@ -2,15 +2,6 @@ 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\Core\Util; use InvalidArgumentException; @@ -23,16 +14,19 @@ final class ECSignature { private const ASN1_SEQUENCE = '30'; + private const ASN1_INTEGER = '02'; + private const ASN1_MAX_SINGLE_BYTE = 128; + private const ASN1_LENGTH_2BYTES = '81'; + private const ASN1_BIG_INTEGER_LIMIT = '7f'; + private const ASN1_NEGATIVE_INTEGER = '00'; + private const BYTE_SIZE = 2; - /** - * @throws InvalidArgumentException if the length of the signature is invalid - */ public static function toAsn1(string $signature, int $length): string { $signature = bin2hex($signature); @@ -52,38 +46,35 @@ public static function toAsn1(string $signature, int $length): string $bin = hex2bin( self::ASN1_SEQUENCE - .$lengthPrefix.dechex($totalLength) - .self::ASN1_INTEGER.dechex($lengthR).$pointR - .self::ASN1_INTEGER.dechex($lengthS).$pointS + . $lengthPrefix . dechex($totalLength) + . self::ASN1_INTEGER . dechex($lengthR) . $pointR + . self::ASN1_INTEGER . dechex($lengthS) . $pointS ); - if (!is_string($bin)) { + if (! is_string($bin)) { throw new InvalidArgumentException('Unable to parse the data'); } return $bin; } - /** - * @throws InvalidArgumentException if the signature is not an ASN.1 sequence - */ public static function fromAsn1(string $signature, int $length): string { $message = bin2hex($signature); $position = 0; - if (self::ASN1_SEQUENCE !== self::readAsn1Content($message, $position, self::BYTE_SIZE)) { + if (self::readAsn1Content($message, $position, self::BYTE_SIZE) !== self::ASN1_SEQUENCE) { throw new InvalidArgumentException('Invalid data. Should start with a sequence.'); } - if (self::ASN1_LENGTH_2BYTES === self::readAsn1Content($message, $position, self::BYTE_SIZE)) { + if (self::readAsn1Content($message, $position, self::BYTE_SIZE) === self::ASN1_LENGTH_2BYTES) { $position += self::BYTE_SIZE; } $pointR = self::retrievePositiveInteger(self::readAsn1Integer($message, $position)); $pointS = self::retrievePositiveInteger(self::readAsn1Integer($message, $position)); - $bin = hex2bin(str_pad($pointR, $length, '0', STR_PAD_LEFT).str_pad($pointS, $length, '0', STR_PAD_LEFT)); - if (!is_string($bin)) { + $bin = hex2bin(str_pad($pointR, $length, '0', STR_PAD_LEFT) . str_pad($pointS, $length, '0', STR_PAD_LEFT)); + if (! is_string($bin)) { throw new InvalidArgumentException('Unable to parse the data'); } @@ -98,10 +89,10 @@ private static function octetLength(string $data): int private static function preparePositiveInteger(string $data): string { if (mb_substr($data, 0, self::BYTE_SIZE, '8bit') > self::ASN1_BIG_INTEGER_LIMIT) { - return self::ASN1_NEGATIVE_INTEGER.$data; + return self::ASN1_NEGATIVE_INTEGER . $data; } - while (0 === mb_strpos($data, self::ASN1_NEGATIVE_INTEGER, 0, '8bit') + while (mb_strpos($data, self::ASN1_NEGATIVE_INTEGER, 0, '8bit') === 0 && mb_substr($data, 2, self::BYTE_SIZE, '8bit') <= self::ASN1_BIG_INTEGER_LIMIT) { $data = mb_substr($data, 2, null, '8bit'); } @@ -117,12 +108,9 @@ private static function readAsn1Content(string $message, int &$position, int $le return $content; } - /** - * @throws InvalidArgumentException if the data is not an integer - */ private static function readAsn1Integer(string $message, int &$position): string { - if (self::ASN1_INTEGER !== self::readAsn1Content($message, $position, self::BYTE_SIZE)) { + if (self::readAsn1Content($message, $position, self::BYTE_SIZE) !== self::ASN1_INTEGER) { throw new InvalidArgumentException('Invalid data. Should contain an integer.'); } @@ -133,7 +121,7 @@ private static function readAsn1Integer(string $message, int &$position): string private static function retrievePositiveInteger(string $data): string { - while (0 === mb_strpos($data, self::ASN1_NEGATIVE_INTEGER, 0, '8bit') + while (mb_strpos($data, self::ASN1_NEGATIVE_INTEGER, 0, '8bit') === 0 && mb_substr($data, 2, self::BYTE_SIZE, '8bit') > self::ASN1_BIG_INTEGER_LIMIT) { $data = mb_substr($data, 2, null, '8bit'); } diff --git a/src/Component/Core/Util/Hash.php b/src/Component/Core/Util/Hash.php index ef038c53..8ead35b2 100644 --- a/src/Component/Core/Util/Hash.php +++ b/src/Component/Core/Util/Hash.php @@ -2,77 +2,35 @@ 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\Core\Util; /** * @internal */ -class Hash +final class Hash { - /** - * Hash Parameter. - * - * @var string - */ - private $hash; - - /** - * DER encoding T. - * - * @var string - */ - private $t; - - /** - * Hash Length. - * - * @var int - */ - private $length; - - private function __construct(string $hash, int $length, string $t) - { - $this->hash = $hash; - $this->length = $length; - $this->t = $t; + private function __construct( + private string $hash, + private int $length, + private string $t + ) { } - /** - * @return Hash - */ public static function sha1(): self { return new self('sha1', 20, "\x30\x21\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x04\x14"); } - /** - * @return Hash - */ public static function sha256(): self { return new self('sha256', 32, "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x05\x00\x04\x20"); } - /** - * @return Hash - */ public static function sha384(): self { return new self('sha384', 48, "\x30\x41\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02\x05\x00\x04\x30"); } - /** - * @return Hash - */ public static function sha512(): self { return new self('sha512', 64, "\x30\x51\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03\x05\x00\x04\x40"); diff --git a/src/Component/Core/Util/JsonConverter.php b/src/Component/Core/Util/JsonConverter.php index e121c956..2b7013f0 100644 --- a/src/Component/Core/Util/JsonConverter.php +++ b/src/Component/Core/Util/JsonConverter.php @@ -2,34 +2,22 @@ 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\Core\Util; use InvalidArgumentException; use function is_string; +use const JSON_UNESCAPED_SLASHES; +use const JSON_UNESCAPED_UNICODE; use RuntimeException; use Throwable; final class JsonConverter { - /** - * @param mixed $payload - * - * @throws RuntimeException if the payload cannot be encoded - */ public static function encode($payload): string { try { $data = json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - if (!is_string($data)) { + if (! is_string($data)) { throw new InvalidArgumentException('Unable to encode the data'); } @@ -39,11 +27,6 @@ public static function encode($payload): string } } - /** - * @throws RuntimeException if the payload cannot be decoded - * - * @return mixed - */ public static function decode(string $payload) { return json_decode($payload, true, 512, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); diff --git a/src/Component/Core/Util/KeyChecker.php b/src/Component/Core/Util/KeyChecker.php index 30ae84bc..bc6ed53e 100644 --- a/src/Component/Core/Util/KeyChecker.php +++ b/src/Component/Core/Util/KeyChecker.php @@ -2,15 +2,6 @@ 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\Core\Util; use function in_array; @@ -21,7 +12,7 @@ /** * @internal */ -class KeyChecker +final class KeyChecker { public static function checkKeyUsage(JWK $key, string $usage): void { @@ -33,12 +24,9 @@ public static function checkKeyUsage(JWK $key, string $usage): void } } - /** - * @throws InvalidArgumentException if the key is not suitable for the selected algorithm - */ public static function checkKeyAlgorithm(JWK $key, string $algorithm): void { - if (!$key->has('alg')) { + if (! $key->has('alg')) { return; } if ($key->get('alg') !== $algorithm) { @@ -46,40 +34,45 @@ public static function checkKeyAlgorithm(JWK $key, string $algorithm): void } } - /** - * @throws InvalidArgumentException if the key is not suitable for the selected operation - */ private static function checkOperation(JWK $key, string $usage): void { $ops = $key->get('key_ops'); - if (!is_array($ops)) { + if (! is_array($ops)) { throw new InvalidArgumentException('Invalid key parameter "key_ops". Should be a list of key operations'); } switch ($usage) { case 'verification': - if (!in_array('verify', $ops, true)) { + if (! in_array('verify', $ops, true)) { throw new InvalidArgumentException('Key cannot be used to verify a signature'); } break; case 'signature': - if (!in_array('sign', $ops, true)) { + if (! in_array('sign', $ops, true)) { throw new InvalidArgumentException('Key cannot be used to sign'); } break; case 'encryption': - if (!in_array('encrypt', $ops, true) && !in_array('wrapKey', $ops, true) && !in_array('deriveKey', $ops, true)) { + if (! in_array('encrypt', $ops, true) && ! in_array('wrapKey', $ops, true) && ! in_array( + 'deriveKey', + $ops, + true + )) { throw new InvalidArgumentException('Key cannot be used to encrypt'); } break; case 'decryption': - if (!in_array('decrypt', $ops, true) && !in_array('unwrapKey', $ops, true) && !in_array('deriveBits', $ops, true)) { + if (! in_array('decrypt', $ops, true) && ! in_array('unwrapKey', $ops, true) && ! in_array( + 'deriveBits', + $ops, + true + )) { throw new InvalidArgumentException('Key cannot be used to decrypt'); } @@ -90,9 +83,6 @@ private static function checkOperation(JWK $key, string $usage): void } } - /** - * @throws InvalidArgumentException if the key is not suitable for the selected operation - */ private static function checkUsage(JWK $key, string $usage): void { $use = $key->get('use'); @@ -100,7 +90,7 @@ private static function checkUsage(JWK $key, string $usage): void switch ($usage) { case 'verification': case 'signature': - if ('sig' !== $use) { + if ($use !== 'sig') { throw new InvalidArgumentException('Key cannot be used to sign or verify a signature.'); } @@ -108,7 +98,7 @@ private static function checkUsage(JWK $key, string $usage): void case 'encryption': case 'decryption': - if ('enc' !== $use) { + if ($use !== 'enc') { throw new InvalidArgumentException('Key cannot be used to encrypt or decrypt.'); } diff --git a/src/Component/Core/Util/RSAKey.php b/src/Component/Core/Util/RSAKey.php index 6fc72e2c..ec9f42d1 100644 --- a/src/Component/Core/Util/RSAKey.php +++ b/src/Component/Core/Util/RSAKey.php @@ -2,15 +2,6 @@ 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\Core\Util; use function array_key_exists; @@ -25,47 +16,30 @@ use function is_array; use Jose\Component\Core\JWK; use ParagonIE\ConstantTime\Base64UrlSafe; +use const PHP_EOL; use RuntimeException; /** * @internal */ -class RSAKey +final class RSAKey { - /** - * @var Sequence - */ - private $sequence; + private ?Sequence $sequence = null; - /** - * @var bool - */ - private $private; + private bool $private; /** * @var array */ private $values; - /** - * @var BigInteger - */ - private $modulus; + private ?BigInteger $modulus = null; - /** - * @var int - */ - private $modulus_length; + private ?int $modulus_length = null; - /** - * @var BigInteger - */ - private $public_exponent; + private ?BigInteger $public_exponent = null; - /** - * @var null|BigInteger - */ - private $private_exponent; + private ?BigInteger $private_exponent = null; /** * @var BigInteger[] @@ -77,10 +51,7 @@ class RSAKey */ private $exponents = []; - /** - * @var null|BigInteger - */ - private $coefficient; + private ?BigInteger $coefficient = null; private function __construct(JWK $data) { @@ -89,9 +60,6 @@ private function __construct(JWK $data) $this->private = array_key_exists('d', $this->values); } - /** - * @return RSAKey - */ public static function createFromJWK(JWK $jwk): self { return new self($jwk); @@ -110,7 +78,7 @@ public function getModulusLength(): int public function getExponent(): BigInteger { $d = $this->getPrivateExponent(); - if (null !== $d) { + if ($d !== null) { return $d; } @@ -150,14 +118,9 @@ public function getCoefficient(): ?BigInteger public function isPublic(): bool { - return !array_key_exists('d', $this->values); + return ! array_key_exists('d', $this->values); } - /** - * @param RSAKey $private - * - * @return RSAKey - */ public static function toPublic(self $private): self { $data = $private->toArray(); @@ -178,7 +141,7 @@ public function toArray(): array public function toPEM(): string { - if (null === $this->sequence) { + if ($this->sequence === null) { $this->sequence = new Sequence(); if (array_key_exists('d', $this->values)) { $this->initPrivateKey(); @@ -186,27 +149,24 @@ public function toPEM(): string $this->initPublicKey(); } } - $result = '-----BEGIN '.($this->private ? 'RSA PRIVATE' : 'PUBLIC').' KEY-----'.PHP_EOL; + $result = '-----BEGIN ' . ($this->private ? 'RSA PRIVATE' : 'PUBLIC') . ' KEY-----' . PHP_EOL; $result .= chunk_split(base64_encode($this->sequence->getBinary()), 64, PHP_EOL); - $result .= '-----END '.($this->private ? 'RSA PRIVATE' : 'PUBLIC').' KEY-----'.PHP_EOL; + $result .= '-----END ' . ($this->private ? 'RSA PRIVATE' : 'PUBLIC') . ' KEY-----' . PHP_EOL; return $result; } /** - * Exponentiate with or without Chinese Remainder Theorem. - * Operation with primes 'p' and 'q' is appox. 2x faster. - * - * @param RSAKey $key - * - * @throws RuntimeException if the exponentiation cannot be achieved + * Exponentiate with or without Chinese Remainder Theorem. Operation with primes 'p' and 'q' is appox. 2x faster. */ public static function exponentiate(self $key, BigInteger $c): BigInteger { if ($c->compare(BigInteger::createFromDecimal(0)) < 0 || $c->compare($key->getModulus()) > 0) { throw new RuntimeException(); } - if ($key->isPublic() || null === $key->getCoefficient() || 0 === count($key->getPrimes()) || 0 === count($key->getExponents())) { + if ($key->isPublic() || $key->getCoefficient() === null || count($key->getPrimes()) === 0 || count( + $key->getExponents() + ) === 0) { return $c->modPow($key->getExponent(), $key->getModulus()); } @@ -218,7 +178,9 @@ public static function exponentiate(self $key, BigInteger $c): BigInteger $m1 = $c->modPow($dP, $p); $m2 = $c->modPow($dQ, $q); - $h = $qInv->multiply($m1->subtract($m2)->add($p))->mod($p); + $h = $qInv->multiply($m1->subtract($m2)->add($p)) + ->mod($p) + ; return $m2->add($h->multiply($q)); } @@ -229,7 +191,7 @@ private function populateBigIntegers(): void $this->modulus_length = mb_strlen($this->getModulus()->toBytes(), '8bit'); $this->public_exponent = $this->convertBase64StringToBigInteger($this->values['e']); - if (!$this->isPublic()) { + if (! $this->isPublic()) { $this->private_exponent = $this->convertBase64StringToBigInteger($this->values['d']); if (array_key_exists('p', $this->values) && array_key_exists('q', $this->values)) { @@ -237,7 +199,10 @@ private function populateBigIntegers(): void $this->convertBase64StringToBigInteger($this->values['p']), $this->convertBase64StringToBigInteger($this->values['q']), ]; - if (array_key_exists('dp', $this->values) && array_key_exists('dq', $this->values) && array_key_exists('qi', $this->values)) { + if (array_key_exists('dp', $this->values) && array_key_exists('dq', $this->values) && array_key_exists( + 'qi', + $this->values + )) { $this->exponents = [ $this->convertBase64StringToBigInteger($this->values['dp']), $this->convertBase64StringToBigInteger($this->values['dq']), @@ -281,9 +246,15 @@ private function initPrivateKey(): void $d = new Integer($this->fromBase64ToInteger($this->values['d'])); $p = new Integer($this->fromBase64ToInteger($this->values['p'])); $q = new Integer($this->fromBase64ToInteger($this->values['q'])); - $dp = array_key_exists('dp', $this->values) ? new Integer($this->fromBase64ToInteger($this->values['dp'])) : new Integer(0); - $dq = array_key_exists('dq', $this->values) ? new Integer($this->fromBase64ToInteger($this->values['dq'])) : new Integer(0); - $qi = array_key_exists('qi', $this->values) ? new Integer($this->fromBase64ToInteger($this->values['qi'])) : new Integer(0); + $dp = array_key_exists('dp', $this->values) ? new Integer($this->fromBase64ToInteger( + $this->values['dp'] + )) : new Integer(0); + $dq = array_key_exists('dq', $this->values) ? new Integer($this->fromBase64ToInteger( + $this->values['dq'] + )) : new Integer(0); + $qi = array_key_exists('qi', $this->values) ? new Integer($this->fromBase64ToInteger( + $this->values['qi'] + )) : new Integer(0); $key_sequence = new Sequence(); $key_sequence->addChild($v); $key_sequence->addChild($n); @@ -306,7 +277,7 @@ private function initPrivateKey(): void private function fromBase64ToInteger($value) { $unpacked = unpack('H*', Base64UrlSafe::decode($value)); - if (!is_array($unpacked) || 0 === count($unpacked)) { + if (! is_array($unpacked) || count($unpacked) === 0) { throw new InvalidArgumentException('Unable to get the private key'); } diff --git a/src/Component/Core/composer.json b/src/Component/Core/composer.json index c51ca14d..40c24a51 100644 --- a/src/Component/Core/composer.json +++ b/src/Component/Core/composer.json @@ -23,7 +23,7 @@ "php": ">=8.0", "ext-json": "*", "ext-mbstring": "*", - "brick/math": "^0.8.17|^0.9", + "brick/math": "^0.9", "fgrosse/phpasn1": "^2.0", "paragonie/constant_time_encoding": "^2.4" }, diff --git a/src/Component/Encryption/Algorithm/ContentEncryptionAlgorithm.php b/src/Component/Encryption/Algorithm/ContentEncryptionAlgorithm.php index f5047ee3..58d95bb2 100644 --- a/src/Component/Encryption/Algorithm/ContentEncryptionAlgorithm.php +++ b/src/Component/Encryption/Algorithm/ContentEncryptionAlgorithm.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm; use Jose\Component\Core\Algorithm; @@ -18,17 +9,24 @@ interface ContentEncryptionAlgorithm extends Algorithm { /** - * This method encrypts the data using the given CEK, IV, AAD and protected header. - * The variable $tag is populated on success. + * This method encrypts the data using the given CEK, IV, AAD and protected header. The variable $tag is populated + * on success. * * @param string $data The data to encrypt * @param string $cek The content encryption key * @param string $iv The Initialization Vector - * @param null|string $aad Additional Additional Authenticated Data + * @param string|null $aad Additional Additional Authenticated Data * @param string $encoded_protected_header The Protected Header encoded in Base64Url * @param string $tag Tag */ - public function encryptContent(string $data, string $cek, string $iv, ?string $aad, string $encoded_protected_header, ?string &$tag = null): string; + public function encryptContent( + string $data, + string $cek, + string $iv, + ?string $aad, + string $encoded_protected_header, + ?string &$tag = null + ): string; /** * This method tries to decrypt the data using the given CEK, IV, AAD, protected header and tag. @@ -36,11 +34,18 @@ public function encryptContent(string $data, string $cek, string $iv, ?string $a * @param string $data The data to decrypt * @param string $cek The content encryption key * @param string $iv The Initialization Vector - * @param null|string $aad Additional Additional Authenticated Data + * @param string|null $aad Additional Additional Authenticated Data * @param string $encoded_protected_header The Protected Header encoded in Base64Url * @param string $tag Tag */ - public function decryptContent(string $data, string $cek, string $iv, ?string $aad, string $encoded_protected_header, string $tag): string; + public function decryptContent( + string $data, + string $cek, + string $iv, + ?string $aad, + string $encoded_protected_header, + string $tag + ): string; /** * Returns the size of the IV used by this encryption method. diff --git a/src/Component/Encryption/Algorithm/KeyEncryption/DirectEncryption.php b/src/Component/Encryption/Algorithm/KeyEncryption/DirectEncryption.php index b871ed13..cec9ad99 100644 --- a/src/Component/Encryption/Algorithm/KeyEncryption/DirectEncryption.php +++ b/src/Component/Encryption/Algorithm/KeyEncryption/DirectEncryption.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use Jose\Component\Core\JWK; diff --git a/src/Component/Encryption/Algorithm/KeyEncryption/KeyAgreement.php b/src/Component/Encryption/Algorithm/KeyEncryption/KeyAgreement.php index 6247b633..49c27bda 100644 --- a/src/Component/Encryption/Algorithm/KeyEncryption/KeyAgreement.php +++ b/src/Component/Encryption/Algorithm/KeyEncryption/KeyAgreement.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use Jose\Component\Core\JWK; @@ -21,5 +12,12 @@ interface KeyAgreement extends KeyEncryptionAlgorithm /** * Computes the agreement key. */ - public function getAgreementKey(int $encryptionKeyLength, string $algorithm, JWK $recipientKey, ?JWK $senderKey, array $completeHeader = [], array &$additionalHeaderValues = []): string; + public function getAgreementKey( + int $encryptionKeyLength, + string $algorithm, + JWK $recipientKey, + ?JWK $senderKey, + array $completeHeader = [], + array &$additionalHeaderValues = [] + ): string; } diff --git a/src/Component/Encryption/Algorithm/KeyEncryption/KeyAgreementWithKeyWrapping.php b/src/Component/Encryption/Algorithm/KeyEncryption/KeyAgreementWithKeyWrapping.php index 3d4d9f99..e623a0ef 100644 --- a/src/Component/Encryption/Algorithm/KeyEncryption/KeyAgreementWithKeyWrapping.php +++ b/src/Component/Encryption/Algorithm/KeyEncryption/KeyAgreementWithKeyWrapping.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use Jose\Component\Core\JWK; @@ -27,7 +18,14 @@ interface KeyAgreementWithKeyWrapping extends KeyEncryptionAlgorithm * @param array $complete_header The complete header of the JWT * @param array $additional_header_values Set additional header values if needed */ - public function wrapAgreementKey(JWK $recipientKey, ?JWK $senderKey, string $cek, int $encryption_key_length, array $complete_header, array &$additional_header_values): string; + public function wrapAgreementKey( + JWK $recipientKey, + ?JWK $senderKey, + string $cek, + int $encryption_key_length, + array $complete_header, + array &$additional_header_values + ): string; /** * Unwrap and compute the agreement key. @@ -39,5 +37,11 @@ public function wrapAgreementKey(JWK $recipientKey, ?JWK $senderKey, string $cek * * @return string The decrypted CEK */ - public function unwrapAgreementKey(JWK $recipientKey, ?JWK $senderKey, string $encrypted_cek, int $encryption_key_length, array $complete_header): string; + public function unwrapAgreementKey( + JWK $recipientKey, + ?JWK $senderKey, + string $encrypted_cek, + int $encryption_key_length, + array $complete_header + ): string; } diff --git a/src/Component/Encryption/Algorithm/KeyEncryption/KeyEncryption.php b/src/Component/Encryption/Algorithm/KeyEncryption/KeyEncryption.php index 0791490a..d1bf020b 100644 --- a/src/Component/Encryption/Algorithm/KeyEncryption/KeyEncryption.php +++ b/src/Component/Encryption/Algorithm/KeyEncryption/KeyEncryption.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use Jose\Component\Core\JWK; diff --git a/src/Component/Encryption/Algorithm/KeyEncryption/KeyWrapping.php b/src/Component/Encryption/Algorithm/KeyEncryption/KeyWrapping.php index 016b60c9..57adea54 100644 --- a/src/Component/Encryption/Algorithm/KeyEncryption/KeyWrapping.php +++ b/src/Component/Encryption/Algorithm/KeyEncryption/KeyWrapping.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use Jose\Component\Core\JWK; diff --git a/src/Component/Encryption/Algorithm/KeyEncryptionAlgorithm.php b/src/Component/Encryption/Algorithm/KeyEncryptionAlgorithm.php index 4766f836..9012a202 100644 --- a/src/Component/Encryption/Algorithm/KeyEncryptionAlgorithm.php +++ b/src/Component/Encryption/Algorithm/KeyEncryptionAlgorithm.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm; use Jose\Component\Core\Algorithm; diff --git a/src/Component/Encryption/Compression/CompressionMethod.php b/src/Component/Encryption/Compression/CompressionMethod.php index 31185b73..85d2bf38 100644 --- a/src/Component/Encryption/Compression/CompressionMethod.php +++ b/src/Component/Encryption/Compression/CompressionMethod.php @@ -2,15 +2,6 @@ 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\Encryption\Compression; interface CompressionMethod @@ -21,16 +12,14 @@ interface CompressionMethod public function name(): string; /** - * Compress the data. - * Throws an exception in case of failure. + * Compress the data. Throws an exception in case of failure. * * @param string $data The data to compress */ public function compress(string $data): string; /** - * Uncompress the data. - * Throws an exception in case of failure. + * Uncompress the data. Throws an exception in case of failure. * * @param string $data The data to uncompress */ diff --git a/src/Component/Encryption/Compression/CompressionMethodManager.php b/src/Component/Encryption/Compression/CompressionMethodManager.php index 59ff179e..a73b7589 100644 --- a/src/Component/Encryption/Compression/CompressionMethodManager.php +++ b/src/Component/Encryption/Compression/CompressionMethodManager.php @@ -2,15 +2,6 @@ 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\Encryption\Compression; use function array_key_exists; @@ -21,7 +12,7 @@ class CompressionMethodManager /** * @var CompressionMethod[] */ - private $compressionMethods = []; + private array $compressionMethods = []; public function __construct(array $methods = []) { @@ -39,16 +30,14 @@ public function has(string $name): bool } /** - * This method returns the compression method with the given name. - * Throws an exception if the method is not supported. + * This method returns the compression method with the given name. Throws an exception if the method is not + * supported. * * @param string $name The name of the compression method - * - * @throws InvalidArgumentException if the compression method is not supported */ public function get(string $name): CompressionMethod { - if (!$this->has($name)) { + if (! $this->has($name)) { throw new InvalidArgumentException(sprintf('The compression method "%s" is not supported.', $name)); } diff --git a/src/Component/Encryption/Compression/CompressionMethodManagerFactory.php b/src/Component/Encryption/Compression/CompressionMethodManagerFactory.php index 869da3d3..d6fa78e5 100644 --- a/src/Component/Encryption/Compression/CompressionMethodManagerFactory.php +++ b/src/Component/Encryption/Compression/CompressionMethodManagerFactory.php @@ -2,15 +2,6 @@ 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\Encryption\Compression; use InvalidArgumentException; @@ -23,9 +14,8 @@ class CompressionMethodManagerFactory private $compressionMethods = []; /** - * This method adds a compression method to this factory. - * The method is uniquely identified by an alias. This allows the same method to be added twice (or more) - * using several configuration options. + * This method adds a compression method to this factory. The method is uniquely identified by an alias. This allows + * the same method to be added twice (or more) using several configuration options. */ public function add(string $alias, CompressionMethod $compressionMethod): void { @@ -53,19 +43,20 @@ public function all(): array } /** - * Creates a compression method manager using the compression methods identified by the given aliases. - * If one of the aliases does not exist, an exception is thrown. + * Creates a compression method manager using the compression methods identified by the given aliases. If one of the + * aliases does not exist, an exception is thrown. * * @param string[] $aliases - * - * @throws InvalidArgumentException if the compression method alias is not supported */ public function create(array $aliases): CompressionMethodManager { $compressionMethods = []; foreach ($aliases as $alias) { - if (!isset($this->compressionMethods[$alias])) { - throw new InvalidArgumentException(sprintf('The compression method with the alias "%s" is not supported.', $alias)); + if (! isset($this->compressionMethods[$alias])) { + throw new InvalidArgumentException(sprintf( + 'The compression method with the alias "%s" is not supported.', + $alias + )); } $compressionMethods[] = $this->compressionMethods[$alias]; } diff --git a/src/Component/Encryption/Compression/Deflate.php b/src/Component/Encryption/Compression/Deflate.php index db8fbf29..963c9b0f 100644 --- a/src/Component/Encryption/Compression/Deflate.php +++ b/src/Component/Encryption/Compression/Deflate.php @@ -2,15 +2,6 @@ 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\Encryption\Compression; use InvalidArgumentException; @@ -19,20 +10,14 @@ final class Deflate implements CompressionMethod { - /** - * @var int - */ - private $compressionLevel = -1; + private int $compressionLevel = -1; - /** - * Deflate constructor. - * - * @throws InvalidArgumentException if the compression level is invalid - */ public function __construct(int $compressionLevel = -1) { if ($compressionLevel < -1 || $compressionLevel > 9) { - throw new InvalidArgumentException('The compression level can be given as 0 for no compression up to 9 for maximum compression. If -1 given, the default compression level will be the default compression level of the zlib library.'); + throw new InvalidArgumentException( + 'The compression level can be given as 0 for no compression up to 9 for maximum compression. If -1 given, the default compression level will be the default compression level of the zlib library.' + ); } $this->compressionLevel = $compressionLevel; } @@ -42,14 +27,11 @@ public function name(): string return 'DEF'; } - /** - * @throws InvalidArgumentException if the compression failed - */ public function compress(string $data): string { try { $bin = gzdeflate($data, $this->getCompressionLevel()); - if (!is_string($bin)) { + if (! is_string($bin)) { throw new InvalidArgumentException('Unable to encode the data'); } @@ -59,14 +41,11 @@ public function compress(string $data): string } } - /** - * @throws InvalidArgumentException if the decompression failed - */ public function uncompress(string $data): string { try { $bin = gzinflate($data); - if (!is_string($bin)) { + if (! is_string($bin)) { throw new InvalidArgumentException('Unable to encode the data'); } diff --git a/src/Component/Encryption/JWE.php b/src/Component/Encryption/JWE.php index ed1bc23e..5b3afb15 100644 --- a/src/Component/Encryption/JWE.php +++ b/src/Component/Encryption/JWE.php @@ -2,15 +2,6 @@ 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\Encryption; use function array_key_exists; @@ -25,26 +16,6 @@ class JWE implements JWT */ private $recipients = []; - /** - * @var null|string - */ - private $ciphertext; - - /** - * @var string - */ - private $iv; - - /** - * @var null|string - */ - private $aad; - - /** - * @var string - */ - private $tag; - /** * @var array */ @@ -55,25 +26,20 @@ class JWE implements JWT */ private $sharedProtectedHeader = []; - /** - * @var null|string - */ - private $encodedSharedProtectedHeader; - - /** - * @var null|string - */ - private $payload; - - public function __construct(string $ciphertext, string $iv, string $tag, ?string $aad = null, array $sharedHeader = [], array $sharedProtectedHeader = [], ?string $encodedSharedProtectedHeader = null, array $recipients = []) - { - $this->ciphertext = $ciphertext; - $this->iv = $iv; - $this->aad = $aad; - $this->tag = $tag; + private ?string $payload = null; + + public function __construct( + private ?string $ciphertext, + private string $iv, + private string $tag, + private ?string $aad = null, + array $sharedHeader = [], + array $sharedProtectedHeader = [], + private ?string $encodedSharedProtectedHeader = null, + array $recipients = [] + ) { $this->sharedHeader = $sharedHeader; $this->sharedProtectedHeader = $sharedProtectedHeader; - $this->encodedSharedProtectedHeader = $encodedSharedProtectedHeader; $this->recipients = $recipients; } @@ -83,10 +49,7 @@ public function getPayload(): ?string } /** - * Set the payload. - * This method is immutable and a new object will be returned. - * - * @return JWE + * Set the payload. This method is immutable and a new object will be returned. */ public function withPayload(string $payload): self { @@ -109,7 +72,7 @@ public function countRecipients(): int */ public function isEncrypted(): bool { - return null !== $this->getCiphertext(); + return $this->getCiphertext() !== null; } /** @@ -124,12 +87,10 @@ public function getRecipients(): array /** * Returns the recipient object at the given index. - * - * @throws InvalidArgumentException if the recipient ID does not exist */ public function getRecipient(int $id): Recipient { - if (!isset($this->recipients[$id])) { + if (! isset($this->recipients[$id])) { throw new InvalidArgumentException('The recipient does not exist.'); } @@ -139,7 +100,7 @@ public function getRecipient(int $id): Recipient /** * Returns the ciphertext. This method will return null is the JWE has not yet been encrypted. * - * @return null|string The cyphertext + * @return string|null The cyphertext */ public function getCiphertext(): ?string { @@ -187,18 +148,16 @@ public function getSharedProtectedHeader(): array } /** - * Returns the shared protected header parameter identified by the given key. - * Throws an exception is the the parameter is not available. + * Returns the shared protected header parameter identified by the given key. Throws an exception is the the + * parameter is not available. * * @param string $key The key * - * @throws InvalidArgumentException if the shared protected header parameter does not exist - * - * @return null|mixed + * @return mixed|null */ public function getSharedProtectedHeaderParameter(string $key) { - if (!$this->hasSharedProtectedHeaderParameter($key)) { + if (! $this->hasSharedProtectedHeaderParameter($key)) { throw new InvalidArgumentException(sprintf('The shared protected header "%s" does not exist.', $key)); } @@ -224,18 +183,16 @@ public function getSharedHeader(): array } /** - * Returns the shared header parameter identified by the given key. - * Throws an exception is the the parameter is not available. + * Returns the shared header parameter identified by the given key. Throws an exception is the the parameter is not + * available. * * @param string $key The key * - * @throws InvalidArgumentException if the shared header parameter does not exist - * - * @return null|mixed + * @return mixed|null */ public function getSharedHeaderParameter(string $key) { - if (!$this->hasSharedHeaderParameter($key)) { + if (! $this->hasSharedHeaderParameter($key)) { throw new InvalidArgumentException(sprintf('The shared header "%s" does not exist.', $key)); } @@ -253,8 +210,8 @@ public function hasSharedHeaderParameter(string $key): bool } /** - * This method splits the JWE into a list of JWEs. - * It is only useful when the JWE contains more than one recipient (JSON General Serialization). + * This method splits the JWE into a list of JWEs. It is only useful when the JWE contains more than one recipient + * (JSON General Serialization). * * @return JWE[] */ diff --git a/src/Component/Encryption/JWEBuilder.php b/src/Component/Encryption/JWEBuilder.php index 82cce209..6be93bee 100644 --- a/src/Component/Encryption/JWEBuilder.php +++ b/src/Component/Encryption/JWEBuilder.php @@ -2,15 +2,6 @@ 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\Encryption; use function array_key_exists; @@ -36,25 +27,30 @@ class JWEBuilder { protected ?string $payload; + protected ?string $aad; + protected array $recipients = []; + protected array $sharedProtectedHeader = []; + protected array $sharedHeader = []; - private AlgorithmManager $algorithmManager; - private CompressionMethodManager $compressionManager; + private ?CompressionMethod $compressionMethod; + private ?string $keyManagementMode; - public function __construct(AlgorithmManager $keyEncryptionAlgorithmManager, CompressionMethodManager $compressionManager) - { - $this->algorithmManager = $keyEncryptionAlgorithmManager; - $this->compressionManager = $compressionManager; + private ?ContentEncryptionAlgorithm $contentEncryptionAlgorithm = null; + + public function __construct( + private AlgorithmManager $keyEncryptionAlgorithmManager, + private AlgorithmManager $contentEncryptionAlgorithmManager, + private CompressionMethodManager $compressionManager + ) { } /** * Reset the current data. - * - * @return JWEBuilder */ public function create(): self { @@ -72,9 +68,9 @@ public function create(): self /** * Returns the key encryption algorithm manager. */ - public function getAlgorithmManager(): AlgorithmManager + public function getKeyEncryptionAlgorithmManager(): AlgorithmManager { - return $this->algorithmManager; + return $this->keyEncryptionAlgorithmManager; } /** @@ -82,7 +78,7 @@ public function getAlgorithmManager(): AlgorithmManager */ public function getContentEncryptionAlgorithmManager(): AlgorithmManager { - return $this->algorithmManager; + return $this->contentEncryptionAlgorithmManager; } /** @@ -95,14 +91,10 @@ public function getCompressionMethodManager(): CompressionMethodManager /** * Set the payload of the JWE to build. - * - * @throws InvalidArgumentException if the payload is not encoded in UTF-8 - * - * @return JWEBuilder */ public function withPayload(string $payload): self { - if ('UTF-8' !== mb_detect_encoding($payload, 'UTF-8', true)) { + if (mb_detect_encoding($payload, 'UTF-8', true) !== 'UTF-8') { throw new InvalidArgumentException('The payload must be encoded in UTF-8'); } $clone = clone $this; @@ -113,8 +105,6 @@ public function withPayload(string $payload): self /** * Set the Additional Authenticated Data of the JWE to build. - * - * @return JWEBuilder */ public function withAAD(?string $aad): self { @@ -126,8 +116,6 @@ public function withAAD(?string $aad): self /** * Set the shared protected header of the JWE to build. - * - * @return JWEBuilder */ public function withSharedProtectedHeader(array $sharedProtectedHeader): self { @@ -143,8 +131,6 @@ public function withSharedProtectedHeader(array $sharedProtectedHeader): self /** * Set the shared header of the JWE to build. - * - * @return JWEBuilder */ public function withSharedHeader(array $sharedHeader): self { @@ -160,11 +146,6 @@ public function withSharedHeader(array $sharedHeader): self /** * Adds a recipient to the JWE to build. - * - * @throws InvalidArgumentException if key management modes are incompatible - * @throws InvalidArgumentException if the compression method is invalid - * - * @return JWEBuilder */ public function addRecipient(JWK $recipientKey, array $recipientHeader = []): self { @@ -174,23 +155,26 @@ public function addRecipient(JWK $recipientKey, array $recipientHeader = []): se $completeHeader = array_merge($clone->sharedHeader, $recipientHeader, $clone->sharedProtectedHeader); $clone->checkAndSetContentEncryptionAlgorithm($completeHeader); $keyEncryptionAlgorithm = $clone->getKeyEncryptionAlgorithm($completeHeader); - if (null === $clone->keyManagementMode) { + if ($clone->keyManagementMode === null) { $clone->keyManagementMode = $keyEncryptionAlgorithm->getKeyManagementMode(); } else { - if (!$clone->areKeyManagementModesCompatible($clone->keyManagementMode, $keyEncryptionAlgorithm->getKeyManagementMode())) { + if (! $clone->areKeyManagementModesCompatible( + $clone->keyManagementMode, + $keyEncryptionAlgorithm->getKeyManagementMode() + )) { throw new InvalidArgumentException('Foreign key management mode forbidden.'); } } $compressionMethod = $clone->getCompressionMethod($completeHeader); - if (null !== $compressionMethod) { - if (null === $clone->compressionMethod) { + if ($compressionMethod !== null) { + if ($clone->compressionMethod === null) { $clone->compressionMethod = $compressionMethod; } elseif ($clone->compressionMethod->name() !== $compressionMethod->name()) { throw new InvalidArgumentException('Incompatible compression method.'); } } - if (null === $compressionMethod && null !== $clone->compressionMethod) { + if ($compressionMethod === null && $clone->compressionMethod !== null) { throw new InvalidArgumentException('Inconsistent compression method.'); } $clone->checkKey($keyEncryptionAlgorithm, $recipientKey); @@ -205,16 +189,13 @@ public function addRecipient(JWK $recipientKey, array $recipientHeader = []): se /** * Builds the JWE. - * - * @throws LogicException if no payload is set - * @throws LogicException if there are no recipient */ public function build(): JWE { - if (null === $this->payload) { + if ($this->payload === null) { throw new LogicException('Payload not set.'); } - if (0 === count($this->recipients)) { + if (count($this->recipients) === 0) { throw new LogicException('No recipient.'); } @@ -227,44 +208,56 @@ public function build(): JWE $recipients[] = $recipient; } - if (0 !== count($additionalHeader) && 1 === count($this->recipients)) { + if (count($additionalHeader) !== 0 && count($this->recipients) === 1) { $sharedProtectedHeader = array_merge($additionalHeader, $this->sharedProtectedHeader); } else { $sharedProtectedHeader = $this->sharedProtectedHeader; } - $encodedSharedProtectedHeader = 0 === count($sharedProtectedHeader) ? '' : Base64UrlSafe::encodeUnpadded(JsonConverter::encode($sharedProtectedHeader)); + $encodedSharedProtectedHeader = count($sharedProtectedHeader) === 0 ? '' : Base64UrlSafe::encodeUnpadded( + JsonConverter::encode($sharedProtectedHeader) + ); [$ciphertext, $iv, $tag] = $this->encryptJWE($cek, $encodedSharedProtectedHeader); - return new JWE($ciphertext, $iv, $tag, $this->aad, $this->sharedHeader, $sharedProtectedHeader, $encodedSharedProtectedHeader, $recipients); + return new JWE( + $ciphertext, + $iv, + $tag, + $this->aad, + $this->sharedHeader, + $sharedProtectedHeader, + $encodedSharedProtectedHeader, + $recipients + ); } - /** - * @throws InvalidArgumentException if the content encryption algorithm is not valid - */ private function checkAndSetContentEncryptionAlgorithm(array $completeHeader): void { $contentEncryptionAlgorithm = $this->getContentEncryptionAlgorithm($completeHeader); - if (null === $this->algorithm) { - $this->algorithm = $contentEncryptionAlgorithm; - } elseif ($contentEncryptionAlgorithm->name() !== $this->algorithm->name()) { + if ($this->contentEncryptionAlgorithm === null) { + $this->contentEncryptionAlgorithm = $contentEncryptionAlgorithm; + } elseif ($contentEncryptionAlgorithm->name() !== $this->contentEncryptionAlgorithm->name()) { throw new InvalidArgumentException('Inconsistent content encryption algorithm'); } } - /** - * @throws InvalidArgumentException if the key encryption algorithm is not valid - */ private function processRecipient(array $recipient, string $cek, array &$additionalHeader): Recipient { $completeHeader = array_merge($this->sharedHeader, $recipient['header'], $this->sharedProtectedHeader); $keyEncryptionAlgorithm = $recipient['key_encryption_algorithm']; - if (!$keyEncryptionAlgorithm instanceof KeyEncryptionAlgorithm) { + if (! $keyEncryptionAlgorithm instanceof KeyEncryptionAlgorithm) { throw new InvalidArgumentException('The key encryption algorithm is not valid'); } - $encryptedContentEncryptionKey = $this->getEncryptedKey($completeHeader, $cek, $keyEncryptionAlgorithm, $additionalHeader, $recipient['key'], $recipient['sender_key'] ?? null); + $encryptedContentEncryptionKey = $this->getEncryptedKey( + $completeHeader, + $cek, + $keyEncryptionAlgorithm, + $additionalHeader, + $recipient['key'], + $recipient['sender_key'] ?? null + ); $recipientHeader = $recipient['header']; - if (0 !== count($additionalHeader) && 1 !== count($this->recipients)) { + if (count($additionalHeader) !== 0 && count($this->recipients) !== 1) { $recipientHeader = array_merge($recipientHeader, $additionalHeader); $additionalHeader = []; } @@ -272,19 +265,23 @@ private function processRecipient(array $recipient, string $cek, array &$additio return new Recipient($recipientHeader, $encryptedContentEncryptionKey); } - /** - * @throws InvalidArgumentException if the content encryption algorithm is not valid - */ private function encryptJWE(string $cek, string $encodedSharedProtectedHeader): array { - if (!$this->algorithm instanceof ContentEncryptionAlgorithm) { + if (! $this->contentEncryptionAlgorithm instanceof ContentEncryptionAlgorithm) { throw new InvalidArgumentException('The content encryption algorithm is not valid'); } - $iv_size = $this->algorithm->getIVSize(); + $iv_size = $this->contentEncryptionAlgorithm->getIVSize(); $iv = $this->createIV($iv_size); $payload = $this->preparePayload(); $tag = null; - $ciphertext = $this->algorithm->encryptContent($payload, $cek, $iv, $this->aad, $encodedSharedProtectedHeader, $tag); + $ciphertext = $this->contentEncryptionAlgorithm->encryptContent( + $payload, + $cek, + $iv, + $this->aad, + $encodedSharedProtectedHeader, + $tag + ); return [$ciphertext, $iv, $tag]; } @@ -295,26 +292,48 @@ private function encryptJWE(string $cek, string $encodedSharedProtectedHeader): private function preparePayload(): ?string { $prepared = $this->payload; - if (null === $this->compressionMethod) { + if ($this->compressionMethod === null) { return $prepared; } return $this->compressionMethod->compress($prepared); } - /** - * @throws InvalidArgumentException if the key encryption algorithm is not supported - */ - private function getEncryptedKey(array $completeHeader, string $cek, KeyEncryptionAlgorithm $keyEncryptionAlgorithm, array &$additionalHeader, JWK $recipientKey, ?JWK $senderKey): ?string - { + private function getEncryptedKey( + array $completeHeader, + string $cek, + KeyEncryptionAlgorithm $keyEncryptionAlgorithm, + array &$additionalHeader, + JWK $recipientKey, + ?JWK $senderKey + ): ?string { if ($keyEncryptionAlgorithm instanceof KeyEncryption) { - return $this->getEncryptedKeyFromKeyEncryptionAlgorithm($completeHeader, $cek, $keyEncryptionAlgorithm, $recipientKey, $additionalHeader); + return $this->getEncryptedKeyFromKeyEncryptionAlgorithm( + $completeHeader, + $cek, + $keyEncryptionAlgorithm, + $recipientKey, + $additionalHeader + ); } if ($keyEncryptionAlgorithm instanceof KeyWrapping) { - return $this->getEncryptedKeyFromKeyWrappingAlgorithm($completeHeader, $cek, $keyEncryptionAlgorithm, $recipientKey, $additionalHeader); + return $this->getEncryptedKeyFromKeyWrappingAlgorithm( + $completeHeader, + $cek, + $keyEncryptionAlgorithm, + $recipientKey, + $additionalHeader + ); } if ($keyEncryptionAlgorithm instanceof KeyAgreementWithKeyWrapping) { - return $this->getEncryptedKeyFromKeyAgreementAndKeyWrappingAlgorithm($completeHeader, $cek, $keyEncryptionAlgorithm, $additionalHeader, $recipientKey, $senderKey); + return $this->getEncryptedKeyFromKeyAgreementAndKeyWrappingAlgorithm( + $completeHeader, + $cek, + $keyEncryptionAlgorithm, + $additionalHeader, + $recipientKey, + $senderKey + ); } if ($keyEncryptionAlgorithm instanceof KeyAgreement) { return null; @@ -326,92 +345,125 @@ private function getEncryptedKey(array $completeHeader, string $cek, KeyEncrypti throw new InvalidArgumentException('Unsupported key encryption algorithm.'); } - /** - * @throws InvalidArgumentException if the content encryption algorithm is invalid - */ - private function getEncryptedKeyFromKeyAgreementAndKeyWrappingAlgorithm(array $completeHeader, string $cek, KeyAgreementWithKeyWrapping $keyEncryptionAlgorithm, array &$additionalHeader, JWK $recipientKey, ?JWK $senderKey): string - { - if (null === $this->algorithm) { + private function getEncryptedKeyFromKeyAgreementAndKeyWrappingAlgorithm( + array $completeHeader, + string $cek, + KeyAgreementWithKeyWrapping $keyEncryptionAlgorithm, + array &$additionalHeader, + JWK $recipientKey, + ?JWK $senderKey + ): string { + if ($this->contentEncryptionAlgorithm === null) { throw new InvalidArgumentException('Invalid content encryption algorithm'); } - return $keyEncryptionAlgorithm->wrapAgreementKey($recipientKey, $senderKey, $cek, $this->algorithm->getCEKSize(), $completeHeader, $additionalHeader); + return $keyEncryptionAlgorithm->wrapAgreementKey( + $recipientKey, + $senderKey, + $cek, + $this->contentEncryptionAlgorithm->getCEKSize(), + $completeHeader, + $additionalHeader + ); } - private function getEncryptedKeyFromKeyEncryptionAlgorithm(array $completeHeader, string $cek, KeyEncryption $keyEncryptionAlgorithm, JWK $recipientKey, array &$additionalHeader): string - { + private function getEncryptedKeyFromKeyEncryptionAlgorithm( + array $completeHeader, + string $cek, + KeyEncryption $keyEncryptionAlgorithm, + JWK $recipientKey, + array &$additionalHeader + ): string { return $keyEncryptionAlgorithm->encryptKey($recipientKey, $cek, $completeHeader, $additionalHeader); } - private function getEncryptedKeyFromKeyWrappingAlgorithm(array $completeHeader, string $cek, KeyWrapping $keyEncryptionAlgorithm, JWK $recipientKey, array &$additionalHeader): string - { + private function getEncryptedKeyFromKeyWrappingAlgorithm( + array $completeHeader, + string $cek, + KeyWrapping $keyEncryptionAlgorithm, + JWK $recipientKey, + array &$additionalHeader + ): string { return $keyEncryptionAlgorithm->wrapKey($recipientKey, $cek, $completeHeader, $additionalHeader); } - /** - * @throws InvalidArgumentException if the content encryption algorithm is invalid - * @throws InvalidArgumentException if the key type is not valid - * @throws InvalidArgumentException if the key management mode is not supported - */ private function checkKey(KeyEncryptionAlgorithm $keyEncryptionAlgorithm, JWK $recipientKey): void { - if (null === $this->algorithm) { + if ($this->contentEncryptionAlgorithm === null) { throw new InvalidArgumentException('Invalid content encryption algorithm'); } KeyChecker::checkKeyUsage($recipientKey, 'encryption'); - if ('dir' !== $keyEncryptionAlgorithm->name()) { + if ($keyEncryptionAlgorithm->name() !== 'dir') { KeyChecker::checkKeyAlgorithm($recipientKey, $keyEncryptionAlgorithm->name()); } else { - KeyChecker::checkKeyAlgorithm($recipientKey, $this->algorithm->name()); + KeyChecker::checkKeyAlgorithm($recipientKey, $this->contentEncryptionAlgorithm->name()); } } private function determineCEK(array &$additionalHeader): string { - if (null === $this->algorithm) { + if ($this->contentEncryptionAlgorithm === null) { throw new InvalidArgumentException('Invalid content encryption algorithm'); } switch ($this->keyManagementMode) { case KeyEncryption::MODE_ENCRYPT: case KeyEncryption::MODE_WRAP: - return $this->createCEK($this->algorithm->getCEKSize()); + return $this->createCEK($this->contentEncryptionAlgorithm->getCEKSize()); case KeyEncryption::MODE_AGREEMENT: - if (1 !== count($this->recipients)) { - throw new LogicException('Unable to encrypt for multiple recipients using key agreement algorithms.'); + if (count($this->recipients) !== 1) { + throw new LogicException( + 'Unable to encrypt for multiple recipients using key agreement algorithms.' + ); } $recipientKey = $this->recipients[0]['key']; $senderKey = $this->recipients[0]['sender_key'] ?? null; $algorithm = $this->recipients[0]['key_encryption_algorithm']; - if (!$algorithm instanceof KeyAgreement) { + if (! $algorithm instanceof KeyAgreement) { throw new InvalidArgumentException('Invalid content encryption algorithm'); } - $completeHeader = array_merge($this->sharedHeader, $this->recipients[0]['header'], $this->sharedProtectedHeader); - - return $algorithm->getAgreementKey($this->algorithm->getCEKSize(), $this->algorithm->name(), $recipientKey, $senderKey, $completeHeader, $additionalHeader); + $completeHeader = array_merge( + $this->sharedHeader, + $this->recipients[0]['header'], + $this->sharedProtectedHeader + ); + + return $algorithm->getAgreementKey( + $this->contentEncryptionAlgorithm->getCEKSize(), + $this->contentEncryptionAlgorithm->name(), + $recipientKey, + $senderKey, + $completeHeader, + $additionalHeader + ); case KeyEncryption::MODE_DIRECT: - if (1 !== count($this->recipients)) { - throw new LogicException('Unable to encrypt for multiple recipients using key agreement algorithms.'); + if (count($this->recipients) !== 1) { + throw new LogicException( + 'Unable to encrypt for multiple recipients using key agreement algorithms.' + ); } /** @var JWK $key */ $key = $this->recipients[0]['key']; - if ('oct' !== $key->get('kty')) { + if ($key->get('kty') !== 'oct') { throw new RuntimeException('Wrong key type.'); } return Base64UrlSafe::decode($key->get('k')); default: - throw new InvalidArgumentException(sprintf('Unsupported key management mode "%s".', $this->keyManagementMode)); + throw new InvalidArgumentException(sprintf( + 'Unsupported key management mode "%s".', + $this->keyManagementMode + )); } } private function getCompressionMethod(array $completeHeader): ?CompressionMethod { - if (!array_key_exists('zip', $completeHeader)) { + if (! array_key_exists('zip', $completeHeader)) { return null; } @@ -424,10 +476,27 @@ private function areKeyManagementModesCompatible(string $current, string $new): $dir = KeyEncryptionAlgorithm::MODE_DIRECT; $enc = KeyEncryptionAlgorithm::MODE_ENCRYPT; $wrap = KeyEncryptionAlgorithm::MODE_WRAP; - $supportedKeyManagementModeCombinations = [$enc.$enc => true, $enc.$wrap => true, $wrap.$enc => true, $wrap.$wrap => true, $agree.$agree => false, $agree.$dir => false, $agree.$enc => false, $agree.$wrap => false, $dir.$agree => false, $dir.$dir => false, $dir.$enc => false, $dir.$wrap => false, $enc.$agree => false, $enc.$dir => false, $wrap.$agree => false, $wrap.$dir => false]; + $supportedKeyManagementModeCombinations = [ + $enc . $enc => true, + $enc . $wrap => true, + $wrap . $enc => true, + $wrap . $wrap => true, + $agree . $agree => false, + $agree . $dir => false, + $agree . $enc => false, + $agree . $wrap => false, + $dir . $agree => false, + $dir . $dir => false, + $dir . $enc => false, + $dir . $wrap => false, + $enc . $agree => false, + $enc . $dir => false, + $wrap . $agree => false, + $wrap . $dir => false, + ]; - if (array_key_exists($current.$new, $supportedKeyManagementModeCombinations)) { - return $supportedKeyManagementModeCombinations[$current.$new]; + if (array_key_exists($current . $new, $supportedKeyManagementModeCombinations)) { + return $supportedKeyManagementModeCombinations[$current . $new]; } return false; @@ -443,48 +512,46 @@ private function createIV(int $size): string return random_bytes($size / 8); } - /** - * @throws InvalidArgumentException if the header parameter "alg" is missing - * @throws InvalidArgumentException if the header parameter "alg" is not supported or not a key encryption algorithm - */ private function getKeyEncryptionAlgorithm(array $completeHeader): KeyEncryptionAlgorithm { - if (!isset($completeHeader['alg'])) { + if (! isset($completeHeader['alg'])) { throw new InvalidArgumentException('Parameter "alg" is missing.'); } - $keyEncryptionAlgorithm = $this->algorithmManager->get($completeHeader['alg']); - if (!$keyEncryptionAlgorithm instanceof KeyEncryptionAlgorithm) { - throw new InvalidArgumentException(sprintf('The key encryption algorithm "%s" is not supported or not a key encryption algorithm instance.', $completeHeader['alg'])); + $keyEncryptionAlgorithm = $this->keyEncryptionAlgorithmManager->get($completeHeader['alg']); + if (! $keyEncryptionAlgorithm instanceof KeyEncryptionAlgorithm) { + throw new InvalidArgumentException(sprintf( + 'The key encryption algorithm "%s" is not supported or not a key encryption algorithm instance.', + $completeHeader['alg'] + )); } return $keyEncryptionAlgorithm; } - /** - * @throws InvalidArgumentException if the header parameter "enc" is missing - * @throws InvalidArgumentException if the header parameter "enc" is not supported or not a content encryption algorithm - */ private function getContentEncryptionAlgorithm(array $completeHeader): ContentEncryptionAlgorithm { - if (!isset($completeHeader['enc'])) { + if (! isset($completeHeader['enc'])) { throw new InvalidArgumentException('Parameter "enc" is missing.'); } - $contentEncryptionAlgorithm = $this->algorithmManager->get($completeHeader['enc']); - if (!$contentEncryptionAlgorithm instanceof ContentEncryptionAlgorithm) { - throw new InvalidArgumentException(sprintf('The content encryption algorithm "%s" is not supported or not a content encryption algorithm instance.', $completeHeader['enc'])); + $contentEncryptionAlgorithm = $this->contentEncryptionAlgorithmManager->get($completeHeader['enc']); + if (! $contentEncryptionAlgorithm instanceof ContentEncryptionAlgorithm) { + throw new InvalidArgumentException(sprintf( + 'The content encryption algorithm "%s" is not supported or not a content encryption algorithm instance.', + $completeHeader['enc'] + )); } return $contentEncryptionAlgorithm; } - /** - * @throws InvalidArgumentException if the header contains duplicated entries - */ private function checkDuplicatedHeaderParameters(array $header1, array $header2): void { $inter = array_intersect_key($header1, $header2); - if (0 !== count($inter)) { - throw new InvalidArgumentException(sprintf('The header contains duplicated entries: %s.', implode(', ', array_keys($inter)))); + if (count($inter) !== 0) { + throw new InvalidArgumentException(sprintf( + 'The header contains duplicated entries: %s.', + implode(', ', array_keys($inter)) + )); } } } diff --git a/src/Component/Encryption/JWEBuilderFactory.php b/src/Component/Encryption/JWEBuilderFactory.php index 80748090..ba82750c 100644 --- a/src/Component/Encryption/JWEBuilderFactory.php +++ b/src/Component/Encryption/JWEBuilderFactory.php @@ -2,15 +2,6 @@ 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\Encryption; use Jose\Component\Core\AlgorithmManagerFactory; @@ -18,38 +9,33 @@ class JWEBuilderFactory { - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; - - /** - * @var CompressionMethodManagerFactory - */ - private $compressionMethodManagerFactory; - - /** - * JWEBuilderFactory constructor. - */ - public function __construct(AlgorithmManagerFactory $algorithmManagerFactory, CompressionMethodManagerFactory $compressionMethodManagerFactory) - { - $this->algorithmManagerFactory = $algorithmManagerFactory; - $this->compressionMethodManagerFactory = $compressionMethodManagerFactory; + public function __construct( + private AlgorithmManagerFactory $algorithmManagerFactory, + private CompressionMethodManagerFactory $compressionMethodManagerFactory + ) { } /** - * Creates a JWE Builder object using the given key encryption algorithms, content encryption algorithms and compression methods. + * Creates a JWE Builder object using the given key encryption algorithms, content encryption algorithms and + * compression methods. * * @param string[] $keyEncryptionAlgorithms * @param string[] $contentEncryptionAlgorithm * @param string[] $compressionMethods */ - public function create(array $keyEncryptionAlgorithms, array $contentEncryptionAlgorithm, array $compressionMethods): JWEBuilder - { + public function create( + array $keyEncryptionAlgorithms, + array $contentEncryptionAlgorithm, + array $compressionMethods + ): JWEBuilder { $keyEncryptionAlgorithmManager = $this->algorithmManagerFactory->create($keyEncryptionAlgorithms); $contentEncryptionAlgorithmManager = $this->algorithmManagerFactory->create($contentEncryptionAlgorithm); $compressionMethodManager = $this->compressionMethodManagerFactory->create($compressionMethods); - return new JWEBuilder($keyEncryptionAlgorithmManager, $contentEncryptionAlgorithmManager, $compressionMethodManager); + return new JWEBuilder( + $keyEncryptionAlgorithmManager, + $contentEncryptionAlgorithmManager, + $compressionMethodManager + ); } } diff --git a/src/Component/Encryption/JWEDecrypter.php b/src/Component/Encryption/JWEDecrypter.php index 88c3f935..fbfab622 100644 --- a/src/Component/Encryption/JWEDecrypter.php +++ b/src/Component/Encryption/JWEDecrypter.php @@ -2,15 +2,6 @@ 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\Encryption; use function array_key_exists; @@ -33,26 +24,11 @@ class JWEDecrypter { - /** - * @var AlgorithmManager - */ - private $keyEncryptionAlgorithmManager; - - /** - * @var AlgorithmManager - */ - private $contentEncryptionAlgorithmManager; - - /** - * @var CompressionMethodManager - */ - private $compressionMethodManager; - - public function __construct(AlgorithmManager $keyEncryptionAlgorithmManager, AlgorithmManager $contentEncryptionAlgorithmManager, CompressionMethodManager $compressionMethodManager) - { - $this->keyEncryptionAlgorithmManager = $keyEncryptionAlgorithmManager; - $this->contentEncryptionAlgorithmManager = $contentEncryptionAlgorithmManager; - $this->compressionMethodManager = $compressionMethodManager; + public function __construct( + private AlgorithmManager $keyEncryptionAlgorithmManager, + private AlgorithmManager $contentEncryptionAlgorithmManager, + private CompressionMethodManager $compressionMethodManager + ) { } /** @@ -100,24 +76,26 @@ public function decryptUsingKey(JWE &$jwe, JWK $jwk, int $recipient, ?JWK $sende * @param JWKSet $jwkset The key set used to decrypt the input * @param JWK $jwk The key used to decrypt the token in case of success * @param int $recipient The recipient used to decrypt the token in case of success - * - * @throws InvalidArgumentException if no key is set is the keyset - * @throws InvalidArgumentException if the token has no recipients */ - public function decryptUsingKeySet(JWE &$jwe, JWKSet $jwkset, int $recipient, JWK &$jwk = null, ?JWK $senderKey = null): bool - { - if (0 === $jwkset->count()) { + public function decryptUsingKeySet( + JWE &$jwe, + JWKSet $jwkset, + int $recipient, + JWK &$jwk = null, + ?JWK $senderKey = null + ): bool { + if ($jwkset->count() === 0) { throw new InvalidArgumentException('No key in the key set.'); } - if (null !== $jwe->getPayload()) { + if ($jwe->getPayload() !== null) { return true; } - if (0 === $jwe->countRecipients()) { + if ($jwe->countRecipients() === 0) { throw new InvalidArgumentException('The JWE does not contain any recipient.'); } $plaintext = $this->decryptRecipientKey($jwe, $jwkset, $recipient, $jwk, $senderKey); - if (null !== $plaintext) { + if ($plaintext !== null) { $jwe = $jwe->withPayload($plaintext); return true; @@ -126,10 +104,19 @@ public function decryptUsingKeySet(JWE &$jwe, JWKSet $jwkset, int $recipient, JW return false; } - private function decryptRecipientKey(JWE $jwe, JWKSet $jwkset, int $i, JWK &$successJwk = null, ?JWK $senderKey = null): ?string - { + private function decryptRecipientKey( + JWE $jwe, + JWKSet $jwkset, + int $i, + JWK &$successJwk = null, + ?JWK $senderKey = null + ): ?string { $recipient = $jwe->getRecipient($i); - $completeHeader = array_merge($jwe->getSharedProtectedHeader(), $jwe->getSharedHeader(), $recipient->getHeader()); + $completeHeader = array_merge( + $jwe->getSharedProtectedHeader(), + $jwe->getSharedHeader(), + $recipient->getHeader() + ); $this->checkCompleteHeader($completeHeader); $key_encryption_algorithm = $this->getKeyEncryptionAlgorithm($completeHeader); @@ -140,18 +127,25 @@ private function decryptRecipientKey(JWE $jwe, JWKSet $jwkset, int $i, JWK &$suc foreach ($jwkset as $recipientKey) { try { KeyChecker::checkKeyUsage($recipientKey, 'decryption'); - if ('dir' !== $key_encryption_algorithm->name()) { + if ($key_encryption_algorithm->name() !== 'dir') { KeyChecker::checkKeyAlgorithm($recipientKey, $key_encryption_algorithm->name()); } else { KeyChecker::checkKeyAlgorithm($recipientKey, $content_encryption_algorithm->name()); } - $cek = $this->decryptCEK($key_encryption_algorithm, $content_encryption_algorithm, $recipientKey, $senderKey, $recipient, $completeHeader); + $cek = $this->decryptCEK( + $key_encryption_algorithm, + $content_encryption_algorithm, + $recipientKey, + $senderKey, + $recipient, + $completeHeader + ); $this->checkCekSize($cek, $key_encryption_algorithm, $content_encryption_algorithm); $payload = $this->decryptPayload($jwe, $cek, $content_encryption_algorithm, $completeHeader); $successJwk = $recipientKey; return $payload; - } catch (Throwable $e) { + } catch (Throwable) { //We do nothing, we continue with other keys continue; } @@ -160,11 +154,11 @@ private function decryptRecipientKey(JWE $jwe, JWKSet $jwkset, int $i, JWK &$suc return null; } - /** - * @throws InvalidArgumentException if the Content Encryption Key size is invalid - */ - private function checkCekSize(string $cek, KeyEncryptionAlgorithm $keyEncryptionAlgorithm, ContentEncryptionAlgorithm $algorithm): void - { + private function checkCekSize( + string $cek, + KeyEncryptionAlgorithm $keyEncryptionAlgorithm, + ContentEncryptionAlgorithm $algorithm + ): void { if ($keyEncryptionAlgorithm instanceof DirectEncryption || $keyEncryptionAlgorithm instanceof KeyAgreement) { return; } @@ -173,12 +167,9 @@ private function checkCekSize(string $cek, KeyEncryptionAlgorithm $keyEncryption } } - /** - * @throws InvalidArgumentException if the IV size is invalid - */ private function checkIvSize(?string $iv, int $requiredIvSize): void { - if (null === $iv && 0 !== $requiredIvSize) { + if ($iv === null && $requiredIvSize !== 0) { throw new InvalidArgumentException('Invalid IV size'); } if (is_string($iv) && mb_strlen($iv, '8bit') !== $requiredIvSize / 8) { @@ -186,19 +177,34 @@ private function checkIvSize(?string $iv, int $requiredIvSize): void } } - /** - * @throws InvalidArgumentException if the CEK creation method is not supported - */ - private function decryptCEK(Algorithm $key_encryption_algorithm, ContentEncryptionAlgorithm $content_encryption_algorithm, JWK $recipientKey, ?JWK $senderKey, Recipient $recipient, array $completeHeader): string - { + private function decryptCEK( + Algorithm $key_encryption_algorithm, + ContentEncryptionAlgorithm $content_encryption_algorithm, + JWK $recipientKey, + ?JWK $senderKey, + Recipient $recipient, + array $completeHeader + ): string { if ($key_encryption_algorithm instanceof DirectEncryption) { return $key_encryption_algorithm->getCEK($recipientKey); } if ($key_encryption_algorithm instanceof KeyAgreement) { - return $key_encryption_algorithm->getAgreementKey($content_encryption_algorithm->getCEKSize(), $content_encryption_algorithm->name(), $recipientKey, $senderKey, $completeHeader); + return $key_encryption_algorithm->getAgreementKey( + $content_encryption_algorithm->getCEKSize(), + $content_encryption_algorithm->name(), + $recipientKey, + $senderKey, + $completeHeader + ); } if ($key_encryption_algorithm instanceof KeyAgreementWithKeyWrapping) { - return $key_encryption_algorithm->unwrapAgreementKey($recipientKey, $senderKey, $recipient->getEncryptedKey(), $content_encryption_algorithm->getCEKSize(), $completeHeader); + return $key_encryption_algorithm->unwrapAgreementKey( + $recipientKey, + $senderKey, + $recipient->getEncryptedKey(), + $content_encryption_algorithm->getCEKSize(), + $completeHeader + ); } if ($key_encryption_algorithm instanceof KeyEncryption) { return $key_encryption_algorithm->decryptKey($recipientKey, $recipient->getEncryptedKey(), $completeHeader); @@ -210,9 +216,20 @@ private function decryptCEK(Algorithm $key_encryption_algorithm, ContentEncrypti throw new InvalidArgumentException('Unsupported CEK generation'); } - private function decryptPayload(JWE $jwe, string $cek, ContentEncryptionAlgorithm $content_encryption_algorithm, array $completeHeader): string - { - $payload = $content_encryption_algorithm->decryptContent($jwe->getCiphertext(), $cek, $jwe->getIV(), $jwe->getAAD(), $jwe->getEncodedSharedProtectedHeader(), $jwe->getTag()); + private function decryptPayload( + JWE $jwe, + string $cek, + ContentEncryptionAlgorithm $content_encryption_algorithm, + array $completeHeader + ): string { + $payload = $content_encryption_algorithm->decryptContent( + $jwe->getCiphertext(), + $cek, + $jwe->getIV(), + $jwe->getAAD(), + $jwe->getEncodedSharedProtectedHeader(), + $jwe->getTag() + ); return $this->decompressIfNeeded($payload, $completeHeader); } @@ -227,39 +244,36 @@ private function decompressIfNeeded(string $payload, array $completeHeaders): st return $payload; } - /** - * @throws InvalidArgumentException if a header parameter is missing - */ private function checkCompleteHeader(array $completeHeaders): void { foreach (['enc', 'alg'] as $key) { - if (!isset($completeHeaders[$key])) { + if (! isset($completeHeaders[$key])) { throw new InvalidArgumentException(sprintf("Parameter '%s' is missing.", $key)); } } } - /** - * @throws InvalidArgumentException if the key encryption algorithm is not supported or does not implement the KeyEncryptionAlgorithm interface - */ private function getKeyEncryptionAlgorithm(array $completeHeaders): KeyEncryptionAlgorithm { $key_encryption_algorithm = $this->keyEncryptionAlgorithmManager->get($completeHeaders['alg']); - if (!$key_encryption_algorithm instanceof KeyEncryptionAlgorithm) { - throw new InvalidArgumentException(sprintf('The key encryption algorithm "%s" is not supported or does not implement KeyEncryptionAlgorithm interface.', $completeHeaders['alg'])); + if (! $key_encryption_algorithm instanceof KeyEncryptionAlgorithm) { + throw new InvalidArgumentException(sprintf( + 'The key encryption algorithm "%s" is not supported or does not implement KeyEncryptionAlgorithm interface.', + $completeHeaders['alg'] + )); } return $key_encryption_algorithm; } - /** - * @throws InvalidArgumentException if the content encryption algorithm is not supported or does not implement the ContentEncryption interface - */ private function getContentEncryptionAlgorithm(array $completeHeader): ContentEncryptionAlgorithm { $content_encryption_algorithm = $this->contentEncryptionAlgorithmManager->get($completeHeader['enc']); - if (!$content_encryption_algorithm instanceof ContentEncryptionAlgorithm) { - throw new InvalidArgumentException(sprintf('The key encryption algorithm "%s" is not supported or does not implement the ContentEncryption interface.', $completeHeader['enc'])); + if (! $content_encryption_algorithm instanceof ContentEncryptionAlgorithm) { + throw new InvalidArgumentException(sprintf( + 'The key encryption algorithm "%s" is not supported or does not implement the ContentEncryption interface.', + $completeHeader['enc'] + )); } return $content_encryption_algorithm; diff --git a/src/Component/Encryption/JWEDecrypterFactory.php b/src/Component/Encryption/JWEDecrypterFactory.php index 71ba0bf2..c1af0c73 100644 --- a/src/Component/Encryption/JWEDecrypterFactory.php +++ b/src/Component/Encryption/JWEDecrypterFactory.php @@ -2,15 +2,6 @@ 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\Encryption; use Jose\Component\Core\AlgorithmManagerFactory; @@ -18,35 +9,33 @@ class JWEDecrypterFactory { - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; - - /** - * @var CompressionMethodManagerFactory - */ - private $compressionMethodManagerFactory; - - public function __construct(AlgorithmManagerFactory $algorithmManagerFactory, CompressionMethodManagerFactory $compressionMethodManagerFactory) - { - $this->algorithmManagerFactory = $algorithmManagerFactory; - $this->compressionMethodManagerFactory = $compressionMethodManagerFactory; + public function __construct( + private AlgorithmManagerFactory $algorithmManagerFactory, + private CompressionMethodManagerFactory $compressionMethodManagerFactory + ) { } /** - * Creates a JWE Decrypter object using the given key encryption algorithms, content encryption algorithms and compression methods. + * Creates a JWE Decrypter object using the given key encryption algorithms, content encryption algorithms and + * compression methods. * * @param string[] $keyEncryptionAlgorithms * @param string[] $contentEncryptionAlgorithms * @param string[] $compressionMethods */ - public function create(array $keyEncryptionAlgorithms, array $contentEncryptionAlgorithms, array $compressionMethods): JWEDecrypter - { + public function create( + array $keyEncryptionAlgorithms, + array $contentEncryptionAlgorithms, + array $compressionMethods + ): JWEDecrypter { $keyEncryptionAlgorithmManager = $this->algorithmManagerFactory->create($keyEncryptionAlgorithms); $contentEncryptionAlgorithmManager = $this->algorithmManagerFactory->create($contentEncryptionAlgorithms); $compressionMethodManager = $this->compressionMethodManagerFactory->create($compressionMethods); - return new JWEDecrypter($keyEncryptionAlgorithmManager, $contentEncryptionAlgorithmManager, $compressionMethodManager); + return new JWEDecrypter( + $keyEncryptionAlgorithmManager, + $contentEncryptionAlgorithmManager, + $compressionMethodManager + ); } } diff --git a/src/Component/Encryption/JWELoader.php b/src/Component/Encryption/JWELoader.php index dcc7557c..b6e18a66 100644 --- a/src/Component/Encryption/JWELoader.php +++ b/src/Component/Encryption/JWELoader.php @@ -2,15 +2,6 @@ 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\Encryption; use Jose\Component\Checker\HeaderCheckerManager; @@ -22,29 +13,11 @@ class JWELoader { - /** - * @var JWEDecrypter - */ - private $jweDecrypter; - - /** - * @var null|HeaderCheckerManager - */ - private $headerCheckerManager; - - /** - * @var JWESerializerManager - */ - private $serializerManager; - - /** - * JWELoader constructor. - */ - public function __construct(JWESerializerManager $serializerManager, JWEDecrypter $jweDecrypter, ?HeaderCheckerManager $headerCheckerManager) - { - $this->serializerManager = $serializerManager; - $this->jweDecrypter = $jweDecrypter; - $this->headerCheckerManager = $headerCheckerManager; + public function __construct( + private JWESerializerManager $serializerManager, + private JWEDecrypter $jweDecrypter, + private ?HeaderCheckerManager $headerCheckerManager + ) { } /** @@ -72,8 +45,8 @@ public function getSerializerManager(): JWESerializerManager } /** - * This method will try to load and decrypt the given token using a JWK. - * If succeeded, the methods will populate the $recipient variable and returns the JWE. + * This method will try to load and decrypt the given token using a JWK. If succeeded, the methods will populate the + * $recipient variable and returns the JWE. */ public function loadAndDecryptWithKey(string $token, JWK $key, ?int &$recipient): JWE { @@ -83,10 +56,8 @@ public function loadAndDecryptWithKey(string $token, JWK $key, ?int &$recipient) } /** - * This method will try to load and decrypt the given token using a JWKSet. - * If succeeded, the methods will populate the $recipient variable and returns the JWE. - * - * @throws RuntimeException if the data cannot be loaded or decrypted + * This method will try to load and decrypt the given token using a JWKSet. If succeeded, the methods will populate + * the $recipient variable and returns the JWE. */ public function loadAndDecryptWithKeySet(string $token, JWKSet $keyset, ?int &$recipient): JWE { @@ -100,7 +71,7 @@ public function loadAndDecryptWithKeySet(string $token, JWKSet $keyset, ?int &$r return $jwe; } } - } catch (Throwable $e) { + } catch (Throwable) { // Nothing to do. Exception thrown just after } @@ -110,12 +81,12 @@ public function loadAndDecryptWithKeySet(string $token, JWKSet $keyset, ?int &$r private function processRecipient(JWE &$jwe, JWKSet $keyset, int $recipient): bool { try { - if (null !== $this->headerCheckerManager) { + if ($this->headerCheckerManager !== null) { $this->headerCheckerManager->check($jwe, $recipient); } return $this->jweDecrypter->decryptUsingKeySet($jwe, $keyset, $recipient); - } catch (Throwable $e) { + } catch (Throwable) { return false; } } diff --git a/src/Component/Encryption/JWELoaderFactory.php b/src/Component/Encryption/JWELoaderFactory.php index 461cca5a..2d209df2 100644 --- a/src/Component/Encryption/JWELoaderFactory.php +++ b/src/Component/Encryption/JWELoaderFactory.php @@ -2,15 +2,6 @@ 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\Encryption; use Jose\Component\Checker\HeaderCheckerManagerFactory; @@ -18,40 +9,31 @@ class JWELoaderFactory { - /** - * @var JWEDecrypterFactory - */ - private $jweDecrypterFactory; - - /** - * @var JWESerializerManagerFactory - */ - private $jweSerializerManagerFactory; - - /** - * @var null|HeaderCheckerManagerFactory - */ - private $headerCheckerManagerFactory; - - /** - * JWELoaderFactory constructor. - */ - public function __construct(JWESerializerManagerFactory $jweSerializerManagerFactory, JWEDecrypterFactory $jweDecrypterFactory, ?HeaderCheckerManagerFactory $headerCheckerManagerFactory) - { - $this->jweSerializerManagerFactory = $jweSerializerManagerFactory; - $this->jweDecrypterFactory = $jweDecrypterFactory; - $this->headerCheckerManagerFactory = $headerCheckerManagerFactory; + public function __construct( + private JWESerializerManagerFactory $jweSerializerManagerFactory, + private JWEDecrypterFactory $jweDecrypterFactory, + private ?HeaderCheckerManagerFactory $headerCheckerManagerFactory + ) { } /** * Creates a JWELoader using the given serializer aliases, encryption algorithm aliases, compression method aliases * and header checker aliases. */ - public function create(array $serializers, array $keyEncryptionAlgorithms, array $contentEncryptionAlgorithms, array $compressionMethods, array $headerCheckers = []): JWELoader - { + public function create( + array $serializers, + array $keyEncryptionAlgorithms, + array $contentEncryptionAlgorithms, + array $compressionMethods, + array $headerCheckers = [] + ): JWELoader { $serializerManager = $this->jweSerializerManagerFactory->create($serializers); - $jweDecrypter = $this->jweDecrypterFactory->create($keyEncryptionAlgorithms, $contentEncryptionAlgorithms, $compressionMethods); - if (null !== $this->headerCheckerManagerFactory) { + $jweDecrypter = $this->jweDecrypterFactory->create( + $keyEncryptionAlgorithms, + $contentEncryptionAlgorithms, + $compressionMethods + ); + if ($this->headerCheckerManagerFactory !== null) { $headerCheckerManager = $this->headerCheckerManagerFactory->create($headerCheckers); } else { $headerCheckerManager = null; diff --git a/src/Component/Encryption/JWETokenSupport.php b/src/Component/Encryption/JWETokenSupport.php index 0c311ffd..b5dbf4bb 100644 --- a/src/Component/Encryption/JWETokenSupport.php +++ b/src/Component/Encryption/JWETokenSupport.php @@ -2,15 +2,6 @@ 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\Encryption; use Jose\Component\Checker\TokenTypeSupport; @@ -25,16 +16,15 @@ public function supports(JWT $jwt): bool public function retrieveTokenHeaders(JWT $jwt, int $index, array &$protectedHeader, array &$unprotectedHeader): void { - if (!$jwt instanceof JWE) { + if (! $jwt instanceof JWE) { return; } $protectedHeader = $jwt->getSharedProtectedHeader(); $unprotectedHeader = $jwt->getSharedHeader(); - $recipient = $jwt->getRecipient($index)->getHeader(); + $recipient = $jwt->getRecipient($index) + ->getHeader() + ; - $unprotectedHeader = array_merge( - $unprotectedHeader, - $recipient - ); + $unprotectedHeader = array_merge($unprotectedHeader, $recipient); } } diff --git a/src/Component/Encryption/Recipient.php b/src/Component/Encryption/Recipient.php index 98c4dfb8..66fb4c32 100644 --- a/src/Component/Encryption/Recipient.php +++ b/src/Component/Encryption/Recipient.php @@ -2,15 +2,6 @@ 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\Encryption; use function array_key_exists; @@ -19,22 +10,18 @@ /** * @internal */ -class Recipient +final class Recipient { /** * @var array */ private $header = []; - /** - * @var null|string - */ - private $encryptedKey; - - public function __construct(array $header, ?string $encryptedKey) - { + public function __construct( + array $header, + private ?string $encryptedKey + ) { $this->header = $header; - $this->encryptedKey = $encryptedKey; } /** @@ -50,13 +37,11 @@ public function getHeader(): array * * @param string $key The key * - * @throws InvalidArgumentException if the header parameter does not exist - * - * @return null|mixed + * @return mixed|null */ public function getHeaderParameter(string $key) { - if (!$this->hasHeaderParameter($key)) { + if (! $this->hasHeaderParameter($key)) { throw new InvalidArgumentException(sprintf('The header "%s" does not exist.', $key)); } diff --git a/src/Component/Encryption/Serializer/CompactSerializer.php b/src/Component/Encryption/Serializer/CompactSerializer.php index ce487fdb..0f490567 100644 --- a/src/Component/Encryption/Serializer/CompactSerializer.php +++ b/src/Component/Encryption/Serializer/CompactSerializer.php @@ -2,15 +2,6 @@ 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\Encryption\Serializer; use function count; @@ -38,7 +29,7 @@ public function name(): string public function serialize(JWE $jwe, ?int $recipientIndex = null): string { - if (null === $recipientIndex) { + if ($recipientIndex === null) { $recipientIndex = 0; } $recipient = $jwe->getRecipient($recipientIndex); @@ -50,27 +41,24 @@ public function serialize(JWE $jwe, ?int $recipientIndex = null): string return sprintf( '%s.%s.%s.%s.%s', $jwe->getEncodedSharedProtectedHeader(), - Base64UrlSafe::encodeUnpadded(null === $recipient->getEncryptedKey() ? '' : $recipient->getEncryptedKey()), - Base64UrlSafe::encodeUnpadded(null === $jwe->getIV() ? '' : $jwe->getIV()), + Base64UrlSafe::encodeUnpadded($recipient->getEncryptedKey() === null ? '' : $recipient->getEncryptedKey()), + Base64UrlSafe::encodeUnpadded($jwe->getIV() === null ? '' : $jwe->getIV()), Base64UrlSafe::encodeUnpadded($jwe->getCiphertext()), - Base64UrlSafe::encodeUnpadded(null === $jwe->getTag() ? '' : $jwe->getTag()) + Base64UrlSafe::encodeUnpadded($jwe->getTag() === null ? '' : $jwe->getTag()) ); } - /** - * @throws InvalidArgumentException if the input is not supported - */ public function unserialize(string $input): JWE { $parts = explode('.', $input); - if (5 !== count($parts)) { + if (count($parts) !== 5) { throw new InvalidArgumentException('Unsupported input'); } try { $encodedSharedProtectedHeader = $parts[0]; $sharedProtectedHeader = JsonConverter::decode(Base64UrlSafe::decode($encodedSharedProtectedHeader)); - $encryptedKey = '' === $parts[1] ? null : Base64UrlSafe::decode($parts[1]); + $encryptedKey = $parts[1] === '' ? null : Base64UrlSafe::decode($parts[1]); $iv = Base64UrlSafe::decode($parts[2]); $ciphertext = Base64UrlSafe::decode($parts[3]); $tag = Base64UrlSafe::decode($parts[4]); @@ -90,33 +78,28 @@ public function unserialize(string $input): JWE } } - /** - * @throws LogicException if the AAD is invalid - */ private function checkHasNoAAD(JWE $jwe): void { - if (null !== $jwe->getAAD()) { + if ($jwe->getAAD() !== null) { throw new LogicException('This JWE has AAD and cannot be converted into Compact JSON.'); } } - /** - * @throws LogicException if the JWE has a shared header or recipient header (invalid for compact JSON) - */ private function checkRecipientHasNoHeader(JWE $jwe, int $id): void { - if (0 !== count($jwe->getSharedHeader()) || 0 !== count($jwe->getRecipient($id)->getHeader())) { - throw new LogicException('This JWE has shared header parameters or recipient header parameters and cannot be converted into Compact JSON.'); + if (count($jwe->getSharedHeader()) !== 0 || count($jwe->getRecipient($id)->getHeader()) !== 0) { + throw new LogicException( + 'This JWE has shared header parameters or recipient header parameters and cannot be converted into Compact JSON.' + ); } } - /** - * @throws LogicException if the JWE has no shared protected header (invalid for compact JSON) - */ private function checkHasSharedProtectedHeader(JWE $jwe): void { - if (0 === count($jwe->getSharedProtectedHeader())) { - throw new LogicException('This JWE does not have shared protected header parameters and cannot be converted into Compact JSON.'); + if (count($jwe->getSharedProtectedHeader()) === 0) { + throw new LogicException( + 'This JWE does not have shared protected header parameters and cannot be converted into Compact JSON.' + ); } } } diff --git a/src/Component/Encryption/Serializer/JSONFlattenedSerializer.php b/src/Component/Encryption/Serializer/JSONFlattenedSerializer.php index e7920842..5a8cac88 100644 --- a/src/Component/Encryption/Serializer/JSONFlattenedSerializer.php +++ b/src/Component/Encryption/Serializer/JSONFlattenedSerializer.php @@ -2,15 +2,6 @@ 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\Encryption\Serializer; use function array_key_exists; @@ -37,7 +28,7 @@ public function name(): string public function serialize(JWE $jwe, ?int $recipientIndex = null): string { - if (null === $recipientIndex) { + if ($recipientIndex === null) { $recipientIndex = 0; } $recipient = $jwe->getRecipient($recipientIndex); @@ -46,19 +37,19 @@ public function serialize(JWE $jwe, ?int $recipientIndex = null): string 'iv' => Base64UrlSafe::encodeUnpadded($jwe->getIV()), 'tag' => Base64UrlSafe::encodeUnpadded($jwe->getTag()), ]; - if (null !== $jwe->getAAD()) { + if ($jwe->getAAD() !== null) { $data['aad'] = Base64UrlSafe::encodeUnpadded($jwe->getAAD()); } - if (0 !== count($jwe->getSharedProtectedHeader())) { + if (count($jwe->getSharedProtectedHeader()) !== 0) { $data['protected'] = $jwe->getEncodedSharedProtectedHeader(); } - if (0 !== count($jwe->getSharedHeader())) { + if (count($jwe->getSharedHeader()) !== 0) { $data['unprotected'] = $jwe->getSharedHeader(); } - if (0 !== count($recipient->getHeader())) { + if (count($recipient->getHeader()) !== 0) { $data['header'] = $recipient->getHeader(); } - if (null !== $recipient->getEncryptedKey()) { + if ($recipient->getEncryptedKey() !== null) { $data['encrypted_key'] = Base64UrlSafe::encodeUnpadded($recipient->getEncryptedKey()); } @@ -90,12 +81,9 @@ public function unserialize(string $input): JWE ); } - /** - * @throws InvalidArgumentException if the payload cannot be encoded - */ private function checkData(?array $data): void { - if (null === $data || !isset($data['ciphertext']) || isset($data['recipients'])) { + if ($data === null || ! isset($data['ciphertext']) || isset($data['recipients'])) { throw new InvalidArgumentException('Unsupported input.'); } } @@ -103,7 +91,9 @@ private function checkData(?array $data): void private function processHeaders(array $data): array { $encodedSharedProtectedHeader = array_key_exists('protected', $data) ? $data['protected'] : null; - $sharedProtectedHeader = $encodedSharedProtectedHeader ? JsonConverter::decode(Base64UrlSafe::decode($encodedSharedProtectedHeader)) : []; + $sharedProtectedHeader = $encodedSharedProtectedHeader ? JsonConverter::decode( + Base64UrlSafe::decode($encodedSharedProtectedHeader) + ) : []; $sharedHeader = $data['unprotected'] ?? []; return [$encodedSharedProtectedHeader, $sharedProtectedHeader, $sharedHeader]; diff --git a/src/Component/Encryption/Serializer/JSONGeneralSerializer.php b/src/Component/Encryption/Serializer/JSONGeneralSerializer.php index b796060d..e49a61bd 100644 --- a/src/Component/Encryption/Serializer/JSONGeneralSerializer.php +++ b/src/Component/Encryption/Serializer/JSONGeneralSerializer.php @@ -2,15 +2,6 @@ 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\Encryption\Serializer; use function array_key_exists; @@ -36,12 +27,9 @@ public function name(): string return self::NAME; } - /** - * @throws LogicException if there is no recipient - */ public function serialize(JWE $jwe, ?int $recipientIndex = null): string { - if (0 === $jwe->countRecipients()) { + if ($jwe->countRecipients() === 0) { throw new LogicException('No recipient.'); } @@ -50,22 +38,22 @@ public function serialize(JWE $jwe, ?int $recipientIndex = null): string 'iv' => Base64UrlSafe::encodeUnpadded($jwe->getIV()), 'tag' => Base64UrlSafe::encodeUnpadded($jwe->getTag()), ]; - if (null !== $jwe->getAAD()) { + if ($jwe->getAAD() !== null) { $data['aad'] = Base64UrlSafe::encodeUnpadded($jwe->getAAD()); } - if (0 !== count($jwe->getSharedProtectedHeader())) { + if (count($jwe->getSharedProtectedHeader()) !== 0) { $data['protected'] = $jwe->getEncodedSharedProtectedHeader(); } - if (0 !== count($jwe->getSharedHeader())) { + if (count($jwe->getSharedHeader()) !== 0) { $data['unprotected'] = $jwe->getSharedHeader(); } $data['recipients'] = []; foreach ($jwe->getRecipients() as $recipient) { $temp = []; - if (0 !== count($recipient->getHeader())) { + if (count($recipient->getHeader()) !== 0) { $temp['header'] = $recipient->getHeader(); } - if (null !== $recipient->getEncryptedKey()) { + if ($recipient->getEncryptedKey() !== null) { $temp['encrypted_key'] = Base64UrlSafe::encodeUnpadded($recipient->getEncryptedKey()); } $data['recipients'][] = $temp; @@ -102,19 +90,18 @@ public function unserialize(string $input): JWE ); } - /** - * @throws InvalidArgumentException if the input is not supported - */ private function checkData(?array $data): void { - if (null === $data || !isset($data['ciphertext']) || !isset($data['recipients'])) { + if ($data === null || ! isset($data['ciphertext']) || ! isset($data['recipients'])) { throw new InvalidArgumentException('Unsupported input.'); } } private function processRecipient(array $recipient): array { - $encryptedKey = array_key_exists('encrypted_key', $recipient) ? Base64UrlSafe::decode($recipient['encrypted_key']) : null; + $encryptedKey = array_key_exists('encrypted_key', $recipient) ? Base64UrlSafe::decode( + $recipient['encrypted_key'] + ) : null; $header = array_key_exists('header', $recipient) ? $recipient['header'] : []; return [$encryptedKey, $header]; @@ -123,7 +110,9 @@ private function processRecipient(array $recipient): array private function processHeaders(array $data): array { $encodedSharedProtectedHeader = array_key_exists('protected', $data) ? $data['protected'] : null; - $sharedProtectedHeader = $encodedSharedProtectedHeader ? JsonConverter::decode(Base64UrlSafe::decode($encodedSharedProtectedHeader)) : []; + $sharedProtectedHeader = $encodedSharedProtectedHeader ? JsonConverter::decode( + Base64UrlSafe::decode($encodedSharedProtectedHeader) + ) : []; $sharedHeader = array_key_exists('unprotected', $data) ? $data['unprotected'] : []; return [$encodedSharedProtectedHeader, $sharedProtectedHeader, $sharedHeader]; diff --git a/src/Component/Encryption/Serializer/JWESerializer.php b/src/Component/Encryption/Serializer/JWESerializer.php index aa9c341a..04cd3dd9 100644 --- a/src/Component/Encryption/Serializer/JWESerializer.php +++ b/src/Component/Encryption/Serializer/JWESerializer.php @@ -2,15 +2,6 @@ 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\Encryption\Serializer; use Jose\Component\Encryption\JWE; @@ -28,15 +19,13 @@ public function name(): string; public function displayName(): string; /** - * Converts a JWE into a string. - * If the JWE is designed for multiple recipients and the serializer only supports one recipient, - * the recipient index has to be set. + * Converts a JWE into a string. If the JWE is designed for multiple recipients and the serializer only supports one + * recipient, the recipient index has to be set. */ public function serialize(JWE $jws, ?int $recipientIndex = null): string; /** - * Loads data and return a JWE object. - * Throws an exception in case of failure. + * Loads data and return a JWE object. Throws an exception in case of failure. * * @param string $input A string that represents a JWE */ diff --git a/src/Component/Encryption/Serializer/JWESerializerManager.php b/src/Component/Encryption/Serializer/JWESerializerManager.php index 32e8a04a..0694a535 100644 --- a/src/Component/Encryption/Serializer/JWESerializerManager.php +++ b/src/Component/Encryption/Serializer/JWESerializerManager.php @@ -2,15 +2,6 @@ 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\Encryption\Serializer; use InvalidArgumentException; @@ -21,7 +12,7 @@ class JWESerializerManager /** * @var JWESerializer[] */ - private $serializers = []; + private array $serializers = []; /** * @param JWESerializer[] $serializers @@ -44,14 +35,11 @@ public function names(): array } /** - * Converts a JWE into a string. - * Throws an exception if none of the serializer was able to convert the input. - * - * @throws InvalidArgumentException if the serializer is not supported + * Converts a JWE into a string. Throws an exception if none of the serializer was able to convert the input. */ public function serialize(string $name, JWE $jws, ?int $recipientIndex = null): string { - if (!isset($this->serializers[$name])) { + if (! isset($this->serializers[$name])) { throw new InvalidArgumentException(sprintf('Unsupported serializer "%s".', $name)); } @@ -59,13 +47,10 @@ public function serialize(string $name, JWE $jws, ?int $recipientIndex = null): } /** - * Loads data and return a JWE object. - * Throws an exception if none of the serializer was able to convert the input. + * Loads data and return a JWE object. Throws an exception if none of the serializer was able to convert the input. * * @param string $input A string that represents a JWE - * @param null|string $name the name of the serializer if the input is unserialized - * - * @throws InvalidArgumentException if the input cannot be loaded + * @param string|null $name the name of the serializer if the input is unserialized */ public function unserialize(string $input, ?string &$name = null): JWE { @@ -75,7 +60,7 @@ public function unserialize(string $input, ?string &$name = null): JWE $name = $serializer->name(); return $jws; - } catch (InvalidArgumentException $e) { + } catch (InvalidArgumentException) { continue; } } diff --git a/src/Component/Encryption/Serializer/JWESerializerManagerFactory.php b/src/Component/Encryption/Serializer/JWESerializerManagerFactory.php index 63dd69df..d53f8595 100644 --- a/src/Component/Encryption/Serializer/JWESerializerManagerFactory.php +++ b/src/Component/Encryption/Serializer/JWESerializerManagerFactory.php @@ -2,15 +2,6 @@ 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\Encryption\Serializer; use InvalidArgumentException; @@ -26,14 +17,12 @@ class JWESerializerManagerFactory * Creates a serializer manager factory using the given serializers. * * @param string[] $names - * - * @throws InvalidArgumentException if the serializer is not supported */ public function create(array $names): JWESerializerManager { $serializers = []; foreach ($names as $name) { - if (!isset($this->serializers[$name])) { + if (! isset($this->serializers[$name])) { throw new InvalidArgumentException(sprintf('Unsupported serializer "%s".', $name)); } $serializers[] = $this->serializers[$name]; diff --git a/src/Component/KeyManagement/Analyzer/AlgorithmAnalyzer.php b/src/Component/KeyManagement/Analyzer/AlgorithmAnalyzer.php index edb88888..a1db8d3e 100644 --- a/src/Component/KeyManagement/Analyzer/AlgorithmAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/AlgorithmAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWK; @@ -19,7 +10,7 @@ final class AlgorithmAnalyzer implements KeyAnalyzer { public function analyze(JWK $jwk, MessageBag $bag): void { - if (!$jwk->has('alg')) { + if (! $jwk->has('alg')) { $bag->add(Message::medium('The parameter "alg" should be added.')); } } diff --git a/src/Component/KeyManagement/Analyzer/ES256KeyAnalyzer.php b/src/Component/KeyManagement/Analyzer/ES256KeyAnalyzer.php index 36fd23ff..b281e328 100644 --- a/src/Component/KeyManagement/Analyzer/ES256KeyAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/ES256KeyAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Brick\Math\BigInteger; @@ -21,40 +12,37 @@ final class ES256KeyAnalyzer implements KeyAnalyzer { - /** - * @throws RuntimeException if the component "web-token/jwt-util-ecc" is missing - */ public function __construct() { - if (!class_exists(NistCurve::class)) { + if (! class_exists(NistCurve::class)) { throw new RuntimeException('Please install web-token/jwt-util-ecc to use this key analyzer'); } } public function analyze(JWK $jwk, MessageBag $bag): void { - if ('EC' !== $jwk->get('kty')) { + if ($jwk->get('kty') !== 'EC') { return; } - if (!$jwk->has('crv')) { + if (! $jwk->has('crv')) { $bag->add(Message::high('Invalid key. The components "crv" is missing.')); return; } - if ('P-256' !== $jwk->get('crv')) { + if ($jwk->get('crv') !== 'P-256') { return; } $x = Base64UrlSafe::decode($jwk->get('x')); $xLength = 8 * mb_strlen($x, '8bit'); $y = Base64UrlSafe::decode($jwk->get('y')); $yLength = 8 * mb_strlen($y, '8bit'); - if ($yLength !== $xLength || 256 !== $yLength) { + if ($yLength !== $xLength || $yLength !== 256) { $bag->add(Message::high('Invalid key. The components "x" and "y" size shall be 256 bits.')); } $xBI = BigInteger::fromBase(bin2hex($x), 16); $yBI = BigInteger::fromBase(bin2hex($y), 16); $curve = NistCurve::curve256(); - if (!$curve->contains($xBI, $yBI)) { + if (! $curve->contains($xBI, $yBI)) { $bag->add(Message::high('Invalid key. The point is not on the curve.')); } } diff --git a/src/Component/KeyManagement/Analyzer/ES384KeyAnalyzer.php b/src/Component/KeyManagement/Analyzer/ES384KeyAnalyzer.php index 99a50bcb..682d290a 100644 --- a/src/Component/KeyManagement/Analyzer/ES384KeyAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/ES384KeyAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Brick\Math\BigInteger; @@ -21,40 +12,37 @@ final class ES384KeyAnalyzer implements KeyAnalyzer { - /** - * @throws RuntimeException if the component "web-token/jwt-util-ecc" is missing - */ public function __construct() { - if (!class_exists(NistCurve::class)) { + if (! class_exists(NistCurve::class)) { throw new RuntimeException('Please install web-token/jwt-util-ecc to use this key analyzer'); } } public function analyze(JWK $jwk, MessageBag $bag): void { - if ('EC' !== $jwk->get('kty')) { + if ($jwk->get('kty') !== 'EC') { return; } - if (!$jwk->has('crv')) { + if (! $jwk->has('crv')) { $bag->add(Message::high('Invalid key. The components "crv" is missing.')); return; } - if ('P-384' !== $jwk->get('crv')) { + if ($jwk->get('crv') !== 'P-384') { return; } $x = Base64UrlSafe::decode($jwk->get('x')); $xLength = 8 * mb_strlen($x, '8bit'); $y = Base64UrlSafe::decode($jwk->get('y')); $yLength = 8 * mb_strlen($y, '8bit'); - if ($yLength !== $xLength || 384 !== $yLength) { + if ($yLength !== $xLength || $yLength !== 384) { $bag->add(Message::high('Invalid key. The components "x" and "y" size shall be 384 bits.')); } $xBI = BigInteger::fromBase(bin2hex($x), 16); $yBI = BigInteger::fromBase(bin2hex($y), 16); $curve = NistCurve::curve384(); - if (!$curve->contains($xBI, $yBI)) { + if (! $curve->contains($xBI, $yBI)) { $bag->add(Message::high('Invalid key. The point is not on the curve.')); } } diff --git a/src/Component/KeyManagement/Analyzer/ES512KeyAnalyzer.php b/src/Component/KeyManagement/Analyzer/ES512KeyAnalyzer.php index b4fc5371..984cf713 100644 --- a/src/Component/KeyManagement/Analyzer/ES512KeyAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/ES512KeyAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Brick\Math\BigInteger; @@ -21,40 +12,37 @@ final class ES512KeyAnalyzer implements KeyAnalyzer { - /** - * @throws RuntimeException if the component "web-token/jwt-util-ecc" is missing - */ public function __construct() { - if (!class_exists(NistCurve::class)) { + if (! class_exists(NistCurve::class)) { throw new RuntimeException('Please install web-token/jwt-util-ecc to use this key analyzer'); } } public function analyze(JWK $jwk, MessageBag $bag): void { - if ('EC' !== $jwk->get('kty')) { + if ($jwk->get('kty') !== 'EC') { return; } - if (!$jwk->has('crv')) { + if (! $jwk->has('crv')) { $bag->add(Message::high('Invalid key. The components "crv" is missing.')); return; } - if ('P-521' !== $jwk->get('crv')) { + if ($jwk->get('crv') !== 'P-521') { return; } $x = Base64UrlSafe::decode($jwk->get('x')); $xLength = 8 * mb_strlen($x, '8bit'); $y = Base64UrlSafe::decode($jwk->get('y')); $yLength = 8 * mb_strlen($y, '8bit'); - if ($yLength !== $xLength || 528 !== $yLength) { + if ($yLength !== $xLength || $yLength !== 528) { $bag->add(Message::high('Invalid key. The components "x" and "y" size shall be 528 bits.')); } $xBI = BigInteger::fromBase(bin2hex($x), 16); $yBI = BigInteger::fromBase(bin2hex($y), 16); $curve = NistCurve::curve521(); - if (!$curve->contains($xBI, $yBI)) { + if (! $curve->contains($xBI, $yBI)) { $bag->add(Message::high('Invalid key. The point is not on the curve.')); } } diff --git a/src/Component/KeyManagement/Analyzer/HS256KeyAnalyzer.php b/src/Component/KeyManagement/Analyzer/HS256KeyAnalyzer.php index 67385ef5..c3293065 100644 --- a/src/Component/KeyManagement/Analyzer/HS256KeyAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/HS256KeyAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWK; @@ -20,10 +11,10 @@ final class HS256KeyAnalyzer implements KeyAnalyzer { public function analyze(JWK $jwk, MessageBag $bag): void { - if ('oct' !== $jwk->get('kty')) { + if ($jwk->get('kty') !== 'oct') { return; } - if (!$jwk->has('alg') || 'HS256' !== $jwk->get('alg')) { + if (! $jwk->has('alg') || $jwk->get('alg') !== 'HS256') { return; } $k = Base64UrlSafe::decode($jwk->get('k')); diff --git a/src/Component/KeyManagement/Analyzer/HS384KeyAnalyzer.php b/src/Component/KeyManagement/Analyzer/HS384KeyAnalyzer.php index 7a2fcfb1..ae77bffe 100644 --- a/src/Component/KeyManagement/Analyzer/HS384KeyAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/HS384KeyAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWK; @@ -20,10 +11,10 @@ final class HS384KeyAnalyzer implements KeyAnalyzer { public function analyze(JWK $jwk, MessageBag $bag): void { - if ('oct' !== $jwk->get('kty')) { + if ($jwk->get('kty') !== 'oct') { return; } - if (!$jwk->has('alg') || 'HS384' !== $jwk->get('alg')) { + if (! $jwk->has('alg') || $jwk->get('alg') !== 'HS384') { return; } $k = Base64UrlSafe::decode($jwk->get('k')); diff --git a/src/Component/KeyManagement/Analyzer/HS512KeyAnalyzer.php b/src/Component/KeyManagement/Analyzer/HS512KeyAnalyzer.php index 2d75113b..cab8005b 100644 --- a/src/Component/KeyManagement/Analyzer/HS512KeyAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/HS512KeyAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWK; @@ -20,10 +11,10 @@ final class HS512KeyAnalyzer implements KeyAnalyzer { public function analyze(JWK $jwk, MessageBag $bag): void { - if ('oct' !== $jwk->get('kty')) { + if ($jwk->get('kty') !== 'oct') { return; } - if (!$jwk->has('alg') || 'HS512' !== $jwk->get('alg')) { + if (! $jwk->has('alg') || $jwk->get('alg') !== 'HS512') { return; } $k = Base64UrlSafe::decode($jwk->get('k')); diff --git a/src/Component/KeyManagement/Analyzer/KeyAnalyzer.php b/src/Component/KeyManagement/Analyzer/KeyAnalyzer.php index 978c57d9..d48f1f03 100644 --- a/src/Component/KeyManagement/Analyzer/KeyAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/KeyAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWK; diff --git a/src/Component/KeyManagement/Analyzer/KeyAnalyzerManager.php b/src/Component/KeyManagement/Analyzer/KeyAnalyzerManager.php index 287da6ec..378ce6df 100644 --- a/src/Component/KeyManagement/Analyzer/KeyAnalyzerManager.php +++ b/src/Component/KeyManagement/Analyzer/KeyAnalyzerManager.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWK; @@ -20,7 +11,7 @@ class KeyAnalyzerManager /** * @var KeyAnalyzer[] */ - private $analyzers = []; + private array $analyzers = []; /** * Adds a Key Analyzer to the manager. @@ -31,8 +22,7 @@ public function add(KeyAnalyzer $analyzer): void } /** - * This method will analyze the JWK object using all analyzers. - * It returns a message bag that may contains messages. + * This method will analyze the JWK object using all analyzers. It returns a message bag that may contains messages. */ public function analyze(JWK $jwk): MessageBag { diff --git a/src/Component/KeyManagement/Analyzer/KeyIdentifierAnalyzer.php b/src/Component/KeyManagement/Analyzer/KeyIdentifierAnalyzer.php index a4e7708b..2f21105f 100644 --- a/src/Component/KeyManagement/Analyzer/KeyIdentifierAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/KeyIdentifierAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWK; @@ -19,7 +10,7 @@ final class KeyIdentifierAnalyzer implements KeyAnalyzer { public function analyze(JWK $jwk, MessageBag $bag): void { - if (!$jwk->has('kid')) { + if (! $jwk->has('kid')) { $bag->add(Message::medium('The parameter "kid" should be added.')); } } diff --git a/src/Component/KeyManagement/Analyzer/KeysetAnalyzer.php b/src/Component/KeyManagement/Analyzer/KeysetAnalyzer.php index 6447e103..3dc70638 100644 --- a/src/Component/KeyManagement/Analyzer/KeysetAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/KeysetAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWKSet; diff --git a/src/Component/KeyManagement/Analyzer/KeysetAnalyzerManager.php b/src/Component/KeyManagement/Analyzer/KeysetAnalyzerManager.php index 5ce004a2..7c9ec9b4 100644 --- a/src/Component/KeyManagement/Analyzer/KeysetAnalyzerManager.php +++ b/src/Component/KeyManagement/Analyzer/KeysetAnalyzerManager.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWKSet; @@ -20,7 +11,7 @@ class KeysetAnalyzerManager /** * @var KeysetAnalyzer[] */ - private $analyzers = []; + private array $analyzers = []; /** * Adds a Keyset Analyzer to the manager. @@ -31,8 +22,8 @@ public function add(KeysetAnalyzer $analyzer): void } /** - * This method will analyze the JWKSet object using all analyzers. - * It returns a message bag that may contains messages. + * This method will analyze the JWKSet object using all analyzers. It returns a message bag that may contains + * messages. */ public function analyze(JWKSet $jwkset): MessageBag { diff --git a/src/Component/KeyManagement/Analyzer/Message.php b/src/Component/KeyManagement/Analyzer/Message.php index 19653cae..0e53ec5a 100644 --- a/src/Component/KeyManagement/Analyzer/Message.php +++ b/src/Component/KeyManagement/Analyzer/Message.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use JsonSerializable; @@ -22,29 +13,15 @@ class Message implements JsonSerializable public const SEVERITY_MEDIUM = 'medium'; public const SEVERITY_HIGH = 'high'; - /** - * @var string - */ - private $message; - /** - * @var string - */ - private $severity; - - /** - * Message constructor. - */ - private function __construct(string $message, string $severity) - { - $this->message = $message; - $this->severity = $severity; + private function __construct( + private string $message, + private string $severity + ) { } /** * Creates a message with severity=low. - * - * @return Message */ public static function low(string $message): self { @@ -53,8 +30,6 @@ public static function low(string $message): self /** * Creates a message with severity=medium. - * - * @return Message */ public static function medium(string $message): self { @@ -63,8 +38,6 @@ public static function medium(string $message): self /** * Creates a message with severity=high. - * - * @return Message */ public static function high(string $message): self { diff --git a/src/Component/KeyManagement/Analyzer/MessageBag.php b/src/Component/KeyManagement/Analyzer/MessageBag.php index 515ac7fd..8ac57bf8 100644 --- a/src/Component/KeyManagement/Analyzer/MessageBag.php +++ b/src/Component/KeyManagement/Analyzer/MessageBag.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use ArrayIterator; diff --git a/src/Component/KeyManagement/Analyzer/MixedKeyTypes.php b/src/Component/KeyManagement/Analyzer/MixedKeyTypes.php index af8e1e06..812e7c87 100644 --- a/src/Component/KeyManagement/Analyzer/MixedKeyTypes.php +++ b/src/Component/KeyManagement/Analyzer/MixedKeyTypes.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWKSet; @@ -19,7 +10,7 @@ final class MixedKeyTypes implements KeysetAnalyzer { public function analyze(JWKSet $jwkset, MessageBag $bag): void { - if (0 === $jwkset->count()) { + if ($jwkset->count() === 0) { return; } diff --git a/src/Component/KeyManagement/Analyzer/MixedPublicAndPrivateKeys.php b/src/Component/KeyManagement/Analyzer/MixedPublicAndPrivateKeys.php index 94ce3519..aa957a00 100644 --- a/src/Component/KeyManagement/Analyzer/MixedPublicAndPrivateKeys.php +++ b/src/Component/KeyManagement/Analyzer/MixedPublicAndPrivateKeys.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWKSet; @@ -19,7 +10,7 @@ final class MixedPublicAndPrivateKeys implements KeysetAnalyzer { public function analyze(JWKSet $jwkset, MessageBag $bag): void { - if (0 === $jwkset->count()) { + if ($jwkset->count() === 0) { return; } diff --git a/src/Component/KeyManagement/Analyzer/NoneAnalyzer.php b/src/Component/KeyManagement/Analyzer/NoneAnalyzer.php index 38b33f28..57488a89 100644 --- a/src/Component/KeyManagement/Analyzer/NoneAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/NoneAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWK; @@ -19,10 +10,14 @@ final class NoneAnalyzer implements KeyAnalyzer { public function analyze(JWK $jwk, MessageBag $bag): void { - if ('none' !== $jwk->get('kty')) { + if ($jwk->get('kty') !== 'none') { return; } - $bag->add(Message::high('This key is a meant to be used with the algorithm "none". This algorithm is not secured and should be used with care.')); + $bag->add( + Message::high( + 'This key is a meant to be used with the algorithm "none". This algorithm is not secured and should be used with care.' + ) + ); } } diff --git a/src/Component/KeyManagement/Analyzer/OctAnalyzer.php b/src/Component/KeyManagement/Analyzer/OctAnalyzer.php index 9e12051c..02c75d1f 100644 --- a/src/Component/KeyManagement/Analyzer/OctAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/OctAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWK; @@ -20,7 +11,7 @@ final class OctAnalyzer implements KeyAnalyzer { public function analyze(JWK $jwk, MessageBag $bag): void { - if ('oct' !== $jwk->get('kty')) { + if ($jwk->get('kty') !== 'oct') { return; } $k = Base64UrlSafe::decode($jwk->get('k')); diff --git a/src/Component/KeyManagement/Analyzer/RsaAnalyzer.php b/src/Component/KeyManagement/Analyzer/RsaAnalyzer.php index 305b83a2..16dadd98 100644 --- a/src/Component/KeyManagement/Analyzer/RsaAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/RsaAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use InvalidArgumentException; @@ -22,7 +13,7 @@ final class RsaAnalyzer implements KeyAnalyzer { public function analyze(JWK $jwk, MessageBag $bag): void { - if ('RSA' !== $jwk->get('kty')) { + if ($jwk->get('kty') !== 'RSA') { return; } @@ -33,7 +24,7 @@ public function analyze(JWK $jwk, MessageBag $bag): void private function checkExponent(JWK $jwk, MessageBag $bag): void { $exponent = unpack('l', str_pad(Base64UrlSafe::decode($jwk->get('e')), 4, "\0")); - if (!is_array($exponent) || !isset($exponent[1])) { + if (! is_array($exponent) || ! isset($exponent[1])) { throw new InvalidArgumentException('Unable to get the private key'); } if ($exponent[1] < 65537) { @@ -47,8 +38,14 @@ private function checkModulus(JWK $jwk, MessageBag $bag): void if ($n < 2048) { $bag->add(Message::high('The key length is less than 2048 bits.')); } - if ($jwk->has('d') && (!$jwk->has('p') || !$jwk->has('q') || !$jwk->has('dp') || !$jwk->has('dq') || !$jwk->has('p') || !$jwk->has('qi'))) { - $bag->add(Message::medium('The key is a private RSA key, but Chinese Remainder Theorem primes are missing. These primes are not mandatory, but signatures and decryption processes are faster when available.')); + if ($jwk->has('d') && (! $jwk->has('p') || ! $jwk->has('q') || ! $jwk->has('dp') || ! $jwk->has( + 'dq' + ) || ! $jwk->has('p') || ! $jwk->has('qi'))) { + $bag->add( + Message::medium( + 'The key is a private RSA key, but Chinese Remainder Theorem primes are missing. These primes are not mandatory, but signatures and decryption processes are faster when available.' + ) + ); } } } diff --git a/src/Component/KeyManagement/Analyzer/UsageAnalyzer.php b/src/Component/KeyManagement/Analyzer/UsageAnalyzer.php index 2edb19fe..7adab44e 100644 --- a/src/Component/KeyManagement/Analyzer/UsageAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/UsageAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use function in_array; @@ -20,13 +11,28 @@ final class UsageAnalyzer implements KeyAnalyzer { public function analyze(JWK $jwk, MessageBag $bag): void { - if (!$jwk->has('use')) { + if (! $jwk->has('use')) { $bag->add(Message::medium('The parameter "use" should be added.')); - } elseif (!in_array($jwk->get('use'), ['sig', 'enc'], true)) { - $bag->add(Message::high(sprintf('The parameter "use" has an unsupported value "%s". Please use "sig" (signature) or "enc" (encryption).', $jwk->get('use')))); + } elseif (! in_array($jwk->get('use'), ['sig', 'enc'], true)) { + $bag->add( + Message::high(sprintf( + 'The parameter "use" has an unsupported value "%s". Please use "sig" (signature) or "enc" (encryption).', + $jwk->get('use') + )) + ); } - if ($jwk->has('key_ops') && !in_array($jwk->get('key_ops'), ['sign', 'verify', 'encrypt', 'decrypt', 'wrapKey', 'unwrapKey'], true)) { - $bag->add(Message::high(sprintf('The parameter "key_ops" has an unsupported value "%s". Please use one of the following values: %s.', $jwk->get('use'), implode(', ', ['verify', 'sign', 'encryp', 'decrypt', 'wrapKey', 'unwrapKey'])))); + if ($jwk->has('key_ops') && ! in_array( + $jwk->get('key_ops'), + ['sign', 'verify', 'encrypt', 'decrypt', 'wrapKey', 'unwrapKey'], + true + )) { + $bag->add( + Message::high(sprintf( + 'The parameter "key_ops" has an unsupported value "%s". Please use one of the following values: %s.', + $jwk->get('use'), + implode(', ', ['verify', 'sign', 'encryp', 'decrypt', 'wrapKey', 'unwrapKey']) + )) + ); } } } diff --git a/src/Component/KeyManagement/Analyzer/ZxcvbnKeyAnalyzer.php b/src/Component/KeyManagement/Analyzer/ZxcvbnKeyAnalyzer.php index ec560463..fdd1ab45 100644 --- a/src/Component/KeyManagement/Analyzer/ZxcvbnKeyAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/ZxcvbnKeyAnalyzer.php @@ -2,15 +2,6 @@ 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\KeyManagement\Analyzer; use Jose\Component\Core\JWK; @@ -21,7 +12,7 @@ final class ZxcvbnKeyAnalyzer implements KeyAnalyzer { public function analyze(JWK $jwk, MessageBag $bag): void { - if ('oct' !== $jwk->get('kty')) { + if ($jwk->get('kty') !== 'oct') { return; } $k = Base64UrlSafe::decode($jwk->get('k')); @@ -31,11 +22,15 @@ public function analyze(JWK $jwk, MessageBag $bag): void switch (true) { case $strength['score'] < 3: - $bag->add(Message::high('The octet string is weak and easily guessable. Please change your key as soon as possible.')); + $bag->add( + Message::high( + 'The octet string is weak and easily guessable. Please change your key as soon as possible.' + ) + ); break; - case 3 === $strength['score']: + case $strength['score'] === 3: $bag->add(Message::medium('The octet string is safe, but a longer key is preferable.')); break; diff --git a/src/Component/KeyManagement/JKUFactory.php b/src/Component/KeyManagement/JKUFactory.php index 6f404c7f..28f7564e 100644 --- a/src/Component/KeyManagement/JKUFactory.php +++ b/src/Component/KeyManagement/JKUFactory.php @@ -2,15 +2,6 @@ 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\KeyManagement; use function is_array; @@ -21,16 +12,13 @@ class JKUFactory extends UrlKeySetFactory { /** - * This method will try to fetch the url a retrieve the key set. - * Throws an exception in case of failure. - * - * @throws RuntimeException if the key cannot be reached + * This method will try to fetch the url a retrieve the key set. Throws an exception in case of failure. */ public function loadFromUrl(string $url, array $header = []): JWKSet { $content = $this->getContent($url, $header); $data = JsonConverter::decode($content); - if (!is_array($data)) { + if (! is_array($data)) { throw new RuntimeException('Invalid content.'); } diff --git a/src/Component/KeyManagement/JWKFactory.php b/src/Component/KeyManagement/JWKFactory.php index cd51b775..e350b1e0 100644 --- a/src/Component/KeyManagement/JWKFactory.php +++ b/src/Component/KeyManagement/JWKFactory.php @@ -2,15 +2,6 @@ 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\KeyManagement; use function array_key_exists; @@ -23,6 +14,7 @@ use Jose\Component\Core\Util\ECKey; use Jose\Component\KeyManagement\KeyConverter\KeyConverter; use Jose\Component\KeyManagement\KeyConverter\RSAKey; +use const OPENSSL_KEYTYPE_RSA; use ParagonIE\ConstantTime\Base64UrlSafe; use RuntimeException; use Throwable; @@ -34,16 +26,13 @@ class JWKFactory * * @param int $size The key size in bits * @param array $values values to configure the key - * - * @throws InvalidArgumentException if the key has an invalid size - * @throws InvalidArgumentException if it is not possible to create the key */ public static function createRSAKey(int $size, array $values = []): JWK { - if (0 !== $size % 8) { + if ($size % 8 !== 0) { throw new InvalidArgumentException('Invalid key size.'); } - if (512 > $size) { + if ($size < 512) { throw new InvalidArgumentException('Key length is too short. It needs to be at least 512 bits.'); } @@ -51,18 +40,15 @@ public static function createRSAKey(int $size, array $values = []): JWK 'private_key_bits' => $size, 'private_key_type' => OPENSSL_KEYTYPE_RSA, ]); - if (false === $key) { + if ($key === false) { throw new InvalidArgumentException('Unable to create the key'); } $details = openssl_pkey_get_details($key); - if (!is_array($details)) { + if (! is_array($details)) { throw new InvalidArgumentException('Unable to create the key'); } $rsa = RSAKey::createFromKeyDetails($details['rsa']); - $values = array_merge( - $values, - $rsa->toArray() - ); + $values = array_merge($values, $rsa->toArray()); return new JWK($values); } @@ -83,12 +69,10 @@ public static function createECKey(string $curve, array $values = []): JWK * * @param int $size The key size in bits * @param array $values values to configure the key - * - * @throws InvalidArgumentException if the key has an invalid size */ public static function createOctKey(int $size, array $values = []): JWK { - if (0 !== $size % 8) { + if ($size % 8 !== 0) { throw new InvalidArgumentException('Invalid key size.'); } $values = array_merge( @@ -107,13 +91,10 @@ public static function createOctKey(int $size, array $values = []): JWK * * @param string $curve The curve * @param array $values values to configure the key - * - * @throws InvalidArgumentException if the extension "sobium" is not available - * @throws InvalidArgumentException if the curve is not supported */ public static function createOKPKey(string $curve, array $values = []): JWK { - if (!extension_loaded('sodium')) { + if (! extension_loaded('sodium')) { throw new RuntimeException('The extension "sodium" is not available. Please install it to use this method'); } @@ -152,37 +133,29 @@ public static function createOKPKey(string $curve, array $values = []): JWK } /** - * Creates a none key with the given additional values. - * Please note that this key type is not pat of any specification. - * It is used to prevent the use of the "none" algorithm with other key types. + * Creates a none key with the given additional values. Please note that this key type is not pat of any + * specification. It is used to prevent the use of the "none" algorithm with other key types. * * @param array $values values to configure the key */ public static function createNoneKey(array $values = []): JWK { - $values = array_merge( - $values, - [ - 'kty' => 'none', - 'alg' => 'none', - 'use' => 'sig', - ] - ); + $values = array_merge($values, [ + 'kty' => 'none', + 'alg' => 'none', + 'use' => 'sig', + ]); return new JWK($values); } /** * Creates a key from a Json string. - * - * @throws InvalidArgumentException if the key or keyset is not valid - * - * @return JWK|JWKSet */ - public static function createFromJsonObject(string $value) + public static function createFromJsonObject(string $value): JWK|JWKSet { $json = json_decode($value, true); - if (!is_array($json)) { + if (! is_array($json)) { throw new InvalidArgumentException('Invalid key or key set.'); } @@ -191,10 +164,8 @@ public static function createFromJsonObject(string $value) /** * Creates a key or key set from the given input. - * - * @return JWK|JWKSet */ - public static function createFromValues(array $values) + public static function createFromValues(array $values): JWK|JWKSet { if (array_key_exists('keys', $values) && is_array($values['keys'])) { return JWKSet::createFromKeyData($values); @@ -232,31 +203,30 @@ public static function createFromCertificateFile(string $file, array $additional /** * Extract a keyfrom a key set identified by the given index . - * - * @param int|string $index */ - public static function createFromKeySet(JWKSet $jwkset, $index): JWK + public static function createFromKeySet(JWKSet $jwkset, int|string $index): JWK { return $jwkset->get($index); } /** * This method will try to load a PKCS#12 file and convert it into a public key. - * - * @throws InvalidArgumentException if the certificate cannot be loaded */ - public static function createFromPKCS12CertificateFile(string $file, ?string $secret = '', array $additional_values = []): JWK - { + public static function createFromPKCS12CertificateFile( + string $file, + ?string $secret = '', + array $additional_values = [] + ): JWK { try { $content = file_get_contents($file); - if (!is_string($content)) { + if (! is_string($content)) { throw new RuntimeException('Unable to read the file.'); } openssl_pkcs12_read($content, $certs, $secret); } catch (Throwable $throwable) { throw new RuntimeException('Unable to load the certificates.', $throwable->getCode(), $throwable); } - if (!is_array($certs) || !array_key_exists('pkey', $certs)) { + if (! is_array($certs) || ! array_key_exists('pkey', $certs)) { throw new RuntimeException('Unable to load the certificates.'); } @@ -288,8 +258,8 @@ public static function createFromX509Resource($res, array $additional_values = [ } /** - * This method will try to load and convert a key file into a JWK object. - * If the key is encrypted, the password must be set. + * This method will try to load and convert a key file into a JWK object. If the key is encrypted, the password must + * be set. */ public static function createFromKeyFile(string $file, ?string $password = null, array $additional_values = []): JWK { @@ -300,8 +270,8 @@ public static function createFromKeyFile(string $file, ?string $password = null, } /** - * This method will try to load and convert a key into a JWK object. - * If the key is encrypted, the password must be set. + * This method will try to load and convert a key into a JWK object. If the key is encrypted, the password must be + * set. */ public static function createFromKey(string $key, ?string $password = null, array $additional_values = []): JWK { @@ -314,9 +284,8 @@ public static function createFromKey(string $key, ?string $password = null, arra /** * This method will try to load and convert a X.509 certificate chain into a public key. * - * Be careful! The certificate chain is loaded, but it is NOT VERIFIED by any mean! - * It is mandatory to verify the root CA or intermediate CA are trusted. - * If not done, it may lead to potential security issues. + * Be careful! The certificate chain is loaded, but it is NOT VERIFIED by any mean! It is mandatory to verify the + * root CA or intermediate CA are trusted. If not done, it may lead to potential security issues. */ public static function createFromX5C(array $x5c, array $additional_values = []): JWK { diff --git a/src/Component/KeyManagement/KeyConverter/ECKey.php b/src/Component/KeyManagement/KeyConverter/ECKey.php index e055c5ab..b971a40f 100644 --- a/src/Component/KeyManagement/KeyConverter/ECKey.php +++ b/src/Component/KeyManagement/KeyConverter/ECKey.php @@ -2,21 +2,11 @@ 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\KeyManagement\KeyConverter; use function array_key_exists; use function count; use FG\ASN1\ASNObject; -use FG\ASN1\Exception\ParserException; use FG\ASN1\ExplicitlyTaggedObject; use FG\ASN1\Universal\BitString; use FG\ASN1\Universal\Integer; @@ -31,12 +21,9 @@ /** * @internal */ -class ECKey +final class ECKey { - /** - * @var array - */ - private $values = []; + private array $values = []; private function __construct(array $data) { @@ -50,11 +37,6 @@ public static function createFromPEM(string $pem): self return new self($data); } - /** - * @param ECKey $private - * - * @return ECKey - */ public static function toPublic(self $private): self { $data = $private->toArray(); @@ -73,15 +55,11 @@ public function toArray() return $this->values; } - /** - * @throws InvalidArgumentException if the key cannot be loaded - * @throws ParserException if the key cannot be loaded - */ private static function loadPEM(string $data): array { $data = base64_decode(preg_replace('#-.*-|\r|\n#', '', $data), true); $asnObject = ASNObject::fromBinary($data); - if (!$asnObject instanceof Sequence) { + if (! $asnObject instanceof Sequence) { throw new InvalidArgumentException('Unable to load the key.'); } $children = $asnObject->getChildren(); @@ -89,10 +67,10 @@ private static function loadPEM(string $data): array $children = self::loadPKCS8($children); } - if (4 === count($children)) { + if (count($children) === 4) { return self::loadPrivatePEM($children); } - if (2 === count($children)) { + if (count($children) === 2) { return self::loadPublicPEM($children); } @@ -101,56 +79,52 @@ private static function loadPEM(string $data): array /** * @param ASNObject[] $children - * - * @throws InvalidArgumentException if the key cannot be loaded - * @throws ParserException if the key cannot be loaded */ private static function loadPKCS8(array $children): array { $binary = hex2bin($children[2]->getContent()); $asnObject = ASNObject::fromBinary($binary); - if (!$asnObject instanceof Sequence) { + if (! $asnObject instanceof Sequence) { throw new InvalidArgumentException('Unable to load the key.'); } return $asnObject->getChildren(); } - /** - * @throws InvalidArgumentException if the key cannot be loaded - */ private static function loadPublicPEM(array $children): array { - if (!$children[0] instanceof Sequence) { + if (! $children[0] instanceof Sequence) { throw new InvalidArgumentException('Unsupported key type.'); } $sub = $children[0]->getChildren(); - if (!$sub[0] instanceof ObjectIdentifier) { + if (! $sub[0] instanceof ObjectIdentifier) { throw new InvalidArgumentException('Unsupported key type.'); } - if ('1.2.840.10045.2.1' !== $sub[0]->getContent()) { + if ($sub[0]->getContent() !== '1.2.840.10045.2.1') { throw new InvalidArgumentException('Unsupported key type.'); } - if (!$sub[1] instanceof ObjectIdentifier) { + if (! $sub[1] instanceof ObjectIdentifier) { throw new InvalidArgumentException('Unsupported key type.'); } - if (!$children[1] instanceof BitString) { + if (! $children[1] instanceof BitString) { throw new InvalidArgumentException('Unable to load the key.'); } $bits = $children[1]->getContent(); $bits_length = mb_strlen($bits, '8bit'); - if (0 !== mb_strpos($bits, '04', 0, '8bit')) { + if (mb_strpos($bits, '04', 0, '8bit') !== 0) { throw new InvalidArgumentException('Unsupported key type'); } - $values = ['kty' => 'EC']; + $values = [ + 'kty' => 'EC', + ]; $values['crv'] = self::getCurve($sub[1]->getContent()); $xBin = hex2bin(mb_substr($bits, 2, ($bits_length - 2) / 2, '8bit')); $yBin = hex2bin(mb_substr($bits, (int) (($bits_length - 2) / 2 + 2), ($bits_length - 2) / 2, '8bit')); - if (!is_string($xBin) || !is_string($yBin)) { + if (! is_string($xBin) || ! is_string($yBin)) { throw new InvalidArgumentException('Unable to load the key.'); } @@ -160,14 +134,11 @@ private static function loadPublicPEM(array $children): array return $values; } - /** - * @throws InvalidArgumentException if the OID is not supported - */ private static function getCurve(string $oid): string { $curves = self::getSupportedCurves(); $curve = array_search($oid, $curves, true); - if (!is_string($curve)) { + if (! is_string($curve)) { throw new InvalidArgumentException('Unsupported OID.'); } @@ -183,32 +154,28 @@ private static function getSupportedCurves(): array ]; } - /** - * @throws InvalidArgumentException if the key cannot be loaded - */ private static function verifyVersion(ASNObject $children): void { - if (!$children instanceof Integer || '1' !== $children->getContent()) { + if (! $children instanceof Integer || $children->getContent() !== '1') { throw new InvalidArgumentException('Unable to load the key.'); } } - /** - * @throws InvalidArgumentException if the key cannot be loaded - */ private static function getXAndY(ASNObject $children, string &$x, string &$y): void { - if (!$children instanceof ExplicitlyTaggedObject || !is_array($children->getContent())) { + if (! $children instanceof ExplicitlyTaggedObject || ! is_array($children->getContent())) { throw new InvalidArgumentException('Unable to load the key.'); } - if (!$children->getContent()[0] instanceof BitString) { + if (! $children->getContent()[0] instanceof BitString) { throw new InvalidArgumentException('Unable to load the key.'); } - $bits = $children->getContent()[0]->getContent(); + $bits = $children->getContent()[0] + ->getContent() + ; $bits_length = mb_strlen($bits, '8bit'); - if (0 !== mb_strpos($bits, '04', 0, '8bit')) { + if (mb_strpos($bits, '04', 0, '8bit') !== 0) { throw new InvalidArgumentException('Unsupported key type'); } @@ -216,21 +183,15 @@ private static function getXAndY(ASNObject $children, string &$x, string &$y): v $y = mb_substr($bits, (int) (($bits_length - 2) / 2 + 2), (int) (($bits_length - 2) / 2), '8bit'); } - /** - * @throws InvalidArgumentException if the key cannot be loaded - */ private static function getD(ASNObject $children): string { - if (!$children instanceof OctetString) { + if (! $children instanceof OctetString) { throw new InvalidArgumentException('Unable to load the key.'); } return $children->getContent(); } - /** - * @throws InvalidArgumentException if the key cannot be loaded - */ private static function loadPrivatePEM(array $children): array { self::verifyVersion($children[0]); @@ -239,10 +200,10 @@ private static function loadPrivatePEM(array $children): array $d = self::getD($children[1]); self::getXAndY($children[3], $x, $y); - if (!$children[2] instanceof ExplicitlyTaggedObject || !is_array($children[2]->getContent())) { + if (! $children[2] instanceof ExplicitlyTaggedObject || ! is_array($children[2]->getContent())) { throw new InvalidArgumentException('Unable to load the key.'); } - if (!$children[2]->getContent()[0] instanceof ObjectIdentifier) { + if (! $children[2]->getContent()[0] instanceof ObjectIdentifier) { throw new InvalidArgumentException('Unable to load the key.'); } @@ -250,11 +211,13 @@ private static function loadPrivatePEM(array $children): array $dBin = hex2bin($d); $xBin = hex2bin($x); $yBin = hex2bin($y); - if (!is_string($dBin) || !is_string($xBin) || !is_string($yBin)) { + if (! is_string($dBin) || ! is_string($xBin) || ! is_string($yBin)) { throw new InvalidArgumentException('Unable to load the key.'); } - $values = ['kty' => 'EC']; + $values = [ + 'kty' => 'EC', + ]; $values['crv'] = self::getCurve($curve); $values['d'] = Base64UrlSafe::encodeUnpadded($dBin); $values['x'] = Base64UrlSafe::encodeUnpadded($xBin); @@ -268,13 +231,17 @@ private static function loadPrivatePEM(array $children): array */ private static function isPKCS8(array $children): bool { - if (3 !== count($children)) { + if (count($children) !== 3) { return false; } - $classes = [0 => Integer::class, 1 => Sequence::class, 2 => OctetString::class]; + $classes = [ + 0 => Integer::class, + 1 => Sequence::class, + 2 => OctetString::class, + ]; foreach ($classes as $k => $class) { - if (!$children[$k] instanceof $class) { + if (! $children[$k] instanceof $class) { return false; } } @@ -282,9 +249,6 @@ private static function isPKCS8(array $children): bool return true; } - /** - * @throws InvalidArgumentException if the key is invalid - */ private function loadJWK(array $jwk): void { $keys = [ @@ -294,12 +258,12 @@ private function loadJWK(array $jwk): void 'y' => 'Point parameters are missing.', ]; foreach ($keys as $k => $v) { - if (!array_key_exists($k, $jwk)) { + if (! array_key_exists($k, $jwk)) { throw new InvalidArgumentException($v); } } - if ('EC' !== $jwk['kty']) { + if ($jwk['kty'] !== 'EC') { throw new InvalidArgumentException('JWK is not an Elliptic Curve key.'); } $this->values = $jwk; diff --git a/src/Component/KeyManagement/KeyConverter/KeyConverter.php b/src/Component/KeyManagement/KeyConverter/KeyConverter.php index 8fc58ee8..a23d7b8f 100644 --- a/src/Component/KeyManagement/KeyConverter/KeyConverter.php +++ b/src/Component/KeyManagement/KeyConverter/KeyConverter.php @@ -2,15 +2,6 @@ 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\KeyManagement\KeyConverter; use function array_key_exists; @@ -19,51 +10,49 @@ use InvalidArgumentException; use function is_array; use function is_string; +use const OPENSSL_KEYTYPE_EC; +use const OPENSSL_KEYTYPE_RSA; +use const OPENSSL_RAW_DATA; use ParagonIE\ConstantTime\Base64UrlSafe; +use const PHP_EOL; +use const PREG_PATTERN_ORDER; use RuntimeException; use Throwable; /** * @internal */ -class KeyConverter +final class KeyConverter { - /** - * @throws InvalidArgumentException if the certificate file cannot be read - */ public static function loadKeyFromCertificateFile(string $file): array { - if (!file_exists($file)) { + if (! file_exists($file)) { throw new InvalidArgumentException(sprintf('File "%s" does not exist.', $file)); } $content = file_get_contents($file); - if (!is_string($content)) { + if (! is_string($content)) { throw new InvalidArgumentException(sprintf('File "%s" cannot be read.', $file)); } return self::loadKeyFromCertificate($content); } - /** - * @throws InvalidArgumentException if the OpenSSL extension is not available - * @throws InvalidArgumentException if the certificate is invalid or cannot be loaded - */ public static function loadKeyFromCertificate(string $certificate): array { - if (!extension_loaded('openssl')) { + if (! extension_loaded('openssl')) { throw new RuntimeException('Please install the OpenSSL extension'); } try { $res = openssl_x509_read($certificate); - if (false === $res) { + if ($res === false) { throw new InvalidArgumentException('Unable to load the certificate.'); } - } catch (Throwable $e) { + } catch (Throwable) { $certificate = self::convertDerToPem($certificate); $res = openssl_x509_read($certificate); } - if (false === $res) { + if ($res === false) { throw new InvalidArgumentException('Unable to load the certificate.'); } @@ -72,21 +61,18 @@ public static function loadKeyFromCertificate(string $certificate): array /** * @param resource $res - * - * @throws InvalidArgumentException if the OpenSSL extension is not available - * @throws InvalidArgumentException if the certificate is invalid or cannot be loaded */ public static function loadKeyFromX509Resource($res): array { - if (!extension_loaded('openssl')) { + if (! extension_loaded('openssl')) { throw new RuntimeException('Please install the OpenSSL extension'); } - $key = openssl_get_publickey($res); - if (false === $key) { + $key = openssl_pkey_get_public($res); + if ($key === false) { throw new InvalidArgumentException('Unable to load the certificate.'); } $details = openssl_pkey_get_details($key); - if (!is_array($details)) { + if (! is_array($details)) { throw new InvalidArgumentException('Unable to load the certificate'); } if (isset($details['key'])) { @@ -94,14 +80,14 @@ public static function loadKeyFromX509Resource($res): array openssl_x509_export($res, $out); $x5c = preg_replace('#-.*-#', '', $out); $x5c = preg_replace('~\R~', PHP_EOL, $x5c); - if (!is_string($x5c)) { + if (! is_string($x5c)) { throw new InvalidArgumentException('Unable to load the certificate'); } $x5c = trim($x5c); $x5tsha1 = openssl_x509_fingerprint($res, 'sha1', true); $x5tsha256 = openssl_x509_fingerprint($res, 'sha256', true); - if (!is_string($x5tsha1) || !is_string($x5tsha256)) { + if (! is_string($x5tsha1) || ! is_string($x5tsha256)) { throw new InvalidArgumentException('Unable to compute the certificate fingerprint'); } @@ -118,7 +104,7 @@ public static function loadKeyFromX509Resource($res): array public static function loadFromKeyFile(string $file, ?string $password = null): array { $content = file_get_contents($file); - if (!is_string($content)) { + if (! is_string($content)) { throw new InvalidArgumentException('Unable to load the key from the file.'); } @@ -129,32 +115,32 @@ public static function loadFromKey(string $key, ?string $password = null): array { try { return self::loadKeyFromDER($key, $password); - } catch (Throwable $e) { + } catch (Throwable) { return self::loadKeyFromPEM($key, $password); } } /** - * Be careful! The certificate chain is loaded, but it is NOT VERIFIED by any mean! - * It is mandatory to verify the root CA or intermediate CA are trusted. - * If not done, it may lead to potential security issues. - * - * @throws InvalidArgumentException if the certificate chain is empty - * @throws InvalidArgumentException if the OpenSSL extension is not available + * Be careful! The certificate chain is loaded, but it is NOT VERIFIED by any mean! It is mandatory to verify the + * root CA or intermediate CA are trusted. If not done, it may lead to potential security issues. */ public static function loadFromX5C(array $x5c): array { - if (0 === count($x5c)) { + if (count($x5c) === 0) { throw new InvalidArgumentException('The certificate chain is empty'); } foreach ($x5c as $id => $cert) { - $x5c[$id] = '-----BEGIN CERTIFICATE-----'.PHP_EOL.chunk_split($cert, 64, PHP_EOL).'-----END CERTIFICATE-----'; + $x5c[$id] = '-----BEGIN CERTIFICATE-----' . PHP_EOL . chunk_split( + $cert, + 64, + PHP_EOL + ) . '-----END CERTIFICATE-----'; $x509 = openssl_x509_read($x5c[$id]); - if (false === $x509) { + if ($x509 === false) { throw new InvalidArgumentException('Unable to load the certificate chain'); } $parsed = openssl_x509_parse($x509); - if (false === $parsed) { + if ($parsed === false) { throw new InvalidArgumentException('Unable to load the certificate chain'); } } @@ -169,23 +155,19 @@ private static function loadKeyFromDER(string $der, ?string $password = null): a return self::loadKeyFromPEM($pem, $password); } - /** - * @throws InvalidArgumentException if the OpenSSL extension is not available - * @throws InvalidArgumentException if the key cannot be loaded - */ private static function loadKeyFromPEM(string $pem, ?string $password = null): array { - if (1 === preg_match('#DEK-Info: (.+),(.+)#', $pem, $matches)) { + if (preg_match('#DEK-Info: (.+),(.+)#', $pem, $matches) === 1) { $pem = self::decodePem($pem, $matches, $password); } - if (!extension_loaded('openssl')) { + if (! extension_loaded('openssl')) { throw new RuntimeException('Please install the OpenSSL extension'); } - if (1 === preg_match('#BEGIN ENCRYPTED PRIVATE KEY(.+)(.+)#', $pem)) { + if (preg_match('#BEGIN ENCRYPTED PRIVATE KEY(.+)(.+)#', $pem) === 1) { $decrypted = openssl_pkey_get_private($pem, $password); - if (false === $decrypted) { + if ($decrypted === false) { throw new InvalidArgumentException('Unable to decrypt the key.'); } openssl_pkey_export($decrypted, $pem); @@ -193,15 +175,15 @@ private static function loadKeyFromPEM(string $pem, ?string $password = null): a self::sanitizePEM($pem); $res = openssl_pkey_get_private($pem); - if (false === $res) { + if ($res === false) { $res = openssl_pkey_get_public($pem); } - if (false === $res) { + if ($res === false) { throw new InvalidArgumentException('Unable to load the key.'); } $details = openssl_pkey_get_details($res); - if (!is_array($details) || !array_key_exists('type', $details)) { + if (! is_array($details) || ! array_key_exists('type', $details)) { throw new InvalidArgumentException('Unable to get details of the key'); } @@ -229,45 +211,42 @@ private static function sanitizePEM(string &$pem): void preg_match_all('#(-.*-)#', $pem, $matches, PREG_PATTERN_ORDER); $ciphertext = preg_replace('#-.*-|\r|\n| #', '', $pem); - $pem = $matches[0][0].PHP_EOL; + $pem = $matches[0][0] . PHP_EOL; $pem .= chunk_split($ciphertext, 64, PHP_EOL); - $pem .= $matches[0][1].PHP_EOL; + $pem .= $matches[0][1] . PHP_EOL; } /** * @param string[] $matches - * - * @throws InvalidArgumentException if the password to decrypt the key is not provided - * @throws InvalidArgumentException if the key cannot be loaded */ private static function decodePem(string $pem, array $matches, ?string $password = null): string { - if (null === $password) { + if ($password === null) { throw new InvalidArgumentException('Password required for encrypted keys.'); } $iv = pack('H*', trim($matches[2])); $iv_sub = mb_substr($iv, 0, 8, '8bit'); - $symkey = pack('H*', md5($password.$iv_sub)); - $symkey .= pack('H*', md5($symkey.$password.$iv_sub)); + $symkey = pack('H*', md5($password . $iv_sub)); + $symkey .= pack('H*', md5($symkey . $password . $iv_sub)); $key = preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $pem); $ciphertext = base64_decode(preg_replace('#-.*-|\r|\n#', '', $key), true); - if (!is_string($ciphertext)) { + if (! is_string($ciphertext)) { throw new InvalidArgumentException('Unable to encode the data.'); } $decoded = openssl_decrypt($ciphertext, mb_strtolower($matches[1]), $symkey, OPENSSL_RAW_DATA, $iv); - if (false === $decoded) { + if ($decoded === false) { throw new RuntimeException('Unable to decrypt the key'); } $number = preg_match_all('#-{5}.*-{5}#', $pem, $result); - if (2 !== $number) { + if ($number !== 2) { throw new InvalidArgumentException('Unable to load the key'); } - $pem = $result[0][0].PHP_EOL; + $pem = $result[0][0] . PHP_EOL; $pem .= chunk_split(base64_encode($decoded), 64); - $pem .= $result[0][1].PHP_EOL; + $pem .= $result[0][1] . PHP_EOL; return $pem; } @@ -276,6 +255,6 @@ private static function convertDerToPem(string $der_data): string { $pem = chunk_split(base64_encode($der_data), 64, PHP_EOL); - return '-----BEGIN CERTIFICATE-----'.PHP_EOL.$pem.'-----END CERTIFICATE-----'.PHP_EOL; + return '-----BEGIN CERTIFICATE-----' . PHP_EOL . $pem . '-----END CERTIFICATE-----' . PHP_EOL; } } diff --git a/src/Component/KeyManagement/KeyConverter/RSAKey.php b/src/Component/KeyManagement/KeyConverter/RSAKey.php index ba40c422..68a46e37 100644 --- a/src/Component/KeyManagement/KeyConverter/RSAKey.php +++ b/src/Component/KeyManagement/KeyConverter/RSAKey.php @@ -2,15 +2,6 @@ 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\KeyManagement\KeyConverter; use function array_key_exists; @@ -26,27 +17,23 @@ /** * @internal */ -class RSAKey +final class RSAKey { /** * @var array */ private $values = []; - /** - * RSAKey constructor. - */ private function __construct(array $data) { $this->loadJWK($data); } - /** - * @return RSAKey - */ public static function createFromKeyDetails(array $details): self { - $values = ['kty' => 'RSA']; + $values = [ + 'kty' => 'RSA', + ]; $keys = [ 'n' => 'n', 'e' => 'e', @@ -67,36 +54,27 @@ public static function createFromKeyDetails(array $details): self return new self($values); } - /** - * @throws RuntimeException if the extension OpenSSL is not available - * @throws InvalidArgumentException if the key cannot be loaded - * - * @return RSAKey - */ public static function createFromPEM(string $pem): self { - if (!extension_loaded('openssl')) { + if (! extension_loaded('openssl')) { throw new RuntimeException('Please install the OpenSSL extension'); } $res = openssl_pkey_get_private($pem); - if (false === $res) { + if ($res === false) { $res = openssl_pkey_get_public($pem); } - if (false === $res) { + if ($res === false) { throw new InvalidArgumentException('Unable to load the key.'); } $details = openssl_pkey_get_details($res); - if (!is_array($details) || !isset($details['rsa'])) { + if (! is_array($details) || ! isset($details['rsa'])) { throw new InvalidArgumentException('Unable to load the key.'); } return self::createFromKeyDetails($details['rsa']); } - /** - * @return RSAKey - */ public static function createFromJWK(JWK $jwk): self { return new self($jwk->all()); @@ -104,14 +82,9 @@ public static function createFromJWK(JWK $jwk): self public function isPublic(): bool { - return !array_key_exists('d', $this->values); + return ! array_key_exists('d', $this->values); } - /** - * @param RSAKey $private - * - * @return RSAKey - */ public static function toPublic(self $private): self { $data = $private->toArray(); @@ -136,8 +109,8 @@ public function toJwk(): JWK } /** - * This method will try to add Chinese Remainder Theorem (CRT) parameters. - * With those primes, the decryption process is really fast. + * This method will try to add Chinese Remainder Theorem (CRT) parameters. With those primes, the decryption process + * is really fast. */ public function optimize(): void { @@ -146,15 +119,12 @@ public function optimize(): void } } - /** - * @throws InvalidArgumentException if the key is invalid or not an RSA key - */ private function loadJWK(array $jwk): void { - if (!array_key_exists('kty', $jwk)) { + if (! array_key_exists('kty', $jwk)) { throw new InvalidArgumentException('The key parameter "kty" is missing.'); } - if ('RSA' !== $jwk['kty']) { + if ($jwk['kty'] !== 'RSA') { throw new InvalidArgumentException('The JWK is not a RSA key.'); } @@ -162,12 +132,12 @@ private function loadJWK(array $jwk): void } /** - * This method adds Chinese Remainder Theorem (CRT) parameters if primes 'p' and 'q' are available. - * If 'p' and 'q' are missing, they are computed and added to the key data. + * This method adds Chinese Remainder Theorem (CRT) parameters if primes 'p' and 'q' are available. If 'p' and 'q' + * are missing, they are computed and added to the key data. */ private function populateCRT(): void { - if (!array_key_exists('p', $this->values) && !array_key_exists('q', $this->values)) { + if (! array_key_exists('p', $this->values) && ! array_key_exists('q', $this->values)) { $d = BigInteger::createFromBinaryString(Base64UrlSafe::decode($this->values['d'])); $e = BigInteger::createFromBinaryString(Base64UrlSafe::decode($this->values['e'])); $n = BigInteger::createFromBinaryString(Base64UrlSafe::decode($this->values['n'])); @@ -177,7 +147,10 @@ private function populateCRT(): void $this->values['q'] = Base64UrlSafe::encodeUnpadded($q->toBytes()); } - if (array_key_exists('dp', $this->values) && array_key_exists('dq', $this->values) && array_key_exists('qi', $this->values)) { + if (array_key_exists('dp', $this->values) && array_key_exists('dq', $this->values) && array_key_exists( + 'qi', + $this->values + )) { return; } @@ -192,8 +165,6 @@ private function populateCRT(): void } /** - * @throws RuntimeException if the prime factors cannot be found - * * @return BigInteger[] */ private function findPrimeFactors(BigInteger $d, BigInteger $e, BigInteger $n): array @@ -202,7 +173,9 @@ private function findPrimeFactors(BigInteger $d, BigInteger $e, BigInteger $n): $one = BigInteger::createFromDecimal(1); $two = BigInteger::createFromDecimal(2); - $k = $d->multiply($e)->subtract($one); + $k = $d->multiply($e) + ->subtract($one) + ; if ($k->isEven()) { $r = $k; @@ -247,11 +220,13 @@ private function findPrimeFactors(BigInteger $d, BigInteger $e, BigInteger $n): break; } } - if (null === $y) { + if ($y === null) { throw new InvalidArgumentException('Unable to find prime factors.'); } - if (true === $found) { - $p = $y->subtract($one)->gcd($n); + if ($found === true) { + $p = $y->subtract($one) + ->gcd($n) + ; $q = $n->divide($p); return [$p, $q]; diff --git a/src/Component/KeyManagement/UrlKeySetFactory.php b/src/Component/KeyManagement/UrlKeySetFactory.php index e880fd6c..f1b9a117 100644 --- a/src/Component/KeyManagement/UrlKeySetFactory.php +++ b/src/Component/KeyManagement/UrlKeySetFactory.php @@ -2,15 +2,6 @@ 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\KeyManagement; use Psr\Http\Client\ClientInterface; @@ -19,28 +10,12 @@ abstract class UrlKeySetFactory { - /** - * @var ClientInterface - */ - private $client; - - /** - * @var RequestFactoryInterface - */ - private $requestFactory; - - /** - * UrlKeySetFactory constructor. - */ - public function __construct(ClientInterface $client, RequestFactoryInterface $requestFactory) - { - $this->client = $client; - $this->requestFactory = $requestFactory; + public function __construct( + private ClientInterface $client, + private RequestFactoryInterface $requestFactory + ) { } - /** - * @throws RuntimeException if the response content is invalid - */ protected function getContent(string $url, array $header = []): string { $request = $this->requestFactory->createRequest('GET', $url); @@ -53,6 +28,8 @@ protected function getContent(string $url, array $header = []): string throw new RuntimeException('Unable to get the key set.', $response->getStatusCode()); } - return $response->getBody()->getContents(); + return $response->getBody() + ->getContents() + ; } } diff --git a/src/Component/KeyManagement/X5UFactory.php b/src/Component/KeyManagement/X5UFactory.php index 8b81c995..32eacd76 100644 --- a/src/Component/KeyManagement/X5UFactory.php +++ b/src/Component/KeyManagement/X5UFactory.php @@ -2,15 +2,6 @@ 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\KeyManagement; use function is_array; @@ -19,28 +10,26 @@ use Jose\Component\Core\JWKSet; use Jose\Component\Core\Util\JsonConverter; use Jose\Component\KeyManagement\KeyConverter\KeyConverter; +use const PHP_EOL; use RuntimeException; class X5UFactory extends UrlKeySetFactory { /** - * This method will try to fetch the url a retrieve the key set. - * Throws an exception in case of failure. - * - * @throws RuntimeException if the response content is invalid + * This method will try to fetch the url a retrieve the key set. Throws an exception in case of failure. */ public function loadFromUrl(string $url, array $header = []): JWKSet { $content = $this->getContent($url, $header); $data = JsonConverter::decode($content); - if (!is_array($data)) { + if (! is_array($data)) { throw new RuntimeException('Invalid content.'); } $keys = []; foreach ($data as $kid => $cert) { - if (false === mb_strpos($cert, '-----BEGIN CERTIFICATE-----')) { - $cert = '-----BEGIN CERTIFICATE-----'.PHP_EOL.$cert.PHP_EOL.'-----END CERTIFICATE-----'; + if (mb_strpos($cert, '-----BEGIN CERTIFICATE-----') === false) { + $cert = '-----BEGIN CERTIFICATE-----' . PHP_EOL . $cert . PHP_EOL . '-----END CERTIFICATE-----'; } $jwk = KeyConverter::loadKeyFromCertificate($cert); if (is_string($kid)) { diff --git a/src/Component/NestedToken/NestedTokenBuilder.php b/src/Component/NestedToken/NestedTokenBuilder.php index bdcbb576..68ced6b6 100644 --- a/src/Component/NestedToken/NestedTokenBuilder.php +++ b/src/Component/NestedToken/NestedTokenBuilder.php @@ -2,15 +2,6 @@ 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\NestedToken; use function array_key_exists; @@ -23,48 +14,40 @@ class NestedTokenBuilder { - /** - * @var JWSBuilder - */ - private $jwsBuilder; - - /** - * @var JWSSerializerManager - */ - private $jwsSerializerManager; - - /** - * @var JWEBuilder - */ - private $jweBuilder; - - /** - * @var JWESerializerManager - */ - private $jweSerializerManager; - - public function __construct(JWEBuilder $jweBuilder, JWESerializerManager $jweSerializerManager, JWSBuilder $jwsBuilder, JWSSerializerManager $jwsSerializerManager) - { - $this->jweBuilder = $jweBuilder; - $this->jwsSerializerManager = $jwsSerializerManager; - $this->jwsBuilder = $jwsBuilder; - $this->jweSerializerManager = $jweSerializerManager; + public function __construct( + private JWEBuilder $jweBuilder, + private JWESerializerManager $jweSerializerManager, + private JWSBuilder $jwsBuilder, + private JWSSerializerManager $jwsSerializerManager + ) { } /** * Creates a nested token. - * - * @throws InvalidArgumentException if the argument "$signatures" does not include the expected structure - * @throws InvalidArgumentException if the argument "$recipients" does not include the expected structure */ - public function create(string $payload, array $signatures, string $jws_serialization_mode, array $jweSharedProtectedHeader, array $jweSharedHeader, array $recipients, string $jwe_serialization_mode, ?string $aad = null): string - { - $jws = $this->jwsBuilder->create()->withPayload($payload); + public function create( + string $payload, + array $signatures, + string $jws_serialization_mode, + array $jweSharedProtectedHeader, + array $jweSharedHeader, + array $recipients, + string $jwe_serialization_mode, + ?string $aad = null + ): string { + $jws = $this->jwsBuilder->create() + ->withPayload($payload) + ; foreach ($signatures as $signature) { - if (!is_array($signature) || !array_key_exists('key', $signature)) { - throw new InvalidArgumentException('The signatures must be an array of arrays containing a key, a protected header and a header'); + if (! is_array($signature) || ! array_key_exists('key', $signature)) { + throw new InvalidArgumentException( + 'The signatures must be an array of arrays containing a key, a protected header and a header' + ); } - $signature['protected_header'] = array_key_exists('protected_header', $signature) ? $signature['protected_header'] : []; + $signature['protected_header'] = array_key_exists( + 'protected_header', + $signature + ) ? $signature['protected_header'] : []; $signature['header'] = array_key_exists('header', $signature) ? $signature['header'] : []; $jws = $jws->addSignature($signature['key'], $signature['protected_header'], $signature['header']); } @@ -81,8 +64,10 @@ public function create(string $payload, array $signatures, string $jws_serializa ->withAAD($aad) ; foreach ($recipients as $recipient) { - if (!is_array($recipient) || !array_key_exists('key', $recipient)) { - throw new InvalidArgumentException('The recipients must be an array of arrays containing a key and a header'); + if (! is_array($recipient) || ! array_key_exists('key', $recipient)) { + throw new InvalidArgumentException( + 'The recipients must be an array of arrays containing a key and a header' + ); } $recipient['header'] = array_key_exists('header', $recipient) ? $recipient['header'] : []; $jwe = $jwe->addRecipient($recipient['key'], $recipient['header']); diff --git a/src/Component/NestedToken/NestedTokenBuilderFactory.php b/src/Component/NestedToken/NestedTokenBuilderFactory.php index 5e8cecd7..43aadceb 100644 --- a/src/Component/NestedToken/NestedTokenBuilderFactory.php +++ b/src/Component/NestedToken/NestedTokenBuilderFactory.php @@ -2,15 +2,6 @@ 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\NestedToken; use Jose\Component\Encryption\JWEBuilderFactory; @@ -20,40 +11,31 @@ class NestedTokenBuilderFactory { - /** - * @var JWEBuilderFactory - */ - private $jweBuilderFactory; - - /** - * @var JWESerializerManagerFactory - */ - private $jweSerializerManagerFactory; - - /** - * @var JWSBuilderFactory - */ - private $jwsBuilderFactory; - - /** - * @var JWSSerializerManagerFactory - */ - private $jwsSerializerManagerFactory; - - public function __construct(JWEBuilderFactory $jweBuilderFactory, JWESerializerManagerFactory $jweSerializerManagerFactory, JWSBuilderFactory $jwsBuilderFactory, JWSSerializerManagerFactory $jwsSerializerManagerFactory) - { - $this->jweBuilderFactory = $jweBuilderFactory; - $this->jweSerializerManagerFactory = $jweSerializerManagerFactory; - $this->jwsBuilderFactory = $jwsBuilderFactory; - $this->jwsSerializerManagerFactory = $jwsSerializerManagerFactory; + public function __construct( + private JWEBuilderFactory $jweBuilderFactory, + private JWESerializerManagerFactory $jweSerializerManagerFactory, + private JWSBuilderFactory $jwsBuilderFactory, + private JWSSerializerManagerFactory $jwsSerializerManagerFactory + ) { } /** - * This method creates a Nested Token Builder with the given encryption/signature algorithms, serializers and compression methods. + * This method creates a Nested Token Builder with the given encryption/signature algorithms, serializers and + * compression methods. */ - public function create(array $jwe_serializers, array $keyEncryptionAlgorithms, array $contentEncryptionAlgorithms, array $compressionMethods, array $jws_serializers, array $signatureAlgorithms): NestedTokenBuilder - { - $jweBuilder = $this->jweBuilderFactory->create($keyEncryptionAlgorithms, $contentEncryptionAlgorithms, $compressionMethods); + public function create( + array $jwe_serializers, + array $keyEncryptionAlgorithms, + array $contentEncryptionAlgorithms, + array $compressionMethods, + array $jws_serializers, + array $signatureAlgorithms + ): NestedTokenBuilder { + $jweBuilder = $this->jweBuilderFactory->create( + $keyEncryptionAlgorithms, + $contentEncryptionAlgorithms, + $compressionMethods + ); $jweSerializerManager = $this->jweSerializerManagerFactory->create($jwe_serializers); $jwsBuilder = $this->jwsBuilderFactory->create($signatureAlgorithms); $jwsSerializerManager = $this->jwsSerializerManagerFactory->create($jws_serializers); diff --git a/src/Component/NestedToken/NestedTokenLoader.php b/src/Component/NestedToken/NestedTokenLoader.php index efdf1199..70286898 100644 --- a/src/Component/NestedToken/NestedTokenLoader.php +++ b/src/Component/NestedToken/NestedTokenLoader.php @@ -2,15 +2,6 @@ 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\NestedToken; use InvalidArgumentException; @@ -22,66 +13,40 @@ class NestedTokenLoader { - /** - * @var JWSLoader - */ - private $jwsLoader; - - /** - * @var JWELoader - */ - private $jweLoader; - - public function __construct(JWELoader $jweLoader, JWSLoader $jwsLoader) - { - $this->jweLoader = $jweLoader; - $this->jwsLoader = $jwsLoader; + public function __construct( + private JWELoader $jweLoader, + private JWSLoader $jwsLoader + ) { } /** - * This method will try to load, decrypt and verify the token. - * In case of failure, an exception is thrown, otherwise returns the JWS and populates the $signature variable. - * - * @throws InvalidArgumentException if the token has no payload + * This method will try to load, decrypt and verify the token. In case of failure, an exception is thrown, otherwise + * returns the JWS and populates the $signature variable. */ public function load(string $token, JWKSet $encryptionKeySet, JWKSet $signatureKeySet, ?int &$signature = null): JWS { $recipient = null; $jwe = $this->jweLoader->loadAndDecryptWithKeySet($token, $encryptionKeySet, $recipient); $this->checkContentTypeHeader($jwe, $recipient); - if (null === $jwe->getPayload()) { + if ($jwe->getPayload() === null) { throw new InvalidArgumentException('The token has no payload.'); } return $this->jwsLoader->loadAndVerifyWithKeySet($jwe->getPayload(), $signatureKeySet, $signature); } - /** - * @throws InvalidArgumentException if the token is not a valid nested token - */ private function checkContentTypeHeader(JWE $jwe, int $recipient): void { - switch (true) { - case $jwe->hasSharedProtectedHeaderParameter('cty'): - $cty = $jwe->getSharedProtectedHeaderParameter('cty'); - - break; - - case $jwe->hasSharedHeaderParameter('cty'): - $cty = $jwe->getSharedHeaderParameter('cty'); - - break; - - case $jwe->getRecipient($recipient)->hasHeaderParameter('cty'): - $cty = $jwe->getRecipient($recipient)->getHeaderParameter('cty'); - - break; - - default: - throw new InvalidArgumentException('The token is not a nested token.'); - } - - if (0 !== strcasecmp($cty, 'jwt')) { + $cty = match (true) { + $jwe->hasSharedProtectedHeaderParameter('cty') => $jwe->getSharedProtectedHeaderParameter('cty'), + $jwe->hasSharedHeaderParameter('cty') => $jwe->getSharedHeaderParameter('cty'), + $jwe->getRecipient($recipient) + ->hasHeaderParameter('cty') => $jwe->getRecipient($recipient) + ->getHeaderParameter('cty'), + default => throw new InvalidArgumentException('The token is not a nested token.'), + }; + + if (strcasecmp($cty, 'jwt') !== 0) { throw new InvalidArgumentException('The token is not a nested token.'); } } diff --git a/src/Component/NestedToken/NestedTokenLoaderFactory.php b/src/Component/NestedToken/NestedTokenLoaderFactory.php index 16972f4f..e3f9881a 100644 --- a/src/Component/NestedToken/NestedTokenLoaderFactory.php +++ b/src/Component/NestedToken/NestedTokenLoaderFactory.php @@ -2,15 +2,6 @@ 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\NestedToken; use Jose\Component\Encryption\JWELoaderFactory; @@ -18,28 +9,33 @@ class NestedTokenLoaderFactory { - /** - * @var JWELoaderFactory - */ - private $jweLoaderFactory; - - /** - * @var JWSLoaderFactory - */ - private $jwsLoaderFactory; - - public function __construct(JWELoaderFactory $jweLoaderFactory, JWSLoaderFactory $jwsLoaderFactory) - { - $this->jweLoaderFactory = $jweLoaderFactory; - $this->jwsLoaderFactory = $jwsLoaderFactory; + public function __construct( + private JWELoaderFactory $jweLoaderFactory, + private JWSLoaderFactory $jwsLoaderFactory + ) { } /** - * This method creates a Nested Token Loader with the given encryption/signature algorithms, serializers, compression methods and header checkers. + * This method creates a Nested Token Loader with the given encryption/signature algorithms, serializers, + * compression methods and header checkers. */ - public function create(array $jweSerializers, array $keyEncryptionAlgorithms, array $contentEncryptionAlgorithms, array $compressionMethods, array $jweHeaderCheckers, array $jwsSerializers, array $signatureAlgorithms, array $jwsHeaderCheckers): NestedTokenLoader - { - $jweLoader = $this->jweLoaderFactory->create($jweSerializers, $keyEncryptionAlgorithms, $contentEncryptionAlgorithms, $compressionMethods, $jweHeaderCheckers); + public function create( + array $jweSerializers, + array $keyEncryptionAlgorithms, + array $contentEncryptionAlgorithms, + array $compressionMethods, + array $jweHeaderCheckers, + array $jwsSerializers, + array $signatureAlgorithms, + array $jwsHeaderCheckers + ): NestedTokenLoader { + $jweLoader = $this->jweLoaderFactory->create( + $jweSerializers, + $keyEncryptionAlgorithms, + $contentEncryptionAlgorithms, + $compressionMethods, + $jweHeaderCheckers + ); $jwsLoader = $this->jwsLoaderFactory->create($jwsSerializers, $signatureAlgorithms, $jwsHeaderCheckers); return new NestedTokenLoader($jweLoader, $jwsLoader); diff --git a/src/Component/Signature/Algorithm/MacAlgorithm.php b/src/Component/Signature/Algorithm/MacAlgorithm.php index 2304b367..43f86143 100644 --- a/src/Component/Signature/Algorithm/MacAlgorithm.php +++ b/src/Component/Signature/Algorithm/MacAlgorithm.php @@ -2,15 +2,6 @@ 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; use Jose\Component\Core\Algorithm; diff --git a/src/Component/Signature/Algorithm/SignatureAlgorithm.php b/src/Component/Signature/Algorithm/SignatureAlgorithm.php index 9f64144d..48448f95 100644 --- a/src/Component/Signature/Algorithm/SignatureAlgorithm.php +++ b/src/Component/Signature/Algorithm/SignatureAlgorithm.php @@ -2,15 +2,6 @@ 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; use Jose\Component\Core\Algorithm; diff --git a/src/Component/Signature/JWS.php b/src/Component/Signature/JWS.php index 1276a9e3..60bafc62 100644 --- a/src/Component/Signature/JWS.php +++ b/src/Component/Signature/JWS.php @@ -2,15 +2,6 @@ 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; use function count; @@ -19,31 +10,16 @@ class JWS implements JWT { - /** - * @var bool - */ - private $isPayloadDetached = false; - - /** - * @var null|string - */ - private $encodedPayload; - /** * @var Signature[] */ private $signatures = []; - /** - * @var null|string - */ - private $payload; - - public function __construct(?string $payload, ?string $encodedPayload = null, bool $isPayloadDetached = false) - { - $this->payload = $payload; - $this->encodedPayload = $encodedPayload; - $this->isPayloadDetached = $isPayloadDetached; + public function __construct( + private ?string $payload, + private ?string $encodedPayload = null, + private bool $isPayloadDetached = false + ) { } public function getPayload(): ?string @@ -60,12 +36,11 @@ public function isPayloadDetached(): bool } /** - * Returns the Base64Url encoded payload. - * If the payload is detached, this method returns null. + * Returns the Base64Url encoded payload. If the payload is detached, this method returns null. */ public function getEncodedPayload(): ?string { - if (true === $this->isPayloadDetached()) { + if ($this->isPayloadDetached() === true) { return null; } @@ -84,8 +59,6 @@ public function getSignatures(): array /** * Returns the signature at the given index. - * - * @throws InvalidArgumentException if the signature index does not exist */ public function getSignature(int $id): Signature { @@ -97,15 +70,16 @@ public function getSignature(int $id): Signature } /** - * This method adds a signature to the JWS object. - * Its returns a new JWS object. + * This method adds a signature to the JWS object. Its returns a new JWS object. * * @internal - * - * @return JWS */ - public function addSignature(string $signature, array $protectedHeader, ?string $encodedProtectedHeader, array $header = []): self - { + public function addSignature( + string $signature, + array $protectedHeader, + ?string $encodedProtectedHeader, + array $header = [] + ): self { $jws = clone $this; $jws->signatures[] = new Signature($signature, $protectedHeader, $encodedProtectedHeader, $header); @@ -121,8 +95,8 @@ public function countSignatures(): int } /** - * This method splits the JWS into a list of JWSs. - * It is only useful when the JWS contains more than one signature (JSON General Serialization). + * This method splits the JWS into a list of JWSs. It is only useful when the JWS contains more than one signature + * (JSON General Serialization). * * @return JWS[] */ @@ -130,11 +104,7 @@ public function split(): array { $result = []; foreach ($this->signatures as $signature) { - $jws = new self( - $this->payload, - $this->encodedPayload, - $this->isPayloadDetached - ); + $jws = new self($this->payload, $this->encodedPayload, $this->isPayloadDetached); $jws = $jws->addSignature( $signature->getSignature(), $signature->getProtectedHeader(), diff --git a/src/Component/Signature/JWSBuilder.php b/src/Component/Signature/JWSBuilder.php index 4f2af279..a3d94065 100644 --- a/src/Component/Signature/JWSBuilder.php +++ b/src/Component/Signature/JWSBuilder.php @@ -2,15 +2,6 @@ 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; use function array_key_exists; @@ -31,34 +22,17 @@ class JWSBuilder { - /** - * @var null|string - */ - protected $payload; + protected ?string $payload = null; - /** - * @var bool - */ - protected $isPayloadDetached; + protected ?bool $isPayloadDetached = null; - /** - * @var array - */ - protected $signatures = []; + protected array $signatures = []; - /** - * @var null|bool - */ - protected $isPayloadEncoded; + protected ?bool $isPayloadEncoded = null; - /** - * @var AlgorithmManager - */ - private $signatureAlgorithmManager; - - public function __construct(AlgorithmManager $signatureAlgorithmManager) - { - $this->signatureAlgorithmManager = $signatureAlgorithmManager; + public function __construct( + private AlgorithmManager $signatureAlgorithmManager + ) { } /** @@ -71,8 +45,6 @@ public function getSignatureAlgorithmManager(): AlgorithmManager /** * Reset the current data. - * - * @return JWSBuilder */ public function create(): self { @@ -85,16 +57,11 @@ public function create(): self } /** - * Set the payload. - * This method will return a new JWSBuilder object. - * - * @throws InvalidArgumentException if the payload is not UTF-8 encoded - * - * @return JWSBuilder + * Set the payload. This method will return a new JWSBuilder object. */ public function withPayload(string $payload, bool $isPayloadDetached = false): self { - if (false === mb_detect_encoding($payload, 'UTF-8', true)) { + if (mb_detect_encoding($payload, 'UTF-8', true) === false) { throw new InvalidArgumentException('The payload must be encoded in UTF-8'); } $clone = clone $this; @@ -105,18 +72,13 @@ public function withPayload(string $payload, bool $isPayloadDetached = false): s } /** - * Adds the information needed to compute the signature. - * This method will return a new JWSBuilder object. - * - * @throws InvalidArgumentException if the payload encoding is inconsistent - * - * @return JWSBuilder + * Adds the information needed to compute the signature. This method will return a new JWSBuilder object. */ public function addSignature(JWK $signatureKey, array $protectedHeader, array $header = []): self { $this->checkB64AndCriticalHeader($protectedHeader); $isPayloadEncoded = $this->checkIfPayloadIsEncoded($protectedHeader); - if (null === $this->isPayloadEncoded) { + if ($this->isPayloadEncoded === null) { $this->isPayloadEncoded = $isPayloadEncoded; } elseif ($this->isPayloadEncoded !== $isPayloadEncoded) { throw new InvalidArgumentException('Foreign payload encoding detected.'); @@ -138,20 +100,19 @@ public function addSignature(JWK $signatureKey, array $protectedHeader, array $h /** * Computes all signatures and return the expected JWS object. - * - * @throws RuntimeException if the payload is not set - * @throws RuntimeException if no signature is defined */ public function build(): JWS { - if (null === $this->payload) { + if ($this->payload === null) { throw new RuntimeException('The payload is not set.'); } - if (0 === count($this->signatures)) { + if (count($this->signatures) === 0) { throw new RuntimeException('At least one signature must be set.'); } - $encodedPayload = false === $this->isPayloadEncoded ? $this->payload : Base64UrlSafe::encodeUnpadded($this->payload); + $encodedPayload = $this->isPayloadEncoded === false ? $this->payload : Base64UrlSafe::encodeUnpadded( + $this->payload + ); $jws = new JWS($this->payload, $encodedPayload, $this->isPayloadDetached); foreach ($this->signatures as $signature) { /** @var MacAlgorithm|SignatureAlgorithm $algorithm */ @@ -162,7 +123,9 @@ public function build(): JWS $protectedHeader = $signature['protected_header']; /** @var array $header */ $header = $signature['header']; - $encodedProtectedHeader = 0 === count($protectedHeader) ? null : Base64UrlSafe::encodeUnpadded(JsonConverter::encode($protectedHeader)); + $encodedProtectedHeader = count($protectedHeader) === 0 ? null : Base64UrlSafe::encodeUnpadded( + JsonConverter::encode($protectedHeader) + ); $input = sprintf('%s.%s', $encodedProtectedHeader, $encodedPayload); if ($algorithm instanceof SignatureAlgorithm) { $s = $algorithm->sign($signatureKey, $input); @@ -177,59 +140,61 @@ public function build(): JWS private function checkIfPayloadIsEncoded(array $protectedHeader): bool { - return !array_key_exists('b64', $protectedHeader) || true === $protectedHeader['b64']; + return ! array_key_exists('b64', $protectedHeader) || $protectedHeader['b64'] === true; } - /** - * @throws LogicException if the header parameter "crit" is missing, invalid or does not contain "b64" when "b64" is set - */ private function checkB64AndCriticalHeader(array $protectedHeader): void { - if (!array_key_exists('b64', $protectedHeader)) { + if (! array_key_exists('b64', $protectedHeader)) { return; } - if (!array_key_exists('crit', $protectedHeader)) { - throw new LogicException('The protected header parameter "crit" is mandatory when protected header parameter "b64" is set.'); + if (! array_key_exists('crit', $protectedHeader)) { + throw new LogicException( + 'The protected header parameter "crit" is mandatory when protected header parameter "b64" is set.' + ); } - if (!is_array($protectedHeader['crit'])) { + if (! is_array($protectedHeader['crit'])) { throw new LogicException('The protected header parameter "crit" must be an array.'); } - if (!in_array('b64', $protectedHeader['crit'], true)) { - throw new LogicException('The protected header parameter "crit" must contain "b64" when protected header parameter "b64" is set.'); + if (! in_array('b64', $protectedHeader['crit'], true)) { + throw new LogicException( + 'The protected header parameter "crit" must contain "b64" when protected header parameter "b64" is set.' + ); } } /** - * @throws InvalidArgumentException if the header parameter "alg" is missing or the algorithm is not allowed/not supported - * * @return MacAlgorithm|SignatureAlgorithm */ private function findSignatureAlgorithm(JWK $key, array $protectedHeader, array $header): Algorithm { $completeHeader = array_merge($header, $protectedHeader); - if (!array_key_exists('alg', $completeHeader)) { + if (! array_key_exists('alg', $completeHeader)) { throw new InvalidArgumentException('No "alg" parameter set in the header.'); } if ($key->has('alg') && $key->get('alg') !== $completeHeader['alg']) { - throw new InvalidArgumentException(sprintf('The algorithm "%s" is not allowed with this key.', $completeHeader['alg'])); + throw new InvalidArgumentException(sprintf( + 'The algorithm "%s" is not allowed with this key.', + $completeHeader['alg'] + )); } $algorithm = $this->signatureAlgorithmManager->get($completeHeader['alg']); - if (!$algorithm instanceof SignatureAlgorithm && !$algorithm instanceof MacAlgorithm) { + if (! $algorithm instanceof SignatureAlgorithm && ! $algorithm instanceof MacAlgorithm) { throw new InvalidArgumentException(sprintf('The algorithm "%s" is not supported.', $completeHeader['alg'])); } return $algorithm; } - /** - * @throws InvalidArgumentException if the header contains duplicated entries - */ private function checkDuplicatedHeaderParameters(array $header1, array $header2): void { $inter = array_intersect_key($header1, $header2); - if (0 !== count($inter)) { - throw new InvalidArgumentException(sprintf('The header contains duplicated entries: %s.', implode(', ', array_keys($inter)))); + if (count($inter) !== 0) { + throw new InvalidArgumentException(sprintf( + 'The header contains duplicated entries: %s.', + implode(', ', array_keys($inter)) + )); } } } diff --git a/src/Component/Signature/JWSBuilderFactory.php b/src/Component/Signature/JWSBuilderFactory.php index dbdf115a..ebcb0c7f 100644 --- a/src/Component/Signature/JWSBuilderFactory.php +++ b/src/Component/Signature/JWSBuilderFactory.php @@ -2,29 +2,15 @@ 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; use Jose\Component\Core\AlgorithmManagerFactory; class JWSBuilderFactory { - /** - * @var AlgorithmManagerFactory - */ - private $signatureAlgorithmManagerFactory; - - public function __construct(AlgorithmManagerFactory $signatureAlgorithmManagerFactory) - { - $this->signatureAlgorithmManagerFactory = $signatureAlgorithmManagerFactory; + public function __construct( + private AlgorithmManagerFactory $signatureAlgorithmManagerFactory + ) { } /** diff --git a/src/Component/Signature/JWSLoader.php b/src/Component/Signature/JWSLoader.php index f19b449e..0b2d3bdf 100644 --- a/src/Component/Signature/JWSLoader.php +++ b/src/Component/Signature/JWSLoader.php @@ -2,15 +2,6 @@ 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; use Exception; @@ -22,29 +13,11 @@ class JWSLoader { - /** - * @var JWSVerifier - */ - private $jwsVerifier; - - /** - * @var null|HeaderCheckerManager - */ - private $headerCheckerManager; - - /** - * @var JWSSerializerManager - */ - private $serializerManager; - - /** - * JWSLoader constructor. - */ - public function __construct(JWSSerializerManager $serializerManager, JWSVerifier $jwsVerifier, ?HeaderCheckerManager $headerCheckerManager) - { - $this->serializerManager = $serializerManager; - $this->jwsVerifier = $jwsVerifier; - $this->headerCheckerManager = $headerCheckerManager; + public function __construct( + private JWSSerializerManager $serializerManager, + private JWSVerifier $jwsVerifier, + private ?HeaderCheckerManager $headerCheckerManager + ) { } /** @@ -72,10 +45,8 @@ public function getSerializerManager(): JWSSerializerManager } /** - * This method will try to load and verify the token using the given key. - * It returns a JWS and will populate the $signature variable in case of success, otherwise an exception is thrown. - * - * @throws Exception if the token cannot be loaded or verified + * This method will try to load and verify the token using the given key. It returns a JWS and will populate the + * $signature variable in case of success, otherwise an exception is thrown. */ public function loadAndVerifyWithKey(string $token, JWK $key, ?int &$signature, ?string $payload = null): JWS { @@ -85,13 +56,15 @@ public function loadAndVerifyWithKey(string $token, JWK $key, ?int &$signature, } /** - * This method will try to load and verify the token using the given key set. - * It returns a JWS and will populate the $signature variable in case of success, otherwise an exception is thrown. - * - * @throws Exception if the token cannot be loaded or verified + * This method will try to load and verify the token using the given key set. It returns a JWS and will populate the + * $signature variable in case of success, otherwise an exception is thrown. */ - public function loadAndVerifyWithKeySet(string $token, JWKSet $keyset, ?int &$signature, ?string $payload = null): JWS - { + public function loadAndVerifyWithKeySet( + string $token, + JWKSet $keyset, + ?int &$signature, + ?string $payload = null + ): JWS { try { $jws = $this->serializerManager->unserialize($token); $nbSignatures = $jws->countSignatures(); @@ -102,7 +75,7 @@ public function loadAndVerifyWithKeySet(string $token, JWKSet $keyset, ?int &$si return $jws; } } - } catch (Throwable $e) { + } catch (Throwable) { // Nothing to do. Exception thrown just after } @@ -112,12 +85,12 @@ public function loadAndVerifyWithKeySet(string $token, JWKSet $keyset, ?int &$si private function processSignature(JWS $jws, JWKSet $keyset, int $signature, ?string $payload): bool { try { - if (null !== $this->headerCheckerManager) { + if ($this->headerCheckerManager !== null) { $this->headerCheckerManager->check($jws, $signature); } return $this->jwsVerifier->verifyWithKeySet($jws, $keyset, $signature, $payload); - } catch (Throwable $e) { + } catch (Throwable) { return false; } } diff --git a/src/Component/Signature/JWSLoaderFactory.php b/src/Component/Signature/JWSLoaderFactory.php index 8f29650c..589900b9 100644 --- a/src/Component/Signature/JWSLoaderFactory.php +++ b/src/Component/Signature/JWSLoaderFactory.php @@ -2,15 +2,6 @@ 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; use Jose\Component\Checker\HeaderCheckerManagerFactory; @@ -18,37 +9,22 @@ class JWSLoaderFactory { - /** - * @var JWSVerifierFactory - */ - private $jwsVerifierFactory; - - /** - * @var JWSSerializerManagerFactory - */ - private $jwsSerializerManagerFactory; - - /** - * @var null|HeaderCheckerManagerFactory - */ - private $headerCheckerManagerFactory; - - public function __construct(JWSSerializerManagerFactory $jwsSerializerManagerFactory, JWSVerifierFactory $jwsVerifierFactory, ?HeaderCheckerManagerFactory $headerCheckerManagerFactory) - { - $this->jwsSerializerManagerFactory = $jwsSerializerManagerFactory; - $this->jwsVerifierFactory = $jwsVerifierFactory; - $this->headerCheckerManagerFactory = $headerCheckerManagerFactory; + public function __construct( + private JWSSerializerManagerFactory $jwsSerializerManagerFactory, + private JWSVerifierFactory $jwsVerifierFactory, + private ?HeaderCheckerManagerFactory $headerCheckerManagerFactory + ) { } /** - * Creates a JWSLoader using the given serializer aliases, signature algorithm aliases and (optionally) - * the header checker aliases. + * Creates a JWSLoader using the given serializer aliases, signature algorithm aliases and (optionally) the header + * checker aliases. */ public function create(array $serializers, array $algorithms, array $headerCheckers = []): JWSLoader { $serializerManager = $this->jwsSerializerManagerFactory->create($serializers); $jwsVerifier = $this->jwsVerifierFactory->create($algorithms); - if (null !== $this->headerCheckerManagerFactory) { + if ($this->headerCheckerManagerFactory !== null) { $headerCheckerManager = $this->headerCheckerManagerFactory->create($headerCheckers); } else { $headerCheckerManager = null; diff --git a/src/Component/Signature/JWSTokenSupport.php b/src/Component/Signature/JWSTokenSupport.php index f2f586f3..83c9b5a7 100644 --- a/src/Component/Signature/JWSTokenSupport.php +++ b/src/Component/Signature/JWSTokenSupport.php @@ -2,15 +2,6 @@ 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; use InvalidArgumentException; @@ -24,19 +15,20 @@ public function supports(JWT $jwt): bool return $jwt instanceof JWS; } - /** - * @throws InvalidArgumentException if the signature index does not exist - */ public function retrieveTokenHeaders(JWT $jwt, int $index, array &$protectedHeader, array &$unprotectedHeader): void { - if (!$jwt instanceof JWS) { + if (! $jwt instanceof JWS) { return; } if ($index > $jwt->countSignatures()) { throw new InvalidArgumentException('Unknown signature index.'); } - $protectedHeader = $jwt->getSignature($index)->getProtectedHeader(); - $unprotectedHeader = $jwt->getSignature($index)->getHeader(); + $protectedHeader = $jwt->getSignature($index) + ->getProtectedHeader() + ; + $unprotectedHeader = $jwt->getSignature($index) + ->getHeader() + ; } } diff --git a/src/Component/Signature/JWSVerifier.php b/src/Component/Signature/JWSVerifier.php index b641a4cc..3d5550e9 100644 --- a/src/Component/Signature/JWSVerifier.php +++ b/src/Component/Signature/JWSVerifier.php @@ -2,15 +2,6 @@ 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; use InvalidArgumentException; @@ -26,17 +17,9 @@ class JWSVerifier { - /** - * @var AlgorithmManager - */ - private $signatureAlgorithmManager; - - /** - * JWSVerifier constructor. - */ - public function __construct(AlgorithmManager $signatureAlgorithmManager) - { - $this->signatureAlgorithmManager = $signatureAlgorithmManager; + public function __construct( + private AlgorithmManager $signatureAlgorithmManager + ) { } /** @@ -48,8 +31,8 @@ public function getSignatureAlgorithmManager(): AlgorithmManager } /** - * This method will try to verify the JWS object using the given key and for the given signature. - * It returns true if the signature is verified, otherwise false. + * This method will try to verify the JWS object using the given key and for the given signature. It returns true if + * the signature is verified, otherwise false. * * @return bool true if the verification of the signature succeeded, else false */ @@ -61,25 +44,27 @@ public function verifyWithKey(JWS $jws, JWK $jwk, int $signature, ?string $detac } /** - * This method will try to verify the JWS object using the given key set and for the given signature. - * It returns true if the signature is verified, otherwise false. + * This method will try to verify the JWS object using the given key set and for the given signature. It returns + * true if the signature is verified, otherwise false. * * @param JWS $jws A JWS object * @param JWKSet $jwkset The signature will be verified using keys in the key set * @param JWK $jwk The key used to verify the signature in case of success - * @param null|string $detachedPayload If not null, the value must be the detached payload encoded in Base64 URL safe. If the input contains a payload, throws an exception. - * - * @throws InvalidArgumentException if there is no key in the keyset - * @throws InvalidArgumentException if the token does not contain any signature + * @param string|null $detachedPayload If not null, the value must be the detached payload encoded in Base64 URL safe. If the input contains a payload, throws an exception. * * @return bool true if the verification of the signature succeeded, else false */ - public function verifyWithKeySet(JWS $jws, JWKSet $jwkset, int $signatureIndex, ?string $detachedPayload = null, JWK &$jwk = null): bool - { - if (0 === $jwkset->count()) { + public function verifyWithKeySet( + JWS $jws, + JWKSet $jwkset, + int $signatureIndex, + ?string $detachedPayload = null, + JWK &$jwk = null + ): bool { + if ($jwkset->count() === 0) { throw new InvalidArgumentException('There is no key in the key set.'); } - if (0 === $jws->countSignatures()) { + if ($jws->countSignatures() === 0) { throw new InvalidArgumentException('The JWS does not contain any signature.'); } $this->checkPayload($jws, $detachedPayload); @@ -88,20 +73,25 @@ public function verifyWithKeySet(JWS $jws, JWKSet $jwkset, int $signatureIndex, return $this->verifySignature($jws, $jwkset, $signature, $detachedPayload, $jwk); } - private function verifySignature(JWS $jws, JWKSet $jwkset, Signature $signature, ?string $detachedPayload = null, JWK &$successJwk = null): bool - { + private function verifySignature( + JWS $jws, + JWKSet $jwkset, + Signature $signature, + ?string $detachedPayload = null, + JWK &$successJwk = null + ): bool { $input = $this->getInputToVerify($jws, $signature, $detachedPayload); $algorithm = $this->getAlgorithm($signature); foreach ($jwkset->all() as $jwk) { try { KeyChecker::checkKeyUsage($jwk, 'verification'); KeyChecker::checkKeyAlgorithm($jwk, $algorithm->name()); - if (true === $algorithm->verify($jwk, $input, $signature->getSignature())) { + if ($algorithm->verify($jwk, $input, $signature->getSignature()) === true) { $successJwk = $jwk; return true; } - } catch (Throwable $e) { + } catch (Throwable) { //We do nothing, we continue with other keys continue; } @@ -115,8 +105,10 @@ private function getInputToVerify(JWS $jws, Signature $signature, ?string $detac $isPayloadEmpty = $this->isPayloadEmpty($jws->getPayload()); $encodedProtectedHeader = $signature->getEncodedProtectedHeader(); - if (!$signature->hasProtectedHeaderParameter('b64') || true === $signature->getProtectedHeaderParameter('b64')) { - if (null !== $jws->getEncodedPayload()) { + if (! $signature->hasProtectedHeaderParameter('b64') || $signature->getProtectedHeaderParameter( + 'b64' + ) === true) { + if ($jws->getEncodedPayload() !== null) { return sprintf('%s.%s', $encodedProtectedHeader, $jws->getEncodedPayload()); } @@ -130,35 +122,33 @@ private function getInputToVerify(JWS $jws, Signature $signature, ?string $detac return sprintf('%s.%s', $encodedProtectedHeader, $payload); } - /** - * @throws InvalidArgumentException if the payload is set when a detached payload is provided or no payload is defined - */ private function checkPayload(JWS $jws, ?string $detachedPayload = null): void { $isPayloadEmpty = $this->isPayloadEmpty($jws->getPayload()); - if (null !== $detachedPayload && !$isPayloadEmpty) { + if ($detachedPayload !== null && ! $isPayloadEmpty) { throw new InvalidArgumentException('A detached payload is set, but the JWS already has a payload.'); } - if ($isPayloadEmpty && null === $detachedPayload) { + if ($isPayloadEmpty && $detachedPayload === null) { throw new InvalidArgumentException('The JWS has a detached payload, but no payload is provided.'); } } /** - * @throws InvalidArgumentException if the header parameter "alg" is missing or invalid - * * @return MacAlgorithm|SignatureAlgorithm */ private function getAlgorithm(Signature $signature): Algorithm { $completeHeader = array_merge($signature->getProtectedHeader(), $signature->getHeader()); - if (!isset($completeHeader['alg'])) { + if (! isset($completeHeader['alg'])) { throw new InvalidArgumentException('No "alg" parameter set in the header.'); } $algorithm = $this->signatureAlgorithmManager->get($completeHeader['alg']); - if (!$algorithm instanceof SignatureAlgorithm && !$algorithm instanceof MacAlgorithm) { - throw new InvalidArgumentException(sprintf('The algorithm "%s" is not supported or is not a signature or MAC algorithm.', $completeHeader['alg'])); + if (! $algorithm instanceof SignatureAlgorithm && ! $algorithm instanceof MacAlgorithm) { + throw new InvalidArgumentException(sprintf( + 'The algorithm "%s" is not supported or is not a signature or MAC algorithm.', + $completeHeader['alg'] + )); } return $algorithm; @@ -166,6 +156,6 @@ private function getAlgorithm(Signature $signature): Algorithm private function isPayloadEmpty(?string $payload): bool { - return null === $payload || '' === $payload; + return $payload === null || $payload === ''; } } diff --git a/src/Component/Signature/JWSVerifierFactory.php b/src/Component/Signature/JWSVerifierFactory.php index 67a65e84..eb79332c 100644 --- a/src/Component/Signature/JWSVerifierFactory.php +++ b/src/Component/Signature/JWSVerifierFactory.php @@ -2,29 +2,15 @@ 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; use Jose\Component\Core\AlgorithmManagerFactory; class JWSVerifierFactory { - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; - - public function __construct(AlgorithmManagerFactory $algorithmManagerFactory) - { - $this->algorithmManagerFactory = $algorithmManagerFactory; + public function __construct( + private AlgorithmManagerFactory $algorithmManagerFactory + ) { } /** diff --git a/src/Component/Signature/Serializer/CompactSerializer.php b/src/Component/Signature/Serializer/CompactSerializer.php index 388e8bf4..ec84b82d 100644 --- a/src/Component/Signature/Serializer/CompactSerializer.php +++ b/src/Component/Signature/Serializer/CompactSerializer.php @@ -2,15 +2,6 @@ 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\Serializer; use function count; @@ -35,22 +26,20 @@ public function name(): string return self::NAME; } - /** - * @throws LogicException if the JWS has unprotected header (invalid for compact JSON) - * @throws LogicException if the payload is not encoded but contains unauthorized characters - */ public function serialize(JWS $jws, ?int $signatureIndex = null): string { - if (null === $signatureIndex) { + if ($signatureIndex === null) { $signatureIndex = 0; } $signature = $jws->getSignature($signatureIndex); - if (0 !== count($signature->getHeader())) { - throw new LogicException('The signature contains unprotected header parameters and cannot be converted into compact JSON.'); + if (count($signature->getHeader()) !== 0) { + throw new LogicException( + 'The signature contains unprotected header parameters and cannot be converted into compact JSON.' + ); } - $isEmptyPayload = null === $jws->getEncodedPayload() || '' === $jws->getEncodedPayload(); - if (!$this->isPayloadEncoded($signature->getProtectedHeader()) && !$isEmptyPayload) { - if (1 !== preg_match('/^[\x{20}-\x{2d}|\x{2f}-\x{7e}]*$/u', $jws->getPayload())) { + $isEmptyPayload = $jws->getEncodedPayload() === null || $jws->getEncodedPayload() === ''; + if (! $this->isPayloadEncoded($signature->getProtectedHeader()) && ! $isEmptyPayload) { + if (preg_match('/^[\x{20}-\x{2d}|\x{2f}-\x{7e}]*$/u', $jws->getPayload()) !== 1) { throw new LogicException('Unable to convert the JWS with non-encoded payload.'); } } @@ -63,30 +52,29 @@ public function serialize(JWS $jws, ?int $signatureIndex = null): string ); } - /** - * @throws InvalidArgumentException if the input is invalid - */ public function unserialize(string $input): JWS { $parts = explode('.', $input); - if (3 !== count($parts)) { + if (count($parts) !== 3) { throw new InvalidArgumentException('Unsupported input'); } try { $encodedProtectedHeader = $parts[0]; $protectedHeader = JsonConverter::decode(Base64UrlSafe::decode($parts[0])); - $hasPayload = '' !== $parts[1]; - if (!$hasPayload) { + $hasPayload = $parts[1] !== ''; + if (! $hasPayload) { $payload = null; $encodedPayload = null; } else { $encodedPayload = $parts[1]; - $payload = $this->isPayloadEncoded($protectedHeader) ? Base64UrlSafe::decode($encodedPayload) : $encodedPayload; + $payload = $this->isPayloadEncoded($protectedHeader) ? Base64UrlSafe::decode( + $encodedPayload + ) : $encodedPayload; } $signature = Base64UrlSafe::decode($parts[2]); - $jws = new JWS($payload, $encodedPayload, !$hasPayload); + $jws = new JWS($payload, $encodedPayload, ! $hasPayload); return $jws->addSignature($signature, $protectedHeader, $encodedProtectedHeader); } catch (Throwable $throwable) { diff --git a/src/Component/Signature/Serializer/JSONFlattenedSerializer.php b/src/Component/Signature/Serializer/JSONFlattenedSerializer.php index 9409e874..fc79cb4c 100644 --- a/src/Component/Signature/Serializer/JSONFlattenedSerializer.php +++ b/src/Component/Signature/Serializer/JSONFlattenedSerializer.php @@ -2,15 +2,6 @@ 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\Serializer; use function count; @@ -36,27 +27,22 @@ public function name(): string public function serialize(JWS $jws, ?int $signatureIndex = null): string { - if (null === $signatureIndex) { + if ($signatureIndex === null) { $signatureIndex = 0; } $signature = $jws->getSignature($signatureIndex); $data = []; - $values = [ - 'payload' => $jws->getEncodedPayload(), - 'protected' => $signature->getEncodedProtectedHeader(), - 'header' => $signature->getHeader(), - ]; $encodedPayload = $jws->getEncodedPayload(); - if (null !== $encodedPayload && '' !== $encodedPayload) { + if ($encodedPayload !== null && $encodedPayload !== '') { $data['payload'] = $encodedPayload; } $encodedProtectedHeader = $signature->getEncodedProtectedHeader(); - if (null !== $encodedProtectedHeader && '' !== $encodedProtectedHeader) { + if ($encodedProtectedHeader !== null && $encodedProtectedHeader !== '') { $data['protected'] = $encodedProtectedHeader; } $header = $signature->getHeader(); - if (0 !== count($header)) { + if (count($header) !== 0) { $data['header'] = $header; } $data['signature'] = Base64UrlSafe::encodeUnpadded($signature->getSignature()); @@ -64,17 +50,13 @@ public function serialize(JWS $jws, ?int $signatureIndex = null): string return JsonConverter::encode($data); } - /** - * @throws InvalidArgumentException if the input is not supported - * @throws InvalidArgumentException if the JWS header is invalid - */ public function unserialize(string $input): JWS { $data = JsonConverter::decode($input); - if (!is_array($data)) { + if (! is_array($data)) { throw new InvalidArgumentException('Unsupported input.'); } - if (!isset($data['signature'])) { + if (! isset($data['signature'])) { throw new InvalidArgumentException('Unsupported input.'); } $signature = Base64UrlSafe::decode($data['signature']); @@ -87,7 +69,7 @@ public function unserialize(string $input): JWS $protectedHeader = []; } if (isset($data['header'])) { - if (!is_array($data['header'])) { + if (! is_array($data['header'])) { throw new InvalidArgumentException('Bad header.'); } $header = $data['header']; @@ -97,13 +79,15 @@ public function unserialize(string $input): JWS if (isset($data['payload'])) { $encodedPayload = $data['payload']; - $payload = $this->isPayloadEncoded($protectedHeader) ? Base64UrlSafe::decode($encodedPayload) : $encodedPayload; + $payload = $this->isPayloadEncoded($protectedHeader) ? Base64UrlSafe::decode( + $encodedPayload + ) : $encodedPayload; } else { $payload = null; $encodedPayload = null; } - $jws = new JWS($payload, $encodedPayload, null === $encodedPayload); + $jws = new JWS($payload, $encodedPayload, $encodedPayload === null); return $jws->addSignature($signature, $protectedHeader, $encodedProtectedHeader, $header); } diff --git a/src/Component/Signature/Serializer/JSONGeneralSerializer.php b/src/Component/Signature/Serializer/JSONGeneralSerializer.php index 8f32051f..11f09bd9 100644 --- a/src/Component/Signature/Serializer/JSONGeneralSerializer.php +++ b/src/Component/Signature/Serializer/JSONGeneralSerializer.php @@ -2,15 +2,6 @@ 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\Serializer; use function array_key_exists; @@ -37,32 +28,31 @@ public function name(): string return self::NAME; } - /** - * @throws LogicException if no signature is attached - */ public function serialize(JWS $jws, ?int $signatureIndex = null): string { - if (0 === $jws->countSignatures()) { + if ($jws->countSignatures() === 0) { throw new LogicException('No signature.'); } $data = []; $this->checkPayloadEncoding($jws); - if (false === $jws->isPayloadDetached()) { + if ($jws->isPayloadDetached() === false) { $data['payload'] = $jws->getEncodedPayload(); } $data['signatures'] = []; foreach ($jws->getSignatures() as $signature) { - $tmp = ['signature' => Base64UrlSafe::encodeUnpadded($signature->getSignature())]; + $tmp = [ + 'signature' => Base64UrlSafe::encodeUnpadded($signature->getSignature()), + ]; $values = [ 'protected' => $signature->getEncodedProtectedHeader(), 'header' => $signature->getHeader(), ]; foreach ($values as $key => $value) { - if ((is_string($value) && '' !== $value) || (is_array($value) && 0 !== count($value))) { + if ((is_string($value) && $value !== '') || (is_array($value) && count($value) !== 0)) { $tmp[$key] = $value; } } @@ -72,13 +62,10 @@ public function serialize(JWS $jws, ?int $signatureIndex = null): string return JsonConverter::encode($data); } - /** - * @throws InvalidArgumentException if the input is not supported - */ public function unserialize(string $input): JWS { $data = JsonConverter::decode($input); - if (!isset($data['signatures'])) { + if (! isset($data['signatures'])) { throw new InvalidArgumentException('Unsupported input.'); } @@ -86,7 +73,7 @@ public function unserialize(string $input): JWS $rawPayload = $data['payload'] ?? null; $signatures = []; foreach ($data['signatures'] as $signature) { - if (!isset($signature['signature'])) { + if (! isset($signature['signature'])) { throw new InvalidArgumentException('Unsupported input.'); } [$encodedProtectedHeader, $protectedHeader, $header] = $this->processHeaders($signature); @@ -113,12 +100,9 @@ public function unserialize(string $input): JWS return $jws; } - /** - * @throws InvalidArgumentException if the payload encoding is invalid - */ private function processIsPayloadEncoded(?bool $isPayloadEncoded, array $protectedHeader): bool { - if (null === $isPayloadEncoded) { + if ($isPayloadEncoded === null) { return $this->isPayloadEncoded($protectedHeader); } if ($this->isPayloadEncoded($protectedHeader) !== $isPayloadEncoded) { @@ -131,7 +115,9 @@ private function processIsPayloadEncoded(?bool $isPayloadEncoded, array $protect private function processHeaders(array $signature): array { $encodedProtectedHeader = $signature['protected'] ?? null; - $protectedHeader = null === $encodedProtectedHeader ? [] : JsonConverter::decode(Base64UrlSafe::decode($encodedProtectedHeader)); + $protectedHeader = $encodedProtectedHeader === null ? [] : JsonConverter::decode( + Base64UrlSafe::decode($encodedProtectedHeader) + ); $header = array_key_exists('header', $signature) ? $signature['header'] : []; return [$encodedProtectedHeader, $protectedHeader, $header]; @@ -139,14 +125,13 @@ private function processHeaders(array $signature): array private function processPayload(?string $rawPayload, ?bool $isPayloadEncoded): ?string { - if (null === $rawPayload) { + if ($rawPayload === null) { return null; } - return false === $isPayloadEncoded ? $rawPayload : Base64UrlSafe::decode($rawPayload); + return $isPayloadEncoded === false ? $rawPayload : Base64UrlSafe::decode($rawPayload); } - // @throws LogicException if the payload encoding is invalid private function checkPayloadEncoding(JWS $jws): void { if ($jws->isPayloadDetached()) { @@ -154,10 +139,10 @@ private function checkPayloadEncoding(JWS $jws): void } $is_encoded = null; foreach ($jws->getSignatures() as $signature) { - if (null === $is_encoded) { + if ($is_encoded === null) { $is_encoded = $this->isPayloadEncoded($signature->getProtectedHeader()); } - if (false === $jws->isPayloadDetached()) { + if ($jws->isPayloadDetached() === false) { if ($is_encoded !== $this->isPayloadEncoded($signature->getProtectedHeader())) { throw new LogicException('Foreign payload encoding detected.'); } diff --git a/src/Component/Signature/Serializer/JWSSerializer.php b/src/Component/Signature/Serializer/JWSSerializer.php index c2edd373..d53e84cf 100644 --- a/src/Component/Signature/Serializer/JWSSerializer.php +++ b/src/Component/Signature/Serializer/JWSSerializer.php @@ -2,15 +2,6 @@ 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\Serializer; use Jose\Component\Signature\JWS; diff --git a/src/Component/Signature/Serializer/JWSSerializerManager.php b/src/Component/Signature/Serializer/JWSSerializerManager.php index 1d991518..f6ad4707 100644 --- a/src/Component/Signature/Serializer/JWSSerializerManager.php +++ b/src/Component/Signature/Serializer/JWSSerializerManager.php @@ -2,15 +2,6 @@ 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\Serializer; use InvalidArgumentException; @@ -21,7 +12,7 @@ class JWSSerializerManager /** * @var JWSSerializer[] */ - private $serializers = []; + private array $serializers = []; /** * @param JWSSerializer[] $serializers @@ -43,12 +34,10 @@ public function list(): array /** * Converts a JWS into a string. - * - * @throws InvalidArgumentException if the serializer is not supported */ public function serialize(string $name, JWS $jws, ?int $signatureIndex = null): string { - if (!isset($this->serializers[$name])) { + if (! isset($this->serializers[$name])) { throw new InvalidArgumentException(sprintf('Unsupported serializer "%s".', $name)); } @@ -59,9 +48,7 @@ public function serialize(string $name, JWS $jws, ?int $signatureIndex = null): * Loads data and return a JWS object. * * @param string $input A string that represents a JWS - * @param null|string $name the name of the serializer if the input is unserialized - * - * @throws InvalidArgumentException if the input is not supported + * @param string|null $name the name of the serializer if the input is unserialized */ public function unserialize(string $input, ?string &$name = null): JWS { @@ -71,7 +58,7 @@ public function unserialize(string $input, ?string &$name = null): JWS $name = $serializer->name(); return $jws; - } catch (InvalidArgumentException $e) { + } catch (InvalidArgumentException) { continue; } } diff --git a/src/Component/Signature/Serializer/JWSSerializerManagerFactory.php b/src/Component/Signature/Serializer/JWSSerializerManagerFactory.php index 7e346eed..51322640 100644 --- a/src/Component/Signature/Serializer/JWSSerializerManagerFactory.php +++ b/src/Component/Signature/Serializer/JWSSerializerManagerFactory.php @@ -2,15 +2,6 @@ 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\Serializer; use InvalidArgumentException; @@ -24,14 +15,12 @@ class JWSSerializerManagerFactory /** * @param string[] $names - * - * @throws InvalidArgumentException if the serializer is not supported */ public function create(array $names): JWSSerializerManager { $serializers = []; foreach ($names as $name) { - if (!isset($this->serializers[$name])) { + if (! isset($this->serializers[$name])) { throw new InvalidArgumentException(sprintf('Unsupported serializer "%s".', $name)); } $serializers[] = $this->serializers[$name]; diff --git a/src/Component/Signature/Serializer/Serializer.php b/src/Component/Signature/Serializer/Serializer.php index 48a11477..05b35587 100644 --- a/src/Component/Signature/Serializer/Serializer.php +++ b/src/Component/Signature/Serializer/Serializer.php @@ -2,15 +2,6 @@ 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\Serializer; use function array_key_exists; @@ -19,6 +10,6 @@ abstract class Serializer implements JWSSerializer { protected function isPayloadEncoded(array $protectedHeader): bool { - return !array_key_exists('b64', $protectedHeader) || true === $protectedHeader['b64']; + return ! array_key_exists('b64', $protectedHeader) || $protectedHeader['b64'] === true; } } diff --git a/src/Component/Signature/Signature.php b/src/Component/Signature/Signature.php index fa0006d0..325f1424 100644 --- a/src/Component/Signature/Signature.php +++ b/src/Component/Signature/Signature.php @@ -2,15 +2,6 @@ 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; use function array_key_exists; @@ -18,10 +9,7 @@ class Signature { - /** - * @var null|string - */ - private $encodedProtectedHeader; + private ?string $encodedProtectedHeader; /** * @var array @@ -33,16 +21,14 @@ class Signature */ private $header; - /** - * @var string - */ - private $signature; - - public function __construct(string $signature, array $protectedHeader, ?string $encodedProtectedHeader, array $header) - { - $this->protectedHeader = null === $encodedProtectedHeader ? [] : $protectedHeader; + public function __construct( + private string $signature, + array $protectedHeader, + ?string $encodedProtectedHeader, + array $header + ) { + $this->protectedHeader = $encodedProtectedHeader === null ? [] : $protectedHeader; $this->encodedProtectedHeader = $encodedProtectedHeader; - $this->signature = $signature; $this->header = $header; } @@ -75,9 +61,7 @@ public function getEncodedProtectedHeader(): ?string * * @param string $key The key * - * @throws InvalidArgumentException if the header parameter does not exist - * - * @return null|mixed Header value + * @return mixed|null Header value */ public function getProtectedHeaderParameter(string $key) { @@ -103,7 +87,7 @@ public function hasProtectedHeaderParameter(string $key): bool * * @param string $key The key * - * @return null|mixed Header value + * @return mixed|null Header value */ public function getHeaderParameter(string $key) { diff --git a/src/Easy/AbstractBuilder.php b/src/Easy/AbstractBuilder.php index 94d962af..f8edb771 100644 --- a/src/Easy/AbstractBuilder.php +++ b/src/Easy/AbstractBuilder.php @@ -2,33 +2,20 @@ 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; use InvalidArgumentException; use function is_string; use Jose\Component\Core\Algorithm as JoseAlgorithm; -use Jose\Component\Signature\Algorithm; abstract class AbstractBuilder { - /** - * @var JWT - */ - protected $jwt; + protected JWT $jwt; /** * @var JoseAlgorithm[] */ - protected $algorithms = []; + protected array $algorithms = []; public function __construct() { @@ -88,12 +75,7 @@ public function nbf(?int $nbf = null, bool $inHeader = false): self return $this->claim('nbf', $nbf, $inHeader); } - /** - * @param Algorithm\SignatureAlgorithm|string $alg - * - * @throws InvalidArgumentException if the algorithm is not a string or an instance of Jose\Component\Core\Algorithm - */ - public function alg($alg): self + public function alg(JoseAlgorithm|string $alg): self { $clone = clone $this; @@ -110,7 +92,9 @@ public function alg($alg): self break; default: - throw new InvalidArgumentException('Invalid parameter "alg". Shall be a string or an algorithm instance.'); + throw new InvalidArgumentException( + 'Invalid parameter "alg". Shall be a string or an algorithm instance.' + ); } return $clone; @@ -131,9 +115,6 @@ public function crit(array $crit): self return $this->header('crit', $crit); } - /** - * @param mixed $value - */ public function claim(string $key, $value, bool $inHeader = false): self { $clone = clone $this; @@ -145,9 +126,6 @@ public function claim(string $key, $value, bool $inHeader = false): self return $clone; } - /** - * @param mixed $value - */ public function header(string $key, $value): self { $clone = clone $this; diff --git a/src/Easy/AbstractLoader.php b/src/Easy/AbstractLoader.php index 7e041c05..eb933409 100644 --- a/src/Easy/AbstractLoader.php +++ b/src/Easy/AbstractLoader.php @@ -2,15 +2,6 @@ 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; use function in_array; @@ -20,50 +11,49 @@ use function is_int; use function is_string; use Jose\Component\Checker; +use Jose\Component\Checker\AudienceChecker; +use Jose\Component\Checker\ClaimChecker; +use Jose\Component\Checker\ExpirationTimeChecker; +use Jose\Component\Checker\HeaderChecker; +use Jose\Component\Checker\IssuedAtChecker; +use Jose\Component\Checker\IssuerChecker; +use Jose\Component\Checker\NotBeforeChecker; use Jose\Component\Core\Algorithm; use Jose\Component\Core\JWK; use Jose\Component\Core\JWKSet; abstract class AbstractLoader { - /** - * @var string - */ - protected $token; - - /** - * @var JWKSet - */ - protected $jwkset; + protected JWKSet $jwkset; /** * @var Checker\HeaderChecker[] */ - protected $headerCheckers = []; + protected array $headerCheckers = []; /** * @var Checker\ClaimChecker[] */ - protected $claimCheckers = []; + protected array $claimCheckers = []; /** * @var string[] */ - protected $allowedAlgorithms = []; + protected array $allowedAlgorithms = []; /** * @var Algorithm[] */ - protected $algorithms = []; + protected array $algorithms = []; /** * @var string[] */ - protected $mandatoryClaims = []; + protected array $mandatoryClaims = []; - protected function __construct(string $token) - { - $this->token = $token; + protected function __construct( + protected string $token + ) { $this->jwkset = new JWKSet([]); $this->claimCheckers = []; @@ -85,12 +75,12 @@ public function mandatory(array $mandatoryClaims): self public function aud(string $aud, bool $inHeader = false): self { - return $this->claim('aud', new Checker\AudienceChecker($aud, true), $inHeader); + return $this->claim('aud', new AudienceChecker($aud, true), $inHeader); } public function iss(string $iss, bool $inHeader = false): self { - return $this->claim('iss', new Checker\IssuerChecker([$iss], true), $inHeader); + return $this->claim('iss', new IssuerChecker([$iss], true), $inHeader); } public function jti(string $jti, bool $inHeader = false): self @@ -104,19 +94,19 @@ public function sub(string $sub, bool $inHeader = false): self } /** - * @param null|array|callable|Checker\ClaimChecker|mixed $checker + * @param array|callable|Checker\ClaimChecker|mixed|null $checker */ public function claim(string $key, $checker, bool $inHeader = false): self { $clone = clone $this; - if (false === $checker) { + if ($checker === false) { unset($clone->claimCheckers[$key]); return $clone; } switch (true) { - case $checker instanceof Checker\ClaimChecker: + case $checker instanceof ClaimChecker: break; case is_callable($checker): @@ -125,12 +115,16 @@ public function claim(string $key, $checker, bool $inHeader = false): self break; case is_array($checker): - $checker = new CallableChecker($key, static function ($value) use ($checker): bool {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): bool {return $value === $checker; }); + $checker = new CallableChecker($key, static function ($value) use ($checker): bool { + return $value === $checker; + }); } $clone->claimCheckers[$key] = $checker; @@ -141,72 +135,58 @@ public function claim(string $key, $checker, bool $inHeader = false): self return $clone; } - /** - * @param false|int $leeway - * - * @throws InvalidArgumentException if the leeway is negative, not an integer or not false - */ - public function exp($leeway = 0, bool $inHeader = false): self + public function exp(int|false $leeway = 0, bool $inHeader = false): self { - if (false === $leeway) { + if ($leeway === false) { $clone = clone $this; unset($clone->claimCheckers['exp']); return $clone; } - if (!is_int($leeway) or $leeway < 0) { - throw new InvalidArgumentException('First parameter for "exp" claim is invalid. Set false to disable or a positive integer.'); + if (! is_int($leeway) || $leeway < 0) { + throw new InvalidArgumentException( + 'First parameter for "exp" claim is invalid. Set false to disable or a positive integer.' + ); } - return $this->claim('exp', new Checker\ExpirationTimeChecker($leeway), $inHeader); + return $this->claim('exp', new ExpirationTimeChecker($leeway), $inHeader); } - /** - * @param false|int $leeway - * - * @throws InvalidArgumentException if the leeway is negative, not an integer or not false - */ - public function nbf($leeway = 0, bool $inHeader = false): self + public function nbf(int|false $leeway = 0, bool $inHeader = false): self { - if (false === $leeway) { + if ($leeway === false) { $clone = clone $this; unset($clone->claimCheckers['nbf']); return $clone; } - if (!is_int($leeway) or $leeway < 0) { - throw new InvalidArgumentException('First parameter for "nbf" claim is invalid. Set false to disable or a positive integer.'); + if (! is_int($leeway) || $leeway < 0) { + throw new InvalidArgumentException( + 'First parameter for "nbf" claim is invalid. Set false to disable or a positive integer.' + ); } - return $this->claim('nbf', new Checker\NotBeforeChecker($leeway, true), $inHeader); + return $this->claim('nbf', new NotBeforeChecker($leeway, true), $inHeader); } - /** - * @param false|int $leeway - * - * @throws InvalidArgumentException if the leeway is negative, not an integer or not false - */ - public function iat($leeway = 0, bool $inHeader = false): self + public function iat(int|false $leeway = 0, bool $inHeader = false): self { - if (false === $leeway) { + if ($leeway === false) { $clone = clone $this; unset($clone->claimCheckers['iat']); return $clone; } - if (!is_int($leeway) or $leeway < 0) { - throw new InvalidArgumentException('First parameter for "iat" claim is invalid. Set false to disable or a positive integer.'); + if (! is_int($leeway) || $leeway < 0) { + throw new InvalidArgumentException( + 'First parameter for "iat" claim is invalid. Set false to disable or a positive integer.' + ); } - return $this->claim('iat', new Checker\IssuedAtChecker($leeway, true), $inHeader); + return $this->claim('iat', new IssuedAtChecker($leeway, true), $inHeader); } - /** - * @param Algorithm|string $alg - * - * @throws InvalidArgumentException if the algorithm is not a string or an instance of Jose\Component\Core\Algorithm - */ - public function alg($alg): self + public function alg(Algorithm|string $alg): self { $clone = clone $this; @@ -223,7 +203,9 @@ public function alg($alg): self return $clone; default: - throw new InvalidArgumentException('Invalid parameter "alg". Shall be a string or an algorithm instance.'); + throw new InvalidArgumentException( + 'Invalid parameter "alg". Shall be a string or an algorithm instance.' + ); } } @@ -246,14 +228,14 @@ public function algs($algs): self public function header(string $key, $checker): self { $clone = clone $this; - if (false === $checker) { + if ($checker === false) { unset($clone->headerCheckers[$key]); return $clone; } switch (true) { - case $checker instanceof Checker\HeaderChecker: + case $checker instanceof HeaderChecker: break; case is_callable($checker): @@ -262,12 +244,16 @@ public function header(string $key, $checker): self break; case is_array($checker): - $checker = new CallableChecker($key, static function ($value) use ($checker): bool {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): bool {return $value === $checker; }); + $checker = new CallableChecker($key, static function ($value) use ($checker): bool { + return $value === $checker; + }); } $clone->headerCheckers[$key] = $checker; diff --git a/src/Easy/AlgorithmProvider.php b/src/Easy/AlgorithmProvider.php index 3509a7eb..29235123 100644 --- a/src/Easy/AlgorithmProvider.php +++ b/src/Easy/AlgorithmProvider.php @@ -2,15 +2,6 @@ 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; use Jose\Component\Core\Algorithm; @@ -21,12 +12,12 @@ final class AlgorithmProvider /** * @var string[] */ - private $algorithmClasses; + private array $algorithmClasses; /** * @var Algorithm[] */ - private $algorithms = []; + private array $algorithms = []; public function __construct(array $algorithmClasses) { @@ -51,7 +42,7 @@ private function addClass(string $algorithmClass): void if (class_exists($algorithmClass)) { try { $this->algorithms[] = new $algorithmClass(); - } catch (Throwable $throwable) { + } catch (Throwable) { //does nothing } } diff --git a/src/Easy/Build.php b/src/Easy/Build.php index c5971d73..2f6b7074 100644 --- a/src/Easy/Build.php +++ b/src/Easy/Build.php @@ -2,15 +2,6 @@ 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; class Build diff --git a/src/Easy/CallableChecker.php b/src/Easy/CallableChecker.php index 739f66ad..928a0ee8 100644 --- a/src/Easy/CallableChecker.php +++ b/src/Easy/CallableChecker.php @@ -2,15 +2,6 @@ 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; use Jose\Component\Checker\ClaimChecker; @@ -20,32 +11,23 @@ final class CallableChecker implements ClaimChecker, HeaderChecker { - /** - * @var string - */ - private $key; - /** * @var callable */ private $callable; - public function __construct(string $key, callable $callable) - { - $this->key = $key; + public function __construct( + private string $key, + callable $callable + ) { $this->callable = $callable; } - /** - * @param mixed $value - * - * @throws InvalidClaimException if the claim is invalid - */ public function checkClaim($value): void { $callable = $this->callable; $isValid = $callable($value); - if (!$isValid) { + if (! $isValid) { throw new InvalidClaimException(sprintf('Invalid claim "%s"', $this->key), $this->key, $value); } } @@ -62,7 +44,7 @@ public function checkHeader($value): void { $callable = $this->callable; $isValid = $callable($value); - if (!$isValid) { + if (! $isValid) { throw new InvalidHeaderException(sprintf('Invalid header "%s"', $this->key), $this->key, $value); } } diff --git a/src/Easy/ContentEncryptionAlgorithmChecker.php b/src/Easy/ContentEncryptionAlgorithmChecker.php index c7606cf5..0bf6c5f6 100644 --- a/src/Easy/ContentEncryptionAlgorithmChecker.php +++ b/src/Easy/ContentEncryptionAlgorithmChecker.php @@ -2,15 +2,6 @@ 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; use function in_array; @@ -19,43 +10,31 @@ use Jose\Component\Checker\InvalidHeaderException; /** - * This class is a header parameter checker. - * When the "enc" header parameter is present, it will check if the value is within the allowed ones. + * This class is a header parameter checker. When the "enc" header parameter is present, it will check if the value is + * within the allowed ones. */ final class ContentEncryptionAlgorithmChecker implements HeaderChecker { private const HEADER_NAME = 'enc'; - /** - * @var bool - */ - private $protectedHeader = false; - - /** - * @var string[] - */ - private $supportedAlgorithms; - /** * @param string[] $supportedAlgorithms */ - public function __construct(array $supportedAlgorithms, bool $protectedHeader = false) - { - $this->supportedAlgorithms = $supportedAlgorithms; - $this->protectedHeader = $protectedHeader; + public function __construct( + private array $supportedAlgorithms, + private bool $protectedHeader = false + ) { } /** * {@inheritdoc} - * - * @throws InvalidHeaderException if the header is invalid */ public function checkHeader($value): void { - if (!is_string($value)) { + if (! is_string($value)) { throw new InvalidHeaderException('"enc" must be a string.', self::HEADER_NAME, $value); } - if (!in_array($value, $this->supportedAlgorithms, true)) { + if (! in_array($value, $this->supportedAlgorithms, true)) { throw new InvalidHeaderException('Unsupported algorithm.', self::HEADER_NAME, $value); } } diff --git a/src/Easy/Decrypt.php b/src/Easy/Decrypt.php index 9c03de93..7a36a3c4 100644 --- a/src/Easy/Decrypt.php +++ b/src/Easy/Decrypt.php @@ -2,26 +2,40 @@ 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; use function count; use InvalidArgumentException; use function is_string; -use Jose\Component\Checker; +use Jose\Component\Checker\AlgorithmChecker; +use Jose\Component\Checker\ClaimCheckerManager; +use Jose\Component\Checker\HeaderCheckerManager; use Jose\Component\Core\Algorithm; use Jose\Component\Core\AlgorithmManager; use Jose\Component\Core\Util\JsonConverter; -use Jose\Component\Encryption\Algorithm\ContentEncryption; -use Jose\Component\Encryption\Algorithm\KeyEncryption; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192CBCHS384; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CBCHS512; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\Dir; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS256A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS384A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS512A256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSA15; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP256; use Jose\Component\Encryption\Compression\CompressionMethod; use Jose\Component\Encryption\Compression\CompressionMethodManager; use Jose\Component\Encryption\Compression\Deflate; @@ -34,18 +48,17 @@ class Decrypt extends AbstractLoader /** * @var string[] */ - protected $allowedContentEncryptionAlgorithms = []; + protected array $allowedContentEncryptionAlgorithms = []; + /** * @var CompressionMethod[] */ - private $compressionMethods; + private array $compressionMethods; private function __construct(string $token) { parent::__construct($token); - $this->compressionMethods = [ - new Deflate(), - ]; + $this->compressionMethods = [new Deflate()]; } public static function token(string $token): self @@ -53,12 +66,7 @@ public static function token(string $token): self return new self($token); } - /** - * @param Algorithm|string $enc - * - * @throws InvalidArgumentException if the encryption algorithm is invalid - */ - public function enc($enc): self + public function enc(Algorithm|string $enc): self { $clone = clone $this; @@ -75,7 +83,9 @@ public function enc($enc): self return $clone; default: - throw new InvalidArgumentException('Invalid parameter "enc". Shall be a string or an algorithm instance.'); + throw new InvalidArgumentException( + 'Invalid parameter "enc". Shall be a string or an algorithm instance.' + ); } } @@ -94,14 +104,17 @@ public function encs($encs): self public function run(): JWT { - if (0 !== count($this->allowedAlgorithms)) { - $this->headerCheckers[] = new Checker\AlgorithmChecker($this->allowedAlgorithms, true); + if (count($this->allowedAlgorithms) !== 0) { + $this->headerCheckers[] = new AlgorithmChecker($this->allowedAlgorithms, true); } - if (0 !== count($this->allowedContentEncryptionAlgorithms)) { - $this->headerCheckers[] = new ContentEncryptionAlgorithmChecker($this->allowedContentEncryptionAlgorithms, true); + if (count($this->allowedContentEncryptionAlgorithms) !== 0) { + $this->headerCheckers[] = new ContentEncryptionAlgorithmChecker( + $this->allowedContentEncryptionAlgorithms, + true + ); } $jwe = (new CompactSerializer())->unserialize($this->token); - $headerChecker = new Checker\HeaderCheckerManager($this->headerCheckers, [new JWETokenSupport()]); + $headerChecker = new HeaderCheckerManager($this->headerCheckers, [new JWETokenSupport()]); $headerChecker->check($jwe, 0); $verifier = new JWEDecrypter( @@ -115,7 +128,7 @@ public function run(): JWT $jwt->header->replace($jwe->getSharedProtectedHeader()); $jwt->claims->replace(JsonConverter::decode($jwe->getPayload())); - $claimChecker = new Checker\ClaimCheckerManager($this->claimCheckers); + $claimChecker = new ClaimCheckerManager($this->claimCheckers); $claimChecker->check($jwt->claims->all(), $this->mandatoryClaims); return $jwt; @@ -124,29 +137,29 @@ public function run(): JWT protected function getAlgorithmMap(): array { return [ - 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, + A128GCMKW::class, + A192GCMKW::class, + A256GCMKW::class, + A128KW::class, + A192KW::class, + A256KW::class, + Dir::class, + ECDHES::class, + ECDHESA128KW::class, + ECDHESA192KW::class, + ECDHESA256KW::class, + PBES2HS256A128KW::class, + PBES2HS384A192KW::class, + PBES2HS512A256KW::class, + RSA15::class, + RSAOAEP::class, + RSAOAEP256::class, + A128GCM::class, + A192GCM::class, + A256GCM::class, + A128CBCHS256::class, + A192CBCHS384::class, + A256CBCHS512::class, ]; } } diff --git a/src/Easy/JWEBuilder.php b/src/Easy/JWEBuilder.php index ca4554c8..24aa8079 100644 --- a/src/Easy/JWEBuilder.php +++ b/src/Easy/JWEBuilder.php @@ -2,25 +2,38 @@ 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; use InvalidArgumentException; use function is_string; use Jose\Component\Core\Algorithm; +use Jose\Component\Core\Algorithm as JoseAlgorithm; use Jose\Component\Core\AlgorithmManager; use Jose\Component\Core\JWK; use Jose\Component\Core\Util\JsonConverter; -use Jose\Component\Encryption\Algorithm\ContentEncryption; -use Jose\Component\Encryption\Algorithm\KeyEncryption; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192CBCHS384; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CBCHS512; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\Dir; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS256A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS384A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS512A256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSA15; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP256; use Jose\Component\Encryption\Compression\CompressionMethod; use Jose\Component\Encryption\Compression\CompressionMethodManager; use Jose\Component\Encryption\Compression\Deflate; @@ -29,31 +42,29 @@ class JWEBuilder extends AbstractBuilder { + /** + * @var JoseAlgorithm[] + */ + protected array $contentEncryptionAlgorithms = []; + /** * @var CompressionMethod[] */ - private $compressionMethods; + private array $compressionMethods; public function __construct() { parent::__construct(); - $this->compressionMethods = [ - new Deflate(), - ]; + $this->compressionMethods = [new Deflate()]; } - /** - * @param Algorithm|string $enc - * - * @throws InvalidArgumentException if the header parameter "enc" is invalid - */ - public function enc($enc): self + public function enc(Algorithm|string $enc): self { $clone = clone $this; switch (true) { case $enc instanceof Algorithm: - $clone->algorithms[] = $enc; + $clone->contentEncryptionAlgorithms[] = $enc; $clone->jwt->header->set('enc', $enc->name()); break; @@ -70,12 +81,7 @@ public function enc($enc): self return $clone; } - /** - * @param CompressionMethod|string $zip - * - * @throws InvalidArgumentException if the header parameter "zip" is invalid - */ - public function zip($zip): self + public function zip(CompressionMethod|string $zip): self { $clone = clone $this; @@ -102,7 +108,7 @@ public function encrypt(JWK $jwk): string { $builder = new JoseBuilder( new AlgorithmManager($this->algorithms), - new AlgorithmManager($this->algorithms), + new AlgorithmManager($this->contentEncryptionAlgorithms), new CompressionMethodManager($this->compressionMethods) ); $jwe = $builder @@ -119,29 +125,29 @@ public function encrypt(JWK $jwk): string protected function getAlgorithmMap(): array { return [ - 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, + A128GCMKW::class, + A192GCMKW::class, + A256GCMKW::class, + A128KW::class, + A192KW::class, + A256KW::class, + Dir::class, + ECDHES::class, + ECDHESA128KW::class, + ECDHESA192KW::class, + ECDHESA256KW::class, + PBES2HS256A128KW::class, + PBES2HS384A192KW::class, + PBES2HS512A256KW::class, + RSA15::class, + RSAOAEP::class, + RSAOAEP256::class, + A128GCM::class, + A192GCM::class, + A256GCM::class, + A128CBCHS256::class, + A192CBCHS384::class, + A256CBCHS512::class, ]; } } diff --git a/src/Easy/JWSBuilder.php b/src/Easy/JWSBuilder.php index 4f5c2f15..891a5277 100644 --- a/src/Easy/JWSBuilder.php +++ b/src/Easy/JWSBuilder.php @@ -2,21 +2,24 @@ 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; use Jose\Component\Core\AlgorithmManager; use Jose\Component\Core\JWK; use Jose\Component\Core\Util\JsonConverter; -use Jose\Component\Signature\Algorithm; +use Jose\Component\Signature\Algorithm\EdDSA; +use Jose\Component\Signature\Algorithm\ES256; +use Jose\Component\Signature\Algorithm\ES384; +use Jose\Component\Signature\Algorithm\ES512; +use Jose\Component\Signature\Algorithm\HS256; +use Jose\Component\Signature\Algorithm\HS384; +use Jose\Component\Signature\Algorithm\HS512; +use Jose\Component\Signature\Algorithm\PS256; +use Jose\Component\Signature\Algorithm\PS384; +use Jose\Component\Signature\Algorithm\PS512; +use Jose\Component\Signature\Algorithm\RS256; +use Jose\Component\Signature\Algorithm\RS384; +use Jose\Component\Signature\Algorithm\RS512; use Jose\Component\Signature\JWSBuilder as JoseBuilder; use Jose\Component\Signature\Serializer\CompactSerializer; @@ -38,19 +41,19 @@ public function sign(JWK $jwk): string protected function getAlgorithmMap(): array { return [ - 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, + HS256::class, + HS384::class, + HS512::class, + RS256::class, + RS384::class, + RS512::class, + PS256::class, + PS384::class, + PS512::class, + ES256::class, + ES384::class, + ES512::class, + EdDSA::class, ]; } } diff --git a/src/Easy/JWT.php b/src/Easy/JWT.php index c5f92355..6d58e214 100644 --- a/src/Easy/JWT.php +++ b/src/Easy/JWT.php @@ -2,28 +2,13 @@ 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; final class JWT { - /** - * @var ParameterBag - */ - public $claims; + public ParameterBag $claims; - /** - * @var ParameterBag - */ - public $header; + public ParameterBag $header; public function __construct() { diff --git a/src/Easy/Load.php b/src/Easy/Load.php index 5245ef6b..1d22a0b8 100644 --- a/src/Easy/Load.php +++ b/src/Easy/Load.php @@ -2,15 +2,6 @@ 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; class Load diff --git a/src/Easy/ParameterBag.php b/src/Easy/ParameterBag.php index e957a927..e919b54d 100644 --- a/src/Easy/ParameterBag.php +++ b/src/Easy/ParameterBag.php @@ -2,15 +2,6 @@ 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; use function array_key_exists; @@ -28,16 +19,13 @@ class ParameterBag implements IteratorAggregate, Countable */ private $parameters = []; - /** - * @return mixed - */ public function __call(string $name, array $arguments) { if (method_exists($this, $name)) { return call_user_func_array([$this, $name], $arguments); } - if (0 === count($arguments)) { + if (count($arguments) === 0) { return $this->get($name); } array_unshift($arguments, $name); @@ -60,27 +48,19 @@ public function replace(array $parameters): void $this->parameters = $parameters; } - /** - * @throws InvalidArgumentException if the parameters are invalid - */ public function add(array $parameters): void { - /** @var null|array $replaced */ + /** @var array|null $replaced */ $replaced = array_replace($this->parameters, $parameters); - if (null === $replaced) { + if ($replaced === null) { throw new InvalidArgumentException('Invalid parameters'); } $this->parameters = $replaced; } - /** - * @throws InvalidArgumentException if the selected parameter is missing - * - * @return mixed - */ public function get(string $key) { - if (!array_key_exists($key, $this->parameters)) { + if (! array_key_exists($key, $this->parameters)) { throw new InvalidArgumentException(sprintf('Parameter "%s" is missing', $key)); } diff --git a/src/Easy/Validate.php b/src/Easy/Validate.php index 0b3736a8..25c19658 100644 --- a/src/Easy/Validate.php +++ b/src/Easy/Validate.php @@ -2,23 +2,28 @@ 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; use function count; use Exception; -use Jose\Component\Checker; +use Jose\Component\Checker\AlgorithmChecker; +use Jose\Component\Checker\ClaimCheckerManager; +use Jose\Component\Checker\HeaderCheckerManager; use Jose\Component\Core\AlgorithmManager; use Jose\Component\Core\Util\JsonConverter; -use Jose\Component\Signature\Algorithm; +use Jose\Component\Signature\Algorithm\EdDSA; +use Jose\Component\Signature\Algorithm\ES256; +use Jose\Component\Signature\Algorithm\ES384; +use Jose\Component\Signature\Algorithm\ES512; +use Jose\Component\Signature\Algorithm\HS256; +use Jose\Component\Signature\Algorithm\HS384; +use Jose\Component\Signature\Algorithm\HS512; +use Jose\Component\Signature\Algorithm\PS256; +use Jose\Component\Signature\Algorithm\PS384; +use Jose\Component\Signature\Algorithm\PS512; +use Jose\Component\Signature\Algorithm\RS256; +use Jose\Component\Signature\Algorithm\RS384; +use Jose\Component\Signature\Algorithm\RS512; use Jose\Component\Signature\JWSTokenSupport; use Jose\Component\Signature\JWSVerifier; use Jose\Component\Signature\Serializer\CompactSerializer; @@ -32,15 +37,15 @@ public static function token(string $token): self public function run(): JWT { - if (0 !== count($this->allowedAlgorithms)) { - $this->headerCheckers[] = new Checker\AlgorithmChecker($this->allowedAlgorithms, true); + if (count($this->allowedAlgorithms) !== 0) { + $this->headerCheckers[] = new AlgorithmChecker($this->allowedAlgorithms, true); } $jws = (new CompactSerializer())->unserialize($this->token); - $headerChecker = new Checker\HeaderCheckerManager($this->headerCheckers, [new JWSTokenSupport()]); + $headerChecker = new HeaderCheckerManager($this->headerCheckers, [new JWSTokenSupport()]); $headerChecker->check($jws, 0); $verifier = new JWSVerifier(new AlgorithmManager($this->algorithms)); - if (!$verifier->verifyWithKeySet($jws, $this->jwkset, 0)) { + if (! $verifier->verifyWithKeySet($jws, $this->jwkset, 0)) { throw new Exception('Invalid signature'); } @@ -48,7 +53,7 @@ public function run(): JWT $jwt->header->replace($jws->getSignature(0)->getProtectedHeader()); $jwt->claims->replace(JsonConverter::decode($jws->getPayload())); - $claimChecker = new Checker\ClaimCheckerManager($this->claimCheckers); + $claimChecker = new ClaimCheckerManager($this->claimCheckers); $claimChecker->check($jwt->claims->all(), $this->mandatoryClaims); return $jwt; @@ -57,19 +62,19 @@ public function run(): JWT protected function getAlgorithmMap(): array { return [ - 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, + HS256::class, + HS384::class, + HS512::class, + RS256::class, + RS384::class, + RS512::class, + PS256::class, + PS384::class, + PS512::class, + ES256::class, + ES384::class, + ES512::class, + EdDSA::class, ]; } } diff --git a/src/Ecc/Curve.php b/src/Ecc/Curve.php index 1df9aee1..7e2a9942 100644 --- a/src/Ecc/Curve.php +++ b/src/Ecc/Curve.php @@ -2,67 +2,32 @@ 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\Core\Util\Ecc; use Brick\Math\BigInteger; -use function is_null; use RuntimeException; +use const STR_PAD_LEFT; +use Stringable; /** * @internal */ -class Curve +final class Curve implements Stringable { - /** - * Elliptic curve over the field of integers modulo a prime. - * - * @var BigInteger - */ - private $a; - - /** - * @var BigInteger - */ - private $b; - - /** - * @var BigInteger - */ - private $prime; - - /** - * Binary length of keys associated with these curve parameters. - * - * @var int - */ - private $size; - - /** - * @var Point - */ - private $generator; - - public function __construct(int $size, BigInteger $prime, BigInteger $a, BigInteger $b, Point $generator) - { - $this->size = $size; - $this->prime = $prime; - $this->a = $a; - $this->b = $b; - $this->generator = $generator; + public function __construct( + private int $size, + private BigInteger $prime, + private BigInteger $a, + private BigInteger $b, + private Point $generator + ) { } public function __toString(): string { - return 'curve('.Math::toString($this->getA()).', '.Math::toString($this->getB()).', '.Math::toString($this->getPrime()).')'; + return 'curve(' . Math::toString($this->getA()) . ', ' . Math::toString($this->getB()) . ', ' . Math::toString( + $this->getPrime() + ) . ')'; } public function getA(): BigInteger @@ -85,18 +50,19 @@ public function getSize(): int return $this->size; } - /** - * @throws RuntimeException if the curve does not contain the point - */ public function getPoint(BigInteger $x, BigInteger $y, ?BigInteger $order = null): Point { - if (!$this->contains($x, $y)) { - throw new RuntimeException('Curve '.$this->__toString().' does not contain point ('.Math::toString($x).', '.Math::toString($y).')'); + if (! $this->contains($x, $y)) { + throw new RuntimeException('Curve ' . $this->__toString() . ' does not contain point (' . Math::toString( + $x + ) . ', ' . Math::toString( + $y + ) . ')'); } $point = Point::create($x, $y, $order); - if (!is_null($order)) { + if ($order !== null) { $mul = $this->mul($point, $order); - if (!$mul->isInfinity()) { + if (! $mul->isInfinity()) { throw new RuntimeException('SELF * ORDER MUST EQUAL INFINITY.'); } } @@ -104,13 +70,13 @@ public function getPoint(BigInteger $x, BigInteger $y, ?BigInteger $order = null return $point; } - /** - * @throws RuntimeException if the coordinates are out of range - */ public function getPublicKeyFrom(BigInteger $x, BigInteger $y): PublicKey { $zero = BigInteger::zero(); - if ($x->compareTo($zero) < 0 || $y->compareTo($zero) < 0 || $this->generator->getOrder()->compareTo($x) <= 0 || $this->generator->getOrder()->compareTo($y) <= 0) { + if ($x->compareTo($zero) < 0 || $y->compareTo($zero) < 0 || $this->generator->getOrder()->compareTo( + $x + ) <= 0 || $this->generator->getOrder() + ->compareTo($y) <= 0) { throw new RuntimeException('Generator point has x and y out of range.'); } $point = $this->getPoint($x, $y); @@ -123,13 +89,7 @@ public function contains(BigInteger $x, BigInteger $y): bool return Math::equals( ModularArithmetic::sub( $y->power(2), - Math::add( - Math::add( - $x->power(3), - $this->getA()->multipliedBy($x) - ), - $this->getB() - ), + Math::add(Math::add($x->power(3), $this->getA()->multipliedBy($x)), $this->getB()), $this->getPrime() ), BigInteger::zero() @@ -155,16 +115,14 @@ public function add(Point $one, Point $two): Point } $slope = ModularArithmetic::div( - $two->getY()->minus($one->getY()), - $two->getX()->minus($one->getX()), + $two->getY() + ->minus($one->getY()), + $two->getX() + ->minus($one->getX()), $this->getPrime() ); - $xR = ModularArithmetic::sub( - $slope->power(2)->minus($one->getX()), - $two->getX(), - $this->getPrime() - ); + $xR = ModularArithmetic::sub($slope->power(2)->minus($one->getX()), $two->getX(), $this->getPrime()); $yR = ModularArithmetic::sub( $slope->multipliedBy($one->getX()->minus($xR)), @@ -192,10 +150,7 @@ public function mul(Point $one, BigInteger $n): Point } /** @var Point[] $r */ - $r = [ - Point::infinity(), - clone $one, - ]; + $r = [Point::infinity(), clone $one]; $k = $this->getSize(); $n1 = str_pad(Math::baseConvert(Math::toString($n), 10, 2), $k, '0', STR_PAD_LEFT); @@ -213,24 +168,22 @@ public function mul(Point $one, BigInteger $n): Point return $r[0]; } - /** - * @param Curve $other - */ public function cmp(self $other): int { - $equal = $this->getA()->isEqualTo($other->getA()) - && $this->getB()->isEqualTo($other->getB()) - && $this->getPrime()->isEqualTo($other->getPrime()); + $equal = $this->getA() + ->isEqualTo($other->getA()) + && $this->getB() + ->isEqualTo($other->getB()) + && $this->getPrime() + ->isEqualTo($other->getPrime()) + ; return $equal ? 0 : 1; } - /** - * @param Curve $other - */ public function equals(self $other): bool { - return 0 === $this->cmp($other); + return $this->cmp($other) === 0; } public function getDouble(Point $point): Point @@ -280,12 +233,9 @@ public function getGenerator(): Point return $this->generator; } - /** - * @throws RuntimeException if the point is invalid - */ private function validate(Point $point): void { - if (!$point->isInfinity() && !$this->contains($point->getX(), $point->getY())) { + if (! $point->isInfinity() && ! $this->contains($point->getX(), $point->getY())) { throw new RuntimeException('Invalid point'); } } @@ -314,7 +264,7 @@ private function bnNumBits(BigInteger $x): int return 0; } $log2 = 0; - while (!$x->isEqualTo($zero)) { + while (! $x->isEqualTo($zero)) { $x = $x->shiftedRight(1); ++$log2; } diff --git a/src/Ecc/EcDH.php b/src/Ecc/EcDH.php index 16a366dc..8e7760b4 100644 --- a/src/Ecc/EcDH.php +++ b/src/Ecc/EcDH.php @@ -2,15 +2,6 @@ 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\Core\Util\Ecc; use Brick\Math\BigInteger; @@ -42,10 +33,12 @@ /** * @internal */ -class EcDH +final class EcDH { public static function computeSharedKey(Curve $curve, PublicKey $publicKey, PrivateKey $privateKey): BigInteger { - return $curve->mul($publicKey->getPoint(), $privateKey->getSecret())->getX(); + return $curve->mul($publicKey->getPoint(), $privateKey->getSecret()) + ->getX() + ; } } diff --git a/src/Ecc/Math.php b/src/Ecc/Math.php index 23d9ed60..645bba54 100644 --- a/src/Ecc/Math.php +++ b/src/Ecc/Math.php @@ -2,15 +2,6 @@ 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\Core\Util\Ecc; use Brick\Math\BigInteger; @@ -19,7 +10,7 @@ /** * @internal */ -class Math +final class Math { public static function equals(BigInteger $first, BigInteger $other): bool { diff --git a/src/Ecc/ModularArithmetic.php b/src/Ecc/ModularArithmetic.php index 99805a30..7990231f 100644 --- a/src/Ecc/ModularArithmetic.php +++ b/src/Ecc/ModularArithmetic.php @@ -2,15 +2,6 @@ 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\Core\Util\Ecc; use Brick\Math\BigInteger; @@ -18,16 +9,20 @@ /** * @internal */ -class ModularArithmetic +final class ModularArithmetic { public static function sub(BigInteger $minuend, BigInteger $subtrahend, BigInteger $modulus): BigInteger { - return $minuend->minus($subtrahend)->mod($modulus); + return $minuend->minus($subtrahend) + ->mod($modulus) + ; } public static function mul(BigInteger $multiplier, BigInteger $muliplicand, BigInteger $modulus): BigInteger { - return $multiplier->multipliedBy($muliplicand)->mod($modulus); + return $multiplier->multipliedBy($muliplicand) + ->mod($modulus) + ; } public static function div(BigInteger $dividend, BigInteger $divisor, BigInteger $modulus): BigInteger diff --git a/src/Ecc/NistCurve.php b/src/Ecc/NistCurve.php index 5702237b..190fbcff 100644 --- a/src/Ecc/NistCurve.php +++ b/src/Ecc/NistCurve.php @@ -2,47 +2,31 @@ 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\Core\Util\Ecc; use Brick\Math\BigInteger; /** - * ********************************************************************* * Copyright (C) 2012 Matyas Danter. * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to the following conditions: * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the + * Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES - * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * *********************************************************************** + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @internal */ -class NistCurve +final class NistCurve { /** * Returns an NIST P-256 curve. @@ -65,12 +49,30 @@ public static function curve256(): Curve */ public static function curve384(): Curve { - $p = BigInteger::fromBase('fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff', 16); - $a = BigInteger::fromBase('fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc', 16); - $b = BigInteger::fromBase('b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef', 16); - $x = BigInteger::fromBase('aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7', 16); - $y = BigInteger::fromBase('3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f', 16); - $n = BigInteger::fromBase('ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973', 16); + $p = BigInteger::fromBase( + 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff', + 16 + ); + $a = BigInteger::fromBase( + 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc', + 16 + ); + $b = BigInteger::fromBase( + 'b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef', + 16 + ); + $x = BigInteger::fromBase( + 'aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7', + 16 + ); + $y = BigInteger::fromBase( + '3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f', + 16 + ); + $n = BigInteger::fromBase( + 'ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973', + 16 + ); $generator = Point::create($x, $y, $n); return new Curve(384, $p, $a, $b, $generator); @@ -81,12 +83,30 @@ public static function curve384(): Curve */ public static function curve521(): Curve { - $p = BigInteger::fromBase('000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16); - $a = BigInteger::fromBase('000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc', 16); - $b = BigInteger::fromBase('00000051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00', 16); - $x = BigInteger::fromBase('000000c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66', 16); - $y = BigInteger::fromBase('0000011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650', 16); - $n = BigInteger::fromBase('000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409', 16); + $p = BigInteger::fromBase( + '000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + 16 + ); + $a = BigInteger::fromBase( + '000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc', + 16 + ); + $b = BigInteger::fromBase( + '00000051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00', + 16 + ); + $x = BigInteger::fromBase( + '000000c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66', + 16 + ); + $y = BigInteger::fromBase( + '0000011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650', + 16 + ); + $n = BigInteger::fromBase( + '000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409', + 16 + ); $generator = Point::create($x, $y, $n); return new Curve(521, $p, $a, $b, $generator); diff --git a/src/Ecc/Point.php b/src/Ecc/Point.php index 64a5d6f1..9d5aba34 100644 --- a/src/Ecc/Point.php +++ b/src/Ecc/Point.php @@ -2,74 +2,39 @@ 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\Core\Util\Ecc; use Brick\Math\BigInteger; +use const STR_PAD_LEFT; /** - * ********************************************************************* * Copyright (C) 2012 Matyas Danter. * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to the following conditions: * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the + * Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES - * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * *********************************************************************** + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @internal */ -class Point +final class Point { - /** - * @var BigInteger - */ - private $x; - - /** - * @var BigInteger - */ - private $y; - - /** - * @var BigInteger - */ - private $order; - - /** - * @var bool - */ - private $infinity = false; - - private function __construct(BigInteger $x, BigInteger $y, BigInteger $order, bool $infinity = false) - { - $this->x = $x; - $this->y = $y; - $this->order = $order; - $this->infinity = $infinity; + private function __construct( + private BigInteger $x, + private BigInteger $y, + private BigInteger $order, + private bool $infinity = false + ) { } public static function create(BigInteger $x, BigInteger $y, ?BigInteger $order = null): self @@ -131,8 +96,14 @@ private static function cswapBigInteger(BigInteger &$sa, BigInteger &$sb, int $c $mask = BigInteger::fromBase($mask, 2); $taA = $sa->and($mask); $taB = $sb->and($mask); - $sa = $sa->xor($sb)->xor($taB); - $sb = $sa->xor($sb)->xor($taA); - $sa = $sa->xor($sb)->xor($taB); + $sa = $sa->xor($sb) + ->xor($taB) + ; + $sb = $sa->xor($sb) + ->xor($taA) + ; + $sa = $sa->xor($sb) + ->xor($taB) + ; } } diff --git a/src/Ecc/PrivateKey.php b/src/Ecc/PrivateKey.php index 88ecfc13..f5e4992d 100644 --- a/src/Ecc/PrivateKey.php +++ b/src/Ecc/PrivateKey.php @@ -2,56 +2,35 @@ 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\Core\Util\Ecc; use Brick\Math\BigInteger; /** - * ********************************************************************* * Copyright (C) 2012 Matyas Danter. * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to the following conditions: * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the + * Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES - * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * *********************************************************************** + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @internal */ -class PrivateKey +final class PrivateKey { - /** - * @var BigInteger - */ - private $secret; - - private function __construct(BigInteger $secret) - { - $this->secret = $secret; + private function __construct( + private BigInteger $secret + ) { } public static function create(BigInteger $secret): self diff --git a/src/Ecc/PublicKey.php b/src/Ecc/PublicKey.php index b0ea43ef..d8469d0a 100644 --- a/src/Ecc/PublicKey.php +++ b/src/Ecc/PublicKey.php @@ -2,54 +2,33 @@ 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\Core\Util\Ecc; /** - * ********************************************************************* * Copyright (C) 2012 Matyas Danter. * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to the following conditions: * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the + * Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES - * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * *********************************************************************** + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @internal */ -class PublicKey +final class PublicKey { - /** - * @var Point - */ - private $point; - - public function __construct(Point $point) - { - $this->point = $point; + public function __construct( + private Point $point + ) { } public function getPoint(): Point diff --git a/src/Ecc/composer.json b/src/Ecc/composer.json index 56099cee..51186ca9 100644 --- a/src/Ecc/composer.json +++ b/src/Ecc/composer.json @@ -20,7 +20,7 @@ } }, "require": { - "brick/math": "^0.8.17|^0.9" + "brick/math": "^0.9" }, "suggest": { "ext-gmp": "GMP or BCMath is highly recommended to improve the library performance", diff --git a/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A128CBCHS256.php b/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A128CBCHS256.php index 8496c1e6..0554a52b 100644 --- a/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A128CBCHS256.php +++ b/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A128CBCHS256.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A128CBCHS256 extends AESCBCHS diff --git a/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A192CBCHS384.php b/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A192CBCHS384.php index 34443430..c45e1694 100644 --- a/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A192CBCHS384.php +++ b/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A192CBCHS384.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A192CBCHS384 extends AESCBCHS diff --git a/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A256CBCHS512.php b/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A256CBCHS512.php index c8dbc0b2..1eb0541d 100644 --- a/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A256CBCHS512.php +++ b/src/EncryptionAlgorithm/ContentEncryption/AESCBC/A256CBCHS512.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A256CBCHS512 extends AESCBCHS diff --git a/src/EncryptionAlgorithm/ContentEncryption/AESCBC/AESCBCHS.php b/src/EncryptionAlgorithm/ContentEncryption/AESCBC/AESCBCHS.php index 996bf77a..90ee8497 100644 --- a/src/EncryptionAlgorithm/ContentEncryption/AESCBC/AESCBCHS.php +++ b/src/EncryptionAlgorithm/ContentEncryption/AESCBC/AESCBCHS.php @@ -2,18 +2,10 @@ 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\Encryption\Algorithm\ContentEncryption; use Jose\Component\Encryption\Algorithm\ContentEncryptionAlgorithm; +use const OPENSSL_RAW_DATA; use ParagonIE\ConstantTime\Base64UrlSafe; use RuntimeException; @@ -24,14 +16,17 @@ public function allowedKeyTypes(): array return []; //Irrelevant } - /** - * @throws RuntimeException if the data cannot be encrypted - */ - public function encryptContent(string $data, string $cek, string $iv, ?string $aad, string $encoded_protected_header, ?string &$tag = null): string - { + public function encryptContent( + string $data, + string $cek, + string $iv, + ?string $aad, + string $encoded_protected_header, + ?string &$tag = null + ): string { $k = mb_substr($cek, $this->getCEKSize() / 16, null, '8bit'); $result = openssl_encrypt($data, $this->getMode(), $k, OPENSSL_RAW_DATA, $iv); - if (false === $result) { + if ($result === false) { throw new RuntimeException('Unable to encrypt the content'); } @@ -40,18 +35,21 @@ public function encryptContent(string $data, string $cek, string $iv, ?string $a return $result; } - /** - * @throws RuntimeException if the data cannot be decrypted - */ - public function decryptContent(string $data, string $cek, string $iv, ?string $aad, string $encoded_protected_header, string $tag): string - { - if (!$this->isTagValid($data, $cek, $iv, $aad, $encoded_protected_header, $tag)) { + public function decryptContent( + string $data, + string $cek, + string $iv, + ?string $aad, + string $encoded_protected_header, + string $tag + ): string { + if (! $this->isTagValid($data, $cek, $iv, $aad, $encoded_protected_header, $tag)) { throw new RuntimeException('Unable to decrypt or to verify the tag.'); } $k = mb_substr($cek, $this->getCEKSize() / 16, null, '8bit'); $result = openssl_decrypt($data, $this->getMode(), $k, OPENSSL_RAW_DATA, $iv); - if (false === $result) { + if ($result === false) { throw new RuntimeException('Unable to decrypt or to verify the tag.'); } @@ -63,11 +61,16 @@ public function getIVSize(): int return 128; } - protected function calculateAuthenticationTag(string $encrypted_data, string $cek, string $iv, ?string $aad, string $encoded_header): string - { + protected function calculateAuthenticationTag( + string $encrypted_data, + string $cek, + string $iv, + ?string $aad, + string $encoded_header + ): string { $calculated_aad = $encoded_header; - if (null !== $aad) { - $calculated_aad .= '.'.Base64UrlSafe::encodeUnpadded($aad); + if ($aad !== null) { + $calculated_aad .= '.' . Base64UrlSafe::encodeUnpadded($aad); } $mac_key = mb_substr($cek, 0, $this->getCEKSize() / 16, '8bit'); $auth_data_length = mb_strlen($encoded_header, '8bit'); @@ -83,9 +86,18 @@ protected function calculateAuthenticationTag(string $encrypted_data, string $ce return mb_substr($hash, 0, mb_strlen($hash, '8bit') / 2, '8bit'); } - protected function isTagValid(string $encrypted_data, string $cek, string $iv, ?string $aad, string $encoded_header, string $authentication_tag): bool - { - return hash_equals($authentication_tag, $this->calculateAuthenticationTag($encrypted_data, $cek, $iv, $aad, $encoded_header)); + protected function isTagValid( + string $encrypted_data, + string $cek, + string $iv, + ?string $aad, + string $encoded_header, + string $authentication_tag + ): bool { + return hash_equals( + $authentication_tag, + $this->calculateAuthenticationTag($encrypted_data, $cek, $iv, $aad, $encoded_header) + ); } abstract protected function getHashAlgorithm(): string; diff --git a/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A128GCM.php b/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A128GCM.php index accc772e..03f3b990 100644 --- a/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A128GCM.php +++ b/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A128GCM.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A128GCM extends AESGCM diff --git a/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A192GCM.php b/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A192GCM.php index ac617ea4..74ba68e1 100644 --- a/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A192GCM.php +++ b/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A192GCM.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A192GCM extends AESGCM diff --git a/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A256GCM.php b/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A256GCM.php index 8f385a5a..6c9e9d23 100644 --- a/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A256GCM.php +++ b/src/EncryptionAlgorithm/ContentEncryption/AESGCM/A256GCM.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A256GCM extends AESGCM diff --git a/src/EncryptionAlgorithm/ContentEncryption/AESGCM/AESGCM.php b/src/EncryptionAlgorithm/ContentEncryption/AESGCM/AESGCM.php index e413197a..9437f976 100644 --- a/src/EncryptionAlgorithm/ContentEncryption/AESGCM/AESGCM.php +++ b/src/EncryptionAlgorithm/ContentEncryption/AESGCM/AESGCM.php @@ -2,18 +2,10 @@ 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\Encryption\Algorithm\ContentEncryption; use Jose\Component\Encryption\Algorithm\ContentEncryptionAlgorithm; +use const OPENSSL_RAW_DATA; use ParagonIE\ConstantTime\Base64UrlSafe; use RuntimeException; @@ -24,36 +16,42 @@ public function allowedKeyTypes(): array return []; //Irrelevant } - /** - * @throws RuntimeException if the CEK cannot be encrypted - */ - public function encryptContent(string $data, string $cek, string $iv, ?string $aad, string $encoded_protected_header, ?string &$tag = null): string - { + public function encryptContent( + string $data, + string $cek, + string $iv, + ?string $aad, + string $encoded_protected_header, + ?string &$tag = null + ): string { $calculated_aad = $encoded_protected_header; - if (null !== $aad) { - $calculated_aad .= '.'.Base64UrlSafe::encodeUnpadded($aad); + if ($aad !== null) { + $calculated_aad .= '.' . Base64UrlSafe::encodeUnpadded($aad); } $tag = ''; $result = openssl_encrypt($data, $this->getMode(), $cek, OPENSSL_RAW_DATA, $iv, $tag, $calculated_aad); - if (false === $result) { + if ($result === false) { throw new RuntimeException('Unable to encrypt the content'); } return $result; } - /** - * @throws RuntimeException if the CEK cannot be decrypted - */ - public function decryptContent(string $data, string $cek, string $iv, ?string $aad, string $encoded_protected_header, string $tag): string - { + public function decryptContent( + string $data, + string $cek, + string $iv, + ?string $aad, + string $encoded_protected_header, + string $tag + ): string { $calculated_aad = $encoded_protected_header; - if (null !== $aad) { - $calculated_aad .= '.'.Base64UrlSafe::encodeUnpadded($aad); + if ($aad !== null) { + $calculated_aad .= '.' . Base64UrlSafe::encodeUnpadded($aad); } $result = openssl_decrypt($data, $this->getMode(), $cek, OPENSSL_RAW_DATA, $iv, $tag, $calculated_aad); - if (false === $result) { + if ($result === false) { throw new RuntimeException('Unable to decrypt the content'); } diff --git a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_16_128.php b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_16_128.php index 9ca8edbc..68c7c54c 100644 --- a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_16_128.php +++ b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_16_128.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A128CCM_16_128 extends AESCCM diff --git a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_16_64.php b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_16_64.php index df9e6923..01249ec2 100644 --- a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_16_64.php +++ b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_16_64.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A128CCM_16_64 extends AESCCM diff --git a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_64_128.php b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_64_128.php index d25441b1..ecb30a95 100644 --- a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_64_128.php +++ b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_64_128.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A128CCM_64_128 extends AESCCM diff --git a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_64_64.php b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_64_64.php index 2928cf81..674b0344 100644 --- a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_64_64.php +++ b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A128CCM_64_64.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A128CCM_64_64 extends AESCCM diff --git a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_16_128.php b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_16_128.php index 6071742e..7f4e2f26 100644 --- a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_16_128.php +++ b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_16_128.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A256CCM_16_128 extends AESCCM diff --git a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_16_64.php b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_16_64.php index c36ecf2e..3626ff94 100644 --- a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_16_64.php +++ b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_16_64.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A256CCM_16_64 extends AESCCM diff --git a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_64_128.php b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_64_128.php index 90b901f8..ce741551 100644 --- a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_64_128.php +++ b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_64_128.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A256CCM_64_128 extends AESCCM diff --git a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_64_64.php b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_64_64.php index 0e71b33d..8abdef69 100644 --- a/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_64_64.php +++ b/src/EncryptionAlgorithm/Experimental/ContentEncryption/A256CCM_64_64.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\ContentEncryption; final class A256CCM_64_64 extends AESCCM diff --git a/src/EncryptionAlgorithm/Experimental/ContentEncryption/AESCCM.php b/src/EncryptionAlgorithm/Experimental/ContentEncryption/AESCCM.php index 8027a2ce..78e7cdab 100644 --- a/src/EncryptionAlgorithm/Experimental/ContentEncryption/AESCCM.php +++ b/src/EncryptionAlgorithm/Experimental/ContentEncryption/AESCCM.php @@ -2,18 +2,10 @@ 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\Encryption\Algorithm\ContentEncryption; use Jose\Component\Encryption\Algorithm\ContentEncryptionAlgorithm; +use const OPENSSL_RAW_DATA; use RuntimeException; abstract class AESCCM implements ContentEncryptionAlgorithm @@ -23,36 +15,51 @@ public function allowedKeyTypes(): array return []; //Irrelevant } - /** - * @throws RuntimeException if the data cannot be encrypted - */ - public function encryptContent(string $data, string $cek, string $iv, ?string $aad, string $encoded_protected_header, ?string &$tag = null): string - { + public function encryptContent( + string $data, + string $cek, + string $iv, + ?string $aad, + string $encoded_protected_header, + ?string &$tag = null + ): string { $calculated_aad = $encoded_protected_header; - if (null !== $aad) { - $calculated_aad .= '.'.$aad; + if ($aad !== null) { + $calculated_aad .= '.' . $aad; } $tag = ''; - $result = openssl_encrypt($data, $this->getMode(), $cek, OPENSSL_RAW_DATA, $iv, $tag, $calculated_aad, $this->getTagLength()); - if (false === $result) { + $result = openssl_encrypt( + $data, + $this->getMode(), + $cek, + OPENSSL_RAW_DATA, + $iv, + $tag, + $calculated_aad, + $this->getTagLength() + ); + if ($result === false) { throw new RuntimeException('Unable to encrypt the content'); } return $result; } - /** - * @throws RuntimeException if the data cannot be decrypted - */ - public function decryptContent(string $data, string $cek, string $iv, ?string $aad, string $encoded_protected_header, string $tag): string - { + public function decryptContent( + string $data, + string $cek, + string $iv, + ?string $aad, + string $encoded_protected_header, + string $tag + ): string { $calculated_aad = $encoded_protected_header; - if (null !== $aad) { - $calculated_aad .= '.'.$aad; + if ($aad !== null) { + $calculated_aad .= '.' . $aad; } $result = openssl_decrypt($data, $this->getMode(), $cek, OPENSSL_RAW_DATA, $iv, $tag, $calculated_aad); - if (false === $result) { + if ($result === false) { throw new RuntimeException('Unable to decrypt the content'); } diff --git a/src/EncryptionAlgorithm/Experimental/KeyEncryption/A128CTR.php b/src/EncryptionAlgorithm/Experimental/KeyEncryption/A128CTR.php index 962c397e..77878538 100644 --- a/src/EncryptionAlgorithm/Experimental/KeyEncryption/A128CTR.php +++ b/src/EncryptionAlgorithm/Experimental/KeyEncryption/A128CTR.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; final class A128CTR extends AESCTR diff --git a/src/EncryptionAlgorithm/Experimental/KeyEncryption/A192CTR.php b/src/EncryptionAlgorithm/Experimental/KeyEncryption/A192CTR.php index 79184f17..2cab2f9d 100644 --- a/src/EncryptionAlgorithm/Experimental/KeyEncryption/A192CTR.php +++ b/src/EncryptionAlgorithm/Experimental/KeyEncryption/A192CTR.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; final class A192CTR extends AESCTR diff --git a/src/EncryptionAlgorithm/Experimental/KeyEncryption/A256CTR.php b/src/EncryptionAlgorithm/Experimental/KeyEncryption/A256CTR.php index 9046c6a7..6550090b 100644 --- a/src/EncryptionAlgorithm/Experimental/KeyEncryption/A256CTR.php +++ b/src/EncryptionAlgorithm/Experimental/KeyEncryption/A256CTR.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; final class A256CTR extends AESCTR diff --git a/src/EncryptionAlgorithm/Experimental/KeyEncryption/AESCTR.php b/src/EncryptionAlgorithm/Experimental/KeyEncryption/AESCTR.php index ded22bb6..dd6e5d4c 100644 --- a/src/EncryptionAlgorithm/Experimental/KeyEncryption/AESCTR.php +++ b/src/EncryptionAlgorithm/Experimental/KeyEncryption/AESCTR.php @@ -2,21 +2,13 @@ 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\Encryption\Algorithm\KeyEncryption; use function in_array; use InvalidArgumentException; use function is_string; use Jose\Component\Core\JWK; +use const OPENSSL_RAW_DATA; use ParagonIE\ConstantTime\Base64UrlSafe; use RuntimeException; @@ -27,9 +19,6 @@ public function allowedKeyTypes(): array return ['oct']; } - /** - * @throws RuntimeException if the CEK cannot be encrypted - */ public function encryptKey(JWK $key, string $cek, array $completeHeader, array &$additionalHeader): string { $k = $this->getKey($key); @@ -39,16 +28,13 @@ public function encryptKey(JWK $key, string $cek, array $completeHeader, array & $additionalHeader['iv'] = Base64UrlSafe::encodeUnpadded($iv); $result = openssl_encrypt($cek, $this->getMode(), $k, OPENSSL_RAW_DATA, $iv); - if (false === $result) { + if ($result === false) { throw new RuntimeException('Unable to encrypt the CEK'); } return $result; } - /** - * @throws RuntimeException if the CEK cannot be decrypted - */ public function decryptKey(JWK $key, string $encrypted_cek, array $header): string { $k = $this->getKey($key); @@ -56,7 +42,7 @@ public function decryptKey(JWK $key, string $encrypted_cek, array $header): stri $iv = Base64UrlSafe::decode($header['iv']); $result = openssl_decrypt($encrypted_cek, $this->getMode(), $k, OPENSSL_RAW_DATA, $iv); - if (false === $result) { + if ($result === false) { throw new RuntimeException('Unable to decrypt the CEK'); } @@ -70,34 +56,28 @@ public function getKeyManagementMode(): string abstract protected function getMode(): string; - /** - * @throws InvalidArgumentException if the key is invalid - */ private function getKey(JWK $key): string { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } - if (!$key->has('k')) { + if (! $key->has('k')) { throw new InvalidArgumentException('The key parameter "k" is missing.'); } $k = $key->get('k'); - if (!is_string($k)) { + if (! is_string($k)) { throw new InvalidArgumentException('The key parameter "k" is invalid.'); } return Base64UrlSafe::decode($k); } - /** - * @throws InvalidArgumentException if the IV is missing or invalid - */ private function checkHeaderAdditionalParameters(array $header): void { - if (!isset($header['iv'])) { + if (! isset($header['iv'])) { throw new InvalidArgumentException('The header parameter "iv" is missing.'); } - if (!is_string($header['iv'])) { + if (! is_string($header['iv'])) { throw new InvalidArgumentException('The header parameter "iv" is not valid.'); } } diff --git a/src/EncryptionAlgorithm/Experimental/KeyEncryption/Chacha20Poly1305.php b/src/EncryptionAlgorithm/Experimental/KeyEncryption/Chacha20Poly1305.php index 334b28a2..6ee72bf2 100644 --- a/src/EncryptionAlgorithm/Experimental/KeyEncryption/Chacha20Poly1305.php +++ b/src/EncryptionAlgorithm/Experimental/KeyEncryption/Chacha20Poly1305.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use function in_array; @@ -18,17 +9,15 @@ use function is_string; use Jose\Component\Core\JWK; use LogicException; +use const OPENSSL_RAW_DATA; use ParagonIE\ConstantTime\Base64UrlSafe; use RuntimeException; final class Chacha20Poly1305 implements KeyEncryption { - /** - * @throws LogicException if the algorithm "chacha20-poly1305" is not supported - */ public function __construct() { - if (!in_array('chacha20-poly1305', openssl_get_cipher_methods(), true)) { + if (! in_array('chacha20-poly1305', openssl_get_cipher_methods(), true)) { throw new LogicException('The algorithm "chacha20-poly1305" is not supported in this platform.'); } } @@ -43,9 +32,6 @@ public function name(): string return 'chacha20-poly1305'; } - /** - * @throws RuntimeException if the CEK cannot be encrypted - */ public function encryptKey(JWK $key, string $cek, array $completeHeader, array &$additionalHeader): string { $k = $this->getKey($key); @@ -55,28 +41,24 @@ public function encryptKey(JWK $key, string $cek, array $completeHeader, array & $additionalHeader['nonce'] = Base64UrlSafe::encodeUnpadded($nonce); $result = openssl_encrypt($cek, 'chacha20-poly1305', $k, OPENSSL_RAW_DATA, $nonce); - if (false === $result) { + if ($result === false) { throw new RuntimeException('Unable to encrypt the CEK'); } return $result; } - /** - * @throws RuntimeException if the CEK cannot be decrypted - * @throws InvalidArgumentException if the header parameter "nonce" is missing or invalid - */ public function decryptKey(JWK $key, string $encrypted_cek, array $header): string { $k = $this->getKey($key); $this->checkHeaderAdditionalParameters($header); $nonce = Base64UrlSafe::decode($header['nonce']); - if (12 !== mb_strlen($nonce, '8bit')) { + if (mb_strlen($nonce, '8bit') !== 12) { throw new InvalidArgumentException('The header parameter "nonce" is not valid.'); } $result = openssl_decrypt($encrypted_cek, 'chacha20-poly1305', $k, OPENSSL_RAW_DATA, $nonce); - if (false === $result) { + if ($result === false) { throw new RuntimeException('Unable to decrypt the CEK'); } @@ -88,34 +70,28 @@ public function getKeyManagementMode(): string return self::MODE_ENCRYPT; } - /** - * @throws InvalidArgumentException if the key is invalid - */ private function getKey(JWK $key): string { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } - if (!$key->has('k')) { + if (! $key->has('k')) { throw new InvalidArgumentException('The key parameter "k" is missing.'); } $k = $key->get('k'); - if (!is_string($k)) { + if (! is_string($k)) { throw new InvalidArgumentException('The key parameter "k" is invalid.'); } return Base64UrlSafe::decode($k); } - /** - * @throws InvalidArgumentException if the header parameter "nonce" is missing or invalid - */ private function checkHeaderAdditionalParameters(array $header): void { - if (!isset($header['nonce'])) { + if (! isset($header['nonce'])) { throw new InvalidArgumentException('The header parameter "nonce" is missing.'); } - if (!is_string($header['nonce'])) { + if (! is_string($header['nonce'])) { throw new InvalidArgumentException('The header parameter "nonce" is not valid.'); } } diff --git a/src/EncryptionAlgorithm/Experimental/KeyEncryption/RSAOAEP384.php b/src/EncryptionAlgorithm/Experimental/KeyEncryption/RSAOAEP384.php index 8a1a1968..70eda945 100644 --- a/src/EncryptionAlgorithm/Experimental/KeyEncryption/RSAOAEP384.php +++ b/src/EncryptionAlgorithm/Experimental/KeyEncryption/RSAOAEP384.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use Jose\Component\Encryption\Algorithm\KeyEncryption\Util\RSACrypt; diff --git a/src/EncryptionAlgorithm/Experimental/KeyEncryption/RSAOAEP512.php b/src/EncryptionAlgorithm/Experimental/KeyEncryption/RSAOAEP512.php index 599e0e9a..37aaf3ec 100644 --- a/src/EncryptionAlgorithm/Experimental/KeyEncryption/RSAOAEP512.php +++ b/src/EncryptionAlgorithm/Experimental/KeyEncryption/RSAOAEP512.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use Jose\Component\Encryption\Algorithm\KeyEncryption\Util\RSACrypt; diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A128GCMKW.php b/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A128GCMKW.php index 6e5eb260..a2163082 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A128GCMKW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A128GCMKW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; final class A128GCMKW extends AESGCMKW diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A192GCMKW.php b/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A192GCMKW.php index ab43a1a1..5f54d3fb 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A192GCMKW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A192GCMKW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; final class A192GCMKW extends AESGCMKW diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A256GCMKW.php b/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A256GCMKW.php index 146c6219..a93caa4f 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A256GCMKW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/A256GCMKW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; final class A256GCMKW extends AESGCMKW diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/AESGCMKW.php b/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/AESGCMKW.php index bfc31873..92b97059 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/AESGCMKW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/AESGCMKW.php @@ -2,22 +2,13 @@ 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\Encryption\Algorithm\KeyEncryption; -use Exception; use function in_array; use InvalidArgumentException; use function is_string; use Jose\Component\Core\JWK; +use const OPENSSL_RAW_DATA; use ParagonIE\ConstantTime\Base64UrlSafe; use RuntimeException; @@ -28,10 +19,6 @@ public function allowedKeyTypes(): array return ['oct']; } - /** - * @throws RuntimeException if the CEK cannot be encrypted - * @throws Exception if the random bytes cannot be generated - */ public function wrapKey(JWK $key, string $cek, array $completeHeader, array &$additionalHeader): string { $kek = $this->getKey($key); @@ -41,7 +28,7 @@ public function wrapKey(JWK $key, string $cek, array $completeHeader, array &$ad $mode = sprintf('aes-%d-gcm', $this->getKeySize()); $tag = ''; $encrypted_cek = openssl_encrypt($cek, $mode, $kek, OPENSSL_RAW_DATA, $iv, $tag, ''); - if (false === $encrypted_cek) { + if ($encrypted_cek === false) { throw new RuntimeException('Unable to encrypt the CEK'); } $additionalHeader['tag'] = Base64UrlSafe::encodeUnpadded($tag); @@ -49,9 +36,6 @@ public function wrapKey(JWK $key, string $cek, array $completeHeader, array &$ad return $encrypted_cek; } - /** - * @throws RuntimeException if the CEK cannot be decrypted - */ public function unwrapKey(JWK $key, string $encrypted_cek, array $completeHeader): string { $kek = $this->getKey($key); @@ -62,7 +46,7 @@ public function unwrapKey(JWK $key, string $encrypted_cek, array $completeHeader $mode = sprintf('aes-%d-gcm', $this->getKeySize()); $cek = openssl_decrypt($encrypted_cek, $mode, $kek, OPENSSL_RAW_DATA, $iv, $tag, ''); - if (false === $cek) { + if ($cek === false) { throw new RuntimeException('Unable to decrypt the CEK'); } @@ -74,32 +58,26 @@ public function getKeyManagementMode(): string return self::MODE_WRAP; } - /** - * @throws InvalidArgumentException if the key is invalid - */ protected function getKey(JWK $key): string { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } - if (!$key->has('k')) { + if (! $key->has('k')) { throw new InvalidArgumentException('The key parameter "k" is missing.'); } $k = $key->get('k'); - if (!is_string($k)) { + if (! is_string($k)) { throw new InvalidArgumentException('The key parameter "k" is invalid.'); } return Base64UrlSafe::decode($k); } - /** - * @throws InvalidArgumentException if the header parameter iv or tag is missing - */ protected function checkAdditionalParameters(array $header): void { foreach (['iv', 'tag'] as $k) { - if (!isset($header[$k])) { + if (! isset($header[$k])) { throw new InvalidArgumentException(sprintf('Parameter "%s" is missing.', $k)); } } diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A128KW.php b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A128KW.php index 0ad3e700..d9c5bad1 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A128KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A128KW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use AESKW\A128KW as Wrapper; @@ -22,7 +13,7 @@ public function name(): string return 'A128KW'; } - protected function getWrapper() + protected function getWrapper(): Wrapper { return new Wrapper(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A192KW.php b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A192KW.php index b22084ea..1e09556b 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A192KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A192KW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use AESKW\A192KW as Wrapper; @@ -22,7 +13,7 @@ public function name(): string return 'A192KW'; } - protected function getWrapper() + protected function getWrapper(): Wrapper { return new Wrapper(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A256KW.php b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A256KW.php index c5deb9ad..2a9908ae 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A256KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A256KW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use AESKW\A256KW as Wrapper; @@ -22,7 +13,7 @@ public function name(): string return 'A256KW'; } - protected function getWrapper() + protected function getWrapper(): Wrapper { return new Wrapper(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESKW/AESKW.php b/src/EncryptionAlgorithm/KeyEncryption/AESKW/AESKW.php index 21fbc24b..6a50fd24 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESKW/AESKW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESKW/AESKW.php @@ -2,17 +2,11 @@ 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\Encryption\Algorithm\KeyEncryption; +use AESKW\A128KW; +use AESKW\A192KW; +use AESKW\A256KW; use function in_array; use InvalidArgumentException; use function is_string; @@ -47,24 +41,18 @@ public function getKeyManagementMode(): string return self::MODE_WRAP; } - /** - * @return \AESKW\A128KW|\AESKW\A192KW|\AESKW\A256KW - */ - abstract protected function getWrapper(); + abstract protected function getWrapper(): A128KW|A192KW|A256KW; - /** - * @throws InvalidArgumentException if the key is invalid - */ private function getKey(JWK $key): string { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } - if (!$key->has('k')) { + if (! $key->has('k')) { throw new InvalidArgumentException('The key parameter "k" is missing.'); } $k = $key->get('k'); - if (!is_string($k)) { + if (! is_string($k)) { throw new InvalidArgumentException('The key parameter "k" is invalid.'); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/Direct/Dir.php b/src/EncryptionAlgorithm/KeyEncryption/Direct/Dir.php index eecf2b1e..6409bb00 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/Direct/Dir.php +++ b/src/EncryptionAlgorithm/KeyEncryption/Direct/Dir.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use function in_array; @@ -21,19 +12,16 @@ final class Dir implements DirectEncryption { - /** - * @throws InvalidArgumentException if the key is invalid - */ public function getCEK(JWK $key): string { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } - if (!$key->has('k')) { + if (! $key->has('k')) { throw new InvalidArgumentException('The key parameter "k" is missing.'); } $k = $key->get('k'); - if (!is_string($k)) { + if (! is_string($k)) { throw new InvalidArgumentException('The key parameter "k" is invalid.'); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHES.php b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHES.php index 1f6bdb80..1d942f2e 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHES.php +++ b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHES.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use function array_key_exists; @@ -38,8 +29,14 @@ public function allowedKeyTypes(): array return ['EC', 'OKP']; } - public function getAgreementKey(int $encryptionKeyLength, string $algorithm, JWK $recipientKey, ?JWK $senderKey, array $complete_header = [], array &$additional_header_values = []): string - { + public function getAgreementKey( + int $encryptionKeyLength, + string $algorithm, + JWK $recipientKey, + ?JWK $senderKey, + array $complete_header = [], + array &$additional_header_values = [] + ): string { if ($recipientKey->has('d')) { [$public_key, $private_key] = $this->getKeysFromPrivateKeyAndHeader($recipientKey, $complete_header); } else { @@ -54,9 +51,6 @@ public function getAgreementKey(int $encryptionKeyLength, string $algorithm, JWK return ConcatKDF::generate($agreed_key, $algorithm, $encryptionKeyLength, $apu, $apv); } - /** - * @throws InvalidArgumentException if the curve is not supported - */ public function calculateAgreementKey(JWK $private_key, JWK $public_key): string { switch ($public_key->get('crv')) { @@ -70,12 +64,12 @@ public function calculateAgreementKey(JWK $private_key, JWK $public_key): string $privatePem = ECKey::convertPrivateKeyToPEM($private_key); $res = openssl_pkey_derive($publicPem, $privatePem, $curve->getSize()); - if (false === $res) { + if ($res === false) { throw new RuntimeException('Unable to derive the key'); } return $res; - } catch (Throwable $throwable) { + } catch (Throwable) { //Does nothing. Will fallback to the pure PHP function } } @@ -111,8 +105,6 @@ public function getKeyManagementMode(): string } /** - * @throws InvalidArgumentException if the curve is not supported - * * @return JWK[] */ private function getKeysFromPublicKey(JWK $recipient_key, array &$additional_header_values): array @@ -137,15 +129,15 @@ private function getKeysFromPublicKey(JWK $recipient_key, array &$additional_hea default: throw new InvalidArgumentException(sprintf('The curve "%s" is not supported', $public_key->get('crv'))); } - $epk = $private_key->toPublic()->all(); + $epk = $private_key->toPublic() + ->all() + ; $additional_header_values['epk'] = $epk; return [$public_key, $private_key]; } /** - * @throws InvalidArgumentException if the curves are different - * * @return JWK[] */ private function getKeysFromPrivateKeyAndHeader(JWK $recipient_key, array $complete_header): array @@ -160,15 +152,12 @@ private function getKeysFromPrivateKeyAndHeader(JWK $recipient_key, array $compl return [$public_key, $private_key]; } - /** - * @throws InvalidArgumentException if the ephemeral public key is missing or invalid - */ private function getPublicKey(array $complete_header): JWK { - if (!isset($complete_header['epk'])) { + if (! isset($complete_header['epk'])) { throw new InvalidArgumentException('The header parameter "epk" is missing.'); } - if (!is_array($complete_header['epk'])) { + if (! is_array($complete_header['epk'])) { throw new InvalidArgumentException('The header parameter "epk" is not an array of parameters'); } $public_key = new JWK($complete_header['epk']); @@ -177,16 +166,13 @@ private function getPublicKey(array $complete_header): JWK return $public_key; } - /** - * @throws InvalidArgumentException if the key is invalid - */ private function checkKey(JWK $key, bool $is_private): void { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } foreach (['x', 'crv'] as $k) { - if (!$key->has($k)) { + if (! $key->has($k)) { throw new InvalidArgumentException(sprintf('The key parameter "%s" is missing.', $k)); } } @@ -195,7 +181,7 @@ private function checkKey(JWK $key, bool $is_private): void case 'P-256': case 'P-384': case 'P-521': - if (!$key->has('y')) { + if (! $key->has('y')) { throw new InvalidArgumentException('The key parameter "y" is missing.'); } @@ -207,44 +193,31 @@ private function checkKey(JWK $key, bool $is_private): void default: throw new InvalidArgumentException(sprintf('The curve "%s" is not supported', $key->get('crv'))); } - if (true === $is_private && !$key->has('d')) { + if ($is_private === true && ! $key->has('d')) { throw new InvalidArgumentException('The key parameter "d" is missing.'); } } - /** - * @throws InvalidArgumentException if the curve is not supported - */ private function getCurve(string $crv): Curve { - switch ($crv) { - case 'P-256': - return NistCurve::curve256(); - - case 'P-384': - return NistCurve::curve384(); - - case 'P-521': - return NistCurve::curve521(); - - default: - throw new InvalidArgumentException(sprintf('The curve "%s" is not supported', $crv)); - } + return match ($crv) { + 'P-256' => NistCurve::curve256(), + 'P-384' => NistCurve::curve384(), + 'P-521' => NistCurve::curve521(), + default => throw new InvalidArgumentException(sprintf('The curve "%s" is not supported', $crv)), + }; } private function convertBase64ToBigInteger(string $value): BigInteger { $data = unpack('H*', Base64UrlSafe::decode($value)); - if (!is_array($data) || !isset($data[1])) { + if (! is_array($data) || ! isset($data[1])) { throw new InvalidArgumentException('Unable to convert base64 to integer'); } return BigInteger::fromBase($data[1], 16); } - /** - * @throws InvalidArgumentException if the data cannot be converted - */ private function convertDecToBin(BigInteger $dec): string { if ($dec->compareTo(BigInteger::zero()) < 0) { @@ -252,12 +225,12 @@ private function convertDecToBin(BigInteger $dec): string } $hex = $dec->toBase(16); - if (0 !== mb_strlen($hex, '8bit') % 2) { - $hex = '0'.$hex; + if (mb_strlen($hex, '8bit') % 2 !== 0) { + $hex = '0' . $hex; } $bin = hex2bin($hex); - if (false === $bin) { + if ($bin === false) { throw new InvalidArgumentException('Unable to convert integer to string'); } @@ -266,8 +239,6 @@ private function convertDecToBin(BigInteger $dec): string /** * @param string $curve The curve - * - * @throws InvalidArgumentException if the curve is not supported */ private function createOKPKey(string $curve): JWK { @@ -300,12 +271,9 @@ private function createOKPKey(string $curve): JWK ]); } - /** - * @throws RuntimeException if the extension "sodium" is not available - */ private function checkSodiumExtensionIsAvailable(): void { - if (!extension_loaded('sodium')) { + if (! extension_loaded('sodium')) { throw new RuntimeException('The extension "sodium" is not available. Please install it to use this method'); } } diff --git a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA128KW.php b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA128KW.php index 8378b73f..8fbacc11 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA128KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA128KW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use AESKW\A128KW as Wrapper; @@ -22,7 +13,7 @@ public function name(): string return 'ECDH-ES+A128KW'; } - protected function getWrapper() + protected function getWrapper(): Wrapper { return new Wrapper(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA192KW.php b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA192KW.php index 32dde770..948c3839 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA192KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA192KW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use AESKW\A192KW as Wrapper; @@ -22,7 +13,7 @@ public function name(): string return 'ECDH-ES+A192KW'; } - protected function getWrapper() + protected function getWrapper(): Wrapper { return new Wrapper(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA256KW.php b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA256KW.php index ace3cc74..367cf448 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA256KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESA256KW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use AESKW\A256KW as Wrapper; @@ -22,7 +13,7 @@ public function name(): string return 'ECDH-ES+A256KW'; } - protected function getWrapper() + protected function getWrapper(): Wrapper { return new Wrapper(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESAESKW.php b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESAESKW.php index 07f92cbc..7e29ced6 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESAESKW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESAESKW.php @@ -2,17 +2,11 @@ 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\Encryption\Algorithm\KeyEncryption; +use AESKW\A128KW; +use AESKW\A192KW; +use AESKW\A256KW; use Jose\Component\Core\JWK; abstract class ECDHESAESKW implements KeyAgreementWithKeyWrapping @@ -22,19 +16,43 @@ public function allowedKeyTypes(): array return ['EC', 'OKP']; } - public function wrapAgreementKey(JWK $recipientKey, ?JWK $senderKey, string $cek, int $encryption_key_length, array $complete_header, array &$additional_header_values): string - { + public function wrapAgreementKey( + JWK $recipientKey, + ?JWK $senderKey, + string $cek, + int $encryption_key_length, + array $complete_header, + array &$additional_header_values + ): string { $ecdh_es = new ECDHES(); - $agreement_key = $ecdh_es->getAgreementKey($this->getKeyLength(), $this->name(), $recipientKey->toPublic(), $senderKey, $complete_header, $additional_header_values); + $agreement_key = $ecdh_es->getAgreementKey( + $this->getKeyLength(), + $this->name(), + $recipientKey->toPublic(), + $senderKey, + $complete_header, + $additional_header_values + ); $wrapper = $this->getWrapper(); return $wrapper::wrap($agreement_key, $cek); } - public function unwrapAgreementKey(JWK $recipientKey, ?JWK $senderKey, string $encrypted_cek, int $encryption_key_length, array $complete_header): string - { + public function unwrapAgreementKey( + JWK $recipientKey, + ?JWK $senderKey, + string $encrypted_cek, + int $encryption_key_length, + array $complete_header + ): string { $ecdh_es = new ECDHES(); - $agreement_key = $ecdh_es->getAgreementKey($this->getKeyLength(), $this->name(), $recipientKey, $senderKey, $complete_header); + $agreement_key = $ecdh_es->getAgreementKey( + $this->getKeyLength(), + $this->name(), + $recipientKey, + $senderKey, + $complete_header + ); $wrapper = $this->getWrapper(); return $wrapper::unwrap($agreement_key, $encrypted_cek); @@ -45,10 +63,7 @@ public function getKeyManagementMode(): string return self::MODE_WRAP; } - /** - * @return \AESKW\A128KW|\AESKW\A192KW|\AESKW\A256KW - */ - abstract protected function getWrapper(); + abstract protected function getWrapper(): A128KW|A192KW|A256KW; abstract protected function getKeyLength(): int; } diff --git a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/Util/ConcatKDF.php b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/Util/ConcatKDF.php index 871395b5..e55e6aa7 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/Util/ConcatKDF.php +++ b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/Util/ConcatKDF.php @@ -2,26 +2,18 @@ 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\Encryption\Algorithm\KeyEncryption\Util; use InvalidArgumentException; use ParagonIE\ConstantTime\Base64UrlSafe; +use const STR_PAD_LEFT; /** * @internal * * @see https://tools.ietf.org/html/rfc7518#section-4.6.2 */ -class ConcatKDF +final class ConcatKDF { /** * Key Derivation Function. @@ -32,16 +24,21 @@ class ConcatKDF * @param string $apu Agreement PartyUInfo (information about the producer) * @param string $apv Agreement PartyVInfo (information about the recipient) */ - public static function generate(string $Z, string $algorithm, int $encryption_key_size, string $apu = '', string $apv = ''): string - { - $apu = !self::isEmpty($apu) ? Base64UrlSafe::decode($apu) : ''; - $apv = !self::isEmpty($apv) ? Base64UrlSafe::decode($apv) : ''; + public static function generate( + string $Z, + string $algorithm, + int $encryption_key_size, + string $apu = '', + string $apv = '' + ): string { + $apu = ! self::isEmpty($apu) ? Base64UrlSafe::decode($apu) : ''; + $apv = ! self::isEmpty($apv) ? Base64UrlSafe::decode($apv) : ''; $encryption_segments = [ self::toInt32Bits(1), // Round number 1 $Z, // Z (shared secret) - self::toInt32Bits(mb_strlen($algorithm, '8bit')).$algorithm, // Size of algorithm's name and algorithm - self::toInt32Bits(mb_strlen($apu, '8bit')).$apu, // PartyUInfo - self::toInt32Bits(mb_strlen($apv, '8bit')).$apv, // PartyVInfo + self::toInt32Bits(mb_strlen($algorithm, '8bit')) . $algorithm, // Size of algorithm's name and algorithm + self::toInt32Bits(mb_strlen($apu, '8bit')) . $apu, // PartyUInfo + self::toInt32Bits(mb_strlen($apv, '8bit')) . $apv, // PartyVInfo self::toInt32Bits($encryption_key_size), // SuppPubInfo (the encryption key size) '', // SuppPrivInfo ]; @@ -60,7 +57,7 @@ public static function generate(string $Z, string $algorithm, int $encryption_ke private static function toInt32Bits(int $value): string { $result = hex2bin(str_pad(dechex($value), 8, '0', STR_PAD_LEFT)); - if (false === $result) { + if ($result === false) { throw new InvalidArgumentException('Invalid result'); } @@ -69,6 +66,6 @@ private static function toInt32Bits(int $value): string private static function isEmpty(?string $value): bool { - return null === $value || '' === $value; + return $value === null || $value === ''; } } diff --git a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2AESKW.php b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2AESKW.php index 2c5a9e48..ce7666da 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2AESKW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2AESKW.php @@ -2,17 +2,11 @@ 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\Encryption\Algorithm\KeyEncryption; +use AESKW\A128KW; +use AESKW\A192KW; +use AESKW\A256KW; use function in_array; use InvalidArgumentException; use function is_int; @@ -22,20 +16,10 @@ abstract class PBES2AESKW implements KeyWrapping { - /** - * @var int - */ - private $salt_size; - - /** - * @var int - */ - private $nb_count; - - public function __construct(int $salt_size = 64, int $nb_count = 4096) - { - $this->salt_size = $salt_size; - $this->nb_count = $nb_count; + public function __construct( + private int $salt_size = 64, + private int $nb_count = 4096 + ) { } public function allowedKeyTypes(): array @@ -56,7 +40,14 @@ public function wrapKey(JWK $key, string $cek, array $completeHeader, array &$ad $additionalHeader['p2s'] = Base64UrlSafe::encodeUnpadded($salt); $additionalHeader['p2c'] = $this->nb_count; - $derived_key = hash_pbkdf2($hash_algorithm, $password, $completeHeader['alg']."\x00".$salt, $this->nb_count, $key_size, true); + $derived_key = hash_pbkdf2( + $hash_algorithm, + $password, + $completeHeader['alg'] . "\x00" . $salt, + $this->nb_count, + $key_size, + true + ); return $wrapper::wrap($derived_key, $cek); } @@ -69,7 +60,7 @@ public function unwrapKey(JWK $key, string $encrypted_cek, array $completeHeader $wrapper = $this->getWrapper(); $hash_algorithm = $this->getHashAlgorithm(); $key_size = $this->getKeySize(); - $salt = $completeHeader['alg']."\x00".Base64UrlSafe::decode($completeHeader['p2s']); + $salt = $completeHeader['alg'] . "\x00" . Base64UrlSafe::decode($completeHeader['p2s']); $count = $completeHeader['p2c']; $derived_key = hash_pbkdf2($hash_algorithm, $password, $salt, $count, $key_size, true); @@ -82,63 +73,49 @@ public function getKeyManagementMode(): string return self::MODE_WRAP; } - /** - * @throws InvalidArgumentException if the key type is invalid - * @throws InvalidArgumentException if the key parameter "k" is missing or invalid - */ protected function getKey(JWK $key): string { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } - if (!$key->has('k')) { + if (! $key->has('k')) { throw new InvalidArgumentException('The key parameter "k" is missing.'); } $k = $key->get('k'); - if (!is_string($k)) { + if (! is_string($k)) { throw new InvalidArgumentException('The key parameter "k" is invalid.'); } return Base64UrlSafe::decode($k); } - /** - * @throws InvalidArgumentException if the header parameter "alg" is missing or invalid - */ protected function checkHeaderAlgorithm(array $header): void { - if (!isset($header['alg'])) { + if (! isset($header['alg'])) { throw new InvalidArgumentException('The header parameter "alg" is missing.'); } - if (!is_string($header['alg'])) { + if (! is_string($header['alg'])) { throw new InvalidArgumentException('The header parameter "alg" is not valid.'); } } - /** - * @throws InvalidArgumentException if the header parameter "p2s" is missing or invalid - * @throws InvalidArgumentException if the header parameter "p2c" is missing or invalid - */ protected function checkHeaderAdditionalParameters(array $header): void { - if (!isset($header['p2s'])) { + if (! isset($header['p2s'])) { throw new InvalidArgumentException('The header parameter "p2s" is missing.'); } - if (!is_string($header['p2s'])) { + if (! is_string($header['p2s'])) { throw new InvalidArgumentException('The header parameter "p2s" is not valid.'); } - if (!isset($header['p2c'])) { + if (! isset($header['p2c'])) { throw new InvalidArgumentException('The header parameter "p2c" is missing.'); } - if (!is_int($header['p2c']) || $header['p2c'] <= 0) { + if (! is_int($header['p2c']) || $header['p2c'] <= 0) { throw new InvalidArgumentException('The header parameter "p2c" is not valid.'); } } - /** - * @return \AESKW\A128KW|\AESKW\A192KW|\AESKW\A256KW - */ - abstract protected function getWrapper(): \AESKW\A256KW|\AESKW\A128KW|\AESKW\A192KW; + abstract protected function getWrapper(): A256KW|A128KW|A192KW; abstract protected function getHashAlgorithm(): string; diff --git a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS256A128KW.php b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS256A128KW.php index 16f94bb9..645ac0f2 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS256A128KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS256A128KW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use AESKW\A128KW as Wrapper; @@ -22,7 +13,7 @@ public function name(): string return 'PBES2-HS256+A128KW'; } - protected function getWrapper() + protected function getWrapper(): Wrapper { return new Wrapper(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS384A192KW.php b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS384A192KW.php index dd849234..018218ea 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS384A192KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS384A192KW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use AESKW\A192KW as Wrapper; @@ -22,7 +13,7 @@ public function name(): string return 'PBES2-HS384+A192KW'; } - protected function getWrapper() + protected function getWrapper(): Wrapper { return new Wrapper(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS512A256KW.php b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS512A256KW.php index 1830a4e3..adf30c15 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS512A256KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2HS512A256KW.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use AESKW\A256KW as Wrapper; diff --git a/src/EncryptionAlgorithm/KeyEncryption/RSA/RSA.php b/src/EncryptionAlgorithm/KeyEncryption/RSA/RSA.php index 015fc728..456d2f5e 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/RSA/RSA.php +++ b/src/EncryptionAlgorithm/KeyEncryption/RSA/RSA.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use function in_array; @@ -34,13 +25,10 @@ public function encryptKey(JWK $key, string $cek, array $completeHeader, array & return RSACrypt::encrypt($pub, $cek, $this->getEncryptionMode(), $this->getHashAlgorithm()); } - /** - * @throws InvalidArgumentException if the key is not private - */ public function decryptKey(JWK $key, string $encrypted_cek, array $header): string { $this->checkKey($key); - if (!$key->has('d')) { + if (! $key->has('d')) { throw new InvalidArgumentException('The key is not a private key'); } $priv = RSAKey::createFromJWK($key); @@ -53,12 +41,9 @@ public function getKeyManagementMode(): string return self::MODE_ENCRYPT; } - /** - * @throws InvalidArgumentException if the key type is not allowed - */ protected function checkKey(JWK $key): void { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } } diff --git a/src/EncryptionAlgorithm/KeyEncryption/RSA/RSA15.php b/src/EncryptionAlgorithm/KeyEncryption/RSA/RSA15.php index 8bfa2584..0480e214 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/RSA/RSA15.php +++ b/src/EncryptionAlgorithm/KeyEncryption/RSA/RSA15.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use Jose\Component\Encryption\Algorithm\KeyEncryption\Util\RSACrypt; diff --git a/src/EncryptionAlgorithm/KeyEncryption/RSA/RSAOAEP.php b/src/EncryptionAlgorithm/KeyEncryption/RSA/RSAOAEP.php index b309661e..6c7ea250 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/RSA/RSAOAEP.php +++ b/src/EncryptionAlgorithm/KeyEncryption/RSA/RSAOAEP.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use Jose\Component\Encryption\Algorithm\KeyEncryption\Util\RSACrypt; diff --git a/src/EncryptionAlgorithm/KeyEncryption/RSA/RSAOAEP256.php b/src/EncryptionAlgorithm/KeyEncryption/RSA/RSAOAEP256.php index d736c925..3169b022 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/RSA/RSAOAEP256.php +++ b/src/EncryptionAlgorithm/KeyEncryption/RSA/RSAOAEP256.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption; use Jose\Component\Encryption\Algorithm\KeyEncryption\Util\RSACrypt; diff --git a/src/EncryptionAlgorithm/KeyEncryption/RSA/Util/RSACrypt.php b/src/EncryptionAlgorithm/KeyEncryption/RSA/Util/RSACrypt.php index 49d290ac..5d19d783 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/RSA/Util/RSACrypt.php +++ b/src/EncryptionAlgorithm/KeyEncryption/RSA/Util/RSACrypt.php @@ -2,15 +2,6 @@ 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\Encryption\Algorithm\KeyEncryption\Util; use function chr; @@ -22,11 +13,12 @@ use Jose\Component\Core\Util\RSAKey; use function ord; use RuntimeException; +use const STR_PAD_LEFT; /** * @internal */ -class RSACrypt +final class RSACrypt { /** * Optimal Asymmetric Encryption Padding (OAEP). @@ -40,30 +32,20 @@ class RSACrypt public static function encrypt(RSAKey $key, string $data, int $mode, ?string $hash = null): string { - switch ($mode) { - case self::ENCRYPTION_OAEP: - return self::encryptWithRSAOAEP($key, $data, $hash); - - case self::ENCRYPTION_PKCS1: - return self::encryptWithRSA15($key, $data); - - default: - throw new InvalidArgumentException('Unsupported mode.'); - } + return match ($mode) { + self::ENCRYPTION_OAEP => self::encryptWithRSAOAEP($key, $data, $hash), + self::ENCRYPTION_PKCS1 => self::encryptWithRSA15($key, $data), + default => throw new InvalidArgumentException('Unsupported mode.'), + }; } public static function decrypt(RSAKey $key, string $plaintext, int $mode, ?string $hash = null): string { - switch ($mode) { - case self::ENCRYPTION_OAEP: - return self::decryptWithRSAOAEP($key, $plaintext, $hash); - - case self::ENCRYPTION_PKCS1: - return self::decryptWithRSA15($key, $plaintext); - - default: - throw new InvalidArgumentException('Unsupported mode.'); - } + return match ($mode) { + self::ENCRYPTION_OAEP => self::decryptWithRSAOAEP($key, $plaintext, $hash), + self::ENCRYPTION_PKCS1 => self::decryptWithRSA15($key, $plaintext), + default => throw new InvalidArgumentException('Unsupported mode.'), + }; } public static function encryptWithRSA15(RSAKey $key, string $data): string @@ -81,7 +63,7 @@ public static function encryptWithRSA15(RSAKey $key, string $data): string $ps .= $temp; } $type = 2; - $data = chr(0).chr($type).$ps.chr(0).$data; + $data = chr(0) . chr($type) . $ps . chr(0) . $data; $data = BigInteger::createFromBinaryString($data); $c = self::getRSAEP($key, $data); @@ -97,7 +79,7 @@ public static function decryptWithRSA15(RSAKey $key, string $c): string $c = BigInteger::createFromBinaryString($c); $m = self::getRSADP($key, $c); $em = self::convertIntegerToOctetString($m, $key->getModulusLength()); - if (0 !== ord($em[0]) || ord($em[1]) > 2) { + if (ord($em[0]) !== 0 || ord($em[1]) > 2) { throw new InvalidArgumentException('Unable to decrypt'); } $ps = mb_substr($em, 2, (int) mb_strpos($em, chr(0), 2, '8bit') - 2, '8bit'); @@ -117,11 +99,11 @@ public static function encryptWithRSAOAEP(RSAKey $key, string $plaintext, string /** @var Hash $hash */ $hash = Hash::$hash_algorithm(); $length = $key->getModulusLength() - 2 * $hash->getLength() - 2; - if (0 >= $length) { + if ($length <= 0) { throw new RuntimeException(); } $plaintext = mb_str_split($plaintext, $length, '8bit'); - if (!is_array($plaintext)) { + if (! is_array($plaintext)) { throw new RuntimeException('Invalid payload'); } $ciphertext = ''; @@ -137,15 +119,20 @@ public static function encryptWithRSAOAEP(RSAKey $key, string $plaintext, string */ public static function decryptWithRSAOAEP(RSAKey $key, string $ciphertext, string $hash_algorithm): string { - if (0 >= $key->getModulusLength()) { + if ($key->getModulusLength() <= 0) { throw new RuntimeException('Invalid modulus length'); } $hash = Hash::$hash_algorithm(); $ciphertext = mb_str_split($ciphertext, $key->getModulusLength(), '8bit'); - if (!is_array($ciphertext)) { + if (! is_array($ciphertext)) { throw new RuntimeException('Invalid ciphertext'); } - $ciphertext[count($ciphertext) - 1] = str_pad($ciphertext[count($ciphertext) - 1], $key->getModulusLength(), chr(0), STR_PAD_LEFT); + $ciphertext[count($ciphertext) - 1] = str_pad( + $ciphertext[count($ciphertext) - 1], + $key->getModulusLength(), + chr(0), + STR_PAD_LEFT + ); $plaintext = ''; foreach ($ciphertext as $c) { $temp = self::getRSAESOAEP($key, $c, $hash); @@ -206,7 +193,7 @@ private static function getMGF1(string $mgfSeed, int $maskLen, Hash $mgfHash): s $count = ceil($maskLen / $mgfHash->getLength()); for ($i = 0; $i < $count; ++$i) { $c = pack('N', $i); - $t .= $mgfHash->hash($mgfSeed.$c); + $t .= $mgfHash->hash($mgfSeed . $c); } return mb_substr($t, 0, $maskLen, '8bit'); @@ -220,13 +207,13 @@ private static function encryptRSAESOAEP(RSAKey $key, string $m, Hash $hash): st $mLen = mb_strlen($m, '8bit'); $lHash = $hash->hash(''); $ps = str_repeat(chr(0), $key->getModulusLength() - $mLen - 2 * $hash->getLength() - 2); - $db = $lHash.$ps.chr(1).$m; + $db = $lHash . $ps . chr(1) . $m; $seed = random_bytes($hash->getLength()); $dbMask = self::getMGF1($seed, $key->getModulusLength() - $hash->getLength() - 1, $hash/*MGF*/); $maskedDB = $db ^ $dbMask; $seedMask = self::getMGF1($maskedDB, $hash->getLength(), $hash/*MGF*/); $maskedSeed = $seed ^ $seedMask; - $em = chr(0).$maskedSeed.$maskedDB; + $em = chr(0) . $maskedSeed . $maskedDB; $m = self::convertOctetStringToInteger($em); $c = self::getRSAEP($key, $m); @@ -251,11 +238,11 @@ private static function getRSAESOAEP(RSAKey $key, string $c, Hash $hash): string $db = $maskedDB ^ $dbMask; $lHash2 = mb_substr($db, 0, $hash->getLength(), '8bit'); $m = mb_substr($db, $hash->getLength(), null, '8bit'); - if (!hash_equals($lHash, $lHash2)) { + if (! hash_equals($lHash, $lHash2)) { throw new RuntimeException(); } $m = ltrim($m, chr(0)); - if (1 !== ord($m[0])) { + if (ord($m[0]) !== 1) { throw new RuntimeException(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/RSA/composer.json b/src/EncryptionAlgorithm/KeyEncryption/RSA/composer.json index 0ad9903e..7b019e78 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/RSA/composer.json +++ b/src/EncryptionAlgorithm/KeyEncryption/RSA/composer.json @@ -20,7 +20,7 @@ } }, "require": { - "brick/math": "^0.8.17|^0.9", + "brick/math": "^0.9", "ext-openssl": "*", "symfony/polyfill-mbstring": "^1.12", "web-token/jwt-encryption": "^2.1" diff --git a/src/SignatureAlgorithm/ECDSA/ECDSA.php b/src/SignatureAlgorithm/ECDSA/ECDSA.php index 75b28a26..e40c0a07 100644 --- a/src/SignatureAlgorithm/ECDSA/ECDSA.php +++ b/src/SignatureAlgorithm/ECDSA/ECDSA.php @@ -2,15 +2,6 @@ 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; use function defined; @@ -26,7 +17,7 @@ abstract class ECDSA implements SignatureAlgorithm { public function __construct() { - if (!defined('OPENSSL_KEYTYPE_EC')) { + if (! defined('OPENSSL_KEYTYPE_EC')) { throw new LogicException('Elliptic Curve key type not supported by your environment.'); } } @@ -39,7 +30,7 @@ public function allowedKeyTypes(): array public function sign(JWK $key, string $input): string { $this->checkKey($key); - if (!$key->has('d')) { + if (! $key->has('d')) { throw new InvalidArgumentException('The EC key is not private'); } $pem = ECKey::convertPrivateKeyToPEM($key); @@ -56,8 +47,8 @@ public function verify(JWK $key, string $input, string $signature): bool $der = ECSignature::toAsn1($signature, $this->getSignaturePartLength()); $pem = ECKey::convertPublicKeyToPEM($key); - return 1 === openssl_verify($input, $der, $pem, $this->getHashAlgorithm()); - } catch (Throwable $e) { + return openssl_verify($input, $der, $pem, $this->getHashAlgorithm()) === 1; + } catch (Throwable) { return false; } } @@ -68,11 +59,11 @@ abstract protected function getSignaturePartLength(): int; private function checkKey(JWK $key): void { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } foreach (['x', 'y', 'crv'] as $k) { - if (!$key->has($k)) { + if (! $key->has($k)) { throw new InvalidArgumentException(sprintf('The key parameter "%s" is missing.', $k)); } } diff --git a/src/SignatureAlgorithm/ECDSA/ES256.php b/src/SignatureAlgorithm/ECDSA/ES256.php index 1999e7d4..926cde02 100644 --- a/src/SignatureAlgorithm/ECDSA/ES256.php +++ b/src/SignatureAlgorithm/ECDSA/ES256.php @@ -2,15 +2,6 @@ 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; final class ES256 extends ECDSA diff --git a/src/SignatureAlgorithm/ECDSA/ES384.php b/src/SignatureAlgorithm/ECDSA/ES384.php index 70dc2347..764a6aed 100644 --- a/src/SignatureAlgorithm/ECDSA/ES384.php +++ b/src/SignatureAlgorithm/ECDSA/ES384.php @@ -2,15 +2,6 @@ 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; final class ES384 extends ECDSA diff --git a/src/SignatureAlgorithm/ECDSA/ES512.php b/src/SignatureAlgorithm/ECDSA/ES512.php index 0039d5e5..70cfee7d 100644 --- a/src/SignatureAlgorithm/ECDSA/ES512.php +++ b/src/SignatureAlgorithm/ECDSA/ES512.php @@ -2,15 +2,6 @@ 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; final class ES512 extends ECDSA diff --git a/src/SignatureAlgorithm/EdDSA/EdDSA.php b/src/SignatureAlgorithm/EdDSA/EdDSA.php index 6a1335c1..390c318a 100644 --- a/src/SignatureAlgorithm/EdDSA/EdDSA.php +++ b/src/SignatureAlgorithm/EdDSA/EdDSA.php @@ -2,15 +2,6 @@ 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; use function extension_loaded; @@ -22,14 +13,9 @@ final class EdDSA implements SignatureAlgorithm { - /** - * EdDSA constructor. - * - * @throws RuntimeException if the extension "sodium" is not available - */ public function __construct() { - if (!extension_loaded('sodium')) { + if (! extension_loaded('sodium')) { throw new RuntimeException('The extension "sodium" is not available. Please install it to use this method'); } } @@ -39,45 +25,32 @@ public function allowedKeyTypes(): array return ['OKP']; } - /** - * @throws InvalidArgumentException if the key is not private - * @throws InvalidArgumentException if the curve is not supported - */ public function sign(JWK $key, string $input): string { $this->checkKey($key); - if (!$key->has('d')) { + if (! $key->has('d')) { throw new InvalidArgumentException('The EC key is not private'); } $x = Base64UrlSafe::decode($key->get('x')); $d = Base64UrlSafe::decode($key->get('d')); - $secret = $d.$x; - - switch ($key->get('crv')) { - case 'Ed25519': - return sodium_crypto_sign_detached($input, $secret); + $secret = $d . $x; - default: - throw new InvalidArgumentException('Unsupported curve'); - } + return match ($key->get('crv')) { + 'Ed25519' => sodium_crypto_sign_detached($input, $secret), + default => throw new InvalidArgumentException('Unsupported curve'), + }; } - /** - * @throws InvalidArgumentException if the curve is not supported - */ public function verify(JWK $key, string $input, string $signature): bool { $this->checkKey($key); $public = Base64UrlSafe::decode($key->get('x')); - switch ($key->get('crv')) { - case 'Ed25519': - return sodium_crypto_sign_verify_detached($signature, $input, $public); - - default: - throw new InvalidArgumentException('Unsupported curve'); - } + return match ($key->get('crv')) { + 'Ed25519' => sodium_crypto_sign_verify_detached($signature, $input, $public), + default => throw new InvalidArgumentException('Unsupported curve'), + }; } public function name(): string @@ -85,22 +58,17 @@ public function name(): string return 'EdDSA'; } - /** - * @throws InvalidArgumentException if the key type is not valid - * @throws InvalidArgumentException if a mandatory key parameter is missing - * @throws InvalidArgumentException if the curve is not suuported - */ private function checkKey(JWK $key): void { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } foreach (['x', 'crv'] as $k) { - if (!$key->has($k)) { + if (! $key->has($k)) { throw new InvalidArgumentException(sprintf('The key parameter "%s" is missing.', $k)); } } - if ('Ed25519' !== $key->get('crv')) { + if ($key->get('crv') !== 'Ed25519') { throw new InvalidArgumentException('Unsupported curve.'); } } diff --git a/src/SignatureAlgorithm/Experimental/ES256K.php b/src/SignatureAlgorithm/Experimental/ES256K.php index 8392da70..bcca8594 100644 --- a/src/SignatureAlgorithm/Experimental/ES256K.php +++ b/src/SignatureAlgorithm/Experimental/ES256K.php @@ -2,15 +2,6 @@ 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; final class ES256K extends ECDSA diff --git a/src/SignatureAlgorithm/Experimental/HS1.php b/src/SignatureAlgorithm/Experimental/HS1.php index 98cdec4d..7b409a21 100644 --- a/src/SignatureAlgorithm/Experimental/HS1.php +++ b/src/SignatureAlgorithm/Experimental/HS1.php @@ -2,15 +2,6 @@ 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; final class HS1 extends HMAC diff --git a/src/SignatureAlgorithm/Experimental/HS256_64.php b/src/SignatureAlgorithm/Experimental/HS256_64.php index dc306b3f..f5618dc6 100644 --- a/src/SignatureAlgorithm/Experimental/HS256_64.php +++ b/src/SignatureAlgorithm/Experimental/HS256_64.php @@ -2,15 +2,6 @@ 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; use Jose\Component\Core\JWK; diff --git a/src/SignatureAlgorithm/Experimental/RS1.php b/src/SignatureAlgorithm/Experimental/RS1.php index ef6ce193..a000073b 100644 --- a/src/SignatureAlgorithm/Experimental/RS1.php +++ b/src/SignatureAlgorithm/Experimental/RS1.php @@ -2,15 +2,6 @@ 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; final class RS1 extends RSAPKCS1 diff --git a/src/SignatureAlgorithm/HMAC/HMAC.php b/src/SignatureAlgorithm/HMAC/HMAC.php index 7503819d..bd192378 100644 --- a/src/SignatureAlgorithm/HMAC/HMAC.php +++ b/src/SignatureAlgorithm/HMAC/HMAC.php @@ -2,15 +2,6 @@ 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; use function in_array; @@ -38,19 +29,16 @@ public function hash(JWK $key, string $input): string return hash_hmac($this->getHashAlgorithm(), $input, $k, true); } - /** - * @throws InvalidArgumentException if the key is invalid - */ protected function getKey(JWK $key): string { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } - if (!$key->has('k')) { + if (! $key->has('k')) { throw new InvalidArgumentException('The key parameter "k" is missing.'); } $k = $key->get('k'); - if (!is_string($k)) { + if (! is_string($k)) { throw new InvalidArgumentException('The key parameter "k" is invalid.'); } diff --git a/src/SignatureAlgorithm/HMAC/HS256.php b/src/SignatureAlgorithm/HMAC/HS256.php index a1790139..a27f67eb 100644 --- a/src/SignatureAlgorithm/HMAC/HS256.php +++ b/src/SignatureAlgorithm/HMAC/HS256.php @@ -2,15 +2,6 @@ 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; use InvalidArgumentException; @@ -28,9 +19,6 @@ protected function getHashAlgorithm(): string return 'sha256'; } - /** - * @throws InvalidArgumentException if the key is invalid - */ protected function getKey(JWK $key): string { $k = parent::getKey($key); diff --git a/src/SignatureAlgorithm/HMAC/HS384.php b/src/SignatureAlgorithm/HMAC/HS384.php index c0a256c3..17fc5c9a 100644 --- a/src/SignatureAlgorithm/HMAC/HS384.php +++ b/src/SignatureAlgorithm/HMAC/HS384.php @@ -2,15 +2,6 @@ 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; use InvalidArgumentException; @@ -28,9 +19,6 @@ protected function getHashAlgorithm(): string return 'sha384'; } - /** - * @throws InvalidArgumentException if the key is invalid - */ protected function getKey(JWK $key): string { $k = parent::getKey($key); diff --git a/src/SignatureAlgorithm/HMAC/HS512.php b/src/SignatureAlgorithm/HMAC/HS512.php index c6fe352c..4bbbd24b 100644 --- a/src/SignatureAlgorithm/HMAC/HS512.php +++ b/src/SignatureAlgorithm/HMAC/HS512.php @@ -2,15 +2,6 @@ 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; use InvalidArgumentException; @@ -28,9 +19,6 @@ protected function getHashAlgorithm(): string return 'sha512'; } - /** - * @throws InvalidArgumentException if the key is invalid - */ protected function getKey(JWK $key): string { $k = parent::getKey($key); diff --git a/src/SignatureAlgorithm/None/None.php b/src/SignatureAlgorithm/None/None.php index 0df1923f..41c100b5 100644 --- a/src/SignatureAlgorithm/None/None.php +++ b/src/SignatureAlgorithm/None/None.php @@ -2,15 +2,6 @@ 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; use function in_array; @@ -33,7 +24,7 @@ public function sign(JWK $key, string $input): string public function verify(JWK $key, string $input, string $signature): bool { - return '' === $signature; + return $signature === ''; } public function name(): string @@ -41,12 +32,9 @@ public function name(): string return 'none'; } - /** - * @throws InvalidArgumentException if the key type is invalid - */ private function checkKey(JWK $key): void { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } } diff --git a/src/SignatureAlgorithm/RSA/PS256.php b/src/SignatureAlgorithm/RSA/PS256.php index dfaabd58..8b4ea316 100644 --- a/src/SignatureAlgorithm/RSA/PS256.php +++ b/src/SignatureAlgorithm/RSA/PS256.php @@ -2,15 +2,6 @@ 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; final class PS256 extends RSAPSS diff --git a/src/SignatureAlgorithm/RSA/PS384.php b/src/SignatureAlgorithm/RSA/PS384.php index 6b8499d6..36f37df2 100644 --- a/src/SignatureAlgorithm/RSA/PS384.php +++ b/src/SignatureAlgorithm/RSA/PS384.php @@ -2,15 +2,6 @@ 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; final class PS384 extends RSAPSS diff --git a/src/SignatureAlgorithm/RSA/PS512.php b/src/SignatureAlgorithm/RSA/PS512.php index 596d9ef9..929b989e 100644 --- a/src/SignatureAlgorithm/RSA/PS512.php +++ b/src/SignatureAlgorithm/RSA/PS512.php @@ -2,15 +2,6 @@ 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; final class PS512 extends RSAPSS diff --git a/src/SignatureAlgorithm/RSA/RS256.php b/src/SignatureAlgorithm/RSA/RS256.php index 9c4f9103..02f6bd7f 100644 --- a/src/SignatureAlgorithm/RSA/RS256.php +++ b/src/SignatureAlgorithm/RSA/RS256.php @@ -2,15 +2,6 @@ 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; final class RS256 extends RSAPKCS1 diff --git a/src/SignatureAlgorithm/RSA/RS384.php b/src/SignatureAlgorithm/RSA/RS384.php index 03e658a4..13d6893a 100644 --- a/src/SignatureAlgorithm/RSA/RS384.php +++ b/src/SignatureAlgorithm/RSA/RS384.php @@ -2,15 +2,6 @@ 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; final class RS384 extends RSAPKCS1 diff --git a/src/SignatureAlgorithm/RSA/RS512.php b/src/SignatureAlgorithm/RSA/RS512.php index b95ae00a..cb9f3f00 100644 --- a/src/SignatureAlgorithm/RSA/RS512.php +++ b/src/SignatureAlgorithm/RSA/RS512.php @@ -2,15 +2,6 @@ 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; final class RS512 extends RSAPKCS1 diff --git a/src/SignatureAlgorithm/RSA/RSAPKCS1.php b/src/SignatureAlgorithm/RSA/RSAPKCS1.php index da2fd807..573b1ee1 100644 --- a/src/SignatureAlgorithm/RSA/RSAPKCS1.php +++ b/src/SignatureAlgorithm/RSA/RSAPKCS1.php @@ -2,15 +2,6 @@ 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; use function in_array; @@ -31,24 +22,20 @@ public function verify(JWK $key, string $input, string $signature): bool $this->checkKey($key); $pub = RSAKey::createFromJWK($key->toPublic()); - return 1 === openssl_verify($input, $signature, $pub->toPEM(), $this->getAlgorithm()); + return openssl_verify($input, $signature, $pub->toPEM(), $this->getAlgorithm()) === 1; } - /** - * @throws InvalidArgumentException if the key is not private - * @throws InvalidArgumentException if the data cannot be signed - */ public function sign(JWK $key, string $input): string { $this->checkKey($key); - if (!$key->has('d')) { + if (! $key->has('d')) { throw new InvalidArgumentException('The key is not a private key.'); } $priv = RSAKey::createFromJWK($key); $result = openssl_sign($input, $signature, $priv->toPEM(), $this->getAlgorithm()); - if (true !== $result) { + if ($result !== true) { throw new RuntimeException('Unable to sign'); } @@ -57,17 +44,13 @@ public function sign(JWK $key, string $input): string abstract protected function getAlgorithm(): string; - /** - * @throws InvalidArgumentException if the key type is not allowed - * @throws InvalidArgumentException if the key is not valid - */ private function checkKey(JWK $key): void { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } foreach (['n', 'e'] as $k) { - if (!$key->has($k)) { + if (! $key->has($k)) { throw new InvalidArgumentException(sprintf('The key parameter "%s" is missing.', $k)); } } diff --git a/src/SignatureAlgorithm/RSA/RSAPSS.php b/src/SignatureAlgorithm/RSA/RSAPSS.php index 9112c417..982cd25a 100644 --- a/src/SignatureAlgorithm/RSA/RSAPSS.php +++ b/src/SignatureAlgorithm/RSA/RSAPSS.php @@ -2,15 +2,6 @@ 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; use function in_array; @@ -34,13 +25,10 @@ public function verify(JWK $key, string $input, string $signature): bool return JoseRSA::verify($pub, $input, $signature, $this->getAlgorithm(), JoseRSA::SIGNATURE_PSS); } - /** - * @throws InvalidArgumentException if the key is not private - */ public function sign(JWK $key, string $input): string { $this->checkKey($key); - if (!$key->has('d')) { + if (! $key->has('d')) { throw new InvalidArgumentException('The key is not a private key.'); } @@ -51,17 +39,13 @@ public function sign(JWK $key, string $input): string abstract protected function getAlgorithm(): string; - /** - * @throws InvalidArgumentException if the key type is not allowed - * @throws InvalidArgumentException if the key is not valid - */ private function checkKey(JWK $key): void { - if (!in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { + if (! in_array($key->get('kty'), $this->allowedKeyTypes(), true)) { throw new InvalidArgumentException('Wrong key type.'); } foreach (['n', 'e'] as $k) { - if (!$key->has($k)) { + if (! $key->has($k)) { throw new InvalidArgumentException(sprintf('The key parameter "%s" is missing.', $k)); } } diff --git a/src/SignatureAlgorithm/RSA/Util/RSA.php b/src/SignatureAlgorithm/RSA/Util/RSA.php index 735be1dd..f8458eee 100644 --- a/src/SignatureAlgorithm/RSA/Util/RSA.php +++ b/src/SignatureAlgorithm/RSA/Util/RSA.php @@ -2,15 +2,6 @@ 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\Util; use function chr; @@ -20,11 +11,12 @@ use Jose\Component\Core\Util\RSAKey; use function ord; use RuntimeException; +use const STR_PAD_LEFT; /** * @internal */ -class RSA +final class RSA { /** * Probabilistic Signature Scheme. @@ -36,10 +28,6 @@ class RSA */ public const SIGNATURE_PKCS1 = 2; - /** - * @throws RuntimeException if the data cannot be signed - * @throws InvalidArgumentException if the signature mode is not supported - */ public static function sign(RSAKey $key, string $message, string $hash, int $mode): string { switch ($mode) { @@ -48,7 +36,7 @@ public static function sign(RSAKey $key, string $message, string $hash, int $mod case self::SIGNATURE_PKCS1: $result = openssl_sign($message, $signature, $key->toPEM(), $hash); - if (true !== $result) { + if ($result !== true) { throw new RuntimeException('Unable to sign the data'); } @@ -71,27 +59,17 @@ public static function signWithPSS(RSAKey $key, string $message, string $hash): return self::convertIntegerToOctetString($signature, $key->getModulusLength()); } - /** - * @throws InvalidArgumentException if the signature mode is not supported - */ public static function verify(RSAKey $key, string $message, string $signature, string $hash, int $mode): bool { - 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.'); - } + return match ($mode) { + self::SIGNATURE_PSS => self::verifyWithPSS($key, $message, $signature, $hash), + self::SIGNATURE_PKCS1 => openssl_verify($message, $signature, $key->toPEM(), $hash) === 1, + default => throw new InvalidArgumentException('Unsupported mode.'), + }; } /** * Verifies a signature. - * - * @throws RuntimeException if the signature cannot be verified */ public static function verifyWithPSS(RSAKey $key, string $message, string $signature, string $hash): bool { @@ -106,9 +84,6 @@ public static function verifyWithPSS(RSAKey $key, string $message, string $signa return self::verifyEMSAPSS($message, $em, $modBits - 1, Hash::$hash()); } - /** - * @throws RuntimeException if the value cannot be converted - */ private static function convertIntegerToOctetString(BigInteger $x, int $xLen): string { $x = $x->toBytes(); @@ -128,7 +103,7 @@ private static function getMGF1(string $mgfSeed, int $maskLen, Hash $mgfHash): s $count = ceil($maskLen / $mgfHash->getLength()); for ($i = 0; $i < $count; ++$i) { $c = pack('N', $i); - $t .= $mgfHash->hash($mgfSeed.$c); + $t .= $mgfHash->hash($mgfSeed . $c); } return mb_substr($t, 0, $maskLen, '8bit'); @@ -136,8 +111,6 @@ private static function getMGF1(string $mgfSeed, int $maskLen, Hash $mgfHash): s /** * EMSA-PSS-ENCODE. - * - * @throws RuntimeException if the message length is invalid */ private static function encodeEMSAPSS(string $message, int $modulusLength, Hash $hash): string { @@ -148,22 +121,19 @@ private static function encodeEMSAPSS(string $message, int $modulusLength, Hash throw new RuntimeException(); } $salt = random_bytes($sLen); - $m2 = "\0\0\0\0\0\0\0\0".$mHash.$salt; + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; $h = $hash->hash($m2); $ps = str_repeat(chr(0), $emLen - $sLen - $hash->getLength() - 2); - $db = $ps.chr(1).$salt; + $db = $ps . chr(1) . $salt; $dbMask = self::getMGF1($h, $emLen - $hash->getLength() - 1, $hash); $maskedDB = $db ^ $dbMask; $maskedDB[0] = ~chr(0xFF << ($modulusLength & 7)) & $maskedDB[0]; - $em = $maskedDB.$h.chr(0xBC); - return $em; + return $maskedDB . $h . chr(0xBC); } /** * EMSA-PSS-VERIFY. - * - * @throws InvalidArgumentException if the signature cannot be verified */ private static function verifyEMSAPSS(string $m, string $em, int $emBits, Hash $hash): bool { @@ -189,11 +159,11 @@ private static function verifyEMSAPSS(string $m, string $em, int $emBits, Hash $ if (mb_substr($db, 0, $temp, '8bit') !== str_repeat(chr(0), $temp)) { throw new InvalidArgumentException(); } - if (1 !== ord($db[$temp])) { + if (ord($db[$temp]) !== 1) { throw new InvalidArgumentException(); } $salt = mb_substr($db, $temp + 1, null, '8bit'); // should be $sLen long - $m2 = "\0\0\0\0\0\0\0\0".$mHash.$salt; + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; $h2 = $hash->hash($m2); return hash_equals($h, $h2); diff --git a/src/SignatureAlgorithm/RSA/composer.json b/src/SignatureAlgorithm/RSA/composer.json index eb57efa8..ae03f8c9 100644 --- a/src/SignatureAlgorithm/RSA/composer.json +++ b/src/SignatureAlgorithm/RSA/composer.json @@ -20,7 +20,7 @@ } }, "require": { - "brick/math": "^0.8.17|^0.9", + "brick/math": "^0.9", "ext-openssl": "*", "web-token/jwt-signature": "^2.1" }, diff --git a/tests/Bundle/JoseFramework/AppKernel.php b/tests/Bundle/JoseFramework/AppKernel.php index 92fb2217..6e5db505 100644 --- a/tests/Bundle/JoseFramework/AppKernel.php +++ b/tests/Bundle/JoseFramework/AppKernel.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework; /* @@ -29,9 +20,6 @@ use Symfony\Component\HttpKernel\Bundle\BundleInterface; use Symfony\Component\HttpKernel\Kernel; -/** - * Class AppKernel. - */ class AppKernel extends Kernel { public function __construct(string $environment) @@ -44,15 +32,11 @@ public function __construct(string $environment) */ public function registerBundles(): array { - return [ - new FrameworkBundle(), - new JoseFrameworkBundle(), - new TestBundle(), - ]; + return [new FrameworkBundle(), new JoseFrameworkBundle(), new TestBundle()]; } public function registerContainerConfiguration(LoaderInterface $loader): void { - $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); + $loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml'); } } diff --git a/tests/Bundle/JoseFramework/Functional/Checker/ClaimCheckerTest.php b/tests/Bundle/JoseFramework/Functional/Checker/ClaimCheckerTest.php index 4b81978d..b7531f59 100644 --- a/tests/Bundle/JoseFramework/Functional/Checker/ClaimCheckerTest.php +++ b/tests/Bundle/JoseFramework/Functional/Checker/ClaimCheckerTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Checker; use Jose\Bundle\JoseFramework\Services\ClaimCheckerManagerFactory as ClaimCheckerManagerFactoryService; @@ -19,16 +10,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class ClaimCheckerTest extends WebTestCase +final class ClaimCheckerTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(ClaimCheckerManagerFactory::class)) { + if (! class_exists(ClaimCheckerManagerFactory::class)) { static::markTestSkipped('The component "web-token/jwt-checker" is not installed.'); } } diff --git a/tests/Bundle/JoseFramework/Functional/Checker/ConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/Checker/ConfigurationTest.php index b0f26116..27fdfb5b 100644 --- a/tests/Bundle/JoseFramework/Functional/Checker/ConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/Checker/ConfigurationTest.php @@ -2,36 +2,25 @@ 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\Tests\Bundle\JoseFramework\Functional\Checker; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Checker\CheckerSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; use Jose\Component\Checker\ClaimCheckerManagerFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group Configuration - * * @internal */ -class ConfigurationTest extends TestCase +final class ConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(ClaimCheckerManagerFactory::class)) { + if (! class_exists(ClaimCheckerManagerFactory::class)) { static::markTestSkipped('The component "web-token/jwt-checker" is not installed.'); } } @@ -41,9 +30,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -51,11 +38,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - ['checkers' => false], - ] - ); + 'checkers' => false, + ], + ]); } /** @@ -63,11 +50,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - ['checkers' => []], - ] - ); + 'checkers' => [], + ], + ]); } /** @@ -75,14 +62,14 @@ public function theConfigurationIsValidIfConfigurationIsEmpty(): void */ public function theConfigurationIsValidIfNoHeaderOrClaimCheckerIsSet(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - ['checkers' => [ + 'checkers' => [ 'headers' => [], 'claims' => [], - ]], - ] - ); + ], + ], + ]); } /** @@ -92,13 +79,15 @@ public function theHeadersForAHeaderCheckerShouldBeSet(): void { $this->assertConfigurationIsInvalid( [ - ['checkers' => [ - 'headers' => [ - 'foo' => [ - 'is_public' => false, + [ + 'checkers' => [ + 'headers' => [ + 'foo' => [ + 'is_public' => false, + ], ], ], - ]], + ], ], 'he child config "headers" under "jose.checkers.headers.foo" must be configured:' ); @@ -111,14 +100,16 @@ public function aHeaderCheckerMayContainNoChecker(): void { $this->assertConfigurationIsValid( [ - ['checkers' => [ - 'headers' => [ - 'foo' => [ - 'headers' => [], - 'is_public' => false, + [ + 'checkers' => [ + 'headers' => [ + 'foo' => [ + 'headers' => [], + 'is_public' => false, + ], ], ], - ]], + ], ] ); } @@ -130,13 +121,15 @@ public function theClaimsForAClaimCheckerShouldBeSet(): void { $this->assertConfigurationIsInvalid( [ - ['checkers' => [ - 'claims' => [ - 'foo' => [ - 'is_public' => false, + [ + 'checkers' => [ + 'claims' => [ + 'foo' => [ + 'is_public' => false, + ], ], ], - ]], + ], ], 'he child config "claims" under "jose.checkers.claims.foo" must be configured:' ); @@ -149,23 +142,22 @@ public function aClaimCheckerMayContainNoChecker(): void { $this->assertConfigurationIsValid( [ - ['checkers' => [ - 'claims' => [ - 'foo' => [ - 'claims' => [], - 'is_public' => false, + [ + 'checkers' => [ + 'claims' => [ + 'foo' => [ + 'claims' => [], + 'is_public' => false, + ], ], ], - ]], + ], ] ); } protected function getConfiguration(): Configuration { - return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\Checker\CheckerSource(), - ]); + return new Configuration('jose', [new CoreSource(), new CheckerSource()]); } } diff --git a/tests/Bundle/JoseFramework/Functional/Checker/HeaderCheckerTest.php b/tests/Bundle/JoseFramework/Functional/Checker/HeaderCheckerTest.php index 01a8a5b5..21c7a689 100644 --- a/tests/Bundle/JoseFramework/Functional/Checker/HeaderCheckerTest.php +++ b/tests/Bundle/JoseFramework/Functional/Checker/HeaderCheckerTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Checker; use Jose\Bundle\JoseFramework\Services\HeaderCheckerManagerFactory as HeaderCheckerManagerFactoryService; @@ -19,16 +10,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class HeaderCheckerTest extends WebTestCase +final class HeaderCheckerTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(HeaderCheckerManagerFactory::class)) { + if (! class_exists(HeaderCheckerManagerFactory::class)) { static::markTestSkipped('The component "web-token/jwt-checker" is not installed.'); } } diff --git a/tests/Bundle/JoseFramework/Functional/Console/ConsoleTest.php b/tests/Bundle/JoseFramework/Functional/Console/ConsoleTest.php index c32d866e..8fd2e35b 100644 --- a/tests/Bundle/JoseFramework/Functional/Console/ConsoleTest.php +++ b/tests/Bundle/JoseFramework/Functional/Console/ConsoleTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Console; use Jose\Component\Console\EcKeyGeneratorCommand; @@ -18,16 +9,13 @@ use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; /** - * @group Bundle - * @group functional - * * @internal */ -class ConsoleTest extends KernelTestCase +final class ConsoleTest extends KernelTestCase { protected function setUp(): void { - if (!class_exists(EcKeyGeneratorCommand::class)) { + if (! class_exists(EcKeyGeneratorCommand::class)) { static::markTestSkipped('The component "web-token/jwt-console" is not installed.'); } } diff --git a/tests/Bundle/JoseFramework/Functional/Encryption/JWEBuilderTest.php b/tests/Bundle/JoseFramework/Functional/Encryption/JWEBuilderTest.php index 0ed66dde..b0b14361 100644 --- a/tests/Bundle/JoseFramework/Functional/Encryption/JWEBuilderTest.php +++ b/tests/Bundle/JoseFramework/Functional/Encryption/JWEBuilderTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Encryption; use Jose\Bundle\JoseFramework\Services\JWEBuilder; @@ -20,16 +11,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class JWEBuilderTest extends WebTestCase +final class JWEBuilderTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JWEBuilderFactory::class)) { + if (! class_exists(JWEBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-encryption" is not installed.'); } } diff --git a/tests/Bundle/JoseFramework/Functional/Encryption/JWEComputationTest.php b/tests/Bundle/JoseFramework/Functional/Encryption/JWEComputationTest.php index 610da6e0..8ce3f7fa 100644 --- a/tests/Bundle/JoseFramework/Functional/Encryption/JWEComputationTest.php +++ b/tests/Bundle/JoseFramework/Functional/Encryption/JWEComputationTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Encryption; use Jose\Component\Core\JWK; @@ -22,16 +13,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class JWEComputationTest extends WebTestCase +final class JWEComputationTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JWEBuilderFactory::class)) { + if (! class_exists(JWEBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-encryption" is not installed.'); } } @@ -73,6 +61,6 @@ public function iCanCreateAndLoadAToken(): void $loaded = $serializer->unserialize($token); static::assertTrue($loader->decryptUsingKey($loaded, $jwk, 0)); - static::assertEquals('Hello World!', $loaded->getPayload()); + static::assertSame('Hello World!', $loaded->getPayload()); } } diff --git a/tests/Bundle/JoseFramework/Functional/Encryption/JWEDecrypterTest.php b/tests/Bundle/JoseFramework/Functional/Encryption/JWEDecrypterTest.php index efe87498..35906150 100644 --- a/tests/Bundle/JoseFramework/Functional/Encryption/JWEDecrypterTest.php +++ b/tests/Bundle/JoseFramework/Functional/Encryption/JWEDecrypterTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Encryption; use Jose\Bundle\JoseFramework\Services\JWEDecrypterFactory as JWEDecrypterFactoryService; @@ -20,16 +11,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class JWEDecrypterTest extends WebTestCase +final class JWEDecrypterTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JWEBuilderFactory::class)) { + if (! class_exists(JWEBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-encryption" is not installed.'); } } diff --git a/tests/Bundle/JoseFramework/Functional/Encryption/JWELoaderTest.php b/tests/Bundle/JoseFramework/Functional/Encryption/JWELoaderTest.php index 3d49942f..ee2999e3 100644 --- a/tests/Bundle/JoseFramework/Functional/Encryption/JWELoaderTest.php +++ b/tests/Bundle/JoseFramework/Functional/Encryption/JWELoaderTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Encryption; use Jose\Bundle\JoseFramework\Services\JWELoaderFactory as JWELoaderFactoryAlias; @@ -20,16 +11,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class JWELoaderTest extends WebTestCase +final class JWELoaderTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JWEBuilderFactory::class)) { + if (! class_exists(JWEBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-encryption" is not installed.'); } } @@ -61,10 +49,10 @@ public function theWELoaderFactoryCanCreateAJWELoader(): void $jwe = $jweLoaderFactory->create(['jwe_compact'], ['RSA1_5'], ['A256GCM'], ['DEF']); - static::assertEquals(['jwe_compact'], $jwe->getSerializerManager()->names()); - static::assertEquals(['RSA1_5'], $jwe->getJweDecrypter()->getKeyEncryptionAlgorithmManager()->list()); - static::assertEquals(['A256GCM'], $jwe->getJweDecrypter()->getContentEncryptionAlgorithmManager()->list()); - static::assertEquals(['DEF'], $jwe->getJweDecrypter()->getCompressionMethodManager()->list()); + static::assertSame(['jwe_compact'], $jwe->getSerializerManager()->names()); + static::assertSame(['RSA1_5'], $jwe->getJweDecrypter()->getKeyEncryptionAlgorithmManager()->list()); + static::assertSame(['A256GCM'], $jwe->getJweDecrypter()->getContentEncryptionAlgorithmManager()->list()); + static::assertSame(['DEF'], $jwe->getJweDecrypter()->getCompressionMethodManager()->list()); } /** diff --git a/tests/Bundle/JoseFramework/Functional/Encryption/JWESerializerTest.php b/tests/Bundle/JoseFramework/Functional/Encryption/JWESerializerTest.php index db2a71d0..9f97b84e 100644 --- a/tests/Bundle/JoseFramework/Functional/Encryption/JWESerializerTest.php +++ b/tests/Bundle/JoseFramework/Functional/Encryption/JWESerializerTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Encryption; use Jose\Component\Encryption\JWEBuilderFactory; @@ -19,16 +10,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class JWESerializerTest extends WebTestCase +final class JWESerializerTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JWEBuilderFactory::class)) { + if (! class_exists(JWEBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-encryption" is not installed.'); } } diff --git a/tests/Bundle/JoseFramework/Functional/Encryption/JweBuilderConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/Encryption/JweBuilderConfigurationTest.php index 9f61b14d..0390546b 100644 --- a/tests/Bundle/JoseFramework/Functional/Encryption/JweBuilderConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/Encryption/JweBuilderConfigurationTest.php @@ -2,36 +2,25 @@ 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\Tests\Bundle\JoseFramework\Functional\Encryption; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Encryption\EncryptionSource; use Jose\Component\Encryption\JWEBuilderFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group Configuration - * * @internal */ -class JweBuilderConfigurationTest extends TestCase +final class JweBuilderConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(JWEBuilderFactory::class)) { + if (! class_exists(JWEBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-encryption" is not installed.'); } } @@ -41,9 +30,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -51,13 +38,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jwe' => false, - ], - ] - ); + 'jwe' => false, + ], + ]); } /** @@ -65,13 +50,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jwe' => [], - ], - ] - ); + 'jwe' => [], + ], + ]); } /** @@ -79,15 +62,13 @@ public function theConfigurationIsValidIfConfigurationIsEmpty(): void */ public function theConfigurationIsInvalidIfBuilderIsSet(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jwe' => [ - 'builders' => [], - ], + 'jwe' => [ + 'builders' => [], ], - ] - ); + ], + ]); } /** @@ -175,9 +156,6 @@ public function theConfigurationIsInvalidIfTheContentEncryptionAlgorithmIsEmpty( protected function getConfiguration(): Configuration { - return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\Encryption\EncryptionSource(), - ]); + return new Configuration('jose', [new CoreSource(), new EncryptionSource()]); } } diff --git a/tests/Bundle/JoseFramework/Functional/Encryption/JweDecrypterConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/Encryption/JweDecrypterConfigurationTest.php index 8a55756f..4790d566 100644 --- a/tests/Bundle/JoseFramework/Functional/Encryption/JweDecrypterConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/Encryption/JweDecrypterConfigurationTest.php @@ -2,36 +2,25 @@ 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\Tests\Bundle\JoseFramework\Functional\Encryption; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Encryption\EncryptionSource; use Jose\Component\Encryption\JWEBuilderFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group Configuration - * * @internal */ -class JweDecrypterConfigurationTest extends TestCase +final class JweDecrypterConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(JWEBuilderFactory::class)) { + if (! class_exists(JWEBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-encryption" is not installed.'); } } @@ -41,9 +30,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -51,13 +38,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jwe' => false, - ], - ] - ); + 'jwe' => false, + ], + ]); } /** @@ -65,13 +50,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jwe' => [], - ], - ] - ); + 'jwe' => [], + ], + ]); } /** @@ -79,15 +62,13 @@ public function theConfigurationIsValidIfConfigurationIsEmpty(): void */ public function theConfigurationIsInvalidIfBuilderIsSet(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jwe' => [ - 'decrypters' => [], - ], + 'jwe' => [ + 'decrypters' => [], ], - ] - ); + ], + ]); } /** @@ -175,9 +156,6 @@ public function theConfigurationIsInvalidIfTheContentEncryptionAlgorithmIsEmpty( protected function getConfiguration(): Configuration { - return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\Encryption\EncryptionSource(), - ]); + return new Configuration('jose', [new CoreSource(), new EncryptionSource()]); } } diff --git a/tests/Bundle/JoseFramework/Functional/Encryption/SerializerConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/Encryption/SerializerConfigurationTest.php index 66dc633e..a0a199e7 100644 --- a/tests/Bundle/JoseFramework/Functional/Encryption/SerializerConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/Encryption/SerializerConfigurationTest.php @@ -2,36 +2,25 @@ 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\Tests\Bundle\JoseFramework\Functional\Encryption; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Encryption\EncryptionSource; use Jose\Component\Encryption\JWEBuilderFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group Configuration - * * @internal */ -class SerializerConfigurationTest extends TestCase +final class SerializerConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(JWEBuilderFactory::class)) { + if (! class_exists(JWEBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-encryption" is not installed.'); } } @@ -41,9 +30,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -51,13 +38,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jwe' => false, - ], - ] - ); + 'jwe' => false, + ], + ]); } /** @@ -65,13 +50,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jwe' => [], - ], - ] - ); + 'jwe' => [], + ], + ]); } /** @@ -79,15 +62,13 @@ public function theConfigurationIsValidIfConfigurationIsEmpty(): void */ public function theConfigurationIsValidIfNoSerializerIsSet(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jwe' => [ - 'serializers' => [], - ], + 'jwe' => [ + 'serializers' => [], ], - ] - ); + ], + ]); } /** @@ -132,9 +113,6 @@ public function theConfigurationIsInvalidIfTheSerializerListIsEmpty(): void protected function getConfiguration(): Configuration { - return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\Encryption\EncryptionSource(), - ]); + return new Configuration('jose', [new CoreSource(), new EncryptionSource()]); } } diff --git a/tests/Bundle/JoseFramework/Functional/KeyManagement/JKUAndX5UFactoriesTest.php b/tests/Bundle/JoseFramework/Functional/KeyManagement/JKUAndX5UFactoriesTest.php index 2892ccfe..47a9ec1b 100644 --- a/tests/Bundle/JoseFramework/Functional/KeyManagement/JKUAndX5UFactoriesTest.php +++ b/tests/Bundle/JoseFramework/Functional/KeyManagement/JKUAndX5UFactoriesTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\KeyManagement; use Jose\Component\KeyManagement\JKUFactory; @@ -19,17 +10,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * @group KeyManagement - * * @internal */ -class JKUAndX5UFactoriesTest extends WebTestCase +final class JKUAndX5UFactoriesTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JKUFactory::class)) { + if (! class_exists(JKUFactory::class)) { static::markTestSkipped('The component "web-token/jwt-key-mgmt" is not installed.'); } } diff --git a/tests/Bundle/JoseFramework/Functional/KeyManagement/JWKLoaderTest.php b/tests/Bundle/JoseFramework/Functional/KeyManagement/JWKLoaderTest.php index d10b22e4..a857ccbf 100644 --- a/tests/Bundle/JoseFramework/Functional/KeyManagement/JWKLoaderTest.php +++ b/tests/Bundle/JoseFramework/Functional/KeyManagement/JWKLoaderTest.php @@ -2,35 +2,22 @@ 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\Tests\Bundle\JoseFramework\Functional\KeyManagement; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Component\KeyManagement\JWKFactory; +use ParagonIE\ConstantTime\Base64UrlSafe; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * @group KeyManagement - * * @internal */ -class JWKLoaderTest extends WebTestCase +final class JWKLoaderTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JWKFactory::class)) { + if (! class_exists(JWKFactory::class)) { static::markTestSkipped('The component "web-token/jwt-key-mgmt" is not installed.'); } } @@ -133,9 +120,9 @@ public function aJWKCanBeLoadedFromASecretInTheConfiguration(): void $jwk = $container->get('jose.key.secret1'); static::assertInstanceOf(JWK::class, $jwk); - static::assertEquals('oct', $jwk->get('kty')); - static::assertEquals('enc', $jwk->get('use')); - static::assertEquals('RS512', $jwk->get('alg')); - static::assertEquals('This is my secret', Base64UrlSafe::decode($jwk->get('k'))); + static::assertSame('oct', $jwk->get('kty')); + static::assertSame('enc', $jwk->get('use')); + static::assertSame('RS512', $jwk->get('alg')); + static::assertSame('This is my secret', Base64UrlSafe::decode($jwk->get('k'))); } } diff --git a/tests/Bundle/JoseFramework/Functional/KeyManagement/JWKSetLoaderTest.php b/tests/Bundle/JoseFramework/Functional/KeyManagement/JWKSetLoaderTest.php index 9406e346..e9c8c47d 100644 --- a/tests/Bundle/JoseFramework/Functional/KeyManagement/JWKSetLoaderTest.php +++ b/tests/Bundle/JoseFramework/Functional/KeyManagement/JWKSetLoaderTest.php @@ -2,43 +2,25 @@ 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\Tests\Bundle\JoseFramework\Functional\KeyManagement; -use Http\Mock\Client; use Jose\Component\Core\JWKSet; use Jose\Component\KeyManagement\JWKFactory; use Jose\Tests\Bundle\JoseFramework\TestBundle\Service\MockClientCallback; use Nyholm\Psr7\Factory\Psr17Factory; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\HttpClient\Response\MockResponse; use Symfony\Component\HttpFoundation\Response; /** - * @group Bundle - * @group functional - * * @internal */ -class JWKSetLoaderTest extends WebTestCase +final class JWKSetLoaderTest extends WebTestCase { - /** - * @var Psr17Factory - */ - private $messageFactory; + private Psr17Factory $messageFactory; protected function setUp(): void { - if (!class_exists(JWKFactory::class)) { + if (! class_exists(JWKFactory::class)) { static::markTestSkipped('The component "web-token/jwt-key-mgmt" is not installed.'); } $this->messageFactory = new Psr17Factory(); @@ -69,9 +51,12 @@ public function aJWKSetCanBeSharedInTheConfiguration(): void /** @var Response $response */ $response = $client->getResponse(); - static::assertEquals(200, $response->getStatusCode()); - static::assertEquals('{"keys":[{"kty":"oct","k":"dzI6nbW4OcNF-AtfxGAmuyz7IpHRudBI0WgGjZWgaRJt6prBn3DARXgUR8NVwKhfL43QBIU2Un3AvCGCHRgY4TbEqhOi8-i98xxmCggNjde4oaW6wkJ2NgM3Ss9SOX9zS3lcVzdCMdum-RwVJ301kbin4UtGztuzJBeg5oVN00MGxjC2xWwyI0tgXVs-zJs5WlafCuGfX1HrVkIf5bvpE0MQCSjdJpSeVao6-RSTYDajZf7T88a2eVjeW31mMAg-jzAWfUrii61T_bYPJFOXW8kkRWoa1InLRdG6bKB9wQs9-VdXZP60Q4Yuj_WZ-lO7qV9AEFrUkkjpaDgZT86w2g"},{"kty":"oct","k":"bwIAv5Nn-fo8p4LCEvM4IR9eLXgzJRs8jXCLb3xR0tDJGiZ46KheO4ip6htFKyN2aqJqlNi9-7hB6I1aLLy1IRT9-vcBoCSGu977cNAUuRLkRp7vo8s6MsxhB8WvQBDRZghV7jIYaune-3vbE7iDU2AESr8BUtorckLoO9uW__fIabaa3hJMMQIHCzYQbJKZvlCRCKWMk2H_zuS4JeDFTvyZH1skJYF_TET1DrCZHMPicw-Yk3_m2P-ilC-yidPPoVzeU8Jj3tQ6gtX3975qiQW7pt2qbgjKAuq2wsz_9hxLBtMB5rQPafFoxop7O4BklvZ9-ECcK6dfI2CAx9_tjQ"}]}', $response->getContent()); - static::assertEquals('application/jwk-set+json; charset=UTF-8', $response->headers->get('Content-Type')); + static::assertSame(200, $response->getStatusCode()); + static::assertSame( + '{"keys":[{"kty":"oct","k":"dzI6nbW4OcNF-AtfxGAmuyz7IpHRudBI0WgGjZWgaRJt6prBn3DARXgUR8NVwKhfL43QBIU2Un3AvCGCHRgY4TbEqhOi8-i98xxmCggNjde4oaW6wkJ2NgM3Ss9SOX9zS3lcVzdCMdum-RwVJ301kbin4UtGztuzJBeg5oVN00MGxjC2xWwyI0tgXVs-zJs5WlafCuGfX1HrVkIf5bvpE0MQCSjdJpSeVao6-RSTYDajZf7T88a2eVjeW31mMAg-jzAWfUrii61T_bYPJFOXW8kkRWoa1InLRdG6bKB9wQs9-VdXZP60Q4Yuj_WZ-lO7qV9AEFrUkkjpaDgZT86w2g"},{"kty":"oct","k":"bwIAv5Nn-fo8p4LCEvM4IR9eLXgzJRs8jXCLb3xR0tDJGiZ46KheO4ip6htFKyN2aqJqlNi9-7hB6I1aLLy1IRT9-vcBoCSGu977cNAUuRLkRp7vo8s6MsxhB8WvQBDRZghV7jIYaune-3vbE7iDU2AESr8BUtorckLoO9uW__fIabaa3hJMMQIHCzYQbJKZvlCRCKWMk2H_zuS4JeDFTvyZH1skJYF_TET1DrCZHMPicw-Yk3_m2P-ilC-yidPPoVzeU8Jj3tQ6gtX3975qiQW7pt2qbgjKAuq2wsz_9hxLBtMB5rQPafFoxop7O4BklvZ9-ECcK6dfI2CAx9_tjQ"}]}', + $response->getContent() + ); + static::assertSame('application/jwk-set+json; charset=UTF-8', $response->headers->get('Content-Type')); } /** @@ -99,9 +84,12 @@ public function aJWKSetCanBeSharedFromAnotherBundle(): void /** @var Response $response */ $response = $client->getResponse(); - static::assertEquals(200, $response->getStatusCode()); - static::assertEquals('{"keys":[{"kty":"oct","k":"dzI6nbW4OcNF-AtfxGAmuyz7IpHRudBI0WgGjZWgaRJt6prBn3DARXgUR8NVwKhfL43QBIU2Un3AvCGCHRgY4TbEqhOi8-i98xxmCggNjde4oaW6wkJ2NgM3Ss9SOX9zS3lcVzdCMdum-RwVJ301kbin4UtGztuzJBeg5oVN00MGxjC2xWwyI0tgXVs-zJs5WlafCuGfX1HrVkIf5bvpE0MQCSjdJpSeVao6-RSTYDajZf7T88a2eVjeW31mMAg-jzAWfUrii61T_bYPJFOXW8kkRWoa1InLRdG6bKB9wQs9-VdXZP60Q4Yuj_WZ-lO7qV9AEFrUkkjpaDgZT86w2g"},{"kty":"oct","k":"bwIAv5Nn-fo8p4LCEvM4IR9eLXgzJRs8jXCLb3xR0tDJGiZ46KheO4ip6htFKyN2aqJqlNi9-7hB6I1aLLy1IRT9-vcBoCSGu977cNAUuRLkRp7vo8s6MsxhB8WvQBDRZghV7jIYaune-3vbE7iDU2AESr8BUtorckLoO9uW__fIabaa3hJMMQIHCzYQbJKZvlCRCKWMk2H_zuS4JeDFTvyZH1skJYF_TET1DrCZHMPicw-Yk3_m2P-ilC-yidPPoVzeU8Jj3tQ6gtX3975qiQW7pt2qbgjKAuq2wsz_9hxLBtMB5rQPafFoxop7O4BklvZ9-ECcK6dfI2CAx9_tjQ"}]}', $response->getContent()); - static::assertEquals('application/jwk-set+json; charset=UTF-8', $response->headers->get('Content-Type')); + static::assertSame(200, $response->getStatusCode()); + static::assertSame( + '{"keys":[{"kty":"oct","k":"dzI6nbW4OcNF-AtfxGAmuyz7IpHRudBI0WgGjZWgaRJt6prBn3DARXgUR8NVwKhfL43QBIU2Un3AvCGCHRgY4TbEqhOi8-i98xxmCggNjde4oaW6wkJ2NgM3Ss9SOX9zS3lcVzdCMdum-RwVJ301kbin4UtGztuzJBeg5oVN00MGxjC2xWwyI0tgXVs-zJs5WlafCuGfX1HrVkIf5bvpE0MQCSjdJpSeVao6-RSTYDajZf7T88a2eVjeW31mMAg-jzAWfUrii61T_bYPJFOXW8kkRWoa1InLRdG6bKB9wQs9-VdXZP60Q4Yuj_WZ-lO7qV9AEFrUkkjpaDgZT86w2g"},{"kty":"oct","k":"bwIAv5Nn-fo8p4LCEvM4IR9eLXgzJRs8jXCLb3xR0tDJGiZ46KheO4ip6htFKyN2aqJqlNi9-7hB6I1aLLy1IRT9-vcBoCSGu977cNAUuRLkRp7vo8s6MsxhB8WvQBDRZghV7jIYaune-3vbE7iDU2AESr8BUtorckLoO9uW__fIabaa3hJMMQIHCzYQbJKZvlCRCKWMk2H_zuS4JeDFTvyZH1skJYF_TET1DrCZHMPicw-Yk3_m2P-ilC-yidPPoVzeU8Jj3tQ6gtX3975qiQW7pt2qbgjKAuq2wsz_9hxLBtMB5rQPafFoxop7O4BklvZ9-ECcK6dfI2CAx9_tjQ"}]}', + $response->getContent() + ); + static::assertSame('application/jwk-set+json; charset=UTF-8', $response->headers->get('Content-Type')); } /** @@ -113,8 +101,14 @@ public function aJWKSetCanBeRetrieveFromADistantJkuThroughConfiguration(): void $client = static::createClient(); $container = $client->getContainer(); $response = $this->messageFactory->createResponse(200); - $response->getBody()->write('{"keys": [{"kty": "RSA","alg": "RS256","use": "sig","kid": "acde8d7c1997d82dcf5d5ed2858ac8d060cd3ca9","n": "kfQP58EQpxAqZUCiGolkyCio8S3hG9HTMfQpB7VVDB69mK3AN68ZmWeGTIvDnbcslQ1TEhjZ8bKJwWHFlyoJOxeGaEsn0G3xAmPeUW8WjS2tLTKx8DUYOAgto9VOWip5dngZVMrCL85fPk-jiKEL3ODsyddZiOOhBEjapco_RTDPVurVreDnG6mbScCslHda5T6KudyFOQLD77BulIENlpE5Lxh3KFGrGgu_RiVOf-XtHDDExiWOsaUhOSZFkecqF56upROBQRIuNqHv98icbVKRzYcDteRckJGfk12faaQhX24QCDsIrT8NHbbB9eKX7rcnDMp8GxSArct7KyOxyw","e": "AQAB"},{"kty": "RSA","alg": "RS256","use": "sig","kid": "ce760dff481ee9bca45ccab64eada328029bc0aa","n": "47QQ2Ru1h3WWxcTUbwQvhD_ncEw7avXtXDmcY_8zxC9FcPwv6GcAvjoWuF0afBNK4UoNqW9gG_eq96FnMUF0iIVkPio-h3cpOHzAhKN-LHB9UMx3WDCVYxeRjGOgKU8oLz7ioqGhyZc-oxWk0v691Ybp83OPhWa0bVAmTgSaAuPpyw-ZLg-Nb4eF---vjb1N0ptYltSOQNEZ3BK9jEbWKNHASTcTpFkigcWyLp_sFv79W_DLZEKIb4TxaoGGWA-AMiErFsAnzcU7Ia4ETyp5ucI6o4SifKzI1SKRkUTinlVnvedwXhu21HBviEe_a-fg3uYc7JTMgFNG3kQlfks8AQ","e": "AQAB"},{"kty": "RSA","alg": "RS256","use": "sig","kid": "3ce4a97d502af058eb66ac8d730a592ab7cea7f1","n": "5JjYSEt7lxpIBtnZSAta6uPZpiAFSwzRhhWdBbRr1QuEMPhBvfWsy0PArA8xx5U8AIWftTmhsTdXvkLRLrG_vT4fxjU22K2YBoeTY2v2QIvJOUyhLWOr5wVtG9iWtg86FsGv0ukEgEpx2mqIlpz0KWkEZwIhtYRTtFQh_G4QFjvyAg70iFi7BvSizfZlEDrg5-5ksia0Gy_gmjGvgTLHGBLciKo5d5Aw-DBPJqunnJacVu6rTkBF_QgsOWpO5Y8XuKbjEKNzUHSv6TxumaK7ueU1ckucdtkAHqURzEInbb3BxWYme_3JCzTDMRy4-pEoWR-NyLZwEZxxOtGFQRXhZw","e": "AQAB"}]}'); - $response->getBody()->rewind(); + $response->getBody() + ->write( + '{"keys": [{"kty": "RSA","alg": "RS256","use": "sig","kid": "acde8d7c1997d82dcf5d5ed2858ac8d060cd3ca9","n": "kfQP58EQpxAqZUCiGolkyCio8S3hG9HTMfQpB7VVDB69mK3AN68ZmWeGTIvDnbcslQ1TEhjZ8bKJwWHFlyoJOxeGaEsn0G3xAmPeUW8WjS2tLTKx8DUYOAgto9VOWip5dngZVMrCL85fPk-jiKEL3ODsyddZiOOhBEjapco_RTDPVurVreDnG6mbScCslHda5T6KudyFOQLD77BulIENlpE5Lxh3KFGrGgu_RiVOf-XtHDDExiWOsaUhOSZFkecqF56upROBQRIuNqHv98icbVKRzYcDteRckJGfk12faaQhX24QCDsIrT8NHbbB9eKX7rcnDMp8GxSArct7KyOxyw","e": "AQAB"},{"kty": "RSA","alg": "RS256","use": "sig","kid": "ce760dff481ee9bca45ccab64eada328029bc0aa","n": "47QQ2Ru1h3WWxcTUbwQvhD_ncEw7avXtXDmcY_8zxC9FcPwv6GcAvjoWuF0afBNK4UoNqW9gG_eq96FnMUF0iIVkPio-h3cpOHzAhKN-LHB9UMx3WDCVYxeRjGOgKU8oLz7ioqGhyZc-oxWk0v691Ybp83OPhWa0bVAmTgSaAuPpyw-ZLg-Nb4eF---vjb1N0ptYltSOQNEZ3BK9jEbWKNHASTcTpFkigcWyLp_sFv79W_DLZEKIb4TxaoGGWA-AMiErFsAnzcU7Ia4ETyp5ucI6o4SifKzI1SKRkUTinlVnvedwXhu21HBviEe_a-fg3uYc7JTMgFNG3kQlfks8AQ","e": "AQAB"},{"kty": "RSA","alg": "RS256","use": "sig","kid": "3ce4a97d502af058eb66ac8d730a592ab7cea7f1","n": "5JjYSEt7lxpIBtnZSAta6uPZpiAFSwzRhhWdBbRr1QuEMPhBvfWsy0PArA8xx5U8AIWftTmhsTdXvkLRLrG_vT4fxjU22K2YBoeTY2v2QIvJOUyhLWOr5wVtG9iWtg86FsGv0ukEgEpx2mqIlpz0KWkEZwIhtYRTtFQh_G4QFjvyAg70iFi7BvSizfZlEDrg5-5ksia0Gy_gmjGvgTLHGBLciKo5d5Aw-DBPJqunnJacVu6rTkBF_QgsOWpO5Y8XuKbjEKNzUHSv6TxumaK7ueU1ckucdtkAHqURzEInbb3BxWYme_3JCzTDMRy4-pEoWR-NyLZwEZxxOtGFQRXhZw","e": "AQAB"}]}' + ) + ; + $response->getBody() + ->rewind() + ; /** @var MockClientCallback $httpClient */ $httpClient = $container->get(MockClientCallback::class); $httpClient->set($response); @@ -133,8 +127,14 @@ public function aJWKSetCanBeRetrieveFromADistantX5uThroughConfiguration(): void $client = static::createClient(); $container = $client->getContainer(); $response = $this->messageFactory->createResponse(200); - $response->getBody()->write('["MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVM\nxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR2\n8gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExM\nTYwMTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UE\nCBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWR\nkeS5jb20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYW\nRkeS5jb20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlc\nnRpZmljYXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTt\nwY6vj3D3HKrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqV\nTr9vcyOdQmVZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aL\nGbqGmu75RpRSgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo\n7RJlbmr2EkRTcDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgW\nJCJjPOq8lh8BJ6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAw\nEAAaOCATIwggEuMB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVH\nSMEGDAWgBTSxLDSkdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEA\nMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWR\nkeS5jb20wRgYDVR0fBD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2\nRhZGR5LmNvbS9yZXBvc2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVH\nSAAMDgwNgYIKwYBBQUHAgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j\nb20vcmVwb3NpdG9yeTAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggE\nBANKGwOy9+aG2Z+5mC6IGOgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPI\nUyIXvJxwqoJKSQ3kbTJSMUA2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL\n5CkKSkB2XIsKd83ASe8T+5o0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9\np0iRFEUOOjZv2kWzRaJBydTXRE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsx\nuxN89txJx9OjxUUAiKEngHUuHqDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZ\nEjYx8WnM25sgVjOuH0aBsXBTWVU+4=","MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Z\nhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIE\nluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb\n24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x\nIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDY\nyMFoXDTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZS\nBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgM\niBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN\nADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XC\nAPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux\n6wwdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLO\ntXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWo\nriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZ\nEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ\n4EFgQU0sSw0pHUTBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBu\nzEkMCIGA1UEBxMbVmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQK\nEw5WYWxpQ2VydCwgSW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2x\npY3kgVmFsaWRhdGlvbiBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudm\nFsaWNlcnQuY29tLzEgMB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CA\nQEwDwYDVR0TAQH/BAUwAwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGG\nF2h0dHA6Ly9vY3NwLmdvZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA\n6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybD\nBLBgNVHSAERDBCMEAGBFUdIAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZ\nmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjAN\nBgkqhkiG9w0BAQUFAAOBgQC1QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+\nSn1eocSxI0YGyeR+sBjUZsE4OWBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgM\nQLARzLrUc+cb53S8wGd9D0VmsfSxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j\n09VZw==","MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ\n0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNT\nAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0a\nG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkq\nhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE\n5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTm\nV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZ\nXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQD\nExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9\nAdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5a\nvIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zf\nN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwb\nP7RfZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQU\nAA4GBADt/UG9vUJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQ\nC1u+mNr0HZDzTuIYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMM\nj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd"]'); - $response->getBody()->rewind(); + $response->getBody() + ->write( + '["MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVM\nxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR2\n8gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExM\nTYwMTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UE\nCBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWR\nkeS5jb20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYW\nRkeS5jb20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlc\nnRpZmljYXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTt\nwY6vj3D3HKrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqV\nTr9vcyOdQmVZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aL\nGbqGmu75RpRSgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo\n7RJlbmr2EkRTcDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgW\nJCJjPOq8lh8BJ6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAw\nEAAaOCATIwggEuMB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVH\nSMEGDAWgBTSxLDSkdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEA\nMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWR\nkeS5jb20wRgYDVR0fBD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2\nRhZGR5LmNvbS9yZXBvc2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVH\nSAAMDgwNgYIKwYBBQUHAgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j\nb20vcmVwb3NpdG9yeTAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggE\nBANKGwOy9+aG2Z+5mC6IGOgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPI\nUyIXvJxwqoJKSQ3kbTJSMUA2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL\n5CkKSkB2XIsKd83ASe8T+5o0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9\np0iRFEUOOjZv2kWzRaJBydTXRE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsx\nuxN89txJx9OjxUUAiKEngHUuHqDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZ\nEjYx8WnM25sgVjOuH0aBsXBTWVU+4=","MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Z\nhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIE\nluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb\n24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x\nIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDY\nyMFoXDTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZS\nBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgM\niBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN\nADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XC\nAPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux\n6wwdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLO\ntXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWo\nriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZ\nEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ\n4EFgQU0sSw0pHUTBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBu\nzEkMCIGA1UEBxMbVmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQK\nEw5WYWxpQ2VydCwgSW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2x\npY3kgVmFsaWRhdGlvbiBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudm\nFsaWNlcnQuY29tLzEgMB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CA\nQEwDwYDVR0TAQH/BAUwAwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGG\nF2h0dHA6Ly9vY3NwLmdvZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA\n6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybD\nBLBgNVHSAERDBCMEAGBFUdIAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZ\nmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjAN\nBgkqhkiG9w0BAQUFAAOBgQC1QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+\nSn1eocSxI0YGyeR+sBjUZsE4OWBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgM\nQLARzLrUc+cb53S8wGd9D0VmsfSxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j\n09VZw==","MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ\n0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNT\nAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0a\nG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkq\nhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE\n5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTm\nV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZ\nXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQD\nExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9\nAdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5a\nvIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zf\nN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwb\nP7RfZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQU\nAA4GBADt/UG9vUJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQ\nC1u+mNr0HZDzTuIYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMM\nj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd"]' + ) + ; + $response->getBody() + ->rewind() + ; /** @var MockClientCallback $httpClient */ $httpClient = $container->get(MockClientCallback::class); $httpClient->set($response); diff --git a/tests/Bundle/JoseFramework/Functional/KeyManagement/JwkUriConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/KeyManagement/JwkUriConfigurationTest.php index 93a884e8..63413b99 100644 --- a/tests/Bundle/JoseFramework/Functional/KeyManagement/JwkUriConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/KeyManagement/JwkUriConfigurationTest.php @@ -2,36 +2,25 @@ 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\Tests\Bundle\JoseFramework\Functional\KeyManagement; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\KeyManagementSource; use Jose\Component\KeyManagement\JWKFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group Configuration - * * @internal */ -class JwkUriConfigurationTest extends TestCase +final class JwkUriConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(JWKFactory::class)) { + if (! class_exists(JWKFactory::class)) { static::markTestSkipped('The component "web-token/jwt-key-mgmt" is not installed.'); } } @@ -41,9 +30,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -51,13 +38,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jwk_uris' => false, - ], - ] - ); + 'jwk_uris' => false, + ], + ]); } /** @@ -65,13 +50,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jwk_uris' => [], - ], - ] - ); + 'jwk_uris' => [], + ], + ]); } /** @@ -112,9 +95,6 @@ public function theConfigurationIsInvalidIfNoPathIsSet(): void protected function getConfiguration(): Configuration { - return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\KeyManagement\KeyManagementSource(), - ]); + return new Configuration('jose', [new CoreSource(), new KeyManagementSource()]); } } diff --git a/tests/Bundle/JoseFramework/Functional/KeyManagement/KeyConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/KeyManagement/KeyConfigurationTest.php index c9353033..364c4279 100644 --- a/tests/Bundle/JoseFramework/Functional/KeyManagement/KeyConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/KeyManagement/KeyConfigurationTest.php @@ -2,36 +2,25 @@ 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\Tests\Bundle\JoseFramework\Functional\KeyManagement; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\KeyManagementSource; use Jose\Component\KeyManagement\JWKFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group Configuration - * * @internal */ -class KeyConfigurationTest extends TestCase +final class KeyConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(JWKFactory::class)) { + if (! class_exists(JWKFactory::class)) { static::markTestSkipped('The component "web-token/jwt-key-mgmt" is not installed.'); } } @@ -41,9 +30,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -51,13 +38,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'keys' => false, - ], - ] - ); + 'keys' => false, + ], + ]); } /** @@ -65,13 +50,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'keys' => [], - ], - ] - ); + 'keys' => [], + ], + ]); } /** @@ -247,9 +230,6 @@ public function theX5CConfigurationIsInvalidIfRequiredParametersAreNotSet(): voi protected function getConfiguration(): Configuration { - return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\KeyManagement\KeyManagementSource(), - ]); + return new Configuration('jose', [new CoreSource(), new KeyManagementSource()]); } } diff --git a/tests/Bundle/JoseFramework/Functional/KeyManagement/KeySetConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/KeyManagement/KeySetConfigurationTest.php index 26263c2e..9d9eb9f7 100644 --- a/tests/Bundle/JoseFramework/Functional/KeyManagement/KeySetConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/KeyManagement/KeySetConfigurationTest.php @@ -2,36 +2,25 @@ 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\Tests\Bundle\JoseFramework\Functional\KeyManagement; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\KeyManagement\KeyManagementSource; use Jose\Component\KeyManagement\JWKFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group Configuration - * * @internal */ -class KeySetConfigurationTest extends TestCase +final class KeySetConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(JWKFactory::class)) { + if (! class_exists(JWKFactory::class)) { static::markTestSkipped('The component "web-token/jwt-key-mgmt" is not installed.'); } } @@ -41,9 +30,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -51,13 +38,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'key_sets' => false, - ], - ] - ); + 'key_sets' => false, + ], + ]); } /** @@ -65,13 +50,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'key_sets' => [], - ], - ] - ); + 'key_sets' => [], + ], + ]); } /** @@ -169,9 +152,6 @@ public function theX5UConfigurationIsInvalidIfRequiredParametersAreNotSet(): voi protected function getConfiguration(): Configuration { - return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\KeyManagement\KeyManagementSource(), - ]); + return new Configuration('jose', [new CoreSource(), new KeyManagementSource()]); } } diff --git a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderConfigurationTest.php index 5ed25e63..9628c711 100644 --- a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderConfigurationTest.php @@ -2,37 +2,28 @@ 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\Tests\Bundle\JoseFramework\Functional\NestedToken; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Checker\CheckerSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Encryption\EncryptionSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\NestedToken\NestedToken; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Signature\SignatureSource; use Jose\Bundle\JoseFramework\Services\NestedTokenLoaderFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group functional - * @group NestedToken - * * @internal */ -class NestedTokenBuilderConfigurationTest extends TestCase +final class NestedTokenBuilderConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(NestedTokenLoaderFactory::class)) { + if (! class_exists(NestedTokenLoaderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-nested-token" is not installed.'); } } @@ -42,9 +33,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -52,13 +41,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'nested_token' => false, - ], - ] - ); + 'nested_token' => false, + ], + ]); } /** @@ -66,13 +53,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'nested_token' => [], - ], - ] - ); + 'nested_token' => [], + ], + ]); } /** @@ -80,15 +65,13 @@ public function theConfigurationIsValidIfConfigurationIsEmpty(): void */ public function theConfigurationIsValidIfNoBuilderIsSet(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'nested_token' => [ - 'builders' => [], - ], + 'nested_token' => [ + 'builders' => [], ], - ] - ); + ], + ]); } /** @@ -227,11 +210,11 @@ public function theConfigurationIsValid(): void protected function getConfiguration(): Configuration { return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\Checker\CheckerSource(), - new Source\Signature\SignatureSource(), - new Source\Encryption\EncryptionSource(), - new Source\NestedToken\NestedToken(), + new CoreSource(), + new CheckerSource(), + new SignatureSource(), + new EncryptionSource(), + new NestedToken(), ]); } } diff --git a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderTest.php b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderTest.php index 3d5a41b4..77d02558 100644 --- a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderTest.php +++ b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\NestedToken; use Jose\Bundle\JoseFramework\Services\NestedTokenBuilderFactory; @@ -20,16 +11,13 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; /** - * @group Bundle - * @group functional - * * @internal */ -class NestedTokenBuilderTest extends WebTestCase +final class NestedTokenBuilderTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(NestedTokenLoaderFactory::class)) { + if (! class_exists(NestedTokenLoaderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-nested-token" is not installed.'); } } @@ -118,10 +106,15 @@ public function aNestedTokenCanBeSignedAndEncryptedUsingTheServiceCreatedFromThe $payload, [[ 'key' => $signature_key, - 'protected_header' => ['alg' => 'PS256'], + 'protected_header' => [ + 'alg' => 'PS256', + ], ]], 'jws_compact', - ['alg' => 'RSA-OAEP', 'enc' => 'A128GCM'], + [ + 'alg' => 'RSA-OAEP', + 'enc' => 'A128GCM', + ], [], [[ 'key' => $encryption_key, @@ -178,10 +171,15 @@ public function aNestedTokenCanBeSignedAndEncryptedUsingTheServiceCreatedFromThe $payload, [[ 'key' => $signature_key, - 'protected_header' => ['alg' => 'PS256'], + 'protected_header' => [ + 'alg' => 'PS256', + ], ]], 'jws_compact', - ['alg' => 'RSA-OAEP', 'enc' => 'A128GCM'], + [ + 'alg' => 'RSA-OAEP', + 'enc' => 'A128GCM', + ], [], [[ 'key' => $encryption_key, diff --git a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderConfigurationTest.php index e9ca3dec..f18281bf 100644 --- a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderConfigurationTest.php @@ -2,37 +2,28 @@ 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\Tests\Bundle\JoseFramework\Functional\NestedToken; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Checker\CheckerSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Encryption\EncryptionSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\NestedToken\NestedToken; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Signature\SignatureSource; use Jose\Component\Encryption\JWELoaderFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group functional - * @group NestedToken - * * @internal */ -class NestedTokenLoaderConfigurationTest extends TestCase +final class NestedTokenLoaderConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(JWELoaderFactory::class)) { + if (! class_exists(JWELoaderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-nested-token" is not installed.'); } } @@ -42,9 +33,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -52,13 +41,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'nested_token' => false, - ], - ] - ); + 'nested_token' => false, + ], + ]); } /** @@ -66,13 +53,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'nested_token' => [], - ], - ] - ); + 'nested_token' => [], + ], + ]); } /** @@ -80,15 +65,13 @@ public function theConfigurationIsValidIfConfigurationIsEmpty(): void */ public function theConfigurationIsValidIfNoLoaderIsSet(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'nested_token' => [ - 'loaders' => [], - ], + 'nested_token' => [ + 'loaders' => [], ], - ] - ); + ], + ]); } /** @@ -227,11 +210,11 @@ public function theConfigurationIsValid(): void protected function getConfiguration(): Configuration { return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\Checker\CheckerSource(), - new Source\Signature\SignatureSource(), - new Source\Encryption\EncryptionSource(), - new Source\NestedToken\NestedToken(), + new CoreSource(), + new CheckerSource(), + new SignatureSource(), + new EncryptionSource(), + new NestedToken(), ]); } } diff --git a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderTest.php b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderTest.php index 266b3cda..6a59ce8b 100644 --- a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderTest.php +++ b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\NestedToken; use Jose\Bundle\JoseFramework\Services\NestedTokenLoaderFactory; @@ -20,16 +11,13 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; /** - * @group Bundle - * @group functional - * * @internal */ -class NestedTokenLoaderTest extends WebTestCase +final class NestedTokenLoaderTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(NestedTokenLoaderFactory::class)) { + if (! class_exists(NestedTokenLoaderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-nested-token" is not installed.'); } } @@ -43,7 +31,7 @@ public function theNestedTokenLoaderFactoryIsAvailable(): void $client = static::createClient(); $container = $client->getContainer(); static::assertNotNull($container); - static::assertTrue($container->has(\Jose\Bundle\JoseFramework\Services\NestedTokenLoaderFactory::class)); + static::assertTrue($container->has(NestedTokenLoaderFactory::class)); } /** @@ -112,16 +100,14 @@ public function aNestedTokenCanBeDecryptedAndVerifiedUsingTheServiceCreatedFromT 'dq' => 'R9FUvU88OVzEkTkXl3-5-WusE4DjHmndeZIlu3rifBdfLpq_P-iWPBbGaq9wzQ1c-J7SzCdJqkEJDv5yd2C7rnZ6kpzwBh_nmL8zscAk1qsunnt9CJGAYz7-sGWy1JGShFazfP52ThB4rlCJ0YuEaQMrIzpY77_oLAhpmDA0hLk', 'qi' => 'S8tC7ZknW6hPITkjcwttQOPLVmRfwirRlFAViuDb8NW9CrV_7F2OqUZCqmzHTYAumwGFHI1WVRep7anleWaJjxC_1b3fq_al4qH3Pe-EKiHg6IMazuRtZLUROcThrExDbF5dYbsciDnfRUWLErZ4N1Be0bnxYuPqxwKd9QZwMo0', ]); - $signature_key_set = new JWKSet([ - $signature_key, - ]); + $signature_key_set = new JWKSet([$signature_key]); $payload = '{"iss":"hobbiton.example","exp":1300819380,"http://example.com/is_root":true}'; $token = 'eyJhbGciOiJSU0EtT0FFUCIsImN0eSI6IkpXVCIsImVuYyI6IkExMjhHQ00ifQ.a0JHRoITfpX4qRewImjlStn8m3CPxBV1ueYlVhjurCyrBg3I7YhCRYjphDOOS4E7rXbr2Fn6NyQq-A-gqT0FXqNjVOGrG-bi13mwy7RoYhjTkBEC6P7sMYMXXx4gzMedpiJHQVeyI-zkZV7A9matpgevAJWrXzOUysYGTtwoSN6gtUVtlLaivjvb21O0ul4YxSHV-ByK1kyeetRp_fuYJxHoKLQL9P424sKx2WGYb4zsBIPF4ssl_e5IR7nany-25_UmC2urosNkoFz9cQ82MypZP8gqbQJyPN-Fpp4Z-5o6yV64x6yzDUF_5JCIdl-Qv6H5dMVIY7q1eKpXcV1lWO_2FefEBqXxXvIjLeZivjNkzogCq3-IapSjVFnMjBxjpYLT8muaawo1yy1XXMuinIpNcOY3n4KKrXLrCcteX85m4IIHMZa38s1Hpr56fPPseMA-Jltmt-a9iEDtOzhtxz8AXy9tsCAZV2XBWNG8c3kJusAamBKOYwfk7JhLRDgOnJjlJLhn7TI4UxDp9dCmUXEN6z0v23W15qJIEXNJtqnblpymooeWAHCT4e_Owbim1g0AEpTHUdA2iiLNs9WTX_H_TXuPC8yDDhi1smxS_X_xpkIHkiIHWDOLx03BpqDTivpKkBYwqP2UZkcxqX2Fo_GnVrNwlK7Lgxw6FSQvDO0.GbX1i9kXz0sxXPmA.SZI4IvKHmwpazl_pJQXX3mHv1ANnOU4Wf9-utWYUcKrBNgCe2OFMf66cSJ8k2QkxaQD3_R60MGE9ofomwtky3GFxMeGRjtpMt9OAvVLsAXB0_UTCBGyBg3C2bWLXqZlfJAAoJRUPRk-BimYZY81zVBuIhc7HsQePCpu33SzMsFHjn4lP_idrJz_glZTNgKDt8zdnUPauKTKDNOH1DD4fuzvDYfDIAfqGPyL5sVRwbiXpXdGokEszM-9ChMPqW1QNhzuX_Zul3bvrJwr7nuGZs4cUScY3n8yE3AHCLurgls-A9mz1X38xEaulV18l4Fg9tLejdkAuQZjPbqeHQBJe4IwGD5Ee0dQ-Mtz4NnhkIWx-YKBb_Xo2zI3Q_1sYjKUuis7yWW-HTr_vqvFt0bj7WJf2vzB0TZ3dvsoGaTvPH2dyWwumUrlx4gmPUzBdwTO6ubfYSDUEEz5py0d_OtWeUSYcCYBKD-aM7tXg26qJo21gYjLfhn9zy-W19sOCZGuzgFjPhawXHpvnj_t-0_ES96kogjJLxS1IMU9Y5XmnwZMyNc9EIwnogsCg-hVuvzyP0sIruktmI94_SL1xgMl7o03phcTMxtlMizR88NKU1WkBsiXMCjy1Noue7MD-ShDp5dmM.KnIKEhN8U-3C9s4gtSpjSw'; $jws = $loader->load($token, $encryption_key_set, $signature_key_set, $signature); - static::assertEquals($payload, $jws->getPayload()); - static::assertEquals(0, $signature); + static::assertSame($payload, $jws->getPayload()); + static::assertSame(0, $signature); } /** @@ -166,15 +152,13 @@ public function aNestedTokenCanBeDecryptedAndVerifiedUsingTheServiceCreatedFromT 'dq' => 'R9FUvU88OVzEkTkXl3-5-WusE4DjHmndeZIlu3rifBdfLpq_P-iWPBbGaq9wzQ1c-J7SzCdJqkEJDv5yd2C7rnZ6kpzwBh_nmL8zscAk1qsunnt9CJGAYz7-sGWy1JGShFazfP52ThB4rlCJ0YuEaQMrIzpY77_oLAhpmDA0hLk', 'qi' => 'S8tC7ZknW6hPITkjcwttQOPLVmRfwirRlFAViuDb8NW9CrV_7F2OqUZCqmzHTYAumwGFHI1WVRep7anleWaJjxC_1b3fq_al4qH3Pe-EKiHg6IMazuRtZLUROcThrExDbF5dYbsciDnfRUWLErZ4N1Be0bnxYuPqxwKd9QZwMo0', ]); - $signature_key_set = new JWKSet([ - $signature_key, - ]); + $signature_key_set = new JWKSet([$signature_key]); $payload = '{"iss":"hobbiton.example","exp":1300819380,"http://example.com/is_root":true}'; $token = 'eyJhbGciOiJSU0EtT0FFUCIsImN0eSI6IkpXVCIsImVuYyI6IkExMjhHQ00ifQ.a0JHRoITfpX4qRewImjlStn8m3CPxBV1ueYlVhjurCyrBg3I7YhCRYjphDOOS4E7rXbr2Fn6NyQq-A-gqT0FXqNjVOGrG-bi13mwy7RoYhjTkBEC6P7sMYMXXx4gzMedpiJHQVeyI-zkZV7A9matpgevAJWrXzOUysYGTtwoSN6gtUVtlLaivjvb21O0ul4YxSHV-ByK1kyeetRp_fuYJxHoKLQL9P424sKx2WGYb4zsBIPF4ssl_e5IR7nany-25_UmC2urosNkoFz9cQ82MypZP8gqbQJyPN-Fpp4Z-5o6yV64x6yzDUF_5JCIdl-Qv6H5dMVIY7q1eKpXcV1lWO_2FefEBqXxXvIjLeZivjNkzogCq3-IapSjVFnMjBxjpYLT8muaawo1yy1XXMuinIpNcOY3n4KKrXLrCcteX85m4IIHMZa38s1Hpr56fPPseMA-Jltmt-a9iEDtOzhtxz8AXy9tsCAZV2XBWNG8c3kJusAamBKOYwfk7JhLRDgOnJjlJLhn7TI4UxDp9dCmUXEN6z0v23W15qJIEXNJtqnblpymooeWAHCT4e_Owbim1g0AEpTHUdA2iiLNs9WTX_H_TXuPC8yDDhi1smxS_X_xpkIHkiIHWDOLx03BpqDTivpKkBYwqP2UZkcxqX2Fo_GnVrNwlK7Lgxw6FSQvDO0.GbX1i9kXz0sxXPmA.SZI4IvKHmwpazl_pJQXX3mHv1ANnOU4Wf9-utWYUcKrBNgCe2OFMf66cSJ8k2QkxaQD3_R60MGE9ofomwtky3GFxMeGRjtpMt9OAvVLsAXB0_UTCBGyBg3C2bWLXqZlfJAAoJRUPRk-BimYZY81zVBuIhc7HsQePCpu33SzMsFHjn4lP_idrJz_glZTNgKDt8zdnUPauKTKDNOH1DD4fuzvDYfDIAfqGPyL5sVRwbiXpXdGokEszM-9ChMPqW1QNhzuX_Zul3bvrJwr7nuGZs4cUScY3n8yE3AHCLurgls-A9mz1X38xEaulV18l4Fg9tLejdkAuQZjPbqeHQBJe4IwGD5Ee0dQ-Mtz4NnhkIWx-YKBb_Xo2zI3Q_1sYjKUuis7yWW-HTr_vqvFt0bj7WJf2vzB0TZ3dvsoGaTvPH2dyWwumUrlx4gmPUzBdwTO6ubfYSDUEEz5py0d_OtWeUSYcCYBKD-aM7tXg26qJo21gYjLfhn9zy-W19sOCZGuzgFjPhawXHpvnj_t-0_ES96kogjJLxS1IMU9Y5XmnwZMyNc9EIwnogsCg-hVuvzyP0sIruktmI94_SL1xgMl7o03phcTMxtlMizR88NKU1WkBsiXMCjy1Noue7MD-ShDp5dmM.KnIKEhN8U-3C9s4gtSpjSw'; $jws = $loader->load($token, $encryption_key_set, $signature_key_set, $signature); - static::assertEquals($payload, $jws->getPayload()); - static::assertEquals(0, $signature); + static::assertSame($payload, $jws->getPayload()); + static::assertSame(0, $signature); } } diff --git a/tests/Bundle/JoseFramework/Functional/Normalizer/JWENormalizerTest.php b/tests/Bundle/JoseFramework/Functional/Normalizer/JWENormalizerTest.php index 15b444b3..41a40184 100644 --- a/tests/Bundle/JoseFramework/Functional/Normalizer/JWENormalizerTest.php +++ b/tests/Bundle/JoseFramework/Functional/Normalizer/JWENormalizerTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Normalizer; use Jose\Bundle\JoseFramework\Normalizer\JWENormalizer; @@ -23,19 +14,16 @@ use Symfony\Component\Serializer\Serializer; /** - * @group Bundle - * @group functional - * * @internal */ final class JWENormalizerTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(BaseJWEBuilderFactory::class)) { + if (! class_exists(BaseJWEBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-encryption" is not installed.'); } - if (!class_exists(Serializer::class)) { + if (! class_exists(Serializer::class)) { static::markTestSkipped('The component "symfony/serializer" is not installed.'); } } @@ -99,8 +87,8 @@ public function jWSNormalizerPassesThrough(): void ->build() ; static::assertTrue($serializer->supportsNormalization($jwe)); - static::assertEquals($jwe, $serializer->normalize($jwe)); - static::assertEquals($jwe, $serializer->denormalize($jwe, JWE::class)); + static::assertEqualsCanonicalizing($jwe, $serializer->normalize($jwe)); + static::assertSame($jwe, $serializer->denormalize($jwe, JWE::class)); } /** @@ -111,7 +99,6 @@ public function jWSNormalizerFromContainerPassesThrough(): void static::ensureKernelShutdown(); $client = static::createClient(); $container = $client->getContainer(); - static::assertInstanceOf(ContainerInterface::class, $container); $serializer = $container->get('serializer'); static::assertInstanceOf(Serializer::class, $serializer); $jweFactory = $container->get(JWEBuilderFactory::class); @@ -132,7 +119,7 @@ public function jWSNormalizerFromContainerPassesThrough(): void ->build() ; static::assertTrue($serializer->supportsNormalization($jwe)); - static::assertEquals($jwe, $serializer->normalize($jwe)); - static::assertEquals($jwe, $serializer->denormalize($jwe, JWE::class)); + static::assertEqualsCanonicalizing($jwe, $serializer->normalize($jwe)); + static::assertSame($jwe, $serializer->denormalize($jwe, JWE::class)); } } diff --git a/tests/Bundle/JoseFramework/Functional/Normalizer/JWSNormalizerTest.php b/tests/Bundle/JoseFramework/Functional/Normalizer/JWSNormalizerTest.php index a2d743f3..342b918b 100644 --- a/tests/Bundle/JoseFramework/Functional/Normalizer/JWSNormalizerTest.php +++ b/tests/Bundle/JoseFramework/Functional/Normalizer/JWSNormalizerTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Normalizer; use Jose\Bundle\JoseFramework\Normalizer\JWSNormalizer; @@ -23,19 +14,16 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; /** - * @group Bundle - * @group functional - * * @internal */ final class JWSNormalizerTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(BaseJWSBuilderFactory::class)) { + if (! class_exists(BaseJWSBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } - if (!class_exists(Serializer::class)) { + if (! class_exists(Serializer::class)) { static::markTestSkipped('The component "symfony/serializer" is not installed.'); } } @@ -95,8 +83,8 @@ public function jWSNormalizerPassesThrough(): void ->build() ; static::assertTrue($serializer->supportsNormalization($jws)); - static::assertEquals($jws, $serializer->normalize($jws)); - static::assertEquals($jws, $serializer->denormalize($jws, JWS::class)); + static::assertSame($jws, $serializer->normalize($jws)); + static::assertSame($jws, $serializer->denormalize($jws, JWS::class)); } /** @@ -126,7 +114,7 @@ public function jWSNormalizerFromContainerPassesThrough(): void ->build() ; static::assertTrue($serializer->supportsNormalization($jws)); - static::assertEquals($jws, $serializer->normalize($jws)); - static::assertEquals($jws, $serializer->denormalize($jws, JWS::class)); + static::assertSame($jws, $serializer->normalize($jws)); + static::assertSame($jws, $serializer->denormalize($jws, JWS::class)); } } diff --git a/tests/Bundle/JoseFramework/Functional/Serializer/JWEEncoderTest.php b/tests/Bundle/JoseFramework/Functional/Serializer/JWEEncoderTest.php index a3a50455..e28de020 100644 --- a/tests/Bundle/JoseFramework/Functional/Serializer/JWEEncoderTest.php +++ b/tests/Bundle/JoseFramework/Functional/Serializer/JWEEncoderTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Serializer; use Jose\Bundle\JoseFramework\Serializer\JWEEncoder; @@ -27,19 +18,16 @@ use Symfony\Component\Serializer\Serializer; /** - * @group Bundle - * @group functional - * * @internal */ final class JWEEncoderTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(BaseJWEBuilderFactory::class)) { + if (! class_exists(BaseJWEBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-encryption" is not installed.'); } - if (!class_exists(Serializer::class)) { + if (! class_exists(Serializer::class)) { static::markTestSkipped('The component "symfony/serializer" is not installed.'); } } @@ -203,17 +191,29 @@ public function jWEEncoderSupportsEncodingWithSpecificSignature(): void $this->loadJWE($serializer->encode($jwe, 'jwe_compact'), $jwk, $recipient); $this->loadJWE($serializer->encode($jwe, 'jwe_json_flattened'), $jwk, $recipient); $this->loadJWE($serializer->encode($jwe, 'jwe_json_general'), $jwk, $recipient); - static::assertEquals(0, $recipient); + static::assertSame(0, $recipient); // With context, recipient index = 0 - $this->loadJWE($serializer->encode($jwe, 'jwe_compact', ['recipient_index' => 0]), $jwk, $recipient); - $this->loadJWE($serializer->encode($jwe, 'jwe_json_flattened', ['recipient_index' => 0]), $jwk, $recipient); - $this->loadJWE($serializer->encode($jwe, 'jwe_json_general', ['recipient_index' => 0]), $jwk, $recipient); - static::assertEquals(0, $recipient); + $this->loadJWE($serializer->encode($jwe, 'jwe_compact', [ + 'recipient_index' => 0, + ]), $jwk, $recipient); + $this->loadJWE($serializer->encode($jwe, 'jwe_json_flattened', [ + 'recipient_index' => 0, + ]), $jwk, $recipient); + $this->loadJWE($serializer->encode($jwe, 'jwe_json_general', [ + 'recipient_index' => 0, + ]), $jwk, $recipient); + static::assertSame(0, $recipient); // With context, recipient index = 1 - $this->loadJWE($serializer->encode($jwe, 'jwe_compact', ['recipient_index' => 1]), $jwk2, $recipient); - $this->loadJWE($serializer->encode($jwe, 'jwe_json_flattened', ['recipient_index' => 1]), $jwk2, $recipient); - $this->loadJWE($serializer->encode($jwe, 'jwe_json_general', ['recipient_index' => 1]), $jwk2, $recipient); - static::assertEquals(1, $recipient); + $this->loadJWE($serializer->encode($jwe, 'jwe_compact', [ + 'recipient_index' => 1, + ]), $jwk2, $recipient); + $this->loadJWE($serializer->encode($jwe, 'jwe_json_flattened', [ + 'recipient_index' => 1, + ]), $jwk2, $recipient); + $this->loadJWE($serializer->encode($jwe, 'jwe_json_general', [ + 'recipient_index' => 1, + ]), $jwk2, $recipient); + static::assertSame(1, $recipient); } /** @@ -225,9 +225,7 @@ public function jWEEncoderSupportsCustomSerializerManager(): void $client = static::createClient(); $container = $client->getContainer(); static::assertInstanceOf(ContainerInterface::class, $container); - $jweSerializerManager = new JWESerializerManager([ - new CompactSerializer(), - ]); + $jweSerializerManager = new JWESerializerManager([new CompactSerializer()]); $jweSerializerManagerFactory = $container->get(JWESerializerManagerFactory::class); static::assertInstanceOf(JWESerializerManagerFactory::class, $jweSerializerManagerFactory); $serializer = new JWEEncoder($jweSerializerManagerFactory, $jweSerializerManager); @@ -267,9 +265,7 @@ public function jWEEncoderShouldThrowOnUnsupportedFormatWhenEncoding(): void $client = static::createClient(); $container = $client->getContainer(); static::assertInstanceOf(ContainerInterface::class, $container); - $jweSerializerManager = new JWESerializerManager([ - new CompactSerializer(), - ]); + $jweSerializerManager = new JWESerializerManager([new CompactSerializer()]); $jweSerializerManagerFactory = $container->get(JWESerializerManagerFactory::class); static::assertInstanceOf(JWESerializerManagerFactory::class, $jweSerializerManagerFactory); $serializer = new JWEEncoder($jweSerializerManagerFactory, $jweSerializerManager); @@ -304,9 +300,7 @@ public function jWEEncoderShouldThrowOnUnsupportedFormatWhenDecoding(): void $client = static::createClient(); $container = $client->getContainer(); static::assertInstanceOf(ContainerInterface::class, $container); - $jweSerializerManager = new JWESerializerManager([ - new CompactSerializer(), - ]); + $jweSerializerManager = new JWESerializerManager([new CompactSerializer()]); $jweSerializerManagerFactory = $container->get(JWESerializerManagerFactory::class); static::assertInstanceOf(JWESerializerManagerFactory::class, $jweSerializerManagerFactory); $serializer = new JWEEncoder($jweSerializerManagerFactory, $jweSerializerManager); diff --git a/tests/Bundle/JoseFramework/Functional/Serializer/JWSEncoderTest.php b/tests/Bundle/JoseFramework/Functional/Serializer/JWSEncoderTest.php index 40b6e24e..bec1c31b 100644 --- a/tests/Bundle/JoseFramework/Functional/Serializer/JWSEncoderTest.php +++ b/tests/Bundle/JoseFramework/Functional/Serializer/JWSEncoderTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Serializer; use Jose\Bundle\JoseFramework\Serializer\JWSEncoder; @@ -25,19 +16,16 @@ use Symfony\Component\Serializer\Serializer; /** - * @group Bundle - * @group functional - * * @internal */ final class JWSEncoderTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(BaseJWSBuilderFactory::class)) { + if (! class_exists(BaseJWSBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } - if (!class_exists(Serializer::class)) { + if (! class_exists(Serializer::class)) { static::markTestSkipped('The component "symfony/serializer" is not installed.'); } } @@ -108,9 +96,18 @@ public function jWSEncoderCanEncodeAllFormats(): void ]) ->build() ; - static::assertEquals('eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', $serializer->encode($jws, 'jws_compact')); - static::assertEquals('{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY"}', $serializer->encode($jws, 'jws_json_flattened')); - static::assertEquals('{"payload":"SGVsbG8gV29ybGQh","signatures":[{"signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY","protected":"eyJhbGciOiJIUzI1NiJ9"}]}', $serializer->encode($jws, 'jws_json_general')); + static::assertSame( + 'eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', + $serializer->encode($jws, 'jws_compact') + ); + static::assertSame( + '{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY"}', + $serializer->encode($jws, 'jws_json_flattened') + ); + static::assertSame( + '{"payload":"SGVsbG8gV29ybGQh","signatures":[{"signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY","protected":"eyJhbGciOiJIUzI1NiJ9"}]}', + $serializer->encode($jws, 'jws_json_general') + ); } /** @@ -140,9 +137,27 @@ public function jWSEncoderCanDecodeAllFormats(): void ]) ->build() ; - static::assertEquals($jws, $serializer->decode('eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', 'jws_compact')); - static::assertEquals($jws, $serializer->decode('{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY"}', 'jws_json_flattened')); - static::assertEquals($jws, $serializer->decode('{"payload":"SGVsbG8gV29ybGQh","signatures":[{"signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY","protected":"eyJhbGciOiJIUzI1NiJ9"}]}', 'jws_json_general')); + static::assertEqualsCanonicalizing( + $jws, + $serializer->decode( + 'eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', + 'jws_compact' + ) + ); + static::assertEqualsCanonicalizing( + $jws, + $serializer->decode( + '{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY"}', + 'jws_json_flattened' + ) + ); + static::assertEqualsCanonicalizing( + $jws, + $serializer->decode( + '{"payload":"SGVsbG8gV29ybGQh","signatures":[{"signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY","protected":"eyJhbGciOiJIUzI1NiJ9"}]}', + 'jws_json_general' + ) + ); } /** @@ -186,17 +201,44 @@ public function jWSEncoderSupportsEncodingWithSpecificSignature(): void 'signature_index' => 1, ]; // No context, signature index = 0 - static::assertEquals('eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', $serializer->encode($jws, 'jws_compact')); - static::assertEquals('{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY"}', $serializer->encode($jws, 'jws_json_flattened')); - static::assertEquals('{"payload":"SGVsbG8gV29ybGQh","signatures":[{"signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY","protected":"eyJhbGciOiJIUzI1NiJ9"},{"signature":"ZIKPsa3NtNoACjvh6fhfg6PZgmKiuss_9sDPtMZxtNU","protected":"eyJhbGciOiJIUzI1NiJ9"}]}', $serializer->encode($jws, 'jws_json_general')); + static::assertSame( + 'eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', + $serializer->encode($jws, 'jws_compact') + ); + static::assertSame( + '{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY"}', + $serializer->encode($jws, 'jws_json_flattened') + ); + static::assertSame( + '{"payload":"SGVsbG8gV29ybGQh","signatures":[{"signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY","protected":"eyJhbGciOiJIUzI1NiJ9"},{"signature":"ZIKPsa3NtNoACjvh6fhfg6PZgmKiuss_9sDPtMZxtNU","protected":"eyJhbGciOiJIUzI1NiJ9"}]}', + $serializer->encode($jws, 'jws_json_general') + ); // With context, signature index = 0 - static::assertEquals('eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', $serializer->encode($jws, 'jws_compact', $context)); - static::assertEquals('{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY"}', $serializer->encode($jws, 'jws_json_flattened', $context)); - static::assertEquals('{"payload":"SGVsbG8gV29ybGQh","signatures":[{"signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY","protected":"eyJhbGciOiJIUzI1NiJ9"},{"signature":"ZIKPsa3NtNoACjvh6fhfg6PZgmKiuss_9sDPtMZxtNU","protected":"eyJhbGciOiJIUzI1NiJ9"}]}', $serializer->encode($jws, 'jws_json_general', $context)); + static::assertSame( + 'eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', + $serializer->encode($jws, 'jws_compact', $context) + ); + static::assertSame( + '{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY"}', + $serializer->encode($jws, 'jws_json_flattened', $context) + ); + static::assertSame( + '{"payload":"SGVsbG8gV29ybGQh","signatures":[{"signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY","protected":"eyJhbGciOiJIUzI1NiJ9"},{"signature":"ZIKPsa3NtNoACjvh6fhfg6PZgmKiuss_9sDPtMZxtNU","protected":"eyJhbGciOiJIUzI1NiJ9"}]}', + $serializer->encode($jws, 'jws_json_general', $context) + ); // With context, signature index = 1 - static::assertEquals('eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.ZIKPsa3NtNoACjvh6fhfg6PZgmKiuss_9sDPtMZxtNU', $serializer->encode($jws, 'jws_compact', $context2)); - static::assertEquals('{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"ZIKPsa3NtNoACjvh6fhfg6PZgmKiuss_9sDPtMZxtNU"}', $serializer->encode($jws, 'jws_json_flattened', $context2)); - static::assertEquals('{"payload":"SGVsbG8gV29ybGQh","signatures":[{"signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY","protected":"eyJhbGciOiJIUzI1NiJ9"},{"signature":"ZIKPsa3NtNoACjvh6fhfg6PZgmKiuss_9sDPtMZxtNU","protected":"eyJhbGciOiJIUzI1NiJ9"}]}', $serializer->encode($jws, 'jws_json_general', $context2)); + static::assertSame( + 'eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.ZIKPsa3NtNoACjvh6fhfg6PZgmKiuss_9sDPtMZxtNU', + $serializer->encode($jws, 'jws_compact', $context2) + ); + static::assertSame( + '{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"ZIKPsa3NtNoACjvh6fhfg6PZgmKiuss_9sDPtMZxtNU"}', + $serializer->encode($jws, 'jws_json_flattened', $context2) + ); + static::assertSame( + '{"payload":"SGVsbG8gV29ybGQh","signatures":[{"signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY","protected":"eyJhbGciOiJIUzI1NiJ9"},{"signature":"ZIKPsa3NtNoACjvh6fhfg6PZgmKiuss_9sDPtMZxtNU","protected":"eyJhbGciOiJIUzI1NiJ9"}]}', + $serializer->encode($jws, 'jws_json_general', $context2) + ); } /** @@ -208,9 +250,7 @@ public function jWSEncoderSupportsCustomSerializerManager(): void $client = static::createClient(); $container = $client->getContainer(); static::assertInstanceOf(ContainerInterface::class, $container); - $jwsSerializerManager = new JWSSerializerManager([ - new CompactSerializer(), - ]); + $jwsSerializerManager = new JWSSerializerManager([new CompactSerializer()]); $jwsSerializerManagerFactory = $container->get(JWSSerializerManagerFactory::class); static::assertInstanceOf(JWSSerializerManagerFactory::class, $jwsSerializerManagerFactory); $serializer = new JWSEncoder($jwsSerializerManagerFactory, $jwsSerializerManager); @@ -235,8 +275,17 @@ public function jWSEncoderSupportsCustomSerializerManager(): void static::assertTrue($serializer->supportsDecoding('jws_compact')); static::assertFalse($serializer->supportsDecoding('jws_json_flattened')); static::assertFalse($serializer->supportsDecoding('jws_json_general')); - static::assertEquals('eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', $serializer->encode($jws, 'jws_compact')); - static::assertEquals($jws, $serializer->decode('eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', 'jws_compact')); + static::assertSame( + 'eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', + $serializer->encode($jws, 'jws_compact') + ); + static::assertEqualsCanonicalizing( + $jws, + $serializer->decode( + 'eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', + 'jws_compact' + ) + ); } /** @@ -248,9 +297,7 @@ public function jWSEncoderShouldThrowOnUnsupportedFormatWhenEncoding(): void $client = static::createClient(); $container = $client->getContainer(); static::assertInstanceOf(ContainerInterface::class, $container); - $serializerManager = new JWSSerializerManager([ - new CompactSerializer(), - ]); + $serializerManager = new JWSSerializerManager([new CompactSerializer()]); $jwsSerializerManagerFactory = $container->get(JWSSerializerManagerFactory::class); static::assertInstanceOf(JWSSerializerManagerFactory::class, $jwsSerializerManagerFactory); $serializer = new JWSEncoder($jwsSerializerManagerFactory, $serializerManager); @@ -269,7 +316,10 @@ public function jWSEncoderShouldThrowOnUnsupportedFormatWhenEncoding(): void ]) ->build() ; - static::assertEquals('eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', $serializer->encode($jws, 'jws_compact')); + static::assertSame( + 'eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', + $serializer->encode($jws, 'jws_compact') + ); $this->expectExceptionMessage('Cannot encode JWS to jws_json_flattened format.'); $serializer->encode($jws, 'jws_json_flattened'); } @@ -283,9 +333,7 @@ public function jWSEncoderShouldThrowOnUnsupportedFormatWhenDecoding(): void $client = static::createClient(); $container = $client->getContainer(); static::assertInstanceOf(ContainerInterface::class, $container); - $serializerManager = new JWSSerializerManager([ - new CompactSerializer(), - ]); + $serializerManager = new JWSSerializerManager([new CompactSerializer()]); $jwsSerializerManagerFactory = $container->get(JWSSerializerManagerFactory::class); static::assertInstanceOf(JWSSerializerManagerFactory::class, $jwsSerializerManagerFactory); $serializer = new JWSEncoder($jwsSerializerManagerFactory, $serializerManager); @@ -304,8 +352,17 @@ public function jWSEncoderShouldThrowOnUnsupportedFormatWhenDecoding(): void ]) ->build() ; - static::assertEquals($jws, $serializer->decode('eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', 'jws_compact')); + static::assertEqualsCanonicalizing( + $jws, + $serializer->decode( + 'eyJhbGciOiJIUzI1NiJ9.SGVsbG8gV29ybGQh.qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY', + 'jws_compact' + ) + ); $this->expectExceptionMessage('Cannot decode JWS from jws_json_flattened format.'); - $serializer->decode('{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY"}', 'jws_json_flattened'); + $serializer->decode( + '{"payload":"SGVsbG8gV29ybGQh","protected":"eyJhbGciOiJIUzI1NiJ9","signature":"qTzr2HflJbt-MDo1Ye7i5W85avH4hrhvb1U6tbd_mzY"}', + 'jws_json_flattened' + ); } } diff --git a/tests/Bundle/JoseFramework/Functional/Signature/JWSBuilderTest.php b/tests/Bundle/JoseFramework/Functional/Signature/JWSBuilderTest.php index a36a7f2f..ca980921 100644 --- a/tests/Bundle/JoseFramework/Functional/Signature/JWSBuilderTest.php +++ b/tests/Bundle/JoseFramework/Functional/Signature/JWSBuilderTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Signature; use Jose\Bundle\JoseFramework\Services\JWSBuilder; @@ -20,16 +11,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class JWSBuilderTest extends WebTestCase +final class JWSBuilderTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JWSBuilderFactory::class)) { + if (! class_exists(JWSBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } } diff --git a/tests/Bundle/JoseFramework/Functional/Signature/JWSComputationTest.php b/tests/Bundle/JoseFramework/Functional/Signature/JWSComputationTest.php index 0b60fc11..7cef4bea 100644 --- a/tests/Bundle/JoseFramework/Functional/Signature/JWSComputationTest.php +++ b/tests/Bundle/JoseFramework/Functional/Signature/JWSComputationTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Signature; use Jose\Component\Core\JWK; @@ -22,16 +13,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class JWSComputationTest extends WebTestCase +final class JWSComputationTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JWSBuilderFactory::class)) { + if (! class_exists(JWSBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } } diff --git a/tests/Bundle/JoseFramework/Functional/Signature/JWSLoaderTest.php b/tests/Bundle/JoseFramework/Functional/Signature/JWSLoaderTest.php index c512624e..f829589f 100644 --- a/tests/Bundle/JoseFramework/Functional/Signature/JWSLoaderTest.php +++ b/tests/Bundle/JoseFramework/Functional/Signature/JWSLoaderTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Signature; use Jose\Bundle\JoseFramework\Services\JWSLoaderFactory as JWSLoaderFactoryService; @@ -20,16 +11,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class JWSLoaderTest extends WebTestCase +final class JWSLoaderTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JWSLoaderFactory::class)) { + if (! class_exists(JWSLoaderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } } @@ -61,8 +49,8 @@ public function theWELoaderFactoryCanCreateAJWSLoader(): void $jws = $jwsLoaderFactory->create(['jws_compact'], ['RS512']); - static::assertEquals(['jws_compact'], $jws->getSerializerManager()->list()); - static::assertEquals(['RS512'], $jws->getJwsVerifier()->getSignatureAlgorithmManager()->list()); + static::assertSame(['jws_compact'], $jws->getSerializerManager()->list()); + static::assertSame(['RS512'], $jws->getJwsVerifier()->getSignatureAlgorithmManager()->list()); } /** diff --git a/tests/Bundle/JoseFramework/Functional/Signature/JWSSerializerTest.php b/tests/Bundle/JoseFramework/Functional/Signature/JWSSerializerTest.php index dfe0c4c2..6afdfedb 100644 --- a/tests/Bundle/JoseFramework/Functional/Signature/JWSSerializerTest.php +++ b/tests/Bundle/JoseFramework/Functional/Signature/JWSSerializerTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Signature; use Jose\Component\Signature\JWSBuilderFactory; @@ -19,16 +10,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class JWSSerializerTest extends WebTestCase +final class JWSSerializerTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JWSBuilderFactory::class)) { + if (! class_exists(JWSBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } } diff --git a/tests/Bundle/JoseFramework/Functional/Signature/JWSVerifierTest.php b/tests/Bundle/JoseFramework/Functional/Signature/JWSVerifierTest.php index 21c1f502..39f6813b 100644 --- a/tests/Bundle/JoseFramework/Functional/Signature/JWSVerifierTest.php +++ b/tests/Bundle/JoseFramework/Functional/Signature/JWSVerifierTest.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\Functional\Signature; use Jose\Bundle\JoseFramework\Services\JWSVerifierFactory as JWSVerifierFactoryService; @@ -20,16 +11,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @group Bundle - * @group functional - * * @internal */ -class JWSVerifierTest extends WebTestCase +final class JWSVerifierTest extends WebTestCase { protected function setUp(): void { - if (!class_exists(JWSBuilderFactory::class)) { + if (! class_exists(JWSBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } } diff --git a/tests/Bundle/JoseFramework/Functional/Signature/JwsBuilderConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/Signature/JwsBuilderConfigurationTest.php index e0eb230f..58e8f250 100644 --- a/tests/Bundle/JoseFramework/Functional/Signature/JwsBuilderConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/Signature/JwsBuilderConfigurationTest.php @@ -2,36 +2,25 @@ 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\Tests\Bundle\JoseFramework\Functional\Signature; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Signature\SignatureSource; use Jose\Component\Signature\JWSBuilderFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group Configuration - * * @internal */ -class JwsBuilderConfigurationTest extends TestCase +final class JwsBuilderConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(JWSBuilderFactory::class)) { + if (! class_exists(JWSBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } } @@ -41,9 +30,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -51,13 +38,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jws' => false, - ], - ] - ); + 'jws' => false, + ], + ]); } /** @@ -65,13 +50,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jws' => [], - ], - ] - ); + 'jws' => [], + ], + ]); } /** @@ -79,15 +62,13 @@ public function theConfigurationIsValidIfConfigurationIsEmpty(): void */ public function theConfigurationIsInvalidIfBuilderIsSet(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jws' => [ - 'builders' => [], - ], + 'jws' => [ + 'builders' => [], ], - ] - ); + ], + ]); } /** @@ -132,9 +113,6 @@ public function theConfigurationIsInvalidIfTheSignatureAlgorithmIsEmpty(): void protected function getConfiguration(): Configuration { - return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\Signature\SignatureSource(), - ]); + return new Configuration('jose', [new CoreSource(), new SignatureSource()]); } } diff --git a/tests/Bundle/JoseFramework/Functional/Signature/JwsVerifierConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/Signature/JwsVerifierConfigurationTest.php index 2bac288d..d29b9fea 100644 --- a/tests/Bundle/JoseFramework/Functional/Signature/JwsVerifierConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/Signature/JwsVerifierConfigurationTest.php @@ -2,36 +2,25 @@ 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\Tests\Bundle\JoseFramework\Functional\Signature; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Signature\SignatureSource; use Jose\Component\Signature\JWSBuilderFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group Configuration - * * @internal */ -class JwsVerifierConfigurationTest extends TestCase +final class JwsVerifierConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(JWSBuilderFactory::class)) { + if (! class_exists(JWSBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } } @@ -41,9 +30,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -51,13 +38,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jws' => false, - ], - ] - ); + 'jws' => false, + ], + ]); } /** @@ -65,13 +50,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jws' => [], - ], - ] - ); + 'jws' => [], + ], + ]); } /** @@ -79,15 +62,13 @@ public function theConfigurationIsValidIfConfigurationIsEmpty(): void */ public function theConfigurationIsInvalidIfBuilderIsSet(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jws' => [ - 'verifiers' => [], - ], + 'jws' => [ + 'verifiers' => [], ], - ] - ); + ], + ]); } /** @@ -132,9 +113,6 @@ public function theConfigurationIsInvalidIfTheSignatureAlgorithmIsEmpty(): void protected function getConfiguration(): Configuration { - return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\Signature\SignatureSource(), - ]); + return new Configuration('jose', [new CoreSource(), new SignatureSource()]); } } diff --git a/tests/Bundle/JoseFramework/Functional/Signature/SerializerConfigurationTest.php b/tests/Bundle/JoseFramework/Functional/Signature/SerializerConfigurationTest.php index 7e86f70e..78fa6593 100644 --- a/tests/Bundle/JoseFramework/Functional/Signature/SerializerConfigurationTest.php +++ b/tests/Bundle/JoseFramework/Functional/Signature/SerializerConfigurationTest.php @@ -2,36 +2,25 @@ 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\Tests\Bundle\JoseFramework\Functional\Signature; use Jose\Bundle\JoseFramework\DependencyInjection\Configuration; -use Jose\Bundle\JoseFramework\DependencyInjection\Source; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Core\CoreSource; +use Jose\Bundle\JoseFramework\DependencyInjection\Source\Signature\SignatureSource; use Jose\Component\Signature\JWSBuilderFactory; use Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait; use PHPUnit\Framework\TestCase; /** - * @group Bundle - * @group Configuration - * * @internal */ -class SerializerConfigurationTest extends TestCase +final class SerializerConfigurationTest extends TestCase { use ConfigurationTestCaseTrait; protected function setUp(): void { - if (!class_exists(JWSBuilderFactory::class)) { + if (! class_exists(JWSBuilderFactory::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } } @@ -41,9 +30,7 @@ protected function setUp(): void */ public function theConfigurationIsValidIfNoConfigurationIsSet(): void { - $this->assertConfigurationIsValid( - [] - ); + $this->assertConfigurationIsValid([]); } /** @@ -51,13 +38,11 @@ public function theConfigurationIsValidIfNoConfigurationIsSet(): void */ public function theConfigurationIsValidIfConfigurationIsFalse(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jws' => false, - ], - ] - ); + 'jws' => false, + ], + ]); } /** @@ -65,13 +50,11 @@ public function theConfigurationIsValidIfConfigurationIsFalse(): void */ public function theConfigurationIsValidIfConfigurationIsEmpty(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jws' => [], - ], - ] - ); + 'jws' => [], + ], + ]); } /** @@ -79,15 +62,13 @@ public function theConfigurationIsValidIfConfigurationIsEmpty(): void */ public function theConfigurationIsValidIfNoSerializerIsSet(): void { - $this->assertConfigurationIsValid( + $this->assertConfigurationIsValid([ [ - [ - 'jws' => [ - 'serializers' => [], - ], + 'jws' => [ + 'serializers' => [], ], - ] - ); + ], + ]); } /** @@ -132,9 +113,6 @@ public function theConfigurationIsInvalidIfTheSerializerListIsEmpty(): void protected function getConfiguration(): Configuration { - return new Configuration('jose', [ - new Source\Core\CoreSource(), - new Source\Signature\SignatureSource(), - ]); + return new Configuration('jose', [new CoreSource(), new SignatureSource()]); } } diff --git a/tests/Bundle/JoseFramework/TestBundle/Checker/CustomChecker.php b/tests/Bundle/JoseFramework/TestBundle/Checker/CustomChecker.php index e60907e9..7c7fb79d 100644 --- a/tests/Bundle/JoseFramework/TestBundle/Checker/CustomChecker.php +++ b/tests/Bundle/JoseFramework/TestBundle/Checker/CustomChecker.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\TestBundle\Checker; use InvalidArgumentException; @@ -24,7 +15,7 @@ class CustomChecker implements ClaimChecker, HeaderChecker */ public function checkClaim($value): void { - if (true === $value) { + if ($value === true) { throw new InvalidArgumentException('Custom checker!'); } } @@ -39,7 +30,7 @@ public function supportedClaim(): string */ public function checkHeader($value): void { - if (true === $value) { + if ($value === true) { throw new InvalidArgumentException('Custom checker!'); } } diff --git a/tests/Bundle/JoseFramework/TestBundle/DependencyInjection/TestExtension.php b/tests/Bundle/JoseFramework/TestBundle/DependencyInjection/TestExtension.php index e5b14b46..605b0866 100644 --- a/tests/Bundle/JoseFramework/TestBundle/DependencyInjection/TestExtension.php +++ b/tests/Bundle/JoseFramework/TestBundle/DependencyInjection/TestExtension.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\TestBundle\DependencyInjection; use Jose\Bundle\JoseFramework\Helper\ConfigurationHelper; @@ -20,14 +11,11 @@ use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; use Symfony\Component\HttpKernel\DependencyInjection\Extension; -/** - * Class TestExtension. - */ class TestExtension extends Extension implements PrependExtensionInterface { public function load(array $configs, ContainerBuilder $container): void { - $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); $loader->load('services.php'); } @@ -49,13 +37,56 @@ public function prepend(ContainerBuilder $container): void ConfigurationHelper::addHeaderChecker($container, 'checker2', ['custom_checker'], true); ConfigurationHelper::addJWSBuilder($container, 'builder2', ['RS512', 'HS512', 'ES512'], true); ConfigurationHelper::addJWSVerifier($container, 'loader2', ['RS512', 'HS512', 'ES512'], true); - ConfigurationHelper::addJWSSerializer($container, 'jws_serializer2', ['jws_compact', 'jws_json_flattened', 'jws_json_general'], true); + ConfigurationHelper::addJWSSerializer( + $container, + 'jws_serializer2', + ['jws_compact', 'jws_json_flattened', 'jws_json_general'], + true + ); ConfigurationHelper::addJWSLoader($container, 'jws_loader2', ['jws_compact'], ['HS512'], [], true); ConfigurationHelper::addJWEBuilder($container, 'builder2', ['RSA-OAEP-256'], ['A128GCM'], ['DEF'], true); ConfigurationHelper::addJWEDecrypter($container, 'loader2', ['RSA-OAEP-256'], ['A128GCM'], ['DEF'], true); - ConfigurationHelper::addJWESerializer($container, 'jwe_serializer2', ['jwe_compact', 'jwe_json_flattened', 'jwe_json_general'], true); - ConfigurationHelper::addJWELoader($container, 'jwe_loader2', ['jwe_compact'], ['RSA-OAEP-256'], ['A128GCM'], ['DEF'], [], true); - ConfigurationHelper::addNestedTokenLoader($container, 'nested_token_loader_2', ['jwe_compact'], ['RSA-OAEP'], ['A128GCM'], ['DEF'], [], ['jws_compact'], ['PS256'], [], true, []); - ConfigurationHelper::addNestedTokenBuilder($container, 'nested_token_builder_2', ['jwe_compact'], ['RSA-OAEP'], ['A128GCM'], ['DEF'], ['jws_compact'], ['PS256'], true, []); + ConfigurationHelper::addJWESerializer( + $container, + 'jwe_serializer2', + ['jwe_compact', 'jwe_json_flattened', 'jwe_json_general'], + true + ); + ConfigurationHelper::addJWELoader( + $container, + 'jwe_loader2', + ['jwe_compact'], + ['RSA-OAEP-256'], + ['A128GCM'], + ['DEF'], + [], + true + ); + ConfigurationHelper::addNestedTokenLoader( + $container, + 'nested_token_loader_2', + ['jwe_compact'], + ['RSA-OAEP'], + ['A128GCM'], + ['DEF'], + [], + ['jws_compact'], + ['PS256'], + [], + true, + [] + ); + ConfigurationHelper::addNestedTokenBuilder( + $container, + 'nested_token_builder_2', + ['jwe_compact'], + ['RSA-OAEP'], + ['A128GCM'], + ['DEF'], + ['jws_compact'], + ['PS256'], + true, + [] + ); } } diff --git a/tests/Bundle/JoseFramework/TestBundle/Resources/config/services.php b/tests/Bundle/JoseFramework/TestBundle/Resources/config/services.php index ae6cada1..1ac8b695 100644 --- a/tests/Bundle/JoseFramework/TestBundle/Resources/config/services.php +++ b/tests/Bundle/JoseFramework/TestBundle/Resources/config/services.php @@ -2,27 +2,23 @@ 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. - */ - use Jose\Tests\Bundle\JoseFramework\TestBundle\Checker\CustomChecker; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return function (ContainerConfigurator $container) { - $container = $container->services()->defaults() + $container = $container->services() + ->defaults() ->private() ->autoconfigure() ->autowire() ; $container->set(CustomChecker::class) - ->tag('jose.checker.header', ['alias' => 'custom_checker']) - ->tag('jose.checker.claim', ['alias' => 'custom_checker']) + ->tag('jose.checker.header', [ + 'alias' => 'custom_checker', + ]) + ->tag('jose.checker.claim', [ + 'alias' => 'custom_checker', + ]) ; }; diff --git a/tests/Bundle/JoseFramework/TestBundle/Service/MockClientCallback.php b/tests/Bundle/JoseFramework/TestBundle/Service/MockClientCallback.php index e8937d16..66796938 100644 --- a/tests/Bundle/JoseFramework/TestBundle/Service/MockClientCallback.php +++ b/tests/Bundle/JoseFramework/TestBundle/Service/MockClientCallback.php @@ -2,15 +2,6 @@ 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\Tests\Bundle\JoseFramework\TestBundle\Service; use Psr\Http\Client\ClientInterface; @@ -19,10 +10,7 @@ final class MockClientCallback implements ClientInterface { - /** - * @var ResponseInterface - */ - private $response; + private ?ResponseInterface $response = null; public function set(ResponseInterface $response): void { @@ -33,4 +21,4 @@ public function sendRequest(RequestInterface $request): ResponseInterface { return $this->response; } -} \ No newline at end of file +} diff --git a/tests/Bundle/JoseFramework/TestBundle/TestBundle.php b/tests/Bundle/JoseFramework/TestBundle/TestBundle.php index 2641b7e7..181f3f92 100644 --- a/tests/Bundle/JoseFramework/TestBundle/TestBundle.php +++ b/tests/Bundle/JoseFramework/TestBundle/TestBundle.php @@ -2,22 +2,10 @@ 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\Tests\Bundle\JoseFramework\TestBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; -/** - * Class TestBundle. - */ class TestBundle extends Bundle { } diff --git a/tests/Bundle/JoseFramework/config/config_test.yml b/tests/Bundle/JoseFramework/config/config_test.yml index 1cd46eb0..aaada605 100644 --- a/tests/Bundle/JoseFramework/config/config_test.yml +++ b/tests/Bundle/JoseFramework/config/config_test.yml @@ -1,8 +1,7 @@ framework: test: ~ secret: 'test' - session: - storage_id: 'session.storage.mock_file' + session: ~ router: resource: "%kernel.project_dir%/tests/Bundle/JoseFramework/config/routing.yml" strict_requirements: ~ diff --git a/tests/Component/Checker/AlgorithmHeaderCheckerTest.php b/tests/Component/Checker/AlgorithmHeaderCheckerTest.php index 636d9de9..906da50a 100644 --- a/tests/Component/Checker/AlgorithmHeaderCheckerTest.php +++ b/tests/Component/Checker/AlgorithmHeaderCheckerTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Checker; use Jose\Component\Checker\AlgorithmChecker; @@ -18,12 +9,9 @@ use PHPUnit\Framework\TestCase; /** - * @group HeaderChecker - * @group functional - * * @internal */ -class AlgorithmHeaderCheckerTest extends TestCase +final class AlgorithmHeaderCheckerTest extends TestCase { /** * @test @@ -57,6 +45,6 @@ public function theAlgorithmHeaderIsSupported(): void $checker = new AlgorithmChecker(['foo']); $checker->checkHeader('foo'); static::assertFalse($checker->protectedHeaderOnly()); - static::assertEquals('alg', $checker->supportedHeader()); + static::assertSame('alg', $checker->supportedHeader()); } } diff --git a/tests/Component/Checker/AudienceClaimCheckerTest.php b/tests/Component/Checker/AudienceClaimCheckerTest.php index e1e44887..03e14809 100644 --- a/tests/Component/Checker/AudienceClaimCheckerTest.php +++ b/tests/Component/Checker/AudienceClaimCheckerTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Checker; use Jose\Component\Checker\AudienceChecker; @@ -18,12 +9,9 @@ use PHPUnit\Framework\TestCase; /** - * @group ClaimChecker - * @group functional - * * @internal */ -class AudienceClaimCheckerTest extends TestCase +final class AudienceClaimCheckerTest extends TestCase { /** * @test @@ -69,6 +57,6 @@ public function theAudienceClaimIsSupported(): void $checker = new AudienceChecker('foo'); $checker->checkClaim('foo'); $checker->checkClaim(['foo']); - static::assertEquals('aud', $checker->supportedClaim()); + static::assertSame('aud', $checker->supportedClaim()); } } diff --git a/tests/Component/Checker/AudienceHeaderCheckerTest.php b/tests/Component/Checker/AudienceHeaderCheckerTest.php index 9f58bbd4..32fa0267 100644 --- a/tests/Component/Checker/AudienceHeaderCheckerTest.php +++ b/tests/Component/Checker/AudienceHeaderCheckerTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Checker; use Jose\Component\Checker\AudienceChecker; @@ -18,12 +9,9 @@ use PHPUnit\Framework\TestCase; /** - * @group HeaderChecker - * @group functional - * * @internal */ -class AudienceHeaderCheckerTest extends TestCase +final class AudienceHeaderCheckerTest extends TestCase { /** * @test @@ -70,6 +58,6 @@ public function theAudienceHeaderIsSupported(): void $checker->checkHeader('foo'); $checker->checkHeader(['foo']); static::assertFalse($checker->protectedHeaderOnly()); - static::assertEquals('aud', $checker->supportedHeader()); + static::assertSame('aud', $checker->supportedHeader()); } } diff --git a/tests/Component/Checker/ClaimCheckerManagerFactoryTest.php b/tests/Component/Checker/ClaimCheckerManagerFactoryTest.php index 0f936c24..f1b3912a 100644 --- a/tests/Component/Checker/ClaimCheckerManagerFactoryTest.php +++ b/tests/Component/Checker/ClaimCheckerManagerFactoryTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Checker; use InvalidArgumentException; @@ -18,28 +9,23 @@ use Jose\Component\Checker\ClaimCheckerManagerFactory; use Jose\Component\Checker\ExpirationTimeChecker; use Jose\Component\Checker\IssuedAtChecker; +use Jose\Component\Checker\MissingMandatoryClaimException; use Jose\Component\Checker\NotBeforeChecker; use PHPUnit\Framework\TestCase; /** - * @group ClaimChecker - * @group functional - * * @internal */ -class ClaimCheckerManagerFactoryTest extends TestCase +final class ClaimCheckerManagerFactoryTest extends TestCase { - /** - * @var null|ClaimCheckerManagerFactory - */ - private $claimCheckerManagerFactory; + private ?ClaimCheckerManagerFactory $claimCheckerManagerFactory = null; /** * @test */ public function theAliasListOfTheClaimCheckerManagerFactoryIsAvailable(): void { - static::assertEquals(['exp', 'iat', 'nbf', 'aud'], $this->getClaimCheckerManagerFactory()->aliases()); + static::assertSame(['exp', 'iat', 'nbf', 'aud'], $this->getClaimCheckerManagerFactory()->aliases()); } /** @@ -50,7 +36,9 @@ public function theAliasDoesNotExist(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('The claim checker with the alias "foo" is not supported.'); - $this->getClaimCheckerManagerFactory()->create(['foo']); + $this->getClaimCheckerManagerFactory() + ->create(['foo']) + ; } /** @@ -58,7 +46,9 @@ public function theAliasDoesNotExist(): void */ public function iCanCreateAClaimCheckerManager(): void { - $manager = $this->getClaimCheckerManagerFactory()->create(['exp', 'iat', 'nbf', 'aud']); + $manager = $this->getClaimCheckerManagerFactory() + ->create(['exp', 'iat', 'nbf', 'aud']) + ; static::assertCount(4, $manager->getCheckers()); } @@ -75,9 +65,11 @@ public function iCanCheckValidPayloadClaims(): void ]; $expected = $payload; unset($expected['foo']); - $manager = $this->getClaimCheckerManagerFactory()->create(['exp', 'iat', 'nbf', 'aud']); + $manager = $this->getClaimCheckerManagerFactory() + ->create(['exp', 'iat', 'nbf', 'aud']) + ; $result = $manager->check($payload); - static::assertEquals($expected, $result); + static::assertSame($expected, $result); } /** @@ -85,7 +77,7 @@ public function iCanCheckValidPayloadClaims(): void */ public function theMandatoryClaimsAreNotSet(): void { - $this->expectException(\Jose\Component\Checker\MissingMandatoryClaimException::class); + $this->expectException(MissingMandatoryClaimException::class); $this->expectExceptionMessage('The following claims are mandatory: bar.'); $payload = [ @@ -96,13 +88,15 @@ public function theMandatoryClaimsAreNotSet(): void ]; $expected = $payload; unset($expected['foo']); - $manager = $this->getClaimCheckerManagerFactory()->create(['exp', 'iat', 'nbf', 'aud']); + $manager = $this->getClaimCheckerManagerFactory() + ->create(['exp', 'iat', 'nbf', 'aud']) + ; $manager->check($payload, ['exp', 'foo', 'bar']); } private function getClaimCheckerManagerFactory(): ClaimCheckerManagerFactory { - if (null === $this->claimCheckerManagerFactory) { + if ($this->claimCheckerManagerFactory === null) { $this->claimCheckerManagerFactory = new ClaimCheckerManagerFactory(); $this->claimCheckerManagerFactory->add('exp', new ExpirationTimeChecker()); $this->claimCheckerManagerFactory->add('iat', new IssuedAtChecker()); diff --git a/tests/Component/Checker/ClaimCheckerManagerTest.php b/tests/Component/Checker/ClaimCheckerManagerTest.php index 287048d2..b183c97d 100644 --- a/tests/Component/Checker/ClaimCheckerManagerTest.php +++ b/tests/Component/Checker/ClaimCheckerManagerTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Checker; use Jose\Component\Checker\AudienceChecker; @@ -18,23 +9,16 @@ use PHPUnit\Framework\TestCase; /** - * @group ClaimChecker - * @group unit - * * @internal */ final class ClaimCheckerManagerTest extends TestCase { /** - * @covers \Jose\Component\Checker\AudienceChecker - * @covers \Jose\Component\Checker\ClaimCheckerManager * @test */ public function getCheckers(): void { - $checkers = [ - new AudienceChecker('some-expected-audience'), - ]; + $checkers = [new AudienceChecker('some-expected-audience')]; $expectedCheckers = [ 'aud' => $checkers[0], @@ -42,9 +26,6 @@ public function getCheckers(): void $sut = new ClaimCheckerManager($checkers); - static::assertEquals( - $expectedCheckers, - $sut->getCheckers() - ); + static::assertSame($expectedCheckers, $sut->getCheckers()); } } diff --git a/tests/Component/Checker/ExpirationTimeClaimCheckerTest.php b/tests/Component/Checker/ExpirationTimeClaimCheckerTest.php index 4a4183ce..580892ec 100644 --- a/tests/Component/Checker/ExpirationTimeClaimCheckerTest.php +++ b/tests/Component/Checker/ExpirationTimeClaimCheckerTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Checker; use Jose\Component\Checker\ExpirationTimeChecker; @@ -18,12 +9,9 @@ use PHPUnit\Framework\TestCase; /** - * @group ClaimChecker - * @group functional - * * @internal */ -class ExpirationTimeClaimCheckerTest extends TestCase +final class ExpirationTimeClaimCheckerTest extends TestCase { /** * @test @@ -56,6 +44,6 @@ public function theExpirationTimeIsInTheFutur(): void { $checker = new ExpirationTimeChecker(); $checker->checkClaim(time() + 3600); - static::assertEquals('exp', $checker->supportedClaim()); + static::assertSame('exp', $checker->supportedClaim()); } } diff --git a/tests/Component/Checker/HeaderCheckerManagerFactoryTest.php b/tests/Component/Checker/HeaderCheckerManagerFactoryTest.php index 29b2808c..efc24582 100644 --- a/tests/Component/Checker/HeaderCheckerManagerFactoryTest.php +++ b/tests/Component/Checker/HeaderCheckerManagerFactoryTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Checker; use InvalidArgumentException; @@ -25,24 +16,18 @@ use PHPUnit\Framework\TestCase; /** - * @group HeaderChecker - * @group functional - * * @internal */ -class HeaderCheckerManagerFactoryTest extends TestCase +final class HeaderCheckerManagerFactoryTest extends TestCase { - /** - * @var null|HeaderCheckerManagerFactory - */ - private $headerCheckerManagerFactory; + private ?HeaderCheckerManagerFactory $headerCheckerManagerFactory = null; /** * @test */ public function theAliasListOfTheHeaderCheckerManagerFactoryIsAvailable(): void { - static::assertEquals(['aud', 'iss'], $this->getHeaderCheckerManagerFactory()->aliases()); + static::assertSame(['aud', 'iss'], $this->getHeaderCheckerManagerFactory()->aliases()); } /** @@ -53,10 +38,16 @@ public function aHeaderMustNotContainDuplicatedHeaderParameters(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('The header contains duplicated entries: alg.'); - $headerCheckerManager = $this->getHeaderCheckerManagerFactory()->create(['aud', 'iss']); + $headerCheckerManager = $this->getHeaderCheckerManagerFactory() + ->create(['aud', 'iss']) + ; $payload = []; - $protected = ['alg' => 'foo']; - $unprotected = ['alg' => 'foo']; + $protected = [ + 'alg' => 'foo', + ]; + $unprotected = [ + 'alg' => 'foo', + ]; $token = new Token(json_encode($payload), $protected, $unprotected); $headerCheckerManager->check($token, 0); @@ -68,11 +59,17 @@ public function aHeaderMustNotContainDuplicatedHeaderParameters(): void public function theTokenHasCriticalHeaderNotSatisfied(): void { $this->expectException(InvalidHeaderException::class); - $this->expectExceptionMessage('One or more header parameters are marked as critical, but they are missing or have not been checked: alg.'); + $this->expectExceptionMessage( + 'One or more header parameters are marked as critical, but they are missing or have not been checked: alg.' + ); - $headerCheckerManager = $this->getHeaderCheckerManagerFactory()->create(['aud', 'iss']); + $headerCheckerManager = $this->getHeaderCheckerManagerFactory() + ->create(['aud', 'iss']) + ; $payload = []; - $protected = ['crit' => ['alg']]; + $protected = [ + 'crit' => ['alg'], + ]; $unprotected = []; $token = new Token(json_encode($payload), $protected, $unprotected); @@ -84,10 +81,17 @@ public function theTokenHasCriticalHeaderNotSatisfied(): void */ public function theHeaderIsSuccessfullyChecked(): void { - $headerCheckerManager = $this->getHeaderCheckerManagerFactory()->create(['aud', 'iss']); + $headerCheckerManager = $this->getHeaderCheckerManagerFactory() + ->create(['aud', 'iss']) + ; $payload = []; - $protected = ['crit' => ['aud'], 'aud' => 'My Service']; - $unprotected = ['iss' => 'Another Service']; + $protected = [ + 'crit' => ['aud'], + 'aud' => 'My Service', + ]; + $unprotected = [ + 'iss' => 'Another Service', + ]; $token = new Token(json_encode($payload), $protected, $unprotected); $headerCheckerManager->check($token, 0); } @@ -100,10 +104,16 @@ public function theCriticalHeaderParameterMustBeProtected(): void $this->expectException(InvalidHeaderException::class); $this->expectExceptionMessage('The header parameter "crit" must be protected.'); - $headerCheckerManager = $this->getHeaderCheckerManagerFactory()->create(['aud', 'iss']); + $headerCheckerManager = $this->getHeaderCheckerManagerFactory() + ->create(['aud', 'iss']) + ; $payload = []; - $protected = ['aud' => 'My Service']; - $unprotected = ['crit' => ['aud']]; + $protected = [ + 'aud' => 'My Service', + ]; + $unprotected = [ + 'crit' => ['aud'], + ]; $token = new Token(json_encode($payload), $protected, $unprotected); $headerCheckerManager->check($token, 0); } @@ -116,9 +126,14 @@ public function theCriticalHeaderParameterMustBeAListOfHeaderParameters(): void $this->expectException(InvalidHeaderException::class); $this->expectExceptionMessage('The header "crit" must be a list of header parameters.'); - $headerCheckerManager = $this->getHeaderCheckerManagerFactory()->create(['aud', 'iss']); + $headerCheckerManager = $this->getHeaderCheckerManagerFactory() + ->create(['aud', 'iss']) + ; $payload = []; - $protected = ['aud' => 'My Service', 'crit' => true]; + $protected = [ + 'aud' => 'My Service', + 'crit' => true, + ]; $unprotected = []; $token = new Token(json_encode($payload), $protected, $unprotected); $headerCheckerManager->check($token, 0); @@ -129,9 +144,14 @@ public function theCriticalHeaderParameterMustBeAListOfHeaderParameters(): void */ public function theHeaderContainsUnknownParametersAndIsSuccessfullyChecked(): void { - $headerCheckerManager = $this->getHeaderCheckerManagerFactory()->create(['aud', 'iss']); + $headerCheckerManager = $this->getHeaderCheckerManagerFactory() + ->create(['aud', 'iss']) + ; $payload = []; - $protected = ['foo' => 'bar', 'iss' => 'Another Service']; + $protected = [ + 'foo' => 'bar', + 'iss' => 'Another Service', + ]; $unprotected = []; $token = new Token(json_encode($payload), $protected, $unprotected); $headerCheckerManager->check($token, 0); @@ -145,10 +165,17 @@ public function theHeaderDoesNotContainSomeMandatoryParameters(): void $this->expectException(MissingMandatoryHeaderParameterException::class); $this->expectExceptionMessage('The following header parameters are mandatory: mandatory.'); - $headerCheckerManager = $this->getHeaderCheckerManagerFactory()->create(['aud', 'iss']); + $headerCheckerManager = $this->getHeaderCheckerManagerFactory() + ->create(['aud', 'iss']) + ; $payload = []; - $protected = ['aud' => 'Audience', 'iss' => 'Another Service']; - $unprotected = ['foo' => 'bar']; + $protected = [ + 'aud' => 'Audience', + 'iss' => 'Another Service', + ]; + $unprotected = [ + 'foo' => 'bar', + ]; $token = new Token(json_encode($payload), $protected, $unprotected); $headerCheckerManager->check($token, 0, ['aud', 'iss', 'mandatory']); } @@ -161,9 +188,13 @@ public function iTryToCheckATokenThatIsNotSupported(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Unsupported token type.'); - $headerCheckerManager = $this->getHeaderCheckerManagerFactory()->create(['aud', 'iss']); + $headerCheckerManager = $this->getHeaderCheckerManagerFactory() + ->create(['aud', 'iss']) + ; $payload = []; - $protected = ['foo' => 'bar']; + $protected = [ + 'foo' => 'bar', + ]; $unprotected = []; $token = new OtherToken(json_encode($payload), $protected, $unprotected); $headerCheckerManager->check($token, 0); @@ -171,7 +202,7 @@ public function iTryToCheckATokenThatIsNotSupported(): void private function getHeaderCheckerManagerFactory(): HeaderCheckerManagerFactory { - if (null === $this->headerCheckerManagerFactory) { + if ($this->headerCheckerManagerFactory === null) { $this->headerCheckerManagerFactory = new HeaderCheckerManagerFactory(); $this->headerCheckerManagerFactory->add('aud', new AudienceChecker('My Service', true)); $this->headerCheckerManagerFactory->add('iss', new IssuerChecker(['Another Service'])); diff --git a/tests/Component/Checker/IssuedAtClaimCheckerTest.php b/tests/Component/Checker/IssuedAtClaimCheckerTest.php index 429edcc3..986e27b8 100644 --- a/tests/Component/Checker/IssuedAtClaimCheckerTest.php +++ b/tests/Component/Checker/IssuedAtClaimCheckerTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Checker; use Jose\Component\Checker\InvalidClaimException; @@ -18,12 +9,9 @@ use PHPUnit\Framework\TestCase; /** - * @group ClaimChecker - * @group functional - * * @internal */ -class IssuedAtClaimCheckerTest extends TestCase +final class IssuedAtClaimCheckerTest extends TestCase { /** * @test @@ -56,6 +44,6 @@ public function theIssuedAtClaimIsInThePast(): void { $checker = new IssuedAtChecker(); $checker->checkClaim(time() - 3600); - static::assertEquals('iat', $checker->supportedClaim()); + static::assertSame('iat', $checker->supportedClaim()); } } diff --git a/tests/Component/Checker/NotBeforeClaimCheckerTest.php b/tests/Component/Checker/NotBeforeClaimCheckerTest.php index 728f50a0..d9b1cd4d 100644 --- a/tests/Component/Checker/NotBeforeClaimCheckerTest.php +++ b/tests/Component/Checker/NotBeforeClaimCheckerTest.php @@ -2,34 +2,23 @@ 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\Tests\Component\Checker; +use Jose\Component\Checker\InvalidClaimException; use Jose\Component\Checker\NotBeforeChecker; use PHPUnit\Framework\TestCase; /** - * @group ClaimChecker - * @group functional - * * @internal */ -class NotBeforeClaimCheckerTest extends TestCase +final class NotBeforeClaimCheckerTest extends TestCase { /** * @test */ public function theNotBeforeClaimMustBeAnInteger(): void { - $this->expectException(\Jose\Component\Checker\InvalidClaimException::class); + $this->expectException(InvalidClaimException::class); $this->expectExceptionMessage('"nbf" must be an integer.'); $checker = new NotBeforeChecker(); @@ -41,7 +30,7 @@ public function theNotBeforeClaimMustBeAnInteger(): void */ public function theNotBeforeClaimIsInTheFutur(): void { - $this->expectException(\Jose\Component\Checker\InvalidClaimException::class); + $this->expectException(InvalidClaimException::class); $this->expectExceptionMessage('The JWT can not be used yet.'); $checker = new NotBeforeChecker(); @@ -55,6 +44,6 @@ public function theNotBeforeClaimIsInThePast(): void { $checker = new NotBeforeChecker(); $checker->checkClaim(time() - 3600); - static::assertEquals('nbf', $checker->supportedClaim()); + static::assertSame('nbf', $checker->supportedClaim()); } } diff --git a/tests/Component/Checker/Stub/OtherToken.php b/tests/Component/Checker/Stub/OtherToken.php index 16800a01..e29b8a14 100644 --- a/tests/Component/Checker/Stub/OtherToken.php +++ b/tests/Component/Checker/Stub/OtherToken.php @@ -2,26 +2,12 @@ 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\Tests\Component\Checker\Stub; use Jose\Component\Core\JWT; class OtherToken implements JWT { - /** - * @var null|string - */ - private $payload; - /** * @var array */ @@ -32,9 +18,11 @@ class OtherToken implements JWT */ private $unprotectedHeader; - public function __construct(?string $payload, array $protectedHeader, array $unprotectedHeader) - { - $this->payload = $payload; + public function __construct( + private ?string $payload, + array $protectedHeader, + array $unprotectedHeader + ) { $this->protectedHeader = $protectedHeader; $this->unprotectedHeader = $unprotectedHeader; } diff --git a/tests/Component/Checker/Stub/Token.php b/tests/Component/Checker/Stub/Token.php index 500fb794..c681604c 100644 --- a/tests/Component/Checker/Stub/Token.php +++ b/tests/Component/Checker/Stub/Token.php @@ -2,26 +2,12 @@ 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\Tests\Component\Checker\Stub; use Jose\Component\Core\JWT; class Token implements JWT { - /** - * @var null|string - */ - private $payload; - /** * @var array */ @@ -32,9 +18,11 @@ class Token implements JWT */ private $unprotectedHeader; - public function __construct(?string $payload, array $protectedHeader, array $unprotectedHeader) - { - $this->payload = $payload; + public function __construct( + private ?string $payload, + array $protectedHeader, + array $unprotectedHeader + ) { $this->protectedHeader = $protectedHeader; $this->unprotectedHeader = $unprotectedHeader; } diff --git a/tests/Component/Checker/Stub/TokenSupport.php b/tests/Component/Checker/Stub/TokenSupport.php index 3bfc6f33..d7534fdc 100644 --- a/tests/Component/Checker/Stub/TokenSupport.php +++ b/tests/Component/Checker/Stub/TokenSupport.php @@ -2,15 +2,6 @@ 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\Tests\Component\Checker\Stub; use InvalidArgumentException; @@ -19,12 +10,9 @@ class TokenSupport implements TokenTypeSupport { - /** - * @throws InvalidArgumentException if the token is not supported - */ public function retrieveTokenHeaders(JWT $jwt, int $index, array &$protectedHeader, array &$unprotectedHeader): void { - if (!$jwt instanceof Token) { + if (! $jwt instanceof Token) { throw new InvalidArgumentException('Unsupported token.'); } $protectedHeader = $jwt->getProtectedHeader(); diff --git a/tests/Component/Checker/UnencodedPayloadHeaderCheckerTest.php b/tests/Component/Checker/UnencodedPayloadHeaderCheckerTest.php index 44450288..ff0a0a58 100644 --- a/tests/Component/Checker/UnencodedPayloadHeaderCheckerTest.php +++ b/tests/Component/Checker/UnencodedPayloadHeaderCheckerTest.php @@ -2,34 +2,23 @@ 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\Tests\Component\Checker; +use Jose\Component\Checker\InvalidHeaderException; use Jose\Component\Checker\UnencodedPayloadChecker; use PHPUnit\Framework\TestCase; /** - * @group HeaderChecker - * @group functional - * * @internal */ -class UnencodedPayloadHeaderCheckerTest extends TestCase +final class UnencodedPayloadHeaderCheckerTest extends TestCase { /** * @test */ public function theB64HeaderMustBeAnBoolean(): void { - $this->expectException(\Jose\Component\Checker\InvalidHeaderException::class); + $this->expectException(InvalidHeaderException::class); $this->expectExceptionMessage('"b64" must be a boolean.'); $checker = new UnencodedPayloadChecker(); @@ -45,6 +34,6 @@ public function theB64HeaderIsABoolean(): void $checker->checkHeader(true); $checker->checkHeader(false); static::assertTrue($checker->protectedHeaderOnly()); - static::assertEquals('b64', $checker->supportedHeader()); + static::assertSame('b64', $checker->supportedHeader()); } } diff --git a/tests/Component/Console/AnalyzeCommandTest.php b/tests/Component/Console/AnalyzeCommandTest.php index acf80481..b98de255 100644 --- a/tests/Component/Console/AnalyzeCommandTest.php +++ b/tests/Component/Console/AnalyzeCommandTest.php @@ -2,43 +2,35 @@ 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\Tests\Component\Console; -use Jose\Component\Console; +use Jose\Component\Console\KeyAnalyzerCommand; +use Jose\Component\Console\KeysetAnalyzerCommand; use Jose\Component\Core\JWK; use Jose\Component\Core\JWKSet; use Jose\Component\Core\Util\JsonConverter; -use Jose\Component\KeyManagement\Analyzer; +use Jose\Component\KeyManagement\Analyzer\AlgorithmAnalyzer; +use Jose\Component\KeyManagement\Analyzer\KeyAnalyzerManager; +use Jose\Component\KeyManagement\Analyzer\KeyIdentifierAnalyzer; +use Jose\Component\KeyManagement\Analyzer\KeysetAnalyzerManager; +use Jose\Component\KeyManagement\Analyzer\MixedKeyTypes; +use Jose\Component\KeyManagement\Analyzer\MixedPublicAndPrivateKeys; +use Jose\Component\KeyManagement\Analyzer\NoneAnalyzer; +use Jose\Component\KeyManagement\Analyzer\OctAnalyzer; +use Jose\Component\KeyManagement\Analyzer\RsaAnalyzer; +use Jose\Component\KeyManagement\Analyzer\UsageAnalyzer; use PHPUnit\Framework\TestCase; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\BufferedOutput; /** - * @group Console - * @group AnalyzeCommand - * * @internal */ -class AnalyzeCommandTest extends TestCase +final class AnalyzeCommandTest extends TestCase { - /** - * @var null|Analyzer\KeyAnalyzerManager - */ - private $keyAnalyzerManager; + private ?KeyAnalyzerManager $keyAnalyzerManager = null; - /** - * @var null|Analyzer\KeysetAnalyzerManager - */ - private $keysetAnalyzerManager; + private ?KeysetAnalyzerManager $keysetAnalyzerManager = null; /** * @test @@ -55,7 +47,7 @@ public function iCanAnalyzeAKeyAndGetInformation(): void 'jwk' => JsonConverter::encode($jwk), ]); $output = new BufferedOutput(); - $command = new Console\KeyAnalyzerCommand($this->getKeyAnalyzer()); + $command = new KeyAnalyzerCommand($this->getKeyAnalyzer()); $command->run($input, $output); $content = $output->fetch(); static::assertStringContainsString('* The parameter "alg" should be added.', $content); @@ -68,26 +60,28 @@ public function iCanAnalyzeAKeyAndGetInformation(): void */ public function iCanAnalyzeAKeySetAndGetInformation(): void { - $keyset = JWKSet::createFromKeyData(['keys' => [ - [ - 'kty' => 'EC', - 'crv' => 'P-256', - 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', - 'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', + $keyset = JWKSet::createFromKeyData([ + 'keys' => [ + [ + 'kty' => 'EC', + 'crv' => 'P-256', + 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', + 'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', + ], + [ + 'kty' => 'EC', + 'crv' => 'P-521', + 'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk', + 'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2', + ], ], - [ - 'kty' => 'EC', - 'crv' => 'P-521', - 'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk', - 'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2', - ], - ]]); + ]); $input = new ArrayInput([ 'jwkset' => JsonConverter::encode($keyset), ]); $output = new BufferedOutput(); - $command = new Console\KeysetAnalyzerCommand($this->getKeysetAnalyzer(), $this->getKeyAnalyzer()); + $command = new KeysetAnalyzerCommand($this->getKeysetAnalyzer(), $this->getKeyAnalyzer()); $command->run($input, $output); $content = $output->fetch(); static::assertStringContainsString('Analysing key with index/kid "1"', $content); @@ -96,27 +90,27 @@ public function iCanAnalyzeAKeySetAndGetInformation(): void static::assertStringContainsString('* The parameter "use" should be added.', $content); } - private function getKeyAnalyzer(): Analyzer\KeyAnalyzerManager + private function getKeyAnalyzer(): KeyAnalyzerManager { - if (null === $this->keyAnalyzerManager) { - $this->keyAnalyzerManager = new Analyzer\KeyAnalyzerManager(); - $this->keyAnalyzerManager->add(new Analyzer\AlgorithmAnalyzer()); - $this->keyAnalyzerManager->add(new Analyzer\KeyIdentifierAnalyzer()); - $this->keyAnalyzerManager->add(new Analyzer\NoneAnalyzer()); - $this->keyAnalyzerManager->add(new Analyzer\OctAnalyzer()); - $this->keyAnalyzerManager->add(new Analyzer\RsaAnalyzer()); - $this->keyAnalyzerManager->add(new Analyzer\UsageAnalyzer()); + if ($this->keyAnalyzerManager === null) { + $this->keyAnalyzerManager = new KeyAnalyzerManager(); + $this->keyAnalyzerManager->add(new AlgorithmAnalyzer()); + $this->keyAnalyzerManager->add(new KeyIdentifierAnalyzer()); + $this->keyAnalyzerManager->add(new NoneAnalyzer()); + $this->keyAnalyzerManager->add(new OctAnalyzer()); + $this->keyAnalyzerManager->add(new RsaAnalyzer()); + $this->keyAnalyzerManager->add(new UsageAnalyzer()); } return $this->keyAnalyzerManager; } - private function getKeysetAnalyzer(): Analyzer\KeysetAnalyzerManager + private function getKeysetAnalyzer(): KeysetAnalyzerManager { - if (null === $this->keysetAnalyzerManager) { - $this->keysetAnalyzerManager = new Analyzer\KeysetAnalyzerManager(); - $this->keysetAnalyzerManager->add(new Analyzer\MixedKeyTypes()); - $this->keysetAnalyzerManager->add(new Analyzer\MixedPublicAndPrivateKeys()); + if ($this->keysetAnalyzerManager === null) { + $this->keysetAnalyzerManager = new KeysetAnalyzerManager(); + $this->keysetAnalyzerManager->add(new MixedKeyTypes()); + $this->keysetAnalyzerManager->add(new MixedPublicAndPrivateKeys()); } return $this->keysetAnalyzerManager; diff --git a/tests/Component/Console/KeyConversionCommandTest.php b/tests/Component/Console/KeyConversionCommandTest.php index 2289c0ec..6c2ca0b3 100644 --- a/tests/Component/Console/KeyConversionCommandTest.php +++ b/tests/Component/Console/KeyConversionCommandTest.php @@ -2,18 +2,16 @@ 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\Tests\Component\Console; -use Jose\Component\Console; +use Jose\Component\Console\GetThumbprintCommand; +use Jose\Component\Console\KeyFileLoaderCommand; +use Jose\Component\Console\OptimizeRsaKeyCommand; +use Jose\Component\Console\P12CertificateLoaderCommand; +use Jose\Component\Console\PemConverterCommand; +use Jose\Component\Console\PublicKeyCommand; +use Jose\Component\Console\PublicKeysetCommand; +use Jose\Component\Console\X509CertificateLoaderCommand; use Jose\Component\Core\JWK; use Jose\Component\Core\JWKSet; use Jose\Component\Core\Util\JsonConverter; @@ -22,12 +20,9 @@ use Symfony\Component\Console\Output\BufferedOutput; /** - * @group Console - * @group KeyConversionCommand - * * @internal */ -class KeyConversionCommandTest extends TestCase +final class KeyConversionCommandTest extends TestCase { /** * @test @@ -35,10 +30,10 @@ class KeyConversionCommandTest extends TestCase public function iCanLoadAKeyFile(): void { $input = new ArrayInput([ - 'file' => __DIR__.'/Sample/2048b-rsa-example-cert.pem', + 'file' => __DIR__ . '/Sample/2048b-rsa-example-cert.pem', ]); $output = new BufferedOutput(); - $command = new Console\KeyFileLoaderCommand(); + $command = new KeyFileLoaderCommand(); $command->run($input, $output); $content = $output->fetch(); JWK::createFromJson($content); @@ -50,11 +45,11 @@ public function iCanLoadAKeyFile(): void public function iCanLoadAnEncryptedKeyFile(): void { $input = new ArrayInput([ - 'file' => __DIR__.'/Sample/private.es512.encrypted.key', + 'file' => __DIR__ . '/Sample/private.es512.encrypted.key', '--secret' => 'test', ]); $output = new BufferedOutput(); - $command = new Console\KeyFileLoaderCommand(); + $command = new KeyFileLoaderCommand(); $command->run($input, $output); $content = $output->fetch(); JWK::createFromJson($content); @@ -66,11 +61,11 @@ public function iCanLoadAnEncryptedKeyFile(): void public function iCanLoadAPKCS12CertificateFile(): void { $input = new ArrayInput([ - 'file' => __DIR__.'/Sample/CertRSA.p12', + 'file' => __DIR__ . '/Sample/CertRSA.p12', '--secret' => 'certRSA', ]); $output = new BufferedOutput(); - $command = new Console\P12CertificateLoaderCommand(); + $command = new P12CertificateLoaderCommand(); $command->run($input, $output); $content = $output->fetch(); JWK::createFromJson($content); @@ -82,10 +77,10 @@ public function iCanLoadAPKCS12CertificateFile(): void public function iCanLoadAX509CertificateFile(): void { $input = new ArrayInput([ - 'file' => __DIR__.'/Sample/google.crt', + 'file' => __DIR__ . '/Sample/google.crt', ]); $output = new BufferedOutput(); - $command = new Console\X509CertificateLoaderCommand(); + $command = new X509CertificateLoaderCommand(); $command->run($input, $output); $content = $output->fetch(); JWK::createFromJson($content); @@ -107,7 +102,7 @@ public function iCanOptimizeARsaKey(): void 'jwk' => JsonConverter::encode($jwk), ]); $output = new BufferedOutput(); - $command = new Console\OptimizeRsaKeyCommand(); + $command = new OptimizeRsaKeyCommand(); $command->run($input, $output); $content = $output->fetch(); $jwk = JWK::createFromJson($content); @@ -139,7 +134,7 @@ public function iCanConvertARsaKeyIntoPKCS1(): void 'jwk' => JsonConverter::encode($jwk), ]); $output = new BufferedOutput(); - $command = new Console\PemConverterCommand(); + $command = new PemConverterCommand(); $command->run($input, $output); $content = $output->fetch(); static::assertStringContainsString('-----BEGIN RSA PRIVATE KEY-----', $content); @@ -162,7 +157,7 @@ public function iCanConvertAnEcKeyIntoPKCS1(): void 'jwk' => JsonConverter::encode($jwk), ]); $output = new BufferedOutput(); - $command = new Console\PemConverterCommand(); + $command = new PemConverterCommand(); $command->run($input, $output); $content = $output->fetch(); static::assertStringContainsString('-----BEGIN EC PRIVATE KEY-----', $content); @@ -185,10 +180,13 @@ public function iCanConvertAPrivateKeyIntoPublicKey(): void 'jwk' => JsonConverter::encode($jwk), ]); $output = new BufferedOutput(); - $command = new Console\PublicKeyCommand(); + $command = new PublicKeyCommand(); $command->run($input, $output); $content = $output->fetch(); - static::assertStringContainsString('{"kty":"EC","crv":"P-256","x":"YcIMUkalwbeeAVkUF6FP3aBVlCzlqxEd7i0uN_4roA0","y":"bU8wOWJBkTNZ61gB1_4xp-r8-uVsQB8D6Xsl-aKMCy8"}', $content); + static::assertStringContainsString( + '{"kty":"EC","crv":"P-256","x":"YcIMUkalwbeeAVkUF6FP3aBVlCzlqxEd7i0uN_4roA0","y":"bU8wOWJBkTNZ61gB1_4xp-r8-uVsQB8D6Xsl-aKMCy8"}', + $content + ); } /** @@ -196,29 +194,34 @@ public function iCanConvertAPrivateKeyIntoPublicKey(): void */ public function iCanConvertPrivateKeysIntoPublicKeys(): void { - $keyset = JWKSet::createFromKeyData(['keys' => [ - [ - 'kty' => 'EC', - 'crv' => 'P-256', - 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', - 'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', + $keyset = JWKSet::createFromKeyData([ + 'keys' => [ + [ + 'kty' => 'EC', + 'crv' => 'P-256', + 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', + 'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', + ], + [ + 'kty' => 'EC', + 'crv' => 'P-521', + 'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk', + 'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2', + ], ], - [ - 'kty' => 'EC', - 'crv' => 'P-521', - 'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk', - 'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2', - ], - ]]); + ]); $input = new ArrayInput([ 'jwkset' => JsonConverter::encode($keyset), ]); $output = new BufferedOutput(); - $command = new Console\PublicKeysetCommand(); + $command = new PublicKeysetCommand(); $command->run($input, $output); $content = $output->fetch(); - static::assertStringContainsString('{"keys":[{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"},{"kty":"EC","crv":"P-521","x":"AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk","y":"ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2"}]}', $content); + static::assertStringContainsString( + '{"keys":[{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"},{"kty":"EC","crv":"P-521","x":"AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk","y":"ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2"}]}', + $content + ); } /** @@ -238,9 +241,9 @@ public function iCanGetTheThumbprintOfAKey(): void 'jwk' => JsonConverter::encode($jwk), ]); $output = new BufferedOutput(); - $command = new Console\GetThumbprintCommand(); + $command = new GetThumbprintCommand(); $command->run($input, $output); $content = $output->fetch(); - static::assertEquals('NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs', $content); + static::assertSame('NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs', $content); } } diff --git a/tests/Component/Console/KeyCreationCommandTest.php b/tests/Component/Console/KeyCreationCommandTest.php index c8938184..097c102a 100644 --- a/tests/Component/Console/KeyCreationCommandTest.php +++ b/tests/Component/Console/KeyCreationCommandTest.php @@ -2,40 +2,33 @@ 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\Tests\Component\Console; -use ParagonIE\ConstantTime\Base64UrlSafe; use InvalidArgumentException; -use Jose\Component\Console; +use Jose\Component\Console\EcKeyGeneratorCommand; +use Jose\Component\Console\NoneKeyGeneratorCommand; +use Jose\Component\Console\OctKeyGeneratorCommand; +use Jose\Component\Console\OkpKeyGeneratorCommand; +use Jose\Component\Console\RsaKeyGeneratorCommand; +use Jose\Component\Console\SecretKeyGeneratorCommand; use Jose\Component\Core\JWK; +use ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; use RuntimeException; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\BufferedOutput; /** - * @group Console - * @group KeyCreationCommand - * * @internal */ -class KeyCreationCommandTest extends TestCase +final class KeyCreationCommandTest extends TestCase { /** * @test */ public function theEllipticCurveKeyCreationCommandIsAvailable(): void { - $command = new Console\EcKeyGeneratorCommand(); + $command = new EcKeyGeneratorCommand(); static::assertTrue($command->isEnabled()); } @@ -50,7 +43,7 @@ public function theEllipticCurveKeyCreationCommandNeedTheCurveArgument(): void $input = new ArrayInput([]); $output = new BufferedOutput(); - $command = new Console\EcKeyGeneratorCommand(); + $command = new EcKeyGeneratorCommand(); $command->run($input, $output); } @@ -67,7 +60,7 @@ public function iCannotCreateAnEllipticCurveKeyWithAnUnsupportedCurve(): void 'curve' => 'P-128', ]); $output = new BufferedOutput(); - $command = new Console\EcKeyGeneratorCommand(); + $command = new EcKeyGeneratorCommand(); $command->run($input, $output); } @@ -82,7 +75,7 @@ public function iCanCreateAnEllipticCurveKeyWithCurveP256(): void '--random_id' => true, ]); $output = new BufferedOutput(); - $command = new Console\EcKeyGeneratorCommand(); + $command = new EcKeyGeneratorCommand(); $command->run($input, $output); $content = $output->fetch(); @@ -97,10 +90,9 @@ public function iCannotCreateAnOctetKeyWithoutKeySize(): void $this->expectException(RuntimeException::class); $this->expectExceptionMessage('Not enough arguments (missing: "size").'); - $input = new ArrayInput([ - ]); + $input = new ArrayInput([]); $output = new BufferedOutput(); - $command = new Console\OctKeyGeneratorCommand(); + $command = new OctKeyGeneratorCommand(); $command->run($input, $output); } @@ -115,7 +107,7 @@ public function iCanCreateAnOctetKey(): void '--random_id' => true, ]); $output = new BufferedOutput(); - $command = new Console\OctKeyGeneratorCommand(); + $command = new OctKeyGeneratorCommand(); $command->run($input, $output); $content = $output->fetch(); @@ -131,13 +123,13 @@ public function iCanCreateAnOctetKeyUsingASecret(): void 'secret' => 'This is my secret', ]); $output = new BufferedOutput(); - $command = new Console\SecretKeyGeneratorCommand(); + $command = new SecretKeyGeneratorCommand(); $command->run($input, $output); $content = $output->fetch(); $jwk = JWK::createFromJson($content); static::assertTrue($jwk->has('k')); - static::assertEquals('This is my secret', Base64UrlSafe::decode($jwk->get('k'))); + static::assertSame('This is my secret', Base64UrlSafe::decode($jwk->get('k'))); } /** @@ -152,13 +144,13 @@ public function iCanCreateAnOctetKeyUsingABinarySecret(): void '--is_b64', ]); $output = new BufferedOutput(); - $command = new Console\SecretKeyGeneratorCommand(); + $command = new SecretKeyGeneratorCommand(); $command->run($input, $output); $content = $output->fetch(); $jwk = JWK::createFromJson($content); static::assertTrue($jwk->has('k')); - static::assertEquals($secret, Base64UrlSafe::decode($jwk->get('k'))); + static::assertSame($secret, Base64UrlSafe::decode($jwk->get('k'))); } /** @@ -169,10 +161,9 @@ public function iCannotCreateAnOctetKeyPairWithoutKeyCurve(): void $this->expectException(RuntimeException::class); $this->expectExceptionMessage('Not enough arguments (missing: "curve").'); - $input = new ArrayInput([ - ]); + $input = new ArrayInput([]); $output = new BufferedOutput(); - $command = new Console\OkpKeyGeneratorCommand(); + $command = new OkpKeyGeneratorCommand(); $command->run($input, $output); } @@ -187,7 +178,7 @@ public function iCanCreateAnOctetKeyPair(): void '--random_id' => true, ]); $output = new BufferedOutput(); - $command = new Console\OkpKeyGeneratorCommand(); + $command = new OkpKeyGeneratorCommand(); $command->run($input, $output); $content = $output->fetch(); @@ -203,7 +194,7 @@ public function iCanCreateANoneKey(): void '--random_id' => true, ]); $output = new BufferedOutput(); - $command = new Console\NoneKeyGeneratorCommand(); + $command = new NoneKeyGeneratorCommand(); $command->run($input, $output); $content = $output->fetch(); @@ -218,10 +209,9 @@ public function iCannotCreateAnRsaKeyWithoutKeySize(): void $this->expectException(RuntimeException::class); $this->expectExceptionMessage('Not enough arguments (missing: "size").'); - $input = new ArrayInput([ - ]); + $input = new ArrayInput([]); $output = new BufferedOutput(); - $command = new Console\RsaKeyGeneratorCommand(); + $command = new RsaKeyGeneratorCommand(); $command->run($input, $output); } @@ -236,7 +226,7 @@ public function iCanCreateAnRsaKey(): void '--random_id' => true, ]); $output = new BufferedOutput(); - $command = new Console\RsaKeyGeneratorCommand(); + $command = new RsaKeyGeneratorCommand(); $command->run($input, $output); $content = $output->fetch(); diff --git a/tests/Component/Console/KeySetCreationCommandTest.php b/tests/Component/Console/KeySetCreationCommandTest.php index f3551477..89d1b982 100644 --- a/tests/Component/Console/KeySetCreationCommandTest.php +++ b/tests/Component/Console/KeySetCreationCommandTest.php @@ -2,19 +2,13 @@ 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\Tests\Component\Console; use InvalidArgumentException; -use Jose\Component\Console; +use Jose\Component\Console\EcKeysetGeneratorCommand; +use Jose\Component\Console\OctKeysetGeneratorCommand; +use Jose\Component\Console\OkpKeysetGeneratorCommand; +use Jose\Component\Console\RsaKeysetGeneratorCommand; use Jose\Component\Core\JWKSet; use PHPUnit\Framework\TestCase; use RuntimeException; @@ -22,19 +16,16 @@ use Symfony\Component\Console\Output\BufferedOutput; /** - * @group Console - * @group KeySetCreationCommand - * * @internal */ -class KeySetCreationCommandTest extends TestCase +final class KeySetCreationCommandTest extends TestCase { /** * @test */ public function theEllipticCurveKeySetCreationCommandIsAvailable(): void { - $command = new Console\EcKeysetGeneratorCommand(); + $command = new EcKeysetGeneratorCommand(); static::assertTrue($command->isEnabled()); } @@ -49,7 +40,7 @@ public function theEllipticCurveKeySetCreationCommandNeedTheCurveAndQuantityArgu $input = new ArrayInput([]); $output = new BufferedOutput(); - $command = new Console\EcKeysetGeneratorCommand(); + $command = new EcKeysetGeneratorCommand(); $command->run($input, $output); } @@ -67,7 +58,7 @@ public function iCannotCreateAnEllipticCurveKeySetWithAnUnsupportedCurve(): void 'curve' => 'P-128', ]); $output = new BufferedOutput(); - $command = new Console\EcKeysetGeneratorCommand(); + $command = new EcKeysetGeneratorCommand(); $command->run($input, $output); } @@ -83,7 +74,7 @@ public function iCanCreateAnEllipticCurveKeySetWithCurveP256(): void '--random_id' => true, ]); $output = new BufferedOutput(); - $command = new Console\EcKeysetGeneratorCommand(); + $command = new EcKeysetGeneratorCommand(); $command->run($input, $output); $content = $output->fetch(); @@ -102,7 +93,7 @@ public function iCannotCreateAnOctetKeySetWithoutKeySetSize(): void 'quantity' => 2, ]); $output = new BufferedOutput(); - $command = new Console\OctKeysetGeneratorCommand(); + $command = new OctKeysetGeneratorCommand(); $command->run($input, $output); } @@ -118,7 +109,7 @@ public function iCanCreateAnOctetKeySet(): void '--random_id' => true, ]); $output = new BufferedOutput(); - $command = new Console\OctKeysetGeneratorCommand(); + $command = new OctKeysetGeneratorCommand(); $command->run($input, $output); $content = $output->fetch(); @@ -137,7 +128,7 @@ public function iCannotCreateAnOctetKeySetPairWithoutKeySetCurve(): void 'quantity' => 2, ]); $output = new BufferedOutput(); - $command = new Console\OkpKeysetGeneratorCommand(); + $command = new OkpKeysetGeneratorCommand(); $command->run($input, $output); } @@ -153,7 +144,7 @@ public function iCanCreateAnOctetKeySetPair(): void '--random_id' => true, ]); $output = new BufferedOutput(); - $command = new Console\OkpKeysetGeneratorCommand(); + $command = new OkpKeysetGeneratorCommand(); $command->run($input, $output); $content = $output->fetch(); @@ -172,7 +163,7 @@ public function iCannotCreateAnRsaKeySetWithoutKeySetSize(): void 'quantity' => 2, ]); $output = new BufferedOutput(); - $command = new Console\RsaKeysetGeneratorCommand(); + $command = new RsaKeysetGeneratorCommand(); $command->run($input, $output); } @@ -188,7 +179,7 @@ public function iCanCreateAnRsaKeySet(): void '--random_id' => true, ]); $output = new BufferedOutput(); - $command = new Console\RsaKeysetGeneratorCommand(); + $command = new RsaKeysetGeneratorCommand(); $command->run($input, $output); $content = $output->fetch(); diff --git a/tests/Component/Core/AlgorithmManagerFactoryTest.php b/tests/Component/Core/AlgorithmManagerFactoryTest.php index 0cc1250b..961c79d6 100644 --- a/tests/Component/Core/AlgorithmManagerFactoryTest.php +++ b/tests/Component/Core/AlgorithmManagerFactoryTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Core; use InvalidArgumentException; @@ -20,31 +11,23 @@ use TypeError; /** - * @group unit - * @group JWAManager - * * @internal */ -class AlgorithmManagerFactoryTest extends TestCase +final class AlgorithmManagerFactoryTest extends TestCase { - /** - * @var null|AlgorithmManagerFactory - */ - private $algorithmManagerFactory; + private ?AlgorithmManagerFactory $algorithmManagerFactory = null; /** * @test - * @covers \Jose\Component\Core\AlgorithmManagerFactory */ public function iCanListSupportedAliases(): void { - static::assertEquals(['foo'], $this->getAlgorithmManagerFactory()->aliases()); - static::assertEquals(['foo'], array_keys($this->getAlgorithmManagerFactory()->all())); + static::assertSame(['foo'], $this->getAlgorithmManagerFactory()->aliases()); + static::assertSame(['foo'], array_keys($this->getAlgorithmManagerFactory()->all())); } /** * @test - * @covers \Jose\Component\Core\AlgorithmManager */ public function iCannotCreateAnAlgorithmManagerWithABadArgument(): void { @@ -55,7 +38,6 @@ public function iCannotCreateAnAlgorithmManagerWithABadArgument(): void /** * @test - * @covers \Jose\Component\Core\AlgorithmManager */ public function iCannotGetAnAlgorithmThatDoesNotExist(): void { @@ -64,7 +46,7 @@ public function iCannotGetAnAlgorithmThatDoesNotExist(): void $manager = new AlgorithmManager([new FooAlgorithm()]); - static::assertEquals(['foo'], $manager->list()); + static::assertSame(['foo'], $manager->list()); static::assertTrue($manager->has('foo')); static::assertFalse($manager->has('HS384')); $manager->get('HS384'); @@ -72,7 +54,7 @@ public function iCannotGetAnAlgorithmThatDoesNotExist(): void private function getAlgorithmManagerFactory(): AlgorithmManagerFactory { - if (null === $this->algorithmManagerFactory) { + if ($this->algorithmManagerFactory === null) { $this->algorithmManagerFactory = new AlgorithmManagerFactory(); $this->algorithmManagerFactory->add('foo', new FooAlgorithm()); } diff --git a/tests/Component/Core/FooAlgorithm.php b/tests/Component/Core/FooAlgorithm.php index 6d935162..b0115468 100644 --- a/tests/Component/Core/FooAlgorithm.php +++ b/tests/Component/Core/FooAlgorithm.php @@ -2,15 +2,6 @@ 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\Tests\Component\Core; use Jose\Component\Core\Algorithm; diff --git a/tests/Component/Core/JWKSetTest.php b/tests/Component/Core/JWKSetTest.php index 895cea15..76bd524f 100644 --- a/tests/Component/Core/JWKSetTest.php +++ b/tests/Component/Core/JWKSetTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Core; use function count; @@ -20,12 +11,9 @@ use PHPUnit\Framework\TestCase; /** - * @group unit - * @group JWKSet - * * @internal */ -class JWKSetTest extends TestCase +final class JWKSetTest extends TestCase { /** * @test @@ -58,7 +46,9 @@ public function iCannotCreateAKeySetWithBadArguments(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Invalid data.'); - JWKSet::createFromKeyData(['keys' => true]); + JWKSet::createFromKeyData([ + 'keys' => true, + ]); } /** @@ -67,7 +57,7 @@ public function iCannotCreateAKeySetWithBadArguments(): void public function iCanGetAllKeysInAKeySet(): void { $jwkset = $this->getPublicKeySet(); - static::assertEquals(3, count($jwkset->all())); + static::assertSame(3, count($jwkset->all())); } /** @@ -76,8 +66,10 @@ public function iCanGetAllKeysInAKeySet(): void public function iCanAddKeysInAKeySet(): void { $jwkset = $this->getPublicKeySet(); - $new_jwkset = $jwkset->with(new JWK(['kty' => 'none'])); - static::assertEquals(4, count($new_jwkset->all())); + $new_jwkset = $jwkset->with(new JWK([ + 'kty' => 'none', + ])); + static::assertSame(4, count($new_jwkset->all())); static::assertNotSame($jwkset, $new_jwkset); } @@ -90,7 +82,7 @@ public function iCanSelectAKeyWithAlgorithm(): void $jwk = $jwkset->selectKey('enc', new FooAlgorithm()); static::assertInstanceOf(JWK::class, $jwk); - static::assertEquals( + static::assertSame( [ 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', 'kty' => 'FOO', @@ -108,9 +100,11 @@ public function iCanSelectAKeyWithAlgorithmAndKeyId(): void { $jwkset = $this->getPublicKeySet(); - $jwk = $jwkset->selectKey('sig', new FooAlgorithm(), ['kid' => '02491f945c951adf156f370788e8ccdabf8877a8']); + $jwk = $jwkset->selectKey('sig', new FooAlgorithm(), [ + 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', + ]); static::assertInstanceOf(JWK::class, $jwk); - static::assertEquals( + static::assertSame( [ 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', 'kty' => 'FOO', @@ -128,9 +122,11 @@ public function iCanSelectAKeyWithWithKeyId(): void { $jwkset = $this->getPublicKeySet(); - $jwk = $jwkset->selectKey('sig', null, ['kid' => '02491f945c951adf156f370788e8ccdabf8877a8']); + $jwk = $jwkset->selectKey('sig', null, [ + 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', + ]); static::assertInstanceOf(JWK::class, $jwk); - static::assertEquals( + static::assertSame( [ 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', 'kty' => 'FOO', @@ -148,7 +144,9 @@ public function theKeySetDoesNotContainsSuitableAKeyThatFitsOnTheRequirements(): { $jwkset = $this->getPublicKeySet(); - $jwk = $jwkset->selectKey('enc', null, ['kid' => '02491f945c951adf156f370788e8ccdabf8877a8']); + $jwk = $jwkset->selectKey('enc', null, [ + 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', + ]); static::assertNull($jwk); } @@ -157,14 +155,16 @@ public function theKeySetDoesNotContainsSuitableAKeyThatFitsOnTheRequirements(): */ public function iCanCreateAKeySetUsingValues(): void { - $values = ['keys' => [[ - 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', - 'kty' => 'FOO', - 'alg' => 'foo', - 'use' => 'sig', - ]]]; + $values = [ + 'keys' => [[ + 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', + 'kty' => 'FOO', + 'alg' => 'foo', + 'use' => 'sig', + ]], + ]; $jwkset = JWKSet::createFromKeyData($values); - static::assertEquals(1, count($jwkset)); + static::assertSame(1, count($jwkset)); static::assertTrue($jwkset->has('71ee230371d19630bc17fb90ccf20ae632ad8cf8')); static::assertFalse($jwkset->has(0)); } @@ -200,26 +200,29 @@ public function keySet(): void $jwkset = new JWKSet([$jwk1]); $jwkset = $jwkset->with($jwk2); - static::assertEquals('{"keys":[{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","use":"sign","key_ops":["sign"],"alg":"ES256","kid":"0123456789"},{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","d":"jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI","use":"sign","key_ops":["verify"],"alg":"ES256","kid":"9876543210"}]}', json_encode($jwkset)); - static::assertEquals(2, count($jwkset)); - static::assertEquals(2, $jwkset->count()); + static::assertSame( + '{"keys":[{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","use":"sign","key_ops":["sign"],"alg":"ES256","kid":"0123456789"},{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","d":"jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI","use":"sign","key_ops":["verify"],"alg":"ES256","kid":"9876543210"}]}', + json_encode($jwkset) + ); + static::assertSame(2, count($jwkset)); + static::assertSame(2, $jwkset->count()); static::assertTrue($jwkset->has('0123456789')); static::assertTrue($jwkset->has('9876543210')); static::assertFalse($jwkset->has(0)); foreach ($jwkset as $key) { - static::assertEquals('EC', $key->get('kty')); + static::assertSame('EC', $key->get('kty')); } - static::assertEquals('9876543210', $jwkset->get('9876543210')->get('kid')); + static::assertSame('9876543210', $jwkset->get('9876543210')->get('kid')); $jwkset = $jwkset->without('9876543210'); $jwkset = $jwkset->without('9876543210'); - static::assertEquals(1, count($jwkset)); - static::assertEquals(1, $jwkset->count()); + static::assertSame(1, count($jwkset)); + static::assertSame(1, $jwkset->count()); $jwkset = $jwkset->without('0123456789'); - static::assertEquals(0, $jwkset->count()); + static::assertSame(0, $jwkset->count()); } /** @@ -260,26 +263,28 @@ public function keySet2(): void private function getPublicKeySet(): JWKSet { - $keys = ['keys' => [ - [ - 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', - 'kty' => 'FOO', - 'alg' => 'foo', - 'use' => 'enc', - ], - [ - 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', - 'kty' => 'FOO', - 'alg' => 'foo', - 'use' => 'sig', - ], - [ - 'kty' => 'EC', - 'crv' => 'P-256', - 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', - 'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', + $keys = [ + 'keys' => [ + [ + 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', + 'kty' => 'FOO', + 'alg' => 'foo', + 'use' => 'enc', + ], + [ + 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', + 'kty' => 'FOO', + 'alg' => 'foo', + 'use' => 'sig', + ], + [ + 'kty' => 'EC', + 'crv' => 'P-256', + 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', + 'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', + ], ], - ]]; + ]; return JWKSet::createFromKeyData($keys); } diff --git a/tests/Component/Core/JWKTest.php b/tests/Component/Core/JWKTest.php index 33285ea9..70f699af 100644 --- a/tests/Component/Core/JWKTest.php +++ b/tests/Component/Core/JWKTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Core; use InvalidArgumentException; @@ -18,12 +9,9 @@ use PHPUnit\Framework\TestCase; /** - * @group unit - * @group JWK - * * @internal */ -class JWKTest extends TestCase +final class JWKTest extends TestCase { /** * @test @@ -41,22 +29,25 @@ public function aKeyContainsAllExpectedParameters(): void 'bar' => 'plic', ]); - static::assertEquals('EC', $jwk->get('kty')); - static::assertEquals('ES256', $jwk->get('alg')); - static::assertEquals('sig', $jwk->get('use')); + static::assertSame('EC', $jwk->get('kty')); + static::assertSame('ES256', $jwk->get('alg')); + static::assertSame('sig', $jwk->get('use')); static::assertFalse($jwk->has('kid')); - static::assertEquals(['sign'], $jwk->get('key_ops')); - static::assertEquals('P-256', $jwk->get('crv')); + static::assertSame(['sign'], $jwk->get('key_ops')); + static::assertSame('P-256', $jwk->get('crv')); static::assertFalse($jwk->has('x5u')); static::assertFalse($jwk->has('x5c')); static::assertFalse($jwk->has('x5t')); static::assertFalse($jwk->has('x5t#256')); - static::assertEquals('f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', $jwk->get('x')); - static::assertEquals('x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', $jwk->get('y')); - static::assertEquals('{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","use":"sig","key_ops":["sign"],"alg":"ES256","bar":"plic"}', json_encode($jwk)); - static::assertEquals('oKIywvGUpTVTyxMQ3bwIIeQUudfr_CkLMjCE19ECD-U', $jwk->thumbprint('sha256')); - static::assertEquals('EMMMl6Rj75mqhcABihxxl_VCN9s', $jwk->thumbprint('sha1')); - static::assertEquals('dqwHnan4iJ1_eEll-o4Egw', $jwk->thumbprint('md5')); + static::assertSame('f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', $jwk->get('x')); + static::assertSame('x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', $jwk->get('y')); + static::assertSame( + '{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","use":"sig","key_ops":["sign"],"alg":"ES256","bar":"plic"}', + json_encode($jwk) + ); + static::assertSame('oKIywvGUpTVTyxMQ3bwIIeQUudfr_CkLMjCE19ECD-U', $jwk->thumbprint('sha256')); + static::assertSame('EMMMl6Rj75mqhcABihxxl_VCN9s', $jwk->thumbprint('sha1')); + static::assertSame('dqwHnan4iJ1_eEll-o4Egw', $jwk->thumbprint('md5')); } /** @@ -133,7 +124,7 @@ public function iCanConvertAPrivateKeyIntoPublicKey(): void $public = $private->toPublic(); - static::assertEquals(json_encode([ + static::assertSame(json_encode([ 'kty' => 'EC', 'crv' => 'P-256', 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', diff --git a/tests/Component/Core/JsonConverterTest.php b/tests/Component/Core/JsonConverterTest.php index 169aad2f..791640e8 100644 --- a/tests/Component/Core/JsonConverterTest.php +++ b/tests/Component/Core/JsonConverterTest.php @@ -2,34 +2,26 @@ 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\Tests\Component\Core; use Jose\Component\Core\Util\JsonConverter; use PHPUnit\Framework\TestCase; /** - * @group unit - * @group JsonConverter - * * @internal */ -class JsonConverterTest extends TestCase +final class JsonConverterTest extends TestCase { /** * @test */ public function iCanConvertAnObjectIntoAJsonString(): void { - static::assertEquals('{"foo":"BAR"}', JsonConverter::encode(['foo' => 'BAR'])); - static::assertEquals(['foo' => 'BAR'], JsonConverter::decode('{"foo":"BAR"}')); + static::assertSame('{"foo":"BAR"}', JsonConverter::encode([ + 'foo' => 'BAR', + ])); + static::assertSame([ + 'foo' => 'BAR', + ], JsonConverter::decode('{"foo":"BAR"}')); } } diff --git a/tests/Component/Encryption/CompressionTest.php b/tests/Component/Encryption/CompressionTest.php index 591709f4..110c5870 100644 --- a/tests/Component/Encryption/CompressionTest.php +++ b/tests/Component/Encryption/CompressionTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Encryption; use InvalidArgumentException; @@ -20,28 +11,22 @@ /** * Class CompressionTest. * - * @group unit - * * @internal */ -class CompressionTest extends EncryptionTest +final class CompressionTest extends EncryptionTest { /** - * @covers \Jose\Component\Encryption\Compression\CompressionMethodManager * @test */ public function getValidCompressionAlgorithm(): void { - $manager = new CompressionMethodManager([ - new Deflate(), - ]); + $manager = new CompressionMethodManager([new Deflate()]); - static::assertEquals(['DEF'], $manager->list()); + static::assertSame(['DEF'], $manager->list()); $manager->get('DEF'); } /** - * @covers \Jose\Component\Encryption\Compression\CompressionMethodManager * @test */ public function getInvalidCompressionAlgorithm(): void @@ -55,7 +40,6 @@ public function getInvalidCompressionAlgorithm(): void } /** - * @covers \Jose\Component\Encryption\Compression\Deflate * @test */ public function deflate(): void @@ -70,13 +54,14 @@ public function deflate(): void } /** - * @covers \Jose\Component\Encryption\Compression\Deflate * @test */ public function deflateInvalidCompressionLevel(): void { $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage('The compression level can be given as 0 for no compression up to 9 for maximum compression. If -1 given, the default compression level will be the default compression level of the zlib library.'); + $this->expectExceptionMessage( + 'The compression level can be given as 0 for no compression up to 9 for maximum compression. If -1 given, the default compression level will be the default compression level of the zlib library.' + ); new Deflate(100); } diff --git a/tests/Component/Encryption/ECDHESWithX25519EncryptionTest.php b/tests/Component/Encryption/ECDHESWithX25519EncryptionTest.php index 8acc7a92..311e6042 100644 --- a/tests/Component/Encryption/ECDHESWithX25519EncryptionTest.php +++ b/tests/Component/Encryption/ECDHESWithX25519EncryptionTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Encryption; use Jose\Component\Core\JWK; @@ -18,12 +9,9 @@ /** * Class ECDHESWithX25519EncryptionTest. * - * @group ECDHES - * @group unit - * * @internal */ -class ECDHESWithX25519EncryptionTest extends EncryptionTest +final class ECDHESWithX25519EncryptionTest extends EncryptionTest { /** * @see https://tools.ietf.org/html/rfc7516#appendix-B @@ -45,20 +33,29 @@ public function a128CBCHS256EncryptAndDecrypt(): void 'enc' => 'A128GCM', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['ECDH-ES+A128KW'], ['A128GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['ECDH-ES+A128KW'], ['A128GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['ECDH-ES+A128KW'], ['A128GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['ECDH-ES+A128KW'], ['A128GCM'], ['DEF']) + ; $jwt = $jweBuilder - ->create()->withPayload($input) + ->create() + ->withPayload($input) ->withSharedProtectedHeader($protectedHeader) ->addRecipient($receiverKey) ->build() ; - $jwt = $this->getJWESerializerManager()->serialize('jwe_compact', $jwt, 0); + $jwt = $this->getJWESerializerManager() + ->serialize('jwe_compact', $jwt, 0) + ; - $jwe = $this->getJWESerializerManager()->unserialize($jwt); + $jwe = $this->getJWESerializerManager() + ->unserialize($jwt) + ; static::assertTrue($jweDecrypter->decryptUsingKey($jwe, $receiverKey, 0)); static::assertTrue($jwe->hasSharedProtectedHeaderParameter('epk')); - static::assertEquals($input, $jwe->getPayload()); + static::assertSame($input, $jwe->getPayload()); } } diff --git a/tests/Component/Encryption/EncrypterTest.php b/tests/Component/Encryption/EncrypterTest.php index 10806561..33c212b9 100644 --- a/tests/Component/Encryption/EncrypterTest.php +++ b/tests/Component/Encryption/EncrypterTest.php @@ -2,41 +2,35 @@ 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\Tests\Component\Encryption; -use ParagonIE\ConstantTime\Base64UrlSafe; use InvalidArgumentException; use function is_string; use Jose\Component\Core\JWK; use Jose\Component\Core\JWKSet; +use const JSON_THROW_ON_ERROR; +use ParagonIE\ConstantTime\Base64UrlSafe; /** - * @group Encrypter - * @group functional - * * @internal */ -class EncrypterTest extends EncryptionTest +final class EncrypterTest extends EncryptionTest { /** * @test */ public function encryptWithJWTInput(): void { - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload('FOO') + ->create() + ->withPayload('FOO') ->withSharedProtectedHeader([ 'enc' => 'A256CBC-HS512', 'alg' => 'RSA-OAEP-256', @@ -47,17 +41,21 @@ public function encryptWithJWTInput(): void ->build() ; - $jwe = $this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0); + $jwe = $this->getJWESerializerManager() + ->serialize('jwe_json_flattened', $jwe, 0) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwe); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwe) + ; - static::assertEquals('RSA-OAEP-256', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); - static::assertEquals('DEF', $loaded->getSharedProtectedHeaderParameter('zip')); + static::assertSame('RSA-OAEP-256', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('DEF', $loaded->getSharedProtectedHeaderParameter('zip')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); - static::assertEquals('FOO', $loaded->getPayload()); + static::assertSame('FOO', $loaded->getPayload()); } /** @@ -68,19 +66,21 @@ public function duplicatedHeader(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('The header contains duplicated entries: zip.'); - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; $jweBuilder - ->create()->withPayload('FOO') + ->create() + ->withPayload('FOO') ->withSharedProtectedHeader([ 'enc' => 'A256CBC-HS512', 'alg' => 'RSA-OAEP-256', 'zip' => 'DEF', ]) - ->addRecipient( - $this->getRSARecipientKey(), - ['zip' => 'DEF'] - ) + ->addRecipient($this->getRSARecipientKey(), [ + 'zip' => 'DEF', + ]) ; } @@ -89,11 +89,16 @@ public function duplicatedHeader(): void */ public function createCompactJWEUsingFactory(): void { - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload('FOO') + ->create() + ->withPayload('FOO') ->withSharedProtectedHeader([ 'enc' => 'A256CBC-HS512', 'alg' => 'RSA-OAEP-256', @@ -102,18 +107,22 @@ public function createCompactJWEUsingFactory(): void ->addRecipient($this->getRSARecipientKey()) ->build() ; - $jwe = $this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0); + $jwe = $this->getJWESerializerManager() + ->serialize('jwe_compact', $jwe, 0) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwe); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwe) + ; - static::assertEquals('RSA-OAEP-256', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); - static::assertEquals('DEF', $loaded->getSharedProtectedHeaderParameter('zip')); + static::assertSame('RSA-OAEP-256', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('DEF', $loaded->getSharedProtectedHeaderParameter('zip')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); - static::assertEquals('FOO', $loaded->getPayload()); + static::assertSame('FOO', $loaded->getPayload()); } /** @@ -121,11 +130,16 @@ public function createCompactJWEUsingFactory(): void */ public function createFlattenedJWEUsingFactory(): void { - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload('FOO') + ->create() + ->withPayload('FOO') ->withSharedProtectedHeader([ 'enc' => 'A256CBC-HS512', 'alg' => 'RSA-OAEP-256', @@ -134,30 +148,31 @@ public function createFlattenedJWEUsingFactory(): void ->withSharedHeader([ 'foo' => 'bar', ]) - ->addRecipient( - $this->getRSARecipientKey(), - [ - 'plic' => 'ploc', - ] - ) + ->addRecipient($this->getRSARecipientKey(), [ + 'plic' => 'ploc', + ]) ->withAAD('A,B,C,D') ->build() ; - $jwe = $this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0); + $jwe = $this->getJWESerializerManager() + ->serialize('jwe_json_flattened', $jwe, 0) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwe); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwe) + ; - static::assertEquals('RSA-OAEP-256', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); - static::assertEquals('DEF', $loaded->getSharedProtectedHeaderParameter('zip')); - static::assertEquals('bar', $loaded->getSharedHeaderParameter('foo')); - static::assertEquals('A,B,C,D', $loaded->getAAD()); - static::assertEquals('ploc', $loaded->getRecipient(0)->getHeaderParameter('plic')); + static::assertSame('RSA-OAEP-256', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('DEF', $loaded->getSharedProtectedHeaderParameter('zip')); + static::assertSame('bar', $loaded->getSharedHeaderParameter('foo')); + static::assertSame('A,B,C,D', $loaded->getAAD()); + static::assertSame('ploc', $loaded->getRecipient(0)->getHeaderParameter('plic')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); - static::assertEquals('FOO', $loaded->getPayload()); + static::assertSame('FOO', $loaded->getPayload()); } /** @@ -165,11 +180,16 @@ public function createFlattenedJWEUsingFactory(): void */ public function encryptAndLoadFlattenedWithAAD(): void { - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload(json_encode($this->getKeyToEncrypt())) + ->create() + ->withPayload(json_encode($this->getKeyToEncrypt())) ->withSharedProtectedHeader([ 'enc' => 'A256CBC-HS512', 'alg' => 'RSA-OAEP-256', @@ -179,18 +199,25 @@ public function encryptAndLoadFlattenedWithAAD(): void ->withAAD('foo,bar,baz') ->build() ; - $jwe = $this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0); + $jwe = $this->getJWESerializerManager() + ->serialize('jwe_json_flattened', $jwe, 0) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwe); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwe) + ; - static::assertEquals('RSA-OAEP-256', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); - static::assertEquals('DEF', $loaded->getSharedProtectedHeaderParameter('zip')); + static::assertSame('RSA-OAEP-256', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('DEF', $loaded->getSharedProtectedHeaderParameter('zip')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); - static::assertEquals($this->getKeyToEncrypt(), new JWK(json_decode($loaded->getPayload(), true))); + static::assertEqualsCanonicalizing( + $this->getKeyToEncrypt(), + new JWK(json_decode($loaded->getPayload(), true, 512, JSON_THROW_ON_ERROR)) + ); } /** @@ -201,10 +228,13 @@ public function compressionAlgorithmNotSupported(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('The compression method "FIP" is not supported.'); - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload(json_encode($this->getKeyToEncrypt())) + ->create() + ->withPayload(json_encode($this->getKeyToEncrypt())) ->withSharedProtectedHeader([ 'enc' => 'A256CBC-HS512', 'alg' => 'RSA-OAEP-256', @@ -214,7 +244,9 @@ public function compressionAlgorithmNotSupported(): void ->withAAD('foo,bar,baz') ->build() ; - $this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0); + $this->getJWESerializerManager() + ->serialize('jwe_json_flattened', $jwe, 0) + ; } /** @@ -225,15 +257,24 @@ public function foreignKeyManagementModeForbidden(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Foreign key management mode forbidden.'); - $jweBuilder = $this->getJWEBuilderFactory()->create(['dir', 'ECDH-ES+A256KW'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['dir', 'ECDH-ES+A256KW'], ['A256CBC-HS512'], ['DEF']) + ; $jweBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->withSharedProtectedHeader([ 'enc' => 'A256CBC-HS512', ]) - ->addRecipient($this->getECDHRecipientPublicKey(), ['kid' => 'e9bc097a-ce51-4036-9562-d2ade882db0d', 'alg' => 'ECDH-ES+A256KW']) - ->addRecipient($this->getDirectKey(), ['kid' => 'DIR_1', 'alg' => 'dir']) + ->addRecipient($this->getECDHRecipientPublicKey(), [ + 'kid' => 'e9bc097a-ce51-4036-9562-d2ade882db0d', + 'alg' => 'ECDH-ES+A256KW', + ]) + ->addRecipient($this->getDirectKey(), [ + 'kid' => 'DIR_1', + 'alg' => 'dir', + ]) ->build() ; } @@ -246,10 +287,13 @@ public function operationNotAllowedForTheKey(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Key cannot be used to encrypt'); - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; $jweBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->withSharedProtectedHeader([ 'enc' => 'A256CBC-HS512', 'alg' => 'RSA-OAEP-256', @@ -268,10 +312,13 @@ public function algorithmNotAllowedForTheKey(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Key is only allowed for algorithm "RSA-OAEP".'); - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256'], ['A256CBC-HS512'], ['DEF']) + ; $jweBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->withSharedProtectedHeader([ 'enc' => 'A256CBC-HS512', 'alg' => 'RSA-OAEP-256', @@ -287,11 +334,16 @@ public function algorithmNotAllowedForTheKey(): void */ public function encryptAndLoadFlattenedWithDeflateCompression(): void { - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256'], ['A128CBC-HS256'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA-OAEP-256'], ['A128CBC-HS256'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256'], ['A128CBC-HS256'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA-OAEP-256'], ['A128CBC-HS256'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload(json_encode($this->getKeySetToEncrypt())) + ->create() + ->withPayload(json_encode($this->getKeySetToEncrypt())) ->withSharedProtectedHeader([ 'kid' => '123456789', 'enc' => 'A128CBC-HS256', @@ -301,18 +353,25 @@ public function encryptAndLoadFlattenedWithDeflateCompression(): void ->addRecipient($this->getRSARecipientKey()) ->build() ; - $jwe = $this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0); + $jwe = $this->getJWESerializerManager() + ->serialize('jwe_compact', $jwe, 0) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwe); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwe) + ; - static::assertEquals('RSA-OAEP-256', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A128CBC-HS256', $loaded->getSharedProtectedHeaderParameter('enc')); - static::assertEquals('DEF', $loaded->getSharedProtectedHeaderParameter('zip')); + static::assertSame('RSA-OAEP-256', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A128CBC-HS256', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('DEF', $loaded->getSharedProtectedHeaderParameter('zip')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); - static::assertEquals($this->getKeySetToEncrypt(), JWKSet::createFromKeyData(json_decode($loaded->getPayload(), true))); + static::assertEqualsCanonicalizing( + $this->getKeySetToEncrypt(), + JWKSet::createFromKeyData(json_decode($loaded->getPayload(), true, 512, JSON_THROW_ON_ERROR)) + ); } /** @@ -323,10 +382,13 @@ public function algParameterIsMissing(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Parameter "alg" is missing.'); - $jweBuilder = $this->getJWEBuilderFactory()->create([], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create([], ['A256CBC-HS512'], ['DEF']) + ; $jweBuilder - ->create()->withPayload(json_encode($this->getKeyToEncrypt())) + ->create() + ->withPayload(json_encode($this->getKeyToEncrypt())) ->withSharedProtectedHeader([ 'kid' => '123456789', 'enc' => 'A256CBC-HS512', @@ -345,10 +407,13 @@ public function encParameterIsMissing(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Parameter "enc" is missing.'); - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256'], [], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256'], [], ['DEF']) + ; $jweBuilder - ->create()->withPayload(json_encode($this->getKeyToEncrypt())) + ->create() + ->withPayload(json_encode($this->getKeyToEncrypt())) ->withSharedProtectedHeader([ 'kid' => '123456789', 'alg' => 'RSA-OAEP-256', @@ -365,12 +430,17 @@ public function encParameterIsMissing(): void public function notAKeyEncryptionAlgorithm(): void { $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage('The key encryption algorithm "A256CBC-HS512" is not supported or not a key encryption algorithm instance.'); + $this->expectExceptionMessage( + 'The key encryption algorithm "A256CBC-HS512" is not supported or not a key encryption algorithm instance.' + ); - $jweBuilder = $this->getJWEBuilderFactory()->create(['A256CBC-HS512'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['A256CBC-HS512'], ['A256CBC-HS512'], ['DEF']) + ; $jweBuilder - ->create()->withPayload(json_encode($this->getKeyToEncrypt())) + ->create() + ->withPayload(json_encode($this->getKeyToEncrypt())) ->withSharedProtectedHeader([ 'kid' => '123456789', 'enc' => 'A256CBC-HS512', @@ -388,12 +458,17 @@ public function notAKeyEncryptionAlgorithm(): void public function notAContentEncryptionAlgorithm(): void { $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage('The content encryption algorithm "RSA-OAEP-256" is not supported or not a content encryption algorithm instance.'); + $this->expectExceptionMessage( + 'The content encryption algorithm "RSA-OAEP-256" is not supported or not a content encryption algorithm instance.' + ); - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256'], ['RSA-OAEP-256'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256'], ['RSA-OAEP-256'], ['DEF']) + ; $jweBuilder - ->create()->withPayload(json_encode($this->getKeyToEncrypt())) + ->create() + ->withPayload(json_encode($this->getKeyToEncrypt())) ->withSharedProtectedHeader([ 'kid' => '123456789', 'enc' => 'RSA-OAEP-256', @@ -410,11 +485,16 @@ public function notAContentEncryptionAlgorithm(): void */ public function encryptAndLoadCompactWithDirectKeyEncryption(): void { - $jweBuilder = $this->getJWEBuilderFactory()->create(['dir'], ['A192CBC-HS384'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['dir'], ['A192CBC-HS384'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['dir'], ['A192CBC-HS384'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['dir'], ['A192CBC-HS384'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload(json_encode($this->getKeyToEncrypt())) + ->create() + ->withPayload(json_encode($this->getKeyToEncrypt())) ->withSharedProtectedHeader([ 'kid' => 'DIR_1', 'enc' => 'A192CBC-HS384', @@ -423,18 +503,25 @@ public function encryptAndLoadCompactWithDirectKeyEncryption(): void ->addRecipient($this->getDirectKey()) ->build() ; - $jwe = $this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0); + $jwe = $this->getJWESerializerManager() + ->serialize('jwe_json_flattened', $jwe, 0) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwe); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwe) + ; - static::assertEquals('dir', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A192CBC-HS384', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('dir', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A192CBC-HS384', $loaded->getSharedProtectedHeaderParameter('enc')); static::assertFalse($loaded->hasSharedHeaderParameter('zip')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getSymmetricKeySet(), 0)); - static::assertEquals($this->getKeyToEncrypt(), new JWK(json_decode($loaded->getPayload(), true))); + static::assertEqualsCanonicalizing( + $this->getKeyToEncrypt(), + new JWK(json_decode($loaded->getPayload(), true, 512, JSON_THROW_ON_ERROR)) + ); } /** @@ -442,12 +529,20 @@ public function encryptAndLoadCompactWithDirectKeyEncryption(): void */ public function encryptAndLoadCompactKeyAgreement(): void { - $jweBuilder = $this->getJWEBuilderFactory()->create(['ECDH-ES'], ['A192CBC-HS384'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['ECDH-ES'], ['A192CBC-HS384'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['ECDH-ES'], ['A192CBC-HS384'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['ECDH-ES'], ['A192CBC-HS384'], ['DEF']) + ; - $payload = json_encode(['user_id' => '1234', 'exp' => time() + 3600]); + $payload = json_encode([ + 'user_id' => '1234', + 'exp' => time() + 3600, + ]); $jwe = $jweBuilder - ->create()->withPayload($payload) + ->create() + ->withPayload($payload) ->withSharedProtectedHeader([ 'kid' => 'e9bc097a-ce51-4036-9562-d2ade882db0d', 'enc' => 'A192CBC-HS384', @@ -456,18 +551,22 @@ public function encryptAndLoadCompactKeyAgreement(): void ->addRecipient($this->getECDHRecipientPublicKey()) ->build() ; - $jwe = $this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0); + $jwe = $this->getJWESerializerManager() + ->serialize('jwe_json_flattened', $jwe, 0) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwe); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwe) + ; - static::assertEquals('ECDH-ES', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A192CBC-HS384', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('ECDH-ES', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A192CBC-HS384', $loaded->getSharedProtectedHeaderParameter('enc')); static::assertFalse($loaded->hasSharedProtectedHeaderParameter('zip')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); - static::assertEquals($payload, $loaded->getPayload()); + static::assertSame($payload, $loaded->getPayload()); } /** @@ -475,11 +574,16 @@ public function encryptAndLoadCompactKeyAgreement(): void */ public function encryptAndLoadCompactKeyAgreementWithWrappingCompact(): void { - $jweBuilder = $this->getJWEBuilderFactory()->create(['ECDH-ES+A256KW'], ['A256CBC-HS512'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['ECDH-ES+A256KW'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['ECDH-ES+A256KW'], ['A256CBC-HS512'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['ECDH-ES+A256KW'], ['A256CBC-HS512'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->withSharedProtectedHeader([ 'kid' => 'e9bc097a-ce51-4036-9562-d2ade882db0d', 'enc' => 'A256CBC-HS512', @@ -488,12 +592,16 @@ public function encryptAndLoadCompactKeyAgreementWithWrappingCompact(): void ->addRecipient($this->getECDHRecipientPublicKey()) ->build() ; - $jwe = $this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0); + $jwe = $this->getJWESerializerManager() + ->serialize('jwe_json_flattened', $jwe, 0) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwe); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwe) + ; - static::assertEquals('ECDH-ES+A256KW', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('ECDH-ES+A256KW', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); static::assertFalse($loaded->hasSharedProtectedHeaderParameter('zip')); static::assertFalse($loaded->hasSharedHeaderParameter('zip')); static::assertNull($loaded->getPayload()); @@ -501,7 +609,7 @@ public function encryptAndLoadCompactKeyAgreementWithWrappingCompact(): void static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); static::assertTrue(is_string($loaded->getPayload())); - static::assertEquals('Live long and Prosper.', $loaded->getPayload()); + static::assertSame('Live long and Prosper.', $loaded->getPayload()); } /** @@ -509,11 +617,16 @@ public function encryptAndLoadCompactKeyAgreementWithWrappingCompact(): void */ public function encryptAndLoadWithGCMAndAAD(): void { - $jweBuilder = $this->getJWEBuilderFactory()->create(['ECDH-ES+A256KW'], ['A256GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['ECDH-ES+A256KW'], ['A256GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['ECDH-ES+A256KW'], ['A256GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['ECDH-ES+A256KW'], ['A256GCM'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->withSharedProtectedHeader([ 'kid' => 'e9bc097a-ce51-4036-9562-d2ade882db0d', 'enc' => 'A256GCM', @@ -523,12 +636,16 @@ public function encryptAndLoadWithGCMAndAAD(): void ->addRecipient($this->getECDHRecipientPublicKey()) ->build() ; - $jwe = $this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0); + $jwe = $this->getJWESerializerManager() + ->serialize('jwe_json_flattened', $jwe, 0) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwe); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwe) + ; - static::assertEquals('ECDH-ES+A256KW', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A256GCM', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('ECDH-ES+A256KW', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A256GCM', $loaded->getSharedProtectedHeaderParameter('enc')); static::assertFalse($loaded->hasSharedProtectedHeaderParameter('zip')); static::assertFalse($loaded->hasSharedHeaderParameter('zip')); static::assertNull($loaded->getPayload()); @@ -536,7 +653,7 @@ public function encryptAndLoadWithGCMAndAAD(): void static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); static::assertTrue(is_string($loaded->getPayload())); - static::assertEquals('Live long and Prosper.', $loaded->getPayload()); + static::assertSame('Live long and Prosper.', $loaded->getPayload()); } /** @@ -544,28 +661,43 @@ public function encryptAndLoadWithGCMAndAAD(): void */ public function encryptAndLoadCompactKeyAgreementWithWrapping(): void { - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP-256', 'ECDH-ES+A256KW'], ['A256CBC-HS512'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA-OAEP-256', 'ECDH-ES+A256KW'], ['A256CBC-HS512'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP-256', 'ECDH-ES+A256KW'], ['A256CBC-HS512'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA-OAEP-256', 'ECDH-ES+A256KW'], ['A256CBC-HS512'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->withSharedProtectedHeader([ 'enc' => 'A256CBC-HS512', ]) ->withAAD('foo,bar,baz') - ->addRecipient($this->getECDHRecipientPublicKey(), ['kid' => 'e9bc097a-ce51-4036-9562-d2ade882db0d', 'alg' => 'ECDH-ES+A256KW']) - ->addRecipient($this->getRSARecipientKey(), ['kid' => '123456789', 'alg' => 'RSA-OAEP-256']) + ->addRecipient($this->getECDHRecipientPublicKey(), [ + 'kid' => 'e9bc097a-ce51-4036-9562-d2ade882db0d', + 'alg' => 'ECDH-ES+A256KW', + ]) + ->addRecipient($this->getRSARecipientKey(), [ + 'kid' => '123456789', + 'alg' => 'RSA-OAEP-256', + ]) ->build() ; - $jwe = $this->getJWESerializerManager()->serialize('jwe_json_general', $jwe); + $jwe = $this->getJWESerializerManager() + ->serialize('jwe_json_general', $jwe) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwe); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwe) + ; - static::assertEquals(2, $loaded->countRecipients()); + static::assertSame(2, $loaded->countRecipients()); - static::assertEquals('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); - static::assertEquals('ECDH-ES+A256KW', $loaded->getRecipient(0)->getHeaderParameter('alg')); - static::assertEquals('RSA-OAEP-256', $loaded->getRecipient(1)->getHeaderParameter('alg')); + static::assertSame('A256CBC-HS512', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('ECDH-ES+A256KW', $loaded->getRecipient(0)->getHeaderParameter('alg')); + static::assertSame('RSA-OAEP-256', $loaded->getRecipient(1)->getHeaderParameter('alg')); static::assertFalse($loaded->hasSharedHeaderParameter('zip')); static::assertFalse($loaded->hasSharedProtectedHeaderParameter('zip')); static::assertNull($loaded->getPayload()); @@ -573,7 +705,7 @@ public function encryptAndLoadCompactKeyAgreementWithWrapping(): void static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); static::assertTrue(is_string($loaded->getPayload())); - static::assertEquals('Live long and Prosper.', $loaded->getPayload()); + static::assertSame('Live long and Prosper.', $loaded->getPayload()); } /** @@ -673,120 +805,128 @@ private function getDirectKey() 'kid' => 'DIR_1', 'key_ops' => ['encrypt', 'decrypt'], 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded(hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F')), + 'k' => Base64UrlSafe::encodeUnpadded( + hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F') + ), ]); } 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', + $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); } private function getSymmetricKeySet(): JWKSet { - $keys = ['keys' => [ - [ - 'kid' => 'DIR_1', - 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded(hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F')), - ], - [ - 'kty' => 'oct', - 'k' => 'f5aN5V6iihwQVqP-tPNNtkIJNCwUb9-JukCIKkF0rNfxqxA771RJynYAT2xtzAP0MYaR7U5fMP_wvbRQq5l38Q', - ], - [ - 'kty' => 'oct', - 'k' => 'GawgguFyGrWKav7AX4VKUg', - ], - [ - 'kty' => 'oct', - 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', + $keys = [ + 'keys' => [ + [ + 'kid' => 'DIR_1', + 'kty' => 'oct', + 'k' => Base64UrlSafe::encodeUnpadded( + hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F') + ), + ], + [ + 'kty' => 'oct', + 'k' => 'f5aN5V6iihwQVqP-tPNNtkIJNCwUb9-JukCIKkF0rNfxqxA771RJynYAT2xtzAP0MYaR7U5fMP_wvbRQq5l38Q', + ], + [ + 'kty' => 'oct', + 'k' => 'GawgguFyGrWKav7AX4VKUg', + ], + [ + 'kty' => 'oct', + 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', + ], ], - ]]; + ]; return JWKSet::createFromKeyData($keys); } diff --git a/tests/Component/Encryption/EncryptionTest.php b/tests/Component/Encryption/EncryptionTest.php index fe7ba05d..204065f9 100644 --- a/tests/Component/Encryption/EncryptionTest.php +++ b/tests/Component/Encryption/EncryptionTest.php @@ -2,92 +2,87 @@ 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\Tests\Component\Encryption; use Jose\Component\Core\AlgorithmManagerFactory; -use Jose\Component\Encryption\Algorithm\ContentEncryption; -use Jose\Component\Encryption\Algorithm\KeyEncryption; -use Jose\Component\Encryption\Compression; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192CBCHS384; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CBCHS512; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\Dir; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS256A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS384A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS512A256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSA15; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP256; use Jose\Component\Encryption\Compression\CompressionMethodManagerFactory; +use Jose\Component\Encryption\Compression\Deflate; use Jose\Component\Encryption\JWEBuilderFactory; use Jose\Component\Encryption\JWEDecrypterFactory; use Jose\Component\Encryption\JWELoaderFactory; -use Jose\Component\Encryption\Serializer; +use Jose\Component\Encryption\Serializer\CompactSerializer; +use Jose\Component\Encryption\Serializer\JSONFlattenedSerializer; +use Jose\Component\Encryption\Serializer\JSONGeneralSerializer; +use Jose\Component\Encryption\Serializer\JWESerializerManager; +use Jose\Component\Encryption\Serializer\JWESerializerManagerFactory; use PHPUnit\Framework\TestCase; abstract class EncryptionTest extends TestCase { - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; - - /** - * @var CompressionMethodManagerFactory - */ - private $compressionMethodManagerFactory; - - /** - * @var JWEBuilderFactory - */ - private $jweBuilderFactory; - - /** - * @var JWEDecrypterFactory - */ - private $jweDecrypterFactory; - - /** - * @var JWELoaderFactory - */ - private $jweLoaderFactory; - - /** - * @var null|Serializer\JWESerializerManagerFactory - */ - private $jwsSerializerManagerFactory; - - /** - * @var null|Serializer\JWESerializerManager - */ - private $jwsSerializerManager; + private ?AlgorithmManagerFactory $algorithmManagerFactory = null; + + private ?CompressionMethodManagerFactory $compressionMethodManagerFactory = null; + + private ?JWEBuilderFactory $jweBuilderFactory = null; + + private ?JWEDecrypterFactory $jweDecrypterFactory = null; + + private ?JWELoaderFactory $jweLoaderFactory = null; + + private ?JWESerializerManagerFactory $jwsSerializerManagerFactory = null; + + private ?JWESerializerManager $jwsSerializerManager = null; protected function getAlgorithmManagerFactory(): AlgorithmManagerFactory { - if (null === $this->algorithmManagerFactory) { + if ($this->algorithmManagerFactory === null) { $this->algorithmManagerFactory = new AlgorithmManagerFactory(); - $this->algorithmManagerFactory->add('A128GCM', new ContentEncryption\A128GCM()); - $this->algorithmManagerFactory->add('A192GCM', new ContentEncryption\A192GCM()); - $this->algorithmManagerFactory->add('A256GCM', new ContentEncryption\A256GCM()); - $this->algorithmManagerFactory->add('A128CBC-HS256', new ContentEncryption\A128CBCHS256()); - $this->algorithmManagerFactory->add('A192CBC-HS384', new ContentEncryption\A192CBCHS384()); - $this->algorithmManagerFactory->add('A256CBC-HS512', new ContentEncryption\A256CBCHS512()); - $this->algorithmManagerFactory->add('A128GCMKW', new KeyEncryption\A128GCMKW()); - $this->algorithmManagerFactory->add('A192GCMKW', new KeyEncryption\A192GCMKW()); - $this->algorithmManagerFactory->add('A256GCMKW', new KeyEncryption\A256GCMKW()); - $this->algorithmManagerFactory->add('A128KW', new KeyEncryption\A128KW()); - $this->algorithmManagerFactory->add('A192KW', new KeyEncryption\A192KW()); - $this->algorithmManagerFactory->add('A256KW', new KeyEncryption\A256KW()); - $this->algorithmManagerFactory->add('dir', new KeyEncryption\Dir()); - $this->algorithmManagerFactory->add('ECDH-ES', new KeyEncryption\ECDHES()); - $this->algorithmManagerFactory->add('ECDH-ES+A128KW', new KeyEncryption\ECDHESA128KW()); - $this->algorithmManagerFactory->add('ECDH-ES+A192KW', new KeyEncryption\ECDHESA192KW()); - $this->algorithmManagerFactory->add('ECDH-ES+A256KW', new KeyEncryption\ECDHESA256KW()); - $this->algorithmManagerFactory->add('PBES2-HS256+A128KW', new KeyEncryption\PBES2HS256A128KW()); - $this->algorithmManagerFactory->add('PBES2-HS384+A192KW', new KeyEncryption\PBES2HS384A192KW()); - $this->algorithmManagerFactory->add('PBES2-HS512+A256KW', new KeyEncryption\PBES2HS512A256KW()); - $this->algorithmManagerFactory->add('RSA1_5', new KeyEncryption\RSA15()); - $this->algorithmManagerFactory->add('RSA-OAEP', new KeyEncryption\RSAOAEP()); - $this->algorithmManagerFactory->add('RSA-OAEP-256', new KeyEncryption\RSAOAEP256()); + $this->algorithmManagerFactory->add('A128GCM', new A128GCM()); + $this->algorithmManagerFactory->add('A192GCM', new A192GCM()); + $this->algorithmManagerFactory->add('A256GCM', new A256GCM()); + $this->algorithmManagerFactory->add('A128CBC-HS256', new A128CBCHS256()); + $this->algorithmManagerFactory->add('A192CBC-HS384', new A192CBCHS384()); + $this->algorithmManagerFactory->add('A256CBC-HS512', new A256CBCHS512()); + $this->algorithmManagerFactory->add('A128GCMKW', new A128GCMKW()); + $this->algorithmManagerFactory->add('A192GCMKW', new A192GCMKW()); + $this->algorithmManagerFactory->add('A256GCMKW', new A256GCMKW()); + $this->algorithmManagerFactory->add('A128KW', new A128KW()); + $this->algorithmManagerFactory->add('A192KW', new A192KW()); + $this->algorithmManagerFactory->add('A256KW', new A256KW()); + $this->algorithmManagerFactory->add('dir', new Dir()); + $this->algorithmManagerFactory->add('ECDH-ES', new ECDHES()); + $this->algorithmManagerFactory->add('ECDH-ES+A128KW', new ECDHESA128KW()); + $this->algorithmManagerFactory->add('ECDH-ES+A192KW', new ECDHESA192KW()); + $this->algorithmManagerFactory->add('ECDH-ES+A256KW', new ECDHESA256KW()); + $this->algorithmManagerFactory->add('PBES2-HS256+A128KW', new PBES2HS256A128KW()); + $this->algorithmManagerFactory->add('PBES2-HS384+A192KW', new PBES2HS384A192KW()); + $this->algorithmManagerFactory->add('PBES2-HS512+A256KW', new PBES2HS512A256KW()); + $this->algorithmManagerFactory->add('RSA1_5', new RSA15()); + $this->algorithmManagerFactory->add('RSA-OAEP', new RSAOAEP()); + $this->algorithmManagerFactory->add('RSA-OAEP-256', new RSAOAEP256()); } return $this->algorithmManagerFactory; @@ -95,9 +90,9 @@ protected function getAlgorithmManagerFactory(): AlgorithmManagerFactory protected function getCompressionMethodManagerFactory(): CompressionMethodManagerFactory { - if (null === $this->compressionMethodManagerFactory) { + if ($this->compressionMethodManagerFactory === null) { $this->compressionMethodManagerFactory = new CompressionMethodManagerFactory(); - $this->compressionMethodManagerFactory->add('DEF', new Compression\Deflate()); + $this->compressionMethodManagerFactory->add('DEF', new Deflate()); } return $this->compressionMethodManagerFactory; @@ -105,7 +100,7 @@ protected function getCompressionMethodManagerFactory(): CompressionMethodManage protected function getJWEBuilderFactory(): JWEBuilderFactory { - if (null === $this->jweBuilderFactory) { + if ($this->jweBuilderFactory === null) { $this->jweBuilderFactory = new JWEBuilderFactory( $this->getAlgorithmManagerFactory(), $this->getCompressionMethodManagerFactory() @@ -117,7 +112,7 @@ protected function getJWEBuilderFactory(): JWEBuilderFactory protected function getJWEDecrypterFactory(): JWEDecrypterFactory { - if (null === $this->jweDecrypterFactory) { + if ($this->jweDecrypterFactory === null) { $this->jweDecrypterFactory = new JWEDecrypterFactory( $this->getAlgorithmManagerFactory(), $this->getCompressionMethodManagerFactory() @@ -129,7 +124,7 @@ protected function getJWEDecrypterFactory(): JWEDecrypterFactory protected function getJWELoaderFactory(): JWELoaderFactory { - if (null === $this->jweLoaderFactory) { + if ($this->jweLoaderFactory === null) { $this->jweLoaderFactory = new JWELoaderFactory( $this->getJWESerializerManagerFactory(), $this->getJWEDecrypterFactory(), @@ -140,25 +135,25 @@ protected function getJWELoaderFactory(): JWELoaderFactory return $this->jweLoaderFactory; } - protected function getJWESerializerManagerFactory(): Serializer\JWESerializerManagerFactory + protected function getJWESerializerManagerFactory(): JWESerializerManagerFactory { - if (null === $this->jwsSerializerManagerFactory) { - $this->jwsSerializerManagerFactory = new Serializer\JWESerializerManagerFactory(); - $this->jwsSerializerManagerFactory->add(new Serializer\CompactSerializer()); - $this->jwsSerializerManagerFactory->add(new Serializer\JSONFlattenedSerializer()); - $this->jwsSerializerManagerFactory->add(new Serializer\JSONGeneralSerializer()); + if ($this->jwsSerializerManagerFactory === null) { + $this->jwsSerializerManagerFactory = new JWESerializerManagerFactory(); + $this->jwsSerializerManagerFactory->add(new CompactSerializer()); + $this->jwsSerializerManagerFactory->add(new JSONFlattenedSerializer()); + $this->jwsSerializerManagerFactory->add(new JSONGeneralSerializer()); } return $this->jwsSerializerManagerFactory; } - protected function getJWESerializerManager(): Serializer\JWESerializerManager + protected function getJWESerializerManager(): JWESerializerManager { - if (null === $this->jwsSerializerManager) { - $this->jwsSerializerManager = new Serializer\JWESerializerManager([ - new Serializer\CompactSerializer(), - new Serializer\JSONFlattenedSerializer(), - new Serializer\JSONGeneralSerializer(), + if ($this->jwsSerializerManager === null) { + $this->jwsSerializerManager = new JWESerializerManager([ + new CompactSerializer(), + new JSONFlattenedSerializer(), + new JSONGeneralSerializer(), ]); } diff --git a/tests/Component/Encryption/InvalidCurveAttackTest.php b/tests/Component/Encryption/InvalidCurveAttackTest.php index 0aa29897..5d2ee9fd 100644 --- a/tests/Component/Encryption/InvalidCurveAttackTest.php +++ b/tests/Component/Encryption/InvalidCurveAttackTest.php @@ -2,26 +2,14 @@ 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\Tests\Component\Encryption; use Jose\Component\Core\JWK; /** - * @group CVE - * @group functional - * * @internal */ -class InvalidCurveAttackTest extends EncryptionTest +final class InvalidCurveAttackTest extends EncryptionTest { /** * @test @@ -30,9 +18,13 @@ public function curveCheckNegativeP256AttackPt1(): void { $maliciousJWE = 'eyJhbGciOiJFQ0RILUVTK0ExMjhLVyIsImVuYyI6IkExMjhDQkMtSFMyNTYiLCJlcGsiOnsia3R5IjoiRUMiLCJ4IjoiZ1RsaTY1ZVRRN3otQmgxNDdmZjhLM203azJVaURpRzJMcFlrV0FhRkpDYyIsInkiOiJjTEFuakthNGJ6akQ3REpWUHdhOUVQclJ6TUc3ck9OZ3NpVUQta2YzMEZzIiwiY3J2IjoiUC0yNTYifX0.qGAdxtEnrV_3zbIxU2ZKrMWcejNltjA_dtefBFnRh9A2z9cNIqYRWg.pEA5kX304PMCOmFSKX_cEg.a9fwUrx2JXi1OnWEMOmZhXd94-bEGCH9xxRwqcGuG2AMo-AwHoljdsH5C_kcTqlXS5p51OB1tvgQcMwB5rpTxg.72CHiYFecyDvuUa43KKT6w'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['ECDH-ES+A128KW'], ['A128CBC-HS256'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['ECDH-ES+A128KW'], ['A128CBC-HS256'], ['DEF']) + ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($maliciousJWE); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($maliciousJWE) + ; $privateKey = new JWK([ 'kty' => 'EC', 'crv' => 'P-256', @@ -50,9 +42,13 @@ public function curveCheckNegativeP256AttackPt2(): void { // The malicious JWE contains a public key with order 2447 $maliciousJWE = 'eyJhbGciOiJFQ0RILUVTK0ExMjhLVyIsImVuYyI6IkExMjhDQkMtSFMyNTYiLCJlcGsiOnsia3R5IjoiRUMiLCJ4IjoiWE9YR1E5XzZRQ3ZCZzN1OHZDSS1VZEJ2SUNBRWNOTkJyZnFkN3RHN29RNCIsInkiOiJoUW9XTm90bk56S2x3aUNuZUprTElxRG5UTnc3SXNkQkM1M1ZVcVZqVkpjIiwiY3J2IjoiUC0yNTYifX0.UGb3hX3ePAvtFB9TCdWsNkFTv9QWxSr3MpYNiSBdW630uRXRBT3sxw.6VpU84oMob16DxOR98YTRw.y1UslvtkoWdl9HpugfP0rSAkTw1xhm_LbK1iRXzGdpYqNwIG5VU33UBpKAtKFBoA1Kk_sYtfnHYAvn-aes4FTg.UZPN8h7FcvA5MIOq-Pkj8A'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['ECDH-ES+A128KW'], ['A128CBC-HS256'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['ECDH-ES+A128KW'], ['A128CBC-HS256'], ['DEF']) + ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($maliciousJWE); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($maliciousJWE) + ; $privateKey = new JWK([ 'kty' => 'EC', 'crv' => 'P-256', diff --git a/tests/Component/Encryption/JWEFlattenedTest.php b/tests/Component/Encryption/JWEFlattenedTest.php index 4586d4a6..050baace 100644 --- a/tests/Component/Encryption/JWEFlattenedTest.php +++ b/tests/Component/Encryption/JWEFlattenedTest.php @@ -2,26 +2,15 @@ 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\Tests\Component\Encryption; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWKSet; +use ParagonIE\ConstantTime\Base64UrlSafe; /** - * @group functional - * * @internal */ -class JWEFlattenedTest extends EncryptionTest +final class JWEFlattenedTest extends EncryptionTest { /** * @see https://tools.ietf.org/html/rfc7516#appendix-A.5 @@ -30,38 +19,48 @@ class JWEFlattenedTest extends EncryptionTest */ public function loadFlattenedJWE(): void { - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128CBC-HS256'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128CBC-HS256'], ['DEF']) + ; - $loaded = $this->getJWESerializerManager()->unserialize('{"protected":"eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","unprotected":{"jku":"https://server.example.com/keys.jwks"},"header":{"alg":"A128KW","kid":"7"},"encrypted_key":"6KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ","iv":"AxY8DCtDaGlsbGljb3RoZQ","ciphertext":"KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY","tag":"Mz-VPPyU4RlcuYv1IwIvzw"}'); + $loaded = $this->getJWESerializerManager() + ->unserialize( + '{"protected":"eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","unprotected":{"jku":"https://server.example.com/keys.jwks"},"header":{"alg":"A128KW","kid":"7"},"encrypted_key":"6KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ","iv":"AxY8DCtDaGlsbGljb3RoZQ","ciphertext":"KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY","tag":"Mz-VPPyU4RlcuYv1IwIvzw"}' + ) + ; - static::assertEquals('A128KW', $loaded->getRecipient(0)->getHeaderParameter('alg')); - static::assertEquals('A128CBC-HS256', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('A128KW', $loaded->getRecipient(0)->getHeaderParameter('alg')); + static::assertSame('A128CBC-HS256', $loaded->getSharedProtectedHeaderParameter('enc')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getSymmetricKeySet(), 0)); - static::assertEquals('Live long and prosper.', $loaded->getPayload()); + static::assertSame('Live long and prosper.', $loaded->getPayload()); } private function getSymmetricKeySet(): JWKSet { - $keys = ['keys' => [ - [ - 'kid' => 'DIR_1', - 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded(hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F')), - ], - [ - 'kty' => 'oct', - 'k' => 'f5aN5V6iihwQVqP-tPNNtkIJNCwUb9-JukCIKkF0rNfxqxA771RJynYAT2xtzAP0MYaR7U5fMP_wvbRQq5l38Q', - ], - [ - 'kty' => 'oct', - 'k' => 'GawgguFyGrWKav7AX4VKUg', - ], - [ - 'kty' => 'oct', - 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', + $keys = [ + 'keys' => [ + [ + 'kid' => 'DIR_1', + 'kty' => 'oct', + 'k' => Base64UrlSafe::encodeUnpadded( + hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F') + ), + ], + [ + 'kty' => 'oct', + 'k' => 'f5aN5V6iihwQVqP-tPNNtkIJNCwUb9-JukCIKkF0rNfxqxA771RJynYAT2xtzAP0MYaR7U5fMP_wvbRQq5l38Q', + ], + [ + 'kty' => 'oct', + 'k' => 'GawgguFyGrWKav7AX4VKUg', + ], + [ + 'kty' => 'oct', + 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', + ], ], - ]]; + ]; return JWKSet::createFromKeyData($keys); } diff --git a/tests/Component/Encryption/JWELoaderTest.php b/tests/Component/Encryption/JWELoaderTest.php index 1775621f..30832594 100644 --- a/tests/Component/Encryption/JWELoaderTest.php +++ b/tests/Component/Encryption/JWELoaderTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Encryption; use Exception; @@ -20,17 +11,11 @@ /** * Class JWELoaderTest. * - * @group JWELoader - * @group functional - * * @internal */ -class JWELoaderTest extends EncryptionTest +final class JWELoaderTest extends EncryptionTest { - /** - * @var null|JWELoader - */ - private $jweLoader; + private ?JWELoader $jweLoader = null; /** * @test @@ -50,7 +35,9 @@ public function theFlattenedTokenCannotBeLoaded(): void 'y' => 'A8-yxCHxkfBz3hKZfI1jUYMjUhsEveZ9THuwFjH2sCNdtksRJU7D5-SkgaFL1ETP', ]); - $this->getJWELoader()->loadAndDecryptWithKey($token, $key, $recipient); + $this->getJWELoader() + ->loadAndDecryptWithKey($token, $key, $recipient) + ; } /** @@ -71,7 +58,9 @@ public function theTokenCannotBeVerifiedBecauseOfAnUnsupportedAlgorithm(): void 'y' => 'A8-yxCHxkfBz3hKZfI1jUYMjUhsEveZ9THuwFjH2sCNdtksRJU7D5-SkgaFL1ETP', ]); - $this->getJWELoader()->loadAndDecryptWithKey($token, $key, $recipient); + $this->getJWELoader() + ->loadAndDecryptWithKey($token, $key, $recipient) + ; } /** @@ -92,7 +81,9 @@ public function theTokenCannotBeVerifiedBecauseOfABadKey(): void 'y' => 'A8-yxCHxkfBz3hKZfI1jUYMjUhsEveZ9THuwFjH2sCNdtksRJU7D5-SkgaFL1ETP', ]); - $this->getJWELoader()->loadAndDecryptWithKey($token, $key, $recipient); + $this->getJWELoader() + ->loadAndDecryptWithKey($token, $key, $recipient) + ; } /** @@ -109,16 +100,23 @@ public function theJweLoaderCanLoadAndDecryptAToken(): void 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', ]); $recipient = 0; - $jwe = $this->getJWELoader()->loadAndDecryptWithKey($token, $key, $recipient); - - static::assertEquals('You can trust us to stick with you through thick and thin–to the bitter end. And you can trust us to keep any secret of yours–closer than you keep it yourself. But you cannot trust us to let you face trouble alone, and go off without a word. We are your friends, Frodo.', $jwe->getPayload()); - static::assertEquals(0, $recipient); + $jwe = $this->getJWELoader() + ->loadAndDecryptWithKey($token, $key, $recipient) + ; + + static::assertSame( + 'You can trust us to stick with you through thick and thin–to the bitter end. And you can trust us to keep any secret of yours–closer than you keep it yourself. But you cannot trust us to let you face trouble alone, and go off without a word. We are your friends, Frodo.', + $jwe->getPayload() + ); + static::assertSame(0, $recipient); } private function getJWELoader(): JWELoader { - if (null === $this->jweLoader) { - $this->jweLoader = $this->getJWELoaderFactory()->create(['jwe_compact'], ['A128KW'], ['A128GCM'], ['DEF']); + if ($this->jweLoader === null) { + $this->jweLoader = $this->getJWELoaderFactory() + ->create(['jwe_compact'], ['A128KW'], ['A128GCM'], ['DEF']) + ; } return $this->jweLoader; diff --git a/tests/Component/Encryption/JWESplitTest.php b/tests/Component/Encryption/JWESplitTest.php index cf941891..6d4a2ce3 100644 --- a/tests/Component/Encryption/JWESplitTest.php +++ b/tests/Component/Encryption/JWESplitTest.php @@ -2,26 +2,15 @@ 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\Tests\Component\Encryption; use function count; use Jose\Component\Encryption\Serializer\JSONGeneralSerializer; /** - * @group JWE - * * @internal */ -class JWESplitTest extends EncryptionTest +final class JWESplitTest extends EncryptionTest { /** * @test @@ -33,25 +22,25 @@ public function aJweObjectWithMoreThanOneRecipientCanBeSplittedIntoSeveralJweObj $jwe = $serializer->unserialize($input); $split = $jwe->split(); - static::assertEquals(3, $jwe->countRecipients()); - static::assertEquals(3, count($split)); + static::assertSame(3, $jwe->countRecipients()); + static::assertSame(3, count($split)); for ($i = 0; $i < $jwe->countRecipients(); ++$i) { $recipient1 = $jwe->getRecipient($i); $tempJwe = $split[$i]; - static::assertEquals(1, $tempJwe->countRecipients()); - static::assertEquals($jwe->getAAD(), $tempJwe->getAAD()); - static::assertEquals($jwe->getCiphertext(), $tempJwe->getCiphertext()); - static::assertEquals($jwe->getEncodedSharedProtectedHeader(), $tempJwe->getEncodedSharedProtectedHeader()); - static::assertEquals($jwe->getSharedProtectedHeader(), $tempJwe->getSharedProtectedHeader()); - static::assertEquals($jwe->getSharedHeader(), $tempJwe->getSharedHeader()); - static::assertEquals($jwe->getIV(), $tempJwe->getIV()); - static::assertEquals($jwe->getTag(), $tempJwe->getTag()); - static::assertEquals($jwe->isEncrypted(), $tempJwe->isEncrypted()); + static::assertSame(1, $tempJwe->countRecipients()); + static::assertSame($jwe->getAAD(), $tempJwe->getAAD()); + static::assertSame($jwe->getCiphertext(), $tempJwe->getCiphertext()); + static::assertSame($jwe->getEncodedSharedProtectedHeader(), $tempJwe->getEncodedSharedProtectedHeader()); + static::assertSame($jwe->getSharedProtectedHeader(), $tempJwe->getSharedProtectedHeader()); + static::assertSame($jwe->getSharedHeader(), $tempJwe->getSharedHeader()); + static::assertSame($jwe->getIV(), $tempJwe->getIV()); + static::assertSame($jwe->getTag(), $tempJwe->getTag()); + static::assertSame($jwe->isEncrypted(), $tempJwe->isEncrypted()); $recipient2 = $tempJwe->getRecipient(0); - static::assertEquals($recipient1->getHeader(), $recipient2->getHeader()); - static::assertEquals($recipient1->getEncryptedKey(), $recipient2->getEncryptedKey()); + static::assertSame($recipient1->getHeader(), $recipient2->getHeader()); + static::assertSame($recipient1->getEncryptedKey(), $recipient2->getEncryptedKey()); } } } diff --git a/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionProtectedContentOnlyTest.php b/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionProtectedContentOnlyTest.php index f92a3c11..ccc0ecc1 100644 --- a/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionProtectedContentOnlyTest.php +++ b/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionProtectedContentOnlyTest.php @@ -2,33 +2,22 @@ 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\Tests\Component\Encryption\RFC7520; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.12 * - * @group RFC7520 - * * @internal */ -class A128KWAndA128GCMEncryptionProtectedContentOnlyTest extends EncryptionTest +final class A128KWAndA128GCMEncryptionProtectedContentOnlyTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -44,8 +33,7 @@ public function a128KWAndA128GCMEncryptionProtectedContentOnly(): void 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', ]); - $protectedHeader = [ - ]; + $protectedHeader = []; $header = [ 'enc' => 'A128GCM', @@ -60,30 +48,45 @@ public function a128KWAndA128GCMEncryptionProtectedContentOnly(): void $expected_ciphertext = 'qtPIMMaOBRgASL10dNQhOa7Gqrk7Eal1vwht7R4TT1uq-arsVCPaIeFwQfzrSS6oEUWbBtxEasE0vC6r7sphyVziMCVJEuRJyoAHFSP3eqQPb4Ic1SDSqyXjw_L3svybhHYUGyQuTmUQEDjgjJfBOifwHIsDsRPeBz1NomqeifVPq5GTCWFo5k_MNIQURR2Wj0AHC2k7JZfu2iWjUHLF8ExFZLZ4nlmsvJu_mvifMYiikfNfsZAudISOa6O73yPZtL04k_1FI7WDfrb2w7OqKLWDXzlpcxohPVOLQwpA3mFNRKdY-bQz4Z4KX9lfz1cne31N4-8BKmojpw-OdQjKdLOGkC445Fb_K1tlDQXw2sBF'; $expected_tag = 'e2m0Vm7JvjK2VpCKXS-kyg'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($expected_flattened_json); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($expected_flattened_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($header, $loaded_flattened_json->getSharedHeader()); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($header, $loaded_json->getSharedHeader()); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertEqualsCanonicalizing($header, $loaded_flattened_json->getSharedHeader()); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); + + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertEqualsCanonicalizing($header, $loaded_json->getSharedHeader()); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -103,8 +106,7 @@ public function a128KWAndA128GCMEncryptionProtectedContentOnlyBis(): void 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', ]); - $protectedHeader = [ - ]; + $protectedHeader = []; $header = [ 'enc' => 'A128GCM', @@ -112,30 +114,39 @@ public function a128KWAndA128GCMEncryptionProtectedContentOnlyBis(): void 'kid' => '81b20965-8332-43d9-a468-82160ad91ac8', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->withSharedHeader($header) ->addRecipient($private_key) ->build() ; - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($header, $loaded_flattened_json->getSharedHeader()); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($header, $loaded_flattened_json->getSharedHeader()); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($header, $loaded_json->getSharedHeader()); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($header, $loaded_json->getSharedHeader()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionTest.php b/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionTest.php index be4fbb8b..3b57302e 100644 --- a/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionTest.php +++ b/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionTest.php @@ -2,33 +2,22 @@ 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\Tests\Component\Encryption\RFC7520; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.8 * - * @group RFC7520 - * * @internal */ -class A128KWAndA128GCMEncryptionTest extends EncryptionTest +final class A128KWAndA128GCMEncryptionTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -58,38 +47,61 @@ public function a128KWAndA128GCMEncryption(): void $expected_ciphertext = 'AwliP-KmWgsZ37BvzCefNen6VTbRK3QMA4TkvRkH0tP1bTdhtFJgJxeVmJkLD61A1hnWGetdg11c9ADsnWgL56NyxwSYjU1ZEHcGkd3EkU0vjHi9gTlb90qSYFfeF0LwkcTtjbYKCsiNJQkcIp1yeM03OmuiYSoYJVSpf7ej6zaYcMv3WwdxDFl8REwOhNImk2Xld2JXq6BR53TSFkyT7PwVLuq-1GwtGHlQeg7gDT6xW0JqHDPn_H-puQsmthc9Zg0ojmJfqqFvETUxLAF-KjcBTS5dNy6egwkYtOt8EIHK-oEsKYtZRaa8Z7MOZ7UGxGIMvEmxrGCPeJa14slv2-gaqK0kEThkaSqdYw0FkQZF'; $expected_tag = 'ER7MWJZ1FBI_NKvn7Zb1Lw'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($expected_compact_json); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($expected_compact_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($expected_flattened_json); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($expected_flattened_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); + + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); + + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -115,33 +127,44 @@ public function a128KWAndA128GCMEncryptionBis(): void 'enc' => 'A128GCM', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->addRecipient($private_key) ->build() ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithAdditionalAuthenticatedDataTest.php b/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithAdditionalAuthenticatedDataTest.php index 9682c84c..057071b2 100644 --- a/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithAdditionalAuthenticatedDataTest.php +++ b/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithAdditionalAuthenticatedDataTest.php @@ -2,33 +2,22 @@ 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\Tests\Component\Encryption\RFC7520; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.10 * - * @group RFC7520 - * * @internal */ -class A128KWAndA128GCMEncryptionWithAdditionalAuthenticatedDataTest extends EncryptionTest +final class A128KWAndA128GCMEncryptionWithAdditionalAuthenticatedDataTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -58,30 +47,45 @@ public function a128KWAndA128GCMEncryptionWithAdditionalAuthenticatedData(): voi $expected_ciphertext = 'Z_3cbr0k3bVM6N3oSNmHz7Lyf3iPppGf3Pj17wNZqteJ0Ui8p74SchQP8xygM1oFRWCNzeIa6s6BcEtp8qEFiqTUEyiNkOWDNoF14T_4NFqF-p2Mx8zkbKxI7oPK8KNarFbyxIDvICNqBLba-v3uzXBdB89fzOI-Lv4PjOFAQGHrgv1rjXAmKbgkft9cB4WeyZw8MldbBhc-V_KWZslrsLNygon_JJWd_ek6LQn5NRehvApqf9ZrxB4aq3FXBxOxCys35PhCdaggy2kfUfl2OkwKnWUbgXVD1C6HxLIlqHhCwXDG59weHrRDQeHyMRoBljoV3X_bUTJDnKBFOod7nLz-cj48JMx3SnCZTpbQAkFV'; $expected_tag = 'vOaH_Rajnpy_3hOtqvZHRA'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($expected_flattened_json); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($expected_flattened_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); - static::assertEquals($expected_aad, $loaded_flattened_json->getAAD()); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - static::assertEquals($expected_aad, $loaded_json->getAAD()); - - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); + static::assertSame($expected_aad, $loaded_flattened_json->getAAD()); + + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + static::assertSame($expected_aad, $loaded_json->getAAD()); + + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -107,27 +111,36 @@ public function a128KWAndA128GCMEncryptionWithAdditionalAuthenticatedDataBis(): 'enc' => 'A128GCM', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->addRecipient($private_key) ->build() ; - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithCompressionTest.php b/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithCompressionTest.php index f5117dd5..97113a9d 100644 --- a/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithCompressionTest.php +++ b/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithCompressionTest.php @@ -2,33 +2,22 @@ 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\Tests\Component\Encryption\RFC7520; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.9 * - * @group RFC7520 - * * @internal */ -class A128KWAndA128GCMEncryptionWithCompressionTest extends EncryptionTest +final class A128KWAndA128GCMEncryptionWithCompressionTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -59,38 +48,61 @@ public function a128KWAndA128GCMEncryptionWithCompression(): void $expected_ciphertext = 'HbDtOsdai1oYziSx25KEeTxmwnh8L8jKMFNc1k3zmMI6VB8hry57tDZ61jXyezSPt0fdLVfe6Jf5y5-JaCap_JQBcb5opbmT60uWGml8blyiMQmOn9J--XhhlYg0m-BHaqfDO5iTOWxPxFMUedx7WCy8mxgDHj0aBMG6152PsM-w5E_o2B3jDbrYBKhpYA7qi3AyijnCJ7BP9rr3U8kxExCpG3mK420TjOw'; $expected_tag = 'VILuUwuIxaLVmh5X-T7kmA'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($expected_compact_json); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($expected_compact_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($expected_flattened_json); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($expected_flattened_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); + + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); + + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -117,33 +129,44 @@ public function a128KWAndA128GCMEncryptionWithCompressionBis(): void 'zip' => 'DEF', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->addRecipient($private_key) ->build() ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithSpecificProtectedHeaderValuesTest.php b/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithSpecificProtectedHeaderValuesTest.php index a5746505..8a29d756 100644 --- a/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithSpecificProtectedHeaderValuesTest.php +++ b/tests/Component/Encryption/RFC7520/A128KWAndA128GCMEncryptionWithSpecificProtectedHeaderValuesTest.php @@ -2,33 +2,22 @@ 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\Tests\Component\Encryption\RFC7520; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.11 * - * @group RFC7520 - * * @internal */ -class A128KWAndA128GCMEncryptionWithSpecificProtectedHeaderValuesTest extends EncryptionTest +final class A128KWAndA128GCMEncryptionWithSpecificProtectedHeaderValuesTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -60,30 +49,45 @@ public function a128KWAndA128GCMEncryptionWithSpecificProtectedHeaderValues(): v $expected_ciphertext = 'lIbCyRmRJxnB2yLQOTqjCDKV3H30ossOw3uD9DPsqLL2DM3swKkjOwQyZtWsFLYMj5YeLht_StAn21tHmQJuuNt64T8D4t6C7kC9OCCJ1IHAolUv4MyOt80MoPb8fZYbNKqplzYJgIL58g8N2v46OgyG637d6uuKPwhAnTGm_zWhqc_srOvgiLkzyFXPq1hBAURbc3-8BqeRb48iR1-_5g5UjWVD3lgiLCN_P7AW8mIiFvUNXBPJK3nOWL4teUPS8yHLbWeL83olU4UAgL48x-8dDkH23JykibVSQju-f7e-1xreHWXzWLHs1NqBbre0dEwK3HX_xM0LjUz77Krppgegoutpf5qaKg3l-_xMINmf'; $expected_tag = 'fNYLqpUe84KD45lvDiaBAQ'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($expected_flattened_json); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($expected_flattened_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($header, $loaded_flattened_json->getSharedHeader()); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($header, $loaded_json->getSharedHeader()); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($header, $loaded_flattened_json->getSharedHeader()); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); + + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($header, $loaded_json->getSharedHeader()); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -112,30 +116,39 @@ public function a128KWAndA128GCMEncryptionWithSpecificProtectedHeaderValuesBis() 'kid' => '81b20965-8332-43d9-a468-82160ad91ac8', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128GCM'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->withSharedHeader($header) ->addRecipient($private_key) ->build() ; - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($header, $loaded_flattened_json->getSharedHeader()); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($header, $loaded_flattened_json->getSharedHeader()); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($header, $loaded_json->getSharedHeader()); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($header, $loaded_json->getSharedHeader()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RFC7520/A256GCMKWAndA128CBC_HS256EncryptionTest.php b/tests/Component/Encryption/RFC7520/A256GCMKWAndA128CBC_HS256EncryptionTest.php index e049a6de..46894295 100644 --- a/tests/Component/Encryption/RFC7520/A256GCMKWAndA128CBC_HS256EncryptionTest.php +++ b/tests/Component/Encryption/RFC7520/A256GCMKWAndA128CBC_HS256EncryptionTest.php @@ -2,34 +2,23 @@ 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\Tests\Component\Encryption\RFC7520; use function array_key_exists; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.7 * - * @group RFC7520 - * * @internal */ -class A256GCMKWAndA128CBC_HS256EncryptionTest extends EncryptionTest +final class A256GCMKWAndA128CBC_HS256EncryptionTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -67,38 +56,61 @@ public function a256GCMKWAndA128CBCHS256Encryption(): void $expected_ciphertext = 'Jf5p9-ZhJlJy_IQ_byKFmI0Ro7w7G1QiaZpI8OaiVgD8EqoDZHyFKFBupS8iaEeVIgMqWmsuJKuoVgzR3YfzoMd3GxEm3VxNhzWyWtZKX0gxKdy6HgLvqoGNbZCzLjqcpDiF8q2_62EVAbr2uSc2oaxFmFuIQHLcqAHxy51449xkjZ7ewzZaGV3eFqhpco8o4DijXaG5_7kp3h2cajRfDgymuxUbWgLqaeNQaJtvJmSMFuEOSAzw9Hdeb6yhdTynCRmu-kqtO5Dec4lT2OMZKpnxc_F1_4yDJFcqb5CiDSmA-psB2k0JtjxAj4UPI61oONK7zzFIu4gBfjJCndsZfdvG7h8wGjV98QhrKEnR7xKZ3KCr0_qR1B-gxpNk3xWU'; $expected_tag = 'DKW7jrb4WaRSNfbXVPlT5g'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A256GCMKW'], ['A128CBC-HS256'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A256GCMKW'], ['A128CBC-HS256'], ['DEF']) + ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($expected_compact_json); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($expected_compact_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($expected_flattened_json); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($expected_flattened_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); + + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); + + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -124,23 +136,34 @@ public function a256GCMKWAndA128CBCHS256EncryptionBis(): void 'enc' => 'A128CBC-HS256', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['A256GCMKW'], ['A128CBC-HS256'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A256GCMKW'], ['A128CBC-HS256'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['A256GCMKW'], ['A128CBC-HS256'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A256GCMKW'], ['A128CBC-HS256'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->addRecipient($private_key) ->build() ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); static::assertTrue(array_key_exists('iv', $loaded_compact_json->getSharedProtectedHeader())); @@ -152,8 +175,8 @@ public function a256GCMKWAndA128CBCHS256EncryptionBis(): void static::assertTrue(array_key_exists('iv', $loaded_json->getSharedProtectedHeader())); static::assertTrue(array_key_exists('tag', $loaded_json->getSharedProtectedHeader())); - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RFC7520/DirAndA128GCMEncryptionTest.php b/tests/Component/Encryption/RFC7520/DirAndA128GCMEncryptionTest.php index 05547549..7cefee44 100644 --- a/tests/Component/Encryption/RFC7520/DirAndA128GCMEncryptionTest.php +++ b/tests/Component/Encryption/RFC7520/DirAndA128GCMEncryptionTest.php @@ -2,33 +2,22 @@ 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\Tests\Component\Encryption\RFC7520; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.6 * - * @group RFC7520 - * * @internal */ -class DirAndA128GCMEncryptionTest extends EncryptionTest +final class DirAndA128GCMEncryptionTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -56,26 +45,35 @@ public function dirAndA128GCMEncryption(): void $expected_ciphertext = 'JW_i_f52hww_ELQPGaYyeAB6HYGcR559l9TYnSovc23XJoBcW29rHP8yZOZG7YhLpT1bjFuvZPjQS-m0IFtVcXkZXdH_lr_FrdYt9HRUYkshtrMmIUAyGmUnd9zMDB2n0cRDIHAzFVeJUDxkUwVAE7_YGRPdcqMyiBoCO-FBdE-Nceb4h3-FtBP-c_BIwCPTjb9o0SbdcdREEMJMyZBH8ySWMVi1gPD9yxi-aQpGbSv_F9N4IZAxscj5g-NJsUPbjk29-s7LJAGb15wEBtXphVCgyy53CoIKLHHeJHXex45Uz9aKZSRSInZI-wjsY0yu3cT4_aQ3i1o-tiE-F8Ios61EKgyIQ4CWao8PFMj8TTnp'; $expected_tag = 'vbb32Xvllea2OtmHAdccRQ'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['dir'], ['A128GCM'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['dir'], ['A128GCM'], ['DEF']) + ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($expected_compact_json); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($expected_compact_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); + + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -101,27 +99,36 @@ public function dirAndA128GCMEncryptionBis(): void 'enc' => 'A128GCM', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['dir'], ['A128GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['dir'], ['A128GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['dir'], ['A128GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['dir'], ['A128GCM'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->addRecipient($private_key) ->build() ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RFC7520/ECDH_ES_A128KWAndA128GCMEncryptionTest.php b/tests/Component/Encryption/RFC7520/ECDH_ES_A128KWAndA128GCMEncryptionTest.php index 063d522e..18e32f35 100644 --- a/tests/Component/Encryption/RFC7520/ECDH_ES_A128KWAndA128GCMEncryptionTest.php +++ b/tests/Component/Encryption/RFC7520/ECDH_ES_A128KWAndA128GCMEncryptionTest.php @@ -2,34 +2,23 @@ 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\Tests\Component\Encryption\RFC7520; use function array_key_exists; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.4 * - * @group RFC7520 - * * @internal */ -class ECDH_ES_A128KWAndA128GCMEncryptionTest extends EncryptionTest +final class ECDH_ES_A128KWAndA128GCMEncryptionTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -67,38 +56,61 @@ public function eCDHESA128KWAndA128GCMEncryption(): void $expected_ciphertext = 'tkZuOO9h95OgHJmkkrfLBisku8rGf6nzVxhRM3sVOhXgz5NJ76oID7lpnAi_cPWJRCjSpAaUZ5dOR3Spy7QuEkmKx8-3RCMhSYMzsXaEwDdXta9Mn5B7cCBoJKB0IgEnj_qfo1hIi-uEkUpOZ8aLTZGHfpl05jMwbKkTe2yK3mjF6SBAsgicQDVCkcY9BLluzx1RmC3ORXaM0JaHPB93YcdSDGgpgBWMVrNU1ErkjcMqMoT_wtCex3w03XdLkjXIuEr2hWgeP-nkUZTPU9EoGSPj6fAS-bSz87RCPrxZdj_iVyC6QWcqAu07WNhjzJEPc4jVntRJ6K53NgPQ5p99l3Z408OUqj4ioYezbS6vTPlQ'; $expected_tag = 'WuGzxmcreYjpHGJoa17EBg'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['ECDH-ES+A128KW'], ['A128GCM'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['ECDH-ES+A128KW'], ['A128GCM'], ['DEF']) + ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($expected_compact_json); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($expected_compact_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($expected_flattened_json); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($expected_flattened_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); + + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); + + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -135,27 +147,36 @@ public function eCDHESA128KWAndA128GCMEncryptionBis(): void 'enc' => 'A128GCM', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['ECDH-ES+A128KW'], ['A128GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['ECDH-ES+A128KW'], ['A128GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['ECDH-ES+A128KW'], ['A128GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['ECDH-ES+A128KW'], ['A128GCM'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->addRecipient($public_key) ->build() ; - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); static::assertTrue(array_key_exists('epk', $loaded_flattened_json->getSharedProtectedHeader())); static::assertTrue(array_key_exists('epk', $loaded_json->getSharedProtectedHeader())); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RFC7520/ECDH_ES_AndA128CBC_HS256EncryptionTest.php b/tests/Component/Encryption/RFC7520/ECDH_ES_AndA128CBC_HS256EncryptionTest.php index bf3b0cba..9f274f4c 100644 --- a/tests/Component/Encryption/RFC7520/ECDH_ES_AndA128CBC_HS256EncryptionTest.php +++ b/tests/Component/Encryption/RFC7520/ECDH_ES_AndA128CBC_HS256EncryptionTest.php @@ -2,34 +2,23 @@ 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\Tests\Component\Encryption\RFC7520; use function array_key_exists; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.5 * - * @group RFC7520 - * * @internal */ -class ECDH_ES_AndA128CBC_HS256EncryptionTest extends EncryptionTest +final class ECDH_ES_AndA128CBC_HS256EncryptionTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -65,27 +54,36 @@ public function eCDHESAndA128CBCHS256Encryption(): void $expected_ciphertext = 'BoDlwPnTypYq-ivjmQvAYJLb5Q6l-F3LIgQomlz87yW4OPKbWE1zSTEFjDfhU9IPIOSA9Bml4m7iDFwA-1ZXvHteLDtw4R1XRGMEsDIqAYtskTTmzmzNa-_q4F_evAPUmwlO-ZG45Mnq4uhM1fm_D9rBtWolqZSF3xGNNkpOMQKF1Cl8i8wjzRli7-IXgyirlKQsbhhqRzkv8IcY6aHl24j03C-AR2le1r7URUhArM79BY8soZU0lzwI-sD5PZ3l4NDCCei9XkoIAfsXJWmySPoeRb2Ni5UZL4mYpvKDiwmyzGd65KqVw7MsFfI_K767G9C9Azp73gKZD0DyUn1mn0WW5LmyX_yJ-3AROq8p1WZBfG-ZyJ6195_JGG2m9Csg'; $expected_tag = 'WCCkNa-x4BeB9hIDIfFuhg'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['ECDH-ES'], ['A128CBC-HS256'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['ECDH-ES'], ['A128CBC-HS256'], ['DEF']) + ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($expected_compact_json); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($expected_compact_json) + ; - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -122,21 +120,28 @@ public function eCDHESAndA128CBCHS256EncryptionBis(): void 'enc' => 'A128CBC-HS256', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['ECDH-ES'], ['A128CBC-HS256'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['ECDH-ES'], ['A128CBC-HS256'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['ECDH-ES'], ['A128CBC-HS256'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['ECDH-ES'], ['A128CBC-HS256'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->addRecipient($public_key) ->build() ; - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); static::assertTrue(array_key_exists('epk', $loaded_json->getSharedProtectedHeader())); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RFC7520/MultipleRecipientEncryptionTest.php b/tests/Component/Encryption/RFC7520/MultipleRecipientEncryptionTest.php index 779d8968..8121a40a 100644 --- a/tests/Component/Encryption/RFC7520/MultipleRecipientEncryptionTest.php +++ b/tests/Component/Encryption/RFC7520/MultipleRecipientEncryptionTest.php @@ -2,35 +2,24 @@ 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\Tests\Component\Encryption\RFC7520; use function array_key_exists; -use ParagonIE\ConstantTime\Base64UrlSafe; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.13 * - * @group RFC7520 - * * @internal */ -class MultipleRecipientEncryptionTest extends EncryptionTest +final class MultipleRecipientEncryptionTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -91,7 +80,8 @@ public function multipleRecipientEncryption(): void 'crv' => 'P-384', 'x' => 'Uzdvk3pi5wKCRc1izp5_r0OjeqT-I68i8g2b8mva8diRhsE2xAn2DtMRb25Ma2CX', 'y' => 'VDrRyFJh-Kwd1EjAgmj5Eo-CTHAZ53MC7PjjpLioy3ylEjI1pOMbw91fzZ84pbfm', - ], ]; + ], + ]; $recipient_3Header = [ 'alg' => 'A256GCMKW', @@ -108,30 +98,47 @@ public function multipleRecipientEncryption(): void $expected_ciphertext = 'ajm2Q-OpPXCr7-MHXicknb1lsxLdXxK_yLds0KuhJzfWK04SjdxQeSw2L9mu3a_k1C55kCQ_3xlkcVKC5yr__Is48VOoK0k63_QRM9tBURMFqLByJ8vOYQX0oJW4VUHJLmGhF-tVQWB7Kz8mr8zeE7txF0MSaP6ga7-siYxStR7_G07Thd1jh-zGT0wxM5g-VRORtq0K6AXpLlwEqRp7pkt2zRM0ZAXqSpe1O6FJ7FHLDyEFnD-zDIZukLpCbzhzMDLLw2-8I14FQrgi-iEuzHgIJFIJn2wh9Tj0cg_kOZy9BqMRZbmYXMY9YQjorZ_P_JYG3ARAIF3OjDNqpdYe-K_5Q5crGJSDNyij_ygEiItR5jssQVH2ofDQdLChtazE'; $expected_tag = 'BESYyFN7T09KY7i8zKs5_g'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA1_5', 'ECDH-ES+A256KW', 'A256GCMKW'], ['A128CBC-HS256'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA1_5', 'ECDH-ES+A256KW', 'A256GCMKW'], ['A128CBC-HS256'], ['DEF']) + ; - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $recipient_1_private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $recipient_2_private_key, 1)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $recipient_3_private_key, 2)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_recipient_1_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_recipient_2_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(1)->getEncryptedKey())); - static::assertEquals($expected_recipient_3_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(2)->getEncryptedKey())); - static::assertEquals($recipient_1Header, $loaded_json->getRecipient(0)->getHeader()); - static::assertEquals($recipient_2Header, $loaded_json->getRecipient(1)->getHeader()); - static::assertEquals($recipient_3Header, $loaded_json->getRecipient(2)->getHeader()); - static::assertEquals($header, $loaded_json->getSharedHeader()); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame( + $expected_recipient_1_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame( + $expected_recipient_2_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(1)->getEncryptedKey()) + ); + static::assertSame( + $expected_recipient_3_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(2)->getEncryptedKey()) + ); + static::assertSame($recipient_1Header, $loaded_json->getRecipient(0)->getHeader()); + static::assertSame($recipient_2Header, $loaded_json->getRecipient(1)->getHeader()); + static::assertSame($recipient_3Header, $loaded_json->getRecipient(2)->getHeader()); + static::assertSame($header, $loaded_json->getSharedHeader()); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -207,11 +214,16 @@ public function multipleRecipientEncryptionBis(): void 'kid' => '18ec08e1-bfa9-4d95-b205-2b4dd1d4321d', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA1_5', 'ECDH-ES+A256KW', 'A256GCMKW'], ['A128CBC-HS256'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA1_5', 'ECDH-ES+A256KW', 'A256GCMKW'], ['A128CBC-HS256'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA1_5', 'ECDH-ES+A256KW', 'A256GCMKW'], ['A128CBC-HS256'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA1_5', 'ECDH-ES+A256KW', 'A256GCMKW'], ['A128CBC-HS256'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->withSharedHeader($header) ->addRecipient($recipient_1_private_key, $recipient_1Header) @@ -220,23 +232,29 @@ public function multipleRecipientEncryptionBis(): void ->build() ; - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $recipient_1_private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $recipient_2_private_key, 1)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $recipient_3_private_key, 2)); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($recipient_1Header, $loaded_json->getRecipient(0)->getHeader()); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($recipient_1Header, $loaded_json->getRecipient(0)->getHeader()); static::assertTrue(array_key_exists('epk', $loaded_json->getRecipient(1)->getHeader())); static::assertTrue(array_key_exists('iv', $loaded_json->getRecipient(2)->getHeader())); static::assertTrue(array_key_exists('tag', $loaded_json->getRecipient(2)->getHeader())); - static::assertEquals($header, $loaded_json->getSharedHeader()); + static::assertSame($header, $loaded_json->getSharedHeader()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -290,7 +308,9 @@ public function multipleRecipientEncryptionWithDifferentContentEncryptionAlgorit 'kid' => 'peregrin.took@tuckborough.example', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA1_5', 'A256GCMKW'], ['A128CBC-HS256', 'A128GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA1_5', 'A256GCMKW'], ['A128CBC-HS256', 'A128GCM'], ['DEF']) + ; $jweBuilder ->create() ->withPayload($expected_payload) diff --git a/tests/Component/Encryption/RFC7520/PBES2_HS512_A256KWAndA128CBC_HS256EncryptionTest.php b/tests/Component/Encryption/RFC7520/PBES2_HS512_A256KWAndA128CBC_HS256EncryptionTest.php index 82037a82..0de7e284 100644 --- a/tests/Component/Encryption/RFC7520/PBES2_HS512_A256KWAndA128CBC_HS256EncryptionTest.php +++ b/tests/Component/Encryption/RFC7520/PBES2_HS512_A256KWAndA128CBC_HS256EncryptionTest.php @@ -2,60 +2,51 @@ 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\Tests\Component\Encryption\RFC7520; use function array_key_exists; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.3 * - * @group RFC7520 - * * @internal */ -class PBES2_HS512_A256KWAndA128CBC_HS256EncryptionTest extends EncryptionTest +final class PBES2_HS512_A256KWAndA128CBC_HS256EncryptionTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ public function pBES2HS512A256KWAndA128CBCHS256Encryption(): void { - $expected_payload = ['keys' => [ - [ - 'kty' => 'oct', - 'kid' => '77c7e2b8-6e13-45cf-8672-617b5b45243a', - 'use' => 'enc', - 'alg' => 'A128GCM', - 'k' => 'XctOhJAkA-pD9Lh7ZgW_2A', - ], [ - 'kty' => 'oct', - 'kid' => '81b20965-8332-43d9-a468-82160ad91ac8', - 'use' => 'enc', - 'alg' => 'A128KW', - 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', - ], [ - 'kty' => 'oct', - 'kid' => '18ec08e1-bfa9-4d95-b205-2b4dd1d4321d', - 'use' => 'enc', - 'alg' => 'A256GCMKW', - 'k' => 'qC57l_uxcm7Nm3K-ct4GFjx8tM1U8CZ0NLBvdQstiS8', + $expected_payload = [ + 'keys' => [ + [ + 'kty' => 'oct', + 'kid' => '77c7e2b8-6e13-45cf-8672-617b5b45243a', + 'use' => 'enc', + 'alg' => 'A128GCM', + 'k' => 'XctOhJAkA-pD9Lh7ZgW_2A', + ], [ + 'kty' => 'oct', + 'kid' => '81b20965-8332-43d9-a468-82160ad91ac8', + 'use' => 'enc', + 'alg' => 'A128KW', + 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', + ], [ + 'kty' => 'oct', + 'kid' => '18ec08e1-bfa9-4d95-b205-2b4dd1d4321d', + 'use' => 'enc', + 'alg' => 'A256GCMKW', + 'k' => 'qC57l_uxcm7Nm3K-ct4GFjx8tM1U8CZ0NLBvdQstiS8', + ], ], - ]]; + ]; $private_key = new JWK([ 'kty' => 'oct', @@ -79,38 +70,61 @@ public function pBES2HS512A256KWAndA128CBCHS256Encryption(): void $expected_ciphertext = '23i-Tb1AV4n0WKVSSgcQrdg6GRqsUKxjruHXYsTHAJLZ2nsnGIX86vMXqIi6IRsfywCRFzLxEcZBRnTvG3nhzPk0GDD7FMyXhUHpDjEYCNA_XOmzg8yZR9oyjo6lTF6si4q9FZ2EhzgFQCLO_6h5EVg3vR75_hkBsnuoqoM3dwejXBtIodN84PeqMb6asmas_dpSsz7H10fC5ni9xIz424givB1YLldF6exVmL93R3fOoOJbmk2GBQZL_SEGllv2cQsBgeprARsaQ7Bq99tT80coH8ItBjgV08AtzXFFsx9qKvC982KLKdPQMTlVJKkqtV4Ru5LEVpBZXBnZrtViSOgyg6AiuwaS-rCrcD_ePOGSuxvgtrokAKYPqmXUeRdjFJwafkYEkiuDCV9vWGAi1DH2xTafhJwcmywIyzi4BqRpmdn_N-zl5tuJYyuvKhjKv6ihbsV_k1hJGPGAxJ6wUpmwC4PTQ2izEm0TuSE8oMKdTw8V3kobXZ77ulMwDs4p'; $expected_tag = '0HlwodAhOCILG5SQ2LQ9dg'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['PBES2-HS512+A256KW'], ['A128CBC-HS256'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['PBES2-HS512+A256KW'], ['A128CBC-HS256'], ['DEF']) + ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($expected_compact_json); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($expected_compact_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($expected_flattened_json); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($expected_flattened_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - - static::assertEquals($expected_payload, json_decode($loaded_compact_json->getPayload(), true)); - static::assertEquals($expected_payload, json_decode($loaded_flattened_json->getPayload(), true)); - static::assertEquals($expected_payload, json_decode($loaded_json->getPayload(), true)); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); + + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); + + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + + static::assertSame($expected_payload, json_decode($loaded_compact_json->getPayload(), true)); + static::assertSame($expected_payload, json_decode($loaded_flattened_json->getPayload(), true)); + static::assertSame($expected_payload, json_decode($loaded_json->getPayload(), true)); } /** @@ -120,27 +134,29 @@ public function pBES2HS512A256KWAndA128CBCHS256Encryption(): void */ public function pBES2HS512A256KWAndA128CBCHS256EncryptionBis(): void { - $expected_payload = json_encode(['keys' => [ - [ - 'kty' => 'oct', - 'kid' => '77c7e2b8-6e13-45cf-8672-617b5b45243a', - 'use' => 'enc', - 'alg' => 'A128GCM', - 'k' => 'XctOhJAkA-pD9Lh7ZgW_2A', - ], [ - 'kty' => 'oct', - 'kid' => '81b20965-8332-43d9-a468-82160ad91ac8', - 'use' => 'enc', - 'alg' => 'A128KW', - 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', - ], [ - 'kty' => 'oct', - 'kid' => '18ec08e1-bfa9-4d95-b205-2b4dd1d4321d', - 'use' => 'enc', - 'alg' => 'A256GCMKW', - 'k' => 'qC57l_uxcm7Nm3K-ct4GFjx8tM1U8CZ0NLBvdQstiS8', + $expected_payload = json_encode([ + 'keys' => [ + [ + 'kty' => 'oct', + 'kid' => '77c7e2b8-6e13-45cf-8672-617b5b45243a', + 'use' => 'enc', + 'alg' => 'A128GCM', + 'k' => 'XctOhJAkA-pD9Lh7ZgW_2A', + ], [ + 'kty' => 'oct', + 'kid' => '81b20965-8332-43d9-a468-82160ad91ac8', + 'use' => 'enc', + 'alg' => 'A128KW', + 'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ', + ], [ + 'kty' => 'oct', + 'kid' => '18ec08e1-bfa9-4d95-b205-2b4dd1d4321d', + 'use' => 'enc', + 'alg' => 'A256GCMKW', + 'k' => 'qC57l_uxcm7Nm3K-ct4GFjx8tM1U8CZ0NLBvdQstiS8', + ], ], - ]]); + ]); $private_key = new JWK([ 'kty' => 'oct', @@ -154,20 +170,29 @@ public function pBES2HS512A256KWAndA128CBCHS256EncryptionBis(): void 'enc' => 'A128CBC-HS256', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['PBES2-HS512+A256KW'], ['A128CBC-HS256'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['PBES2-HS512+A256KW'], ['A128CBC-HS256'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['PBES2-HS512+A256KW'], ['A128CBC-HS256'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['PBES2-HS512+A256KW'], ['A128CBC-HS256'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->addRecipient($private_key) ->build() ; - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); static::assertTrue(array_key_exists('p2s', $loaded_flattened_json->getSharedProtectedHeader())); @@ -176,7 +201,7 @@ public function pBES2HS512A256KWAndA128CBCHS256EncryptionBis(): void static::assertTrue(array_key_exists('p2s', $loaded_json->getSharedProtectedHeader())); static::assertTrue(array_key_exists('p2c', $loaded_json->getSharedProtectedHeader())); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RFC7520/RSA1_5AndA128CBC_HS256EncryptionTest.php b/tests/Component/Encryption/RFC7520/RSA1_5AndA128CBC_HS256EncryptionTest.php index 51a37cfd..bb7e3d52 100644 --- a/tests/Component/Encryption/RFC7520/RSA1_5AndA128CBC_HS256EncryptionTest.php +++ b/tests/Component/Encryption/RFC7520/RSA1_5AndA128CBC_HS256EncryptionTest.php @@ -2,33 +2,22 @@ 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\Tests\Component\Encryption\RFC7520; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.1 * - * @group RFC7520 - * * @internal */ -class RSA1_5AndA128CBC_HS256EncryptionTest extends EncryptionTest +final class RSA1_5AndA128CBC_HS256EncryptionTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -64,38 +53,61 @@ public function rSA15AndA128CBCHS256Encryption(): void $expected_ciphertext = '0fys_TY_na7f8dwSfXLiYdHaA2DxUjD67ieF7fcVbIR62JhJvGZ4_FNVSiGc_raa0HnLQ6s1P2sv3Xzl1p1l_o5wR_RsSzrS8Z-wnI3Jvo0mkpEEnlDmZvDu_k8OWzJv7eZVEqiWKdyVzFhPpiyQU28GLOpRc2VbVbK4dQKPdNTjPPEmRqcaGeTWZVyeSUvf5k59yJZxRuSvWFf6KrNtmRdZ8R4mDOjHSrM_s8uwIFcqt4r5GX8TKaI0zT5CbL5Qlw3sRc7u_hg0yKVOiRytEAEs3vZkcfLkP6nbXdC_PkMdNS-ohP78T2O6_7uInMGhFeX4ctHG7VelHGiT93JfWDEQi5_V9UN1rhXNrYu-0fVMkZAKX3VWi7lzA6BP430m'; $expected_tag = 'kvKuFBXHe5mQr4lqgobAUg'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA1_5'], ['A128CBC-HS256'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA1_5'], ['A128CBC-HS256'], ['DEF']) + ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($expected_compact_json); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($expected_compact_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($expected_flattened_json); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($expected_flattened_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); + + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); + + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -127,33 +139,44 @@ public function rSA15AndA128CBCHS256EncryptionBis(): void 'enc' => 'A128CBC-HS256', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA1_5'], ['A128CBC-HS256'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA1_5'], ['A128CBC-HS256'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA1_5'], ['A128CBC-HS256'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA1_5'], ['A128CBC-HS256'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->addRecipient($private_key) ->build() ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RFC7520/RSA_OAEPAndA256GCMEncryptionTest.php b/tests/Component/Encryption/RFC7520/RSA_OAEPAndA256GCMEncryptionTest.php index 72664674..ba3ab044 100644 --- a/tests/Component/Encryption/RFC7520/RSA_OAEPAndA256GCMEncryptionTest.php +++ b/tests/Component/Encryption/RFC7520/RSA_OAEPAndA256GCMEncryptionTest.php @@ -2,33 +2,22 @@ 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\Tests\Component\Encryption\RFC7520; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Tests\Component\Encryption\EncryptionTest; +use ParagonIE\ConstantTime\Base64UrlSafe; /** * @see https://tools.ietf.org/html/rfc7520#section-5.2 * - * @group RFC7520 - * * @internal */ -class RSA_OAEPAndA256GCMEncryptionTest extends EncryptionTest +final class RSA_OAEPAndA256GCMEncryptionTest extends EncryptionTest { /** - * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different). - * The output given in the RFC is used and only decrypted. + * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are + * always different). The output given in the RFC is used and only decrypted. * * @test */ @@ -65,38 +54,61 @@ public function rSAOAEPAndA256GCMEncryption(): void $expected_ciphertext = 'o4k2cnGN8rSSw3IDo1YuySkqeS_t2m1GXklSgqBdpACm6UJuJowOHC5ytjqYgRL-I-soPlwqMUf4UgRWWeaOGNw6vGW-xyM01lTYxrXfVzIIaRdhYtEMRBvBWbEwP7ua1DRfvaOjgZv6Ifa3brcAM64d8p5lhhNcizPersuhw5f-pGYzseva-TUaL8iWnctc-sSwy7SQmRkfhDjwbz0fz6kFovEgj64X1I5s7E6GLp5fnbYGLa1QUiML7Cc2GxgvI7zqWo0YIEc7aCflLG1-8BboVWFdZKLK9vNoycrYHumwzKluLWEbSVmaPpOslY2n525DxDfWaVFUfKQxMF56vn4B9QMpWAbnypNimbM8zVOw'; $expected_tag = 'UCGiqJxhBI3IFVdPalHHvA'; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA-OAEP'], ['A256GCM'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA-OAEP'], ['A256GCM'], ['DEF']) + ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($expected_compact_json); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($expected_compact_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($expected_flattened_json); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($expected_flattened_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($expected_json); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($expected_json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); - - static::assertEquals($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); - static::assertEquals($expected_encrypted_key, Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey())); - static::assertEquals($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); - - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_compact_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_compact_json->getTag())); + + static::assertSame( + $expected_ciphertext, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getCiphertext()) + ); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_flattened_json->getTag())); + + static::assertSame($expected_ciphertext, Base64UrlSafe::encodeUnpadded($loaded_json->getCiphertext())); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($expected_iv, Base64UrlSafe::encodeUnpadded($loaded_json->getIV())); + static::assertSame( + $expected_encrypted_key, + Base64UrlSafe::encodeUnpadded($loaded_json->getRecipient(0)->getEncryptedKey()) + ); + static::assertSame($expected_tag, Base64UrlSafe::encodeUnpadded($loaded_json->getTag())); + + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } /** @@ -129,33 +141,44 @@ public function rSAOAEPAndA256GCMEncryptionBis(): void 'enc' => 'A256GCM', ]; - $jweBuilder = $this->getJWEBuilderFactory()->create(['RSA-OAEP'], ['A256GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA-OAEP'], ['A256GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create(['RSA-OAEP'], ['A256GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA-OAEP'], ['A256GCM'], ['DEF']) + ; $jwe = $jweBuilder - ->create()->withPayload($expected_payload) + ->create() + ->withPayload($expected_payload) ->withSharedProtectedHeader($protectedHeader) ->addRecipient($private_key) ->build() ; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_compact', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $private_key, 0)); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)); + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_flattened', $jwe, 0)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $private_key, 0)); - $loaded_json = $this->getJWESerializerManager()->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)); + $loaded_json = $this->getJWESerializerManager() + ->unserialize($this->getJWESerializerManager()->serialize('jwe_json_general', $jwe)) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $private_key, 0)); - static::assertEquals($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($protectedHeader, $loaded_json->getSharedProtectedHeader()); + static::assertSame($protectedHeader, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($expected_payload, $loaded_compact_json->getPayload()); - static::assertEquals($expected_payload, $loaded_flattened_json->getPayload()); - static::assertEquals($expected_payload, $loaded_json->getPayload()); + static::assertSame($expected_payload, $loaded_compact_json->getPayload()); + static::assertSame($expected_payload, $loaded_flattened_json->getPayload()); + static::assertSame($expected_payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/Encryption/RSAEncryptionTest.php b/tests/Component/Encryption/RSAEncryptionTest.php index 12c40945..428c97e3 100644 --- a/tests/Component/Encryption/RSAEncryptionTest.php +++ b/tests/Component/Encryption/RSAEncryptionTest.php @@ -2,26 +2,14 @@ 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\Tests\Component\Encryption; use Jose\Component\Core\JWKSet; /** - * @group RSA - * @group unit - * * @internal */ -class RSAEncryptionTest extends EncryptionTest +final class RSAEncryptionTest extends EncryptionTest { /** * @see https://tools.ietf.org/html/rfc7516 @@ -30,15 +18,21 @@ class RSAEncryptionTest extends EncryptionTest */ public function loadJWEFromRFC7516(): void { - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA1_5'], ['A128CBC-HS256'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA1_5'], ['A128CBC-HS256'], ['DEF']) + ; - $loaded = $this->getJWESerializerManager()->unserialize('eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A.AxY8DCtDaGlsbGljb3RoZQ.KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY.9hH0vgRfYgPnAHOd8stkvw'); + $loaded = $this->getJWESerializerManager() + ->unserialize( + 'eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A.AxY8DCtDaGlsbGljb3RoZQ.KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY.9hH0vgRfYgPnAHOd8stkvw' + ) + ; - static::assertEquals('RSA1_5', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A128CBC-HS256', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('RSA1_5', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A128CBC-HS256', $loaded->getSharedProtectedHeaderParameter('enc')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); - static::assertEquals('Live long and prosper.', $loaded->getPayload()); + static::assertSame('Live long and prosper.', $loaded->getPayload()); } /** @@ -48,104 +42,112 @@ public function loadJWEFromRFC7516(): void */ public function loadJWEJSONSerialization(): void { - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA1_5', 'A128KW'], ['A128CBC-HS256'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA1_5', 'A128KW'], ['A128CBC-HS256'], ['DEF']) + ; - $loaded = $this->getJWESerializerManager()->unserialize('{"protected":"eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","unprotected":{"jku":"https://server.example.com/keys.jwks"},"recipients":[{"header":{"alg":"RSA1_5","kid":"2011-04-29"},"encrypted_key":"UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A"},{"header":{"alg":"A128KW","kid":"7"},"encrypted_key":"6KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ"}],"iv":"AxY8DCtDaGlsbGljb3RoZQ","ciphertext":"KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY","tag":"Mz-VPPyU4RlcuYv1IwIvzw"}'); + $loaded = $this->getJWESerializerManager() + ->unserialize( + '{"protected":"eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","unprotected":{"jku":"https://server.example.com/keys.jwks"},"recipients":[{"header":{"alg":"RSA1_5","kid":"2011-04-29"},"encrypted_key":"UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A"},{"header":{"alg":"A128KW","kid":"7"},"encrypted_key":"6KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ"}],"iv":"AxY8DCtDaGlsbGljb3RoZQ","ciphertext":"KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY","tag":"Mz-VPPyU4RlcuYv1IwIvzw"}' + ) + ; - static::assertEquals(2, $loaded->countRecipients()); - static::assertEquals('A128CBC-HS256', $loaded->getSharedProtectedHeaderParameter('enc')); - static::assertEquals('RSA1_5', $loaded->getRecipient(0)->getHeaderParameter('alg')); - static::assertEquals('A128KW', $loaded->getRecipient(1)->getHeaderParameter('alg')); + static::assertSame(2, $loaded->countRecipients()); + static::assertSame('A128CBC-HS256', $loaded->getSharedProtectedHeaderParameter('enc')); + static::assertSame('RSA1_5', $loaded->getRecipient(0)->getHeaderParameter('alg')); + static::assertSame('A128KW', $loaded->getRecipient(1)->getHeaderParameter('alg')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); - static::assertEquals('Live long and prosper.', $loaded->getPayload()); + static::assertSame('Live long and prosper.', $loaded->getPayload()); } 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', + $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); } diff --git a/tests/Component/Encryption/RSAKeyEncryptionTest.php b/tests/Component/Encryption/RSAKeyEncryptionTest.php index b39aa9cf..5a6828f6 100644 --- a/tests/Component/Encryption/RSAKeyEncryptionTest.php +++ b/tests/Component/Encryption/RSAKeyEncryptionTest.php @@ -2,33 +2,23 @@ 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\Tests\Component\Encryption; -use ParagonIE\ConstantTime\Base64UrlSafe; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\Core\JWKSet; use Jose\Component\Encryption\Algorithm\KeyEncryption\RSA15; use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP; use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP256; +use ParagonIE\ConstantTime\Base64UrlSafe; +use const STR_PAD_LEFT; /** * Class RSAKeyEncryptionTest. * - * @group unit - * * @internal */ -class RSAKeyEncryptionTest extends EncryptionTest +final class RSAKeyEncryptionTest extends EncryptionTest { /** * @test @@ -71,20 +61,55 @@ public function rSA15EncryptionAndDecryption(): void 'qi' => 'eNho5yRBEBxhGBtQRww9QirZsB66TrfFReG_CcteI1aCneT0ELGhYlRlCtUkTRclIfuEPmNsNDPbLoLqqCVznFbvdB7x-Tl-m0l_eFTj2KiqwGqE9PZB9nNTwMVvH3VRRSLWACvPnSiwP8N5Usy-WRXS-V7TbpxIhvepTfE0NNo', ]); - $cek = [4, 211, 31, 197, 84, 157, 252, 254, 11, 100, 157, 250, 63, 170, 106, 206, 107, 124, 212, 45, 111, 107, 9, 219, 200, 177, 0, 240, 143, 156, 44, 207]; + $cek = [ + 4, + 211, + 31, + 197, + 84, + 157, + 252, + 254, + 11, + 100, + 157, + 250, + 63, + 170, + 106, + 206, + 107, + 124, + 212, + 45, + 111, + 107, + 9, + 219, + 200, + 177, + 0, + 240, + 143, + 156, + 44, + 207, + ]; foreach ($cek as $key => $value) { $cek[$key] = str_pad(dechex($value), 2, '0', STR_PAD_LEFT); } $cek = hex2bin(implode('', $cek)); - $from_specification = Base64UrlSafe::decode('UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A'); + $from_specification = Base64UrlSafe::decode( + 'UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A' + ); $rsa1_5 = new RSA15(); $additionalHeader = []; $encrypted = $rsa1_5->encryptKey($jwk, $cek, $header, $additionalHeader); - static::assertEquals($cek, $rsa1_5->decryptKey($jwk, $encrypted, $header)); - static::assertEquals($cek, $rsa1_5->decryptKey($jwk, $from_specification, $header)); + static::assertSame($cek, $rsa1_5->decryptKey($jwk, $encrypted, $header)); + static::assertSame($cek, $rsa1_5->decryptKey($jwk, $from_specification, $header)); } /** @@ -107,20 +132,55 @@ public function rSAOAEPEncryptionAndDecryption(): void 'qi' => 'VIMpMYbPf47dT1w_zDUXfPimsSegnMOA1zTaX7aGk_8urY6R8-ZW1FxU7AlWAyLWybqq6t16VFd7hQd0y6flUK4SlOydB61gwanOsXGOAOv82cHq0E3eL4HrtZkUuKvnPrMnsUUFlfUdybVzxyjz9JF_XyaY14ardLSjf4L_FNY', ]); - $cek = [177, 161, 244, 128, 84, 143, 225, 115, 63, 180, 3, 255, 107, 154, 212, 246, 138, 7, 110, 91, 112, 46, 34, 105, 47, 130, 203, 46, 122, 234, 64, 252]; + $cek = [ + 177, + 161, + 244, + 128, + 84, + 143, + 225, + 115, + 63, + 180, + 3, + 255, + 107, + 154, + 212, + 246, + 138, + 7, + 110, + 91, + 112, + 46, + 34, + 105, + 47, + 130, + 203, + 46, + 122, + 234, + 64, + 252, + ]; foreach ($cek as $key => $value) { $cek[$key] = str_pad(dechex($value), 2, '0', STR_PAD_LEFT); } $cek = hex2bin(implode('', $cek)); - $from_specification = Base64UrlSafe::decode('OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGeipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDbSv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaVmqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je81860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi6UklfCpIMfIjf7iGdXKHzg'); + $from_specification = Base64UrlSafe::decode( + 'OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGeipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDbSv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaVmqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je81860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi6UklfCpIMfIjf7iGdXKHzg' + ); $rsa_oaep = new RSAOAEP(); $additionalHeader = []; $encrypted = $rsa_oaep->encryptKey($jwk, $cek, $header, $additionalHeader); - static::assertEquals($cek, $rsa_oaep->decryptKey($jwk, $encrypted, $header)); - static::assertEquals($cek, $rsa_oaep->decryptKey($jwk, $from_specification, $header)); + static::assertSame($cek, $rsa_oaep->decryptKey($jwk, $encrypted, $header)); + static::assertSame($cek, $rsa_oaep->decryptKey($jwk, $from_specification, $header)); } /** @@ -143,7 +203,40 @@ public function rSAOAEP256EncryptionAndDecryption(): void 'qi' => 'VIMpMYbPf47dT1w_zDUXfPimsSegnMOA1zTaX7aGk_8urY6R8-ZW1FxU7AlWAyLWybqq6t16VFd7hQd0y6flUK4SlOydB61gwanOsXGOAOv82cHq0E3eL4HrtZkUuKvnPrMnsUUFlfUdybVzxyjz9JF_XyaY14ardLSjf4L_FNY', ]); - $cek = [177, 161, 244, 128, 84, 143, 225, 115, 63, 180, 3, 255, 107, 154, 212, 246, 138, 7, 110, 91, 112, 46, 34, 105, 47, 130, 203, 46, 122, 234, 64, 252]; + $cek = [ + 177, + 161, + 244, + 128, + 84, + 143, + 225, + 115, + 63, + 180, + 3, + 255, + 107, + 154, + 212, + 246, + 138, + 7, + 110, + 91, + 112, + 46, + 34, + 105, + 47, + 130, + 203, + 46, + 122, + 234, + 64, + 252, + ]; foreach ($cek as $key => $value) { $cek[$key] = str_pad(dechex($value), 2, '0', STR_PAD_LEFT); } @@ -153,7 +246,7 @@ public function rSAOAEP256EncryptionAndDecryption(): void $additionalHeader = []; $encrypted = $rsa_oaep_256->encryptKey($jwk, $cek, $header, $additionalHeader); - static::assertEquals($cek, $rsa_oaep_256->decryptKey($jwk, $encrypted, $header)); + static::assertSame($cek, $rsa_oaep_256->decryptKey($jwk, $encrypted, $header)); } /** @@ -163,15 +256,21 @@ public function rSAOAEP256EncryptionAndDecryption(): void */ public function loadJWK1(): void { - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA-OAEP'], ['A256GCM'], ['DEF']); - - $loaded = $this->getJWESerializerManager()->unserialize('eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGeipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDbSv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaVmqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je81860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi6UklfCpIMfIjf7iGdXKHzg.48V1_ALb6US04U3b.5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6jiSdiwkIr3ajwQzaBtQD_A.XFBoMYUZodetZdvTiFvSkQ'); - - static::assertEquals('RSA-OAEP', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A256GCM', $loaded->getSharedProtectedHeaderParameter('enc')); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA-OAEP'], ['A256GCM'], ['DEF']) + ; + + $loaded = $this->getJWESerializerManager() + ->unserialize( + 'eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGeipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDbSv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaVmqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je81860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi6UklfCpIMfIjf7iGdXKHzg.48V1_ALb6US04U3b.5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6jiSdiwkIr3ajwQzaBtQD_A.XFBoMYUZodetZdvTiFvSkQ' + ) + ; + + static::assertSame('RSA-OAEP', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A256GCM', $loaded->getSharedProtectedHeaderParameter('enc')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); - static::assertEquals('The true sign of intelligence is not knowledge but imagination.', $loaded->getPayload()); + static::assertSame('The true sign of intelligence is not knowledge but imagination.', $loaded->getPayload()); } /** @@ -181,13 +280,19 @@ public function loadJWK1(): void */ public function loadJWK2(): void { - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA1_5'], ['A128CBC-HS256'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA1_5'], ['A128CBC-HS256'], ['DEF']) + ; - $loaded = $this->getJWESerializerManager()->unserialize('eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A.AxY8DCtDaGlsbGljb3RoZQ.KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY.9hH0vgRfYgPnAHOd8stkvw'); + $loaded = $this->getJWESerializerManager() + ->unserialize( + 'eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A.AxY8DCtDaGlsbGljb3RoZQ.KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY.9hH0vgRfYgPnAHOd8stkvw' + ) + ; static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0)); - static::assertEquals('Live long and prosper.', $loaded->getPayload()); + static::assertSame('Live long and prosper.', $loaded->getPayload()); } /** @@ -197,127 +302,139 @@ public function loadJWK2(): void */ public function loadJWK3(): void { - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['A128KW'], ['A128CBC-HS256'], ['DEF']); - - $loaded = $this->getJWESerializerManager()->unserialize('eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.6KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ.AxY8DCtDaGlsbGljb3RoZQ.KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY.U0m_YmjN04DJvceFICbCVQ'); - - static::assertEquals('A128KW', $loaded->getSharedProtectedHeaderParameter('alg')); - static::assertEquals('A128CBC-HS256', $loaded->getSharedProtectedHeaderParameter('enc')); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['A128KW'], ['A128CBC-HS256'], ['DEF']) + ; + + $loaded = $this->getJWESerializerManager() + ->unserialize( + 'eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.6KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ.AxY8DCtDaGlsbGljb3RoZQ.KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY.U0m_YmjN04DJvceFICbCVQ' + ) + ; + + static::assertSame('A128KW', $loaded->getSharedProtectedHeaderParameter('alg')); + static::assertSame('A128CBC-HS256', $loaded->getSharedProtectedHeaderParameter('enc')); static::assertNull($loaded->getPayload()); static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getSymmetricKeySet(), 0)); - static::assertEquals('Live long and prosper.', $loaded->getPayload()); + static::assertSame('Live long and prosper.', $loaded->getPayload()); } private function getPrivateKeySet(): JWKSet { - $keys = ['keys' => [ - [ - 'kty' => 'EC', - 'crv' => 'P-256', - 'x' => 'weNJy2HscCSM6AEDTDg04biOvhFhyyWvOHQfeF_PxMQ', - 'y' => 'e8lnCO-AlStT-NJVX-crhB7QRYhiix03illJOVAOyck', - 'd' => 'VEmDZpDXXK8p8N0Cndsxs924q6nS1RXFASRl6BfUqdw', + $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', + ], ], - [ - '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); } private function getSymmetricKeySet(): JWKSet { - $keys = ['keys' => [ - [ - 'kid' => 'DIR_1', - 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded(hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F')), - ], - [ - 'kty' => 'oct', - 'k' => 'f5aN5V6iihwQVqP-tPNNtkIJNCwUb9-JukCIKkF0rNfxqxA771RJynYAT2xtzAP0MYaR7U5fMP_wvbRQq5l38Q', - ], - [ - 'kty' => 'oct', - 'k' => 'GawgguFyGrWKav7AX4VKUg', - ], - [ - 'kty' => 'oct', - 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', + $keys = [ + 'keys' => [ + [ + 'kid' => 'DIR_1', + 'kty' => 'oct', + 'k' => Base64UrlSafe::encodeUnpadded( + hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F') + ), + ], + [ + 'kty' => 'oct', + 'k' => 'f5aN5V6iihwQVqP-tPNNtkIJNCwUb9-JukCIKkF0rNfxqxA771RJynYAT2xtzAP0MYaR7U5fMP_wvbRQq5l38Q', + ], + [ + 'kty' => 'oct', + 'k' => 'GawgguFyGrWKav7AX4VKUg', + ], + [ + 'kty' => 'oct', + 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', + ], ], - ]]; + ]; return JWKSet::createFromKeyData($keys); } diff --git a/tests/Component/Encryption/RSAKeyWithoutAllPrimesTest.php b/tests/Component/Encryption/RSAKeyWithoutAllPrimesTest.php index 3eddf8a9..f2957423 100644 --- a/tests/Component/Encryption/RSAKeyWithoutAllPrimesTest.php +++ b/tests/Component/Encryption/RSAKeyWithoutAllPrimesTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Encryption; use Jose\Component\Core\JWK; @@ -19,12 +10,9 @@ /** * Class RSAKeyWithoutAllPrimesTest. * - * @group RSA2 - * @group unit - * * @internal */ -class RSAKeyWithoutAllPrimesTest extends EncryptionTest +final class RSAKeyWithoutAllPrimesTest extends EncryptionTest { /** * @dataProvider dataEncryptionAlgorithms @@ -35,20 +23,34 @@ public function encryptionAlgorithms(string $encryption_algorithm): void { $key = $this->getPrivateKey(); - $claims = JsonConverter::encode(['foo' => 'bar']); + $claims = JsonConverter::encode([ + 'foo' => 'bar', + ]); - $jweBuilder = $this->getJWEBuilderFactory()->create([$encryption_algorithm], ['A256GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create([$encryption_algorithm], ['A256GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create([$encryption_algorithm], ['A256GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create([$encryption_algorithm], ['A256GCM'], ['DEF']) + ; $jwt = $jweBuilder - ->create()->withPayload($claims) - ->withSharedProtectedHeader(['alg' => $encryption_algorithm, 'enc' => 'A256GCM']) + ->create() + ->withPayload($claims) + ->withSharedProtectedHeader([ + 'alg' => $encryption_algorithm, + 'enc' => 'A256GCM', + ]) ->addRecipient($key) ->build() ; - $jwt = $this->getJWESerializerManager()->serialize('jwe_compact', $jwt, 0); + $jwt = $this->getJWESerializerManager() + ->serialize('jwe_compact', $jwt, 0) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwt); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwt) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded, $key, 0)); } @@ -62,39 +64,46 @@ public function encryptionAlgorithmsWithMinimalRsaKey(string $encryption_algorit { $key = $this->getMinimalPrivateKey(); - $claims = JsonConverter::encode(['foo' => 'bar']); + $claims = JsonConverter::encode([ + 'foo' => 'bar', + ]); - $jweBuilder = $this->getJWEBuilderFactory()->create([$encryption_algorithm], ['A256GCM'], ['DEF']); - $jweDecrypter = $this->getJWEDecrypterFactory()->create([$encryption_algorithm], ['A256GCM'], ['DEF']); + $jweBuilder = $this->getJWEBuilderFactory() + ->create([$encryption_algorithm], ['A256GCM'], ['DEF']) + ; + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create([$encryption_algorithm], ['A256GCM'], ['DEF']) + ; $jwt = $jweBuilder - ->create()->withPayload($claims) - ->withSharedProtectedHeader(['alg' => $encryption_algorithm, 'enc' => 'A256GCM']) + ->create() + ->withPayload($claims) + ->withSharedProtectedHeader([ + 'alg' => $encryption_algorithm, + 'enc' => 'A256GCM', + ]) ->addRecipient($key) ->build() ; - $jwt = $this->getJWESerializerManager()->serialize('jwe_compact', $jwt, 0); + $jwt = $this->getJWESerializerManager() + ->serialize('jwe_compact', $jwt, 0) + ; - $loaded = $this->getJWESerializerManager()->unserialize($jwt); + $loaded = $this->getJWESerializerManager() + ->unserialize($jwt) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded, $key, 0)); } public function dataEncryptionAlgorithms(): array { - return [ - ['RSA1_5'], - ['RSA-OAEP'], - ['RSA-OAEP-256'], - ]; + return [['RSA1_5'], ['RSA-OAEP'], ['RSA-OAEP-256']]; } public function dataEncryptionAlgorithmsWithSimpleKey(): array { - return [ - ['RSA-OAEP'], - ['RSA-OAEP-256'], - ]; + return [['RSA-OAEP'], ['RSA-OAEP-256']]; } private function getPrivateKey(): JWK diff --git a/tests/Component/KeyManagement/CertificateTest.php b/tests/Component/KeyManagement/CertificateTest.php index dd4efc23..a227ea46 100644 --- a/tests/Component/KeyManagement/CertificateTest.php +++ b/tests/Component/KeyManagement/CertificateTest.php @@ -2,35 +2,23 @@ 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\Tests\Component\KeyManagement; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\KeyManagement\JWKFactory; use Jose\Component\KeyManagement\KeyConverter\KeyConverter; +use const PHP_EOL; use PHPUnit\Framework\TestCase; /** * @see http://fm4dd.com/openssl/certexamples.htm * - * @group Certificate - * @group unit - * * @internal */ -class CertificateTest extends TestCase +final class CertificateTest extends TestCase { /** - * @covers \Jose\Component\KeyManagement\KeyConverter\KeyConverter * @test */ public function fileNotFound(): void @@ -42,24 +30,22 @@ public function fileNotFound(): void } /** - * @covers \Jose\Component\KeyManagement\KeyConverter\KeyConverter * @test */ public function fileNotValid(): void { $this->expectException(InvalidArgumentException::class); - KeyConverter::loadKeyFromCertificateFile(__DIR__.__FILE__); + KeyConverter::loadKeyFromCertificateFile(__DIR__ . __FILE__); } /** - * @covers \Jose\Component\KeyManagement\KeyConverter\KeyConverter * @test */ public function certificateConversion(): void { - $details = KeyConverter::loadFromKeyFile(__DIR__.'/Keys/RSA/private.encrypted.key', 'tests'); - static::assertEquals($details, [ + $details = KeyConverter::loadFromKeyFile(__DIR__ . '/Keys/RSA/private.encrypted.key', 'tests'); + static::assertEqualsCanonicalizing($details, [ 'kty' => 'RSA', 'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw', 'e' => 'AQAB', @@ -71,8 +57,8 @@ public function certificateConversion(): void 'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os', ]); - $details = KeyConverter::loadFromKeyFile(__DIR__.'/Keys/RSA/public.key'); - static::assertEquals($details, [ + $details = KeyConverter::loadFromKeyFile(__DIR__ . '/Keys/RSA/public.key'); + static::assertSame($details, [ 'kty' => 'RSA', 'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw', 'e' => 'AQAB', @@ -80,13 +66,12 @@ public function certificateConversion(): void } /** - * @covers \Jose\Component\KeyManagement\KeyConverter\KeyConverter * @test */ public function certificateConversionPkcs8(): void { - $details = KeyConverter::loadFromKeyFile(__DIR__.'/Keys/RSA/pkcs8.private.encrypted.key', 'tests'); - static::assertEquals($details, [ + $details = KeyConverter::loadFromKeyFile(__DIR__ . '/Keys/RSA/pkcs8.private.encrypted.key', 'tests'); + static::assertSame($details, [ 'kty' => 'RSA', 'n' => 'w6o04pb9gWvXwne6hNWYMjEqIVpKxsPSZbZWPX1TvhBnHwxj0WV6i9jiuc0zoelBf9nNtfWSS-87XcpLILh0N5UuVwx1HAuD3oBeDw0JereA8VUHeyNJlCle8LaeI0zx4v_YEoOv7sZ4bOx3sLgDSp6rp5N0mnD0oSt6p_bsk-TvCnNW4-1ip8tCwfBCNDpNeX9SViJ3Msy2WmOLHxtdc32r1SurO6WK7mbmqSCwnskcf5ylKupApE_1JO_EwUAEkEJG_RFQhBUGeQitrmdm_wcP0-I4qb23q__DC31CnV1UU4VkpqjTmzbnQdeoXMip9Mvv2S-1Xh1ag7x1tUpxTutCFn3lRXHydzzRPf5SojRcPA9fZWdyLVvj_iFPj0k-Lh5Ru8vA5Qq01OuvIdQDLJkhgVcvlqtycBXE2QqqdzNGhfv-rLjt_GzL-lTotS7cvocueA3gjSOQQiI37YEaI_hPr3P5ta9UK0amwZmbK1cpSxPNqpY6g_VeWGd7CvdjFc-SHsJbuWobvSaqmdPbAWyyQcCfFQkyJHKxOMBovUmHnCtUbgs88UvD9Cs9CZFUZ7y2cEdkfUZE6avZ5M1BwXkRxi2gg0hQyEIkfi3jxG7YAEG2YXSaJvPRw9b00DdF3gFRVN4iJ1fxeMhBFriEaULuCnKBZiC75lrOra1f70s', 'e' => 'AQAB', @@ -101,7 +86,6 @@ public function certificateConversionPkcs8(): void /** * @dataProvider dataLoadCertificate - * @covers \Jose\Component\KeyManagement\KeyConverter\KeyConverter * * @test */ @@ -109,168 +93,196 @@ public function loadCertificate(string $file, array $expected_values): void { $result = KeyConverter::loadKeyFromCertificateFile($file); - static::assertEquals($expected_values, $result); + static::assertEqualsCanonicalizing($expected_values, $result); } public function dataLoadCertificate(): array { return [ [ - __DIR__.'/RSA/PEM/512b-rsa-example-cert.pem', + __DIR__ . '/RSA/PEM/512b-rsa-example-cert.pem', [ 'kty' => 'RSA', 'n' => 'm_xmkHmEQrurE_0re_jeFRLl8ZPjBop7uLHhnia7lQG_5zDtZIUC3RVpqDSwBuw_NTweGyuP-o8AG98HxqxTBw', 'e' => 'AQAB', 'x5t' => 'Bxy5TwzIUU0CQSRwjuiyaHvX2dU', 'x5t#256' => 'Xw-1FmWBquZKEBwVg7G-vnToFKkeeooUuh6DXXj26ec', - 'x5c' => ['MIICEjCCAXsCAg36MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'ODIyMDUyNjU0WhcNMTcwODIxMDUyNjU0WjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEAm/xmkHmEQrurE/0re/jeFRLl'.PHP_EOL.'8ZPjBop7uLHhnia7lQG/5zDtZIUC3RVpqDSwBuw/NTweGyuP+o8AG98HxqxTBwID'.PHP_EOL.'AQABMA0GCSqGSIb3DQEBBQUAA4GBABS2TLuBeTPmcaTaUW/LCB2NYOy8GMdzR1mx'.PHP_EOL.'8iBIu2H6/E2tiY3RIevV2OW61qY2/XRQg7YPxx3ffeUugX9F4J/iPnnu1zAxxyBy'.PHP_EOL.'2VguKv4SWjRFoRkIfIlHX0qVviMhSlNy2ioFLy7JcPZb+v3ftDGywUqcBiVDoea0'.PHP_EOL.'Hn+GmxZA'], + 'x5c' => [ + 'MIICEjCCAXsCAg36MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'ODIyMDUyNjU0WhcNMTcwODIxMDUyNjU0WjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEAm/xmkHmEQrurE/0re/jeFRLl' . PHP_EOL . '8ZPjBop7uLHhnia7lQG/5zDtZIUC3RVpqDSwBuw/NTweGyuP+o8AG98HxqxTBwID' . PHP_EOL . 'AQABMA0GCSqGSIb3DQEBBQUAA4GBABS2TLuBeTPmcaTaUW/LCB2NYOy8GMdzR1mx' . PHP_EOL . '8iBIu2H6/E2tiY3RIevV2OW61qY2/XRQg7YPxx3ffeUugX9F4J/iPnnu1zAxxyBy' . PHP_EOL . '2VguKv4SWjRFoRkIfIlHX0qVviMhSlNy2ioFLy7JcPZb+v3ftDGywUqcBiVDoea0' . PHP_EOL . 'Hn+GmxZA', + ], ], ], [ - __DIR__.'/RSA/PEM/1024b-rsa-example-cert.pem', + __DIR__ . '/RSA/PEM/1024b-rsa-example-cert.pem', [ 'kty' => 'RSA', 'n' => 'xgEGvHk-U_RY0j9l3MP7o-S2a6uf4XaRBhu1ztdCHz8tMG8Kj4_qJmgsSZQD17sRctHGBTUJWp4CLtBwCf0zAGVzySwUkcHSu1_2mZ_w7Nr0TQHKeWr_j8pvXH534DKEvugr21DAHbi4c654eLUL-JW_wJJYqJh7qHM3W3Fh7ys', 'e' => 'AQAB', 'x5t' => '4bK45ewZ00Wk-a_shpTw2cCqJc8', 'x5t#256' => '5F5GTPOxBGAOsVyuYzqUBjri0R2YDTiDowiQbs6oGgU', - 'x5c' => ['MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD'.PHP_EOL.'+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9'.PHP_EOL.'MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1'.PHP_EOL.'C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ'.PHP_EOL.'kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf'.PHP_EOL.'jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr'.PHP_EOL.'evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok='], + 'x5c' => [ + 'MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD' . PHP_EOL . '+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9' . PHP_EOL . 'MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1' . PHP_EOL . 'C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ' . PHP_EOL . 'kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf' . PHP_EOL . 'jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr' . PHP_EOL . 'evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok=', + ], ], ], [ - __DIR__.'/RSA/PEM/2048b-rsa-example-cert.pem', + __DIR__ . '/RSA/PEM/2048b-rsa-example-cert.pem', [ 'kty' => 'RSA', 'n' => 'tM_RXjMp7AvPrnb1_i3ImcZ4ebkY-AvUurTXngJSBgn0GJNM1HDRQqApE5JzUHf2BImsAyzW8QarrWzA2dWmq8rNWtJWJlHlSwiKr8wZDyU0kLAqKUEPVfFrk9uds8zc7OvHVRjXQiXeSTUUMpKcHsZp4zz79Jr4-4vF4Bt-_U8luj_llleaJHlJFyfXiUtqLg2HUdkjPQaFVvhYMQ7ugZl4aM1uRH7J2oxaexy_JEApSNEDnO_cripd-Pdqx-m8xbBZ9pX8FsvYnO3D_BKQk3hadbRWg_r8QYT2ZHk0NRyseoUOc3hyAeckiSWe2n9lvK-HkxmM23UVtuAwxwj4WQ', 'e' => 'AQAB', 'x5t' => 'y17eUFeZUYeOLmcTxTvpOOsjfkA', 'x5t#256' => 'B4plbjZwSZyZG7AnRoIFive9wF_EYsYF8PiVgXmBbNc', - 'x5c' => ['MIIC2jCCAkMCAg38MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'ODIyMDUyNzQxWhcNMTcwODIxMDUyNzQxWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0z9FeMynsC8+u'.PHP_EOL.'dvX+LciZxnh5uRj4C9S6tNeeAlIGCfQYk0zUcNFCoCkTknNQd/YEiawDLNbxBqut'.PHP_EOL.'bMDZ1aarys1a0lYmUeVLCIqvzBkPJTSQsCopQQ9V8WuT252zzNzs68dVGNdCJd5J'.PHP_EOL.'NRQykpwexmnjPPv0mvj7i8XgG379TyW6P+WWV5okeUkXJ9eJS2ouDYdR2SM9BoVW'.PHP_EOL.'+FgxDu6BmXhozW5EfsnajFp7HL8kQClI0QOc79yuKl3492rH6bzFsFn2lfwWy9ic'.PHP_EOL.'7cP8EpCTeFp1tFaD+vxBhPZkeTQ1HKx6hQ5zeHIB5ySJJZ7af2W8r4eTGYzbdRW2'.PHP_EOL.'4DDHCPhZAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAQMv+BFvGdMVzkQaQ3/+2noVz'.PHP_EOL.'/uAKbzpEL8xTcxYyP3lkOeh4FoxiSWqy5pGFALdPONoDuYFpLhjJSZaEwuvjI/Tr'.PHP_EOL.'rGhLV1pRG9frwDFshqD2Vaj4ENBCBh6UpeBop5+285zQ4SI7q4U9oSebUDJiuOx6'.PHP_EOL.'+tZ9KynmrbJpTSi0+BM='], + 'x5c' => [ + 'MIIC2jCCAkMCAg38MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'ODIyMDUyNzQxWhcNMTcwODIxMDUyNzQxWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0z9FeMynsC8+u' . PHP_EOL . 'dvX+LciZxnh5uRj4C9S6tNeeAlIGCfQYk0zUcNFCoCkTknNQd/YEiawDLNbxBqut' . PHP_EOL . 'bMDZ1aarys1a0lYmUeVLCIqvzBkPJTSQsCopQQ9V8WuT252zzNzs68dVGNdCJd5J' . PHP_EOL . 'NRQykpwexmnjPPv0mvj7i8XgG379TyW6P+WWV5okeUkXJ9eJS2ouDYdR2SM9BoVW' . PHP_EOL . '+FgxDu6BmXhozW5EfsnajFp7HL8kQClI0QOc79yuKl3492rH6bzFsFn2lfwWy9ic' . PHP_EOL . '7cP8EpCTeFp1tFaD+vxBhPZkeTQ1HKx6hQ5zeHIB5ySJJZ7af2W8r4eTGYzbdRW2' . PHP_EOL . '4DDHCPhZAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAQMv+BFvGdMVzkQaQ3/+2noVz' . PHP_EOL . '/uAKbzpEL8xTcxYyP3lkOeh4FoxiSWqy5pGFALdPONoDuYFpLhjJSZaEwuvjI/Tr' . PHP_EOL . 'rGhLV1pRG9frwDFshqD2Vaj4ENBCBh6UpeBop5+285zQ4SI7q4U9oSebUDJiuOx6' . PHP_EOL . '+tZ9KynmrbJpTSi0+BM=', + ], ], ], [ - __DIR__.'/RSA/PEM/4096b-rsa-example-cert.pem', + __DIR__ . '/RSA/PEM/4096b-rsa-example-cert.pem', [ 'kty' => 'RSA', 'n' => 'sL1iEzi3sk20tUP1GnKniCyCtelBy70spiJW24k-5qQ-EjMAd-N8aSJVzeuHwtGNcpU-iy3l-ErewHCaxiFdwDJiXLA7Dc4KOe-y6rTb5zpCx9BqI4rBRCkIkRF-oDoKvbVkqsGhDXHExLAF7legENUk_hterNNIjfdoY1_Vf1eurJ0cE7Cf6eFkaS0nQI-Nu9oYjNfaiIPc64fdntq0MuxP1EoVuIKTq4YNn-n3AgZvmlyIGvqsWki3IXA1Lz166SMU3fzlkNt0IbyBM5Bmz5QQPCezcPSgsmsW2DARW9YtJQY8Ci45nKIoYiOz1bYQDrvwe9Q9oSnBYyqX7-A9VGpv9FbpisIcLoWVTYy6tQUdRSkSdQoqCxuMAk69C1YLb71MoRa0vtz3VEdE-R5QEFjzMkAx4AqWzh1tMHNIW7jXjv5UvNi44nhjRcSpjARRfZbDds7AOkMN9l5G9vxBZbVwrabjsFc7XZODA652g18vczGbqhR6b-ZVk2w1cA3chEDXJWJWwBGw3rxEKP6wDmRZfeDLut6wIC4j3mTeCHUv-PKK-SmkGgjntA7gG-BljSEONnGEOU7BB1rfhSDgDEqX_YTT4w3rtbn3-NAzrbIshnl_TVYqirbbWh6b3e629s7GrG3ABlJfnzUCY-KiJj0gfU4amaj07pBHDPzbW3k', 'e' => 'AQAB', 'x5t' => 'IBO6381r3QWOObmNaxF36HBgO5M', 'x5t#256' => 'yVWIatQnBpbU9lUGZmRlGg2bldGtJPpqQXfq3LhBq3M', - 'x5c' => ['MIID2jCCA0MCAg39MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'ODIyMDUyODAwWhcNMTcwODIxMDUyODAwWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwvWITOLeyTbS1'.PHP_EOL.'Q/UacqeILIK16UHLvSymIlbbiT7mpD4SMwB343xpIlXN64fC0Y1ylT6LLeX4St7A'.PHP_EOL.'cJrGIV3AMmJcsDsNzgo577LqtNvnOkLH0GojisFEKQiREX6gOgq9tWSqwaENccTE'.PHP_EOL.'sAXuV6AQ1ST+G16s00iN92hjX9V/V66snRwTsJ/p4WRpLSdAj4272hiM19qIg9zr'.PHP_EOL.'h92e2rQy7E/UShW4gpOrhg2f6fcCBm+aXIga+qxaSLchcDUvPXrpIxTd/OWQ23Qh'.PHP_EOL.'vIEzkGbPlBA8J7Nw9KCyaxbYMBFb1i0lBjwKLjmcoihiI7PVthAOu/B71D2hKcFj'.PHP_EOL.'Kpfv4D1Uam/0VumKwhwuhZVNjLq1BR1FKRJ1CioLG4wCTr0LVgtvvUyhFrS+3PdU'.PHP_EOL.'R0T5HlAQWPMyQDHgCpbOHW0wc0hbuNeO/lS82LjieGNFxKmMBFF9lsN2zsA6Qw32'.PHP_EOL.'Xkb2/EFltXCtpuOwVztdk4MDrnaDXy9zMZuqFHpv5lWTbDVwDdyEQNclYlbAEbDe'.PHP_EOL.'vEQo/rAOZFl94Mu63rAgLiPeZN4IdS/48or5KaQaCOe0DuAb4GWNIQ42cYQ5TsEH'.PHP_EOL.'Wt+FIOAMSpf9hNPjDeu1uff40DOtsiyGeX9NViqKtttaHpvd7rb2zsasbcAGUl+f'.PHP_EOL.'NQJj4qImPSB9ThqZqPTukEcM/NtbeQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAIAi'.PHP_EOL.'gU3My8kYYniDuKEXSJmbVB+K1upHxWDA8R6KMZGXfbe5BRd8s40cY6JBYL52Tgqd'.PHP_EOL.'l8z5Ek8dC4NNpfpcZc/teT1WqiO2wnpGHjgMDuDL1mxCZNL422jHpiPWkWp3AuDI'.PHP_EOL.'c7tL1QjbfAUHAQYwmHkWgPP+T2wAv0pOt36GgMCM'], + 'x5c' => [ + 'MIID2jCCA0MCAg39MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'ODIyMDUyODAwWhcNMTcwODIxMDUyODAwWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwvWITOLeyTbS1' . PHP_EOL . 'Q/UacqeILIK16UHLvSymIlbbiT7mpD4SMwB343xpIlXN64fC0Y1ylT6LLeX4St7A' . PHP_EOL . 'cJrGIV3AMmJcsDsNzgo577LqtNvnOkLH0GojisFEKQiREX6gOgq9tWSqwaENccTE' . PHP_EOL . 'sAXuV6AQ1ST+G16s00iN92hjX9V/V66snRwTsJ/p4WRpLSdAj4272hiM19qIg9zr' . PHP_EOL . 'h92e2rQy7E/UShW4gpOrhg2f6fcCBm+aXIga+qxaSLchcDUvPXrpIxTd/OWQ23Qh' . PHP_EOL . 'vIEzkGbPlBA8J7Nw9KCyaxbYMBFb1i0lBjwKLjmcoihiI7PVthAOu/B71D2hKcFj' . PHP_EOL . 'Kpfv4D1Uam/0VumKwhwuhZVNjLq1BR1FKRJ1CioLG4wCTr0LVgtvvUyhFrS+3PdU' . PHP_EOL . 'R0T5HlAQWPMyQDHgCpbOHW0wc0hbuNeO/lS82LjieGNFxKmMBFF9lsN2zsA6Qw32' . PHP_EOL . 'Xkb2/EFltXCtpuOwVztdk4MDrnaDXy9zMZuqFHpv5lWTbDVwDdyEQNclYlbAEbDe' . PHP_EOL . 'vEQo/rAOZFl94Mu63rAgLiPeZN4IdS/48or5KaQaCOe0DuAb4GWNIQ42cYQ5TsEH' . PHP_EOL . 'Wt+FIOAMSpf9hNPjDeu1uff40DOtsiyGeX9NViqKtttaHpvd7rb2zsasbcAGUl+f' . PHP_EOL . 'NQJj4qImPSB9ThqZqPTukEcM/NtbeQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAIAi' . PHP_EOL . 'gU3My8kYYniDuKEXSJmbVB+K1upHxWDA8R6KMZGXfbe5BRd8s40cY6JBYL52Tgqd' . PHP_EOL . 'l8z5Ek8dC4NNpfpcZc/teT1WqiO2wnpGHjgMDuDL1mxCZNL422jHpiPWkWp3AuDI' . PHP_EOL . 'c7tL1QjbfAUHAQYwmHkWgPP+T2wAv0pOt36GgMCM', + ], ], ], [ - __DIR__.'/RSA/PEM/8192b-rsa-example-cert.pem', + __DIR__ . '/RSA/PEM/8192b-rsa-example-cert.pem', [ 'kty' => 'RSA', 'n' => 'q5lcEwG8rUflI1aL6omAaF5R1DFkCMllFaQ3HUwlwCWYNNyKxF1G2e-P3Y6SFWyp0sFfmDcvuebOY_Dw3KlC756bQUMEXH6TaubYDcXaKDyrdKgCSoufjhwHkNpRz3VxpkLADJQIHdijes2JN3daGARxSJLcjoSaZvq_LBCIHTTDGESBXJP6RtbjAjGjuLUgmcvkl029Xl8ylkrcibjTzXmOod3vioTnX5aZNT1c7evmskvixWG1NlHOhZ1HdXiPHLjKxnr4lHl9lxtTjkNSsF-Nz0bYHCpWZ9u98nkgvFAxNUmiwX5nHIqo39AK8YVuVmDGYzY-dPtD1UtCBXgj-Ryq1cPU66H7kEfvbn1kZRF0XcxqIUVDlpa_h4Aq7r8KnQ6nVF59oM8AwsrRu3llvlRzNCaRUhafZ6YUHR19j_6GpAJtOWwwV5m2qKs9EhfL9Kvz9DqWh3DBt0CuGIDS0NuBAt2_RmNQBP1u7L8pYZ_9kV-Y7YM9ocbuYpUbTy4vio33Pl2wG8iozgPIgOcbne4Vh4TGpe0hbXaL-a_84CVOWX4JyLxyBEWGB6PLfH74NyXyvh57X6Cn3P0Xr2rSgPEgEEovw5i9qDeqqzeO-GvUouhQjZgURP5USjd120IPjVoZP8RPRCAPUBQSUmi2dyHANRI3ydIhTKOEdZCVvIlVNu33wfN55kEeLCXBiDvfvozUbCGuuOkbs5Yz7vE8K9xlU_Xo2icptY_u3XMPW6YKRP6lvGtovn9295vENHOJDFCVkcJ819vHVqJnoiGAf_QX0J74NLm6fnWboH6-5BcIDl18uB3qEFAlneRflIrC2XBZju-dTuTaHy14WvVJNjTMUBgVQ4gaS1X2wmAztwv-Rk8o6k-KJuSZDWVEZyH3NaddkYSVONOMzIuuClbg4cEgLP2cxxqz8JdnyT2NNfMdGfxP4Nd_RvPtTD9kTVewlurzYVjoi8CC6VhV2Tgcp-UvT6Z0Yne-65dXi31VRqQWG8adWQ3gc9NP1oXfJqVt26ldXF9AVf7PcFcm7xzr2mwZKY-DMk1m1hBvUGeg7Iab34OABOY6J4AxXiXqKx3JV24SFydaSSevsulSrmUJU3g8TR-WwTh06Yp8DZplCU9MEvfyUSShtHED72anVRgVe8jw47k9TavJ-hPiAq0HUmmKGUeKvrqWN4bMpSiMCmHTkcqS_d4Dn4ZAI8W0DIluc9sXBaiUUSIt6t7gGNOZGUyZ-ZN4GNxVlMazB6CieGRhoPfRmXw7wq0k2R5BU1Q8PSj8jrZ88DgdfENnWCGy6Aq450OwfufGaHZDwAUD1kUoRGBkzIxvkWLVdQtmP4iZXOLSany0RtPZLGjSH-x0vQ', 'e' => 'AQAB', 'x5t' => 'YV6dSQ9sNS7rhNWcj-M4XuMmOE4', 'x5t#256' => 'ZNEUscWwJu03bRinDYd0BAuwiWGG3oDocehVMwX2oVo', - 'x5c' => ['MIIF2jCCBUMCAg3+MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'OTI3MDYwNzQ5WhcNMTcwOTI2MDYwNzQ5WjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wggQiMA0GCSqGSIb3DQEBAQUAA4IEDwAwggQKAoIEAQCrmVwTAbytR+Uj'.PHP_EOL.'VovqiYBoXlHUMWQIyWUVpDcdTCXAJZg03IrEXUbZ74/djpIVbKnSwV+YNy+55s5j'.PHP_EOL.'8PDcqULvnptBQwRcfpNq5tgNxdooPKt0qAJKi5+OHAeQ2lHPdXGmQsAMlAgd2KN6'.PHP_EOL.'zYk3d1oYBHFIktyOhJpm+r8sEIgdNMMYRIFck/pG1uMCMaO4tSCZy+SXTb1eXzKW'.PHP_EOL.'StyJuNPNeY6h3e+KhOdflpk1PVzt6+ayS+LFYbU2Uc6FnUd1eI8cuMrGeviUeX2X'.PHP_EOL.'G1OOQ1KwX43PRtgcKlZn273yeSC8UDE1SaLBfmcciqjf0ArxhW5WYMZjNj50+0PV'.PHP_EOL.'S0IFeCP5HKrVw9TrofuQR+9ufWRlEXRdzGohRUOWlr+HgCruvwqdDqdUXn2gzwDC'.PHP_EOL.'ytG7eWW+VHM0JpFSFp9nphQdHX2P/oakAm05bDBXmbaoqz0SF8v0q/P0OpaHcMG3'.PHP_EOL.'QK4YgNLQ24EC3b9GY1AE/W7svylhn/2RX5jtgz2hxu5ilRtPLi+Kjfc+XbAbyKjO'.PHP_EOL.'A8iA5xud7hWHhMal7SFtdov5r/zgJU5ZfgnIvHIERYYHo8t8fvg3JfK+HntfoKfc'.PHP_EOL.'/RevatKA8SAQSi/DmL2oN6qrN474a9Si6FCNmBRE/lRKN3XbQg+NWhk/xE9EIA9Q'.PHP_EOL.'FBJSaLZ3IcA1EjfJ0iFMo4R1kJW8iVU27ffB83nmQR4sJcGIO9++jNRsIa646Ruz'.PHP_EOL.'ljPu8Twr3GVT9ejaJym1j+7dcw9bpgpE/qW8a2i+f3b3m8Q0c4kMUJWRwnzX28dW'.PHP_EOL.'omeiIYB/9BfQnvg0ubp+dZugfr7kFwgOXXy4HeoQUCWd5F+UisLZcFmO751O5Nof'.PHP_EOL.'LXha9Uk2NMxQGBVDiBpLVfbCYDO3C/5GTyjqT4om5JkNZURnIfc1p12RhJU404zM'.PHP_EOL.'i64KVuDhwSAs/ZzHGrPwl2fJPY018x0Z/E/g139G8+1MP2RNV7CW6vNhWOiLwILp'.PHP_EOL.'WFXZOByn5S9PpnRid77rl1eLfVVGpBYbxp1ZDeBz00/Whd8mpW3bqV1cX0BV/s9w'.PHP_EOL.'VybvHOvabBkpj4MyTWbWEG9QZ6Dshpvfg4AE5jongDFeJeorHclXbhIXJ1pJJ6+y'.PHP_EOL.'6VKuZQlTeDxNH5bBOHTpinwNmmUJT0wS9/JRJKG0cQPvZqdVGBV7yPDjuT1Nq8n6'.PHP_EOL.'E+ICrQdSaYoZR4q+upY3hsylKIwKYdORypL93gOfhkAjxbQMiW5z2xcFqJRRIi3q'.PHP_EOL.'3uAY05kZTJn5k3gY3FWUxrMHoKJ4ZGGg99GZfDvCrSTZHkFTVDw9KPyOtnzwOB18'.PHP_EOL.'Q2dYIbLoCrjnQ7B+58ZodkPABQPWRShEYGTMjG+RYtV1C2Y/iJlc4tJqfLRG09ks'.PHP_EOL.'aNIf7HS9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAiXbxR0T+C6MT7Jh/SbDJ/1Gd'.PHP_EOL.'vbqskiKmmKnzOcX1x0uUHY4zHIhx3M0neYRr//XOh+FeSwM1JqAPztHy3SMRXzfP'.PHP_EOL.'xzm/nwbRwdK8C/fPy7H+uMV1mKumem8WSoOMOoxFJ+o2nJgyViwnEOu9EejlH1sc'.PHP_EOL.'uKPIoTCLUCInRRhrI84='], + 'x5c' => [ + 'MIIF2jCCBUMCAg3+MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'OTI3MDYwNzQ5WhcNMTcwOTI2MDYwNzQ5WjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wggQiMA0GCSqGSIb3DQEBAQUAA4IEDwAwggQKAoIEAQCrmVwTAbytR+Uj' . PHP_EOL . 'VovqiYBoXlHUMWQIyWUVpDcdTCXAJZg03IrEXUbZ74/djpIVbKnSwV+YNy+55s5j' . PHP_EOL . '8PDcqULvnptBQwRcfpNq5tgNxdooPKt0qAJKi5+OHAeQ2lHPdXGmQsAMlAgd2KN6' . PHP_EOL . 'zYk3d1oYBHFIktyOhJpm+r8sEIgdNMMYRIFck/pG1uMCMaO4tSCZy+SXTb1eXzKW' . PHP_EOL . 'StyJuNPNeY6h3e+KhOdflpk1PVzt6+ayS+LFYbU2Uc6FnUd1eI8cuMrGeviUeX2X' . PHP_EOL . 'G1OOQ1KwX43PRtgcKlZn273yeSC8UDE1SaLBfmcciqjf0ArxhW5WYMZjNj50+0PV' . PHP_EOL . 'S0IFeCP5HKrVw9TrofuQR+9ufWRlEXRdzGohRUOWlr+HgCruvwqdDqdUXn2gzwDC' . PHP_EOL . 'ytG7eWW+VHM0JpFSFp9nphQdHX2P/oakAm05bDBXmbaoqz0SF8v0q/P0OpaHcMG3' . PHP_EOL . 'QK4YgNLQ24EC3b9GY1AE/W7svylhn/2RX5jtgz2hxu5ilRtPLi+Kjfc+XbAbyKjO' . PHP_EOL . 'A8iA5xud7hWHhMal7SFtdov5r/zgJU5ZfgnIvHIERYYHo8t8fvg3JfK+HntfoKfc' . PHP_EOL . '/RevatKA8SAQSi/DmL2oN6qrN474a9Si6FCNmBRE/lRKN3XbQg+NWhk/xE9EIA9Q' . PHP_EOL . 'FBJSaLZ3IcA1EjfJ0iFMo4R1kJW8iVU27ffB83nmQR4sJcGIO9++jNRsIa646Ruz' . PHP_EOL . 'ljPu8Twr3GVT9ejaJym1j+7dcw9bpgpE/qW8a2i+f3b3m8Q0c4kMUJWRwnzX28dW' . PHP_EOL . 'omeiIYB/9BfQnvg0ubp+dZugfr7kFwgOXXy4HeoQUCWd5F+UisLZcFmO751O5Nof' . PHP_EOL . 'LXha9Uk2NMxQGBVDiBpLVfbCYDO3C/5GTyjqT4om5JkNZURnIfc1p12RhJU404zM' . PHP_EOL . 'i64KVuDhwSAs/ZzHGrPwl2fJPY018x0Z/E/g139G8+1MP2RNV7CW6vNhWOiLwILp' . PHP_EOL . 'WFXZOByn5S9PpnRid77rl1eLfVVGpBYbxp1ZDeBz00/Whd8mpW3bqV1cX0BV/s9w' . PHP_EOL . 'VybvHOvabBkpj4MyTWbWEG9QZ6Dshpvfg4AE5jongDFeJeorHclXbhIXJ1pJJ6+y' . PHP_EOL . '6VKuZQlTeDxNH5bBOHTpinwNmmUJT0wS9/JRJKG0cQPvZqdVGBV7yPDjuT1Nq8n6' . PHP_EOL . 'E+ICrQdSaYoZR4q+upY3hsylKIwKYdORypL93gOfhkAjxbQMiW5z2xcFqJRRIi3q' . PHP_EOL . '3uAY05kZTJn5k3gY3FWUxrMHoKJ4ZGGg99GZfDvCrSTZHkFTVDw9KPyOtnzwOB18' . PHP_EOL . 'Q2dYIbLoCrjnQ7B+58ZodkPABQPWRShEYGTMjG+RYtV1C2Y/iJlc4tJqfLRG09ks' . PHP_EOL . 'aNIf7HS9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAiXbxR0T+C6MT7Jh/SbDJ/1Gd' . PHP_EOL . 'vbqskiKmmKnzOcX1x0uUHY4zHIhx3M0neYRr//XOh+FeSwM1JqAPztHy3SMRXzfP' . PHP_EOL . 'xzm/nwbRwdK8C/fPy7H+uMV1mKumem8WSoOMOoxFJ+o2nJgyViwnEOu9EejlH1sc' . PHP_EOL . 'uKPIoTCLUCInRRhrI84=', + ], ], ], [ - __DIR__.'/RSA/PEM/16k-rsa-example-cert.pem', + __DIR__ . '/RSA/PEM/16k-rsa-example-cert.pem', [ 'kty' => 'RSA', 'n' => 'tS3aeWW_wzlyXsDNFeBONFNq7W4lNWDjOUseNxx-R9AsqNJEWZFzaTtBI4Cam9Wf_2AlfP6i3RRpK76ooZObKwJmm1ReGcP7gf7JnODQv0W-m9x85a_fwHiI86Dhfy1YNh2zg1DO1kL_Q-sqKMOZ4g6uUfXGXjS5968sKCua3o-GEr-7GM6uw8zgpDmURtpupAFj3X1qCg6cjblPzMzcXdjACP4_zJpLc-sWpqY7pdLa26J5dgFGpTKWS7Xs96AlCPDz4uTRRFKDZarMFtzpjhWhNZyDGuYFFxNL4ca1tm-r4JyL-XuK9BTXC1WNXpqutzHNOj-tO9nCtRX02ZS3hmm1A9xndTZpfQ7lPuSA_kZEohkjcGyxtS-nup9khyMKGwvhg0MJS43VOuYSV6msk_z4dZ3-MCXVlJMTxLqWOSGHxHG0vDJQI5_IXCwkQLrVQIbt_X1ZylUdkmnKm4VuCBt4AHqK1F1jWpNXLYcFY-QW43c2Iln7v1uQFm_82CFHTanrNMBYNax2egYpSXpPS0naF6O1Y8bMPjPBU1jaoBAlfiSjCmHx5MOTg-PU9m1OnnR4XnOdDR0W8rUSS_iYz4Ucivou_7_XCTVlfuieAXT069ibXpGkTE58AgI6piVVYtaxyoADb3zr0a11Br0kS3gKRqxTq5GtgWTpz75VrFxXk8ATfwZF4PcOVX9fkUQStBKY9OGRryswLJbQ0lnz5ZR8QAAw1D2cAoWYoxUol5upjsrYrsGc7Ol3NhPPtoE0Vnxg49xQSZ0hhjhryId07aZ3QBr3NQ0XBoGhSNvO-M7ZyzDTNSUQusS5WyZsZputw_12E5y55_bbMPpKYbnx0aG93wmcna49jXoo5ZUMoJ_BQLaavGC0u-JTLT_subk5tKh3oVgDRevHwYeK1U4L4cdzpOzG8JVpcHyclofESk25DnHiQ92BfB1DR-6YadfQ8a4BXrIFlktDho1EmhXwWdT-dhO4ERPwf2Cx04iP3OdYCU_TNr3gVdB3fQLPkhV1K_od8zWrX7oqCGLkYCP_GUvl84dJoMequlyIO9IHtVpVHzGl-E48JoOHN00ULnoHzWzxUeGtda4twn9NQ-ptEjy9u0_8R-y2UqnC632wEmHpHzFqrOSYixp4GO_zAh-gmIhPJHuoH97vdcDRjGGFPO7kmMI0tBmxkt03ahYIqJKbPynHVLhsTuU7TVYrgTX6JkCR_IbudQTqVdz8oYO6tNqVrU89JI94_5ndJX1Wjmf1LPa8c31IQovBB0e-MlZ-rBkyTEttNuI8xC__OycsLhjAFx_bm0Qf2jfg2IJdLmDjGFHv3RlEdlRmJSyLY_lqKV4GAhjiEIEmduAKbygg2Jqhb6NKzHr1vxhRcWasnuhgTOunlGs3vezu9xz_4CvEKRMT6viU3tzqmGpT3zE7d0w9zMwn2eUlX0j7pKIiznrbkW2Dfe63f9X9bKYAsO5pcqcfAHqVaHl0iFXy5QoFwwjSuWwxKyhaY3tfY2rufLXCOzQ_G7BDoMRns8x6nCR-64Xuvp-EvBw0S790J_u9Z2W98rrW6c1cfn4cb9BRy3Rj64kWqlAUTRu6-qrX2RN5ywhoKfiJDH3m2q_MtgDlR3ke-5KuxaZwfM0hrcCppU5THbOwMe3XoDX-ZjD-3q-ikM8ueu4uTqDjtQrTQioFIxa-3prbNTsxBERQFZwlJtz2GmNHEAjgU-OwkMDObYAGc-ZAZritXe9vGtGFpdowMZ5k0FTUKSIsecPxn-nZlG-_qML8S63NXlU0RdbtYaLwQteFuXl_acAvuxOOnB3nZppJyIStP0uOPGhRowXSlThn0yFDht65TLly171JVrf4oFBDO4Q6EIJ7JMbRXCaEWJmeSNe_k71c3u4elbZ-C2i5JaO6bctZzO-xZ-CP7raQzHXMlpChYXqmpDU5bK2ySAbcDJDvg5WeRmQsqRxsFnI1EK1Jj_BKHZqOPz_q2SYyv69zPTsp5_w9z9YWCbOKP1KHyf9i9n6P5G3QkCzvlTDAbjR6nrrrnva0PZ0SjO4MzDOsIAa9S6vwRnWyE23vVI5RCv-IkLZ075LRkXKcj2EVPrDI3Mb1pUtfGu1H1M7m6V0SOTnaCwimIz3Ju2mwgnR-2lAAJKMd3vUaN1NfbEDuhZoMZfDrWzqOqA8Z2oyv6jHhby3DknbW4pn8tcaPCvScn1wotOeNFDvAfOIxikGEjUuXj-_gV2_dcFVIANseYpdhAS1tJjVX9JBwWcjbHnShy_9Y4f1zzrSwv4UbG7xDEGS1VaDUk5UwTTeeKQKzCkd6nYXxZYRMYDD_DcuGiCG9YvWm9hry1DkfdyCx5Pe8j8KMGUuEtIwLOIfmJDiCmE9fRAY85f9TAXyxkM-P1S_TcScKeSYrxLubX1DTuOGNDFKB4xNf0vi-lCFgLmx8tOr-RY7qtzrwrfcf7Kbpop-B5KpA2PhmoRTtZl4kF7RDeh-ZnUqcfyQcCIv_HewiMOmJ6iQDDjOWbsM8uEhl3ab-FzDYGAeT5bJs4EJAwEhsk28sXqnGzwJDUxw4mdLCYhiuI0ZwGOBUIzXQ-KHaH88PwYuQGLwM-s9uCKqJyO84I6XPe6bnqsL9NWmPhpvFxEZ7MvFCC2Z7nuGswQKpL92_QOS0NibZwzxBDUY7Qm3WsHxFzYm73JenQJGKzZPPLtjhIar7af2qb8KINgWGfIvrxR38osLT0Vg29M0DuMc', 'e' => 'AQAB', 'x5t' => 'XC_s0q4lqNalTFU6tNWR_Szk5dk', 'x5t#256' => '3nz2wIAoSbfVCmvy9k18bCPyIXacd3YfHrGq-qg3DVY', - 'x5c' => ['MIIJ2jCCCUMCAg3/MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'ODIyMDUyOTAyWhcNMTcwODIxMDUyOTAyWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wgggiMA0GCSqGSIb3DQEBAQUAA4IIDwAwgggKAoIIAQC1Ldp5Zb/DOXJe'.PHP_EOL.'wM0V4E40U2rtbiU1YOM5Sx43HH5H0Cyo0kRZkXNpO0EjgJqb1Z//YCV8/qLdFGkr'.PHP_EOL.'vqihk5srAmabVF4Zw/uB/smc4NC/Rb6b3Hzlr9/AeIjzoOF/LVg2HbODUM7WQv9D'.PHP_EOL.'6yoow5niDq5R9cZeNLn3rywoK5rej4YSv7sYzq7DzOCkOZRG2m6kAWPdfWoKDpyN'.PHP_EOL.'uU/MzNxd2MAI/j/Mmktz6xampjul0trbonl2AUalMpZLtez3oCUI8PPi5NFEUoNl'.PHP_EOL.'qswW3OmOFaE1nIMa5gUXE0vhxrW2b6vgnIv5e4r0FNcLVY1emq63Mc06P6072cK1'.PHP_EOL.'FfTZlLeGabUD3Gd1Nml9DuU+5ID+RkSiGSNwbLG1L6e6n2SHIwobC+GDQwlLjdU6'.PHP_EOL.'5hJXqayT/Ph1nf4wJdWUkxPEupY5IYfEcbS8MlAjn8hcLCRAutVAhu39fVnKVR2S'.PHP_EOL.'acqbhW4IG3gAeorUXWNak1cthwVj5BbjdzYiWfu/W5AWb/zYIUdNqes0wFg1rHZ6'.PHP_EOL.'BilJek9LSdoXo7Vjxsw+M8FTWNqgECV+JKMKYfHkw5OD49T2bU6edHhec50NHRby'.PHP_EOL.'tRJL+JjPhRyK+i7/v9cJNWV+6J4BdPTr2JtekaRMTnwCAjqmJVVi1rHKgANvfOvR'.PHP_EOL.'rXUGvSRLeApGrFOrka2BZOnPvlWsXFeTwBN/BkXg9w5Vf1+RRBK0Epj04ZGvKzAs'.PHP_EOL.'ltDSWfPllHxAADDUPZwChZijFSiXm6mOytiuwZzs6Xc2E8+2gTRWfGDj3FBJnSGG'.PHP_EOL.'OGvIh3TtpndAGvc1DRcGgaFI2874ztnLMNM1JRC6xLlbJmxmm63D/XYTnLnn9tsw'.PHP_EOL.'+kphufHRob3fCZydrj2NeijllQygn8FAtpq8YLS74lMtP+y5uTm0qHehWANF68fB'.PHP_EOL.'h4rVTgvhx3Ok7MbwlWlwfJyWh8RKTbkOceJD3YF8HUNH7php19DxrgFesgWWS0OG'.PHP_EOL.'jUSaFfBZ1P52E7gRE/B/YLHTiI/c51gJT9M2veBV0Hd9As+SFXUr+h3zNatfuioI'.PHP_EOL.'YuRgI/8ZS+Xzh0mgx6q6XIg70ge1WlUfMaX4Tjwmg4c3TRQuegfNbPFR4a11ri3C'.PHP_EOL.'f01D6m0SPL27T/xH7LZSqcLrfbASYekfMWqs5JiLGngY7/MCH6CYiE8ke6gf3u91'.PHP_EOL.'wNGMYYU87uSYwjS0GbGS3TdqFgiokps/KcdUuGxO5TtNViuBNfomQJH8hu51BOpV'.PHP_EOL.'3Pyhg7q02pWtTz0kj3j/md0lfVaOZ/Us9rxzfUhCi8EHR74yVn6sGTJMS2024jzE'.PHP_EOL.'L/87JywuGMAXH9ubRB/aN+DYgl0uYOMYUe/dGUR2VGYlLItj+WopXgYCGOIQgSZ2'.PHP_EOL.'4ApvKCDYmqFvo0rMevW/GFFxZqye6GBM66eUaze97O73HP/gK8QpExPq+JTe3OqY'.PHP_EOL.'alPfMTt3TD3MzCfZ5SVfSPukoiLOetuRbYN97rd/1f1spgCw7mlypx8AepVoeXSI'.PHP_EOL.'VfLlCgXDCNK5bDErKFpje19jau58tcI7ND8bsEOgxGezzHqcJH7rhe6+n4S8HDRL'.PHP_EOL.'v3Qn+71nZb3yutbpzVx+fhxv0FHLdGPriRaqUBRNG7r6qtfZE3nLCGgp+IkMfeba'.PHP_EOL.'r8y2AOVHeR77kq7FpnB8zSGtwKmlTlMds7Ax7degNf5mMP7er6KQzy567i5OoOO1'.PHP_EOL.'CtNCKgUjFr7emts1OzEERFAVnCUm3PYaY0cQCOBT47CQwM5tgAZz5kBmuK1d728a'.PHP_EOL.'0YWl2jAxnmTQVNQpIix5w/Gf6dmUb7+owvxLrc1eVTRF1u1hovBC14W5eX9pwC+7'.PHP_EOL.'E46cHedmmknIhK0/S448aFGjBdKVOGfTIUOG3rlMuXLXvUlWt/igUEM7hDoQgnsk'.PHP_EOL.'xtFcJoRYmZ5I17+TvVze7h6Vtn4LaLklo7pty1nM77Fn4I/utpDMdcyWkKFheqak'.PHP_EOL.'NTlsrbJIBtwMkO+DlZ5GZCypHGwWcjUQrUmP8Eodmo4/P+rZJjK/r3M9Oynn/D3P'.PHP_EOL.'1hYJs4o/UofJ/2L2fo/kbdCQLO+VMMBuNHqeuuue9rQ9nRKM7gzMM6wgBr1Lq/BG'.PHP_EOL.'dbITbe9UjlEK/4iQtnTvktGRcpyPYRU+sMjcxvWlS18a7UfUzubpXRI5OdoLCKYj'.PHP_EOL.'Pcm7abCCdH7aUAAkox3e9Ro3U19sQO6Fmgxl8OtbOo6oDxnajK/qMeFvLcOSdtbi'.PHP_EOL.'mfy1xo8K9JyfXCi0540UO8B84jGKQYSNS5eP7+BXb91wVUgA2x5il2EBLW0mNVf0'.PHP_EOL.'kHBZyNsedKHL/1jh/XPOtLC/hRsbvEMQZLVVoNSTlTBNN54pArMKR3qdhfFlhExg'.PHP_EOL.'MP8Ny4aIIb1i9ab2GvLUOR93ILHk97yPwowZS4S0jAs4h+YkOIKYT19EBjzl/1MB'.PHP_EOL.'fLGQz4/VL9NxJwp5JivEu5tfUNO44Y0MUoHjE1/S+L6UIWAubHy06v5Fjuq3OvCt'.PHP_EOL.'9x/spumin4HkqkDY+GahFO1mXiQXtEN6H5mdSpx/JBwIi/8d7CIw6YnqJAMOM5Zu'.PHP_EOL.'wzy4SGXdpv4XMNgYB5PlsmzgQkDASGyTbyxeqcbPAkNTHDiZ0sJiGK4jRnAY4FQj'.PHP_EOL.'NdD4odofzw/Bi5AYvAz6z24IqonI7zgjpc97pueqwv01aY+Gm8XERnsy8UILZnue'.PHP_EOL.'4azBAqkv3b9A5LQ2JtnDPEENRjtCbdawfEXNibvcl6dAkYrNk88u2OEhqvtp/apv'.PHP_EOL.'wog2BYZ8i+vFHfyiwtPRWDb0zQO4xwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADg3'.PHP_EOL.'1Ah8wT/xjIhtUTAIcFGtgN2321aV8pIz8VSJu3CrbJJD09Ek6WUQgTbEq0pxwhQo'.PHP_EOL.'ubkr2+CJ2Gw/FTd0WFet7T57aFg7qh5xraEhH21icHmNBUG7ETUXNEf8TjbhREVY'.PHP_EOL.'gF6l8RI6rrGv0zm5awmcj+4+2OXQ+OM88dV7chMn'], + 'x5c' => [ + 'MIIJ2jCCCUMCAg3/MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'ODIyMDUyOTAyWhcNMTcwODIxMDUyOTAyWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wgggiMA0GCSqGSIb3DQEBAQUAA4IIDwAwgggKAoIIAQC1Ldp5Zb/DOXJe' . PHP_EOL . 'wM0V4E40U2rtbiU1YOM5Sx43HH5H0Cyo0kRZkXNpO0EjgJqb1Z//YCV8/qLdFGkr' . PHP_EOL . 'vqihk5srAmabVF4Zw/uB/smc4NC/Rb6b3Hzlr9/AeIjzoOF/LVg2HbODUM7WQv9D' . PHP_EOL . '6yoow5niDq5R9cZeNLn3rywoK5rej4YSv7sYzq7DzOCkOZRG2m6kAWPdfWoKDpyN' . PHP_EOL . 'uU/MzNxd2MAI/j/Mmktz6xampjul0trbonl2AUalMpZLtez3oCUI8PPi5NFEUoNl' . PHP_EOL . 'qswW3OmOFaE1nIMa5gUXE0vhxrW2b6vgnIv5e4r0FNcLVY1emq63Mc06P6072cK1' . PHP_EOL . 'FfTZlLeGabUD3Gd1Nml9DuU+5ID+RkSiGSNwbLG1L6e6n2SHIwobC+GDQwlLjdU6' . PHP_EOL . '5hJXqayT/Ph1nf4wJdWUkxPEupY5IYfEcbS8MlAjn8hcLCRAutVAhu39fVnKVR2S' . PHP_EOL . 'acqbhW4IG3gAeorUXWNak1cthwVj5BbjdzYiWfu/W5AWb/zYIUdNqes0wFg1rHZ6' . PHP_EOL . 'BilJek9LSdoXo7Vjxsw+M8FTWNqgECV+JKMKYfHkw5OD49T2bU6edHhec50NHRby' . PHP_EOL . 'tRJL+JjPhRyK+i7/v9cJNWV+6J4BdPTr2JtekaRMTnwCAjqmJVVi1rHKgANvfOvR' . PHP_EOL . 'rXUGvSRLeApGrFOrka2BZOnPvlWsXFeTwBN/BkXg9w5Vf1+RRBK0Epj04ZGvKzAs' . PHP_EOL . 'ltDSWfPllHxAADDUPZwChZijFSiXm6mOytiuwZzs6Xc2E8+2gTRWfGDj3FBJnSGG' . PHP_EOL . 'OGvIh3TtpndAGvc1DRcGgaFI2874ztnLMNM1JRC6xLlbJmxmm63D/XYTnLnn9tsw' . PHP_EOL . '+kphufHRob3fCZydrj2NeijllQygn8FAtpq8YLS74lMtP+y5uTm0qHehWANF68fB' . PHP_EOL . 'h4rVTgvhx3Ok7MbwlWlwfJyWh8RKTbkOceJD3YF8HUNH7php19DxrgFesgWWS0OG' . PHP_EOL . 'jUSaFfBZ1P52E7gRE/B/YLHTiI/c51gJT9M2veBV0Hd9As+SFXUr+h3zNatfuioI' . PHP_EOL . 'YuRgI/8ZS+Xzh0mgx6q6XIg70ge1WlUfMaX4Tjwmg4c3TRQuegfNbPFR4a11ri3C' . PHP_EOL . 'f01D6m0SPL27T/xH7LZSqcLrfbASYekfMWqs5JiLGngY7/MCH6CYiE8ke6gf3u91' . PHP_EOL . 'wNGMYYU87uSYwjS0GbGS3TdqFgiokps/KcdUuGxO5TtNViuBNfomQJH8hu51BOpV' . PHP_EOL . '3Pyhg7q02pWtTz0kj3j/md0lfVaOZ/Us9rxzfUhCi8EHR74yVn6sGTJMS2024jzE' . PHP_EOL . 'L/87JywuGMAXH9ubRB/aN+DYgl0uYOMYUe/dGUR2VGYlLItj+WopXgYCGOIQgSZ2' . PHP_EOL . '4ApvKCDYmqFvo0rMevW/GFFxZqye6GBM66eUaze97O73HP/gK8QpExPq+JTe3OqY' . PHP_EOL . 'alPfMTt3TD3MzCfZ5SVfSPukoiLOetuRbYN97rd/1f1spgCw7mlypx8AepVoeXSI' . PHP_EOL . 'VfLlCgXDCNK5bDErKFpje19jau58tcI7ND8bsEOgxGezzHqcJH7rhe6+n4S8HDRL' . PHP_EOL . 'v3Qn+71nZb3yutbpzVx+fhxv0FHLdGPriRaqUBRNG7r6qtfZE3nLCGgp+IkMfeba' . PHP_EOL . 'r8y2AOVHeR77kq7FpnB8zSGtwKmlTlMds7Ax7degNf5mMP7er6KQzy567i5OoOO1' . PHP_EOL . 'CtNCKgUjFr7emts1OzEERFAVnCUm3PYaY0cQCOBT47CQwM5tgAZz5kBmuK1d728a' . PHP_EOL . '0YWl2jAxnmTQVNQpIix5w/Gf6dmUb7+owvxLrc1eVTRF1u1hovBC14W5eX9pwC+7' . PHP_EOL . 'E46cHedmmknIhK0/S448aFGjBdKVOGfTIUOG3rlMuXLXvUlWt/igUEM7hDoQgnsk' . PHP_EOL . 'xtFcJoRYmZ5I17+TvVze7h6Vtn4LaLklo7pty1nM77Fn4I/utpDMdcyWkKFheqak' . PHP_EOL . 'NTlsrbJIBtwMkO+DlZ5GZCypHGwWcjUQrUmP8Eodmo4/P+rZJjK/r3M9Oynn/D3P' . PHP_EOL . '1hYJs4o/UofJ/2L2fo/kbdCQLO+VMMBuNHqeuuue9rQ9nRKM7gzMM6wgBr1Lq/BG' . PHP_EOL . 'dbITbe9UjlEK/4iQtnTvktGRcpyPYRU+sMjcxvWlS18a7UfUzubpXRI5OdoLCKYj' . PHP_EOL . 'Pcm7abCCdH7aUAAkox3e9Ro3U19sQO6Fmgxl8OtbOo6oDxnajK/qMeFvLcOSdtbi' . PHP_EOL . 'mfy1xo8K9JyfXCi0540UO8B84jGKQYSNS5eP7+BXb91wVUgA2x5il2EBLW0mNVf0' . PHP_EOL . 'kHBZyNsedKHL/1jh/XPOtLC/hRsbvEMQZLVVoNSTlTBNN54pArMKR3qdhfFlhExg' . PHP_EOL . 'MP8Ny4aIIb1i9ab2GvLUOR93ILHk97yPwowZS4S0jAs4h+YkOIKYT19EBjzl/1MB' . PHP_EOL . 'fLGQz4/VL9NxJwp5JivEu5tfUNO44Y0MUoHjE1/S+L6UIWAubHy06v5Fjuq3OvCt' . PHP_EOL . '9x/spumin4HkqkDY+GahFO1mXiQXtEN6H5mdSpx/JBwIi/8d7CIw6YnqJAMOM5Zu' . PHP_EOL . 'wzy4SGXdpv4XMNgYB5PlsmzgQkDASGyTbyxeqcbPAkNTHDiZ0sJiGK4jRnAY4FQj' . PHP_EOL . 'NdD4odofzw/Bi5AYvAz6z24IqonI7zgjpc97pueqwv01aY+Gm8XERnsy8UILZnue' . PHP_EOL . '4azBAqkv3b9A5LQ2JtnDPEENRjtCbdawfEXNibvcl6dAkYrNk88u2OEhqvtp/apv' . PHP_EOL . 'wog2BYZ8i+vFHfyiwtPRWDb0zQO4xwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADg3' . PHP_EOL . '1Ah8wT/xjIhtUTAIcFGtgN2321aV8pIz8VSJu3CrbJJD09Ek6WUQgTbEq0pxwhQo' . PHP_EOL . 'ubkr2+CJ2Gw/FTd0WFet7T57aFg7qh5xraEhH21icHmNBUG7ETUXNEf8TjbhREVY' . PHP_EOL . 'gF6l8RI6rrGv0zm5awmcj+4+2OXQ+OM88dV7chMn', + ], ], ], [ - __DIR__.'/RSA/PEM/32k-rsa-example-cert.pem', + __DIR__ . '/RSA/PEM/32k-rsa-example-cert.pem', [ 'kty' => 'RSA', 'n' => 'qzPFsFIf3cSes25DloV3y3d8gKMcZVE_EQ_6e_MZnyqDbuOEP39yQs3aunzbZRoO8Xw8lLoJNduiKKsco7odI753kBvz1eLyke-sWBVZttbnYyz9AE3ZXfAb9rHW2AxgIqHNsQOsLJS_douGZwxawNdE90WM4QG80bDpkxxHfObtmZIbZoOFSeokDHA5jokQGzJ65t6ARtQOIht84pIlAr8RO0vCUiJ0R4TdAffbdIukMcVfSoZBlZJ_q-yBtPoqB1Nmr1x1FqCtR81NrEtdp7CUHy4yLIskMzHTwJL24dx8zPS9RBIAuR6HO6soQwQgKY5NYmyaZGuWDrzw0Lor9_jjcx3x7NlXEUffGyUdT_bZ6owsgd-SpvnbqXPXIf-u5JH7afSUuajytHnGVilQOpEg06B0F-AumUEx8vdLPczCx0CED11mhRhT1eRQPJlzxgqA22SN1Yz0P55R8QbfFYcflpEtZbHmdvwMSipEoEUyI8aA9z268oNVnnAGhG3cOqk8-4HOvtqZ9LIc8jUcQLtWX-PJav9EePnWuV6pFwzvKcwl09m08xIfIh9DvFVJz3Fks-X6c1tVo2Valftlj8fnlzu9WgownkwhM4KN2UpcHcff4G-v9zckhcpROSzZ1ax5mPOUMF6B2OVawMhf3li9A9JEpBDxVu2-gZU6NbhvfH1f4PdNPUnlasPylHn4qz4S6_V1fuxho-2O_V72w3V5FDBi-m2D9vDVQvJtuoiJxUEyOWaxsenuzoFlq3jNHwm0SiabwVjaMyre4qktmHopLuLX2ixME3rbTtaXLAaly-t2X6oS4nFyhwP9f_WbJb4Yh_RDxksPj1hR_4nH43NTYjZBlLDM0YRb4xRzFmATQOUhPou6LSUbl8Tl2z7WYFzlcKgHwkWRaTGUV8Sz_h-_IfgZDvCtyyLhzvWOmfJBhsV1nTbDrr8DivZGH5huBNH88v_gbCVw36aAjH8BnmcHQ0ImUUwXoiB1iWSWB3x1xdYnAyQf5RV2PK86wVc4EBRxW6MeJHWZr-kFgHtcwk2ys8MewL8xlKs1S64APAWtD-WsLGEnUVMfM5EuWjoS9kB4BI4DC6M0uyDjaCuFu80wMmWfx9C3-Y2x7l5Lw0G4gRcUk-F3ONtKfsxMqAmV6aUVkXmdkX5LLa105CpIVqflM40CPl5mlVGEFlTf9u0zclyQ0_-qWt78ZzkpolPj9XKHikdYA_DKbvtfgtgNC07GIwBctoQsOrKGOxigeWzrAwfS9S5Wt7hvcs2R0Y04rXoeSTPbHWLumsJYLxC2HPtam3IxQJzCljIOFB5Sqi9WLO5l_yjmUGS2Fzy5DkuyFuC3o79rB-Vu0zpHQ5sHdbyYkfvi3QZx4jLuj2ki-3_1Qj7RfVdd1yWeudnFUy5QGfWh3-VoaK9UIZ1EeX62owXTGNOJovn9yMdwbXmy75qrkPXadFQG3lnuqq_Ucd8ZAYJvwfQb6uhTSv1kSFCpxyyaSBYjLU44QDF6FRh_QHLMBM2DVasOT0hsF2UWsIXUneoJHk_qVZSRmj5EDaIrWAUEZfL_geiwcW3_L3Y9iaHMkB93fHNsVEpLmTO-vLHZHYN0c-kKNVBw_40xGZ5ZgPJlT4JZVvBKuB2ka2OsSLcRXZvzZZZTnrRHb_9dngGkFpI0gc6gFu2d1mPIIFp6JS7AJ4_sYKE4yxuGG7IsA4ErnNBEK9Sr1XSu0_KfcIv63dm_AybDg1vmqMLCl5EiP9OIFsWdIM42970PH9h8Ri7KUn0D53RSRVkV38NW312A2JYCHfEfbIxyibEIrsusib98x6Bedh-3BpsWyih2XlDT6AFwJdD0cc_Uf56Vqv9waUtsSx-1xBwliZ35MKq-IfV6hcLnFgLhxsqakV8aFLAEzI8Ulned6zjRAC28aaDOZcFdKEMD0wHPUW8-9UTQxAgug8otEITWSkKubyXbdofpVa9Xwjq1-jLb4eylqey0RokKrHO6B7F3KtUF8Zsm0mGEg7nvUhjEBFL3AqkLke5Nb_78uqb3tzZF3iO6ghENar9s1DUIYqNkbMSeh7smgER_PBUB0MGMqRnx8qcr5t5yBEurZ7qq7-LYoJOoc6UwaPrQN_AFRou4ugiRrxIrvOwrDPr4y2zoi9XKnBBuYMnt2AkGVCNIA0WOKgmex4x_2Nri2JlRieAPwNPfW5PLkyPVRfw0dNzhg7csMl1Wctdw1JpHJhgMswuhYhRWGyzYWE4ZU8lvQWqA42MOKfUixAV4LmEzGz2eRQSPGWjLC85-mcxf_vssmD-mbuJAjzlLDzzwllrTDCQrt18DftpAAHhD5hG2HmQH9RDzcS3sniIx4p2zyqBHVQsWM74BlQjbODjgHRHerTgxYaNmh4KRA38lmb9omrUhI2Q0Lj5CF2of_Apd7fo8u6LpBpdEtirkn_7-9vPPiGerClV6lSjoNi_I_hHCneAq-3KZq7hM5XliJPvUrws_m0X5n6_fazdk-gOohEuF0Aq_1I5633sS-DGrFyan2K7oeoBGQN994-kweTR0lLko14nC5wnvizbsv7sDUNJTjM7LMYIrhKEILTjjGQ6WuCkYhQuM4RAnx74jFIchW8pS1tEnUcIOyBWgFB9M2zdbNmJg7vH43mmX408jMYVKs9CQz2Y7Vu33S0dSp9sWxM1KUREFVy1xTbVgKNxLxOzXiLOjm_b4EifAHZh_KTf0POm5RESU-TSrO29y5puTHL-PLuOE30jrxXaKhW5UzmQLUMhBGI7geYP6fE6QxyUi0gD_tLdMmzxTlZiOXkE6HnBQ-3Ar54uA-RFUhnzU-XT3wm--eINsvqyrHCyLQlmM71aBXnMlH5g0NJjdm42XSecTopWfFCfcNe1-ufpUuMGGg0C3LxVN5fkTmB2_6gai0AHh4dNhefGkKCZ5OcSNtA_UUI1nKr_wgPTI4X1catN9RE9mMYhOt-I5gOVRCihxDcUcBl2apUaFK-jHPs5rABqhykbi_dOS-zy42I86Vcu4B-_0GNlRIPRLZWFIhNRy_kfCOq4kb4SK9DjTvHsaq6YWMoL9Jk3JiqvH4yrMZ6T-XEFdJ8DGSc41lo1YJwhFUu0eGbGFKxyUBrHv1l9ByPrqWaiepnBBsda4y8G3SoiCfndwkbvLeE5ykYgurPpkYX_bau2PqsoAkiJ_GmbitKpXD71C5PmzvzLvpxkgC6hQq-v4L4WLelADvBpeikX9k23qhR5H3mkzNeMZgHyoFisy161cDgOlcg64g6C2UzJKlb5C1tOlQwM3fdm7cjBJXOjuxgi8Ewx6ov90eeaqIEfFvnUu1_IC_tFve9P_Us21Ak53vwStlHueYHtedJsHg84C5Ppt_z1LFR3Hh8m1pOnlb3kJw5eGpvsXweZrIIN0cvwz-NZ_orIxjPxLf23wy-y-lhObK17BfX1g-p759XtRSaG4Rj_QedauXHAA-SKgvwAOY3kBuWo9Oxx73JbC1kov55TkecHj2lXO_o49O5LCOa_h0nHIVb3JIGWot11sF_6zwNzFM2WtHFNu7Iu9hllumC8rvz3HEbylvSPQYzBQKy8NSyC6T9wbH6cAYY-vl59q1J4DwBH3DHKoMAec8InlnBO_ekJa8SMdQMZxov0BaxJc0W__29w2Sza0cBsMslfpRIWRWMb4jNpyvCyEVxrGf7AakOl0_9P3JCQ2o8cuf-BGg_z_iQ3aTMYVWi_pWuxnhh5NchjQU8C3dxvnEd0Te9mmDlvZh-N9GULo0tlzHz3WZniUp7mxVQ3nkeS31M0LIIF3SetSMjXrGJ_4bzAnb3EjH44eFuvgOiJ8ChXLCmHLtIpFa0WSC6YVpBxqfPrxke-DyB2Lvz_46MSQ4iKvCFhdYWxBtwXCZDN5Dt4XFpMknL_VnuVU8a5_rRqpEebv_VF1pBZsvfTK6UXFWAApFvL4ebApuLsFInG3uk89N2SbenTTiBGWZWZjsEFsvf3iSFZdQ2bgKSLmJIsuXV1mUPkzGEr8SsPLDKhGNZBevtka-CfnukEPn7a3K_O5sYcccEtYwx0VNiC6dWu7B_-pflffa1m4pbhdg6KfykDO9_jU_LE692dhWUzbv977zGUlOnmsEMeqmSTo9V5Hv0UsEDGEjoe9piKidoZ8JdAq1WIpSBfW9M2wtkZHbi2nlaBnKJuTaaNs_nWjbG4y73hEqEqRlQMKrLsJU7rsmy3h6x6-J_tXfkKpWu_Z_PhR-ca2RV4ldwUNejBhBomg-6bcSq1lHXGTpwc0wSDmIUfE2W6ZZysaFpmGpTDFjTDqfeeAwwbzShK7Uc-OnJVNiQ5w1KALJNjXURSfI61vyWRBMtFHaC7t6ixwDfv6pqEa0xeDe4xf4Z1qdX1Zfs4xpdAyzZWmslUsXIYDtiTXq6NYGjnCEPYqneVGOWhP6re0UfzeqqB6p6_L42UoqFrrjU7jnEWRlz6gxdU9qOJgLX3u6CIYtN6b44tpsqA23fNBiuf4SqoYimbd2YVjXFRFFNZ2XqJ-wBqYcD5xIfudMN6W5cAD4p5cTQ11_-EqIp8rDxiWOs-PN8SQTIE7ZYQ6na-lSITpchNybreE9SqhzluoY71DN8oQuUJHonrAW5Hh_VroGBxpbO9XdNhw0XrC-S9iH9DDEUedanM2DznPUZsHHutG8H0K9AEyWRS01sAwrF73ZG57qy5IciYMHZuFbkY0lzwbF-vd15jgNfP4JTmZD2sVWwVgI7Qp9T2hd0uuZL_huHl2baRCyC_DSI9c6p3q9Ud_tBN_yCcNcUVx0rS6EGfzM8VYOGwyiBVBAgVDjBXiKBsUVWA3ljfOtYhLKBDHkqhvoQaczSI2fKX7L7cwgXeBdckoaNhno6mCpZBamuyBZ1Iy6TnguQi59MCCKdiczIpfeumbSDEovy2IbQmPqld_JI6WOufgldiITu3hXR5KNazan2mc3NrKu1SEXZpdzb4wJZZ26U_1xE2GLMJru05yZoVNEkN72DhagM1R5oqHwPzRcn3ahdYvUzDoP6UHEpa76A23lqafY7F98l66hmAnXXlEKzEVwthYoxWANYtVsxs9NktNJdNMB3OCMnCo9BWkefmjlrzMJSkBP_1mfxN2o3W1tMNXpk5OQPO20_eWPF3iYhobSo8fcxzXtw9bg1BXr0TADj0hl_z4jw93wVGGLlsA3qYstay0I9yJgHBZmhxc7V1JzNWdwxIDmRgA5eCm1ELVBxpIup9WGZlUs1rzwqXzI-37i7l3dwFfCf_i2g8m-gNQjuM6YqkSz-XKcn-sJEg1XSMhoB15sgYE9U-2Oe-_EGLK0dOU2zyHO40F8ghvhKWpuAcITX_QnEMremwsiCl0PEnGZ98BXzlRvd1MFNc0ZUwzN-wTVxs4jNkteNbp0MjIKA5Y6FiCEX6koNWY9cLXSNg4XG4IsWRQrfIn2WWFz_nhzlaZNm_NUM1kmKRREPmsvQ', 'e' => 'AQAB', 'x5t' => 'KGApLybHWJmBwZGgBk07AlRD9nU', 'x5t#256' => 'YD12k6kc4xuh_5vEHMyyOFpGs6VqTyaKMlxg0Nt2crA', - 'x5c' => ['MIIR2jCCEUMCAg4EMA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIx'.PHP_EOL.'MDEwMTIxNzQ5WhcNMTcxMDA5MTIxNzQ5WjBKMQswCQYDVQQGDAJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wghAiMA0GCSqGSIb3DQEBAQUAA4IQDwAwghAKAoIQAQCrM8WwUh/dxJ6z'.PHP_EOL.'bkOWhXfLd3yAoxxlUT8RD/p78xmfKoNu44Q/f3JCzdq6fNtlGg7xfDyUugk126Io'.PHP_EOL.'qxyjuh0jvneQG/PV4vKR76xYFVm21udjLP0ATdld8Bv2sdbYDGAioc2xA6wslL92'.PHP_EOL.'i4ZnDFrA10T3RYzhAbzRsOmTHEd85u2Zkhtmg4VJ6iQMcDmOiRAbMnrm3oBG1A4i'.PHP_EOL.'G3zikiUCvxE7S8JSInRHhN0B99t0i6QxxV9KhkGVkn+r7IG0+ioHU2avXHUWoK1H'.PHP_EOL.'zU2sS12nsJQfLjIsiyQzMdPAkvbh3HzM9L1EEgC5Hoc7qyhDBCApjk1ibJpka5YO'.PHP_EOL.'vPDQuiv3+ONzHfHs2VcRR98bJR1P9tnqjCyB35Km+dupc9ch/67kkftp9JS5qPK0'.PHP_EOL.'ecZWKVA6kSDToHQX4C6ZQTHy90s9zMLHQIQPXWaFGFPV5FA8mXPGCoDbZI3VjPQ/'.PHP_EOL.'nlHxBt8Vhx+WkS1lseZ2/AxKKkSgRTIjxoD3Pbryg1WecAaEbdw6qTz7gc6+2pn0'.PHP_EOL.'shzyNRxAu1Zf48lq/0R4+da5XqkXDO8pzCXT2bTzEh8iH0O8VUnPcWSz5fpzW1Wj'.PHP_EOL.'ZVqV+2WPx+eXO71aCjCeTCEzgo3ZSlwdx9/gb6/3NySFylE5LNnVrHmY85QwXoHY'.PHP_EOL.'5VrAyF/eWL0D0kSkEPFW7b6BlTo1uG98fV/g9009SeVqw/KUefirPhLr9XV+7GGj'.PHP_EOL.'7Y79XvbDdXkUMGL6bYP28NVC8m26iInFQTI5ZrGx6e7OgWWreM0fCbRKJpvBWNoz'.PHP_EOL.'Kt7iqS2Yeiku4tfaLEwTettO1pcsBqXL63ZfqhLicXKHA/1/9ZslvhiH9EPGSw+P'.PHP_EOL.'WFH/icfjc1NiNkGUsMzRhFvjFHMWYBNA5SE+i7otJRuXxOXbPtZgXOVwqAfCRZFp'.PHP_EOL.'MZRXxLP+H78h+BkO8K3LIuHO9Y6Z8kGGxXWdNsOuvwOK9kYfmG4E0fzy/+BsJXDf'.PHP_EOL.'poCMfwGeZwdDQiZRTBeiIHWJZJYHfHXF1icDJB/lFXY8rzrBVzgQFHFbox4kdZmv'.PHP_EOL.'6QWAe1zCTbKzwx7AvzGUqzVLrgA8Ba0P5awsYSdRUx8zkS5aOhL2QHgEjgMLozS7'.PHP_EOL.'IONoK4W7zTAyZZ/H0Lf5jbHuXkvDQbiBFxST4Xc420p+zEyoCZXppRWReZ2Rfkst'.PHP_EOL.'rXTkKkhWp+UzjQI+XmaVUYQWVN/27TNyXJDT/6pa3vxnOSmiU+P1coeKR1gD8Mpu'.PHP_EOL.'+1+C2A0LTsYjAFy2hCw6soY7GKB5bOsDB9L1Lla3uG9yzZHRjTiteh5JM9sdYu6a'.PHP_EOL.'wlgvELYc+1qbcjFAnMKWMg4UHlKqL1Ys7mX/KOZQZLYXPLkOS7IW4Lejv2sH5W7T'.PHP_EOL.'OkdDmwd1vJiR++LdBnHiMu6PaSL7f/VCPtF9V13XJZ652cVTLlAZ9aHf5Whor1Qh'.PHP_EOL.'nUR5frajBdMY04mi+f3Ix3BtebLvmquQ9dp0VAbeWe6qr9Rx3xkBgm/B9Bvq6FNK'.PHP_EOL.'/WRIUKnHLJpIFiMtTjhAMXoVGH9AcswEzYNVqw5PSGwXZRawhdSd6gkeT+pVlJGa'.PHP_EOL.'PkQNoitYBQRl8v+B6LBxbf8vdj2JocyQH3d8c2xUSkuZM768sdkdg3Rz6Qo1UHD/'.PHP_EOL.'jTEZnlmA8mVPgllW8Eq4HaRrY6xItxFdm/NlllOetEdv/12eAaQWkjSBzqAW7Z3W'.PHP_EOL.'Y8ggWnolLsAnj+xgoTjLG4YbsiwDgSuc0EQr1KvVdK7T8p9wi/rd2b8DJsODW+ao'.PHP_EOL.'wsKXkSI/04gWxZ0gzjb3vQ8f2HxGLspSfQPndFJFWRXfw1bfXYDYlgId8R9sjHKJ'.PHP_EOL.'sQiuy6yJv3zHoF52H7cGmxbKKHZeUNPoAXAl0PRxz9R/npWq/3BpS2xLH7XEHCWJ'.PHP_EOL.'nfkwqr4h9XqFwucWAuHGypqRXxoUsATMjxSWd53rONEALbxpoM5lwV0oQwPTAc9R'.PHP_EOL.'bz71RNDECC6Dyi0QhNZKQq5vJdt2h+lVr1fCOrX6Mtvh7KWp7LRGiQqsc7oHsXcq'.PHP_EOL.'1QXxmybSYYSDue9SGMQEUvcCqQuR7k1v/vy6pve3NkXeI7qCEQ1qv2zUNQhio2Rs'.PHP_EOL.'xJ6HuyaARH88FQHQwYypGfHypyvm3nIES6tnuqrv4tigk6hzpTBo+tA38AVGi7i6'.PHP_EOL.'CJGvEiu87CsM+vjLbOiL1cqcEG5gye3YCQZUI0gDRY4qCZ7HjH/Y2uLYmVGJ4A/A'.PHP_EOL.'099bk8uTI9VF/DR03OGDtywyXVZy13DUmkcmGAyzC6FiFFYbLNhYThlTyW9BaoDj'.PHP_EOL.'Yw4p9SLEBXguYTMbPZ5FBI8ZaMsLzn6ZzF/++yyYP6Zu4kCPOUsPPPCWWtMMJCu3'.PHP_EOL.'XwN+2kAAeEPmEbYeZAf1EPNxLeyeIjHinbPKoEdVCxYzvgGVCNs4OOAdEd6tODFh'.PHP_EOL.'o2aHgpEDfyWZv2iatSEjZDQuPkIXah/8Cl3t+jy7oukGl0S2KuSf/v7288+IZ6sK'.PHP_EOL.'VXqVKOg2L8j+EcKd4Cr7cpmruEzleWIk+9SvCz+bRfmfr99rN2T6A6iES4XQCr/U'.PHP_EOL.'jnrfexL4MasXJqfYruh6gEZA333j6TB5NHSUuSjXicLnCe+LNuy/uwNQ0lOMzssx'.PHP_EOL.'giuEoQgtOOMZDpa4KRiFC4zhECfHviMUhyFbylLW0SdRwg7IFaAUH0zbN1s2YmDu'.PHP_EOL.'8fjeaZfjTyMxhUqz0JDPZjtW7fdLR1Kn2xbEzUpREQVXLXFNtWAo3EvE7NeIs6Ob'.PHP_EOL.'9vgSJ8AdmH8pN/Q86blERJT5NKs7b3Lmm5Mcv48u44TfSOvFdoqFblTOZAtQyEEY'.PHP_EOL.'juB5g/p8TpDHJSLSAP+0t0ybPFOVmI5eQToecFD7cCvni4D5EVSGfNT5dPfCb754'.PHP_EOL.'g2y+rKscLItCWYzvVoFecyUfmDQ0mN2bjZdJ5xOilZ8UJ9w17X65+lS4wYaDQLcv'.PHP_EOL.'FU3l+ROYHb/qBqLQAeHh02F58aQoJnk5xI20D9RQjWcqv/CA9MjhfVxq031ET2Yx'.PHP_EOL.'iE634jmA5VEKKHENxRwGXZqlRoUr6Mc+zmsAGqHKRuL905L7PLjYjzpVy7gH7/QY'.PHP_EOL.'2VEg9EtlYUiE1HL+R8I6riRvhIr0ONO8exqrphYygv0mTcmKq8fjKsxnpP5cQV0n'.PHP_EOL.'wMZJzjWWjVgnCEVS7R4ZsYUrHJQGse/WX0HI+upZqJ6mcEGx1rjLwbdKiIJ+d3CR'.PHP_EOL.'u8t4TnKRiC6s+mRhf9tq7Y+qygCSIn8aZuK0qlcPvULk+bO/Mu+nGSALqFCr6/gv'.PHP_EOL.'hYt6UAO8Gl6KRf2TbeqFHkfeaTM14xmAfKgWKzLXrVwOA6VyDriDoLZTMkqVvkLW'.PHP_EOL.'06VDAzd92btyMElc6O7GCLwTDHqi/3R55qogR8W+dS7X8gL+0W970/9SzbUCTne/'.PHP_EOL.'BK2Ue55ge150mweDzgLk+m3/PUsVHceHybWk6eVveQnDl4am+xfB5msgg3Ry/DP4'.PHP_EOL.'1n+isjGM/Et/bfDL7L6WE5srXsF9fWD6nvn1e1FJobhGP9B51q5ccAD5IqC/AA5j'.PHP_EOL.'eQG5aj07HHvclsLWSi/nlOR5wePaVc7+jj07ksI5r+HScchVvckgZai3XWwX/rPA'.PHP_EOL.'3MUzZa0cU27si72GWW6YLyu/PccRvKW9I9BjMFArLw1LILpP3BsfpwBhj6+Xn2rU'.PHP_EOL.'ngPAEfcMcqgwB5zwieWcE796QlrxIx1AxnGi/QFrElzRb//b3DZLNrRwGwyyV+lE'.PHP_EOL.'hZFYxviM2nK8LIRXGsZ/sBqQ6XT/0/ckJDajxy5/4EaD/P+JDdpMxhVaL+la7GeG'.PHP_EOL.'Hk1yGNBTwLd3G+cR3RN72aYOW9mH430ZQujS2XMfPdZmeJSnubFVDeeR5LfUzQsg'.PHP_EOL.'gXdJ61IyNesYn/hvMCdvcSMfjh4W6+A6InwKFcsKYcu0ikVrRZILphWkHGp8+vGR'.PHP_EOL.'74PIHYu/P/joxJDiIq8IWF1hbEG3BcJkM3kO3hcWkyScv9We5VTxrn+tGqkR5u/9'.PHP_EOL.'UXWkFmy99MrpRcVYACkW8vh5sCm4uwUicbe6Tz03ZJt6dNOIEZZlZmOwQWy9/eJI'.PHP_EOL.'Vl1DZuApIuYkiy5dXWZQ+TMYSvxKw8sMqEY1kF6+2Rr4J+e6QQ+ftrcr87mxhxxw'.PHP_EOL.'S1jDHRU2ILp1a7sH/6l+V99rWbiluF2Dop/KQM73+NT8sTr3Z2FZTNu/3vvMZSU6'.PHP_EOL.'eawQx6qZJOj1Xke/RSwQMYSOh72mIqJ2hnwl0CrVYilIF9b0zbC2RkduLaeVoGco'.PHP_EOL.'m5Npo2z+daNsbjLveESoSpGVAwqsuwlTuuybLeHrHr4n+1d+Qqla79n8+FH5xrZF'.PHP_EOL.'XiV3BQ16MGEGiaD7ptxKrWUdcZOnBzTBIOYhR8TZbplnKxoWmYalMMWNMOp954DD'.PHP_EOL.'BvNKErtRz46clU2JDnDUoAsk2NdRFJ8jrW/JZEEy0UdoLu3qLHAN+/qmoRrTF4N7'.PHP_EOL.'jF/hnWp1fVl+zjGl0DLNlaayVSxchgO2JNero1gaOcIQ9iqd5UY5aE/qt7RR/N6q'.PHP_EOL.'oHqnr8vjZSioWuuNTuOcRZGXPqDF1T2o4mAtfe7oIhi03pvji2myoDbd80GK5/hK'.PHP_EOL.'qhiKZt3ZhWNcVEUU1nZeon7AGphwPnEh+50w3pblwAPinlxNDXX/4SoinysPGJY6'.PHP_EOL.'z483xJBMgTtlhDqdr6VIhOlyE3Jut4T1KqHOW6hjvUM3yhC5QkeiesBbkeH9WugY'.PHP_EOL.'HGls71d02HDResL5L2If0MMRR51qczYPOc9Rmwce60bwfQr0ATJZFLTWwDCsXvdk'.PHP_EOL.'bnurLkhyJgwdm4VuRjSXPBsX693XmOA18/glOZkPaxVbBWAjtCn1PaF3S65kv+G4'.PHP_EOL.'eXZtpELIL8NIj1zqner1R3+0E3/IJw1xRXHStLoQZ/MzxVg4bDKIFUECBUOMFeIo'.PHP_EOL.'GxRVYDeWN861iEsoEMeSqG+hBpzNIjZ8pfsvtzCBd4F1ySho2GejqYKlkFqa7IFn'.PHP_EOL.'UjLpOeC5CLn0wIIp2JzMil966ZtIMSi/LYhtCY+qV38kjpY65+CV2IhO7eFdHko1'.PHP_EOL.'rNqfaZzc2sq7VIRdml3NvjAllnbpT/XETYYswmu7TnJmhU0SQ3vYOFqAzVHmiofA'.PHP_EOL.'/NFyfdqF1i9TMOg/pQcSlrvoDbeWpp9jsX3yXrqGYCddeUQrMRXC2FijFYA1i1Wz'.PHP_EOL.'Gz02S00l00wHc4IycKj0FaR5+aOWvMwlKQE//WZ/E3ajdbW0w1emTk5A87bT95Y8'.PHP_EOL.'XeJiGhtKjx9zHNe3D1uDUFevRMAOPSGX/PiPD3fBUYYuWwDepiy1rLQj3ImAcFma'.PHP_EOL.'HFztXUnM1Z3DEgOZGADl4KbUQtUHGki6n1YZmVSzWvPCpfMj7fuLuXd3AV8J/+La'.PHP_EOL.'Dyb6A1CO4zpiqRLP5cpyf6wkSDVdIyGgHXmyBgT1T7Y5778QYsrR05TbPIc7jQXy'.PHP_EOL.'CG+Epam4BwhNf9CcQyt6bCyIKXQ8ScZn3wFfOVG93UwU1zRlTDM37BNXGziM2S14'.PHP_EOL.'1unQyMgoDljoWIIRfqSg1Zj1wtdI2DhcbgixZFCt8ifZZYXP+eHOVpk2b81QzWSY'.PHP_EOL.'pFEQ+ay9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEATPINk/17H+RLz459iCVQAGes'.PHP_EOL.'8kc5sxYj3CkMlWrGMiCxvsgu2kak6dCa0f3DfiVt54Fry7s0OklHiZmipoiF4RCt'.PHP_EOL.'yJwUSAzRrZFAbkpDg8oIu4Ui/Bt13kY7xON+u4m0IgkLZSE+8BSjMrfjVvVxe+qH'.PHP_EOL.'5i7X/ibUTDjgyfdA8XI='], + 'x5c' => [ + 'MIIR2jCCEUMCAg4EMA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIx' . PHP_EOL . 'MDEwMTIxNzQ5WhcNMTcxMDA5MTIxNzQ5WjBKMQswCQYDVQQGDAJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wghAiMA0GCSqGSIb3DQEBAQUAA4IQDwAwghAKAoIQAQCrM8WwUh/dxJ6z' . PHP_EOL . 'bkOWhXfLd3yAoxxlUT8RD/p78xmfKoNu44Q/f3JCzdq6fNtlGg7xfDyUugk126Io' . PHP_EOL . 'qxyjuh0jvneQG/PV4vKR76xYFVm21udjLP0ATdld8Bv2sdbYDGAioc2xA6wslL92' . PHP_EOL . 'i4ZnDFrA10T3RYzhAbzRsOmTHEd85u2Zkhtmg4VJ6iQMcDmOiRAbMnrm3oBG1A4i' . PHP_EOL . 'G3zikiUCvxE7S8JSInRHhN0B99t0i6QxxV9KhkGVkn+r7IG0+ioHU2avXHUWoK1H' . PHP_EOL . 'zU2sS12nsJQfLjIsiyQzMdPAkvbh3HzM9L1EEgC5Hoc7qyhDBCApjk1ibJpka5YO' . PHP_EOL . 'vPDQuiv3+ONzHfHs2VcRR98bJR1P9tnqjCyB35Km+dupc9ch/67kkftp9JS5qPK0' . PHP_EOL . 'ecZWKVA6kSDToHQX4C6ZQTHy90s9zMLHQIQPXWaFGFPV5FA8mXPGCoDbZI3VjPQ/' . PHP_EOL . 'nlHxBt8Vhx+WkS1lseZ2/AxKKkSgRTIjxoD3Pbryg1WecAaEbdw6qTz7gc6+2pn0' . PHP_EOL . 'shzyNRxAu1Zf48lq/0R4+da5XqkXDO8pzCXT2bTzEh8iH0O8VUnPcWSz5fpzW1Wj' . PHP_EOL . 'ZVqV+2WPx+eXO71aCjCeTCEzgo3ZSlwdx9/gb6/3NySFylE5LNnVrHmY85QwXoHY' . PHP_EOL . '5VrAyF/eWL0D0kSkEPFW7b6BlTo1uG98fV/g9009SeVqw/KUefirPhLr9XV+7GGj' . PHP_EOL . '7Y79XvbDdXkUMGL6bYP28NVC8m26iInFQTI5ZrGx6e7OgWWreM0fCbRKJpvBWNoz' . PHP_EOL . 'Kt7iqS2Yeiku4tfaLEwTettO1pcsBqXL63ZfqhLicXKHA/1/9ZslvhiH9EPGSw+P' . PHP_EOL . 'WFH/icfjc1NiNkGUsMzRhFvjFHMWYBNA5SE+i7otJRuXxOXbPtZgXOVwqAfCRZFp' . PHP_EOL . 'MZRXxLP+H78h+BkO8K3LIuHO9Y6Z8kGGxXWdNsOuvwOK9kYfmG4E0fzy/+BsJXDf' . PHP_EOL . 'poCMfwGeZwdDQiZRTBeiIHWJZJYHfHXF1icDJB/lFXY8rzrBVzgQFHFbox4kdZmv' . PHP_EOL . '6QWAe1zCTbKzwx7AvzGUqzVLrgA8Ba0P5awsYSdRUx8zkS5aOhL2QHgEjgMLozS7' . PHP_EOL . 'IONoK4W7zTAyZZ/H0Lf5jbHuXkvDQbiBFxST4Xc420p+zEyoCZXppRWReZ2Rfkst' . PHP_EOL . 'rXTkKkhWp+UzjQI+XmaVUYQWVN/27TNyXJDT/6pa3vxnOSmiU+P1coeKR1gD8Mpu' . PHP_EOL . '+1+C2A0LTsYjAFy2hCw6soY7GKB5bOsDB9L1Lla3uG9yzZHRjTiteh5JM9sdYu6a' . PHP_EOL . 'wlgvELYc+1qbcjFAnMKWMg4UHlKqL1Ys7mX/KOZQZLYXPLkOS7IW4Lejv2sH5W7T' . PHP_EOL . 'OkdDmwd1vJiR++LdBnHiMu6PaSL7f/VCPtF9V13XJZ652cVTLlAZ9aHf5Whor1Qh' . PHP_EOL . 'nUR5frajBdMY04mi+f3Ix3BtebLvmquQ9dp0VAbeWe6qr9Rx3xkBgm/B9Bvq6FNK' . PHP_EOL . '/WRIUKnHLJpIFiMtTjhAMXoVGH9AcswEzYNVqw5PSGwXZRawhdSd6gkeT+pVlJGa' . PHP_EOL . 'PkQNoitYBQRl8v+B6LBxbf8vdj2JocyQH3d8c2xUSkuZM768sdkdg3Rz6Qo1UHD/' . PHP_EOL . 'jTEZnlmA8mVPgllW8Eq4HaRrY6xItxFdm/NlllOetEdv/12eAaQWkjSBzqAW7Z3W' . PHP_EOL . 'Y8ggWnolLsAnj+xgoTjLG4YbsiwDgSuc0EQr1KvVdK7T8p9wi/rd2b8DJsODW+ao' . PHP_EOL . 'wsKXkSI/04gWxZ0gzjb3vQ8f2HxGLspSfQPndFJFWRXfw1bfXYDYlgId8R9sjHKJ' . PHP_EOL . 'sQiuy6yJv3zHoF52H7cGmxbKKHZeUNPoAXAl0PRxz9R/npWq/3BpS2xLH7XEHCWJ' . PHP_EOL . 'nfkwqr4h9XqFwucWAuHGypqRXxoUsATMjxSWd53rONEALbxpoM5lwV0oQwPTAc9R' . PHP_EOL . 'bz71RNDECC6Dyi0QhNZKQq5vJdt2h+lVr1fCOrX6Mtvh7KWp7LRGiQqsc7oHsXcq' . PHP_EOL . '1QXxmybSYYSDue9SGMQEUvcCqQuR7k1v/vy6pve3NkXeI7qCEQ1qv2zUNQhio2Rs' . PHP_EOL . 'xJ6HuyaARH88FQHQwYypGfHypyvm3nIES6tnuqrv4tigk6hzpTBo+tA38AVGi7i6' . PHP_EOL . 'CJGvEiu87CsM+vjLbOiL1cqcEG5gye3YCQZUI0gDRY4qCZ7HjH/Y2uLYmVGJ4A/A' . PHP_EOL . '099bk8uTI9VF/DR03OGDtywyXVZy13DUmkcmGAyzC6FiFFYbLNhYThlTyW9BaoDj' . PHP_EOL . 'Yw4p9SLEBXguYTMbPZ5FBI8ZaMsLzn6ZzF/++yyYP6Zu4kCPOUsPPPCWWtMMJCu3' . PHP_EOL . 'XwN+2kAAeEPmEbYeZAf1EPNxLeyeIjHinbPKoEdVCxYzvgGVCNs4OOAdEd6tODFh' . PHP_EOL . 'o2aHgpEDfyWZv2iatSEjZDQuPkIXah/8Cl3t+jy7oukGl0S2KuSf/v7288+IZ6sK' . PHP_EOL . 'VXqVKOg2L8j+EcKd4Cr7cpmruEzleWIk+9SvCz+bRfmfr99rN2T6A6iES4XQCr/U' . PHP_EOL . 'jnrfexL4MasXJqfYruh6gEZA333j6TB5NHSUuSjXicLnCe+LNuy/uwNQ0lOMzssx' . PHP_EOL . 'giuEoQgtOOMZDpa4KRiFC4zhECfHviMUhyFbylLW0SdRwg7IFaAUH0zbN1s2YmDu' . PHP_EOL . '8fjeaZfjTyMxhUqz0JDPZjtW7fdLR1Kn2xbEzUpREQVXLXFNtWAo3EvE7NeIs6Ob' . PHP_EOL . '9vgSJ8AdmH8pN/Q86blERJT5NKs7b3Lmm5Mcv48u44TfSOvFdoqFblTOZAtQyEEY' . PHP_EOL . 'juB5g/p8TpDHJSLSAP+0t0ybPFOVmI5eQToecFD7cCvni4D5EVSGfNT5dPfCb754' . PHP_EOL . 'g2y+rKscLItCWYzvVoFecyUfmDQ0mN2bjZdJ5xOilZ8UJ9w17X65+lS4wYaDQLcv' . PHP_EOL . 'FU3l+ROYHb/qBqLQAeHh02F58aQoJnk5xI20D9RQjWcqv/CA9MjhfVxq031ET2Yx' . PHP_EOL . 'iE634jmA5VEKKHENxRwGXZqlRoUr6Mc+zmsAGqHKRuL905L7PLjYjzpVy7gH7/QY' . PHP_EOL . '2VEg9EtlYUiE1HL+R8I6riRvhIr0ONO8exqrphYygv0mTcmKq8fjKsxnpP5cQV0n' . PHP_EOL . 'wMZJzjWWjVgnCEVS7R4ZsYUrHJQGse/WX0HI+upZqJ6mcEGx1rjLwbdKiIJ+d3CR' . PHP_EOL . 'u8t4TnKRiC6s+mRhf9tq7Y+qygCSIn8aZuK0qlcPvULk+bO/Mu+nGSALqFCr6/gv' . PHP_EOL . 'hYt6UAO8Gl6KRf2TbeqFHkfeaTM14xmAfKgWKzLXrVwOA6VyDriDoLZTMkqVvkLW' . PHP_EOL . '06VDAzd92btyMElc6O7GCLwTDHqi/3R55qogR8W+dS7X8gL+0W970/9SzbUCTne/' . PHP_EOL . 'BK2Ue55ge150mweDzgLk+m3/PUsVHceHybWk6eVveQnDl4am+xfB5msgg3Ry/DP4' . PHP_EOL . '1n+isjGM/Et/bfDL7L6WE5srXsF9fWD6nvn1e1FJobhGP9B51q5ccAD5IqC/AA5j' . PHP_EOL . 'eQG5aj07HHvclsLWSi/nlOR5wePaVc7+jj07ksI5r+HScchVvckgZai3XWwX/rPA' . PHP_EOL . '3MUzZa0cU27si72GWW6YLyu/PccRvKW9I9BjMFArLw1LILpP3BsfpwBhj6+Xn2rU' . PHP_EOL . 'ngPAEfcMcqgwB5zwieWcE796QlrxIx1AxnGi/QFrElzRb//b3DZLNrRwGwyyV+lE' . PHP_EOL . 'hZFYxviM2nK8LIRXGsZ/sBqQ6XT/0/ckJDajxy5/4EaD/P+JDdpMxhVaL+la7GeG' . PHP_EOL . 'Hk1yGNBTwLd3G+cR3RN72aYOW9mH430ZQujS2XMfPdZmeJSnubFVDeeR5LfUzQsg' . PHP_EOL . 'gXdJ61IyNesYn/hvMCdvcSMfjh4W6+A6InwKFcsKYcu0ikVrRZILphWkHGp8+vGR' . PHP_EOL . '74PIHYu/P/joxJDiIq8IWF1hbEG3BcJkM3kO3hcWkyScv9We5VTxrn+tGqkR5u/9' . PHP_EOL . 'UXWkFmy99MrpRcVYACkW8vh5sCm4uwUicbe6Tz03ZJt6dNOIEZZlZmOwQWy9/eJI' . PHP_EOL . 'Vl1DZuApIuYkiy5dXWZQ+TMYSvxKw8sMqEY1kF6+2Rr4J+e6QQ+ftrcr87mxhxxw' . PHP_EOL . 'S1jDHRU2ILp1a7sH/6l+V99rWbiluF2Dop/KQM73+NT8sTr3Z2FZTNu/3vvMZSU6' . PHP_EOL . 'eawQx6qZJOj1Xke/RSwQMYSOh72mIqJ2hnwl0CrVYilIF9b0zbC2RkduLaeVoGco' . PHP_EOL . 'm5Npo2z+daNsbjLveESoSpGVAwqsuwlTuuybLeHrHr4n+1d+Qqla79n8+FH5xrZF' . PHP_EOL . 'XiV3BQ16MGEGiaD7ptxKrWUdcZOnBzTBIOYhR8TZbplnKxoWmYalMMWNMOp954DD' . PHP_EOL . 'BvNKErtRz46clU2JDnDUoAsk2NdRFJ8jrW/JZEEy0UdoLu3qLHAN+/qmoRrTF4N7' . PHP_EOL . 'jF/hnWp1fVl+zjGl0DLNlaayVSxchgO2JNero1gaOcIQ9iqd5UY5aE/qt7RR/N6q' . PHP_EOL . 'oHqnr8vjZSioWuuNTuOcRZGXPqDF1T2o4mAtfe7oIhi03pvji2myoDbd80GK5/hK' . PHP_EOL . 'qhiKZt3ZhWNcVEUU1nZeon7AGphwPnEh+50w3pblwAPinlxNDXX/4SoinysPGJY6' . PHP_EOL . 'z483xJBMgTtlhDqdr6VIhOlyE3Jut4T1KqHOW6hjvUM3yhC5QkeiesBbkeH9WugY' . PHP_EOL . 'HGls71d02HDResL5L2If0MMRR51qczYPOc9Rmwce60bwfQr0ATJZFLTWwDCsXvdk' . PHP_EOL . 'bnurLkhyJgwdm4VuRjSXPBsX693XmOA18/glOZkPaxVbBWAjtCn1PaF3S65kv+G4' . PHP_EOL . 'eXZtpELIL8NIj1zqner1R3+0E3/IJw1xRXHStLoQZ/MzxVg4bDKIFUECBUOMFeIo' . PHP_EOL . 'GxRVYDeWN861iEsoEMeSqG+hBpzNIjZ8pfsvtzCBd4F1ySho2GejqYKlkFqa7IFn' . PHP_EOL . 'UjLpOeC5CLn0wIIp2JzMil966ZtIMSi/LYhtCY+qV38kjpY65+CV2IhO7eFdHko1' . PHP_EOL . 'rNqfaZzc2sq7VIRdml3NvjAllnbpT/XETYYswmu7TnJmhU0SQ3vYOFqAzVHmiofA' . PHP_EOL . '/NFyfdqF1i9TMOg/pQcSlrvoDbeWpp9jsX3yXrqGYCddeUQrMRXC2FijFYA1i1Wz' . PHP_EOL . 'Gz02S00l00wHc4IycKj0FaR5+aOWvMwlKQE//WZ/E3ajdbW0w1emTk5A87bT95Y8' . PHP_EOL . 'XeJiGhtKjx9zHNe3D1uDUFevRMAOPSGX/PiPD3fBUYYuWwDepiy1rLQj3ImAcFma' . PHP_EOL . 'HFztXUnM1Z3DEgOZGADl4KbUQtUHGki6n1YZmVSzWvPCpfMj7fuLuXd3AV8J/+La' . PHP_EOL . 'Dyb6A1CO4zpiqRLP5cpyf6wkSDVdIyGgHXmyBgT1T7Y5778QYsrR05TbPIc7jQXy' . PHP_EOL . 'CG+Epam4BwhNf9CcQyt6bCyIKXQ8ScZn3wFfOVG93UwU1zRlTDM37BNXGziM2S14' . PHP_EOL . '1unQyMgoDljoWIIRfqSg1Zj1wtdI2DhcbgixZFCt8ifZZYXP+eHOVpk2b81QzWSY' . PHP_EOL . 'pFEQ+ay9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEATPINk/17H+RLz459iCVQAGes' . PHP_EOL . '8kc5sxYj3CkMlWrGMiCxvsgu2kak6dCa0f3DfiVt54Fry7s0OklHiZmipoiF4RCt' . PHP_EOL . 'yJwUSAzRrZFAbkpDg8oIu4Ui/Bt13kY7xON+u4m0IgkLZSE+8BSjMrfjVvVxe+qH' . PHP_EOL . '5i7X/ibUTDjgyfdA8XI=', + ], ], ], [ - __DIR__.'/RSA/DER/512b-rsa-example-cert.der', + __DIR__ . '/RSA/DER/512b-rsa-example-cert.der', [ 'kty' => 'RSA', 'n' => 'm_xmkHmEQrurE_0re_jeFRLl8ZPjBop7uLHhnia7lQG_5zDtZIUC3RVpqDSwBuw_NTweGyuP-o8AG98HxqxTBw', 'e' => 'AQAB', 'x5t' => 'Bxy5TwzIUU0CQSRwjuiyaHvX2dU', 'x5t#256' => 'Xw-1FmWBquZKEBwVg7G-vnToFKkeeooUuh6DXXj26ec', - 'x5c' => ['MIICEjCCAXsCAg36MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'ODIyMDUyNjU0WhcNMTcwODIxMDUyNjU0WjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEAm/xmkHmEQrurE/0re/jeFRLl'.PHP_EOL.'8ZPjBop7uLHhnia7lQG/5zDtZIUC3RVpqDSwBuw/NTweGyuP+o8AG98HxqxTBwID'.PHP_EOL.'AQABMA0GCSqGSIb3DQEBBQUAA4GBABS2TLuBeTPmcaTaUW/LCB2NYOy8GMdzR1mx'.PHP_EOL.'8iBIu2H6/E2tiY3RIevV2OW61qY2/XRQg7YPxx3ffeUugX9F4J/iPnnu1zAxxyBy'.PHP_EOL.'2VguKv4SWjRFoRkIfIlHX0qVviMhSlNy2ioFLy7JcPZb+v3ftDGywUqcBiVDoea0'.PHP_EOL.'Hn+GmxZA'], + 'x5c' => [ + 'MIICEjCCAXsCAg36MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'ODIyMDUyNjU0WhcNMTcwODIxMDUyNjU0WjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEAm/xmkHmEQrurE/0re/jeFRLl' . PHP_EOL . '8ZPjBop7uLHhnia7lQG/5zDtZIUC3RVpqDSwBuw/NTweGyuP+o8AG98HxqxTBwID' . PHP_EOL . 'AQABMA0GCSqGSIb3DQEBBQUAA4GBABS2TLuBeTPmcaTaUW/LCB2NYOy8GMdzR1mx' . PHP_EOL . '8iBIu2H6/E2tiY3RIevV2OW61qY2/XRQg7YPxx3ffeUugX9F4J/iPnnu1zAxxyBy' . PHP_EOL . '2VguKv4SWjRFoRkIfIlHX0qVviMhSlNy2ioFLy7JcPZb+v3ftDGywUqcBiVDoea0' . PHP_EOL . 'Hn+GmxZA', + ], ], ], [ - __DIR__.'/RSA/DER/1024b-rsa-example-cert.der', + __DIR__ . '/RSA/DER/1024b-rsa-example-cert.der', [ 'kty' => 'RSA', 'n' => 'xgEGvHk-U_RY0j9l3MP7o-S2a6uf4XaRBhu1ztdCHz8tMG8Kj4_qJmgsSZQD17sRctHGBTUJWp4CLtBwCf0zAGVzySwUkcHSu1_2mZ_w7Nr0TQHKeWr_j8pvXH534DKEvugr21DAHbi4c654eLUL-JW_wJJYqJh7qHM3W3Fh7ys', 'e' => 'AQAB', 'x5t' => '4bK45ewZ00Wk-a_shpTw2cCqJc8', 'x5t#256' => '5F5GTPOxBGAOsVyuYzqUBjri0R2YDTiDowiQbs6oGgU', - 'x5c' => ['MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD'.PHP_EOL.'+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9'.PHP_EOL.'MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1'.PHP_EOL.'C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ'.PHP_EOL.'kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf'.PHP_EOL.'jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr'.PHP_EOL.'evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok='], + 'x5c' => [ + 'MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD' . PHP_EOL . '+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9' . PHP_EOL . 'MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1' . PHP_EOL . 'C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ' . PHP_EOL . 'kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf' . PHP_EOL . 'jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr' . PHP_EOL . 'evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok=', + ], ], ], [ - __DIR__.'/RSA/DER/2048b-rsa-example-cert.der', + __DIR__ . '/RSA/DER/2048b-rsa-example-cert.der', [ 'kty' => 'RSA', 'n' => 'tM_RXjMp7AvPrnb1_i3ImcZ4ebkY-AvUurTXngJSBgn0GJNM1HDRQqApE5JzUHf2BImsAyzW8QarrWzA2dWmq8rNWtJWJlHlSwiKr8wZDyU0kLAqKUEPVfFrk9uds8zc7OvHVRjXQiXeSTUUMpKcHsZp4zz79Jr4-4vF4Bt-_U8luj_llleaJHlJFyfXiUtqLg2HUdkjPQaFVvhYMQ7ugZl4aM1uRH7J2oxaexy_JEApSNEDnO_cripd-Pdqx-m8xbBZ9pX8FsvYnO3D_BKQk3hadbRWg_r8QYT2ZHk0NRyseoUOc3hyAeckiSWe2n9lvK-HkxmM23UVtuAwxwj4WQ', 'e' => 'AQAB', 'x5t' => 'y17eUFeZUYeOLmcTxTvpOOsjfkA', 'x5t#256' => 'B4plbjZwSZyZG7AnRoIFive9wF_EYsYF8PiVgXmBbNc', - 'x5c' => ['MIIC2jCCAkMCAg38MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'ODIyMDUyNzQxWhcNMTcwODIxMDUyNzQxWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0z9FeMynsC8+u'.PHP_EOL.'dvX+LciZxnh5uRj4C9S6tNeeAlIGCfQYk0zUcNFCoCkTknNQd/YEiawDLNbxBqut'.PHP_EOL.'bMDZ1aarys1a0lYmUeVLCIqvzBkPJTSQsCopQQ9V8WuT252zzNzs68dVGNdCJd5J'.PHP_EOL.'NRQykpwexmnjPPv0mvj7i8XgG379TyW6P+WWV5okeUkXJ9eJS2ouDYdR2SM9BoVW'.PHP_EOL.'+FgxDu6BmXhozW5EfsnajFp7HL8kQClI0QOc79yuKl3492rH6bzFsFn2lfwWy9ic'.PHP_EOL.'7cP8EpCTeFp1tFaD+vxBhPZkeTQ1HKx6hQ5zeHIB5ySJJZ7af2W8r4eTGYzbdRW2'.PHP_EOL.'4DDHCPhZAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAQMv+BFvGdMVzkQaQ3/+2noVz'.PHP_EOL.'/uAKbzpEL8xTcxYyP3lkOeh4FoxiSWqy5pGFALdPONoDuYFpLhjJSZaEwuvjI/Tr'.PHP_EOL.'rGhLV1pRG9frwDFshqD2Vaj4ENBCBh6UpeBop5+285zQ4SI7q4U9oSebUDJiuOx6'.PHP_EOL.'+tZ9KynmrbJpTSi0+BM='], + 'x5c' => [ + 'MIIC2jCCAkMCAg38MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'ODIyMDUyNzQxWhcNMTcwODIxMDUyNzQxWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0z9FeMynsC8+u' . PHP_EOL . 'dvX+LciZxnh5uRj4C9S6tNeeAlIGCfQYk0zUcNFCoCkTknNQd/YEiawDLNbxBqut' . PHP_EOL . 'bMDZ1aarys1a0lYmUeVLCIqvzBkPJTSQsCopQQ9V8WuT252zzNzs68dVGNdCJd5J' . PHP_EOL . 'NRQykpwexmnjPPv0mvj7i8XgG379TyW6P+WWV5okeUkXJ9eJS2ouDYdR2SM9BoVW' . PHP_EOL . '+FgxDu6BmXhozW5EfsnajFp7HL8kQClI0QOc79yuKl3492rH6bzFsFn2lfwWy9ic' . PHP_EOL . '7cP8EpCTeFp1tFaD+vxBhPZkeTQ1HKx6hQ5zeHIB5ySJJZ7af2W8r4eTGYzbdRW2' . PHP_EOL . '4DDHCPhZAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAQMv+BFvGdMVzkQaQ3/+2noVz' . PHP_EOL . '/uAKbzpEL8xTcxYyP3lkOeh4FoxiSWqy5pGFALdPONoDuYFpLhjJSZaEwuvjI/Tr' . PHP_EOL . 'rGhLV1pRG9frwDFshqD2Vaj4ENBCBh6UpeBop5+285zQ4SI7q4U9oSebUDJiuOx6' . PHP_EOL . '+tZ9KynmrbJpTSi0+BM=', + ], ], ], [ - __DIR__.'/RSA/DER/4096b-rsa-example-cert.der', + __DIR__ . '/RSA/DER/4096b-rsa-example-cert.der', [ 'kty' => 'RSA', 'n' => 'sL1iEzi3sk20tUP1GnKniCyCtelBy70spiJW24k-5qQ-EjMAd-N8aSJVzeuHwtGNcpU-iy3l-ErewHCaxiFdwDJiXLA7Dc4KOe-y6rTb5zpCx9BqI4rBRCkIkRF-oDoKvbVkqsGhDXHExLAF7legENUk_hterNNIjfdoY1_Vf1eurJ0cE7Cf6eFkaS0nQI-Nu9oYjNfaiIPc64fdntq0MuxP1EoVuIKTq4YNn-n3AgZvmlyIGvqsWki3IXA1Lz166SMU3fzlkNt0IbyBM5Bmz5QQPCezcPSgsmsW2DARW9YtJQY8Ci45nKIoYiOz1bYQDrvwe9Q9oSnBYyqX7-A9VGpv9FbpisIcLoWVTYy6tQUdRSkSdQoqCxuMAk69C1YLb71MoRa0vtz3VEdE-R5QEFjzMkAx4AqWzh1tMHNIW7jXjv5UvNi44nhjRcSpjARRfZbDds7AOkMN9l5G9vxBZbVwrabjsFc7XZODA652g18vczGbqhR6b-ZVk2w1cA3chEDXJWJWwBGw3rxEKP6wDmRZfeDLut6wIC4j3mTeCHUv-PKK-SmkGgjntA7gG-BljSEONnGEOU7BB1rfhSDgDEqX_YTT4w3rtbn3-NAzrbIshnl_TVYqirbbWh6b3e629s7GrG3ABlJfnzUCY-KiJj0gfU4amaj07pBHDPzbW3k', 'e' => 'AQAB', 'x5t' => 'IBO6381r3QWOObmNaxF36HBgO5M', 'x5t#256' => 'yVWIatQnBpbU9lUGZmRlGg2bldGtJPpqQXfq3LhBq3M', - 'x5c' => ['MIID2jCCA0MCAg39MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'ODIyMDUyODAwWhcNMTcwODIxMDUyODAwWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwvWITOLeyTbS1'.PHP_EOL.'Q/UacqeILIK16UHLvSymIlbbiT7mpD4SMwB343xpIlXN64fC0Y1ylT6LLeX4St7A'.PHP_EOL.'cJrGIV3AMmJcsDsNzgo577LqtNvnOkLH0GojisFEKQiREX6gOgq9tWSqwaENccTE'.PHP_EOL.'sAXuV6AQ1ST+G16s00iN92hjX9V/V66snRwTsJ/p4WRpLSdAj4272hiM19qIg9zr'.PHP_EOL.'h92e2rQy7E/UShW4gpOrhg2f6fcCBm+aXIga+qxaSLchcDUvPXrpIxTd/OWQ23Qh'.PHP_EOL.'vIEzkGbPlBA8J7Nw9KCyaxbYMBFb1i0lBjwKLjmcoihiI7PVthAOu/B71D2hKcFj'.PHP_EOL.'Kpfv4D1Uam/0VumKwhwuhZVNjLq1BR1FKRJ1CioLG4wCTr0LVgtvvUyhFrS+3PdU'.PHP_EOL.'R0T5HlAQWPMyQDHgCpbOHW0wc0hbuNeO/lS82LjieGNFxKmMBFF9lsN2zsA6Qw32'.PHP_EOL.'Xkb2/EFltXCtpuOwVztdk4MDrnaDXy9zMZuqFHpv5lWTbDVwDdyEQNclYlbAEbDe'.PHP_EOL.'vEQo/rAOZFl94Mu63rAgLiPeZN4IdS/48or5KaQaCOe0DuAb4GWNIQ42cYQ5TsEH'.PHP_EOL.'Wt+FIOAMSpf9hNPjDeu1uff40DOtsiyGeX9NViqKtttaHpvd7rb2zsasbcAGUl+f'.PHP_EOL.'NQJj4qImPSB9ThqZqPTukEcM/NtbeQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAIAi'.PHP_EOL.'gU3My8kYYniDuKEXSJmbVB+K1upHxWDA8R6KMZGXfbe5BRd8s40cY6JBYL52Tgqd'.PHP_EOL.'l8z5Ek8dC4NNpfpcZc/teT1WqiO2wnpGHjgMDuDL1mxCZNL422jHpiPWkWp3AuDI'.PHP_EOL.'c7tL1QjbfAUHAQYwmHkWgPP+T2wAv0pOt36GgMCM'], + 'x5c' => [ + 'MIID2jCCA0MCAg39MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'ODIyMDUyODAwWhcNMTcwODIxMDUyODAwWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwvWITOLeyTbS1' . PHP_EOL . 'Q/UacqeILIK16UHLvSymIlbbiT7mpD4SMwB343xpIlXN64fC0Y1ylT6LLeX4St7A' . PHP_EOL . 'cJrGIV3AMmJcsDsNzgo577LqtNvnOkLH0GojisFEKQiREX6gOgq9tWSqwaENccTE' . PHP_EOL . 'sAXuV6AQ1ST+G16s00iN92hjX9V/V66snRwTsJ/p4WRpLSdAj4272hiM19qIg9zr' . PHP_EOL . 'h92e2rQy7E/UShW4gpOrhg2f6fcCBm+aXIga+qxaSLchcDUvPXrpIxTd/OWQ23Qh' . PHP_EOL . 'vIEzkGbPlBA8J7Nw9KCyaxbYMBFb1i0lBjwKLjmcoihiI7PVthAOu/B71D2hKcFj' . PHP_EOL . 'Kpfv4D1Uam/0VumKwhwuhZVNjLq1BR1FKRJ1CioLG4wCTr0LVgtvvUyhFrS+3PdU' . PHP_EOL . 'R0T5HlAQWPMyQDHgCpbOHW0wc0hbuNeO/lS82LjieGNFxKmMBFF9lsN2zsA6Qw32' . PHP_EOL . 'Xkb2/EFltXCtpuOwVztdk4MDrnaDXy9zMZuqFHpv5lWTbDVwDdyEQNclYlbAEbDe' . PHP_EOL . 'vEQo/rAOZFl94Mu63rAgLiPeZN4IdS/48or5KaQaCOe0DuAb4GWNIQ42cYQ5TsEH' . PHP_EOL . 'Wt+FIOAMSpf9hNPjDeu1uff40DOtsiyGeX9NViqKtttaHpvd7rb2zsasbcAGUl+f' . PHP_EOL . 'NQJj4qImPSB9ThqZqPTukEcM/NtbeQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAIAi' . PHP_EOL . 'gU3My8kYYniDuKEXSJmbVB+K1upHxWDA8R6KMZGXfbe5BRd8s40cY6JBYL52Tgqd' . PHP_EOL . 'l8z5Ek8dC4NNpfpcZc/teT1WqiO2wnpGHjgMDuDL1mxCZNL422jHpiPWkWp3AuDI' . PHP_EOL . 'c7tL1QjbfAUHAQYwmHkWgPP+T2wAv0pOt36GgMCM', + ], ], ], [ - __DIR__.'/RSA/DER/8192b-rsa-example-cert.der', + __DIR__ . '/RSA/DER/8192b-rsa-example-cert.der', [ 'kty' => 'RSA', 'n' => 'q5lcEwG8rUflI1aL6omAaF5R1DFkCMllFaQ3HUwlwCWYNNyKxF1G2e-P3Y6SFWyp0sFfmDcvuebOY_Dw3KlC756bQUMEXH6TaubYDcXaKDyrdKgCSoufjhwHkNpRz3VxpkLADJQIHdijes2JN3daGARxSJLcjoSaZvq_LBCIHTTDGESBXJP6RtbjAjGjuLUgmcvkl029Xl8ylkrcibjTzXmOod3vioTnX5aZNT1c7evmskvixWG1NlHOhZ1HdXiPHLjKxnr4lHl9lxtTjkNSsF-Nz0bYHCpWZ9u98nkgvFAxNUmiwX5nHIqo39AK8YVuVmDGYzY-dPtD1UtCBXgj-Ryq1cPU66H7kEfvbn1kZRF0XcxqIUVDlpa_h4Aq7r8KnQ6nVF59oM8AwsrRu3llvlRzNCaRUhafZ6YUHR19j_6GpAJtOWwwV5m2qKs9EhfL9Kvz9DqWh3DBt0CuGIDS0NuBAt2_RmNQBP1u7L8pYZ_9kV-Y7YM9ocbuYpUbTy4vio33Pl2wG8iozgPIgOcbne4Vh4TGpe0hbXaL-a_84CVOWX4JyLxyBEWGB6PLfH74NyXyvh57X6Cn3P0Xr2rSgPEgEEovw5i9qDeqqzeO-GvUouhQjZgURP5USjd120IPjVoZP8RPRCAPUBQSUmi2dyHANRI3ydIhTKOEdZCVvIlVNu33wfN55kEeLCXBiDvfvozUbCGuuOkbs5Yz7vE8K9xlU_Xo2icptY_u3XMPW6YKRP6lvGtovn9295vENHOJDFCVkcJ819vHVqJnoiGAf_QX0J74NLm6fnWboH6-5BcIDl18uB3qEFAlneRflIrC2XBZju-dTuTaHy14WvVJNjTMUBgVQ4gaS1X2wmAztwv-Rk8o6k-KJuSZDWVEZyH3NaddkYSVONOMzIuuClbg4cEgLP2cxxqz8JdnyT2NNfMdGfxP4Nd_RvPtTD9kTVewlurzYVjoi8CC6VhV2Tgcp-UvT6Z0Yne-65dXi31VRqQWG8adWQ3gc9NP1oXfJqVt26ldXF9AVf7PcFcm7xzr2mwZKY-DMk1m1hBvUGeg7Iab34OABOY6J4AxXiXqKx3JV24SFydaSSevsulSrmUJU3g8TR-WwTh06Yp8DZplCU9MEvfyUSShtHED72anVRgVe8jw47k9TavJ-hPiAq0HUmmKGUeKvrqWN4bMpSiMCmHTkcqS_d4Dn4ZAI8W0DIluc9sXBaiUUSIt6t7gGNOZGUyZ-ZN4GNxVlMazB6CieGRhoPfRmXw7wq0k2R5BU1Q8PSj8jrZ88DgdfENnWCGy6Aq450OwfufGaHZDwAUD1kUoRGBkzIxvkWLVdQtmP4iZXOLSany0RtPZLGjSH-x0vQ', 'e' => 'AQAB', 'x5t' => 'YV6dSQ9sNS7rhNWcj-M4XuMmOE4', 'x5t#256' => 'ZNEUscWwJu03bRinDYd0BAuwiWGG3oDocehVMwX2oVo', - 'x5c' => ['MIIF2jCCBUMCAg3+MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'OTI3MDYwNzQ5WhcNMTcwOTI2MDYwNzQ5WjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wggQiMA0GCSqGSIb3DQEBAQUAA4IEDwAwggQKAoIEAQCrmVwTAbytR+Uj'.PHP_EOL.'VovqiYBoXlHUMWQIyWUVpDcdTCXAJZg03IrEXUbZ74/djpIVbKnSwV+YNy+55s5j'.PHP_EOL.'8PDcqULvnptBQwRcfpNq5tgNxdooPKt0qAJKi5+OHAeQ2lHPdXGmQsAMlAgd2KN6'.PHP_EOL.'zYk3d1oYBHFIktyOhJpm+r8sEIgdNMMYRIFck/pG1uMCMaO4tSCZy+SXTb1eXzKW'.PHP_EOL.'StyJuNPNeY6h3e+KhOdflpk1PVzt6+ayS+LFYbU2Uc6FnUd1eI8cuMrGeviUeX2X'.PHP_EOL.'G1OOQ1KwX43PRtgcKlZn273yeSC8UDE1SaLBfmcciqjf0ArxhW5WYMZjNj50+0PV'.PHP_EOL.'S0IFeCP5HKrVw9TrofuQR+9ufWRlEXRdzGohRUOWlr+HgCruvwqdDqdUXn2gzwDC'.PHP_EOL.'ytG7eWW+VHM0JpFSFp9nphQdHX2P/oakAm05bDBXmbaoqz0SF8v0q/P0OpaHcMG3'.PHP_EOL.'QK4YgNLQ24EC3b9GY1AE/W7svylhn/2RX5jtgz2hxu5ilRtPLi+Kjfc+XbAbyKjO'.PHP_EOL.'A8iA5xud7hWHhMal7SFtdov5r/zgJU5ZfgnIvHIERYYHo8t8fvg3JfK+HntfoKfc'.PHP_EOL.'/RevatKA8SAQSi/DmL2oN6qrN474a9Si6FCNmBRE/lRKN3XbQg+NWhk/xE9EIA9Q'.PHP_EOL.'FBJSaLZ3IcA1EjfJ0iFMo4R1kJW8iVU27ffB83nmQR4sJcGIO9++jNRsIa646Ruz'.PHP_EOL.'ljPu8Twr3GVT9ejaJym1j+7dcw9bpgpE/qW8a2i+f3b3m8Q0c4kMUJWRwnzX28dW'.PHP_EOL.'omeiIYB/9BfQnvg0ubp+dZugfr7kFwgOXXy4HeoQUCWd5F+UisLZcFmO751O5Nof'.PHP_EOL.'LXha9Uk2NMxQGBVDiBpLVfbCYDO3C/5GTyjqT4om5JkNZURnIfc1p12RhJU404zM'.PHP_EOL.'i64KVuDhwSAs/ZzHGrPwl2fJPY018x0Z/E/g139G8+1MP2RNV7CW6vNhWOiLwILp'.PHP_EOL.'WFXZOByn5S9PpnRid77rl1eLfVVGpBYbxp1ZDeBz00/Whd8mpW3bqV1cX0BV/s9w'.PHP_EOL.'VybvHOvabBkpj4MyTWbWEG9QZ6Dshpvfg4AE5jongDFeJeorHclXbhIXJ1pJJ6+y'.PHP_EOL.'6VKuZQlTeDxNH5bBOHTpinwNmmUJT0wS9/JRJKG0cQPvZqdVGBV7yPDjuT1Nq8n6'.PHP_EOL.'E+ICrQdSaYoZR4q+upY3hsylKIwKYdORypL93gOfhkAjxbQMiW5z2xcFqJRRIi3q'.PHP_EOL.'3uAY05kZTJn5k3gY3FWUxrMHoKJ4ZGGg99GZfDvCrSTZHkFTVDw9KPyOtnzwOB18'.PHP_EOL.'Q2dYIbLoCrjnQ7B+58ZodkPABQPWRShEYGTMjG+RYtV1C2Y/iJlc4tJqfLRG09ks'.PHP_EOL.'aNIf7HS9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAiXbxR0T+C6MT7Jh/SbDJ/1Gd'.PHP_EOL.'vbqskiKmmKnzOcX1x0uUHY4zHIhx3M0neYRr//XOh+FeSwM1JqAPztHy3SMRXzfP'.PHP_EOL.'xzm/nwbRwdK8C/fPy7H+uMV1mKumem8WSoOMOoxFJ+o2nJgyViwnEOu9EejlH1sc'.PHP_EOL.'uKPIoTCLUCInRRhrI84='], + 'x5c' => [ + 'MIIF2jCCBUMCAg3+MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'OTI3MDYwNzQ5WhcNMTcwOTI2MDYwNzQ5WjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wggQiMA0GCSqGSIb3DQEBAQUAA4IEDwAwggQKAoIEAQCrmVwTAbytR+Uj' . PHP_EOL . 'VovqiYBoXlHUMWQIyWUVpDcdTCXAJZg03IrEXUbZ74/djpIVbKnSwV+YNy+55s5j' . PHP_EOL . '8PDcqULvnptBQwRcfpNq5tgNxdooPKt0qAJKi5+OHAeQ2lHPdXGmQsAMlAgd2KN6' . PHP_EOL . 'zYk3d1oYBHFIktyOhJpm+r8sEIgdNMMYRIFck/pG1uMCMaO4tSCZy+SXTb1eXzKW' . PHP_EOL . 'StyJuNPNeY6h3e+KhOdflpk1PVzt6+ayS+LFYbU2Uc6FnUd1eI8cuMrGeviUeX2X' . PHP_EOL . 'G1OOQ1KwX43PRtgcKlZn273yeSC8UDE1SaLBfmcciqjf0ArxhW5WYMZjNj50+0PV' . PHP_EOL . 'S0IFeCP5HKrVw9TrofuQR+9ufWRlEXRdzGohRUOWlr+HgCruvwqdDqdUXn2gzwDC' . PHP_EOL . 'ytG7eWW+VHM0JpFSFp9nphQdHX2P/oakAm05bDBXmbaoqz0SF8v0q/P0OpaHcMG3' . PHP_EOL . 'QK4YgNLQ24EC3b9GY1AE/W7svylhn/2RX5jtgz2hxu5ilRtPLi+Kjfc+XbAbyKjO' . PHP_EOL . 'A8iA5xud7hWHhMal7SFtdov5r/zgJU5ZfgnIvHIERYYHo8t8fvg3JfK+HntfoKfc' . PHP_EOL . '/RevatKA8SAQSi/DmL2oN6qrN474a9Si6FCNmBRE/lRKN3XbQg+NWhk/xE9EIA9Q' . PHP_EOL . 'FBJSaLZ3IcA1EjfJ0iFMo4R1kJW8iVU27ffB83nmQR4sJcGIO9++jNRsIa646Ruz' . PHP_EOL . 'ljPu8Twr3GVT9ejaJym1j+7dcw9bpgpE/qW8a2i+f3b3m8Q0c4kMUJWRwnzX28dW' . PHP_EOL . 'omeiIYB/9BfQnvg0ubp+dZugfr7kFwgOXXy4HeoQUCWd5F+UisLZcFmO751O5Nof' . PHP_EOL . 'LXha9Uk2NMxQGBVDiBpLVfbCYDO3C/5GTyjqT4om5JkNZURnIfc1p12RhJU404zM' . PHP_EOL . 'i64KVuDhwSAs/ZzHGrPwl2fJPY018x0Z/E/g139G8+1MP2RNV7CW6vNhWOiLwILp' . PHP_EOL . 'WFXZOByn5S9PpnRid77rl1eLfVVGpBYbxp1ZDeBz00/Whd8mpW3bqV1cX0BV/s9w' . PHP_EOL . 'VybvHOvabBkpj4MyTWbWEG9QZ6Dshpvfg4AE5jongDFeJeorHclXbhIXJ1pJJ6+y' . PHP_EOL . '6VKuZQlTeDxNH5bBOHTpinwNmmUJT0wS9/JRJKG0cQPvZqdVGBV7yPDjuT1Nq8n6' . PHP_EOL . 'E+ICrQdSaYoZR4q+upY3hsylKIwKYdORypL93gOfhkAjxbQMiW5z2xcFqJRRIi3q' . PHP_EOL . '3uAY05kZTJn5k3gY3FWUxrMHoKJ4ZGGg99GZfDvCrSTZHkFTVDw9KPyOtnzwOB18' . PHP_EOL . 'Q2dYIbLoCrjnQ7B+58ZodkPABQPWRShEYGTMjG+RYtV1C2Y/iJlc4tJqfLRG09ks' . PHP_EOL . 'aNIf7HS9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAiXbxR0T+C6MT7Jh/SbDJ/1Gd' . PHP_EOL . 'vbqskiKmmKnzOcX1x0uUHY4zHIhx3M0neYRr//XOh+FeSwM1JqAPztHy3SMRXzfP' . PHP_EOL . 'xzm/nwbRwdK8C/fPy7H+uMV1mKumem8WSoOMOoxFJ+o2nJgyViwnEOu9EejlH1sc' . PHP_EOL . 'uKPIoTCLUCInRRhrI84=', + ], ], ], [ - __DIR__.'/RSA/DER/16k-rsa-example-cert.der', + __DIR__ . '/RSA/DER/16k-rsa-example-cert.der', [ 'kty' => 'RSA', 'n' => 'tS3aeWW_wzlyXsDNFeBONFNq7W4lNWDjOUseNxx-R9AsqNJEWZFzaTtBI4Cam9Wf_2AlfP6i3RRpK76ooZObKwJmm1ReGcP7gf7JnODQv0W-m9x85a_fwHiI86Dhfy1YNh2zg1DO1kL_Q-sqKMOZ4g6uUfXGXjS5968sKCua3o-GEr-7GM6uw8zgpDmURtpupAFj3X1qCg6cjblPzMzcXdjACP4_zJpLc-sWpqY7pdLa26J5dgFGpTKWS7Xs96AlCPDz4uTRRFKDZarMFtzpjhWhNZyDGuYFFxNL4ca1tm-r4JyL-XuK9BTXC1WNXpqutzHNOj-tO9nCtRX02ZS3hmm1A9xndTZpfQ7lPuSA_kZEohkjcGyxtS-nup9khyMKGwvhg0MJS43VOuYSV6msk_z4dZ3-MCXVlJMTxLqWOSGHxHG0vDJQI5_IXCwkQLrVQIbt_X1ZylUdkmnKm4VuCBt4AHqK1F1jWpNXLYcFY-QW43c2Iln7v1uQFm_82CFHTanrNMBYNax2egYpSXpPS0naF6O1Y8bMPjPBU1jaoBAlfiSjCmHx5MOTg-PU9m1OnnR4XnOdDR0W8rUSS_iYz4Ucivou_7_XCTVlfuieAXT069ibXpGkTE58AgI6piVVYtaxyoADb3zr0a11Br0kS3gKRqxTq5GtgWTpz75VrFxXk8ATfwZF4PcOVX9fkUQStBKY9OGRryswLJbQ0lnz5ZR8QAAw1D2cAoWYoxUol5upjsrYrsGc7Ol3NhPPtoE0Vnxg49xQSZ0hhjhryId07aZ3QBr3NQ0XBoGhSNvO-M7ZyzDTNSUQusS5WyZsZputw_12E5y55_bbMPpKYbnx0aG93wmcna49jXoo5ZUMoJ_BQLaavGC0u-JTLT_subk5tKh3oVgDRevHwYeK1U4L4cdzpOzG8JVpcHyclofESk25DnHiQ92BfB1DR-6YadfQ8a4BXrIFlktDho1EmhXwWdT-dhO4ERPwf2Cx04iP3OdYCU_TNr3gVdB3fQLPkhV1K_od8zWrX7oqCGLkYCP_GUvl84dJoMequlyIO9IHtVpVHzGl-E48JoOHN00ULnoHzWzxUeGtda4twn9NQ-ptEjy9u0_8R-y2UqnC632wEmHpHzFqrOSYixp4GO_zAh-gmIhPJHuoH97vdcDRjGGFPO7kmMI0tBmxkt03ahYIqJKbPynHVLhsTuU7TVYrgTX6JkCR_IbudQTqVdz8oYO6tNqVrU89JI94_5ndJX1Wjmf1LPa8c31IQovBB0e-MlZ-rBkyTEttNuI8xC__OycsLhjAFx_bm0Qf2jfg2IJdLmDjGFHv3RlEdlRmJSyLY_lqKV4GAhjiEIEmduAKbygg2Jqhb6NKzHr1vxhRcWasnuhgTOunlGs3vezu9xz_4CvEKRMT6viU3tzqmGpT3zE7d0w9zMwn2eUlX0j7pKIiznrbkW2Dfe63f9X9bKYAsO5pcqcfAHqVaHl0iFXy5QoFwwjSuWwxKyhaY3tfY2rufLXCOzQ_G7BDoMRns8x6nCR-64Xuvp-EvBw0S790J_u9Z2W98rrW6c1cfn4cb9BRy3Rj64kWqlAUTRu6-qrX2RN5ywhoKfiJDH3m2q_MtgDlR3ke-5KuxaZwfM0hrcCppU5THbOwMe3XoDX-ZjD-3q-ikM8ueu4uTqDjtQrTQioFIxa-3prbNTsxBERQFZwlJtz2GmNHEAjgU-OwkMDObYAGc-ZAZritXe9vGtGFpdowMZ5k0FTUKSIsecPxn-nZlG-_qML8S63NXlU0RdbtYaLwQteFuXl_acAvuxOOnB3nZppJyIStP0uOPGhRowXSlThn0yFDht65TLly171JVrf4oFBDO4Q6EIJ7JMbRXCaEWJmeSNe_k71c3u4elbZ-C2i5JaO6bctZzO-xZ-CP7raQzHXMlpChYXqmpDU5bK2ySAbcDJDvg5WeRmQsqRxsFnI1EK1Jj_BKHZqOPz_q2SYyv69zPTsp5_w9z9YWCbOKP1KHyf9i9n6P5G3QkCzvlTDAbjR6nrrrnva0PZ0SjO4MzDOsIAa9S6vwRnWyE23vVI5RCv-IkLZ075LRkXKcj2EVPrDI3Mb1pUtfGu1H1M7m6V0SOTnaCwimIz3Ju2mwgnR-2lAAJKMd3vUaN1NfbEDuhZoMZfDrWzqOqA8Z2oyv6jHhby3DknbW4pn8tcaPCvScn1wotOeNFDvAfOIxikGEjUuXj-_gV2_dcFVIANseYpdhAS1tJjVX9JBwWcjbHnShy_9Y4f1zzrSwv4UbG7xDEGS1VaDUk5UwTTeeKQKzCkd6nYXxZYRMYDD_DcuGiCG9YvWm9hry1DkfdyCx5Pe8j8KMGUuEtIwLOIfmJDiCmE9fRAY85f9TAXyxkM-P1S_TcScKeSYrxLubX1DTuOGNDFKB4xNf0vi-lCFgLmx8tOr-RY7qtzrwrfcf7Kbpop-B5KpA2PhmoRTtZl4kF7RDeh-ZnUqcfyQcCIv_HewiMOmJ6iQDDjOWbsM8uEhl3ab-FzDYGAeT5bJs4EJAwEhsk28sXqnGzwJDUxw4mdLCYhiuI0ZwGOBUIzXQ-KHaH88PwYuQGLwM-s9uCKqJyO84I6XPe6bnqsL9NWmPhpvFxEZ7MvFCC2Z7nuGswQKpL92_QOS0NibZwzxBDUY7Qm3WsHxFzYm73JenQJGKzZPPLtjhIar7af2qb8KINgWGfIvrxR38osLT0Vg29M0DuMc', 'e' => 'AQAB', 'x5t' => 'XC_s0q4lqNalTFU6tNWR_Szk5dk', 'x5t#256' => '3nz2wIAoSbfVCmvy9k18bCPyIXacd3YfHrGq-qg3DVY', - 'x5c' => ['MIIJ2jCCCUMCAg3/MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'ODIyMDUyOTAyWhcNMTcwODIxMDUyOTAyWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wgggiMA0GCSqGSIb3DQEBAQUAA4IIDwAwgggKAoIIAQC1Ldp5Zb/DOXJe'.PHP_EOL.'wM0V4E40U2rtbiU1YOM5Sx43HH5H0Cyo0kRZkXNpO0EjgJqb1Z//YCV8/qLdFGkr'.PHP_EOL.'vqihk5srAmabVF4Zw/uB/smc4NC/Rb6b3Hzlr9/AeIjzoOF/LVg2HbODUM7WQv9D'.PHP_EOL.'6yoow5niDq5R9cZeNLn3rywoK5rej4YSv7sYzq7DzOCkOZRG2m6kAWPdfWoKDpyN'.PHP_EOL.'uU/MzNxd2MAI/j/Mmktz6xampjul0trbonl2AUalMpZLtez3oCUI8PPi5NFEUoNl'.PHP_EOL.'qswW3OmOFaE1nIMa5gUXE0vhxrW2b6vgnIv5e4r0FNcLVY1emq63Mc06P6072cK1'.PHP_EOL.'FfTZlLeGabUD3Gd1Nml9DuU+5ID+RkSiGSNwbLG1L6e6n2SHIwobC+GDQwlLjdU6'.PHP_EOL.'5hJXqayT/Ph1nf4wJdWUkxPEupY5IYfEcbS8MlAjn8hcLCRAutVAhu39fVnKVR2S'.PHP_EOL.'acqbhW4IG3gAeorUXWNak1cthwVj5BbjdzYiWfu/W5AWb/zYIUdNqes0wFg1rHZ6'.PHP_EOL.'BilJek9LSdoXo7Vjxsw+M8FTWNqgECV+JKMKYfHkw5OD49T2bU6edHhec50NHRby'.PHP_EOL.'tRJL+JjPhRyK+i7/v9cJNWV+6J4BdPTr2JtekaRMTnwCAjqmJVVi1rHKgANvfOvR'.PHP_EOL.'rXUGvSRLeApGrFOrka2BZOnPvlWsXFeTwBN/BkXg9w5Vf1+RRBK0Epj04ZGvKzAs'.PHP_EOL.'ltDSWfPllHxAADDUPZwChZijFSiXm6mOytiuwZzs6Xc2E8+2gTRWfGDj3FBJnSGG'.PHP_EOL.'OGvIh3TtpndAGvc1DRcGgaFI2874ztnLMNM1JRC6xLlbJmxmm63D/XYTnLnn9tsw'.PHP_EOL.'+kphufHRob3fCZydrj2NeijllQygn8FAtpq8YLS74lMtP+y5uTm0qHehWANF68fB'.PHP_EOL.'h4rVTgvhx3Ok7MbwlWlwfJyWh8RKTbkOceJD3YF8HUNH7php19DxrgFesgWWS0OG'.PHP_EOL.'jUSaFfBZ1P52E7gRE/B/YLHTiI/c51gJT9M2veBV0Hd9As+SFXUr+h3zNatfuioI'.PHP_EOL.'YuRgI/8ZS+Xzh0mgx6q6XIg70ge1WlUfMaX4Tjwmg4c3TRQuegfNbPFR4a11ri3C'.PHP_EOL.'f01D6m0SPL27T/xH7LZSqcLrfbASYekfMWqs5JiLGngY7/MCH6CYiE8ke6gf3u91'.PHP_EOL.'wNGMYYU87uSYwjS0GbGS3TdqFgiokps/KcdUuGxO5TtNViuBNfomQJH8hu51BOpV'.PHP_EOL.'3Pyhg7q02pWtTz0kj3j/md0lfVaOZ/Us9rxzfUhCi8EHR74yVn6sGTJMS2024jzE'.PHP_EOL.'L/87JywuGMAXH9ubRB/aN+DYgl0uYOMYUe/dGUR2VGYlLItj+WopXgYCGOIQgSZ2'.PHP_EOL.'4ApvKCDYmqFvo0rMevW/GFFxZqye6GBM66eUaze97O73HP/gK8QpExPq+JTe3OqY'.PHP_EOL.'alPfMTt3TD3MzCfZ5SVfSPukoiLOetuRbYN97rd/1f1spgCw7mlypx8AepVoeXSI'.PHP_EOL.'VfLlCgXDCNK5bDErKFpje19jau58tcI7ND8bsEOgxGezzHqcJH7rhe6+n4S8HDRL'.PHP_EOL.'v3Qn+71nZb3yutbpzVx+fhxv0FHLdGPriRaqUBRNG7r6qtfZE3nLCGgp+IkMfeba'.PHP_EOL.'r8y2AOVHeR77kq7FpnB8zSGtwKmlTlMds7Ax7degNf5mMP7er6KQzy567i5OoOO1'.PHP_EOL.'CtNCKgUjFr7emts1OzEERFAVnCUm3PYaY0cQCOBT47CQwM5tgAZz5kBmuK1d728a'.PHP_EOL.'0YWl2jAxnmTQVNQpIix5w/Gf6dmUb7+owvxLrc1eVTRF1u1hovBC14W5eX9pwC+7'.PHP_EOL.'E46cHedmmknIhK0/S448aFGjBdKVOGfTIUOG3rlMuXLXvUlWt/igUEM7hDoQgnsk'.PHP_EOL.'xtFcJoRYmZ5I17+TvVze7h6Vtn4LaLklo7pty1nM77Fn4I/utpDMdcyWkKFheqak'.PHP_EOL.'NTlsrbJIBtwMkO+DlZ5GZCypHGwWcjUQrUmP8Eodmo4/P+rZJjK/r3M9Oynn/D3P'.PHP_EOL.'1hYJs4o/UofJ/2L2fo/kbdCQLO+VMMBuNHqeuuue9rQ9nRKM7gzMM6wgBr1Lq/BG'.PHP_EOL.'dbITbe9UjlEK/4iQtnTvktGRcpyPYRU+sMjcxvWlS18a7UfUzubpXRI5OdoLCKYj'.PHP_EOL.'Pcm7abCCdH7aUAAkox3e9Ro3U19sQO6Fmgxl8OtbOo6oDxnajK/qMeFvLcOSdtbi'.PHP_EOL.'mfy1xo8K9JyfXCi0540UO8B84jGKQYSNS5eP7+BXb91wVUgA2x5il2EBLW0mNVf0'.PHP_EOL.'kHBZyNsedKHL/1jh/XPOtLC/hRsbvEMQZLVVoNSTlTBNN54pArMKR3qdhfFlhExg'.PHP_EOL.'MP8Ny4aIIb1i9ab2GvLUOR93ILHk97yPwowZS4S0jAs4h+YkOIKYT19EBjzl/1MB'.PHP_EOL.'fLGQz4/VL9NxJwp5JivEu5tfUNO44Y0MUoHjE1/S+L6UIWAubHy06v5Fjuq3OvCt'.PHP_EOL.'9x/spumin4HkqkDY+GahFO1mXiQXtEN6H5mdSpx/JBwIi/8d7CIw6YnqJAMOM5Zu'.PHP_EOL.'wzy4SGXdpv4XMNgYB5PlsmzgQkDASGyTbyxeqcbPAkNTHDiZ0sJiGK4jRnAY4FQj'.PHP_EOL.'NdD4odofzw/Bi5AYvAz6z24IqonI7zgjpc97pueqwv01aY+Gm8XERnsy8UILZnue'.PHP_EOL.'4azBAqkv3b9A5LQ2JtnDPEENRjtCbdawfEXNibvcl6dAkYrNk88u2OEhqvtp/apv'.PHP_EOL.'wog2BYZ8i+vFHfyiwtPRWDb0zQO4xwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADg3'.PHP_EOL.'1Ah8wT/xjIhtUTAIcFGtgN2321aV8pIz8VSJu3CrbJJD09Ek6WUQgTbEq0pxwhQo'.PHP_EOL.'ubkr2+CJ2Gw/FTd0WFet7T57aFg7qh5xraEhH21icHmNBUG7ETUXNEf8TjbhREVY'.PHP_EOL.'gF6l8RI6rrGv0zm5awmcj+4+2OXQ+OM88dV7chMn'], + 'x5c' => [ + 'MIIJ2jCCCUMCAg3/MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'ODIyMDUyOTAyWhcNMTcwODIxMDUyOTAyWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wgggiMA0GCSqGSIb3DQEBAQUAA4IIDwAwgggKAoIIAQC1Ldp5Zb/DOXJe' . PHP_EOL . 'wM0V4E40U2rtbiU1YOM5Sx43HH5H0Cyo0kRZkXNpO0EjgJqb1Z//YCV8/qLdFGkr' . PHP_EOL . 'vqihk5srAmabVF4Zw/uB/smc4NC/Rb6b3Hzlr9/AeIjzoOF/LVg2HbODUM7WQv9D' . PHP_EOL . '6yoow5niDq5R9cZeNLn3rywoK5rej4YSv7sYzq7DzOCkOZRG2m6kAWPdfWoKDpyN' . PHP_EOL . 'uU/MzNxd2MAI/j/Mmktz6xampjul0trbonl2AUalMpZLtez3oCUI8PPi5NFEUoNl' . PHP_EOL . 'qswW3OmOFaE1nIMa5gUXE0vhxrW2b6vgnIv5e4r0FNcLVY1emq63Mc06P6072cK1' . PHP_EOL . 'FfTZlLeGabUD3Gd1Nml9DuU+5ID+RkSiGSNwbLG1L6e6n2SHIwobC+GDQwlLjdU6' . PHP_EOL . '5hJXqayT/Ph1nf4wJdWUkxPEupY5IYfEcbS8MlAjn8hcLCRAutVAhu39fVnKVR2S' . PHP_EOL . 'acqbhW4IG3gAeorUXWNak1cthwVj5BbjdzYiWfu/W5AWb/zYIUdNqes0wFg1rHZ6' . PHP_EOL . 'BilJek9LSdoXo7Vjxsw+M8FTWNqgECV+JKMKYfHkw5OD49T2bU6edHhec50NHRby' . PHP_EOL . 'tRJL+JjPhRyK+i7/v9cJNWV+6J4BdPTr2JtekaRMTnwCAjqmJVVi1rHKgANvfOvR' . PHP_EOL . 'rXUGvSRLeApGrFOrka2BZOnPvlWsXFeTwBN/BkXg9w5Vf1+RRBK0Epj04ZGvKzAs' . PHP_EOL . 'ltDSWfPllHxAADDUPZwChZijFSiXm6mOytiuwZzs6Xc2E8+2gTRWfGDj3FBJnSGG' . PHP_EOL . 'OGvIh3TtpndAGvc1DRcGgaFI2874ztnLMNM1JRC6xLlbJmxmm63D/XYTnLnn9tsw' . PHP_EOL . '+kphufHRob3fCZydrj2NeijllQygn8FAtpq8YLS74lMtP+y5uTm0qHehWANF68fB' . PHP_EOL . 'h4rVTgvhx3Ok7MbwlWlwfJyWh8RKTbkOceJD3YF8HUNH7php19DxrgFesgWWS0OG' . PHP_EOL . 'jUSaFfBZ1P52E7gRE/B/YLHTiI/c51gJT9M2veBV0Hd9As+SFXUr+h3zNatfuioI' . PHP_EOL . 'YuRgI/8ZS+Xzh0mgx6q6XIg70ge1WlUfMaX4Tjwmg4c3TRQuegfNbPFR4a11ri3C' . PHP_EOL . 'f01D6m0SPL27T/xH7LZSqcLrfbASYekfMWqs5JiLGngY7/MCH6CYiE8ke6gf3u91' . PHP_EOL . 'wNGMYYU87uSYwjS0GbGS3TdqFgiokps/KcdUuGxO5TtNViuBNfomQJH8hu51BOpV' . PHP_EOL . '3Pyhg7q02pWtTz0kj3j/md0lfVaOZ/Us9rxzfUhCi8EHR74yVn6sGTJMS2024jzE' . PHP_EOL . 'L/87JywuGMAXH9ubRB/aN+DYgl0uYOMYUe/dGUR2VGYlLItj+WopXgYCGOIQgSZ2' . PHP_EOL . '4ApvKCDYmqFvo0rMevW/GFFxZqye6GBM66eUaze97O73HP/gK8QpExPq+JTe3OqY' . PHP_EOL . 'alPfMTt3TD3MzCfZ5SVfSPukoiLOetuRbYN97rd/1f1spgCw7mlypx8AepVoeXSI' . PHP_EOL . 'VfLlCgXDCNK5bDErKFpje19jau58tcI7ND8bsEOgxGezzHqcJH7rhe6+n4S8HDRL' . PHP_EOL . 'v3Qn+71nZb3yutbpzVx+fhxv0FHLdGPriRaqUBRNG7r6qtfZE3nLCGgp+IkMfeba' . PHP_EOL . 'r8y2AOVHeR77kq7FpnB8zSGtwKmlTlMds7Ax7degNf5mMP7er6KQzy567i5OoOO1' . PHP_EOL . 'CtNCKgUjFr7emts1OzEERFAVnCUm3PYaY0cQCOBT47CQwM5tgAZz5kBmuK1d728a' . PHP_EOL . '0YWl2jAxnmTQVNQpIix5w/Gf6dmUb7+owvxLrc1eVTRF1u1hovBC14W5eX9pwC+7' . PHP_EOL . 'E46cHedmmknIhK0/S448aFGjBdKVOGfTIUOG3rlMuXLXvUlWt/igUEM7hDoQgnsk' . PHP_EOL . 'xtFcJoRYmZ5I17+TvVze7h6Vtn4LaLklo7pty1nM77Fn4I/utpDMdcyWkKFheqak' . PHP_EOL . 'NTlsrbJIBtwMkO+DlZ5GZCypHGwWcjUQrUmP8Eodmo4/P+rZJjK/r3M9Oynn/D3P' . PHP_EOL . '1hYJs4o/UofJ/2L2fo/kbdCQLO+VMMBuNHqeuuue9rQ9nRKM7gzMM6wgBr1Lq/BG' . PHP_EOL . 'dbITbe9UjlEK/4iQtnTvktGRcpyPYRU+sMjcxvWlS18a7UfUzubpXRI5OdoLCKYj' . PHP_EOL . 'Pcm7abCCdH7aUAAkox3e9Ro3U19sQO6Fmgxl8OtbOo6oDxnajK/qMeFvLcOSdtbi' . PHP_EOL . 'mfy1xo8K9JyfXCi0540UO8B84jGKQYSNS5eP7+BXb91wVUgA2x5il2EBLW0mNVf0' . PHP_EOL . 'kHBZyNsedKHL/1jh/XPOtLC/hRsbvEMQZLVVoNSTlTBNN54pArMKR3qdhfFlhExg' . PHP_EOL . 'MP8Ny4aIIb1i9ab2GvLUOR93ILHk97yPwowZS4S0jAs4h+YkOIKYT19EBjzl/1MB' . PHP_EOL . 'fLGQz4/VL9NxJwp5JivEu5tfUNO44Y0MUoHjE1/S+L6UIWAubHy06v5Fjuq3OvCt' . PHP_EOL . '9x/spumin4HkqkDY+GahFO1mXiQXtEN6H5mdSpx/JBwIi/8d7CIw6YnqJAMOM5Zu' . PHP_EOL . 'wzy4SGXdpv4XMNgYB5PlsmzgQkDASGyTbyxeqcbPAkNTHDiZ0sJiGK4jRnAY4FQj' . PHP_EOL . 'NdD4odofzw/Bi5AYvAz6z24IqonI7zgjpc97pueqwv01aY+Gm8XERnsy8UILZnue' . PHP_EOL . '4azBAqkv3b9A5LQ2JtnDPEENRjtCbdawfEXNibvcl6dAkYrNk88u2OEhqvtp/apv' . PHP_EOL . 'wog2BYZ8i+vFHfyiwtPRWDb0zQO4xwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADg3' . PHP_EOL . '1Ah8wT/xjIhtUTAIcFGtgN2321aV8pIz8VSJu3CrbJJD09Ek6WUQgTbEq0pxwhQo' . PHP_EOL . 'ubkr2+CJ2Gw/FTd0WFet7T57aFg7qh5xraEhH21icHmNBUG7ETUXNEf8TjbhREVY' . PHP_EOL . 'gF6l8RI6rrGv0zm5awmcj+4+2OXQ+OM88dV7chMn', + ], ], ], [ - __DIR__.'/RSA/DER/32k-rsa-example-cert.der', + __DIR__ . '/RSA/DER/32k-rsa-example-cert.der', [ 'kty' => 'RSA', 'n' => 'qzPFsFIf3cSes25DloV3y3d8gKMcZVE_EQ_6e_MZnyqDbuOEP39yQs3aunzbZRoO8Xw8lLoJNduiKKsco7odI753kBvz1eLyke-sWBVZttbnYyz9AE3ZXfAb9rHW2AxgIqHNsQOsLJS_douGZwxawNdE90WM4QG80bDpkxxHfObtmZIbZoOFSeokDHA5jokQGzJ65t6ARtQOIht84pIlAr8RO0vCUiJ0R4TdAffbdIukMcVfSoZBlZJ_q-yBtPoqB1Nmr1x1FqCtR81NrEtdp7CUHy4yLIskMzHTwJL24dx8zPS9RBIAuR6HO6soQwQgKY5NYmyaZGuWDrzw0Lor9_jjcx3x7NlXEUffGyUdT_bZ6owsgd-SpvnbqXPXIf-u5JH7afSUuajytHnGVilQOpEg06B0F-AumUEx8vdLPczCx0CED11mhRhT1eRQPJlzxgqA22SN1Yz0P55R8QbfFYcflpEtZbHmdvwMSipEoEUyI8aA9z268oNVnnAGhG3cOqk8-4HOvtqZ9LIc8jUcQLtWX-PJav9EePnWuV6pFwzvKcwl09m08xIfIh9DvFVJz3Fks-X6c1tVo2Valftlj8fnlzu9WgownkwhM4KN2UpcHcff4G-v9zckhcpROSzZ1ax5mPOUMF6B2OVawMhf3li9A9JEpBDxVu2-gZU6NbhvfH1f4PdNPUnlasPylHn4qz4S6_V1fuxho-2O_V72w3V5FDBi-m2D9vDVQvJtuoiJxUEyOWaxsenuzoFlq3jNHwm0SiabwVjaMyre4qktmHopLuLX2ixME3rbTtaXLAaly-t2X6oS4nFyhwP9f_WbJb4Yh_RDxksPj1hR_4nH43NTYjZBlLDM0YRb4xRzFmATQOUhPou6LSUbl8Tl2z7WYFzlcKgHwkWRaTGUV8Sz_h-_IfgZDvCtyyLhzvWOmfJBhsV1nTbDrr8DivZGH5huBNH88v_gbCVw36aAjH8BnmcHQ0ImUUwXoiB1iWSWB3x1xdYnAyQf5RV2PK86wVc4EBRxW6MeJHWZr-kFgHtcwk2ys8MewL8xlKs1S64APAWtD-WsLGEnUVMfM5EuWjoS9kB4BI4DC6M0uyDjaCuFu80wMmWfx9C3-Y2x7l5Lw0G4gRcUk-F3ONtKfsxMqAmV6aUVkXmdkX5LLa105CpIVqflM40CPl5mlVGEFlTf9u0zclyQ0_-qWt78ZzkpolPj9XKHikdYA_DKbvtfgtgNC07GIwBctoQsOrKGOxigeWzrAwfS9S5Wt7hvcs2R0Y04rXoeSTPbHWLumsJYLxC2HPtam3IxQJzCljIOFB5Sqi9WLO5l_yjmUGS2Fzy5DkuyFuC3o79rB-Vu0zpHQ5sHdbyYkfvi3QZx4jLuj2ki-3_1Qj7RfVdd1yWeudnFUy5QGfWh3-VoaK9UIZ1EeX62owXTGNOJovn9yMdwbXmy75qrkPXadFQG3lnuqq_Ucd8ZAYJvwfQb6uhTSv1kSFCpxyyaSBYjLU44QDF6FRh_QHLMBM2DVasOT0hsF2UWsIXUneoJHk_qVZSRmj5EDaIrWAUEZfL_geiwcW3_L3Y9iaHMkB93fHNsVEpLmTO-vLHZHYN0c-kKNVBw_40xGZ5ZgPJlT4JZVvBKuB2ka2OsSLcRXZvzZZZTnrRHb_9dngGkFpI0gc6gFu2d1mPIIFp6JS7AJ4_sYKE4yxuGG7IsA4ErnNBEK9Sr1XSu0_KfcIv63dm_AybDg1vmqMLCl5EiP9OIFsWdIM42970PH9h8Ri7KUn0D53RSRVkV38NW312A2JYCHfEfbIxyibEIrsusib98x6Bedh-3BpsWyih2XlDT6AFwJdD0cc_Uf56Vqv9waUtsSx-1xBwliZ35MKq-IfV6hcLnFgLhxsqakV8aFLAEzI8Ulned6zjRAC28aaDOZcFdKEMD0wHPUW8-9UTQxAgug8otEITWSkKubyXbdofpVa9Xwjq1-jLb4eylqey0RokKrHO6B7F3KtUF8Zsm0mGEg7nvUhjEBFL3AqkLke5Nb_78uqb3tzZF3iO6ghENar9s1DUIYqNkbMSeh7smgER_PBUB0MGMqRnx8qcr5t5yBEurZ7qq7-LYoJOoc6UwaPrQN_AFRou4ugiRrxIrvOwrDPr4y2zoi9XKnBBuYMnt2AkGVCNIA0WOKgmex4x_2Nri2JlRieAPwNPfW5PLkyPVRfw0dNzhg7csMl1Wctdw1JpHJhgMswuhYhRWGyzYWE4ZU8lvQWqA42MOKfUixAV4LmEzGz2eRQSPGWjLC85-mcxf_vssmD-mbuJAjzlLDzzwllrTDCQrt18DftpAAHhD5hG2HmQH9RDzcS3sniIx4p2zyqBHVQsWM74BlQjbODjgHRHerTgxYaNmh4KRA38lmb9omrUhI2Q0Lj5CF2of_Apd7fo8u6LpBpdEtirkn_7-9vPPiGerClV6lSjoNi_I_hHCneAq-3KZq7hM5XliJPvUrws_m0X5n6_fazdk-gOohEuF0Aq_1I5633sS-DGrFyan2K7oeoBGQN994-kweTR0lLko14nC5wnvizbsv7sDUNJTjM7LMYIrhKEILTjjGQ6WuCkYhQuM4RAnx74jFIchW8pS1tEnUcIOyBWgFB9M2zdbNmJg7vH43mmX408jMYVKs9CQz2Y7Vu33S0dSp9sWxM1KUREFVy1xTbVgKNxLxOzXiLOjm_b4EifAHZh_KTf0POm5RESU-TSrO29y5puTHL-PLuOE30jrxXaKhW5UzmQLUMhBGI7geYP6fE6QxyUi0gD_tLdMmzxTlZiOXkE6HnBQ-3Ar54uA-RFUhnzU-XT3wm--eINsvqyrHCyLQlmM71aBXnMlH5g0NJjdm42XSecTopWfFCfcNe1-ufpUuMGGg0C3LxVN5fkTmB2_6gai0AHh4dNhefGkKCZ5OcSNtA_UUI1nKr_wgPTI4X1catN9RE9mMYhOt-I5gOVRCihxDcUcBl2apUaFK-jHPs5rABqhykbi_dOS-zy42I86Vcu4B-_0GNlRIPRLZWFIhNRy_kfCOq4kb4SK9DjTvHsaq6YWMoL9Jk3JiqvH4yrMZ6T-XEFdJ8DGSc41lo1YJwhFUu0eGbGFKxyUBrHv1l9ByPrqWaiepnBBsda4y8G3SoiCfndwkbvLeE5ykYgurPpkYX_bau2PqsoAkiJ_GmbitKpXD71C5PmzvzLvpxkgC6hQq-v4L4WLelADvBpeikX9k23qhR5H3mkzNeMZgHyoFisy161cDgOlcg64g6C2UzJKlb5C1tOlQwM3fdm7cjBJXOjuxgi8Ewx6ov90eeaqIEfFvnUu1_IC_tFve9P_Us21Ak53vwStlHueYHtedJsHg84C5Ppt_z1LFR3Hh8m1pOnlb3kJw5eGpvsXweZrIIN0cvwz-NZ_orIxjPxLf23wy-y-lhObK17BfX1g-p759XtRSaG4Rj_QedauXHAA-SKgvwAOY3kBuWo9Oxx73JbC1kov55TkecHj2lXO_o49O5LCOa_h0nHIVb3JIGWot11sF_6zwNzFM2WtHFNu7Iu9hllumC8rvz3HEbylvSPQYzBQKy8NSyC6T9wbH6cAYY-vl59q1J4DwBH3DHKoMAec8InlnBO_ekJa8SMdQMZxov0BaxJc0W__29w2Sza0cBsMslfpRIWRWMb4jNpyvCyEVxrGf7AakOl0_9P3JCQ2o8cuf-BGg_z_iQ3aTMYVWi_pWuxnhh5NchjQU8C3dxvnEd0Te9mmDlvZh-N9GULo0tlzHz3WZniUp7mxVQ3nkeS31M0LIIF3SetSMjXrGJ_4bzAnb3EjH44eFuvgOiJ8ChXLCmHLtIpFa0WSC6YVpBxqfPrxke-DyB2Lvz_46MSQ4iKvCFhdYWxBtwXCZDN5Dt4XFpMknL_VnuVU8a5_rRqpEebv_VF1pBZsvfTK6UXFWAApFvL4ebApuLsFInG3uk89N2SbenTTiBGWZWZjsEFsvf3iSFZdQ2bgKSLmJIsuXV1mUPkzGEr8SsPLDKhGNZBevtka-CfnukEPn7a3K_O5sYcccEtYwx0VNiC6dWu7B_-pflffa1m4pbhdg6KfykDO9_jU_LE692dhWUzbv977zGUlOnmsEMeqmSTo9V5Hv0UsEDGEjoe9piKidoZ8JdAq1WIpSBfW9M2wtkZHbi2nlaBnKJuTaaNs_nWjbG4y73hEqEqRlQMKrLsJU7rsmy3h6x6-J_tXfkKpWu_Z_PhR-ca2RV4ldwUNejBhBomg-6bcSq1lHXGTpwc0wSDmIUfE2W6ZZysaFpmGpTDFjTDqfeeAwwbzShK7Uc-OnJVNiQ5w1KALJNjXURSfI61vyWRBMtFHaC7t6ixwDfv6pqEa0xeDe4xf4Z1qdX1Zfs4xpdAyzZWmslUsXIYDtiTXq6NYGjnCEPYqneVGOWhP6re0UfzeqqB6p6_L42UoqFrrjU7jnEWRlz6gxdU9qOJgLX3u6CIYtN6b44tpsqA23fNBiuf4SqoYimbd2YVjXFRFFNZ2XqJ-wBqYcD5xIfudMN6W5cAD4p5cTQ11_-EqIp8rDxiWOs-PN8SQTIE7ZYQ6na-lSITpchNybreE9SqhzluoY71DN8oQuUJHonrAW5Hh_VroGBxpbO9XdNhw0XrC-S9iH9DDEUedanM2DznPUZsHHutG8H0K9AEyWRS01sAwrF73ZG57qy5IciYMHZuFbkY0lzwbF-vd15jgNfP4JTmZD2sVWwVgI7Qp9T2hd0uuZL_huHl2baRCyC_DSI9c6p3q9Ud_tBN_yCcNcUVx0rS6EGfzM8VYOGwyiBVBAgVDjBXiKBsUVWA3ljfOtYhLKBDHkqhvoQaczSI2fKX7L7cwgXeBdckoaNhno6mCpZBamuyBZ1Iy6TnguQi59MCCKdiczIpfeumbSDEovy2IbQmPqld_JI6WOufgldiITu3hXR5KNazan2mc3NrKu1SEXZpdzb4wJZZ26U_1xE2GLMJru05yZoVNEkN72DhagM1R5oqHwPzRcn3ahdYvUzDoP6UHEpa76A23lqafY7F98l66hmAnXXlEKzEVwthYoxWANYtVsxs9NktNJdNMB3OCMnCo9BWkefmjlrzMJSkBP_1mfxN2o3W1tMNXpk5OQPO20_eWPF3iYhobSo8fcxzXtw9bg1BXr0TADj0hl_z4jw93wVGGLlsA3qYstay0I9yJgHBZmhxc7V1JzNWdwxIDmRgA5eCm1ELVBxpIup9WGZlUs1rzwqXzI-37i7l3dwFfCf_i2g8m-gNQjuM6YqkSz-XKcn-sJEg1XSMhoB15sgYE9U-2Oe-_EGLK0dOU2zyHO40F8ghvhKWpuAcITX_QnEMremwsiCl0PEnGZ98BXzlRvd1MFNc0ZUwzN-wTVxs4jNkteNbp0MjIKA5Y6FiCEX6koNWY9cLXSNg4XG4IsWRQrfIn2WWFz_nhzlaZNm_NUM1kmKRREPmsvQ', 'e' => 'AQAB', 'x5t' => 'KGApLybHWJmBwZGgBk07AlRD9nU', 'x5t#256' => 'YD12k6kc4xuh_5vEHMyyOFpGs6VqTyaKMlxg0Nt2crA', - 'x5c' => ['MIIR2jCCEUMCAg4EMA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIx'.PHP_EOL.'MDEwMTIxNzQ5WhcNMTcxMDA5MTIxNzQ5WjBKMQswCQYDVQQGDAJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wghAiMA0GCSqGSIb3DQEBAQUAA4IQDwAwghAKAoIQAQCrM8WwUh/dxJ6z'.PHP_EOL.'bkOWhXfLd3yAoxxlUT8RD/p78xmfKoNu44Q/f3JCzdq6fNtlGg7xfDyUugk126Io'.PHP_EOL.'qxyjuh0jvneQG/PV4vKR76xYFVm21udjLP0ATdld8Bv2sdbYDGAioc2xA6wslL92'.PHP_EOL.'i4ZnDFrA10T3RYzhAbzRsOmTHEd85u2Zkhtmg4VJ6iQMcDmOiRAbMnrm3oBG1A4i'.PHP_EOL.'G3zikiUCvxE7S8JSInRHhN0B99t0i6QxxV9KhkGVkn+r7IG0+ioHU2avXHUWoK1H'.PHP_EOL.'zU2sS12nsJQfLjIsiyQzMdPAkvbh3HzM9L1EEgC5Hoc7qyhDBCApjk1ibJpka5YO'.PHP_EOL.'vPDQuiv3+ONzHfHs2VcRR98bJR1P9tnqjCyB35Km+dupc9ch/67kkftp9JS5qPK0'.PHP_EOL.'ecZWKVA6kSDToHQX4C6ZQTHy90s9zMLHQIQPXWaFGFPV5FA8mXPGCoDbZI3VjPQ/'.PHP_EOL.'nlHxBt8Vhx+WkS1lseZ2/AxKKkSgRTIjxoD3Pbryg1WecAaEbdw6qTz7gc6+2pn0'.PHP_EOL.'shzyNRxAu1Zf48lq/0R4+da5XqkXDO8pzCXT2bTzEh8iH0O8VUnPcWSz5fpzW1Wj'.PHP_EOL.'ZVqV+2WPx+eXO71aCjCeTCEzgo3ZSlwdx9/gb6/3NySFylE5LNnVrHmY85QwXoHY'.PHP_EOL.'5VrAyF/eWL0D0kSkEPFW7b6BlTo1uG98fV/g9009SeVqw/KUefirPhLr9XV+7GGj'.PHP_EOL.'7Y79XvbDdXkUMGL6bYP28NVC8m26iInFQTI5ZrGx6e7OgWWreM0fCbRKJpvBWNoz'.PHP_EOL.'Kt7iqS2Yeiku4tfaLEwTettO1pcsBqXL63ZfqhLicXKHA/1/9ZslvhiH9EPGSw+P'.PHP_EOL.'WFH/icfjc1NiNkGUsMzRhFvjFHMWYBNA5SE+i7otJRuXxOXbPtZgXOVwqAfCRZFp'.PHP_EOL.'MZRXxLP+H78h+BkO8K3LIuHO9Y6Z8kGGxXWdNsOuvwOK9kYfmG4E0fzy/+BsJXDf'.PHP_EOL.'poCMfwGeZwdDQiZRTBeiIHWJZJYHfHXF1icDJB/lFXY8rzrBVzgQFHFbox4kdZmv'.PHP_EOL.'6QWAe1zCTbKzwx7AvzGUqzVLrgA8Ba0P5awsYSdRUx8zkS5aOhL2QHgEjgMLozS7'.PHP_EOL.'IONoK4W7zTAyZZ/H0Lf5jbHuXkvDQbiBFxST4Xc420p+zEyoCZXppRWReZ2Rfkst'.PHP_EOL.'rXTkKkhWp+UzjQI+XmaVUYQWVN/27TNyXJDT/6pa3vxnOSmiU+P1coeKR1gD8Mpu'.PHP_EOL.'+1+C2A0LTsYjAFy2hCw6soY7GKB5bOsDB9L1Lla3uG9yzZHRjTiteh5JM9sdYu6a'.PHP_EOL.'wlgvELYc+1qbcjFAnMKWMg4UHlKqL1Ys7mX/KOZQZLYXPLkOS7IW4Lejv2sH5W7T'.PHP_EOL.'OkdDmwd1vJiR++LdBnHiMu6PaSL7f/VCPtF9V13XJZ652cVTLlAZ9aHf5Whor1Qh'.PHP_EOL.'nUR5frajBdMY04mi+f3Ix3BtebLvmquQ9dp0VAbeWe6qr9Rx3xkBgm/B9Bvq6FNK'.PHP_EOL.'/WRIUKnHLJpIFiMtTjhAMXoVGH9AcswEzYNVqw5PSGwXZRawhdSd6gkeT+pVlJGa'.PHP_EOL.'PkQNoitYBQRl8v+B6LBxbf8vdj2JocyQH3d8c2xUSkuZM768sdkdg3Rz6Qo1UHD/'.PHP_EOL.'jTEZnlmA8mVPgllW8Eq4HaRrY6xItxFdm/NlllOetEdv/12eAaQWkjSBzqAW7Z3W'.PHP_EOL.'Y8ggWnolLsAnj+xgoTjLG4YbsiwDgSuc0EQr1KvVdK7T8p9wi/rd2b8DJsODW+ao'.PHP_EOL.'wsKXkSI/04gWxZ0gzjb3vQ8f2HxGLspSfQPndFJFWRXfw1bfXYDYlgId8R9sjHKJ'.PHP_EOL.'sQiuy6yJv3zHoF52H7cGmxbKKHZeUNPoAXAl0PRxz9R/npWq/3BpS2xLH7XEHCWJ'.PHP_EOL.'nfkwqr4h9XqFwucWAuHGypqRXxoUsATMjxSWd53rONEALbxpoM5lwV0oQwPTAc9R'.PHP_EOL.'bz71RNDECC6Dyi0QhNZKQq5vJdt2h+lVr1fCOrX6Mtvh7KWp7LRGiQqsc7oHsXcq'.PHP_EOL.'1QXxmybSYYSDue9SGMQEUvcCqQuR7k1v/vy6pve3NkXeI7qCEQ1qv2zUNQhio2Rs'.PHP_EOL.'xJ6HuyaARH88FQHQwYypGfHypyvm3nIES6tnuqrv4tigk6hzpTBo+tA38AVGi7i6'.PHP_EOL.'CJGvEiu87CsM+vjLbOiL1cqcEG5gye3YCQZUI0gDRY4qCZ7HjH/Y2uLYmVGJ4A/A'.PHP_EOL.'099bk8uTI9VF/DR03OGDtywyXVZy13DUmkcmGAyzC6FiFFYbLNhYThlTyW9BaoDj'.PHP_EOL.'Yw4p9SLEBXguYTMbPZ5FBI8ZaMsLzn6ZzF/++yyYP6Zu4kCPOUsPPPCWWtMMJCu3'.PHP_EOL.'XwN+2kAAeEPmEbYeZAf1EPNxLeyeIjHinbPKoEdVCxYzvgGVCNs4OOAdEd6tODFh'.PHP_EOL.'o2aHgpEDfyWZv2iatSEjZDQuPkIXah/8Cl3t+jy7oukGl0S2KuSf/v7288+IZ6sK'.PHP_EOL.'VXqVKOg2L8j+EcKd4Cr7cpmruEzleWIk+9SvCz+bRfmfr99rN2T6A6iES4XQCr/U'.PHP_EOL.'jnrfexL4MasXJqfYruh6gEZA333j6TB5NHSUuSjXicLnCe+LNuy/uwNQ0lOMzssx'.PHP_EOL.'giuEoQgtOOMZDpa4KRiFC4zhECfHviMUhyFbylLW0SdRwg7IFaAUH0zbN1s2YmDu'.PHP_EOL.'8fjeaZfjTyMxhUqz0JDPZjtW7fdLR1Kn2xbEzUpREQVXLXFNtWAo3EvE7NeIs6Ob'.PHP_EOL.'9vgSJ8AdmH8pN/Q86blERJT5NKs7b3Lmm5Mcv48u44TfSOvFdoqFblTOZAtQyEEY'.PHP_EOL.'juB5g/p8TpDHJSLSAP+0t0ybPFOVmI5eQToecFD7cCvni4D5EVSGfNT5dPfCb754'.PHP_EOL.'g2y+rKscLItCWYzvVoFecyUfmDQ0mN2bjZdJ5xOilZ8UJ9w17X65+lS4wYaDQLcv'.PHP_EOL.'FU3l+ROYHb/qBqLQAeHh02F58aQoJnk5xI20D9RQjWcqv/CA9MjhfVxq031ET2Yx'.PHP_EOL.'iE634jmA5VEKKHENxRwGXZqlRoUr6Mc+zmsAGqHKRuL905L7PLjYjzpVy7gH7/QY'.PHP_EOL.'2VEg9EtlYUiE1HL+R8I6riRvhIr0ONO8exqrphYygv0mTcmKq8fjKsxnpP5cQV0n'.PHP_EOL.'wMZJzjWWjVgnCEVS7R4ZsYUrHJQGse/WX0HI+upZqJ6mcEGx1rjLwbdKiIJ+d3CR'.PHP_EOL.'u8t4TnKRiC6s+mRhf9tq7Y+qygCSIn8aZuK0qlcPvULk+bO/Mu+nGSALqFCr6/gv'.PHP_EOL.'hYt6UAO8Gl6KRf2TbeqFHkfeaTM14xmAfKgWKzLXrVwOA6VyDriDoLZTMkqVvkLW'.PHP_EOL.'06VDAzd92btyMElc6O7GCLwTDHqi/3R55qogR8W+dS7X8gL+0W970/9SzbUCTne/'.PHP_EOL.'BK2Ue55ge150mweDzgLk+m3/PUsVHceHybWk6eVveQnDl4am+xfB5msgg3Ry/DP4'.PHP_EOL.'1n+isjGM/Et/bfDL7L6WE5srXsF9fWD6nvn1e1FJobhGP9B51q5ccAD5IqC/AA5j'.PHP_EOL.'eQG5aj07HHvclsLWSi/nlOR5wePaVc7+jj07ksI5r+HScchVvckgZai3XWwX/rPA'.PHP_EOL.'3MUzZa0cU27si72GWW6YLyu/PccRvKW9I9BjMFArLw1LILpP3BsfpwBhj6+Xn2rU'.PHP_EOL.'ngPAEfcMcqgwB5zwieWcE796QlrxIx1AxnGi/QFrElzRb//b3DZLNrRwGwyyV+lE'.PHP_EOL.'hZFYxviM2nK8LIRXGsZ/sBqQ6XT/0/ckJDajxy5/4EaD/P+JDdpMxhVaL+la7GeG'.PHP_EOL.'Hk1yGNBTwLd3G+cR3RN72aYOW9mH430ZQujS2XMfPdZmeJSnubFVDeeR5LfUzQsg'.PHP_EOL.'gXdJ61IyNesYn/hvMCdvcSMfjh4W6+A6InwKFcsKYcu0ikVrRZILphWkHGp8+vGR'.PHP_EOL.'74PIHYu/P/joxJDiIq8IWF1hbEG3BcJkM3kO3hcWkyScv9We5VTxrn+tGqkR5u/9'.PHP_EOL.'UXWkFmy99MrpRcVYACkW8vh5sCm4uwUicbe6Tz03ZJt6dNOIEZZlZmOwQWy9/eJI'.PHP_EOL.'Vl1DZuApIuYkiy5dXWZQ+TMYSvxKw8sMqEY1kF6+2Rr4J+e6QQ+ftrcr87mxhxxw'.PHP_EOL.'S1jDHRU2ILp1a7sH/6l+V99rWbiluF2Dop/KQM73+NT8sTr3Z2FZTNu/3vvMZSU6'.PHP_EOL.'eawQx6qZJOj1Xke/RSwQMYSOh72mIqJ2hnwl0CrVYilIF9b0zbC2RkduLaeVoGco'.PHP_EOL.'m5Npo2z+daNsbjLveESoSpGVAwqsuwlTuuybLeHrHr4n+1d+Qqla79n8+FH5xrZF'.PHP_EOL.'XiV3BQ16MGEGiaD7ptxKrWUdcZOnBzTBIOYhR8TZbplnKxoWmYalMMWNMOp954DD'.PHP_EOL.'BvNKErtRz46clU2JDnDUoAsk2NdRFJ8jrW/JZEEy0UdoLu3qLHAN+/qmoRrTF4N7'.PHP_EOL.'jF/hnWp1fVl+zjGl0DLNlaayVSxchgO2JNero1gaOcIQ9iqd5UY5aE/qt7RR/N6q'.PHP_EOL.'oHqnr8vjZSioWuuNTuOcRZGXPqDF1T2o4mAtfe7oIhi03pvji2myoDbd80GK5/hK'.PHP_EOL.'qhiKZt3ZhWNcVEUU1nZeon7AGphwPnEh+50w3pblwAPinlxNDXX/4SoinysPGJY6'.PHP_EOL.'z483xJBMgTtlhDqdr6VIhOlyE3Jut4T1KqHOW6hjvUM3yhC5QkeiesBbkeH9WugY'.PHP_EOL.'HGls71d02HDResL5L2If0MMRR51qczYPOc9Rmwce60bwfQr0ATJZFLTWwDCsXvdk'.PHP_EOL.'bnurLkhyJgwdm4VuRjSXPBsX693XmOA18/glOZkPaxVbBWAjtCn1PaF3S65kv+G4'.PHP_EOL.'eXZtpELIL8NIj1zqner1R3+0E3/IJw1xRXHStLoQZ/MzxVg4bDKIFUECBUOMFeIo'.PHP_EOL.'GxRVYDeWN861iEsoEMeSqG+hBpzNIjZ8pfsvtzCBd4F1ySho2GejqYKlkFqa7IFn'.PHP_EOL.'UjLpOeC5CLn0wIIp2JzMil966ZtIMSi/LYhtCY+qV38kjpY65+CV2IhO7eFdHko1'.PHP_EOL.'rNqfaZzc2sq7VIRdml3NvjAllnbpT/XETYYswmu7TnJmhU0SQ3vYOFqAzVHmiofA'.PHP_EOL.'/NFyfdqF1i9TMOg/pQcSlrvoDbeWpp9jsX3yXrqGYCddeUQrMRXC2FijFYA1i1Wz'.PHP_EOL.'Gz02S00l00wHc4IycKj0FaR5+aOWvMwlKQE//WZ/E3ajdbW0w1emTk5A87bT95Y8'.PHP_EOL.'XeJiGhtKjx9zHNe3D1uDUFevRMAOPSGX/PiPD3fBUYYuWwDepiy1rLQj3ImAcFma'.PHP_EOL.'HFztXUnM1Z3DEgOZGADl4KbUQtUHGki6n1YZmVSzWvPCpfMj7fuLuXd3AV8J/+La'.PHP_EOL.'Dyb6A1CO4zpiqRLP5cpyf6wkSDVdIyGgHXmyBgT1T7Y5778QYsrR05TbPIc7jQXy'.PHP_EOL.'CG+Epam4BwhNf9CcQyt6bCyIKXQ8ScZn3wFfOVG93UwU1zRlTDM37BNXGziM2S14'.PHP_EOL.'1unQyMgoDljoWIIRfqSg1Zj1wtdI2DhcbgixZFCt8ifZZYXP+eHOVpk2b81QzWSY'.PHP_EOL.'pFEQ+ay9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEATPINk/17H+RLz459iCVQAGes'.PHP_EOL.'8kc5sxYj3CkMlWrGMiCxvsgu2kak6dCa0f3DfiVt54Fry7s0OklHiZmipoiF4RCt'.PHP_EOL.'yJwUSAzRrZFAbkpDg8oIu4Ui/Bt13kY7xON+u4m0IgkLZSE+8BSjMrfjVvVxe+qH'.PHP_EOL.'5i7X/ibUTDjgyfdA8XI='], + 'x5c' => [ + 'MIIR2jCCEUMCAg4EMA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIx' . PHP_EOL . 'MDEwMTIxNzQ5WhcNMTcxMDA5MTIxNzQ5WjBKMQswCQYDVQQGDAJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wghAiMA0GCSqGSIb3DQEBAQUAA4IQDwAwghAKAoIQAQCrM8WwUh/dxJ6z' . PHP_EOL . 'bkOWhXfLd3yAoxxlUT8RD/p78xmfKoNu44Q/f3JCzdq6fNtlGg7xfDyUugk126Io' . PHP_EOL . 'qxyjuh0jvneQG/PV4vKR76xYFVm21udjLP0ATdld8Bv2sdbYDGAioc2xA6wslL92' . PHP_EOL . 'i4ZnDFrA10T3RYzhAbzRsOmTHEd85u2Zkhtmg4VJ6iQMcDmOiRAbMnrm3oBG1A4i' . PHP_EOL . 'G3zikiUCvxE7S8JSInRHhN0B99t0i6QxxV9KhkGVkn+r7IG0+ioHU2avXHUWoK1H' . PHP_EOL . 'zU2sS12nsJQfLjIsiyQzMdPAkvbh3HzM9L1EEgC5Hoc7qyhDBCApjk1ibJpka5YO' . PHP_EOL . 'vPDQuiv3+ONzHfHs2VcRR98bJR1P9tnqjCyB35Km+dupc9ch/67kkftp9JS5qPK0' . PHP_EOL . 'ecZWKVA6kSDToHQX4C6ZQTHy90s9zMLHQIQPXWaFGFPV5FA8mXPGCoDbZI3VjPQ/' . PHP_EOL . 'nlHxBt8Vhx+WkS1lseZ2/AxKKkSgRTIjxoD3Pbryg1WecAaEbdw6qTz7gc6+2pn0' . PHP_EOL . 'shzyNRxAu1Zf48lq/0R4+da5XqkXDO8pzCXT2bTzEh8iH0O8VUnPcWSz5fpzW1Wj' . PHP_EOL . 'ZVqV+2WPx+eXO71aCjCeTCEzgo3ZSlwdx9/gb6/3NySFylE5LNnVrHmY85QwXoHY' . PHP_EOL . '5VrAyF/eWL0D0kSkEPFW7b6BlTo1uG98fV/g9009SeVqw/KUefirPhLr9XV+7GGj' . PHP_EOL . '7Y79XvbDdXkUMGL6bYP28NVC8m26iInFQTI5ZrGx6e7OgWWreM0fCbRKJpvBWNoz' . PHP_EOL . 'Kt7iqS2Yeiku4tfaLEwTettO1pcsBqXL63ZfqhLicXKHA/1/9ZslvhiH9EPGSw+P' . PHP_EOL . 'WFH/icfjc1NiNkGUsMzRhFvjFHMWYBNA5SE+i7otJRuXxOXbPtZgXOVwqAfCRZFp' . PHP_EOL . 'MZRXxLP+H78h+BkO8K3LIuHO9Y6Z8kGGxXWdNsOuvwOK9kYfmG4E0fzy/+BsJXDf' . PHP_EOL . 'poCMfwGeZwdDQiZRTBeiIHWJZJYHfHXF1icDJB/lFXY8rzrBVzgQFHFbox4kdZmv' . PHP_EOL . '6QWAe1zCTbKzwx7AvzGUqzVLrgA8Ba0P5awsYSdRUx8zkS5aOhL2QHgEjgMLozS7' . PHP_EOL . 'IONoK4W7zTAyZZ/H0Lf5jbHuXkvDQbiBFxST4Xc420p+zEyoCZXppRWReZ2Rfkst' . PHP_EOL . 'rXTkKkhWp+UzjQI+XmaVUYQWVN/27TNyXJDT/6pa3vxnOSmiU+P1coeKR1gD8Mpu' . PHP_EOL . '+1+C2A0LTsYjAFy2hCw6soY7GKB5bOsDB9L1Lla3uG9yzZHRjTiteh5JM9sdYu6a' . PHP_EOL . 'wlgvELYc+1qbcjFAnMKWMg4UHlKqL1Ys7mX/KOZQZLYXPLkOS7IW4Lejv2sH5W7T' . PHP_EOL . 'OkdDmwd1vJiR++LdBnHiMu6PaSL7f/VCPtF9V13XJZ652cVTLlAZ9aHf5Whor1Qh' . PHP_EOL . 'nUR5frajBdMY04mi+f3Ix3BtebLvmquQ9dp0VAbeWe6qr9Rx3xkBgm/B9Bvq6FNK' . PHP_EOL . '/WRIUKnHLJpIFiMtTjhAMXoVGH9AcswEzYNVqw5PSGwXZRawhdSd6gkeT+pVlJGa' . PHP_EOL . 'PkQNoitYBQRl8v+B6LBxbf8vdj2JocyQH3d8c2xUSkuZM768sdkdg3Rz6Qo1UHD/' . PHP_EOL . 'jTEZnlmA8mVPgllW8Eq4HaRrY6xItxFdm/NlllOetEdv/12eAaQWkjSBzqAW7Z3W' . PHP_EOL . 'Y8ggWnolLsAnj+xgoTjLG4YbsiwDgSuc0EQr1KvVdK7T8p9wi/rd2b8DJsODW+ao' . PHP_EOL . 'wsKXkSI/04gWxZ0gzjb3vQ8f2HxGLspSfQPndFJFWRXfw1bfXYDYlgId8R9sjHKJ' . PHP_EOL . 'sQiuy6yJv3zHoF52H7cGmxbKKHZeUNPoAXAl0PRxz9R/npWq/3BpS2xLH7XEHCWJ' . PHP_EOL . 'nfkwqr4h9XqFwucWAuHGypqRXxoUsATMjxSWd53rONEALbxpoM5lwV0oQwPTAc9R' . PHP_EOL . 'bz71RNDECC6Dyi0QhNZKQq5vJdt2h+lVr1fCOrX6Mtvh7KWp7LRGiQqsc7oHsXcq' . PHP_EOL . '1QXxmybSYYSDue9SGMQEUvcCqQuR7k1v/vy6pve3NkXeI7qCEQ1qv2zUNQhio2Rs' . PHP_EOL . 'xJ6HuyaARH88FQHQwYypGfHypyvm3nIES6tnuqrv4tigk6hzpTBo+tA38AVGi7i6' . PHP_EOL . 'CJGvEiu87CsM+vjLbOiL1cqcEG5gye3YCQZUI0gDRY4qCZ7HjH/Y2uLYmVGJ4A/A' . PHP_EOL . '099bk8uTI9VF/DR03OGDtywyXVZy13DUmkcmGAyzC6FiFFYbLNhYThlTyW9BaoDj' . PHP_EOL . 'Yw4p9SLEBXguYTMbPZ5FBI8ZaMsLzn6ZzF/++yyYP6Zu4kCPOUsPPPCWWtMMJCu3' . PHP_EOL . 'XwN+2kAAeEPmEbYeZAf1EPNxLeyeIjHinbPKoEdVCxYzvgGVCNs4OOAdEd6tODFh' . PHP_EOL . 'o2aHgpEDfyWZv2iatSEjZDQuPkIXah/8Cl3t+jy7oukGl0S2KuSf/v7288+IZ6sK' . PHP_EOL . 'VXqVKOg2L8j+EcKd4Cr7cpmruEzleWIk+9SvCz+bRfmfr99rN2T6A6iES4XQCr/U' . PHP_EOL . 'jnrfexL4MasXJqfYruh6gEZA333j6TB5NHSUuSjXicLnCe+LNuy/uwNQ0lOMzssx' . PHP_EOL . 'giuEoQgtOOMZDpa4KRiFC4zhECfHviMUhyFbylLW0SdRwg7IFaAUH0zbN1s2YmDu' . PHP_EOL . '8fjeaZfjTyMxhUqz0JDPZjtW7fdLR1Kn2xbEzUpREQVXLXFNtWAo3EvE7NeIs6Ob' . PHP_EOL . '9vgSJ8AdmH8pN/Q86blERJT5NKs7b3Lmm5Mcv48u44TfSOvFdoqFblTOZAtQyEEY' . PHP_EOL . 'juB5g/p8TpDHJSLSAP+0t0ybPFOVmI5eQToecFD7cCvni4D5EVSGfNT5dPfCb754' . PHP_EOL . 'g2y+rKscLItCWYzvVoFecyUfmDQ0mN2bjZdJ5xOilZ8UJ9w17X65+lS4wYaDQLcv' . PHP_EOL . 'FU3l+ROYHb/qBqLQAeHh02F58aQoJnk5xI20D9RQjWcqv/CA9MjhfVxq031ET2Yx' . PHP_EOL . 'iE634jmA5VEKKHENxRwGXZqlRoUr6Mc+zmsAGqHKRuL905L7PLjYjzpVy7gH7/QY' . PHP_EOL . '2VEg9EtlYUiE1HL+R8I6riRvhIr0ONO8exqrphYygv0mTcmKq8fjKsxnpP5cQV0n' . PHP_EOL . 'wMZJzjWWjVgnCEVS7R4ZsYUrHJQGse/WX0HI+upZqJ6mcEGx1rjLwbdKiIJ+d3CR' . PHP_EOL . 'u8t4TnKRiC6s+mRhf9tq7Y+qygCSIn8aZuK0qlcPvULk+bO/Mu+nGSALqFCr6/gv' . PHP_EOL . 'hYt6UAO8Gl6KRf2TbeqFHkfeaTM14xmAfKgWKzLXrVwOA6VyDriDoLZTMkqVvkLW' . PHP_EOL . '06VDAzd92btyMElc6O7GCLwTDHqi/3R55qogR8W+dS7X8gL+0W970/9SzbUCTne/' . PHP_EOL . 'BK2Ue55ge150mweDzgLk+m3/PUsVHceHybWk6eVveQnDl4am+xfB5msgg3Ry/DP4' . PHP_EOL . '1n+isjGM/Et/bfDL7L6WE5srXsF9fWD6nvn1e1FJobhGP9B51q5ccAD5IqC/AA5j' . PHP_EOL . 'eQG5aj07HHvclsLWSi/nlOR5wePaVc7+jj07ksI5r+HScchVvckgZai3XWwX/rPA' . PHP_EOL . '3MUzZa0cU27si72GWW6YLyu/PccRvKW9I9BjMFArLw1LILpP3BsfpwBhj6+Xn2rU' . PHP_EOL . 'ngPAEfcMcqgwB5zwieWcE796QlrxIx1AxnGi/QFrElzRb//b3DZLNrRwGwyyV+lE' . PHP_EOL . 'hZFYxviM2nK8LIRXGsZ/sBqQ6XT/0/ckJDajxy5/4EaD/P+JDdpMxhVaL+la7GeG' . PHP_EOL . 'Hk1yGNBTwLd3G+cR3RN72aYOW9mH430ZQujS2XMfPdZmeJSnubFVDeeR5LfUzQsg' . PHP_EOL . 'gXdJ61IyNesYn/hvMCdvcSMfjh4W6+A6InwKFcsKYcu0ikVrRZILphWkHGp8+vGR' . PHP_EOL . '74PIHYu/P/joxJDiIq8IWF1hbEG3BcJkM3kO3hcWkyScv9We5VTxrn+tGqkR5u/9' . PHP_EOL . 'UXWkFmy99MrpRcVYACkW8vh5sCm4uwUicbe6Tz03ZJt6dNOIEZZlZmOwQWy9/eJI' . PHP_EOL . 'Vl1DZuApIuYkiy5dXWZQ+TMYSvxKw8sMqEY1kF6+2Rr4J+e6QQ+ftrcr87mxhxxw' . PHP_EOL . 'S1jDHRU2ILp1a7sH/6l+V99rWbiluF2Dop/KQM73+NT8sTr3Z2FZTNu/3vvMZSU6' . PHP_EOL . 'eawQx6qZJOj1Xke/RSwQMYSOh72mIqJ2hnwl0CrVYilIF9b0zbC2RkduLaeVoGco' . PHP_EOL . 'm5Npo2z+daNsbjLveESoSpGVAwqsuwlTuuybLeHrHr4n+1d+Qqla79n8+FH5xrZF' . PHP_EOL . 'XiV3BQ16MGEGiaD7ptxKrWUdcZOnBzTBIOYhR8TZbplnKxoWmYalMMWNMOp954DD' . PHP_EOL . 'BvNKErtRz46clU2JDnDUoAsk2NdRFJ8jrW/JZEEy0UdoLu3qLHAN+/qmoRrTF4N7' . PHP_EOL . 'jF/hnWp1fVl+zjGl0DLNlaayVSxchgO2JNero1gaOcIQ9iqd5UY5aE/qt7RR/N6q' . PHP_EOL . 'oHqnr8vjZSioWuuNTuOcRZGXPqDF1T2o4mAtfe7oIhi03pvji2myoDbd80GK5/hK' . PHP_EOL . 'qhiKZt3ZhWNcVEUU1nZeon7AGphwPnEh+50w3pblwAPinlxNDXX/4SoinysPGJY6' . PHP_EOL . 'z483xJBMgTtlhDqdr6VIhOlyE3Jut4T1KqHOW6hjvUM3yhC5QkeiesBbkeH9WugY' . PHP_EOL . 'HGls71d02HDResL5L2If0MMRR51qczYPOc9Rmwce60bwfQr0ATJZFLTWwDCsXvdk' . PHP_EOL . 'bnurLkhyJgwdm4VuRjSXPBsX693XmOA18/glOZkPaxVbBWAjtCn1PaF3S65kv+G4' . PHP_EOL . 'eXZtpELIL8NIj1zqner1R3+0E3/IJw1xRXHStLoQZ/MzxVg4bDKIFUECBUOMFeIo' . PHP_EOL . 'GxRVYDeWN861iEsoEMeSqG+hBpzNIjZ8pfsvtzCBd4F1ySho2GejqYKlkFqa7IFn' . PHP_EOL . 'UjLpOeC5CLn0wIIp2JzMil966ZtIMSi/LYhtCY+qV38kjpY65+CV2IhO7eFdHko1' . PHP_EOL . 'rNqfaZzc2sq7VIRdml3NvjAllnbpT/XETYYswmu7TnJmhU0SQ3vYOFqAzVHmiofA' . PHP_EOL . '/NFyfdqF1i9TMOg/pQcSlrvoDbeWpp9jsX3yXrqGYCddeUQrMRXC2FijFYA1i1Wz' . PHP_EOL . 'Gz02S00l00wHc4IycKj0FaR5+aOWvMwlKQE//WZ/E3ajdbW0w1emTk5A87bT95Y8' . PHP_EOL . 'XeJiGhtKjx9zHNe3D1uDUFevRMAOPSGX/PiPD3fBUYYuWwDepiy1rLQj3ImAcFma' . PHP_EOL . 'HFztXUnM1Z3DEgOZGADl4KbUQtUHGki6n1YZmVSzWvPCpfMj7fuLuXd3AV8J/+La' . PHP_EOL . 'Dyb6A1CO4zpiqRLP5cpyf6wkSDVdIyGgHXmyBgT1T7Y5778QYsrR05TbPIc7jQXy' . PHP_EOL . 'CG+Epam4BwhNf9CcQyt6bCyIKXQ8ScZn3wFfOVG93UwU1zRlTDM37BNXGziM2S14' . PHP_EOL . '1unQyMgoDljoWIIRfqSg1Zj1wtdI2DhcbgixZFCt8ifZZYXP+eHOVpk2b81QzWSY' . PHP_EOL . 'pFEQ+ay9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEATPINk/17H+RLz459iCVQAGes' . PHP_EOL . '8kc5sxYj3CkMlWrGMiCxvsgu2kak6dCa0f3DfiVt54Fry7s0OklHiZmipoiF4RCt' . PHP_EOL . 'yJwUSAzRrZFAbkpDg8oIu4Ui/Bt13kY7xON+u4m0IgkLZSE+8BSjMrfjVvVxe+qH' . PHP_EOL . '5i7X/ibUTDjgyfdA8XI=', + ], ], ], [ - __DIR__.'/EC/PEM/prime256v1-cert.pem', + __DIR__ . '/EC/PEM/prime256v1-cert.pem', [ 'kty' => 'EC', 'crv' => 'P-256', @@ -278,11 +290,13 @@ public function dataLoadCertificate(): array 'y' => 'SM45Hsr9dnUR6Ox-TpmNv2fbDX4CoVo-3patMUpXANA', 'x5t' => 'ZnnaQDssCKJQZLp6zyHssIZOa7o', 'x5t#256' => 'v7VlokKTGL3anRk8Nl0VcqVC9u5j2Fb5tdlQntUgDT4', - 'x5c' => ['MIIB0jCCAXegAwIBAgIJAK2o1kQ5JwpUMAoGCCqGSM49BAMCMEUxCzAJBgNVBAYT'.PHP_EOL.'AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn'.PHP_EOL.'aXRzIFB0eSBMdGQwHhcNMTUxMTA4MTUxMTU2WhcNMTYxMTA3MTUxMTU2WjBFMQsw'.PHP_EOL.'CQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJu'.PHP_EOL.'ZXQgV2lkZ2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExEsr'.PHP_EOL.'/55aqgFXdrbRNz1/WSNI8UaSUxCka2kGEN1bXsJIzjkeyv12dRHo7H5OmY2/Z9sN'.PHP_EOL.'fgKhWj7elq0xSlcA0KNQME4wHQYDVR0OBBYEFKIGgCZoS388STT0qjoX/swKYBXh'.PHP_EOL.'MB8GA1UdIwQYMBaAFKIGgCZoS388STT0qjoX/swKYBXhMAwGA1UdEwQFMAMBAf8w'.PHP_EOL.'CgYIKoZIzj0EAwIDSQAwRgIhAK5OqQoBGR/pj2NOb+PyRKK4k4d3Muj9z/6LsJK+'.PHP_EOL.'kkgUAiEA+FY4SWKv4mfe0gsOBId0Aah/HtVZxDBe3bCXOQM8MMM='], + 'x5c' => [ + 'MIIB0jCCAXegAwIBAgIJAK2o1kQ5JwpUMAoGCCqGSM49BAMCMEUxCzAJBgNVBAYT' . PHP_EOL . 'AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn' . PHP_EOL . 'aXRzIFB0eSBMdGQwHhcNMTUxMTA4MTUxMTU2WhcNMTYxMTA3MTUxMTU2WjBFMQsw' . PHP_EOL . 'CQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJu' . PHP_EOL . 'ZXQgV2lkZ2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExEsr' . PHP_EOL . '/55aqgFXdrbRNz1/WSNI8UaSUxCka2kGEN1bXsJIzjkeyv12dRHo7H5OmY2/Z9sN' . PHP_EOL . 'fgKhWj7elq0xSlcA0KNQME4wHQYDVR0OBBYEFKIGgCZoS388STT0qjoX/swKYBXh' . PHP_EOL . 'MB8GA1UdIwQYMBaAFKIGgCZoS388STT0qjoX/swKYBXhMAwGA1UdEwQFMAMBAf8w' . PHP_EOL . 'CgYIKoZIzj0EAwIDSQAwRgIhAK5OqQoBGR/pj2NOb+PyRKK4k4d3Muj9z/6LsJK+' . PHP_EOL . 'kkgUAiEA+FY4SWKv4mfe0gsOBId0Aah/HtVZxDBe3bCXOQM8MMM=', + ], ], ], [ - __DIR__.'/EC/DER/prime256v1-cert.der', + __DIR__ . '/EC/DER/prime256v1-cert.der', [ 'kty' => 'EC', 'crv' => 'P-256', @@ -290,14 +304,15 @@ public function dataLoadCertificate(): array 'y' => 'SM45Hsr9dnUR6Ox-TpmNv2fbDX4CoVo-3patMUpXANA', 'x5t' => 'ZnnaQDssCKJQZLp6zyHssIZOa7o', 'x5t#256' => 'v7VlokKTGL3anRk8Nl0VcqVC9u5j2Fb5tdlQntUgDT4', - 'x5c' => ['MIIB0jCCAXegAwIBAgIJAK2o1kQ5JwpUMAoGCCqGSM49BAMCMEUxCzAJBgNVBAYT'.PHP_EOL.'AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn'.PHP_EOL.'aXRzIFB0eSBMdGQwHhcNMTUxMTA4MTUxMTU2WhcNMTYxMTA3MTUxMTU2WjBFMQsw'.PHP_EOL.'CQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJu'.PHP_EOL.'ZXQgV2lkZ2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExEsr'.PHP_EOL.'/55aqgFXdrbRNz1/WSNI8UaSUxCka2kGEN1bXsJIzjkeyv12dRHo7H5OmY2/Z9sN'.PHP_EOL.'fgKhWj7elq0xSlcA0KNQME4wHQYDVR0OBBYEFKIGgCZoS388STT0qjoX/swKYBXh'.PHP_EOL.'MB8GA1UdIwQYMBaAFKIGgCZoS388STT0qjoX/swKYBXhMAwGA1UdEwQFMAMBAf8w'.PHP_EOL.'CgYIKoZIzj0EAwIDSQAwRgIhAK5OqQoBGR/pj2NOb+PyRKK4k4d3Muj9z/6LsJK+'.PHP_EOL.'kkgUAiEA+FY4SWKv4mfe0gsOBId0Aah/HtVZxDBe3bCXOQM8MMM='], + 'x5c' => [ + 'MIIB0jCCAXegAwIBAgIJAK2o1kQ5JwpUMAoGCCqGSM49BAMCMEUxCzAJBgNVBAYT' . PHP_EOL . 'AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn' . PHP_EOL . 'aXRzIFB0eSBMdGQwHhcNMTUxMTA4MTUxMTU2WhcNMTYxMTA3MTUxMTU2WjBFMQsw' . PHP_EOL . 'CQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJu' . PHP_EOL . 'ZXQgV2lkZ2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExEsr' . PHP_EOL . '/55aqgFXdrbRNz1/WSNI8UaSUxCka2kGEN1bXsJIzjkeyv12dRHo7H5OmY2/Z9sN' . PHP_EOL . 'fgKhWj7elq0xSlcA0KNQME4wHQYDVR0OBBYEFKIGgCZoS388STT0qjoX/swKYBXh' . PHP_EOL . 'MB8GA1UdIwQYMBaAFKIGgCZoS388STT0qjoX/swKYBXhMAwGA1UdEwQFMAMBAf8w' . PHP_EOL . 'CgYIKoZIzj0EAwIDSQAwRgIhAK5OqQoBGR/pj2NOb+PyRKK4k4d3Muj9z/6LsJK+' . PHP_EOL . 'kkgUAiEA+FY4SWKv4mfe0gsOBId0Aah/HtVZxDBe3bCXOQM8MMM=', + ], ], ], ]; } /** - * @covers \Jose\Component\KeyManagement\JWKFactory * @test */ public function loadX5CParameter(): void @@ -308,12 +323,17 @@ public function loadX5CParameter(): void 'kid' => '1b94c', 'n' => 'vrjOfz9Ccdgx5nQudyhdoR17V-IubWMeOZCwX_jj0hgAsz2J_pqYW08PLbK_PdiVGKPrqzmDIsLI7sA25VEnHU1uCLNwBuUiCO11_-7dYbsr4iJmG0Qu2j8DsVyT1azpJC_NG84Ty5KKthuCaPod7iI7w0LK9orSMhBEwwZDCxTWq4aYWAchc8t-emd9qOvWtVMDC2BXksRngh6X5bUYLy6AyHKvj-nUy1wgzjYQDwHMTplCoLtU-o-8SNnZ1tmRoGE9uJkBLdh5gFENabWnU5m1ZqZPdwS-qo-meMvVfJb6jJVWRpl2SUtCnYG2C32qvbWbjZ_jBPD5eunqsIo1vQ', 'e' => 'AQAB', - 'x5c' => ['MIIDQjCCAiqgAwIBAgIGATz/FuLiMA0GCSqGSIb3DQEBBQUAMGIxCzAJB'.PHP_EOL.'gNVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYD'.PHP_EOL.'VQQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1'.PHP_EOL.'wYmVsbDAeFw0xMzAyMjEyMzI5MTVaFw0xODA4MTQyMjI5MTVaMGIxCzAJBg'.PHP_EOL.'NVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDV'.PHP_EOL.'QQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1w'.PHP_EOL.'YmVsbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL64zn8/QnH'.PHP_EOL.'YMeZ0LncoXaEde1fiLm1jHjmQsF/449IYALM9if6amFtPDy2yvz3YlRij66'.PHP_EOL.'s5gyLCyO7ANuVRJx1NbgizcAblIgjtdf/u3WG7K+IiZhtELto/A7Fck9Ws6'.PHP_EOL.'SQvzRvOE8uSirYbgmj6He4iO8NCyvaK0jIQRMMGQwsU1quGmFgHIXPLfnpn'.PHP_EOL.'fajr1rVTAwtgV5LEZ4Iel+W1GC8ugMhyr4/p1MtcIM42EA8BzE6ZQqC7VPq'.PHP_EOL.'PvEjZ2dbZkaBhPbiZAS3YeYBRDWm1p1OZtWamT3cEvqqPpnjL1XyW+oyVVk'.PHP_EOL.'aZdklLQp2Btgt9qr21m42f4wTw+Xrp6rCKNb0CAwEAATANBgkqhkiG9w0BA'.PHP_EOL.'QUFAAOCAQEAh8zGlfSlcI0o3rYDPBB07aXNswb4ECNIKG0CETTUxmXl9KUL'.PHP_EOL.'+9gGlqCz5iWLOgWsnrcKcY0vXPG9J1r9AqBNTqNgHq2G03X09266X5CpOe1'.PHP_EOL.'zFo+Owb1zxtp3PehFdfQJ610CDLEaS9V9Rqp17hCyybEpOGVwe8fnk+fbEL'.PHP_EOL.'2Bo3UPGrpsHzUoaGpDftmWssZkhpBJKVMJyf/RuP2SmmaIzmnw9JiSlYhzo'.PHP_EOL.'4tpzd5rFXhjRbg4zW9C+2qok+2+qDM1iJ684gPHMIY8aLWrdgQTxkumGmTq'.PHP_EOL.'gawR+N5MDtdPTEQ0XfIBc2cJEUyMTY5MPvACWpkA6SdS4xSvdXK3IVfOWA=='], + 'x5c' => [ + 'MIIDQjCCAiqgAwIBAgIGATz/FuLiMA0GCSqGSIb3DQEBBQUAMGIxCzAJB' . PHP_EOL . 'gNVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYD' . PHP_EOL . 'VQQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1' . PHP_EOL . 'wYmVsbDAeFw0xMzAyMjEyMzI5MTVaFw0xODA4MTQyMjI5MTVaMGIxCzAJBg' . PHP_EOL . 'NVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDV' . PHP_EOL . 'QQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1w' . PHP_EOL . 'YmVsbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL64zn8/QnH' . PHP_EOL . 'YMeZ0LncoXaEde1fiLm1jHjmQsF/449IYALM9if6amFtPDy2yvz3YlRij66' . PHP_EOL . 's5gyLCyO7ANuVRJx1NbgizcAblIgjtdf/u3WG7K+IiZhtELto/A7Fck9Ws6' . PHP_EOL . 'SQvzRvOE8uSirYbgmj6He4iO8NCyvaK0jIQRMMGQwsU1quGmFgHIXPLfnpn' . PHP_EOL . 'fajr1rVTAwtgV5LEZ4Iel+W1GC8ugMhyr4/p1MtcIM42EA8BzE6ZQqC7VPq' . PHP_EOL . 'PvEjZ2dbZkaBhPbiZAS3YeYBRDWm1p1OZtWamT3cEvqqPpnjL1XyW+oyVVk' . PHP_EOL . 'aZdklLQp2Btgt9qr21m42f4wTw+Xrp6rCKNb0CAwEAATANBgkqhkiG9w0BA' . PHP_EOL . 'QUFAAOCAQEAh8zGlfSlcI0o3rYDPBB07aXNswb4ECNIKG0CETTUxmXl9KUL' . PHP_EOL . '+9gGlqCz5iWLOgWsnrcKcY0vXPG9J1r9AqBNTqNgHq2G03X09266X5CpOe1' . PHP_EOL . 'zFo+Owb1zxtp3PehFdfQJ610CDLEaS9V9Rqp17hCyybEpOGVwe8fnk+fbEL' . PHP_EOL . '2Bo3UPGrpsHzUoaGpDftmWssZkhpBJKVMJyf/RuP2SmmaIzmnw9JiSlYhzo' . PHP_EOL . '4tpzd5rFXhjRbg4zW9C+2qok+2+qDM1iJ684gPHMIY8aLWrdgQTxkumGmTq' . PHP_EOL . 'gawR+N5MDtdPTEQ0XfIBc2cJEUyMTY5MPvACWpkA6SdS4xSvdXK3IVfOWA==', + ], ]); - $certificate = JWKFactory::createFromX5C($key->get('x5c'), ['use' => 'sig', 'kid' => '1b94c']); + $certificate = JWKFactory::createFromX5C($key->get('x5c'), [ + 'use' => 'sig', + 'kid' => '1b94c', + ]); - static::assertEquals( + static::assertEqualsCanonicalizing( [ 'kty' => 'RSA', 'use' => 'sig', @@ -322,7 +342,9 @@ public function loadX5CParameter(): void 'e' => 'AQAB', 'x5t' => '4pNenEBLv0JpLIdugWxQkOsZcK0', 'x5t#256' => 'pJm2BBpkB8y7tCqrWM0X37WOmQTO8zQw-VpxVgBb21I', - 'x5c' => ['MIIDQjCCAiqgAwIBAgIGATz/FuLiMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYT'.PHP_EOL.'AlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDVQQKExNQaW5n'.PHP_EOL.'IElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1wYmVsbDAeFw0xMzAy'.PHP_EOL.'MjEyMzI5MTVaFw0xODA4MTQyMjI5MTVaMGIxCzAJBgNVBAYTAlVTMQswCQYDVQQI'.PHP_EOL.'EwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDVQQKExNQaW5nIElkZW50aXR5IENv'.PHP_EOL.'cnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1wYmVsbDCCASIwDQYJKoZIhvcNAQEBBQAD'.PHP_EOL.'ggEPADCCAQoCggEBAL64zn8/QnHYMeZ0LncoXaEde1fiLm1jHjmQsF/449IYALM9'.PHP_EOL.'if6amFtPDy2yvz3YlRij66s5gyLCyO7ANuVRJx1NbgizcAblIgjtdf/u3WG7K+Ii'.PHP_EOL.'ZhtELto/A7Fck9Ws6SQvzRvOE8uSirYbgmj6He4iO8NCyvaK0jIQRMMGQwsU1quG'.PHP_EOL.'mFgHIXPLfnpnfajr1rVTAwtgV5LEZ4Iel+W1GC8ugMhyr4/p1MtcIM42EA8BzE6Z'.PHP_EOL.'QqC7VPqPvEjZ2dbZkaBhPbiZAS3YeYBRDWm1p1OZtWamT3cEvqqPpnjL1XyW+oyV'.PHP_EOL.'VkaZdklLQp2Btgt9qr21m42f4wTw+Xrp6rCKNb0CAwEAATANBgkqhkiG9w0BAQUF'.PHP_EOL.'AAOCAQEAh8zGlfSlcI0o3rYDPBB07aXNswb4ECNIKG0CETTUxmXl9KUL+9gGlqCz'.PHP_EOL.'5iWLOgWsnrcKcY0vXPG9J1r9AqBNTqNgHq2G03X09266X5CpOe1zFo+Owb1zxtp3'.PHP_EOL.'PehFdfQJ610CDLEaS9V9Rqp17hCyybEpOGVwe8fnk+fbEL2Bo3UPGrpsHzUoaGpD'.PHP_EOL.'ftmWssZkhpBJKVMJyf/RuP2SmmaIzmnw9JiSlYhzo4tpzd5rFXhjRbg4zW9C+2qo'.PHP_EOL.'k+2+qDM1iJ684gPHMIY8aLWrdgQTxkumGmTqgawR+N5MDtdPTEQ0XfIBc2cJEUyM'.PHP_EOL.'TY5MPvACWpkA6SdS4xSvdXK3IVfOWA=='], + 'x5c' => [ + 'MIIDQjCCAiqgAwIBAgIGATz/FuLiMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYT' . PHP_EOL . 'AlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDVQQKExNQaW5n' . PHP_EOL . 'IElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1wYmVsbDAeFw0xMzAy' . PHP_EOL . 'MjEyMzI5MTVaFw0xODA4MTQyMjI5MTVaMGIxCzAJBgNVBAYTAlVTMQswCQYDVQQI' . PHP_EOL . 'EwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDVQQKExNQaW5nIElkZW50aXR5IENv' . PHP_EOL . 'cnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1wYmVsbDCCASIwDQYJKoZIhvcNAQEBBQAD' . PHP_EOL . 'ggEPADCCAQoCggEBAL64zn8/QnHYMeZ0LncoXaEde1fiLm1jHjmQsF/449IYALM9' . PHP_EOL . 'if6amFtPDy2yvz3YlRij66s5gyLCyO7ANuVRJx1NbgizcAblIgjtdf/u3WG7K+Ii' . PHP_EOL . 'ZhtELto/A7Fck9Ws6SQvzRvOE8uSirYbgmj6He4iO8NCyvaK0jIQRMMGQwsU1quG' . PHP_EOL . 'mFgHIXPLfnpnfajr1rVTAwtgV5LEZ4Iel+W1GC8ugMhyr4/p1MtcIM42EA8BzE6Z' . PHP_EOL . 'QqC7VPqPvEjZ2dbZkaBhPbiZAS3YeYBRDWm1p1OZtWamT3cEvqqPpnjL1XyW+oyV' . PHP_EOL . 'VkaZdklLQp2Btgt9qr21m42f4wTw+Xrp6rCKNb0CAwEAATANBgkqhkiG9w0BAQUF' . PHP_EOL . 'AAOCAQEAh8zGlfSlcI0o3rYDPBB07aXNswb4ECNIKG0CETTUxmXl9KUL+9gGlqCz' . PHP_EOL . '5iWLOgWsnrcKcY0vXPG9J1r9AqBNTqNgHq2G03X09266X5CpOe1zFo+Owb1zxtp3' . PHP_EOL . 'PehFdfQJ610CDLEaS9V9Rqp17hCyybEpOGVwe8fnk+fbEL2Bo3UPGrpsHzUoaGpD' . PHP_EOL . 'ftmWssZkhpBJKVMJyf/RuP2SmmaIzmnw9JiSlYhzo4tpzd5rFXhjRbg4zW9C+2qo' . PHP_EOL . 'k+2+qDM1iJ684gPHMIY8aLWrdgQTxkumGmTqgawR+N5MDtdPTEQ0XfIBc2cJEUyM' . PHP_EOL . 'TY5MPvACWpkA6SdS4xSvdXK3IVfOWA==', + ], ], $certificate->all() ); diff --git a/tests/Component/KeyManagement/FooAlgorithm.php b/tests/Component/KeyManagement/FooAlgorithm.php index b9745129..88aac35e 100644 --- a/tests/Component/KeyManagement/FooAlgorithm.php +++ b/tests/Component/KeyManagement/FooAlgorithm.php @@ -2,23 +2,10 @@ 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\Tests\Component\KeyManagement; use Jose\Component\Core\Algorithm; -/** - * @group unit - * @group JWKSet - */ class FooAlgorithm implements Algorithm { public function name(): string diff --git a/tests/Component/KeyManagement/JWKAnalyzerTest.php b/tests/Component/KeyManagement/JWKAnalyzerTest.php index cbc2e6de..ce5f59b4 100644 --- a/tests/Component/KeyManagement/JWKAnalyzerTest.php +++ b/tests/Component/KeyManagement/JWKAnalyzerTest.php @@ -2,34 +2,25 @@ 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\Tests\Component\KeyManagement; use Jose\Component\Core\JWK; -use Jose\Component\KeyManagement\Analyzer; +use Jose\Component\KeyManagement\Analyzer\AlgorithmAnalyzer; +use Jose\Component\KeyManagement\Analyzer\KeyAnalyzerManager; +use Jose\Component\KeyManagement\Analyzer\KeyIdentifierAnalyzer; +use Jose\Component\KeyManagement\Analyzer\NoneAnalyzer; +use Jose\Component\KeyManagement\Analyzer\OctAnalyzer; +use Jose\Component\KeyManagement\Analyzer\RsaAnalyzer; +use Jose\Component\KeyManagement\Analyzer\UsageAnalyzer; use Jose\Component\KeyManagement\JWKFactory; use PHPUnit\Framework\TestCase; /** - * @group unit - * @group JWKAnalyzer - * * @internal */ -class JWKAnalyzerTest extends TestCase +final class JWKAnalyzerTest extends TestCase { - /** - * @var null|Analyzer\KeyAnalyzerManager - */ - private $keyAnalyzerManager; + private ?KeyAnalyzerManager $keyAnalyzerManager = null; /** * @test @@ -37,7 +28,9 @@ class JWKAnalyzerTest extends TestCase public function iCanAnalyzeANoneKeyAndGetMessages(): void { $key = JWKFactory::createNoneKey(); - $messages = $this->getKeyAnalyzer()->analyze($key); + $messages = $this->getKeyAnalyzer() + ->analyze($key) + ; static::assertNotEmpty($messages); } @@ -53,7 +46,9 @@ public function iCanAnalyzeAnRsaKeyAndGetMessages(): void 'e' => 'AQAB', 'd' => 'asuBS2jRbT50FCkP8PxdRVQ7RIWJ3s5UWAi-c233cQam1kRjGN2QzAv79hrpjLQB', ]); - $messages = $this->getKeyAnalyzer()->analyze($key); + $messages = $this->getKeyAnalyzer() + ->analyze($key) + ; static::assertNotEmpty($messages); } @@ -63,11 +58,15 @@ public function iCanAnalyzeAnRsaKeyAndGetMessages(): void */ public function theRsaKeyHasALowExponent(): void { - $key = JWK::createFromJson('{"kty":"RSA","n":"sv2gihrIZaT4tkxb0B70Aw","e":"Aw","d":"d1PAXBHa7mzdZNOkuSwnSw","p":"4Kz0hhYYddk","q":"y_IaXqREQzs","dp":"lcijBA66-Ts","dq":"h_a8Pxgtgic","qi":"YehXzJzN5bw"}'); - $messages = $this->getKeyAnalyzer()->analyze($key); + $key = JWK::createFromJson( + '{"kty":"RSA","n":"sv2gihrIZaT4tkxb0B70Aw","e":"Aw","d":"d1PAXBHa7mzdZNOkuSwnSw","p":"4Kz0hhYYddk","q":"y_IaXqREQzs","dp":"lcijBA66-Ts","dq":"h_a8Pxgtgic","qi":"YehXzJzN5bw"}' + ); + $messages = $this->getKeyAnalyzer() + ->analyze($key) + ; foreach ($messages->all() as $message) { - if ('The exponent is too low. It should be at least 65537.' === $message->getMessage()) { + if ($message->getMessage() === 'The exponent is too low. It should be at least 65537.') { return; // Message found. OK } } @@ -79,22 +78,27 @@ public function theRsaKeyHasALowExponent(): void */ public function iCanAnalyzeAnOctKeyAndGetMessages(): void { - $key = JWKFactory::createOctKey(16, ['use' => 'foo', 'key_ops' => 'foo']); - $messages = $this->getKeyAnalyzer()->analyze($key); + $key = JWKFactory::createOctKey(16, [ + 'use' => 'foo', + 'key_ops' => 'foo', + ]); + $messages = $this->getKeyAnalyzer() + ->analyze($key) + ; static::assertNotEmpty($messages); } - private function getKeyAnalyzer(): Analyzer\KeyAnalyzerManager + private function getKeyAnalyzer(): KeyAnalyzerManager { - if (null === $this->keyAnalyzerManager) { - $this->keyAnalyzerManager = new Analyzer\KeyAnalyzerManager(); - $this->keyAnalyzerManager->add(new Analyzer\AlgorithmAnalyzer()); - $this->keyAnalyzerManager->add(new Analyzer\KeyIdentifierAnalyzer()); - $this->keyAnalyzerManager->add(new Analyzer\NoneAnalyzer()); - $this->keyAnalyzerManager->add(new Analyzer\OctAnalyzer()); - $this->keyAnalyzerManager->add(new Analyzer\RsaAnalyzer()); - $this->keyAnalyzerManager->add(new Analyzer\UsageAnalyzer()); + if ($this->keyAnalyzerManager === null) { + $this->keyAnalyzerManager = new KeyAnalyzerManager(); + $this->keyAnalyzerManager->add(new AlgorithmAnalyzer()); + $this->keyAnalyzerManager->add(new KeyIdentifierAnalyzer()); + $this->keyAnalyzerManager->add(new NoneAnalyzer()); + $this->keyAnalyzerManager->add(new OctAnalyzer()); + $this->keyAnalyzerManager->add(new RsaAnalyzer()); + $this->keyAnalyzerManager->add(new UsageAnalyzer()); } return $this->keyAnalyzerManager; diff --git a/tests/Component/KeyManagement/JWKFactoryTest.php b/tests/Component/KeyManagement/JWKFactoryTest.php index 88a7d1e3..7d587d4b 100644 --- a/tests/Component/KeyManagement/JWKFactoryTest.php +++ b/tests/Component/KeyManagement/JWKFactoryTest.php @@ -2,37 +2,26 @@ 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\Tests\Component\KeyManagement; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\KeyManagement\JWKFactory; +use ParagonIE\ConstantTime\Base64UrlSafe; +use const PHP_EOL; use PHPUnit\Framework\TestCase; /** - * @group JWKFactory - * @group unit - * * @internal */ -class JWKFactoryTest extends TestCase +final class JWKFactoryTest extends TestCase { /** * @test */ public function iCanLoadAP12CertificateThatContainsARSAKey(): void { - $result = JWKFactory::createFromPKCS12CertificateFile(__DIR__.'/P12/CertRSA.p12', 'certRSA'); + $result = JWKFactory::createFromPKCS12CertificateFile(__DIR__ . '/P12/CertRSA.p12', 'certRSA'); - static::assertEquals( + static::assertSame( [ 'kty' => 'RSA', 'n' => 'acqZqFSLArU71p9yp8ZH1nDfi5g0TLgPCgAYESrfb-DB0_F89LUSSukRRkCjNCuJqp6j6jpe4VmJ2YzGiBV3eoMqORIdUmQ3XlKKX_ONM3oWhZZoFS_2s1RLFl1faXORe4JSJIN9gt_4EpXoKTjX1gftTcFOLrXPgODEwjAYll0', @@ -53,17 +42,20 @@ public function iCanLoadAP12CertificateThatContainsARSAKey(): void */ public function createFromECCertificateFileInDERFormat(): void { - $result = JWKFactory::createFromCertificateFile(__DIR__.'/EC/DER/prime256v1-cert.der'); + $result = JWKFactory::createFromCertificateFile(__DIR__ . '/EC/DER/prime256v1-cert.der'); - static::assertEquals( + static::assertSame( [ 'kty' => 'EC', 'crv' => 'P-256', 'x' => 'xEsr_55aqgFXdrbRNz1_WSNI8UaSUxCka2kGEN1bXsI', 'y' => 'SM45Hsr9dnUR6Ox-TpmNv2fbDX4CoVo-3patMUpXANA', - 'x5c' => ['MIIB0jCCAXegAwIBAgIJAK2o1kQ5JwpUMAoGCCqGSM49BAMCMEUxCzAJBgNVBAYT'.PHP_EOL.'AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn'.PHP_EOL.'aXRzIFB0eSBMdGQwHhcNMTUxMTA4MTUxMTU2WhcNMTYxMTA3MTUxMTU2WjBFMQsw'.PHP_EOL.'CQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJu'.PHP_EOL.'ZXQgV2lkZ2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExEsr'.PHP_EOL.'/55aqgFXdrbRNz1/WSNI8UaSUxCka2kGEN1bXsJIzjkeyv12dRHo7H5OmY2/Z9sN'.PHP_EOL.'fgKhWj7elq0xSlcA0KNQME4wHQYDVR0OBBYEFKIGgCZoS388STT0qjoX/swKYBXh'.PHP_EOL.'MB8GA1UdIwQYMBaAFKIGgCZoS388STT0qjoX/swKYBXhMAwGA1UdEwQFMAMBAf8w'.PHP_EOL.'CgYIKoZIzj0EAwIDSQAwRgIhAK5OqQoBGR/pj2NOb+PyRKK4k4d3Muj9z/6LsJK+'.PHP_EOL.'kkgUAiEA+FY4SWKv4mfe0gsOBId0Aah/HtVZxDBe3bCXOQM8MMM='], + 'x5c' => [ + 'MIIB0jCCAXegAwIBAgIJAK2o1kQ5JwpUMAoGCCqGSM49BAMCMEUxCzAJBgNVBAYT' . PHP_EOL . 'AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn' . PHP_EOL . 'aXRzIFB0eSBMdGQwHhcNMTUxMTA4MTUxMTU2WhcNMTYxMTA3MTUxMTU2WjBFMQsw' . PHP_EOL . 'CQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJu' . PHP_EOL . 'ZXQgV2lkZ2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExEsr' . PHP_EOL . '/55aqgFXdrbRNz1/WSNI8UaSUxCka2kGEN1bXsJIzjkeyv12dRHo7H5OmY2/Z9sN' . PHP_EOL . 'fgKhWj7elq0xSlcA0KNQME4wHQYDVR0OBBYEFKIGgCZoS388STT0qjoX/swKYBXh' . PHP_EOL . 'MB8GA1UdIwQYMBaAFKIGgCZoS388STT0qjoX/swKYBXhMAwGA1UdEwQFMAMBAf8w' . PHP_EOL . 'CgYIKoZIzj0EAwIDSQAwRgIhAK5OqQoBGR/pj2NOb+PyRKK4k4d3Muj9z/6LsJK+' . PHP_EOL . 'kkgUAiEA+FY4SWKv4mfe0gsOBId0Aah/HtVZxDBe3bCXOQM8MMM=', + ], 'x5t' => 'ZnnaQDssCKJQZLp6zyHssIZOa7o', - 'x5t#256' => 'v7VlokKTGL3anRk8Nl0VcqVC9u5j2Fb5tdlQntUgDT4', ], + 'x5t#256' => 'v7VlokKTGL3anRk8Nl0VcqVC9u5j2Fb5tdlQntUgDT4', + ], $result->all() ); } @@ -73,13 +65,15 @@ public function createFromECCertificateFileInDERFormat(): void */ public function createFromSecret(): void { - $jwk = JWKFactory::createFromSecret('This is a very secured secret!!!!', ['kid' => 'FOO']); + $jwk = JWKFactory::createFromSecret('This is a very secured secret!!!!', [ + 'kid' => 'FOO', + ]); static::assertTrue($jwk->has('kty')); static::assertTrue($jwk->has('k')); static::assertTrue($jwk->has('kid')); - static::assertEquals('oct', $jwk->get('kty')); - static::assertEquals('This is a very secured secret!!!!', Base64UrlSafe::decode($jwk->get('k'))); - static::assertEquals('FOO', $jwk->get('kid')); + static::assertSame('oct', $jwk->get('kty')); + static::assertSame('This is a very secured secret!!!!', Base64UrlSafe::decode($jwk->get('k'))); + static::assertSame('FOO', $jwk->get('kid')); } /** @@ -87,8 +81,11 @@ public function createFromSecret(): void */ public function createFromKey(): void { - $jwk = JWKFactory::createFromKey(file_get_contents(__DIR__.'/Keys/EC/private.es256.encrypted.key'), 'test'); - static::assertEquals('{"kty":"EC","crv":"P-256","d":"q_VkzNnxTG39jHB0qkwA_SeVXud7yCHT7kb7kZv-0xQ","x":"vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U","y":"oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE"}', json_encode($jwk)); + $jwk = JWKFactory::createFromKey(file_get_contents(__DIR__ . '/Keys/EC/private.es256.encrypted.key'), 'test'); + static::assertSame( + '{"kty":"EC","crv":"P-256","d":"q_VkzNnxTG39jHB0qkwA_SeVXud7yCHT7kb7kZv-0xQ","x":"vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U","y":"oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE"}', + json_encode($jwk) + ); } /** @@ -96,15 +93,17 @@ public function createFromKey(): void */ public function createFromResource(): void { - $res = openssl_x509_read(file_get_contents(__DIR__.'/RSA/PEM/1024b-rsa-example-cert.pem')); + $res = openssl_x509_read(file_get_contents(__DIR__ . '/RSA/PEM/1024b-rsa-example-cert.pem')); $jwk = JWKFactory::createFromX509Resource($res); - static::assertEquals( + static::assertSame( [ 'kty' => 'RSA', 'n' => 'xgEGvHk-U_RY0j9l3MP7o-S2a6uf4XaRBhu1ztdCHz8tMG8Kj4_qJmgsSZQD17sRctHGBTUJWp4CLtBwCf0zAGVzySwUkcHSu1_2mZ_w7Nr0TQHKeWr_j8pvXH534DKEvugr21DAHbi4c654eLUL-JW_wJJYqJh7qHM3W3Fh7ys', 'e' => 'AQAB', - 'x5c' => ['MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw'.PHP_EOL.'ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD'.PHP_EOL.'+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9'.PHP_EOL.'MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1'.PHP_EOL.'C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ'.PHP_EOL.'kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf'.PHP_EOL.'jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr'.PHP_EOL.'evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok='], + 'x5c' => [ + 'MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw' . PHP_EOL . 'ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD' . PHP_EOL . '+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9' . PHP_EOL . 'MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1' . PHP_EOL . 'C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ' . PHP_EOL . 'kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf' . PHP_EOL . 'jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr' . PHP_EOL . 'evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok=', + ], 'x5t' => '4bK45ewZ00Wk-a_shpTw2cCqJc8', 'x5t#256' => '5F5GTPOxBGAOsVyuYzqUBjri0R2YDTiDowiQbs6oGgU', ], @@ -117,17 +116,20 @@ public function createFromResource(): void */ public function createFromECCertificateFileInPEMFormat(): void { - $result = JWKFactory::createFromCertificateFile(__DIR__.'/EC/PEM/prime256v1-cert.pem'); + $result = JWKFactory::createFromCertificateFile(__DIR__ . '/EC/PEM/prime256v1-cert.pem'); - static::assertEquals( + static::assertSame( [ 'kty' => 'EC', 'crv' => 'P-256', 'x' => 'xEsr_55aqgFXdrbRNz1_WSNI8UaSUxCka2kGEN1bXsI', 'y' => 'SM45Hsr9dnUR6Ox-TpmNv2fbDX4CoVo-3patMUpXANA', - 'x5c' => ['MIIB0jCCAXegAwIBAgIJAK2o1kQ5JwpUMAoGCCqGSM49BAMCMEUxCzAJBgNVBAYT'.PHP_EOL.'AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn'.PHP_EOL.'aXRzIFB0eSBMdGQwHhcNMTUxMTA4MTUxMTU2WhcNMTYxMTA3MTUxMTU2WjBFMQsw'.PHP_EOL.'CQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJu'.PHP_EOL.'ZXQgV2lkZ2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExEsr'.PHP_EOL.'/55aqgFXdrbRNz1/WSNI8UaSUxCka2kGEN1bXsJIzjkeyv12dRHo7H5OmY2/Z9sN'.PHP_EOL.'fgKhWj7elq0xSlcA0KNQME4wHQYDVR0OBBYEFKIGgCZoS388STT0qjoX/swKYBXh'.PHP_EOL.'MB8GA1UdIwQYMBaAFKIGgCZoS388STT0qjoX/swKYBXhMAwGA1UdEwQFMAMBAf8w'.PHP_EOL.'CgYIKoZIzj0EAwIDSQAwRgIhAK5OqQoBGR/pj2NOb+PyRKK4k4d3Muj9z/6LsJK+'.PHP_EOL.'kkgUAiEA+FY4SWKv4mfe0gsOBId0Aah/HtVZxDBe3bCXOQM8MMM='], + 'x5c' => [ + 'MIIB0jCCAXegAwIBAgIJAK2o1kQ5JwpUMAoGCCqGSM49BAMCMEUxCzAJBgNVBAYT' . PHP_EOL . 'AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn' . PHP_EOL . 'aXRzIFB0eSBMdGQwHhcNMTUxMTA4MTUxMTU2WhcNMTYxMTA3MTUxMTU2WjBFMQsw' . PHP_EOL . 'CQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJu' . PHP_EOL . 'ZXQgV2lkZ2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExEsr' . PHP_EOL . '/55aqgFXdrbRNz1/WSNI8UaSUxCka2kGEN1bXsJIzjkeyv12dRHo7H5OmY2/Z9sN' . PHP_EOL . 'fgKhWj7elq0xSlcA0KNQME4wHQYDVR0OBBYEFKIGgCZoS388STT0qjoX/swKYBXh' . PHP_EOL . 'MB8GA1UdIwQYMBaAFKIGgCZoS388STT0qjoX/swKYBXhMAwGA1UdEwQFMAMBAf8w' . PHP_EOL . 'CgYIKoZIzj0EAwIDSQAwRgIhAK5OqQoBGR/pj2NOb+PyRKK4k4d3Muj9z/6LsJK+' . PHP_EOL . 'kkgUAiEA+FY4SWKv4mfe0gsOBId0Aah/HtVZxDBe3bCXOQM8MMM=', + ], 'x5t' => 'ZnnaQDssCKJQZLp6zyHssIZOa7o', - 'x5t#256' => 'v7VlokKTGL3anRk8Nl0VcqVC9u5j2Fb5tdlQntUgDT4', ], + 'x5t#256' => 'v7VlokKTGL3anRk8Nl0VcqVC9u5j2Fb5tdlQntUgDT4', + ], $result->all() ); } @@ -137,16 +139,19 @@ public function createFromECCertificateFileInPEMFormat(): void */ public function createFrom32kRSACertificateFileInDERFormat(): void { - $result = JWKFactory::createFromCertificateFile(__DIR__.'/RSA/DER/32k-rsa-example-cert.der'); + $result = JWKFactory::createFromCertificateFile(__DIR__ . '/RSA/DER/32k-rsa-example-cert.der'); - static::assertEquals( + static::assertSame( [ 'kty' => 'RSA', 'n' => 'qzPFsFIf3cSes25DloV3y3d8gKMcZVE_EQ_6e_MZnyqDbuOEP39yQs3aunzbZRoO8Xw8lLoJNduiKKsco7odI753kBvz1eLyke-sWBVZttbnYyz9AE3ZXfAb9rHW2AxgIqHNsQOsLJS_douGZwxawNdE90WM4QG80bDpkxxHfObtmZIbZoOFSeokDHA5jokQGzJ65t6ARtQOIht84pIlAr8RO0vCUiJ0R4TdAffbdIukMcVfSoZBlZJ_q-yBtPoqB1Nmr1x1FqCtR81NrEtdp7CUHy4yLIskMzHTwJL24dx8zPS9RBIAuR6HO6soQwQgKY5NYmyaZGuWDrzw0Lor9_jjcx3x7NlXEUffGyUdT_bZ6owsgd-SpvnbqXPXIf-u5JH7afSUuajytHnGVilQOpEg06B0F-AumUEx8vdLPczCx0CED11mhRhT1eRQPJlzxgqA22SN1Yz0P55R8QbfFYcflpEtZbHmdvwMSipEoEUyI8aA9z268oNVnnAGhG3cOqk8-4HOvtqZ9LIc8jUcQLtWX-PJav9EePnWuV6pFwzvKcwl09m08xIfIh9DvFVJz3Fks-X6c1tVo2Valftlj8fnlzu9WgownkwhM4KN2UpcHcff4G-v9zckhcpROSzZ1ax5mPOUMF6B2OVawMhf3li9A9JEpBDxVu2-gZU6NbhvfH1f4PdNPUnlasPylHn4qz4S6_V1fuxho-2O_V72w3V5FDBi-m2D9vDVQvJtuoiJxUEyOWaxsenuzoFlq3jNHwm0SiabwVjaMyre4qktmHopLuLX2ixME3rbTtaXLAaly-t2X6oS4nFyhwP9f_WbJb4Yh_RDxksPj1hR_4nH43NTYjZBlLDM0YRb4xRzFmATQOUhPou6LSUbl8Tl2z7WYFzlcKgHwkWRaTGUV8Sz_h-_IfgZDvCtyyLhzvWOmfJBhsV1nTbDrr8DivZGH5huBNH88v_gbCVw36aAjH8BnmcHQ0ImUUwXoiB1iWSWB3x1xdYnAyQf5RV2PK86wVc4EBRxW6MeJHWZr-kFgHtcwk2ys8MewL8xlKs1S64APAWtD-WsLGEnUVMfM5EuWjoS9kB4BI4DC6M0uyDjaCuFu80wMmWfx9C3-Y2x7l5Lw0G4gRcUk-F3ONtKfsxMqAmV6aUVkXmdkX5LLa105CpIVqflM40CPl5mlVGEFlTf9u0zclyQ0_-qWt78ZzkpolPj9XKHikdYA_DKbvtfgtgNC07GIwBctoQsOrKGOxigeWzrAwfS9S5Wt7hvcs2R0Y04rXoeSTPbHWLumsJYLxC2HPtam3IxQJzCljIOFB5Sqi9WLO5l_yjmUGS2Fzy5DkuyFuC3o79rB-Vu0zpHQ5sHdbyYkfvi3QZx4jLuj2ki-3_1Qj7RfVdd1yWeudnFUy5QGfWh3-VoaK9UIZ1EeX62owXTGNOJovn9yMdwbXmy75qrkPXadFQG3lnuqq_Ucd8ZAYJvwfQb6uhTSv1kSFCpxyyaSBYjLU44QDF6FRh_QHLMBM2DVasOT0hsF2UWsIXUneoJHk_qVZSRmj5EDaIrWAUEZfL_geiwcW3_L3Y9iaHMkB93fHNsVEpLmTO-vLHZHYN0c-kKNVBw_40xGZ5ZgPJlT4JZVvBKuB2ka2OsSLcRXZvzZZZTnrRHb_9dngGkFpI0gc6gFu2d1mPIIFp6JS7AJ4_sYKE4yxuGG7IsA4ErnNBEK9Sr1XSu0_KfcIv63dm_AybDg1vmqMLCl5EiP9OIFsWdIM42970PH9h8Ri7KUn0D53RSRVkV38NW312A2JYCHfEfbIxyibEIrsusib98x6Bedh-3BpsWyih2XlDT6AFwJdD0cc_Uf56Vqv9waUtsSx-1xBwliZ35MKq-IfV6hcLnFgLhxsqakV8aFLAEzI8Ulned6zjRAC28aaDOZcFdKEMD0wHPUW8-9UTQxAgug8otEITWSkKubyXbdofpVa9Xwjq1-jLb4eylqey0RokKrHO6B7F3KtUF8Zsm0mGEg7nvUhjEBFL3AqkLke5Nb_78uqb3tzZF3iO6ghENar9s1DUIYqNkbMSeh7smgER_PBUB0MGMqRnx8qcr5t5yBEurZ7qq7-LYoJOoc6UwaPrQN_AFRou4ugiRrxIrvOwrDPr4y2zoi9XKnBBuYMnt2AkGVCNIA0WOKgmex4x_2Nri2JlRieAPwNPfW5PLkyPVRfw0dNzhg7csMl1Wctdw1JpHJhgMswuhYhRWGyzYWE4ZU8lvQWqA42MOKfUixAV4LmEzGz2eRQSPGWjLC85-mcxf_vssmD-mbuJAjzlLDzzwllrTDCQrt18DftpAAHhD5hG2HmQH9RDzcS3sniIx4p2zyqBHVQsWM74BlQjbODjgHRHerTgxYaNmh4KRA38lmb9omrUhI2Q0Lj5CF2of_Apd7fo8u6LpBpdEtirkn_7-9vPPiGerClV6lSjoNi_I_hHCneAq-3KZq7hM5XliJPvUrws_m0X5n6_fazdk-gOohEuF0Aq_1I5633sS-DGrFyan2K7oeoBGQN994-kweTR0lLko14nC5wnvizbsv7sDUNJTjM7LMYIrhKEILTjjGQ6WuCkYhQuM4RAnx74jFIchW8pS1tEnUcIOyBWgFB9M2zdbNmJg7vH43mmX408jMYVKs9CQz2Y7Vu33S0dSp9sWxM1KUREFVy1xTbVgKNxLxOzXiLOjm_b4EifAHZh_KTf0POm5RESU-TSrO29y5puTHL-PLuOE30jrxXaKhW5UzmQLUMhBGI7geYP6fE6QxyUi0gD_tLdMmzxTlZiOXkE6HnBQ-3Ar54uA-RFUhnzU-XT3wm--eINsvqyrHCyLQlmM71aBXnMlH5g0NJjdm42XSecTopWfFCfcNe1-ufpUuMGGg0C3LxVN5fkTmB2_6gai0AHh4dNhefGkKCZ5OcSNtA_UUI1nKr_wgPTI4X1catN9RE9mMYhOt-I5gOVRCihxDcUcBl2apUaFK-jHPs5rABqhykbi_dOS-zy42I86Vcu4B-_0GNlRIPRLZWFIhNRy_kfCOq4kb4SK9DjTvHsaq6YWMoL9Jk3JiqvH4yrMZ6T-XEFdJ8DGSc41lo1YJwhFUu0eGbGFKxyUBrHv1l9ByPrqWaiepnBBsda4y8G3SoiCfndwkbvLeE5ykYgurPpkYX_bau2PqsoAkiJ_GmbitKpXD71C5PmzvzLvpxkgC6hQq-v4L4WLelADvBpeikX9k23qhR5H3mkzNeMZgHyoFisy161cDgOlcg64g6C2UzJKlb5C1tOlQwM3fdm7cjBJXOjuxgi8Ewx6ov90eeaqIEfFvnUu1_IC_tFve9P_Us21Ak53vwStlHueYHtedJsHg84C5Ppt_z1LFR3Hh8m1pOnlb3kJw5eGpvsXweZrIIN0cvwz-NZ_orIxjPxLf23wy-y-lhObK17BfX1g-p759XtRSaG4Rj_QedauXHAA-SKgvwAOY3kBuWo9Oxx73JbC1kov55TkecHj2lXO_o49O5LCOa_h0nHIVb3JIGWot11sF_6zwNzFM2WtHFNu7Iu9hllumC8rvz3HEbylvSPQYzBQKy8NSyC6T9wbH6cAYY-vl59q1J4DwBH3DHKoMAec8InlnBO_ekJa8SMdQMZxov0BaxJc0W__29w2Sza0cBsMslfpRIWRWMb4jNpyvCyEVxrGf7AakOl0_9P3JCQ2o8cuf-BGg_z_iQ3aTMYVWi_pWuxnhh5NchjQU8C3dxvnEd0Te9mmDlvZh-N9GULo0tlzHz3WZniUp7mxVQ3nkeS31M0LIIF3SetSMjXrGJ_4bzAnb3EjH44eFuvgOiJ8ChXLCmHLtIpFa0WSC6YVpBxqfPrxke-DyB2Lvz_46MSQ4iKvCFhdYWxBtwXCZDN5Dt4XFpMknL_VnuVU8a5_rRqpEebv_VF1pBZsvfTK6UXFWAApFvL4ebApuLsFInG3uk89N2SbenTTiBGWZWZjsEFsvf3iSFZdQ2bgKSLmJIsuXV1mUPkzGEr8SsPLDKhGNZBevtka-CfnukEPn7a3K_O5sYcccEtYwx0VNiC6dWu7B_-pflffa1m4pbhdg6KfykDO9_jU_LE692dhWUzbv977zGUlOnmsEMeqmSTo9V5Hv0UsEDGEjoe9piKidoZ8JdAq1WIpSBfW9M2wtkZHbi2nlaBnKJuTaaNs_nWjbG4y73hEqEqRlQMKrLsJU7rsmy3h6x6-J_tXfkKpWu_Z_PhR-ca2RV4ldwUNejBhBomg-6bcSq1lHXGTpwc0wSDmIUfE2W6ZZysaFpmGpTDFjTDqfeeAwwbzShK7Uc-OnJVNiQ5w1KALJNjXURSfI61vyWRBMtFHaC7t6ixwDfv6pqEa0xeDe4xf4Z1qdX1Zfs4xpdAyzZWmslUsXIYDtiTXq6NYGjnCEPYqneVGOWhP6re0UfzeqqB6p6_L42UoqFrrjU7jnEWRlz6gxdU9qOJgLX3u6CIYtN6b44tpsqA23fNBiuf4SqoYimbd2YVjXFRFFNZ2XqJ-wBqYcD5xIfudMN6W5cAD4p5cTQ11_-EqIp8rDxiWOs-PN8SQTIE7ZYQ6na-lSITpchNybreE9SqhzluoY71DN8oQuUJHonrAW5Hh_VroGBxpbO9XdNhw0XrC-S9iH9DDEUedanM2DznPUZsHHutG8H0K9AEyWRS01sAwrF73ZG57qy5IciYMHZuFbkY0lzwbF-vd15jgNfP4JTmZD2sVWwVgI7Qp9T2hd0uuZL_huHl2baRCyC_DSI9c6p3q9Ud_tBN_yCcNcUVx0rS6EGfzM8VYOGwyiBVBAgVDjBXiKBsUVWA3ljfOtYhLKBDHkqhvoQaczSI2fKX7L7cwgXeBdckoaNhno6mCpZBamuyBZ1Iy6TnguQi59MCCKdiczIpfeumbSDEovy2IbQmPqld_JI6WOufgldiITu3hXR5KNazan2mc3NrKu1SEXZpdzb4wJZZ26U_1xE2GLMJru05yZoVNEkN72DhagM1R5oqHwPzRcn3ahdYvUzDoP6UHEpa76A23lqafY7F98l66hmAnXXlEKzEVwthYoxWANYtVsxs9NktNJdNMB3OCMnCo9BWkefmjlrzMJSkBP_1mfxN2o3W1tMNXpk5OQPO20_eWPF3iYhobSo8fcxzXtw9bg1BXr0TADj0hl_z4jw93wVGGLlsA3qYstay0I9yJgHBZmhxc7V1JzNWdwxIDmRgA5eCm1ELVBxpIup9WGZlUs1rzwqXzI-37i7l3dwFfCf_i2g8m-gNQjuM6YqkSz-XKcn-sJEg1XSMhoB15sgYE9U-2Oe-_EGLK0dOU2zyHO40F8ghvhKWpuAcITX_QnEMremwsiCl0PEnGZ98BXzlRvd1MFNc0ZUwzN-wTVxs4jNkteNbp0MjIKA5Y6FiCEX6koNWY9cLXSNg4XG4IsWRQrfIn2WWFz_nhzlaZNm_NUM1kmKRREPmsvQ', 'e' => 'AQAB', - 'x5c' => ['MIIR2jCCEUMCAg4EMA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIx'.PHP_EOL.'MDEwMTIxNzQ5WhcNMTcxMDA5MTIxNzQ5WjBKMQswCQYDVQQGDAJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wghAiMA0GCSqGSIb3DQEBAQUAA4IQDwAwghAKAoIQAQCrM8WwUh/dxJ6z'.PHP_EOL.'bkOWhXfLd3yAoxxlUT8RD/p78xmfKoNu44Q/f3JCzdq6fNtlGg7xfDyUugk126Io'.PHP_EOL.'qxyjuh0jvneQG/PV4vKR76xYFVm21udjLP0ATdld8Bv2sdbYDGAioc2xA6wslL92'.PHP_EOL.'i4ZnDFrA10T3RYzhAbzRsOmTHEd85u2Zkhtmg4VJ6iQMcDmOiRAbMnrm3oBG1A4i'.PHP_EOL.'G3zikiUCvxE7S8JSInRHhN0B99t0i6QxxV9KhkGVkn+r7IG0+ioHU2avXHUWoK1H'.PHP_EOL.'zU2sS12nsJQfLjIsiyQzMdPAkvbh3HzM9L1EEgC5Hoc7qyhDBCApjk1ibJpka5YO'.PHP_EOL.'vPDQuiv3+ONzHfHs2VcRR98bJR1P9tnqjCyB35Km+dupc9ch/67kkftp9JS5qPK0'.PHP_EOL.'ecZWKVA6kSDToHQX4C6ZQTHy90s9zMLHQIQPXWaFGFPV5FA8mXPGCoDbZI3VjPQ/'.PHP_EOL.'nlHxBt8Vhx+WkS1lseZ2/AxKKkSgRTIjxoD3Pbryg1WecAaEbdw6qTz7gc6+2pn0'.PHP_EOL.'shzyNRxAu1Zf48lq/0R4+da5XqkXDO8pzCXT2bTzEh8iH0O8VUnPcWSz5fpzW1Wj'.PHP_EOL.'ZVqV+2WPx+eXO71aCjCeTCEzgo3ZSlwdx9/gb6/3NySFylE5LNnVrHmY85QwXoHY'.PHP_EOL.'5VrAyF/eWL0D0kSkEPFW7b6BlTo1uG98fV/g9009SeVqw/KUefirPhLr9XV+7GGj'.PHP_EOL.'7Y79XvbDdXkUMGL6bYP28NVC8m26iInFQTI5ZrGx6e7OgWWreM0fCbRKJpvBWNoz'.PHP_EOL.'Kt7iqS2Yeiku4tfaLEwTettO1pcsBqXL63ZfqhLicXKHA/1/9ZslvhiH9EPGSw+P'.PHP_EOL.'WFH/icfjc1NiNkGUsMzRhFvjFHMWYBNA5SE+i7otJRuXxOXbPtZgXOVwqAfCRZFp'.PHP_EOL.'MZRXxLP+H78h+BkO8K3LIuHO9Y6Z8kGGxXWdNsOuvwOK9kYfmG4E0fzy/+BsJXDf'.PHP_EOL.'poCMfwGeZwdDQiZRTBeiIHWJZJYHfHXF1icDJB/lFXY8rzrBVzgQFHFbox4kdZmv'.PHP_EOL.'6QWAe1zCTbKzwx7AvzGUqzVLrgA8Ba0P5awsYSdRUx8zkS5aOhL2QHgEjgMLozS7'.PHP_EOL.'IONoK4W7zTAyZZ/H0Lf5jbHuXkvDQbiBFxST4Xc420p+zEyoCZXppRWReZ2Rfkst'.PHP_EOL.'rXTkKkhWp+UzjQI+XmaVUYQWVN/27TNyXJDT/6pa3vxnOSmiU+P1coeKR1gD8Mpu'.PHP_EOL.'+1+C2A0LTsYjAFy2hCw6soY7GKB5bOsDB9L1Lla3uG9yzZHRjTiteh5JM9sdYu6a'.PHP_EOL.'wlgvELYc+1qbcjFAnMKWMg4UHlKqL1Ys7mX/KOZQZLYXPLkOS7IW4Lejv2sH5W7T'.PHP_EOL.'OkdDmwd1vJiR++LdBnHiMu6PaSL7f/VCPtF9V13XJZ652cVTLlAZ9aHf5Whor1Qh'.PHP_EOL.'nUR5frajBdMY04mi+f3Ix3BtebLvmquQ9dp0VAbeWe6qr9Rx3xkBgm/B9Bvq6FNK'.PHP_EOL.'/WRIUKnHLJpIFiMtTjhAMXoVGH9AcswEzYNVqw5PSGwXZRawhdSd6gkeT+pVlJGa'.PHP_EOL.'PkQNoitYBQRl8v+B6LBxbf8vdj2JocyQH3d8c2xUSkuZM768sdkdg3Rz6Qo1UHD/'.PHP_EOL.'jTEZnlmA8mVPgllW8Eq4HaRrY6xItxFdm/NlllOetEdv/12eAaQWkjSBzqAW7Z3W'.PHP_EOL.'Y8ggWnolLsAnj+xgoTjLG4YbsiwDgSuc0EQr1KvVdK7T8p9wi/rd2b8DJsODW+ao'.PHP_EOL.'wsKXkSI/04gWxZ0gzjb3vQ8f2HxGLspSfQPndFJFWRXfw1bfXYDYlgId8R9sjHKJ'.PHP_EOL.'sQiuy6yJv3zHoF52H7cGmxbKKHZeUNPoAXAl0PRxz9R/npWq/3BpS2xLH7XEHCWJ'.PHP_EOL.'nfkwqr4h9XqFwucWAuHGypqRXxoUsATMjxSWd53rONEALbxpoM5lwV0oQwPTAc9R'.PHP_EOL.'bz71RNDECC6Dyi0QhNZKQq5vJdt2h+lVr1fCOrX6Mtvh7KWp7LRGiQqsc7oHsXcq'.PHP_EOL.'1QXxmybSYYSDue9SGMQEUvcCqQuR7k1v/vy6pve3NkXeI7qCEQ1qv2zUNQhio2Rs'.PHP_EOL.'xJ6HuyaARH88FQHQwYypGfHypyvm3nIES6tnuqrv4tigk6hzpTBo+tA38AVGi7i6'.PHP_EOL.'CJGvEiu87CsM+vjLbOiL1cqcEG5gye3YCQZUI0gDRY4qCZ7HjH/Y2uLYmVGJ4A/A'.PHP_EOL.'099bk8uTI9VF/DR03OGDtywyXVZy13DUmkcmGAyzC6FiFFYbLNhYThlTyW9BaoDj'.PHP_EOL.'Yw4p9SLEBXguYTMbPZ5FBI8ZaMsLzn6ZzF/++yyYP6Zu4kCPOUsPPPCWWtMMJCu3'.PHP_EOL.'XwN+2kAAeEPmEbYeZAf1EPNxLeyeIjHinbPKoEdVCxYzvgGVCNs4OOAdEd6tODFh'.PHP_EOL.'o2aHgpEDfyWZv2iatSEjZDQuPkIXah/8Cl3t+jy7oukGl0S2KuSf/v7288+IZ6sK'.PHP_EOL.'VXqVKOg2L8j+EcKd4Cr7cpmruEzleWIk+9SvCz+bRfmfr99rN2T6A6iES4XQCr/U'.PHP_EOL.'jnrfexL4MasXJqfYruh6gEZA333j6TB5NHSUuSjXicLnCe+LNuy/uwNQ0lOMzssx'.PHP_EOL.'giuEoQgtOOMZDpa4KRiFC4zhECfHviMUhyFbylLW0SdRwg7IFaAUH0zbN1s2YmDu'.PHP_EOL.'8fjeaZfjTyMxhUqz0JDPZjtW7fdLR1Kn2xbEzUpREQVXLXFNtWAo3EvE7NeIs6Ob'.PHP_EOL.'9vgSJ8AdmH8pN/Q86blERJT5NKs7b3Lmm5Mcv48u44TfSOvFdoqFblTOZAtQyEEY'.PHP_EOL.'juB5g/p8TpDHJSLSAP+0t0ybPFOVmI5eQToecFD7cCvni4D5EVSGfNT5dPfCb754'.PHP_EOL.'g2y+rKscLItCWYzvVoFecyUfmDQ0mN2bjZdJ5xOilZ8UJ9w17X65+lS4wYaDQLcv'.PHP_EOL.'FU3l+ROYHb/qBqLQAeHh02F58aQoJnk5xI20D9RQjWcqv/CA9MjhfVxq031ET2Yx'.PHP_EOL.'iE634jmA5VEKKHENxRwGXZqlRoUr6Mc+zmsAGqHKRuL905L7PLjYjzpVy7gH7/QY'.PHP_EOL.'2VEg9EtlYUiE1HL+R8I6riRvhIr0ONO8exqrphYygv0mTcmKq8fjKsxnpP5cQV0n'.PHP_EOL.'wMZJzjWWjVgnCEVS7R4ZsYUrHJQGse/WX0HI+upZqJ6mcEGx1rjLwbdKiIJ+d3CR'.PHP_EOL.'u8t4TnKRiC6s+mRhf9tq7Y+qygCSIn8aZuK0qlcPvULk+bO/Mu+nGSALqFCr6/gv'.PHP_EOL.'hYt6UAO8Gl6KRf2TbeqFHkfeaTM14xmAfKgWKzLXrVwOA6VyDriDoLZTMkqVvkLW'.PHP_EOL.'06VDAzd92btyMElc6O7GCLwTDHqi/3R55qogR8W+dS7X8gL+0W970/9SzbUCTne/'.PHP_EOL.'BK2Ue55ge150mweDzgLk+m3/PUsVHceHybWk6eVveQnDl4am+xfB5msgg3Ry/DP4'.PHP_EOL.'1n+isjGM/Et/bfDL7L6WE5srXsF9fWD6nvn1e1FJobhGP9B51q5ccAD5IqC/AA5j'.PHP_EOL.'eQG5aj07HHvclsLWSi/nlOR5wePaVc7+jj07ksI5r+HScchVvckgZai3XWwX/rPA'.PHP_EOL.'3MUzZa0cU27si72GWW6YLyu/PccRvKW9I9BjMFArLw1LILpP3BsfpwBhj6+Xn2rU'.PHP_EOL.'ngPAEfcMcqgwB5zwieWcE796QlrxIx1AxnGi/QFrElzRb//b3DZLNrRwGwyyV+lE'.PHP_EOL.'hZFYxviM2nK8LIRXGsZ/sBqQ6XT/0/ckJDajxy5/4EaD/P+JDdpMxhVaL+la7GeG'.PHP_EOL.'Hk1yGNBTwLd3G+cR3RN72aYOW9mH430ZQujS2XMfPdZmeJSnubFVDeeR5LfUzQsg'.PHP_EOL.'gXdJ61IyNesYn/hvMCdvcSMfjh4W6+A6InwKFcsKYcu0ikVrRZILphWkHGp8+vGR'.PHP_EOL.'74PIHYu/P/joxJDiIq8IWF1hbEG3BcJkM3kO3hcWkyScv9We5VTxrn+tGqkR5u/9'.PHP_EOL.'UXWkFmy99MrpRcVYACkW8vh5sCm4uwUicbe6Tz03ZJt6dNOIEZZlZmOwQWy9/eJI'.PHP_EOL.'Vl1DZuApIuYkiy5dXWZQ+TMYSvxKw8sMqEY1kF6+2Rr4J+e6QQ+ftrcr87mxhxxw'.PHP_EOL.'S1jDHRU2ILp1a7sH/6l+V99rWbiluF2Dop/KQM73+NT8sTr3Z2FZTNu/3vvMZSU6'.PHP_EOL.'eawQx6qZJOj1Xke/RSwQMYSOh72mIqJ2hnwl0CrVYilIF9b0zbC2RkduLaeVoGco'.PHP_EOL.'m5Npo2z+daNsbjLveESoSpGVAwqsuwlTuuybLeHrHr4n+1d+Qqla79n8+FH5xrZF'.PHP_EOL.'XiV3BQ16MGEGiaD7ptxKrWUdcZOnBzTBIOYhR8TZbplnKxoWmYalMMWNMOp954DD'.PHP_EOL.'BvNKErtRz46clU2JDnDUoAsk2NdRFJ8jrW/JZEEy0UdoLu3qLHAN+/qmoRrTF4N7'.PHP_EOL.'jF/hnWp1fVl+zjGl0DLNlaayVSxchgO2JNero1gaOcIQ9iqd5UY5aE/qt7RR/N6q'.PHP_EOL.'oHqnr8vjZSioWuuNTuOcRZGXPqDF1T2o4mAtfe7oIhi03pvji2myoDbd80GK5/hK'.PHP_EOL.'qhiKZt3ZhWNcVEUU1nZeon7AGphwPnEh+50w3pblwAPinlxNDXX/4SoinysPGJY6'.PHP_EOL.'z483xJBMgTtlhDqdr6VIhOlyE3Jut4T1KqHOW6hjvUM3yhC5QkeiesBbkeH9WugY'.PHP_EOL.'HGls71d02HDResL5L2If0MMRR51qczYPOc9Rmwce60bwfQr0ATJZFLTWwDCsXvdk'.PHP_EOL.'bnurLkhyJgwdm4VuRjSXPBsX693XmOA18/glOZkPaxVbBWAjtCn1PaF3S65kv+G4'.PHP_EOL.'eXZtpELIL8NIj1zqner1R3+0E3/IJw1xRXHStLoQZ/MzxVg4bDKIFUECBUOMFeIo'.PHP_EOL.'GxRVYDeWN861iEsoEMeSqG+hBpzNIjZ8pfsvtzCBd4F1ySho2GejqYKlkFqa7IFn'.PHP_EOL.'UjLpOeC5CLn0wIIp2JzMil966ZtIMSi/LYhtCY+qV38kjpY65+CV2IhO7eFdHko1'.PHP_EOL.'rNqfaZzc2sq7VIRdml3NvjAllnbpT/XETYYswmu7TnJmhU0SQ3vYOFqAzVHmiofA'.PHP_EOL.'/NFyfdqF1i9TMOg/pQcSlrvoDbeWpp9jsX3yXrqGYCddeUQrMRXC2FijFYA1i1Wz'.PHP_EOL.'Gz02S00l00wHc4IycKj0FaR5+aOWvMwlKQE//WZ/E3ajdbW0w1emTk5A87bT95Y8'.PHP_EOL.'XeJiGhtKjx9zHNe3D1uDUFevRMAOPSGX/PiPD3fBUYYuWwDepiy1rLQj3ImAcFma'.PHP_EOL.'HFztXUnM1Z3DEgOZGADl4KbUQtUHGki6n1YZmVSzWvPCpfMj7fuLuXd3AV8J/+La'.PHP_EOL.'Dyb6A1CO4zpiqRLP5cpyf6wkSDVdIyGgHXmyBgT1T7Y5778QYsrR05TbPIc7jQXy'.PHP_EOL.'CG+Epam4BwhNf9CcQyt6bCyIKXQ8ScZn3wFfOVG93UwU1zRlTDM37BNXGziM2S14'.PHP_EOL.'1unQyMgoDljoWIIRfqSg1Zj1wtdI2DhcbgixZFCt8ifZZYXP+eHOVpk2b81QzWSY'.PHP_EOL.'pFEQ+ay9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEATPINk/17H+RLz459iCVQAGes'.PHP_EOL.'8kc5sxYj3CkMlWrGMiCxvsgu2kak6dCa0f3DfiVt54Fry7s0OklHiZmipoiF4RCt'.PHP_EOL.'yJwUSAzRrZFAbkpDg8oIu4Ui/Bt13kY7xON+u4m0IgkLZSE+8BSjMrfjVvVxe+qH'.PHP_EOL.'5i7X/ibUTDjgyfdA8XI='], + 'x5c' => [ + 'MIIR2jCCEUMCAg4EMA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIx' . PHP_EOL . 'MDEwMTIxNzQ5WhcNMTcxMDA5MTIxNzQ5WjBKMQswCQYDVQQGDAJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wghAiMA0GCSqGSIb3DQEBAQUAA4IQDwAwghAKAoIQAQCrM8WwUh/dxJ6z' . PHP_EOL . 'bkOWhXfLd3yAoxxlUT8RD/p78xmfKoNu44Q/f3JCzdq6fNtlGg7xfDyUugk126Io' . PHP_EOL . 'qxyjuh0jvneQG/PV4vKR76xYFVm21udjLP0ATdld8Bv2sdbYDGAioc2xA6wslL92' . PHP_EOL . 'i4ZnDFrA10T3RYzhAbzRsOmTHEd85u2Zkhtmg4VJ6iQMcDmOiRAbMnrm3oBG1A4i' . PHP_EOL . 'G3zikiUCvxE7S8JSInRHhN0B99t0i6QxxV9KhkGVkn+r7IG0+ioHU2avXHUWoK1H' . PHP_EOL . 'zU2sS12nsJQfLjIsiyQzMdPAkvbh3HzM9L1EEgC5Hoc7qyhDBCApjk1ibJpka5YO' . PHP_EOL . 'vPDQuiv3+ONzHfHs2VcRR98bJR1P9tnqjCyB35Km+dupc9ch/67kkftp9JS5qPK0' . PHP_EOL . 'ecZWKVA6kSDToHQX4C6ZQTHy90s9zMLHQIQPXWaFGFPV5FA8mXPGCoDbZI3VjPQ/' . PHP_EOL . 'nlHxBt8Vhx+WkS1lseZ2/AxKKkSgRTIjxoD3Pbryg1WecAaEbdw6qTz7gc6+2pn0' . PHP_EOL . 'shzyNRxAu1Zf48lq/0R4+da5XqkXDO8pzCXT2bTzEh8iH0O8VUnPcWSz5fpzW1Wj' . PHP_EOL . 'ZVqV+2WPx+eXO71aCjCeTCEzgo3ZSlwdx9/gb6/3NySFylE5LNnVrHmY85QwXoHY' . PHP_EOL . '5VrAyF/eWL0D0kSkEPFW7b6BlTo1uG98fV/g9009SeVqw/KUefirPhLr9XV+7GGj' . PHP_EOL . '7Y79XvbDdXkUMGL6bYP28NVC8m26iInFQTI5ZrGx6e7OgWWreM0fCbRKJpvBWNoz' . PHP_EOL . 'Kt7iqS2Yeiku4tfaLEwTettO1pcsBqXL63ZfqhLicXKHA/1/9ZslvhiH9EPGSw+P' . PHP_EOL . 'WFH/icfjc1NiNkGUsMzRhFvjFHMWYBNA5SE+i7otJRuXxOXbPtZgXOVwqAfCRZFp' . PHP_EOL . 'MZRXxLP+H78h+BkO8K3LIuHO9Y6Z8kGGxXWdNsOuvwOK9kYfmG4E0fzy/+BsJXDf' . PHP_EOL . 'poCMfwGeZwdDQiZRTBeiIHWJZJYHfHXF1icDJB/lFXY8rzrBVzgQFHFbox4kdZmv' . PHP_EOL . '6QWAe1zCTbKzwx7AvzGUqzVLrgA8Ba0P5awsYSdRUx8zkS5aOhL2QHgEjgMLozS7' . PHP_EOL . 'IONoK4W7zTAyZZ/H0Lf5jbHuXkvDQbiBFxST4Xc420p+zEyoCZXppRWReZ2Rfkst' . PHP_EOL . 'rXTkKkhWp+UzjQI+XmaVUYQWVN/27TNyXJDT/6pa3vxnOSmiU+P1coeKR1gD8Mpu' . PHP_EOL . '+1+C2A0LTsYjAFy2hCw6soY7GKB5bOsDB9L1Lla3uG9yzZHRjTiteh5JM9sdYu6a' . PHP_EOL . 'wlgvELYc+1qbcjFAnMKWMg4UHlKqL1Ys7mX/KOZQZLYXPLkOS7IW4Lejv2sH5W7T' . PHP_EOL . 'OkdDmwd1vJiR++LdBnHiMu6PaSL7f/VCPtF9V13XJZ652cVTLlAZ9aHf5Whor1Qh' . PHP_EOL . 'nUR5frajBdMY04mi+f3Ix3BtebLvmquQ9dp0VAbeWe6qr9Rx3xkBgm/B9Bvq6FNK' . PHP_EOL . '/WRIUKnHLJpIFiMtTjhAMXoVGH9AcswEzYNVqw5PSGwXZRawhdSd6gkeT+pVlJGa' . PHP_EOL . 'PkQNoitYBQRl8v+B6LBxbf8vdj2JocyQH3d8c2xUSkuZM768sdkdg3Rz6Qo1UHD/' . PHP_EOL . 'jTEZnlmA8mVPgllW8Eq4HaRrY6xItxFdm/NlllOetEdv/12eAaQWkjSBzqAW7Z3W' . PHP_EOL . 'Y8ggWnolLsAnj+xgoTjLG4YbsiwDgSuc0EQr1KvVdK7T8p9wi/rd2b8DJsODW+ao' . PHP_EOL . 'wsKXkSI/04gWxZ0gzjb3vQ8f2HxGLspSfQPndFJFWRXfw1bfXYDYlgId8R9sjHKJ' . PHP_EOL . 'sQiuy6yJv3zHoF52H7cGmxbKKHZeUNPoAXAl0PRxz9R/npWq/3BpS2xLH7XEHCWJ' . PHP_EOL . 'nfkwqr4h9XqFwucWAuHGypqRXxoUsATMjxSWd53rONEALbxpoM5lwV0oQwPTAc9R' . PHP_EOL . 'bz71RNDECC6Dyi0QhNZKQq5vJdt2h+lVr1fCOrX6Mtvh7KWp7LRGiQqsc7oHsXcq' . PHP_EOL . '1QXxmybSYYSDue9SGMQEUvcCqQuR7k1v/vy6pve3NkXeI7qCEQ1qv2zUNQhio2Rs' . PHP_EOL . 'xJ6HuyaARH88FQHQwYypGfHypyvm3nIES6tnuqrv4tigk6hzpTBo+tA38AVGi7i6' . PHP_EOL . 'CJGvEiu87CsM+vjLbOiL1cqcEG5gye3YCQZUI0gDRY4qCZ7HjH/Y2uLYmVGJ4A/A' . PHP_EOL . '099bk8uTI9VF/DR03OGDtywyXVZy13DUmkcmGAyzC6FiFFYbLNhYThlTyW9BaoDj' . PHP_EOL . 'Yw4p9SLEBXguYTMbPZ5FBI8ZaMsLzn6ZzF/++yyYP6Zu4kCPOUsPPPCWWtMMJCu3' . PHP_EOL . 'XwN+2kAAeEPmEbYeZAf1EPNxLeyeIjHinbPKoEdVCxYzvgGVCNs4OOAdEd6tODFh' . PHP_EOL . 'o2aHgpEDfyWZv2iatSEjZDQuPkIXah/8Cl3t+jy7oukGl0S2KuSf/v7288+IZ6sK' . PHP_EOL . 'VXqVKOg2L8j+EcKd4Cr7cpmruEzleWIk+9SvCz+bRfmfr99rN2T6A6iES4XQCr/U' . PHP_EOL . 'jnrfexL4MasXJqfYruh6gEZA333j6TB5NHSUuSjXicLnCe+LNuy/uwNQ0lOMzssx' . PHP_EOL . 'giuEoQgtOOMZDpa4KRiFC4zhECfHviMUhyFbylLW0SdRwg7IFaAUH0zbN1s2YmDu' . PHP_EOL . '8fjeaZfjTyMxhUqz0JDPZjtW7fdLR1Kn2xbEzUpREQVXLXFNtWAo3EvE7NeIs6Ob' . PHP_EOL . '9vgSJ8AdmH8pN/Q86blERJT5NKs7b3Lmm5Mcv48u44TfSOvFdoqFblTOZAtQyEEY' . PHP_EOL . 'juB5g/p8TpDHJSLSAP+0t0ybPFOVmI5eQToecFD7cCvni4D5EVSGfNT5dPfCb754' . PHP_EOL . 'g2y+rKscLItCWYzvVoFecyUfmDQ0mN2bjZdJ5xOilZ8UJ9w17X65+lS4wYaDQLcv' . PHP_EOL . 'FU3l+ROYHb/qBqLQAeHh02F58aQoJnk5xI20D9RQjWcqv/CA9MjhfVxq031ET2Yx' . PHP_EOL . 'iE634jmA5VEKKHENxRwGXZqlRoUr6Mc+zmsAGqHKRuL905L7PLjYjzpVy7gH7/QY' . PHP_EOL . '2VEg9EtlYUiE1HL+R8I6riRvhIr0ONO8exqrphYygv0mTcmKq8fjKsxnpP5cQV0n' . PHP_EOL . 'wMZJzjWWjVgnCEVS7R4ZsYUrHJQGse/WX0HI+upZqJ6mcEGx1rjLwbdKiIJ+d3CR' . PHP_EOL . 'u8t4TnKRiC6s+mRhf9tq7Y+qygCSIn8aZuK0qlcPvULk+bO/Mu+nGSALqFCr6/gv' . PHP_EOL . 'hYt6UAO8Gl6KRf2TbeqFHkfeaTM14xmAfKgWKzLXrVwOA6VyDriDoLZTMkqVvkLW' . PHP_EOL . '06VDAzd92btyMElc6O7GCLwTDHqi/3R55qogR8W+dS7X8gL+0W970/9SzbUCTne/' . PHP_EOL . 'BK2Ue55ge150mweDzgLk+m3/PUsVHceHybWk6eVveQnDl4am+xfB5msgg3Ry/DP4' . PHP_EOL . '1n+isjGM/Et/bfDL7L6WE5srXsF9fWD6nvn1e1FJobhGP9B51q5ccAD5IqC/AA5j' . PHP_EOL . 'eQG5aj07HHvclsLWSi/nlOR5wePaVc7+jj07ksI5r+HScchVvckgZai3XWwX/rPA' . PHP_EOL . '3MUzZa0cU27si72GWW6YLyu/PccRvKW9I9BjMFArLw1LILpP3BsfpwBhj6+Xn2rU' . PHP_EOL . 'ngPAEfcMcqgwB5zwieWcE796QlrxIx1AxnGi/QFrElzRb//b3DZLNrRwGwyyV+lE' . PHP_EOL . 'hZFYxviM2nK8LIRXGsZ/sBqQ6XT/0/ckJDajxy5/4EaD/P+JDdpMxhVaL+la7GeG' . PHP_EOL . 'Hk1yGNBTwLd3G+cR3RN72aYOW9mH430ZQujS2XMfPdZmeJSnubFVDeeR5LfUzQsg' . PHP_EOL . 'gXdJ61IyNesYn/hvMCdvcSMfjh4W6+A6InwKFcsKYcu0ikVrRZILphWkHGp8+vGR' . PHP_EOL . '74PIHYu/P/joxJDiIq8IWF1hbEG3BcJkM3kO3hcWkyScv9We5VTxrn+tGqkR5u/9' . PHP_EOL . 'UXWkFmy99MrpRcVYACkW8vh5sCm4uwUicbe6Tz03ZJt6dNOIEZZlZmOwQWy9/eJI' . PHP_EOL . 'Vl1DZuApIuYkiy5dXWZQ+TMYSvxKw8sMqEY1kF6+2Rr4J+e6QQ+ftrcr87mxhxxw' . PHP_EOL . 'S1jDHRU2ILp1a7sH/6l+V99rWbiluF2Dop/KQM73+NT8sTr3Z2FZTNu/3vvMZSU6' . PHP_EOL . 'eawQx6qZJOj1Xke/RSwQMYSOh72mIqJ2hnwl0CrVYilIF9b0zbC2RkduLaeVoGco' . PHP_EOL . 'm5Npo2z+daNsbjLveESoSpGVAwqsuwlTuuybLeHrHr4n+1d+Qqla79n8+FH5xrZF' . PHP_EOL . 'XiV3BQ16MGEGiaD7ptxKrWUdcZOnBzTBIOYhR8TZbplnKxoWmYalMMWNMOp954DD' . PHP_EOL . 'BvNKErtRz46clU2JDnDUoAsk2NdRFJ8jrW/JZEEy0UdoLu3qLHAN+/qmoRrTF4N7' . PHP_EOL . 'jF/hnWp1fVl+zjGl0DLNlaayVSxchgO2JNero1gaOcIQ9iqd5UY5aE/qt7RR/N6q' . PHP_EOL . 'oHqnr8vjZSioWuuNTuOcRZGXPqDF1T2o4mAtfe7oIhi03pvji2myoDbd80GK5/hK' . PHP_EOL . 'qhiKZt3ZhWNcVEUU1nZeon7AGphwPnEh+50w3pblwAPinlxNDXX/4SoinysPGJY6' . PHP_EOL . 'z483xJBMgTtlhDqdr6VIhOlyE3Jut4T1KqHOW6hjvUM3yhC5QkeiesBbkeH9WugY' . PHP_EOL . 'HGls71d02HDResL5L2If0MMRR51qczYPOc9Rmwce60bwfQr0ATJZFLTWwDCsXvdk' . PHP_EOL . 'bnurLkhyJgwdm4VuRjSXPBsX693XmOA18/glOZkPaxVbBWAjtCn1PaF3S65kv+G4' . PHP_EOL . 'eXZtpELIL8NIj1zqner1R3+0E3/IJw1xRXHStLoQZ/MzxVg4bDKIFUECBUOMFeIo' . PHP_EOL . 'GxRVYDeWN861iEsoEMeSqG+hBpzNIjZ8pfsvtzCBd4F1ySho2GejqYKlkFqa7IFn' . PHP_EOL . 'UjLpOeC5CLn0wIIp2JzMil966ZtIMSi/LYhtCY+qV38kjpY65+CV2IhO7eFdHko1' . PHP_EOL . 'rNqfaZzc2sq7VIRdml3NvjAllnbpT/XETYYswmu7TnJmhU0SQ3vYOFqAzVHmiofA' . PHP_EOL . '/NFyfdqF1i9TMOg/pQcSlrvoDbeWpp9jsX3yXrqGYCddeUQrMRXC2FijFYA1i1Wz' . PHP_EOL . 'Gz02S00l00wHc4IycKj0FaR5+aOWvMwlKQE//WZ/E3ajdbW0w1emTk5A87bT95Y8' . PHP_EOL . 'XeJiGhtKjx9zHNe3D1uDUFevRMAOPSGX/PiPD3fBUYYuWwDepiy1rLQj3ImAcFma' . PHP_EOL . 'HFztXUnM1Z3DEgOZGADl4KbUQtUHGki6n1YZmVSzWvPCpfMj7fuLuXd3AV8J/+La' . PHP_EOL . 'Dyb6A1CO4zpiqRLP5cpyf6wkSDVdIyGgHXmyBgT1T7Y5778QYsrR05TbPIc7jQXy' . PHP_EOL . 'CG+Epam4BwhNf9CcQyt6bCyIKXQ8ScZn3wFfOVG93UwU1zRlTDM37BNXGziM2S14' . PHP_EOL . '1unQyMgoDljoWIIRfqSg1Zj1wtdI2DhcbgixZFCt8ifZZYXP+eHOVpk2b81QzWSY' . PHP_EOL . 'pFEQ+ay9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEATPINk/17H+RLz459iCVQAGes' . PHP_EOL . '8kc5sxYj3CkMlWrGMiCxvsgu2kak6dCa0f3DfiVt54Fry7s0OklHiZmipoiF4RCt' . PHP_EOL . 'yJwUSAzRrZFAbkpDg8oIu4Ui/Bt13kY7xON+u4m0IgkLZSE+8BSjMrfjVvVxe+qH' . PHP_EOL . '5i7X/ibUTDjgyfdA8XI=', + ], 'x5t' => 'KGApLybHWJmBwZGgBk07AlRD9nU', - 'x5t#256' => 'YD12k6kc4xuh_5vEHMyyOFpGs6VqTyaKMlxg0Nt2crA', ], + 'x5t#256' => 'YD12k6kc4xuh_5vEHMyyOFpGs6VqTyaKMlxg0Nt2crA', + ], $result->all() ); } @@ -156,16 +161,19 @@ public function createFrom32kRSACertificateFileInDERFormat(): void */ public function createFrom32kRSACertificateFileInPEMFormat(): void { - $result = JWKFactory::createFromCertificateFile(__DIR__.'/RSA/PEM/32k-rsa-example-cert.pem'); + $result = JWKFactory::createFromCertificateFile(__DIR__ . '/RSA/PEM/32k-rsa-example-cert.pem'); - static::assertEquals( + static::assertSame( [ 'kty' => 'RSA', 'n' => 'qzPFsFIf3cSes25DloV3y3d8gKMcZVE_EQ_6e_MZnyqDbuOEP39yQs3aunzbZRoO8Xw8lLoJNduiKKsco7odI753kBvz1eLyke-sWBVZttbnYyz9AE3ZXfAb9rHW2AxgIqHNsQOsLJS_douGZwxawNdE90WM4QG80bDpkxxHfObtmZIbZoOFSeokDHA5jokQGzJ65t6ARtQOIht84pIlAr8RO0vCUiJ0R4TdAffbdIukMcVfSoZBlZJ_q-yBtPoqB1Nmr1x1FqCtR81NrEtdp7CUHy4yLIskMzHTwJL24dx8zPS9RBIAuR6HO6soQwQgKY5NYmyaZGuWDrzw0Lor9_jjcx3x7NlXEUffGyUdT_bZ6owsgd-SpvnbqXPXIf-u5JH7afSUuajytHnGVilQOpEg06B0F-AumUEx8vdLPczCx0CED11mhRhT1eRQPJlzxgqA22SN1Yz0P55R8QbfFYcflpEtZbHmdvwMSipEoEUyI8aA9z268oNVnnAGhG3cOqk8-4HOvtqZ9LIc8jUcQLtWX-PJav9EePnWuV6pFwzvKcwl09m08xIfIh9DvFVJz3Fks-X6c1tVo2Valftlj8fnlzu9WgownkwhM4KN2UpcHcff4G-v9zckhcpROSzZ1ax5mPOUMF6B2OVawMhf3li9A9JEpBDxVu2-gZU6NbhvfH1f4PdNPUnlasPylHn4qz4S6_V1fuxho-2O_V72w3V5FDBi-m2D9vDVQvJtuoiJxUEyOWaxsenuzoFlq3jNHwm0SiabwVjaMyre4qktmHopLuLX2ixME3rbTtaXLAaly-t2X6oS4nFyhwP9f_WbJb4Yh_RDxksPj1hR_4nH43NTYjZBlLDM0YRb4xRzFmATQOUhPou6LSUbl8Tl2z7WYFzlcKgHwkWRaTGUV8Sz_h-_IfgZDvCtyyLhzvWOmfJBhsV1nTbDrr8DivZGH5huBNH88v_gbCVw36aAjH8BnmcHQ0ImUUwXoiB1iWSWB3x1xdYnAyQf5RV2PK86wVc4EBRxW6MeJHWZr-kFgHtcwk2ys8MewL8xlKs1S64APAWtD-WsLGEnUVMfM5EuWjoS9kB4BI4DC6M0uyDjaCuFu80wMmWfx9C3-Y2x7l5Lw0G4gRcUk-F3ONtKfsxMqAmV6aUVkXmdkX5LLa105CpIVqflM40CPl5mlVGEFlTf9u0zclyQ0_-qWt78ZzkpolPj9XKHikdYA_DKbvtfgtgNC07GIwBctoQsOrKGOxigeWzrAwfS9S5Wt7hvcs2R0Y04rXoeSTPbHWLumsJYLxC2HPtam3IxQJzCljIOFB5Sqi9WLO5l_yjmUGS2Fzy5DkuyFuC3o79rB-Vu0zpHQ5sHdbyYkfvi3QZx4jLuj2ki-3_1Qj7RfVdd1yWeudnFUy5QGfWh3-VoaK9UIZ1EeX62owXTGNOJovn9yMdwbXmy75qrkPXadFQG3lnuqq_Ucd8ZAYJvwfQb6uhTSv1kSFCpxyyaSBYjLU44QDF6FRh_QHLMBM2DVasOT0hsF2UWsIXUneoJHk_qVZSRmj5EDaIrWAUEZfL_geiwcW3_L3Y9iaHMkB93fHNsVEpLmTO-vLHZHYN0c-kKNVBw_40xGZ5ZgPJlT4JZVvBKuB2ka2OsSLcRXZvzZZZTnrRHb_9dngGkFpI0gc6gFu2d1mPIIFp6JS7AJ4_sYKE4yxuGG7IsA4ErnNBEK9Sr1XSu0_KfcIv63dm_AybDg1vmqMLCl5EiP9OIFsWdIM42970PH9h8Ri7KUn0D53RSRVkV38NW312A2JYCHfEfbIxyibEIrsusib98x6Bedh-3BpsWyih2XlDT6AFwJdD0cc_Uf56Vqv9waUtsSx-1xBwliZ35MKq-IfV6hcLnFgLhxsqakV8aFLAEzI8Ulned6zjRAC28aaDOZcFdKEMD0wHPUW8-9UTQxAgug8otEITWSkKubyXbdofpVa9Xwjq1-jLb4eylqey0RokKrHO6B7F3KtUF8Zsm0mGEg7nvUhjEBFL3AqkLke5Nb_78uqb3tzZF3iO6ghENar9s1DUIYqNkbMSeh7smgER_PBUB0MGMqRnx8qcr5t5yBEurZ7qq7-LYoJOoc6UwaPrQN_AFRou4ugiRrxIrvOwrDPr4y2zoi9XKnBBuYMnt2AkGVCNIA0WOKgmex4x_2Nri2JlRieAPwNPfW5PLkyPVRfw0dNzhg7csMl1Wctdw1JpHJhgMswuhYhRWGyzYWE4ZU8lvQWqA42MOKfUixAV4LmEzGz2eRQSPGWjLC85-mcxf_vssmD-mbuJAjzlLDzzwllrTDCQrt18DftpAAHhD5hG2HmQH9RDzcS3sniIx4p2zyqBHVQsWM74BlQjbODjgHRHerTgxYaNmh4KRA38lmb9omrUhI2Q0Lj5CF2of_Apd7fo8u6LpBpdEtirkn_7-9vPPiGerClV6lSjoNi_I_hHCneAq-3KZq7hM5XliJPvUrws_m0X5n6_fazdk-gOohEuF0Aq_1I5633sS-DGrFyan2K7oeoBGQN994-kweTR0lLko14nC5wnvizbsv7sDUNJTjM7LMYIrhKEILTjjGQ6WuCkYhQuM4RAnx74jFIchW8pS1tEnUcIOyBWgFB9M2zdbNmJg7vH43mmX408jMYVKs9CQz2Y7Vu33S0dSp9sWxM1KUREFVy1xTbVgKNxLxOzXiLOjm_b4EifAHZh_KTf0POm5RESU-TSrO29y5puTHL-PLuOE30jrxXaKhW5UzmQLUMhBGI7geYP6fE6QxyUi0gD_tLdMmzxTlZiOXkE6HnBQ-3Ar54uA-RFUhnzU-XT3wm--eINsvqyrHCyLQlmM71aBXnMlH5g0NJjdm42XSecTopWfFCfcNe1-ufpUuMGGg0C3LxVN5fkTmB2_6gai0AHh4dNhefGkKCZ5OcSNtA_UUI1nKr_wgPTI4X1catN9RE9mMYhOt-I5gOVRCihxDcUcBl2apUaFK-jHPs5rABqhykbi_dOS-zy42I86Vcu4B-_0GNlRIPRLZWFIhNRy_kfCOq4kb4SK9DjTvHsaq6YWMoL9Jk3JiqvH4yrMZ6T-XEFdJ8DGSc41lo1YJwhFUu0eGbGFKxyUBrHv1l9ByPrqWaiepnBBsda4y8G3SoiCfndwkbvLeE5ykYgurPpkYX_bau2PqsoAkiJ_GmbitKpXD71C5PmzvzLvpxkgC6hQq-v4L4WLelADvBpeikX9k23qhR5H3mkzNeMZgHyoFisy161cDgOlcg64g6C2UzJKlb5C1tOlQwM3fdm7cjBJXOjuxgi8Ewx6ov90eeaqIEfFvnUu1_IC_tFve9P_Us21Ak53vwStlHueYHtedJsHg84C5Ppt_z1LFR3Hh8m1pOnlb3kJw5eGpvsXweZrIIN0cvwz-NZ_orIxjPxLf23wy-y-lhObK17BfX1g-p759XtRSaG4Rj_QedauXHAA-SKgvwAOY3kBuWo9Oxx73JbC1kov55TkecHj2lXO_o49O5LCOa_h0nHIVb3JIGWot11sF_6zwNzFM2WtHFNu7Iu9hllumC8rvz3HEbylvSPQYzBQKy8NSyC6T9wbH6cAYY-vl59q1J4DwBH3DHKoMAec8InlnBO_ekJa8SMdQMZxov0BaxJc0W__29w2Sza0cBsMslfpRIWRWMb4jNpyvCyEVxrGf7AakOl0_9P3JCQ2o8cuf-BGg_z_iQ3aTMYVWi_pWuxnhh5NchjQU8C3dxvnEd0Te9mmDlvZh-N9GULo0tlzHz3WZniUp7mxVQ3nkeS31M0LIIF3SetSMjXrGJ_4bzAnb3EjH44eFuvgOiJ8ChXLCmHLtIpFa0WSC6YVpBxqfPrxke-DyB2Lvz_46MSQ4iKvCFhdYWxBtwXCZDN5Dt4XFpMknL_VnuVU8a5_rRqpEebv_VF1pBZsvfTK6UXFWAApFvL4ebApuLsFInG3uk89N2SbenTTiBGWZWZjsEFsvf3iSFZdQ2bgKSLmJIsuXV1mUPkzGEr8SsPLDKhGNZBevtka-CfnukEPn7a3K_O5sYcccEtYwx0VNiC6dWu7B_-pflffa1m4pbhdg6KfykDO9_jU_LE692dhWUzbv977zGUlOnmsEMeqmSTo9V5Hv0UsEDGEjoe9piKidoZ8JdAq1WIpSBfW9M2wtkZHbi2nlaBnKJuTaaNs_nWjbG4y73hEqEqRlQMKrLsJU7rsmy3h6x6-J_tXfkKpWu_Z_PhR-ca2RV4ldwUNejBhBomg-6bcSq1lHXGTpwc0wSDmIUfE2W6ZZysaFpmGpTDFjTDqfeeAwwbzShK7Uc-OnJVNiQ5w1KALJNjXURSfI61vyWRBMtFHaC7t6ixwDfv6pqEa0xeDe4xf4Z1qdX1Zfs4xpdAyzZWmslUsXIYDtiTXq6NYGjnCEPYqneVGOWhP6re0UfzeqqB6p6_L42UoqFrrjU7jnEWRlz6gxdU9qOJgLX3u6CIYtN6b44tpsqA23fNBiuf4SqoYimbd2YVjXFRFFNZ2XqJ-wBqYcD5xIfudMN6W5cAD4p5cTQ11_-EqIp8rDxiWOs-PN8SQTIE7ZYQ6na-lSITpchNybreE9SqhzluoY71DN8oQuUJHonrAW5Hh_VroGBxpbO9XdNhw0XrC-S9iH9DDEUedanM2DznPUZsHHutG8H0K9AEyWRS01sAwrF73ZG57qy5IciYMHZuFbkY0lzwbF-vd15jgNfP4JTmZD2sVWwVgI7Qp9T2hd0uuZL_huHl2baRCyC_DSI9c6p3q9Ud_tBN_yCcNcUVx0rS6EGfzM8VYOGwyiBVBAgVDjBXiKBsUVWA3ljfOtYhLKBDHkqhvoQaczSI2fKX7L7cwgXeBdckoaNhno6mCpZBamuyBZ1Iy6TnguQi59MCCKdiczIpfeumbSDEovy2IbQmPqld_JI6WOufgldiITu3hXR5KNazan2mc3NrKu1SEXZpdzb4wJZZ26U_1xE2GLMJru05yZoVNEkN72DhagM1R5oqHwPzRcn3ahdYvUzDoP6UHEpa76A23lqafY7F98l66hmAnXXlEKzEVwthYoxWANYtVsxs9NktNJdNMB3OCMnCo9BWkefmjlrzMJSkBP_1mfxN2o3W1tMNXpk5OQPO20_eWPF3iYhobSo8fcxzXtw9bg1BXr0TADj0hl_z4jw93wVGGLlsA3qYstay0I9yJgHBZmhxc7V1JzNWdwxIDmRgA5eCm1ELVBxpIup9WGZlUs1rzwqXzI-37i7l3dwFfCf_i2g8m-gNQjuM6YqkSz-XKcn-sJEg1XSMhoB15sgYE9U-2Oe-_EGLK0dOU2zyHO40F8ghvhKWpuAcITX_QnEMremwsiCl0PEnGZ98BXzlRvd1MFNc0ZUwzN-wTVxs4jNkteNbp0MjIKA5Y6FiCEX6koNWY9cLXSNg4XG4IsWRQrfIn2WWFz_nhzlaZNm_NUM1kmKRREPmsvQ', 'e' => 'AQAB', - 'x5c' => ['MIIR2jCCEUMCAg4EMA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG'.PHP_EOL.'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE'.PHP_EOL.'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl'.PHP_EOL.'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIx'.PHP_EOL.'MDEwMTIxNzQ5WhcNMTcxMDA5MTIxNzQ5WjBKMQswCQYDVQQGDAJKUDEOMAwGA1UE'.PHP_EOL.'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs'.PHP_EOL.'ZS5jb20wghAiMA0GCSqGSIb3DQEBAQUAA4IQDwAwghAKAoIQAQCrM8WwUh/dxJ6z'.PHP_EOL.'bkOWhXfLd3yAoxxlUT8RD/p78xmfKoNu44Q/f3JCzdq6fNtlGg7xfDyUugk126Io'.PHP_EOL.'qxyjuh0jvneQG/PV4vKR76xYFVm21udjLP0ATdld8Bv2sdbYDGAioc2xA6wslL92'.PHP_EOL.'i4ZnDFrA10T3RYzhAbzRsOmTHEd85u2Zkhtmg4VJ6iQMcDmOiRAbMnrm3oBG1A4i'.PHP_EOL.'G3zikiUCvxE7S8JSInRHhN0B99t0i6QxxV9KhkGVkn+r7IG0+ioHU2avXHUWoK1H'.PHP_EOL.'zU2sS12nsJQfLjIsiyQzMdPAkvbh3HzM9L1EEgC5Hoc7qyhDBCApjk1ibJpka5YO'.PHP_EOL.'vPDQuiv3+ONzHfHs2VcRR98bJR1P9tnqjCyB35Km+dupc9ch/67kkftp9JS5qPK0'.PHP_EOL.'ecZWKVA6kSDToHQX4C6ZQTHy90s9zMLHQIQPXWaFGFPV5FA8mXPGCoDbZI3VjPQ/'.PHP_EOL.'nlHxBt8Vhx+WkS1lseZ2/AxKKkSgRTIjxoD3Pbryg1WecAaEbdw6qTz7gc6+2pn0'.PHP_EOL.'shzyNRxAu1Zf48lq/0R4+da5XqkXDO8pzCXT2bTzEh8iH0O8VUnPcWSz5fpzW1Wj'.PHP_EOL.'ZVqV+2WPx+eXO71aCjCeTCEzgo3ZSlwdx9/gb6/3NySFylE5LNnVrHmY85QwXoHY'.PHP_EOL.'5VrAyF/eWL0D0kSkEPFW7b6BlTo1uG98fV/g9009SeVqw/KUefirPhLr9XV+7GGj'.PHP_EOL.'7Y79XvbDdXkUMGL6bYP28NVC8m26iInFQTI5ZrGx6e7OgWWreM0fCbRKJpvBWNoz'.PHP_EOL.'Kt7iqS2Yeiku4tfaLEwTettO1pcsBqXL63ZfqhLicXKHA/1/9ZslvhiH9EPGSw+P'.PHP_EOL.'WFH/icfjc1NiNkGUsMzRhFvjFHMWYBNA5SE+i7otJRuXxOXbPtZgXOVwqAfCRZFp'.PHP_EOL.'MZRXxLP+H78h+BkO8K3LIuHO9Y6Z8kGGxXWdNsOuvwOK9kYfmG4E0fzy/+BsJXDf'.PHP_EOL.'poCMfwGeZwdDQiZRTBeiIHWJZJYHfHXF1icDJB/lFXY8rzrBVzgQFHFbox4kdZmv'.PHP_EOL.'6QWAe1zCTbKzwx7AvzGUqzVLrgA8Ba0P5awsYSdRUx8zkS5aOhL2QHgEjgMLozS7'.PHP_EOL.'IONoK4W7zTAyZZ/H0Lf5jbHuXkvDQbiBFxST4Xc420p+zEyoCZXppRWReZ2Rfkst'.PHP_EOL.'rXTkKkhWp+UzjQI+XmaVUYQWVN/27TNyXJDT/6pa3vxnOSmiU+P1coeKR1gD8Mpu'.PHP_EOL.'+1+C2A0LTsYjAFy2hCw6soY7GKB5bOsDB9L1Lla3uG9yzZHRjTiteh5JM9sdYu6a'.PHP_EOL.'wlgvELYc+1qbcjFAnMKWMg4UHlKqL1Ys7mX/KOZQZLYXPLkOS7IW4Lejv2sH5W7T'.PHP_EOL.'OkdDmwd1vJiR++LdBnHiMu6PaSL7f/VCPtF9V13XJZ652cVTLlAZ9aHf5Whor1Qh'.PHP_EOL.'nUR5frajBdMY04mi+f3Ix3BtebLvmquQ9dp0VAbeWe6qr9Rx3xkBgm/B9Bvq6FNK'.PHP_EOL.'/WRIUKnHLJpIFiMtTjhAMXoVGH9AcswEzYNVqw5PSGwXZRawhdSd6gkeT+pVlJGa'.PHP_EOL.'PkQNoitYBQRl8v+B6LBxbf8vdj2JocyQH3d8c2xUSkuZM768sdkdg3Rz6Qo1UHD/'.PHP_EOL.'jTEZnlmA8mVPgllW8Eq4HaRrY6xItxFdm/NlllOetEdv/12eAaQWkjSBzqAW7Z3W'.PHP_EOL.'Y8ggWnolLsAnj+xgoTjLG4YbsiwDgSuc0EQr1KvVdK7T8p9wi/rd2b8DJsODW+ao'.PHP_EOL.'wsKXkSI/04gWxZ0gzjb3vQ8f2HxGLspSfQPndFJFWRXfw1bfXYDYlgId8R9sjHKJ'.PHP_EOL.'sQiuy6yJv3zHoF52H7cGmxbKKHZeUNPoAXAl0PRxz9R/npWq/3BpS2xLH7XEHCWJ'.PHP_EOL.'nfkwqr4h9XqFwucWAuHGypqRXxoUsATMjxSWd53rONEALbxpoM5lwV0oQwPTAc9R'.PHP_EOL.'bz71RNDECC6Dyi0QhNZKQq5vJdt2h+lVr1fCOrX6Mtvh7KWp7LRGiQqsc7oHsXcq'.PHP_EOL.'1QXxmybSYYSDue9SGMQEUvcCqQuR7k1v/vy6pve3NkXeI7qCEQ1qv2zUNQhio2Rs'.PHP_EOL.'xJ6HuyaARH88FQHQwYypGfHypyvm3nIES6tnuqrv4tigk6hzpTBo+tA38AVGi7i6'.PHP_EOL.'CJGvEiu87CsM+vjLbOiL1cqcEG5gye3YCQZUI0gDRY4qCZ7HjH/Y2uLYmVGJ4A/A'.PHP_EOL.'099bk8uTI9VF/DR03OGDtywyXVZy13DUmkcmGAyzC6FiFFYbLNhYThlTyW9BaoDj'.PHP_EOL.'Yw4p9SLEBXguYTMbPZ5FBI8ZaMsLzn6ZzF/++yyYP6Zu4kCPOUsPPPCWWtMMJCu3'.PHP_EOL.'XwN+2kAAeEPmEbYeZAf1EPNxLeyeIjHinbPKoEdVCxYzvgGVCNs4OOAdEd6tODFh'.PHP_EOL.'o2aHgpEDfyWZv2iatSEjZDQuPkIXah/8Cl3t+jy7oukGl0S2KuSf/v7288+IZ6sK'.PHP_EOL.'VXqVKOg2L8j+EcKd4Cr7cpmruEzleWIk+9SvCz+bRfmfr99rN2T6A6iES4XQCr/U'.PHP_EOL.'jnrfexL4MasXJqfYruh6gEZA333j6TB5NHSUuSjXicLnCe+LNuy/uwNQ0lOMzssx'.PHP_EOL.'giuEoQgtOOMZDpa4KRiFC4zhECfHviMUhyFbylLW0SdRwg7IFaAUH0zbN1s2YmDu'.PHP_EOL.'8fjeaZfjTyMxhUqz0JDPZjtW7fdLR1Kn2xbEzUpREQVXLXFNtWAo3EvE7NeIs6Ob'.PHP_EOL.'9vgSJ8AdmH8pN/Q86blERJT5NKs7b3Lmm5Mcv48u44TfSOvFdoqFblTOZAtQyEEY'.PHP_EOL.'juB5g/p8TpDHJSLSAP+0t0ybPFOVmI5eQToecFD7cCvni4D5EVSGfNT5dPfCb754'.PHP_EOL.'g2y+rKscLItCWYzvVoFecyUfmDQ0mN2bjZdJ5xOilZ8UJ9w17X65+lS4wYaDQLcv'.PHP_EOL.'FU3l+ROYHb/qBqLQAeHh02F58aQoJnk5xI20D9RQjWcqv/CA9MjhfVxq031ET2Yx'.PHP_EOL.'iE634jmA5VEKKHENxRwGXZqlRoUr6Mc+zmsAGqHKRuL905L7PLjYjzpVy7gH7/QY'.PHP_EOL.'2VEg9EtlYUiE1HL+R8I6riRvhIr0ONO8exqrphYygv0mTcmKq8fjKsxnpP5cQV0n'.PHP_EOL.'wMZJzjWWjVgnCEVS7R4ZsYUrHJQGse/WX0HI+upZqJ6mcEGx1rjLwbdKiIJ+d3CR'.PHP_EOL.'u8t4TnKRiC6s+mRhf9tq7Y+qygCSIn8aZuK0qlcPvULk+bO/Mu+nGSALqFCr6/gv'.PHP_EOL.'hYt6UAO8Gl6KRf2TbeqFHkfeaTM14xmAfKgWKzLXrVwOA6VyDriDoLZTMkqVvkLW'.PHP_EOL.'06VDAzd92btyMElc6O7GCLwTDHqi/3R55qogR8W+dS7X8gL+0W970/9SzbUCTne/'.PHP_EOL.'BK2Ue55ge150mweDzgLk+m3/PUsVHceHybWk6eVveQnDl4am+xfB5msgg3Ry/DP4'.PHP_EOL.'1n+isjGM/Et/bfDL7L6WE5srXsF9fWD6nvn1e1FJobhGP9B51q5ccAD5IqC/AA5j'.PHP_EOL.'eQG5aj07HHvclsLWSi/nlOR5wePaVc7+jj07ksI5r+HScchVvckgZai3XWwX/rPA'.PHP_EOL.'3MUzZa0cU27si72GWW6YLyu/PccRvKW9I9BjMFArLw1LILpP3BsfpwBhj6+Xn2rU'.PHP_EOL.'ngPAEfcMcqgwB5zwieWcE796QlrxIx1AxnGi/QFrElzRb//b3DZLNrRwGwyyV+lE'.PHP_EOL.'hZFYxviM2nK8LIRXGsZ/sBqQ6XT/0/ckJDajxy5/4EaD/P+JDdpMxhVaL+la7GeG'.PHP_EOL.'Hk1yGNBTwLd3G+cR3RN72aYOW9mH430ZQujS2XMfPdZmeJSnubFVDeeR5LfUzQsg'.PHP_EOL.'gXdJ61IyNesYn/hvMCdvcSMfjh4W6+A6InwKFcsKYcu0ikVrRZILphWkHGp8+vGR'.PHP_EOL.'74PIHYu/P/joxJDiIq8IWF1hbEG3BcJkM3kO3hcWkyScv9We5VTxrn+tGqkR5u/9'.PHP_EOL.'UXWkFmy99MrpRcVYACkW8vh5sCm4uwUicbe6Tz03ZJt6dNOIEZZlZmOwQWy9/eJI'.PHP_EOL.'Vl1DZuApIuYkiy5dXWZQ+TMYSvxKw8sMqEY1kF6+2Rr4J+e6QQ+ftrcr87mxhxxw'.PHP_EOL.'S1jDHRU2ILp1a7sH/6l+V99rWbiluF2Dop/KQM73+NT8sTr3Z2FZTNu/3vvMZSU6'.PHP_EOL.'eawQx6qZJOj1Xke/RSwQMYSOh72mIqJ2hnwl0CrVYilIF9b0zbC2RkduLaeVoGco'.PHP_EOL.'m5Npo2z+daNsbjLveESoSpGVAwqsuwlTuuybLeHrHr4n+1d+Qqla79n8+FH5xrZF'.PHP_EOL.'XiV3BQ16MGEGiaD7ptxKrWUdcZOnBzTBIOYhR8TZbplnKxoWmYalMMWNMOp954DD'.PHP_EOL.'BvNKErtRz46clU2JDnDUoAsk2NdRFJ8jrW/JZEEy0UdoLu3qLHAN+/qmoRrTF4N7'.PHP_EOL.'jF/hnWp1fVl+zjGl0DLNlaayVSxchgO2JNero1gaOcIQ9iqd5UY5aE/qt7RR/N6q'.PHP_EOL.'oHqnr8vjZSioWuuNTuOcRZGXPqDF1T2o4mAtfe7oIhi03pvji2myoDbd80GK5/hK'.PHP_EOL.'qhiKZt3ZhWNcVEUU1nZeon7AGphwPnEh+50w3pblwAPinlxNDXX/4SoinysPGJY6'.PHP_EOL.'z483xJBMgTtlhDqdr6VIhOlyE3Jut4T1KqHOW6hjvUM3yhC5QkeiesBbkeH9WugY'.PHP_EOL.'HGls71d02HDResL5L2If0MMRR51qczYPOc9Rmwce60bwfQr0ATJZFLTWwDCsXvdk'.PHP_EOL.'bnurLkhyJgwdm4VuRjSXPBsX693XmOA18/glOZkPaxVbBWAjtCn1PaF3S65kv+G4'.PHP_EOL.'eXZtpELIL8NIj1zqner1R3+0E3/IJw1xRXHStLoQZ/MzxVg4bDKIFUECBUOMFeIo'.PHP_EOL.'GxRVYDeWN861iEsoEMeSqG+hBpzNIjZ8pfsvtzCBd4F1ySho2GejqYKlkFqa7IFn'.PHP_EOL.'UjLpOeC5CLn0wIIp2JzMil966ZtIMSi/LYhtCY+qV38kjpY65+CV2IhO7eFdHko1'.PHP_EOL.'rNqfaZzc2sq7VIRdml3NvjAllnbpT/XETYYswmu7TnJmhU0SQ3vYOFqAzVHmiofA'.PHP_EOL.'/NFyfdqF1i9TMOg/pQcSlrvoDbeWpp9jsX3yXrqGYCddeUQrMRXC2FijFYA1i1Wz'.PHP_EOL.'Gz02S00l00wHc4IycKj0FaR5+aOWvMwlKQE//WZ/E3ajdbW0w1emTk5A87bT95Y8'.PHP_EOL.'XeJiGhtKjx9zHNe3D1uDUFevRMAOPSGX/PiPD3fBUYYuWwDepiy1rLQj3ImAcFma'.PHP_EOL.'HFztXUnM1Z3DEgOZGADl4KbUQtUHGki6n1YZmVSzWvPCpfMj7fuLuXd3AV8J/+La'.PHP_EOL.'Dyb6A1CO4zpiqRLP5cpyf6wkSDVdIyGgHXmyBgT1T7Y5778QYsrR05TbPIc7jQXy'.PHP_EOL.'CG+Epam4BwhNf9CcQyt6bCyIKXQ8ScZn3wFfOVG93UwU1zRlTDM37BNXGziM2S14'.PHP_EOL.'1unQyMgoDljoWIIRfqSg1Zj1wtdI2DhcbgixZFCt8ifZZYXP+eHOVpk2b81QzWSY'.PHP_EOL.'pFEQ+ay9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEATPINk/17H+RLz459iCVQAGes'.PHP_EOL.'8kc5sxYj3CkMlWrGMiCxvsgu2kak6dCa0f3DfiVt54Fry7s0OklHiZmipoiF4RCt'.PHP_EOL.'yJwUSAzRrZFAbkpDg8oIu4Ui/Bt13kY7xON+u4m0IgkLZSE+8BSjMrfjVvVxe+qH'.PHP_EOL.'5i7X/ibUTDjgyfdA8XI='], + 'x5c' => [ + 'MIIR2jCCEUMCAg4EMA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG' . PHP_EOL . 'A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE' . PHP_EOL . 'MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl' . PHP_EOL . 'YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIx' . PHP_EOL . 'MDEwMTIxNzQ5WhcNMTcxMDA5MTIxNzQ5WjBKMQswCQYDVQQGDAJKUDEOMAwGA1UE' . PHP_EOL . 'CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs' . PHP_EOL . 'ZS5jb20wghAiMA0GCSqGSIb3DQEBAQUAA4IQDwAwghAKAoIQAQCrM8WwUh/dxJ6z' . PHP_EOL . 'bkOWhXfLd3yAoxxlUT8RD/p78xmfKoNu44Q/f3JCzdq6fNtlGg7xfDyUugk126Io' . PHP_EOL . 'qxyjuh0jvneQG/PV4vKR76xYFVm21udjLP0ATdld8Bv2sdbYDGAioc2xA6wslL92' . PHP_EOL . 'i4ZnDFrA10T3RYzhAbzRsOmTHEd85u2Zkhtmg4VJ6iQMcDmOiRAbMnrm3oBG1A4i' . PHP_EOL . 'G3zikiUCvxE7S8JSInRHhN0B99t0i6QxxV9KhkGVkn+r7IG0+ioHU2avXHUWoK1H' . PHP_EOL . 'zU2sS12nsJQfLjIsiyQzMdPAkvbh3HzM9L1EEgC5Hoc7qyhDBCApjk1ibJpka5YO' . PHP_EOL . 'vPDQuiv3+ONzHfHs2VcRR98bJR1P9tnqjCyB35Km+dupc9ch/67kkftp9JS5qPK0' . PHP_EOL . 'ecZWKVA6kSDToHQX4C6ZQTHy90s9zMLHQIQPXWaFGFPV5FA8mXPGCoDbZI3VjPQ/' . PHP_EOL . 'nlHxBt8Vhx+WkS1lseZ2/AxKKkSgRTIjxoD3Pbryg1WecAaEbdw6qTz7gc6+2pn0' . PHP_EOL . 'shzyNRxAu1Zf48lq/0R4+da5XqkXDO8pzCXT2bTzEh8iH0O8VUnPcWSz5fpzW1Wj' . PHP_EOL . 'ZVqV+2WPx+eXO71aCjCeTCEzgo3ZSlwdx9/gb6/3NySFylE5LNnVrHmY85QwXoHY' . PHP_EOL . '5VrAyF/eWL0D0kSkEPFW7b6BlTo1uG98fV/g9009SeVqw/KUefirPhLr9XV+7GGj' . PHP_EOL . '7Y79XvbDdXkUMGL6bYP28NVC8m26iInFQTI5ZrGx6e7OgWWreM0fCbRKJpvBWNoz' . PHP_EOL . 'Kt7iqS2Yeiku4tfaLEwTettO1pcsBqXL63ZfqhLicXKHA/1/9ZslvhiH9EPGSw+P' . PHP_EOL . 'WFH/icfjc1NiNkGUsMzRhFvjFHMWYBNA5SE+i7otJRuXxOXbPtZgXOVwqAfCRZFp' . PHP_EOL . 'MZRXxLP+H78h+BkO8K3LIuHO9Y6Z8kGGxXWdNsOuvwOK9kYfmG4E0fzy/+BsJXDf' . PHP_EOL . 'poCMfwGeZwdDQiZRTBeiIHWJZJYHfHXF1icDJB/lFXY8rzrBVzgQFHFbox4kdZmv' . PHP_EOL . '6QWAe1zCTbKzwx7AvzGUqzVLrgA8Ba0P5awsYSdRUx8zkS5aOhL2QHgEjgMLozS7' . PHP_EOL . 'IONoK4W7zTAyZZ/H0Lf5jbHuXkvDQbiBFxST4Xc420p+zEyoCZXppRWReZ2Rfkst' . PHP_EOL . 'rXTkKkhWp+UzjQI+XmaVUYQWVN/27TNyXJDT/6pa3vxnOSmiU+P1coeKR1gD8Mpu' . PHP_EOL . '+1+C2A0LTsYjAFy2hCw6soY7GKB5bOsDB9L1Lla3uG9yzZHRjTiteh5JM9sdYu6a' . PHP_EOL . 'wlgvELYc+1qbcjFAnMKWMg4UHlKqL1Ys7mX/KOZQZLYXPLkOS7IW4Lejv2sH5W7T' . PHP_EOL . 'OkdDmwd1vJiR++LdBnHiMu6PaSL7f/VCPtF9V13XJZ652cVTLlAZ9aHf5Whor1Qh' . PHP_EOL . 'nUR5frajBdMY04mi+f3Ix3BtebLvmquQ9dp0VAbeWe6qr9Rx3xkBgm/B9Bvq6FNK' . PHP_EOL . '/WRIUKnHLJpIFiMtTjhAMXoVGH9AcswEzYNVqw5PSGwXZRawhdSd6gkeT+pVlJGa' . PHP_EOL . 'PkQNoitYBQRl8v+B6LBxbf8vdj2JocyQH3d8c2xUSkuZM768sdkdg3Rz6Qo1UHD/' . PHP_EOL . 'jTEZnlmA8mVPgllW8Eq4HaRrY6xItxFdm/NlllOetEdv/12eAaQWkjSBzqAW7Z3W' . PHP_EOL . 'Y8ggWnolLsAnj+xgoTjLG4YbsiwDgSuc0EQr1KvVdK7T8p9wi/rd2b8DJsODW+ao' . PHP_EOL . 'wsKXkSI/04gWxZ0gzjb3vQ8f2HxGLspSfQPndFJFWRXfw1bfXYDYlgId8R9sjHKJ' . PHP_EOL . 'sQiuy6yJv3zHoF52H7cGmxbKKHZeUNPoAXAl0PRxz9R/npWq/3BpS2xLH7XEHCWJ' . PHP_EOL . 'nfkwqr4h9XqFwucWAuHGypqRXxoUsATMjxSWd53rONEALbxpoM5lwV0oQwPTAc9R' . PHP_EOL . 'bz71RNDECC6Dyi0QhNZKQq5vJdt2h+lVr1fCOrX6Mtvh7KWp7LRGiQqsc7oHsXcq' . PHP_EOL . '1QXxmybSYYSDue9SGMQEUvcCqQuR7k1v/vy6pve3NkXeI7qCEQ1qv2zUNQhio2Rs' . PHP_EOL . 'xJ6HuyaARH88FQHQwYypGfHypyvm3nIES6tnuqrv4tigk6hzpTBo+tA38AVGi7i6' . PHP_EOL . 'CJGvEiu87CsM+vjLbOiL1cqcEG5gye3YCQZUI0gDRY4qCZ7HjH/Y2uLYmVGJ4A/A' . PHP_EOL . '099bk8uTI9VF/DR03OGDtywyXVZy13DUmkcmGAyzC6FiFFYbLNhYThlTyW9BaoDj' . PHP_EOL . 'Yw4p9SLEBXguYTMbPZ5FBI8ZaMsLzn6ZzF/++yyYP6Zu4kCPOUsPPPCWWtMMJCu3' . PHP_EOL . 'XwN+2kAAeEPmEbYeZAf1EPNxLeyeIjHinbPKoEdVCxYzvgGVCNs4OOAdEd6tODFh' . PHP_EOL . 'o2aHgpEDfyWZv2iatSEjZDQuPkIXah/8Cl3t+jy7oukGl0S2KuSf/v7288+IZ6sK' . PHP_EOL . 'VXqVKOg2L8j+EcKd4Cr7cpmruEzleWIk+9SvCz+bRfmfr99rN2T6A6iES4XQCr/U' . PHP_EOL . 'jnrfexL4MasXJqfYruh6gEZA333j6TB5NHSUuSjXicLnCe+LNuy/uwNQ0lOMzssx' . PHP_EOL . 'giuEoQgtOOMZDpa4KRiFC4zhECfHviMUhyFbylLW0SdRwg7IFaAUH0zbN1s2YmDu' . PHP_EOL . '8fjeaZfjTyMxhUqz0JDPZjtW7fdLR1Kn2xbEzUpREQVXLXFNtWAo3EvE7NeIs6Ob' . PHP_EOL . '9vgSJ8AdmH8pN/Q86blERJT5NKs7b3Lmm5Mcv48u44TfSOvFdoqFblTOZAtQyEEY' . PHP_EOL . 'juB5g/p8TpDHJSLSAP+0t0ybPFOVmI5eQToecFD7cCvni4D5EVSGfNT5dPfCb754' . PHP_EOL . 'g2y+rKscLItCWYzvVoFecyUfmDQ0mN2bjZdJ5xOilZ8UJ9w17X65+lS4wYaDQLcv' . PHP_EOL . 'FU3l+ROYHb/qBqLQAeHh02F58aQoJnk5xI20D9RQjWcqv/CA9MjhfVxq031ET2Yx' . PHP_EOL . 'iE634jmA5VEKKHENxRwGXZqlRoUr6Mc+zmsAGqHKRuL905L7PLjYjzpVy7gH7/QY' . PHP_EOL . '2VEg9EtlYUiE1HL+R8I6riRvhIr0ONO8exqrphYygv0mTcmKq8fjKsxnpP5cQV0n' . PHP_EOL . 'wMZJzjWWjVgnCEVS7R4ZsYUrHJQGse/WX0HI+upZqJ6mcEGx1rjLwbdKiIJ+d3CR' . PHP_EOL . 'u8t4TnKRiC6s+mRhf9tq7Y+qygCSIn8aZuK0qlcPvULk+bO/Mu+nGSALqFCr6/gv' . PHP_EOL . 'hYt6UAO8Gl6KRf2TbeqFHkfeaTM14xmAfKgWKzLXrVwOA6VyDriDoLZTMkqVvkLW' . PHP_EOL . '06VDAzd92btyMElc6O7GCLwTDHqi/3R55qogR8W+dS7X8gL+0W970/9SzbUCTne/' . PHP_EOL . 'BK2Ue55ge150mweDzgLk+m3/PUsVHceHybWk6eVveQnDl4am+xfB5msgg3Ry/DP4' . PHP_EOL . '1n+isjGM/Et/bfDL7L6WE5srXsF9fWD6nvn1e1FJobhGP9B51q5ccAD5IqC/AA5j' . PHP_EOL . 'eQG5aj07HHvclsLWSi/nlOR5wePaVc7+jj07ksI5r+HScchVvckgZai3XWwX/rPA' . PHP_EOL . '3MUzZa0cU27si72GWW6YLyu/PccRvKW9I9BjMFArLw1LILpP3BsfpwBhj6+Xn2rU' . PHP_EOL . 'ngPAEfcMcqgwB5zwieWcE796QlrxIx1AxnGi/QFrElzRb//b3DZLNrRwGwyyV+lE' . PHP_EOL . 'hZFYxviM2nK8LIRXGsZ/sBqQ6XT/0/ckJDajxy5/4EaD/P+JDdpMxhVaL+la7GeG' . PHP_EOL . 'Hk1yGNBTwLd3G+cR3RN72aYOW9mH430ZQujS2XMfPdZmeJSnubFVDeeR5LfUzQsg' . PHP_EOL . 'gXdJ61IyNesYn/hvMCdvcSMfjh4W6+A6InwKFcsKYcu0ikVrRZILphWkHGp8+vGR' . PHP_EOL . '74PIHYu/P/joxJDiIq8IWF1hbEG3BcJkM3kO3hcWkyScv9We5VTxrn+tGqkR5u/9' . PHP_EOL . 'UXWkFmy99MrpRcVYACkW8vh5sCm4uwUicbe6Tz03ZJt6dNOIEZZlZmOwQWy9/eJI' . PHP_EOL . 'Vl1DZuApIuYkiy5dXWZQ+TMYSvxKw8sMqEY1kF6+2Rr4J+e6QQ+ftrcr87mxhxxw' . PHP_EOL . 'S1jDHRU2ILp1a7sH/6l+V99rWbiluF2Dop/KQM73+NT8sTr3Z2FZTNu/3vvMZSU6' . PHP_EOL . 'eawQx6qZJOj1Xke/RSwQMYSOh72mIqJ2hnwl0CrVYilIF9b0zbC2RkduLaeVoGco' . PHP_EOL . 'm5Npo2z+daNsbjLveESoSpGVAwqsuwlTuuybLeHrHr4n+1d+Qqla79n8+FH5xrZF' . PHP_EOL . 'XiV3BQ16MGEGiaD7ptxKrWUdcZOnBzTBIOYhR8TZbplnKxoWmYalMMWNMOp954DD' . PHP_EOL . 'BvNKErtRz46clU2JDnDUoAsk2NdRFJ8jrW/JZEEy0UdoLu3qLHAN+/qmoRrTF4N7' . PHP_EOL . 'jF/hnWp1fVl+zjGl0DLNlaayVSxchgO2JNero1gaOcIQ9iqd5UY5aE/qt7RR/N6q' . PHP_EOL . 'oHqnr8vjZSioWuuNTuOcRZGXPqDF1T2o4mAtfe7oIhi03pvji2myoDbd80GK5/hK' . PHP_EOL . 'qhiKZt3ZhWNcVEUU1nZeon7AGphwPnEh+50w3pblwAPinlxNDXX/4SoinysPGJY6' . PHP_EOL . 'z483xJBMgTtlhDqdr6VIhOlyE3Jut4T1KqHOW6hjvUM3yhC5QkeiesBbkeH9WugY' . PHP_EOL . 'HGls71d02HDResL5L2If0MMRR51qczYPOc9Rmwce60bwfQr0ATJZFLTWwDCsXvdk' . PHP_EOL . 'bnurLkhyJgwdm4VuRjSXPBsX693XmOA18/glOZkPaxVbBWAjtCn1PaF3S65kv+G4' . PHP_EOL . 'eXZtpELIL8NIj1zqner1R3+0E3/IJw1xRXHStLoQZ/MzxVg4bDKIFUECBUOMFeIo' . PHP_EOL . 'GxRVYDeWN861iEsoEMeSqG+hBpzNIjZ8pfsvtzCBd4F1ySho2GejqYKlkFqa7IFn' . PHP_EOL . 'UjLpOeC5CLn0wIIp2JzMil966ZtIMSi/LYhtCY+qV38kjpY65+CV2IhO7eFdHko1' . PHP_EOL . 'rNqfaZzc2sq7VIRdml3NvjAllnbpT/XETYYswmu7TnJmhU0SQ3vYOFqAzVHmiofA' . PHP_EOL . '/NFyfdqF1i9TMOg/pQcSlrvoDbeWpp9jsX3yXrqGYCddeUQrMRXC2FijFYA1i1Wz' . PHP_EOL . 'Gz02S00l00wHc4IycKj0FaR5+aOWvMwlKQE//WZ/E3ajdbW0w1emTk5A87bT95Y8' . PHP_EOL . 'XeJiGhtKjx9zHNe3D1uDUFevRMAOPSGX/PiPD3fBUYYuWwDepiy1rLQj3ImAcFma' . PHP_EOL . 'HFztXUnM1Z3DEgOZGADl4KbUQtUHGki6n1YZmVSzWvPCpfMj7fuLuXd3AV8J/+La' . PHP_EOL . 'Dyb6A1CO4zpiqRLP5cpyf6wkSDVdIyGgHXmyBgT1T7Y5778QYsrR05TbPIc7jQXy' . PHP_EOL . 'CG+Epam4BwhNf9CcQyt6bCyIKXQ8ScZn3wFfOVG93UwU1zRlTDM37BNXGziM2S14' . PHP_EOL . '1unQyMgoDljoWIIRfqSg1Zj1wtdI2DhcbgixZFCt8ifZZYXP+eHOVpk2b81QzWSY' . PHP_EOL . 'pFEQ+ay9AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEATPINk/17H+RLz459iCVQAGes' . PHP_EOL . '8kc5sxYj3CkMlWrGMiCxvsgu2kak6dCa0f3DfiVt54Fry7s0OklHiZmipoiF4RCt' . PHP_EOL . 'yJwUSAzRrZFAbkpDg8oIu4Ui/Bt13kY7xON+u4m0IgkLZSE+8BSjMrfjVvVxe+qH' . PHP_EOL . '5i7X/ibUTDjgyfdA8XI=', + ], 'x5t' => 'KGApLybHWJmBwZGgBk07AlRD9nU', - 'x5t#256' => 'YD12k6kc4xuh_5vEHMyyOFpGs6VqTyaKMlxg0Nt2crA', ], + 'x5t#256' => 'YD12k6kc4xuh_5vEHMyyOFpGs6VqTyaKMlxg0Nt2crA', + ], $result->all() ); } @@ -175,9 +183,12 @@ public function createFrom32kRSACertificateFileInPEMFormat(): void */ public function createFromPrivateEC256KeyFileEncrypted(): void { - $result = JWKFactory::createFromKeyFile(__DIR__.'/Keys/EC/private.es256.encrypted.key', 'test'); + $result = JWKFactory::createFromKeyFile(__DIR__ . '/Keys/EC/private.es256.encrypted.key', 'test'); - static::assertEquals('{"kty":"EC","crv":"P-256","d":"q_VkzNnxTG39jHB0qkwA_SeVXud7yCHT7kb7kZv-0xQ","x":"vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U","y":"oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE"}', json_encode($result)); + static::assertSame( + '{"kty":"EC","crv":"P-256","d":"q_VkzNnxTG39jHB0qkwA_SeVXud7yCHT7kb7kZv-0xQ","x":"vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U","y":"oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE"}', + json_encode($result) + ); } /** @@ -185,9 +196,12 @@ public function createFromPrivateEC256KeyFileEncrypted(): void */ public function createFromPrivateEC384KeyFileEncrypted(): void { - $result = JWKFactory::createFromKeyFile(__DIR__.'/Keys/EC/private.es384.encrypted.key', 'test'); + $result = JWKFactory::createFromKeyFile(__DIR__ . '/Keys/EC/private.es384.encrypted.key', 'test'); - static::assertEquals('{"kty":"EC","crv":"P-384","d":"pcSSXrbeZEOaBIs7IwqcU9M_OOM81XhZuOHoGgmS_2PdECwcdQcXzv7W8-lYL0cr","x":"6f-XZsg2Tvn0EoEapQ-ylMYNtsm8CPf0cb8HI2EkfY9Bqpt3QMzwlM7mVsFRmaMZ","y":"b8nOnRwmpmEnvA2U8ydS-dbnPv7bwYl-q1qNeh8Wpjor3VO-RTt4ce0Pn25oGGWU"}', json_encode($result)); + static::assertSame( + '{"kty":"EC","crv":"P-384","d":"pcSSXrbeZEOaBIs7IwqcU9M_OOM81XhZuOHoGgmS_2PdECwcdQcXzv7W8-lYL0cr","x":"6f-XZsg2Tvn0EoEapQ-ylMYNtsm8CPf0cb8HI2EkfY9Bqpt3QMzwlM7mVsFRmaMZ","y":"b8nOnRwmpmEnvA2U8ydS-dbnPv7bwYl-q1qNeh8Wpjor3VO-RTt4ce0Pn25oGGWU"}', + json_encode($result) + ); } /** @@ -195,9 +209,12 @@ public function createFromPrivateEC384KeyFileEncrypted(): void */ public function createFromPrivateEC512KeyFileEncrypted(): void { - $result = JWKFactory::createFromKeyFile(__DIR__.'/Keys/EC/private.es512.encrypted.key', 'test'); + $result = JWKFactory::createFromKeyFile(__DIR__ . '/Keys/EC/private.es512.encrypted.key', 'test'); - static::assertEquals('{"kty":"EC","crv":"P-521","d":"Fp6KFKRiHIdR_7PP2VKxz6OkS_phyoQqwzv2I89-8zP7QScrx5r8GFLcN5mCCNJt3rN3SIgI4XoIQbNePlAj6vE","x":"AVpvo7TGpQk5P7ZLo0qkBpaT-fFDv6HQrWElBKMxcrJd_mRNapweATsVv83YON4lTIIRXzgGkmWeqbDr6RQO-1cS","y":"AIs-MoRmLaiPyG2xmPwQCHX2CGX_uCZiT3iOxTAJEZuUbeSA828K4WfAA4ODdGiB87YVShhPOkiQswV3LpbpPGhC"}', json_encode($result)); + static::assertSame( + '{"kty":"EC","crv":"P-521","d":"Fp6KFKRiHIdR_7PP2VKxz6OkS_phyoQqwzv2I89-8zP7QScrx5r8GFLcN5mCCNJt3rN3SIgI4XoIQbNePlAj6vE","x":"AVpvo7TGpQk5P7ZLo0qkBpaT-fFDv6HQrWElBKMxcrJd_mRNapweATsVv83YON4lTIIRXzgGkmWeqbDr6RQO-1cS","y":"AIs-MoRmLaiPyG2xmPwQCHX2CGX_uCZiT3iOxTAJEZuUbeSA828K4WfAA4ODdGiB87YVShhPOkiQswV3LpbpPGhC"}', + json_encode($result) + ); } /** @@ -205,9 +222,12 @@ public function createFromPrivateEC512KeyFileEncrypted(): void */ public function createFromPublicEC256KeyFile(): void { - $result = JWKFactory::createFromKeyFile(__DIR__.'/Keys/EC/public.es256.key'); + $result = JWKFactory::createFromKeyFile(__DIR__ . '/Keys/EC/public.es256.key'); - static::assertEquals('{"kty":"EC","crv":"P-256","x":"vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U","y":"oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE"}', json_encode($result)); + static::assertSame( + '{"kty":"EC","crv":"P-256","x":"vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U","y":"oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE"}', + json_encode($result) + ); } /** @@ -215,9 +235,12 @@ public function createFromPublicEC256KeyFile(): void */ public function createFromPublicEC384KeyFile(): void { - $result = JWKFactory::createFromKeyFile(__DIR__.'/Keys/EC/public.es384.key'); + $result = JWKFactory::createFromKeyFile(__DIR__ . '/Keys/EC/public.es384.key'); - static::assertEquals('{"kty":"EC","crv":"P-384","x":"6f-XZsg2Tvn0EoEapQ-ylMYNtsm8CPf0cb8HI2EkfY9Bqpt3QMzwlM7mVsFRmaMZ","y":"b8nOnRwmpmEnvA2U8ydS-dbnPv7bwYl-q1qNeh8Wpjor3VO-RTt4ce0Pn25oGGWU"}', json_encode($result)); + static::assertSame( + '{"kty":"EC","crv":"P-384","x":"6f-XZsg2Tvn0EoEapQ-ylMYNtsm8CPf0cb8HI2EkfY9Bqpt3QMzwlM7mVsFRmaMZ","y":"b8nOnRwmpmEnvA2U8ydS-dbnPv7bwYl-q1qNeh8Wpjor3VO-RTt4ce0Pn25oGGWU"}', + json_encode($result) + ); } /** @@ -225,9 +248,12 @@ public function createFromPublicEC384KeyFile(): void */ public function createFromPublicEC512KeyFile(): void { - $result = JWKFactory::createFromKeyFile(__DIR__.'/Keys/EC/public.es512.key'); + $result = JWKFactory::createFromKeyFile(__DIR__ . '/Keys/EC/public.es512.key'); - static::assertEquals('{"kty":"EC","crv":"P-521","x":"AVpvo7TGpQk5P7ZLo0qkBpaT-fFDv6HQrWElBKMxcrJd_mRNapweATsVv83YON4lTIIRXzgGkmWeqbDr6RQO-1cS","y":"AIs-MoRmLaiPyG2xmPwQCHX2CGX_uCZiT3iOxTAJEZuUbeSA828K4WfAA4ODdGiB87YVShhPOkiQswV3LpbpPGhC"}', json_encode($result)); + static::assertSame( + '{"kty":"EC","crv":"P-521","x":"AVpvo7TGpQk5P7ZLo0qkBpaT-fFDv6HQrWElBKMxcrJd_mRNapweATsVv83YON4lTIIRXzgGkmWeqbDr6RQO-1cS","y":"AIs-MoRmLaiPyG2xmPwQCHX2CGX_uCZiT3iOxTAJEZuUbeSA828K4WfAA4ODdGiB87YVShhPOkiQswV3LpbpPGhC"}', + json_encode($result) + ); } /** @@ -243,6 +269,9 @@ public function createFromValues(): void 'y' => 'AIs-MoRmLaiPyG2xmPwQCHX2CGX_uCZiT3iOxTAJEZuUbeSA828K4WfAA4ODdGiB87YVShhPOkiQswV3LpbpPGhC', ]); - static::assertEquals('{"kty":"EC","crv":"P-521","d":"Fp6KFKRiHIdR_7PP2VKxz6OkS_phyoQqwzv2I89-8zP7QScrx5r8GFLcN5mCCNJt3rN3SIgI4XoIQbNePlAj6vE","x":"AVpvo7TGpQk5P7ZLo0qkBpaT-fFDv6HQrWElBKMxcrJd_mRNapweATsVv83YON4lTIIRXzgGkmWeqbDr6RQO-1cS","y":"AIs-MoRmLaiPyG2xmPwQCHX2CGX_uCZiT3iOxTAJEZuUbeSA828K4WfAA4ODdGiB87YVShhPOkiQswV3LpbpPGhC"}', json_encode($result)); + static::assertSame( + '{"kty":"EC","crv":"P-521","d":"Fp6KFKRiHIdR_7PP2VKxz6OkS_phyoQqwzv2I89-8zP7QScrx5r8GFLcN5mCCNJt3rN3SIgI4XoIQbNePlAj6vE","x":"AVpvo7TGpQk5P7ZLo0qkBpaT-fFDv6HQrWElBKMxcrJd_mRNapweATsVv83YON4lTIIRXzgGkmWeqbDr6RQO-1cS","y":"AIs-MoRmLaiPyG2xmPwQCHX2CGX_uCZiT3iOxTAJEZuUbeSA828K4WfAA4ODdGiB87YVShhPOkiQswV3LpbpPGhC"}', + json_encode($result) + ); } } diff --git a/tests/Component/KeyManagement/JWKSetAnalyzerTest.php b/tests/Component/KeyManagement/JWKSetAnalyzerTest.php index 7de131cf..4be20257 100644 --- a/tests/Component/KeyManagement/JWKSetAnalyzerTest.php +++ b/tests/Component/KeyManagement/JWKSetAnalyzerTest.php @@ -2,34 +2,21 @@ 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\Tests\Component\KeyManagement; use Jose\Component\Core\JWK; use Jose\Component\Core\JWKSet; -use Jose\Component\KeyManagement\Analyzer; +use Jose\Component\KeyManagement\Analyzer\KeysetAnalyzerManager; +use Jose\Component\KeyManagement\Analyzer\MixedKeyTypes; +use Jose\Component\KeyManagement\Analyzer\MixedPublicAndPrivateKeys; use PHPUnit\Framework\TestCase; /** - * @group unit - * @group JWKSetAnalyzer - * * @internal */ -class JWKSetAnalyzerTest extends TestCase +final class JWKSetAnalyzerTest extends TestCase { - /** - * @var null|Analyzer\KeysetAnalyzerManager - */ - private $keysetAnalyzerManager; + private ?KeysetAnalyzerManager $keysetAnalyzerManager = null; /** * @test @@ -37,7 +24,9 @@ class JWKSetAnalyzerTest extends TestCase public function theKeysetHasNoKey(): void { $jwkset = new JWKSet([]); - $messages = $this->getKeysetAnalyzer()->analyze($jwkset); + $messages = $this->getKeysetAnalyzer() + ->analyze($jwkset) + ; static::assertEmpty($messages); } @@ -48,12 +37,22 @@ public function theKeysetHasNoKey(): void public function theKeysetDoesNotMixesKeys(): void { $jwkset = new JWKSet([ - new JWK(['kty' => 'OKP']), - new JWK(['kty' => 'OKP']), - new JWK(['kty' => 'EC']), - new JWK(['kty' => 'EC']), + new JWK([ + 'kty' => 'OKP', + ]), + new JWK([ + 'kty' => 'OKP', + ]), + new JWK([ + 'kty' => 'EC', + ]), + new JWK([ + 'kty' => 'EC', + ]), ]); - $messages = $this->getKeysetAnalyzer()->analyze($jwkset); + $messages = $this->getKeysetAnalyzer() + ->analyze($jwkset) + ; static::assertEmpty($messages); } @@ -64,13 +63,25 @@ public function theKeysetDoesNotMixesKeys(): void public function theKeysetMixesKeys(): void { $jwkset = new JWKSet([ - new JWK(['kty' => 'oct']), - new JWK(['kty' => 'OKP']), - new JWK(['kty' => 'OKP']), - new JWK(['kty' => 'EC']), - new JWK(['kty' => 'EC']), + new JWK([ + 'kty' => 'oct', + ]), + new JWK([ + 'kty' => 'OKP', + ]), + new JWK([ + 'kty' => 'OKP', + ]), + new JWK([ + 'kty' => 'EC', + ]), + new JWK([ + 'kty' => 'EC', + ]), ]); - $messages = $this->getKeysetAnalyzer()->analyze($jwkset); + $messages = $this->getKeysetAnalyzer() + ->analyze($jwkset) + ; static::assertNotEmpty($messages); } @@ -81,11 +92,22 @@ public function theKeysetMixesKeys(): void public function theKeysetHasOnlyPrivateKeys(): void { $jwkset = new JWKSet([ - new JWK(['kty' => 'OKP', 'd' => 'foo']), - new JWK(['kty' => 'RSA', 'd' => 'foo']), - new JWK(['kty' => 'EC', 'd' => 'foo']), + new JWK([ + 'kty' => 'OKP', + 'd' => 'foo', + ]), + new JWK([ + 'kty' => 'RSA', + 'd' => 'foo', + ]), + new JWK([ + 'kty' => 'EC', + 'd' => 'foo', + ]), ]); - $messages = $this->getKeysetAnalyzer()->analyze($jwkset); + $messages = $this->getKeysetAnalyzer() + ->analyze($jwkset) + ; static::assertEmpty($messages); } @@ -96,11 +118,19 @@ public function theKeysetHasOnlyPrivateKeys(): void public function theKeysetHasOnlyPublicKeys(): void { $jwkset = new JWKSet([ - new JWK(['kty' => 'OKP']), - new JWK(['kty' => 'RSA']), - new JWK(['kty' => 'EC']), + new JWK([ + 'kty' => 'OKP', + ]), + new JWK([ + 'kty' => 'RSA', + ]), + new JWK([ + 'kty' => 'EC', + ]), ]); - $messages = $this->getKeysetAnalyzer()->analyze($jwkset); + $messages = $this->getKeysetAnalyzer() + ->analyze($jwkset) + ; static::assertEmpty($messages); } @@ -111,21 +141,30 @@ public function theKeysetHasOnlyPublicKeys(): void public function theKeysetMixesPublicAndPrivateKeys(): void { $jwkset = new JWKSet([ - new JWK(['kty' => 'OKP']), - new JWK(['kty' => 'RSA']), - new JWK(['kty' => 'EC', 'd' => 'foo']), + new JWK([ + 'kty' => 'OKP', + ]), + new JWK([ + 'kty' => 'RSA', + ]), + new JWK([ + 'kty' => 'EC', + 'd' => 'foo', + ]), ]); - $messages = $this->getKeysetAnalyzer()->analyze($jwkset); + $messages = $this->getKeysetAnalyzer() + ->analyze($jwkset) + ; static::assertNotEmpty($messages); } - private function getKeysetAnalyzer(): Analyzer\KeysetAnalyzerManager + private function getKeysetAnalyzer(): KeysetAnalyzerManager { - if (null === $this->keysetAnalyzerManager) { - $this->keysetAnalyzerManager = new Analyzer\KeysetAnalyzerManager(); - $this->keysetAnalyzerManager->add(new Analyzer\MixedPublicAndPrivateKeys()); - $this->keysetAnalyzerManager->add(new Analyzer\MixedKeyTypes()); + if ($this->keysetAnalyzerManager === null) { + $this->keysetAnalyzerManager = new KeysetAnalyzerManager(); + $this->keysetAnalyzerManager->add(new MixedPublicAndPrivateKeys()); + $this->keysetAnalyzerManager->add(new MixedKeyTypes()); } return $this->keysetAnalyzerManager; diff --git a/tests/Component/KeyManagement/JWKSetTest.php b/tests/Component/KeyManagement/JWKSetTest.php index c8728e5e..4b508d44 100644 --- a/tests/Component/KeyManagement/JWKSetTest.php +++ b/tests/Component/KeyManagement/JWKSetTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\KeyManagement; use function count; @@ -20,12 +11,9 @@ use PHPUnit\Framework\TestCase; /** - * @group unit - * @group JWKSet - * * @internal */ -class JWKSetTest extends TestCase +final class JWKSetTest extends TestCase { /** * @test @@ -47,7 +35,7 @@ public function keySelectionWithAlgorithm(): void $jwk = $jwkset->selectKey('sig', new FooAlgorithm()); static::assertInstanceOf(JWK::class, $jwk); - static::assertEquals( + static::assertSame( [ 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', 'kty' => 'FOO', @@ -65,9 +53,11 @@ public function keySelectionWithAlgorithmAndKeyId(): void { $jwkset = $this->getPublicKeySet(); - $jwk = $jwkset->selectKey('sig', new FooAlgorithm(), ['kid' => '02491f945c951adf156f370788e8ccdabf8877a8']); + $jwk = $jwkset->selectKey('sig', new FooAlgorithm(), [ + 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', + ]); static::assertInstanceOf(JWK::class, $jwk); - static::assertEquals( + static::assertSame( [ 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', 'kty' => 'FOO', @@ -85,9 +75,11 @@ public function keySelectionWithKeyId(): void { $jwkset = $this->getPublicKeySet(); - $jwk = $jwkset->selectKey('sig', null, ['kid' => '02491f945c951adf156f370788e8ccdabf8877a8']); + $jwk = $jwkset->selectKey('sig', null, [ + 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', + ]); static::assertInstanceOf(JWK::class, $jwk); - static::assertEquals( + static::assertSame( [ 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', 'kty' => 'FOO', @@ -105,7 +97,9 @@ public function keySelectionReturnsNothing(): void { $jwkset = $this->getPublicKeySet(); - $jwk = $jwkset->selectKey('enc', null, ['kid' => '02491f945c951adf156f370788e8ccdabf8877a8']); + $jwk = $jwkset->selectKey('enc', null, [ + 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', + ]); static::assertNull($jwk); } @@ -114,62 +108,66 @@ public function keySelectionReturnsNothing(): void */ public function createKeySetFromValues(): void { - $values = ['keys' => [[ - 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', - 'kty' => 'FOO', - 'alg' => 'foo', - 'use' => 'sig', - ]]]; + $values = [ + 'keys' => [[ + 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', + 'kty' => 'FOO', + 'alg' => 'foo', + 'use' => 'sig', + ]], + ]; $jwkset = JWKFactory::createFromValues($values); static::assertInstanceOf(JWKSet::class, $jwkset); - static::assertEquals(1, count($jwkset)); + static::assertSame(1, count($jwkset)); static::assertTrue($jwkset->has('71ee230371d19630bc17fb90ccf20ae632ad8cf8')); static::assertFalse($jwkset->has(0)); } private function getPublicKeySet(): JWKSet { - $keys = ['keys' => [ - [ - 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', - 'kty' => 'FOO', - 'alg' => 'foo', - 'use' => 'sig', - ], - [ - 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', - 'kty' => 'FOO', - 'alg' => 'foo', - 'use' => 'sig', - ], - [ - 'kty' => 'RSA', - 'n' => 'oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3Spsk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMStPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw', - 'e' => 'AQAB', - ], - [ - 'kty' => 'RSA', - 'n' => 'sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1WlUzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDprecbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBIY2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw', - 'e' => 'AQAB', - ], - [ - 'kty' => 'RSA', - 'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ', - 'e' => 'AQAB', - ], - [ - 'kty' => 'EC', - 'crv' => 'P-256', - 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', - 'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', - ], - [ - 'kty' => 'EC', - 'crv' => 'P-521', - 'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk', - 'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2', + $keys = [ + 'keys' => [ + [ + 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', + 'kty' => 'FOO', + 'alg' => 'foo', + 'use' => 'sig', + ], + [ + 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', + 'kty' => 'FOO', + 'alg' => 'foo', + 'use' => 'sig', + ], + [ + 'kty' => 'RSA', + 'n' => 'oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3Spsk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMStPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw', + 'e' => 'AQAB', + ], + [ + 'kty' => 'RSA', + 'n' => 'sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1WlUzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDprecbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBIY2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw', + 'e' => 'AQAB', + ], + [ + 'kty' => 'RSA', + 'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ', + 'e' => 'AQAB', + ], + [ + 'kty' => 'EC', + 'crv' => 'P-256', + 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', + 'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', + ], + [ + 'kty' => 'EC', + 'crv' => 'P-521', + 'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk', + 'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2', + ], ], - ]]; + ]; return JWKSet::createFromKeyData($keys); } diff --git a/tests/Component/KeyManagement/JWKTest.php b/tests/Component/KeyManagement/JWKTest.php index 6872bedc..d37b2e0b 100644 --- a/tests/Component/KeyManagement/JWKTest.php +++ b/tests/Component/KeyManagement/JWKTest.php @@ -2,32 +2,21 @@ 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\Tests\Component\KeyManagement; -use ParagonIE\ConstantTime\Base64UrlSafe; use function count; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\Core\JWKSet; use Jose\Component\KeyManagement\JWKFactory; +use ParagonIE\ConstantTime\Base64UrlSafe; +use const PHP_EOL; use PHPUnit\Framework\TestCase; /** - * @group unit - * @group JWK - * * @internal */ -class JWKTest extends TestCase +final class JWKTest extends TestCase { /** * @test @@ -45,19 +34,22 @@ public function key(): void 'bar' => 'plic', ]); - static::assertEquals('EC', $jwk->get('kty')); - static::assertEquals('ES256', $jwk->get('alg')); - static::assertEquals('sign', $jwk->get('use')); + static::assertSame('EC', $jwk->get('kty')); + static::assertSame('ES256', $jwk->get('alg')); + static::assertSame('sign', $jwk->get('use')); static::assertFalse($jwk->has('kid')); - static::assertEquals(['sign'], $jwk->get('key_ops')); - static::assertEquals('P-256', $jwk->get('crv')); + static::assertSame(['sign'], $jwk->get('key_ops')); + static::assertSame('P-256', $jwk->get('crv')); static::assertFalse($jwk->has('x5u')); static::assertFalse($jwk->has('x5c')); static::assertFalse($jwk->has('x5t')); static::assertFalse($jwk->has('x5t#256')); - static::assertEquals('f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', $jwk->get('x')); - static::assertEquals('x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', $jwk->get('y')); - static::assertEquals('{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","use":"sign","key_ops":["sign"],"alg":"ES256","bar":"plic"}', json_encode($jwk)); + static::assertSame('f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', $jwk->get('x')); + static::assertSame('x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', $jwk->get('y')); + static::assertSame( + '{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","use":"sign","key_ops":["sign"],"alg":"ES256","bar":"plic"}', + json_encode($jwk) + ); } /** @@ -124,27 +116,30 @@ public function keySet(): void $jwkset = new JWKSet([$jwk1]); $jwkset = $jwkset->with($jwk2); - static::assertEquals('{"keys":[{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","use":"sign","key_ops":["sign"],"alg":"ES256","kid":"0123456789"},{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","d":"jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI","use":"sign","key_ops":["verify"],"alg":"ES256","kid":"9876543210"}]}', json_encode($jwkset)); - static::assertEquals(2, count($jwkset)); - static::assertEquals(2, $jwkset->count()); + static::assertSame( + '{"keys":[{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","use":"sign","key_ops":["sign"],"alg":"ES256","kid":"0123456789"},{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","d":"jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI","use":"sign","key_ops":["verify"],"alg":"ES256","kid":"9876543210"}]}', + json_encode($jwkset) + ); + static::assertSame(2, count($jwkset)); + static::assertSame(2, $jwkset->count()); static::assertTrue($jwkset->has('0123456789')); static::assertTrue($jwkset->has('9876543210')); static::assertFalse($jwkset->has(0)); foreach ($jwkset as $key) { - static::assertEquals('EC', $key->get('kty')); + static::assertSame('EC', $key->get('kty')); } - static::assertEquals('9876543210', $jwkset->get('9876543210')->get('kid')); + static::assertSame('9876543210', $jwkset->get('9876543210')->get('kid')); $jwkset = $jwkset->without('9876543210'); $jwkset = $jwkset->without('9876543210'); - static::assertEquals(1, count($jwkset)); - static::assertEquals(1, $jwkset->count()); + static::assertSame(1, count($jwkset)); + static::assertSame(1, $jwkset->count()); $jwkset = $jwkset->without('0123456789'); - static::assertEquals(0, count($jwkset)); - static::assertEquals(0, $jwkset->count()); + static::assertSame(0, count($jwkset)); + static::assertSame(0, $jwkset->count()); } /** @@ -202,7 +197,7 @@ public function privateToPublic(): void $public = $private->toPublic(); - static::assertEquals(json_encode([ + static::assertSame(json_encode([ 'kty' => 'EC', 'crv' => 'P-256', 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', @@ -220,17 +215,17 @@ public function privateToPublic(): void public function loadCertificateChain(): void { $key = JWKFactory::createFromCertificateFile( - __DIR__.'/Chain/google.crt', + __DIR__ . '/Chain/google.crt', [ 'kid' => 'From www.google.com', ] ); - static::assertEquals( + static::assertSame( '178f7e93a74ed73d88c29042220b9ae6e4b371cd', mb_strtolower(bin2hex(Base64UrlSafe::decode($key->get('x5t')))) ); - static::assertEquals( + static::assertEqualsCanonicalizing( [ 'kty' => 'RSA', 'n' => 'nCoEd1zYUJE6BqOC4NhQSLyJP_EZcBqIRn7gj8Xxic4h7lr-YQ23MkSJoHQLU09VpM6CYpXu61lfxuEFgBLEXpQ_vFtIOPRT9yTm-5HpFcTP9FMN9Er8n1Tefb6ga2-HwNBQHygwA0DaCHNRbH__OjynNwaOvUsRBOt9JN7m-fwxcfuU1WDzLkqvQtLL6sRqGrLMU90VS4sfyBlhH82dqD5jK4Q1aWWEyBnFRiL4U5W-44BKEMYq7LqXIBHHOZkQBKDwYXqVJYxOUnXitu0IyhT8ziJqs07PRgOXlwN-wLHee69FM8-6PnG33vQlJcINNYmdnfsOEXmJHjfFr45yaQ', @@ -238,7 +233,9 @@ public function loadCertificateChain(): void 'x5t' => 'F49-k6dO1z2IwpBCIgua5uSzcc0', 'x5t#256' => 'pBJP2vnKx7ruHKsy4yJddGUAwJ888-uyU-8_uwiK_TQ', 'kid' => 'From www.google.com', - 'x5c' => ['MIID8DCCAtigAwIBAgIDAjqDMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT'.PHP_EOL.'MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i'.PHP_EOL.'YWwgQ0EwHhcNMTMwNDA1MTUxNTU2WhcNMTYxMjMxMjM1OTU5WjBJMQswCQYDVQQG'.PHP_EOL.'EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy'.PHP_EOL.'bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB'.PHP_EOL.'AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP'.PHP_EOL.'VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv'.PHP_EOL.'h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE'.PHP_EOL.'ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ'.PHP_EOL.'EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC'.PHP_EOL.'DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB5zCB5DAfBgNVHSMEGDAWgBTAephojYn7'.PHP_EOL.'qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wDgYD'.PHP_EOL.'VR0PAQH/BAQDAgEGMC4GCCsGAQUFBwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDov'.PHP_EOL.'L2cuc3ltY2QuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwNQYDVR0fBC4wLDAqoCig'.PHP_EOL.'JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMBcGA1UdIAQQ'.PHP_EOL.'MA4wDAYKKwYBBAHWeQIFATANBgkqhkiG9w0BAQsFAAOCAQEAqvqpIM1qZ4PtXtR+'.PHP_EOL.'3h3Ef+AlBgDFJPupyC1tft6dgmUsgWM0Zj7pUsIItMsv91+ZOmqcUHqFBYx90SpI'.PHP_EOL.'hNMJbHzCzTWf84LuUt5oX+QAihcglvcpjZpNy6jehsgNb1aHA30DP9z6eX0hGfnI'.PHP_EOL.'Oi9RdozHQZJxjyXON/hKTAAj78Q1EK7gI4BzfE00LshukNYQHpmEcxpw8u1VDu4X'.PHP_EOL.'Bupn7jLrLN1nBz/2i8Jw3lsA5rsb0zYaImxssDVCbJAJPZPpZAkiDoUGn8JzIdPm'.PHP_EOL.'X4DkjYUiOnMDsWCOrmji9D6X52ASCWg23jrW4kOVWzeBkoEfu43XrVJkFleW2V40'.PHP_EOL.'fsg12A=='], + 'x5c' => [ + 'MIID8DCCAtigAwIBAgIDAjqDMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT' . PHP_EOL . 'MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i' . PHP_EOL . 'YWwgQ0EwHhcNMTMwNDA1MTUxNTU2WhcNMTYxMjMxMjM1OTU5WjBJMQswCQYDVQQG' . PHP_EOL . 'EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy' . PHP_EOL . 'bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB' . PHP_EOL . 'AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP' . PHP_EOL . 'VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv' . PHP_EOL . 'h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE' . PHP_EOL . 'ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ' . PHP_EOL . 'EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC' . PHP_EOL . 'DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB5zCB5DAfBgNVHSMEGDAWgBTAephojYn7' . PHP_EOL . 'qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wDgYD' . PHP_EOL . 'VR0PAQH/BAQDAgEGMC4GCCsGAQUFBwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDov' . PHP_EOL . 'L2cuc3ltY2QuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwNQYDVR0fBC4wLDAqoCig' . PHP_EOL . 'JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMBcGA1UdIAQQ' . PHP_EOL . 'MA4wDAYKKwYBBAHWeQIFATANBgkqhkiG9w0BAQsFAAOCAQEAqvqpIM1qZ4PtXtR+' . PHP_EOL . '3h3Ef+AlBgDFJPupyC1tft6dgmUsgWM0Zj7pUsIItMsv91+ZOmqcUHqFBYx90SpI' . PHP_EOL . 'hNMJbHzCzTWf84LuUt5oX+QAihcglvcpjZpNy6jehsgNb1aHA30DP9z6eX0hGfnI' . PHP_EOL . 'Oi9RdozHQZJxjyXON/hKTAAj78Q1EK7gI4BzfE00LshukNYQHpmEcxpw8u1VDu4X' . PHP_EOL . 'Bupn7jLrLN1nBz/2i8Jw3lsA5rsb0zYaImxssDVCbJAJPZPpZAkiDoUGn8JzIdPm' . PHP_EOL . 'X4DkjYUiOnMDsWCOrmji9D6X52ASCWg23jrW4kOVWzeBkoEfu43XrVJkFleW2V40' . PHP_EOL . 'fsg12A==', + ], ], $key->all() ); diff --git a/tests/Component/KeyManagement/Keys/ECKeysTest.php b/tests/Component/KeyManagement/Keys/ECKeysTest.php index 4935a1e1..ce6641a8 100644 --- a/tests/Component/KeyManagement/Keys/ECKeysTest.php +++ b/tests/Component/KeyManagement/Keys/ECKeysTest.php @@ -2,17 +2,9 @@ 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\Tests\Component\KeyManagement\Keys; +use const DIRECTORY_SEPARATOR; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\KeyManagement\JWKFactory; @@ -20,12 +12,9 @@ use PHPUnit\Framework\TestCase; /** - * @group ECKeys - * @group unit - * * @internal */ -class ECKeysTest extends TestCase +final class ECKeysTest extends TestCase { /** * @test @@ -35,7 +24,7 @@ public function keyTypeNotSupported(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Unsupported key type'); - $file = 'file://'.__DIR__.DIRECTORY_SEPARATOR.'DSA'.DIRECTORY_SEPARATOR.'DSA.key'; + $file = 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'DSA' . DIRECTORY_SEPARATOR . 'DSA.key'; KeyConverter::loadFromKeyFile($file); } @@ -47,9 +36,11 @@ public function keyTypeNotSupported(): void */ public function loadPrivateEC256KeyGenerateByAPN(): void { - $pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es256.from.APN.key'); + $pem = file_get_contents( + 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'EC' . DIRECTORY_SEPARATOR . 'private.es256.from.APN.key' + ); $details = KeyConverter::loadFromKey($pem); - static::assertEquals($details, [ + static::assertSame($details, [ 'kty' => 'EC', 'crv' => 'P-256', 'd' => '13n3isfsEktzl-CtH5ECpRrKk-40prVuCbldkP77gak', @@ -63,9 +54,11 @@ public function loadPrivateEC256KeyGenerateByAPN(): void */ public function loadPublicEC256Key(): void { - $pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es256.key'); + $pem = file_get_contents( + 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'EC' . DIRECTORY_SEPARATOR . 'public.es256.key' + ); $details = KeyConverter::loadFromKey($pem); - static::assertEquals($details, [ + static::assertSame($details, [ 'kty' => 'EC', 'crv' => 'P-256', 'x' => 'vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U', @@ -78,9 +71,11 @@ public function loadPublicEC256Key(): void */ public function loadPrivateEC256Key(): void { - $private_pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es256.key'); + $private_pem = file_get_contents( + 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'EC' . DIRECTORY_SEPARATOR . 'private.es256.key' + ); $details = KeyConverter::loadFromKey($private_pem); - static::assertEquals($details, [ + static::assertSame($details, [ 'kty' => 'EC', 'crv' => 'P-256', 'd' => 'q_VkzNnxTG39jHB0qkwA_SeVXud7yCHT7kb7kZv-0xQ', @@ -94,9 +89,11 @@ public function loadPrivateEC256Key(): void */ public function loadEncryptedPrivateEC256Key(): void { - $private_pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es256.encrypted.key'); + $private_pem = file_get_contents( + 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'EC' . DIRECTORY_SEPARATOR . 'private.es256.encrypted.key' + ); $details = KeyConverter::loadFromKey($private_pem, 'test'); - static::assertEquals($details, [ + static::assertSame($details, [ 'kty' => 'EC', 'crv' => 'P-256', 'd' => 'q_VkzNnxTG39jHB0qkwA_SeVXud7yCHT7kb7kZv-0xQ', @@ -113,7 +110,9 @@ public function loadEncryptedPrivateEC256KeyWithoutPassword(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Password required for encrypted keys.'); - KeyConverter::loadFromKeyFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es256.encrypted.key'); + KeyConverter::loadFromKeyFile( + 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'EC' . DIRECTORY_SEPARATOR . 'private.es256.encrypted.key' + ); } /** @@ -121,9 +120,11 @@ public function loadEncryptedPrivateEC256KeyWithoutPassword(): void */ public function loadPublicEC384Key(): void { - $pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es384.key'); + $pem = file_get_contents( + 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'EC' . DIRECTORY_SEPARATOR . 'public.es384.key' + ); $details = KeyConverter::loadFromKey($pem); - static::assertEquals($details, [ + static::assertSame($details, [ 'kty' => 'EC', 'crv' => 'P-384', 'x' => '6f-XZsg2Tvn0EoEapQ-ylMYNtsm8CPf0cb8HI2EkfY9Bqpt3QMzwlM7mVsFRmaMZ', @@ -136,9 +137,11 @@ public function loadPublicEC384Key(): void */ public function loadPrivateEC384Key(): void { - $private_pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es384.key'); + $private_pem = file_get_contents( + 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'EC' . DIRECTORY_SEPARATOR . 'private.es384.key' + ); $details = KeyConverter::loadFromKey($private_pem); - static::assertEquals($details, [ + static::assertSame($details, [ 'kty' => 'EC', 'crv' => 'P-384', 'd' => 'pcSSXrbeZEOaBIs7IwqcU9M_OOM81XhZuOHoGgmS_2PdECwcdQcXzv7W8-lYL0cr', @@ -152,9 +155,11 @@ public function loadPrivateEC384Key(): void */ public function loadEncryptedPrivateEC384Key(): void { - $private_pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es384.encrypted.key'); + $private_pem = file_get_contents( + 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'EC' . DIRECTORY_SEPARATOR . 'private.es384.encrypted.key' + ); $details = KeyConverter::loadFromKey($private_pem, 'test'); - static::assertEquals($details, [ + static::assertSame($details, [ 'kty' => 'EC', 'crv' => 'P-384', 'd' => 'pcSSXrbeZEOaBIs7IwqcU9M_OOM81XhZuOHoGgmS_2PdECwcdQcXzv7W8-lYL0cr', @@ -168,9 +173,11 @@ public function loadEncryptedPrivateEC384Key(): void */ public function loadPublicEC512Key(): void { - $pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es512.key'); + $pem = file_get_contents( + 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'EC' . DIRECTORY_SEPARATOR . 'public.es512.key' + ); $details = KeyConverter::loadFromKey($pem); - static::assertEquals($details, [ + static::assertSame($details, [ 'kty' => 'EC', 'crv' => 'P-521', 'x' => 'AVpvo7TGpQk5P7ZLo0qkBpaT-fFDv6HQrWElBKMxcrJd_mRNapweATsVv83YON4lTIIRXzgGkmWeqbDr6RQO-1cS', @@ -183,9 +190,11 @@ public function loadPublicEC512Key(): void */ public function loadPrivateEC512Key(): void { - $private_pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es512.key'); + $private_pem = file_get_contents( + 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'EC' . DIRECTORY_SEPARATOR . 'private.es512.key' + ); $details = KeyConverter::loadFromKey($private_pem); - static::assertEquals($details, [ + static::assertSame($details, [ 'kty' => 'EC', 'crv' => 'P-521', 'd' => 'Fp6KFKRiHIdR_7PP2VKxz6OkS_phyoQqwzv2I89-8zP7QScrx5r8GFLcN5mCCNJt3rN3SIgI4XoIQbNePlAj6vE', @@ -199,9 +208,11 @@ public function loadPrivateEC512Key(): void */ public function loadEncryptedPrivateEC512Key(): void { - $private_pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es512.encrypted.key'); + $private_pem = file_get_contents( + 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'EC' . DIRECTORY_SEPARATOR . 'private.es512.encrypted.key' + ); $details = KeyConverter::loadFromKey($private_pem, 'test'); - static::assertEquals($details, [ + static::assertSame($details, [ 'kty' => 'EC', 'crv' => 'P-521', 'd' => 'Fp6KFKRiHIdR_7PP2VKxz6OkS_phyoQqwzv2I89-8zP7QScrx5r8GFLcN5mCCNJt3rN3SIgI4XoIQbNePlAj6vE', @@ -226,7 +237,7 @@ public function convertPrivateKeyToPublic(): void 'foo' => 'bar', ]); - static::assertEquals([ + static::assertSame([ 'kty' => 'EC', 'kid' => 'Foo', 'crv' => 'P-256', @@ -234,7 +245,8 @@ public function convertPrivateKeyToPublic(): void 'x' => 'vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U', 'y' => 'oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE', 'foo' => 'bar', - ], $jwk->toPublic()->all()); + ], $jwk->toPublic() + ->all()); } /** @@ -244,7 +256,7 @@ public function createECKeyOnP256(): void { $jwk = JWKFactory::createECKey('P-256'); - static::assertEquals('EC', $jwk->get('kty')); + static::assertSame('EC', $jwk->get('kty')); static::assertTrue($jwk->has('d')); static::assertTrue($jwk->has('x')); static::assertTrue($jwk->has('y')); @@ -257,7 +269,7 @@ public function createECKeyOnP384(): void { $jwk = JWKFactory::createECKey('P-384'); - static::assertEquals('EC', $jwk->get('kty')); + static::assertSame('EC', $jwk->get('kty')); static::assertTrue($jwk->has('d')); static::assertTrue($jwk->has('x')); static::assertTrue($jwk->has('y')); @@ -270,7 +282,7 @@ public function createECKeyOnP521(): void { $jwk = JWKFactory::createECKey('P-521'); - static::assertEquals('EC', $jwk->get('kty')); + static::assertSame('EC', $jwk->get('kty')); static::assertTrue($jwk->has('d')); static::assertTrue($jwk->has('x')); static::assertTrue($jwk->has('y')); diff --git a/tests/Component/KeyManagement/Keys/NoneKeysTest.php b/tests/Component/KeyManagement/Keys/NoneKeysTest.php index 7d38ea40..3d9dba85 100644 --- a/tests/Component/KeyManagement/Keys/NoneKeysTest.php +++ b/tests/Component/KeyManagement/Keys/NoneKeysTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\KeyManagement\Keys; use Jose\Component\Core\JWK; @@ -18,12 +9,9 @@ use PHPUnit\Framework\TestCase; /** - * @group NoneKeys - * @group unit - * * @internal */ -class NoneKeysTest extends TestCase +final class NoneKeysTest extends TestCase { /** * @see https://tools.ietf.org/html/rfc7638#section-3.1 @@ -39,10 +27,10 @@ public function keyThumbprint(): void 'kid' => '2011-04-29', ]); - static::assertEquals('{"kty":"none","alg":"none","use":"sig","kid":"2011-04-29"}', json_encode($key)); - static::assertEquals('BC69Ls25CLRh1KQrXvQAAB22oyuW3eQabDSMdv9xMNk', $key->thumbprint('sha256')); - static::assertEquals('hCnBo6v87V-Gz5Bp7eoFTrdvkGA', $key->thumbprint('sha1')); - static::assertEquals('JI3gujreJtPt2gzxlbGnLQ', $key->thumbprint('md5')); + static::assertSame('{"kty":"none","alg":"none","use":"sig","kid":"2011-04-29"}', json_encode($key)); + static::assertSame('BC69Ls25CLRh1KQrXvQAAB22oyuW3eQabDSMdv9xMNk', $key->thumbprint('sha256')); + static::assertSame('hCnBo6v87V-Gz5Bp7eoFTrdvkGA', $key->thumbprint('sha1')); + static::assertSame('JI3gujreJtPt2gzxlbGnLQ', $key->thumbprint('md5')); } /** @@ -50,15 +38,17 @@ public function keyThumbprint(): void */ public function createNoneKey(): void { - $key = JWKFactory::createNoneKey(['kid' => 'NONE_KEY']); + $key = JWKFactory::createNoneKey([ + 'kid' => 'NONE_KEY', + ]); - static::assertEquals('none', $key->get('kty')); - static::assertEquals('none', $key->get('alg')); - static::assertEquals('sig', $key->get('use')); - static::assertEquals('NONE_KEY', $key->get('kid')); + static::assertSame('none', $key->get('kty')); + static::assertSame('none', $key->get('alg')); + static::assertSame('sig', $key->get('use')); + static::assertSame('NONE_KEY', $key->get('kid')); - static::assertEquals('BC69Ls25CLRh1KQrXvQAAB22oyuW3eQabDSMdv9xMNk', $key->thumbprint('sha256')); - static::assertEquals('hCnBo6v87V-Gz5Bp7eoFTrdvkGA', $key->thumbprint('sha1')); - static::assertEquals('JI3gujreJtPt2gzxlbGnLQ', $key->thumbprint('md5')); + static::assertSame('BC69Ls25CLRh1KQrXvQAAB22oyuW3eQabDSMdv9xMNk', $key->thumbprint('sha256')); + static::assertSame('hCnBo6v87V-Gz5Bp7eoFTrdvkGA', $key->thumbprint('sha1')); + static::assertSame('JI3gujreJtPt2gzxlbGnLQ', $key->thumbprint('md5')); } } diff --git a/tests/Component/KeyManagement/Keys/OKPKeysTest.php b/tests/Component/KeyManagement/Keys/OKPKeysTest.php index 380e58b3..1293fe16 100644 --- a/tests/Component/KeyManagement/Keys/OKPKeysTest.php +++ b/tests/Component/KeyManagement/Keys/OKPKeysTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\KeyManagement\Keys; use InvalidArgumentException; @@ -18,12 +9,9 @@ use PHPUnit\Framework\TestCase; /** - * @group OKPKeys - * @group unit - * * @internal */ -class OKPKeysTest extends TestCase +final class OKPKeysTest extends TestCase { /** * @test @@ -41,21 +29,18 @@ public function createOKPKeyWithInvalidKeySize(): void */ public function createOKPKeyWithCurveX25519(): void { - $jwk = JWKFactory::createOKPKey( - 'X25519', - [ - 'kid' => 'KEY', - 'alg' => 'ECDH-ES', - 'use' => 'enc', - ] - ); + $jwk = JWKFactory::createOKPKey('X25519', [ + 'kid' => 'KEY', + 'alg' => 'ECDH-ES', + 'use' => 'enc', + ]); - static::assertEquals('OKP', $jwk->get('kty')); + static::assertSame('OKP', $jwk->get('kty')); static::assertTrue($jwk->has('x')); static::assertTrue($jwk->has('d')); - static::assertEquals('KEY', $jwk->get('kid')); - static::assertEquals('ECDH-ES', $jwk->get('alg')); - static::assertEquals('enc', $jwk->get('use')); + static::assertSame('KEY', $jwk->get('kid')); + static::assertSame('ECDH-ES', $jwk->get('alg')); + static::assertSame('enc', $jwk->get('use')); } /** @@ -63,20 +48,17 @@ public function createOKPKeyWithCurveX25519(): void */ public function createOKPKeyWithCurveEd25519(): void { - $jwk = JWKFactory::createOKPKey( - 'Ed25519', - [ - 'kid' => 'KEY', - 'alg' => 'EdDSA', - 'use' => 'sig', - ] - ); + $jwk = JWKFactory::createOKPKey('Ed25519', [ + 'kid' => 'KEY', + 'alg' => 'EdDSA', + 'use' => 'sig', + ]); - static::assertEquals('OKP', $jwk->get('kty')); + static::assertSame('OKP', $jwk->get('kty')); static::assertTrue($jwk->has('x')); static::assertTrue($jwk->has('d')); - static::assertEquals('KEY', $jwk->get('kid')); - static::assertEquals('EdDSA', $jwk->get('alg')); - static::assertEquals('sig', $jwk->get('use')); + static::assertSame('KEY', $jwk->get('kid')); + static::assertSame('EdDSA', $jwk->get('alg')); + static::assertSame('sig', $jwk->get('use')); } } diff --git a/tests/Component/KeyManagement/Keys/OctKeysTest.php b/tests/Component/KeyManagement/Keys/OctKeysTest.php index 98873777..3f9a9a1d 100644 --- a/tests/Component/KeyManagement/Keys/OctKeysTest.php +++ b/tests/Component/KeyManagement/Keys/OctKeysTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\KeyManagement\Keys; use InvalidArgumentException; @@ -18,12 +9,9 @@ use PHPUnit\Framework\TestCase; /** - * @group OctKeys - * @group unit - * * @internal */ -class OctKeysTest extends TestCase +final class OctKeysTest extends TestCase { /** * @test @@ -43,7 +31,7 @@ public function createOctKey(): void { $jwk = JWKFactory::createOctKey(64); - static::assertEquals('oct', $jwk->get('kty')); + static::assertSame('oct', $jwk->get('kty')); static::assertTrue($jwk->has('k')); } } diff --git a/tests/Component/KeyManagement/Keys/RSAKeysTest.php b/tests/Component/KeyManagement/Keys/RSAKeysTest.php index 73fd9528..2d958510 100644 --- a/tests/Component/KeyManagement/Keys/RSAKeysTest.php +++ b/tests/Component/KeyManagement/Keys/RSAKeysTest.php @@ -2,17 +2,9 @@ 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\Tests\Component\KeyManagement\Keys; +use const DIRECTORY_SEPARATOR; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\KeyManagement\JWKFactory; @@ -20,12 +12,9 @@ use PHPUnit\Framework\TestCase; /** - * @group RSAKeys - * @group unit - * * @internal */ -class RSAKeysTest extends TestCase +final class RSAKeysTest extends TestCase { /** * @see https://tools.ietf.org/html/rfc7638#section-3.1 @@ -42,7 +31,7 @@ public function keyThumbprint(): void 'kid' => '2011-04-29', ]); - static::assertEquals('NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs', $key->thumbprint('sha256')); + static::assertSame('NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs', $key->thumbprint('sha256')); } /** @@ -86,10 +75,10 @@ public function unsupportedKeyType(): void */ public function loadPublicRSAKeyFromPEM(): void { - $file = 'file://'.__DIR__.DIRECTORY_SEPARATOR.'RSA'.DIRECTORY_SEPARATOR.'public.key'; + $file = 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'RSA' . DIRECTORY_SEPARATOR . 'public.key'; $rsa_key = RSAKey::createFromPEM($file); - static::assertEquals([ + static::assertSame([ 'kty' => 'RSA', 'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw', 'e' => 'AQAB', @@ -111,7 +100,7 @@ public function loadPublicRSAKeyFromJWK(): void ]); $rsa_key = RSAKey::createFromJWK($jwk); - static::assertEquals([ + static::assertSame([ 'kty' => 'RSA', 'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw', 'e' => 'AQAB', @@ -132,7 +121,7 @@ public function loadPublicRSAKeyFromValues(): void 'e' => 'AQAB', ])); - static::assertEquals([ + static::assertSame([ 'kty' => 'RSA', 'n' => 'tpS1ZmfVKVP5KofIhMBP0tSWc4qlh6fm2lrZSkuKxUjEaWjzZSzs72gEIGxraWusMdoRuV54xsWRyf5KeZT0S-I5Prle3Idi3gICiO4NwvMk6JwSBcJWwmSLFEKyUSnB2CtfiGc0_5rQCpcEt_Dn5iM-BNn7fqpoLIbks8rXKUIj8-qMVqkTXsEKeKinE23t1ykMldsNaaOH-hvGti5Jt2DMnH1JjoXdDXfxvSP_0gjUYb0ektudYFXoA6wekmQyJeImvgx4Myz1I4iHtkY_Cp7J4Mn1ejZ6HNmyvoTE_4OuY1uCeYv4UyXFc1s1uUyYtj4z57qsHGsS4dQ3A2MJsw', 'e' => 'AQAB', @@ -145,10 +134,10 @@ public function loadPublicRSAKeyFromValues(): void */ public function loadPrivateRSAKey(): void { - $file = 'file://'.__DIR__.DIRECTORY_SEPARATOR.'RSA'.DIRECTORY_SEPARATOR.'private.key'; + $file = 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'RSA' . DIRECTORY_SEPARATOR . 'private.key'; $rsa_key = RSAKey::createFromPEM($file); - static::assertEquals([ + static::assertEqualsCanonicalizing([ 'kty' => 'RSA', 'n' => '33WRDEG5rN7daMgI2N5H8cPwTeQPOnz34uG2fe0yKyHjJDGE2XoESRpu5LelSPdYM_r4AWMFWoDWPd-7xaq7uFEkM8c6zaQIgj4uEiq-pBMvH-e805SFbYOKYqfQe4eeXAk4OrQwcUkSrlGskf6YUaw_3IwbPgzEDTgTZFVtQlE', 'e' => 'AQAB', @@ -162,7 +151,7 @@ public function loadPrivateRSAKey(): void static::assertFalse($rsa_key->isPublic()); $public_key = RSAKey::toPublic($rsa_key); - static::assertEquals([ + static::assertSame([ 'kty' => 'RSA', 'n' => '33WRDEG5rN7daMgI2N5H8cPwTeQPOnz34uG2fe0yKyHjJDGE2XoESRpu5LelSPdYM_r4AWMFWoDWPd-7xaq7uFEkM8c6zaQIgj4uEiq-pBMvH-e805SFbYOKYqfQe4eeXAk4OrQwcUkSrlGskf6YUaw_3IwbPgzEDTgTZFVtQlE', 'e' => 'AQAB', @@ -188,7 +177,7 @@ public function loadPrivateRSAKeyFromJWK(): void ]); $rsa_key = RSAKey::createFromJWK($jwk); - static::assertEquals([ + static::assertSame([ 'kty' => 'RSA', 'n' => '33WRDEG5rN7daMgI2N5H8cPwTeQPOnz34uG2fe0yKyHjJDGE2XoESRpu5LelSPdYM_r4AWMFWoDWPd-7xaq7uFEkM8c6zaQIgj4uEiq-pBMvH-e805SFbYOKYqfQe4eeXAk4OrQwcUkSrlGskf6YUaw_3IwbPgzEDTgTZFVtQlE', 'e' => 'AQAB', @@ -202,7 +191,7 @@ public function loadPrivateRSAKeyFromJWK(): void static::assertFalse($rsa_key->isPublic()); $public_key = RSAKey::toPublic($rsa_key); - static::assertEquals([ + static::assertSame([ 'kty' => 'RSA', 'n' => '33WRDEG5rN7daMgI2N5H8cPwTeQPOnz34uG2fe0yKyHjJDGE2XoESRpu5LelSPdYM_r4AWMFWoDWPd-7xaq7uFEkM8c6zaQIgj4uEiq-pBMvH-e805SFbYOKYqfQe4eeXAk4OrQwcUkSrlGskf6YUaw_3IwbPgzEDTgTZFVtQlE', 'e' => 'AQAB', @@ -227,7 +216,7 @@ public function loadPrivateRSAKeyFromValues(): void 'qi' => 'VZykPj-ugKQxuWTSE-hA-nJqkl7FzjfzHte4QYUSHLHFq6oLlHhgUoJ_4oFLaBmCvgZLAFRDDD6pnd5Fgzt9ow', ])); - static::assertEquals([ + static::assertSame([ 'kty' => 'RSA', 'n' => '33WRDEG5rN7daMgI2N5H8cPwTeQPOnz34uG2fe0yKyHjJDGE2XoESRpu5LelSPdYM_r4AWMFWoDWPd-7xaq7uFEkM8c6zaQIgj4uEiq-pBMvH-e805SFbYOKYqfQe4eeXAk4OrQwcUkSrlGskf6YUaw_3IwbPgzEDTgTZFVtQlE', 'e' => 'AQAB', @@ -242,7 +231,7 @@ public function loadPrivateRSAKeyFromValues(): void static::assertFalse($rsa_key->isPublic()); $public_key = RSAKey::toPublic($rsa_key); - static::assertEquals([ + static::assertSame([ 'kty' => 'RSA', 'n' => '33WRDEG5rN7daMgI2N5H8cPwTeQPOnz34uG2fe0yKyHjJDGE2XoESRpu5LelSPdYM_r4AWMFWoDWPd-7xaq7uFEkM8c6zaQIgj4uEiq-pBMvH-e805SFbYOKYqfQe4eeXAk4OrQwcUkSrlGskf6YUaw_3IwbPgzEDTgTZFVtQlE', 'e' => 'AQAB', @@ -271,7 +260,7 @@ public function convertPrivateKeyToPublic(): void $public_ec_key = RSAKey::toPublic($private_ec_key); - static::assertEquals([ + static::assertSame([ 'kty' => 'RSA', 'kid' => 'Foo', 'n' => '33WRDEG5rN7daMgI2N5H8cPwTeQPOnz34uG2fe0yKyHjJDGE2XoESRpu5LelSPdYM_r4AWMFWoDWPd-7xaq7uFEkM8c6zaQIgj4uEiq-pBMvH-e805SFbYOKYqfQe4eeXAk4OrQwcUkSrlGskf6YUaw_3IwbPgzEDTgTZFVtQlE', @@ -287,7 +276,7 @@ public function createRSAKey512Bits(): void { $jwk = JWKFactory::createRSAKey(512); - static::assertEquals('RSA', $jwk->get('kty')); + static::assertSame('RSA', $jwk->get('kty')); static::assertTrue($jwk->has('p')); static::assertTrue($jwk->has('n')); static::assertTrue($jwk->has('q')); @@ -309,7 +298,7 @@ public function loadPrivateRSAKeyFromMinimalValues(): void 'd' => 'JSqz6ijkk3dfdSEA_0iMT_1HeIJ1ft4msZ6qw7_1JSCGQAALeZ1yM0QHO3uX-Jr7HC7v1rGVcwsonAhei2qu3rk-w_iCnRL6QkkMNBnDQycwaWpwGsMBFF-UqstOJNggE4AHX-aDnbd4wbKVvdX7ieehPngbPkHcJFdg_iSZCQNoajz6XfEruyIi7_IFXYEGmH_UyEbQkgNtriZysutgYdolUjo9flUlh20HbuV3NwsPjGyDG4dUMpNpdBpSuRHYKLX6h3FjeLhItBmhBfuL7d-G3EXwKlwfNXXYivqY5NQAkFNrRbvFlc_ARIws3zAfykPDIWGWFiPiN3H-hXMgAQ', ])); - static::assertEquals([ + static::assertSame([ 'kty' => 'RSA', 'n' => 'gVf-iyhwLn2J2Up4EKjwdLYmk5n24gjGk4oQkCHVcE7j8wkS1iSzcu0ApVcMPLklEp_PWycZE12vL90gPeVjF2IPL_MKFL0b6Wy7A1f4kCDkKv7TDDjt1IIwbS-Jdp-2pG7bPb3tWjJUu6QZBLoXfRtW3cMDkQjXaVGixENORLAZs6qdu2MMKV94jetCiFd0JYCjxGVC0HW2OKnM21B_2R1NubOvMlWA7gypdpvmBYDGpkw4mjV3walWlCZObG7IH84Ovl7wOP8XLzqi2un4e6fNzy3rdp4OUSPYItF4ZX5qThWYY2R47Z5sbrZxHjNeDECKUeio0KPQNrgr6FSKSw', 'e' => 'AQAB', @@ -318,7 +307,7 @@ public function loadPrivateRSAKeyFromMinimalValues(): void $rsa_key->optimize(); - static::assertEquals([ + static::assertEqualsCanonicalizing([ 'kty' => 'RSA', 'n' => 'gVf-iyhwLn2J2Up4EKjwdLYmk5n24gjGk4oQkCHVcE7j8wkS1iSzcu0ApVcMPLklEp_PWycZE12vL90gPeVjF2IPL_MKFL0b6Wy7A1f4kCDkKv7TDDjt1IIwbS-Jdp-2pG7bPb3tWjJUu6QZBLoXfRtW3cMDkQjXaVGixENORLAZs6qdu2MMKV94jetCiFd0JYCjxGVC0HW2OKnM21B_2R1NubOvMlWA7gypdpvmBYDGpkw4mjV3walWlCZObG7IH84Ovl7wOP8XLzqi2un4e6fNzy3rdp4OUSPYItF4ZX5qThWYY2R47Z5sbrZxHjNeDECKUeio0KPQNrgr6FSKSw', 'e' => 'AQAB', @@ -333,7 +322,7 @@ public function loadPrivateRSAKeyFromMinimalValues(): void static::assertFalse($rsa_key->isPublic()); $public_key = RSAKey::toPublic($rsa_key); - static::assertEquals([ + static::assertSame([ 'kty' => 'RSA', 'n' => 'gVf-iyhwLn2J2Up4EKjwdLYmk5n24gjGk4oQkCHVcE7j8wkS1iSzcu0ApVcMPLklEp_PWycZE12vL90gPeVjF2IPL_MKFL0b6Wy7A1f4kCDkKv7TDDjt1IIwbS-Jdp-2pG7bPb3tWjJUu6QZBLoXfRtW3cMDkQjXaVGixENORLAZs6qdu2MMKV94jetCiFd0JYCjxGVC0HW2OKnM21B_2R1NubOvMlWA7gypdpvmBYDGpkw4mjV3walWlCZObG7IH84Ovl7wOP8XLzqi2un4e6fNzy3rdp4OUSPYItF4ZX5qThWYY2R47Z5sbrZxHjNeDECKUeio0KPQNrgr6FSKSw', 'e' => 'AQAB', diff --git a/tests/Component/KeyManagement/MessageBagTest.php b/tests/Component/KeyManagement/MessageBagTest.php index b545d45d..29bd3700 100644 --- a/tests/Component/KeyManagement/MessageBagTest.php +++ b/tests/Component/KeyManagement/MessageBagTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\KeyManagement; use function count; @@ -19,12 +10,9 @@ use PHPUnit\Framework\TestCase; /** - * @group unit - * @group JWKAnalyzer - * * @internal */ -class MessageBagTest extends TestCase +final class MessageBagTest extends TestCase { /** * @test @@ -33,8 +21,8 @@ public function iCanGetAMessageWithLowSeverity(): void { $message = Message::low('Not important'); - static::assertEquals(Message::SEVERITY_LOW, $message->getSeverity()); - static::assertEquals('Not important', $message->getMessage()); + static::assertSame(Message::SEVERITY_LOW, $message->getSeverity()); + static::assertSame('Not important', $message->getMessage()); } /** @@ -44,8 +32,8 @@ public function iCanGetAMessageWithMediumSeverity(): void { $message = Message::medium('Quite important'); - static::assertEquals(Message::SEVERITY_MEDIUM, $message->getSeverity()); - static::assertEquals('Quite important', $message->getMessage()); + static::assertSame(Message::SEVERITY_MEDIUM, $message->getSeverity()); + static::assertSame('Quite important', $message->getMessage()); } /** @@ -55,8 +43,8 @@ public function iCanGetAMessageWithHighSeverity(): void { $message = Message::high('Very important'); - static::assertEquals(Message::SEVERITY_HIGH, $message->getSeverity()); - static::assertEquals('Very important', $message->getMessage()); + static::assertSame(Message::SEVERITY_HIGH, $message->getSeverity()); + static::assertSame('Very important', $message->getMessage()); } /** @@ -66,7 +54,7 @@ public function iCanSerializeAMessageIntoJson(): void { $message = Message::high('Very important'); - static::assertEquals('{"message":"Very important","severity":"high"}', json_encode($message)); + static::assertSame('{"message":"Very important","severity":"high"}', json_encode($message)); } /** @@ -77,9 +65,9 @@ public function aMessageBagCanHaveSeveralMessages(): void $bag = new MessageBag(); $bag->add(Message::high('Very important')); - static::assertEquals(1, $bag->count()); - static::assertEquals(1, count($bag)); - static::assertEquals(1, count($bag->all())); + static::assertSame(1, $bag->count()); + static::assertSame(1, count($bag)); + static::assertSame(1, count($bag->all())); foreach ($bag as $message) { static::assertInstanceOf(Message::class, $message); } @@ -93,6 +81,6 @@ public function iCanSerializeAMessageBagIntoJson(): void $bag = new MessageBag(); $bag->add(Message::high('Very important')); - static::assertEquals('[{"message":"Very important","severity":"high"}]', json_encode($bag)); + static::assertSame('[{"message":"Very important","severity":"high"}]', json_encode($bag)); } } diff --git a/tests/Component/KeyManagement/UrlKeySetFactoryTest.php b/tests/Component/KeyManagement/UrlKeySetFactoryTest.php index 888a77cf..9649930e 100644 --- a/tests/Component/KeyManagement/UrlKeySetFactoryTest.php +++ b/tests/Component/KeyManagement/UrlKeySetFactoryTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\KeyManagement; use Http\Mock\Client; @@ -21,32 +12,17 @@ use RuntimeException; /** - * @group unit - * @group UrlKeySetFactory - * * @internal */ -class UrlKeySetFactoryTest extends TestCase +final class UrlKeySetFactoryTest extends TestCase { - /** - * @var Psr17Factory - */ - private $messageFactory; + private Psr17Factory $messageFactory; - /** - * @var null|JKUFactory - */ - private $jkuFactory; + private ?JKUFactory $jkuFactory = null; - /** - * @var null|X5UFactory - */ - private $x5uFactory; + private ?X5UFactory $x5uFactory = null; - /** - * @var null|Client - */ - private $httpClient; + private ?Client $httpClient = null; protected function setUp(): void { @@ -59,12 +35,22 @@ protected function setUp(): void public function iCanGetAKeySetFromAJWKUrl(): void { $response = $this->messageFactory->createResponse(200); - $response->getBody()->write('{"keys": [{"kty": "RSA","alg": "RS256","use": "sig","kid": "acde8d7c1997d82dcf5d5ed2858ac8d060cd3ca9","n": "kfQP58EQpxAqZUCiGolkyCio8S3hG9HTMfQpB7VVDB69mK3AN68ZmWeGTIvDnbcslQ1TEhjZ8bKJwWHFlyoJOxeGaEsn0G3xAmPeUW8WjS2tLTKx8DUYOAgto9VOWip5dngZVMrCL85fPk-jiKEL3ODsyddZiOOhBEjapco_RTDPVurVreDnG6mbScCslHda5T6KudyFOQLD77BulIENlpE5Lxh3KFGrGgu_RiVOf-XtHDDExiWOsaUhOSZFkecqF56upROBQRIuNqHv98icbVKRzYcDteRckJGfk12faaQhX24QCDsIrT8NHbbB9eKX7rcnDMp8GxSArct7KyOxyw","e": "AQAB"},{"kty": "RSA","alg": "RS256","use": "sig","kid": "ce760dff481ee9bca45ccab64eada328029bc0aa","n": "47QQ2Ru1h3WWxcTUbwQvhD_ncEw7avXtXDmcY_8zxC9FcPwv6GcAvjoWuF0afBNK4UoNqW9gG_eq96FnMUF0iIVkPio-h3cpOHzAhKN-LHB9UMx3WDCVYxeRjGOgKU8oLz7ioqGhyZc-oxWk0v691Ybp83OPhWa0bVAmTgSaAuPpyw-ZLg-Nb4eF---vjb1N0ptYltSOQNEZ3BK9jEbWKNHASTcTpFkigcWyLp_sFv79W_DLZEKIb4TxaoGGWA-AMiErFsAnzcU7Ia4ETyp5ucI6o4SifKzI1SKRkUTinlVnvedwXhu21HBviEe_a-fg3uYc7JTMgFNG3kQlfks8AQ","e": "AQAB"},{"kty": "RSA","alg": "RS256","use": "sig","kid": "3ce4a97d502af058eb66ac8d730a592ab7cea7f1","n": "5JjYSEt7lxpIBtnZSAta6uPZpiAFSwzRhhWdBbRr1QuEMPhBvfWsy0PArA8xx5U8AIWftTmhsTdXvkLRLrG_vT4fxjU22K2YBoeTY2v2QIvJOUyhLWOr5wVtG9iWtg86FsGv0ukEgEpx2mqIlpz0KWkEZwIhtYRTtFQh_G4QFjvyAg70iFi7BvSizfZlEDrg5-5ksia0Gy_gmjGvgTLHGBLciKo5d5Aw-DBPJqunnJacVu6rTkBF_QgsOWpO5Y8XuKbjEKNzUHSv6TxumaK7ueU1ckucdtkAHqURzEInbb3BxWYme_3JCzTDMRy4-pEoWR-NyLZwEZxxOtGFQRXhZw","e": "AQAB"}]}'); - $response->getBody()->rewind(); - $this->getHttpClient()->addResponse($response); - $keyset = $this->getJKUFactory()->loadFromUrl('https://foo.bar/keys'); - - static::assertEquals(3, $keyset->count()); + $response->getBody() + ->write( + '{"keys": [{"kty": "RSA","alg": "RS256","use": "sig","kid": "acde8d7c1997d82dcf5d5ed2858ac8d060cd3ca9","n": "kfQP58EQpxAqZUCiGolkyCio8S3hG9HTMfQpB7VVDB69mK3AN68ZmWeGTIvDnbcslQ1TEhjZ8bKJwWHFlyoJOxeGaEsn0G3xAmPeUW8WjS2tLTKx8DUYOAgto9VOWip5dngZVMrCL85fPk-jiKEL3ODsyddZiOOhBEjapco_RTDPVurVreDnG6mbScCslHda5T6KudyFOQLD77BulIENlpE5Lxh3KFGrGgu_RiVOf-XtHDDExiWOsaUhOSZFkecqF56upROBQRIuNqHv98icbVKRzYcDteRckJGfk12faaQhX24QCDsIrT8NHbbB9eKX7rcnDMp8GxSArct7KyOxyw","e": "AQAB"},{"kty": "RSA","alg": "RS256","use": "sig","kid": "ce760dff481ee9bca45ccab64eada328029bc0aa","n": "47QQ2Ru1h3WWxcTUbwQvhD_ncEw7avXtXDmcY_8zxC9FcPwv6GcAvjoWuF0afBNK4UoNqW9gG_eq96FnMUF0iIVkPio-h3cpOHzAhKN-LHB9UMx3WDCVYxeRjGOgKU8oLz7ioqGhyZc-oxWk0v691Ybp83OPhWa0bVAmTgSaAuPpyw-ZLg-Nb4eF---vjb1N0ptYltSOQNEZ3BK9jEbWKNHASTcTpFkigcWyLp_sFv79W_DLZEKIb4TxaoGGWA-AMiErFsAnzcU7Ia4ETyp5ucI6o4SifKzI1SKRkUTinlVnvedwXhu21HBviEe_a-fg3uYc7JTMgFNG3kQlfks8AQ","e": "AQAB"},{"kty": "RSA","alg": "RS256","use": "sig","kid": "3ce4a97d502af058eb66ac8d730a592ab7cea7f1","n": "5JjYSEt7lxpIBtnZSAta6uPZpiAFSwzRhhWdBbRr1QuEMPhBvfWsy0PArA8xx5U8AIWftTmhsTdXvkLRLrG_vT4fxjU22K2YBoeTY2v2QIvJOUyhLWOr5wVtG9iWtg86FsGv0ukEgEpx2mqIlpz0KWkEZwIhtYRTtFQh_G4QFjvyAg70iFi7BvSizfZlEDrg5-5ksia0Gy_gmjGvgTLHGBLciKo5d5Aw-DBPJqunnJacVu6rTkBF_QgsOWpO5Y8XuKbjEKNzUHSv6TxumaK7ueU1ckucdtkAHqURzEInbb3BxWYme_3JCzTDMRy4-pEoWR-NyLZwEZxxOtGFQRXhZw","e": "AQAB"}]}' + ) + ; + $response->getBody() + ->rewind() + ; + $this->getHttpClient() + ->addResponse($response) + ; + $keyset = $this->getJKUFactory() + ->loadFromUrl('https://foo.bar/keys') + ; + + static::assertSame(3, $keyset->count()); } /** @@ -76,10 +62,18 @@ public function theJWKUrlIsValidButDoesNotContainAKeySet(): void $this->expectExceptionMessage('Invalid content.'); $response = $this->messageFactory->createResponse(200); - $response->getBody()->write('Hello World!'); - $response->getBody()->rewind(); - $this->getHttpClient()->addResponse($response); - $this->getJKUFactory()->loadFromUrl('https://foo.bar/bad/url'); + $response->getBody() + ->write('Hello World!') + ; + $response->getBody() + ->rewind() + ; + $this->getHttpClient() + ->addResponse($response) + ; + $this->getJKUFactory() + ->loadFromUrl('https://foo.bar/bad/url') + ; } /** @@ -91,10 +85,18 @@ public function theUrlIsNotValidAndJWKSetCannotBeLoaded(): void $this->expectExceptionMessage('Unable to get the key set.'); $response = $this->messageFactory->createResponse(404); - $response->getBody()->write('Not found'); - $response->getBody()->rewind(); - $this->getHttpClient()->addResponse($response); - $this->getJKUFactory()->loadFromUrl('https://foo.bar/bad/url'); + $response->getBody() + ->write('Not found') + ; + $response->getBody() + ->rewind() + ; + $this->getHttpClient() + ->addResponse($response) + ; + $this->getJKUFactory() + ->loadFromUrl('https://foo.bar/bad/url') + ; } /** @@ -103,12 +105,22 @@ public function theUrlIsNotValidAndJWKSetCannotBeLoaded(): void public function iCanGetAKeySetFromAX509Url(): void { $response = $this->messageFactory->createResponse(200); - $response->getBody()->write('["MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVM\nxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR2\n8gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExM\nTYwMTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UE\nCBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWR\nkeS5jb20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYW\nRkeS5jb20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlc\nnRpZmljYXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTt\nwY6vj3D3HKrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqV\nTr9vcyOdQmVZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aL\nGbqGmu75RpRSgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo\n7RJlbmr2EkRTcDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgW\nJCJjPOq8lh8BJ6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAw\nEAAaOCATIwggEuMB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVH\nSMEGDAWgBTSxLDSkdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEA\nMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWR\nkeS5jb20wRgYDVR0fBD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2\nRhZGR5LmNvbS9yZXBvc2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVH\nSAAMDgwNgYIKwYBBQUHAgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j\nb20vcmVwb3NpdG9yeTAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggE\nBANKGwOy9+aG2Z+5mC6IGOgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPI\nUyIXvJxwqoJKSQ3kbTJSMUA2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL\n5CkKSkB2XIsKd83ASe8T+5o0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9\np0iRFEUOOjZv2kWzRaJBydTXRE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsx\nuxN89txJx9OjxUUAiKEngHUuHqDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZ\nEjYx8WnM25sgVjOuH0aBsXBTWVU+4=","MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Z\nhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIE\nluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb\n24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x\nIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDY\nyMFoXDTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZS\nBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgM\niBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN\nADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XC\nAPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux\n6wwdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLO\ntXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWo\nriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZ\nEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ\n4EFgQU0sSw0pHUTBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBu\nzEkMCIGA1UEBxMbVmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQK\nEw5WYWxpQ2VydCwgSW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2x\npY3kgVmFsaWRhdGlvbiBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudm\nFsaWNlcnQuY29tLzEgMB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CA\nQEwDwYDVR0TAQH/BAUwAwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGG\nF2h0dHA6Ly9vY3NwLmdvZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA\n6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybD\nBLBgNVHSAERDBCMEAGBFUdIAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZ\nmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjAN\nBgkqhkiG9w0BAQUFAAOBgQC1QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+\nSn1eocSxI0YGyeR+sBjUZsE4OWBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgM\nQLARzLrUc+cb53S8wGd9D0VmsfSxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j\n09VZw==","MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ\n0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNT\nAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0a\nG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkq\nhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE\n5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTm\nV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZ\nXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQD\nExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9\nAdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5a\nvIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zf\nN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwb\nP7RfZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQU\nAA4GBADt/UG9vUJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQ\nC1u+mNr0HZDzTuIYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMM\nj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd"]'); - $response->getBody()->rewind(); - $this->getHttpClient()->addResponse($response); - $keyset = $this->getX5UFactory()->loadFromUrl('https://foo.bar/keys'); - - static::assertEquals(3, $keyset->count()); + $response->getBody() + ->write( + '["MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVM\nxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR2\n8gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExM\nTYwMTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UE\nCBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWR\nkeS5jb20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYW\nRkeS5jb20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlc\nnRpZmljYXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTt\nwY6vj3D3HKrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqV\nTr9vcyOdQmVZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aL\nGbqGmu75RpRSgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo\n7RJlbmr2EkRTcDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgW\nJCJjPOq8lh8BJ6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAw\nEAAaOCATIwggEuMB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVH\nSMEGDAWgBTSxLDSkdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEA\nMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWR\nkeS5jb20wRgYDVR0fBD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2\nRhZGR5LmNvbS9yZXBvc2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVH\nSAAMDgwNgYIKwYBBQUHAgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j\nb20vcmVwb3NpdG9yeTAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggE\nBANKGwOy9+aG2Z+5mC6IGOgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPI\nUyIXvJxwqoJKSQ3kbTJSMUA2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL\n5CkKSkB2XIsKd83ASe8T+5o0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9\np0iRFEUOOjZv2kWzRaJBydTXRE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsx\nuxN89txJx9OjxUUAiKEngHUuHqDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZ\nEjYx8WnM25sgVjOuH0aBsXBTWVU+4=","MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Z\nhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIE\nluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb\n24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x\nIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDY\nyMFoXDTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZS\nBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgM\niBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN\nADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XC\nAPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux\n6wwdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLO\ntXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWo\nriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZ\nEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ\n4EFgQU0sSw0pHUTBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBu\nzEkMCIGA1UEBxMbVmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQK\nEw5WYWxpQ2VydCwgSW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2x\npY3kgVmFsaWRhdGlvbiBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudm\nFsaWNlcnQuY29tLzEgMB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CA\nQEwDwYDVR0TAQH/BAUwAwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGG\nF2h0dHA6Ly9vY3NwLmdvZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA\n6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybD\nBLBgNVHSAERDBCMEAGBFUdIAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZ\nmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjAN\nBgkqhkiG9w0BAQUFAAOBgQC1QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+\nSn1eocSxI0YGyeR+sBjUZsE4OWBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgM\nQLARzLrUc+cb53S8wGd9D0VmsfSxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j\n09VZw==","MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ\n0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNT\nAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0a\nG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkq\nhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE\n5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTm\nV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZ\nXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQD\nExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9\nAdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5a\nvIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zf\nN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwb\nP7RfZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQU\nAA4GBADt/UG9vUJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQ\nC1u+mNr0HZDzTuIYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMM\nj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd"]' + ) + ; + $response->getBody() + ->rewind() + ; + $this->getHttpClient() + ->addResponse($response) + ; + $keyset = $this->getX5UFactory() + ->loadFromUrl('https://foo.bar/keys') + ; + + static::assertSame(3, $keyset->count()); } /** @@ -120,10 +132,18 @@ public function theX509UrlIsValidButDoesNotContainAKeySet(): void $this->expectExceptionMessage('Invalid content.'); $response = $this->messageFactory->createResponse(200); - $response->getBody()->write('Hello World!'); - $response->getBody()->rewind(); - $this->getHttpClient()->addResponse($response); - $this->getX5UFactory()->loadFromUrl('https://foo.bar/bad/url'); + $response->getBody() + ->write('Hello World!') + ; + $response->getBody() + ->rewind() + ; + $this->getHttpClient() + ->addResponse($response) + ; + $this->getX5UFactory() + ->loadFromUrl('https://foo.bar/bad/url') + ; } /** @@ -135,19 +155,24 @@ public function theUrlIsNotValidAndX509CertificatesCannotBeLoaded(): void $this->expectExceptionMessage('Unable to get the key set.'); $response = $this->messageFactory->createResponse(404); - $response->getBody()->write('Not found'); - $response->getBody()->rewind(); - $this->getHttpClient()->addResponse($response); - $this->getX5UFactory()->loadFromUrl('https://foo.bar/bad/url'); + $response->getBody() + ->write('Not found') + ; + $response->getBody() + ->rewind() + ; + $this->getHttpClient() + ->addResponse($response) + ; + $this->getX5UFactory() + ->loadFromUrl('https://foo.bar/bad/url') + ; } private function getJKUFactory(): JKUFactory { - if (null === $this->jkuFactory) { - $this->jkuFactory = new JKUFactory( - $this->getHttpClient(), - new Psr17Factory() - ); + if ($this->jkuFactory === null) { + $this->jkuFactory = new JKUFactory($this->getHttpClient(), new Psr17Factory()); } return $this->jkuFactory; @@ -155,11 +180,8 @@ private function getJKUFactory(): JKUFactory private function getX5UFactory(): X5UFactory { - if (null === $this->x5uFactory) { - $this->x5uFactory = new X5UFactory( - $this->getHttpClient(), - new Psr17Factory() - ); + if ($this->x5uFactory === null) { + $this->x5uFactory = new X5UFactory($this->getHttpClient(), new Psr17Factory()); } return $this->x5uFactory; @@ -167,7 +189,7 @@ private function getX5UFactory(): X5UFactory private function getHttpClient(): Client { - if (null === $this->httpClient) { + if ($this->httpClient === null) { $this->httpClient = new Client(); } diff --git a/tests/Component/NestedToken/NestedTokenTest.php b/tests/Component/NestedToken/NestedTokenTest.php index 0fb0f6f5..13d4ab81 100644 --- a/tests/Component/NestedToken/NestedTokenTest.php +++ b/tests/Component/NestedToken/NestedTokenTest.php @@ -2,92 +2,87 @@ 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\Tests\Component\NestedToken; use Jose\Component\Core\AlgorithmManagerFactory; -use Jose\Component\Encryption\Algorithm\ContentEncryption; -use Jose\Component\Encryption\Algorithm\KeyEncryption; -use Jose\Component\Encryption\Compression; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192CBCHS384; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CBCHS512; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\Dir; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS256A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS384A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS512A256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSA15; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP256; use Jose\Component\Encryption\Compression\CompressionMethodManagerFactory; +use Jose\Component\Encryption\Compression\Deflate; use Jose\Component\Encryption\JWEBuilderFactory; use Jose\Component\Encryption\JWEDecrypterFactory; use Jose\Component\Encryption\JWELoaderFactory; -use Jose\Component\Encryption\Serializer; +use Jose\Component\Encryption\Serializer\CompactSerializer; +use Jose\Component\Encryption\Serializer\JSONFlattenedSerializer; +use Jose\Component\Encryption\Serializer\JSONGeneralSerializer; +use Jose\Component\Encryption\Serializer\JWESerializerManager; +use Jose\Component\Encryption\Serializer\JWESerializerManagerFactory; use PHPUnit\Framework\TestCase; abstract class NestedTokenTest extends TestCase { - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; - - /** - * @var CompressionMethodManagerFactory - */ - private $compressionMethodManagerFactory; - - /** - * @var JWEBuilderFactory - */ - private $jweBuilderFactory; - - /** - * @var JWEDecrypterFactory - */ - private $jweDecrypterFactory; - - /** - * @var JWELoaderFactory - */ - private $jweLoaderFactory; - - /** - * @var null|Serializer\JWESerializerManagerFactory - */ - private $jwsSerializerManagerFactory; - - /** - * @var null|Serializer\JWESerializerManager - */ - private $jwsSerializerManager; + private ?AlgorithmManagerFactory $algorithmManagerFactory = null; + + private ?CompressionMethodManagerFactory $compressionMethodManagerFactory = null; + + private ?JWEBuilderFactory $jweBuilderFactory = null; + + private ?JWEDecrypterFactory $jweDecrypterFactory = null; + + private ?JWELoaderFactory $jweLoaderFactory = null; + + private ?JWESerializerManagerFactory $jwsSerializerManagerFactory = null; + + private ?JWESerializerManager $jwsSerializerManager = null; protected function getAlgorithmManagerFactory(): AlgorithmManagerFactory { - if (null === $this->algorithmManagerFactory) { + if ($this->algorithmManagerFactory === null) { $this->algorithmManagerFactory = new AlgorithmManagerFactory(); - $this->algorithmManagerFactory->add('A128GCM', new ContentEncryption\A128GCM()); - $this->algorithmManagerFactory->add('A192GCM', new ContentEncryption\A192GCM()); - $this->algorithmManagerFactory->add('A256GCM', new ContentEncryption\A256GCM()); - $this->algorithmManagerFactory->add('A128CBC-HS256', new ContentEncryption\A128CBCHS256()); - $this->algorithmManagerFactory->add('A192CBC-HS384', new ContentEncryption\A192CBCHS384()); - $this->algorithmManagerFactory->add('A256CBC-HS512', new ContentEncryption\A256CBCHS512()); - $this->algorithmManagerFactory->add('A128GCMKW', new KeyEncryption\A128GCMKW()); - $this->algorithmManagerFactory->add('A192GCMKW', new KeyEncryption\A192GCMKW()); - $this->algorithmManagerFactory->add('A256GCMKW', new KeyEncryption\A256GCMKW()); - $this->algorithmManagerFactory->add('A128KW', new KeyEncryption\A128KW()); - $this->algorithmManagerFactory->add('A192KW', new KeyEncryption\A192KW()); - $this->algorithmManagerFactory->add('A256KW', new KeyEncryption\A256KW()); - $this->algorithmManagerFactory->add('dir', new KeyEncryption\Dir()); - $this->algorithmManagerFactory->add('ECDH-ES', new KeyEncryption\ECDHES()); - $this->algorithmManagerFactory->add('ECDH-ES+A128KW', new KeyEncryption\ECDHESA128KW()); - $this->algorithmManagerFactory->add('ECDH-ES+A192KW', new KeyEncryption\ECDHESA192KW()); - $this->algorithmManagerFactory->add('ECDH-ES+A256KW', new KeyEncryption\ECDHESA256KW()); - $this->algorithmManagerFactory->add('PBES2-HS256+A128KW', new KeyEncryption\PBES2HS256A128KW()); - $this->algorithmManagerFactory->add('PBES2-HS384+A192KW', new KeyEncryption\PBES2HS384A192KW()); - $this->algorithmManagerFactory->add('PBES2-HS512+A256KW', new KeyEncryption\PBES2HS512A256KW()); - $this->algorithmManagerFactory->add('RSA1_5', new KeyEncryption\RSA15()); - $this->algorithmManagerFactory->add('RSA-OAEP', new KeyEncryption\RSAOAEP()); - $this->algorithmManagerFactory->add('RSA-OAEP-256', new KeyEncryption\RSAOAEP256()); + $this->algorithmManagerFactory->add('A128GCM', new A128GCM()); + $this->algorithmManagerFactory->add('A192GCM', new A192GCM()); + $this->algorithmManagerFactory->add('A256GCM', new A256GCM()); + $this->algorithmManagerFactory->add('A128CBC-HS256', new A128CBCHS256()); + $this->algorithmManagerFactory->add('A192CBC-HS384', new A192CBCHS384()); + $this->algorithmManagerFactory->add('A256CBC-HS512', new A256CBCHS512()); + $this->algorithmManagerFactory->add('A128GCMKW', new A128GCMKW()); + $this->algorithmManagerFactory->add('A192GCMKW', new A192GCMKW()); + $this->algorithmManagerFactory->add('A256GCMKW', new A256GCMKW()); + $this->algorithmManagerFactory->add('A128KW', new A128KW()); + $this->algorithmManagerFactory->add('A192KW', new A192KW()); + $this->algorithmManagerFactory->add('A256KW', new A256KW()); + $this->algorithmManagerFactory->add('dir', new Dir()); + $this->algorithmManagerFactory->add('ECDH-ES', new ECDHES()); + $this->algorithmManagerFactory->add('ECDH-ES+A128KW', new ECDHESA128KW()); + $this->algorithmManagerFactory->add('ECDH-ES+A192KW', new ECDHESA192KW()); + $this->algorithmManagerFactory->add('ECDH-ES+A256KW', new ECDHESA256KW()); + $this->algorithmManagerFactory->add('PBES2-HS256+A128KW', new PBES2HS256A128KW()); + $this->algorithmManagerFactory->add('PBES2-HS384+A192KW', new PBES2HS384A192KW()); + $this->algorithmManagerFactory->add('PBES2-HS512+A256KW', new PBES2HS512A256KW()); + $this->algorithmManagerFactory->add('RSA1_5', new RSA15()); + $this->algorithmManagerFactory->add('RSA-OAEP', new RSAOAEP()); + $this->algorithmManagerFactory->add('RSA-OAEP-256', new RSAOAEP256()); } return $this->algorithmManagerFactory; @@ -95,9 +90,9 @@ protected function getAlgorithmManagerFactory(): AlgorithmManagerFactory protected function getCompressionMethodManagerFactory(): CompressionMethodManagerFactory { - if (null === $this->compressionMethodManagerFactory) { + if ($this->compressionMethodManagerFactory === null) { $this->compressionMethodManagerFactory = new CompressionMethodManagerFactory(); - $this->compressionMethodManagerFactory->add('DEF', new Compression\Deflate()); + $this->compressionMethodManagerFactory->add('DEF', new Deflate()); } return $this->compressionMethodManagerFactory; @@ -105,7 +100,7 @@ protected function getCompressionMethodManagerFactory(): CompressionMethodManage protected function getJWEBuilderFactory(): JWEBuilderFactory { - if (null === $this->jweBuilderFactory) { + if ($this->jweBuilderFactory === null) { $this->jweBuilderFactory = new JWEBuilderFactory( $this->getAlgorithmManagerFactory(), $this->getCompressionMethodManagerFactory() @@ -117,7 +112,7 @@ protected function getJWEBuilderFactory(): JWEBuilderFactory protected function getJWEDecrypterFactory(): JWEDecrypterFactory { - if (null === $this->jweDecrypterFactory) { + if ($this->jweDecrypterFactory === null) { $this->jweDecrypterFactory = new JWEDecrypterFactory( $this->getAlgorithmManagerFactory(), $this->getCompressionMethodManagerFactory() @@ -129,7 +124,7 @@ protected function getJWEDecrypterFactory(): JWEDecrypterFactory protected function getJWELoaderFactory(): JWELoaderFactory { - if (null === $this->jweLoaderFactory) { + if ($this->jweLoaderFactory === null) { $this->jweLoaderFactory = new JWELoaderFactory( $this->getJWESerializerManagerFactory(), $this->getJWEDecrypterFactory(), @@ -140,25 +135,25 @@ protected function getJWELoaderFactory(): JWELoaderFactory return $this->jweLoaderFactory; } - protected function getJWESerializerManagerFactory(): Serializer\JWESerializerManagerFactory + protected function getJWESerializerManagerFactory(): JWESerializerManagerFactory { - if (null === $this->jwsSerializerManagerFactory) { - $this->jwsSerializerManagerFactory = new Serializer\JWESerializerManagerFactory(); - $this->jwsSerializerManagerFactory->add(new Serializer\CompactSerializer()); - $this->jwsSerializerManagerFactory->add(new Serializer\JSONFlattenedSerializer()); - $this->jwsSerializerManagerFactory->add(new Serializer\JSONGeneralSerializer()); + if ($this->jwsSerializerManagerFactory === null) { + $this->jwsSerializerManagerFactory = new JWESerializerManagerFactory(); + $this->jwsSerializerManagerFactory->add(new CompactSerializer()); + $this->jwsSerializerManagerFactory->add(new JSONFlattenedSerializer()); + $this->jwsSerializerManagerFactory->add(new JSONGeneralSerializer()); } return $this->jwsSerializerManagerFactory; } - protected function getJWESerializerManager(): Serializer\JWESerializerManager + protected function getJWESerializerManager(): JWESerializerManager { - if (null === $this->jwsSerializerManager) { - $this->jwsSerializerManager = new Serializer\JWESerializerManager([ - new Serializer\CompactSerializer(), - new Serializer\JSONFlattenedSerializer(), - new Serializer\JSONGeneralSerializer(), + if ($this->jwsSerializerManager === null) { + $this->jwsSerializerManager = new JWESerializerManager([ + new CompactSerializer(), + new JSONFlattenedSerializer(), + new JSONGeneralSerializer(), ]); } diff --git a/tests/Component/NestedToken/NestingTest.php b/tests/Component/NestedToken/NestingTest.php index 5a2b4a1e..f4874b19 100644 --- a/tests/Component/NestedToken/NestingTest.php +++ b/tests/Component/NestedToken/NestingTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\NestedToken; use Jose\Component\Core\JWK; @@ -18,11 +9,9 @@ /** * @see https://tools.ietf.org/html/rfc7520#section-6 * - * @group RFC7520 - * * @internal */ -class NestingTest extends NestedTokenTest +final class NestingTest extends NestedTokenTest { /** * @test @@ -52,27 +41,35 @@ public function decryption(): void 'enc' => 'A128GCM', ]; - $jweDecrypter = $this->getJWEDecrypterFactory()->create(['RSA-OAEP'], ['A128GCM'], ['DEF']); + $jweDecrypter = $this->getJWEDecrypterFactory() + ->create(['RSA-OAEP'], ['A128GCM'], ['DEF']) + ; $json_compact = 'eyJhbGciOiJSU0EtT0FFUCIsImN0eSI6IkpXVCIsImVuYyI6IkExMjhHQ00ifQ.a0JHRoITfpX4qRewImjlStn8m3CPxBV1ueYlVhjurCyrBg3I7YhCRYjphDOOS4E7rXbr2Fn6NyQq-A-gqT0FXqNjVOGrG-bi13mwy7RoYhjTkBEC6P7sMYMXXx4gzMedpiJHQVeyI-zkZV7A9matpgevAJWrXzOUysYGTtwoSN6gtUVtlLaivjvb21O0ul4YxSHV-ByK1kyeetRp_fuYJxHoKLQL9P424sKx2WGYb4zsBIPF4ssl_e5IR7nany-25_UmC2urosNkoFz9cQ82MypZP8gqbQJyPN-Fpp4Z-5o6yV64x6yzDUF_5JCIdl-Qv6H5dMVIY7q1eKpXcV1lWO_2FefEBqXxXvIjLeZivjNkzogCq3-IapSjVFnMjBxjpYLT8muaawo1yy1XXMuinIpNcOY3n4KKrXLrCcteX85m4IIHMZa38s1Hpr56fPPseMA-Jltmt-a9iEDtOzhtxz8AXy9tsCAZV2XBWNG8c3kJusAamBKOYwfk7JhLRDgOnJjlJLhn7TI4UxDp9dCmUXEN6z0v23W15qJIEXNJtqnblpymooeWAHCT4e_Owbim1g0AEpTHUdA2iiLNs9WTX_H_TXuPC8yDDhi1smxS_X_xpkIHkiIHWDOLx03BpqDTivpKkBYwqP2UZkcxqX2Fo_GnVrNwlK7Lgxw6FSQvDO0.GbX1i9kXz0sxXPmA.SZI4IvKHmwpazl_pJQXX3mHv1ANnOU4Wf9-utWYUcKrBNgCe2OFMf66cSJ8k2QkxaQD3_R60MGE9ofomwtky3GFxMeGRjtpMt9OAvVLsAXB0_UTCBGyBg3C2bWLXqZlfJAAoJRUPRk-BimYZY81zVBuIhc7HsQePCpu33SzMsFHjn4lP_idrJz_glZTNgKDt8zdnUPauKTKDNOH1DD4fuzvDYfDIAfqGPyL5sVRwbiXpXdGokEszM-9ChMPqW1QNhzuX_Zul3bvrJwr7nuGZs4cUScY3n8yE3AHCLurgls-A9mz1X38xEaulV18l4Fg9tLejdkAuQZjPbqeHQBJe4IwGD5Ee0dQ-Mtz4NnhkIWx-YKBb_Xo2zI3Q_1sYjKUuis7yWW-HTr_vqvFt0bj7WJf2vzB0TZ3dvsoGaTvPH2dyWwumUrlx4gmPUzBdwTO6ubfYSDUEEz5py0d_OtWeUSYcCYBKD-aM7tXg26qJo21gYjLfhn9zy-W19sOCZGuzgFjPhawXHpvnj_t-0_ES96kogjJLxS1IMU9Y5XmnwZMyNc9EIwnogsCg-hVuvzyP0sIruktmI94_SL1xgMl7o03phcTMxtlMizR88NKU1WkBsiXMCjy1Noue7MD-ShDp5dmM.KnIKEhN8U-3C9s4gtSpjSw'; $json_flattened = '{"encrypted_key": "a0JHRoITfpX4qRewImjlStn8m3CPxBV1ueYlVhjurCyrBg3I7YhCRYjphDOOS4E7rXbr2Fn6NyQq-A-gqT0FXqNjVOGrG-bi13mwy7RoYhjTkBEC6P7sMYMXXx4gzMedpiJHQVeyI-zkZV7A9matpgevAJWrXzOUysYGTtwoSN6gtUVtlLaivjvb21O0ul4YxSHV-ByK1kyeetRp_fuYJxHoKLQL9P424sKx2WGYb4zsBIPF4ssl_e5IR7nany-25_UmC2urosNkoFz9cQ82MypZP8gqbQJyPN-Fpp4Z-5o6yV64x6yzDUF_5JCIdl-Qv6H5dMVIY7q1eKpXcV1lWO_2FefEBqXxXvIjLeZivjNkzogCq3-IapSjVFnMjBxjpYLT8muaawo1yy1XXMuinIpNcOY3n4KKrXLrCcteX85m4IIHMZa38s1Hpr56fPPseMA-Jltmt-a9iEDtOzhtxz8AXy9tsCAZV2XBWNG8c3kJusAamBKOYwfk7JhLRDgOnJjlJLhn7TI4UxDp9dCmUXEN6z0v23W15qJIEXNJtqnblpymooeWAHCT4e_Owbim1g0AEpTHUdA2iiLNs9WTX_H_TXuPC8yDDhi1smxS_X_xpkIHkiIHWDOLx03BpqDTivpKkBYwqP2UZkcxqX2Fo_GnVrNwlK7Lgxw6FSQvDO0","protected": "eyJhbGciOiJSU0EtT0FFUCIsImN0eSI6IkpXVCIsImVuYyI6IkExMjhHQ00ifQ","iv": "GbX1i9kXz0sxXPmA","ciphertext": "SZI4IvKHmwpazl_pJQXX3mHv1ANnOU4Wf9-utWYUcKrBNgCe2OFMf66cSJ8k2QkxaQD3_R60MGE9ofomwtky3GFxMeGRjtpMt9OAvVLsAXB0_UTCBGyBg3C2bWLXqZlfJAAoJRUPRk-BimYZY81zVBuIhc7HsQePCpu33SzMsFHjn4lP_idrJz_glZTNgKDt8zdnUPauKTKDNOH1DD4fuzvDYfDIAfqGPyL5sVRwbiXpXdGokEszM-9ChMPqW1QNhzuX_Zul3bvrJwr7nuGZs4cUScY3n8yE3AHCLurgls-A9mz1X38xEaulV18l4Fg9tLejdkAuQZjPbqeHQBJe4IwGD5Ee0dQ-Mtz4NnhkIWx-YKBb_Xo2zI3Q_1sYjKUuis7yWW-HTr_vqvFt0bj7WJf2vzB0TZ3dvsoGaTvPH2dyWwumUrlx4gmPUzBdwTO6ubfYSDUEEz5py0d_OtWeUSYcCYBKD-aM7tXg26qJo21gYjLfhn9zy-W19sOCZGuzgFjPhawXHpvnj_t-0_ES96kogjJLxS1IMU9Y5XmnwZMyNc9EIwnogsCg-hVuvzyP0sIruktmI94_SL1xgMl7o03phcTMxtlMizR88NKU1WkBsiXMCjy1Noue7MD-ShDp5dmM","tag": "KnIKEhN8U-3C9s4gtSpjSw"}'; $json = '{"recipients": [{"encrypted_key": "a0JHRoITfpX4qRewImjlStn8m3CPxBV1ueYlVhjurCyrBg3I7YhCRYjphDOOS4E7rXbr2Fn6NyQq-A-gqT0FXqNjVOGrG-bi13mwy7RoYhjTkBEC6P7sMYMXXx4gzMedpiJHQVeyI-zkZV7A9matpgevAJWrXzOUysYGTtwoSN6gtUVtlLaivjvb21O0ul4YxSHV-ByK1kyeetRp_fuYJxHoKLQL9P424sKx2WGYb4zsBIPF4ssl_e5IR7nany-25_UmC2urosNkoFz9cQ82MypZP8gqbQJyPN-Fpp4Z-5o6yV64x6yzDUF_5JCIdl-Qv6H5dMVIY7q1eKpXcV1lWO_2FefEBqXxXvIjLeZivjNkzogCq3-IapSjVFnMjBxjpYLT8muaawo1yy1XXMuinIpNcOY3n4KKrXLrCcteX85m4IIHMZa38s1Hpr56fPPseMA-Jltmt-a9iEDtOzhtxz8AXy9tsCAZV2XBWNG8c3kJusAamBKOYwfk7JhLRDgOnJjlJLhn7TI4UxDp9dCmUXEN6z0v23W15qJIEXNJtqnblpymooeWAHCT4e_Owbim1g0AEpTHUdA2iiLNs9WTX_H_TXuPC8yDDhi1smxS_X_xpkIHkiIHWDOLx03BpqDTivpKkBYwqP2UZkcxqX2Fo_GnVrNwlK7Lgxw6FSQvDO0"}],"protected": "eyJhbGciOiJSU0EtT0FFUCIsImN0eSI6IkpXVCIsImVuYyI6IkExMjhHQ00ifQ","iv": "GbX1i9kXz0sxXPmA","ciphertext": "SZI4IvKHmwpazl_pJQXX3mHv1ANnOU4Wf9-utWYUcKrBNgCe2OFMf66cSJ8k2QkxaQD3_R60MGE9ofomwtky3GFxMeGRjtpMt9OAvVLsAXB0_UTCBGyBg3C2bWLXqZlfJAAoJRUPRk-BimYZY81zVBuIhc7HsQePCpu33SzMsFHjn4lP_idrJz_glZTNgKDt8zdnUPauKTKDNOH1DD4fuzvDYfDIAfqGPyL5sVRwbiXpXdGokEszM-9ChMPqW1QNhzuX_Zul3bvrJwr7nuGZs4cUScY3n8yE3AHCLurgls-A9mz1X38xEaulV18l4Fg9tLejdkAuQZjPbqeHQBJe4IwGD5Ee0dQ-Mtz4NnhkIWx-YKBb_Xo2zI3Q_1sYjKUuis7yWW-HTr_vqvFt0bj7WJf2vzB0TZ3dvsoGaTvPH2dyWwumUrlx4gmPUzBdwTO6ubfYSDUEEz5py0d_OtWeUSYcCYBKD-aM7tXg26qJo21gYjLfhn9zy-W19sOCZGuzgFjPhawXHpvnj_t-0_ES96kogjJLxS1IMU9Y5XmnwZMyNc9EIwnogsCg-hVuvzyP0sIruktmI94_SL1xgMl7o03phcTMxtlMizR88NKU1WkBsiXMCjy1Noue7MD-ShDp5dmM","tag": "KnIKEhN8U-3C9s4gtSpjSw"}'; - $loaded_compact_json = $this->getJWESerializerManager()->unserialize($json_compact); - $loaded_flattened_json = $this->getJWESerializerManager()->unserialize($json_flattened); - $loaded_json = $this->getJWESerializerManager()->unserialize($json); + $loaded_compact_json = $this->getJWESerializerManager() + ->unserialize($json_compact) + ; + $loaded_flattened_json = $this->getJWESerializerManager() + ->unserialize($json_flattened) + ; + $loaded_json = $this->getJWESerializerManager() + ->unserialize($json) + ; static::assertTrue($jweDecrypter->decryptUsingKey($loaded_compact_json, $encryption_key, 0)); static::assertTrue($jweDecrypter->decryptUsingKey($loaded_flattened_json, $encryption_key, 0)); static::assertTrue($jweDecrypter->decryptUsingKey($loaded_json, $encryption_key, 0)); - static::assertEquals($encryption_header, $loaded_compact_json->getSharedProtectedHeader()); - static::assertEquals($payload, $loaded_compact_json->getPayload()); + static::assertSame($encryption_header, $loaded_compact_json->getSharedProtectedHeader()); + static::assertSame($payload, $loaded_compact_json->getPayload()); - static::assertEquals($encryption_header, $loaded_flattened_json->getSharedProtectedHeader()); - static::assertEquals($payload, $loaded_flattened_json->getPayload()); + static::assertSame($encryption_header, $loaded_flattened_json->getSharedProtectedHeader()); + static::assertSame($payload, $loaded_flattened_json->getPayload()); - static::assertEquals($encryption_header, $loaded_json->getSharedProtectedHeader()); - static::assertEquals($payload, $loaded_json->getPayload()); + static::assertSame($encryption_header, $loaded_json->getSharedProtectedHeader()); + static::assertSame($payload, $loaded_json->getPayload()); } } diff --git a/tests/Component/NestedToken/NestingTokenBuilderTest.php b/tests/Component/NestedToken/NestingTokenBuilderTest.php index b962df6e..a5e82bd7 100644 --- a/tests/Component/NestedToken/NestingTokenBuilderTest.php +++ b/tests/Component/NestedToken/NestingTokenBuilderTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\NestedToken; use Jose\Component\Checker\HeaderCheckerManagerFactory; @@ -18,10 +9,11 @@ use Jose\Component\Core\JWK; use Jose\Component\Encryption\Algorithm\ContentEncryption\A128GCM; use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP; -use Jose\Component\Encryption\Compression; use Jose\Component\Encryption\Compression\CompressionMethodManagerFactory; +use Jose\Component\Encryption\Compression\Deflate; use Jose\Component\Encryption\JWEBuilderFactory; use Jose\Component\Encryption\Serializer as JweSerializer; +use Jose\Component\Encryption\Serializer\JWESerializerManagerFactory; use Jose\Component\NestedToken\NestedTokenBuilderFactory; use Jose\Component\Signature\Algorithm\PS256; use Jose\Component\Signature\JWSBuilder; @@ -32,49 +24,28 @@ /** * @see https://tools.ietf.org/html/rfc7520#section-6 * - * @group RFC7520 - * @group NestedToken - * * @internal */ -class NestingTokenBuilderTest extends TestCase +final class NestingTokenBuilderTest extends TestCase { - /** - * @var JWSBuilderFactory - */ - private $jwsBuilderFactory; + private ?JWSBuilderFactory $jwsBuilderFactory = null; - /** - * @var JWEBuilderFactory - */ - private $jweBuilderFactory; + private ?JWEBuilderFactory $jweBuilderFactory = null; - /** - * @var NestedTokenBuilderFactory - */ - private $nestedTokenBuilderFactory; + private ?NestedTokenBuilderFactory $nestedTokenBuilderFactory = null; - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; + private ?AlgorithmManagerFactory $algorithmManagerFactory = null; - /** - * @var CompressionMethodManagerFactory - */ - private $compressionMethodManagerFactory; + private ?CompressionMethodManagerFactory $compressionMethodManagerFactory = null; - /** - * @var null|JweSerializer\JWESerializerManagerFactory - */ - private $jwsSerializerManagerFactory; + private ?JWESerializerManagerFactory $jwsSerializerManagerFactory = null; protected function setUp(): void { - if (!class_exists(HeaderCheckerManagerFactory::class)) { + if (! class_exists(HeaderCheckerManagerFactory::class)) { static::markTestSkipped('The component "web-token/jwt-checker" is not installed.'); } - if (!class_exists(JWSBuilder::class)) { + if (! class_exists(JWSBuilder::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } } @@ -115,25 +86,30 @@ public function decryption(): void 'qi' => 'S8tC7ZknW6hPITkjcwttQOPLVmRfwirRlFAViuDb8NW9CrV_7F2OqUZCqmzHTYAumwGFHI1WVRep7anleWaJjxC_1b3fq_al4qH3Pe-EKiHg6IMazuRtZLUROcThrExDbF5dYbsciDnfRUWLErZ4N1Be0bnxYuPqxwKd9QZwMo0', ]); - $nestedTokenBuilder = $this->getNestedTokenBuilderFactory()->create( - ['jwe_compact'], - ['RSA-OAEP'], - ['A128GCM'], - ['DEF'], - ['jws_compact'], - ['PS256'] - ); + $nestedTokenBuilder = $this->getNestedTokenBuilderFactory() + ->create(['jwe_compact'], ['RSA-OAEP'], ['A128GCM'], ['DEF'], ['jws_compact'], ['PS256']) + ; $nestedTokenBuilder->create( $payload, [ - ['key' => $signature_key, 'protected_header' => ['alg' => 'PS256']], + [ + 'key' => $signature_key, + 'protected_header' => [ + 'alg' => 'PS256', + ], + ], ], 'jws_compact', - ['alg' => 'RSA-OAEP', 'enc' => 'A128GCM'], + [ + 'alg' => 'RSA-OAEP', + 'enc' => 'A128GCM', + ], [], [ - ['key' => $encryption_key], + [ + 'key' => $encryption_key, + ], ], 'jwe_compact' ); @@ -141,10 +117,8 @@ public function decryption(): void protected function getJWSBuilderFactory(): JWSBuilderFactory { - if (null === $this->jwsBuilderFactory) { - $this->jwsBuilderFactory = new JWSBuilderFactory( - $this->getAlgorithmManagerFactory() - ); + if ($this->jwsBuilderFactory === null) { + $this->jwsBuilderFactory = new JWSBuilderFactory($this->getAlgorithmManagerFactory()); } return $this->jwsBuilderFactory; @@ -152,7 +126,7 @@ protected function getJWSBuilderFactory(): JWSBuilderFactory protected function getJWEBuilderFactory(): JWEBuilderFactory { - if (null === $this->jweBuilderFactory) { + if ($this->jweBuilderFactory === null) { $this->jweBuilderFactory = new JWEBuilderFactory( $this->getAlgorithmManagerFactory(), $this->getCompressionMethodManagerFactory() @@ -164,7 +138,7 @@ protected function getJWEBuilderFactory(): JWEBuilderFactory private function getNestedTokenBuilderFactory(): NestedTokenBuilderFactory { - if (null === $this->nestedTokenBuilderFactory) { + if ($this->nestedTokenBuilderFactory === null) { $this->nestedTokenBuilderFactory = new NestedTokenBuilderFactory( $this->getJWEBuilderFactory(), $this->getJWESerializerManagerFactory(), @@ -188,7 +162,7 @@ private function getJWSSerializerManagerFactory(): JwsSerializer\JWSSerializerMa private function getAlgorithmManagerFactory(): AlgorithmManagerFactory { - if (null === $this->algorithmManagerFactory) { + if ($this->algorithmManagerFactory === null) { $this->algorithmManagerFactory = new AlgorithmManagerFactory(); $this->algorithmManagerFactory->add('A128GCM', new A128GCM()); $this->algorithmManagerFactory->add('RSA-OAEP', new RSAOAEP()); @@ -200,9 +174,9 @@ private function getAlgorithmManagerFactory(): AlgorithmManagerFactory private function getCompressionMethodManagerFactory(): CompressionMethodManagerFactory { - if (null === $this->compressionMethodManagerFactory) { + if ($this->compressionMethodManagerFactory === null) { $this->compressionMethodManagerFactory = new CompressionMethodManagerFactory(); - $this->compressionMethodManagerFactory->add('DEF', new Compression\Deflate()); + $this->compressionMethodManagerFactory->add('DEF', new Deflate()); } return $this->compressionMethodManagerFactory; @@ -210,7 +184,7 @@ private function getCompressionMethodManagerFactory(): CompressionMethodManagerF private function getJWESerializerManagerFactory(): JweSerializer\JWESerializerManagerFactory { - if (null === $this->jwsSerializerManagerFactory) { + if ($this->jwsSerializerManagerFactory === null) { $this->jwsSerializerManagerFactory = new JweSerializer\JWESerializerManagerFactory(); $this->jwsSerializerManagerFactory->add(new JweSerializer\CompactSerializer()); $this->jwsSerializerManagerFactory->add(new JweSerializer\JSONFlattenedSerializer()); diff --git a/tests/Component/NestedToken/NestingTokenUsingNestedTokenLoaderTest.php b/tests/Component/NestedToken/NestingTokenUsingNestedTokenLoaderTest.php index 0d20d2fa..df462b88 100644 --- a/tests/Component/NestedToken/NestingTokenUsingNestedTokenLoaderTest.php +++ b/tests/Component/NestedToken/NestingTokenUsingNestedTokenLoaderTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\NestedToken; use Jose\Component\Checker\HeaderCheckerManagerFactory; @@ -19,12 +10,13 @@ use Jose\Component\Core\JWKSet; use Jose\Component\Encryption\Algorithm\ContentEncryption\A128GCM; use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP; -use Jose\Component\Encryption\Compression; use Jose\Component\Encryption\Compression\CompressionMethodManagerFactory; +use Jose\Component\Encryption\Compression\Deflate; use Jose\Component\Encryption\JWEDecrypterFactory; use Jose\Component\Encryption\JWELoaderFactory; use Jose\Component\Encryption\JWETokenSupport; use Jose\Component\Encryption\Serializer as JweSerializer; +use Jose\Component\Encryption\Serializer\JWESerializerManagerFactory; use Jose\Component\NestedToken\NestedTokenLoaderFactory; use Jose\Component\Signature\Algorithm\PS256; use Jose\Component\Signature\JWSLoader; @@ -37,54 +29,30 @@ /** * @see https://tools.ietf.org/html/rfc7520#section-6 * - * @group RFC7520 - * @group NestedToken - * * @internal */ -class NestingTokenUsingNestedTokenLoaderTest extends TestCase +final class NestingTokenUsingNestedTokenLoaderTest extends TestCase { - /** - * @var JWSLoaderFactory - */ - private $jwsLoaderFactory; + private ?JWSLoaderFactory $jwsLoaderFactory = null; - /** - * @var JWELoaderFactory - */ - private $jweLoaderFactory; + private ?JWELoaderFactory $jweLoaderFactory = null; - /** - * @var NestedTokenLoaderFactory - */ - private $nestedTokenLoaderFactory; + private ?NestedTokenLoaderFactory $nestedTokenLoaderFactory = null; - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; + private ?AlgorithmManagerFactory $algorithmManagerFactory = null; - /** - * @var CompressionMethodManagerFactory - */ - private $compressionMethodManagerFactory; + private ?CompressionMethodManagerFactory $compressionMethodManagerFactory = null; - /** - * @var JWEDecrypterFactory - */ - private $jweDecrypterFactory; + private ?JWEDecrypterFactory $jweDecrypterFactory = null; - /** - * @var null|JweSerializer\JWESerializerManagerFactory - */ - private $jwsSerializerManagerFactory; + private ?JWESerializerManagerFactory $jwsSerializerManagerFactory = null; protected function setUp(): void { - if (!class_exists(HeaderCheckerManagerFactory::class)) { + if (! class_exists(HeaderCheckerManagerFactory::class)) { static::markTestSkipped('The component "web-token/jwt-checker" is not installed.'); } - if (!class_exists(JWSLoader::class)) { + if (! class_exists(JWSLoader::class)) { static::markTestSkipped('The component "web-token/jwt-signature" is not installed.'); } } @@ -112,16 +80,18 @@ public function decryption(): void ]); $encryption_key_set = new JWKSet([$encryption_key]); - $nestedTokenLoader = $this->getNestedTokenLoaderFactory()->create( - ['jwe_compact', 'jwe_json_flattened', 'jwe_json_general'], - ['RSA-OAEP'], - ['A128GCM'], - ['DEF'], - [], - ['jws_compact', 'jws_json_flattened', 'jws_json_general'], - ['PS256'], - [] - ); + $nestedTokenLoader = $this->getNestedTokenLoaderFactory() + ->create( + ['jwe_compact', 'jwe_json_flattened', 'jwe_json_general'], + ['RSA-OAEP'], + ['A128GCM'], + ['DEF'], + [], + ['jws_compact', 'jws_json_flattened', 'jws_json_general'], + ['PS256'], + [] + ) + ; $signature_key = new JWK([ 'kty' => 'RSA', @@ -136,30 +106,43 @@ public function decryption(): void 'dq' => 'R9FUvU88OVzEkTkXl3-5-WusE4DjHmndeZIlu3rifBdfLpq_P-iWPBbGaq9wzQ1c-J7SzCdJqkEJDv5yd2C7rnZ6kpzwBh_nmL8zscAk1qsunnt9CJGAYz7-sGWy1JGShFazfP52ThB4rlCJ0YuEaQMrIzpY77_oLAhpmDA0hLk', 'qi' => 'S8tC7ZknW6hPITkjcwttQOPLVmRfwirRlFAViuDb8NW9CrV_7F2OqUZCqmzHTYAumwGFHI1WVRep7anleWaJjxC_1b3fq_al4qH3Pe-EKiHg6IMazuRtZLUROcThrExDbF5dYbsciDnfRUWLErZ4N1Be0bnxYuPqxwKd9QZwMo0', ]); - $signature_key_set = new JWKSet([ - $signature_key, - ]); + $signature_key_set = new JWKSet([$signature_key]); $json_compact = 'eyJhbGciOiJSU0EtT0FFUCIsImN0eSI6IkpXVCIsImVuYyI6IkExMjhHQ00ifQ.a0JHRoITfpX4qRewImjlStn8m3CPxBV1ueYlVhjurCyrBg3I7YhCRYjphDOOS4E7rXbr2Fn6NyQq-A-gqT0FXqNjVOGrG-bi13mwy7RoYhjTkBEC6P7sMYMXXx4gzMedpiJHQVeyI-zkZV7A9matpgevAJWrXzOUysYGTtwoSN6gtUVtlLaivjvb21O0ul4YxSHV-ByK1kyeetRp_fuYJxHoKLQL9P424sKx2WGYb4zsBIPF4ssl_e5IR7nany-25_UmC2urosNkoFz9cQ82MypZP8gqbQJyPN-Fpp4Z-5o6yV64x6yzDUF_5JCIdl-Qv6H5dMVIY7q1eKpXcV1lWO_2FefEBqXxXvIjLeZivjNkzogCq3-IapSjVFnMjBxjpYLT8muaawo1yy1XXMuinIpNcOY3n4KKrXLrCcteX85m4IIHMZa38s1Hpr56fPPseMA-Jltmt-a9iEDtOzhtxz8AXy9tsCAZV2XBWNG8c3kJusAamBKOYwfk7JhLRDgOnJjlJLhn7TI4UxDp9dCmUXEN6z0v23W15qJIEXNJtqnblpymooeWAHCT4e_Owbim1g0AEpTHUdA2iiLNs9WTX_H_TXuPC8yDDhi1smxS_X_xpkIHkiIHWDOLx03BpqDTivpKkBYwqP2UZkcxqX2Fo_GnVrNwlK7Lgxw6FSQvDO0.GbX1i9kXz0sxXPmA.SZI4IvKHmwpazl_pJQXX3mHv1ANnOU4Wf9-utWYUcKrBNgCe2OFMf66cSJ8k2QkxaQD3_R60MGE9ofomwtky3GFxMeGRjtpMt9OAvVLsAXB0_UTCBGyBg3C2bWLXqZlfJAAoJRUPRk-BimYZY81zVBuIhc7HsQePCpu33SzMsFHjn4lP_idrJz_glZTNgKDt8zdnUPauKTKDNOH1DD4fuzvDYfDIAfqGPyL5sVRwbiXpXdGokEszM-9ChMPqW1QNhzuX_Zul3bvrJwr7nuGZs4cUScY3n8yE3AHCLurgls-A9mz1X38xEaulV18l4Fg9tLejdkAuQZjPbqeHQBJe4IwGD5Ee0dQ-Mtz4NnhkIWx-YKBb_Xo2zI3Q_1sYjKUuis7yWW-HTr_vqvFt0bj7WJf2vzB0TZ3dvsoGaTvPH2dyWwumUrlx4gmPUzBdwTO6ubfYSDUEEz5py0d_OtWeUSYcCYBKD-aM7tXg26qJo21gYjLfhn9zy-W19sOCZGuzgFjPhawXHpvnj_t-0_ES96kogjJLxS1IMU9Y5XmnwZMyNc9EIwnogsCg-hVuvzyP0sIruktmI94_SL1xgMl7o03phcTMxtlMizR88NKU1WkBsiXMCjy1Noue7MD-ShDp5dmM.KnIKEhN8U-3C9s4gtSpjSw'; $json_flattened = '{"encrypted_key": "a0JHRoITfpX4qRewImjlStn8m3CPxBV1ueYlVhjurCyrBg3I7YhCRYjphDOOS4E7rXbr2Fn6NyQq-A-gqT0FXqNjVOGrG-bi13mwy7RoYhjTkBEC6P7sMYMXXx4gzMedpiJHQVeyI-zkZV7A9matpgevAJWrXzOUysYGTtwoSN6gtUVtlLaivjvb21O0ul4YxSHV-ByK1kyeetRp_fuYJxHoKLQL9P424sKx2WGYb4zsBIPF4ssl_e5IR7nany-25_UmC2urosNkoFz9cQ82MypZP8gqbQJyPN-Fpp4Z-5o6yV64x6yzDUF_5JCIdl-Qv6H5dMVIY7q1eKpXcV1lWO_2FefEBqXxXvIjLeZivjNkzogCq3-IapSjVFnMjBxjpYLT8muaawo1yy1XXMuinIpNcOY3n4KKrXLrCcteX85m4IIHMZa38s1Hpr56fPPseMA-Jltmt-a9iEDtOzhtxz8AXy9tsCAZV2XBWNG8c3kJusAamBKOYwfk7JhLRDgOnJjlJLhn7TI4UxDp9dCmUXEN6z0v23W15qJIEXNJtqnblpymooeWAHCT4e_Owbim1g0AEpTHUdA2iiLNs9WTX_H_TXuPC8yDDhi1smxS_X_xpkIHkiIHWDOLx03BpqDTivpKkBYwqP2UZkcxqX2Fo_GnVrNwlK7Lgxw6FSQvDO0","protected": "eyJhbGciOiJSU0EtT0FFUCIsImN0eSI6IkpXVCIsImVuYyI6IkExMjhHQ00ifQ","iv": "GbX1i9kXz0sxXPmA","ciphertext": "SZI4IvKHmwpazl_pJQXX3mHv1ANnOU4Wf9-utWYUcKrBNgCe2OFMf66cSJ8k2QkxaQD3_R60MGE9ofomwtky3GFxMeGRjtpMt9OAvVLsAXB0_UTCBGyBg3C2bWLXqZlfJAAoJRUPRk-BimYZY81zVBuIhc7HsQePCpu33SzMsFHjn4lP_idrJz_glZTNgKDt8zdnUPauKTKDNOH1DD4fuzvDYfDIAfqGPyL5sVRwbiXpXdGokEszM-9ChMPqW1QNhzuX_Zul3bvrJwr7nuGZs4cUScY3n8yE3AHCLurgls-A9mz1X38xEaulV18l4Fg9tLejdkAuQZjPbqeHQBJe4IwGD5Ee0dQ-Mtz4NnhkIWx-YKBb_Xo2zI3Q_1sYjKUuis7yWW-HTr_vqvFt0bj7WJf2vzB0TZ3dvsoGaTvPH2dyWwumUrlx4gmPUzBdwTO6ubfYSDUEEz5py0d_OtWeUSYcCYBKD-aM7tXg26qJo21gYjLfhn9zy-W19sOCZGuzgFjPhawXHpvnj_t-0_ES96kogjJLxS1IMU9Y5XmnwZMyNc9EIwnogsCg-hVuvzyP0sIruktmI94_SL1xgMl7o03phcTMxtlMizR88NKU1WkBsiXMCjy1Noue7MD-ShDp5dmM","tag": "KnIKEhN8U-3C9s4gtSpjSw"}'; $json_general = '{"recipients": [{"encrypted_key": "a0JHRoITfpX4qRewImjlStn8m3CPxBV1ueYlVhjurCyrBg3I7YhCRYjphDOOS4E7rXbr2Fn6NyQq-A-gqT0FXqNjVOGrG-bi13mwy7RoYhjTkBEC6P7sMYMXXx4gzMedpiJHQVeyI-zkZV7A9matpgevAJWrXzOUysYGTtwoSN6gtUVtlLaivjvb21O0ul4YxSHV-ByK1kyeetRp_fuYJxHoKLQL9P424sKx2WGYb4zsBIPF4ssl_e5IR7nany-25_UmC2urosNkoFz9cQ82MypZP8gqbQJyPN-Fpp4Z-5o6yV64x6yzDUF_5JCIdl-Qv6H5dMVIY7q1eKpXcV1lWO_2FefEBqXxXvIjLeZivjNkzogCq3-IapSjVFnMjBxjpYLT8muaawo1yy1XXMuinIpNcOY3n4KKrXLrCcteX85m4IIHMZa38s1Hpr56fPPseMA-Jltmt-a9iEDtOzhtxz8AXy9tsCAZV2XBWNG8c3kJusAamBKOYwfk7JhLRDgOnJjlJLhn7TI4UxDp9dCmUXEN6z0v23W15qJIEXNJtqnblpymooeWAHCT4e_Owbim1g0AEpTHUdA2iiLNs9WTX_H_TXuPC8yDDhi1smxS_X_xpkIHkiIHWDOLx03BpqDTivpKkBYwqP2UZkcxqX2Fo_GnVrNwlK7Lgxw6FSQvDO0"}],"protected": "eyJhbGciOiJSU0EtT0FFUCIsImN0eSI6IkpXVCIsImVuYyI6IkExMjhHQ00ifQ","iv": "GbX1i9kXz0sxXPmA","ciphertext": "SZI4IvKHmwpazl_pJQXX3mHv1ANnOU4Wf9-utWYUcKrBNgCe2OFMf66cSJ8k2QkxaQD3_R60MGE9ofomwtky3GFxMeGRjtpMt9OAvVLsAXB0_UTCBGyBg3C2bWLXqZlfJAAoJRUPRk-BimYZY81zVBuIhc7HsQePCpu33SzMsFHjn4lP_idrJz_glZTNgKDt8zdnUPauKTKDNOH1DD4fuzvDYfDIAfqGPyL5sVRwbiXpXdGokEszM-9ChMPqW1QNhzuX_Zul3bvrJwr7nuGZs4cUScY3n8yE3AHCLurgls-A9mz1X38xEaulV18l4Fg9tLejdkAuQZjPbqeHQBJe4IwGD5Ee0dQ-Mtz4NnhkIWx-YKBb_Xo2zI3Q_1sYjKUuis7yWW-HTr_vqvFt0bj7WJf2vzB0TZ3dvsoGaTvPH2dyWwumUrlx4gmPUzBdwTO6ubfYSDUEEz5py0d_OtWeUSYcCYBKD-aM7tXg26qJo21gYjLfhn9zy-W19sOCZGuzgFjPhawXHpvnj_t-0_ES96kogjJLxS1IMU9Y5XmnwZMyNc9EIwnogsCg-hVuvzyP0sIruktmI94_SL1xgMl7o03phcTMxtlMizR88NKU1WkBsiXMCjy1Noue7MD-ShDp5dmM","tag": "KnIKEhN8U-3C9s4gtSpjSw"}'; - $loaded_compact_json = $nestedTokenLoader->load($json_compact, $encryption_key_set, $signature_key_set, $json_compact_signature); - static::assertEquals($payload, $loaded_compact_json->getPayload()); - static::assertEquals(0, $json_compact_signature); - - $loaded_flattened_json = $nestedTokenLoader->load($json_flattened, $encryption_key_set, $signature_key_set, $json_flattened_signature); - static::assertEquals($payload, $loaded_flattened_json->getPayload()); - static::assertEquals(0, $json_flattened_signature); - - $loaded_json = $nestedTokenLoader->load($json_general, $encryption_key_set, $signature_key_set, $json_general_signature); - static::assertEquals($payload, $loaded_json->getPayload()); - static::assertEquals(0, $json_general_signature); + $loaded_compact_json = $nestedTokenLoader->load( + $json_compact, + $encryption_key_set, + $signature_key_set, + $json_compact_signature + ); + static::assertSame($payload, $loaded_compact_json->getPayload()); + static::assertSame(0, $json_compact_signature); + + $loaded_flattened_json = $nestedTokenLoader->load( + $json_flattened, + $encryption_key_set, + $signature_key_set, + $json_flattened_signature + ); + static::assertSame($payload, $loaded_flattened_json->getPayload()); + static::assertSame(0, $json_flattened_signature); + + $loaded_json = $nestedTokenLoader->load( + $json_general, + $encryption_key_set, + $signature_key_set, + $json_general_signature + ); + static::assertSame($payload, $loaded_json->getPayload()); + static::assertSame(0, $json_general_signature); } protected function getJWSLoaderFactory(): JWSLoaderFactory { - if (null === $this->jwsLoaderFactory) { + if ($this->jwsLoaderFactory === null) { $this->jwsLoaderFactory = new JWSLoaderFactory( $this->getJWSSerializerManagerFactory(), $this->getJWSVerifierFactory(), @@ -172,7 +155,7 @@ protected function getJWSLoaderFactory(): JWSLoaderFactory protected function getJWELoaderFactory(): JWELoaderFactory { - if (null === $this->jweLoaderFactory) { + if ($this->jweLoaderFactory === null) { $this->jweLoaderFactory = new JWELoaderFactory( $this->getJWESerializerManagerFactory(), $this->getJWEDecrypterFactory(), @@ -185,7 +168,7 @@ protected function getJWELoaderFactory(): JWELoaderFactory private function getNestedTokenLoaderFactory(): NestedTokenLoaderFactory { - if (null === $this->nestedTokenLoaderFactory) { + if ($this->nestedTokenLoaderFactory === null) { $this->nestedTokenLoaderFactory = new NestedTokenLoaderFactory( $this->getJWELoaderFactory(), $this->getJWSLoaderFactory() @@ -216,14 +199,12 @@ private function getJWSSerializerManagerFactory(): JwsSerializer\JWSSerializerMa private function getJWSVerifierFactory(): JWSVerifierFactory { - return new JWSVerifierFactory( - $this->getAlgorithmManagerFactory() - ); + return new JWSVerifierFactory($this->getAlgorithmManagerFactory()); } private function getAlgorithmManagerFactory(): AlgorithmManagerFactory { - if (null === $this->algorithmManagerFactory) { + if ($this->algorithmManagerFactory === null) { $this->algorithmManagerFactory = new AlgorithmManagerFactory(); $this->algorithmManagerFactory->add('A128GCM', new A128GCM()); $this->algorithmManagerFactory->add('RSA-OAEP', new RSAOAEP()); @@ -235,9 +216,9 @@ private function getAlgorithmManagerFactory(): AlgorithmManagerFactory private function getCompressionMethodManagerFactory(): CompressionMethodManagerFactory { - if (null === $this->compressionMethodManagerFactory) { + if ($this->compressionMethodManagerFactory === null) { $this->compressionMethodManagerFactory = new CompressionMethodManagerFactory(); - $this->compressionMethodManagerFactory->add('DEF', new Compression\Deflate()); + $this->compressionMethodManagerFactory->add('DEF', new Deflate()); } return $this->compressionMethodManagerFactory; @@ -245,7 +226,7 @@ private function getCompressionMethodManagerFactory(): CompressionMethodManagerF private function getJWEDecrypterFactory(): JWEDecrypterFactory { - if (null === $this->jweDecrypterFactory) { + if ($this->jweDecrypterFactory === null) { $this->jweDecrypterFactory = new JWEDecrypterFactory( $this->getAlgorithmManagerFactory(), $this->getCompressionMethodManagerFactory() @@ -257,7 +238,7 @@ private function getJWEDecrypterFactory(): JWEDecrypterFactory private function getJWESerializerManagerFactory(): JweSerializer\JWESerializerManagerFactory { - if (null === $this->jwsSerializerManagerFactory) { + if ($this->jwsSerializerManagerFactory === null) { $this->jwsSerializerManagerFactory = new JweSerializer\JWESerializerManagerFactory(); $this->jwsSerializerManagerFactory->add(new JweSerializer\CompactSerializer()); $this->jwsSerializerManagerFactory->add(new JweSerializer\JSONFlattenedSerializer()); diff --git a/tests/Component/Signature/ForeignJWTTest.php b/tests/Component/Signature/ForeignJWTTest.php index 5bd753df..dcc92389 100644 --- a/tests/Component/Signature/ForeignJWTTest.php +++ b/tests/Component/Signature/ForeignJWTTest.php @@ -2,26 +2,14 @@ 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\Tests\Component\Signature; use Jose\Component\Core\JWK; /** - * @group ForeignJWT - * @group functional - * * @internal */ -class ForeignJWTTest extends SignatureTest +final class ForeignJWTTest extends SignatureTest { /* * The following test uses an assertion created with another library. @@ -42,8 +30,12 @@ public function validJWTFromOtherLibrary(): void $challenge = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJmNTIyMjI3OS1kNTQ0LTRjM2QtYWM3Yy1mYzU0NzE1ZDBjMjYiLCJleHAiOjE0Njk2NDkyMDksImp0aSI6IjZhZjExNDk3LTdkNmItNDQ5Ny04NDI1LTc0YmExM2E1ODMxYyIsInJlZGlyIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NDQ0NC9vYXV0aDIvYXV0aD9jbGllbnRfaWQ9ZjUyMjIyNzktZDU0NC00YzNkLWFjN2MtZmM1NDcxNWQwYzI2XHUwMDI2cmVzcG9uc2VfdHlwZT1jb2RlXHUwMDI2c2NvcGU9Y29yZStmb29cdTAwMjZzdGF0ZT1hYmNkZWZnaFx1MDAyNnJlZGlyZWN0X3VyaT1odHRwOi8vbG9jYWxob3N0L2NiIiwic2NwIjpbImNvcmUiLCJmb28iXX0.U3fu5eJVDD5tpOa9O3SejMh78skCj6a3rv5qWqzmME2WF0R9QnTR6TS5g6OOCh86o03AlHi2LhE4GSoUmC8WMPzXopDSdZdEkuifYUOSjRQV3Mp5tn6ozkkB75TtIhM8x5_QV3YKgTy3bcojg-Nx3ix43ENGdnbaCZ6Sxqj4xDknh7pHtsUiHfHZL7jd0I0xP5TYOw0_rxhuK9UZKtt_o05sFnNr0PW1k5d6aU5qJoBNVAendr_evrzXIV0yCC_odj5KySsNaQiXjUX_Tri2_5gSgcr8t3GMRm-HjDJRttwD3vgQG_K3vuToB-JAtHNMDcqmPjLzEFFkRDeh55kHgPJlYzSdwWD52b9sX5fj-VrRLdQzO2VVVkP7a9GoCGS06ypV9R_yGK8HzKJ8uB12dTNmplo03v4vdWxVdsnWxmBJ0m7G7yBCr-iGi87ezowpkMw22rNBkqnaEZIVbmX5E-G3UncE6io3IizEGH4YcGxWSk_D2fCII6X9uncf2rwslhEMiGC6rwlrL8dgl3kJTB4d0s2wIKgWJwEfLkiamJ2CJp6x0tqG7ozWv3k1tNQaZ9OwaulZ7nbmHgalyIOI2k-emMhFZsdnAtCxtcrxleevoiYF-Q54h1BhYInQT6Ejx7CdKOTEjljttB7lcqqpboSblw8Ji7lxUiKHWyGhcPI'; - $jwsVerifier = $this->getJWSVerifierFactory()->create(['RS256']); - $jwt = $this->getJWSSerializerManager()->unserialize($challenge); + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['RS256']) + ; + $jwt = $this->getJWSSerializerManager() + ->unserialize($challenge) + ; static::assertTrue($jwsVerifier->verifyWithKey($jwt, $jwk, 0)); $expectedHeader = [ @@ -51,6 +43,6 @@ public function validJWTFromOtherLibrary(): void 'typ' => 'JWT', ]; - static::assertEquals($expectedHeader, $jwt->getSignature(0)->getProtectedHeader()); + static::assertSame($expectedHeader, $jwt->getSignature(0)->getProtectedHeader()); } } diff --git a/tests/Component/Signature/JWSFlattenedTest.php b/tests/Component/Signature/JWSFlattenedTest.php index 8054595b..719f28c0 100644 --- a/tests/Component/Signature/JWSFlattenedTest.php +++ b/tests/Component/Signature/JWSFlattenedTest.php @@ -2,23 +2,12 @@ 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\Tests\Component\Signature; /** - * @group functional - * * @internal */ -class JWSFlattenedTest extends SignatureTest +final class JWSFlattenedTest extends SignatureTest { /** * @see https://tools.ietf.org/html/rfc7516#appendix-A.5 @@ -27,9 +16,17 @@ class JWSFlattenedTest extends SignatureTest */ public function loadFlattenedJWS(): void { - $loaded = $this->getJWSSerializerManager()->unserialize('{"payload":"eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ","protected":"eyJhbGciOiJFUzI1NiJ9","header":{"kid":"e9bc097a-ce51-4036-9562-d2ade882db0d"},"signature":"DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"}'); + $loaded = $this->getJWSSerializerManager() + ->unserialize( + '{"payload":"eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ","protected":"eyJhbGciOiJFUzI1NiJ9","header":{"kid":"e9bc097a-ce51-4036-9562-d2ade882db0d"},"signature":"DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"}' + ) + ; - static::assertEquals('ES256', $loaded->getSignature(0)->getProtectedHeaderParameter('alg')); - static::assertEquals(['iss' => 'joe', 'exp' => 1300819380, 'http://example.com/is_root' => true], json_decode($loaded->getPayload(), true)); + static::assertSame('ES256', $loaded->getSignature(0)->getProtectedHeaderParameter('alg')); + static::assertSame([ + 'iss' => 'joe', + 'exp' => 1300819380, + 'http://example.com/is_root' => true, + ], json_decode($loaded->getPayload(), true)); } } diff --git a/tests/Component/Signature/JWSLoaderTest.php b/tests/Component/Signature/JWSLoaderTest.php index 4b2bc562..f130ca1c 100644 --- a/tests/Component/Signature/JWSLoaderTest.php +++ b/tests/Component/Signature/JWSLoaderTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Signature; use Exception; @@ -18,17 +9,11 @@ use Jose\Component\Signature\JWSLoader; /** - * @group JWSLoader - * @group unit - * * @internal */ -class JWSLoaderTest extends SignatureTest +final class JWSLoaderTest extends SignatureTest { - /** - * @var null|JWSLoader - */ - private $jwsLoader; + private ?JWSLoader $jwsLoader = null; /** * @test @@ -47,7 +32,9 @@ public function theFlattenedTokenCannotBeLoaded(): void 'e' => 'AQAB', ]); - $this->getJWSLoader()->loadAndVerifyWithKey($token, $key, $signature); + $this->getJWSLoader() + ->loadAndVerifyWithKey($token, $key, $signature) + ; } /** @@ -67,7 +54,9 @@ public function theTokenCannotBeVerifiedBecauseOfAnUnsupportedAlgorithm(): void 'e' => 'AQAB', ]); - $this->getJWSLoader()->loadAndVerifyWithKey($token, $key, $signature); + $this->getJWSLoader() + ->loadAndVerifyWithKey($token, $key, $signature) + ; } /** @@ -87,7 +76,9 @@ public function theTokenCannotBeVerifiedBecauseOfABadKey(): void 'e' => 'AQAB', ]); - $this->getJWSLoader()->loadAndVerifyWithKey($token, $key, $signature); + $this->getJWSLoader() + ->loadAndVerifyWithKey($token, $key, $signature) + ; } /** @@ -104,15 +95,22 @@ public function theTokenCanBeVerified(): void 'k' => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg', ]); - $jws = $this->getJWSLoader()->loadAndVerifyWithKey($token, $key, $signature); - static::assertEquals("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.", $jws->getPayload()); - static::assertEquals(0, $signature); + $jws = $this->getJWSLoader() + ->loadAndVerifyWithKey($token, $key, $signature) + ; + static::assertSame( + "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.", + $jws->getPayload() + ); + static::assertSame(0, $signature); } private function getJWSLoader(): JWSLoader { - if (null === $this->jwsLoader) { - $this->jwsLoader = $this->getJWSLoaderFactory()->create(['jws_compact'], ['HS256']); + if ($this->jwsLoader === null) { + $this->jwsLoader = $this->getJWSLoaderFactory() + ->create(['jws_compact'], ['HS256']) + ; } return $this->jwsLoader; diff --git a/tests/Component/Signature/JWSSplitTest.php b/tests/Component/Signature/JWSSplitTest.php index 84e45948..a5be277c 100644 --- a/tests/Component/Signature/JWSSplitTest.php +++ b/tests/Component/Signature/JWSSplitTest.php @@ -2,27 +2,15 @@ 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\Tests\Component\Signature; use function count; -use Jose\Component\Signature\JWS; use Jose\Component\Signature\Serializer\JSONGeneralSerializer; /** - * @group JWS - * * @internal */ -class JWSSplitTest extends SignatureTest +final class JWSSplitTest extends SignatureTest { /** * @test @@ -34,22 +22,22 @@ public function aJwsObjectWithMoreThanOneRecipientCanBeSplittedIntoSeveralJwsObj $jws = $serializer->unserialize($input); $split = $jws->split(); - static::assertEquals(3, $jws->countSignatures()); - static::assertEquals(3, count($jws->split())); + static::assertSame(3, $jws->countSignatures()); + static::assertSame(3, count($jws->split())); for ($i = 0; $i < $jws->countSignatures(); ++$i) { $signature1 = $jws->getSignature($i); $tempJws = $split[$i]; - static::assertEquals(1, $tempJws->countSignatures()); - static::assertEquals($jws->isPayloadDetached(), $tempJws->isPayloadDetached()); - static::assertEquals($jws->getEncodedPayload(), $tempJws->getEncodedPayload()); - static::assertEquals($jws->getPayload(), $tempJws->getPayload()); + static::assertSame(1, $tempJws->countSignatures()); + static::assertSame($jws->isPayloadDetached(), $tempJws->isPayloadDetached()); + static::assertSame($jws->getEncodedPayload(), $tempJws->getEncodedPayload()); + static::assertSame($jws->getPayload(), $tempJws->getPayload()); $signature2 = $tempJws->getSignature(0); - static::assertEquals($signature1->getSignature(), $signature2->getSignature()); - static::assertEquals($signature1->getHeader(), $signature2->getHeader()); - static::assertEquals($signature1->getEncodedProtectedHeader(), $signature2->getEncodedProtectedHeader()); - static::assertEquals($signature1->getProtectedHeader(), $signature2->getProtectedHeader()); + static::assertSame($signature1->getSignature(), $signature2->getSignature()); + static::assertSame($signature1->getHeader(), $signature2->getHeader()); + static::assertSame($signature1->getEncodedProtectedHeader(), $signature2->getEncodedProtectedHeader()); + static::assertSame($signature1->getProtectedHeader(), $signature2->getProtectedHeader()); } } } diff --git a/tests/Component/Signature/JWSTest.php b/tests/Component/Signature/JWSTest.php index a9aea924..7f52a3ea 100644 --- a/tests/Component/Signature/JWSTest.php +++ b/tests/Component/Signature/JWSTest.php @@ -2,29 +2,17 @@ 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\Tests\Component\Signature; -use ParagonIE\ConstantTime\Base64UrlSafe; use InvalidArgumentException; use Jose\Component\Signature\JWS; use LogicException; +use ParagonIE\ConstantTime\Base64UrlSafe; /** - * @group JWS - * @group unit - * * @internal */ -class JWSTest extends SignatureTest +final class JWSTest extends SignatureTest { /** * @test @@ -39,16 +27,18 @@ public function jWS(): void 'aud' => 'You', 'sub' => 'My friend', ]; - $header = ['alg' => 'none']; + $header = [ + 'alg' => 'none', + ]; $jws = new JWS(json_encode($claims), json_encode($claims)); $jws = $jws->addSignature('', $header, Base64UrlSafe::encodeUnpadded(json_encode($header))); - static::assertEquals(json_encode($claims), $jws->getPayload()); - static::assertEquals(1, $jws->countSignatures()); + static::assertSame(json_encode($claims), $jws->getPayload()); + static::assertSame(1, $jws->countSignatures()); static::assertTrue($jws->getSignature(0)->hasProtectedHeaderParameter('alg')); - static::assertEquals($header, $jws->getSignature(0)->getProtectedHeader()); - static::assertEquals('none', $jws->getSignature(0)->getProtectedHeaderParameter('alg')); - static::assertEquals([], $jws->getSignature(0)->getHeader()); + static::assertSame($header, $jws->getSignature(0)->getProtectedHeader()); + static::assertSame('none', $jws->getSignature(0)->getProtectedHeaderParameter('alg')); + static::assertSame([], $jws->getSignature(0)->getHeader()); } /** @@ -68,7 +58,9 @@ public function toCompactJSONFailed(): void 'sub' => 'My friend', ]; $jws = new JWS(json_encode($claims), json_encode($claims)); - $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0); + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ; } /** @@ -88,7 +80,9 @@ public function toFlattenedJSONFailed(): void 'sub' => 'My friend', ]; $jws = new JWS(json_encode($claims), json_encode($claims)); - $this->getJWSSerializerManager()->serialize('jws_json_flattened', $jws, 0); + $this->getJWSSerializerManager() + ->serialize('jws_json_flattened', $jws, 0) + ; } /** @@ -108,7 +102,9 @@ public function toJSONFailed(): void 'sub' => 'My friend', ]; $jws = new JWS(json_encode($claims), json_encode($claims)); - $this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0); + $this->getJWSSerializerManager() + ->serialize('jws_json_general', $jws, 0) + ; } /** @@ -117,7 +113,9 @@ public function toJSONFailed(): void public function signatureContainsUnprotectedHeader(): void { $this->expectException(LogicException::class); - $this->expectExceptionMessage('The signature contains unprotected header parameters and cannot be converted into compact JSON'); + $this->expectExceptionMessage( + 'The signature contains unprotected header parameters and cannot be converted into compact JSON' + ); $claims = [ 'nbf' => time(), @@ -127,11 +125,17 @@ public function signatureContainsUnprotectedHeader(): void 'aud' => 'You', 'sub' => 'My friend', ]; - $header = ['alg' => 'none']; + $header = [ + 'alg' => 'none', + ]; $jws = new JWS(json_encode($claims), json_encode($claims)); - $jws = $jws->addSignature('', $header, Base64UrlSafe::encodeUnpadded(json_encode($header)), ['foo' => 'bar']); + $jws = $jws->addSignature('', $header, Base64UrlSafe::encodeUnpadded(json_encode($header)), [ + 'foo' => 'bar', + ]); - $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0); + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ; } /** @@ -150,10 +154,14 @@ public function signatureDoesNotContainHeader(): void 'aud' => 'You', 'sub' => 'My friend', ]; - $header = ['alg' => 'none']; + $header = [ + 'alg' => 'none', + ]; $jws = new JWS(json_encode($claims), json_encode($claims)); $jws = $jws->addSignature('', $header, Base64UrlSafe::encodeUnpadded(json_encode($header))); - $jws->getSignature(0)->getHeaderParameter('foo'); + $jws->getSignature(0) + ->getHeaderParameter('foo') + ; } /** @@ -172,9 +180,13 @@ public function signatureDoesNotContainProtectedHeader(): void 'aud' => 'You', 'sub' => 'My friend', ]; - $header = ['alg' => 'none']; + $header = [ + 'alg' => 'none', + ]; $jws = new JWS(json_encode($claims), json_encode($claims)); $jws = $jws->addSignature('', $header, Base64UrlSafe::encodeUnpadded(json_encode($header))); - $jws->getSignature(0)->getProtectedHeaderParameter('foo'); + $jws->getSignature(0) + ->getProtectedHeaderParameter('foo') + ; } } diff --git a/tests/Component/Signature/RFC7520/MultipleSignaturesTest.php b/tests/Component/Signature/RFC7520/MultipleSignaturesTest.php index d80733cf..6a49d846 100644 --- a/tests/Component/Signature/RFC7520/MultipleSignaturesTest.php +++ b/tests/Component/Signature/RFC7520/MultipleSignaturesTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Signature\RFC7520; use Jose\Component\Core\JWK; @@ -19,19 +10,18 @@ /** * @see https://tools.ietf.org/html/rfc7520#section-4.8 * - * @group RFC7520 - * * @internal */ -class MultipleSignaturesTest extends SignatureTest +final class MultipleSignaturesTest extends SignatureTest { /** * @test */ public function multipleSignatures(): void { - /* - * Payload, + /** + * Payload,. + * * @see https://tools.ietf.org/html/rfc7520#section-4.8.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."; @@ -68,27 +58,44 @@ public function multipleSignatures(): void 'k' => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg', ]); - $jwsBuilder = $this->getJWSBuilderFactory()->create(['RS256', 'ES512', 'HS256']); - $jwsVerifier = $this->getJWSVerifierFactory()->create(['RS256', 'ES512', 'HS256']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['RS256', 'ES512', 'HS256']) + ; + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['RS256', 'ES512', 'HS256']) + ; $jws = $jwsBuilder - ->create()->withPayload($payload) - ->addSignature($ecdsa_private_key, [], ['alg' => 'ES512', 'kid' => 'bilbo.baggins@hobbiton.example']) //@see https://tools.ietf.org/html/rfc7520#section-4.8.2 - ->addSignature($rsa_private_key, ['alg' => 'RS256'], ['kid' => 'bilbo.baggins@hobbiton.example']) //@see https://tools.ietf.org/html/rfc7520#section-4.8.3 - ->addSignature($symmetric_key, ['alg' => 'HS256', 'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037']) //@see https://tools.ietf.org/html/rfc7520#section-4.8.4 + ->create() + ->withPayload($payload) + ->addSignature($ecdsa_private_key, [], [ + 'alg' => 'ES512', + 'kid' => 'bilbo.baggins@hobbiton.example', + ]) //@see https://tools.ietf.org/html/rfc7520#section-4.8.2 + ->addSignature($rsa_private_key, [ + 'alg' => 'RS256', + ], [ + 'kid' => 'bilbo.baggins@hobbiton.example', + ]) //@see https://tools.ietf.org/html/rfc7520#section-4.8.3 + ->addSignature($symmetric_key, [ + 'alg' => 'HS256', + 'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037', + ]) //@see https://tools.ietf.org/html/rfc7520#section-4.8.4 ->build() ; - static::assertEquals(3, $jws->countSignatures()); + static::assertSame(3, $jws->countSignatures()); static::assertTrue($jwsVerifier->verifyWithKey($jws, $ecdsa_private_key, 0)); static::assertTrue($jwsVerifier->verifyWithKey($jws, $rsa_private_key, 1)); static::assertTrue($jwsVerifier->verifyWithKey($jws, $symmetric_key, 2)); - // @see https://tools.ietf.org/html/rfc7520#section-4.8.5 + /** @see https://tools.ietf.org/html/rfc7520#section-4.8.5 */ $expected_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJSUzI1NiJ9","header":{"kid":"bilbo.baggins@hobbiton.example"},"signature":"MIsjqtVlOpa71KE-Mss8_Nq2YH4FGhiocsqrgi5NvyG53uoimic1tcMdSg-qptrzZc7CG6Svw2Y13TDIqHzTUrL_lR2ZFcryNFiHkSw129EghGpwkpxaTn_THJTCglNbADko1MZBCdwzJxwqZc-1RlpO2HibUYyXSwO97BSe0_evZKdjvvKSgsIqjytKSeAMbhMBdMma622_BG5t4sdbuCHtFjp9iJmkio47AIwqkZV1aIZsv33uPUqBBCXbYoQJwt7mxPftHmNlGoOSMxR_3thmXTCm4US-xiNOyhbm8afKK64jU6_TPtQHiJeQJxz9G3Tx-083B745_AfYOnlC9w"},{"header":{"alg":"ES512","kid":"bilbo.baggins@hobbiton.example"},"signature":"ARcVLnaJJaUWG8fG-8t5BREVAuTY8n8YHjwDO1muhcdCoFZFFjfISu0Cdkn9Ybdlmi54ho0x924DUz8sK7ZXkhc7AFM8ObLfTvNCrqcI3Jkl2U5IX3utNhODH6v7xgy1Qahsn0fyb4zSAkje8bAWz4vIfj5pCMYxxm4fgV3q7ZYhm5eD"},{"protected":"eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9","signature":"s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"}]}'; - $loaded_json = $this->getJWSSerializerManager()->unserialize($expected_json); - static::assertEquals(3, $loaded_json->countSignatures()); + $loaded_json = $this->getJWSSerializerManager() + ->unserialize($expected_json) + ; + static::assertSame(3, $loaded_json->countSignatures()); static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $rsa_private_key, 0)); static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $ecdsa_private_key, 1)); diff --git a/tests/Component/Signature/RFC7520/NestingTest.php b/tests/Component/Signature/RFC7520/NestingTest.php index 9460a46e..cea76f8c 100644 --- a/tests/Component/Signature/RFC7520/NestingTest.php +++ b/tests/Component/Signature/RFC7520/NestingTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Signature\RFC7520; use Jose\Component\Core\JWK; @@ -19,11 +10,9 @@ /** * @see https://tools.ietf.org/html/rfc7520#section-6 * - * @group RFC7520 - * * @internal */ -class NestingTest extends SignatureTest +final class NestingTest extends SignatureTest { /** * @test @@ -57,11 +46,15 @@ public function signatureVerification(): void $json_compact = 'eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJob2JiaXRvbi5leGFtcGxlIiwiZXhwIjoxMzAwODE5MzgwLCJodHRwOi8vZXhhbXBsZS5jb20vaXNfcm9vdCI6dHJ1ZX0.dPpMqwRZxFYi1UfcDAaf8M99o7kwUWtiXZ-ByvVuJih4MhJ_aZqciprz0OWaIAkIvn1qskChirjKvY9ESZNUCP4JjvfyPS-nqjJxYoA5ztWOyFk2cZNIPXjcJXSQwXPO9tEe-v4VSqgD0aKHqPxYog4N6Cz1lKph1U1sYDSI67_bLL7elg_vkjfMp5_W5l5LuUYGMeh6hxQIaIUXf9EwV2JmvTMuZ-vBOWy0Sniy1EFo72CRTvmtrIf5AROo5MNliY3KtUxeP-SOmD-LEYwW9SlkohYzMVAZDDOrVbv7KVRHpeYNaK75KEQqdCEEkS_rskZS-Qtt_nlegTWh1mEYaA'; - $jwsVerifier = $this->getJWSVerifierFactory()->create(['PS256']); - $loaded_compact_json = $this->getJWSSerializerManager()->unserialize($json_compact); + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['PS256']) + ; + $loaded_compact_json = $this->getJWSSerializerManager() + ->unserialize($json_compact) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded_compact_json, $signature_key, 0)); - static::assertEquals($signature_header, $loaded_compact_json->getSignature(0)->getProtectedHeader()); - static::assertEquals($payload, json_decode($loaded_compact_json->getPayload(), true)); + static::assertSame($signature_header, $loaded_compact_json->getSignature(0)->getProtectedHeader()); + static::assertSame($payload, json_decode($loaded_compact_json->getPayload(), true)); } } diff --git a/tests/Component/Signature/SignatureTest.php b/tests/Component/Signature/SignatureTest.php index 268dfd68..c59bff8d 100644 --- a/tests/Component/Signature/SignatureTest.php +++ b/tests/Component/Signature/SignatureTest.php @@ -2,75 +2,65 @@ 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\Tests\Component\Signature; use Jose\Component\Core\AlgorithmManagerFactory; -use Jose\Component\Signature\Algorithm; +use Jose\Component\Signature\Algorithm\EdDSA; +use Jose\Component\Signature\Algorithm\ES256; +use Jose\Component\Signature\Algorithm\ES384; +use Jose\Component\Signature\Algorithm\ES512; +use Jose\Component\Signature\Algorithm\HS256; +use Jose\Component\Signature\Algorithm\HS384; +use Jose\Component\Signature\Algorithm\HS512; +use Jose\Component\Signature\Algorithm\None; +use Jose\Component\Signature\Algorithm\PS256; +use Jose\Component\Signature\Algorithm\PS384; +use Jose\Component\Signature\Algorithm\PS512; +use Jose\Component\Signature\Algorithm\RS256; +use Jose\Component\Signature\Algorithm\RS384; +use Jose\Component\Signature\Algorithm\RS512; use Jose\Component\Signature\JWSBuilderFactory; use Jose\Component\Signature\JWSLoaderFactory; use Jose\Component\Signature\JWSVerifierFactory; -use Jose\Component\Signature\Serializer; +use Jose\Component\Signature\Serializer\CompactSerializer; +use Jose\Component\Signature\Serializer\JSONFlattenedSerializer; +use Jose\Component\Signature\Serializer\JSONGeneralSerializer; +use Jose\Component\Signature\Serializer\JWSSerializerManager; +use Jose\Component\Signature\Serializer\JWSSerializerManagerFactory; use PHPUnit\Framework\TestCase; abstract class SignatureTest extends TestCase { - /** - * @var AlgorithmManagerFactory - */ - private $algorithmManagerFactory; - - /** - * @var JWSBuilderFactory - */ - private $jwsBuilderFactory; - - /** - * @var JWSVerifierFactory - */ - private $jwsVerifierFactory; - - /** - * @var null|Serializer\JWSSerializerManagerFactory - */ - private $jwsSerializerManagerFactory; - - /** - * @var null|Serializer\JWSSerializerManager - */ - private $jwsSerializerManager; - - /** - * @var JWSLoaderFactory - */ - private $jwsLoaderFactory; + private ?AlgorithmManagerFactory $algorithmManagerFactory = null; + + private ?JWSBuilderFactory $jwsBuilderFactory = null; + + private ?JWSVerifierFactory $jwsVerifierFactory = null; + + private ?JWSSerializerManagerFactory $jwsSerializerManagerFactory = null; + + private ?JWSSerializerManager $jwsSerializerManager = null; + + private ?JWSLoaderFactory $jwsLoaderFactory = null; protected function getAlgorithmManagerFactory(): AlgorithmManagerFactory { - if (null === $this->algorithmManagerFactory) { + if ($this->algorithmManagerFactory === null) { $this->algorithmManagerFactory = new AlgorithmManagerFactory(); - $this->algorithmManagerFactory->add('HS256', new Algorithm\HS256()); - $this->algorithmManagerFactory->add('HS384', new Algorithm\HS384()); - $this->algorithmManagerFactory->add('HS512', new Algorithm\HS512()); - $this->algorithmManagerFactory->add('ES256', new Algorithm\ES256()); - $this->algorithmManagerFactory->add('ES384', new Algorithm\ES384()); - $this->algorithmManagerFactory->add('ES512', new Algorithm\ES512()); - $this->algorithmManagerFactory->add('RS256', new Algorithm\RS256()); - $this->algorithmManagerFactory->add('RS384', new Algorithm\RS384()); - $this->algorithmManagerFactory->add('RS512', new Algorithm\RS512()); - $this->algorithmManagerFactory->add('PS256', new Algorithm\PS256()); - $this->algorithmManagerFactory->add('PS384', new Algorithm\PS384()); - $this->algorithmManagerFactory->add('PS512', new Algorithm\PS512()); - $this->algorithmManagerFactory->add('none', new Algorithm\None()); - $this->algorithmManagerFactory->add('EdDSA', new Algorithm\EdDSA()); + $this->algorithmManagerFactory->add('HS256', new HS256()); + $this->algorithmManagerFactory->add('HS384', new HS384()); + $this->algorithmManagerFactory->add('HS512', new HS512()); + $this->algorithmManagerFactory->add('ES256', new ES256()); + $this->algorithmManagerFactory->add('ES384', new ES384()); + $this->algorithmManagerFactory->add('ES512', new ES512()); + $this->algorithmManagerFactory->add('RS256', new RS256()); + $this->algorithmManagerFactory->add('RS384', new RS384()); + $this->algorithmManagerFactory->add('RS512', new RS512()); + $this->algorithmManagerFactory->add('PS256', new PS256()); + $this->algorithmManagerFactory->add('PS384', new PS384()); + $this->algorithmManagerFactory->add('PS512', new PS512()); + $this->algorithmManagerFactory->add('none', new None()); + $this->algorithmManagerFactory->add('EdDSA', new EdDSA()); } return $this->algorithmManagerFactory; @@ -78,10 +68,8 @@ protected function getAlgorithmManagerFactory(): AlgorithmManagerFactory protected function getJWSBuilderFactory(): JWSBuilderFactory { - if (null === $this->jwsBuilderFactory) { - $this->jwsBuilderFactory = new JWSBuilderFactory( - $this->getAlgorithmManagerFactory() - ); + if ($this->jwsBuilderFactory === null) { + $this->jwsBuilderFactory = new JWSBuilderFactory($this->getAlgorithmManagerFactory()); } return $this->jwsBuilderFactory; @@ -89,34 +77,32 @@ protected function getJWSBuilderFactory(): JWSBuilderFactory protected function getJWSVerifierFactory(): JWSVerifierFactory { - if (null === $this->jwsVerifierFactory) { - $this->jwsVerifierFactory = new JWSVerifierFactory( - $this->getAlgorithmManagerFactory() - ); + if ($this->jwsVerifierFactory === null) { + $this->jwsVerifierFactory = new JWSVerifierFactory($this->getAlgorithmManagerFactory()); } return $this->jwsVerifierFactory; } - protected function getJWSSerializerManagerFactory(): Serializer\JWSSerializerManagerFactory + protected function getJWSSerializerManagerFactory(): JWSSerializerManagerFactory { - if (null === $this->jwsSerializerManagerFactory) { - $this->jwsSerializerManagerFactory = new Serializer\JWSSerializerManagerFactory(); - $this->jwsSerializerManagerFactory->add(new Serializer\CompactSerializer()); - $this->jwsSerializerManagerFactory->add(new Serializer\JSONFlattenedSerializer()); - $this->jwsSerializerManagerFactory->add(new Serializer\JSONGeneralSerializer()); + if ($this->jwsSerializerManagerFactory === null) { + $this->jwsSerializerManagerFactory = new JWSSerializerManagerFactory(); + $this->jwsSerializerManagerFactory->add(new CompactSerializer()); + $this->jwsSerializerManagerFactory->add(new JSONFlattenedSerializer()); + $this->jwsSerializerManagerFactory->add(new JSONGeneralSerializer()); } return $this->jwsSerializerManagerFactory; } - protected function getJWSSerializerManager(): Serializer\JWSSerializerManager + protected function getJWSSerializerManager(): JWSSerializerManager { - if (null === $this->jwsSerializerManager) { - $this->jwsSerializerManager = new Serializer\JWSSerializerManager([ - new Serializer\CompactSerializer(), - new Serializer\JSONFlattenedSerializer(), - new Serializer\JSONGeneralSerializer(), + if ($this->jwsSerializerManager === null) { + $this->jwsSerializerManager = new JWSSerializerManager([ + new CompactSerializer(), + new JSONFlattenedSerializer(), + new JSONGeneralSerializer(), ]); } @@ -125,7 +111,7 @@ protected function getJWSSerializerManager(): Serializer\JWSSerializerManager protected function getJWSLoaderFactory(): JWSLoaderFactory { - if (null === $this->jwsLoaderFactory) { + if ($this->jwsLoaderFactory === null) { $this->jwsLoaderFactory = new JWSLoaderFactory( $this->getJWSSerializerManagerFactory(), $this->getJWSVerifierFactory(), diff --git a/tests/Component/Signature/SignerTest.php b/tests/Component/Signature/SignerTest.php index 62de2767..6a3fdccb 100644 --- a/tests/Component/Signature/SignerTest.php +++ b/tests/Component/Signature/SignerTest.php @@ -2,31 +2,20 @@ 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\Tests\Component\Signature; -use ParagonIE\ConstantTime\Base64UrlSafe; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\Core\JWKSet; use Jose\Component\Signature\Serializer\CompactSerializer; +use const JSON_THROW_ON_ERROR; use LogicException; +use ParagonIE\ConstantTime\Base64UrlSafe; /** - * @group Signer - * @group functional - * * @internal */ -class SignerTest extends SignatureTest +final class SignerTest extends SignatureTest { /** * @test @@ -36,9 +25,12 @@ public function algParameterIsMissing(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('No "alg" parameter set in the header.'); - $jwsBuilder = $this->getJWSBuilderFactory()->create([]); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create([]) + ; $jwsBuilder - ->create()->withPayload(json_encode($this->getKey3())) + ->create() + ->withPayload(json_encode($this->getKey3())) ->addSignature($this->getKey1(), []) ->build() ; @@ -52,10 +44,15 @@ public function algParameterIsNotSupported(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('The algorithm "foo" is not supported.'); - $jwsBuilder = $this->getJWSBuilderFactory()->create([]); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create([]) + ; $jwsBuilder - ->create()->withPayload(json_encode($this->getKey3())) - ->addSignature($this->getKey1(), ['alg' => 'foo']) + ->create() + ->withPayload(json_encode($this->getKey3())) + ->addSignature($this->getKey1(), [ + 'alg' => 'foo', + ]) ->build() ; } @@ -68,10 +65,18 @@ public function duplicatedHeader(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('The header contains duplicated entries: foo.'); - $jwsBuilder = $this->getJWSBuilderFactory()->create([]); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create([]) + ; $jwsBuilder - ->create()->withPayload(json_encode($this->getKey3())) - ->addSignature($this->getKey1(), ['alg' => 'ES256', 'foo' => 'bar'], ['foo' => 'bar']) + ->create() + ->withPayload(json_encode($this->getKey3())) + ->addSignature($this->getKey1(), [ + 'alg' => 'ES256', + 'foo' => 'bar', + ], [ + 'foo' => 'bar', + ]) ; } @@ -80,20 +85,29 @@ public function duplicatedHeader(): void */ public function signAndLoadCompact(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS512', 'RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload(json_encode($this->getKey3())) - ->addSignature($this->getKey1(), ['alg' => 'HS512']) - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload(json_encode($this->getKey3())) + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - static::assertEquals(2, $jws->countSignatures()); + static::assertSame(2, $jws->countSignatures()); - $loaded = $this->getJWSSerializerManager()->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)); + $loaded = $this->getJWSSerializerManager() + ->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)) + ; - static::assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeaderParameter('alg')); - static::assertEquals('RS512', $loaded->getSignature(1)->getProtectedHeaderParameter('alg')); + static::assertSame('HS512', $loaded->getSignature(0)->getProtectedHeaderParameter('alg')); + static::assertSame('RS512', $loaded->getSignature(1)->getProtectedHeaderParameter('alg')); } /** @@ -101,57 +115,98 @@ public function signAndLoadCompact(): void */ public function signMultipleInstructionWithCompactRepresentation(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS512', 'RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') - ->addSignature($this->getKey1(), ['alg' => 'HS512']) - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload('Live long and Prosper.') + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - static::assertEquals(2, $jws->countSignatures()); - static::assertEquals('eyJhbGciOiJIUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0)); - static::assertEquals('eyJhbGciOiJSUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 1)); + static::assertSame(2, $jws->countSignatures()); + static::assertSame( + 'eyJhbGciOiJIUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ); + static::assertSame( + 'eyJhbGciOiJSUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 1) + ); } /** - * @group JWSBuilder - * * @test */ public function signMultipleInstructionWithCompactRepresentationUsingBuilder(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS512', 'RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') - ->addSignature($this->getKey1(), ['alg' => 'HS512']) - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload('Live long and Prosper.') + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - static::assertEquals(2, $jws->countSignatures()); - static::assertEquals('eyJhbGciOiJIUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0)); - static::assertEquals('eyJhbGciOiJSUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 1)); + static::assertSame(2, $jws->countSignatures()); + static::assertSame( + 'eyJhbGciOiJIUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ); + static::assertSame( + 'eyJhbGciOiJSUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 1) + ); } /** - * @group JWSBuilder - * * @test */ public function signMultipleInstructionWithCompactRepresentationUsingBuilderAndDetachedPayload(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS512', 'RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.', true) - ->addSignature($this->getKey1(), ['alg' => 'HS512']) - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload('Live long and Prosper.', true) + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - static::assertEquals(2, $jws->countSignatures()); - static::assertEquals('eyJhbGciOiJIUzUxMiJ9..TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0)); - static::assertEquals('eyJhbGciOiJSUzUxMiJ9..cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 1)); + static::assertSame(2, $jws->countSignatures()); + static::assertSame( + 'eyJhbGciOiJIUzUxMiJ9..TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ); + static::assertSame( + 'eyJhbGciOiJSUzUxMiJ9..cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 1) + ); } /** @@ -159,42 +214,84 @@ public function signMultipleInstructionWithCompactRepresentationUsingBuilderAndD */ public function createCompactJWSUsingFactory(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']); - $jwsVerifier = $this->getJWSVerifierFactory()->create(['HS512', 'RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS512', 'RS512']) + ; + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['HS512', 'RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') - ->addSignature($this->getKey1(), ['alg' => 'HS512']) - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload('Live long and Prosper.') + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - $jws0 = $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0); - $jws1 = $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 1); + $jws0 = $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ; + $jws1 = $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 1) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.', true) - ->addSignature($this->getKey1(), ['alg' => 'HS512']) - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload('Live long and Prosper.', true) + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - $jws2 = $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0); - $jws3 = $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 1); - - static::assertEquals('eyJhbGciOiJIUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $jws0); - static::assertEquals('eyJhbGciOiJSUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $jws1); - static::assertEquals('eyJhbGciOiJIUzUxMiJ9..TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $jws2); - static::assertEquals('eyJhbGciOiJSUzUxMiJ9..cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $jws3); + $jws2 = $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ; + $jws3 = $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 1) + ; - $loaded_0 = $this->getJWSSerializerManager()->unserialize($jws0); + static::assertSame( + 'eyJhbGciOiJIUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', + $jws0 + ); + static::assertSame( + 'eyJhbGciOiJSUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', + $jws1 + ); + static::assertSame( + 'eyJhbGciOiJIUzUxMiJ9..TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', + $jws2 + ); + static::assertSame( + 'eyJhbGciOiJSUzUxMiJ9..cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', + $jws3 + ); + + $loaded_0 = $this->getJWSSerializerManager() + ->unserialize($jws0) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded_0, $this->getKey1(), 0)); - $loaded_1 = $this->getJWSSerializerManager()->unserialize($jws1); + $loaded_1 = $this->getJWSSerializerManager() + ->unserialize($jws1) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded_1, $this->getKey2(), 0)); - $loaded_2 = $this->getJWSSerializerManager()->unserialize($jws2); + $loaded_2 = $this->getJWSSerializerManager() + ->unserialize($jws2) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded_2, $this->getKey1(), 0, 'Live long and Prosper.')); - $loaded_3 = $this->getJWSSerializerManager()->unserialize($jws3); + $loaded_3 = $this->getJWSSerializerManager() + ->unserialize($jws3) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded_3, $this->getKey2(), 0, 'Live long and Prosper.')); } @@ -203,17 +300,32 @@ public function createCompactJWSUsingFactory(): void */ public function signMultipleInstructionWithFlattenedRepresentation(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS512', 'RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') - ->addSignature($this->getKey1(), ['alg' => 'HS512']) - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload('Live long and Prosper.') + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - static::assertEquals(2, $jws->countSignatures()); - static::assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJIUzUxMiJ9","signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', $this->getJWSSerializerManager()->serialize('jws_json_flattened', $jws, 0)); - static::assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJSUzUxMiJ9","signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', $this->getJWSSerializerManager()->serialize('jws_json_flattened', $jws, 1)); + static::assertSame(2, $jws->countSignatures()); + static::assertSame( + '{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJIUzUxMiJ9","signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', + $this->getJWSSerializerManager() + ->serialize('jws_json_flattened', $jws, 0) + ); + static::assertSame( + '{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJSUzUxMiJ9","signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', + $this->getJWSSerializerManager() + ->serialize('jws_json_flattened', $jws, 1) + ); } /** @@ -221,41 +333,91 @@ public function signMultipleInstructionWithFlattenedRepresentation(): void */ public function createFlattenedJWSUsingFactory(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']); - $jwsVerifier = $this->getJWSVerifierFactory()->create(['HS512', 'RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS512', 'RS512']) + ; + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['HS512', 'RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') - ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar']) - ->addSignature($this->getKey2(), ['alg' => 'RS512'], ['plic' => 'ploc']) + ->create() + ->withPayload('Live long and Prosper.') + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ], [ + 'foo' => 'bar', + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ], [ + 'plic' => 'ploc', + ]) ->build() ; - $jws0 = $this->getJWSSerializerManager()->serialize('jws_json_flattened', $jws, 0); - $jws1 = $this->getJWSSerializerManager()->serialize('jws_json_flattened', $jws, 1); + $jws0 = $this->getJWSSerializerManager() + ->serialize('jws_json_flattened', $jws, 0) + ; + $jws1 = $this->getJWSSerializerManager() + ->serialize('jws_json_flattened', $jws, 1) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.', true) - ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar']) - ->addSignature($this->getKey2(), ['alg' => 'RS512'], ['plic' => 'ploc']) + ->create() + ->withPayload('Live long and Prosper.', true) + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ], [ + 'foo' => 'bar', + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ], [ + 'plic' => 'ploc', + ]) ->build() ; - $jws2 = $this->getJWSSerializerManager()->serialize('jws_json_flattened', $jws, 0); - $jws3 = $this->getJWSSerializerManager()->serialize('jws_json_flattened', $jws, 1); - - static::assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJIUzUxMiJ9","header":{"foo":"bar"},"signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', $jws0); - static::assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJSUzUxMiJ9","header":{"plic":"ploc"},"signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', $jws1); - static::assertEquals('{"protected":"eyJhbGciOiJIUzUxMiJ9","header":{"foo":"bar"},"signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', $jws2); - static::assertEquals('{"protected":"eyJhbGciOiJSUzUxMiJ9","header":{"plic":"ploc"},"signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', $jws3); + $jws2 = $this->getJWSSerializerManager() + ->serialize('jws_json_flattened', $jws, 0) + ; + $jws3 = $this->getJWSSerializerManager() + ->serialize('jws_json_flattened', $jws, 1) + ; - $loaded_0 = $this->getJWSSerializerManager()->unserialize($jws0); + static::assertSame( + '{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJIUzUxMiJ9","header":{"foo":"bar"},"signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', + $jws0 + ); + static::assertSame( + '{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJSUzUxMiJ9","header":{"plic":"ploc"},"signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', + $jws1 + ); + static::assertSame( + '{"protected":"eyJhbGciOiJIUzUxMiJ9","header":{"foo":"bar"},"signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', + $jws2 + ); + static::assertSame( + '{"protected":"eyJhbGciOiJSUzUxMiJ9","header":{"plic":"ploc"},"signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', + $jws3 + ); + + $loaded_0 = $this->getJWSSerializerManager() + ->unserialize($jws0) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded_0, $this->getKey1(), 0)); - $loaded_1 = $this->getJWSSerializerManager()->unserialize($jws1); + $loaded_1 = $this->getJWSSerializerManager() + ->unserialize($jws1) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded_1, $this->getKey2(), 0)); - $loaded_2 = $this->getJWSSerializerManager()->unserialize($jws2); + $loaded_2 = $this->getJWSSerializerManager() + ->unserialize($jws2) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded_2, $this->getKey1(), 0, 'Live long and Prosper.')); - $loaded_3 = $this->getJWSSerializerManager()->unserialize($jws3); + $loaded_3 = $this->getJWSSerializerManager() + ->unserialize($jws3) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded_3, $this->getKey2(), 0, 'Live long and Prosper.')); } @@ -267,10 +429,15 @@ public function algorithmNotAllowedForTheKey(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('The algorithm "RS512" is not allowed with this key.'); - $jwsBuilder = $this->getJWSBuilderFactory()->create([]); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create([]) + ; $jwsBuilder - ->create()->withPayload('Live long and Prosper.') - ->addSignature($this->getKey5(), ['alg' => 'RS512']) + ->create() + ->withPayload('Live long and Prosper.') + ->addSignature($this->getKey5(), [ + 'alg' => 'RS512', + ]) ->build() ; } @@ -283,10 +450,15 @@ public function operationNotAllowedForTheKey(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Key cannot be used to sign'); - $jwsBuilder = $this->getJWSBuilderFactory()->create(['PS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['PS512']) + ; $jwsBuilder - ->create()->withPayload('Live long and Prosper.') - ->addSignature($this->getKey4(), ['alg' => 'PS512']) + ->create() + ->withPayload('Live long and Prosper.') + ->addSignature($this->getKey4(), [ + 'alg' => 'PS512', + ]) ->build() ; } @@ -296,17 +468,26 @@ public function operationNotAllowedForTheKey(): void */ public function signAndLoadFlattened(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS512']) + ; $jws = $jwsBuilder - ->create()->withPayload(json_encode(['baz', 'ban'])) - ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar']) + ->create() + ->withPayload(json_encode(['baz', 'ban'])) + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ], [ + 'foo' => 'bar', + ]) ->build() ; - $loaded = $this->getJWSSerializerManager()->unserialize($this->getJWSSerializerManager()->serialize('jws_json_flattened', $jws, 0)); + $loaded = $this->getJWSSerializerManager() + ->unserialize($this->getJWSSerializerManager()->serialize('jws_json_flattened', $jws, 0)) + ; - static::assertEquals(1, $loaded->countSignatures()); - static::assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeaderParameter('alg')); + static::assertSame(1, $loaded->countSignatures()); + static::assertSame('HS512', $loaded->getSignature(0)->getProtectedHeaderParameter('alg')); } /** @@ -314,24 +495,37 @@ public function signAndLoadFlattened(): void */ public function signAndLoad(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']); - $jwsVerifier = $this->getJWSVerifierFactory()->create(['HS512', 'RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS512', 'RS512']) + ; + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['HS512', 'RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') - ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar']) - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload('Live long and Prosper.') + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ], [ + 'foo' => 'bar', + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - $loaded = $this->getJWSSerializerManager()->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)); + $loaded = $this->getJWSSerializerManager() + ->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)) + ; - static::assertEquals(2, $loaded->countSignatures()); - static::assertEquals('Live long and Prosper.', $loaded->getPayload()); + static::assertSame(2, $loaded->countSignatures()); + static::assertSame('Live long and Prosper.', $loaded->getPayload()); static::assertTrue($jwsVerifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet(), 0)); static::assertTrue($jwsVerifier->verifyWithKeySet($loaded, $this->getPublicKeySet(), 1)); - static::assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeaderParameter('alg')); - static::assertEquals('RS512', $loaded->getSignature(1)->getProtectedHeaderParameter('alg')); + static::assertSame('HS512', $loaded->getSignature(0)->getProtectedHeaderParameter('alg')); + static::assertSame('RS512', $loaded->getSignature(1)->getProtectedHeaderParameter('alg')); } /** @@ -339,18 +533,27 @@ public function signAndLoad(): void */ public function signAndLoadWithWrongKeys(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['RS512']); - $jwsVerifier = $this->getJWSVerifierFactory()->create(['RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['RS512']) + ; + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload('Live long and Prosper.') + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - $loaded = $this->getJWSSerializerManager()->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)); + $loaded = $this->getJWSSerializerManager() + ->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)) + ; - static::assertEquals(1, $loaded->countSignatures()); - static::assertEquals('Live long and Prosper.', $loaded->getPayload()); + static::assertSame(1, $loaded->countSignatures()); + static::assertSame('Live long and Prosper.', $loaded->getPayload()); static::assertFalse($jwsVerifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet(), 0)); } @@ -360,18 +563,27 @@ public function signAndLoadWithWrongKeys(): void */ public function signAndLoadWithUnsupportedAlgorithm(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['RS512']); - $jwsVerifier = $this->getJWSVerifierFactory()->create(['RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['RS512']) + ; + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload('Live long and Prosper.') + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - $loaded = $this->getJWSSerializerManager()->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)); + $loaded = $this->getJWSSerializerManager() + ->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)) + ; - static::assertEquals(1, $loaded->countSignatures()); - static::assertEquals('Live long and Prosper.', $loaded->getPayload()); + static::assertSame(1, $loaded->countSignatures()); + static::assertSame('Live long and Prosper.', $loaded->getPayload()); static::assertFalse($jwsVerifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet(), 0)); } @@ -387,11 +599,15 @@ public function signAndLoadWithJWSWithoutSignatures(): void $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."; $jws = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[]}'; - $jwsVerifier = $this->getJWSVerifierFactory()->create([]); - $loaded = $this->getJWSSerializerManager()->unserialize($jws); + $jwsVerifier = $this->getJWSVerifierFactory() + ->create([]) + ; + $loaded = $this->getJWSSerializerManager() + ->unserialize($jws) + ; - static::assertEquals(0, $loaded->countSignatures()); - static::assertEquals($payload, $loaded->getPayload()); + static::assertSame(0, $loaded->countSignatures()); + static::assertSame($payload, $loaded->getPayload()); static::assertTrue($jwsVerifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet(), 0)); } @@ -418,14 +634,19 @@ public function compactJSONWithUnencodedPayloadFailsBecauseOfForbiddenCharacters 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', ]); - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS256']) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->addSignature($key, $protectedHeader) ->build() ; - $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0); + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ; } /** @@ -447,21 +668,31 @@ public function compactJSONWithUnencodedPayloadSucceeded(): void 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', ]); - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS256']) + ; $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper~') + ->create() + ->withPayload('Live long and Prosper~') ->addSignature($key, $protectedHeader) ->build() ; - $compact = $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0); - static::assertEquals('eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19.Live long and Prosper~.nUNenbjNAEH2nNIXyQYmutiHRPnT17HcaMr5Lsho4BE', $compact); + $compact = $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ; + static::assertSame( + 'eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19.Live long and Prosper~.nUNenbjNAEH2nNIXyQYmutiHRPnT17HcaMr5Lsho4BE', + $compact + ); - $loaded = $this->getJWSSerializerManager()->unserialize($compact, $serializer); - static::assertEquals(CompactSerializer::NAME, $serializer); - static::assertEquals('Live long and Prosper~', $loaded->getPayload()); - static::assertEquals('Live long and Prosper~', $loaded->getEncodedPayload()); - static::assertEquals($protectedHeader, $loaded->getSignature(0)->getProtectedHeader()); + $loaded = $this->getJWSSerializerManager() + ->unserialize($compact, $serializer) + ; + static::assertSame(CompactSerializer::NAME, $serializer); + static::assertSame('Live long and Prosper~', $loaded->getPayload()); + static::assertSame('Live long and Prosper~', $loaded->getEncodedPayload()); + static::assertSame($protectedHeader, $loaded->getSignature(0)->getProtectedHeader()); } /** @@ -484,20 +715,32 @@ public function compactJSONWithUnencodedDetachedPayload(): void 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', ]); - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']); - $jwsVerifier = $this->getJWSVerifierFactory()->create(['HS256']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS256']) + ; + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['HS256']) + ; $jws = $jwsBuilder - ->create()->withPayload($payload, true) + ->create() + ->withPayload($payload, true) ->addSignature($key, $protectedHeader) ->build() ; - $jws = $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0); - static::assertEquals('eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY', $jws); + $jws = $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ; + static::assertSame( + 'eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY', + $jws + ); - $loaded = $this->getJWSSerializerManager()->unserialize($jws); + $loaded = $this->getJWSSerializerManager() + ->unserialize($jws) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded, $key, 0, $payload)); - static::assertEquals($protectedHeader, $loaded->getSignature(0)->getProtectedHeader()); + static::assertSame($protectedHeader, $loaded->getSignature(0)->getProtectedHeader()); } /** @@ -524,10 +767,15 @@ public function compactJSONWithUnencodedDetachedPayloadAndMultipleSignatures(): 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', ]); - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256', 'HS512']); - $jwsVerifier = $this->getJWSVerifierFactory()->create(['HS256', 'HS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS256', 'HS512']) + ; + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['HS256', 'HS512']) + ; $jws = $jwsBuilder - ->create()->withPayload($payload, true) + ->create() + ->withPayload($payload, true) ->addSignature($key, $protectedHeader1) ->addSignature($key, $protectedHeader2) ->build() @@ -535,15 +783,22 @@ public function compactJSONWithUnencodedDetachedPayloadAndMultipleSignatures(): $expected_result = '{"signatures":[{"signature":"A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY","protected":"eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19"},{"signature":"Mp-m-Vyst0zYCNkpg2RiIN8W9GO4nLU3FKsFtHzEcP4tgR4QcMys1_2m9HrDwszi0Cp2gv_Lioe6UPCcTNn6tQ","protected":"eyJhbGciOiJIUzUxMiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19"}]}'; - static::assertEquals($expected_result, $this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)); + static::assertSame( + $expected_result, + $this->getJWSSerializerManager() + ->serialize('jws_json_general', $jws, 0) + ); - $loaded = $this->getJWSSerializerManager()->unserialize($expected_result); + $loaded = $this->getJWSSerializerManager() + ->unserialize($expected_result) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded, $key, 0, $payload)); - static::assertEquals($protectedHeader1, $loaded->getSignature(0)->getProtectedHeader()); + static::assertSame($protectedHeader1, $loaded->getSignature(0)->getProtectedHeader()); } /** - * The library is able to support multiple payload encoding and conversion in JSON is not available if payload is not detached. + * The library is able to support multiple payload encoding and conversion in JSON is not available if payload is + * not detached. * * @test */ @@ -567,15 +822,20 @@ public function compactJSONWithUnencodedPayloadAndMultipleSignatures(): void 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', ]); - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS256']) + ; $jws = $jwsBuilder - ->create()->withPayload($payload) + ->create() + ->withPayload($payload) ->addSignature($key, $protectedHeader1) ->addSignature($key, $protectedHeader2) ->build() ; - $this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0); + $this->getJWSSerializerManager() + ->serialize('jws_json_general', $jws, 0) + ; } /** @@ -584,7 +844,9 @@ public function compactJSONWithUnencodedPayloadAndMultipleSignatures(): void public function jWSWithUnencodedPayloadButNoCritHeader(): void { $this->expectException(LogicException::class); - $this->expectExceptionMessage('The protected header parameter "crit" is mandatory when protected header parameter "b64" is set.'); + $this->expectExceptionMessage( + 'The protected header parameter "crit" is mandatory when protected header parameter "b64" is set.' + ); $payload = '$.02'; $protectedHeader = [ @@ -597,13 +859,18 @@ public function jWSWithUnencodedPayloadButNoCritHeader(): void 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', ]); - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS256']) + ; $jws = $jwsBuilder - ->create()->withPayload($payload, true) + ->create() + ->withPayload($payload, true) ->addSignature($key, $protectedHeader) ->build() ; - $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0); + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ; } /** @@ -626,13 +893,18 @@ public function jWSWithUnencodedPayloadButCritHeaderIsNotAnArray(): void 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', ]); - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS256']) + ; $jws = $jwsBuilder - ->create()->withPayload($payload, true) + ->create() + ->withPayload($payload, true) ->addSignature($key, $protectedHeader) ->build() ; - $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0); + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ; } /** @@ -641,7 +913,9 @@ public function jWSWithUnencodedPayloadButCritHeaderIsNotAnArray(): void public function jWSWithUnencodedPayloadButCritHeaderDoesNotContainB64(): void { $this->expectException(LogicException::class); - $this->expectExceptionMessage('The protected header parameter "crit" must contain "b64" when protected header parameter "b64" is set.'); + $this->expectExceptionMessage( + 'The protected header parameter "crit" must contain "b64" when protected header parameter "b64" is set.' + ); $payload = '$.02'; $protectedHeader = [ @@ -655,13 +929,18 @@ public function jWSWithUnencodedPayloadButCritHeaderDoesNotContainB64(): void 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', ]); - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS256']) + ; $jws = $jwsBuilder - ->create()->withPayload($payload, true) + ->create() + ->withPayload($payload, true) ->addSignature($key, $protectedHeader) ->build() ; - $this->getJWSSerializerManager()->serialize('jws_compact', $jws, 0); + $this->getJWSSerializerManager() + ->serialize('jws_compact', $jws, 0) + ; } /** @@ -690,22 +969,31 @@ public function flattenedJSONWithUnencodedPayload(): void 'signature' => 'A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY', ]; - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']); - $jwsVerifier = $this->getJWSVerifierFactory()->create(['HS256']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS256']) + ; + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['HS256']) + ; $jws = $jwsBuilder - ->create()->withPayload($payload) + ->create() + ->withPayload($payload) ->addSignature($key, $protectedHeader) ->build() ; - $jws = $this->getJWSSerializerManager()->serialize('jws_json_flattened', $jws, 0); + $jws = $this->getJWSSerializerManager() + ->serialize('jws_json_flattened', $jws, 0) + ; - static::assertEquals($expected_result, json_decode($jws, true)); + static::assertEqualsCanonicalizing($expected_result, json_decode($jws, true, 512, JSON_THROW_ON_ERROR)); - $loaded = $this->getJWSSerializerManager()->unserialize($jws); + $loaded = $this->getJWSSerializerManager() + ->unserialize($jws) + ; static::assertTrue($jwsVerifier->verifyWithKey($loaded, $key, 0)); - static::assertEquals($payload, $loaded->getPayload()); - static::assertEquals($protectedHeader, $loaded->getSignature(0)->getProtectedHeader()); + static::assertSame($payload, $loaded->getPayload()); + static::assertSame($protectedHeader, $loaded->getSignature(0)->getProtectedHeader()); } /** @@ -733,15 +1021,20 @@ public function flattenedJSONWithUnencodedDetachedPayload(): void 'signature' => 'A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY', ]; - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS256']) + ; $jws = $jwsBuilder - ->create()->withPayload($payload, true) + ->create() + ->withPayload($payload, true) ->addSignature($key, $protectedHeader) ->build() ; - $jws = $this->getJWSSerializerManager()->serialize('jws_json_flattened', $jws, 0); + $jws = $this->getJWSSerializerManager() + ->serialize('jws_json_flattened', $jws, 0) + ; - static::assertEquals($expected_result, json_decode($jws, true)); + static::assertSame($expected_result, json_decode($jws, true)); } /** @@ -755,11 +1048,15 @@ public function signAndLoadWithoutAlgParameterInTheHeader(): void $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."; $jws = 'eyJraWQiOiJiaWxiby5iYWdnaW5zQGhvYmJpdG9uLmV4YW1wbGUifQ.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.MRjdkly7_-oTPTS3AXP41iQIGKa80A0ZmTuV5MEaHoxnW2e5CZ5NlKtainoFmKZopdHM1O2U4mwzJdQx996ivp83xuglII7PNDi84wnB-BDkoBwA78185hX-Es4JIwmDLJK3lfWRa-XtL0RnltuYv746iYTh_qHRD68BNt1uSNCrUCTJDt5aAE6x8wW1Kt9eRo4QPocSadnHXFxnt8Is9UzpERV0ePPQdLuW3IS_de3xyIrDaLGdjluPxUAhb6L2aXic1U12podGU0KLUQSE_oI-ZnmKJ3F4uOZDnd6QZWJushZ41Axf_fcIe8u9ipH84ogoree7vjbU5y18kDquDg'; - $jwsVerifier = $this->getJWSVerifierFactory()->create([]); - $loaded = $this->getJWSSerializerManager()->unserialize($jws); + $jwsVerifier = $this->getJWSVerifierFactory() + ->create([]) + ; + $loaded = $this->getJWSSerializerManager() + ->unserialize($jws) + ; - static::assertEquals(1, $loaded->countSignatures()); - static::assertEquals($payload, $loaded->getPayload()); + static::assertSame(1, $loaded->countSignatures()); + static::assertSame($payload, $loaded->getPayload()); static::assertTrue($jwsVerifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet(), 0)); } @@ -769,23 +1066,39 @@ public function signAndLoadWithoutAlgParameterInTheHeader(): void */ public function signAndLoadJWKSet(): void { - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']); - $jwsVerifier = $this->getJWSVerifierFactory()->create(['HS512', 'RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS512', 'RS512']) + ; + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['HS512', 'RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload(json_encode($this->getKeyset())) - ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar']) - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload(json_encode($this->getKeyset())) + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + ], [ + 'foo' => 'bar', + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - $loaded = $this->getJWSSerializerManager()->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)); - static::assertEquals(2, $loaded->countSignatures()); - static::assertEquals($this->getKeyset(), JWKSet::createFromKeyData(json_decode($loaded->getPayload(), true))); + $loaded = $this->getJWSSerializerManager() + ->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)) + ; + static::assertSame(2, $loaded->countSignatures()); + static::assertEqualsCanonicalizing( + $this->getKeyset(), + JWKSet::createFromKeyData(json_decode($loaded->getPayload(), true, 512, JSON_THROW_ON_ERROR)) + ); static::assertTrue($jwsVerifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet(), 0)); static::assertTrue($jwsVerifier->verifyWithKeySet($loaded, $this->getPublicKeySet(), 1)); - static::assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeaderParameter('alg')); - static::assertEquals('RS512', $loaded->getSignature(1)->getProtectedHeaderParameter('alg')); + static::assertSame('HS512', $loaded->getSignature(0)->getProtectedHeaderParameter('alg')); + static::assertSame('RS512', $loaded->getSignature(1)->getProtectedHeaderParameter('alg')); } /** @@ -796,20 +1109,39 @@ public function keySetIsEmpty(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('There is no key in the key set.'); - $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']); - $jwsVerifier = $this->getJWSVerifierFactory()->create(['HS512', 'RS512']); + $jwsBuilder = $this->getJWSBuilderFactory() + ->create(['HS512', 'RS512']) + ; + $jwsVerifier = $this->getJWSVerifierFactory() + ->create(['HS512', 'RS512']) + ; $jws = $jwsBuilder - ->create()->withPayload(json_encode($this->getKeyset())) - ->addSignature($this->getKey1(), ['alg' => 'HS512', ['foo' => 'bar']]) - ->addSignature($this->getKey2(), ['alg' => 'RS512']) + ->create() + ->withPayload(json_encode($this->getKeyset())) + ->addSignature($this->getKey1(), [ + 'alg' => 'HS512', + [ + 'foo' => 'bar', + ], + ]) + ->addSignature($this->getKey2(), [ + 'alg' => 'RS512', + ]) ->build() ; - $loaded = $this->getJWSSerializerManager()->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)); - static::assertEquals(2, $loaded->countSignatures()); - static::assertEquals($this->getKeyset(), JWKSet::createFromKeyData(json_decode($loaded->getPayload(), true))); + $loaded = $this->getJWSSerializerManager() + ->unserialize($this->getJWSSerializerManager()->serialize('jws_json_general', $jws, 0)) + ; + static::assertSame(2, $loaded->countSignatures()); + static::assertEqualsCanonicalizing( + $this->getKeyset(), + JWKSet::createFromKeyData(json_decode($loaded->getPayload(), true, 512, JSON_THROW_ON_ERROR)) + ); static::assertTrue($jwsVerifier->verifyWithKeySet($loaded, new JWKSet([]), 0)); - static::assertTrue($jwsVerifier->verifyWithKey($loaded, new JWK(['kty' => 'EC']), 1)); + static::assertTrue($jwsVerifier->verifyWithKey($loaded, new JWK([ + 'kty' => 'EC', + ]), 1)); } private function getKey1(): JWK @@ -891,76 +1223,82 @@ private function getKeyset(): JWKSet private function getPublicKeySet(): JWKSet { - $keys = ['keys' => [ - [ - 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', - 'kty' => 'RSA', - 'alg' => 'RS256', - 'use' => 'sig', - 'n' => 'vnMTRCMvsS04M1yaKR112aB8RxOkWHFixZO68wCRlVLxK4ugckXVD_Ebcq-kms1T2XpoWntVfBuX40r2GvcD9UsTFt_MZlgd1xyGwGV6U_tfQUll5mKxCPjr60h83LXKJ_zmLXIqkV8tAoIg78a5VRWoms_0Bn09DKT3-RBWFjk=', - 'e' => 'AQAB', - ], - [ - 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', - 'kty' => 'RSA', - 'alg' => 'RS256', - 'use' => 'sig', - 'n' => 'rI67uHIDWDgCy_Ut-FhhjTCkEcqzoO80IRgdpk_fJHlDmXhMTJKPizxbIEMs0wRHRZpwH-4D20thpnQB5Mgx6-XM9kOvcYpHSdcYME77BwX6uQG-hw2w77NOhYiCSZCLzx-5ld5Wjy0dympL-ExqQw-wrWipMX7NQhIbJqVbZ18=', - 'e' => 'AQAB', - ], - [ - 'kty' => 'RSA', - 'n' => 'oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3Spsk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMStPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw', - 'e' => 'AQAB', - ], - [ - 'kty' => 'RSA', - 'n' => 'sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1WlUzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDprecbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBIY2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw', - 'e' => 'AQAB', - ], - [ - 'kty' => 'RSA', - 'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ', - 'e' => 'AQAB', - ], - [ - 'kty' => 'EC', - 'crv' => 'P-256', - 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', - 'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', + $keys = [ + 'keys' => [ + [ + 'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8', + 'kty' => 'RSA', + 'alg' => 'RS256', + 'use' => 'sig', + 'n' => 'vnMTRCMvsS04M1yaKR112aB8RxOkWHFixZO68wCRlVLxK4ugckXVD_Ebcq-kms1T2XpoWntVfBuX40r2GvcD9UsTFt_MZlgd1xyGwGV6U_tfQUll5mKxCPjr60h83LXKJ_zmLXIqkV8tAoIg78a5VRWoms_0Bn09DKT3-RBWFjk=', + 'e' => 'AQAB', + ], + [ + 'kid' => '02491f945c951adf156f370788e8ccdabf8877a8', + 'kty' => 'RSA', + 'alg' => 'RS256', + 'use' => 'sig', + 'n' => 'rI67uHIDWDgCy_Ut-FhhjTCkEcqzoO80IRgdpk_fJHlDmXhMTJKPizxbIEMs0wRHRZpwH-4D20thpnQB5Mgx6-XM9kOvcYpHSdcYME77BwX6uQG-hw2w77NOhYiCSZCLzx-5ld5Wjy0dympL-ExqQw-wrWipMX7NQhIbJqVbZ18=', + 'e' => 'AQAB', + ], + [ + 'kty' => 'RSA', + 'n' => 'oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3Spsk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMStPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw', + 'e' => 'AQAB', + ], + [ + 'kty' => 'RSA', + 'n' => 'sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1WlUzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDprecbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBIY2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw', + 'e' => 'AQAB', + ], + [ + 'kty' => 'RSA', + 'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ', + 'e' => 'AQAB', + ], + [ + 'kty' => 'EC', + 'crv' => 'P-256', + 'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', + 'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', + ], + [ + 'kty' => 'EC', + 'crv' => 'P-521', + 'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk', + 'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2', + ], ], - [ - 'kty' => 'EC', - 'crv' => 'P-521', - 'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk', - 'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2', - ], - ]]; + ]; return JWKSet::createFromKeyData($keys); } private function getSymmetricKeySet(): JWKSet { - $keys = ['keys' => [ - [ - 'kid' => 'DIR_1', - 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded(hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F')), - ], - [ - 'kty' => 'oct', - 'k' => 'f5aN5V6iihwQVqP-tPNNtkIJNCwUb9-JukCIKkF0rNfxqxA771RJynYAT2xtzAP0MYaR7U5fMP_wvbRQq5l38Q', + $keys = [ + 'keys' => [ + [ + 'kid' => 'DIR_1', + 'kty' => 'oct', + 'k' => Base64UrlSafe::encodeUnpadded( + hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F') + ), + ], + [ + 'kty' => 'oct', + 'k' => 'f5aN5V6iihwQVqP-tPNNtkIJNCwUb9-JukCIKkF0rNfxqxA771RJynYAT2xtzAP0MYaR7U5fMP_wvbRQq5l38Q', + ], + [ + 'kty' => 'oct', + 'k' => 'GawgguFyGrWKav7AX4VKUg', + ], + [ + 'kty' => 'oct', + 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', + ], ], - [ - 'kty' => 'oct', - 'k' => 'GawgguFyGrWKav7AX4VKUg', - ], - [ - 'kty' => 'oct', - 'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow', - ], - ]]; + ]; return JWKSet::createFromKeyData($keys); } diff --git a/tests/ComposerJsonTest.php b/tests/ComposerJsonTest.php index f9797e0a..a18649ba 100644 --- a/tests/ComposerJsonTest.php +++ b/tests/ComposerJsonTest.php @@ -2,30 +2,23 @@ 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; use DirectoryIterator; +use function in_array; +use const JSON_THROW_ON_ERROR; use PHPUnit\Framework\TestCase; use Traversable; /** * @internal * @note Courtesy of @scheb - * @author Christian Scheb (https://github.com/scheb) + * * @see https://github.com/scheb/2fa/commit/94ff439212f465d8c9d146bf87d82ca32c4c4cbc#commitcomment-41153585 */ -class ComposerJsonTest extends TestCase +final class ComposerJsonTest extends TestCase { - private const SRC_DIR = __DIR__.'/../src'; + private const SRC_DIR = __DIR__ . '/../src'; /** * @test @@ -33,28 +26,40 @@ class ComposerJsonTest extends TestCase public function packageDependenciesEqualRootDependencies(): void { $usedDependencies = ['symfony/symfony']; // Some builds add this to composer.json - $rootDependencies = $this->getComposerDependencies(__DIR__.'/../composer.json'); + $rootDependencies = $this->getComposerDependencies(__DIR__ . '/../composer.json'); foreach ($this->listSubPackages() as $package) { - $packageDependencies = $this->getComposerDependencies($package.'/composer.json'); + $packageDependencies = $this->getComposerDependencies($package . '/composer.json'); foreach ($packageDependencies as $dependency => $version) { // Skip web-auth/* dependencies - if (0 === mb_strpos($dependency, 'web-token/')) { + if (str_starts_with($dependency, 'web-token/')) { continue; } - $message = sprintf('Dependency "%s" from package "%s" is not defined in root composer.json', $dependency, $package); + $message = sprintf( + 'Dependency "%s" from package "%s" is not defined in root composer.json', + $dependency, + $package + ); static::assertArrayHasKey($dependency, $rootDependencies, $message); - $message = sprintf('Dependency "%s:%s" from package "%s" requires a different version in the root composer.json', $dependency, $version, $package); - static::assertEquals($version, $rootDependencies[$dependency], $message); + $message = sprintf( + 'Dependency "%s:%s" from package "%s" requires a different version in the root composer.json', + $dependency, + $version, + $package + ); + static::assertSame($version, $rootDependencies[$dependency], $message); $usedDependencies[] = $dependency; } } $unusedDependencies = array_diff(array_keys($rootDependencies), array_unique($usedDependencies)); - $message = sprintf('Dependencies declared in root composer.json, which are not declared in any sub-package: %s', implode($unusedDependencies)); + $message = sprintf( + 'Dependencies declared in root composer.json, which are not declared in any sub-package: %s', + implode('', $unusedDependencies) + ); static::assertCount(0, $unusedDependencies, $message); } @@ -63,9 +68,9 @@ public function packageDependenciesEqualRootDependencies(): void */ public function rootReplacesSubPackages(): void { - $rootReplaces = $this->getComposerReplaces(__DIR__.'/../composer.json'); + $rootReplaces = $this->getComposerReplaces(__DIR__ . '/../composer.json'); foreach ($this->listSubPackages() as $path) { - $packageName = $this->getComposerPackageName($path.'/composer.json'); + $packageName = $this->getComposerPackageName($path . '/composer.json'); $message = sprintf('Root composer.json must replace the sub-packages "%s"', $packageName); static::assertArrayHasKey($packageName, $rootReplaces, $message); } @@ -79,15 +84,14 @@ private function listSubPackages(?string $path = self::SRC_DIR): Traversable 'EncryptionAlgorithm', 'ContentEncryption', 'KeyEncryption', - 'SignatureAlgorithm' + 'SignatureAlgorithm', ]; foreach (new DirectoryIterator($path) as $dirInfo) { if (in_array($dirInfo->getFilename(), $packageFolders, true)) { yield from $this->listSubPackages($dirInfo->getRealPath()); - } else if ($dirInfo->isDir() && !$dirInfo->isDot() && $dirInfo->getFilename() !== '.github') { + } elseif ($dirInfo->isDir() && ! $dirInfo->isDot() && $dirInfo->getFilename() !== '.github') { yield $dirInfo->getRealPath(); } - } } @@ -108,6 +112,6 @@ private function getComposerReplaces(string $composerFilePath): array private function parseComposerFile(string $composerFilePath): array { - return json_decode(file_get_contents($composerFilePath), true); + return json_decode(file_get_contents($composerFilePath), true, 512, JSON_THROW_ON_ERROR); } } diff --git a/tests/Easy/AlgorithmProviderTest.php b/tests/Easy/AlgorithmProviderTest.php index f901c8ca..8042e024 100644 --- a/tests/Easy/AlgorithmProviderTest.php +++ b/tests/Easy/AlgorithmProviderTest.php @@ -2,79 +2,96 @@ 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\Tests\Easy; 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\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A128GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192CBCHS384; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A192GCM; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CBCHS512; +use Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256GCMKW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\A256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\Dir; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS256A128KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS384A192KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS512A256KW; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSA15; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP; +use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP256; +use Jose\Component\Signature\Algorithm\EdDSA; +use Jose\Component\Signature\Algorithm\ES256; +use Jose\Component\Signature\Algorithm\ES384; +use Jose\Component\Signature\Algorithm\ES512; +use Jose\Component\Signature\Algorithm\HS256; +use Jose\Component\Signature\Algorithm\HS384; +use Jose\Component\Signature\Algorithm\HS512; +use Jose\Component\Signature\Algorithm\PS256; +use Jose\Component\Signature\Algorithm\PS384; +use Jose\Component\Signature\Algorithm\PS512; +use Jose\Component\Signature\Algorithm\RS256; +use Jose\Component\Signature\Algorithm\RS384; +use Jose\Component\Signature\Algorithm\RS512; +use Jose\Component\Signature\Algorithm\SignatureAlgorithm; 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, + HS256::class, + HS384::class, + HS512::class, + RS256::class, + RS384::class, + RS512::class, + PS256::class, + PS384::class, + PS512::class, + ES256::class, + ES384::class, + ES512::class, + EdDSA::class, + A128GCMKW::class, + A192GCMKW::class, + A256GCMKW::class, + A128KW::class, + A192KW::class, + A256KW::class, + Dir::class, + ECDHES::class, + ECDHESA128KW::class, + ECDHESA192KW::class, + ECDHESA256KW::class, + PBES2HS256A128KW::class, + PBES2HS384A192KW::class, + PBES2HS512A256KW::class, + RSA15::class, + RSAOAEP::class, + RSAOAEP256::class, + A128GCM::class, + A192GCM::class, + A256GCM::class, + A128CBCHS256::class, + A192CBCHS384::class, + A256CBCHS512::class, ]; /** * @test - * - * @throws ExpectationFailedException */ public function itReturnsAllAlgorithmClasses(): void { @@ -84,27 +101,21 @@ public function itReturnsAllAlgorithmClasses(): void /** * @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); + static::assertContains($algorithm::class, self::ALL_ALGORITHMS); } } /** * @test - * - * @throws ExpectationFailedException - * @throws \Exception */ public function itAllowsNonExistingClasses(): void { - $nonExistingClassName = 'NonExistingClass'.bin2hex(random_bytes(31)); + $nonExistingClassName = 'NonExistingClass' . bin2hex(random_bytes(31)); $algorithmProvider = new AlgorithmProvider([$nonExistingClassName]); static::assertSame([$nonExistingClassName], $algorithmProvider->getAlgorithmClasses()); @@ -113,8 +124,6 @@ public function itAllowsNonExistingClasses(): void /** * @test - * - * @throws ExpectationFailedException */ public function itCanHandleClassesWithExceptions(): void { @@ -127,13 +136,12 @@ public function itCanHandleClassesWithExceptions(): void private function createAlgorithmClassWithExceptionMock(): string { - $mockClass = new class() implements Algorithm\SignatureAlgorithm { - /** @var bool */ - private static $throw; + $mockClass = new class() implements SignatureAlgorithm { + private static ?bool $throw = null; public function __construct() { - if (null === self::$throw) { + if (self::$throw === null) { self::$throw = true; return; @@ -163,6 +171,6 @@ public function verify(JWK $key, string $input, string $signature): bool } }; - return get_class($mockClass); + return $mockClass::class; } } diff --git a/tests/Easy/EncryptionTest.php b/tests/Easy/EncryptionTest.php index b969e834..18aa37ac 100644 --- a/tests/Easy/EncryptionTest.php +++ b/tests/Easy/EncryptionTest.php @@ -2,15 +2,6 @@ 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\Tests\Easy; use Jose\Component\Core\JWK; @@ -21,14 +12,9 @@ use PHPUnit\Framework\TestCase; /** - * @group easy - * * @internal - * @covers \Jose\Easy\Build - * @covers \Jose\Easy\JWEBuilder - * @covers \Jose\Easy\JWT */ -class EncryptionTest extends TestCase +final class EncryptionTest extends TestCase { /** * @test @@ -49,7 +35,10 @@ public function jweCanBeCreated(): void ->enc('A256GCM') ->zip('DEF') ->claim('is_root', true) - ->claim('roles', ['ROLE1' => true, 'ROLE2' => 0.007]) + ->claim('roles', [ + 'ROLE1' => true, + 'ROLE2' => 0.007, + ]) ->crit(['alg', 'enc']) ->encrypt($this->rsaKey()) ; @@ -68,20 +57,29 @@ public function jweCanBeCreated(): void ->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::assertSame($time, $jwt->claims->iat()); + static::assertSame($time, $jwt->claims->nbf()); + static::assertSame($time + 3600, $jwt->claims->exp()); + static::assertSame('0123456789', $jwt->claims->jti()); + static::assertSame('issuer', $jwt->claims->iss()); + static::assertSame('subject', $jwt->claims->sub()); + static::assertSame(['audience1', 'audience2'], $jwt->claims->aud()); + static::assertTrue($jwt->claims->is_root()); + static::assertSame([ + '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()); + static::assertSame([ + 'jti' => '0123456789', + 'alg' => 'RSA-OAEP-256', + 'enc' => 'A256GCM', + 'crit' => ['alg', 'enc'], + 'zip' => 'DEF', + ], $jwt->header->all()); + static::assertSame('RSA-OAEP-256', $jwt->header->alg()); + static::assertSame('A256GCM', $jwt->header->enc()); + static::assertSame('0123456789', $jwt->header->jti()); } /** @@ -113,13 +111,13 @@ public function jweCanBeCreatedWithCustomAlgorithm(): void ->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::assertSame($time, $jwt->claims->iat()); + static::assertSame($time, $jwt->claims->nbf()); + static::assertSame($time + 3600, $jwt->claims->exp()); + static::assertSame('0123456789', $jwt->claims->jti()); - static::assertEquals('RSA-OAEP-512', $jwt->header->alg()); - static::assertEquals('A256CCM-16-128', $jwt->header->enc()); + static::assertSame('RSA-OAEP-512', $jwt->header->alg()); + static::assertSame('A256CCM-16-128', $jwt->header->enc()); } private function rsaKey(): JWK diff --git a/tests/Easy/ParameterBagTest.php b/tests/Easy/ParameterBagTest.php index f9f7425a..e15a7955 100644 --- a/tests/Easy/ParameterBagTest.php +++ b/tests/Easy/ParameterBagTest.php @@ -2,27 +2,15 @@ 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\Tests\Easy; use Jose\Easy\ParameterBag; use PHPUnit\Framework\TestCase; /** - * @group easy - * * @internal - * @covers \Jose\Easy\ParameterBag */ -class ParameterBagTest extends TestCase +final class ParameterBagTest extends TestCase { /** * @test @@ -34,8 +22,8 @@ public function basicCalls(): void $bag->alg('alg'); $bag->aud(['aud']); - static::assertEquals(['aud'], $bag->aud()); - static::assertEquals('iss', $bag->get('iss')); - static::assertEquals('alg', $bag->get('alg')); + static::assertSame(['aud'], $bag->aud()); + static::assertSame('iss', $bag->get('iss')); + static::assertSame('alg', $bag->get('alg')); } } diff --git a/tests/Easy/SignatureTest.php b/tests/Easy/SignatureTest.php index 35b15352..475a6e3b 100644 --- a/tests/Easy/SignatureTest.php +++ b/tests/Easy/SignatureTest.php @@ -2,15 +2,6 @@ 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\Tests\Easy; use Exception; @@ -23,16 +14,9 @@ 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 +final class SignatureTest extends TestCase { /** * @test @@ -51,7 +35,10 @@ public function jwsCanBeCreated(): void ->aud('audience2') ->sub('subject') ->claim('is_root', true) - ->claim('roles', ['ROLE1' => true, 'ROLE2' => 0.007]) + ->claim('roles', [ + 'ROLE1' => true, + 'ROLE2' => 0.007, + ]) ->crit(['alg']) ->sign($this->rsaKey()) ; @@ -69,19 +56,26 @@ public function jwsCanBeCreated(): void ->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::assertSame($time, $jwt->claims->iat()); + static::assertSame($time, $jwt->claims->nbf()); + static::assertSame($time + 3600, $jwt->claims->exp()); + static::assertSame('0123456789', $jwt->claims->jti()); + static::assertSame('issuer', $jwt->claims->iss()); + static::assertSame('subject', $jwt->claims->sub()); + static::assertSame(['audience1', 'audience2'], $jwt->claims->aud()); + static::assertTrue($jwt->claims->is_root()); + static::assertSame([ + '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()); + static::assertSame([ + 'jti' => '0123456789', + 'alg' => 'RS512', + 'crit' => ['alg'], + ], $jwt->header->all()); + static::assertSame('RS512', $jwt->header->alg()); + static::assertSame('0123456789', $jwt->header->jti()); } /** @@ -103,9 +97,15 @@ public function invalidSignatureRejectsTheToken(): void ->aud('audience2') ->sub('subject') ->claim('is_root', true) - ->claim('roles', ['ROLE1' => true, 'ROLE2' => 0.007]) + ->claim('roles', [ + 'ROLE1' => true, + 'ROLE2' => 0.007, + ]) ->crit(['alg']) - ->sign(new JWK(['kty' => 'oct', 'k' => 'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo'])) + ->sign(new JWK([ + 'kty' => 'oct', + 'k' => 'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo', + ])) ; Load::jws($jws) @@ -117,7 +117,10 @@ public function invalidSignatureRejectsTheToken(): void ->iss('issuer') ->sub('subject') ->jti('0123456789') - ->key(new JWK(['kty' => 'oct', 'k' => 'BARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBAR'])) + ->key(new JWK([ + 'kty' => 'oct', + 'k' => 'BARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBAR', + ])) ->run() ; } @@ -141,7 +144,10 @@ public function algorithmIsNotAllowed(): void ->aud('audience2') ->sub('subject') ->claim('is_root', true) - ->claim('roles', ['ROLE1' => true, 'ROLE2' => 0.007]) + ->claim('roles', [ + 'ROLE1' => true, + 'ROLE2' => 0.007, + ]) ->crit(['alg']) ->sign($this->noneKey()) ; @@ -155,7 +161,10 @@ public function algorithmIsNotAllowed(): void ->iss('issuer') ->sub('subject') ->jti('0123456789') - ->key(new JWK(['kty' => 'oct', 'k' => 'BARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBAR'])) + ->key(new JWK([ + 'kty' => 'oct', + 'k' => 'BARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBAR', + ])) ->run() ; } @@ -179,7 +188,10 @@ public function tokenExpired(): void ->aud('audience2') ->sub('subject') ->claim('is_root', true) - ->claim('roles', ['ROLE1' => true, 'ROLE2' => 0.007]) + ->claim('roles', [ + 'ROLE1' => true, + 'ROLE2' => 0.007, + ]) ->crit(['alg']) ->sign($this->rsaKey()) ; @@ -226,12 +238,12 @@ public function jwsCanBeCreatedWithCustomAlgorithm(): void ->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::assertSame($time, $jwt->claims->iat()); + static::assertSame($time, $jwt->claims->nbf()); + static::assertSame($time + 3600, $jwt->claims->exp()); + static::assertSame('0123456789', $jwt->claims->jti()); - static::assertEquals('HS1', $jwt->header->alg()); + static::assertSame('HS1', $jwt->header->alg()); } private function rsaKey(): JWK diff --git a/tests/EncryptionAlgorithm/ContentEncryption/AESCBC/AESCBC_HSContentEncryptionTest.php b/tests/EncryptionAlgorithm/ContentEncryption/AESCBC/AESCBC_HSContentEncryptionTest.php index 917d1093..2794c497 100644 --- a/tests/EncryptionAlgorithm/ContentEncryption/AESCBC/AESCBC_HSContentEncryptionTest.php +++ b/tests/EncryptionAlgorithm/ContentEncryption/AESCBC/AESCBC_HSContentEncryptionTest.php @@ -2,74 +2,211 @@ 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\Tests\Component\Encryption\Algorithm\ContentEncryption; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256; use Jose\Component\Encryption\Algorithm\ContentEncryption\A192CBCHS384; use Jose\Component\Encryption\Algorithm\ContentEncryption\A256CBCHS512; +use ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; use ReflectionClass; use ReflectionMethod; use RuntimeException; +use const STR_PAD_LEFT; /** - * @group AESCBC - * @group unit - * * @internal */ -class AESCBC_HSContentEncryptionTest extends TestCase +final class AESCBC_HSContentEncryptionTest extends TestCase { /** * @see https://tools.ietf.org/html/rfc7516#appendix-B - * @covers \Jose\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256 * * @test */ public function a128CBCHS256EncryptAndDecrypt(): void { - $header = Base64UrlSafe::encodeUnpadded(json_encode(['alg' => 'A128KW', 'enc' => 'A128CBC-HS256'])); + $header = Base64UrlSafe::encodeUnpadded(json_encode([ + 'alg' => 'A128KW', + 'enc' => 'A128CBC-HS256', + ])); $T = null; $algorithm = new A128CBCHS256(); - $K = $this->convertArrayToBinString([4, 211, 31, 197, 84, 157, 252, 254, 11, 100, 157, 250, 63, 170, 106, 206, 107, 124, 212, 45, 111, 107, 9, 219, 200, 177, 0, 240, 143, 156, 44, 207]); + $K = $this->convertArrayToBinString( + [ + 4, + 211, + 31, + 197, + 84, + 157, + 252, + 254, + 11, + 100, + 157, + 250, + 63, + 170, + 106, + 206, + 107, + 124, + 212, + 45, + 111, + 107, + 9, + 219, + 200, + 177, + 0, + 240, + 143, + 156, + 44, + 207, + ] + ); $iv = $this->convertArrayToBinString([3, 22, 60, 12, 43, 67, 104, 105, 108, 108, 105, 99, 111, 116, 104, 101]); - $plaintext = $this->convertArrayToBinString([76, 105, 118, 101, 32, 108, 111, 110, 103, 32, 97, 110, 100, 32, 112, 114, 111, 115, 112, 101, 114, 46]); - $expected_cyphertext = $this->convertArrayToBinString([40, 57, 83, 181, 119, 33, 133, 148, 198, 185, 243, 24, 152, 230, 6, 75, 129, 223, 127, 19, 210, 82, 183, 230, 168, 33, 215, 104, 143, 112, 56, 102]); - $expected_T = $this->convertArrayToBinString([83, 73, 191, 98, 104, 205, 211, 128, 201, 189, 199, 133, 32, 38, 194, 85]); + $plaintext = $this->convertArrayToBinString( + [76, 105, 118, 101, 32, 108, 111, 110, 103, 32, 97, 110, 100, 32, 112, 114, 111, 115, 112, 101, 114, 46] + ); + $expected_cyphertext = $this->convertArrayToBinString( + [ + 40, + 57, + 83, + 181, + 119, + 33, + 133, + 148, + 198, + 185, + 243, + 24, + 152, + 230, + 6, + 75, + 129, + 223, + 127, + 19, + 210, + 82, + 183, + 230, + 168, + 33, + 215, + 104, + 143, + 112, + 56, + 102, + ] + ); + $expected_T = $this->convertArrayToBinString( + [83, 73, 191, 98, 104, 205, 211, 128, 201, 189, 199, 133, 32, 38, 194, 85] + ); $cyphertext = $algorithm->encryptContent($plaintext, $K, $iv, null, $header, $T); - static::assertEquals($expected_cyphertext, $cyphertext); - static::assertEquals($plaintext, $algorithm->decryptContent($cyphertext, $K, $iv, null, $header, $T)); - static::assertEquals($expected_T, $T); + static::assertSame($expected_cyphertext, $cyphertext); + static::assertSame($plaintext, $algorithm->decryptContent($cyphertext, $K, $iv, null, $header, $T)); + static::assertSame($expected_T, $T); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256 */ public function badTag(): void { $this->expectException(RuntimeException::class); $this->expectExceptionMessage('Unable to decrypt or to verify the tag.'); - $header = Base64UrlSafe::encodeUnpadded(json_encode(['alg' => 'A128KW', 'enc' => 'A128CBC-HS256'])); + $header = Base64UrlSafe::encodeUnpadded(json_encode([ + 'alg' => 'A128KW', + 'enc' => 'A128CBC-HS256', + ])); $algorithm = new A128CBCHS256(); - $K = $this->convertArrayToBinString([4, 211, 31, 197, 84, 157, 252, 254, 11, 100, 157, 250, 63, 170, 106, 206, 107, 124, 212, 45, 111, 107, 9, 219, 200, 177, 0, 240, 143, 156, 44, 207]); + $K = $this->convertArrayToBinString( + [ + 4, + 211, + 31, + 197, + 84, + 157, + 252, + 254, + 11, + 100, + 157, + 250, + 63, + 170, + 106, + 206, + 107, + 124, + 212, + 45, + 111, + 107, + 9, + 219, + 200, + 177, + 0, + 240, + 143, + 156, + 44, + 207, + ] + ); $iv = $this->convertArrayToBinString([3, 22, 60, 12, 43, 67, 104, 105, 108, 108, 105, 99, 111, 116, 104, 101]); - $cyphertext = $this->convertArrayToBinString([40, 57, 83, 181, 119, 33, 133, 148, 198, 185, 243, 24, 152, 230, 6, 75, 129, 223, 127, 19, 210, 82, 183, 230, 168, 33, 215, 104, 143, 112, 56, 102]); + $cyphertext = $this->convertArrayToBinString( + [ + 40, + 57, + 83, + 181, + 119, + 33, + 133, + 148, + 198, + 185, + 243, + 24, + 152, + 230, + 6, + 75, + 129, + 223, + 127, + 19, + 210, + 82, + 183, + 230, + 168, + 33, + 215, + 104, + 143, + 112, + 56, + 102, + ] + ); $T = $this->convertArrayToBinString([83, 73, 191, 98, 104, 205, 211, 128, 201, 189, 199, 133, 32, 38, 194]); $algorithm->decryptContent($cyphertext, $K, $iv, null, $header, $T); @@ -77,39 +214,44 @@ public function badTag(): void /** * @see https://tools.ietf.org/html/rfc7518#appendix-B.1 - * @covers \Jose\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256 * * @test */ public function a128CBCHS256EncryptAndDecryptBis(): void { - $header = Base64UrlSafe::encodeUnpadded(json_encode(['alg' => 'A128KW', 'enc' => 'A128CBC-HS256'])); + $header = Base64UrlSafe::encodeUnpadded(json_encode([ + 'alg' => 'A128KW', + 'enc' => 'A128CBC-HS256', + ])); $T = null; $algorithm = new A128CBCHS256(); $K = hex2bin('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f'); $iv = hex2bin('1af38c2dc2b96ffdd86694092341bc04'); - $plaintext = hex2bin('41206369706865722073797374656d206d757374206e6f7420626520726571756972656420746f206265207365637265742c20616e64206974206d7573742062652061626c6520746f2066616c6c20696e746f207468652068616e6473206f662074686520656e656d7920776974686f757420696e636f6e76656e69656e6365'); - $expected_cyphertext = hex2bin('c80edfa32ddf39d5ef00c0b468834279a2e46a1b8049f792f76bfe54b903a9c9a94ac9b47ad2655c5f10f9aef71427e2fc6f9b3f399a221489f16362c703233609d45ac69864e3321cf82935ac4096c86e133314c54019e8ca7980dfa4b9cf1b384c486f3a54c51078158ee5d79de59fbd34d848b3d69550a67646344427ade54b8851ffb598f7f80074b9473c82e2db'); + $plaintext = hex2bin( + '41206369706865722073797374656d206d757374206e6f7420626520726571756972656420746f206265207365637265742c20616e64206974206d7573742062652061626c6520746f2066616c6c20696e746f207468652068616e6473206f662074686520656e656d7920776974686f757420696e636f6e76656e69656e6365' + ); + $expected_cyphertext = hex2bin( + 'c80edfa32ddf39d5ef00c0b468834279a2e46a1b8049f792f76bfe54b903a9c9a94ac9b47ad2655c5f10f9aef71427e2fc6f9b3f399a221489f16362c703233609d45ac69864e3321cf82935ac4096c86e133314c54019e8ca7980dfa4b9cf1b384c486f3a54c51078158ee5d79de59fbd34d848b3d69550a67646344427ade54b8851ffb598f7f80074b9473c82e2db' + ); $expected_T = hex2bin('652c3fa36b0a7c5b3219fab3a30bc1c4'); $aad = hex2bin('546865207365636f6e64207072696e6369706c65206f662041756775737465204b6572636b686f666673'); $cyphertext = $algorithm->encryptContent($plaintext, $K, $iv, $aad, $header, $T); - static::assertEquals($expected_cyphertext, $cyphertext); + static::assertSame($expected_cyphertext, $cyphertext); //We invoke protected methods to test vectors directly. This is due to the encryption signature: this test case uses a string as AAD, but the algorithm uses the protected header. $calc_method = self::getMethod(A128CBCHS256::class, 'calculateAuthenticationTag'); $check_method = self::getMethod(A128CBCHS256::class, 'isTagValid'); $T = $calc_method->invokeArgs($algorithm, [$cyphertext, $K, $iv, null, $aad]); - static::assertEquals($expected_T, $T); + static::assertSame($expected_T, $T); static::assertTrue($check_method->invokeArgs($algorithm, [$cyphertext, $K, $iv, null, $aad, $T])); } /** * @see https://tools.ietf.org/html/rfc7518#appendix-B.2 - * @covers \Jose\Component\Encryption\Algorithm\ContentEncryption\A192CBCHS384 * * @test */ @@ -118,29 +260,34 @@ public function a192CBCHS384EncryptAndDecrypt(): void $header = Base64UrlSafe::encodeUnpadded(json_encode([])); $algorithm = new A192CBCHS384(); - $K = hex2bin('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f'); + $K = hex2bin( + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f' + ); $iv = hex2bin('1af38c2dc2b96ffdd86694092341bc04'); - $plaintext = hex2bin('41206369706865722073797374656d206d757374206e6f7420626520726571756972656420746f206265207365637265742c20616e64206974206d7573742062652061626c6520746f2066616c6c20696e746f207468652068616e6473206f662074686520656e656d7920776974686f757420696e636f6e76656e69656e6365'); - $expected_cyphertext = hex2bin('ea65da6b59e61edb419be62d19712ae5d303eeb50052d0dfd6697f77224c8edb000d279bdc14c1072654bd30944230c657bed4ca0c9f4a8466f22b226d1746214bf8cfc2400add9f5126e479663fc90b3bed787a2f0ffcbf3904be2a641d5c2105bfe591bae23b1d7449e532eef60a9ac8bb6c6b01d35d49787bcd57ef484927f280adc91ac0c4e79c7b11efc60054e3'); + $plaintext = hex2bin( + '41206369706865722073797374656d206d757374206e6f7420626520726571756972656420746f206265207365637265742c20616e64206974206d7573742062652061626c6520746f2066616c6c20696e746f207468652068616e6473206f662074686520656e656d7920776974686f757420696e636f6e76656e69656e6365' + ); + $expected_cyphertext = hex2bin( + 'ea65da6b59e61edb419be62d19712ae5d303eeb50052d0dfd6697f77224c8edb000d279bdc14c1072654bd30944230c657bed4ca0c9f4a8466f22b226d1746214bf8cfc2400add9f5126e479663fc90b3bed787a2f0ffcbf3904be2a641d5c2105bfe591bae23b1d7449e532eef60a9ac8bb6c6b01d35d49787bcd57ef484927f280adc91ac0c4e79c7b11efc60054e3' + ); $expected_T = hex2bin('8490ac0e58949bfe51875d733f93ac2075168039ccc733d7'); $aad = hex2bin('546865207365636f6e64207072696e6369706c65206f662041756775737465204b6572636b686f666673'); $cyphertext = $algorithm->encryptContent($plaintext, $K, $iv, $aad, $header, $T); - static::assertEquals($expected_cyphertext, $cyphertext); + static::assertSame($expected_cyphertext, $cyphertext); //We invoke protected methods to test vectors directly. This is due to the encryption signature: this test case uses a string as AAD, but the algorithm uses the protected header. $calc_method = self::getMethod(A128CBCHS256::class, 'calculateAuthenticationTag'); $check_method = self::getMethod(A128CBCHS256::class, 'isTagValid'); $T = $calc_method->invokeArgs($algorithm, [$cyphertext, $K, $iv, null, $aad]); - static::assertEquals($expected_T, $T); + static::assertSame($expected_T, $T); static::assertTrue($check_method->invokeArgs($algorithm, [$cyphertext, $K, $iv, null, $aad, $T])); } /** * @see https://tools.ietf.org/html/rfc7518#appendix-B.3 - * @covers \Jose\Component\Encryption\Algorithm\ContentEncryption\A256CBCHS512 * * @test */ @@ -149,23 +296,29 @@ public function a256CBCHS512EncryptAndDecrypt(): void $header = Base64UrlSafe::encodeUnpadded(json_encode([])); $algorithm = new A256CBCHS512(); - $K = hex2bin('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f'); + $K = hex2bin( + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f' + ); $iv = hex2bin('1af38c2dc2b96ffdd86694092341bc04'); - $plaintext = hex2bin('41206369706865722073797374656d206d757374206e6f7420626520726571756972656420746f206265207365637265742c20616e64206974206d7573742062652061626c6520746f2066616c6c20696e746f207468652068616e6473206f662074686520656e656d7920776974686f757420696e636f6e76656e69656e6365'); - $expected_cyphertext = hex2bin('4affaaadb78c31c5da4b1b590d10ffbd3dd8d5d302423526912da037ecbcc7bd822c301dd67c373bccb584ad3e9279c2e6d12a1374b77f077553df829410446b36ebd97066296ae6427ea75c2e0846a11a09ccf5370dc80bfecbad28c73f09b3a3b75e662a2594410ae496b2e2e6609e31e6e02cc837f053d21f37ff4f51950bbe2638d09dd7a4930930806d0703b1f6'); + $plaintext = hex2bin( + '41206369706865722073797374656d206d757374206e6f7420626520726571756972656420746f206265207365637265742c20616e64206974206d7573742062652061626c6520746f2066616c6c20696e746f207468652068616e6473206f662074686520656e656d7920776974686f757420696e636f6e76656e69656e6365' + ); + $expected_cyphertext = hex2bin( + '4affaaadb78c31c5da4b1b590d10ffbd3dd8d5d302423526912da037ecbcc7bd822c301dd67c373bccb584ad3e9279c2e6d12a1374b77f077553df829410446b36ebd97066296ae6427ea75c2e0846a11a09ccf5370dc80bfecbad28c73f09b3a3b75e662a2594410ae496b2e2e6609e31e6e02cc837f053d21f37ff4f51950bbe2638d09dd7a4930930806d0703b1f6' + ); $expected_T = hex2bin('4dd3b4c088a7f45c216839645b2012bf2e6269a8c56a816dbc1b267761955bc5'); $aad = hex2bin('546865207365636f6e64207072696e6369706c65206f662041756775737465204b6572636b686f666673'); $cyphertext = $algorithm->encryptContent($plaintext, $K, $iv, $aad, $header, $T); - static::assertEquals($expected_cyphertext, $cyphertext); + static::assertSame($expected_cyphertext, $cyphertext); //We invoke protected methods to test vectors directly. This is due to the encryption signature: this test case uses a string as AAD, but the algorithm uses the protected header. $calc_method = self::getMethod(A128CBCHS256::class, 'calculateAuthenticationTag'); $check_method = self::getMethod(A128CBCHS256::class, 'isTagValid'); $T = $calc_method->invokeArgs($algorithm, [$cyphertext, $K, $iv, null, $aad]); - static::assertEquals($expected_T, $T); + static::assertSame($expected_T, $T); static::assertTrue($check_method->invokeArgs($algorithm, [$cyphertext, $K, $iv, null, $aad, $T])); } diff --git a/tests/EncryptionAlgorithm/ContentEncryption/AESGCM/AESGCMContentEncryptionTest.php b/tests/EncryptionAlgorithm/ContentEncryption/AESGCM/AESGCMContentEncryptionTest.php index d92bacb1..f671c2bb 100644 --- a/tests/EncryptionAlgorithm/ContentEncryption/AESGCM/AESGCMContentEncryptionTest.php +++ b/tests/EncryptionAlgorithm/ContentEncryption/AESGCM/AESGCMContentEncryptionTest.php @@ -2,37 +2,29 @@ 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\Tests\Component\Encryption\Algorithm\ContentEncryption; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Encryption\Algorithm\ContentEncryption\A128GCM; use Jose\Component\Encryption\Algorithm\ContentEncryption\A192GCM; use Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM; +use ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; +use const STR_PAD_LEFT; /** - * @group unit - * * @internal */ -class AESGCMContentEncryptionTest extends TestCase +final class AESGCMContentEncryptionTest extends TestCase { /** * @test - * @covers \Jose\Component\Encryption\Algorithm\ContentEncryption\A128GCM */ public function a128GCMEncryptAndDecrypt(): void { - $header = Base64UrlSafe::encodeUnpadded(json_encode(['alg' => 'ECDH-ES', 'enc' => 'A128GCM'])); + $header = Base64UrlSafe::encodeUnpadded(json_encode([ + 'alg' => 'ECDH-ES', + 'enc' => 'A128GCM', + ])); $tag = null; $algorithm = new A128GCM(); @@ -44,16 +36,18 @@ public function a128GCMEncryptAndDecrypt(): void $cyphertext = $algorithm->encryptContent($plaintext, $cek, $iv, null, $header, $tag); static::assertNotNull($tag); - static::assertEquals($plaintext, $algorithm->decryptContent($cyphertext, $cek, $iv, null, $header, $tag)); + static::assertSame($plaintext, $algorithm->decryptContent($cyphertext, $cek, $iv, null, $header, $tag)); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\ContentEncryption\A192GCM */ public function a192GCMEncryptAndDecrypt(): void { - $header = Base64UrlSafe::encodeUnpadded(json_encode(['alg' => 'ECDH-ES', 'enc' => 'A192GCM'])); + $header = Base64UrlSafe::encodeUnpadded(json_encode([ + 'alg' => 'ECDH-ES', + 'enc' => 'A192GCM', + ])); $tag = null; $algorithm = new A192GCM(); @@ -65,16 +59,18 @@ public function a192GCMEncryptAndDecrypt(): void $cyphertext = $algorithm->encryptContent($plaintext, $cek, $iv, null, $header, $tag); static::assertNotNull($tag); - static::assertEquals($plaintext, $algorithm->decryptContent($cyphertext, $cek, $iv, null, $header, $tag)); + static::assertSame($plaintext, $algorithm->decryptContent($cyphertext, $cek, $iv, null, $header, $tag)); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM */ public function a256GCMEncryptAndDecrypt(): void { - $header = Base64UrlSafe::encodeUnpadded(json_encode(['alg' => 'ECDH-ES', 'enc' => 'A256GCM'])); + $header = Base64UrlSafe::encodeUnpadded(json_encode([ + 'alg' => 'ECDH-ES', + 'enc' => 'A256GCM', + ])); $tag = null; $algorithm = new A256GCM(); @@ -86,12 +82,11 @@ public function a256GCMEncryptAndDecrypt(): void $cyphertext = $algorithm->encryptContent($plaintext, $cek, $iv, null, $header, $tag); static::assertNotNull($tag); - static::assertEquals($plaintext, $algorithm->decryptContent($cyphertext, $cek, $iv, null, $header, $tag)); + static::assertSame($plaintext, $algorithm->decryptContent($cyphertext, $cek, $iv, null, $header, $tag)); } /** * @see https://tools.ietf.org/html/rfc7516#appendix-A.1 - * @covers \Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM * * @test */ @@ -99,15 +94,124 @@ public function a256GCMDecryptTestVector(): void { $algorithm = new A256GCM(); - $header = Base64UrlSafe::encodeUnpadded(json_encode(['alg' => 'RSA-OAEP', 'enc' => 'A256GCM'])); - $cek = $this->convertArrayToBinString([177, 161, 244, 128, 84, 143, 225, 115, 63, 180, 3, 255, 107, 154, 212, 246, 138, 7, 110, 91, 112, 46, 34, 105, 47, 130, 203, 46, 122, 234, 64, 252]); + $header = Base64UrlSafe::encodeUnpadded(json_encode([ + 'alg' => 'RSA-OAEP', + 'enc' => 'A256GCM', + ])); + $cek = $this->convertArrayToBinString( + [ + 177, + 161, + 244, + 128, + 84, + 143, + 225, + 115, + 63, + 180, + 3, + 255, + 107, + 154, + 212, + 246, + 138, + 7, + 110, + 91, + 112, + 46, + 34, + 105, + 47, + 130, + 203, + 46, + 122, + 234, + 64, + 252, + ] + ); $iv = $this->convertArrayToBinString([227, 197, 117, 252, 2, 219, 233, 68, 180, 225, 77, 219]); - $tag = $this->convertArrayToBinString([92, 80, 104, 49, 133, 25, 161, 215, 173, 101, 219, 211, 136, 91, 210, 145]); - $cyphertext = $this->convertArrayToBinString([229, 236, 166, 241, 53, 191, 115, 196, 174, 43, 73, 109, 39, 122, 233, 96, 140, 206, 120, 52, 51, 237, 48, 11, 190, 219, 186, 80, 111, 104, 50, 142, 47, 167, 59, 61, 181, 127, 196, 21, 40, 82, 242, 32, 123, 143, 168, 226, 73, 216, 176, 144, 138, 247, 106, 60, 16, 205, 160, 109, 64, 63, 192]); + $tag = $this->convertArrayToBinString( + [92, 80, 104, 49, 133, 25, 161, 215, 173, 101, 219, 211, 136, 91, 210, 145] + ); + $cyphertext = $this->convertArrayToBinString( + [ + 229, + 236, + 166, + 241, + 53, + 191, + 115, + 196, + 174, + 43, + 73, + 109, + 39, + 122, + 233, + 96, + 140, + 206, + 120, + 52, + 51, + 237, + 48, + 11, + 190, + 219, + 186, + 80, + 111, + 104, + 50, + 142, + 47, + 167, + 59, + 61, + 181, + 127, + 196, + 21, + 40, + 82, + 242, + 32, + 123, + 143, + 168, + 226, + 73, + 216, + 176, + 144, + 138, + 247, + 106, + 60, + 16, + 205, + 160, + 109, + 64, + 63, + 192, + ] + ); $expected_plaintext = 'The true sign of intelligence is not knowledge but imagination.'; - static::assertEquals('eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ', $header); - static::assertEquals($expected_plaintext, $algorithm->decryptContent($cyphertext, $cek, $iv, null, $header, $tag)); + static::assertSame('eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ', $header); + static::assertSame( + $expected_plaintext, + $algorithm->decryptContent($cyphertext, $cek, $iv, null, $header, $tag) + ); } private function convertArrayToBinString(array $data): string diff --git a/tests/EncryptionAlgorithm/Experimental/AESCTRContentEncryptionTest.php b/tests/EncryptionAlgorithm/Experimental/AESCTRContentEncryptionTest.php index 5df28f7a..5d74eb70 100644 --- a/tests/EncryptionAlgorithm/Experimental/AESCTRContentEncryptionTest.php +++ b/tests/EncryptionAlgorithm/Experimental/AESCTRContentEncryptionTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Encryption\Algorithm; use Jose\Component\Core\JWK; @@ -20,16 +11,12 @@ use PHPUnit\Framework\TestCase; /** - * @group unit - * @group NewAlgorithm - * * @internal */ -class AESCTRContentEncryptionTest extends TestCase +final class AESCTRContentEncryptionTest extends TestCase { /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A128CTR */ public function a128CTRKeyEncryptionAndDecryption(): void { @@ -42,12 +29,11 @@ public function a128CTRKeyEncryptionAndDecryption(): void $encrypted = $algorithm->encryptKey($jwk, $cek, $header, $additionalHeader); $decrypted = $algorithm->decryptKey($jwk, $encrypted, $additionalHeader); - static::assertEquals($cek, $decrypted); + static::assertSame($cek, $decrypted); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A128CTR */ public function a192CTRKeyEncryptionAndDecryption(): void { @@ -60,12 +46,11 @@ public function a192CTRKeyEncryptionAndDecryption(): void $encrypted = $algorithm->encryptKey($jwk, $cek, $header, $additionalHeader); $decrypted = $algorithm->decryptKey($jwk, $encrypted, $additionalHeader); - static::assertEquals($cek, $decrypted); + static::assertSame($cek, $decrypted); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A256CTR */ public function a256CTRKeyEncryptionAndDecryption(): void { @@ -78,7 +63,7 @@ public function a256CTRKeyEncryptionAndDecryption(): void $encrypted = $algorithm->encryptKey($jwk, $cek, $header, $additionalHeader); $decrypted = $algorithm->decryptKey($jwk, $encrypted, $additionalHeader); - static::assertEquals($cek, $decrypted); + static::assertSame($cek, $decrypted); } private function getKey(): JWK diff --git a/tests/EncryptionAlgorithm/Experimental/Chacha20Poly1305ContentEncryptionTest.php b/tests/EncryptionAlgorithm/Experimental/Chacha20Poly1305ContentEncryptionTest.php index 8ed1b0f8..3776a250 100644 --- a/tests/EncryptionAlgorithm/Experimental/Chacha20Poly1305ContentEncryptionTest.php +++ b/tests/EncryptionAlgorithm/Experimental/Chacha20Poly1305ContentEncryptionTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Encryption\Algorithm; use function in_array; @@ -19,22 +10,18 @@ use PHPUnit\Framework\TestCase; /** - * @group unit - * @group NewAlgorithm - * * @internal */ -class Chacha20Poly1305ContentEncryptionTest extends TestCase +final class Chacha20Poly1305ContentEncryptionTest extends TestCase { protected function setUp(): void { - if (!in_array('chacha20-poly1305', openssl_get_cipher_methods(), true)) { + if (! in_array('chacha20-poly1305', openssl_get_cipher_methods(), true)) { static::markTestSkipped('The algorithm "chacha20-poly1305" is not supported in this platform.'); } } /** - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\Chacha20Poly1305 * @test */ public function contentEncryptionAndDecryption(): void @@ -48,7 +35,7 @@ public function contentEncryptionAndDecryption(): void $encrypted = $algorithm->encryptKey($jwk, $cek, $header, $additionalHeader); $decrypted = $algorithm->decryptKey($jwk, $encrypted, $additionalHeader); - static::assertEquals($cek, $decrypted); + static::assertSame($cek, $decrypted); } private function getKey(): JWK diff --git a/tests/EncryptionAlgorithm/Experimental/RSAOAEPKeyEncryptionTest.php b/tests/EncryptionAlgorithm/Experimental/RSAOAEPKeyEncryptionTest.php index 8a81f998..71dbc032 100644 --- a/tests/EncryptionAlgorithm/Experimental/RSAOAEPKeyEncryptionTest.php +++ b/tests/EncryptionAlgorithm/Experimental/RSAOAEPKeyEncryptionTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Encryption\Algorithm; use Jose\Component\Core\JWK; @@ -21,12 +12,9 @@ /** * Class RSAKeyEncryptionTest. * - * @group unit - * @group NewAlgorithm - * * @internal */ -class RSAOAEPKeyEncryptionTest extends TestCase +final class RSAOAEPKeyEncryptionTest extends TestCase { /** * @test @@ -42,7 +30,7 @@ public function rSAOAEP384EncryptionAndDecryption(): void $encrypted = $algorithm->encryptKey($jwk, $cek, $header, $additionalHeader); $decrypted = $algorithm->decryptKey($jwk, $encrypted, $header); - static::assertEquals($cek, $decrypted); + static::assertSame($cek, $decrypted); } /** @@ -59,7 +47,7 @@ public function rSAOAEP512EncryptionAndDecryption(): void $encrypted = $algorithm->encryptKey($jwk, $cek, $header, $additionalHeader); $decrypted = $algorithm->decryptKey($jwk, $encrypted, $header); - static::assertEquals($cek, $decrypted); + static::assertSame($cek, $decrypted); } private function getKey(): JWK diff --git a/tests/EncryptionAlgorithm/KeyEncryption/AESGCMKW/AESGCMKWKeyEncryptionTest.php b/tests/EncryptionAlgorithm/KeyEncryption/AESGCMKW/AESGCMKWKeyEncryptionTest.php index 12cd57ff..4209652d 100644 --- a/tests/EncryptionAlgorithm/KeyEncryption/AESGCMKW/AESGCMKWKeyEncryptionTest.php +++ b/tests/EncryptionAlgorithm/KeyEncryption/AESGCMKW/AESGCMKWKeyEncryptionTest.php @@ -2,37 +2,24 @@ 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\Tests\Component\Encryption\Algorithm\KeyEncryption; use function array_key_exists; -use ParagonIE\ConstantTime\Base64UrlSafe; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\Encryption\Algorithm\KeyEncryption\A128GCMKW; use Jose\Component\Encryption\Algorithm\KeyEncryption\A192GCMKW; use Jose\Component\Encryption\Algorithm\KeyEncryption\A256GCMKW; +use ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; /** - * @group AESGCMKW - * @group unit - * * @internal */ -class AESGCMKWKeyEncryptionTest extends TestCase +final class AESGCMKWKeyEncryptionTest extends TestCase { /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A128GCMKW */ public function a128GCMKW(): void { @@ -52,12 +39,11 @@ public function a128GCMKW(): void static::assertTrue(array_key_exists('tag', $header)); static::assertNotNull($header['iv']); static::assertNotNull($header['tag']); - static::assertEquals($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); + static::assertSame($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A128GCMKW */ public function badKey(): void { @@ -78,7 +64,6 @@ public function badKey(): void /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A128GCMKW */ public function missingParameters(): void { @@ -100,7 +85,6 @@ public function missingParameters(): void /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A192GCMKW */ public function a192GCMKW(): void { @@ -120,19 +104,20 @@ public function a192GCMKW(): void static::assertTrue(array_key_exists('tag', $header)); static::assertNotNull($header['iv']); static::assertNotNull($header['tag']); - static::assertEquals($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); + static::assertSame($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A256GCMKW */ public function a256GCMKW(): void { $header = []; $key = new JWK([ 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded(hex2bin('000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F')), + 'k' => Base64UrlSafe::encodeUnpadded( + hex2bin('000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F') + ), ]); $cek = hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F'); @@ -145,6 +130,6 @@ public function a256GCMKW(): void static::assertTrue(array_key_exists('tag', $header)); static::assertNotNull($header['iv']); static::assertNotNull($header['tag']); - static::assertEquals($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); + static::assertSame($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); } } diff --git a/tests/EncryptionAlgorithm/KeyEncryption/AESKW/AESKWKeyEncryptionTest.php b/tests/EncryptionAlgorithm/KeyEncryption/AESKW/AESKWKeyEncryptionTest.php index b0462268..a543e69e 100644 --- a/tests/EncryptionAlgorithm/KeyEncryption/AESKW/AESKWKeyEncryptionTest.php +++ b/tests/EncryptionAlgorithm/KeyEncryption/AESKW/AESKWKeyEncryptionTest.php @@ -2,36 +2,23 @@ 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\Tests\Component\Encryption\Algorithm\KeyEncryption; -use ParagonIE\ConstantTime\Base64UrlSafe; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\Encryption\Algorithm\KeyEncryption\A128KW; use Jose\Component\Encryption\Algorithm\KeyEncryption\A192KW; use Jose\Component\Encryption\Algorithm\KeyEncryption\A256KW; +use ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; /** - * @group AESKW - * @group unit - * * @internal */ -class AESKWKeyEncryptionTest extends TestCase +final class AESKWKeyEncryptionTest extends TestCase { /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A128KW */ public function a128KW(): void { @@ -47,13 +34,15 @@ public function a128KW(): void $wrapped_cek = $aeskw->wrapKey($key, $cek, $header, $header); - static::assertEquals($wrapped_cek, hex2bin('11826840774D993FF9C2FA02CCA3CEA0E93B1E1CF96361F93EA6DC2F345194E7B30F964C79F9E61D')); - static::assertEquals($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); + static::assertSame( + $wrapped_cek, + hex2bin('11826840774D993FF9C2FA02CCA3CEA0E93B1E1CF96361F93EA6DC2F345194E7B30F964C79F9E61D') + ); + static::assertSame($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A128KW */ public function badKey(): void { @@ -74,7 +63,6 @@ public function badKey(): void /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A192KW */ public function a192KW(): void { @@ -90,20 +78,24 @@ public function a192KW(): void $wrapped_cek = $aeskw->wrapKey($key, $cek, $header, $header); - static::assertEquals($wrapped_cek, hex2bin('08861E000AABFA4479C7191F9DC51CCA37C50F16CC14441C6EA4980CFCE0F41D9285758C6F74AC6D')); - static::assertEquals($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); + static::assertSame( + $wrapped_cek, + hex2bin('08861E000AABFA4479C7191F9DC51CCA37C50F16CC14441C6EA4980CFCE0F41D9285758C6F74AC6D') + ); + static::assertSame($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\A256KW */ public function a256KW(): void { $header = []; $key = new JWK([ 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded(hex2bin('000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F')), + 'k' => Base64UrlSafe::encodeUnpadded( + hex2bin('000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F') + ), ]); $cek = hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F'); @@ -112,7 +104,10 @@ public function a256KW(): void $wrapped_cek = $aeskw->wrapKey($key, $cek, $header, $header); - static::assertEquals($wrapped_cek, hex2bin('28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21')); - static::assertEquals($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); + static::assertSame( + $wrapped_cek, + hex2bin('28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21') + ); + static::assertSame($cek, $aeskw->unwrapKey($key, $wrapped_cek, $header)); } } diff --git a/tests/EncryptionAlgorithm/KeyEncryption/Direct/DirAlgorithmTest.php b/tests/EncryptionAlgorithm/KeyEncryption/Direct/DirAlgorithmTest.php index be14642d..0210e015 100644 --- a/tests/EncryptionAlgorithm/KeyEncryption/Direct/DirAlgorithmTest.php +++ b/tests/EncryptionAlgorithm/KeyEncryption/Direct/DirAlgorithmTest.php @@ -2,34 +2,22 @@ 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\Tests\Component\Encryption\Algorithm\KeyEncryption; -use ParagonIE\ConstantTime\Base64UrlSafe; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\Encryption\Algorithm\KeyEncryption\Dir; +use ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; /** * Class DirAlgorithmTest. * - * @group unit - * * @internal */ -class DirAlgorithmTest extends TestCase +final class DirAlgorithmTest extends TestCase { /** - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\Dir * @test */ public function invalidKey(): void @@ -47,7 +35,6 @@ public function invalidKey(): void } /** - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\Dir * @test */ public function validCEK(): void @@ -59,6 +46,6 @@ public function validCEK(): void $dir = new Dir(); - static::assertEquals('ABCD', $dir->getCEK($key)); + static::assertSame('ABCD', $dir->getCEK($key)); } } diff --git a/tests/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESKeyAgreementTest.php b/tests/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESKeyAgreementTest.php index 8e673c39..5b48ecc5 100644 --- a/tests/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESKeyAgreementTest.php +++ b/tests/EncryptionAlgorithm/KeyEncryption/ECDHES/ECDHESKeyAgreementTest.php @@ -2,40 +2,28 @@ 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\Tests\Component\Encryption\Algorithm\KeyEncryption; use function array_key_exists; -use ParagonIE\ConstantTime\Base64UrlSafe; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES; use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA128KW; use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA192KW; use Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA256KW; +use ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; +use const STR_PAD_LEFT; /** * Class ECDHESKeyAgreementTest. * - * @group ECDHES - * @group unit - * * @internal */ -class ECDHESKeyAgreementTest extends TestCase +final class ECDHESKeyAgreementTest extends TestCase { /** * @see https://tools.ietf.org/html/rfc7518#appendix-C - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES * * @test */ @@ -66,11 +54,12 @@ public function getAgreementKey(): void /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA128KW */ public function getAgreementKeyWithA128KeyWrap(): void { - $header = ['enc' => 'A128GCM']; + $header = [ + 'enc' => 'A128GCM', + ]; $private = new JWK([ 'kty' => 'EC', @@ -81,7 +70,40 @@ public function getAgreementKeyWithA128KeyWrap(): void ]); $public = $private->toPublic(); - $cek = [4, 211, 31, 197, 84, 157, 252, 254, 11, 100, 157, 250, 63, 170, 106, 206, 107, 124, 212, 45, 111, 107, 9, 219, 200, 177, 0, 240, 143, 156, 44, 207]; + $cek = [ + 4, + 211, + 31, + 197, + 84, + 157, + 252, + 254, + 11, + 100, + 157, + 250, + 63, + 170, + 106, + 206, + 107, + 124, + 212, + 45, + 111, + 107, + 9, + 219, + 200, + 177, + 0, + 240, + 143, + 156, + 44, + 207, + ]; foreach ($cek as $key => $value) { $cek[$key] = str_pad(dechex($value), 2, '0', STR_PAD_LEFT); } @@ -94,18 +116,19 @@ public function getAgreementKeyWithA128KeyWrap(): void static::assertTrue(array_key_exists('kty', $header['epk'])); static::assertTrue(array_key_exists('x', $header['epk'])); static::assertTrue(array_key_exists('y', $header['epk'])); - static::assertEquals('P-256', $header['epk']['crv']); - static::assertEquals('EC', $header['epk']['kty']); - static::assertEquals($cek, $ecdh_es->unwrapAgreementKey($private, null, $encrypted_cek, 128, $header)); + static::assertSame('P-256', $header['epk']['crv']); + static::assertSame('EC', $header['epk']['kty']); + static::assertSame($cek, $ecdh_es->unwrapAgreementKey($private, null, $encrypted_cek, 128, $header)); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA192KW */ public function getAgreementKeyWithA192KeyWrap(): void { - $header = ['enc' => 'A192GCM']; + $header = [ + 'enc' => 'A192GCM', + ]; $private = new JWK([ 'kty' => 'EC', @@ -116,7 +139,40 @@ public function getAgreementKeyWithA192KeyWrap(): void ]); $public = $private->toPublic(); - $cek = [4, 211, 31, 197, 84, 157, 252, 254, 11, 100, 157, 250, 63, 170, 106, 206, 107, 124, 212, 45, 111, 107, 9, 219, 200, 177, 0, 240, 143, 156, 44, 207]; + $cek = [ + 4, + 211, + 31, + 197, + 84, + 157, + 252, + 254, + 11, + 100, + 157, + 250, + 63, + 170, + 106, + 206, + 107, + 124, + 212, + 45, + 111, + 107, + 9, + 219, + 200, + 177, + 0, + 240, + 143, + 156, + 44, + 207, + ]; foreach ($cek as $key => $value) { $cek[$key] = str_pad(dechex($value), 2, '0', STR_PAD_LEFT); } @@ -129,18 +185,19 @@ public function getAgreementKeyWithA192KeyWrap(): void static::assertTrue(array_key_exists('kty', $header['epk'])); static::assertTrue(array_key_exists('x', $header['epk'])); static::assertTrue(array_key_exists('y', $header['epk'])); - static::assertEquals('P-256', $header['epk']['crv']); - static::assertEquals('EC', $header['epk']['kty']); - static::assertEquals($cek, $ecdh_es->unwrapAgreementKey($private, null, $encrypted_cek, 192, $header)); + static::assertSame('P-256', $header['epk']['crv']); + static::assertSame('EC', $header['epk']['kty']); + static::assertSame($cek, $ecdh_es->unwrapAgreementKey($private, null, $encrypted_cek, 192, $header)); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA256KW */ public function getAgreementKeyWithA256KeyWrap(): void { - $header = ['enc' => 'A256GCM']; + $header = [ + 'enc' => 'A256GCM', + ]; $public = new JWK([ 'kty' => 'EC', @@ -157,7 +214,40 @@ public function getAgreementKeyWithA256KeyWrap(): void 'd' => 'VEmDZpDXXK8p8N0Cndsxs924q6nS1RXFASRl6BfUqdw', ]); - $cek = [4, 211, 31, 197, 84, 157, 252, 254, 11, 100, 157, 250, 63, 170, 106, 206, 107, 124, 212, 45, 111, 107, 9, 219, 200, 177, 0, 240, 143, 156, 44, 207]; + $cek = [ + 4, + 211, + 31, + 197, + 84, + 157, + 252, + 254, + 11, + 100, + 157, + 250, + 63, + 170, + 106, + 206, + 107, + 124, + 212, + 45, + 111, + 107, + 9, + 219, + 200, + 177, + 0, + 240, + 143, + 156, + 44, + 207, + ]; foreach ($cek as $key => $value) { $cek[$key] = str_pad(dechex($value), 2, '0', STR_PAD_LEFT); } @@ -170,14 +260,13 @@ public function getAgreementKeyWithA256KeyWrap(): void static::assertTrue(array_key_exists('kty', $header['epk'])); static::assertTrue(array_key_exists('x', $header['epk'])); static::assertTrue(array_key_exists('y', $header['epk'])); - static::assertEquals('P-256', $header['epk']['crv']); - static::assertEquals('EC', $header['epk']['kty']); - static::assertEquals($cek, $ecdh_es->unwrapAgreementKey($private, null, $encrypted_cek, 256, $header)); + static::assertSame('P-256', $header['epk']['crv']); + static::assertSame('EC', $header['epk']['kty']); + static::assertSame($cek, $ecdh_es->unwrapAgreementKey($private, null, $encrypted_cek, 256, $header)); } /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES */ public function ePKParameterAreMissing(): void { @@ -198,14 +287,15 @@ public function ePKParameterAreMissing(): void /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES */ public function badEPKParameter(): void { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('The header parameter "epk" is not an array of parameters'); - $header = ['epk' => 'foo']; + $header = [ + 'epk' => 'foo', + ]; $sender = new JWK([ 'kty' => 'EC', 'crv' => 'P-256', @@ -220,7 +310,6 @@ public function badEPKParameter(): void /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES */ public function eCKeyHasMissingParameters(): void { @@ -238,7 +327,6 @@ public function eCKeyHasMissingParameters(): void /** * @test - * @covers \Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES */ public function unsupportedCurve(): void { diff --git a/tests/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2_HS_AESKWKeyEncryptionTest.php b/tests/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2_HS_AESKWKeyEncryptionTest.php index bc0ad4fd..cd0686ef 100644 --- a/tests/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2_HS_AESKWKeyEncryptionTest.php +++ b/tests/EncryptionAlgorithm/KeyEncryption/PBES2/PBES2_HS_AESKWKeyEncryptionTest.php @@ -2,34 +2,23 @@ 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\Tests\Component\Encryption\Algorithm\KeyEncryption; -use ParagonIE\ConstantTime\Base64UrlSafe; use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS256A128KW; use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS384A192KW; use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS512A256KW; +use ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; +use const STR_PAD_LEFT; /** * Class PBES2_HS_AESKWKeyEncryptionTest. * - * @group PBES2HSAESKW - * @group unit - * * @internal */ -class PBES2_HS_AESKWKeyEncryptionTest extends TestCase +final class PBES2_HS_AESKWKeyEncryptionTest extends TestCase { /** * @see https://tools.ietf.org/html/rfc7517#appendix-C @@ -47,16 +36,100 @@ public function pBES2HS256A128KW(): void ]; $key = new JWK([ 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded($this->convertArrayToBinString([84, 104, 117, 115, 32, 102, 114, 111, 109, 32, 109, 121, 32, 108, 105, 112, 115, 44, 32, 98, 121, 32, 121, 111, 117, 114, 115, 44, 32, 109, 121, 32, 115, 105, 110, 32, 105, 115, 32, 112, 117, 114, 103, 101, 100, 46])), + 'k' => Base64UrlSafe::encodeUnpadded( + $this->convertArrayToBinString([ + 84, + 104, + 117, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 109, + 121, + 32, + 108, + 105, + 112, + 115, + 44, + 32, + 98, + 121, + 32, + 121, + 111, + 117, + 114, + 115, + 44, + 32, + 109, + 121, + 32, + 115, + 105, + 110, + 32, + 105, + 115, + 32, + 112, + 117, + 114, + 103, + 101, + 100, + 46, + ]) + ), ]); - $expected_cek = $this->convertArrayToBinString([111, 27, 25, 52, 66, 29, 20, 78, 92, 176, 56, 240, 65, 208, 82, 112, 161, 131, 36, 55, 202, 236, 185, 172, 129, 23, 153, 194, 195, 48, 253, 182]); + $expected_cek = $this->convertArrayToBinString( + [ + 111, + 27, + 25, + 52, + 66, + 29, + 20, + 78, + 92, + 176, + 56, + 240, + 65, + 208, + 82, + 112, + 161, + 131, + 36, + 55, + 202, + 236, + 185, + 172, + 129, + 23, + 153, + 194, + 195, + 48, + 253, + 182, + ] + ); $pbes2 = new PBES2HS256A128KW(); $wrapped_cek = Base64UrlSafe::decode('TrqXOwuNUfDV9VPTNbyGvEJ9JMjefAVn-TR1uIxR9p6hsRQh9Tk7BA'); - static::assertEquals($expected_cek, $pbes2->unwrapKey($key, $wrapped_cek, $header)); + static::assertSame($expected_cek, $pbes2->unwrapKey($key, $wrapped_cek, $header)); } /** @@ -71,16 +144,100 @@ public function pBES2HS256A128KWBis(): void ]; $key = new JWK([ 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded($this->convertArrayToBinString([84, 104, 117, 115, 32, 102, 114, 111, 109, 32, 109, 121, 32, 108, 105, 112, 115, 44, 32, 98, 121, 32, 121, 111, 117, 114, 115, 44, 32, 109, 121, 32, 115, 105, 110, 32, 105, 115, 32, 112, 117, 114, 103, 101, 100, 46])), + 'k' => Base64UrlSafe::encodeUnpadded( + $this->convertArrayToBinString([ + 84, + 104, + 117, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 109, + 121, + 32, + 108, + 105, + 112, + 115, + 44, + 32, + 98, + 121, + 32, + 121, + 111, + 117, + 114, + 115, + 44, + 32, + 109, + 121, + 32, + 115, + 105, + 110, + 32, + 105, + 115, + 32, + 112, + 117, + 114, + 103, + 101, + 100, + 46, + ]) + ), ]); - $cek = $this->convertArrayToBinString([111, 27, 25, 52, 66, 29, 20, 78, 92, 176, 56, 240, 65, 208, 82, 112, 161, 131, 36, 55, 202, 236, 185, 172, 129, 23, 153, 194, 195, 48, 253, 182]); + $cek = $this->convertArrayToBinString( + [ + 111, + 27, + 25, + 52, + 66, + 29, + 20, + 78, + 92, + 176, + 56, + 240, + 65, + 208, + 82, + 112, + 161, + 131, + 36, + 55, + 202, + 236, + 185, + 172, + 129, + 23, + 153, + 194, + 195, + 48, + 253, + 182, + ] + ); $pbes2 = new PBES2HS256A128KW(); $encrypted_cek = $pbes2->wrapKey($key, $cek, $header, $header); static::assertTrue(isset($header['p2s'])); - static::assertEquals(4096, $header['p2c']); - static::assertEquals($cek, $pbes2->unwrapKey($key, $encrypted_cek, $header)); + static::assertSame(4096, $header['p2c']); + static::assertSame($cek, $pbes2->unwrapKey($key, $encrypted_cek, $header)); } /** @@ -95,16 +252,100 @@ public function pBES2HS384A192KW(): void ]; $key = new JWK([ 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded($this->convertArrayToBinString([84, 104, 117, 115, 32, 102, 114, 111, 109, 32, 109, 121, 32, 108, 105, 112, 115, 44, 32, 98, 121, 32, 121, 111, 117, 114, 115, 44, 32, 109, 121, 32, 115, 105, 110, 32, 105, 115, 32, 112, 117, 114, 103, 101, 100, 46])), + 'k' => Base64UrlSafe::encodeUnpadded( + $this->convertArrayToBinString([ + 84, + 104, + 117, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 109, + 121, + 32, + 108, + 105, + 112, + 115, + 44, + 32, + 98, + 121, + 32, + 121, + 111, + 117, + 114, + 115, + 44, + 32, + 109, + 121, + 32, + 115, + 105, + 110, + 32, + 105, + 115, + 32, + 112, + 117, + 114, + 103, + 101, + 100, + 46, + ]) + ), ]); - $cek = $this->convertArrayToBinString([111, 27, 25, 52, 66, 29, 20, 78, 92, 176, 56, 240, 65, 208, 82, 112, 161, 131, 36, 55, 202, 236, 185, 172, 129, 23, 153, 194, 195, 48, 253, 182]); + $cek = $this->convertArrayToBinString( + [ + 111, + 27, + 25, + 52, + 66, + 29, + 20, + 78, + 92, + 176, + 56, + 240, + 65, + 208, + 82, + 112, + 161, + 131, + 36, + 55, + 202, + 236, + 185, + 172, + 129, + 23, + 153, + 194, + 195, + 48, + 253, + 182, + ] + ); $pbes2 = new PBES2HS384A192KW(); $encrypted_cek = $pbes2->wrapKey($key, $cek, $header, $header); static::assertTrue(isset($header['p2s'])); - static::assertEquals(4096, $header['p2c']); - static::assertEquals($cek, $pbes2->unwrapKey($key, $encrypted_cek, $header)); + static::assertSame(4096, $header['p2c']); + static::assertSame($cek, $pbes2->unwrapKey($key, $encrypted_cek, $header)); } /** @@ -119,16 +360,100 @@ public function pBES2HS512A256KW(): void ]; $key = new JWK([ 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded($this->convertArrayToBinString([84, 104, 117, 115, 32, 102, 114, 111, 109, 32, 109, 121, 32, 108, 105, 112, 115, 44, 32, 98, 121, 32, 121, 111, 117, 114, 115, 44, 32, 109, 121, 32, 115, 105, 110, 32, 105, 115, 32, 112, 117, 114, 103, 101, 100, 46])), + 'k' => Base64UrlSafe::encodeUnpadded( + $this->convertArrayToBinString([ + 84, + 104, + 117, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 109, + 121, + 32, + 108, + 105, + 112, + 115, + 44, + 32, + 98, + 121, + 32, + 121, + 111, + 117, + 114, + 115, + 44, + 32, + 109, + 121, + 32, + 115, + 105, + 110, + 32, + 105, + 115, + 32, + 112, + 117, + 114, + 103, + 101, + 100, + 46, + ]) + ), ]); - $cek = $this->convertArrayToBinString([111, 27, 25, 52, 66, 29, 20, 78, 92, 176, 56, 240, 65, 208, 82, 112, 161, 131, 36, 55, 202, 236, 185, 172, 129, 23, 153, 194, 195, 48, 253, 182]); + $cek = $this->convertArrayToBinString( + [ + 111, + 27, + 25, + 52, + 66, + 29, + 20, + 78, + 92, + 176, + 56, + 240, + 65, + 208, + 82, + 112, + 161, + 131, + 36, + 55, + 202, + 236, + 185, + 172, + 129, + 23, + 153, + 194, + 195, + 48, + 253, + 182, + ] + ); $pbes2 = new PBES2HS512A256KW(); $encrypted_cek = $pbes2->wrapKey($key, $cek, $header, $header); static::assertTrue(isset($header['p2s'])); - static::assertEquals(4096, $header['p2c']); - static::assertEquals($cek, $pbes2->unwrapKey($key, $encrypted_cek, $header)); + static::assertSame(4096, $header['p2c']); + static::assertSame($cek, $pbes2->unwrapKey($key, $encrypted_cek, $header)); } /** @@ -145,10 +470,94 @@ public function badKeyType(): void ]; $key = new JWK([ 'kty' => 'dir', - 'dir' => Base64UrlSafe::encodeUnpadded($this->convertArrayToBinString([84, 104, 117, 115, 32, 102, 114, 111, 109, 32, 109, 121, 32, 108, 105, 112, 115, 44, 32, 98, 121, 32, 121, 111, 117, 114, 115, 44, 32, 109, 121, 32, 115, 105, 110, 32, 105, 115, 32, 112, 117, 114, 103, 101, 100, 46])), + 'dir' => Base64UrlSafe::encodeUnpadded( + $this->convertArrayToBinString([ + 84, + 104, + 117, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 109, + 121, + 32, + 108, + 105, + 112, + 115, + 44, + 32, + 98, + 121, + 32, + 121, + 111, + 117, + 114, + 115, + 44, + 32, + 109, + 121, + 32, + 115, + 105, + 110, + 32, + 105, + 115, + 32, + 112, + 117, + 114, + 103, + 101, + 100, + 46, + ]) + ), ]); - $cek = $this->convertArrayToBinString([111, 27, 25, 52, 66, 29, 20, 78, 92, 176, 56, 240, 65, 208, 82, 112, 161, 131, 36, 55, 202, 236, 185, 172, 129, 23, 153, 194, 195, 48, 253, 182]); + $cek = $this->convertArrayToBinString( + [ + 111, + 27, + 25, + 52, + 66, + 29, + 20, + 78, + 92, + 176, + 56, + 240, + 65, + 208, + 82, + 112, + 161, + 131, + 36, + 55, + 202, + 236, + 185, + 172, + 129, + 23, + 153, + 194, + 195, + 48, + 253, + 182, + ] + ); $pbes2 = new PBES2HS512A256KW(); $pbes2->wrapKey($key, $cek, $header, $header); @@ -168,10 +577,94 @@ public function invalidKeyType(): void ]; $key = new JWK([ 'kty' => 'oct', - 'dir' => Base64UrlSafe::encodeUnpadded($this->convertArrayToBinString([84, 104, 117, 115, 32, 102, 114, 111, 109, 32, 109, 121, 32, 108, 105, 112, 115, 44, 32, 98, 121, 32, 121, 111, 117, 114, 115, 44, 32, 109, 121, 32, 115, 105, 110, 32, 105, 115, 32, 112, 117, 114, 103, 101, 100, 46])), + 'dir' => Base64UrlSafe::encodeUnpadded( + $this->convertArrayToBinString([ + 84, + 104, + 117, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 109, + 121, + 32, + 108, + 105, + 112, + 115, + 44, + 32, + 98, + 121, + 32, + 121, + 111, + 117, + 114, + 115, + 44, + 32, + 109, + 121, + 32, + 115, + 105, + 110, + 32, + 105, + 115, + 32, + 112, + 117, + 114, + 103, + 101, + 100, + 46, + ]) + ), ]); - $cek = $this->convertArrayToBinString([111, 27, 25, 52, 66, 29, 20, 78, 92, 176, 56, 240, 65, 208, 82, 112, 161, 131, 36, 55, 202, 236, 185, 172, 129, 23, 153, 194, 195, 48, 253, 182]); + $cek = $this->convertArrayToBinString( + [ + 111, + 27, + 25, + 52, + 66, + 29, + 20, + 78, + 92, + 176, + 56, + 240, + 65, + 208, + 82, + 112, + 161, + 131, + 36, + 55, + 202, + 236, + 185, + 172, + 129, + 23, + 153, + 194, + 195, + 48, + 253, + 182, + ] + ); $pbes2 = new PBES2HS512A256KW(); $pbes2->wrapKey($key, $cek, $header, $header); @@ -190,10 +683,94 @@ public function algorithmParameterIsMissing(): void ]; $key = new JWK([ 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded($this->convertArrayToBinString([84, 104, 117, 115, 32, 102, 114, 111, 109, 32, 109, 121, 32, 108, 105, 112, 115, 44, 32, 98, 121, 32, 121, 111, 117, 114, 115, 44, 32, 109, 121, 32, 115, 105, 110, 32, 105, 115, 32, 112, 117, 114, 103, 101, 100, 46])), + 'k' => Base64UrlSafe::encodeUnpadded( + $this->convertArrayToBinString([ + 84, + 104, + 117, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 109, + 121, + 32, + 108, + 105, + 112, + 115, + 44, + 32, + 98, + 121, + 32, + 121, + 111, + 117, + 114, + 115, + 44, + 32, + 109, + 121, + 32, + 115, + 105, + 110, + 32, + 105, + 115, + 32, + 112, + 117, + 114, + 103, + 101, + 100, + 46, + ]) + ), ]); - $cek = $this->convertArrayToBinString([111, 27, 25, 52, 66, 29, 20, 78, 92, 176, 56, 240, 65, 208, 82, 112, 161, 131, 36, 55, 202, 236, 185, 172, 129, 23, 153, 194, 195, 48, 253, 182]); + $cek = $this->convertArrayToBinString( + [ + 111, + 27, + 25, + 52, + 66, + 29, + 20, + 78, + 92, + 176, + 56, + 240, + 65, + 208, + 82, + 112, + 161, + 131, + 36, + 55, + 202, + 236, + 185, + 172, + 129, + 23, + 153, + 194, + 195, + 48, + 253, + 182, + ] + ); $pbes2 = new PBES2HS512A256KW(); $pbes2->wrapKey($key, $cek, $header, $header); @@ -214,7 +791,56 @@ public function p2CParameterIsMissing(): void ]; $key = new JWK([ 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded($this->convertArrayToBinString([84, 104, 117, 115, 32, 102, 114, 111, 109, 32, 109, 121, 32, 108, 105, 112, 115, 44, 32, 98, 121, 32, 121, 111, 117, 114, 115, 44, 32, 109, 121, 32, 115, 105, 110, 32, 105, 115, 32, 112, 117, 114, 103, 101, 100, 46])), + 'k' => Base64UrlSafe::encodeUnpadded( + $this->convertArrayToBinString([ + 84, + 104, + 117, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 109, + 121, + 32, + 108, + 105, + 112, + 115, + 44, + 32, + 98, + 121, + 32, + 121, + 111, + 117, + 114, + 115, + 44, + 32, + 109, + 121, + 32, + 115, + 105, + 110, + 32, + 105, + 115, + 32, + 112, + 117, + 114, + 103, + 101, + 100, + 46, + ]) + ), ]); $pbes2 = new PBES2HS256A128KW(); @@ -239,7 +865,56 @@ public function p2SParameterIsMissing(): void ]; $key = new JWK([ 'kty' => 'oct', - 'k' => Base64UrlSafe::encodeUnpadded($this->convertArrayToBinString([84, 104, 117, 115, 32, 102, 114, 111, 109, 32, 109, 121, 32, 108, 105, 112, 115, 44, 32, 98, 121, 32, 121, 111, 117, 114, 115, 44, 32, 109, 121, 32, 115, 105, 110, 32, 105, 115, 32, 112, 117, 114, 103, 101, 100, 46])), + 'k' => Base64UrlSafe::encodeUnpadded( + $this->convertArrayToBinString([ + 84, + 104, + 117, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 109, + 121, + 32, + 108, + 105, + 112, + 115, + 44, + 32, + 98, + 121, + 32, + 121, + 111, + 117, + 114, + 115, + 44, + 32, + 109, + 121, + 32, + 115, + 105, + 110, + 32, + 105, + 115, + 32, + 112, + 117, + 114, + 103, + 101, + 100, + 46, + ]) + ), ]); $pbes2 = new PBES2HS256A128KW(); diff --git a/tests/SignatureAlgorithm/ECDSA/ECDSAFromRFC6979Test.php b/tests/SignatureAlgorithm/ECDSA/ECDSAFromRFC6979Test.php index 39760198..58367ba2 100644 --- a/tests/SignatureAlgorithm/ECDSA/ECDSAFromRFC6979Test.php +++ b/tests/SignatureAlgorithm/ECDSA/ECDSAFromRFC6979Test.php @@ -2,23 +2,14 @@ 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\Tests\Component\Signature\Algorithm; -use ParagonIE\ConstantTime\Base64UrlSafe; 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 ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; /** @@ -33,11 +24,9 @@ * * Other curves or hash method combinaisons are not used by the Jot specification * - * @group RFC6979 - * * @internal */ -class ECDSAFromRFC6979Test extends TestCase +final class ECDSAFromRFC6979Test extends TestCase { /** * @param string $message @@ -63,9 +52,15 @@ public function dataWithVectors(): array new JWK([ 'kty' => 'EC', 'crv' => 'P-256', - 'd' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721')), - 'x' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6')), - 'y' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299')), + 'd' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin('C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721') + ), + 'x' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin('60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6') + ), + 'y' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin('7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299') + ), ]), sprintf( '%s%s', @@ -79,9 +74,15 @@ public function dataWithVectors(): array new JWK([ 'kty' => 'EC', 'crv' => 'P-256', - 'd' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721')), - 'x' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6')), - 'y' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299')), + 'd' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin('C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721') + ), + 'x' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin('60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6') + ), + 'y' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin('7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299') + ), ]), sprintf( '%s%s', @@ -95,14 +96,30 @@ public function dataWithVectors(): array new JWK([ 'kty' => 'EC', 'crv' => 'P-384', - 'd' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5')), - 'x' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC13')), - 'y' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('8015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720')), + 'd' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + '6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5' + ) + ), + 'x' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + 'EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC13' + ) + ), + 'y' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + '8015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720' + ) + ), ]), sprintf( '%s%s', - $this->convertHexToBin('94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE46'), - $this->convertHexToBin('99EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8') + $this->convertHexToBin( + '94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE46' + ), + $this->convertHexToBin( + '99EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8' + ) ), ], [ @@ -111,14 +128,30 @@ public function dataWithVectors(): array new JWK([ 'kty' => 'EC', 'crv' => 'P-384', - 'd' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5')), - 'x' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC13')), - 'y' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('8015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720')), + 'd' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + '6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5' + ) + ), + 'x' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + 'EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC13' + ) + ), + 'y' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + '8015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720' + ) + ), ]), sprintf( '%s%s', - $this->convertHexToBin('8203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DB'), - $this->convertHexToBin('DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5') + $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). @@ -128,14 +161,30 @@ public function dataWithVectors(): array new JWK([ 'kty' => 'EC', 'crv' => 'P-521', - 'd' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('00FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538')), - 'x' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('01894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD371123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F5023A4')), - 'y' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('00493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A28A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDFCF5')), + 'd' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + '00FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538' + ) + ), + 'x' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + '01894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD371123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F5023A4' + ) + ), + 'y' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + '00493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A28A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDFCF5' + ) + ), ]), sprintf( '%s%s', - $this->convertHexToBin('00C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E377FA'), - $this->convertHexToBin('00617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A67A') + $this->convertHexToBin( + '00C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E377FA' + ), + $this->convertHexToBin( + '00617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A67A' + ) ), ], [ @@ -144,14 +193,30 @@ public function dataWithVectors(): array new JWK([ 'kty' => 'EC', 'crv' => 'P-521', - 'd' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('00FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538')), - 'x' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('01894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD371123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F5023A4')), - 'y' => Base64UrlSafe::encodeUnpadded($this->convertHexToBin('00493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A28A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDFCF5')), + 'd' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + '00FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538' + ) + ), + 'x' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + '01894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD371123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F5023A4' + ) + ), + 'y' => Base64UrlSafe::encodeUnpadded( + $this->convertHexToBin( + '00493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A28A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDFCF5' + ) + ), ]), sprintf( '%s%s', - $this->convertHexToBin('013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47EE6D'), - $this->convertHexToBin('01FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4DCE3') + $this->convertHexToBin( + '013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47EE6D' + ), + $this->convertHexToBin( + '01FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4DCE3' + ) ), ], ]; diff --git a/tests/SignatureAlgorithm/ECDSA/ECDSAFromRFC7520Test.php b/tests/SignatureAlgorithm/ECDSA/ECDSAFromRFC7520Test.php index f6dcd2ec..2cde5db2 100644 --- a/tests/SignatureAlgorithm/ECDSA/ECDSAFromRFC7520Test.php +++ b/tests/SignatureAlgorithm/ECDSA/ECDSAFromRFC7520Test.php @@ -2,15 +2,6 @@ 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\Tests\Component\Signature\Algorithm; use Jose\Component\Core\AlgorithmManager; @@ -18,32 +9,31 @@ use Jose\Component\Signature\Algorithm\ES512; use Jose\Component\Signature\JWSBuilder; use Jose\Component\Signature\JWSVerifier; -use Jose\Component\Signature\Serializer; +use Jose\Component\Signature\Serializer\CompactSerializer; +use Jose\Component\Signature\Serializer\JSONFlattenedSerializer; +use Jose\Component\Signature\Serializer\JSONGeneralSerializer; use PHPUnit\Framework\TestCase; /** * @see https://tools.ietf.org/html/rfc7520#section-4.3 * - * @group RFC7520 - * @group unit - * * @internal */ -class ECDSAFromRFC7520Test extends TestCase +final 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. + * 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 + /** + * 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 */ @@ -58,8 +48,9 @@ public function eS512(): void 'd' => 'AAhRON2r9cqXX1hg-RoI6R1tX5p2rUAYdmpHZoC1XNM56KtscrX6zbKipQrCW9CGZH3T4ubpnoTKLDYJ_fF3_rJt', ]); - /* - * Header + /** + * Header. + * * @see https://tools.ietf.org/html/rfc7520#section-4.3.2 */ $header = [ @@ -67,28 +58,23 @@ public function eS512(): void '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( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new ES512()])); + $jwsVerifier = new JWSVerifier(new AlgorithmManager([new ES512()])); + $compactSerializer = new CompactSerializer(); + $jsonFlattenedSerializer = new JSONFlattenedSerializer(); + $jsonGeneralSerializer = new JSONGeneralSerializer(); $jws = $jwsBuilder - ->create()->withPayload($payload) + ->create() + ->withPayload($payload) ->addSignature($private_key, $header) ->build() ; static::assertTrue($jwsVerifier->verifyWithKey($jws, $private_key, 0)); - /* - * Header + /** + * 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'; diff --git a/tests/SignatureAlgorithm/ECDSA/ECDSASignatureTest.php b/tests/SignatureAlgorithm/ECDSA/ECDSASignatureTest.php index b487cd6d..1888a19a 100644 --- a/tests/SignatureAlgorithm/ECDSA/ECDSASignatureTest.php +++ b/tests/SignatureAlgorithm/ECDSA/ECDSASignatureTest.php @@ -2,36 +2,23 @@ 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\Tests\Component\Signature\Algorithm; -use ParagonIE\ConstantTime\Base64UrlSafe; 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 ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; /** - * @group ECDSA - * @group unit - * * @internal */ -class ECDSASignatureTest extends TestCase +final class ECDSASignatureTest extends TestCase { /** * @test - * @covers \Jose\Component\Signature\Algorithm\ES256 */ public function invalidKey(): void { @@ -49,7 +36,6 @@ public function invalidKey(): void /** * @test - * @covers \Jose\Component\Signature\Algorithm\ES256 */ public function eS256Verify(): void { @@ -73,7 +59,6 @@ public function eS256Verify(): void /** * @test - * @covers \Jose\Component\Signature\Algorithm\ES256 */ public function eS256SignVerify(): void { @@ -95,7 +80,6 @@ public function eS256SignVerify(): void /** * @test - * @covers \Jose\Component\Signature\Algorithm\ES256 */ public function keyNotPrivate(): void { @@ -116,7 +100,6 @@ public function keyNotPrivate(): void /** * @test - * @covers \Jose\Component\Signature\Algorithm\ES384 */ public function eS384SignVerify(): void { @@ -138,7 +121,6 @@ public function eS384SignVerify(): void /** * @test - * @covers \Jose\Component\Signature\Algorithm\ES512 */ public function eS512Verify(): void { @@ -162,7 +144,6 @@ public function eS512Verify(): void /** * @test - * @covers \Jose\Component\Signature\Algorithm\ES512 */ public function eS512SignVerify(): void { @@ -184,7 +165,6 @@ public function eS512SignVerify(): void /** * @test - * @covers \Jose\Component\Signature\Algorithm\ES256 */ public function badSignature(): void { diff --git a/tests/SignatureAlgorithm/EdDSA/EdDSASignatureTest.php b/tests/SignatureAlgorithm/EdDSA/EdDSASignatureTest.php index 07350e8a..1d5727ac 100644 --- a/tests/SignatureAlgorithm/EdDSA/EdDSASignatureTest.php +++ b/tests/SignatureAlgorithm/EdDSA/EdDSASignatureTest.php @@ -2,32 +2,20 @@ 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\Tests\Component\Signature\Algorithm; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\AlgorithmManager; use Jose\Component\Core\JWK; use Jose\Component\Signature\Algorithm\EdDSA; use Jose\Component\Signature\JWSBuilder; use Jose\Component\Signature\JWSVerifier; +use ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; /** - * @group EdDSA - * @group unit - * * @internal */ -class EdDSASignatureTest extends TestCase +final class EdDSASignatureTest extends TestCase { /** * @see https://tools.ietf.org/html/rfc8037#appendix-A.5 @@ -45,7 +33,9 @@ public function edDSAVerifyAlgorithm(): void $eddsa = new EdDSA(); $input = 'eyJhbGciOiJFZERTQSJ9.RXhhbXBsZSBvZiBFZDI1NTE5IHNpZ25pbmc'; - $signature = Base64UrlSafe::decode('hgyY0il_MGCjP0JzlnLWG1PPOt7-09PGcvMg3AIbQR6dWbhijcNR4ki4iylGjg5BhVsPt9g7sVvpAr_MuM0KAg'); + $signature = Base64UrlSafe::decode( + 'hgyY0il_MGCjP0JzlnLWG1PPOt7-09PGcvMg3AIbQR6dWbhijcNR4ki4iylGjg5BhVsPt9g7sVvpAr_MuM0KAg' + ); static::assertTrue($eddsa->verify($key, $input, $signature)); } @@ -64,17 +54,16 @@ public function edDSASignAndVerifyAlgorithm(): void 'x' => '11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo', ]); - $header = ['alg' => 'EdDSA']; + $header = [ + 'alg' => 'EdDSA', + ]; $input = 'Example of Ed25519 signing'; // Corresponds to "RXhhbXBsZSBvZiBFZDI1NTE5IHNpZ25pbmc" - $jwsBuilder = new JWSBuilder( - new AlgorithmManager([new EdDSA()]) - ); - $jwsVerifier = new JWSVerifier( - new AlgorithmManager([new EdDSA()]) - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new EdDSA()])); + $jwsVerifier = new JWSVerifier(new AlgorithmManager([new EdDSA()])); $jws = $jwsBuilder - ->create()->withPayload($input) + ->create() + ->withPayload($input) ->addSignature($key, $header) ->build() ; diff --git a/tests/SignatureAlgorithm/Experimental/ExperimentalHMACSignatureTest.php b/tests/SignatureAlgorithm/Experimental/ExperimentalHMACSignatureTest.php index 8791dfb9..eb51cfc1 100644 --- a/tests/SignatureAlgorithm/Experimental/ExperimentalHMACSignatureTest.php +++ b/tests/SignatureAlgorithm/Experimental/ExperimentalHMACSignatureTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Signature\Algorithm; use Jose\Component\Core\JWK; @@ -19,12 +10,9 @@ use PHPUnit\Framework\TestCase; /** - * @group unit - * @group NewAlgorithm - * * @internal */ -class ExperimentalHMACSignatureTest extends TestCase +final class ExperimentalHMACSignatureTest extends TestCase { /** * @test @@ -35,7 +23,7 @@ public function hS1SignAndVerify(): void $hmac = new HS1(); $data = 'Live long and Prosper.'; - static::assertEquals('HS1', $hmac->name()); + static::assertSame('HS1', $hmac->name()); $signature = $hmac->hash($key, $data); @@ -51,11 +39,11 @@ public function hS256SignAndVerify(): void $hmac = new HS256_64(); $data = 'Live long and Prosper.'; - static::assertEquals('HS256/64', $hmac->name()); + static::assertSame('HS256/64', $hmac->name()); $signature = $hmac->hash($key, $data); - static::assertEquals(hex2bin('89f750759cb8ad93'), $signature); + static::assertSame(hex2bin('89f750759cb8ad93'), $signature); static::assertTrue($hmac->verify($key, $data, $signature)); } diff --git a/tests/SignatureAlgorithm/Experimental/P256KSignatureTest.php b/tests/SignatureAlgorithm/Experimental/P256KSignatureTest.php index e5709ba8..77437481 100644 --- a/tests/SignatureAlgorithm/Experimental/P256KSignatureTest.php +++ b/tests/SignatureAlgorithm/Experimental/P256KSignatureTest.php @@ -2,31 +2,17 @@ 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\Tests\Component\Signature\Algorithm; -use ParagonIE\ConstantTime\Base64UrlSafe; use Jose\Component\Core\JWK; use Jose\Component\Signature\Algorithm\ES256K; +use ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; /** - * @group unit - * @group NewAlgorithm - * - * @covers \Jose\Component\Signature\Algorithm\ES256K - * * @internal */ -class P256KSignatureTest extends TestCase +final class P256KSignatureTest extends TestCase { /** * @test @@ -37,7 +23,11 @@ public function es256KVerify(): void $algorithm = new ES256K(); $data = 'Hello'; - static::assertTrue($algorithm->verify($key, $data, hex2bin('9c75b9d171d9690a37f2474d4bfab5c234911cb150950ea5cbfc9aedda5ec360725cc47978de95b4efb2a3ed617c7b36b1cd0a26b536662a79d0f3ae873a7924'))); + static::assertTrue( + $algorithm->verify($key, $data, hex2bin( + '9c75b9d171d9690a37f2474d4bfab5c234911cb150950ea5cbfc9aedda5ec360725cc47978de95b4efb2a3ed617c7b36b1cd0a26b536662a79d0f3ae873a7924' + )) + ); } /** @@ -49,7 +39,7 @@ public function es256KSignAndVerify(): void $algorithm = new ES256K(); $data = 'Hello'; - static::assertEquals('ES256K', $algorithm->name()); + static::assertSame('ES256K', $algorithm->name()); $signature = $algorithm->sign($key, $data); @@ -61,9 +51,15 @@ private function getKey(): JWK return new JWK([ 'kty' => 'EC', 'crv' => 'secp256k1', - 'd' => Base64UrlSafe::encodeUnpadded(hex2bin('D1592A94BBB9B5D94CDC425FC7DA80B6A47863AE973A9D581FD9D8F29690B659')), - 'x' => Base64UrlSafe::encodeUnpadded(hex2bin('4B4DF318DE05BB8F3A115BF337F9BCBC55CA14B917B46BCB557D3C9A158D4BE0')), - 'y' => Base64UrlSafe::encodeUnpadded(hex2bin('627EB75731A8BBEBC7D9A3C57EC4D7DA2CBA6D2A28E7F45134921861FE1CF5D9')), + 'd' => Base64UrlSafe::encodeUnpadded( + hex2bin('D1592A94BBB9B5D94CDC425FC7DA80B6A47863AE973A9D581FD9D8F29690B659') + ), + 'x' => Base64UrlSafe::encodeUnpadded( + hex2bin('4B4DF318DE05BB8F3A115BF337F9BCBC55CA14B917B46BCB557D3C9A158D4BE0') + ), + 'y' => Base64UrlSafe::encodeUnpadded( + hex2bin('627EB75731A8BBEBC7D9A3C57EC4D7DA2CBA6D2A28E7F45134921861FE1CF5D9') + ), ]); } } diff --git a/tests/SignatureAlgorithm/HMAC/HMACFromRFC7520Test.php b/tests/SignatureAlgorithm/HMAC/HMACFromRFC7520Test.php index d0e767ba..173139ec 100644 --- a/tests/SignatureAlgorithm/HMAC/HMACFromRFC7520Test.php +++ b/tests/SignatureAlgorithm/HMAC/HMACFromRFC7520Test.php @@ -2,15 +2,6 @@ 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\Tests\Component\Signature\Algorithm; use Jose\Component\Core\AlgorithmManager; @@ -18,7 +9,10 @@ use Jose\Component\Signature\Algorithm\HS256; use Jose\Component\Signature\JWSBuilder; use Jose\Component\Signature\JWSVerifier; -use Jose\Component\Signature\Serializer; +use Jose\Component\Signature\Serializer\CompactSerializer; +use Jose\Component\Signature\Serializer\JSONFlattenedSerializer; +use Jose\Component\Signature\Serializer\JSONGeneralSerializer; +use const JSON_THROW_ON_ERROR; use PHPUnit\Framework\TestCase; /** @@ -27,12 +21,9 @@ * @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 +final class HMACFromRFC7520Test extends TestCase { /** * @see https://tools.ietf.org/html/rfc7520#section-4.4 @@ -41,9 +32,9 @@ class HMACFromRFC7520Test extends TestCase */ public function hS256(): void { - /* - * Payload - * Symmetric Key + /** + * Payload Symmetric Key. + * * @see https://tools.ietf.org/html/rfc7520#section-3.5 * @see https://tools.ietf.org/html/rfc7520#section-4.4.1 */ @@ -56,8 +47,9 @@ public function hS256(): void 'k' => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg', ]); - /* - * Header + /** + * Header. + * * @see https://tools.ietf.org/html/rfc7520#section-4.4.2 */ $header = [ @@ -65,37 +57,38 @@ public function hS256(): void '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( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new HS256()])); + $jwsVerifier = new JWSVerifier(new AlgorithmManager([new HS256()])); + $compactSerializer = new CompactSerializer(); + $jsonFlattenedSerializer = new JSONFlattenedSerializer(); + $jsonGeneralSerializer = new JSONGeneralSerializer(); $jws = $jwsBuilder - ->create()->withPayload($payload) + ->create() + ->withPayload($payload) ->addSignature($key, $header) ->build() ; - /* - * Header + /** + * 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)); + static::assertSame($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)); + static::assertEqualsCanonicalizing( + json_decode($expected_flattened_json, true, 512, JSON_THROW_ON_ERROR), + json_decode($jsonFlattenedSerializer->serialize($jws, 0), true, 512, JSON_THROW_ON_ERROR) + ); + static::assertEqualsCanonicalizing( + json_decode($expected_json, true, 512, JSON_THROW_ON_ERROR), + json_decode($jsonGeneralSerializer->serialize($jws, 0), true, 512, JSON_THROW_ON_ERROR) + ); $loaded_compact_json = $compactSerializer->unserialize($expected_compact_json); static::assertTrue($jwsVerifier->verifyWithKey($loaded_compact_json, $key, 0)); @@ -114,9 +107,9 @@ public function hS256(): void */ public function hS256WithDetachedPayload(): void { - /* - * Payload - * Symmetric Key + /** + * Payload Symmetric Key. + * * @see https://tools.ietf.org/html/rfc7520#section-3.5 * @see https://tools.ietf.org/html/rfc7520#section-4.5.1 */ @@ -129,8 +122,9 @@ public function hS256WithDetachedPayload(): void 'k' => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg', ]); - /* - * Header + /** + * Header. + * * @see https://tools.ietf.org/html/rfc7520#section-4.5.2 */ $header = [ @@ -138,38 +132,39 @@ public function hS256WithDetachedPayload(): void '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( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new HS256()])); + $jwsVerifier = new JWSVerifier(new AlgorithmManager([new HS256()])); + $compactSerializer = new CompactSerializer(); + $jsonFlattenedSerializer = new JSONFlattenedSerializer(); + $jsonGeneralSerializer = new JSONGeneralSerializer(); $jws = $jwsBuilder - ->create()->withPayload($payload, true) + ->create() + ->withPayload($payload, true) ->addSignature($key, $header) ->build() ; - /* - * Header + /** + * 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)); + static::assertSame($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::assertEqualsCanonicalizing( + json_decode($expected_flattened_json, true, 512, JSON_THROW_ON_ERROR), + json_decode($jsonFlattenedSerializer->serialize($jws, 0), true, 512, JSON_THROW_ON_ERROR) + ); - static::assertEquals(json_decode($expected_json, true), json_decode($jsonGeneralSerializer->serialize($jws, 0), true)); + static::assertEqualsCanonicalizing( + json_decode($expected_json, true, 512, JSON_THROW_ON_ERROR), + json_decode($jsonGeneralSerializer->serialize($jws, 0), true, 512, JSON_THROW_ON_ERROR) + ); $loaded_compact_json = $compactSerializer->unserialize($expected_compact_json); static::assertTrue($jwsVerifier->verifyWithKey($loaded_compact_json, $key, 0, $payload)); @@ -188,9 +183,9 @@ public function hS256WithDetachedPayload(): void */ public function hS256WithUnprotectedHeader(): void { - /* - * Payload - * Symmetric Key + /** + * Payload Symmetric Key. + * * @see https://tools.ietf.org/html/rfc7520#section-3.5 * @see https://tools.ietf.org/html/rfc7520#section-4.6.1 */ @@ -203,8 +198,9 @@ public function hS256WithUnprotectedHeader(): void 'k' => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg', ]); - /* - * Header + /** + * Header. + * * @see https://tools.ietf.org/html/rfc7520#section-4.6.2 */ $protectedHeader = [ @@ -214,34 +210,35 @@ public function hS256WithUnprotectedHeader(): void '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( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new HS256()])); + $jwsVerifier = new JWSVerifier(new AlgorithmManager([new HS256()])); + new CompactSerializer(); + $jsonFlattenedSerializer = new JSONFlattenedSerializer(); + $jsonGeneralSerializer = new JSONGeneralSerializer(); $jws = $jwsBuilder - ->create()->withPayload($payload) + ->create() + ->withPayload($payload) ->addSignature($key, $protectedHeader, $unprotectedHeader) ->build() ; - /* - * Header + /** + * 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)); + static::assertEqualsCanonicalizing( + json_decode($expected_flattened_json, true, 512, JSON_THROW_ON_ERROR), + json_decode($jsonFlattenedSerializer->serialize($jws, 0), true, 512, JSON_THROW_ON_ERROR) + ); + static::assertEqualsCanonicalizing( + json_decode($expected_json, true, 512, JSON_THROW_ON_ERROR), + json_decode($jsonGeneralSerializer->serialize($jws, 0), true, 512, JSON_THROW_ON_ERROR) + ); $loaded_flattened_json = $jsonFlattenedSerializer->unserialize($expected_flattened_json); static::assertTrue($jwsVerifier->verifyWithKey($loaded_flattened_json, $key, 0)); @@ -257,9 +254,9 @@ public function hS256WithUnprotectedHeader(): void */ public function hS256WithoutProtectedHeader(): void { - /* - * Payload - * Symmetric Key + /** + * Payload Symmetric Key. + * * @see https://tools.ietf.org/html/rfc7520#section-3.5 * @see https://tools.ietf.org/html/rfc7520#section-4.7.1 */ @@ -272,8 +269,9 @@ public function hS256WithoutProtectedHeader(): void 'k' => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg', ]); - /* - * Header + /** + * Header. + * * @see https://tools.ietf.org/html/rfc7520#section-4.7.2 */ $unprotectedHeader = [ @@ -281,32 +279,34 @@ public function hS256WithoutProtectedHeader(): void '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( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new HS256()])); + $jwsVerifier = new JWSVerifier(new AlgorithmManager([new HS256()])); + $jsonFlattenedSerializer = new JSONFlattenedSerializer(); + $jsonGeneralSerializer = new JSONGeneralSerializer(); $jws = $jwsBuilder - ->create()->withPayload($payload) + ->create() + ->withPayload($payload) ->addSignature($key, [], $unprotectedHeader) ->build() ; - /* - * Header + /** + * 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)); + static::assertEqualsCanonicalizing( + json_decode($expected_flattened_json, true), + json_decode($jsonFlattenedSerializer->serialize($jws, 0), true) + ); + static::assertEqualsCanonicalizing( + 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)); diff --git a/tests/SignatureAlgorithm/HMAC/HMACSignatureTest.php b/tests/SignatureAlgorithm/HMAC/HMACSignatureTest.php index 25b690f4..ee35b6d8 100644 --- a/tests/SignatureAlgorithm/HMAC/HMACSignatureTest.php +++ b/tests/SignatureAlgorithm/HMAC/HMACSignatureTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Signature\Algorithm; use InvalidArgumentException; @@ -21,12 +12,9 @@ use PHPUnit\Framework\TestCase; /** - * @group HMAC - * @group unit - * * @internal */ -class HMACSignatureTest extends TestCase +final class HMACSignatureTest extends TestCase { /** * @test @@ -74,7 +62,7 @@ public function hS256SignAndVerify(): void $signature = $hmac->hash($key, $data); - static::assertEquals(hex2bin('7ed268ef179f530a4a1c56225c352a6782cf5379085c484b4f355b6744d6f19d'), $signature); + static::assertSame(hex2bin('7ed268ef179f530a4a1c56225c352a6782cf5379085c484b4f355b6744d6f19d'), $signature); static::assertTrue($hmac->verify($key, $data, $signature)); } @@ -92,7 +80,10 @@ public function hS384SignAndVerify(): void $signature = $hmac->hash($key, $data); - static::assertEquals(hex2bin('903ce2ef2878090d6117f88210d5a822d260fae66760186cb3326770748b9fa47c2d4531a4d5d868f99bcf7ea45c1ab4'), $signature); + static::assertSame( + hex2bin('903ce2ef2878090d6117f88210d5a822d260fae66760186cb3326770748b9fa47c2d4531a4d5d868f99bcf7ea45c1ab4'), + $signature + ); static::assertTrue($hmac->verify($key, $data, $signature)); } @@ -110,7 +101,12 @@ public function hS512SignAndVerify(): void $signature = $hmac->hash($key, $data); - static::assertEquals(hex2bin('e8b36712b6c6dc422eec77f31ce372ccac769450413238158bd702069630456a148d0c10dd3a661a774217fb90b0d5f94fa6c3c985438bade92ff975b9e4dc04'), $signature); + static::assertSame( + hex2bin( + 'e8b36712b6c6dc422eec77f31ce372ccac769450413238158bd702069630456a148d0c10dd3a661a774217fb90b0d5f94fa6c3c985438bade92ff975b9e4dc04' + ), + $signature + ); static::assertTrue($hmac->verify($key, $data, $signature)); } } diff --git a/tests/SignatureAlgorithm/None/NoneSignatureTest.php b/tests/SignatureAlgorithm/None/NoneSignatureTest.php index e1da6a86..5afb4c29 100644 --- a/tests/SignatureAlgorithm/None/NoneSignatureTest.php +++ b/tests/SignatureAlgorithm/None/NoneSignatureTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Signature\Algorithm; use InvalidArgumentException; @@ -23,12 +14,9 @@ use PHPUnit\Framework\TestCase; /** - * @group None - * @group unit - * * @internal */ -class NoneSignatureTest extends TestCase +final class NoneSignatureTest extends TestCase { /** * @test @@ -44,7 +32,7 @@ public function noneSignAndVerifyAlgorithm(): void $signature = $none->sign($key, $data); - static::assertEquals($signature, ''); + static::assertSame($signature, ''); static::assertTrue($none->verify($key, $data, $signature)); } @@ -74,27 +62,27 @@ public function noneSignAndVerifyComplete(): void 'kty' => 'none', ]); - $jwsBuilder = new JWSBuilder( - new AlgorithmManager([new None()]) - ); - $serializer = new CompactSerializer( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new None()])); + $serializer = new CompactSerializer(); $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') - ->addSignature($jwk, ['alg' => 'none']) + ->create() + ->withPayload('Live long and Prosper.') + ->addSignature($jwk, [ + 'alg' => 'none', + ]) ->build() ; - static::assertEquals(1, $jws->countSignatures()); + static::assertSame(1, $jws->countSignatures()); $compact = $serializer->serialize($jws, 0); static::assertTrue(is_string($compact)); $result = $serializer->unserialize($compact); - static::assertEquals('Live long and Prosper.', $result->getPayload()); - static::assertEquals(1, $result->countSignatures()); + static::assertSame('Live long and Prosper.', $result->getPayload()); + static::assertSame(1, $result->countSignatures()); static::assertTrue($result->getSignature(0)->hasProtectedHeaderParameter('alg')); - static::assertEquals('none', $result->getSignature(0)->getProtectedHeaderParameter('alg')); + static::assertSame('none', $result->getSignature(0)->getProtectedHeaderParameter('alg')); } } diff --git a/tests/SignatureAlgorithm/RSA/RSA15SignatureTest.php b/tests/SignatureAlgorithm/RSA/RSA15SignatureTest.php index d00851fb..759c9064 100644 --- a/tests/SignatureAlgorithm/RSA/RSA15SignatureTest.php +++ b/tests/SignatureAlgorithm/RSA/RSA15SignatureTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Signature\Algorithm; use Jose\Component\Core\AlgorithmManager; @@ -18,26 +9,26 @@ use Jose\Component\Signature\Algorithm\RS256; use Jose\Component\Signature\JWSBuilder; use Jose\Component\Signature\JWSVerifier; -use Jose\Component\Signature\Serializer; +use Jose\Component\Signature\Serializer\CompactSerializer; +use Jose\Component\Signature\Serializer\JSONFlattenedSerializer; +use Jose\Component\Signature\Serializer\JSONGeneralSerializer; use PHPUnit\Framework\TestCase; /** * @see https://tools.ietf.org/html/rfc7520#section-4.1 * - * @group RFC7520 - * * @internal */ -class RSA15SignatureTest extends TestCase +final class RSA15SignatureTest extends TestCase { /** * @test */ public function rS256(): void { - /* - * Payload, - * RSA private key + /** + * 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 */ @@ -56,8 +47,9 @@ public function rS256(): void 'qi' => '3PiqvXQN0zwMeE-sBvZgi289XP9XCQF3VWqPzMKnIgQp7_Tugo6-NZBKCQsMf3HaEGBjTVJs_jcK8-TRXvaKe-7ZMaQj8VfBdYkssbu0NKDDhjJ-GtiseaDVWt7dcH0cfwxgFUHpQh7FoCrjFJ6h6ZEpMF6xmujs4qMpPz8aaI4', ]); - /* - * Header + /** + * Header. + * * @see https://tools.ietf.org/html/rfc7520#section-4.1.2 */ $header = [ @@ -65,37 +57,38 @@ public function rS256(): void '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( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new RS256()])); + $jwsVerifier = new JWSVerifier(new AlgorithmManager([new RS256()])); + $compactSerializer = new CompactSerializer(); + $jsonFlattenedSerializer = new JSONFlattenedSerializer(); + $jsonGeneralSerializer = new JSONGeneralSerializer(); $jws = $jwsBuilder - ->create()->withPayload($payload) + ->create() + ->withPayload($payload) ->addSignature($privateKey, $header) ->build() ; - /* - * Header + /** + * 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)); + static::assertSame($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)); + static::assertEqualsCanonicalizing( + json_decode($expected_flattened_json, true), + json_decode($jsonFlattenedSerializer->serialize($jws, 0), true) + ); + static::assertEqualsCanonicalizing( + 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); diff --git a/tests/SignatureAlgorithm/RSA/RSAKeyWithoutAllPrimesTest.php b/tests/SignatureAlgorithm/RSA/RSAKeyWithoutAllPrimesTest.php index 4862bca2..f3355d91 100644 --- a/tests/SignatureAlgorithm/RSA/RSAKeyWithoutAllPrimesTest.php +++ b/tests/SignatureAlgorithm/RSA/RSAKeyWithoutAllPrimesTest.php @@ -2,32 +2,25 @@ 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\Tests\Component\Signature\Algorithm; use Jose\Component\Core\AlgorithmManager; use Jose\Component\Core\JWK; -use Jose\Component\Signature\Algorithm; +use Jose\Component\Signature\Algorithm\PS256; +use Jose\Component\Signature\Algorithm\PS384; +use Jose\Component\Signature\Algorithm\PS512; +use Jose\Component\Signature\Algorithm\RS256; +use Jose\Component\Signature\Algorithm\RS384; +use Jose\Component\Signature\Algorithm\RS512; 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 +final class RSAKeyWithoutAllPrimesTest extends TestCase { /** * @dataProvider dataSignatureAlgorithms @@ -39,19 +32,19 @@ public function signatureAlgorithms(string $signature_algorithm): void $algorithm = new $signature_algorithm(); $key = $this->getPrivateKey(); - $claims = json_encode(['foo' => 'bar']); + $claims = json_encode([ + 'foo' => 'bar', + ]); - $jwsBuilder = new JWSBuilder( - new AlgorithmManager([$algorithm]) - ); - $jwsVerifier = new JWSVerifier( - new AlgorithmManager([$algorithm]) - ); - $serializer = new CompactSerializer( - ); + $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()]) + ->create() + ->withPayload($claims) + ->addSignature($key, [ + 'alg' => $algorithm->name(), + ]) ->build() ; $jws = $serializer->serialize($jws, 0); @@ -63,23 +56,12 @@ public function signatureAlgorithms(string $signature_algorithm): void public function dataSignatureAlgorithms(): array { - return [ - [Algorithm\RS256::class], - [Algorithm\RS384::class], - [Algorithm\RS512::class], - [Algorithm\PS256::class], - [Algorithm\PS384::class], - [Algorithm\PS512::class], - ]; + return [[RS256::class], [RS384::class], [RS512::class], [PS256::class], [PS384::class], [PS512::class]]; } public function dataSignatureAlgorithmsWithSimpleKey(): array { - return [ - [Algorithm\PS256::class], - [Algorithm\PS384::class], - [Algorithm\PS512::class], - ]; + return [[PS256::class], [PS384::class], [PS512::class]]; } private function getPrivateKey(): JWK diff --git a/tests/SignatureAlgorithm/RSA/RSAPSSSignatureTest.php b/tests/SignatureAlgorithm/RSA/RSAPSSSignatureTest.php index 78e3ace1..85622390 100644 --- a/tests/SignatureAlgorithm/RSA/RSAPSSSignatureTest.php +++ b/tests/SignatureAlgorithm/RSA/RSAPSSSignatureTest.php @@ -2,15 +2,6 @@ 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\Tests\Component\Signature\Algorithm; use Jose\Component\Core\AlgorithmManager; @@ -18,31 +9,31 @@ use Jose\Component\Signature\Algorithm\PS384; use Jose\Component\Signature\JWSBuilder; use Jose\Component\Signature\JWSVerifier; -use Jose\Component\Signature\Serializer; +use Jose\Component\Signature\Serializer\CompactSerializer; +use Jose\Component\Signature\Serializer\JSONFlattenedSerializer; +use Jose\Component\Signature\Serializer\JSONGeneralSerializer; use PHPUnit\Framework\TestCase; /** * @see https://tools.ietf.org/html/rfc7520#section-4.2 * - * @group RFC7520 - * * @internal */ -class RSAPSSSignatureTest extends TestCase +final 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. + * 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 + /** + * 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 */ @@ -61,8 +52,9 @@ public function pS384(): void 'qi' => '3PiqvXQN0zwMeE-sBvZgi289XP9XCQF3VWqPzMKnIgQp7_Tugo6-NZBKCQsMf3HaEGBjTVJs_jcK8-TRXvaKe-7ZMaQj8VfBdYkssbu0NKDDhjJ-GtiseaDVWt7dcH0cfwxgFUHpQh7FoCrjFJ6h6ZEpMF6xmujs4qMpPz8aaI4', ]); - /* - * Header + /** + * Header. + * * @see https://tools.ietf.org/html/rfc7520#section-4.2.2 */ $header = [ @@ -70,28 +62,23 @@ public function pS384(): void '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( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new PS384()])); + $jwsVerifier = new JWSVerifier(new AlgorithmManager([new PS384()])); + $compactSerializer = new CompactSerializer(); + $jsonFlattenedSerializer = new JSONFlattenedSerializer(); + $jsonGeneralSerializer = new JSONGeneralSerializer(); $jws = $jwsBuilder - ->create()->withPayload($payload) + ->create() + ->withPayload($payload) ->addSignature($privateKey, $header) ->build() ; $jwsVerifier->verifyWithKey($jws, $privateKey, 0); - /* - * Header + /** + * 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'; diff --git a/tests/SignatureAlgorithm/RSA/RSASignatureTest.php b/tests/SignatureAlgorithm/RSA/RSASignatureTest.php index 07e6a2e3..8d20d3be 100644 --- a/tests/SignatureAlgorithm/RSA/RSASignatureTest.php +++ b/tests/SignatureAlgorithm/RSA/RSASignatureTest.php @@ -2,36 +2,29 @@ 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\Tests\Component\Signature\Algorithm; -use ParagonIE\ConstantTime\Base64UrlSafe; 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\Algorithm\PS256; +use Jose\Component\Signature\Algorithm\PS384; +use Jose\Component\Signature\Algorithm\PS512; +use Jose\Component\Signature\Algorithm\RS256; +use Jose\Component\Signature\Algorithm\RS384; +use Jose\Component\Signature\Algorithm\RS512; use Jose\Component\Signature\JWSBuilder; use Jose\Component\Signature\JWSVerifier; use Jose\Component\Signature\Serializer\CompactSerializer; use Jose\Component\Signature\Serializer\JSONGeneralSerializer; +use ParagonIE\ConstantTime\Base64UrlSafe; use PHPUnit\Framework\TestCase; /** - * @group RSA - * @group unit - * * @internal */ -class RSASignatureTest extends TestCase +final class RSASignatureTest extends TestCase { /** * @test @@ -50,13 +43,11 @@ public function completeRS256Sign(): void 'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os', ]); - $jwsBuilder = new JWSBuilder( - new AlgorithmManager([new Algorithm\RS256()]) - ); - $serializer = new CompactSerializer( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new RS256()])); + $serializer = new CompactSerializer(); $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->addSignature( $key, [ @@ -71,13 +62,16 @@ public function completeRS256Sign(): void ->build() ; - static::assertEquals('eyJhbGciOiJSUzI1NiIsImp3ayI6eyJrdHkiOiJSU0EiLCJuIjoidHBTMVptZlZLVlA1S29mSWhNQlAwdFNXYzRxbGg2Zm0ybHJaU2t1S3hVakVhV2p6WlN6czcyZ0VJR3hyYVd1c01kb1J1VjU0eHNXUnlmNUtlWlQwUy1JNVBybGUzSWRpM2dJQ2lPNE53dk1rNkp3U0JjSld3bVNMRkVLeVVTbkIyQ3RmaUdjMF81clFDcGNFdF9EbjVpTS1CTm43ZnFwb0xJYmtzOHJYS1VJajgtcU1WcWtUWHNFS2VLaW5FMjN0MXlrTWxkc05hYU9ILWh2R3RpNUp0MkRNbkgxSmpvWGREWGZ4dlNQXzBnalVZYjBla3R1ZFlGWG9BNndla21ReUplSW12Z3g0TXl6MUk0aUh0a1lfQ3A3SjRNbjFlalo2SE5teXZvVEVfNE91WTF1Q2VZdjRVeVhGYzFzMXVVeVl0ajR6NTdxc0hHc1M0ZFEzQTJNSnN3IiwiZSI6IkFRQUIifX0.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.QyRlOCcNBMvCEkJRCQA71y2bVX690g0A6wsC2YXf9_VxOYK-g9-xy-1KjghVXkDPe1gDvYSYnL9oWs1PaFKV0_-ijvvJQE6_5pheKTfIVN3Qbkzjxsm4qXTeChBI5MKeBR8z8iWLFT4xPO8NkelwbS2tSUCHrejio6lDDlWhsqSUP8NjHJhqCSZuCDGu3fMMA24cZrYev3tQRc7HHjyi3q_17NZri7feBd7w3NEDkJp7wT_ZclJrYoucHIo1ypaDPJtM-W1-W-lAVREka6Xq4Bg60zdSZ83ODRQTP_IwQrv7hrIcbrRwn1Za_ORZPRPQDP0CMgkb7TkWDZnbPsAzlQ', $serializer->serialize($jws, 0)); + static::assertSame( + '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')); + static::assertSame('Live long and Prosper.', $result->getPayload()); + static::assertSame(1, $result->countSignatures()); + static::assertSame('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg')); } /** @@ -97,13 +91,11 @@ public function completeRS256SignWithDetachedPayload(): void 'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os', ]); - $jwsBuilder = new JWSBuilder( - new AlgorithmManager([new Algorithm\RS256()]) - ); - $serializer = new CompactSerializer( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new RS256()])); + $serializer = new CompactSerializer(); $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.', true) + ->create() + ->withPayload('Live long and Prosper.', true) ->addSignature( $key, [ @@ -118,13 +110,16 @@ public function completeRS256SignWithDetachedPayload(): void ->build() ; - static::assertEquals('eyJhbGciOiJSUzI1NiIsImp3ayI6eyJrdHkiOiJSU0EiLCJuIjoidHBTMVptZlZLVlA1S29mSWhNQlAwdFNXYzRxbGg2Zm0ybHJaU2t1S3hVakVhV2p6WlN6czcyZ0VJR3hyYVd1c01kb1J1VjU0eHNXUnlmNUtlWlQwUy1JNVBybGUzSWRpM2dJQ2lPNE53dk1rNkp3U0JjSld3bVNMRkVLeVVTbkIyQ3RmaUdjMF81clFDcGNFdF9EbjVpTS1CTm43ZnFwb0xJYmtzOHJYS1VJajgtcU1WcWtUWHNFS2VLaW5FMjN0MXlrTWxkc05hYU9ILWh2R3RpNUp0MkRNbkgxSmpvWGREWGZ4dlNQXzBnalVZYjBla3R1ZFlGWG9BNndla21ReUplSW12Z3g0TXl6MUk0aUh0a1lfQ3A3SjRNbjFlalo2SE5teXZvVEVfNE91WTF1Q2VZdjRVeVhGYzFzMXVVeVl0ajR6NTdxc0hHc1M0ZFEzQTJNSnN3IiwiZSI6IkFRQUIifX0..QyRlOCcNBMvCEkJRCQA71y2bVX690g0A6wsC2YXf9_VxOYK-g9-xy-1KjghVXkDPe1gDvYSYnL9oWs1PaFKV0_-ijvvJQE6_5pheKTfIVN3Qbkzjxsm4qXTeChBI5MKeBR8z8iWLFT4xPO8NkelwbS2tSUCHrejio6lDDlWhsqSUP8NjHJhqCSZuCDGu3fMMA24cZrYev3tQRc7HHjyi3q_17NZri7feBd7w3NEDkJp7wT_ZclJrYoucHIo1ypaDPJtM-W1-W-lAVREka6Xq4Bg60zdSZ83ODRQTP_IwQrv7hrIcbrRwn1Za_ORZPRPQDP0CMgkb7TkWDZnbPsAzlQ', $serializer->serialize($jws, 0)); + static::assertSame( + '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')); + static::assertSame(1, $result->countSignatures()); + static::assertSame('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg')); } /** @@ -144,13 +139,11 @@ public function completeRS384Sign(): void 'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os', ]); - $jwsBuilder = new JWSBuilder( - new AlgorithmManager([new Algorithm\RS384()]) - ); - $serializer = new CompactSerializer( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new RS384()])); + $serializer = new CompactSerializer(); $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->addSignature( $key, [ @@ -165,13 +158,16 @@ public function completeRS384Sign(): void ->build() ; - static::assertEquals('eyJhbGciOiJSUzM4NCIsImp3ayI6eyJrdHkiOiJSU0EiLCJuIjoidHBTMVptZlZLVlA1S29mSWhNQlAwdFNXYzRxbGg2Zm0ybHJaU2t1S3hVakVhV2p6WlN6czcyZ0VJR3hyYVd1c01kb1J1VjU0eHNXUnlmNUtlWlQwUy1JNVBybGUzSWRpM2dJQ2lPNE53dk1rNkp3U0JjSld3bVNMRkVLeVVTbkIyQ3RmaUdjMF81clFDcGNFdF9EbjVpTS1CTm43ZnFwb0xJYmtzOHJYS1VJajgtcU1WcWtUWHNFS2VLaW5FMjN0MXlrTWxkc05hYU9ILWh2R3RpNUp0MkRNbkgxSmpvWGREWGZ4dlNQXzBnalVZYjBla3R1ZFlGWG9BNndla21ReUplSW12Z3g0TXl6MUk0aUh0a1lfQ3A3SjRNbjFlalo2SE5teXZvVEVfNE91WTF1Q2VZdjRVeVhGYzFzMXVVeVl0ajR6NTdxc0hHc1M0ZFEzQTJNSnN3IiwiZSI6IkFRQUIifX0.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.gsBhyBOEDPpHBR8OM2Xb5tybKGeijREZN-smEkvI2188pytujFevbDQJ10afbcdjh5LNKO7U_VD3hGPrC7MIkdtJw4c2d0JnVyhiZT5sFnncnCFjll-Y9GkK7a7jWJJTgF_5LmVEeJSFEEgwT1Stxb-TtZCGqc5ExYizLiuQ2IGB6Sq-hTkpWAXJfmHchE_TxV9A4iLWCMTVM6LsLV6NzDtf2a0iu9XvN1MEdzqM7FNdqNCGN43FveTA0hX8OoFfB2ZjYAjbixUCT4VVI2PuuRyu_Lr8cA73eisolBQLQemPyrCo1s560v2tKD7ICS8Teo1PCJ4HnCuO8bvufI2dKA', $serializer->serialize($jws, 0)); + static::assertSame( + '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')); + static::assertSame('Live long and Prosper.', $result->getPayload()); + static::assertSame(1, $result->countSignatures()); + static::assertSame('RS384', $result->getSignature(0)->getProtectedHeaderParameter('alg')); } /** @@ -191,13 +187,11 @@ public function completeRS512Sign(): void 'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os', ]); - $jwsBuilder = new JWSBuilder( - new AlgorithmManager([new Algorithm\RS512()]) - ); - $serializer = new CompactSerializer( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new RS512()])); + $serializer = new CompactSerializer(); $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->addSignature( $key, [ @@ -212,14 +206,17 @@ public function completeRS512Sign(): void ->build() ; - static::assertEquals('eyJhbGciOiJSUzUxMiIsImp3ayI6eyJrdHkiOiJSU0EiLCJuIjoidHBTMVptZlZLVlA1S29mSWhNQlAwdFNXYzRxbGg2Zm0ybHJaU2t1S3hVakVhV2p6WlN6czcyZ0VJR3hyYVd1c01kb1J1VjU0eHNXUnlmNUtlWlQwUy1JNVBybGUzSWRpM2dJQ2lPNE53dk1rNkp3U0JjSld3bVNMRkVLeVVTbkIyQ3RmaUdjMF81clFDcGNFdF9EbjVpTS1CTm43ZnFwb0xJYmtzOHJYS1VJajgtcU1WcWtUWHNFS2VLaW5FMjN0MXlrTWxkc05hYU9ILWh2R3RpNUp0MkRNbkgxSmpvWGREWGZ4dlNQXzBnalVZYjBla3R1ZFlGWG9BNndla21ReUplSW12Z3g0TXl6MUk0aUh0a1lfQ3A3SjRNbjFlalo2SE5teXZvVEVfNE91WTF1Q2VZdjRVeVhGYzFzMXVVeVl0ajR6NTdxc0hHc1M0ZFEzQTJNSnN3IiwiZSI6IkFRQUIifX0.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.OMttEbx9fWoJl4gJwp8m249P87nNENhy5RzH84S1iR8b-upQNy8dqHoIVsQ6qINDjDL5YTl4UWvChIr5AO433LjNUimIeEp2cfiqrszTTwhv-EF3Lp3Ft9NmTb-3ZWvDo1WwwUrD0qro7bynaz5O06DxQfTROcrC6hNX05y6nW_-21exs2_w2OoOWA0Ebx9ev1ayZJh1AQ6q18Ajb0Gk1RST1PFjz0Sk_YiUIYRSVJzgv2Lf7R_Lyi5A5OkIfLOyJmKBi6m0FOLoynq_fT96wCbf5Nkhx-RiuFEcefGhgDav7Wfim3zA3ZAHeNWe58BZOf-8v1kXsV-yd6zQlVa8iw', $serializer->serialize($jws, 0)); + static::assertSame( + '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')); + static::assertSame('Live long and Prosper.', $result->getPayload()); + static::assertSame(1, $result->countSignatures()); + static::assertSame('RS512', $result->getSignature(0)->getProtectedHeaderParameter('alg')); } /** @@ -240,13 +237,11 @@ public function completePS256Sign(): void 'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os', ]); - $jwsBuilder = new JWSBuilder( - new AlgorithmManager([new Algorithm\PS256()]) - ); - $serializer = new CompactSerializer( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new PS256()])); + $serializer = new CompactSerializer(); $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->addSignature( $key, [ @@ -265,9 +260,9 @@ public function completePS256Sign(): void $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')); + static::assertSame('Live long and Prosper.', $result->getPayload()); + static::assertSame(1, $result->countSignatures()); + static::assertSame('PS256', $result->getSignature(0)->getProtectedHeaderParameter('alg')); } /** @@ -287,13 +282,11 @@ public function completePS384Sign(): void 'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os', ]); - $jwsBuilder = new JWSBuilder( - new AlgorithmManager([new Algorithm\PS384()]) - ); - $serializer = new CompactSerializer( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new PS384()])); + $serializer = new CompactSerializer(); $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->addSignature( $key, [ @@ -311,9 +304,9 @@ public function completePS384Sign(): void $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')); + static::assertSame('Live long and Prosper.', $result->getPayload()); + static::assertSame(1, $result->countSignatures()); + static::assertSame('PS384', $result->getSignature(0)->getProtectedHeaderParameter('alg')); } /** @@ -333,13 +326,11 @@ public function completePS512Sign(): void 'qi' => 'BocuCOEOq-oyLDALwzMXU8gOf3IL1Q1_BWwsdoANoh6i179psxgE4JXToWcpXZQQqub8ngwE6uR9fpd3m6N_PL4T55vbDDyjPKmrL2ttC2gOtx9KrpPh-Z7LQRo4BE48nHJJrystKHfFlaH2G7JxHNgMBYVADyttN09qEoav8Os', ]); - $jwsBuilder = new JWSBuilder( - new AlgorithmManager([new Algorithm\PS512()]) - ); - $serializer = new CompactSerializer( - ); + $jwsBuilder = new JWSBuilder(new AlgorithmManager([new PS512()])); + $serializer = new CompactSerializer(); $jws = $jwsBuilder - ->create()->withPayload('Live long and Prosper.') + ->create() + ->withPayload('Live long and Prosper.') ->addSignature( $key, [ @@ -357,9 +348,9 @@ public function completePS512Sign(): void $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')); + static::assertSame('Live long and Prosper.', $result->getPayload()); + static::assertSame(1, $result->countSignatures()); + static::assertSame('PS512', $result->getSignature(0)->getProtectedHeaderParameter('alg')); } /** @@ -369,15 +360,20 @@ public function completePS512Sign(): void */ public function loadJWSJSONSerialization(): void { - $serializer = new JSONGeneralSerializer( + $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"}]}' ); - $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')); + static::assertSame([ + 'iss' => 'joe', + 'exp' => 1300819380, + 'http://example.com/is_root' => true, + ], $claims); + static::assertSame(2, $result->countSignatures()); + static::assertSame('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg')); + static::assertSame('ES256', $result->getSignature(1)->getProtectedHeaderParameter('alg')); } /** @@ -387,17 +383,23 @@ public function loadJWSJSONSerialization(): void */ public function loadJWSJSONSerializationWithDetachedPayload(): void { - $jwsVerifier = new JWSVerifier( - new AlgorithmManager([new Algorithm\RS256()]) + $jwsVerifier = new JWSVerifier(new AlgorithmManager([new 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"}]}' ); - $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, Base64UrlSafe::decode('eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ')); + static::assertSame(2, $result->countSignatures()); + static::assertSame('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg')); + static::assertSame('ES256', $result->getSignature(1)->getProtectedHeaderParameter('alg')); + $jwsVerifier->verifyWithKeySet( + $result, + $this->getPrivateKeySet(), + 0, + Base64UrlSafe::decode( + 'eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ' + ) + ); } /** @@ -407,17 +409,21 @@ public function loadJWSJSONSerializationWithDetachedPayloadAndPayloadInJWS(): vo { $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()]) + $jwsVerifier = new JWSVerifier(new AlgorithmManager([new 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"}]}' ); - $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')); + static::assertSame(2, $result->countSignatures()); + static::assertSame('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg')); - $jwsVerifier->verifyWithKeySet($result, $this->getPrivateKeySet(), 0, 'eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ'); + $jwsVerifier->verifyWithKeySet( + $result, + $this->getPrivateKeySet(), + 0, + 'eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ' + ); } /** @@ -427,9 +433,10 @@ public function loadInvalidInput(): void { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Unsupported input'); - $serializer = new CompactSerializer( + $serializer = new CompactSerializer(); + $serializer->unserialize( + 'DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q' ); - $serializer->unserialize('DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q'); } /** @@ -439,9 +446,10 @@ public function loadInvalidInput2(): void { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Unsupported input'); - $serializer = new CompactSerializer( + $serializer = new CompactSerializer(); + $serializer->unserialize( + 'DtEhU3ljb.Eg8L.38VWAf.UAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q' ); - $serializer->unserialize('DtEhU3ljb.Eg8L.38VWAf.UAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q'); } /** @@ -451,13 +459,18 @@ public function loadInvalidInput2(): void */ public function loadIETFExample1(): void { - $serializer = new CompactSerializer( + $serializer = new CompactSerializer(); + $result = $serializer->unserialize( + 'eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk' ); - $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')); + static::assertSame([ + 'iss' => 'joe', + 'exp' => 1300819380, + 'http://example.com/is_root' => true, + ], json_decode($result->getPayload(), true)); + static::assertSame(1, $result->countSignatures()); + static::assertSame('HS256', $result->getSignature(0)->getProtectedHeaderParameter('alg')); } /** @@ -467,13 +480,18 @@ public function loadIETFExample1(): void */ public function loadIETFExample2(): void { - $serializer = new CompactSerializer( + $serializer = new CompactSerializer(); + $result = $serializer->unserialize( + 'eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw' ); - $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')); + static::assertSame([ + 'iss' => 'joe', + 'exp' => 1300819380, + 'http://example.com/is_root' => true, + ], json_decode($result->getPayload(), true)); + static::assertSame(1, $result->countSignatures()); + static::assertSame('RS256', $result->getSignature(0)->getProtectedHeaderParameter('alg')); } /** @@ -483,13 +501,18 @@ public function loadIETFExample2(): void */ public function loadIETFExample3(): void { - $serializer = new CompactSerializer( + $serializer = new CompactSerializer(); + $result = $serializer->unserialize( + 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q' ); - $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')); + static::assertSame([ + 'iss' => 'joe', + 'exp' => 1300819380, + 'http://example.com/is_root' => true, + ], json_decode($result->getPayload(), true)); + static::assertSame(1, $result->countSignatures()); + static::assertSame('ES256', $result->getSignature(0)->getProtectedHeaderParameter('alg')); } /** @@ -499,100 +522,103 @@ public function loadIETFExample3(): void */ public function loadIETFExample4(): void { - $serializer = new CompactSerializer( + $serializer = new CompactSerializer(); + $result = $serializer->unserialize( + 'eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA.AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn' ); - $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')); + static::assertSame('Payload', $result->getPayload()); + static::assertSame(1, $result->countSignatures()); + static::assertSame('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', + $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); } From de0d401ef1b69d377c0ef689cbd0a9ca11fc0075 Mon Sep 17 00:00:00 2001 From: Spomky Date: Wed, 8 Dec 2021 13:38:31 +0100 Subject: [PATCH 3/4] Update with ECS and Rector --- Makefile | 53 +++++++++++++++++++ ecs.php | 124 ++++++++++++++++++++++++++++++++++++++++++++ infection.json.dist | 24 +++++++++ rector.php | 26 ++++++++++ 4 files changed, 227 insertions(+) create mode 100644 Makefile create mode 100644 ecs.php create mode 100644 infection.json.dist create mode 100644 rector.php diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..494ca61e --- /dev/null +++ b/Makefile @@ -0,0 +1,53 @@ +.PHONY: it +it: coding-standards tests static-analyse performance-tests mutation-tests + +.PHONY: code-coverage +code-coverage: vendor ## Show test coverage rates + vendor/bin/phpunit --coverage-text + +.PHONY: fix-coding-standards +fix-coding-standards: vendor ## Fix all files using defined PHP-CS-FIXER rules + vendor/bin/ecs --fix + +.PHONY: coding-standards +coding-standards: vendor ## Check all files using defined PHP-CS-FIXER rules + vendor/bin/ecs + +.PHONY: mutation-tests +mutation-tests: vendor ## Run mutation tests with minimum MSI and covered MSI enabled + vendor/bin/infection --logger-github -s --threads=$(nproc) --min-msi=80 --min-covered-msi=85 + +.PHONY: tests +tests: vendor ## Run all tests + vendor/bin/phpunit --color + +vendor: composer.json composer.lock + composer validate + composer install + composer normalize + +.PHONY: tu +tu: vendor ## Run all unit tests + vendor/bin/phpunit --color --group Unit + +.PHONY: tf +tf: vendor ## Run all functional tests + vendor/bin/phpunit --color --group Functional + +.PHONY: static-analyse +static-analyse: vendor ## Run static analyse + vendor/bin/phpstan analyse + +.PHONY: performance-tests +performance-tests: vendor ## Run performance test suite + vendor/bin/phpbench run -l dots --report aggregate + +.PHONY: rector +rector: vendor ## Check all files using Rector + vendor/bin/rector process --ansi --dry-run --xdebug + + +.DEFAULT_GOAL := help +help: + @grep -E '(^[a-zA-Z_-]+:.*?##.*$$)|(^##)' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[32m%-30s\033[0m %s\n", $$1, $$2}' | sed -e 's/\[32m##/[33m/' +.PHONY: help \ No newline at end of file diff --git a/ecs.php b/ecs.php new file mode 100644 index 00000000..d489c290 --- /dev/null +++ b/ecs.php @@ -0,0 +1,124 @@ +import(SetList::PSR_12); + $containerConfigurator->import(SetList::PHP_CS_FIXER); + $containerConfigurator->import(SetList::PHP_CS_FIXER_RISKY); + $containerConfigurator->import(SetList::CLEAN_CODE); + $containerConfigurator->import(SetList::SYMFONY); + $containerConfigurator->import(SetList::DOCTRINE_ANNOTATIONS); + $containerConfigurator->import(SetList::SPACES); + $containerConfigurator->import(SetList::PHPUNIT); + $containerConfigurator->import(SetList::SYMPLIFY); + $containerConfigurator->import(SetList::ARRAY); + $containerConfigurator->import(SetList::COMMON); + $containerConfigurator->import(SetList::COMMENTS); + $containerConfigurator->import(SetList::CONTROL_STRUCTURES); + $containerConfigurator->import(SetList::DOCBLOCK); + $containerConfigurator->import(SetList::NAMESPACES); + $containerConfigurator->import(SetList::STRICT); + + $services = $containerConfigurator->services(); + $services->set(StrictParamFixer::class); + $services->set(StrictComparisonFixer::class); + $services->set(ArraySyntaxFixer::class) + ->call('configure', [[ + 'syntax' => 'short', + ]]) + ; + $services->set(ArrayIndentationFixer::class); + $services->set(OrderedImportsFixer::class); + $services->set(ProtectedToPrivateFixer::class); + $services->set(DeclareStrictTypesFixer::class); + $services->set(NativeConstantInvocationFixer::class); + $services->set(NativeFunctionInvocationFixer::class) + ->call('configure', [[ + 'include' => ['@compiler_optimized'], + 'scope' => 'namespaced', + 'strict' => true, + ]]) + ; + $services->set(MbStrFunctionsFixer::class); + $services->set(LinebreakAfterOpeningTagFixer::class); + $services->set(CombineConsecutiveIssetsFixer::class); + $services->set(CombineConsecutiveUnsetsFixer::class); + $services->set(CompactNullableTypehintFixer::class); + $services->set(NoSuperfluousElseifFixer::class); + $services->set(NoSuperfluousPhpdocTagsFixer::class); + $services->set(PhpdocTrimConsecutiveBlankLineSeparationFixer::class); + $services->set(PhpdocOrderFixer::class); + $services->set(SimplifiedNullReturnFixer::class); + $services->set(HeaderCommentFixer::class) + ->call('configure', [[ + 'header' => $header, + ]]) + ; + $services->set(AlignMultilineCommentFixer::class) + ->call('configure', [[ + 'comment_type' => 'all_multiline', + ]]) + ; + $services->set(PhpUnitTestAnnotationFixer::class) + ->call('configure', [[ + 'style' => 'annotation', + ]]) + ; + $services->set(PhpUnitTestCaseStaticMethodCallsFixer::class); + $services->set(GlobalNamespaceImportFixer::class) + ->call('configure', [[ + 'import_classes' => true, + 'import_constants' => true, + 'import_functions' => true, + ]]) + ; + + $services->remove(PhpUnitTestClassRequiresCoversFixer::class); + + $parameters = $containerConfigurator->parameters(); + $parameters + ->set(Option::PARALLEL, true) + ->set(Option::PATHS, [__DIR__]) + ->set(Option::SKIP, [ + __DIR__ . '/src/Kernel.php', + __DIR__ . '/assets', + __DIR__ . '/bin', + __DIR__ . '/config', + __DIR__ . '/heroku', + __DIR__ . '/public', + __DIR__ . '/var', + ]) + ; +}; diff --git a/infection.json.dist b/infection.json.dist new file mode 100644 index 00000000..9568eaf3 --- /dev/null +++ b/infection.json.dist @@ -0,0 +1,24 @@ +{ + "source": { + "directories": [ + "src" + ] + }, + "logs": { + "text": "infection.log" + }, + "mutators": { + "@default": true, + "global-ignoreSourceCodeByRegex": [ + "\\$this->logger.*", + "\\$this->cache->save.*", + "parent::build(\\$container);" + ], + "MBString": { + "settings": { + "mb_substr": false, + "mb_strlen": false + } + } + } +} \ No newline at end of file diff --git a/rector.php b/rector.php new file mode 100644 index 00000000..762ee5bf --- /dev/null +++ b/rector.php @@ -0,0 +1,26 @@ +import(SetList::DEAD_CODE); + $containerConfigurator->import(SetList::PHP_80); + $containerConfigurator->import(SymfonySetList::SYMFONY_52); + $containerConfigurator->import(SymfonySetList::SYMFONY_CODE_QUALITY); + $parameters = $containerConfigurator->parameters(); + $parameters->set(Option::PATHS, [__DIR__ . '/src', __DIR__ . '/tests']); + $parameters->set(Option::PHP_VERSION_FEATURES, PhpVersion::PHP_80); + $parameters->set(Option::AUTO_IMPORT_NAMES, true); + $parameters->set(Option::IMPORT_SHORT_CLASSES, false); + $parameters->set(Option::IMPORT_DOC_BLOCKS, false); + + $services = $containerConfigurator->services(); + $services->set(TypedPropertyRector::class); +}; From 847927a9eaff704e55c62071a8b4bfa344b91938 Mon Sep 17 00:00:00 2001 From: Spomky Date: Wed, 8 Dec 2021 22:08:16 +0100 Subject: [PATCH 4/4] Bugs fixed --- .gitsplit.yml | 2 - composer.json | 2 +- phpstan.neon | 9 +- .../DataCollector/CheckerCollector.php | 2 +- .../DataCollector/JWECollector.php | 2 +- .../DataCollector/JWSCollector.php | 2 +- .../Event/ClaimCheckedFailureEvent.php | 12 +- .../Helper/ConfigurationHelper.php | 4 + .../JoseFramework/Routing/JWKSetLoader.php | 10 +- src/Component/Checker/AlgorithmChecker.php | 2 +- src/Component/Checker/AudienceChecker.php | 6 +- src/Component/Checker/ClaimChecker.php | 2 +- .../Checker/ExpirationTimeChecker.php | 4 +- src/Component/Checker/HeaderChecker.php | 2 +- .../Checker/InvalidClaimException.php | 4 +- .../Checker/InvalidHeaderException.php | 4 +- src/Component/Checker/IssuedAtChecker.php | 4 +- src/Component/Checker/IssuerChecker.php | 6 +- src/Component/Checker/NotBeforeChecker.php | 4 +- .../Checker/UnencodedPayloadChecker.php | 2 +- src/Component/Core/Util/JsonConverter.php | 16 +- src/Component/Encryption/JWE.php | 12 +- .../KeyManagement/Analyzer/RsaAnalyzer.php | 2 +- src/Component/KeyManagement/JWKFactory.php | 5 +- .../KeyConverter/KeyConverter.php | 6 +- src/Component/Signature/JWS.php | 2 +- src/Easy/.github/CONTRIBUTING.md | 4 - src/Easy/.github/FUNDING.yml | 1 - src/Easy/.github/PULL_REQUEST_TEMPLATE.md | 3 - src/Easy/AbstractBuilder.php | 138 --------- src/Easy/AbstractLoader.php | 282 ------------------ src/Easy/AlgorithmProvider.php | 50 ---- src/Easy/Build.php | 18 -- src/Easy/CallableChecker.php | 61 ---- .../ContentEncryptionAlgorithmChecker.php | 51 ---- src/Easy/Decrypt.php | 165 ---------- src/Easy/JWEBuilder.php | 153 ---------- src/Easy/JWSBuilder.php | 59 ---- src/Easy/JWT.php | 18 -- src/Easy/LICENSE | 21 -- src/Easy/Load.php | 18 -- src/Easy/ParameterBag.php | 97 ------ src/Easy/README.md | 15 - src/Easy/Validate.php | 80 ----- src/Easy/composer.json | 42 --- .../KeyEncryption/AESGCMKW/composer.json | 2 +- .../KeyEncryption/AESKW/A128KW.php | 3 +- .../KeyEncryption/AESKW/A192KW.php | 3 +- .../KeyEncryption/AESKW/A256KW.php | 3 +- .../KeyEncryption/AESKW/AESKW.php | 6 +- .../KeyEncryption/AESKW/composer.json | 2 +- .../KeyEncryption/ECDHES/composer.json | 2 +- .../KeyEncryption/RSA/Util/RSACrypt.php | 19 +- .../KeyManagement/UrlKeySetFactoryTest.php | 9 +- tests/Easy/AlgorithmProviderTest.php | 176 ----------- tests/Easy/EncryptionTest.php | 139 --------- tests/Easy/ParameterBagTest.php | 29 -- tests/Easy/SignatureTest.php | 280 ----------------- 58 files changed, 75 insertions(+), 2002 deletions(-) delete mode 100644 src/Easy/.github/CONTRIBUTING.md delete mode 100644 src/Easy/.github/FUNDING.yml delete mode 100644 src/Easy/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 src/Easy/AbstractBuilder.php delete mode 100644 src/Easy/AbstractLoader.php delete mode 100644 src/Easy/AlgorithmProvider.php delete mode 100644 src/Easy/Build.php delete mode 100644 src/Easy/CallableChecker.php delete mode 100644 src/Easy/ContentEncryptionAlgorithmChecker.php delete mode 100644 src/Easy/Decrypt.php delete mode 100644 src/Easy/JWEBuilder.php delete mode 100644 src/Easy/JWSBuilder.php delete mode 100644 src/Easy/JWT.php delete mode 100644 src/Easy/LICENSE delete mode 100644 src/Easy/Load.php delete mode 100644 src/Easy/ParameterBag.php delete mode 100644 src/Easy/README.md delete mode 100644 src/Easy/Validate.php delete mode 100644 src/Easy/composer.json delete mode 100644 tests/Easy/AlgorithmProviderTest.php delete mode 100644 tests/Easy/EncryptionTest.php delete mode 100644 tests/Easy/ParameterBagTest.php delete mode 100644 tests/Easy/SignatureTest.php diff --git a/.gitsplit.yml b/.gitsplit.yml index 29f4cbfc..716a03d8 100644 --- a/.gitsplit.yml +++ b/.gitsplit.yml @@ -51,8 +51,6 @@ splits: target: "https://${GH_TOKEN}@github.com/web-token/encryption-pack.git" - prefix: "packs/signature" target: "https://${GH_TOKEN}@github.com/web-token/signature-pack.git" - - prefix: "src/Easy" - target: "https://${GH_TOKEN}@github.com/web-token/jwt-easy.git" origins: - ^master$ diff --git a/composer.json b/composer.json index eac539c4..61533fb1 100644 --- a/composer.json +++ b/composer.json @@ -69,7 +69,7 @@ "psr/event-dispatcher": "^1.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", - "spomky-labs/aes-key-wrap": "^5.0|^6.0", + "spomky-labs/aes-key-wrap": "^7.0", "symfony/config": "^5.4|^6.0", "symfony/console": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", diff --git a/phpstan.neon b/phpstan.neon index 67788c02..c9c3947c 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,5 +1,5 @@ parameters: - level: 7 + level: max paths: - src checkMissingIterableValueType: false @@ -9,13 +9,6 @@ parameters: - '#Call to an undefined method Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition::children\(\)#' - '#Parameter \#1 \$value of class FG\\ASN1\\Universal\\Integer constructor expects int\, string given\.#' - '#Variable static method call on Jose\\Component\\Core\\Util\\Hash\.#' - - '#Return type \(void\) of method Jose\\Bundle\\JoseFramework\\Routing\\JWKSetLoader::getResolver\(\) should be compatible with return type \(Symfony\\Component\\Config\\Loader\\LoaderResolverInterface\) of method Symfony\\Component\\Config\\Loader\\LoaderInterface::getResolver\(\)#' - - '#Method Jose\\Bundle\\JoseFramework\\Routing\\JWKSetLoader::(supports|load)\(\) has parameter \$type with no typehint specified\.#' - - '#.* should be contravariant with .*#' - - '#Call to deprecated function .*#' - - '#Parameter .* of function openssl_pkey_derive expects resource, string given\.#' - - '#Parameter .* of function call_user_func_array expects callable\(\)\: .* given\.#' - - '#Array .* does not accept object\.#' - '#Invalid type object to throw\.#' - '#Strict comparison using === between .* and .* will always evaluate to false\.#' - '#Binary operation "\^" between string and 1 results in an error\.#' diff --git a/src/Bundle/JoseFramework/DataCollector/CheckerCollector.php b/src/Bundle/JoseFramework/DataCollector/CheckerCollector.php index 3d1432f4..5224292f 100644 --- a/src/Bundle/JoseFramework/DataCollector/CheckerCollector.php +++ b/src/Bundle/JoseFramework/DataCollector/CheckerCollector.php @@ -63,7 +63,7 @@ public function addClaimCheckerManager(string $id, ClaimCheckerManager $claimChe $this->claimCheckerManagers[$id] = $claimCheckerManager; } - public static function getSubscribedEvents() + public static function getSubscribedEvents(): array { return [ HeaderCheckedSuccessEvent::class => ['catchHeaderCheckSuccess'], diff --git a/src/Bundle/JoseFramework/DataCollector/JWECollector.php b/src/Bundle/JoseFramework/DataCollector/JWECollector.php index 1330913d..7fca6770 100644 --- a/src/Bundle/JoseFramework/DataCollector/JWECollector.php +++ b/src/Bundle/JoseFramework/DataCollector/JWECollector.php @@ -75,7 +75,7 @@ public function addJWELoader(string $id, JWELoader $jweLoader): void $this->jweLoaders[$id] = $jweLoader; } - public static function getSubscribedEvents() + public static function getSubscribedEvents(): array { return [ JWEDecryptionSuccessEvent::class => ['catchJweDecryptionSuccess'], diff --git a/src/Bundle/JoseFramework/DataCollector/JWSCollector.php b/src/Bundle/JoseFramework/DataCollector/JWSCollector.php index 7b58bd5b..6e71bda9 100644 --- a/src/Bundle/JoseFramework/DataCollector/JWSCollector.php +++ b/src/Bundle/JoseFramework/DataCollector/JWSCollector.php @@ -72,7 +72,7 @@ public function addJWSLoader(string $id, JWSLoader $jwsLoader): void $this->jwsLoaders[$id] = $jwsLoader; } - public static function getSubscribedEvents() + public static function getSubscribedEvents(): array { return [ JWSVerificationSuccessEvent::class => ['catchJwsVerificationSuccess'], diff --git a/src/Bundle/JoseFramework/Event/ClaimCheckedFailureEvent.php b/src/Bundle/JoseFramework/Event/ClaimCheckedFailureEvent.php index a7dce720..61e1143d 100644 --- a/src/Bundle/JoseFramework/Event/ClaimCheckedFailureEvent.php +++ b/src/Bundle/JoseFramework/Event/ClaimCheckedFailureEvent.php @@ -9,15 +9,9 @@ final class ClaimCheckedFailureEvent extends Event { - /** - * @var array - */ - private $claims; - - /** - * @var array - */ - private $mandatoryClaims; + private array $claims; + + private array $mandatoryClaims; public function __construct( array $claims, diff --git a/src/Bundle/JoseFramework/Helper/ConfigurationHelper.php b/src/Bundle/JoseFramework/Helper/ConfigurationHelper.php index cd5f23ff..67daca9f 100644 --- a/src/Bundle/JoseFramework/Helper/ConfigurationHelper.php +++ b/src/Bundle/JoseFramework/Helper/ConfigurationHelper.php @@ -4,6 +4,7 @@ namespace Jose\Bundle\JoseFramework\Helper; +use function is_array; use Symfony\Component\DependencyInjection\ContainerBuilder; class ConfigurationHelper @@ -458,6 +459,9 @@ public static function addJWEDecrypter( private static function updateJoseConfiguration(ContainerBuilder $container, array $config, string $element): void { $jose_config = current($container->getExtensionConfig(self::BUNDLE_ALIAS)); + if (! is_array($jose_config)) { + $jose_config = []; + } if (! isset($jose_config[$element])) { $jose_config[$element] = []; } diff --git a/src/Bundle/JoseFramework/Routing/JWKSetLoader.php b/src/Bundle/JoseFramework/Routing/JWKSetLoader.php index 8553bc2d..a782cb0c 100644 --- a/src/Bundle/JoseFramework/Routing/JWKSetLoader.php +++ b/src/Bundle/JoseFramework/Routing/JWKSetLoader.php @@ -13,6 +13,8 @@ final class JWKSetLoader implements LoaderInterface { private RouteCollection $routes; + private LoaderResolverInterface $resolver; + public function __construct() { $this->routes = new RouteCollection(); @@ -30,7 +32,7 @@ public function add(string $pattern, string $name): void /** * {@inheritdoc} */ - public function load($resource, $type = null): RouteCollection + public function load(mixed $resource, string $type = null): RouteCollection { return $this->routes; } @@ -38,16 +40,18 @@ public function load($resource, $type = null): RouteCollection /** * {@inheritdoc} */ - public function supports($resource, $type = null): bool + public function supports(mixed $resource, string $type = null): bool { return $type === 'jwkset'; } - public function getResolver(): void + public function getResolver(): LoaderResolverInterface { + return $this->resolver; } public function setResolver(LoaderResolverInterface $resolver): void { + $this->resolver = $resolver; } } diff --git a/src/Component/Checker/AlgorithmChecker.php b/src/Component/Checker/AlgorithmChecker.php index 9ff31c0d..d082db3b 100644 --- a/src/Component/Checker/AlgorithmChecker.php +++ b/src/Component/Checker/AlgorithmChecker.php @@ -27,7 +27,7 @@ public function __construct( /** * {@inheritdoc} */ - public function checkHeader($value): void + public function checkHeader(mixed $value): void { if (! is_string($value)) { throw new InvalidHeaderException('"alg" must be a string.', self::HEADER_NAME, $value); diff --git a/src/Component/Checker/AudienceChecker.php b/src/Component/Checker/AudienceChecker.php index 2469fc7f..6d1a8395 100644 --- a/src/Component/Checker/AudienceChecker.php +++ b/src/Component/Checker/AudienceChecker.php @@ -25,7 +25,7 @@ public function __construct( /** * {@inheritdoc} */ - public function checkClaim($value): void + public function checkClaim(mixed $value): void { $this->checkValue($value, InvalidClaimException::class); } @@ -33,7 +33,7 @@ public function checkClaim($value): void /** * {@inheritdoc} */ - public function checkHeader($value): void + public function checkHeader(mixed $value): void { $this->checkValue($value, InvalidHeaderException::class); } @@ -53,7 +53,7 @@ public function protectedHeaderOnly(): bool return $this->protectedHeader; } - private function checkValue($value, string $class): void + private function checkValue(mixed $value, string $class): void { if (is_string($value) && $value !== $this->audience) { throw new $class('Bad audience.', self::CLAIM_NAME, $value); diff --git a/src/Component/Checker/ClaimChecker.php b/src/Component/Checker/ClaimChecker.php index 8fa596ba..771f6d3f 100644 --- a/src/Component/Checker/ClaimChecker.php +++ b/src/Component/Checker/ClaimChecker.php @@ -10,7 +10,7 @@ interface ClaimChecker * When the token has the applicable claim, the value is checked. If for some reason the value is not valid, an * InvalidClaimException must be thrown. */ - public function checkClaim($value): void; + public function checkClaim(mixed $value): void; /** * The method returns the claim to be checked. diff --git a/src/Component/Checker/ExpirationTimeChecker.php b/src/Component/Checker/ExpirationTimeChecker.php index 4fdf174c..f91060be 100644 --- a/src/Component/Checker/ExpirationTimeChecker.php +++ b/src/Component/Checker/ExpirationTimeChecker.php @@ -23,7 +23,7 @@ public function __construct( /** * {@inheritdoc} */ - public function checkClaim($value): void + public function checkClaim(mixed $value): void { if (! is_float($value) && ! is_int($value)) { throw new InvalidClaimException('"exp" must be an integer.', self::NAME, $value); @@ -38,7 +38,7 @@ public function supportedClaim(): string return self::NAME; } - public function checkHeader($value): void + public function checkHeader(mixed $value): void { if (! is_float($value) && ! is_int($value)) { throw new InvalidHeaderException('"exp" must be an integer.', self::NAME, $value); diff --git a/src/Component/Checker/HeaderChecker.php b/src/Component/Checker/HeaderChecker.php index c7a384e1..0856235b 100644 --- a/src/Component/Checker/HeaderChecker.php +++ b/src/Component/Checker/HeaderChecker.php @@ -10,7 +10,7 @@ interface HeaderChecker * This method is called when the header parameter is present. If for some reason the value is not valid, an * InvalidHeaderException must be thrown. */ - public function checkHeader($value): void; + public function checkHeader(mixed $value): void; /** * The method returns the header parameter to be checked. diff --git a/src/Component/Checker/InvalidClaimException.php b/src/Component/Checker/InvalidClaimException.php index 2c15de89..0a477e40 100644 --- a/src/Component/Checker/InvalidClaimException.php +++ b/src/Component/Checker/InvalidClaimException.php @@ -14,7 +14,7 @@ class InvalidClaimException extends Exception implements ClaimExceptionInterface public function __construct( string $message, private string $claim, - private $value + private mixed $value ) { parent::__construct($message); } @@ -30,7 +30,7 @@ public function getClaim(): string /** * Returns the claim value that caused the exception. */ - public function getValue() + public function getValue(): mixed { return $this->value; } diff --git a/src/Component/Checker/InvalidHeaderException.php b/src/Component/Checker/InvalidHeaderException.php index 200622f5..582c208f 100644 --- a/src/Component/Checker/InvalidHeaderException.php +++ b/src/Component/Checker/InvalidHeaderException.php @@ -14,7 +14,7 @@ class InvalidHeaderException extends Exception public function __construct( string $message, private string $header, - private $value + private mixed $value ) { parent::__construct($message); } @@ -30,7 +30,7 @@ public function getHeader(): string /** * Returns the header parameter value that caused the exception. */ - public function getValue() + public function getValue(): mixed { return $this->value; } diff --git a/src/Component/Checker/IssuedAtChecker.php b/src/Component/Checker/IssuedAtChecker.php index 21d01e21..db84caa7 100644 --- a/src/Component/Checker/IssuedAtChecker.php +++ b/src/Component/Checker/IssuedAtChecker.php @@ -23,7 +23,7 @@ public function __construct( /** * {@inheritdoc} */ - public function checkClaim($value): void + public function checkClaim(mixed $value): void { if (! is_float($value) && ! is_int($value)) { throw new InvalidClaimException('"iat" must be an integer.', self::NAME, $value); @@ -38,7 +38,7 @@ public function supportedClaim(): string return self::NAME; } - public function checkHeader($value): void + public function checkHeader(mixed $value): void { if (! is_float($value) && ! is_int($value)) { throw new InvalidHeaderException('The header "iat" must be an integer.', self::NAME, $value); diff --git a/src/Component/Checker/IssuerChecker.php b/src/Component/Checker/IssuerChecker.php index 40789ef9..2cb50417 100644 --- a/src/Component/Checker/IssuerChecker.php +++ b/src/Component/Checker/IssuerChecker.php @@ -21,12 +21,12 @@ public function __construct( ) { } - public function checkClaim($value): void + public function checkClaim(mixed $value): void { $this->checkValue($value, InvalidClaimException::class); } - public function checkHeader($value): void + public function checkHeader(mixed $value): void { $this->checkValue($value, InvalidHeaderException::class); } @@ -46,7 +46,7 @@ public function protectedHeaderOnly(): bool return $this->protectedHeader; } - private function checkValue($value, string $class): void + private function checkValue(mixed $value, string $class): void { if (! is_string($value)) { throw new $class('Invalid value.', self::CLAIM_NAME, $value); diff --git a/src/Component/Checker/NotBeforeChecker.php b/src/Component/Checker/NotBeforeChecker.php index 7f9c9f57..11e092b0 100644 --- a/src/Component/Checker/NotBeforeChecker.php +++ b/src/Component/Checker/NotBeforeChecker.php @@ -23,7 +23,7 @@ public function __construct( /** * {@inheritdoc} */ - public function checkClaim($value): void + public function checkClaim(mixed $value): void { if (! is_float($value) && ! is_int($value)) { throw new InvalidClaimException('"nbf" must be an integer.', self::NAME, $value); @@ -38,7 +38,7 @@ public function supportedClaim(): string return self::NAME; } - public function checkHeader($value): void + public function checkHeader(mixed $value): void { if (! is_float($value) && ! is_int($value)) { throw new InvalidHeaderException('"nbf" must be an integer.', self::NAME, $value); diff --git a/src/Component/Checker/UnencodedPayloadChecker.php b/src/Component/Checker/UnencodedPayloadChecker.php index fd351053..0a94c37c 100644 --- a/src/Component/Checker/UnencodedPayloadChecker.php +++ b/src/Component/Checker/UnencodedPayloadChecker.php @@ -18,7 +18,7 @@ final class UnencodedPayloadChecker implements HeaderChecker /** * {@inheritdoc} */ - public function checkHeader($value): void + public function checkHeader(mixed $value): void { if (! is_bool($value)) { throw new InvalidHeaderException('"b64" must be a boolean.', self::HEADER_NAME, $value); diff --git a/src/Component/Core/Util/JsonConverter.php b/src/Component/Core/Util/JsonConverter.php index 2b7013f0..a401ebac 100644 --- a/src/Component/Core/Util/JsonConverter.php +++ b/src/Component/Core/Util/JsonConverter.php @@ -4,8 +4,7 @@ namespace Jose\Component\Core\Util; -use InvalidArgumentException; -use function is_string; +use const JSON_THROW_ON_ERROR; use const JSON_UNESCAPED_SLASHES; use const JSON_UNESCAPED_UNICODE; use RuntimeException; @@ -13,22 +12,17 @@ final class JsonConverter { - public static function encode($payload): string + public static function encode(mixed $payload): string { try { - $data = json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - if (! is_string($data)) { - throw new InvalidArgumentException('Unable to encode the data'); - } - - return $data; + return json_encode($payload, JSON_THROW_ON_ERROR | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } catch (Throwable $throwable) { throw new RuntimeException('Invalid content.', $throwable->getCode(), $throwable); } } - public static function decode(string $payload) + public static function decode(string $payload): mixed { - return json_decode($payload, true, 512, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + return json_decode($payload, true, 512, JSON_THROW_ON_ERROR | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } } diff --git a/src/Component/Encryption/JWE.php b/src/Component/Encryption/JWE.php index 5b3afb15..33d041f1 100644 --- a/src/Component/Encryption/JWE.php +++ b/src/Component/Encryption/JWE.php @@ -14,17 +14,11 @@ class JWE implements JWT /** * @var Recipient[] */ - private $recipients = []; + private array $recipients = []; - /** - * @var array - */ - private $sharedHeader = []; + private array $sharedHeader = []; - /** - * @var array - */ - private $sharedProtectedHeader = []; + private array $sharedProtectedHeader = []; private ?string $payload = null; diff --git a/src/Component/KeyManagement/Analyzer/RsaAnalyzer.php b/src/Component/KeyManagement/Analyzer/RsaAnalyzer.php index 16dadd98..3f68b64c 100644 --- a/src/Component/KeyManagement/Analyzer/RsaAnalyzer.php +++ b/src/Component/KeyManagement/Analyzer/RsaAnalyzer.php @@ -40,7 +40,7 @@ private function checkModulus(JWK $jwk, MessageBag $bag): void } if ($jwk->has('d') && (! $jwk->has('p') || ! $jwk->has('q') || ! $jwk->has('dp') || ! $jwk->has( 'dq' - ) || ! $jwk->has('p') || ! $jwk->has('qi'))) { + ) || ! $jwk->has('qi'))) { $bag->add( Message::medium( 'The key is a private RSA key, but Chinese Remainder Theorem primes are missing. These primes are not mandatory, but signatures and decryption processes are faster when available.' diff --git a/src/Component/KeyManagement/JWKFactory.php b/src/Component/KeyManagement/JWKFactory.php index e350b1e0..c00159ac 100644 --- a/src/Component/KeyManagement/JWKFactory.php +++ b/src/Component/KeyManagement/JWKFactory.php @@ -15,6 +15,7 @@ use Jose\Component\KeyManagement\KeyConverter\KeyConverter; use Jose\Component\KeyManagement\KeyConverter\RSAKey; use const OPENSSL_KEYTYPE_RSA; +use OpenSSLCertificate; use ParagonIE\ConstantTime\Base64UrlSafe; use RuntimeException; use Throwable; @@ -246,10 +247,8 @@ public static function createFromCertificate(string $certificate, array $additio /** * This method will try to convert a X.509 certificate resource into a public key. - * - * @param resource $res */ - public static function createFromX509Resource($res, array $additional_values = []): JWK + public static function createFromX509Resource(OpenSSLCertificate $res, array $additional_values = []): JWK { $values = KeyConverter::loadKeyFromX509Resource($res); $values = array_merge($values, $additional_values); diff --git a/src/Component/KeyManagement/KeyConverter/KeyConverter.php b/src/Component/KeyManagement/KeyConverter/KeyConverter.php index a23d7b8f..d18185fa 100644 --- a/src/Component/KeyManagement/KeyConverter/KeyConverter.php +++ b/src/Component/KeyManagement/KeyConverter/KeyConverter.php @@ -13,6 +13,7 @@ use const OPENSSL_KEYTYPE_EC; use const OPENSSL_KEYTYPE_RSA; use const OPENSSL_RAW_DATA; +use OpenSSLCertificate; use ParagonIE\ConstantTime\Base64UrlSafe; use const PHP_EOL; use const PREG_PATTERN_ORDER; @@ -59,10 +60,7 @@ public static function loadKeyFromCertificate(string $certificate): array return self::loadKeyFromX509Resource($res); } - /** - * @param resource $res - */ - public static function loadKeyFromX509Resource($res): array + public static function loadKeyFromX509Resource(OpenSSLCertificate $res): array { if (! extension_loaded('openssl')) { throw new RuntimeException('Please install the OpenSSL extension'); diff --git a/src/Component/Signature/JWS.php b/src/Component/Signature/JWS.php index 60bafc62..beeb30ab 100644 --- a/src/Component/Signature/JWS.php +++ b/src/Component/Signature/JWS.php @@ -13,7 +13,7 @@ class JWS implements JWT /** * @var Signature[] */ - private $signatures = []; + private array $signatures = []; public function __construct( private ?string $payload, diff --git a/src/Easy/.github/CONTRIBUTING.md b/src/Easy/.github/CONTRIBUTING.md deleted file mode 100644 index fc360e5d..00000000 --- a/src/Easy/.github/CONTRIBUTING.md +++ /dev/null @@ -1,4 +0,0 @@ -# Contributing - -This repository is a sub repository of [the JWT Framework](https://github.com/web-token/jwt-framework) project and is READ ONLY. -Please do not submit any Pull Requests here. It will be automatically closed. diff --git a/src/Easy/.github/FUNDING.yml b/src/Easy/.github/FUNDING.yml deleted file mode 100644 index 7e2ca0e7..00000000 --- a/src/Easy/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -patreon: FlorentMorselli diff --git a/src/Easy/.github/PULL_REQUEST_TEMPLATE.md b/src/Easy/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index d4ff96cb..00000000 --- a/src/Easy/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,3 +0,0 @@ -Please do not submit any Pull Requests here. It will be automatically closed. - -You should submit it here: https://github.com/web-token/jwt-framework/pulls diff --git a/src/Easy/AbstractBuilder.php b/src/Easy/AbstractBuilder.php deleted file mode 100644 index f8edb771..00000000 --- a/src/Easy/AbstractBuilder.php +++ /dev/null @@ -1,138 +0,0 @@ -jwt = new JWT(); - $this->algorithms = (new AlgorithmProvider($this->getAlgorithmMap())) - ->getAvailableAlgorithms() - ; - } - - public function payload(array $payload): self - { - $clone = clone $this; - $clone->jwt->claims->replace($payload); - - return $clone; - } - - public function iss(string $iss, bool $inHeader = false): self - { - return $this->claim('iss', $iss, $inHeader); - } - - public function sub(string $sub, bool $inHeader = false): self - { - return $this->claim('sub', $sub, $inHeader); - } - - public function aud(string $aud, bool $inHeader = false): self - { - $audience = $this->jwt->claims->has('aud') ? $this->jwt->claims->get('aud') : []; - $audience[] = $aud; - - return $this->claim('aud', $audience, $inHeader); - } - - public function jti(string $jti, bool $inHeader = false): self - { - return $this->claim('jti', $jti, $inHeader); - } - - public function exp(int $exp, bool $inHeader = false): self - { - return $this->claim('exp', $exp, $inHeader); - } - - public function iat(?int $iat = null, bool $inHeader = false): self - { - $iat = $iat ?? time(); - - return $this->claim('iat', $iat, $inHeader); - } - - public function nbf(?int $nbf = null, bool $inHeader = false): self - { - $nbf = $nbf ?? time(); - - return $this->claim('nbf', $nbf, $inHeader); - } - - public function alg(JoseAlgorithm|string $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.' - ); - } - - return $clone; - } - - public function cty(string $cty): self - { - return $this->header('cty', $cty); - } - - public function typ(string $typ): self - { - return $this->header('typ', $typ); - } - - public function crit(array $crit): self - { - return $this->header('crit', $crit); - } - - public function claim(string $key, $value, bool $inHeader = false): self - { - $clone = clone $this; - $clone->jwt->claims->set($key, $value); - if ($inHeader) { - $clone->jwt->header->set($key, $value); - } - - return $clone; - } - - public function header(string $key, $value): self - { - $clone = clone $this; - $clone->jwt->header->set($key, $value); - - return $clone; - } - - abstract protected function getAlgorithmMap(): array; -} diff --git a/src/Easy/AbstractLoader.php b/src/Easy/AbstractLoader.php deleted file mode 100644 index eb933409..00000000 --- a/src/Easy/AbstractLoader.php +++ /dev/null @@ -1,282 +0,0 @@ -jwkset = new JWKSet([]); - $this->claimCheckers = []; - - $this->algorithms = (new AlgorithmProvider($this->getAlgorithmMap())) - ->getAvailableAlgorithms() - ; - } - - /** - * @param string[] $mandatoryClaims - */ - public function mandatory(array $mandatoryClaims): self - { - $clone = clone $this; - $clone->mandatoryClaims = $mandatoryClaims; - - return $clone; - } - - public function aud(string $aud, bool $inHeader = false): self - { - return $this->claim('aud', new AudienceChecker($aud, true), $inHeader); - } - - public function iss(string $iss, bool $inHeader = false): self - { - return $this->claim('iss', new IssuerChecker([$iss], true), $inHeader); - } - - public function jti(string $jti, bool $inHeader = false): self - { - return $this->claim('jti', $jti, $inHeader); - } - - public function sub(string $sub, bool $inHeader = false): self - { - return $this->claim('sub', $sub, $inHeader); - } - - /** - * @param array|callable|Checker\ClaimChecker|mixed|null $checker - */ - public function claim(string $key, $checker, bool $inHeader = false): self - { - $clone = clone $this; - if ($checker === false) { - unset($clone->claimCheckers[$key]); - - return $clone; - } - - switch (true) { - case $checker instanceof 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): bool { - return in_array($value, $checker, true); - }); - - break; - - default: - $checker = new CallableChecker($key, static function ($value) use ($checker): bool { - return $value === $checker; - }); - } - - $clone->claimCheckers[$key] = $checker; - if ($inHeader) { - return $clone->header($key, $checker); - } - - return $clone; - } - - public function exp(int|false $leeway = 0, bool $inHeader = false): self - { - if ($leeway === false) { - $clone = clone $this; - unset($clone->claimCheckers['exp']); - - return $clone; - } - if (! is_int($leeway) || $leeway < 0) { - throw new InvalidArgumentException( - 'First parameter for "exp" claim is invalid. Set false to disable or a positive integer.' - ); - } - - return $this->claim('exp', new ExpirationTimeChecker($leeway), $inHeader); - } - - public function nbf(int|false $leeway = 0, bool $inHeader = false): self - { - if ($leeway === false) { - $clone = clone $this; - unset($clone->claimCheckers['nbf']); - - return $clone; - } - if (! is_int($leeway) || $leeway < 0) { - throw new InvalidArgumentException( - 'First parameter for "nbf" claim is invalid. Set false to disable or a positive integer.' - ); - } - - return $this->claim('nbf', new NotBeforeChecker($leeway, true), $inHeader); - } - - public function iat(int|false $leeway = 0, bool $inHeader = false): self - { - if ($leeway === false) { - $clone = clone $this; - unset($clone->claimCheckers['iat']); - - return $clone; - } - if (! is_int($leeway) || $leeway < 0) { - throw new InvalidArgumentException( - 'First parameter for "iat" claim is invalid. Set false to disable or a positive integer.' - ); - } - - return $this->claim('iat', new IssuedAtChecker($leeway, true), $inHeader); - } - - public function alg(Algorithm|string $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.' - ); - } - } - - /** - * @param Algorithm[]|string[] $algs - */ - public function algs($algs): self - { - $clone = clone $this; - foreach ($algs as $alg) { - $clone = $clone->alg($alg); - } - - return $clone; - } - - /** - * @param array|callable|Checker\HeaderChecker|false|mixed $checker - */ - public function header(string $key, $checker): self - { - $clone = clone $this; - if ($checker === false) { - unset($clone->headerCheckers[$key]); - - return $clone; - } - - switch (true) { - case $checker instanceof 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): bool { - return in_array($value, $checker, true); - }); - - break; - - default: - $checker = new CallableChecker($key, static function ($value) use ($checker): bool { - return $value === $checker; - }); - } - - $clone->headerCheckers[$key] = $checker; - - return $clone; - } - - public function key(JWK $jwk): self - { - $clone = clone $this; - $jwkset = $this->jwkset->with($jwk); - $clone->jwkset = $jwkset; - - return $clone; - } - - public function keyset(JWKSet $jwkset): self - { - $clone = clone $this; - $clone->jwkset = $jwkset; - - return $clone; - } - - abstract protected function getAlgorithmMap(): array; -} diff --git a/src/Easy/AlgorithmProvider.php b/src/Easy/AlgorithmProvider.php deleted file mode 100644 index 29235123..00000000 --- a/src/Easy/AlgorithmProvider.php +++ /dev/null @@ -1,50 +0,0 @@ -algorithmClasses = $algorithmClasses; - foreach ($algorithmClasses as $algorithmClass) { - $this->addClass($algorithmClass); - } - } - - public function getAlgorithmClasses(): array - { - return $this->algorithmClasses; - } - - public function getAvailableAlgorithms(): array - { - return $this->algorithms; - } - - private function addClass(string $algorithmClass): void - { - if (class_exists($algorithmClass)) { - try { - $this->algorithms[] = new $algorithmClass(); - } catch (Throwable) { - //does nothing - } - } - } -} diff --git a/src/Easy/Build.php b/src/Easy/Build.php deleted file mode 100644 index 2f6b7074..00000000 --- a/src/Easy/Build.php +++ /dev/null @@ -1,18 +0,0 @@ -callable = $callable; - } - - public function checkClaim($value): void - { - $callable = $this->callable; - $isValid = $callable($value); - if (! $isValid) { - throw new InvalidClaimException(sprintf('Invalid claim "%s"', $this->key), $this->key, $value); - } - } - - public function supportedClaim(): string - { - return $this->key; - } - - /** - * {@inheritdoc} - */ - public function checkHeader($value): void - { - $callable = $this->callable; - $isValid = $callable($value); - if (! $isValid) { - throw new InvalidHeaderException(sprintf('Invalid header "%s"', $this->key), $this->key, $value); - } - } - - public function supportedHeader(): string - { - return $this->key; - } - - public function protectedHeaderOnly(): bool - { - return true; - } -} diff --git a/src/Easy/ContentEncryptionAlgorithmChecker.php b/src/Easy/ContentEncryptionAlgorithmChecker.php deleted file mode 100644 index 0bf6c5f6..00000000 --- a/src/Easy/ContentEncryptionAlgorithmChecker.php +++ /dev/null @@ -1,51 +0,0 @@ -supportedAlgorithms, true)) { - throw new InvalidHeaderException('Unsupported algorithm.', self::HEADER_NAME, $value); - } - } - - public function supportedHeader(): string - { - return self::HEADER_NAME; - } - - public function protectedHeaderOnly(): bool - { - return $this->protectedHeader; - } -} diff --git a/src/Easy/Decrypt.php b/src/Easy/Decrypt.php deleted file mode 100644 index 7a36a3c4..00000000 --- a/src/Easy/Decrypt.php +++ /dev/null @@ -1,165 +0,0 @@ -compressionMethods = [new Deflate()]; - } - - public static function token(string $token): self - { - return new self($token); - } - - public function enc(Algorithm|string $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.' - ); - } - } - - /** - * @param Algorithm[]|string[] $encs - */ - public function encs($encs): self - { - $clone = clone $this; - foreach ($encs as $enc) { - $clone = $clone->enc($enc); - } - - return $clone; - } - - public function run(): JWT - { - if (count($this->allowedAlgorithms) !== 0) { - $this->headerCheckers[] = new AlgorithmChecker($this->allowedAlgorithms, true); - } - if (count($this->allowedContentEncryptionAlgorithms) !== 0) { - $this->headerCheckers[] = new ContentEncryptionAlgorithmChecker( - $this->allowedContentEncryptionAlgorithms, - true - ); - } - $jwe = (new CompactSerializer())->unserialize($this->token); - $headerChecker = new HeaderCheckerManager($this->headerCheckers, [new JWETokenSupport()]); - $headerChecker->check($jwe, 0); - - $verifier = new JWEDecrypter( - new AlgorithmManager($this->algorithms), - new AlgorithmManager($this->algorithms), - new CompressionMethodManager($this->compressionMethods) - ); - $verifier->decryptUsingKeySet($jwe, $this->jwkset, 0); - - $jwt = new JWT(); - $jwt->header->replace($jwe->getSharedProtectedHeader()); - $jwt->claims->replace(JsonConverter::decode($jwe->getPayload())); - - $claimChecker = new ClaimCheckerManager($this->claimCheckers); - $claimChecker->check($jwt->claims->all(), $this->mandatoryClaims); - - return $jwt; - } - - protected function getAlgorithmMap(): array - { - return [ - A128GCMKW::class, - A192GCMKW::class, - A256GCMKW::class, - A128KW::class, - A192KW::class, - A256KW::class, - Dir::class, - ECDHES::class, - ECDHESA128KW::class, - ECDHESA192KW::class, - ECDHESA256KW::class, - PBES2HS256A128KW::class, - PBES2HS384A192KW::class, - PBES2HS512A256KW::class, - RSA15::class, - RSAOAEP::class, - RSAOAEP256::class, - A128GCM::class, - A192GCM::class, - A256GCM::class, - A128CBCHS256::class, - A192CBCHS384::class, - A256CBCHS512::class, - ]; - } -} diff --git a/src/Easy/JWEBuilder.php b/src/Easy/JWEBuilder.php deleted file mode 100644 index 24aa8079..00000000 --- a/src/Easy/JWEBuilder.php +++ /dev/null @@ -1,153 +0,0 @@ -compressionMethods = [new Deflate()]; - } - - public function enc(Algorithm|string $enc): self - { - $clone = clone $this; - - switch (true) { - case $enc instanceof Algorithm: - $clone->contentEncryptionAlgorithms[] = $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'); - } - - return $clone; - } - - public function zip(CompressionMethod|string $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'); - } - - return $clone; - } - - public function encrypt(JWK $jwk): string - { - $builder = new JoseBuilder( - new AlgorithmManager($this->algorithms), - new AlgorithmManager($this->contentEncryptionAlgorithms), - new CompressionMethodManager($this->compressionMethods) - ); - $jwe = $builder - ->create() - ->withPayload(JsonConverter::encode($this->jwt->claims->all())) - ->withSharedProtectedHeader($this->jwt->header->all()) - ->addRecipient($jwk) - ->build() - ; - - return (new CompactSerializer())->serialize($jwe); - } - - protected function getAlgorithmMap(): array - { - return [ - A128GCMKW::class, - A192GCMKW::class, - A256GCMKW::class, - A128KW::class, - A192KW::class, - A256KW::class, - Dir::class, - ECDHES::class, - ECDHESA128KW::class, - ECDHESA192KW::class, - ECDHESA256KW::class, - PBES2HS256A128KW::class, - PBES2HS384A192KW::class, - PBES2HS512A256KW::class, - RSA15::class, - RSAOAEP::class, - RSAOAEP256::class, - A128GCM::class, - A192GCM::class, - A256GCM::class, - A128CBCHS256::class, - A192CBCHS384::class, - A256CBCHS512::class, - ]; - } -} diff --git a/src/Easy/JWSBuilder.php b/src/Easy/JWSBuilder.php deleted file mode 100644 index 891a5277..00000000 --- a/src/Easy/JWSBuilder.php +++ /dev/null @@ -1,59 +0,0 @@ -algorithms)); - $jws = $builder - ->create() - ->withPayload(JsonConverter::encode($this->jwt->claims->all())) - ->addSignature($jwk, $this->jwt->header->all()) - ->build() - ; - - return (new CompactSerializer())->serialize($jws); - } - - protected function getAlgorithmMap(): array - { - return [ - HS256::class, - HS384::class, - HS512::class, - RS256::class, - RS384::class, - RS512::class, - PS256::class, - PS384::class, - PS512::class, - ES256::class, - ES384::class, - ES512::class, - EdDSA::class, - ]; - } -} diff --git a/src/Easy/JWT.php b/src/Easy/JWT.php deleted file mode 100644 index 6d58e214..00000000 --- a/src/Easy/JWT.php +++ /dev/null @@ -1,18 +0,0 @@ -claims = new ParameterBag(); - $this->header = new ParameterBag(); - } -} diff --git a/src/Easy/LICENSE b/src/Easy/LICENSE deleted file mode 100644 index 37cf976b..00000000 --- a/src/Easy/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2019 Spomky-Labs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/src/Easy/Load.php b/src/Easy/Load.php deleted file mode 100644 index 1d22a0b8..00000000 --- a/src/Easy/Load.php +++ /dev/null @@ -1,18 +0,0 @@ -get($name); - } - array_unshift($arguments, $name); - - return call_user_func_array([$this, 'set'], $arguments); - } - - public function all(): array - { - return $this->parameters; - } - - public function keys(): array - { - return array_keys($this->parameters); - } - - public function replace(array $parameters): void - { - $this->parameters = $parameters; - } - - public function add(array $parameters): void - { - /** @var array|null $replaced */ - $replaced = array_replace($this->parameters, $parameters); - if ($replaced === null) { - throw new InvalidArgumentException('Invalid parameters'); - } - $this->parameters = $replaced; - } - - public function get(string $key) - { - if (! array_key_exists($key, $this->parameters)) { - throw new InvalidArgumentException(sprintf('Parameter "%s" is missing', $key)); - } - - return $this->parameters[$key]; - } - - /** - * @param mixed $value The value - */ - public function set(string $key, $value): void - { - $this->parameters[$key] = $value; - } - - public function has(string $key): bool - { - return array_key_exists($key, $this->parameters); - } - - public function remove(string $key): void - { - unset($this->parameters[$key]); - } - - public function getIterator(): ArrayIterator - { - return new ArrayIterator($this->parameters); - } - - public function count(): int - { - return count($this->parameters); - } -} diff --git a/src/Easy/README.md b/src/Easy/README.md deleted file mode 100644 index dc2ff743..00000000 --- a/src/Easy/README.md +++ /dev/null @@ -1,15 +0,0 @@ -Easy Toolset For JWT-Framework -=============================== - -This repository is a sub repository of [the JWT Framework](https://github.com/web-token/jwt-framework) project and is READ ONLY. - -**Please do not submit any Pull Request here.** -You should go to [the main repository](https://github.com/web-token/jwt-framework) instead. - -# Documentation - -The official documentation is available as https://web-token.spomky-labs.com/ - -# Licence - -This software is release under [MIT licence](LICENSE). diff --git a/src/Easy/Validate.php b/src/Easy/Validate.php deleted file mode 100644 index 25c19658..00000000 --- a/src/Easy/Validate.php +++ /dev/null @@ -1,80 +0,0 @@ -allowedAlgorithms) !== 0) { - $this->headerCheckers[] = new AlgorithmChecker($this->allowedAlgorithms, true); - } - $jws = (new CompactSerializer())->unserialize($this->token); - $headerChecker = new HeaderCheckerManager($this->headerCheckers, [new JWSTokenSupport()]); - $headerChecker->check($jws, 0); - - $verifier = new JWSVerifier(new AlgorithmManager($this->algorithms)); - if (! $verifier->verifyWithKeySet($jws, $this->jwkset, 0)) { - throw new Exception('Invalid signature'); - } - - $jwt = new JWT(); - $jwt->header->replace($jws->getSignature(0)->getProtectedHeader()); - $jwt->claims->replace(JsonConverter::decode($jws->getPayload())); - - $claimChecker = new ClaimCheckerManager($this->claimCheckers); - $claimChecker->check($jwt->claims->all(), $this->mandatoryClaims); - - return $jwt; - } - - protected function getAlgorithmMap(): array - { - return [ - HS256::class, - HS384::class, - HS512::class, - RS256::class, - RS384::class, - RS512::class, - PS256::class, - PS384::class, - PS512::class, - ES256::class, - ES384::class, - ES512::class, - EdDSA::class, - ]; - } -} diff --git a/src/Easy/composer.json b/src/Easy/composer.json deleted file mode 100644 index bdc44fb7..00000000 --- a/src/Easy/composer.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "web-token/jwt-easy", - "description": "Easy toolset to use the JWT Framework.", - "type": "library", - "license": "MIT", - "keywords": ["JWS", "JWT", "JWE", "JWA", "JWK", "JWKSet", "Jot", "Jose", "RFC7515", "RFC7516", "RFC7517", "RFC7518", "RFC7519", "RFC7520", "Bundle", "Symfony"], - "homepage": "https://github.com/web-token", - "authors": [ - { - "name": "Florent Morselli", - "homepage": "https://github.com/Spomky" - },{ - "name": "All contributors", - "homepage": "https://github.com/web-token/jwt-framework/contributors" - } - ], - "autoload": { - "psr-4": { - "Jose\\Easy\\": "" - } - }, - "require": { - "web-token/jwt-encryption": "^2.1", - "web-token/jwt-signature": "^2.1", - "web-token/jwt-checker": "^2.1" - }, - "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", - "web-token/jwt-encryption-algorithm-aesgcmkw": "Adds AES-GCM Key Wrapping based encryption algorithms", - "web-token/jwt-encryption-algorithm-aeskw": "Adds AES Key Wrapping based encryption algorithms", - "web-token/jwt-encryption-algorithm-dir": "Adds Direct encryption algorithm", - "web-token/jwt-encryption-algorithm-ecdh-es": "Adds ECDH-ES based encryption algorithms", - "web-token/jwt-encryption-algorithm-pbes2": "Adds PBES2 based encryption algorithms", - "web-token/jwt-encryption-algorithm-rsa": "Adds RSA based encryption algorithms", - "web-token/jwt-signature-algorithm-ecdsa": "Adds ECDSA based signature algorithms", - "web-token/jwt-signature-algorithm-eddsa": "Adds EdDSA based signature algorithms", - "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" - } -} diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/composer.json b/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/composer.json index e453160b..39af730f 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/composer.json +++ b/src/EncryptionAlgorithm/KeyEncryption/AESGCMKW/composer.json @@ -21,7 +21,7 @@ }, "require": { "ext-openssl": "*", - "spomky-labs/aes-key-wrap": "^5.0|^6.0", + "spomky-labs/aes-key-wrap": "^7.0", "web-token/jwt-encryption": "^2.1" } } diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A128KW.php b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A128KW.php index d9c5bad1..635b9aca 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A128KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A128KW.php @@ -5,6 +5,7 @@ namespace Jose\Component\Encryption\Algorithm\KeyEncryption; use AESKW\A128KW as Wrapper; +use AESKW\Wrapper as WrapperInterface; final class A128KW extends AESKW { @@ -13,7 +14,7 @@ public function name(): string return 'A128KW'; } - protected function getWrapper(): Wrapper + protected function getWrapper(): WrapperInterface { return new Wrapper(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A192KW.php b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A192KW.php index 1e09556b..8960ca40 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A192KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A192KW.php @@ -5,6 +5,7 @@ namespace Jose\Component\Encryption\Algorithm\KeyEncryption; use AESKW\A192KW as Wrapper; +use AESKW\Wrapper as WrapperInterface; final class A192KW extends AESKW { @@ -13,7 +14,7 @@ public function name(): string return 'A192KW'; } - protected function getWrapper(): Wrapper + protected function getWrapper(): WrapperInterface { return new Wrapper(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A256KW.php b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A256KW.php index 2a9908ae..52cbf204 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESKW/A256KW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESKW/A256KW.php @@ -5,6 +5,7 @@ namespace Jose\Component\Encryption\Algorithm\KeyEncryption; use AESKW\A256KW as Wrapper; +use AESKW\Wrapper as WrapperInterface; final class A256KW extends AESKW { @@ -13,7 +14,7 @@ public function name(): string return 'A256KW'; } - protected function getWrapper(): Wrapper + protected function getWrapper(): WrapperInterface { return new Wrapper(); } diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESKW/AESKW.php b/src/EncryptionAlgorithm/KeyEncryption/AESKW/AESKW.php index 6a50fd24..1e27500c 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESKW/AESKW.php +++ b/src/EncryptionAlgorithm/KeyEncryption/AESKW/AESKW.php @@ -4,9 +4,7 @@ namespace Jose\Component\Encryption\Algorithm\KeyEncryption; -use AESKW\A128KW; -use AESKW\A192KW; -use AESKW\A256KW; +use AESKW\Wrapper as WrapperInterface; use function in_array; use InvalidArgumentException; use function is_string; @@ -41,7 +39,7 @@ public function getKeyManagementMode(): string return self::MODE_WRAP; } - abstract protected function getWrapper(): A128KW|A192KW|A256KW; + abstract protected function getWrapper(): WrapperInterface; private function getKey(JWK $key): string { diff --git a/src/EncryptionAlgorithm/KeyEncryption/AESKW/composer.json b/src/EncryptionAlgorithm/KeyEncryption/AESKW/composer.json index 489dde8e..8668a032 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/AESKW/composer.json +++ b/src/EncryptionAlgorithm/KeyEncryption/AESKW/composer.json @@ -21,7 +21,7 @@ }, "require": { "ext-openssl": "*", - "spomky-labs/aes-key-wrap": "^5.0|^6.0", + "spomky-labs/aes-key-wrap": "^7.0", "web-token/jwt-encryption": "^2.1" } } diff --git a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/composer.json b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/composer.json index 5dbd03c0..6368a590 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/ECDHES/composer.json +++ b/src/EncryptionAlgorithm/KeyEncryption/ECDHES/composer.json @@ -24,7 +24,7 @@ }, "require": { "ext-openssl": "*", - "spomky-labs/aes-key-wrap": "^5.0|^6.0", + "spomky-labs/aes-key-wrap": "^7.0", "web-token/jwt-encryption": "^2.1", "web-token/jwt-util-ecc": "^2.1" } diff --git a/src/EncryptionAlgorithm/KeyEncryption/RSA/Util/RSACrypt.php b/src/EncryptionAlgorithm/KeyEncryption/RSA/Util/RSACrypt.php index 5d19d783..00bb37cd 100644 --- a/src/EncryptionAlgorithm/KeyEncryption/RSA/Util/RSACrypt.php +++ b/src/EncryptionAlgorithm/KeyEncryption/RSA/Util/RSACrypt.php @@ -7,7 +7,6 @@ use function chr; use function count; use InvalidArgumentException; -use function is_array; use Jose\Component\Core\Util\BigInteger; use Jose\Component\Core\Util\Hash; use Jose\Component\Core\Util\RSAKey; @@ -102,12 +101,9 @@ public static function encryptWithRSAOAEP(RSAKey $key, string $plaintext, string if ($length <= 0) { throw new RuntimeException(); } - $plaintext = mb_str_split($plaintext, $length, '8bit'); - if (! is_array($plaintext)) { - throw new RuntimeException('Invalid payload'); - } + $splitPlaintext = mb_str_split($plaintext, $length, '8bit'); $ciphertext = ''; - foreach ($plaintext as $m) { + foreach ($splitPlaintext as $m) { $ciphertext .= self::encryptRSAESOAEP($key, $m, $hash); } @@ -123,18 +119,15 @@ public static function decryptWithRSAOAEP(RSAKey $key, string $ciphertext, strin throw new RuntimeException('Invalid modulus length'); } $hash = Hash::$hash_algorithm(); - $ciphertext = mb_str_split($ciphertext, $key->getModulusLength(), '8bit'); - if (! is_array($ciphertext)) { - throw new RuntimeException('Invalid ciphertext'); - } - $ciphertext[count($ciphertext) - 1] = str_pad( - $ciphertext[count($ciphertext) - 1], + $splitCiphertext = mb_str_split($ciphertext, $key->getModulusLength(), '8bit'); + $splitCiphertext[count($splitCiphertext) - 1] = str_pad( + $splitCiphertext[count($splitCiphertext) - 1], $key->getModulusLength(), chr(0), STR_PAD_LEFT ); $plaintext = ''; - foreach ($ciphertext as $c) { + foreach ($splitCiphertext as $c) { $temp = self::getRSAESOAEP($key, $c, $hash); $plaintext .= $temp; } diff --git a/tests/Component/KeyManagement/UrlKeySetFactoryTest.php b/tests/Component/KeyManagement/UrlKeySetFactoryTest.php index 9649930e..8f22b007 100644 --- a/tests/Component/KeyManagement/UrlKeySetFactoryTest.php +++ b/tests/Component/KeyManagement/UrlKeySetFactoryTest.php @@ -7,6 +7,7 @@ use Http\Mock\Client; use Jose\Component\KeyManagement\JKUFactory; use Jose\Component\KeyManagement\X5UFactory; +use JsonException; use Nyholm\Psr7\Factory\Psr17Factory; use PHPUnit\Framework\TestCase; use RuntimeException; @@ -58,8 +59,8 @@ public function iCanGetAKeySetFromAJWKUrl(): void */ public function theJWKUrlIsValidButDoesNotContainAKeySet(): void { - $this->expectException(RuntimeException::class); - $this->expectExceptionMessage('Invalid content.'); + $this->expectException(JsonException::class); + $this->expectExceptionMessage('Syntax error'); $response = $this->messageFactory->createResponse(200); $response->getBody() @@ -128,8 +129,8 @@ public function iCanGetAKeySetFromAX509Url(): void */ public function theX509UrlIsValidButDoesNotContainAKeySet(): void { - $this->expectException(RuntimeException::class); - $this->expectExceptionMessage('Invalid content.'); + $this->expectException(JsonException::class); + $this->expectExceptionMessage('Syntax error'); $response = $this->messageFactory->createResponse(200); $response->getBody() diff --git a/tests/Easy/AlgorithmProviderTest.php b/tests/Easy/AlgorithmProviderTest.php deleted file mode 100644 index 8042e024..00000000 --- a/tests/Easy/AlgorithmProviderTest.php +++ /dev/null @@ -1,176 +0,0 @@ -getAlgorithmClasses()); - } - - /** - * @test - */ - public function itReturnsTheAvailableAlgorithms(): void - { - $algorithmProvider = new AlgorithmProvider(self::ALL_ALGORITHMS); - foreach ($algorithmProvider->getAvailableAlgorithms() as $algorithm) { - static::assertContains($algorithm::class, self::ALL_ALGORITHMS); - } - } - - /** - * @test - */ - public function itAllowsNonExistingClasses(): void - { - $nonExistingClassName = 'NonExistingClass' . bin2hex(random_bytes(31)); - $algorithmProvider = new AlgorithmProvider([$nonExistingClassName]); - - static::assertSame([$nonExistingClassName], $algorithmProvider->getAlgorithmClasses()); - static::assertSame([], $algorithmProvider->getAvailableAlgorithms()); - } - - /** - * @test - */ - 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 SignatureAlgorithm { - private static ?bool $throw = null; - - public function __construct() - { - if (self::$throw === null) { - 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 $mockClass::class; - } -} diff --git a/tests/Easy/EncryptionTest.php b/tests/Easy/EncryptionTest.php deleted file mode 100644 index 18aa37ac..00000000 --- a/tests/Easy/EncryptionTest.php +++ /dev/null @@ -1,139 +0,0 @@ -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::assertSame($time, $jwt->claims->iat()); - static::assertSame($time, $jwt->claims->nbf()); - static::assertSame($time + 3600, $jwt->claims->exp()); - static::assertSame('0123456789', $jwt->claims->jti()); - static::assertSame('issuer', $jwt->claims->iss()); - static::assertSame('subject', $jwt->claims->sub()); - static::assertSame(['audience1', 'audience2'], $jwt->claims->aud()); - static::assertTrue($jwt->claims->is_root()); - static::assertSame([ - 'ROLE1' => true, - 'ROLE2' => 0.007, - ], $jwt->claims->roles()); - - static::assertSame([ - 'jti' => '0123456789', - 'alg' => 'RSA-OAEP-256', - 'enc' => 'A256GCM', - 'crit' => ['alg', 'enc'], - 'zip' => 'DEF', - ], $jwt->header->all()); - static::assertSame('RSA-OAEP-256', $jwt->header->alg()); - static::assertSame('A256GCM', $jwt->header->enc()); - static::assertSame('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::assertSame($time, $jwt->claims->iat()); - static::assertSame($time, $jwt->claims->nbf()); - static::assertSame($time + 3600, $jwt->claims->exp()); - static::assertSame('0123456789', $jwt->claims->jti()); - - static::assertSame('RSA-OAEP-512', $jwt->header->alg()); - static::assertSame('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', - ]); - } -} diff --git a/tests/Easy/ParameterBagTest.php b/tests/Easy/ParameterBagTest.php deleted file mode 100644 index e15a7955..00000000 --- a/tests/Easy/ParameterBagTest.php +++ /dev/null @@ -1,29 +0,0 @@ -iss('iss'); - $bag->alg('alg'); - $bag->aud(['aud']); - - static::assertSame(['aud'], $bag->aud()); - static::assertSame('iss', $bag->get('iss')); - static::assertSame('alg', $bag->get('alg')); - } -} diff --git a/tests/Easy/SignatureTest.php b/tests/Easy/SignatureTest.php deleted file mode 100644 index 475a6e3b..00000000 --- a/tests/Easy/SignatureTest.php +++ /dev/null @@ -1,280 +0,0 @@ -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::assertSame($time, $jwt->claims->iat()); - static::assertSame($time, $jwt->claims->nbf()); - static::assertSame($time + 3600, $jwt->claims->exp()); - static::assertSame('0123456789', $jwt->claims->jti()); - static::assertSame('issuer', $jwt->claims->iss()); - static::assertSame('subject', $jwt->claims->sub()); - static::assertSame(['audience1', 'audience2'], $jwt->claims->aud()); - static::assertTrue($jwt->claims->is_root()); - static::assertSame([ - 'ROLE1' => true, - 'ROLE2' => 0.007, - ], $jwt->claims->roles()); - - static::assertSame([ - 'jti' => '0123456789', - 'alg' => 'RS512', - 'crit' => ['alg'], - ], $jwt->header->all()); - static::assertSame('RS512', $jwt->header->alg()); - static::assertSame('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::assertSame($time, $jwt->claims->iat()); - static::assertSame($time, $jwt->claims->nbf()); - static::assertSame($time + 3600, $jwt->claims->exp()); - static::assertSame('0123456789', $jwt->claims->jti()); - - static::assertSame('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', - ]); - } -}