]> git.mxchange.org Git - friendica.git/blob - tests/src/Util/CryptoTest.php
Merge branch '2021.03-rc' into copyright-2021
[friendica.git] / tests / src / Util / CryptoTest.php
1 <?php
2 /**
3  * @copyright Copyright (C) 2010-2021, the Friendica project
4  *
5  * @license GNU AGPL version 3 or any later version
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU Affero General Public License as
9  * published by the Free Software Foundation, either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Affero General Public License for more details.
16  *
17  * You should have received a copy of the GNU Affero General Public License
18  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
19  *
20  * This is in the same namespace as Crypto for mocking 'rand' and 'random_init'
21  */
22
23 /// @todo Use right namespace - needs alternative way of mocking random_int()
24 namespace Friendica\Util;
25
26 use phpseclib\Crypt\RSA;
27 use phpseclib\Math\BigInteger;
28 use PHPUnit\Framework\TestCase;
29
30 class CryptoTest extends TestCase
31 {
32         /**
33          * Replaces random_int results with given mocks
34          *
35          */
36         private function assertRandomInt($min, $max)
37         {
38                 global $phpMock;
39                 $phpMock['random_int'] = function ($mMin, $mMax) use ($min, $max) {
40                         self::assertEquals($min, $mMin);
41                         self::assertEquals($max, $mMax);
42                         return 1;
43                 };
44         }
45
46         public function testRandomDigitsRandomInt()
47         {
48                 self::assertRandomInt(0, 9);
49
50                 $test = Crypto::randomDigits(1);
51                 self::assertEquals(1, strlen($test));
52                 self::assertEquals(1, $test);
53
54                 $test = Crypto::randomDigits(8);
55                 self::assertEquals(8, strlen($test));
56                 self::assertEquals(11111111, $test);
57         }
58
59         public function dataRsa()
60         {
61                 return [
62                         'diaspora' => [
63                                 'key' => file_get_contents(__DIR__ . '/../../datasets/crypto/rsa/diaspora-public-rsa-base64'),
64                                 'expected' => file_get_contents(__DIR__ . '/../../datasets/crypto/rsa/diaspora-public-pem'),
65                         ],
66                 ];
67         }
68
69         /**
70          * @dataProvider dataRsa
71          */
72         public function testPubRsaToMe(string $key, string $expected)
73         {
74                 self::assertEquals($expected, Crypto::rsaToPem(base64_decode($key)));
75         }
76
77
78         public function dataPEM()
79         {
80                 return [
81                         'diaspora' => [
82                                 'key' => file_get_contents(__DIR__ . '/../../datasets/crypto/rsa/diaspora-public-pem'),
83                         ],
84                 ];
85         }
86
87         /**
88          * @dataProvider dataPEM
89          */
90         public function testPemToMe(string $key)
91         {
92                 Crypto::pemToMe($key, $m, $e);
93
94                 $expectedRSA = new RSA();
95                 $expectedRSA->loadKey([
96                         'e' => new BigInteger($e, 256),
97                         'n' => new BigInteger($m, 256)
98                 ]);
99
100                 self::assertEquals($expectedRSA->getPublicKey(), $key);
101         }
102
103         /**
104          * @dataProvider dataPEM
105          */
106         public function testMeToPem(string $key)
107         {
108                 Crypto::pemToMe($key, $m, $e);
109
110                 $checkKey = Crypto::meToPem($m, $e);
111
112                 self::assertEquals($key, $checkKey);
113         }
114 }
115
116 /**
117  * A workaround to replace the PHP native random_int() (>= 7.0) with a mocked function
118  *
119  * @return int
120  */
121 function random_int($min, $max)
122 {
123         global $phpMock;
124         if (isset($phpMock['random_int'])) {
125                 return call_user_func_array($phpMock['random_int'], func_get_args());
126         }
127 }