Beispiel #1
0
 def from_string(cls, hash):
     # NOTE: assuming hash will be unicode, or use ascii-compatible encoding.
     # TODO: switch to working w/ str or unicode
     if isinstance(hash, unicode):
         hash = hash.encode("utf-8")
     if not isinstance(hash, bytes):
         raise exc.ExpectedStringError(hash, "hash")
     m = cls._hash_regex.match(hash)
     if not m:
         raise exc.MalformedHashError(cls)
     type, version, memory_cost, time_cost, parallelism, keyid, data, salt, digest = \
         m.group("type", "version", "memory_cost", "time_cost", "parallelism",
                 "keyid", "data", "salt", "digest")
     if keyid:
         raise NotImplementedError("argon2 'keyid' parameter not supported")
     return cls(
         type=type.decode("ascii"),
         version=int(version) if version else 0x10,
         memory_cost=int(memory_cost),
         rounds=int(time_cost),
         parallelism=int(parallelism),
         salt=b64s_decode(salt) if salt else None,
         data=b64s_decode(data) if data else None,
         checksum=b64s_decode(digest) if digest else None,
     )
Beispiel #2
0
    def __init__(self, charmap, big=False):
        # validate charmap, generate encode64/decode64 helper functions.
        if isinstance(charmap, unicode):
            charmap = charmap.encode("latin-1")
        elif not isinstance(charmap, bytes):
            raise exc.ExpectedStringError(charmap, "charmap")
        if len(charmap) != 64:
            raise ValueError("charmap must be 64 characters in length")
        if len(set(charmap)) != 64:
            raise ValueError("charmap must not contain duplicate characters")
        self.bytemap = charmap
        self._encode64 = charmap.__getitem__
        lookup = dict((value, idx) for idx, value in enumerate(charmap))
        self._decode64 = lookup.__getitem__

        # validate big, set appropriate helper functions.
        self.big = big
        if big:
            self._encode_bytes = self._encode_bytes_big
            self._decode_bytes = self._decode_bytes_big
        else:
            self._encode_bytes = self._encode_bytes_little
            self._decode_bytes = self._decode_bytes_little