]> Cypherpunks.ru repositories - pygost.git/blob - pygost/pbkdf2.py
Unify docstring's leading space presence
[pygost.git] / pygost / pbkdf2.py
1 # coding: utf-8
2 """PBKDF2 implementation suitable for GOST R 34.11-94/34.11-2012.
3
4 This implementation is based on Python 3.5.2 source code's one.
5 PyGOST does not register itself in hashlib anyway, so use it instead.
6 """
7
8
9 from pygost.utils import bytes2long
10 from pygost.utils import long2bytes
11 from pygost.utils import strxor
12 from pygost.utils import xrange
13
14
15 def pbkdf2(hasher, password, salt, iterations, dklen):
16     """PBKDF2 implementation suitable for GOST R 34.11-94/34.11-2012
17     """
18     inner = hasher()
19     outer = hasher()
20     password = password + b"\x00" * (inner.block_size - len(password))
21     inner.update(strxor(password, len(password) * b"\x36"))
22     outer.update(strxor(password, len(password) * b"\x5C"))
23
24     def prf(msg):
25         icpy = inner.copy()
26         ocpy = outer.copy()
27         icpy.update(msg)
28         ocpy.update(icpy.digest())
29         return ocpy.digest()
30
31     dkey = b""
32     loop = 1
33     while len(dkey) < dklen:
34         prev = prf(salt + long2bytes(loop, 4))
35         rkey = bytes2long(prev)
36         for _ in xrange(iterations - 1):
37             prev = prf(prev)
38             rkey ^= bytes2long(prev)
39         loop += 1
40         dkey += long2bytes(rkey, inner.digest_size)
41     return dkey[:dklen]