seed = "01 02 03"
real_key = "88 5C 12"
print "Observed seed: "+seed
#
# This is the "secret" found in debugger for PCM
#
#s1 = 0x08
#s2 = 0x30
#s3 = 0x61
#s4 = 0xa4
#s5 = 0xc5
#
# for SJB
#
s1 = 0x44
s2 = 0x49
s3 = 0x4F
s4 = 0x44
s5 = 0x45
seed_int = (int(seed[0:2],16)<<16) + (int(seed[3:5],16)<<8) + (int(seed[6:8],16))
#print "Seed: %x" % seed_int
or_ed_seed = ((seed_int & 0xFF0000) >> 16) | (seed_int & 0xFF00) | (s1 << 24) | (seed_int & 0xff) << 16
#print "or_ed_seed: %x\n" % or_ed_seed
mucked_value = 0xc541a9
for i in range(0,32):
a_bit = ((or_ed_seed >> i) & 1 ^ mucked_value & 1) << 23
v8 = a_bit | (mucked_value >> 1);
mask = (v8 & 0x800000) >> 23;
mucked_value = v8 & 0xEF6FD7 | ((((v8 & 0x100000) >> 20) ^ mask) << 20) | (((((mucked_value >> 1) & 0x8000) >> 15) ^ mask) << 15) | (((((mucked_value >> 1) & 0x1000) >> 12) ^ mask) << 12) | 32 * ((((mucked_value >> 1) & 0x20) >> 5) ^ mask) | 8 * ((((mucked_value >> 1) & 8) >> 3) ^ mask);
# print "mucked: %x" % (mucked_value)
for j in range(0,32):
v11 = ((((s5 << 24) | (s4 << 16) | s2 | (s3 << 8)) >> j) & 1 ^ mucked_value & 1) << 23;
v12 = v11 | (mucked_value >> 1);
mask = (v12 & 0x800000) >> 23;
mucked_value = v12 & 0xEF6FD7 | ((((v12 & 0x100000) >> 20) ^ mask) << 20) | (((((mucked_value >> 1) & 0x8000) >> 15) ^ mask) << 15) | (((((mucked_value >> 1) & 0x1000) >> 12) ^ mask) << 12) | 32 * ((((mucked_value >> 1) & 0x20) >> 5) ^ mask) | 8 * ((((mucked_value >> 1) & 8) >> 3) ^ mask);
key = ((mucked_value & 0xF0000) >> 16) | 16 * (mucked_value & 0xF) | ((((mucked_value & 0xF00000) >> 20) | ((mucked_value & 0xF000) >> 8)) << 8) | ((mucked_value & 0xFF0) >> 4 << 16);
print "Computed key: %x" % key
print "observed key: " + real_key
c2VlZCA9ICIwMSAwMiAwMyIKcmVhbF9rZXkgPSAiODggNUMgMTIiCgpwcmludCAiT2JzZXJ2ZWQgc2VlZDogIitzZWVkCiMKIyBUaGlzIGlzIHRoZSAic2VjcmV0IiBmb3VuZCBpbiBkZWJ1Z2dlciBmb3IgUENNCiMKI3MxID0gMHgwOAojczIgPSAweDMwCiNzMyA9IDB4NjEKI3M0ID0gMHhhNAojczUgPSAweGM1CgojCiMgZm9yIFNKQgojIApzMSA9IDB4NDQKczIgPSAweDQ5CnMzID0gMHg0RgpzNCA9IDB4NDQKczUgPSAweDQ1CgpzZWVkX2ludCA9IChpbnQoc2VlZFswOjJdLDE2KTw8MTYpICsgKGludChzZWVkWzM6NV0sMTYpPDw4KSArIChpbnQoc2VlZFs2OjhdLDE2KSkgCiNwcmludCAiU2VlZDogJXgiICUgc2VlZF9pbnQKCm9yX2VkX3NlZWQgPSAoKHNlZWRfaW50ICYgMHhGRjAwMDApID4+IDE2KSB8IChzZWVkX2ludCAmIDB4RkYwMCkgfCAoczEgPDwgMjQpIHwgKHNlZWRfaW50ICYgMHhmZikgPDwgMTYKI3ByaW50ICJvcl9lZF9zZWVkOiAleFxuIiAlIG9yX2VkX3NlZWQKCm11Y2tlZF92YWx1ZSA9IDB4YzU0MWE5Cgpmb3IgaSBpbiByYW5nZSgwLDMyKToKCWFfYml0ID0gKChvcl9lZF9zZWVkID4+IGkpICYgMSBeIG11Y2tlZF92YWx1ZSAmIDEpIDw8IDIzCgl2OCA9IGFfYml0IHwgKG11Y2tlZF92YWx1ZSA+PiAxKTsKCW1hc2sgPSAodjggJiAweDgwMDAwMCkgPj4gMjM7CgltdWNrZWRfdmFsdWUgPSB2OCAmIDB4RUY2RkQ3IHwgKCgoKHY4ICYgMHgxMDAwMDApID4+IDIwKSBeIG1hc2spIDw8IDIwKSB8ICAoKCgoKG11Y2tlZF92YWx1ZSA+PiAxKSAmIDB4ODAwMCkgPj4gMTUpIF4gbWFzaykgPDwgMTUpIHwgICgoKCgobXVja2VkX3ZhbHVlID4+IDEpICYgMHgxMDAwKSA+PiAxMikgXiBtYXNrKSA8PCAxMikgfCAgMzIgKiAoKCgobXVja2VkX3ZhbHVlID4+IDEpICYgMHgyMCkgPj4gNSkgXiBtYXNrKSB8ICA4ICogKCgoKG11Y2tlZF92YWx1ZSA+PiAxKSAmIDgpID4+IDMpIF4gbWFzayk7CiMJcHJpbnQgIm11Y2tlZDogJXgiICUgKG11Y2tlZF92YWx1ZSkKCmZvciBqIGluIHJhbmdlKDAsMzIpOgoJdjExID0gKCgoKHM1IDw8IDI0KSB8IChzNCA8PCAxNikgfCBzMiB8IChzMyA8PCA4KSkgPj4gaikgJiAxIF4gbXVja2VkX3ZhbHVlICYgMSkgPDwgMjM7Cgl2MTIgPSB2MTEgfCAobXVja2VkX3ZhbHVlID4+IDEpOwoJbWFzayA9ICh2MTIgJiAweDgwMDAwMCkgPj4gMjM7CgltdWNrZWRfdmFsdWUgPQl2MTIgJiAweEVGNkZENyB8ICgoKCh2MTIgJiAweDEwMDAwMCkgPj4gMjApIF4gbWFzaykgPDwgMjApIHwgKCgoKChtdWNrZWRfdmFsdWUgPj4gMSkgJiAweDgwMDApID4+IDE1KSBeIG1hc2spIDw8IDE1KSB8ICgoKCgobXVja2VkX3ZhbHVlID4+IDEpICYgMHgxMDAwKSA+PiAxMikgXiBtYXNrKSA8PCAxMikgfCAzMiAqICgoKChtdWNrZWRfdmFsdWUgPj4gMSkgJiAweDIwKSA+PiA1KSBeIG1hc2spIHwgOCAqICgoKChtdWNrZWRfdmFsdWUgPj4gMSkgJiA4KSA+PiAzKSBeIG1hc2spOwoKa2V5ID0JKChtdWNrZWRfdmFsdWUgJiAweEYwMDAwKSA+PiAxNikgfCAxNiAqIChtdWNrZWRfdmFsdWUgJiAweEYpIHwgKCgoKG11Y2tlZF92YWx1ZSAmIDB4RjAwMDAwKSA+PiAyMCkgfCAoKG11Y2tlZF92YWx1ZSAmIDB4RjAwMCkgPj4gOCkpIDw8IDgpIHwgKChtdWNrZWRfdmFsdWUgJiAweEZGMCkgPj4gNCA8PCAxNik7CgpwcmludCAiQ29tcHV0ZWQga2V5OiAleCIgJSBrZXkKcHJpbnQgIm9ic2VydmVkIGtleTogIiArIHJlYWxfa2V5