Completed
Push — develop ( b5844e...e46df6 )
by Florent
02:33
created

ECDSASignatureTest   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 166
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 3
Bugs 2 Features 0
Metric Value
wmc 10
c 3
b 2
f 0
lcom 1
cbo 7
dl 0
loc 166
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
 * @group Unit
22
 *
23
 * The values of these tests come from the JWS specification
24
 */
25
class ECDSASignatureTest extends \PHPUnit_Framework_TestCase
26
{
27
    /**
28
     * @expectedException \InvalidArgumentException
29
     * @expectedExceptionMessage Wrong key type.
30
     */
31
    public function testInvalidKey()
32
    {
33
        $key = new JWK([
34
            'kty' => 'RSA',
35
        ]);
36
37
        $ecdsa = new ES256();
38
        $data = 'Live long and Prosper.';
39
40
        $ecdsa->sign($key, $data);
41
    }
42
43
    public function testES256Verify()
44
    {
45
        $key = new JWK([
46
            'kty' => 'EC',
47
            'crv' => 'P-256',
48
            'x'   => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
49
            'y'   => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
50
            'd'   => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
51
        ]);
52
53
        $ecdsa = new ES256();
54
        $data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
55
        $signature = 'DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q';
56
57
        $sign = $ecdsa->sign($key, $data);
58
59
        $this->assertTrue($ecdsa->verify($key, $data, $sign));
60
        $this->assertTrue($ecdsa->verify($key, $data, Base64Url::decode($signature)));
61
    }
62
63
    public function testES256SignVerify()
64
    {
65
        $key = new JWK([
66
            'kty' => 'EC',
67
            'crv' => 'P-256',
68
            'x'   => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
69
            'y'   => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
70
            'd'   => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
71
        ]);
72
73
        $ecdsa = new ES256();
74
75
        $data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
76
        $signature = $ecdsa->sign($key, $data);
77
78
        $this->assertTrue($ecdsa->verify($key, $data, $signature));
79
    }
80
81
    /**
82
     * @expectedException \InvalidArgumentException
83
     * @expectedExceptionMessage The EC key is not private
84
     */
85
    public function testKeyNotPrivate()
86
    {
87
        $key = new JWK([
88
            'kty' => 'EC',
89
            'crv' => 'P-256',
90
            'x'   => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
91
            'y'   => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
92
        ]);
93
94
        $ecdsa = new ES256();
95
96
        $data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
97
        $ecdsa->sign($key, $data);
98
    }
99
100
    public function testES256SignAndVerify()
101
    {
102
        $public_key = new JWK(KeyConverter::loadFromKeyFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es256.key'));
103
        $private_key = new JWK(KeyConverter::loadFromKeyFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es256.key'));
104
105
        $ecdsa = new ES256();
106
        $data = 'Live long and Prosper.';
107
        $signature = $ecdsa->sign($private_key, $data);
108
109
        $this->assertTrue($ecdsa->verify($public_key, $data, $signature));
110
    }
111
112
    public function testES384SignAndVerify()
113
    {
114
        $public_key = new JWK(KeyConverter::loadFromKeyFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es384.key'));
115
        $private_key = new JWK(KeyConverter::loadFromKeyFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es384.key'));
116
117
        $ecdsa = new ES384();
118
        $data = 'Live long and Prosper.';
119
        $signature = $ecdsa->sign($private_key, $data);
120
121
        $this->assertTrue($ecdsa->verify($public_key, $data, $signature));
122
    }
123
124
    public function testES512SignAndVerify()
125
    {
126
        $public_key = new JWK(KeyConverter::loadFromKeyFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es512.key'));
127
        $private_key = new JWK(KeyConverter::loadFromKeyFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Keys'.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es512.key'));
128
129
        $ecdsa = new ES512();
130
        $data = 'Live long and Prosper.';
131
        $signature = $ecdsa->sign($private_key, $data);
132
133
        $this->assertTrue($ecdsa->verify($public_key, $data, $signature));
134
    }
135
136
    public function testHS512Verify()
137
    {
138
        $key = new JWK([
139
            'kty' => 'EC',
140
            'crv' => 'P-521',
141
            'x'   => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk',
142
            'y'   => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2',
143
            'd'   => 'AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPAxerEzgdRhajnu0ferB0d53vM9mE15j2C',
144
        ]);
145
146
        $ecdsa = new ES512();
147
        $data = 'eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA';
148
        $signature = 'AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn';
149
150
        $sign = $ecdsa->sign($key, $data);
151
152
        $this->assertTrue($ecdsa->verify($key, $data, $sign));
153
        $this->assertTrue($ecdsa->verify($key, $data, Base64Url::decode($signature)));
154
    }
155
156
    public function testHS512SignVerify()
157
    {
158
        $key = new JWK([
159
            'kty' => 'EC',
160
            'crv' => 'P-521',
161
            'x'   => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk',
162
            'y'   => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2',
163
            'd'   => 'AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPAxerEzgdRhajnu0ferB0d53vM9mE15j2C',
164
        ]);
165
166
        $ecdsa = new ES512();
167
168
        $data = 'eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA';
169
        $signature = $ecdsa->sign($key, $data);
170
171
        $this->assertTrue($ecdsa->verify($key, $data, $signature));
172
    }
173
174
    public function testBadSignature()
175
    {
176
        $key = new JWK([
177
            'kty' => 'EC',
178
            'crv' => 'P-256',
179
            'x'   => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
180
            'y'   => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
181
        ]);
182
183
        $ecdsa = new ES256();
184
185
        $data = 'eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
186
        $signature = 'DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3';
187
188
        $this->assertFalse($ecdsa->verify($key, $data, Base64Url::decode($signature)));
189
    }
190
}
191