1<?php
2/**
3 * @category   Horde
4 * @package    Crypt_Blowfish
5 * @subpackage UnitTests
6 */
7
8/**
9 * @category   Horde
10 * @package    Crypt_Blowfish
11 * @subpackage UnitTests
12 */
13class Horde_Crypt_Blowfish_CbcTest extends Horde_Test_Case
14{
15    /**
16     * @dataProvider vectorProvider
17     */
18    public function testOpensslDriver($vector)
19    {
20        if (!Horde_Crypt_Blowfish_Openssl::supported()) {
21            $this->markTestSkipped();
22        }
23
24        $this->_doTest($vector, 0);
25    }
26
27    /**
28     * @dataProvider vectorProvider
29     */
30    public function testMcryptDriver($vector)
31    {
32        if (!Horde_Crypt_Blowfish_Mcrypt::supported()) {
33            $this->markTestSkipped();
34        }
35
36        $this->_doTest($vector, Horde_Crypt_Blowfish::IGNORE_OPENSSL);
37    }
38
39    /**
40     * @dataProvider vectorProvider
41     */
42    public function testPhpDriver($vector)
43    {
44        $this->_doTest(
45            $vector,
46            Horde_Crypt_Blowfish::IGNORE_OPENSSL |
47            Horde_Crypt_Blowfish::IGNORE_MCRYPT
48        );
49    }
50
51    public function vectorProvider()
52    {
53        $data = file(dirname(__FILE__) . '/fixtures/vectors_cbc.txt');
54        $vectors = array();
55
56        foreach ($data as $val) {
57            list($key, $iv, $plain) = explode(' ', trim($val));
58            $vectors[] = array(
59                array(
60                    'key' => pack("H*", $key),
61                    'iv' => pack("H*", $iv),
62                    'plain' => pack("H*", $plain)
63                )
64            );
65        }
66
67        return $vectors;
68    }
69
70    protected function _doTest($v, $ignore)
71    {
72        $ob = new Horde_Crypt_Blowfish($v['key'], array(
73            'cipher' => 'cbc',
74            'ignore' => $ignore,
75            'iv' => $v['iv']
76        ));
77
78        $encrypt = $ob->encrypt($v['plain']);
79
80        // Let's verify some sort of obfuscation occurred.
81        $this->assertNotEquals(
82            $v['plain'],
83            $encrypt
84        );
85
86        $this->assertEquals(
87            $v['plain'],
88            $ob->decrypt($encrypt)
89        );
90    }
91
92}
93