File: MultibyteStringConverterTest.php

package info (click to toggle)
php-lcobucci-jwt 5.6.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,312 kB
  • sloc: php: 6,674; makefile: 49
file content (113 lines) | stat: -rw-r--r-- 4,663 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
declare(strict_types=1);

namespace Lcobucci\JWT\Tests\Signer\Ecdsa;

use Lcobucci\JWT\Signer\Ecdsa\ConversionFailed;
use Lcobucci\JWT\Signer\Ecdsa\MultibyteStringConverter;
use PHPUnit\Framework\Attributes as PHPUnit;
use PHPUnit\Framework\TestCase;

use function bin2hex;
use function hex2bin;
use function strlen;

/** @coversDefaultClass \Lcobucci\JWT\Signer\Ecdsa\MultibyteStringConverter */
#[PHPUnit\CoversClass(MultibyteStringConverter::class)]
#[PHPUnit\CoversClass(ConversionFailed::class)]
final class MultibyteStringConverterTest extends TestCase
{
    /**
     * @param non-empty-string $r
     * @param non-empty-string $s
     * @param non-empty-string $asn1
     */
    #[PHPUnit\Test]
    #[PHPUnit\DataProvider('pointsConversionData')]
    public function toAsn1ShouldReturnThePointsInAnAsn1SequenceFormat(
        string $r,
        string $s,
        string $asn1,
    ): void {
        $converter = new MultibyteStringConverter();
        $message   = hex2bin($r . $s);
        self::assertIsString($message);
        self::assertNotSame('', $message);

        self::assertSame($asn1, bin2hex($converter->toAsn1($message, strlen($r))));
    }

    #[PHPUnit\Test]
    public function toAsn1ShouldRaiseExceptionWhenPointsDoNotHaveCorrectLength(): void
    {
        $converter = new MultibyteStringConverter();

        $this->expectException(ConversionFailed::class);
        $this->expectExceptionMessage('Invalid signature length');
        $converter->toAsn1('a very wrong string', 64);
    }

    #[PHPUnit\Test]
    #[PHPUnit\DataProvider('pointsConversionData')]
    public function fromAsn1ShouldReturnTheConcatenatedPoints(string $r, string $s, string $asn1): void
    {
        $converter = new MultibyteStringConverter();
        $message   = hex2bin($asn1);
        self::assertIsString($message);
        self::assertNotSame('', $message);

        self::assertSame($r . $s, bin2hex($converter->fromAsn1($message, strlen($r))));
    }

    /** @return string[][] */
    public static function pointsConversionData(): iterable
    {
        yield [
            'efd48b2aacb6a8fd1140dd9cd45e81d69d2c877b56aaf991c34d0ea84eaf3716',
            'f7cb1c942d657c41d436c7a1b6e29f65f3e900dbb9aff4064dc4ab2f843acda8',
            '3046022100efd48b2aacb6a8fd1140dd9cd45e81d69d2c877b56aaf991c34d0ea84eaf3716022100f7cb1c942d657c41d436c7'
            . 'a1b6e29f65f3e900dbb9aff4064dc4ab2f843acda8',
        ];

        yield [
            '94edbb92a5ecb8aad4736e56c691916b3f88140666ce9fa73d64c4ea95ad133c81a648152e44acf96e36dd1e80fabe46',
            '99ef4aeb15f178cea1fe40db2603138f130e740a19624526203b6351d0a3a94fa329c145786e679e7b82c71a38628ac8',
            '306602310094edbb92a5ecb8aad4736e56c691916b3f88140666ce9fa73d64c4ea95ad133c81a648152e44acf96e36dd1e80fa'
            . 'be4602310099ef4aeb15f178cea1fe40db2603138f130e740a19624526203b6351d0a3a94fa329c145786e679e7b82c71a38'
            . '628ac8',
        ];

        yield [
            '00c328fafcbd79dd77850370c46325d987cb525569fb63c5d3bc53950e6d4c5f174e25a1ee9017b5d450606add152b534931d7'
            . 'd4e8455cc91f9b15bf05ec36e377fa',
            '00617cce7cf5064806c467f678d3b4080d6f1cc50af26ca209417308281b68af282623eaa63e5b5c0723d8b8c37ff0777b1a20'
            . 'f8ccb1dccc43997f1ee0e44da4a67a',
            '308187024200c328fafcbd79dd77850370c46325d987cb525569fb63c5d3bc53950e6d4c5f174e25a1ee9017b5d450606add15'
            . '2b534931d7d4e8455cc91f9b15bf05ec36e377fa0241617cce7cf5064806c467f678d3b4080d6f1cc50af26ca20941730828'
            . '1b68af282623eaa63e5b5c0723d8b8c37ff0777b1a20f8ccb1dccc43997f1ee0e44da4a67a',
        ];
    }

    #[PHPUnit\Test]
    #[PHPUnit\DataProvider('invalidAsn1Structures')]
    public function fromAsn1ShouldRaiseExceptionOnInvalidMessage(string $message, string $expectedMessage): void
    {
        $converter = new MultibyteStringConverter();
        $message   = hex2bin($message);
        self::assertIsString($message);

        $this->expectException(ConversionFailed::class);
        $this->expectExceptionMessage($expectedMessage);
        $converter->fromAsn1($message, 64);
    }

    /** @return string[][] */
    public static function invalidAsn1Structures(): iterable
    {
        yield 'Not a sequence' => ['', 'Should start with a sequence'];
        yield 'Sequence without length'  => ['30', 'Should contain an integer'];
        yield 'Only one string element'  => ['3006030204f0', 'Should contain an integer'];
        yield 'Only one integer element' => ['3004020101', 'Should contain an integer'];
        yield 'Integer+string elements'  => ['300a020101030204f0', 'Should contain an integer'];
    }
}