diff vendor/pear/crypt_gpg/tests/DecryptAndVerifyTest.php @ 0:1e000243b222

vanilla 1.3.3 distro, I hope
author Charlie Root
date Thu, 04 Jan 2018 15:50:29 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/pear/crypt_gpg/tests/DecryptAndVerifyTest.php	Thu Jan 04 15:50:29 2018 -0500
@@ -0,0 +1,1458 @@
+<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Decrypt verify tests for the Crypt_GPG package.
+ *
+ * These tests require the PHPUnit 3.6 or greater package to be installed.
+ * PHPUnit is installable using PEAR. See the
+ * {@link http://www.phpunit.de/manual/3.6/en/installation.html manual}
+ * for detailed installation instructions.
+ *
+ * To run these tests, use:
+ * <code>
+ * $ phpunit DecryptAndVefifyTestCase
+ * </code>
+ *
+ * LICENSE:
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>
+ *
+ * @category  Encryption
+ * @package   Crypt_GPG
+ * @author    Michael Gauthier <mike@silverorange.com>
+ * @copyright 2005-2010 silverorange
+ * @license   http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
+ * @version   $Id$
+ * @link      http://pear.php.net/package/Crypt_GPG
+ */
+
+/**
+ * Base test case.
+ */
+require_once 'TestCase.php';
+
+/**
+ * Tests decrypt verify abilities of Crypt_GPG.
+ *
+ * @category  Encryption
+ * @package   Crypt_GPG
+ * @author    Michael Gauthier <mike@silverorange.com>
+ * @copyright 2005-2010 silverorange
+ * @license   http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
+ * @link      http://pear.php.net/package/Crypt_GPG
+ */
+class DecryptAndVerifyTestCase extends Crypt_GPG_TestCase
+{
+    // string
+    // {{{ testDecryptVerify()
+
+    /**
+     * @group string
+     */
+    public function testDecryptVerify()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('5dGf4//0CqBmlexYjyS7agt4Zn4');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1258956392);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedResults = array(
+            'data'       => 'Hello, Alice! Goodbye, Bob!',
+            'signatures' => array($signature)
+        );
+
+        // encrypted with first-keypair@example.com, signed with
+        // first-keypair@example.com
+        // {{{ encrypted data no passphrase
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+hQIOA5+T+RFnKO8SEAf+M1KnzLUvmJMtRTMpy3G2C8iJN1oQPznWDlL6NqxNeS6N
+8ie5dXmaG9csQUx1Ys8QRaPDg6ElVIrJOXQ0CIW3mqxZS7+5X5akH5DQ0Ye4Rggx
+yqADpE2z99tlYiNlpEqtG4oAUXzJjWiw8Y6MFg/xAHQUYMhEhZRB4OaSQGVPpxYs
+s6YBfRGmWdNrGgPgcwoEmoHvmVKtVOfBNzO9cpl7k2pV12p6eG6jZ1qcCQkSJZlY
+z2WsnDYZ9wbXuLM4XanGiJiBau0f+nJqDozmOVvc5Avz1qrQD3Dd5C5cy/e+XPdn
+wzTgg3myMrwudAeJZzwMrpcrGwvdzAKE8/7TbNO+3Qf+NqfrApMVUrsFQBdzlLp9
+7cV8nD0uF8ioQjPg0lzJajJdqjEkKB7h9i9fQgL/SBZ29HupsUqDoqmpCVU/B6M0
+YzphMp1qWDRkk5dmpcTppTBsVx1KXCqLQFBIy+Fhc31NZRs1ccaVF3uxaOyMzFhb
+FaWlUq03SjU9SlkYiFwyfyDysK3uoGeLfFh5yhH6ly5kthwLo2ov/GANF3pL0cxv
+mGUcnZbkhk+MWjmz83loedhh2XpTLqRGuhzWPTQlOUQzf6xbj5zCkzWdnbqFQu19
+Et5O3whgv+ufNvD5LGc/lGQeV8wV7EXcde0ISUa8LKyU+eseS+W6IHsQLPupkCQG
+u9KoAQUL3Q3vX1C7WmzS2sudcAulSR8bRYfr6lJ5udRvek7M7tYdLbE1ZLua23T8
+NId1euFhWftuaFjGDRvY37ab+M+zTnMtogSZDkCVyFrM2n4/hFfX9eKX6ljPxPmk
+lEmn966i8e4K0jL0Ydvf7qWEVc5uov7xorYnkwvIbaW8SyUPowenfN3qODv7C0Yj
+0kOgiJnRxZq+MYOR1b1L6fS0y7jDPI+er8ft
+=pycC
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $results = $this->gpg->decryptAndVerify($encryptedData);
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyNoPassphrase()
+
+    /**
+     * @group string
+     */
+    public function testDecryptVerifyNoPassphrase()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('0YWPoUQhN5G4uTi45QLy3GG3RWg');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1258956262);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedResults = array(
+            'data'       => 'Hello, Alice! Goodbye, Bob!',
+            'signatures' => array($signature)
+        );
+
+        // encrypted with no-passphrase@example.com, signed with
+        // first-keypair@example.com
+        // {{{ encrypted data no passphrase
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+hQIOAyS/OAcAwUtPEAf+KCytTYgKglBxxU9jAr2i0WVXhBcfyVyFq0N4or4HGMSz
+zBw3eXw/JI77PY4pBxtBDCzPgSox8T8abh6OU3LDu3Zy9kvKcbQxYCSOeJkPBDpK
+OtJ2Sw7CJ7QIvoSyqmRmCjrji9OU3k9ulQQ/5GauAP4QnUnt6lNkz+FOWVl5wzqc
+yjXkRgfmKNBzYVscgdH+YDEUTM+edN+NflzqLk8HLU98TmINbbVJwnPvpCCvRGh4
+SDDaF7WmiIjSqI15Bn7F/l+8ScxvC8EH6wxR9gqS+B9DlqVpjIoYa57SPXLcshvQ
+r02OjC8d8u2oyW9TLqnTirsf347Dzo7rRwm3GbdSrgf9FoQjymAzSx6izx9BsMg+
+6XJV0jSHW+jDjiJRoMAYXKc/s/y8MWRo/irCTPjReLEHWvKmISXynXqxHy1Dw5SN
+1VQAPIH1ftqEVZvGtA11vLPjPYenCRCkkwz8AHqLmqZt6V2A49zPen4+H+Tp/5xr
+s7TQhygo9vmTTzniBqV4lYbOyshcUTVlUErba+ffivKQPNnM+oCZXyUbJTsMlGv+
+elZqUKlNEBXivHnmIbwP/vpZ1WMMewCeij1/Z6OGbbT51dh9qeqPRj96dF351Lbk
+GPxLw5uP2bIzGQjGIBeKHrl2kkRxKk/MX6QPrMHR4KlUpPRfKcQLC0TGPTEPu6ya
+5tKoAdoBuKYNoFk2txsseRQTI/3v5pudNsdh5R/s+PMs+HpxyaFemI3eJb05E4Jx
+zGJX5UiMIb/Yr0zCvlOaDx0NjPwIoUDqtZw6YqA59/BKmaRyqGoXk0UJMK2hAJKN
+yTrj0nUDWFgoKzLHu3EQtYffLUrrjVc6BB8pUmrZKBisGnXFBQvShkzdWmzUT655
+JQfVfeZmgq+UAsfqIlrWBfDcqfyvWeAAZ7qH
+=1oh0
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $results = $this->gpg->decryptAndVerify($encryptedData);
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyKeyNotFoundException_decrypt()
+
+    /**
+     * @expectedException Crypt_GPG_KeyNotFoundException
+     *
+     * @group string
+     */
+    public function testDecryptVerifyKeyNotFoundException_decrypt()
+    {
+        // was encrypted with missing-key@example.com, signed with
+        // first-keypair@example.com
+        // {{{ encrypted data
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+hQIOA82wFXJyxZnNEAgAwSoWLKDj/dyotGwYCT60IHC7vPGKbcbd9LMEQ8hOobKS
+21aHeUBft9vlAnZabzPSqeQGYoD0BugONncV45HWlA3QD0KGcVuE6FaWIkexRNsK
+S8MwVpcCgTuVkmSBgZbAS9jl7ODGGNdfGCb20fpgWFx8rv6q14aPUrD1bw5VVWeS
+vLGuRGA+pcBwFlDTRvYtM0UnggfPMn6uH0CKI8uZsKkyHCu2zSCBLYsuo87sY6zJ
+2UwEDyuYvr38HmcNZkb8vk7gpLCeJvFLeLYwpRrQcQy0Q+iElNPFXl5HzlwTNDq5
+5IIiQNlaCV6vUKeX5VhU4i6h4yUWegVoIro4h7KwYQf8CxTrKUnI6WfDuvttU5Z7
+q+7WCTDEnmOT7C2AvOKyfNXlERQnDtY1LHjJe6AEyP2RHnTrHR6Nbi4zQfl4BSZX
+hH+ojM/001ir5/m8cOaMpQzHnMyUIi1HenpjJFo5fsMYg+K7j88X4KWlu3YFeB+O
+xAp/mf7qUiiTKeDdGJE0u3NkFmXz/G/QDp8zwpqG+/UpiEjMm4OdFMwP68l9FWRX
+d1ql5Rfeb50HPIjcmoa1iHq0IJCbT2xXxCm7QyGRy5PwSTMsQnrDUvj6zIBhqusZ
+CTHqBXBH3jsDKTBJGQNwOGA418kcEpRsHY+C53rPhoUDnjzBY7dzIstQFsCy1bPZ
+qNKoAfFsNjinvrwexRqkDypYLxEKs/nrMM4q+yz8n6Q2BqPT6YvOciHAkE0k4I46
+STZqsFTwWxgWmhLlEFvYul3BWEp5Ow5J6+6TZrHCDIFhoQIHesxmsWVxxlgTG+0M
+TS1210ua1nkP+DdWQUBzdDHFxAWWG2pUxzApIPBD2wyeLd1HMVpOjQGpFxMuO8Pd
+ZcGqhMpjECMzc4DOAPFbdKwgWKXi95v4zeUf
+=Ze0h
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $this->gpg->decryptAndVerify($encryptedData);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyKeyNotFoundException_verify()
+
+    /**
+     * @expectedException Crypt_GPG_KeyNotFoundException
+     *
+     * @group string
+     */
+    public function testDecryptVerifyKeyNotFoundException_verify()
+    {
+        // was encrypted with first-keypair@example.com, signed with
+        // missing-key@example.com
+        // {{{ encrypted data
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1
+
+hQIOA5+T+RFnKO8SEAgAnQrKNrq6O4F0tlex+I5aklo7ElBbSPfa0k4SvX80m+n3
+raM84mpnUzpoXrRa6zSM2IxzF7oWLHHAkBkWaTYdFFWegPbQk4G5rlURZDsLtamb
+y3tXcOMuSMhj3b9XrR2YzfREj0AnuEvYOsd++KpjcEYgcVZOb5tCn+9UKfjop/pZ
+i9sAJMYbdavxoa8DUuIMT6v0C/zNiuSFlQ23kRWB+LUR0tTIoHpb+0U0ITFLSMIr
+jc9K6Zz805Tbu6xX8UXRMIdfJTJkmVWTOD8u8OUPGBxhBuZmbVfH4x+fKybcSVJJ
+akqX28LjaqI+WvD/zh9l78V7foMEWd7porUzBC7z+wgAzh3LBHb2naFg4CZSVlYa
+uuQ64G1ct0uxwVr0p0/4jA5nEK+WgFABPu1YPnIO3md8dBnkfs92g+0msKgB3FOn
+T5+FlgkR+p2Y4knNggSmJGErCMYAq17lCu3bAlHFKwaowCBFoXrFCGBH2qgXD+CM
+Rgq5gWXPLrcqnGPefdV56i+8X+t7oHCzIxX836IQICWMpOdhWMzDz44ctC5IBTJp
+bDgx2pmkU+i51Q+PfK7k8eBIvlrvBGCQcUiNjCoPKAM3OjGNAQF0JraWPG2q0OSM
+aZXKg9aCrQRHceCjwTf8dYRDm6yqGNeVzOnkDibPT3ySYmXKaVDbB8AquS72wE1n
+ktLAxwGOjaM4MSQOGT+8eggngFidGak7957SWZRaqsXdeh6HtxKWni+XTBmWAg2m
+6MnCIiVxD5A75m75ncdbRgtx2Sl9B/kCTC6Ak6hQ3iFpJKuQSZcD2gyGRSE8Ly7u
+cX4jPXcYQaWLi+wVpLaYr3hSsjx2WgVk4oz+X2Kt0qQw+yWIkRw7ErmMl0ML0L7j
+YePAE6UbBSR131nDKmXDUlLsV4GavAclENL5Kp6Yd8ia3h1Jdtl0waH5cCLswhf3
+oi0u0bIalnZwDkFSDGiWgDQyJ8XgPFcUx8fp3dC8FVxXbd3quMxZU6/5K/dQ0LIh
++Ldlz797sLtl1lHmlaLEzTzJZriLiEiOCZeOrhbgqcGMLurzfsCWYH+BZFzH8iFJ
+yDoUVsWLlvY+6gelAE9Dlzdq9m8rIALwf0Udlsdn/NBaFxarT0nl68u5fSJo8UA2
+MuZd2EB/BKXWvAo5Ea9CQ3DrrDkbwlE3PKrWlMos6dFb/SWxtmKfEeNYhYJsbwsv
+x5MBl/I2kBCHeH4=
+=hojs
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $this->gpg->decryptAndVerify($encryptedData);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyKeyNotFoundException_both()
+
+    /**
+     * @expectedException Crypt_GPG_KeyNotFoundException
+     *
+     * @group string
+     */
+    public function testDecryptVerifyKeyNotFoundException_both()
+    {
+        // was encrypted and signed with missing-key@example.com
+        // {{{ encrypted data
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+hQIOA82wFXJyxZnNEAgA0oz13vLInSM0GlhLyIQ5fRXlttY6jOO6xgUH3MhCqExN
+KWLBp9VE+iAzdsnF8hjP+u48qNjYj7Jvyiu8vf1SD9ScYoEiKar0EhZVLfCxX7PC
+4ZWCSEWD5h5nBSabdL00f3vL//GrQtMAwcKP4p+pEyxTEoSg7xp10+F0JqnhlIqh
+vsOeP4vAeYi1v7x0UyoNxzHbfGb3gjwNaWEixBPMekoEnZ8SOORL5yrOctOjcFxz
+hKQFIcJv5vG/Ozs6Wm5q+uvzkZDc2X2dOnb1SpCP5cxNC0g37CiwPIL8ArBcu+yP
+5HSC8YhyyVcQTuIdb0a9t/IK0HNfEOF5gCBCQ462Xwf/X3PQgKvvK76DQ8xvukB8
+6yKwaHv2K8NWFyTuPppiiRztVI13zPt/Jjw/YPNE/qUzONiggqWM0tGtVkbNRzic
+dMEaAfwmZSix0alMPnDuVNyq9AnCUEjkXKTByWDL4pejvB541dA+rtU1D8pV1/8X
+P+oQ+j1EnJitYSTdsnD4YC88/q2RnQTmibmyMclVVk3el6OvZN0Gj0Y2bd9c4LC+
+1reFYZHrX0FcsGIVuHEK/VikTqoWhFOTYUFXFGSE/AGvotfHj2QG3sd297IaSbVi
+C1LwWGvpdZ2yw4RV4Zgrqvg8WOL9maj/mX8aE9/gzs9XH2vuucDBOC0RrQPsM6wb
+ANKoAdExlp+92b69YSNjP2bRQFjN3gFKaGfBm4ULUhRTFnlfBGIIa+2KHUNB7dYk
+obUon363/o/8wdmlXewIwPLK8nQsYXhAyxJcf9o90tqv1L83ZMMLU7FqBkUCmT4a
+9EPXbxnaeO3sa8ZuGm0ilGuIFsK24pBOXtYESZ4ix6y7PZOXCJDun4+dFKcfMG+0
+t8TnSlDaIKEuve9kUGwmO8Z3LsYJEsRCsHyN
+=YNhC
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $this->gpg->decryptAndVerify($encryptedData);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyKeyNotFoundVerifyIgnoreErrors()
+
+    /**
+     * @group string
+     */
+    public function testDecryptVerifyKeyNotFoundIgnoreVerifyErrors()
+    {
+        $signature = new Crypt_GPG_Signature();
+        $signature->setKeyId('8E3D36B1EA5AC75E');
+
+        $expectedResults = array(
+            'data'       => 'Hello, Alice! Goodbye, Bob!',
+            'signatures' => array($signature)
+        );
+
+        // was encrypted with first-keypair@example.com, signed with
+        // missing-key@example.com
+        // {{{ encrypted data
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1
+
+hQIOA5+T+RFnKO8SEAgAnQrKNrq6O4F0tlex+I5aklo7ElBbSPfa0k4SvX80m+n3
+raM84mpnUzpoXrRa6zSM2IxzF7oWLHHAkBkWaTYdFFWegPbQk4G5rlURZDsLtamb
+y3tXcOMuSMhj3b9XrR2YzfREj0AnuEvYOsd++KpjcEYgcVZOb5tCn+9UKfjop/pZ
+i9sAJMYbdavxoa8DUuIMT6v0C/zNiuSFlQ23kRWB+LUR0tTIoHpb+0U0ITFLSMIr
+jc9K6Zz805Tbu6xX8UXRMIdfJTJkmVWTOD8u8OUPGBxhBuZmbVfH4x+fKybcSVJJ
+akqX28LjaqI+WvD/zh9l78V7foMEWd7porUzBC7z+wgAzh3LBHb2naFg4CZSVlYa
+uuQ64G1ct0uxwVr0p0/4jA5nEK+WgFABPu1YPnIO3md8dBnkfs92g+0msKgB3FOn
+T5+FlgkR+p2Y4knNggSmJGErCMYAq17lCu3bAlHFKwaowCBFoXrFCGBH2qgXD+CM
+Rgq5gWXPLrcqnGPefdV56i+8X+t7oHCzIxX836IQICWMpOdhWMzDz44ctC5IBTJp
+bDgx2pmkU+i51Q+PfK7k8eBIvlrvBGCQcUiNjCoPKAM3OjGNAQF0JraWPG2q0OSM
+aZXKg9aCrQRHceCjwTf8dYRDm6yqGNeVzOnkDibPT3ySYmXKaVDbB8AquS72wE1n
+ktLAxwGOjaM4MSQOGT+8eggngFidGak7957SWZRaqsXdeh6HtxKWni+XTBmWAg2m
+6MnCIiVxD5A75m75ncdbRgtx2Sl9B/kCTC6Ak6hQ3iFpJKuQSZcD2gyGRSE8Ly7u
+cX4jPXcYQaWLi+wVpLaYr3hSsjx2WgVk4oz+X2Kt0qQw+yWIkRw7ErmMl0ML0L7j
+YePAE6UbBSR131nDKmXDUlLsV4GavAclENL5Kp6Yd8ia3h1Jdtl0waH5cCLswhf3
+oi0u0bIalnZwDkFSDGiWgDQyJ8XgPFcUx8fp3dC8FVxXbd3quMxZU6/5K/dQ0LIh
++Ldlz797sLtl1lHmlaLEzTzJZriLiEiOCZeOrhbgqcGMLurzfsCWYH+BZFzH8iFJ
+yDoUVsWLlvY+6gelAE9Dlzdq9m8rIALwf0Udlsdn/NBaFxarT0nl68u5fSJo8UA2
+MuZd2EB/BKXWvAo5Ea9CQ3DrrDkbwlE3PKrWlMos6dFb/SWxtmKfEeNYhYJsbwsv
+x5MBl/I2kBCHeH4=
+=hojs
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $this->gpg = new Crypt_GPG(array_merge(array('ignoreVerifyKeyErrors' => true) + $this->getOptions()));
+
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $results = $this->gpg->decryptAndVerify($encryptedData, true);
+
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyNoDataException_invalid()
+
+    /**
+     * @expectedException Crypt_GPG_NoDataException
+     *
+     * @group string
+     */
+    public function testDecryptVerifyNoDataException_invalid()
+    {
+        $encryptedData = 'Invalid OpenPGP data.';
+        $this->gpg->decryptAndVerify($encryptedData);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyNoDataException_empty()
+
+    /**
+     * @expectedException Crypt_GPG_NoDataException
+     *
+     * @group string
+     */
+    public function testDecryptVerifyNoDataException_empty()
+    {
+        $encryptedData = '';
+        $this->gpg->decryptAndVerify($encryptedData);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyBadPassphraseException_missing()
+
+    /**
+     * @expectedException Crypt_GPG_BadPassphraseException
+     *
+     * @group string
+     */
+    public function testDecryptVerifyBadPassphraseException_missing()
+    {
+        // encrypted with first-keypair@example.com, signed with
+        // first-keypair@example.com
+        // {{{ encrypted data no passphrase
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+hQIOA5+T+RFnKO8SEAf+M1KnzLUvmJMtRTMpy3G2C8iJN1oQPznWDlL6NqxNeS6N
+8ie5dXmaG9csQUx1Ys8QRaPDg6ElVIrJOXQ0CIW3mqxZS7+5X5akH5DQ0Ye4Rggx
+yqADpE2z99tlYiNlpEqtG4oAUXzJjWiw8Y6MFg/xAHQUYMhEhZRB4OaSQGVPpxYs
+s6YBfRGmWdNrGgPgcwoEmoHvmVKtVOfBNzO9cpl7k2pV12p6eG6jZ1qcCQkSJZlY
+z2WsnDYZ9wbXuLM4XanGiJiBau0f+nJqDozmOVvc5Avz1qrQD3Dd5C5cy/e+XPdn
+wzTgg3myMrwudAeJZzwMrpcrGwvdzAKE8/7TbNO+3Qf+NqfrApMVUrsFQBdzlLp9
+7cV8nD0uF8ioQjPg0lzJajJdqjEkKB7h9i9fQgL/SBZ29HupsUqDoqmpCVU/B6M0
+YzphMp1qWDRkk5dmpcTppTBsVx1KXCqLQFBIy+Fhc31NZRs1ccaVF3uxaOyMzFhb
+FaWlUq03SjU9SlkYiFwyfyDysK3uoGeLfFh5yhH6ly5kthwLo2ov/GANF3pL0cxv
+mGUcnZbkhk+MWjmz83loedhh2XpTLqRGuhzWPTQlOUQzf6xbj5zCkzWdnbqFQu19
+Et5O3whgv+ufNvD5LGc/lGQeV8wV7EXcde0ISUa8LKyU+eseS+W6IHsQLPupkCQG
+u9KoAQUL3Q3vX1C7WmzS2sudcAulSR8bRYfr6lJ5udRvek7M7tYdLbE1ZLua23T8
+NId1euFhWftuaFjGDRvY37ab+M+zTnMtogSZDkCVyFrM2n4/hFfX9eKX6ljPxPmk
+lEmn966i8e4K0jL0Ydvf7qWEVc5uov7xorYnkwvIbaW8SyUPowenfN3qODv7C0Yj
+0kOgiJnRxZq+MYOR1b1L6fS0y7jDPI+er8ft
+=pycC
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $this->gpg->decryptAndVerify($encryptedData);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyBadPassphraseException_bad()
+
+    /**
+     * @expectedException Crypt_GPG_BadPassphraseException
+     *
+     * @group string
+     */
+    public function testDecryptVerifyBadPassphraseException_bad()
+    {
+        // encrypted with first-keypair@example.com, signed with
+        // first-keypair@example.com
+        // {{{ encrypted data no passphrase
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+hQIOA5+T+RFnKO8SEAf+M1KnzLUvmJMtRTMpy3G2C8iJN1oQPznWDlL6NqxNeS6N
+8ie5dXmaG9csQUx1Ys8QRaPDg6ElVIrJOXQ0CIW3mqxZS7+5X5akH5DQ0Ye4Rggx
+yqADpE2z99tlYiNlpEqtG4oAUXzJjWiw8Y6MFg/xAHQUYMhEhZRB4OaSQGVPpxYs
+s6YBfRGmWdNrGgPgcwoEmoHvmVKtVOfBNzO9cpl7k2pV12p6eG6jZ1qcCQkSJZlY
+z2WsnDYZ9wbXuLM4XanGiJiBau0f+nJqDozmOVvc5Avz1qrQD3Dd5C5cy/e+XPdn
+wzTgg3myMrwudAeJZzwMrpcrGwvdzAKE8/7TbNO+3Qf+NqfrApMVUrsFQBdzlLp9
+7cV8nD0uF8ioQjPg0lzJajJdqjEkKB7h9i9fQgL/SBZ29HupsUqDoqmpCVU/B6M0
+YzphMp1qWDRkk5dmpcTppTBsVx1KXCqLQFBIy+Fhc31NZRs1ccaVF3uxaOyMzFhb
+FaWlUq03SjU9SlkYiFwyfyDysK3uoGeLfFh5yhH6ly5kthwLo2ov/GANF3pL0cxv
+mGUcnZbkhk+MWjmz83loedhh2XpTLqRGuhzWPTQlOUQzf6xbj5zCkzWdnbqFQu19
+Et5O3whgv+ufNvD5LGc/lGQeV8wV7EXcde0ISUa8LKyU+eseS+W6IHsQLPupkCQG
+u9KoAQUL3Q3vX1C7WmzS2sudcAulSR8bRYfr6lJ5udRvek7M7tYdLbE1ZLua23T8
+NId1euFhWftuaFjGDRvY37ab+M+zTnMtogSZDkCVyFrM2n4/hFfX9eKX6ljPxPmk
+lEmn966i8e4K0jL0Ydvf7qWEVc5uov7xorYnkwvIbaW8SyUPowenfN3qODv7C0Yj
+0kOgiJnRxZq+MYOR1b1L6fS0y7jDPI+er8ft
+=pycC
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'incorrect');
+        $this->gpg->decryptAndVerify($encryptedData);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyDual()
+
+    /**
+     * @group string
+     */
+    public function testDecryptVerifyDual()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('TAsI7RYUgZAud0wMZu3Iab3bZXo');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1258955651);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedResults = array(
+            'data'       => 'Hello, Alice! Goodbye, Bob!',
+            'signatures' => array($signature)
+        );
+
+        // encrypted with both first-keypair@example.com and
+        // second-keypair@example.com, signed with first-keypair@example.com
+        // {{{ dual encrypted, signed data
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+hQIOA5+T+RFnKO8SEAgA2lVokiF7FeQvT0EjgH/X2mXNbz8ukKM7WdIAsIFumg1a
+Skfsqn1plAHs3f3OhY16tBb1WW4J8WXEt6g3yHls92XpRUgRTUjVCr4HIvMwSB3A
+V/ZQdGs3NK3wh0rMu6q/Ski10dEwP7SUE+w19AmiCQfmKYLUJmCgPLmVm4IapAad
+lIpNalUHzXhHuuIzKut9H0n6+p0jUPW2JehFFGud66MS5PaGbDPZS2lKiPjytSzl
+pYipuglregaaMR5KsBYxP4A6MnMaRaZriTeItROJ0PTBMaq93+IyrnwulqEsWk6t
+8ahRM4FmC+U/Z9tgWxTEKU28zthjxKXW5JOceGxeBQgAoxRAhd75Ok406YG4VucC
+rxLSLIKIt0TAlbTWncJq9qhLA86+RL4oqUYfDjq9o9lrfkPQO3xfHam/43j2yaF3
+HeJwSDwU0V4YZ6R9ZVdHMYw7w7yynn2HmNesDUWRfI7IRwMFtgKGvv6qpdUOYmWN
+MhQ+HxnwMgvHNaz6TRYpQzVvtpB6q9J3/xCM3+uKxDaJLbJux50s6FpnCRnLpGWs
+1Tj8l9BSMlAGtP6dMR3MysZS/UnXwdTmDFR9ARS+HxsP89I95UAKLWaouShoo9dX
+QIs0pLkQs+CWpjPVAp8TT0Vj1juThk4bJarti/BaZOyzUAOrleDWOO8VVsuM1Bw2
+xIUCDgOy9U5HV+IkUBAIANU8DKkvHNzkx68XvxXXVsBsWTGNznrNGUjqSfhyS9pW
+lRnq7qB2c2UgMvMTnMWyogQ/gKEotdeqKCXdMLBkataB1xkMbCvUZzdj2A/OPtDD
+xT7ogqn82YaEjlfEqEbqBi1lvq2tuC/YsGti0c6zDUFoZax6QWL+NU3eCY6ZxBSx
+NuZ4hiBJqPeHVP92SCnsC2BwqUy7W0rUuKnXo3VM1syd98TZjdM6SqBVQ61YX3u2
+rS1YiphYd2WeNU/bSZ79bHMMPt3joQ+nCGKvGSIlCVxAy4EPWDb2KFw0yUmXUub1
+tLnrKAOdufWC780LuhgINLb1PSmzogRmvk4ih687h9wH/0hx4olXvkUHZAcpnMHT
+zGK8NQeoxfSmcJrYNa1TpQ8FjLad7eycnoIASC4qS7IsJ0xzedWd2eqLdc+9qIiv
+68gW2MjZOqQ5PvcZk1eqOVUNH8Ua8Wfv82ljk1VE0L9zzrS8nGLq5prjaK400Vwh
+MVh129jyjkpgGZhIHC4cNGBQl1zKDw9WWd1Rk92rpmsvb7JZVNDg0DjW3hrwc7v2
+WbGqEXG5Sown6J1gX4wKIpn9roOE9ZSu1hvugPc28IZIne4rL05Pd4qVnp87SiUh
+wHs82nXGhqcscZx2NiT2F///6j97+ccd+619iabKkpfwGunQZHfxit+7bfHuX+5O
+tFHSqQEsRi3gNrRlMRDnPjLHXjR+x80anNOwxBfZP1qjdTsFucqmZ57KUdIpUGmi
+uRgBZhuVRz8ryTcw5/nACkeKLkxOJLHGgNDilJtNO8tv+BbQDRZzsNYTM7ZNcAo4
+JqkWrMb43BTbAbdgTyEkWhqw6cFQEePYqXcbeDh3c77U5joGZW+iPZQlJbBCMC6e
+KBH+5iH8NzPpP6yZq5e5p1ZOkb2PY3EXtL8aemU=
+=S/2J
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        // decrypt with first key
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $results = $this->gpg->decryptAndVerify($encryptedData);
+        $this->gpg->clearDecryptKeys();
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+
+        // decrypt with second key
+        $this->gpg->addDecryptKey('second-keypair@example.com', 'test2');
+        $results = $this->gpg->decryptAndVerify($encryptedData);
+        $this->gpg->clearDecryptKeys();
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyDualOnePassphrase()
+
+    /**
+     * @group string
+     */
+    public function testDecryptVerifyDualOnePassphrase()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('3OJnX+PqHI0YUCeFxICCxhPHY1Q');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1258955916);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedResults = array(
+            'data'       => 'Hello, Alice! Goodbye, Bob!',
+            'signatures' => array($signature)
+        );
+
+        // encrypted with both first-keypair@example.com and
+        // no-passhprase@example.com, signed with first-keypair@example.com
+        // {{{ dual encrypted, signed data
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+hQIOA5+T+RFnKO8SEAgA7zHd9KH/C2GCM9H7pdMS76PXGfmhGPyQAtokBQgF8G1/
+orldCnTUnxmZejbOwYhYVEh5zlnYshlCpUSsGBw+sH7XiC8eorCD0YJj5NDBp8W6
+VtvGkMqqG9tDJk6TfKornFl+H7xpiwXox5T/swnpJcJ6qaTXBtLb7HViiwTTu5Zk
+QbWqSvIOigIkiuTnv898/eeEIh9gg6ScRVZOyZ7P2usDaOWqVVNJmkaLIaWxOYck
+Go3hnYAhkfjpMcgAMkqtXPWIS8OrfY8wOXxXNA4EjvrHs+5/yHbZmj/5bBA9CuGJ
+UctQqF9ZtZsagSpK0WTJCt4RkX3jKqK9tJVQzBuKZgf/Up3Zi6Lfg6iINm4qsd1h
+Dusuuxw0vgGoMc6P7QOMFmeSs3g/yYQKaHomWqEVg0LpC2FHOqceqZRZJd4XMcsz
+uCF95lx7Tm1ozgEhBgQNSQVoAA5/MYXlKo3YQGEIyU9Gx4f2v/8XV3umYXjGfJY9
+adBHLIvPFeeze1/f11ztZsgLr3DBP01/O6qLi91dwsqpzQXzjurVYIHJdCD+JviZ
+2CjwkcpUTHx5vXNiobMcBjtogjP7d4W8DJ0La5+WVujV0nxHiE9mEXuct8TajCY6
+/40UIdtHEPWc08ccXXjQaFKbJxYGDMOJzQ8LPdHqa3RubmMADqzH4W3/SSmRsibd
+4YUCDgMkvzgHAMFLTxAH/R3ryj2BUP6C/aYfgGqi+FOVoHVR5kiz6Z2nBEKqntwZ
+njdKD+pvuw9fxaNhNNZy3UlKnIdonNb/A3upEeR81opP+HWCgXUlcgucQ7VXiUPd
+mnQAR+cTrFgTXf+B54VHwDED5RVDm4/e29casiNyULm6xWFYqfJMGBvEGrflq1BW
+QSYlpc0ijqkER+VNy49Dy/qY1TRUBZ84+RmL2L/18zQbdekMoLUDxJOEoo0C65ER
+5ReLlFN2nI0MC8O5ZU8PfjDXXQ7qnQhz/2kxorNiQl654V7ZsEWkVLF9yejZXSzU
+ynWANJdCnWLMjOnrQPm1+b2Yi8pcgtpIPsBdTIHn4fAH/iW0Uxltx9ZrV7kvrDDj
+Izc4/ocn3Z0c/47Rv62MTYcxVYzFdP+WxisMI2LV88g1Zu9rOKR1k7UkNGNlfklS
+5CSApTnm3MC9/w54dacPohZ7SrQlTSHJxfRINH7H3DOuaH9awf+ntwUks73mXjT5
+ikSJ2D05Kbf8++jLhRRKLPZS8bOmSw2KTaCbtk7LX4pEIu9d6kig6g8Wj3h9dlQs
+QXCKL14/8cSGrxXXWHOuL9abnxZTwenbn5B5FqBPoiRKqSFToiLd/pBWjG/aieju
+Rm+Uyyddl+ISJUnv0AAiOxfifJmTdUsT5LZLkYG4CUyX2T3JiZ2L4msF4S3U70wp
+PtbSqAG3xVRFlZY2jLeW8btez7XkzB9fhvVd1Hee6EXRnF5/BcLkqy8sYvx1MHkT
+eMzttOs1NRrjXy4+zUqo//59gQ46zwYd0NA/Ga6pl1kn8+xM76DCcI4LhdZN75rR
+ZUcyEqBKX9RNefMD7cR6kYoljGfnT3Mjd+0eTdF/Glk0ElVjbMtQclG0o/7wlI7m
++b2E6/e0qZedOCq48+mIRv0tjRuoFiydM88aGg==
+=IgJ0
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        // decrypt with no passphrase
+        $results = $this->gpg->decryptAndVerify($encryptedData);
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+
+        // decrypt with first key
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $results = $this->gpg->decryptAndVerify($encryptedData);
+        $this->gpg->clearDecryptKeys();
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+    }
+
+    // }}}
+    // {{{ testDecryptAndVerifyDualNoPassphraseKeyMissing()
+
+    /**
+     * @expectedException Crypt_GPG_BadPassphraseException
+     *
+     * @group string
+     */
+    public function testDecryptAndVerifyDualNoPassphraseKeyMissing()
+    {
+        // encrypted with both first-keypair@example.com and
+        // second-keypair@example.com
+        // {{{ dual encrypted data
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA5+T+RFnKO8SEAf7BO/zLK6gDt5epMOEnHc9ESdSTy8yExdoSxHhvTFxWfwi
+AwMtBEur8sotSVt+Q87xYzjzE77+FQYS9oYCivlK/Nedblj3MiRuUWhM+Q9tbP3b
+KbwEwaQlrpNphQsKZOWkliZWmFJWnQ1s1Pm6lPlhwTNhcwkapm8EXuWFExJnY9yW
+EZjUOhVmnkitKykKup8Brvfm2QpGXoFZtHFKXTi162Lue9N0tDm6s3JnCIhMFQgI
+fyAikcsJKpbUgeGmzlWJO8QkH81QMuKpqfUb8R1dswhDp6RKXhoXS43zkhH8QSbM
+Cp9AWdv3qsWBUqzWavCxjtIsogYO+gFLl/Vuw5Y87Af/b7OQgLP1v6xKZcrTvFCF
+hxGxn+5M8E2GyJaKpQ1GZ+Wv+IzPGetm7rWf6q71hchAkxFMczIPSK7aARm9CNVo
+7tCdcUmUTgLhG1/0OfmkbwJUjdSpOtz8+TvIZa20Jj9a1G8WT3KTeivKMqBPhgk4
+sD7OJPDCYQNSQEw6pAn4oBrhJlDUkpCK6wIbUhzeq3MUwtM1e+qpCr/k4In4NVq6
+cmoC7W//9J69ecuxmiUHRhZ4CALRxQMAsSxMRnNJ26JY4ko82Rfvbrz8QEmKcIyT
+bTdAMsZ18m9XXrnc2ACDDMQyUkneQDUZSt7V67ZiN4Upi295CynIbNEMmcH/13Aa
+aoUCDgOy9U5HV+IkUBAIALGICOFzyfquWZ0ZhPGVdDWx1yNcApnzIgZx1JbBpMyc
+2jb9aQHwGId26gv/ym/M/3FJ0lv+IAcktMjO4dwYLnUuBa6BOFFybZi3gYvXtSuy
+iW4ygVjIsYixhvbsyaVCoB/MsNBFrQAHEShaxALBkI/dv+yyD8BifU4Yj9LFcAZO
+mFDraOgYfHsur5eevYTXozf5wU7phu9v6zo5bk8zgZSqs8AgyscstZWCqCtR/cG0
+t9lAIovGPsIcA12qvkm/A0WiBMEWhGryzHTv9oRsFztOFtqH+MmLdlvWjElw8hKt
+fFJB+bhHNO9BUIrwnuH79cA4aXOy1+xG+ECs7oJbcisIANqJKalQLgBYEjbucpDg
+O8i/c4RmV9J7VczpZp7ZREMpTmv9nV849OFXT1strsb/+vXOXOyLToG1gOxRfJr2
+q9jFjpyMAtrr/aHhXMKK1OMhhcdkQMEKuHTvon5KleZOQoVmIqa3kUtWNW1vFBIP
+UfJFH202EJLOLC25rXCtzRsJE0HWiYDyLqKMQcSQhTcngLBLmeDLH3DeGUIDwcZe
+oWgUg8wB/oSoU4AchShzO+yM6bcmffcaHFqwll9gdu9walnJAAOb8+r6LGGlsGTV
+qhnR0LM3Khp+HOFdaxcQT6BV1aw/D6Z5hIi+Am0VTi0HlFr/gwleyYaP+742Z6K0
+s8bSVgFT2Pjik+byARWzRwWjmi0jT7QsgITM73aBKPDXiArEPkv8YtC9HzUj0lCY
+gX7Eg2ZqISULFydBckMJ6drojMMQiqZBeEc09GupSBL1zldnKHfiXBTw
+=QYjj
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        // #21148: Make sure that proper exception is thrown
+        // when decrypting without specyfying a passphrase
+
+        // in this case we remove one of private keys to make
+        // sure proper exception is thrown also in this case
+        $this->gpg->deletePrivateKey('first-keypair@example.com');
+
+        $this->gpg->decryptAndVerify($encryptedData);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyDualSignatories()
+
+    /**
+     * @group string
+     */
+    public function testDecryptVerifyDualSignatories()
+    {
+        // {{{ signature1
+        $signature1 = new Crypt_GPG_Signature();
+        $signature1->setId('7PujVkx4qk28IejcD6BirrwBmRE');
+        $signature1->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature1->setKeyId('C097D9EC94C06363');
+        $signature1->setCreationDate(1258956025);
+        $signature1->setExpirationDate(0);
+        $signature1->setValid(true);
+
+        $userId1 = new Crypt_GPG_UserId();
+        $userId1->setName('First Keypair Test Key');
+        $userId1->setComment('do not encrypt important data with this key');
+        $userId1->setEmail('first-keypair@example.com');
+        $signature1->setUserId($userId1);
+        // }}}
+        // {{{ signature2
+        $signature2 = new Crypt_GPG_Signature();
+        $signature2->setId('AhrDdkdcBsEsOSQOYENhl5C7auc');
+        $signature2->setKeyFingerprint(
+            '880922DBEA733E906693E4A903CC890AFA1DAD4B');
+
+        $signature2->setKeyId('03CC890AFA1DAD4B');
+        $signature2->setCreationDate(1258956025);
+        $signature2->setExpirationDate(0);
+        $signature2->setValid(true);
+
+        $userId2 = new Crypt_GPG_UserId();
+        $userId2->setName('Second Keypair Test Key');
+        $userId2->setComment('do not encrypt important data with this key');
+        $userId2->setEmail('second-keypair@example.com');
+        $signature2->setUserId($userId2);
+        // }}}
+
+        $expectedResults = array(
+            'data'       => 'Hello, Alice! Goodbye, Bob!',
+            'signatures' => array($signature1, $signature2)
+        );
+
+        // encrypted with first-keypair@example.com and signed with
+        // first-keypair@example.com and second-keypair@example.com
+        // {{{ encrypted, dual signed data
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+hQIOA5+T+RFnKO8SEAgAzllqH/z2ThJcXteCxPJu97EmMpqdipbcSUAjGZJ5hQFe
+YlKbrxL30W6VYgZIPqP5FubZkI8WHWqDZwbtphk5l+o8nfyNV4el/JHHEmf/mzIM
+UmBXJFVa6g9CmS/SdhYhO/ovMeBsNVA1+Er+Cdyh9sTpX89I3zlehgwcXtv/di6W
+fjzeg5Na/39KfYWEyXPB5EUkWG4hmnGo63GPUEsxfNXbKDafUtTwOFop+1+wMVyA
+kJbOEaaiTSzvbpa+ruRisv34a6vX8u6QGqPSZ43vgmKeWfPEBS8p7bdRFGECLNvP
+gK4tIwlBI0o13JJ/lnjL6dR2f7qls/0dxBGxhjFpjAf/bn5d8r7e2N1yJqh1C5T0
+/n/ngN1bHDsQhrAPMJfJre7qJxZEiHa8dfagdDU6I/EC4w1ouUYKWrzf9sPKTxs+
+QosiqrGKYUO1V46EzRXc72PZBKf5CZBBvRZv3GzzcVtroViiIshyAp3TBPk2GC+N
+ilmEm72CWgQHKqg4vX1hbTCbOEu/YDmjF9Vb9a/zT5RAKDjBrcc9tkPdVMfDfI2Y
+Ly6CvL2DSvBUNbAShl2TXdTdylYbopyiFhOBvJoeidFVwIFX303nFUBMUfbCT6WK
+MGZGzXrNZlRyKfH9UCj+5pxom2TMpu+URfvXtByUGfNst+ZRi+ADOnbc51canwWc
+M9LAKgG6SF2OhrDTTe+KASz3dFbpD4xnczl+686GGT76W55YKQNDff72bhx8lBnP
+XiM+CsWGPLZdoOCQU+SEWD7lJ1I6fB+l/oFWC2PVlDjrCS1Nn/L9i5p+EqNzcUVB
+JR62EaLPsOFOfNeHhltuz2aYkvQT4sDPeKkpBKJDp2ejMy3V9ZXia1D2ZTCfMp+J
+GEu2SS68qlZV12gpSwY8BpS/nirx5aUQ9VhjlSN3GHF/r6j91VsHJhmU+nmWPWaF
+mHfMGHS5sw6+gz3SyW6b4TlUnnx412nhFinanxBlwkuAcukgL8k+OesoDX2a1Q==
+=TW+z
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $results = $this->gpg->decryptAndVerify($encryptedData);
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifySignedOnly()
+
+    /**
+     * @group string
+     */
+    public function testDecryptVerifySignedOnly()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('LS9EdhGLaEUllGk3Snc0Bk+Cn3E');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1258956761);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedResults = array(
+            'data'       => 'Hello, Alice! Goodbye, Bob!',
+            'signatures' => array($signature)
+        );
+
+        // signed with first-keypair@example.com
+        // {{{ signed data
+        $signedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+owGbwMvMwCR4YPrNN1MOJCcznlZMYvDmUr/pkZqTk6+j4JiTmZyqqOCen5+SVJmq
+o+CUn6TY4cbCIMjEwMbKBFLIwMUpANNttphhwWm3a/VsLcc+u0x4/Xtyuk/Xiqd3
+ZzMsuHZrvkPCHgUTgcXFLt6GVRlPYvT5AQ==
+=ehgC
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $results = $this->gpg->decryptAndVerify($signedData);
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFirstSubKey()
+
+    /**
+     * @group string
+     */
+    public function testDecryptVerifyFirstSubKey()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('YUeHL9fEAK4hMokvXsNgUP5vaJ8');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1267228319);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedResults = array(
+            'data'       => 'Hello, Alice! Goodbye, Bob!',
+            'signatures' => array($signature)
+        );
+
+        // encrypted with first subkey (ELG-E) of multiple-subkeys@example.com,
+        // signed with first-keypair@example.com
+        // {{{ encrypted data
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+hQEMAykh4NP/Ww9KAQgAhB2Ww2jNhy9ISQ/+S52eROzbN8ij65GoL9tTHK5TZp82
+mv+ieGwobe5PGYdBEvQdsSrKyF3x25oaEyjaOa+39DtmF82OZKZ3tIO3EJ1qvn8q
+SHxwiKYa4MOgwER9pT7i/YZOZuIdII/NeuVuGxbsa5qdISltKkE7WS7yWStcDJi1
+goaPx3G1cZIVnTgSncK1YE4j2TZXBxI/zuuuH0pbZk7rK+K9zIeyYD1YZFagrjJh
+REN5QbnT1v+1HXno1WRp4Obo072i3FjF505U1XLQ5p2/d55m73jfBJoqpb2NExdU
+KimXnQZ+8/8ddzL3ZP4+g982dmLFvl2/h7KGtPOMbdKoAeMQYVolMDoQp6+nyQHP
+CgpeFJY5+VnxNq1wEgJgXTo79xohN59wwad1ltcUGAVC49RMHbX+xBjR/HPCG9yt
+QTwMes514uPYbNL6cGoKm7dt/zQL8YsjvfswGE06bj/rU3JCTDnR+iOUDHzUMDEn
+jH7Vbs+9D1E9t5bSJs/8e7rzhZKF1AhunUdDmc4vPPJMV8xKF+o3h3nKQ6wEoOMz
+f6XGFW8cvNAl
+=vSGT
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $this->gpg->addDecryptKey('multiple-subkeys@example.com', 'test');
+        $results = $this->gpg->decryptAndVerify($encryptedData);
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifySecondSubKey()
+
+    /**
+     * @group string
+     */
+    public function testDecryptVerifySecondSubKey()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('ZLZFDxxO+zdCEklUu6eppBCPCsA');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1267229043);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedResults = array(
+            'data'       => 'Hello, Alice! Goodbye, Bob!',
+            'signatures' => array($signature)
+        );
+
+        // encrypted with second subkey (RSA) of multiple-subkeys@example.com,
+        // signed with first-keypair@example.com
+        // {{{ encrypted data
+        $encryptedData = <<<TEXT
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+hQEMAykh4NP/Ww9KAQgAs1xviSlaTTGXWNzT43giUSf7SnYoeoyYqZt/eo7c9eHu
+sLGdhhpQeUiU5vW6UsOvs3QLx3hR9wYunUOKmDJmrrtVglsZIjuHU7oYlveozYwG
+wlHNbesQlWyMNSQPDeGWAQAnOUU2jv/9nb93SLYlkDKr1qjn9qjZ4Kl2q1Yi4PSu
+LaqI3r1LdJbFmEB6vQ8o6GiIpaFaZapK6vloPoq5xbaALAfAiSg58+IwV/Mn190L
+T0tmFCUuTm/Px8fv5xe+mPW2pMUovhJhBrhBopEcWNHpxuNbxwac1T54COZxjC8W
+L0XpYW7c3XVdO6VqS4pSnz+zo5EYcU2Sk6mfpN5ki9KoAdPZ4ICMe0OWIjMxgApI
+AVHaKowZ6+xSW8vLRzWjJTZrlEoMjwJSOJwCsMcsu6MwJOFcVEl4Mc3TiAMsUHWf
+6f/pHb7W2Am12CfJaaU0+nDQrlKOw5DfQG5YEG/LrpjXGugVWMQH/31MMKawSAP3
+QgdXe417ZeMtsHVaz/W1Za5ZpRpcwoT5N31LfNV+SoIpajhmtr79aeg8d6OH8H+l
+7kLEDVlh9DP0
+=I21n
+-----END PGP MESSAGE-----
+
+TEXT;
+        // }}}
+
+        $this->gpg->addDecryptKey('multiple-subkeys@example.com', 'test');
+        $results = $this->gpg->decryptAndVerify($encryptedData);
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifySignedOnlyBadSignature()
+
+    /**
+     * @group string
+     */
+    public function testDecryptVerifySignedOnlyBadSignature()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setValid(false);
+        $signature->setKeyId('C097D9EC94C06363');
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedResults = array(
+            'data'       => "Hello, Bob! Goodbye, Alice!\n",
+            'signatures' => array($signature)
+        );
+
+        // {{{ clearsigned data
+        $clearsignedData = <<<TEXT
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Hello, Bob! Goodbye, Alice!
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+iD8DBQFI0vkCwJfZ7JTAY2MRAgzTAKCRecYZsCS+PE46Fa2QLTEP8XGLwwCfQEAL
+qO+KlKcldtYdMZH9AA+KOLQ=
+=EO2G
+-----END PGP SIGNATURE-----
+
+TEXT;
+        // }}}
+
+        $results = $this->gpg->decryptAndVerify($clearsignedData);
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFile()
+
+    /**
+     * @group file
+     */
+    public function testDecryptVerifyFile()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('kVwy2yYB0TlXyGd9FUvVYp5jCoI');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1258220197);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedMd5Sum     = 'f96267d87551ee09bfcac16921e351c1';
+        $expectedResults    = array(
+            'data'       => null,
+            'signatures' => array($signature)
+        );
+
+        $inputFilename  = $this->getDataFilename('testDecryptVerifyFile.asc');
+        $outputFilename = $this->getTempFilename('testDecryptVerifyFile.plain');
+
+        // file is encrypted with first-keypair@example.com
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $results = $this->gpg->decryptAndVerifyFile(
+            $inputFilename,
+            $outputFilename
+        );
+
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+
+        $md5Sum = $this->getMd5Sum($outputFilename);
+        $this->assertEquals($expectedMd5Sum, $md5Sum);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFileToString()
+
+    /**
+     * @group file
+     */
+    public function testDecryptVerifyFileToString()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('GTvYFmQ5yfMM/UOffkYCx21Se2M');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1258221035);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedSignatures = array($signature);
+        $expectedResults    = array(
+            'data'       => 'Hello, Alice! Goodbye, Bob!',
+            'signatures' => $expectedSignatures
+        );
+
+        $inputFilename  = $this->getDataFilename(
+            'testDecryptVerifyFileToString.asc'
+        );
+
+        // file is encrypted with first-keypair@example.com
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $results = $this->gpg->decryptAndVerifyFile($inputFilename);
+
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFileNoPassphrase()
+
+    /**
+     * @group file
+     */
+    public function testDecryptVerifyFileNoPassphrase()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('unMY9l/f9sFaMvMV0H1ZuNJRY6Q');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1258220226);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedMd5Sum     = 'f96267d87551ee09bfcac16921e351c1';
+        $expectedResults    = array(
+            'data'       => null,
+            'signatures' => array($signature)
+        );
+
+        $inputFilename  = $this->getDataFilename(
+            'testDecryptVerifyFileNoPassphrase.asc'
+        );
+        $outputFilename = $this->getTempFilename(
+            'testDecryptVerifyFileNoPassphrase.plain'
+        );
+
+        // file is encrypted with no-passphrase@example.com
+        $results = $this->gpg->decryptAndVerifyFile(
+            $inputFilename,
+            $outputFilename
+        );
+
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+
+        $md5Sum = $this->getMd5Sum($outputFilename);
+        $this->assertEquals($expectedMd5Sum, $md5Sum);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFileFileException_input()
+
+    /**
+     * @expectedException Crypt_GPG_FileException
+     *
+     * @group file
+     */
+    public function testDecryptVerifyFileFileException_input()
+    {
+        // input file does not exist
+        $inputFilename = $this->getDataFilename(
+            'testDecryptVerifyFileFileException_input.asc'
+        );
+
+        $this->gpg->decryptAndVerifyFile($inputFilename);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFileFileException_output()
+
+    /**
+     * @expectedException Crypt_GPG_FileException
+     *
+     * @group file
+     */
+    public function testDecryptVerifyFileFileException_output()
+    {
+        // input file is encrypted with first-keypair@example.com
+        // output file does not exist
+        $inputFilename  = $this->getDataFilename('testDecryptVerifyFile.asc');
+        $outputFilename = './non-existent' .
+            '/testDecryptVerifyFileFileException_output.plain';
+
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $this->gpg->decryptAndVerifyFile($inputFilename, $outputFilename);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFileKeyNotFoundException_decrypt()
+
+    /**
+     * @expectedException Crypt_GPG_KeyNotFoundException
+     *
+     * @group file
+     */
+    public function testDecryptVerifyFileKeyNotFoundException_decrypt()
+    {
+        // file is encrypted with missing-key@example.com, not signed
+        $inputFilename = $this->getDataFilename(
+            'testDecryptFileKeyNotFoundException.asc'
+        );
+
+        $outputFilename = $this->getTempFilename(
+            'testDecryptVerifyFileKeyNotFoundException.plain'
+        );
+
+        $this->gpg->decryptAndVerifyFile($inputFilename, $outputFilename);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFileDual()
+
+    /**
+     * @group file
+     */
+    public function testDecryptVerifyFileDual()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('7TYk0hpio90QZHHHb4UtgCWAEq4');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1258220362);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedMd5Sum     = 'f96267d87551ee09bfcac16921e351c1';
+        $expectedResults    = array(
+            'data'       => null,
+            'signatures' => array($signature)
+        );
+
+        $inputFilename  = $this->getDataFilename(
+            'testDecryptVerifyFileDual.asc'
+        );
+        $outputFilename = $this->getTempFilename(
+            'testDecryptVerifyFileDual.plain'
+        );
+
+        // decrypt with first key
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $results = $this->gpg->decryptAndVerifyFile(
+            $inputFilename,
+            $outputFilename
+        );
+        $this->gpg->clearDecryptKeys();
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+        $md5Sum = $this->getMd5Sum($outputFilename);
+        $this->assertEquals($expectedMd5Sum, $md5Sum);
+
+        // decrypt with second key
+        $this->gpg->addDecryptKey('second-keypair@example.com', 'test2');
+        $results = $this->gpg->decryptAndVerifyFile(
+            $inputFilename,
+            $outputFilename
+        );
+        $this->gpg->clearDecryptKeys();
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+        $md5Sum = $this->getMd5Sum($outputFilename);
+        $this->assertEquals($expectedMd5Sum, $md5Sum);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFileDualSignatories()
+
+    /**
+     * @group file
+     */
+    public function testDecryptVerifyFileDualSignatories()
+    {
+        // {{{ signature1
+        $signature1 = new Crypt_GPG_Signature();
+        $signature1->setId('MF8xqL325bs7KiokMHTnHirF4go');
+        $signature1->setKeyFingerprint(
+            '880922DBEA733E906693E4A903CC890AFA1DAD4B');
+
+        $signature1->setKeyId('03CC890AFA1DAD4B');
+        $signature1->setCreationDate(1258220269);
+        $signature1->setExpirationDate(0);
+        $signature1->setValid(true);
+
+        $userId1 = new Crypt_GPG_UserId();
+        $userId1->setName('Second Keypair Test Key');
+        $userId1->setComment('do not encrypt important data with this key');
+        $userId1->setEmail('second-keypair@example.com');
+        $signature1->setUserId($userId1);
+        // }}}
+        // {{{ signature2
+        $signature2 = new Crypt_GPG_Signature();
+        $signature2->setId('d0q7jibZpJSLpGAhNWhpSkZZeUg');
+        $signature2->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature2->setKeyId('C097D9EC94C06363');
+        $signature2->setCreationDate(1258220269);
+        $signature2->setExpirationDate(0);
+        $signature2->setValid(true);
+
+        $userId2 = new Crypt_GPG_UserId();
+        $userId2->setName('First Keypair Test Key');
+        $userId2->setComment('do not encrypt important data with this key');
+        $userId2->setEmail('first-keypair@example.com');
+        $signature2->setUserId($userId2);
+        // }}}
+
+        $expectedMd5Sum  = 'f96267d87551ee09bfcac16921e351c1';
+        $expectedResults = array(
+            'data'       => null,
+            'signatures' => array($signature1, $signature2)
+        );
+
+        $inputFilename  = $this->getDataFilename(
+            'testDecryptVerifyFileDualSignatories.asc'
+        );
+        $outputFilename = $this->getTempFilename(
+            'testDecryptVerifyFileDualSignatories.plain'
+        );
+
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $results = $this->gpg->decryptAndVerifyFile(
+            $inputFilename,
+            $outputFilename
+        );
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+        $md5Sum = $this->getMd5Sum($outputFilename);
+        $this->assertEquals($expectedMd5Sum, $md5Sum);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFileDualOnePassphrase()
+
+    /**
+     * @group file
+     */
+    public function testDecryptVerifyFileDualOnePassphrase()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('kgyLjfFigxOrliyc8XlS6NaLJuw');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1258220334);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedMd5Sum     = 'f96267d87551ee09bfcac16921e351c1';
+        $expectedResults    = array(
+            'data'       => null,
+            'signatures' => array($signature)
+        );
+
+        $inputFilename  = $this->getDataFilename(
+            'testDecryptVerifyFileDualOnePassphrase.asc'
+        );
+        $outputFilename = $this->getTempFilename(
+            'testDecryptVerifyFileDualOnePassphrase.plain'
+        );
+
+        // decrypt with no-passphrase
+        $results = $this->gpg->decryptAndVerifyFile(
+            $inputFilename,
+            $outputFilename
+        );
+        $this->gpg->clearDecryptKeys();
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+        $md5Sum = $this->getMd5Sum($outputFilename);
+        $this->assertEquals($expectedMd5Sum, $md5Sum);
+
+        // decrypt with second key
+        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
+        $results = $this->gpg->decryptAndVerifyFile(
+            $inputFilename,
+            $outputFilename
+        );
+        $this->gpg->clearDecryptKeys();
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+        $md5Sum = $this->getMd5Sum($outputFilename);
+        $this->assertEquals($expectedMd5Sum, $md5Sum);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFileNoDataException()
+
+    /**
+     * @expectedException Crypt_GPG_NoDataException
+     *
+     * @group file
+     */
+    public function testDecryptVerifyFileNoDataException()
+    {
+        $filename = $this->getDataFilename('testFileEmpty.plain');
+        $this->gpg->decryptAndVerifyFile($filename);
+    }
+
+    // }}}
+    // {{{ testDecryptVerifyFileSignedOnly()
+
+    /**
+     * @group file
+     */
+    public function testDecryptVerifyFileSignedOnly()
+    {
+        // {{{ signature
+        $signature = new Crypt_GPG_Signature();
+        $signature->setId('vctnI/HnsRYmqcVwCJcJhS60lKU');
+        $signature->setKeyFingerprint(
+            '8D2299D9C5C211128B32BBB0C097D9EC94C06363');
+
+        $signature->setKeyId('C097D9EC94C06363');
+        $signature->setCreationDate(1221960707);
+        $signature->setExpirationDate(0);
+        $signature->setValid(true);
+
+        $userId = new Crypt_GPG_UserId();
+        $userId->setName('First Keypair Test Key');
+        $userId->setComment('do not encrypt important data with this key');
+        $userId->setEmail('first-keypair@example.com');
+        $signature->setUserId($userId);
+        // }}}
+
+        $expectedMd5Sum = 'f96267d87551ee09bfcac16921e351c1';
+        $expectedResults    = array(
+            'data'       => null,
+            'signatures' => array($signature)
+        );
+
+        $inputFilename = $this->getDataFilename(
+            'testVerifyFileNormalSignedData.asc'
+        );
+
+        $outputFilename = $this->getTempFilename(
+            'testDecryptVerifyFileSignedData.plain'
+        );
+
+        $results = $this->gpg->decryptAndVerifyFile(
+            $inputFilename,
+            $outputFilename
+        );
+
+        $this->assertDecryptAndVerifyResultsEquals($expectedResults, $results);
+
+        $md5Sum = $this->getMd5Sum($outputFilename);
+        $this->assertEquals($expectedMd5Sum, $md5Sum);
+    }
+
+    // }}}
+}
+
+?>