Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\Component\Utility;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Utility\Crypt;
|
Chris@0
|
6 use PHPUnit\Framework\TestCase;
|
Chris@0
|
7
|
Chris@0
|
8 /**
|
Chris@0
|
9 * Tests random byte generation.
|
Chris@0
|
10 *
|
Chris@0
|
11 * @group Utility
|
Chris@0
|
12 *
|
Chris@0
|
13 * @coversDefaultClass \Drupal\Component\Utility\Crypt
|
Chris@0
|
14 */
|
Chris@0
|
15 class CryptTest extends TestCase {
|
Chris@0
|
16
|
Chris@0
|
17 /**
|
Chris@0
|
18 * Tests random byte generation.
|
Chris@0
|
19 *
|
Chris@0
|
20 * @covers ::randomBytes
|
Chris@0
|
21 *
|
Chris@0
|
22 * @see \Drupal\Tests\Component\Utility\CryptRandomFallbackTest::testRandomBytesFallback
|
Chris@0
|
23 */
|
Chris@0
|
24 public function testRandomBytes() {
|
Chris@0
|
25 for ($i = 1; $i < 10; $i++) {
|
Chris@0
|
26 $count = rand(10, 10000);
|
Chris@0
|
27 // Check that different values are being generated.
|
Chris@0
|
28 $this->assertNotEquals(Crypt::randomBytes($count), Crypt::randomBytes($count));
|
Chris@0
|
29 // Check the length.
|
Chris@0
|
30 $this->assertEquals(strlen(Crypt::randomBytes($count)), $count);
|
Chris@0
|
31 }
|
Chris@0
|
32 }
|
Chris@0
|
33
|
Chris@0
|
34 /**
|
Chris@0
|
35 * Tests hash generation.
|
Chris@0
|
36 *
|
Chris@0
|
37 * @dataProvider providerTestHashBase64
|
Chris@0
|
38 * @covers ::hashBase64
|
Chris@0
|
39 *
|
Chris@0
|
40 * @param string $data
|
Chris@0
|
41 * Data to hash.
|
Chris@0
|
42 * @param string $expected_hash
|
Chris@0
|
43 * Expected result from hashing $data.
|
Chris@0
|
44 */
|
Chris@0
|
45 public function testHashBase64($data, $expected_hash) {
|
Chris@0
|
46 $hash = Crypt::hashBase64($data);
|
Chris@0
|
47 $this->assertEquals($expected_hash, $hash, 'The correct hash was not calculated.');
|
Chris@0
|
48 }
|
Chris@0
|
49
|
Chris@0
|
50 /**
|
Chris@0
|
51 * Tests HMAC generation.
|
Chris@0
|
52 *
|
Chris@0
|
53 * @dataProvider providerTestHmacBase64
|
Chris@0
|
54 * @covers ::hmacBase64
|
Chris@0
|
55 *
|
Chris@0
|
56 * @param string $data
|
Chris@0
|
57 * Data to hash.
|
Chris@0
|
58 * @param string $key
|
Chris@0
|
59 * Key to use in hashing process.
|
Chris@0
|
60 * @param string $expected_hmac
|
Chris@0
|
61 * Expected result from hashing $data using $key.
|
Chris@0
|
62 */
|
Chris@0
|
63 public function testHmacBase64($data, $key, $expected_hmac) {
|
Chris@0
|
64 $hmac = Crypt::hmacBase64($data, $key);
|
Chris@0
|
65 $this->assertEquals($expected_hmac, $hmac, 'The correct hmac was not calculated.');
|
Chris@0
|
66 }
|
Chris@0
|
67
|
Chris@0
|
68 /**
|
Chris@0
|
69 * Tests the hmacBase64 method with invalid parameters.
|
Chris@0
|
70 *
|
Chris@0
|
71 * @dataProvider providerTestHmacBase64Invalid
|
Chris@0
|
72 * @covers ::hmacBase64
|
Chris@0
|
73 *
|
Chris@0
|
74 * @param string $data
|
Chris@0
|
75 * Data to hash.
|
Chris@0
|
76 * @param string $key
|
Chris@0
|
77 * Key to use in hashing process.
|
Chris@0
|
78 */
|
Chris@0
|
79 public function testHmacBase64Invalid($data, $key) {
|
Chris@14
|
80 if (method_exists($this, 'expectException')) {
|
Chris@14
|
81 $this->expectException('InvalidArgumentException');
|
Chris@14
|
82 }
|
Chris@14
|
83 else {
|
Chris@14
|
84 $this->setExpectedException('InvalidArgumentException');
|
Chris@14
|
85 }
|
Chris@0
|
86 Crypt::hmacBase64($data, $key);
|
Chris@0
|
87 }
|
Chris@0
|
88
|
Chris@0
|
89 /**
|
Chris@0
|
90 * Provides data for self::testHashBase64().
|
Chris@0
|
91 *
|
Chris@0
|
92 * @return array Test data.
|
Chris@0
|
93 */
|
Chris@0
|
94 public function providerTestHashBase64() {
|
Chris@0
|
95 return [
|
Chris@0
|
96 [
|
Chris@0
|
97 'data' => 'The SHA (Secure Hash Algorithm) is one of a number of cryptographic hash functions. A cryptographic hash is like a signature for a text or a data file. SHA-256 algorithm generates an almost-unique, fixed size 256-bit (32-byte) hash. Hash is a one way function – it cannot be decrypted back. This makes it suitable for password validation, challenge hash authentication, anti-tamper, digital signatures.',
|
Chris@0
|
98 'expectedHash' => '034rT6smZAVRxpq8O98cFFNLIVx_Ph1EwLZQKcmRR_s',
|
Chris@0
|
99 ],
|
Chris@0
|
100 [
|
Chris@0
|
101 'data' => 'SHA-256 is one of the successor hash functions to SHA-1, and is one of the strongest hash functions available.',
|
Chris@0
|
102 'expected_hash' => 'yuqkDDYqprL71k4xIb6K6D7n76xldO4jseRhEkEE6SI',
|
Chris@0
|
103 ],
|
Chris@0
|
104 ];
|
Chris@0
|
105 }
|
Chris@0
|
106
|
Chris@0
|
107 /**
|
Chris@0
|
108 * Provides data for self::testHmacBase64().
|
Chris@0
|
109 *
|
Chris@0
|
110 * @return array Test data.
|
Chris@0
|
111 */
|
Chris@0
|
112 public function providerTestHmacBase64() {
|
Chris@0
|
113 return [
|
Chris@0
|
114 [
|
Chris@0
|
115 'data' => 'Calculates a base-64 encoded, URL-safe sha-256 hmac.',
|
Chris@0
|
116 'key' => 'secret-key',
|
Chris@0
|
117 'expected_hmac' => '2AaH63zwjhekWZlEpAiufyfhAHIzbQhl9Hd9oCi3_c8',
|
Chris@0
|
118 ],
|
Chris@0
|
119 ];
|
Chris@0
|
120 }
|
Chris@0
|
121
|
Chris@0
|
122 /**
|
Chris@0
|
123 * Provides data for self::testHmacBase64().
|
Chris@0
|
124 *
|
Chris@0
|
125 * @return array Test data.
|
Chris@0
|
126 */
|
Chris@0
|
127 public function providerTestHmacBase64Invalid() {
|
Chris@0
|
128 return [
|
Chris@0
|
129 [new \stdClass(), new \stdClass()],
|
Chris@0
|
130 [new \stdClass(), 'string'],
|
Chris@0
|
131 [new \stdClass(), 1],
|
Chris@0
|
132 [new \stdClass(), 0],
|
Chris@0
|
133 [NULL, new \stdClass()],
|
Chris@0
|
134 ['string', new \stdClass()],
|
Chris@0
|
135 [1, new \stdClass()],
|
Chris@0
|
136 [0, new \stdClass()],
|
Chris@0
|
137 [[], []],
|
Chris@0
|
138 [[], NULL],
|
Chris@0
|
139 [[], 'string'],
|
Chris@0
|
140 [[], 1],
|
Chris@0
|
141 [[], 0],
|
Chris@0
|
142 [NULL, []],
|
Chris@0
|
143 [1, []],
|
Chris@0
|
144 [0, []],
|
Chris@0
|
145 ['string', []],
|
Chris@0
|
146 [[], NULL],
|
Chris@0
|
147 [NULL, NULL],
|
Chris@0
|
148 [NULL, 'string'],
|
Chris@0
|
149 [NULL, 1],
|
Chris@0
|
150 [NULL, 0],
|
Chris@0
|
151 [1, NULL],
|
Chris@0
|
152 [0, NULL],
|
Chris@0
|
153 ['string', NULL],
|
Chris@0
|
154 ];
|
Chris@0
|
155 }
|
Chris@0
|
156
|
Chris@0
|
157 }
|