You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

188 lines
5.6 KiB

<?php
namespace Lcobucci\JWT\Signer;
use InvalidArgumentException;
use Lcobucci\JWT\Keys;
use PHPUnit\Framework\TestCase;
use const OPENSSL_ALGO_SHA256;
use function openssl_pkey_get_private;
use function openssl_pkey_get_public;
use function openssl_sign;
use function openssl_verify;
final class RsaTest extends TestCase
{
use Keys;
/**
* @test
*
* @covers \Lcobucci\JWT\Signer\Rsa::createHash
* @covers \Lcobucci\JWT\Signer\Rsa::validateKey
* @covers \Lcobucci\JWT\Signer\Rsa::getKeyType
* @covers \Lcobucci\JWT\Signer\OpenSSL
* @covers \Lcobucci\JWT\Signer\BaseSigner
*
* @uses \Lcobucci\JWT\Signer\Key
* @uses \Lcobucci\JWT\Signature
*/
public function createHashShouldReturnAValidOpensslSignature()
{
$payload = 'testing';
$signer = $this->getSigner();
$signature = $signer->sign($payload, self::$rsaKeys['private']);
$publicKey = openssl_pkey_get_public(self::$rsaKeys['public']->getContent());
self::assertInternalType('resource', $publicKey);
self::assertSame(1, openssl_verify($payload, $signature, $publicKey, OPENSSL_ALGO_SHA256));
}
/**
* @test
*
* @covers \Lcobucci\JWT\Signer\Rsa::createHash
* @covers \Lcobucci\JWT\Signer\Rsa::validateKey
* @covers \Lcobucci\JWT\Signer\Rsa::getKeyType
* @covers \Lcobucci\JWT\Signer\OpenSSL
* @covers \Lcobucci\JWT\Signer\BaseSigner
*
* @uses \Lcobucci\JWT\Signer\Key
*/
public function createHashShouldRaiseAnExceptionWhenKeyIsInvalid()
{
$key = <<<KEY
-----BEGIN RSA PRIVATE KEY-----
MGECAQACEQC4MRKSVsq5XnRBrJoX6+rnAgMBAAECECO8SZkgw6Yg66A6SUly/3kC
CQDtPXZtCQWJuwIJAMbBu17GDOrFAggopfhNlFcjkwIIVjb7G+U0/TECCEERyvxP
TWdN
-----END RSA PRIVATE KEY-----
KEY;
$signer = $this->getSigner();
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('There was an error while creating the signature');
$signer->sign('testing', new Key($key));
}
/**
* @test
*
* @covers \Lcobucci\JWT\Signer\Rsa::createHash
* @covers \Lcobucci\JWT\Signer\Rsa::validateKey
* @covers \Lcobucci\JWT\Signer\OpenSSL
* @covers \Lcobucci\JWT\Signer\BaseSigner
*
* @uses \Lcobucci\JWT\Signer\Key
*/
public function createHashShouldRaiseAnExceptionWhenKeyIsNotParseable()
{
$signer = $this->getSigner();
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('It was not possible to parse your key');
$signer->sign('testing', new Key('blablabla'));
}
/**
* @test
*
* @covers \Lcobucci\JWT\Signer\Rsa::createHash
* @covers \Lcobucci\JWT\Signer\Rsa::validateKey
* @covers \Lcobucci\JWT\Signer\Rsa::getKeyType
* @covers \Lcobucci\JWT\Signer\OpenSSL
* @covers \Lcobucci\JWT\Signer\BaseSigner
*
* @uses \Lcobucci\JWT\Signer\Key
*/
public function createHashShouldRaiseAnExceptionWhenKeyTypeIsNotRsa()
{
$signer = $this->getSigner();
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('This key is not compatible with this signer');
$signer->sign('testing', self::$ecdsaKeys['private']);
}
/**
* @test
*
* @covers \Lcobucci\JWT\Signer\Rsa::doVerify
* @covers \Lcobucci\JWT\Signer\Rsa::validateKey
* @covers \Lcobucci\JWT\Signer\Rsa::getKeyType
* @covers \Lcobucci\JWT\Signer\OpenSSL
* @covers \Lcobucci\JWT\Signer\BaseSigner
*
* @uses \Lcobucci\JWT\Signer\Key
*/
public function doVerifyShouldReturnTrueWhenSignatureIsValid()
{
$payload = 'testing';
$privateKey = openssl_pkey_get_private(self::$rsaKeys['private']->getContent());
self::assertInternalType('resource', $privateKey);
$signature = '';
openssl_sign($payload, $signature, $privateKey, OPENSSL_ALGO_SHA256);
$signer = $this->getSigner();
self::assertTrue($signer->verify($signature, $payload, self::$rsaKeys['public']));
}
/**
* @test
*
* @covers \Lcobucci\JWT\Signer\Rsa::doVerify
* @covers \Lcobucci\JWT\Signer\Rsa::validateKey
* @covers \Lcobucci\JWT\Signer\OpenSSL
* @covers \Lcobucci\JWT\Signer\BaseSigner
*
* @uses \Lcobucci\JWT\Signer\Key
*/
public function doVerifyShouldRaiseAnExceptionWhenKeyIsNotParseable()
{
$signer = $this->getSigner();
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('It was not possible to parse your key');
$signer->verify('testing', 'testing', new Key('blablabla'));
}
/**
* @test
*
* @covers \Lcobucci\JWT\Signer\Rsa::doVerify
* @covers \Lcobucci\JWT\Signer\Rsa::validateKey
* @covers \Lcobucci\JWT\Signer\OpenSSL
* @covers \Lcobucci\JWT\Signer\BaseSigner
*
* @uses \Lcobucci\JWT\Signer\Key
*/
public function doVerifyShouldRaiseAnExceptionWhenKeyTypeIsNotRsa()
{
$signer = $this->getSigner();
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('It was not possible to parse your key');
$signer->verify('testing', 'testing', self::$ecdsaKeys['private']);
}
private function getSigner()
{
$signer = $this->getMockForAbstractClass(Rsa::class);
$signer->method('getAlgorithm')
->willReturn(OPENSSL_ALGO_SHA256);
$signer->method('getAlgorithmId')
->willReturn('RS256');
return $signer;
}
}