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_EcbTest 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.txt');
54        $vectors = array();
55
56        foreach ($data as $val) {
57            list($key, $plain) = explode(' ', trim($val));
58            $vectors[] = array(
59                array(
60                    'key' => pack("H*", $key),
61                    'plain' => pack("H*", $plain)
62                )
63            );
64        }
65
66        return $vectors;
67    }
68
69    protected function _doTest($v, $ignore)
70    {
71        $ob = new Horde_Crypt_Blowfish($v['key'], array(
72            'cipher' => 'ecb',
73            'ignore' => $ignore
74        ));
75
76        $encrypt = $ob->encrypt($v['plain']);
77
78        // Let's verify some sort of obfuscation occurred.
79        $this->assertNotEquals(
80            $v['plain'],
81            $encrypt
82        );
83
84        $this->assertEquals(
85            $v['plain'],
86            $ob->decrypt($encrypt)
87        );
88    }
89
90}
91