3
3
###########################################################################
4
4
# PBKDF2.py - PKCS#5 v2.0 Password-Based Key Derivation
5
5
#
6
- # Copyright (C) 2007 Dwayne C. Litzenberger <[email protected] >
6
+ # Copyright (C) 2007, 2008 Dwayne C. Litzenberger <[email protected] >
7
7
# All rights reserved.
8
8
#
9
9
# Permission to use, copy, modify, and distribute this software and its
61
61
# 64 bytes (so SHA1, SHA256 and SHA512 are fine), but I don't like
62
62
# anything that silently reduces the security margin from what is
63
63
# expected.
64
+ #
65
+ # 2008-06-17 Dwayne C. Litzenberger <[email protected] >
66
+ # - Compatibility release (v1.2)
67
+ # - Add support for older versions of Python (2.2 and 2.3).
64
68
#
65
69
###########################################################################
66
70
67
- __version__ = "1.1 "
71
+ __version__ = "1.2 "
68
72
69
73
from struct import pack
70
74
from binascii import b2a_hex
71
- from base64 import b64encode
72
75
from random import randint
76
+ import string
73
77
74
78
try :
75
79
# Use PyCrypto (if available)
83
87
def strxor (a , b ):
84
88
return "" .join ([chr (ord (x ) ^ ord (y )) for (x , y ) in zip (a , b )])
85
89
90
+ def b64encode (data , chars = "+/" ):
91
+ tt = string .maketrans ("+/" , chars )
92
+ return data .encode ('base64' ).replace ("\n " , "" ).translate (tt )
93
+
86
94
class PBKDF2 (object ):
87
95
"""PBKDF2.py : PKCS#5 v2.0 Password-Based Key Derivation
88
96
@@ -124,7 +132,7 @@ def read(self, bytes):
124
132
i = self .__blockNum
125
133
while size < bytes :
126
134
i += 1
127
- if i > 0xffffffff :
135
+ if i > 0xffffffffL or i < 1 :
128
136
# We could return "" here, but
129
137
raise OverflowError ("derived key too long" )
130
138
block = self .__f (i )
@@ -138,7 +146,7 @@ def read(self, bytes):
138
146
139
147
def __f (self , i ):
140
148
# i must fit within 32 bits
141
- assert ( 1 <= i and i <= 0xffffffff )
149
+ assert 1 <= i <= 0xffffffffL
142
150
U = self .__prf (self .__passphrase , self .__salt + pack ("!L" , i ))
143
151
result = U
144
152
for j in xrange (2 , 1 + self .__iterations ):
0 commit comments