summaryrefslogtreecommitdiff
path: root/passlib/utils
diff options
context:
space:
mode:
authorEli Collins <elic@astllc.org>2011-03-25 12:11:17 -0400
committerEli Collins <elic@astllc.org>2011-03-25 12:11:17 -0400
commit32773d53f07bd9e94d4966a28f48c56cdecd51c3 (patch)
tree59f64c35fb6c4b3255882a417b9a4462c40cac8f /passlib/utils
parent771a8d2c0f909c6e8a59ff39ee4a1e939d799ce9 (diff)
downloadpasslib-32773d53f07bd9e94d4966a28f48c56cdecd51c3.tar.gz
misc bugfixes & tweaks for win32 compat
Diffstat (limited to 'passlib/utils')
-rw-r--r--passlib/utils/__init__.py5
-rw-r--r--passlib/utils/pbkdf2.py12
2 files changed, 14 insertions, 3 deletions
diff --git a/passlib/utils/__init__.py b/passlib/utils/__init__.py
index 00f27da..8b7fff2 100644
--- a/passlib/utils/__init__.py
+++ b/passlib/utils/__init__.py
@@ -7,6 +7,7 @@ from cStringIO import StringIO
from functools import update_wrapper
from hashlib import sha256
import logging; log = logging.getLogger(__name__)
+from math import log as logb
import os
import sys
import random
@@ -40,6 +41,10 @@ __all__ = [
'getrandstr',
]
+#quick check of system's arch
+sys_bits = int(logb(sys.maxsize,2)+1.5)
+assert sys_bits in (32,64), "unexpected sys_bits value: %r" % (sys_bits,)
+
#=================================================================================
#os crypt helpers
#=================================================================================
diff --git a/passlib/utils/pbkdf2.py b/passlib/utils/pbkdf2.py
index ad6f087..460925c 100644
--- a/passlib/utils/pbkdf2.py
+++ b/passlib/utils/pbkdf2.py
@@ -48,6 +48,7 @@ if _EVP:
#backend
#=================================================================================
MAX_BLOCKS = 0xffffffffL #2**32-1
+MAX_HMAC_SHA1_KEYLEN = MAX_BLOCKS*20
def _resolve_prf(prf):
"resolve prf string or callable -> func & digest_size"
@@ -134,10 +135,15 @@ def pbkdf2(secret, salt, rounds, keylen, prf="hmac-sha1"):
#special case for m2crypto + hmac-sha1
if prf == "hmac-sha1" and _EVP:
- try:
- return _EVP.pbkdf2(secret, salt, rounds, keylen)
- except OverflowError:
+ #NOTE: doing check here, because M2crypto won't take longs (which this is, under 32bit)
+ if keylen > MAX_HMAC_SHA1_KEYLEN:
raise ValueError, "key length too long"
+
+ #NOTE: M2crypto reliably segfaults for me if given keylengths
+ # larger than 40 (crashes at 41 on one system, 61 on another).
+ # so just avoiding it for longer calls.
+ if keylen < 41:
+ return _EVP.pbkdf2(secret, salt, rounds, keylen)
#resolve prf
encode_block, digest_size = _resolve_prf(prf)