1<?php
2
3//define('OBS_DEBUG', 2);
4
5include(dirname(__FILE__) . '/../includes/sql-config.inc.php');
6//include(dirname(__FILE__) . '/../includes/defaults.inc.php');
7//include(dirname(__FILE__) . '/../config.php');
8//include(dirname(__FILE__) . '/../includes/definitions.inc.php');
9//include(dirname(__FILE__) . '/../includes/functions.inc.php');
10
11class IncludesEncryptTest extends \PHPUnit\Framework\TestCase
12{
13
14  /**
15  * @dataProvider providerSafeBase64
16  * @group base64
17  */
18  public function testSafeBase64Encode($string, $result)
19  {
20    $this->assertSame($result, safe_base64_encode($string));
21  }
22
23  /**
24  * @depends testSafeBase64Encode
25  * @dataProvider providerSafeBase64
26  * @group base64
27  */
28  public function testSafeBase64Decode($result, $string)
29  {
30    $this->assertSame($result, safe_base64_decode($string));
31  }
32
33  /**
34  * @depends testSafeBase64Encode
35  * @dataProvider providerSafeBase64Random
36  * @group base64
37  */
38  public function testSafeBase64Random($string)
39  {
40    $encode = safe_base64_encode($string);
41    $decode = safe_base64_decode($encode);
42    $this->assertSame($decode, $string);
43  }
44
45  public function providerSafeBase64()
46  {
47    $result = array(
48      array('Zlwv(,/E%>ieDr25Mr,-?ZOiL',                  'Wmx3digsL0UlPmllRHIyNU1yLC0_Wk9pTA'),
49      array('w&8=K@.3}ULxnw"8+j`I\'yRQyL%RDijctN."',      'dyY4PUtALjN9VUx4bnciOCtqYEkneVJReUwlUkRpamN0Ti4i'),
50      array('T_\\u[WGG6c{o;i*J1/}\'5"\'nJJ.RY',           'VF9cdVtXR0c2Y3tvO2kqSjEvfSc1IiduSkouUlk'),
51      array('(?fY".Q/g7>=cjtK@p[m$v,',                    'KD9mWSIuUS9nNz49Y2p0S0BwW20kdiw'),
52      array('kaoaDKPg;ek"rVi`4{mA,=KQZ%yOz<J;2~E',        'a2FvYURLUGc7ZWsiclZpYDR7bUEsPUtRWiV5T3o8SjsyfkU'),
53      array('Bow[#R+\'A*\':gIpRsL{3q-*2s',                'Qm93WyNSKydBKic6Z0lwUnNMezNxLSoycw'),
54      array('NG6JqTVjnZ>j}NP&#u%|e=i`n2@*QQ^T#o":xo/',    'Tkc2SnFUVmpuWj5qfU5QJiN1JXxlPWlgbjJAKlFRXlQjbyI6eG8v'),
55      array('e\',n,5S/UJoVZOTCHZx6Tn9Hsk7Cn2p',           'ZScsbiw1Uy9VSm9WWk9UQ0haeDZUbjlIc2s3Q24ycA'),
56      array('7+Wz}\'GgFUl=;=A8M]~b1GfS3P`mJCV#',          'NytXen0nR2dGVWw9Oz1BOE1dfmIxR2ZTM1BgbUpDViM'),
57      array('}.X8sPK0D)./=mQmVw,!A|VG',                   'fS5YOHNQSzBEKS4vPW1RbVZ3LCFBfFZH'),
58      array('cDlpvOGgnIlojBkDmU?:vHLVo9{oYaj7u0^jx',      'Y0RscHZPR2duSWxvakJrRG1VPzp2SExWbzl7b1lhajd1MF5qeA'),
59      array('*loZQI@L[P?nq4f-px?J<~TDxK%BmLE,xdLs(C!]',   'KmxvWlFJQExbUD9ucTRmLXB4P0o8flREeEslQm1MRSx4ZExzKEMhXQ'),
60      array('{Nx6#5tgz">e"gLh2\\wkqYOH/ZvX&U*97NBL',      'e054NiM1dGd6Ij5lImdMaDJcd2txWU9IL1p2WCZVKjk3TkJM'),
61      array('ZGYP`R\\!{4`pZ^s1~4gSrbr^>mk',               'WkdZUGBSXCF7NGBwWl5zMX40Z1NyYnJePm1r'),
62      array('"J4l*A8%6D<#Q;0F~m3~m[|D938',                'Iko0bCpBOCU2RDwjUTswRn5tM35tW3xEOTM4'),
63      array('JzY:LY$(^0<Rv*TjAwAx[q/+mRGhA+I;,[2(y',      'SnpZOkxZJCheMDxSdipUakF3QXhbcS8rbVJHaEErSTssWzIoeQ'),
64      array('GQ&>l5tMX!CA<?5Wo-dMuw',                     'R1EmPmw1dE1YIUNBPD81V28tZE11dw'),
65      array('!V=K\\?NkP^4ruh_*?<.UA&L6\\',                'IVY9S1w_TmtQXjRydWhfKj88LlVBJkw2XA'),
66      array('8,G(?\'A>_7p`>qbr!;9``1ssc$WZpc\'>KxD*?Py3', 'OCxHKD8nQT5fN3BgPnFiciE7OWBgMXNzYyRXWnBjJz5LeEQqP1B5Mw'),
67      array('6K\')zm&][xm0m/}G}<I)u)',                    'NksnKXptJl1beG0wbS99R308SSl1KQ'),
68    );
69    return $result;
70  }
71
72  public function providerSafeBase64Random()
73  {
74    $charlist = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()_+-=[]{}\|/?,.<>;:"'."'";
75    $result = array();
76    for ($i=0; $i<20; $i++)
77    {
78      $string = generate_random_string(mt_rand(20, 40), $charlist);
79      $result[] = array($string);
80    }
81    return $result;
82  }
83
84  /**
85  * @dataProvider providerEncrypt
86  * @group encrypt
87  */
88  public function testEncrypt($string, $key, $result)
89  {
90    // Fot tests use static nonce
91    if (OBS_ENCRYPT_MODULE == 'sodium')
92    {
93      $nonce = 'test';
94    } else {
95      $nonce = NULL;
96    }
97
98    $this->assertSame($result, encrypt($string, $key, $nonce));
99  }
100
101  /**
102  * @dataProvider providerEncrypt
103  * @group decrypt
104  */
105  public function testDecrypt($result, $key, $string)
106  {
107    // Fot tests use static nonce
108    if (OBS_ENCRYPT_MODULE == 'sodium')
109    {
110      $nonce = 'test';
111    } else {
112      $nonce = NULL;
113    }
114
115    $this->assertSame($result, decrypt($string, $key, $nonce));
116  }
117
118  /**
119  * @dataProvider providerEncryptIncorrect
120  * @group decrypt
121  */
122  public function testDecryptIncorrect($result, $key, $string)
123  {
124    $this->assertFalse(decrypt($string, $key));
125  }
126
127  /**
128  * @dataProvider providerEncryptRandom
129  * @group random
130  */
131  public function testEncryptRandom($string, $key)
132  {
133    $encrypt = encrypt($string, $key);
134    $decrypt = decrypt($encrypt, $key);
135    $this->assertSame($decrypt, $string);
136  }
137
138  /**
139   * @requires extension sodium
140   * @dataProvider providerEncryptSodiumRandom
141   * @group random
142   */
143  public function testEncryptSodiumRandom($string, $key)
144  {
145    $encrypt = encrypt_sodium($string, $key);
146    $decrypt = decrypt_sodium($encrypt, $key);
147
148    $this->assertSame($decrypt, $string);
149  }
150
151  public function providerEncrypt()
152  {
153    if (OBS_ENCRYPT_MODULE == 'sodium')
154    {
155      $result = array(
156        array('1)AEo@^Cq&n[i&K5Rbk)YmYto|iK6&:j,3w.9',  '1e78V2',   'po1Yr3rjOhi04wDOsyt2W-DEbObyBNLtssRuIxENOe3worH1MiuqNr5ZGmbAElwoU76DFho'),
157        array(',>3(K!$eu0QXr6SBW[$',                    'jPpz9',    '8u73mdXrtw4ToQw9CBvMLfrugtd7gS_JtoU695dyInfpnm0'),
158        array('Xm+0JOu1pZ#mLu4k !h<J~nRC',              'q1I5LcMX', 'MgXHgCN6WtNNsjUW1i5p6sp9j79gT_BGDXhSYUFnRftEi8rZMn3bsgA'),
159        array('nU1I|X61$s WT \'{Ia)25|\'f.F',           'tTfKUX6',  'Ut5IyaVVRaCYW2aJPAXc5qiiLsdJ1jd7sUAfr8LDqORrpk9NQcSd4aj-'),
160        array('3UrLXOOI/*/VW3\\@l8#DkLFpm(8U@$%bsKTmC', '803aRMNF', 'CRqvvvSTUaUCK3pQr2ScK4P1gewotrT76bIcCfeTX2Kz-USHTS1KjO2TAEykRtK3ITdiFIE'),
161        array('g&W$w[K(rt(jwWC{fYDw\'M;I/1gNo',         'MpRE',     'PVenPWwrPzd15RhKLLjIm9ma8iFAcNZnH34Ts2Br4pI5U5Hsw3fDjzpLwtMs'),
162        array('*R$oh3nu-pe2#}ovVT!Wr/Rk?hj<',           'EGqi',     '2BlR5cS-6WGPz-xXHdh8mv79wncsR4Ca4HHDKiqh2pgtCeppn8-9RCFpK2A'),
163        array('CUo<&\\Te-s2O[zsQg&m%_',                 'Jbyjh',    'Apxo7cRz4oQYzviARjDmYkZpNiCmS29i0quCu--sJJj58v6fmw'),
164        array('y+U/0i&:Z$]+\\G`<rPc|\\{-7e^',           'LuMhrEPs', 'wwtra16iR0qbMMhGWNmRlTFbjVDmZpanKoQOJ_-d4DFMi4cJ4S9Tu7Hs'),
165        array('=V>00QV807A7*seug3 fh^n;7\'w&CX0x!3P~',  'zbOj0',    'w5AKoKG_iGY41NzzeP4T3dZAqFnUUwo-Wky4WjbRB_fPNOtGuXxFpVuO3awmeV_ZiAwJDA'),
166        array('rl3yLUk<{bApLXJ@a@\\Y{M\\,z:4',          'QCGdqu',   '4F6MQxnzl71QpP3vJ3yutgpLqFRYkCnez1gMVFIkhIZ4qN7RIl3x1Y6k_Q'),
167        array('*rF@W)b9GOu<[`RR1/,#FnQCE3PgI',          'QQOd',     'c6baoXI9uni5BAWaRYCYQF8v2WgHcGpeqeHkWP3Dp2QJ7KHKUxF2zNrarwpD'),
168        array('j$kY#JNym311~0hVo%HX@7Fsks(g',           'PxFdn97J', 'TwtFAgU85cU7ypq8EEx75BPk8RZaTS0bj7nEak3_4Rx6KTWFdB4RkM_Pwy8'),
169        array(']&rQB>~nOf!A4h7}X~G$\\!uD$zGc*a',        '9wlzwu78', 'YwsuhTT5r9LGTCJoOzWLtrNJQqqCEHPTcqPzMTtY3LHQodU_QIm3z-TQccH62A'),
170        array('Y7RZTJV>U\\"mx3(C!5hKgBw-',              '7RyavjK',  'osFXadNstXIwlACmVYICQXV-djwzcY1dYx1So7UcGYEAU-SJ_GwuBQ'),
171        array('!t#.;(bK}k@kVrf;#}Q-jp|;?hE|+.O',        'i1txZiB',  'e33OXAxT2XWXLODhYPgLNsed3EVvHfbTXShFS8IJNWkmKEyl3xKKTySwYk4MP-I'),
172        array('>1`k@Lr4|3ot4WrgA!g||8}vSZhBT=c13|,/_{', 'OGHuN',    'rO5gPJnZM8zHs3M-MzJHU-86zxvJBNwe_1cXGaJoR_nmcNNXaLJss0kaTp1zmS2zec_XmJb5'),
173        array('\\0TcEC6wGL# >JXv6 `eJ',                 '7zaLTGW',  'Fl2wMTFWLFP0pb02RlrGGut-HNm1DvAB7vC0xt0CXNJ1h4_hxg'),
174        array(':r")v$eXry,13E!{7?K.U%-@SDD',            'hvHW',     'kQwfSPwLmHBgz_n8wbQPhipQL_pD7ZJkdbc9IuUTE7MGpucR2ZeeibP5iw'),
175        array('q%S/wOQhM%f3G06C1#uJgjIMWf\\`',          '4Zlb',     'A4uDbyfqHaXVSmRB2Hs6C4gIJKgKij7w_H0pgWJcTFskDlhR32h0jZdb2LI'),
176      );
177    } else {
178      // Mcrypt based encode
179      $result = array(
180        array('1)AEo@^Cq&n[i&K5Rbk)YmYto|iK6&:j,3w.9',  '1e78V2',   '22x_TJwDCwSvVmx5eGYgZwR70vN03nytSZGiAgNPYebjrQmwYs-oBAqUmRd5B9jHlk4Dmq6B45clMfEDZj4Amg'),
181        array(',>3(K!$eu0QXr6SBW[$',                    'jPpz9',    'shwqhvs-EBr4cPKAhKwx8Tg6hSMSyNjPHDh8p-e94qU'),
182        array('Xm+0JOu1pZ#mLu4k !h<J~nRC',              'q1I5LcMX', '3Ze4oHSqI5oN2AwGfFLqKerVIkIO8hcpTRmMFrpVMiY'),
183        array('nU1I|X61$s WT \'{Ia)25|\'f.F',           'tTfKUX6',  'UBBFIuqdWz-D59B1W9v4axN5N5BONcVxK13E_cVj6jM'),
184        array('3UrLXOOI/*/VW3\\@l8#DkLFpm(8U@$%bsKTmC', '803aRMNF', '7e7bKnx43eHNaz-BF3DcRDIyRXc_n7i8ANX4I0vtifzjpPPofy4GAuacKA5lWmhxLcPmm0hooEfR7NbR2RpqQA'),
185        array('g&W$w[K(rt(jwWC{fYDw\'M;I/1gNo',         'MpRE',     '35tNZp_7BdOdl78Kr7g6C9l-tGUWsDGjnPaLSVvsdk4'),
186        array('*R$oh3nu-pe2#}ovVT!Wr/Rk?hj<',           'EGqi',     'tp1QhPUl_OY_SdSXlEk8uUj06J2ODFMG069SfR1UWTY'),
187        array('CUo<&\\Te-s2O[zsQg&m%_',                 'Jbyjh',    'FH1bgmum4IhTeWT_WUS_P4aKUXTBUux-UDdpBxoypmI'),
188        array('y+U/0i&:Z$]+\\G`<rPc|\\{-7e^',           'LuMhrEPs', 'i9Q4ugsCpZS5M0xYwmm3rnvQcupBCNEzXvhYljpI6K8'),
189        array('=V>00QV807A7*seug3 fh^n;7\'w&CX0x!3P~',  'zbOj0',    'DzzUC_QTjgm09jUP6opubGBec-_y2t_qTzznu6GDW5dQH-9OwogLsh8bv1E56gMtBzneWrgyb0zv9ljdKi0ssQ'),
190        array('rl3yLUk<{bApLXJ@a@\\Y{M\\,z:4',          'QCGdqu',   'JTUFKcO0og8-NJtvl0PY8vQbLcjpBQzOI18doptwju8'),
191        array('*rF@W)b9GOu<[`RR1/,#FnQCE3PgI',          'QQOd',     'PoWS8Yy7cjN8cfk44Wd_mz3wiwf_zVVDk-Sh75UAt94'),
192        array('j$kY#JNym311~0hVo%HX@7Fsks(g',           'PxFdn97J', 'hWwJI1bh6LM6y6lsbekda6e4Gcedf7zkZRdKe882CAE'),
193        array(']&rQB>~nOf!A4h7}X~G$\\!uD$zGc*a',        '9wlzwu78', 'uAL00RVr8X9MSU8Z4o63CpyoU8AQv8etF5aB1ZVayfU'),
194        array('Y7RZTJV>U\\"mx3(C!5hKgBw-',              '7RyavjK',  'M55vgEwiLOKLMSPmLGldunnkBBRAPQAEcUwpgRRrxW0'),
195        array('!t#.;(bK}k@kVrf;#}Q-jp|;?hE|+.O',        'i1txZiB',  'Db7ktjeBwCfp1ZNT1B3EuGN0zoJOA7Ie6C_0JINuLvU'),
196        array('>1`k@Lr4|3ot4WrgA!g||8}vSZhBT=c13|,/_{', 'OGHuN',    'Vc9BEP_JFshoM65Cvn7cs82W9IybUZdUtn5iBin5QGgOgTc8Gko2bVrtYC9TZ7__3v4diH8tRdN4CmBQBt9GAg'),
197        array('\\0TcEC6wGL# >JXv6 `eJ',                 '7zaLTGW',  'JPz__8TD8GIYX3IoLbicq67PU4BqC-3oyTniwirQvY8'),
198        array(':r")v$eXry,13E!{7?K.U%-@SDD',            'hvHW',     'x_fL0dKsVf7Rv_cWYbyB_7FGniyZgFiI_VfdLRyPPRc'),
199        array('q%S/wOQhM%f3G06C1#uJgjIMWf\\`',          '4Zlb',     'rscMSDQGtZBBEZtj9ToKAPp1oTPZuNFJYePmGNVQMyo'),
200      );
201    }
202    return $result;
203  }
204
205  public function providerEncryptIncorrect()
206  {
207    if (OBS_ENCRYPT_MODULE == 'sodium')
208    {
209      $result = array(
210        array('1)AEo@^Cq&n[i&K5Rbk)YmYto|iK6&:j,3w.9',  '1e78V2',   'po1Yr3rjOhi04wDOsyt2W-DEbObyBNLtssRuIxENOe3wH1MiuqNr5ZGmbAElwoU76DFho'),
211        array(',>3(K!$eu0QXr6SBW[$',                    'jPpz900',  '8u73mdXrtw4ToQw9CBvMLfrugtd7gS_JtoU695dyInfpnm0'),
212      );
213    } else {
214      // Mcrypt based encode
215      $result = array(
216        array('1)AEo@^Cq&n[i&K5Rbk)YmYto|iK6&:j,3w.9',  '1e78V2',   '22x_TJwDCwSvVmx5eGYgZwR70vN03nytSrQmwYs-oBAqUmRd5B9jHlk4Dmq6B45clMfEDZj4Amg'),
217        array(',>3(K!$eu0QXr6SBW[$',                    'jPpz900',  'shwqhvs-EBr4cPKAhKwx8Tg6hSMSyNjPHDh8p-e94qU'),
218      );
219    }
220    return $result;
221  }
222
223  public function providerEncryptRandom()
224  {
225    $charlist = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()_+-=[]{}\|/?,.<>;:"'."'";
226    $result = array();
227    for ($i=0; $i<20; $i++)
228    {
229      $string = generate_random_string(mt_rand(20, 40), $charlist);
230      $key    = generate_random_string(mt_rand(4, 8));
231      $result[] = array($string, $key);
232    }
233    return $result;
234  }
235
236  public function providerEncryptSodiumRandom()
237  {
238    $charlist = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()_+-=[]{}\|/?,.<>;:"'."'";
239    $string = generate_random_string(mt_rand(20, 40), $charlist);
240
241    $result = array();
242    $result[] = array($string, generate_random_string(SODIUM_CRYPTO_SECRETBOX_KEYBYTES - 1), generate_random_string(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES - 1));
243    $result[] = array($string, generate_random_string(SODIUM_CRYPTO_SECRETBOX_KEYBYTES - 1), generate_random_string(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES));
244    $result[] = array($string, generate_random_string(SODIUM_CRYPTO_SECRETBOX_KEYBYTES - 1), generate_random_string(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES + 1));
245    $result[] = array($string, generate_random_string(SODIUM_CRYPTO_SECRETBOX_KEYBYTES), generate_random_string(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES - 1));
246    $result[] = array($string, generate_random_string(SODIUM_CRYPTO_SECRETBOX_KEYBYTES), generate_random_string(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES));
247    $result[] = array($string, generate_random_string(SODIUM_CRYPTO_SECRETBOX_KEYBYTES), generate_random_string(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES + 1));
248    //$result[] = array($string, generate_random_string(SODIUM_CRYPTO_SECRETBOX_KEYBYTES + 1), generate_random_string(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES - 1));
249    //$result[] = array($string, generate_random_string(SODIUM_CRYPTO_SECRETBOX_KEYBYTES + 1), generate_random_string(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES));
250    //$result[] = array($string, generate_random_string(SODIUM_CRYPTO_SECRETBOX_KEYBYTES + 1), generate_random_string(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES + 1));
251
252    return $result;
253  }
254}
255
256// EOF
257