Failed Conditions
Push — v7 ( e44e34...2109ab )
by Florent
04:36
created

ECDSASignatureTest::testWithVectors()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 4
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * The MIT License (MIT)
7
 *
8
 * Copyright (c) 2014-2017 Spomky-Labs
9
 *
10
 * This software may be modified and distributed under the terms
11
 * of the MIT license.  See the LICENSE file for details.
12
 */
13
14
namespace Jose\Component\Signature\Tests\RFC6979;
15
16
use Base64Url\Base64Url;
17
use Jose\Component\Core\JWK;
18
use Jose\Component\KeyManagement\JWKFactory;
19
use Jose\Component\Signature\Algorithm\ES256;
20
use Jose\Component\Signature\Algorithm\ES384;
21
use Jose\Component\Signature\Algorithm\ES512;
22
use Jose\Component\Signature\SignatureAlgorithmInterface;
23
use Jose\Component\Signature\Tests\AbstractSignatureTest;
24
25
/**
26
 * @see https://tools.ietf.org/html/rfc6979#appendix-A.2.5
27
 * @see https://tools.ietf.org/html/rfc6979#appendix-A.2.6
28
 * @see https://tools.ietf.org/html/rfc6979#appendix-A.2.7
29
 *
30
 * Note that we only test
31
 * * P-256 key with SHA-256
32
 * * P-384 key with SHA-384
33
 * * P-521 key with SHA-512
34
 *
35
 * Other curves or hash method combinaisons are not used by the Jot specification
36
 *
37
 * @group RFC6979
38
 */
39
final class ECDSASignatureTest extends AbstractSignatureTest
40
{
41
    /**
42
     * @param SignatureAlgorithmInterface $algorithm
43
     * @param string                      $message
44
     * @param \Jose\Component\Core\JWK    $key
45
     * @param string                      $signature
46
     *
47
     * @dataProvider dataWithVectors
48
     */
49
    public function testWithVectors(SignatureAlgorithmInterface $algorithm, $message, JWK $key, $signature)
50
    {
51
        $is_valid = $algorithm->verify($key, $message, $signature);
52
53
        $this->assertTrue($is_valid);
54
    }
55
56
    /**
57
     * @return array
58
     */
59
    public function dataWithVectors()
60
    {
61
        return [
62
            [
63
                new ES256(),
64
                'sample',
65
                JWKFactory::createFromValues([
66
                    'kty' => 'EC',
67
                    'crv' => 'P-256',
68
                    'd' => Base64Url::encode($this->convertHexToBin('C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721')),
69
                    'x' => Base64Url::encode($this->convertHexToBin('60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6')),
70
                    'y' => Base64Url::encode($this->convertHexToBin('7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299')),
71
                ]),
72
                sprintf(
73
                    '%s%s',
74
                    $this->convertHexToBin('EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716'),
75
                    $this->convertHexToBin('F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8')
76
                ),
77
            ],
78
            [
79
                new ES256(),
80
                'test',
81
                JWKFactory::createFromValues([
82
                    'kty' => 'EC',
83
                    'crv' => 'P-256',
84
                    'd' => Base64Url::encode($this->convertHexToBin('C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721')),
85
                    'x' => Base64Url::encode($this->convertHexToBin('60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6')),
86
                    'y' => Base64Url::encode($this->convertHexToBin('7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299')),
87
                ]),
88
                sprintf(
89
                    '%s%s',
90
                    $this->convertHexToBin('F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D38367'),
91
                    $this->convertHexToBin('019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083')
92
                ),
93
            ],
94
            [
95
                new ES384(),
96
                'sample',
97
                JWKFactory::createFromValues([
98
                    'kty' => 'EC',
99
                    'crv' => 'P-384',
100
                    'd' => Base64Url::encode($this->convertHexToBin('6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5')),
101
                    'x' => Base64Url::encode($this->convertHexToBin('EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC13')),
102
                    'y' => Base64Url::encode($this->convertHexToBin('8015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720')),
103
                ]),
104
                sprintf(
105
                    '%s%s',
106
                    $this->convertHexToBin('94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE46'),
107
                    $this->convertHexToBin('99EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8')
108
                ),
109
            ],
110
            [
111
                new ES384(),
112
                'test',
113
                JWKFactory::createFromValues([
114
                    'kty' => 'EC',
115
                    'crv' => 'P-384',
116
                    'd' => Base64Url::encode($this->convertHexToBin('6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5')),
117
                    'x' => Base64Url::encode($this->convertHexToBin('EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC13')),
118
                    'y' => Base64Url::encode($this->convertHexToBin('8015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720')),
119
                ]),
120
                sprintf(
121
                    '%s%s',
122
                    $this->convertHexToBin('8203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DB'),
123
                    $this->convertHexToBin('DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5')
124
                ),
125
            ],
126
            // A zero has been added at the beginning of each value from the RFC (cannot convert to binary of not an even length).
127
            [
128
                new ES512(),
129
                'sample',
130
                JWKFactory::createFromValues([
131
                    'kty' => 'EC',
132
                    'crv' => 'P-521',
133
                    'd' => Base64Url::encode($this->convertHexToBin('00FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538')),
134
                    'x' => Base64Url::encode($this->convertHexToBin('01894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD371123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F5023A4')),
135
                    'y' => Base64Url::encode($this->convertHexToBin('00493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A28A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDFCF5')),
136
                ]),
137
                sprintf(
138
                    '%s%s',
139
                    $this->convertHexToBin('00C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E377FA'),
140
                    $this->convertHexToBin('00617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A67A')
141
                ),
142
            ],
143
            [
144
                new ES512(),
145
                'test',
146
                JWKFactory::createFromValues([
147
                    'kty' => 'EC',
148
                    'crv' => 'P-521',
149
                    'd' => Base64Url::encode($this->convertHexToBin('00FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538')),
150
                    'x' => Base64Url::encode($this->convertHexToBin('01894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD371123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F5023A4')),
151
                    'y' => Base64Url::encode($this->convertHexToBin('00493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A28A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDFCF5')),
152
                ]),
153
                sprintf(
154
                    '%s%s',
155
                    $this->convertHexToBin('013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47EE6D'),
156
                    $this->convertHexToBin('01FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4DCE3')
157
                ),
158
            ],
159
        ];
160
    }
161
162
    /**
163
     * @param string $data
164
     *
165
     * @return string
166
     */
167
    private function convertHexToBin($data)
168
    {
169
        return hex2bin($data);
170
    }
171
}
172