/ analysis / ctrlwords.py
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