EcdsaTest.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. /**
  3. * This file is part of Lcobucci\JWT, a simple library to handle JWT and JWS
  4. *
  5. * @license http://opensource.org/licenses/BSD-3-Clause BSD-3-Clause
  6. */
  7. namespace Lcobucci\JWT\Signer;
  8. use Lcobucci\JWT\Keys;
  9. use Lcobucci\JWT\Signer\Ecdsa\MultibyteStringConverter;
  10. use const OPENSSL_ALGO_SHA256;
  11. use function openssl_pkey_get_private;
  12. use function openssl_pkey_get_public;
  13. use function openssl_sign;
  14. use function openssl_verify;
  15. class EcdsaTest extends \PHPUnit\Framework\TestCase
  16. {
  17. use Keys;
  18. /**
  19. * @var MultibyteStringConverter
  20. */
  21. private $pointsManipulator;
  22. /**
  23. * @before
  24. */
  25. public function createDependencies()
  26. {
  27. $this->pointsManipulator = new MultibyteStringConverter();
  28. }
  29. private function getSigner()
  30. {
  31. $signer = $this->getMockForAbstractClass(Ecdsa::class, [$this->pointsManipulator]);
  32. $signer->method('getAlgorithm')
  33. ->willReturn(OPENSSL_ALGO_SHA256);
  34. $signer->method('getAlgorithmId')
  35. ->willReturn('ES256');
  36. $signer->method('getKeyLength')
  37. ->willReturn(64);
  38. return $signer;
  39. }
  40. /**
  41. * @test
  42. *
  43. * @covers \Lcobucci\JWT\Signer\Ecdsa::createHash
  44. * @covers \Lcobucci\JWT\Signer\Ecdsa::getKeyType
  45. * @covers \Lcobucci\JWT\Signer\Ecdsa\MultibyteStringConverter
  46. * @covers \Lcobucci\JWT\Signer\OpenSSL
  47. * @covers \Lcobucci\JWT\Signer\BaseSigner
  48. *
  49. * @uses \Lcobucci\JWT\Signer\Ecdsa::__construct
  50. * @uses \Lcobucci\JWT\Signer\Key
  51. * @uses \Lcobucci\JWT\Signature
  52. */
  53. public function createHashShouldReturnTheAHashBasedOnTheOpenSslSignature()
  54. {
  55. $payload = 'testing';
  56. $signer = $this->getSigner();
  57. $signature = $signer->sign($payload, self::$ecdsaKeys['private']);
  58. $publicKey = openssl_pkey_get_public(self::$ecdsaKeys['public1']->getContent());
  59. self::assertInternalType('resource', $publicKey);
  60. self::assertSame(
  61. 1,
  62. openssl_verify(
  63. $payload,
  64. $this->pointsManipulator->toAsn1($signature, $signer->getKeyLength()),
  65. $publicKey,
  66. OPENSSL_ALGO_SHA256
  67. )
  68. );
  69. }
  70. /**
  71. * @test
  72. *
  73. * @covers \Lcobucci\JWT\Signer\Ecdsa::doVerify
  74. * @covers \Lcobucci\JWT\Signer\Ecdsa::getKeyType
  75. * @covers \Lcobucci\JWT\Signer\Ecdsa\MultibyteStringConverter
  76. * @covers \Lcobucci\JWT\Signer\OpenSSL
  77. * @covers \Lcobucci\JWT\Signer\BaseSigner
  78. *
  79. * @uses \Lcobucci\JWT\Signer\Ecdsa::__construct
  80. * @uses \Lcobucci\JWT\Signer\Key
  81. */
  82. public function doVerifyShouldDelegateToEcdsaSignerUsingPublicKey()
  83. {
  84. $payload = 'testing';
  85. $privateKey = openssl_pkey_get_private(self::$ecdsaKeys['private']->getContent());
  86. self::assertInternalType('resource', $privateKey);
  87. $signature = '';
  88. openssl_sign($payload, $signature, $privateKey, OPENSSL_ALGO_SHA256);
  89. $signer = $this->getSigner();
  90. self::assertTrue(
  91. $signer->verify(
  92. $this->pointsManipulator->fromAsn1($signature, $signer->getKeyLength()),
  93. $payload,
  94. self::$ecdsaKeys['public1']
  95. )
  96. );
  97. }
  98. }