in nightMARE/src/nightmare/malware/blister/crypto.py [0:0]
def set_key(self, key):
# generate four subkeys
key0 = unpack("<I", key[0:4])[0]
key1 = unpack("<I", key[4:8])[0]
key2 = unpack("<I", key[8:12])[0]
key3 = unpack("<I", key[12:16])[0]
s = self.ctx.m
# generate initial state variables
s.x[0] = key0
s.x[2] = key1
s.x[4] = key2
s.x[6] = key3
s.x[1] = ((key3 << 16) & 0xFFFFFFFF) | ((key2 >> 16) & 0xFFFF)
s.x[3] = ((key0 << 16) & 0xFFFFFFFF) | ((key3 >> 16) & 0xFFFF)
s.x[5] = ((key1 << 16) & 0xFFFFFFFF) | ((key0 >> 16) & 0xFFFF)
s.x[7] = ((key2 << 16) & 0xFFFFFFFF) | ((key1 >> 16) & 0xFFFF)
# generate initial counter values
s.c[0] = bits.rol32(key2, 16)
s.c[2] = bits.rol32(key3, 16)
s.c[4] = bits.rol32(key0, 16)
s.c[6] = bits.rol32(key1, 16)
s.c[1] = (key0 & 0xFFFF0000) | (key1 & 0xFFFF)
s.c[3] = (key1 & 0xFFFF0000) | (key2 & 0xFFFF)
s.c[5] = (key2 & 0xFFFF0000) | (key3 & 0xFFFF)
s.c[7] = (key3 & 0xFFFF0000) | (key0 & 0xFFFF)
s.carry = 0
# Iterate system four times
for i in range(4):
self.next_state(self.ctx.m)
for i in range(8):
# modify the counters
self.ctx.m.c[i] ^= self.ctx.m.x[(i + 4) & 7]
# Copy master instance to work instance
self.ctx.w = self.copy_state(self.ctx.m)