summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2017-07-11 12:33:18 -0700
committerDylan Baker <dylan@pnwbakers.com>2017-07-11 12:52:04 -0700
commit9e0d05457552250d612f041bdb7a26bcf61678ab (patch)
tree0fd93df97d9b0c63e90c953ae8af28fc0c504129 /tests
parenta003d5c11dcf0467a362cb3cd04219efaa76bf23 (diff)
tests: Add tests for signing functions.
This adds a couple of basic tests for the signing and verification of signatures code in the crypto module. This relies on the utilities module introduced in the last patch. One of the tests in here is expected to fail
Diffstat (limited to 'tests')
-rw-r--r--tests/crypto_test.py70
-rw-r--r--tests/static/pub.gpg30
-rw-r--r--tests/static/sec.gpg57
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-----
+
+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
+=T5TK
+-----END PGP PRIVATE KEY BLOCK-----