1<?php
2
3/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5/**
6 * Decryption tests for the Crypt_GPG package.
7 *
8 * These tests require the PHPUnit 3.6 or greater package to be installed.
9 * PHPUnit is installable using PEAR. See the
10 * {@link http://www.phpunit.de/manual/3.6/en/installation.html manual}
11 * for detailed installation instructions.
12 *
13 * To run these tests, use:
14 * <code>
15 * $ phpunit DecryptTestCase
16 * </code>
17 *
18 * LICENSE:
19 *
20 * This library is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU Lesser General Public License as
22 * published by the Free Software Foundation; either version 2.1 of the
23 * License, or (at your option) any later version.
24 *
25 * This library is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, see
32 * <http://www.gnu.org/licenses/>
33 *
34 * @category  Encryption
35 * @package   Crypt_GPG
36 * @author    Michael Gauthier <mike@silverorange.com>
37 * @copyright 2005-2009 silverorange
38 * @license   http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
39 * @version   CVS: $Id$
40 * @link      http://pear.php.net/package/Crypt_GPG
41 */
42
43/**
44 * Base test case.
45 */
46require_once 'TestCase.php';
47
48/**
49 * Tests decryption abilities of Crypt_GPG.
50 *
51 * @category  Encryption
52 * @package   Crypt_GPG
53 * @author    Michael Gauthier <mike@silverorange.com>
54 * @copyright 2005-2008 silverorange
55 * @license   http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
56 * @link      http://pear.php.net/package/Crypt_GPG
57 */
58class DecryptTest extends Crypt_GPG_TestCase
59{
60    /**
61     * @group string
62     */
63    public function testDecrypt()
64    {
65        $expectedDecryptedData = 'Hello, Alice! Goodbye, Bob!';
66
67        // encrypted with first-keypair@example.com
68        // {{{ encrypted data
69        $encryptedData = <<<TEXT
70-----BEGIN PGP MESSAGE-----
71Version: GnuPG v1.4.6 (GNU/Linux)
72
73hQIOA5+T+RFnKO8SEAf/Z0WsgibKGysYfti9lfb2aY7vmAwCXnkrI8wZhqBAtfmB
74oe16PinT47AtnXl4CUgB5jBJq32uzaZKFd/dyCzOog1P/87OB6aa2w5mfxJKIIXc
75OevQgasWVSQw/1Ro90Fd/F9Q9fcHgHqCG2Q2BwkHG7IZ+V3zHlQpjj5flVTb7Te+
76K5LM85t7kVEzc5vVzhMvoZluMA48YNL+g7qdA3oZDQ0rXRA1DnTVsQ74/RbIQaxZ
77LUR7v05TVNrcwK/p2NFzLOJcYSkOYGUpks1qvfUlnsuh346SLHXmebif4GLkBB37
78WWy69+2OwJhlE0qakEJZu2EMFRwRTOrplm9YPs8Z6QgAlqKh5+KoSZTGyzBI8dHv
79lJJnlxBkzhrAj8g2kiUX5HfM+55jqtrdOo+PEd/nH56wTXaHqc7R0QE8ZdTyhmtd
80hlyzhdu/bHm09Q5WVAWkaA5nVldEtwIhss+YiWc+Ieu+rd5QkQiW9OAc4B7ZvPCO
81iDPpzT5rNe2hI4K9VkAKhcBDED+iCHkC4AZs3Rr/6tUCH+dY/roB0K1GtX2eYff6
82UeeSRsyuYbwQkKZN6pC4JQFWW7z9semrTsHsQzE38EW0IxN8nGCiaAE5cxjtW7Pg
83k9slzsranQ+n7teucg/+qlArY11LJmvPc7aoZoRCa76hzzDOHskA0/9GRcBQJlTd
84ctJWAd9/Bk9NJkwWO+II22IQTWZZrRUN8FT6pnr/WxpWM8LL5nq1Lxf3SQX+H2Jq
85JspFzixPnaDl16sE082GSg0VctFMkCZhb/jghMIQYJ2131DoGXJ4QDU=
86=sjPP
87-----END PGP MESSAGE-----
88
89TEXT;
90        // }}}
91
92        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
93
94        $decryptedData = $this->gpg->decrypt($encryptedData);
95        $this->assertEquals($expectedDecryptedData, $decryptedData);
96    }
97
98    /**
99     * @group string
100     */
101    public function testDecryptNoPassphrase()
102    {
103        $expectedDecryptedData = 'Hello, Alice! Goodbye, Bob!';
104
105        // encrypted with no-passphrase@example.com
106        // {{{ encrypted data no passphrase
107        $encryptedData = <<<TEXT
108-----BEGIN PGP MESSAGE-----
109Version: GnuPG v1.4.6 (GNU/Linux)
110
111hQIOAyS/OAcAwUtPEAf/cBqf/6najldCQzu5NNmuoyuujm2xpFESS4tljGhC7Hok
112gqiUnknDJMwNjb80OhsHIQuWjUqaryktKH0Y+Q5s+oDwRQKVKxqeF8v4hYRq8tXc
113a5gffr6lALBhpOHLcWM/oHQmPJgYAkdLDF1hoOwqlWGk5WklzjrRaJF2DwvvpvpL
1148yEU1fuO9t7cnD27L466cGMrK473NdiO/Bsml4CL9biNzth5yMia6HmgRQ1VDPQ6
115Q+plGSjTpCaXtq9fyK1Q+d9x/SeRqEVgo/R5n2w3YVZZxjNFPZ0wzMW0YtT7hTBc
116AKPt5IEwVFlFkOUT+1Xq/wj5fOFzgV+n1EFMJyTaOgf9HSAm0/L2lymIkK0qEZZK
117o0D0KBPQZrs47zj7qGnrmXlxkBydlwrCL6fULBVjK12ej4tdsYVROXfgkKohkEh4
118OxEAX9OsQuf/pSJU6TIYF39TcfKB0FqbmsD6F0DN1hZ5wVdXl+8q92MyZu5a44zD
1194fwKVlie+aENjiM0ePrDnFOK70KJVWoBlCXgouc3D6E7Rz4hC19WnWadOZF+2sHm
120s7kI5xlIivsftziItjEqqQt74RYpo+TLHTwE3cKc9rXGgtEyD8xykugzHEwetbfd
121fMdw+PvHv6jxBPdfz3/Xwe6kgqs1SrlOhQ/6tAf2uRD2C4LckXkc9Y4oC2T4iNlN
122FNJWAepBEH0MkQvukbwwR9SQw2oTK2YyWFhLEFXcS61NCQP+du6IPLBNpeE1m+Mc
1237lYaqPAkuwDq4wbJLEEVUyPNBnGRGD/al4cMowcGowGUEtn1kXR8lF4=
124=aHiA
125-----END PGP MESSAGE-----
126
127TEXT;
128        // }}}
129
130        $decryptedData = $this->gpg->decrypt($encryptedData);
131        $this->assertEquals($expectedDecryptedData, $decryptedData);
132    }
133
134    /**
135     * @group string
136     */
137    public function testDecryptKeyNotFoundException()
138    {
139        $this->expectException('Crypt_GPG_KeyNotFoundException');
140
141        // was encrypted with missing-key@example.com
142        // {{{ encrypted data
143        $encryptedData = <<<TEXT
144-----BEGIN PGP MESSAGE-----
145Version: GnuPG v1.4.6 (GNU/Linux)
146
147hQIOA0l79YQdiRYDEAgAk66FL4HUw7X5PPL4wjDbt4Q68GRAeIdkQutLuGvnlCJ0
148+LHt050deDhQd6FHmfT5K6Hp3eWApl87L5p0eQZhdaSguLZZxykFfhKENWua2YT4
149Kb+EpOsZA3R8UTT9H/HHJ/K5DUl/Zyog+G7ddrKP7CMa9wyYxD6DOJ12b2Yn1cuA
150u9am9eKmFZEwvoInF0WPdXeUyhMPY4QU43OUoIbF2fXjAq+WczqLbn0dDKH8CTqD
151hVSFRxyqia+w5nCSnzzyAcICYFOKUWzn6EiBW95gfJNvi6KzMXI7XvaSHhEkYXKA
15299WPLrHb95yRHjutXays+LDW00mjBttx40FhcQKdFgf/X8EhPdY+4F8hKctZ42FN
153bw57qxV7dbalA4jC7lOaqcfvMa/y/pR3ewPN7CM5GWqXo0xrpB9uYlC+f3L2tQbI
1545J/rYkCjQXZvOrpKaSCdp/7fhPp5NiFCy+VHakUfIou5O4KDm6h5lvFdFZtIFR9N
155+9rL/C2WjBj6evbiBuGWjR9CrwvI57zYTjJgVSggwozwKwnse8R/8gUDyFLb26Dh
156S/VKGm36N48kIuJ4UDUubLSJgwnU/Jiapx3M13GLsb/k+mjllwcc6/XlC0YN/7w4
157ZvemnGWt6/ivt8NhRM7pRY4joJBtJNrAUsoijmscdWhhqnMqx8liUeEfSlrPStk0
158INJWAaFpzdpNupyNLJI0pO0SAXX28yeNaDkJwzDZf8kU4U5T1zT+BabHVixmCB6/
159CNl9/GMhmvFD5un2+hMDVfFjZ2FHSH5QgMF50Ws10+jpXan7PTDdNMw=
160=Qe7y
161-----END PGP MESSAGE-----
162
163TEXT;
164        // }}}
165
166        $this->gpg->decrypt($encryptedData);
167    }
168
169    /**
170     * @group string
171     */
172    public function testDecryptNoDataException_invalid()
173    {
174        $this->expectException('Crypt_GPG_NoDataException');
175
176        $encryptedData = 'Invalid OpenPGP data.';
177        $this->gpg->decrypt($encryptedData);
178    }
179
180    /**
181     * @group string
182     */
183    public function testDecryptNoDataException_empty()
184    {
185        $this->expectException('Crypt_GPG_NoDataException');
186
187        $encryptedData = '';
188        $this->gpg->decrypt($encryptedData);
189    }
190
191    /**
192     * @group string
193     */
194    public function testDecryptBadPassphraseException_missing()
195    {
196        $this->expectException('Crypt_GPG_BadPassphraseException');
197
198        // encrypted with first-keypair@example.com
199        // {{{ encrypted data
200        $encryptedData = <<<TEXT
201-----BEGIN PGP MESSAGE-----
202Version: GnuPG v1.4.6 (GNU/Linux)
203
204hQIOA5+T+RFnKO8SEAf/Z0WsgibKGysYfti9lfb2aY7vmAwCXnkrI8wZhqBAtfmB
205oe16PinT47AtnXl4CUgB5jBJq32uzaZKFd/dyCzOog1P/87OB6aa2w5mfxJKIIXc
206OevQgasWVSQw/1Ro90Fd/F9Q9fcHgHqCG2Q2BwkHG7IZ+V3zHlQpjj5flVTb7Te+
207K5LM85t7kVEzc5vVzhMvoZluMA48YNL+g7qdA3oZDQ0rXRA1DnTVsQ74/RbIQaxZ
208LUR7v05TVNrcwK/p2NFzLOJcYSkOYGUpks1qvfUlnsuh346SLHXmebif4GLkBB37
209WWy69+2OwJhlE0qakEJZu2EMFRwRTOrplm9YPs8Z6QgAlqKh5+KoSZTGyzBI8dHv
210lJJnlxBkzhrAj8g2kiUX5HfM+55jqtrdOo+PEd/nH56wTXaHqc7R0QE8ZdTyhmtd
211hlyzhdu/bHm09Q5WVAWkaA5nVldEtwIhss+YiWc+Ieu+rd5QkQiW9OAc4B7ZvPCO
212iDPpzT5rNe2hI4K9VkAKhcBDED+iCHkC4AZs3Rr/6tUCH+dY/roB0K1GtX2eYff6
213UeeSRsyuYbwQkKZN6pC4JQFWW7z9semrTsHsQzE38EW0IxN8nGCiaAE5cxjtW7Pg
214k9slzsranQ+n7teucg/+qlArY11LJmvPc7aoZoRCa76hzzDOHskA0/9GRcBQJlTd
215ctJWAd9/Bk9NJkwWO+II22IQTWZZrRUN8FT6pnr/WxpWM8LL5nq1Lxf3SQX+H2Jq
216JspFzixPnaDl16sE082GSg0VctFMkCZhb/jghMIQYJ2131DoGXJ4QDU=
217=sjPP
218-----END PGP MESSAGE-----
219
220TEXT;
221        // }}}
222
223        $this->gpg->decrypt($encryptedData);
224    }
225
226    /**
227     * @group string
228     */
229    public function testDecryptBadPassphraseException_bad()
230    {
231        $this->expectException('Crypt_GPG_BadPassphraseException');
232
233        // encrypted with first-keypair@example.com
234        // {{{ encrypted data
235        $encryptedData = <<<TEXT
236-----BEGIN PGP MESSAGE-----
237Version: GnuPG v1.4.6 (GNU/Linux)
238
239hQIOA5+T+RFnKO8SEAf/Z0WsgibKGysYfti9lfb2aY7vmAwCXnkrI8wZhqBAtfmB
240oe16PinT47AtnXl4CUgB5jBJq32uzaZKFd/dyCzOog1P/87OB6aa2w5mfxJKIIXc
241OevQgasWVSQw/1Ro90Fd/F9Q9fcHgHqCG2Q2BwkHG7IZ+V3zHlQpjj5flVTb7Te+
242K5LM85t7kVEzc5vVzhMvoZluMA48YNL+g7qdA3oZDQ0rXRA1DnTVsQ74/RbIQaxZ
243LUR7v05TVNrcwK/p2NFzLOJcYSkOYGUpks1qvfUlnsuh346SLHXmebif4GLkBB37
244WWy69+2OwJhlE0qakEJZu2EMFRwRTOrplm9YPs8Z6QgAlqKh5+KoSZTGyzBI8dHv
245lJJnlxBkzhrAj8g2kiUX5HfM+55jqtrdOo+PEd/nH56wTXaHqc7R0QE8ZdTyhmtd
246hlyzhdu/bHm09Q5WVAWkaA5nVldEtwIhss+YiWc+Ieu+rd5QkQiW9OAc4B7ZvPCO
247iDPpzT5rNe2hI4K9VkAKhcBDED+iCHkC4AZs3Rr/6tUCH+dY/roB0K1GtX2eYff6
248UeeSRsyuYbwQkKZN6pC4JQFWW7z9semrTsHsQzE38EW0IxN8nGCiaAE5cxjtW7Pg
249k9slzsranQ+n7teucg/+qlArY11LJmvPc7aoZoRCa76hzzDOHskA0/9GRcBQJlTd
250ctJWAd9/Bk9NJkwWO+II22IQTWZZrRUN8FT6pnr/WxpWM8LL5nq1Lxf3SQX+H2Jq
251JspFzixPnaDl16sE082GSg0VctFMkCZhb/jghMIQYJ2131DoGXJ4QDU=
252=sjPP
253-----END PGP MESSAGE-----
254
255TEXT;
256        // }}}
257
258        $this->gpg->addDecryptKey('first-keypair@example.com', 'incorrect');
259        $this->gpg->decrypt($encryptedData);
260    }
261
262    /**
263     * @group string
264     */
265    public function testDecryptDual()
266    {
267        $expectedDecryptedData = 'Hello, Alice! Goodbye, Bob!';
268
269        // encrypted with both first-keypair@example.com and
270        // second-keypair@example.com
271        // {{{ dual encrypted data
272        $encryptedData = <<<TEXT
273-----BEGIN PGP MESSAGE-----
274Version: GnuPG v1.4.6 (GNU/Linux)
275
276hQIOA5+T+RFnKO8SEAf7BO/zLK6gDt5epMOEnHc9ESdSTy8yExdoSxHhvTFxWfwi
277AwMtBEur8sotSVt+Q87xYzjzE77+FQYS9oYCivlK/Nedblj3MiRuUWhM+Q9tbP3b
278KbwEwaQlrpNphQsKZOWkliZWmFJWnQ1s1Pm6lPlhwTNhcwkapm8EXuWFExJnY9yW
279EZjUOhVmnkitKykKup8Brvfm2QpGXoFZtHFKXTi162Lue9N0tDm6s3JnCIhMFQgI
280fyAikcsJKpbUgeGmzlWJO8QkH81QMuKpqfUb8R1dswhDp6RKXhoXS43zkhH8QSbM
281Cp9AWdv3qsWBUqzWavCxjtIsogYO+gFLl/Vuw5Y87Af/b7OQgLP1v6xKZcrTvFCF
282hxGxn+5M8E2GyJaKpQ1GZ+Wv+IzPGetm7rWf6q71hchAkxFMczIPSK7aARm9CNVo
2837tCdcUmUTgLhG1/0OfmkbwJUjdSpOtz8+TvIZa20Jj9a1G8WT3KTeivKMqBPhgk4
284sD7OJPDCYQNSQEw6pAn4oBrhJlDUkpCK6wIbUhzeq3MUwtM1e+qpCr/k4In4NVq6
285cmoC7W//9J69ecuxmiUHRhZ4CALRxQMAsSxMRnNJ26JY4ko82Rfvbrz8QEmKcIyT
286bTdAMsZ18m9XXrnc2ACDDMQyUkneQDUZSt7V67ZiN4Upi295CynIbNEMmcH/13Aa
287aoUCDgOy9U5HV+IkUBAIALGICOFzyfquWZ0ZhPGVdDWx1yNcApnzIgZx1JbBpMyc
2882jb9aQHwGId26gv/ym/M/3FJ0lv+IAcktMjO4dwYLnUuBa6BOFFybZi3gYvXtSuy
289iW4ygVjIsYixhvbsyaVCoB/MsNBFrQAHEShaxALBkI/dv+yyD8BifU4Yj9LFcAZO
290mFDraOgYfHsur5eevYTXozf5wU7phu9v6zo5bk8zgZSqs8AgyscstZWCqCtR/cG0
291t9lAIovGPsIcA12qvkm/A0WiBMEWhGryzHTv9oRsFztOFtqH+MmLdlvWjElw8hKt
292fFJB+bhHNO9BUIrwnuH79cA4aXOy1+xG+ECs7oJbcisIANqJKalQLgBYEjbucpDg
293O8i/c4RmV9J7VczpZp7ZREMpTmv9nV849OFXT1strsb/+vXOXOyLToG1gOxRfJr2
294q9jFjpyMAtrr/aHhXMKK1OMhhcdkQMEKuHTvon5KleZOQoVmIqa3kUtWNW1vFBIP
295UfJFH202EJLOLC25rXCtzRsJE0HWiYDyLqKMQcSQhTcngLBLmeDLH3DeGUIDwcZe
296oWgUg8wB/oSoU4AchShzO+yM6bcmffcaHFqwll9gdu9walnJAAOb8+r6LGGlsGTV
297qhnR0LM3Khp+HOFdaxcQT6BV1aw/D6Z5hIi+Am0VTi0HlFr/gwleyYaP+742Z6K0
298s8bSVgFT2Pjik+byARWzRwWjmi0jT7QsgITM73aBKPDXiArEPkv8YtC9HzUj0lCY
299gX7Eg2ZqISULFydBckMJ6drojMMQiqZBeEc09GupSBL1zldnKHfiXBTw
300=QYjj
301-----END PGP MESSAGE-----
302
303TEXT;
304        // }}}
305
306        // decrypt with first key
307        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
308        $decryptedData = $this->gpg->decrypt($encryptedData);
309        $this->gpg->clearDecryptKeys();
310        $this->assertEquals($expectedDecryptedData, $decryptedData);
311
312        // decrypt with second key
313        $this->gpg->addDecryptKey('second-keypair@example.com', 'test2');
314        $decryptedData = $this->gpg->decrypt($encryptedData);
315        $this->gpg->clearDecryptKeys();
316        $this->assertEquals($expectedDecryptedData, $decryptedData);
317    }
318
319    /**
320     * @group string
321     */
322    public function testDecryptDualOnePassphrase()
323    {
324        $expectedDecryptedData = 'Hello, Alice! Goodbye, Bob!';
325
326        // encrypted with both first-keypair@example.com and
327        // no-passphrase@example.com
328        // {{{ dual encrypted data one passphrase
329        $encryptedData = <<<TEXT
330-----BEGIN PGP MESSAGE-----
331Version: GnuPG v1.4.6 (GNU/Linux)
332
333hQIOA5+T+RFnKO8SEAgAkvANavo5eEeJ/C0njcciAh/ELcgqynhwM4R3texCA9HF
334043Z5kd4nMr2NUFBFG+UAzFSoB2zO5FZWsESMi71aIgzjX+CG754vw4j1I6Elsa8
335An1Tldb4vPJqEWdp9ynu/i90wqYUc6DNp8MLilTfFk16GdPv2L8wjOUFlJqV3OdA
336LJ68ppg3Qr8H0R81HSLPkSMc+o6GpljVShcejLeG14EpoW16ryZHXQk9T9bZzj1L
337VQT/t8jgj5h2ocEtUCXixNBpFoRdMGMZB4SWXH4Aw3GiSCNSz/xQOgOSu9c/FdVD
338WE1KCds4DGo5Za6rpDHxBCa8OhUNfhFiOAIcffz4MwgA07vc9jiAU7kGaR86AQuu
339UlzYe0ZZd6hALVxUAfnBF2aG5Jjhm3muwOEu7e3zk3hd/xVPzT5BQ+1/mt+vlS8E
340Ffjr13q/nKdoGTW7+orFjcwOmhpsJJcrTU+6TynkpmjNLyHhZix/roNbEPij7JJu
341StO+vbyu22xWc2mp56AbhO8MLwBC6Vxc2h2ZJXjXcaCLkntnOEPxx653sC55KqHm
3426gY4Ycwh+cnF9z+dWZBPak/LlHP4pmrSaeIc+8pS9Q6zFdVtrppzjTPCH0/FPxA2
343QTwBMXrClF8iYNfvJ8a+Se3ZqzmPbpvbbdtTGm49Bo4FNrdHVkC+MMgBEQiJKkbq
344/4UCDgMkvzgHAMFLTxAH/3a9Et2b3u61MMd0iag7haurrRsMwd6E9VD2SC6gbscF
345efInr202g78bbyf0AnISnWBjZC8lfmiyoe6Ic7NO5HGzddJ2UPyeiA9ggNPlARlZ
346OQngAaFzvP8NyMhYMIz5tUxxhYA9U8yjgEuhr/lq+olZwk6iiSaD3lP0q715XkLC
347uVJ6uxZoBjRaKsVnNLcXvXY6C0IcrGzSr6wKvJm4kQ3RjahRjJvUJG8yeKtbUmHz
348KBeorg4HQADXcK5Bcp9NCMatds1jvR/Zf8DakAO4G1T8Yb09xEQCVFqFIk7g1NDB
349T/vHtAdYolvyeS7wlF1TMFuYfuMOi0kVdlbx/PlhpN4H/Recs7EMcl/9gUwUktOl
3506xyDvA36QvO9RN0D504Ck+ZZjMNFId6fdU/ngSjq9AAteLRLUFgapbMTN2calf1J
3510ehPzMINegvnVB2dR+xcc67QpxmR5uIA2jK1fSkhvOohE7UxE7xqp4SIMw6E92zy
352ZvmhQVIqN6/s4k8KxrZKe/uhtDj963m7rsdR7v9wQsc1jJ/f+KZxy73r2Oz7BdTf
353cpKaMKY/CHiy0NQ3jPrY3oVOIEzu15q4raOhIT5FQoH0pWgmBID3aQsEMjAdeCTy
354JGHa4ZhQn9LSI+1XQmT3h8tWNYtAm9u3eqFsSm7ENMj3fY2Bd9wKlwTuTzsNhsdw
355hvHSVgFkfzy/xAiLNPzXydzWJ3bm6ZetguDA/lNgfSaNVR4zSiPSbmV9ipJtrPpB
356S6stCnUnw33F2IUOsEufvLFfEWtXY8qbBCULYC+no3GOwJhMyJQEI+xw
357=1ZwO
358-----END PGP MESSAGE-----
359
360TEXT;
361        // }}}
362
363        // decrypt with no passphrase
364        $decryptedData = $this->gpg->decrypt($encryptedData);
365        $this->assertEquals($expectedDecryptedData, $decryptedData);
366
367        // decrypt with first key
368        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
369        $decryptedData = $this->gpg->decrypt($encryptedData);
370        $this->gpg->clearDecryptKeys();
371        $this->assertEquals($expectedDecryptedData, $decryptedData);
372    }
373
374    /**
375     * @group string
376     */
377    public function testDecryptDualNoPassphraseKeyMissing()
378    {
379        $this->expectException('Crypt_GPG_BadPassphraseException');
380
381        // encrypted with both first-keypair@example.com and
382        // second-keypair@example.com
383        // {{{ dual encrypted data
384        $encryptedData = <<<TEXT
385-----BEGIN PGP MESSAGE-----
386Version: GnuPG v1.4.6 (GNU/Linux)
387
388hQIOA5+T+RFnKO8SEAf7BO/zLK6gDt5epMOEnHc9ESdSTy8yExdoSxHhvTFxWfwi
389AwMtBEur8sotSVt+Q87xYzjzE77+FQYS9oYCivlK/Nedblj3MiRuUWhM+Q9tbP3b
390KbwEwaQlrpNphQsKZOWkliZWmFJWnQ1s1Pm6lPlhwTNhcwkapm8EXuWFExJnY9yW
391EZjUOhVmnkitKykKup8Brvfm2QpGXoFZtHFKXTi162Lue9N0tDm6s3JnCIhMFQgI
392fyAikcsJKpbUgeGmzlWJO8QkH81QMuKpqfUb8R1dswhDp6RKXhoXS43zkhH8QSbM
393Cp9AWdv3qsWBUqzWavCxjtIsogYO+gFLl/Vuw5Y87Af/b7OQgLP1v6xKZcrTvFCF
394hxGxn+5M8E2GyJaKpQ1GZ+Wv+IzPGetm7rWf6q71hchAkxFMczIPSK7aARm9CNVo
3957tCdcUmUTgLhG1/0OfmkbwJUjdSpOtz8+TvIZa20Jj9a1G8WT3KTeivKMqBPhgk4
396sD7OJPDCYQNSQEw6pAn4oBrhJlDUkpCK6wIbUhzeq3MUwtM1e+qpCr/k4In4NVq6
397cmoC7W//9J69ecuxmiUHRhZ4CALRxQMAsSxMRnNJ26JY4ko82Rfvbrz8QEmKcIyT
398bTdAMsZ18m9XXrnc2ACDDMQyUkneQDUZSt7V67ZiN4Upi295CynIbNEMmcH/13Aa
399aoUCDgOy9U5HV+IkUBAIALGICOFzyfquWZ0ZhPGVdDWx1yNcApnzIgZx1JbBpMyc
4002jb9aQHwGId26gv/ym/M/3FJ0lv+IAcktMjO4dwYLnUuBa6BOFFybZi3gYvXtSuy
401iW4ygVjIsYixhvbsyaVCoB/MsNBFrQAHEShaxALBkI/dv+yyD8BifU4Yj9LFcAZO
402mFDraOgYfHsur5eevYTXozf5wU7phu9v6zo5bk8zgZSqs8AgyscstZWCqCtR/cG0
403t9lAIovGPsIcA12qvkm/A0WiBMEWhGryzHTv9oRsFztOFtqH+MmLdlvWjElw8hKt
404fFJB+bhHNO9BUIrwnuH79cA4aXOy1+xG+ECs7oJbcisIANqJKalQLgBYEjbucpDg
405O8i/c4RmV9J7VczpZp7ZREMpTmv9nV849OFXT1strsb/+vXOXOyLToG1gOxRfJr2
406q9jFjpyMAtrr/aHhXMKK1OMhhcdkQMEKuHTvon5KleZOQoVmIqa3kUtWNW1vFBIP
407UfJFH202EJLOLC25rXCtzRsJE0HWiYDyLqKMQcSQhTcngLBLmeDLH3DeGUIDwcZe
408oWgUg8wB/oSoU4AchShzO+yM6bcmffcaHFqwll9gdu9walnJAAOb8+r6LGGlsGTV
409qhnR0LM3Khp+HOFdaxcQT6BV1aw/D6Z5hIi+Am0VTi0HlFr/gwleyYaP+742Z6K0
410s8bSVgFT2Pjik+byARWzRwWjmi0jT7QsgITM73aBKPDXiArEPkv8YtC9HzUj0lCY
411gX7Eg2ZqISULFydBckMJ6drojMMQiqZBeEc09GupSBL1zldnKHfiXBTw
412=QYjj
413-----END PGP MESSAGE-----
414
415TEXT;
416        // }}}
417
418        // #21148: Make sure that proper exception is thrown
419        // when decrypting without specyfying a passphrase
420
421        // in this case we remove one of private keys to make
422        // sure proper exception is thrown also in this case
423        $this->gpg->deletePrivateKey('first-keypair@example.com');
424
425        $this->gpg->decrypt($encryptedData);
426    }
427
428    /**
429     * @group string
430     */
431    public function testDecryptSignedData()
432    {
433        $expectedDecryptedData = 'Hello, Alice! Goodbye, Bob!';
434
435        // signed with first-keypair@example.com
436        // {{{ signed data
437        $signedData = <<<TEXT
438-----BEGIN PGP MESSAGE-----
439Version: GnuPG v1.4.6 (GNU/Linux)
440
441owGbwMvMwCR4YPrNN1MOJCczrjFOEsrLL8pNzNEtzkzPS03RTUksSfS49JPJIzUn
442J19HwTEnMzlVUcE9Pz8lqTJVR8EpP0mxw56ZlQGkBmaMIJO9GsOCo2L3pk5y2DNT
443yiFKb0X03YSJqscaGRb0BKjZ3P+6SvjG160/WOa9vpey4QUDAA==
444=wtCB
445-----END PGP MESSAGE-----
446
447TEXT;
448        // }}}
449
450        $decryptedData = $this->gpg->decrypt($signedData);
451        $this->assertEquals($expectedDecryptedData, $decryptedData);
452    }
453
454    /**
455     * @group string
456     */
457    public function testDecryptFirstSubKey()
458    {
459        $expectedDecryptedData = 'Hello, Alice! Goodbye, Bob!';
460
461        // encrypted with first subkey (ELG-E) of multiple-subkeys@example.com
462        // {{{ encrypted data
463        $encryptedData = <<<TEXT
464-----BEGIN PGP MESSAGE-----
465Version: GnuPG v1.4.6 (GNU/Linux)
466
467hQIOA2+UGsw2JFPaEAf/TQ5We9V090WikWJTnpLwIZVgJSU1aCcG6R9h3wBOPFHi
468RLQ4jBSL8EvXk4VwVJ0tuqpcB10+W1OugWbHTOxWnpbioEaUJk8jRu3MZvnyJe/d
4693FcLlqXE0SocZR1Okxbp64tDvBzs4jjniQYfoMEM1j/VVlkQ02nufOLy6uvxPZjf
470KkSeCVSy0HIaT0U5e3R28fT+dYN8i2RhT8AckjWeovJAMbHxCCsKdinI45u7O1QA
471t9zZxMBaUvo/ikLM1/fyw7E8QaGCh4LlH8WrgBXneAgOPtlkHGziS/I54RSvGe07
472yWrYkNzFch0l9RnGjAMqqzY9kXn+HxMr3bOFKeSzVQgAssvhcx6OjD+ZzRnVb8D+
473i5KYFTrVih377e5cBhayWEEIdNeV/QTH9ooZxEVqxC10J5P6UgwNewOYhGJxr1yN
474Nn2+KlgfoXuqa5RtLhShjDduPF5FS3v7HKGXuyXBQ+W9FcVeytayo8QRqbMqxWZe
475dNlgjfbNsXJtUjm/48fYdmIiBkb5lf+2LPBhX9JHekVbzJdqx3kigcyXnh7VefKZ
476fWnOmDdAd3hqeeagXUVGmtH+z6+XDGSKDuoBbwreHxr0ZIpW8mm6I6nx9kBF+LoE
477OapSuua9s7ddcBxaOVUGECiH4owhHnfFQSz58XsRNIbkZL8R4YewrCmCoscN6/qN
478adJWAY877iMazlpAzZWr6IZNvKqsET8yQbCllR0olqgh/VOmYUrnj31XtVFgP+47
479kjHVkhz76aEUtquqMmWsR8r8p42TqR0u1KoW2dGysFzdPreXPORf3tQ=
480=i9lR
481-----END PGP MESSAGE-----
482
483TEXT;
484        // }}}
485
486        $this->gpg->addDecryptKey('multiple-subkeys@example.com', 'test');
487
488        $decryptedData = $this->gpg->decrypt($encryptedData);
489        $this->assertEquals($expectedDecryptedData, $decryptedData);
490    }
491
492    /**
493     * @group string
494     */
495    public function testDecryptSecondSubKey()
496    {
497        $expectedDecryptedData = 'Hello, Alice! Goodbye, Bob!';
498
499        // encrypted with second subkey (RSA) of multiple-subkeys@example.com
500        // {{{ encrypted data
501        $encryptedData = <<<TEXT
502-----BEGIN PGP MESSAGE-----
503Version: GnuPG v1.4.6 (GNU/Linux)
504
505hQEMAykh4NP/Ww9KAQf9HLxeXIXDMXEyJaCsfulZodSavNBP0IuZrXVkxrMPPart
506fOf2N0Snnq3vA3MjPL9vEfD5sZLlA2bYMZmilyCh+lryYccME+Qa1gQ5xak1Cra1
507y5ckZ7UNOTdHnhH5VvXk+bwm4KDbdeJJPLOxBJ/j6pf03vxeDEyoBPeeMzzzkXqH
508+XZ9j7BHZcsLkY7j7iEw1DwcB4TdbOzkcVVBYwovCmhdY0i0m48mkqGVB0mKNUu+
509YbJuOqiqjACIwXBelB4h/xEXGeEPk+ij1UMt74QhNM2OaQ2HUhIKYMWvAHYuGAvx
510+ETuFiJo5OqCa4jW4Nqczw4FYLSDOVHdzKw7+dqeddJWAVST6k4823HSprJVFJ+i
511pY9Bijx3ziDr14+IPxspoJTOInBFYihbwmLFL2RYsf0+pDFmngRhskWIyl4ann4/
512w7YcziO6EF7lbOqYdn+rBA8e46kgbBQ=
513=7fzo
514-----END PGP MESSAGE-----
515
516TEXT;
517        // }}}
518
519        $this->gpg->addDecryptKey('multiple-subkeys@example.com', 'test');
520
521        $decryptedData = $this->gpg->decrypt($encryptedData);
522        $this->assertEquals($expectedDecryptedData, $decryptedData);
523    }
524
525    /**
526     * @group file
527     */
528    public function testDecryptFile()
529    {
530        $expectedMd5Sum = 'f96267d87551ee09bfcac16921e351c1';
531        $inputFilename  = $this->getDataFilename('testDecryptFile.asc');
532        $outputFilename = $this->getTempFilename('testDecryptFile.plain');
533
534        // file is encrypted with first-keypair@example.com
535        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
536        $this->gpg->decryptFile($inputFilename, $outputFilename);
537
538        $md5Sum = $this->getMd5Sum($outputFilename);
539        $this->assertEquals($expectedMd5Sum, $md5Sum);
540    }
541
542    /**
543     * @group file
544     */
545    public function testDecryptFileToString()
546    {
547        $expectedData  = 'Hello, Alice! Goodbye, Bob!';
548        $inputFilename = $this->getDataFilename('testDecryptFileToString.asc');
549
550        // file is encrypted with first-keypair@example.com
551        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
552        $decryptedData = $this->gpg->decryptFile($inputFilename);
553
554        $this->assertEquals($expectedData, $decryptedData);
555    }
556
557    /**
558     * @group file
559     */
560    public function testDecryptFileNoPassphrase()
561    {
562        $expectedMd5Sum = 'f96267d87551ee09bfcac16921e351c1';
563
564        $inputFilename =
565            $this->getDataFilename('testDecryptFileNoPassphrase.asc');
566
567        $outputFilename =
568            $this->getTempFilename('testDecryptFileNoPassphrase.plain');
569
570        // file is encrypted with no-passphrase@example.com
571        $this->gpg->decryptFile($inputFilename, $outputFilename);
572
573        $md5Sum = $this->getMd5Sum($outputFilename);
574        $this->assertEquals($expectedMd5Sum, $md5Sum);
575    }
576
577    /**
578     * @group file
579     */
580    public function testDecryptFileFileException_input()
581    {
582        $this->expectException('Crypt_GPG_FileException');
583
584        // input file does not exist
585        $inputFilename =
586            $this->getDataFilename('testDecryptFileFileException_input.asc');
587
588        $this->gpg->decryptFile($inputFilename);
589    }
590
591    /**
592     * @group file
593     */
594    public function testDecryptFileFileException_output()
595    {
596        $this->expectException('Crypt_GPG_FileException');
597
598        // input file is encrypted with first-keypair@example.com
599        // output file does not exist
600        $inputFilename  = $this->getDataFilename('testDecryptFile.asc');
601        $outputFilename = './non-existent' .
602            '/testDecryptFileFileException_output.plain';
603
604        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
605        $this->gpg->decryptFile($inputFilename, $outputFilename);
606    }
607
608    /**
609     * @group file
610     */
611    public function testDecryptFileKeyNotFoundException()
612    {
613        $this->expectException('Crypt_GPG_KeyNotFoundException');
614
615        // file is encrypted with missing-key@example.com
616        $inputFilename =
617            $this->getDataFilename('testDecryptFileKeyNotFoundException.asc');
618
619        $outputFilename =
620            $this->getTempFilename('testDecryptFileKeyNotFoundException.plain');
621
622        $this->gpg->decryptFile($inputFilename, $outputFilename);
623    }
624
625    /**
626     * @group file
627     */
628    public function testDecryptFileDual()
629    {
630        $expectedMd5Sum = 'f96267d87551ee09bfcac16921e351c1';
631        $inputFilename  = $this->getDataFilename('testDecryptFileDual.asc');
632        $outputFilename = $this->getTempFilename('testDecryptFileDual.plain');
633
634        // decrypt with first key
635        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
636        $this->gpg->decryptFile($inputFilename, $outputFilename);
637        $this->gpg->clearDecryptKeys();
638        $md5Sum = $this->getMd5Sum($outputFilename);
639        $this->assertEquals($expectedMd5Sum, $md5Sum);
640
641        // decrypt with second key
642        $this->gpg->addDecryptKey('second-keypair@example.com', 'test2');
643        $this->gpg->decryptFile($inputFilename, $outputFilename);
644        $this->gpg->clearDecryptKeys();
645        $md5Sum = $this->getMd5Sum($outputFilename);
646        $this->assertEquals($expectedMd5Sum, $md5Sum);
647    }
648
649    /**
650     * @group file
651     */
652    public function testDecryptFileDualOnePassphrase()
653    {
654        $expectedMd5Sum = 'f96267d87551ee09bfcac16921e351c1';
655
656        $inputFilename =
657            $this->getDataFilename('testDecryptFileDualOnePassphrase.asc');
658
659        $outputFilename =
660            $this->getTempFilename('testDecryptFileDualOnePassphrase.plain');
661
662        // decrypt with no-passphrase
663        $this->gpg->decryptFile($inputFilename, $outputFilename);
664        $md5Sum = $this->getMd5Sum($outputFilename);
665        $this->assertEquals($expectedMd5Sum, $md5Sum);
666
667        // decrypt with first key
668        $this->gpg->addDecryptKey('first-keypair@example.com', 'test1');
669        $this->gpg->decryptFile($inputFilename, $outputFilename);
670        $this->gpg->clearDecryptKeys();
671        $md5Sum = $this->getMd5Sum($outputFilename);
672        $this->assertEquals($expectedMd5Sum, $md5Sum);
673    }
674
675    /**
676     * @group file
677     */
678    public function testDecryptFileNoDataException()
679    {
680        $this->expectException('Crypt_GPG_NoDataException');
681
682        $filename = $this->getDataFilename('testFileEmpty.plain');
683        $this->gpg->decryptFile($filename);
684    }
685
686    /**
687     * @group string
688     */
689    public function testDecryptFileSignedData()
690    {
691        $expectedMd5Sum = 'f96267d87551ee09bfcac16921e351c1';
692
693        $inputFilename =
694            $this->getDataFilename('testVerifyFileNormalSignedData.asc');
695
696        $outputFilename =
697            $this->getTempFilename('testDecryptFileSignedData.plain');
698
699        $this->gpg->decryptFile($inputFilename, $outputFilename);
700
701        $md5Sum = $this->getMd5Sum($outputFilename);
702        $this->assertEquals($expectedMd5Sum, $md5Sum);
703    }
704}
705