From b0868a5b00801889a9e0c81a737963d8004e708c Mon Sep 17 00:00:00 2001 From: Sean Tymon Date: Thu, 16 Feb 2023 16:29:41 +0000 Subject: [PATCH] chore(deps): Add Laravel 10 support (#2210) * chore(deps): Add Laravel 10 support * Apply fixes from StyleCI (#2211) [ci skip] [skip ci] * cleanup readme * add compat table and alias --- .github/workflows/phpunit.yml | 16 +- README.md | 10 +- composer.json | 27 ++-- src/Providers/JWT/Namshi.php | 103 ------------- tests/AbstractTestCase.php | 2 +- tests/Providers/JWT/LcobucciTest.php | 17 ++- tests/Providers/JWT/NamshiTest.php | 218 --------------------------- tests/Providers/Keys/id_rsa | 43 ++++-- tests/Providers/Keys/id_rsa.pub | 11 +- 9 files changed, 72 insertions(+), 375 deletions(-) delete mode 100644 src/Providers/JWT/Namshi.php delete mode 100644 tests/Providers/JWT/NamshiTest.php diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index 30c843d49..8c243a4c5 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -14,18 +14,18 @@ jobs: strategy: fail-fast: false matrix: - php: [7.4, 8.0, 8.1] - laravel: [6.*, 7.*, 8.*, 9.*] + php: [8.0, 8.1, 8.2] + laravel: [9.*, 10.*] os: [ubuntu-latest] coverage: [none] include: - - php: 8.1 - laravel: 9.* + - php: 8.2 + laravel: 10.* os: ubuntu-latest coverage: xdebug exclude: - - php: 7.4 - laravel: 9.* + - php: 8.0 + laravel: 10.* name: '[P${{ matrix.php }}] [L${{ matrix.laravel }}] [${{ matrix.coverage }}]' @@ -43,10 +43,10 @@ jobs: - name: Get composer cache directory id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache dependencies - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ${{ steps.composer-cache.outputs.dir }} key: "php-${{ matrix.php }}-laravel-${{ matrix.laravel }}-${{ hashFiles('**/composer.json') }}" diff --git a/README.md b/README.md index 6d6d2edb9..27c2770aa 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,13 @@ ## Documentation -Documentation for `1.*` [here](http://jwt-auth.com) +[jwt-auth.com](https://jwt-auth.com) + +| jwt-auth version | Laravel version(s) | +|---|---| +| 1.x | 6 / 7 / 8 | +| 2.x | 9 / 10 | -For version `0.5.*` See the [WIKI](https://github.com/tymondesigns/jwt-auth/wiki) for documentation. [](https://www.patreon.com/bePatron?u=11815122) @@ -28,5 +32,3 @@ If you discover any security related issues, please email tymon148@gmail.com ins ## License The MIT License (MIT) - -[![SensioLabs Insight](https://insight.sensiolabs.com/projects/ba600082-7869-4ea8-b877-0bf6a86d4988/big.svg)](https://insight.sensiolabs.com/projects/ba600082-7869-4ea8-b877-0bf6a86d4988) diff --git a/composer.json b/composer.json index 077e69627..65a4e79cf 100644 --- a/composer.json +++ b/composer.json @@ -23,22 +23,20 @@ } ], "require": { - "php": "^7.4|^8.0", - "illuminate/auth": "^5.2|^6|^7|^8|^9", - "illuminate/contracts": "^5.2|^6|^7|^8|^9", - "illuminate/http": "^5.2|^6|^7|^8|^9", - "illuminate/support": "^5.2|^6|^7|^8|^9", - "lcobucci/jwt": "^3.4|^4.0", - "namshi/jose": "^7.0", - "nesbot/carbon": "^1.0|^2.0" + "php": "^8.0", + "illuminate/auth": "^9.0|^10.0", + "illuminate/contracts": "^9.0|^10.0", + "illuminate/http": "^9.0|^10.0", + "illuminate/support": "^9.0|^10.0", + "lcobucci/jwt": "^4.0", + "nesbot/carbon": "^2.0" }, "require-dev": { - "illuminate/console": "^5.2|^6|^7|^8|^9", - "illuminate/database": "^5.2|^6|^7|^8|^9", - "illuminate/routing": "^5.2|^6|^7|^8|^9", + "illuminate/console": "^9.0|^10.0", + "illuminate/database": "^9.0|^10.0", + "illuminate/routing": "^9.0|^10.0", "mockery/mockery": ">=0.9.9", - "phpunit/phpunit": "^8.5|^9.4", - "yoast/phpunit-polyfills": "^0.2.0" + "phpunit/phpunit": "^9.4" }, "autoload": { "psr-4": { @@ -52,7 +50,8 @@ }, "extra": { "branch-alias": { - "dev-develop": "1.0-dev" + "dev-develop": "1.0-dev", + "dev-2.x": "2.0-dev" }, "laravel": { "aliases": { diff --git a/src/Providers/JWT/Namshi.php b/src/Providers/JWT/Namshi.php deleted file mode 100644 index 2e72398f4..000000000 --- a/src/Providers/JWT/Namshi.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Tymon\JWTAuth\Providers\JWT; - -use Exception; -use InvalidArgumentException; -use Namshi\JOSE\JWS; -use Namshi\JOSE\Signer\OpenSSL\PublicKey; -use ReflectionClass; -use ReflectionException; -use Tymon\JWTAuth\Contracts\Providers\JWT; -use Tymon\JWTAuth\Exceptions\JWTException; -use Tymon\JWTAuth\Exceptions\TokenInvalidException; - -class Namshi extends Provider implements JWT -{ - /** - * The JWS. - * - * @var \Namshi\JOSE\JWS - */ - protected $jws; - - /** - * Constructor. - * - * @param \Namshi\JOSE\JWS $jws - * @param string $secret - * @param string $algo - * @param array $keys - * @return void - */ - public function __construct(JWS $jws, $secret, $algo, array $keys) - { - parent::__construct($secret, $algo, $keys); - - $this->jws = $jws; - } - - /** - * Create a JSON Web Token. - * - * @param array $payload - * @return string - * - * @throws \Tymon\JWTAuth\Exceptions\JWTException - */ - public function encode(array $payload) - { - try { - $this->jws->setPayload($payload)->sign($this->getSigningKey(), $this->getPassphrase()); - - return (string) $this->jws->getTokenString(); - } catch (Exception $e) { - throw new JWTException('Could not create token: '.$e->getMessage(), $e->getCode(), $e); - } - } - - /** - * Decode a JSON Web Token. - * - * @param string $token - * @return array - * - * @throws \Tymon\JWTAuth\Exceptions\JWTException - */ - public function decode($token) - { - try { - // Let's never allow insecure tokens - $jws = $this->jws->load($token, false); - } catch (InvalidArgumentException $e) { - throw new TokenInvalidException('Could not decode token: '.$e->getMessage(), $e->getCode(), $e); - } - - if (! $jws->verify($this->getVerificationKey(), $this->getAlgo())) { - throw new TokenInvalidException('Token Signature could not be verified.'); - } - - return (array) $jws->getPayload(); - } - - /** - * {@inheritdoc} - */ - protected function isAsymmetric() - { - try { - return (new ReflectionClass(sprintf('Namshi\\JOSE\\Signer\\OpenSSL\\%s', $this->getAlgo())))->isSubclassOf(PublicKey::class); - } catch (ReflectionException $e) { - throw new JWTException('The given algorithm could not be found', $e->getCode(), $e); - } - } -} diff --git a/tests/AbstractTestCase.php b/tests/AbstractTestCase.php index 45011233b..84d5261b0 100644 --- a/tests/AbstractTestCase.php +++ b/tests/AbstractTestCase.php @@ -13,7 +13,7 @@ use Carbon\Carbon; use Mockery; -use Yoast\PHPUnitPolyfills\TestCases\TestCase; +use PHPUnit\Framework\TestCase; abstract class AbstractTestCase extends TestCase { diff --git a/tests/Providers/JWT/LcobucciTest.php b/tests/Providers/JWT/LcobucciTest.php index a6a61c58b..5d9750b5c 100644 --- a/tests/Providers/JWT/LcobucciTest.php +++ b/tests/Providers/JWT/LcobucciTest.php @@ -11,6 +11,7 @@ namespace Tymon\JWTAuth\Test\Providers\JWT; +use Illuminate\Support\Str; use Tymon\JWTAuth\Exceptions\JWTException; use Tymon\JWTAuth\Exceptions\TokenInvalidException; use Tymon\JWTAuth\Providers\JWT\Lcobucci; @@ -30,7 +31,7 @@ public function it_can_encode_claims_using_a_symmetric_key() 'custom_claim' => 'foobar', ]; - $token = $this->getProvider('secret', Provider::ALGO_HS256)->encode($payload); + $token = $this->getProvider(Str::random(64), Provider::ALGO_HS256)->encode($payload); [$header, $payload, $signature] = explode('.', $token); $claims = json_decode(base64_decode($payload), true); @@ -57,7 +58,7 @@ public function it_can_encode_and_decode_a_token_using_a_symmetric_key() 'custom_claim' => 'foobar', ]; - $provider = $this->getProvider('secret', Provider::ALGO_HS256); + $provider = $this->getProvider(Str::random(64), Provider::ALGO_HS256); $token = $provider->encode($payload); $claims = $provider->decode($token); @@ -81,7 +82,7 @@ public function it_can_encode_and_decode_a_token_using_an_asymmetric_RS256_key() ]; $provider = $this->getProvider( - 'secret', + Str::random(64), Provider::ALGO_RS256, ['private' => $this->getDummyPrivateKey(), 'public' => $this->getDummyPublicKey()] ); @@ -115,7 +116,7 @@ public function it_should_throw_an_invalid_exception_when_the_payload_could_not_ 'invalid_utf8' => "\xB1\x31", // cannot be encoded as JSON ]; - $this->getProvider('secret', Provider::ALGO_HS256)->encode($payload); + $this->getProvider(Str::random(64), Provider::ALGO_HS256)->encode($payload); } /** @test */ @@ -125,8 +126,8 @@ public function it_should_throw_a_token_invalid_exception_when_the_token_could_n $this->expectExceptionMessage('Token Signature could not be verified.'); // This has a different secret than the one used to encode the token - $this->getProvider('secret', Provider::ALGO_HS256) - ->decode('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNjQ5MjYxMDY1LCJpYXQiOjE2NDkyNTc0NjUsImlzcyI6Ii9mb28iLCJjdXN0b21fY2xhaW0iOiJmb29iYXIifQ.jZufNqDHAxtboUIPmDp4ZFOIQxK-B5G6vNdBEp-9uL8'); + $this->getProvider(Str::random(64), Provider::ALGO_HS256) + ->decode('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNjQ5MjYxMDY1LCJpYXQiOjE2NDkyNTc0NjUsImlzcyI6Ii9mb28iLCJjdXN0b21fY2xhaW0iOiJmb29iYXIifQ.jamiInQiin-1RUviliPjZxl0MLEnQnVTbr2sGooeXBY'); } /** @test */ @@ -136,8 +137,8 @@ public function it_should_throw_a_token_invalid_exception_when_the_token_could_n $this->expectExceptionMessage('Token Signature could not be verified.'); // This sub claim for this token has been tampered with so the signature will not match - $this->getProvider('secret', Provider::ALGO_HS256) - ->decode('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIyIiwiZXhwIjoxNjQ5MjY0OTA2LCJpYXQiOjE2NDkyNjEzMDYsImlzcyI6Ii9mb28iLCJjdXN0b21fY2xhaW0iOiJmb29iYXIifQ.IcJvMvwMXf8oEpnz8-hvAy60QDE_o8XFaxhbZIGVy0U'); + $this->getProvider(Str::random(64), Provider::ALGO_HS256) + ->decode('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNjQ5MjYxMDY1LCJpYXQiOjE2NDkyNTc0NjUsImlzcyI6Ii9mb29iYXIiLCJjdXN0b21fY2xhaW0iOiJmb29iYXIifQ.jamiInQiin-1RUviliPjZxl0MLEnQnVTbr2sGooeXBY'); } /** @test */ diff --git a/tests/Providers/JWT/NamshiTest.php b/tests/Providers/JWT/NamshiTest.php deleted file mode 100644 index a8d80138e..000000000 --- a/tests/Providers/JWT/NamshiTest.php +++ /dev/null @@ -1,218 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Tymon\JWTAuth\Test\Providers\JWT; - -use Exception; -use InvalidArgumentException; -use Mockery; -use Namshi\JOSE\JWS; -use Tymon\JWTAuth\Exceptions\JWTException; -use Tymon\JWTAuth\Exceptions\TokenInvalidException; -use Tymon\JWTAuth\Providers\JWT\Namshi; -use Tymon\JWTAuth\Test\AbstractTestCase; - -class NamshiTest extends AbstractTestCase -{ - /** - * @var \Mockery\MockInterface - */ - protected $jws; - - /** - * @var \Tymon\JWTAuth\Providers\JWT\Namshi - */ - protected $provider; - - public function setUp(): void - { - parent::setUp(); - - $this->jws = Mockery::mock(JWS::class); - } - - /** @test */ - public function it_should_return_the_token_when_passing_a_valid_payload_to_encode() - { - $payload = ['sub' => 1, 'exp' => $this->testNowTimestamp + 3600, 'iat' => $this->testNowTimestamp, 'iss' => '/foo']; - - $this->jws->shouldReceive('setPayload')->once()->with($payload)->andReturn(Mockery::self()); - $this->jws->shouldReceive('sign')->once()->with('secret', null)->andReturn(Mockery::self()); - $this->jws->shouldReceive('getTokenString')->once()->andReturn('foo.bar.baz'); - - $token = $this->getProvider('secret', 'HS256')->encode($payload); - - $this->assertSame('foo.bar.baz', $token); - } - - /** @test */ - public function it_should_throw_an_invalid_exception_when_the_payload_could_not_be_encoded() - { - $this->expectException(JWTException::class); - $this->expectExceptionMessage('Could not create token:'); - - $payload = ['sub' => 1, 'exp' => $this->testNowTimestamp, 'iat' => $this->testNowTimestamp, 'iss' => '/foo']; - - $this->jws->shouldReceive('setPayload')->once()->with($payload)->andReturn(Mockery::self()); - $this->jws->shouldReceive('sign')->andThrow(new Exception); - - $this->getProvider('secret', 'HS256')->encode($payload); - } - - /** @test */ - public function it_should_return_the_payload_when_passing_a_valid_token_to_decode() - { - $payload = ['sub' => 1, 'exp' => $this->testNowTimestamp + 3600, 'iat' => $this->testNowTimestamp, 'iss' => '/foo']; - - $this->jws->shouldReceive('load')->once()->with('foo.bar.baz', false)->andReturn(Mockery::self()); - $this->jws->shouldReceive('verify')->once()->with('secret', 'HS256')->andReturn(true); - $this->jws->shouldReceive('getPayload')->andReturn($payload); - - $this->assertSame($payload, $this->getProvider('secret', 'HS256')->decode('foo.bar.baz')); - } - - /** @test */ - public function it_should_throw_a_token_invalid_exception_when_the_token_could_not_be_decoded_due_to_a_bad_signature() - { - $this->expectException(TokenInvalidException::class); - $this->expectExceptionMessage('Token Signature could not be verified.'); - - $this->jws->shouldReceive('load')->once()->with('foo.bar.baz', false)->andReturn(Mockery::self()); - $this->jws->shouldReceive('verify')->once()->with('secret', 'HS256')->andReturn(false); - $this->jws->shouldReceive('getPayload')->never(); - - $this->getProvider('secret', 'HS256')->decode('foo.bar.baz'); - } - - /** @test */ - public function it_should_throw_a_token_invalid_exception_when_the_token_could_not_be_decoded() - { - $this->expectException(TokenInvalidException::class); - $this->expectExceptionMessage('Could not decode token:'); - - $this->jws->shouldReceive('load')->once()->with('foo.bar.baz', false)->andThrow(new InvalidArgumentException); - $this->jws->shouldReceive('verify')->never(); - $this->jws->shouldReceive('getPayload')->never(); - - $this->getProvider('secret', 'HS256')->decode('foo.bar.baz'); - } - - /** @test */ - public function it_should_generate_a_token_when_using_an_rsa_algorithm() - { - $provider = $this->getProvider( - 'does_not_matter', - 'RS256', - ['private' => $this->getDummyPrivateKey(), 'public' => $this->getDummyPublicKey()] - ); - - $payload = ['sub' => 1, 'exp' => $this->testNowTimestamp + 3600, 'iat' => $this->testNowTimestamp, 'iss' => '/foo']; - - $this->jws->shouldReceive('setPayload')->once()->with($payload)->andReturn(Mockery::self()); - $this->jws->shouldReceive('sign')->once()->with($this->getDummyPrivateKey(), null)->andReturn(Mockery::self()); - $this->jws->shouldReceive('getTokenString')->once()->andReturn('foo.bar.baz'); - - $token = $provider->encode($payload); - - $this->assertSame('foo.bar.baz', $token); - } - - /** @test */ - public function it_should_generate_a_token_when_using_an_ecdsa_algorithm() - { - $provider = $this->getProvider( - 'does_not_matter', - 'ES256', - ['private' => $this->getDummyPrivateKey(), 'public' => $this->getDummyPublicKey()] - ); - - $payload = ['sub' => 1, 'exp' => $this->testNowTimestamp + 3600, 'iat' => $this->testNowTimestamp, 'iss' => '/foo']; - - $this->jws->shouldReceive('setPayload')->once()->with($payload)->andReturn(Mockery::self()); - $this->jws->shouldReceive('sign')->once()->with($this->getDummyPrivateKey(), null)->andReturn(Mockery::self()); - $this->jws->shouldReceive('getTokenString')->once()->andReturn('foo.bar.baz'); - - $token = $provider->encode($payload); - - $this->assertSame('foo.bar.baz', $token); - } - - /** @test */ - public function it_should_decode_a_token_when_using_an_rsa_algorithm() - { - $provider = $this->getProvider( - 'does_not_matter', - 'RS256', - ['private' => $this->getDummyPrivateKey(), 'public' => $this->getDummyPublicKey()] - ); - - $payload = ['sub' => 1, 'exp' => $this->testNowTimestamp + 3600, 'iat' => $this->testNowTimestamp, 'iss' => '/foo']; - - $this->jws->shouldReceive('setPayload')->once()->with($payload)->andReturn(Mockery::self()); - $this->jws->shouldReceive('sign')->once()->with($this->getDummyPrivateKey(), null)->andReturn(Mockery::self()); - $this->jws->shouldReceive('getTokenString')->once()->andReturn('foo.bar.baz'); - - $token = $provider->encode($payload); - - $this->assertSame('foo.bar.baz', $token); - } - - /** @test */ - public function it_should_throw_a_exception_when_the_algorithm_passed_is_invalid() - { - $this->expectException(JWTException::class); - $this->expectExceptionMessage('The given algorithm could not be found'); - - $this->jws->shouldReceive('load')->once()->with('foo.bar.baz', false)->andReturn(Mockery::self()); - $this->jws->shouldReceive('verify')->with('secret', 'AlgorithmWrong')->andReturn(true); - - $this->getProvider('secret', 'AlgorithmWrong')->decode('foo.bar.baz'); - } - - /** @test */ - public function it_should_return_the_public_key() - { - $provider = $this->getProvider( - 'does_not_matter', - 'RS256', - $keys = ['private' => $this->getDummyPrivateKey(), 'public' => $this->getDummyPublicKey()] - ); - - $this->assertSame($keys['public'], $provider->getPublicKey()); - } - - /** @test */ - public function it_should_return_the_keys() - { - $provider = $this->getProvider( - 'does_not_matter', - 'RS256', - $keys = ['private' => $this->getDummyPrivateKey(), 'public' => $this->getDummyPublicKey()] - ); - - $this->assertSame($keys, $provider->getKeys()); - } - - public function getProvider($secret, $algo, array $keys = []) - { - return new Namshi($this->jws, $secret, $algo, $keys); - } - - public function getDummyPrivateKey() - { - return file_get_contents(__DIR__.'/../Keys/id_rsa'); - } - - public function getDummyPublicKey() - { - return file_get_contents(__DIR__.'/../Keys/id_rsa.pub'); - } -} diff --git a/tests/Providers/Keys/id_rsa b/tests/Providers/Keys/id_rsa index 915c0d7a7..c943fa3df 100644 --- a/tests/Providers/Keys/id_rsa +++ b/tests/Providers/Keys/id_rsa @@ -1,15 +1,28 @@ ------BEGIN RSA PRIVATE KEY----- -MIICWwIBAAKBgHURzSlt138r+y76sFtADAiW3Xc2cvXdyXyc/Xr7EEDLSpqfs+aE -htAs8H+Q5VrX+aPH+Q6CQnIhjdJEp2FYPXURsLPVfnmjgek29LYKumuVGk7+PB3k -Ao1UTOdjFZ89TXmm4gKBee7bJxKRNgSR2FglgkD8Em7t72D2LyBiM3lRAgMBAAEC -gYAo2eZin47ENL+4/AeQQAAy+xoa4GgrPZJypoGZaYSZZ5cH79SiCvrUJ+pgSVqP -YbAeI8jX9EJleyn3Brf1swn2l56xyDQGUJ0ctY6TjLO5mfptEtfBIzkJzDenVcOE -F+HmEMht1BonfUXD3ep9jX0SYq1xRyt4euJoa9zBhEcgxQJBAL+HBIO2O7rWIu4I -r6MplaRIKvuS1PGVe+gjCnSNmx9lejsGhDWOaqkLh0Ep8aJdzW4XL6KC5rKB6E8t -sg9KoUsCQQCcelWh+sRBIkiq1ZoTQlxrfIyd+40hjTexThTMHF/TjfPFj+c/U6Nd -5XxiGXIeszJz/IDTciPfShr8zp3DtMpTAkEAtY2bbe9U92r9eX6qX5SP0UbH1+n8 -CXWWGxr8UjfZkA11rHYk5U+3M79F2zOTZkJc9brs4LQNU7FpMYUzgONRuQJASgOX -c6mgoMptotisK0XtXy4neSaeJ+ubFzO+pJkbPn7bemxJzmtqT6SXw/MTRrAuQiyC -ZwGLNDfiMggtGX/vXwJAUqKz/Tw9XUdhnfCCMpR5BlaSKJVTh0+ItEGw+wSHO68k -WoXTo5sbaMNsCHJJTMVhBO+QxRdPxyeAPNJdvtX0gA== ------END RSA PRIVATE KEY----- +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDTvwE87MtgREYL +TL4aHhQo3ZzogmxxvMUsKnPzyxRs1YrXOSOpwN0npsXarBKKVIUMNLfFODp/vnQn +2Zp06N8XG59WAOKwvC4MfxLDQkA+JXggzHlkbVoTN+dUkdYIFqSKuAPGwiWToRK2 +SxEhij3rE2FON8jQZvDxZkiP9a4vxJO3OTPQwKredXFiObsXD/c3RtLFhKctjCyH +OIrP0bQEsee/m7JNtG4ry6BPusN6wb+vJo5ieBYPa3c19akNq6q/nYWhplhkkJSu +aOrL5xXEFzI5TvcvnXR568GVcxK8YLfFkdxpsXGt5rAbeh0h/U5kILEAqv8P9PGT +ZpicKbrnAgMBAAECggEAd3yTQEQHR91/ASVfKPHMQns77eCbPVtekFusbugsMHYY +EPdHbqVMpvFvOMRc+f5Tzd15ziq6qBdbCJm8lThLm4iU0z1QrpaiDZ8vgUvDYM5Y +CXoZDli+uZWUTp60/n94fmb0ipZIChScsI2PrzOJWTvobvD/uso8MJydWc8zafQm +uqYzygOfjFZvU4lSfgzpefhpquy0JUy5TiKRmGUnwLb3TtcsVavjsn4QmNwLYgOF +2OE+R12ex3pAKTiRE6FcnE1xFIo1GKhBa2Otgw3MDO6Gg+kn8Q4alKz6C6RRlgaH +R7sYzEfJhsk/GGFTYOzXKQz2lSaStKt9wKCor04RcQKBgQDzPOu5jCTfayUo7xY2 +jHtiogHyKLLObt9l3qbwgXnaD6rnxYNvCrA0OMvT+iZXsFZKJkYzJr8ZOxOpPROk +10WdOaefiwUyL5dypueSwlIDwVm+hI4Bs82MajHtzOozh+73wA+aw5rPs84Uix9w +VbbwaVR6qP/BV09yJYS5kQ7fmwKBgQDe2xjywX2d2MC+qzRr+LfU+1+gq0jjhBCX +WHqRN6IECB0xTnXUf9WL/VCoI1/55BhdbbEja+4btYgcXSPmlXBIRKQ4VtFfVmYB +kPXeD8oZ7LyuNdCsbKNe+x1IHXDe6Wfs3L9ulCfXxeIE84wy3fd66mQahyXV9iD9 +CkuifMqUpQKBgQCiydHlY1LGJ/o9tA2Ewm5Na6mrvOs2V2Ox1NqbObwoYbX62eiF +53xX5u8bVl5U75JAm+79it/4bd5RtKux9dUETbLOhwcaOFm+hM+VG/IxyzRZ2nMD +1qcpY2U5BpxzknUvYF3RMTop6edxPk7zKpp9ubCtSu+oINvtxAhY/SkcIwKBgGP1 +upcImyO2GZ5shLL5eNubdSVILwV+M0LveOqyHYXZbd6z5r5OKKcGFKuWUnJwEU22 +6gGNY9wh7M9sJ7JBzX9c6pwqtPcidda2AtJ8GpbOTUOG9/afNBhiYpv6OKqD3w2r +ZmJfKg/qvpqh83zNezgy8nvDqwDxyZI2j/5uIx/RAoGBAMWRmxtv6H2cKhibI/aI +MTJM4QRjyPNxQqvAQsv+oHUbid06VK3JE+9iQyithjcfNOwnCaoO7I7qAj9QEfJS +MZQc/W/4DHJebo2kd11yoXPVTXXOuEwLSKCejBXABBY0MPNuPUmiXeU0O3Tyi37J +TUKzrgcd7NvlA41Y4xKcOqEA +-----END PRIVATE KEY----- diff --git a/tests/Providers/Keys/id_rsa.pub b/tests/Providers/Keys/id_rsa.pub index 1105d5b48..6001f30d5 100644 --- a/tests/Providers/Keys/id_rsa.pub +++ b/tests/Providers/Keys/id_rsa.pub @@ -1,6 +1,9 @@ -----BEGIN PUBLIC KEY----- -MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHURzSlt138r+y76sFtADAiW3Xc2 -cvXdyXyc/Xr7EEDLSpqfs+aEhtAs8H+Q5VrX+aPH+Q6CQnIhjdJEp2FYPXURsLPV -fnmjgek29LYKumuVGk7+PB3kAo1UTOdjFZ89TXmm4gKBee7bJxKRNgSR2FglgkD8 -Em7t72D2LyBiM3lRAgMBAAE= +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA078BPOzLYERGC0y+Gh4U +KN2c6IJscbzFLCpz88sUbNWK1zkjqcDdJ6bF2qwSilSFDDS3xTg6f750J9madOjf +FxufVgDisLwuDH8Sw0JAPiV4IMx5ZG1aEzfnVJHWCBakirgDxsIlk6EStksRIYo9 +6xNhTjfI0Gbw8WZIj/WuL8STtzkz0MCq3nVxYjm7Fw/3N0bSxYSnLYwshziKz9G0 +BLHnv5uyTbRuK8ugT7rDesG/ryaOYngWD2t3NfWpDauqv52FoaZYZJCUrmjqy+cV +xBcyOU73L510eevBlXMSvGC3xZHcabFxreawG3odIf1OZCCxAKr/D/Txk2aYnCm6 +5wIDAQAB -----END PUBLIC KEY-----