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

testPBES2_HS512_A256KWAndA128CBC_HS256Encryption()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 82
Code Lines 62

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 62
nc 1
nop 0
dl 0
loc 82
rs 8.7769
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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\RFC7520;
15
16
use Base64Url\Base64Url;
17
use Jose\Component\Core\JWAManager;
18
use Jose\Component\Core\JWK;
19
use Jose\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256;
20
use Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS512A256KW;
21
use Jose\Component\Encryption\Compression\CompressionMethodsManager;
22
use Jose\Component\Encryption\Compression\Deflate;
23
use Jose\Component\Encryption\Decrypter;
24
use Jose\Component\Encryption\JWELoader;
25
use Jose\Component\Encryption\Tests\AbstractEncryptionTest;
26
27
/**
28
 * @see https://tools.ietf.org/html/rfc7520#section-5.3
29
 *
30
 * @group RFC7520
31
 */
32
final class PBES2_HS512_A256KWAndA128CBC_HS256EncryptionTest extends AbstractEncryptionTest
33
{
34
    /**
35
     * Please note that we cannot the encryption and get the same result as the example (IV, TAG and other data are always different).
36
     * The output given in the RFC is used and only decrypted.
37
     */
38
    public function testPBES2_HS512_A256KWAndA128CBC_HS256Encryption()
39
    {
40
        $expected_payload = ['keys' => [
41
            [
42
                'kty' => 'oct',
43
                'kid' => '77c7e2b8-6e13-45cf-8672-617b5b45243a',
44
                'use' => 'enc',
45
                'alg' => 'A128GCM',
46
                'k' => 'XctOhJAkA-pD9Lh7ZgW_2A',
47
            ], [
48
                'kty' => 'oct',
49
                'kid' => '81b20965-8332-43d9-a468-82160ad91ac8',
50
                'use' => 'enc',
51
                'alg' => 'A128KW',
52
                'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ',
53
            ], [
54
                'kty' => 'oct',
55
                'kid' => '18ec08e1-bfa9-4d95-b205-2b4dd1d4321d',
56
                'use' => 'enc',
57
                'alg' => 'A256GCMKW',
58
                'k' => 'qC57l_uxcm7Nm3K-ct4GFjx8tM1U8CZ0NLBvdQstiS8',
59
            ],
60
        ]];
61
62
        $private_key = JWK::create([
63
            'kty' => 'oct',
64
            'use' => 'enc',
65
            'k' => Base64Url::encode("entrap_o\xe2\x80\x93peter_long\xe2\x80\x93credit_tun"),
66
        ]);
67
68
        $protected_headers = [
69
            'alg' => 'PBES2-HS512+A256KW',
70
            'p2s' => '8Q1SzinasR3xchYz6ZZcHA',
71
            'p2c' => 8192,
72
            'cty' => 'jwk-set+json',
73
            'enc' => 'A128CBC-HS256',
74
        ];
75
76
        $expected_compact_json = 'eyJhbGciOiJQQkVTMi1IUzUxMitBMjU2S1ciLCJwMnMiOiI4UTFTemluYXNSM3hjaFl6NlpaY0hBIiwicDJjIjo4MTkyLCJjdHkiOiJqd2stc2V0K2pzb24iLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.d3qNhUWfqheyPp4H8sjOWsDYajoej4c5Je6rlUtFPWdgtURtmeDV1g.VBiCzVHNoLiR3F4V82uoTQ.23i-Tb1AV4n0WKVSSgcQrdg6GRqsUKxjruHXYsTHAJLZ2nsnGIX86vMXqIi6IRsfywCRFzLxEcZBRnTvG3nhzPk0GDD7FMyXhUHpDjEYCNA_XOmzg8yZR9oyjo6lTF6si4q9FZ2EhzgFQCLO_6h5EVg3vR75_hkBsnuoqoM3dwejXBtIodN84PeqMb6asmas_dpSsz7H10fC5ni9xIz424givB1YLldF6exVmL93R3fOoOJbmk2GBQZL_SEGllv2cQsBgeprARsaQ7Bq99tT80coH8ItBjgV08AtzXFFsx9qKvC982KLKdPQMTlVJKkqtV4Ru5LEVpBZXBnZrtViSOgyg6AiuwaS-rCrcD_ePOGSuxvgtrokAKYPqmXUeRdjFJwafkYEkiuDCV9vWGAi1DH2xTafhJwcmywIyzi4BqRpmdn_N-zl5tuJYyuvKhjKv6ihbsV_k1hJGPGAxJ6wUpmwC4PTQ2izEm0TuSE8oMKdTw8V3kobXZ77ulMwDs4p.0HlwodAhOCILG5SQ2LQ9dg';
77
        $expected_flattened_json = '{"protected":"eyJhbGciOiJQQkVTMi1IUzUxMitBMjU2S1ciLCJwMnMiOiI4UTFTemluYXNSM3hjaFl6NlpaY0hBIiwicDJjIjo4MTkyLCJjdHkiOiJqd2stc2V0K2pzb24iLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"d3qNhUWfqheyPp4H8sjOWsDYajoej4c5Je6rlUtFPWdgtURtmeDV1g","iv":"VBiCzVHNoLiR3F4V82uoTQ","ciphertext":"23i-Tb1AV4n0WKVSSgcQrdg6GRqsUKxjruHXYsTHAJLZ2nsnGIX86vMXqIi6IRsfywCRFzLxEcZBRnTvG3nhzPk0GDD7FMyXhUHpDjEYCNA_XOmzg8yZR9oyjo6lTF6si4q9FZ2EhzgFQCLO_6h5EVg3vR75_hkBsnuoqoM3dwejXBtIodN84PeqMb6asmas_dpSsz7H10fC5ni9xIz424givB1YLldF6exVmL93R3fOoOJbmk2GBQZL_SEGllv2cQsBgeprARsaQ7Bq99tT80coH8ItBjgV08AtzXFFsx9qKvC982KLKdPQMTlVJKkqtV4Ru5LEVpBZXBnZrtViSOgyg6AiuwaS-rCrcD_ePOGSuxvgtrokAKYPqmXUeRdjFJwafkYEkiuDCV9vWGAi1DH2xTafhJwcmywIyzi4BqRpmdn_N-zl5tuJYyuvKhjKv6ihbsV_k1hJGPGAxJ6wUpmwC4PTQ2izEm0TuSE8oMKdTw8V3kobXZ77ulMwDs4p","tag":"0HlwodAhOCILG5SQ2LQ9dg"}';
78
        $expected_json = '{"recipients":[{"encrypted_key":"d3qNhUWfqheyPp4H8sjOWsDYajoej4c5Je6rlUtFPWdgtURtmeDV1g"}],"protected":"eyJhbGciOiJQQkVTMi1IUzUxMitBMjU2S1ciLCJwMnMiOiI4UTFTemluYXNSM3hjaFl6NlpaY0hBIiwicDJjIjo4MTkyLCJjdHkiOiJqd2stc2V0K2pzb24iLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","iv":"VBiCzVHNoLiR3F4V82uoTQ","ciphertext":"23i-Tb1AV4n0WKVSSgcQrdg6GRqsUKxjruHXYsTHAJLZ2nsnGIX86vMXqIi6IRsfywCRFzLxEcZBRnTvG3nhzPk0GDD7FMyXhUHpDjEYCNA_XOmzg8yZR9oyjo6lTF6si4q9FZ2EhzgFQCLO_6h5EVg3vR75_hkBsnuoqoM3dwejXBtIodN84PeqMb6asmas_dpSsz7H10fC5ni9xIz424givB1YLldF6exVmL93R3fOoOJbmk2GBQZL_SEGllv2cQsBgeprARsaQ7Bq99tT80coH8ItBjgV08AtzXFFsx9qKvC982KLKdPQMTlVJKkqtV4Ru5LEVpBZXBnZrtViSOgyg6AiuwaS-rCrcD_ePOGSuxvgtrokAKYPqmXUeRdjFJwafkYEkiuDCV9vWGAi1DH2xTafhJwcmywIyzi4BqRpmdn_N-zl5tuJYyuvKhjKv6ihbsV_k1hJGPGAxJ6wUpmwC4PTQ2izEm0TuSE8oMKdTw8V3kobXZ77ulMwDs4p","tag":"0HlwodAhOCILG5SQ2LQ9dg"}';
79
        $expected_iv = 'VBiCzVHNoLiR3F4V82uoTQ';
80
        $expected_encrypted_key = 'd3qNhUWfqheyPp4H8sjOWsDYajoej4c5Je6rlUtFPWdgtURtmeDV1g';
81
        $expected_ciphertext = '23i-Tb1AV4n0WKVSSgcQrdg6GRqsUKxjruHXYsTHAJLZ2nsnGIX86vMXqIi6IRsfywCRFzLxEcZBRnTvG3nhzPk0GDD7FMyXhUHpDjEYCNA_XOmzg8yZR9oyjo6lTF6si4q9FZ2EhzgFQCLO_6h5EVg3vR75_hkBsnuoqoM3dwejXBtIodN84PeqMb6asmas_dpSsz7H10fC5ni9xIz424givB1YLldF6exVmL93R3fOoOJbmk2GBQZL_SEGllv2cQsBgeprARsaQ7Bq99tT80coH8ItBjgV08AtzXFFsx9qKvC982KLKdPQMTlVJKkqtV4Ru5LEVpBZXBnZrtViSOgyg6AiuwaS-rCrcD_ePOGSuxvgtrokAKYPqmXUeRdjFJwafkYEkiuDCV9vWGAi1DH2xTafhJwcmywIyzi4BqRpmdn_N-zl5tuJYyuvKhjKv6ihbsV_k1hJGPGAxJ6wUpmwC4PTQ2izEm0TuSE8oMKdTw8V3kobXZ77ulMwDs4p';
82
        $expected_tag = '0HlwodAhOCILG5SQ2LQ9dg';
83
84
        $keyEncryptionAlgorithmManager = JWAManager::create([new PBES2HS512A256KW()]);
85
        $contentEncryptionAlgorithmManager = JWAManager::create([new A128CBCHS256()]);
86
        $compressionManager = CompressionMethodsManager::create([new Deflate()]);
87
        $decrypter = new Decrypter($keyEncryptionAlgorithmManager, $contentEncryptionAlgorithmManager, $compressionManager);
88
89
        $loaded_compact_json = JWELoader::load($expected_compact_json);
90
        $loaded_compact_json = $decrypter->decryptUsingKey($loaded_compact_json, $private_key);
91
92
        $loaded_flattened_json = JWELoader::load($expected_flattened_json);
93
        $loaded_flattened_json = $decrypter->decryptUsingKey($loaded_flattened_json, $private_key);
94
95
        $loaded_json = JWELoader::load($expected_json);
96
        $loaded_json = $decrypter->decryptUsingKey($loaded_json, $private_key);
97
98
        $this->assertEquals($expected_ciphertext, Base64Url::encode($loaded_compact_json->getCiphertext()));
99
        $this->assertEquals($protected_headers, $loaded_compact_json->getSharedProtectedHeaders());
100
        $this->assertEquals($expected_iv, Base64Url::encode($loaded_compact_json->getIV()));
101
        $this->assertEquals($expected_encrypted_key, Base64Url::encode($loaded_compact_json->getRecipient(0)->getEncryptedKey()));
102
        $this->assertEquals($expected_tag, Base64Url::encode($loaded_compact_json->getTag()));
103
104
        $this->assertEquals($expected_ciphertext, Base64Url::encode($loaded_flattened_json->getCiphertext()));
105
        $this->assertEquals($protected_headers, $loaded_flattened_json->getSharedProtectedHeaders());
106
        $this->assertEquals($expected_iv, Base64Url::encode($loaded_flattened_json->getIV()));
107
        $this->assertEquals($expected_encrypted_key, Base64Url::encode($loaded_flattened_json->getRecipient(0)->getEncryptedKey()));
108
        $this->assertEquals($expected_tag, Base64Url::encode($loaded_flattened_json->getTag()));
109
110
        $this->assertEquals($expected_ciphertext, Base64Url::encode($loaded_json->getCiphertext()));
111
        $this->assertEquals($protected_headers, $loaded_json->getSharedProtectedHeaders());
112
        $this->assertEquals($expected_iv, Base64Url::encode($loaded_json->getIV()));
113
        $this->assertEquals($expected_encrypted_key, Base64Url::encode($loaded_json->getRecipient(0)->getEncryptedKey()));
114
        $this->assertEquals($expected_tag, Base64Url::encode($loaded_json->getTag()));
115
116
        $this->assertEquals($expected_payload, json_decode($loaded_compact_json->getPayload(), true));
117
        $this->assertEquals($expected_payload, json_decode($loaded_flattened_json->getPayload(), true));
118
        $this->assertEquals($expected_payload, json_decode($loaded_json->getPayload(), true));
119
    }
120
121
    /**
122
     * Same input as before, but we perform the encryption first.
123
     */
124
    public function testPBES2_HS512_A256KWAndA128CBC_HS256EncryptionBis()
125
    {
126
        $expected_payload = json_encode(['keys' => [
127
            [
128
                'kty' => 'oct',
129
                'kid' => '77c7e2b8-6e13-45cf-8672-617b5b45243a',
130
                'use' => 'enc',
131
                'alg' => 'A128GCM',
132
                'k' => 'XctOhJAkA-pD9Lh7ZgW_2A',
133
            ], [
134
                'kty' => 'oct',
135
                'kid' => '81b20965-8332-43d9-a468-82160ad91ac8',
136
                'use' => 'enc',
137
                'alg' => 'A128KW',
138
                'k' => 'GZy6sIZ6wl9NJOKB-jnmVQ',
139
            ], [
140
                'kty' => 'oct',
141
                'kid' => '18ec08e1-bfa9-4d95-b205-2b4dd1d4321d',
142
                'use' => 'enc',
143
                'alg' => 'A256GCMKW',
144
                'k' => 'qC57l_uxcm7Nm3K-ct4GFjx8tM1U8CZ0NLBvdQstiS8',
145
            ],
146
        ]]);
147
148
        $private_key = JWK::create([
149
            'kty' => 'oct',
150
            'use' => 'enc',
151
            'k' => Base64Url::encode("entrap_o\xe2\x80\x93peter_long\xe2\x80\x93credit_tun"),
152
        ]);
153
154
        $protected_headers = [
155
            'alg' => 'PBES2-HS512+A256KW',
156
            'cty' => 'jwk-set+json',
157
            'enc' => 'A128CBC-HS256',
158
        ];
159
160
        $keyEncryptionAlgorithmManager = JWAManager::create([new PBES2HS512A256KW()]);
161
        $contentEncryptionAlgorithmManager = JWAManager::create([new A128CBCHS256()]);
162
        $compressionManager = CompressionMethodsManager::create([new Deflate()]);
163
        $jweBuilder = $this->getJWEBuilderFactory()->create(['PBES2-HS512+A256KW'], ['A128CBC-HS256'], ['DEF']);
164
        $decrypter = new Decrypter($keyEncryptionAlgorithmManager, $contentEncryptionAlgorithmManager, $compressionManager);
165
166
        $jwe = $jweBuilder
167
            ->withPayload($expected_payload)
168
            ->withSharedProtectedHeaders($protected_headers)
169
            ->addRecipient($private_key)
170
            ->build();
171
172
        $loaded_flattened_json = JWELoader::load($jwe->toFlattenedJSON(0));
173
        $loaded_flattened_json = $decrypter->decryptUsingKey($loaded_flattened_json, $private_key);
174
175
        $loaded_json = JWELoader::load($jwe->toJSON());
176
        $loaded_json = $decrypter->decryptUsingKey($loaded_json, $private_key);
177
178
        $this->assertTrue(array_key_exists('p2s', $loaded_flattened_json->getSharedProtectedHeaders()));
179
        $this->assertTrue(array_key_exists('p2c', $loaded_flattened_json->getSharedProtectedHeaders()));
180
181
        $this->assertTrue(array_key_exists('p2s', $loaded_json->getSharedProtectedHeaders()));
182
        $this->assertTrue(array_key_exists('p2c', $loaded_json->getSharedProtectedHeaders()));
183
184
        $this->assertEquals($expected_payload, $loaded_flattened_json->getPayload());
185
        $this->assertEquals($expected_payload, $loaded_json->getPayload());
186
    }
187
}
188