def set_key()

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)