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

ECKeysTest   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 207
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3
Metric Value
wmc 12
lcom 1
cbo 3
dl 0
loc 207
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 Jose\KeyConverter\ECKey;
13
use Jose\KeyConverter\KeyConverter;
14
use Jose\Test\TestCase;
15
16
/**
17
 * @group ECKeys
18
 */
19
class ECKeysTest extends TestCase
20
{
21
    /**
22
     * @expectedException \InvalidArgumentException
23
     * @expectedExceptionMessage Unsupported key type
24
     */
25
    public function testKeyTypeNotSupported()
26
    {
27
        $file = 'file://'.__DIR__.DIRECTORY_SEPARATOR.'DSA'.DIRECTORY_SEPARATOR.'DSA.key';
28
        KeyConverter::loadKeyFromFile($file);
29
    }
30
31
    /**
32
     */
33
    public function testLoadPublicEC256Key()
34
    {
35
        $pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es256.key');
36
        $details = KeyConverter::loadKeyFromPEM($pem);
37
        $this->assertEquals($details, [
38
            'kty' => 'EC',
39
            'crv' => 'P-256',
40
            'x'   => 'vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U',
41
            'y'   => 'oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE',
42
43
        ]);
44
45
        $ec_key = new ECKey($details);
46
47
        $this->assertEquals(str_replace("\r\n", PHP_EOL, $pem), $ec_key->toPEM());
48
    }
49
50
    /**
51
     */
52
    public function testLoadPrivateEC256Key()
53
    {
54
        $pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es256.key');
55
        $details = KeyConverter::loadKeyFromPEM($pem);
56
        $this->assertEquals($details, [
57
            'kty' => 'EC',
58
            'crv' => 'P-256',
59
            'd'   => 'q_VkzNnxTG39jHB0qkwA_SeVXud7yCHT7kb7kZv-0xQ',
60
            'x'   => 'vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U',
61
            'y'   => 'oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE',
62
        ]);
63
64
        $ec_key = new ECKey($details);
65
66
        $this->assertEquals(str_replace("\r\n", PHP_EOL, $pem), $ec_key->toPEM());
67
    }
68
69
    /**
70
     */
71
    public function testLoadEncryptedPrivateEC256Key()
72
    {
73
        $details = KeyConverter::loadKeyFromFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es256.encrypted.key', 'test');
74
        $this->assertEquals($details, [
75
            'kty' => 'EC',
76
            'crv' => 'P-256',
77
            'd'   => 'q_VkzNnxTG39jHB0qkwA_SeVXud7yCHT7kb7kZv-0xQ',
78
            'x'   => 'vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U',
79
            'y'   => 'oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE',
80
        ]);
81
    }
82
83
    /**
84
     * @expectedException \InvalidArgumentException
85
     * @expectedExceptionMessage Password required for encrypted keys.
86
     */
87
    public function testLoadEncryptedPrivateEC256KeyWithoutPassword()
88
    {
89
        KeyConverter::loadKeyFromFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es256.encrypted.key');
90
    }
91
92
    /**
93
     */
94
    public function testLoadPublicEC384Key()
95
    {
96
        $pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es384.key');
97
        $details = KeyConverter::loadKeyFromPEM($pem);
98
        $this->assertEquals($details, [
99
            'kty' => 'EC',
100
            'crv' => 'P-384',
101
            'x'   => '6f-XZsg2Tvn0EoEapQ-ylMYNtsm8CPf0cb8HI2EkfY9Bqpt3QMzwlM7mVsFRmaMZ',
102
            'y'   => 'b8nOnRwmpmEnvA2U8ydS-dbnPv7bwYl-q1qNeh8Wpjor3VO-RTt4ce0Pn25oGGWU',
103
104
        ]);
105
106
        $ec_key = new ECKey($details);
107
108
        $this->assertEquals(str_replace("\r\n", PHP_EOL, $pem), $ec_key->toPEM());
109
    }
110
111
    /**
112
     */
113
    public function testLoadPrivateEC384Key()
114
    {
115
        $pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es384.key');
116
        $details = KeyConverter::loadKeyFromPEM($pem);
117
        $this->assertEquals($details, [
118
            'kty' => 'EC',
119
            'crv' => 'P-384',
120
            'd'   => 'pcSSXrbeZEOaBIs7IwqcU9M_OOM81XhZuOHoGgmS_2PdECwcdQcXzv7W8-lYL0cr',
121
            'x'   => '6f-XZsg2Tvn0EoEapQ-ylMYNtsm8CPf0cb8HI2EkfY9Bqpt3QMzwlM7mVsFRmaMZ',
122
            'y'   => 'b8nOnRwmpmEnvA2U8ydS-dbnPv7bwYl-q1qNeh8Wpjor3VO-RTt4ce0Pn25oGGWU',
123
        ]);
124
125
        $ec_key = new ECKey($details);
126
127
        $this->assertEquals(str_replace("\r\n", PHP_EOL, $pem), $ec_key->toPEM());
128
    }
129
130
    /**
131
     */
132
    public function testLoadEncryptedPrivateEC384Key()
133
    {
134
        $details = KeyConverter::loadKeyFromFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es384.encrypted.key', 'test');
135
        $this->assertEquals($details, [
136
            'kty' => 'EC',
137
            'crv' => 'P-384',
138
            'd'   => 'pcSSXrbeZEOaBIs7IwqcU9M_OOM81XhZuOHoGgmS_2PdECwcdQcXzv7W8-lYL0cr',
139
            'x'   => '6f-XZsg2Tvn0EoEapQ-ylMYNtsm8CPf0cb8HI2EkfY9Bqpt3QMzwlM7mVsFRmaMZ',
140
            'y'   => 'b8nOnRwmpmEnvA2U8ydS-dbnPv7bwYl-q1qNeh8Wpjor3VO-RTt4ce0Pn25oGGWU',
141
        ]);
142
    }
143
144
    /**
145
     */
146
    public function testLoadPublicEC512Key()
147
    {
148
        $pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'public.es512.key');
149
        $details = KeyConverter::loadKeyFromPEM($pem);
150
        $this->assertEquals($details, [
151
            'kty' => 'EC',
152
            'crv' => 'P-521',
153
            'x'   => 'AVpvo7TGpQk5P7ZLo0qkBpaT-fFDv6HQrWElBKMxcrJd_mRNapweATsVv83YON4lTIIRXzgGkmWeqbDr6RQO-1cS',
154
            'y'   => 'AIs-MoRmLaiPyG2xmPwQCHX2CGX_uCZiT3iOxTAJEZuUbeSA828K4WfAA4ODdGiB87YVShhPOkiQswV3LpbpPGhC',
155
156
        ]);
157
158
        $ec_key = new ECKey($details);
159
160
        $this->assertEquals(str_replace("\r\n", PHP_EOL, $pem), $ec_key->toPEM());
161
    }
