示例#1
0
    def derive_digest(cls, password, salt, rounds, alg):
        """helper to create SaltedPassword digest for SCRAM.

        This performs the step in the SCRAM protocol described as::

            SaltedPassword  := Hi(Normalize(password), salt, i)

        :type password: unicode or utf-8 bytes
        :arg password: password to run through digest

        :type salt: bytes
        :arg salt: raw salt data

        :type rounds: int
        :arg rounds: number of iterations.

        :type alg: str
        :arg alg: name of digest to use (e.g. ``"sha-1"``).

        :returns:
            raw bytes of ``SaltedPassword``
        """
        if isinstance(password, bytes):
            password = password.decode("utf-8")
        password = saslprep(password).encode("utf-8")
        if not isinstance(salt, bytes):
            raise TypeError("salt must be bytes")
        if rounds < 1:
            raise ValueError("rounds must be >= 1")
        alg = norm_hash_name(alg, "hashlib")
        return pbkdf2(password, salt, rounds, None, "hmac-" + alg)
示例#2
0
 def test_known(self):
     """test reference vectors"""
     from lib.passlib.utils.pbkdf2 import pbkdf2
     for row in self.pbkdf2_test_vectors:
         correct, secret, salt, rounds, keylen = row[:5]
         prf = row[5] if len(row) == 6 else "hmac-sha1"
         result = pbkdf2(secret, salt, rounds, keylen, prf)
         self.assertEqual(result, correct)
示例#3
0
 def _calc_checksum(self, secret):
     if isinstance(secret, unicode):
         secret = secret.encode("utf-8")
     hash = pbkdf2(secret,
                   self.salt.encode("ascii"),
                   self.rounds,
                   keylen=None,
                   prf=self._prf)
     return b64encode(hash).rstrip().decode("ascii")
示例#4
0
    def test_custom_prf(self):
        """test custom prf function"""
        from lib.passlib.utils.pbkdf2 import pbkdf2

        def prf(key, msg):
            return hashlib.md5(key + msg + b('fooey')).digest()

        result = pbkdf2(b('secret'), b('salt'), 1000, 20, prf)
        self.assertEqual(result,
                         hb('5fe7ce9f7e379d3f65cbc66ba8aa6440474a6849'))
示例#5
0
    def raw(cls, secret, user):
        """encode password using msdcc v2 algorithm

        :type secret: unicode or utf-8 bytes
        :arg secret: secret

        :type user: str
        :arg user: username to use as salt

        :returns: returns string of raw bytes
        """
        from lib.passlib.utils.pbkdf2 import pbkdf2
        secret = to_unicode(secret, "utf-8", param="secret").encode("utf-16-le")
        user = to_unicode(user, "utf-8", param="user").lower().encode("utf-16-le")
        tmp = md4(md4(secret).digest() + user).digest()
        return pbkdf2(tmp, user, 10240, 16, 'hmac-sha1')
示例#6
0
 def _calc_checksum(self, secret):
     if isinstance(secret, unicode):
         secret = secret.encode("utf-8")
     return pbkdf2(secret, self.salt, self.rounds, self.checksum_size, self._prf)
示例#7
0
 def _calc_checksum(self, secret):
     # TODO: find out what grub's policy is re: unicode
     if isinstance(secret, unicode):
         secret = secret.encode("utf-8")
     return pbkdf2(secret, self.salt, self.rounds, 64, "hmac-sha512")
示例#8
0
 def _calc_checksum(self, secret):
     # TODO: find out what crowd's policy is re: unicode
     if isinstance(secret, unicode):
         secret = secret.encode("utf-8")
     # crowd seems to use a fixed number of rounds.
     return pbkdf2(secret, self.salt, 10000, 32, "hmac-sha1")
示例#9
0
 def _calc_checksum(self, secret):
     if isinstance(secret, unicode):
         secret = secret.encode("utf-8")
     salt = str_to_bascii(self.to_string(withchk=False))
     result = pbkdf2(secret, salt, self.rounds, 24, "hmac-sha1")
     return ab64_encode(result).decode("ascii")
示例#10
0
 def _calc_checksum(self, secret):
     if isinstance(secret, unicode):
         secret = secret.encode("utf-8")
     return pbkdf2(secret, self.salt, self.rounds, 20, "hmac-sha1")
示例#11
0
 def helper(secret=b('password'),
            salt=b('salt'),
            rounds=1,
            keylen=None,
            prf="hmac-sha1"):
     return pbkdf2(secret, salt, rounds, keylen, prf)
示例#12
0
 def _calc_checksum(self, secret):
     if isinstance(secret, unicode):
         secret = secret.encode("utf-8")
     return pbkdf2(secret, self.salt, self.rounds, self.checksum_size,
                   self._prf)
示例#13
0
 def _calc_checksum(self, secret):
     # TODO: find out what grub's policy is re: unicode
     if isinstance(secret, unicode):
         secret = secret.encode("utf-8")
     return pbkdf2(secret, self.salt, self.rounds, 64, "hmac-sha512")
示例#14
0
 def _calc_checksum(self, secret):
     # TODO: find out what crowd's policy is re: unicode
     if isinstance(secret, unicode):
         secret = secret.encode("utf-8")
     # crowd seems to use a fixed number of rounds.
     return pbkdf2(secret, self.salt, 10000, 32, "hmac-sha1")
示例#15
0
 def _calc_checksum(self, secret):
     if isinstance(secret, unicode):
         secret = secret.encode("utf-8")
     salt = str_to_bascii(self.to_string(withchk=False))
     result = pbkdf2(secret, salt, self.rounds, 24, "hmac-sha1")
     return ab64_encode(result).decode("ascii")
示例#16
0
 def _calc_checksum(self, secret):
     if isinstance(secret, unicode):
         secret = secret.encode("utf-8")
     return pbkdf2(secret, self.salt, self.rounds, 20, "hmac-sha1")