Completed
Push — v2.0.x ( 11273c...f488cd )
by Florent
04:53 queued 01:28
created

ECDSASignatureTest   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 184
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7
Metric Value
wmc 10
lcom 1
cbo 7
dl 0
loc 184
rs 10
1
<?php
2
3
/*
4
 * The MIT License (MIT)
5
 *
6
 * Copyright (c) 2014-2016 Spomky-Labs
7
 *
8
 * This software may be modified and distributed under the terms
9
 * of the MIT license.  See the LICENSE file for details.
10
 */
11
12
use Base64Url\Base64Url;
13
use Jose\Algorithm\Signature\ES256;
14
use Jose\Algorithm\Signature\ES384;
15
use Jose\Algorithm\Signature\ES512;
16
use Jose\KeyConverter\KeyConverter;
17
use Jose\Object\JWK;
18
19
/**
20
 * @group ECDSA
21
 *
22
 * The values of these tests come from the JWS specification
23
 */
24
class ECDSASignatureTest extends \PHPUnit_Framework_TestCase
25
{
26
    /**
27
     * @expectedException \InvalidArgumentException
28
     * @expectedExceptionMessage The key is not valid
29
     */
30
    public function testInvalidKey()
31
    {
32
        $key = new JWK([
33
            'kty' => 'RSA',
34
        ]);
35
36
        $ecdsa = new ES256();
37
        $data = 'Je suis Charlie';
38
39
        $ecdsa->sign($key, $data);
40
    }
41
42
    /**
43
     *
44
     */
45
    public function testES256Verify()
46
    {
47
        $key = new JWK([
48
            'kty' => 'EC',
49
            'crv' => 'P-256',
50
            'x'   => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
51
            'y'   => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
52
        ]);
53
54
        $ecdsa = new ES256();
55
56
        $data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
57
        $signature = 'DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q';
58
59
        $this->assertTrue($ecdsa->verify($key, $data, Base64Url::decode($signature)));
60
    }
61
62
    /**
63
     *
64
     */
65
    public function testES256SignVerify()
66
    {
67
        $key = new JWK([
68
            'kty' => 'EC',
69
            'crv' => 'P-256',
70
            'x'   => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
71
            'y'   => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
72
            'd'   => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
73
        ]);
74
75
        $ecdsa = new ES256();
76
77
        $data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
78
        $signature = $ecdsa->sign($key, $data);
79
80
        $this->assertTrue($ecdsa->verify($key, $data, $signature));
81
    }
82
83
    /**
84
     * @expectedException \InvalidArgumentException
85
     * @expectedExceptionMessage The EC key is not private
86
     */
87
    public function testKeyNotPrivate()
88
    {
89
        $key = new JWK([
90
            'kty' => 'EC',
91
            'crv' => 'P-256',
92
            'x'   => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
93
            'y'   => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
94
        ]);
95
96
        $ecdsa = new ES256();
97
98
        $data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
99
        $ecdsa->sign($key, $data);
100
    }
101
102
    /**
103
     *
104
     */
105
    public function testES256SignAndVerify()
106
    {
107
        $public_key = new JWK(KeyConverter::loadKeyFromFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es256.key'));
108
        $private_key = new JWK(KeyConverter::loadKeyFromFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es256.key'));
109
110
        $ecdsa = new ES256();
111
        $data = 'Je suis Charlie';
112
        $signature = $ecdsa->sign($private_key, $data);
113
114
        $this->assertTrue($ecdsa->verify($public_key, $data, $signature));
115
    }
116
117
    /**
118
     *
119
     */
120
    public function testES384SignAndVerify()
121
    {
122
        $public_key = new JWK(KeyConverter::loadKeyFromFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es384.key'));
123
        $private_key = new JWK(KeyConverter::loadKeyFromFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es384.key'));
124
125
        $ecdsa = new ES384();
126
        $data = 'Je suis Charlie';
127
        $signature = $ecdsa->sign($private_key, $data);
128
129
        $this->assertTrue($ecdsa->verify($public_key, $data, $signature));
130
    }
131
132
    /**
133
     *
134
     */
135
    public function testES512SignAndVerify()
136
    {
137
        $public_key = new JWK(KeyConverter::loadKeyFromFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es512.key'));
138
        $private_key = new JWK(KeyConverter::loadKeyFromFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es512.key'));
139
140
        $ecdsa = new ES512();
141
        $data = 'Je suis Charlie';
142
        $signature = $ecdsa->sign($private_key, $data);
143
144
        $this->assertTrue($ecdsa->verify($public_key, $data, $signature));
145
    }
146
147
    /**
148
     *
149
     */
150
    public function testHS512Verify()
151
    {
152
        $key = new JWK([
153
            'kty' => 'EC',
154
            'crv' => 'P-521',
155
            'x'   => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk',
156
            'y'   => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2',
157
        ]);
158
159
        $ecdsa = new ES512();
160
161
        $data = 'eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA';
162
        $signature = 'AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn';
163
164
        $this->assertTrue($ecdsa->verify($key, $data, Base64Url::decode($signature)));
165
    }
166
167
    /**
168
     *
169
     */
170
    public function testHS512SignVerify()
171
    {
172
        $key = new JWK([
173
            'kty' => 'EC',
174
            'crv' => 'P-521',
175
            'x'   => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk',
176
            'y'   => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2',
177
            'd'   => 'AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPAxerEzgdRhajnu0ferB0d53vM9mE15j2C',
178
        ]);
179
180
        $ecdsa = new ES512();
181
182
        $data = 'eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA';
183
        $signature = $ecdsa->sign($key, $data);
184
185
        $this->assertTrue($ecdsa->verify($key, $data, $signature));
186
    }
187
188
    /**
189
     *
190
     */
191
    public function testBadSignature()
192
    {
193
        $key = new JWK([
194
            'kty' => 'EC',
195
            'crv' => 'P-256',
196
            'x'   => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
197
            'y'   => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
198
        ]);
199
200
        $ecdsa = new ES256();
201
202
        $data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
203
        $signature = 'DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3';
204
205
        $this->assertFalse($ecdsa->verify($key, $data, Base64Url::decode($signature)));
206
    }
207
}
208