def _parse_7_string(cls, suffix): # XXX: annoyingly, official spec embeds salt *raw*, yet doesn't specify a hash encoding. # so assuming only h64 chars are valid for salt, and are ASCII encoded. # split into params & digest parts = suffix.encode("ascii").split(b"$") if len(parts) == 2: params, digest = parts elif len(parts) == 1: params, = parts digest = None else: raise uh.exc.MalformedHashError() # parse params & return if len(params) < 11: raise uh.exc.MalformedHashError(cls, "params field too short") return dict( ident=IDENT_7, rounds=h64.decode_int6(params[:1]), block_size=h64.decode_int30(params[1:6]), parallelism=h64.decode_int30(params[6:11]), salt=params[11:], checksum=h64.decode_bytes(digest) if digest else None, )
def test_decode_bytes(self): for result, source in self.encoded_bytes: out = h64.decode_bytes(source) self.assertEqual(out, result) #wrong size (1 % 4) self.assertRaises(ValueError, h64.decode_bytes, b('abcde')) self.assertRaises(TypeError, h64.decode_bytes, u'abcd')
def test_encode_transposed_bytes(self): for result, input, offsets in self.encode_transposed + self.encode_transposed_dups: tmp = h64.encode_transposed_bytes(input, offsets) out = h64.decode_bytes(tmp) self.assertEqual(out, result)
def test_decode_bytes_padding(self): for source, result in self.decode_padding_bytes: out = h64.decode_bytes(source) self.assertEqual(out, result) self.assertRaises(TypeError, h64.decode_bytes, u'..')