162
163
    /**
164
     */
165
    public function testLoadPrivateEC512Key()
166
    {
167
        $pem = file_get_contents('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es512.key');
168
        $details = KeyConverter::loadKeyFromPEM($pem);
169
        $this->assertEquals($details, [
170
            'kty' => 'EC',
171
            'crv' => 'P-521',
172
            'd'   => 'Fp6KFKRiHIdR_7PP2VKxz6OkS_phyoQqwzv2I89-8zP7QScrx5r8GFLcN5mCCNJt3rN3SIgI4XoIQbNePlAj6vE',
173
            'x'   => 'AVpvo7TGpQk5P7ZLo0qkBpaT-fFDv6HQrWElBKMxcrJd_mRNapweATsVv83YON4lTIIRXzgGkmWeqbDr6RQO-1cS',
174
            'y'   => 'AIs-MoRmLaiPyG2xmPwQCHX2CGX_uCZiT3iOxTAJEZuUbeSA828K4WfAA4ODdGiB87YVShhPOkiQswV3LpbpPGhC',
175
176
        ]);
177
178
        $ec_key = new ECKey($details);
179
180
        $this->assertEquals(str_replace("\r\n", PHP_EOL, $pem), $ec_key->toPEM());
181
    }
182
183
    /**
184
     */
185
    public function testLoadEncryptedPrivateEC512Key()
186
    {
187
        $details = KeyConverter::loadKeyFromFile('file://'.__DIR__.DIRECTORY_SEPARATOR.'EC'.DIRECTORY_SEPARATOR.'private.es512.encrypted.key', 'test');
188
        $this->assertEquals($details, [
189
            'kty' => 'EC',
190
            'crv' => 'P-521',
191
            'd'   => 'Fp6KFKRiHIdR_7PP2VKxz6OkS_phyoQqwzv2I89-8zP7QScrx5r8GFLcN5mCCNJt3rN3SIgI4XoIQbNePlAj6vE',
192
            'x'   => 'AVpvo7TGpQk5P7ZLo0qkBpaT-fFDv6HQrWElBKMxcrJd_mRNapweATsVv83YON4lTIIRXzgGkmWeqbDr6RQO-1cS',
193
            'y'   => 'AIs-MoRmLaiPyG2xmPwQCHX2CGX_uCZiT3iOxTAJEZuUbeSA828K4WfAA4ODdGiB87YVShhPOkiQswV3LpbpPGhC',
194
195
        ]);
196
    }
197
198
    /**
199
     */
200
    public function testConvertPrivateKeyToPublic()
201
    {
202
        $private_ec_key = new ECKey([
203
            'kty' => 'EC',
204
            'kid' => 'Foo',
205
            'crv' => 'P-256',
206
            'use' => 'sig',
207
            'd'   => 'q_VkzNnxTG39jHB0qkwA_SeVXud7yCHT7kb7kZv-0xQ',
208
            'x'   => 'vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U',
209
            'y'   => 'oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE',
210
            'foo' => 'bar',
211
        ]);
212
213
        $public_ec_key = ECKey::toPublic($private_ec_key);
214
215
        $this->assertEquals([
216
            'kty' => 'EC',
217
            'kid' => 'Foo',
218
            'crv' => 'P-256',
219
            'use' => 'sig',
220
            'x'   => 'vuYsP-QnrqAbM7Iyhzjt08hFSuzapyojCB_gFsBt65U',
221
            'y'   => 'oq-E2K-X0kPeqGuKnhlXkxc5fnxomRSC6KLby7Ij8AE',
222
            'foo' => 'bar',
223
        ], $public_ec_key->toArray());
224
    }
225
}
226