MultibyteStringConverterTest.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. namespace Lcobucci\JWT\Signer\Ecdsa;
  3. use InvalidArgumentException;
  4. use PHPUnit\Framework\TestCase;
  5. use function bin2hex;
  6. use function hex2bin;
  7. use function strlen;
  8. /**
  9. * @coversDefaultClass \Lcobucci\JWT\Signer\Ecdsa\MultibyteStringConverter
  10. */
  11. final class MultibyteStringConverterTest extends TestCase
  12. {
  13. /**
  14. * @test
  15. * @dataProvider pointsConversionData
  16. *
  17. * @covers ::toAsn1
  18. * @covers ::octetLength
  19. * @covers ::preparePositiveInteger
  20. */
  21. public function toAsn1ShouldReturnThePointsInAnAsn1SequenceFormat(
  22. $r,
  23. $s,
  24. $asn1
  25. ) {
  26. $converter = new MultibyteStringConverter();
  27. $message = hex2bin($r . $s);
  28. self::assertSame($asn1, bin2hex($converter->toAsn1($message, strlen($r))));
  29. }
  30. /**
  31. * @test
  32. *
  33. * @covers ::toAsn1
  34. * @covers ::octetLength
  35. */
  36. public function toAsn1ShouldRaiseExceptionWhenPointsDoNotHaveCorrectLength()
  37. {
  38. $converter = new MultibyteStringConverter();
  39. self::expectException(InvalidArgumentException::class);
  40. $converter->toAsn1('a very wrong string', 64);
  41. }
  42. /**
  43. * @test
  44. * @dataProvider pointsConversionData
  45. *
  46. * @covers ::fromAsn1
  47. * @covers ::readAsn1Content
  48. * @covers ::readAsn1Integer
  49. * @covers ::retrievePositiveInteger
  50. */
  51. public function fromAsn1ShouldReturnTheConcatenatedPoints($r, $s, $asn1)
  52. {
  53. $converter = new MultibyteStringConverter();
  54. $message = hex2bin($asn1);
  55. self::assertSame($r . $s, bin2hex($converter->fromAsn1($message, strlen($r))));
  56. }
  57. /**
  58. * @return string[][]
  59. */
  60. public function pointsConversionData()
  61. {
  62. return [
  63. [
  64. 'efd48b2aacb6a8fd1140dd9cd45e81d69d2c877b56aaf991c34d0ea84eaf3716',
  65. 'f7cb1c942d657c41d436c7a1b6e29f65f3e900dbb9aff4064dc4ab2f843acda8',
  66. '3046022100efd48b2aacb6a8fd1140dd9cd45e81d69d2c877b56aaf991c34d0ea84eaf3716022100f7cb1c942d657c41d436c7'
  67. . 'a1b6e29f65f3e900dbb9aff4064dc4ab2f843acda8',
  68. ],
  69. [
  70. '94edbb92a5ecb8aad4736e56c691916b3f88140666ce9fa73d64c4ea95ad133c81a648152e44acf96e36dd1e80fabe46',
  71. '99ef4aeb15f178cea1fe40db2603138f130e740a19624526203b6351d0a3a94fa329c145786e679e7b82c71a38628ac8',
  72. '306602310094edbb92a5ecb8aad4736e56c691916b3f88140666ce9fa73d64c4ea95ad133c81a648152e44acf96e36dd1e80fa'
  73. . 'be4602310099ef4aeb15f178cea1fe40db2603138f130e740a19624526203b6351d0a3a94fa329c145786e679e7b82c71a38'
  74. . '628ac8',
  75. ],
  76. [
  77. '00c328fafcbd79dd77850370c46325d987cb525569fb63c5d3bc53950e6d4c5f174e25a1ee9017b5d450606add152b534931d7'
  78. . 'd4e8455cc91f9b15bf05ec36e377fa',
  79. '00617cce7cf5064806c467f678d3b4080d6f1cc50af26ca209417308281b68af282623eaa63e5b5c0723d8b8c37ff0777b1a20'
  80. . 'f8ccb1dccc43997f1ee0e44da4a67a',
  81. '308187024200c328fafcbd79dd77850370c46325d987cb525569fb63c5d3bc53950e6d4c5f174e25a1ee9017b5d450606add15'
  82. . '2b534931d7d4e8455cc91f9b15bf05ec36e377fa0241617cce7cf5064806c467f678d3b4080d6f1cc50af26ca20941730828'
  83. . '1b68af282623eaa63e5b5c0723d8b8c37ff0777b1a20f8ccb1dccc43997f1ee0e44da4a67a',
  84. ],
  85. ];
  86. }
  87. /**
  88. * @test
  89. * @dataProvider invalidAsn1Structures
  90. *
  91. * @covers ::fromAsn1
  92. * @covers ::readAsn1Content
  93. * @covers ::readAsn1Integer
  94. * @covers ::retrievePositiveInteger
  95. */
  96. public function fromAsn1ShouldRaiseExceptionOnInvalidMessage($message)
  97. {
  98. $converter = new MultibyteStringConverter();
  99. $message = hex2bin($message);
  100. $this->expectException(InvalidArgumentException::class);
  101. $converter->fromAsn1($message, 64);
  102. }
  103. /**
  104. * @return string[][]
  105. */
  106. public function invalidAsn1Structures()
  107. {
  108. return [
  109. 'Not a sequence' => [''],
  110. 'Sequence without length' => ['30'],
  111. 'Only one string element' => ['3006030204f0'],
  112. 'Only one integer element' => ['3004020101'],
  113. 'Integer+string elements' => ['300a020101030204f0'],
  114. ];
  115. }
  116. }