RFC6978VectorTest.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. namespace Lcobucci\JWT\FunctionalTests;
  3. use Lcobucci\JWT\Signer\Ecdsa;
  4. use Lcobucci\JWT\Signer\Ecdsa\Sha256;
  5. use Lcobucci\JWT\Signer\Ecdsa\Sha384;
  6. use Lcobucci\JWT\Signer\Ecdsa\Sha512;
  7. use Lcobucci\JWT\Signer\Key;
  8. use PHPUnit\Framework\TestCase;
  9. use const PHP_EOL;
  10. use function assert;
  11. use function hex2bin;
  12. use function is_string;
  13. final class RFC6978VectorTest extends TestCase
  14. {
  15. /**
  16. * @see https://tools.ietf.org/html/rfc6979#appendix-A.2.5
  17. * @see https://tools.ietf.org/html/rfc6979#appendix-A.2.6
  18. * @see https://tools.ietf.org/html/rfc6979#appendix-A.2.7
  19. *
  20. * @test
  21. * @dataProvider dataRFC6979
  22. *
  23. * @covers \Lcobucci\JWT\Signer\Key
  24. * @covers \Lcobucci\JWT\Signer\Ecdsa
  25. * @covers \Lcobucci\JWT\Signer\Ecdsa\MultibyteStringConverter
  26. * @covers \Lcobucci\JWT\Signer\Ecdsa\Sha256
  27. * @covers \Lcobucci\JWT\Signer\Ecdsa\Sha384
  28. * @covers \Lcobucci\JWT\Signer\Ecdsa\Sha512
  29. * @covers \Lcobucci\JWT\Signer\OpenSSL
  30. * @covers \Lcobucci\JWT\Signer\BaseSigner
  31. */
  32. public function theVectorsFromRFC6978CanBeVerified(
  33. Ecdsa $signer,
  34. Key $key,
  35. $payload,
  36. $expectedR,
  37. $expectedS
  38. ) {
  39. $signature = hex2bin($expectedR . $expectedS);
  40. assert(is_string($signature));
  41. static::assertTrue($signer->verify($signature, $payload, $key));
  42. }
  43. /**
  44. * @return mixed[]
  45. */
  46. public function dataRFC6979()
  47. {
  48. return $this->sha256Data() + $this->sha384Data() + $this->sha512Data();
  49. }
  50. /**
  51. * @return mixed[]
  52. */
  53. public function sha256Data()
  54. {
  55. $signer = new Sha256();
  56. $key = new Key(
  57. '-----BEGIN PUBLIC KEY-----' . PHP_EOL
  58. . 'MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYP7UuiVanTHJYet0xjVtaMBJuJI7' . PHP_EOL
  59. . 'Yfps5mliLmDyn7Z5A/4QCLi8maQa6elWKLxk8vGyDC1+n1F3o8KU1EYimQ==' . PHP_EOL
  60. . '-----END PUBLIC KEY-----'
  61. );
  62. return [
  63. 'SHA-256 (sample)' => [
  64. $signer,
  65. $key,
  66. 'sample',
  67. 'EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716',
  68. 'F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8',
  69. ],
  70. 'SHA-256 (test)' => [
  71. $signer,
  72. $key,
  73. 'test',
  74. 'F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D38367',
  75. '019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083',
  76. ]
  77. ];
  78. }
  79. /**
  80. * @return mixed[]
  81. */
  82. public function sha384Data()
  83. {
  84. $signer = new Sha384();
  85. $key = new Key(
  86. '-----BEGIN PUBLIC KEY-----' . PHP_EOL
  87. . 'MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE7DpOQVtOGaRWhhgCn0J/pdqai8SukuAu' . PHP_EOL
  88. . 'BqrlKGswDGTe+PDqkFWGYGSiVFFUgLwTgBXZty19VyROqO+awMYhiWcIpZNn+d+5' . PHP_EOL
  89. . '9UyoSz8cnbEoiyMcOuDU/nNE/SUzJkcg' . PHP_EOL
  90. . '-----END PUBLIC KEY-----'
  91. );
  92. return [
  93. 'SHA-384 (sample)' => [
  94. $signer,
  95. $key,
  96. 'sample',
  97. '94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE46',
  98. '99EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8',
  99. ],
  100. 'SHA-384 (test)' => [
  101. $signer,
  102. $key,
  103. 'test',
  104. '8203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DB',
  105. 'DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5',
  106. ]
  107. ];
  108. }
  109. /**
  110. * @return mixed[]
  111. */
  112. public function sha512Data()
  113. {
  114. $signer = new Sha512();
  115. $key = new Key(
  116. '-----BEGIN PUBLIC KEY-----' . PHP_EOL
  117. . 'MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBiUVQ0HhZMuAOqiO2lPIT+MMSH4bc' . PHP_EOL
  118. . 'l6BOWnFn205bzTcRI9RuRdtrXVNwp/IPtjMVXTj/oW0r12HcrEdLmi9QI6QASTEB' . PHP_EOL
  119. . 'yWLNTS/d94IoXmRYQTnC+RtH+H/4I1TWYw90aiig2yV0G1s0qCgAiyKswj+ST6r7' . PHP_EOL
  120. . '1NM/gepmlW3+qiv9/PU=' . PHP_EOL
  121. . '-----END PUBLIC KEY-----'
  122. );
  123. return [
  124. 'SHA-512 (sample)' => [
  125. $signer,
  126. $key,
  127. 'sample',
  128. '00C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8'
  129. . '455CC91F9B15BF05EC36E377FA',
  130. '00617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CC'
  131. . 'B1DCCC43997F1EE0E44DA4A67A',
  132. ],
  133. 'SHA-512 (test)' => [
  134. $signer,
  135. $key,
  136. 'test',
  137. '013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0C'
  138. . 'E2BD7051B7CEF945BABD47EE6D',
  139. '01FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BA'
  140. . 'F4E9AC60752F7B155E2DE4DCE3',
  141. ],
  142. ];
  143. }
  144. }