def test_all_bytes(self): for i in range(-128, 128): in_bytes = [i] * 48 trits = convertToTrits(in_bytes) out_bytes = convertToBytes(trits) self.assertEqual(in_bytes, out_bytes)
def test_random_trits(self): in_trits = [randrange(-1, 2) for _ in range(243)] in_trits[242] = 0 in_bytes = convertToBytes(in_trits) out_trits = convertToTrits(in_bytes) self.assertEqual(in_trits, out_trits)
def test_random_trits(self): in_trits = [randrange(-1,2) for _ in range(243)] in_trits[242] = 0 in_bytes = convertToBytes(in_trits) out_trits = convertToTrits(in_bytes) self.assertEqual(in_trits, out_trits)
def squeeze(self, trits: MutableSequence[int], offset: int = 0, length: Optional[int] = None) -> None: """ Squeeze trits from the sponge into a buffer. :param trits: Buffer that will hold the squeezed trits. IMPORTANT: If ``trits`` is too small, it will be extended! :param offset: Starting offset in ``trits``. :param length: Number of trits to squeeze from the sponge. If not specified, defaults to :py:data:`TRIT_HASH_LENGTH` (i.e., by default, we will try to squeeze exactly 1 hash). """ # Pad input if necessary, so that it can be divided evenly into # hashes. pad = ((len(trits) % TRIT_HASH_LENGTH) or TRIT_HASH_LENGTH) trits += [0] * (TRIT_HASH_LENGTH - pad) if length is None: # By default, we will try to squeeze one hash. # Note that this is different than ``absorb``. length = len(trits) or TRIT_HASH_LENGTH if length < 1: raise with_context( exc=ValueError('Invalid length passed to ``squeeze``.'), context={ 'trits': trits, 'offset': offset, 'length': length, }, ) while offset < length: unsigned_hash = self.k.digest() signed_hash = [conv.convert_sign(b) for b in unsigned_hash] trits_from_hash = conv.convertToTrits(signed_hash) trits_from_hash[TRIT_HASH_LENGTH - 1] = 0 stop = min(TRIT_HASH_LENGTH, length - offset) trits[offset:offset + stop] = trits_from_hash[0:stop] flipped_bytes = bytearray( conv.convert_sign(~b) for b in unsigned_hash) # Reset internal state before feeding back in. self.reset() self.k.update(flipped_bytes) offset += TRIT_HASH_LENGTH
def squeeze(self, trits, offset=0, length=None): # type: (MutableSequence[int], int, Optional[int]) -> None """ Squeeze trits from the sponge into a buffer. :param trits: Buffer that will hold the squeezed trits. IMPORTANT: If ``trits`` is too small, it will be extended! :param offset: Starting offset in ``trits``. :param length: Number of trits to squeeze from the sponge. If not specified, defaults to :py:data:`TRIT_HASH_LENGTH` (i.e., by default, we will try to squeeze exactly 1 hash). """ # Pad input if necessary, so that it can be divided evenly into # hashes. pad = ((len(trits) % TRIT_HASH_LENGTH) or TRIT_HASH_LENGTH) trits += [0] * (TRIT_HASH_LENGTH - pad) if length is None: # By default, we will try to squeeze one hash. # Note that this is different than ``absorb``. length = len(trits) or TRIT_HASH_LENGTH if length < 1: raise with_context( exc = ValueError('Invalid length passed to ``squeeze``.'), context = { 'trits': trits, 'offset': offset, 'length': length, }, ) while offset < length: unsigned_hash = self.k.digest() if PY2: unsigned_hash = map(ord, unsigned_hash) # type: ignore signed_hash = [conv.convert_sign(b) for b in unsigned_hash] trits_from_hash = conv.convertToTrits(signed_hash) trits_from_hash[TRIT_HASH_LENGTH - 1] = 0 stop = min(TRIT_HASH_LENGTH, length-offset) trits[offset:offset+stop] = trits_from_hash[0:stop] flipped_bytes = bytearray(conv.convert_sign(~b) for b in unsigned_hash) # Reset internal state before feeding back in self.reset() self.k.update(flipped_bytes) offset += TRIT_HASH_LENGTH