docs: def pbkdf2_bin(data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS,
                 keylen=None, hashfunc=None):
      """Returns a binary digest for the PBKDF2 hash algorithm of `data`
      with the given `salt`. It iterates `iterations` time and produces a
      key of `keylen` bytes. By default SHA-1 is used as hash function,
      a different hashlib `hashfunc` can be provided.
  
      .. versionadded:: 0.9
  
      :param data: the data to derive.
      :param salt: the salt for the derivation.
      :param iterations: the number of iterations.
      :param keylen: the length of the resulting key.  If not provided
                     the digest size will be used.
      :param hashfunc: the hash function to use.  This can either be the
                       string name of a known hash function or a function
                       from the hashlib module.  Defaults to sha1.
      """
      if isinstance(hashfunc, string_types):
          hashfunc = _hash_funcs[hashfunc]
      elif not hashfunc:
          hashfunc = hashlib.sha1
      salt = to_bytes(salt)
      mac = hmac.HMAC(to_bytes(data), None, hashfunc)
      if not keylen:
          keylen = mac.digest_size
      def _pseudorandom(x, mac=mac):
          h = mac.copy()
          h.update(x)
          return bytearray(h.digest())
      buf = bytearray()
      for block in range_type(1, -(-keylen // mac.digest_size) + 1):
          rv = u = _pseudorandom(salt + _pack_int(block))
          for i in range_type(iterations - 1):
              u = _pseudorandom(bytes(u))
              rv = bytearray(starmap(xor, izip(rv, u)))
          buf.extend(rv)
      return bytes(buf[:keylen])