ctrlwords.py
1 #!/usr/bin/env python 2 3 """ 4 for(int round = 0; round < 8; round++) { 5 6 // update control variable 7 for(int i=(ctrlvar_iter_ctrl & 0x80)?5:2;i!=0; i--) { // 1e35, 1e3b, 1e59 8 // ctrlvar_iter_ctrl has this binary value: 10011100 so 4x2 9 // and 4x5 iterations 10 cf = BITv(ctrlvar[3],4); // 1e44 11 TRACE(0x1e46); 12 for(int j=0; j<7; j++) { 13 ctrlvar[j] = rrc(ctrlvar[j], cf, &cf); // 1e4a 14 TRACE(0x1e4e); 15 } // 1e4e 16 TRACE(0x1e57); 17 ctrlvar[3] = assign_bit(ctrlvar[3],cf,3); // 1e57 18 } 19 // rotate ctrlvar_iter_ctrl left 20 ctrlvar_iter_ctrl = ctrlvar_iter_ctrl << 1 | ctrlvar_iter_ctrl >> 7; // 1e5c .. 1e5f 21 """ 22 23 def split_by_n(obj, n): 24 # src https://stackoverflow.com/questions/9475241/split-string-every-nth-character 25 return [obj[i:i+n] for i in range(0, len(obj), n)] 26 27 allchars=list(chr(x) for x in range(ord('a'),ord('z')+1)) 28 allchars.extend(list(chr(x) for x in range(ord('A'),ord('Z')+1))) 29 allchars.extend(list(chr(x) for x in range(ord('0'),ord('9')+1))) 30 allchars.extend(list(chr(x) for x in range(0x1d400,0x1d467+1))) 31 32 ctrlvar = split_by_n(allchars[:7*8], 8) 33 34 print(f"ctrlvar {list(''.join(x) for x in ctrlvar)}") 35 ctrlvar_iter_ctrl = 0x9c 36 iters =[0x9c] 37 for round in range(8): 38 for i in range(5 if ctrlvar_iter_ctrl & 0x80 else 2): 39 cf = ctrlvar[3][3] # 4 originally 40 for j in range(7): 41 tbit = cf 42 cf = ctrlvar[j][7] 43 ctrlvar[j] = [tbit] + ctrlvar[j][:-1] 44 ctrlvar[3][4] = cf # 4 was originally 3 but bits are reversed 45 ctrlvar_iter_ctrl = ((ctrlvar_iter_ctrl << 1) | (ctrlvar_iter_ctrl >> 7)) & 0xff 46 iters.append(ctrlvar_iter_ctrl) 47 print(f"ctrlvar {list(''.join(x) for x in ctrlvar)}") 48 49 for i in iters: 50 print(f"ctlrvar_iter_ctrl {i:02x} ({i:08b})") 51