diff options
-rw-r--r-- | tests/crypto_test.py | 70 | ||||
-rw-r--r-- | tests/static/pub.gpg | 30 | ||||
-rw-r--r-- | tests/static/sec.gpg | 57 |
3 files changed, 157 insertions, 0 deletions
diff --git a/tests/crypto_test.py b/tests/crypto_test.py index 156d4ad6..7afb7a93 100644 --- a/tests/crypto_test.py +++ b/tests/crypto_test.py @@ -3,9 +3,16 @@ # For further details see the COPYING file from __future__ import absolute_import +import os +import shutil +import subprocess +import tempfile import unittest import gpgme +import mock + +from . import utilities from alot import crypto from alot.errors import GPGProblem @@ -26,3 +33,66 @@ class TestHashAlgorithmHelper(unittest.TestCase): def test_raises_for_unknown_hash_name(self): with self.assertRaises(GPGProblem): crypto.RFC3156_micalg_from_algo(gpgme.MD_NONE) + + +class TestSignature(utilities.TestCaseClassCleanup): + + FPR = "F74091D4133F87D56B5D343C1974EC55FBC2D660" + + @classmethod + def setUpClass(cls): + # Create a temporary directory to use as gnupg's home directory. This + # allows us to import keys without dirtying the user's keyring + home = tempfile.mkdtemp() + cls.addClassCleanup(shutil.rmtree, home) + mock_home = mock.patch.dict(os.environ, {'GNUPGHOME': home}) + mock_home.start() + cls.addClassCleanup(mock_home.stop) + + # create a single context to use class wide. + cls.ctx = gpgme.Context() + cls.ctx.armor = True + + # Add the public and private keys. They have no password + here = os.path.dirname(__file__) + with open(os.path.join(here, 'static/pub.gpg')) as f: + cls.ctx.import_(f) + with open(os.path.join(here, 'static/sec.gpg')) as f: + cls.ctx.import_(f) + + cls.key = cls.ctx.get_key(cls.FPR) + + def test_detached_signature_for(self): + to_sign = "this is some text.\nit is more than nothing.\n" + _, detached = crypto.detached_signature_for(to_sign, self.key) + + with tempfile.NamedTemporaryFile(delete=False) as f: + f.write(detached) + sig = f.name + self.addCleanup(os.unlink, f.name) + + with tempfile.NamedTemporaryFile(delete=False) as f: + f.write(to_sign) + text = f.name + self.addCleanup(os.unlink, f.name) + + res = subprocess.check_call(['gpg', '--verify', sig, text]) + self.assertEqual(res, 0) + + def test_verify_signature_good(self): + to_sign = "this is some text.\nIt's something\n." + _, detached = crypto.detached_signature_for(to_sign, self.key) + + try: + crypto.verify_detached(to_sign, detached) + except GPGProblem: + raise AssertionError + + @unittest.expectedFailure + def test_verify_signature_bad(self): + to_sign = "this is some text.\nIt's something\n." + similar = "this is some text.\r\n.It's something\r\n." + _, detached = crypto.detached_signature_for(to_sign, self.key) + + with self.assertRaises(GPGProblem): + crypto.verify_detached(similar, detached) diff --git a/tests/static/pub.gpg b/tests/static/pub.gpg new file mode 100644 index 00000000..c94f951d --- /dev/null +++ b/tests/static/pub.gpg @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFllJaEBCACjvX5b8EkZI9b8uJnhjVwF3GKd/EJWnGYSLm5yQ1K7EKlAW8VK +yXM63iIqNbWTOzp52RtuNXFilXOabH3yZstBF8yn65uGm66CIdCJ8hOYZNhXVQGv +27aZ7dwwBxZNd4WCrskvD7Ll1DZZR+j1bMJSDLIh1i3OhR0uKUpTPT1Cp/XmTfII +wL3oh57PyNqlS6WXwkAVO8ZrRJQJP76ReSfvLKPaRwvPyuH0HD2A8U6gzbh+qVZl +UbDOwkka7C8yJV29805dT03bNPP0FKvo53xlzHVquO58AlCnhx3xT2+mg2TEwp4N +/Kz5E3PIm2njZLUS029vw83NNu04nRomzcO7ABEBAAG0HHRlc3QgdXNlciA8dGVz +dEBleGFtcGxlLmNvbT6JAVQEEwEIAD4WIQT3QJHUEz+H1WtdNDwZdOxV+8LWYAUC +WWUloQIbAwUJA8JnAAULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAZdOxV+8LW +YDSiB/wNRzFSYRVOEhYYvgXCs14ca6HR5kxt07ei7ztp8D2rg8jxA+8pEzCtTnZb +GYZ4tnKCenKuRCsfxBI5pY/mwVT9TFfOY9umDyq471cn0Qx6Tt3lj1KhAJNnhtLJ +a/FQ9vPLQ4gghDeagw7FiS92xDsWsfkAouYAdBuUGgR8lu+vRHNCh/qh7KiBqtQX +wfGJb+ZCq4iXfFsU20TLZ0LZdIf1nRK1QWATI4d93t0zimvUVLSxK/A7xiwG0W+i +4SRGYeIy5ImCTa4gIFDw3C7fFeyhI4pzWz5I7iAKO6WJ6n+wMzi8aJMkApHZUbKY +HosXHR/IesA+wpBMLzc56N/NcwPsuQENBFllJaEBCADPqqyFwZVgvHPwG1GOPM5O +py2zb4hsgryOzNhddzVHzGD5pKyJsJiHrS+wOkIXMxvCfx0d1DL4vkwwsRMJND+0 +7T2fFCQXYqsGq36vyf/XgofUYrZVTQaBqRJ1IubD6n1kM+OljPLXyT2BhRuJbP40 +LFTBminndrMg55AkI4Sh8t/TIgwZtaxmzYrb94CNoK8Q/pEzFhMVe+0XlbyXn1x1 +fxnnmuHUeZP8lC9jdVIFBxYnGK3vcG0xmtHjE5wYiQ38+/IS+nn/zrs6OWpXF+L6 +UQE/53N0dG+tSWQ3kDv6HyAZCJRR2npkN4n0Ngq3Wx0fRgg0BnyZV2DsNeu1Mj3F +ABEBAAGJATwEGAEIACYWIQT3QJHUEz+H1WtdNDwZdOxV+8LWYAUCWWUloQIbDAUJ +A8JnAAAKCRAZdOxV+8LWYE0oB/9wLNmdC0psG3kMDWT9JBqo2Js/VXXBcjiRbErk +5uX0/FIqaM/HiP6AeXVp6w1NBOoQCH7tQKJ8Q0r4yh7Gi9W/qzlajFAAFVMtufq3 +2D7qy73NRwhAqFJeJVco/iRjEBzTDi48wtfxhFQDRAaqwDKoasNBxkhBk3fENaEc +kk8H03CfUx42gk7MBRt5jFIlN+/cNXxrdcz6XeGAPLOoqE+il+5+C/7slNMuDAV/ +6s/1DsYZ7C+jOycM6lMXaAkdveueXtOq9yaytmpjIysfmZIaXyahBxbRMvQtBAAR +eHTTrfhhS03FwT0YdioRcxNAHGW+Iltjrq3eygCmAilEBIAb +=DLcu +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/static/sec.gpg b/tests/static/sec.gpg new file mode 100644 index 00000000..f00b017f --- /dev/null +++ b/tests/static/sec.gpg @@ -0,0 +1,57 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lQOYBFllJaEBCACjvX5b8EkZI9b8uJnhjVwF3GKd/EJWnGYSLm5yQ1K7EKlAW8VK +yXM63iIqNbWTOzp52RtuNXFilXOabH3yZstBF8yn65uGm66CIdCJ8hOYZNhXVQGv +27aZ7dwwBxZNd4WCrskvD7Ll1DZZR+j1bMJSDLIh1i3OhR0uKUpTPT1Cp/XmTfII +wL3oh57PyNqlS6WXwkAVO8ZrRJQJP76ReSfvLKPaRwvPyuH0HD2A8U6gzbh+qVZl +UbDOwkka7C8yJV29805dT03bNPP0FKvo53xlzHVquO58AlCnhx3xT2+mg2TEwp4N +/Kz5E3PIm2njZLUS029vw83NNu04nRomzcO7ABEBAAEAB/sEyUqsAC+L+EvxXYUy +AvSs0XgYgiZa2TSqnj8gQIFCTgapGPNcS26jJiu0WeBtLsXA0X7+WExweiVWFfil +F+FIjYnUhsLfFCZ/vZlNhdZIzLC1GokFzYqne4XqMqGxsXBugu4HJwBTc4so4GGH +xDCtY5tU1Lvs6Bal/VwjsQwBqnc/1JyI+/8TkIf6BssYvlWMVvDm6SeLMos4AwPf +JOg+mvqKOktsjzpfAhlNVzEn1rPnOBgeDVdh5KDDPBIY8FjzmKV6kAechGqkgtBY +4Lmhn+CBwy9rvIrVroQLVd9dMH0rJG7v8HCMck+h198K6DJfwkAlKDu5cL3nXhIC +A+zxBADFokxgH+Me1nKjsddtae6eOQaSNc/GihimPvsLvit9Dr0VPaiTwiNIbLpN +tDZx3esNEWThMDJoXVhKb6CetwirJuqSH9ZbV6oGEq3S9eFsBSdMRNl6/XB65mIT +uJdruZKmJjREn2qRCHuqralRB6zqTDMFBDnT5LBHtgjRR1f1ZwQA1Bi6ZBIbHzmJ +YMsaZZ6YF9mvaPoQdVodmAAvo3SgVWEhoWNZ8YF7wjxfG6rpkS3PRTCjHpg8EfxG +Zjue2U8RmgwmLnecUT4qQQcyWWQzM5wLFcMkIeTl8lJa/MOEEqLGgeKllzJApKkB +E6atGeZRt51/yMRL0K3HwWfHrsPdVo0D/3mVvs8Jlq/IHPVLfUSOl9xmE+LALeL1 +hMZx6TBjYYk528lBV+JLS7w5twqvyN/U7PxadX5bwrVJoovssyOh9IpkHcBzL6CY +hT6vEZXiLjYPYeRuYBGW1kRkQmlPpNsNDJTFQ9Mve0QYldPLgFEbzZgnid2siWDn +uRe34gzXP5drNti0HHRlc3QgdXNlciA8dGVzdEBleGFtcGxlLmNvbT6JAVQEEwEI +AD4WIQT3QJHUEz+H1WtdNDwZdOxV+8LWYAUCWWUloQIbAwUJA8JnAAULCQgHAgYV +CAkKCwIEFgIDAQIeAQIXgAAKCRAZdOxV+8LWYDSiB/wNRzFSYRVOEhYYvgXCs14c +a6HR5kxt07ei7ztp8D2rg8jxA+8pEzCtTnZbGYZ4tnKCenKuRCsfxBI5pY/mwVT9 +TFfOY9umDyq471cn0Qx6Tt3lj1KhAJNnhtLJa/FQ9vPLQ4gghDeagw7FiS92xDsW +sfkAouYAdBuUGgR8lu+vRHNCh/qh7KiBqtQXwfGJb+ZCq4iXfFsU20TLZ0LZdIf1 +nRK1QWATI4d93t0zimvUVLSxK/A7xiwG0W+i4SRGYeIy5ImCTa4gIFDw3C7fFeyh +I4pzWz5I7iAKO6WJ6n+wMzi8aJMkApHZUbKYHosXHR/IesA+wpBMLzc56N/NcwPs +nQOYBFllJaEBCADPqqyFwZVgvHPwG1GOPM5Opy2zb4hsgryOzNhddzVHzGD5pKyJ +sJiHrS+wOkIXMxvCfx0d1DL4vkwwsRMJND+07T2fFCQXYqsGq36vyf/XgofUYrZV +TQaBqRJ1IubD6n1kM+OljPLXyT2BhRuJbP40LFTBminndrMg55AkI4Sh8t/TIgwZ +taxmzYrb94CNoK8Q/pEzFhMVe+0XlbyXn1x1fxnnmuHUeZP8lC9jdVIFBxYnGK3v +cG0xmtHjE5wYiQ38+/IS+nn/zrs6OWpXF+L6UQE/53N0dG+tSWQ3kDv6HyAZCJRR +2npkN4n0Ngq3Wx0fRgg0BnyZV2DsNeu1Mj3FABEBAAEAB/oD+AKREdiNfzyF/7eo +zL+yoB5O+hg03rDE1+RgsOkLRLwruTp07TOVEDnDl/FwaREkP/KqAcaxm01wdsni +2KVJC2mskyF3cvLKz1c9+9HQaBW5eON8MNspejY4l+CqKN6ZniZBITb46ccrpQQY +NcWL8Lbz9kLLwih9Pf+yuR0NTUKpmdii3WANE0bolNTXEe0M2df8f5uG5a8tQEHL +FXTNFmWxJNIjZkWPc9ezczmJ3JtvEoHcLPTz1SCqAIcp1/ZC0YWVQWRVomeXfhTS +Fsps1/2qhItIzWyAcZntwlNbjOYHMSVgo1OVrKsMLgGk6XKM2+IpvG6ABx+z7AaU +UW6hBADfosc/Fn1ZoeE+6B7ceHhtjAqsReqSkuS/1U5cN5BKmx0xfrLbOUqdPeBr +VpdsmIfFV+rD67d35APrFELGvojOxo/6/kBfOdjMYjKhlzUGuYTen4qjkCxf/27d +1ji8nPl/VRAynAfZ4HdhNaTpM81JIgq5LnWZRwKvteeOj+pzEQQA7bhF54pR/drT ++jmYyOSpgkE3/WIqKxLY+cP6hC0dTGb2i5uXvp2NZppxTqt9UtuN3oSWra6HXf6T +bXmlxnUOopdzI5TiqGk4aoWE7obwwY12FaVTwdHyJ561JbtS+iBJygi2WV/Vpbn2 +/ijxBsFdFqkJOnS8RdixViV/04UjN3UD/REGfH9krzvGknuWHo5T6q1JXaNwfKDm +XTmtakDlzidMs1jDr9S/HeujPBJvtuIqWRZHn0TYCEnb7ZwSZpTOmcwH12WFKcj6 +HUHQR5MrfXhWBk5nvMyVFiLueylBmxfaIRvGgkYELWXtGjvlSn9K0Mb48sYZAQXU +BhtgSu9icPdVSwiJATwEGAEIACYWIQT3QJHUEz+H1WtdNDwZdOxV+8LWYAUCWWUl +oQIbDAUJA8JnAAAKCRAZdOxV+8LWYE0oB/9wLNmdC0psG3kMDWT9JBqo2Js/VXXB +cjiRbErk5uX0/FIqaM/HiP6AeXVp6w1NBOoQCH7tQKJ8Q0r4yh7Gi9W/qzlajFAA +FVMtufq32D7qy73NRwhAqFJeJVco/iRjEBzTDi48wtfxhFQDRAaqwDKoasNBxkhB +k3fENaEckk8H03CfUx42gk7MBRt5jFIlN+/cNXxrdcz6XeGAPLOoqE+il+5+C/7s +lNMuDAV/6s/1DsYZ7C+jOycM6lMXaAkdveueXtOq9yaytmpjIysfmZIaXyahBxbR +MvQtBAAReHTTrfhhS03FwT0YdioRcxNAHGW+Iltjrq3eygCmAilEBIAb +=T5TK +-----END PGP PRIVATE KEY BLOCK----- |