Failed Conditions
Push — v7 ( 5d1eb6...6055df )
by Florent
02:59
created

RSAKeyWithoutAllPrimesTest::getPrivateKey()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 0
dl 0
loc 14
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\Encryption\Tests;
15
16
use Jose\Component\Core\JWAManager;
17
use Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM;
18
use Jose\Component\Encryption\Algorithm\KeyEncryption\RSA15;
19
use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP;
20
use Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP256;
21
use Jose\Component\Encryption\Algorithm\KeyEncryptionAlgorithmInterface;
22
use Jose\Component\Encryption\Compression\CompressionManagerFactory;
23
use Jose\Component\Encryption\Decrypter;
24
use Jose\Component\Encryption\JWE;
25
use Jose\Component\Encryption\JWELoader;
26
use Jose\Component\Factory\JWEFactory;
27
use Jose\Component\KeyManagement\JWKFactory;
28
use Jose\Component\Signature\Algorithm\PS256;
29
use Jose\Component\Signature\Algorithm\PS384;
30
use Jose\Component\Signature\Algorithm\PS512;
31
use Jose\Component\Signature\Algorithm\RS256;
32
use Jose\Component\Signature\Algorithm\RS384;
33
use Jose\Component\Signature\Algorithm\RS512;
34
use Jose\Component\Signature\JWS;
35
use Jose\Component\Signature\JWSBuilder;
36
use Jose\Component\Signature\JWSLoader;
37
use Jose\Component\Signature\SignatureAlgorithmInterface;
38
use Jose\Component\Signature\Verifier;
39
use PHPUnit\Framework\TestCase;
40
41
/**
42
 * final class RSAKeyWithoutAllPrimesTest.
43
 *
44
 * @group RSA2
45
 * @group Unit
46
 */
