<NME> test_cryptutils.py
<BEF> ADDFILE
<MSG> refactor cryptutils

Cryptography can be a black art, rather than rolling our own crypto
functions use the ones provided by the Python Cryptography module.

- `encrypt()` and `decrypt()`
    - ECB is insecure and the Python Cryptography module recommends[1]
    against using it.  The Python Cryptography module offers Fernet[2]
    for encrypting values using a secret_key.

    - Djangos `settings.SECRET_KEY` exists for things like encrypting
      passwords, use it instead of Modoboas own `secret_key`.

    - `settings.SECRET_KEY` is truncated to 32 characters as Fernet
      requires a key 32 characters long.

- `random_key()` uses Dangos get_random_string() method, the same
code used to generate settings.SECRET_KEY

- add tests for cryptutil methods

[1] https://cryptography.io/en/latest/hazmat/primitives/symmetric-encryption/?highlight=ecb#insecure-modes
[2] https://cryptography.io/en/latest/fernet/

<DFF> @@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+
+"""Tests for crypto utility functions."""
+
+from __future__ import unicode_literals
+
+from django.test import SimpleTestCase
+from django.test.utils import override_settings
+
+from modoboa.lib import cryptutils
+
+
+@override_settings(SECRET_KEY="!8o(-dbbl3e+*bh7nx-^xysdt)1gso*%@4ze4-9_9o+i&amp"
+                              ";t--u_")
+class CryptUtilsTest(SimpleTestCase):
+
+    """Tests for modoboa.lib.cryptutils"""
+
+    def test_valid_secret_key_generated(self):
+        """Generate a 32 byte key"""
+        secret_key = cryptutils.random_key(32)
+        self.assertEqual(len(secret_key), 32)
+
+    def test_encrypt(self):
+        """Encrypt a string"""
+        value = "test"
+        expected_output = "test"
+        output = cryptutils.encrypt(value)
+        output = cryptutils.decrypt(output)
+        self.assertEqual(output, expected_output)
+
+    def test_decrypt(self):
+        """Decrypt a string"""
+        value = "gAAAAABaXSWk4Via-aYP7diek9MmfknUiEY8szrgxIytdXrbfc"\
+                "YlbOYiNG01zqkn3a06P1xPXe5XD2SP4UrIvCWzhLs-FO19Cw=="
+        expected_output = "test"
+        output = cryptutils.decrypt(value)
+        self.assertEqual(output, expected_output)

refactor cryptutils