Sfoglia il codice sorgente

Some more fixes for python3 in crypto_engine

oz123 10 anni fa
parent
commit
76bc459813
2 ha cambiato i file con 35 aggiunte e 12 eliminazioni
  1. 31 4
      pwman/tests/test_crypto_engine.py
  2. 4 8
      pwman/util/crypto_engine.py

+ 31 - 4
pwman/tests/test_crypto_engine.py

@@ -1,5 +1,6 @@
 import unittest
 import pwman.util.config as config
+from pwman.util.callback import Callback
 import os
 from pwman.util.crypto_engine import (CryptoEngine, CryptoException)
 import time
@@ -20,12 +21,27 @@ config.set_defaults(default_config)
 give_key = lambda msg: "verysecretkey"
 give_wrong_key = lambda msg: "verywrongtkey"
 
+salt = b"jwGGiQsG/JIzxWL31/QptaI61lphARqOJbQ2UqwmukE="
+digest = b"3185bbf9ff483b2ddbd21bfeba6d5f54e62f45711e341c85c5b935ee26143650"
+
+
+class DummyCallback(Callback):
+
+    def getinput(self, question):
+        return u'verysecretkey'
+
+    def getsecret(self, question):
+        return u'verysecretkey'
+
+    def getnewsecret(self, question):
+        return u'verysecretkey'
+
 
 class CryptoEngineTest(unittest.TestCase):
 
     def test4_d_get_crypto(self):
         ce = CryptoEngine.get()
-
+        ce.callback = DummyCallback()
         secret2 = ce.changepassword(reader=give_key)
         secret1 = ce.changepassword(reader=give_key)
         # althouth the same secret key is used,
@@ -36,8 +52,14 @@ class CryptoEngineTest(unittest.TestCase):
 
     def test5_e_authenticate(self):
         ce = CryptoEngine.get()
+        ce._reader = give_key
+        if not ce._salt:
+            ce._salt = salt
+        if not ce._digest:
+            ce._digest = digest
+        ce.authenticate('verywrong')
         self.assertFalse(ce.authenticate('verywrong'))
-        self.assertTrue(ce.authenticate('12345'))
+        self.assertTrue(ce.authenticate('verysecretkey'))
         ce._timeout = -1
         self.assertTrue(ce._is_authenticated())
 
@@ -52,6 +74,8 @@ class CryptoEngineTest(unittest.TestCase):
     def test_f_encrypt_decrypt(self):
         ce = CryptoEngine.get()
         ce._reader = give_key
+        if not ce._salt:
+            ce._salt = salt
         secret = ce.encrypt("topsecret")
         decrypt = ce.decrypt(secret)
         self.assertEqual(decrypt.decode(), "topsecret")
@@ -65,7 +89,10 @@ class CryptoEngineTest(unittest.TestCase):
         ce._cipher = None
         ce._getsecret = give_wrong_key
         self.assertRaises(CryptoException, ce.encrypt, "secret")
-        ce._getsecret = lambda x: '12345'
-        secret = ce.encrypt("topsecret")
+        ce._getsecret = lambda x: u'verysecretkey'
+        secret = ce.encrypt(u"topsecret")
         decrypt = ce.decrypt(secret)
         self.assertEqual(decrypt.decode(), "topsecret")
+
+if __name__ == '__main__':
+    unittest.main()

+ 4 - 8
pwman/util/crypto_engine.py

@@ -55,6 +55,9 @@ def get_digest(password, salt):
     Get a digest based on clear text password
     """
     iterations = 5000
+    if isinstance(password, bytes):
+        password = password.decode()
+    #print(type(password), type(salt))
     return PBKDF2(password, salt, dkLen=32, count=iterations)
 
 
@@ -225,17 +228,10 @@ class CryptoEngine(object):  # pagma: no cover
         """
         salt = base64.b64encode(os.urandom(32))
         passwd = self._getsecret("Please type in the secret key:")
-        key = self._get_digest(passwd, salt)
+        key = get_digest(passwd, salt)
         hpk = salt+'$6$'.encode('utf8')+binascii.hexlify(key)
         return hpk.decode('utf-8')
 
-    def _get_digest(self, password, salt):
-        """
-        Get a digest based on clear text password
-        """
-        iterations = 5000
-        return PBKDF2(password, salt, dkLen=32, count=iterations)
-
     def set_cryptedkey(self, key):
         # TODO: rename this method!
         salt, digest = key.split('$6$')