def encrypt_block(self, plaintext): """Return 8-word ciphertext, encrypted from plaintext. `plaintext` must be a list of 8 64-bit words. """ key = self.key tweak = self.tweak state = words(list(imap(add64, plaintext, key[:8]))) state[5] = add64(state[5], tweak[0]) state[6] = add64(state[6], tweak[1]) for r, s in izip(xrange(1, 19), cycle((0, 16))): for i in xrange(16): m, n = PERM[i] state[m] = add64(state[m], state[n]) state[n] = RotL_64(state[n], ROT[i + s]) state[n] = state[n] ^ state[m] for y in xrange(8): state[y] = add64(state[y], key[(r + y) % 9]) state[5] = add64(state[5], tweak[r % 3]) state[6] = add64(state[6], tweak[(r + 1) % 3]) state[7] = add64(state[7], r) return state
def encrypt_block(self, plaintext): """Return 8-word ciphertext, encrypted from plaintext. `plaintext` must be a list of 8 64-bit words. """ key = self.key tweak = self.tweak state = words(list(imap(add64, plaintext, key[:8]))) state[5] = add64(state[5], tweak[0]) state[6] = add64(state[6], tweak[1]) for r,s in izip(xrange(1,19),cycle((0,16))): for i in xrange(16): m,n = PERM[i] state[m] = add64(state[m], state[n]) state[n] = RotL_64(state[n], ROT[i+s]) state[n] = state[n] ^ state[m] for y in xrange(8): state[y] = add64(state[y], key[(r+y) % 9]) state[5] = add64(state[5], tweak[r % 3]) state[6] = add64(state[6], tweak[(r+1) % 3]) state[7] = add64(state[7], r) return state
def prepare_tweak(self): """Compute tweak.""" final = self.tweak[0] ^ self.tweak[1] try: self.tweak[2] = final except IndexError: # self.tweak.append(final) self.tweak = words(list(self.tweak) + [final])
def prepare_key(self): """Compute key.""" final = reduce(xor, self.key[:8]) ^ SKEIN_KS_PARITY try: self.key[8] = final except IndexError: # self.key.append(final) self.key = words(list(self.key) + [final])
def prepare_tweak(self): """Compute tweak.""" final = self.tweak[0] ^ self.tweak[1] try: self.tweak[2] = final except IndexError: #self.tweak.append(final) self.tweak = words(list(self.tweak) + [final])
def prepare_key(self): """Compute key.""" final = reduce(xor, self.key[:8]) ^ SKEIN_KS_PARITY try: self.key[8] = final except IndexError: #self.key.append(final) self.key = words(list(self.key) + [final])
def __init__(self, key=None, tweak=None): """Set key and tweak. The key and the tweak will be lists of 8 64-bit words converted from `key` and `tweak` bytestrings, or all zeroes if not specified. """ if key: self.key = bytes2words(key) self.prepare_key() else: self.key = words(zero_words[:] + [0]) if tweak: self.tweak = bytes2words(tweak, 2) self.prepare_tweak() else: self.tweak = zero_words[:3]