def pbkdf2_bin(data, salt, iterations=1000, keylen=24, hashfunc=None):
 hashfunc = (hashfunc or hashlib.sha1)
 mac = hmac.new(data, None, hashfunc)
 def _pseudorandom(x, mac=mac):
  h = mac.copy()
  h.update(x)
  return map(ord, h.digest())
 buf = []
 for block in xrange(1, ((- ((- keylen) // mac.digest_size)) + 1)):
  rv = u = _pseudorandom((salt + _pack_int(block)))
  for i in xrange((iterations - 1)):
   u = _pseudorandom(''.join(map(chr, u)))
   rv = starmap(xor, izip(rv, u))
  buf.extend(rv)
 return ''.join(map(chr, buf))[:keylen]

def pbkdf2_bin ( data , salt , iterations = 1000 , keylen = 24 , hashfunc = None ) : hashfunc = ( hashfunc or hashlib . sha1 ) mac = hmac . new ( data , None , hashfunc ) def _pseudorandom ( x , mac = mac ) : h = mac . copy ( ) h . update ( x ) return map ( ord , h . digest ( ) ) buf = [ ] for block in xrange ( 1 , ( ( - ( ( - keylen ) // mac . digest_size ) ) + 1 ) ) : rv = u = _pseudorandom ( ( salt + _pack_int ( block ) ) ) for i in xrange ( ( iterations - 1 ) ) : u = _pseudorandom ( '' . join ( map ( chr , u ) ) ) rv = starmap ( xor , izip ( rv , u ) ) buf . extend ( rv ) return '' . join ( map ( chr , buf ) ) [ : keylen ]
returns a binary digest for the pbkdf2 hash algorithm of data with the given salt .