47
final class RSAKeyWithoutAllPrimesTest extends TestCase
48
{
49
    /**
50
     * @param SignatureAlgorithmInterface $signature_algorithm
51
     *
52
     * @dataProvider dataSignatureAlgorithms
53
     */
54
    public function testSignatureAlgorithms(SignatureAlgorithmInterface $signature_algorithm)
55
    {
56
        $key = $this->getPrivateKey();
57
58
        $claims = ['foo' => 'bar'];
59
60
        $algorithmManager = JWAManager::create([$signature_algorithm]);
61
        $builder = new JWSBuilder($algorithmManager);
62
        $jws = $builder
63
            ->withPayload($claims)
64
            ->addSignature($key, ['alg' => $signature_algorithm->name()])
65
            ->build()
66
            ->toCompactJSON(0);
67
68
        $loaded = JWSLoader::load($jws);
69
        $this->assertInstanceOf(JWS::class, $loaded);
70
71
        $verifier = new Verifier($algorithmManager);
72
        $verifier->verifyWithKey($loaded, $key);
73
    }
74
75
    /**
76
     * @return array
77
     */
78
    public function dataSignatureAlgorithms()
79
    {
80
        return [
81
            [new RS256()],
82
            [new RS384()],
83
            [new RS512()],
84
            [new PS256()],
85
            [new PS384()],
86
            [new PS512()],
87
        ];
88
    }
89
90
    /**
91
     * @return array
92
     */
93
    public function dataSignatureAlgorithmsWithSimpleKey()
94
    {
95
        return [
96
            [new PS256()],
97
            [new PS384()],
98
            [new PS512()],
99
        ];
100
    }
101
102
    /**
103
     * @param KeyEncryptionAlgorithmInterface $encryption_algorithm
104
     *
105
     * @dataProvider dataEncryptionAlgorithms
106
     */
107
    public function testEncryptionAlgorithms(KeyEncryptionAlgorithmInterface $encryption_algorithm)
108
    {
109
        $key = $this->getPrivateKey();
110
111
        $claims = ['foo' => 'bar'];
112
113
        $jwt = JWEFactory::createJWEToCompactJSON($claims, $key, ['alg' => $encryption_algorithm->name(), 'enc' => 'A256GCM']);
114
115
        $loaded = JWELoader::load($jwt);
116
        $this->assertInstanceOf(JWE::class, $loaded);
117
118
        $keyEncryptionAlgorithmManager = JWAManager::create([$encryption_algorithm]);
119
        $contentEncryptionAlgorithmManager = JWAManager::create([new A256GCM()]);
120
        $compressionManager = CompressionManagerFactory::createCompressionManager(['DEF']);
121
        $decrypter = new Decrypter($keyEncryptionAlgorithmManager, $contentEncryptionAlgorithmManager, $compressionManager);
122
        $decrypter->decryptUsingKey($loaded, $key);
123
    }
124
125
    /**
126
     * @param KeyEncryptionAlgorithmInterface $encryption_algorithm
127
     *
128
     * @dataProvider dataEncryptionAlgorithms
129
     */
130
    public function testEncryptionAlgorithmsWithMinimalRsaKey(KeyEncryptionAlgorithmInterface $encryption_algorithm)
131
    {
132
        $key = $this->getMinimalPrivateKey();
133
134
        $claims = ['foo' => 'bar'];
135
136
        $jwt = JWEFactory::createJWEToCompactJSON($claims, $key, ['alg' => $encryption_algorithm->name(), 'enc' => 'A256GCM']);
137
138
        $loaded = JWELoader::load($jwt);
139
        $this->assertInstanceOf(JWE::class, $loaded);
140
141
        $keyEncryptionAlgorithmManager = JWAManager::create([$encryption_algorithm]);
142
        $contentEncryptionAlgorithmManager = JWAManager::create([new A256GCM()]);
143
        $compressionManager = CompressionManagerFactory::createCompressionManager(['DEF']);
144
        $decrypter = new Decrypter($keyEncryptionAlgorithmManager, $contentEncryptionAlgorithmManager, $compressionManager);
145
        $decrypter->decryptUsingKey($loaded, $key);
146
    }
147
148
    /**
149
     * @return array
150
     */
151
    public function dataEncryptionAlgorithms()
152
    {
153
        return [
154
            [new RSA15()],
155
            [new RSAOAEP()],
156
            [new RSAOAEP256()],
157
        ];
158
    }
159
160
    /**
161
     * @return array
162
     */
163
    public function dataEncryptionAlgorithmsWithSimpleKey()
164
    {
165
        return [
166
            [new RSAOAEP()],
167
            [new RSAOAEP256()],
168
        ];
169
    }
170
171
    /**
172
     * @return \Jose\Component\Core\JWK
173
     */
174
    private function getPrivateKey()
175
    {
176
        return JWKFactory::createFromValues(
177
            [
178
                'kty' => 'RSA',
179
                'kid' => 'private',
180
                'n' => '2NRPORHXd7wPU6atHqmSfWgEPvsP8HVUkY2AwQQAc8x1J509X5HFxeSXnQym9eAnZHl0JCPbvHoPH4QHlvITYoh0MSgFm2aOPyqOD-XcNdKWtnNX2JIurUCyVlwSwtlmy2ZbCz8YuUmFO0iacahfK1wbWT5QoY-pU3UxnMzDhlBslZN5uL7nRE8Sh_8BthsrMdYeGIMY55kh-P7xTs3MHzpOKhFSrOhdN6aO3HWYUuMAdoMNB-hJvckb2PbCy0_K1Wm3SBHtXn-cuMIUF00W9AR3amp3u3hLa2rcz29jEFXTr2FxKyLH4SdlnFFMJl2vaXuxM4PXgLN33Kj34PfKgc8ljDJ7oaSI9bKt7gunXOLv_o4XWYDq91cvUkOIDAsvqxzzHPZBt0Hru7roW3btkUOiqR6RWy-Cw272yiSEC5QA93m_vklD1KajoFeWN0BW2lWGlfGieZldvKX0sumk1TZuLhlHPHSKYcpeCfahT-jLr1yAeHql6qRN_a0BiHu-SSSjts6InmF1pAELznZ3Jn9-QXX78LsY3xaqOlYqHbCohxXorlYRi4so6eMGILtXjqHOoISb13Ez4YNOQmV4ygmyABRkE0AQG5KLy5cZB7LZn7zqw869UjXxWrmiOaBeDqOkxww6qiWIEDwPIouRLwOfPFtC4LGlb9LmG9Hlhp8',
181
                'e' => 'AQAB',
182
                'd' => 'PsMls2VAsz3SSepjDg8Tgg1LvVc6w-WSdxc4f6ZC40H5X2AaVcGCN8f1QtZYta8Od_zX62Ydwq6qFftHnx-vEMRirZ_iD5td7VbKDDwCw-mTCnjUorGdpTSm6mx4WcJICPQ1wkmfRHLNh916JxAPjCN7Hxf0iu9kme3AUJzMs-IvrBQmFZ3cn18sBAWCX0358NEDoSDBYrhmpwZUnvTe8uMToQWmoroX0XX6wEGht8xRY_yHFxTb032U-_ZhaCxOj_uru8bEqKfTm39CBYSg8j0gu8LZqYAmhI9IHxsk16OgRJG2CkBlDv0yYk799dUEY0oUfs7Y4D4SoeKe7ZWMHgKMEqa7ONz18ORznxqKSQhi4hfNVgwMzaM0IoYP4KOfHuaK263zhJU0hMzURJ8KifECeOsDHBR6BhLJ9TYzUe4c9UU55nFNgRBwknKHFFrRAsgVETEzmZWHzWwGQIFtKIAVZ1cjkdMEL3BlbzzXVofXfbbCrPQqcABYx2BZ-J_P8-UFjeMo83VLrR5IHj0_8IhQZUmxZYJcpTIwrf-1A4JGlN2_eLqRymF8tZI6zIPJyo1C0M1CIB3EeHzi-70SbF8xFtGUB7hR234yo_SM-KqVdIk2Sjjta2bQ1KXjSEcvrS_358AMiP0-9JT_fHxTCyzra-SNYoZhdnrEFzoVwQE',
183
                'p' => '6fWvnj34kJtfMnO1j-qbPjFnaTevREBGAypMvUBU3Fx1Xx0nE7zdc7lln2Qq5-yTQtOQ2lpiE69HkQLR4pMU6V44SjFgVzcTzbFCnNgknEV54S5dyp4KojSWxBi6bt5GwaACkiElDEw9wgc-8JgaEkv4F7e-w44HBwPDECTjE_N0vIawpbD_y6zpifB8ziaAI3xTG4ssA1dt8WZuyQW8SR4FRsYnfkqy0twwHn02gs7XSl4NepkhSO7CY5-YC3U6LazAEZi2NTiUuZSw7F6KaRhsA8CnXTDE5JqFks_fXfLNCbtClON2JtrB1zY-l-2bHyh2a6unDtGn9ZN-Ec7BXw',
184
                'q' => '7UF_NblAyTxmj7Z2Jz1sZmz-Q3YHOcta00DjmHBhR9ItYRMQFMj-SUGPAtwvN-sk3_ThugaQt46SLT_I3Gy8433cHdW7o3So6HiMYVunyfhqnWznSWs6SvIoEh8rJOXkkIZ-DlRP8XyW5OOvi0cbWEQ1f1jbFyistMmnBClPvf2TKKPvShUl9qmvLxuU87j-_bgQmjVmtwZadnPOyPAxQ4_qqSfIiTOvMSxSycr58rTyu3khHQapGHkS5-2Y_w40GUSfVJ3XP48delYpK-PZP71hn89MJTnnfPOtvJAk1wbEev5wQFTJd-PGOudkGkuEIXryF4TGxRPltl5UeF0CwQ',
185
            ]
186
        );
187
    }
188
189
    /**
190
     * @return \Jose\Component\Core\JWK
191
     */
192
    private function getMinimalPrivateKey()
193
    {
194
        return JWKFactory::createFromValues(
195
            [
196
                'd' => 'JSqz6ijkk3dfdSEA_0iMT_1HeIJ1ft4msZ6qw7_1JSCGQAALeZ1yM0QHO3uX-Jr7HC7v1rGVcwsonAhei2qu3rk-w_iCnRL6QkkMNBnDQycwaWpwGsMBFF-UqstOJNggE4AHX-aDnbd4wbKVvdX7ieehPngbPkHcJFdg_iSZCQNoajz6XfEruyIi7_IFXYEGmH_UyEbQkgNtriZysutgYdolUjo9flUlh20HbuV3NwsPjGyDG4dUMpNpdBpSuRHYKLX6h3FjeLhItBmhBfuL7d-G3EXwKlwfNXXYivqY5NQAkFNrRbvFlc_ARIws3zAfykPDIWGWFiPiN3H-hXMgAQ',
197
                'e' => 'AQAB',
198
                'n' => 'gVf-iyhwLn2J2Up4EKjwdLYmk5n24gjGk4oQkCHVcE7j8wkS1iSzcu0ApVcMPLklEp_PWycZE12vL90gPeVjF2IPL_MKFL0b6Wy7A1f4kCDkKv7TDDjt1IIwbS-Jdp-2pG7bPb3tWjJUu6QZBLoXfRtW3cMDkQjXaVGixENORLAZs6qdu2MMKV94jetCiFd0JYCjxGVC0HW2OKnM21B_2R1NubOvMlWA7gypdpvmBYDGpkw4mjV3walWlCZObG7IH84Ovl7wOP8XLzqi2un4e6fNzy3rdp4OUSPYItF4ZX5qThWYY2R47Z5sbrZxHjNeDECKUeio0KPQNrgr6FSKSw',
199
                'kty' => 'RSA',
200
                'kid' => 'test-key',
201
            ]
202
        );
203
    }
204
}
205