Advertisement
Guest User

aswreg_v2core.py

a guest
Apr 18th, 2020
2,407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 21.51 KB | None | 0 0
  1. from bitstring import BitArray, BitStream
  2. from collections import deque
  3. from datetime import datetime, timedelta
  4.  
  5.  
  6.  
  7. ### SUPPORT FUNCTIONS
  8. # binary conversion support
  9. def bits_to_int(b): # 2's comp conversion from bit
  10.   if b.bin[0] == '1':
  11.     b.invert()
  12.     return (int(b.bin,2) + 1) * -1
  13.   else:
  14.     return int(b.bin,2)
  15.  
  16. def int_to_bits(i): # 2's comp conversion to bit
  17.   if i < 0:
  18.     b = BitArray('0b' + format((i * -1) - 1,'032b'))
  19.     b.invert()
  20.     return b
  21.   else:
  22.     return BitArray('0b' + format(i,'032b'))
  23.  
  24. def char_to_bits(c):
  25.   return BitArray('0b' + format(ord(c),'032b'))
  26.  
  27. # 2's complement addition
  28. def addi(a,b):
  29.   return int_to_bits(bits_to_int(a) + b)
  30.  
  31. # rotation and masking operations
  32. def rotate(bits,num):
  33.   b = deque(bits)
  34.   b.rotate(num)
  35.   return BitArray(b)
  36.  
  37. def rotate_mask_and(rb,num_shift,num_mask_start,num_mask_end):
  38.   mask = BitArray(32)
  39.   mask[num_mask_start:num_mask_end+1] = [True]*(num_mask_end+1-num_mask_start)
  40.   return rotate(rb,num_shift) & mask
  41.  
  42. def rotate_mask_insert(ra,rb,num_shift,num_mask_start,num_mask_end):
  43.   mask = BitArray(32)
  44.   mask[num_mask_start:num_mask_end+1] = [True]*(num_mask_end+1-num_mask_start)
  45.   return (ra & ~mask) | (rotate(rb,num_shift) & mask)
  46.  
  47.  
  48.  
  49. ### HASH1
  50. def get_hash1(name,number,game):
  51.   key_lower = BitArray(32) # 4-byte key to process on
  52.   key_upper = BitArray(32) # holds overflow values
  53.  
  54.   name = name.upper().replace(' ','')
  55.  
  56.   (key_lower,key_upper) = get_hash1_game(game,number,key_lower,key_upper)
  57.   (key_lower,key_upper) = get_hash1_name(name,number,key_lower,key_upper)
  58.  
  59.   key_upper[0:4] = BitArray(4) # zero out top nibble
  60.  
  61.   return key_upper + key_lower
  62.  
  63. def get_hash1_game(string,number,code,overflow):
  64.   r5 = number
  65.   r0 = code
  66.   r9 = overflow
  67.   for i in range(0,len(string)):
  68.  
  69.     r8 = BitArray('0b' + format(ord(string[i]),'032b'))
  70.  
  71.     r6 = i + 7
  72.     r7 = r0 << 4
  73.     r10 = r7
  74.     r10[28:32] ^= r9[0:4]
  75.     r9 <<= 4
  76.     r9[28:32] ^= r0[0:4]
  77.     r7 = BitArray('0b' + format(r5 * r6,'032b'))
  78.     r0 = r8 >> 31
  79.     r10 ^= r8
  80.     r6 = r9 ^ r0
  81.     r0 = r10 << 1
  82.     r8 = r6 << 1
  83.     r0[31:32] ^= r6[0:1]
  84.     r8[31:32] ^= r10[0:1]
  85.     r0 ^= r7
  86.     r9 = r8
  87.  
  88.   code = r0
  89.   overflow = r9
  90.   return (code,overflow)
  91.  
  92. def get_hash1_name(string,number,code,overflow):
  93.   r5 = number
  94.   r0 = code
  95.   r9 = overflow
  96.   for i in range(0,len(string)):
  97.  
  98.     r6 = BitArray('0b' + format(ord(string[i]),'032b'))
  99.  
  100.     r3 = i + 13
  101.     r3 *= r5
  102.     r10 = r0 << 3
  103.     r7 = r9 << 3
  104.     r10[29:32] ^= r9[0:3]
  105.     r7[29:32] ^= r0[0:3]
  106.     r0 = r6 >> 31
  107.     r10 ^= r6
  108.     r8 = r7 ^ r0
  109.     r6 = BitArray('0b' + format(r3 * 3,'032b'))
  110.     r0 = r10 << 1
  111.     r7 = r8 << 1
  112.     r0[31:32] ^= r8[0:1]
  113.     r7[31:32] ^= r10[0:1]
  114.     r0 ^= r6
  115.     r9 = r7
  116.      
  117.   code = r0
  118.   overflow = r9
  119.   return (code,overflow)
  120.  
  121.  
  122.  
  123. ### HASH2
  124. def get_hash2(name,number,game):
  125.   hash2 = BitArray(64)
  126.  
  127.   f1 = make_hash2_f1(name,number,game)
  128.   f2 = make_hash2_f2(name,number,game)
  129.  
  130.   hash2 = set_hash2_f1(hash2,f1)
  131.   hash2 = set_hash2_f2(hash2,f2)
  132.   hash2 = clear_hash2_unused(hash2)
  133.   hash2 = set_hash2_time(hash2,get_current_timestamp())
  134.   hash2 = make_hash2_valid(hash2)
  135.  
  136.   return hash2
  137.  
  138.  
  139. def make_hash2_valid(hash2):
  140.   (is_valid, expected, actual) = check_hash2_valid(hash2)
  141.   if not is_valid:
  142.     hash2[61:] = expected
  143.   return hash2
  144.  
  145. def check_hash2_valid(hash2):
  146.   region = hash2[5:61]
  147.   region = BitArray('0b0') + region # pad front with 0 for divisible by 3
  148.  
  149.   total = 0
  150.   for i in range(0,19): # order doesn't matter since just adding
  151.     total += int(region[i*3:i*3+3].bin,2)
  152.  
  153.   expected = BitArray('0b' + format(total,'032b'))[29:]
  154.   actual = hash2[61:]
  155.  
  156.   return (expected == actual, expected, actual)
  157.  
  158.  
  159. def get_current_timestamp():
  160.   return datetime_to_timestamp(datetime.utcnow())
  161.  
  162. def datetime_to_timestamp(date):
  163.   # need number of fortnights passed since 2000/12/25 (Eastern Time)
  164.   basedate = datetime(2000, 12, 25, 4, 0) # UTC time is 4 hrs ahead Eastern
  165.  
  166.   weeks = (date - basedate).days / 7
  167.   fortnights = weeks / 2
  168.  
  169.   return BitArray('0b' + format(fortnights % 256,'08b'))
  170.  
  171. def timestamp_to_datetime(stamp,decade=0):
  172.   # timestamps hold 256 fortnights, about 512 weeks or 10 years
  173.   # by default, assume first decade but can manually advance if needed
  174.   basedate = datetime(2000, 12, 25, 4, 0) # Christmas Day 2000 in New York, UTC time
  175.  
  176.   fortnights = int(stamp.bin,2) + (256 * decade)
  177.   weeks = fortnights * 2
  178.   days = weeks * 7
  179.   date = basedate + timedelta(days=days)
  180.  
  181.   return "~ " + date.strftime("%B %d, %Y")
  182.  
  183. def set_hash2_time(hash2,timestamp):
  184.   hash2[9] = timestamp[7]
  185.   hash2[14] = timestamp[6]
  186.   hash2[23] = timestamp[5]
  187.   hash2[28] = timestamp[4]
  188.   hash2[37] = timestamp[3]
  189.   hash2[42] = timestamp[2]
  190.   hash2[51] = timestamp[1]
  191.   hash2[56] = timestamp[0]
  192.   return hash2
  193.  
  194. def get_hash2_time(hash2):
  195.   timestamp = BitArray(8)
  196.   timestamp[7] = hash2[9]
  197.   timestamp[6] = hash2[14]
  198.   timestamp[5] = hash2[23]
  199.   timestamp[4] = hash2[28]
  200.   timestamp[3] = hash2[37]
  201.   timestamp[2] = hash2[42]
  202.   timestamp[1] = hash2[51]
  203.   timestamp[0] = hash2[56]
  204.   return timestamp
  205.  
  206.  
  207. def clear_hash2_unused(hash2):
  208.   empty = BitArray(64)
  209.   hash2[0:5] = empty[0:5] # top 5 bits can all be 0
  210.   hash2[24:28] = empty[24:28]
  211.   hash2[10:14] = empty[11:15]
  212.   hash2[52:56] = empty[52:56]
  213.   hash2[38:42] = empty[38:42]
  214.   return hash2
  215.  
  216. # can be any multiple of the base factors, the functions included just return 1x
  217. def set_hash2_f1(hash2,f1):
  218.   hash2[5:9] = f1[0:4]
  219.   hash2[47:51] = f1[4:8]
  220.   hash2[33:37] = f1[8:12]
  221.   hash2[19:23] = f1[12:16]
  222.   return hash2
  223.  
  224. def set_hash2_f2(hash2,f2):
  225.   hash2[43:47] = f2[0:4]
  226.   hash2[29:33] = f2[4:8]
  227.   hash2[15:19] = f2[8:12]
  228.   hash2[57:61] = f2[12:16]
  229.   return hash2
  230.  
  231. def get_hash2_f1(hash2):
  232.   return hash2[5:9] + hash2[47:51] + hash2[33:37] + hash2[19:23]
  233.  
  234. def get_hash2_f2(hash2):
  235.   return hash2[43:47] + hash2[29:33] + hash2[15:19] + hash2[57:61]
  236.  
  237. # neither f3 nor topbit have separate validation, can just be 0
  238. def get_hash2_f3(hash2):
  239.   return hash2[24:28] + hash2[10:14] + hash2[52:56] + hash2[38:42]
  240.  
  241. def get_hash2_topbit(hash2):
  242.   return hash2[4]
  243.  
  244.  
  245. # main functions for the basekey factors
  246. # these functions for EV Nova only
  247. def make_hash2_f1(name,number,game):
  248.   name = name.upper().replace(' ','')
  249.   ln = len(name)
  250.  
  251.   r31 = int_to_bits(number)
  252.  
  253.   r3 = BitArray(32)
  254.   r3 = addi(r3,-100)
  255.   r0 = char_to_bits(name[12%ln])
  256.   r25 = char_to_bits(game[0]) # E
  257.   r3 = r3 ^ r0
  258.   r0 = char_to_bits(name[15%ln])
  259.   r3 = addi(r3,-61)
  260.   r4 = rotate_mask_and(r3,0,24,31)
  261.   r3 = r4 >> 6
  262.   r3 = r3 ^ rotate_mask_and(r4,-2,22,29)
  263.   r4 = rotate_mask_and(r3,0,24,31)
  264.   r4 = r4 ^ r25
  265.   r4 = r4 ^ r0
  266.   r3 = rotate_mask_and(r4,-29,27,31)
  267.   r3 = r3 ^ rotate_mask_and(r4,-5,19,26)
  268.   r0 = rotate_mask_and(r3,-26,30,31)
  269.   r0 = r0 ^ rotate_mask_and(r3,-2,22,29)
  270.   r3 = rotate_mask_and(r0,0,24,31)
  271.   r3 = addi(r3,82)
  272.   r0 = rotate_mask_and(r3,-7,17,24)
  273.   r0 = rotate_mask_insert(r0,r3,-31,25,31)
  274.   r7 = rotate_mask_and(r0,0,24,31)
  275.   r7 = addi(r7,99)
  276.   r0 = rotate_mask_and(r7,0,24,31)
  277.  
  278.   if int(r0.bin,2) > int("71",16):
  279.     r0 = rotate_mask_and(r31,0,24,31)
  280.     r0 = r7 ^ r0
  281.     r7 = rotate_mask_and(r0,0,24,31)
  282.  
  283.   r3 = char_to_bits(name[3%ln])
  284.   r0 = rotate_mask_and(r31,0,24,31)
  285.   r5 = char_to_bits(name[6%ln])
  286.   r7 = r7 ^ r3
  287.   r4 = char_to_bits(name[5%ln])
  288.   r6 = rotate_mask_and(r7,-1,23,30)
  289.   r3 = char_to_bits(game[3]) # N
  290.   r6 = rotate_mask_insert(r6,r7,-25,31,31)
  291.   r28 = char_to_bits(game[0]) # E
  292.   r6 = rotate_mask_and(r6,0,24,31)
  293.   r6 = r6 ^ r5
  294.   r6 = r6 ^ r4
  295.   r4 = rotate_mask_and(r6,0,24,31)
  296.   r18 = addi(r4,-42)
  297.   r18 = r18 ^ r3
  298.   r18 = r18 ^ r0
  299.   r18 = addi(r18,-87)
  300.   r18 = r18 ^ r28
  301.  
  302.   # proc235 returns value in r3, unused    
  303.  
  304.   r3 = addi(r18,89)
  305.   r0 = rotate_mask_and(r3,0,24,31)
  306.   r0 = r0 >> 7
  307.   r0 = r0 ^ rotate_mask_and(r3,-1,23,30)
  308.   r3 = rotate_mask_and(r0,0,24,31)
  309.   r3 = addi(r3,int("-73",16))
  310.   r0 = rotate_mask_and(r3,-29,27,31)
  311.   r0 = r0 ^ rotate_mask_and(r3,-5,19,26)
  312.   r3 = rotate_mask_and(r0,-27,29,31)
  313.   r3 = r3 ^ rotate_mask_and(r0,-3,21,28)
  314.   r0 = rotate_mask_and(r3,-5,19,26)
  315.   r0 = rotate_mask_insert(r0,r3,-29,27,31)
  316.   r18 = rotate_mask_and(r0,0,24,31)
  317.   r0 = rotate_mask_and(r31,0,24,31)
  318.   r18 = r18 ^ r0
  319.   r18 = addi(r18,int("AC",16))
  320.   r0 = rotate_mask_and(r18,0,24,31)
  321.  
  322.   if int(r0.bin,2) > int("90",16):
  323.     r0 = char_to_bits(name[4%ln])
  324.     r0 = r18 ^ r0
  325.     r18 = rotate_mask_and(r0,0,24,31)
  326.  
  327.   # proc235 returns value in r3, unused    
  328.  
  329.   r7 = addi(r18,-64)
  330.   r4 = char_to_bits(game[6]) # a
  331.   r6 = rotate_mask_and(r7,-26,30,31)
  332.   r5 = char_to_bits(name[9%ln])
  333.   r6 = r6 ^ rotate_mask_and(r7,-2,22,29)
  334.   r3 = char_to_bits(name[2%ln])
  335.   r6 = rotate_mask_and(r6,0,24,31)
  336.   r0 = char_to_bits(name[12%ln])
  337.   r6 = r6 ^ r4
  338.   r6 = r6 ^ r5
  339.   r6 = r6 ^ r3
  340.   r6 = r6 ^ r28
  341.   r4 = addi(r6,-39)
  342.   r3 = rotate_mask_and(r4,-31,25,31)
  343.   r3 = r3 ^ rotate_mask_and(r4,-7,17,24)
  344.   r3 = rotate_mask_and(r3,0,24,31)
  345.   r3 = r3 ^ r5
  346.   r3 = r3 ^ r0
  347.   r0 = rotate_mask_and(r31,0,24,31)
  348.   r3 = r3 ^ r0
  349.   r0 = rotate_mask_and(r3,-7,17,24)
  350.   r0 = rotate_mask_insert(r0,r3,-31,25,31)
  351.   r18 = rotate_mask_and(r0,0,24,31)
  352.   r3 = r18
  353.  
  354.   # proc20 returns value in r3, unused
  355.  
  356.   r0 = rotate_mask_and(r31,0,24,31)
  357.   r18 = r18 ^ r0
  358.   r0 = addi(r18,int("-69",16))
  359.   r3 = rotate_mask_and(r0,-25,31,31)
  360.   r3 = r3 ^ rotate_mask_and(r0,-1,23,30)
  361.   r0 = rotate_mask_and(r3,-7,17,24)
  362.   r0 = rotate_mask_insert(r0,r3,-31,25,31)
  363.   r19 = rotate_mask_and(r0,0,24,31)
  364.  
  365.   # proc235 returns value in r3, unused    
  366.  
  367.   r3 = r19
  368.  
  369.   # proc20 returns value in r3, unused
  370.  
  371.   r26 = char_to_bits(game[5]) # v
  372.   r19 = addi(r19,int("66",16))
  373.   r19 = r19 ^ r26
  374.   r19 = addi(r19,int("-81",16))
  375.   r0 = rotate_mask_and(r19,0,24,31)
  376.  
  377.   if int(r0.bin,2) > 10:
  378.     r0 = addi(r19,-8)
  379.     r19 = rotate_mask_and(r0,0,24,31)
  380.  
  381.   r0 = rotate_mask_and(r19,0,24,31)
  382.   r7 = char_to_bits(game[3]) # N
  383.   r3 = r0 >> 4
  384.   r5 = char_to_bits(name[14%ln])
  385.   r3 = r3 ^ rotate_mask_and(r19,-4,20,27)
  386.   r6 = char_to_bits(game[4]) # o
  387.   r9 = rotate_mask_and(r3,0,24,31)
  388.   r0 = char_to_bits(name[12%ln])
  389.   r8 = r9 >> 1
  390.   r4 = char_to_bits(game[1]) # V
  391.   r8 = r8 ^ rotate_mask_and(r9,-7,17,24)
  392.   r3 = char_to_bits(name[4%ln])
  393.   r9 = rotate_mask_and(r8,0,24,31)
  394.   r8 = r9 >> 5
  395.   r8 = r8 ^ rotate_mask_and(r9,-3,21,28)
  396.   r8 = rotate_mask_and(r8,0,24,31)
  397.   r8 = r8 ^ r7
  398.   r8 = rotate_mask_and(r8,0,24,31)
  399.   r7 = r8 >> 4
  400.   r7 = r7 ^ rotate_mask_and(r8,-4,20,27)
  401.   r8 = rotate_mask_and(r7,0,24,31)
  402.   r7 = r8 >> 7
  403.   r7 = r7 ^ rotate_mask_and(r8,-1,23,30)
  404.   r8 = rotate_mask_and(r7,0,24,31)
  405.   r8 = r8 ^ r26
  406.   r7 = rotate_mask_and(r8,0,24,31)
  407.   r7 = r7 >> 4
  408.   r7 = r7 ^ rotate_mask_and(r8,-4,20,27)
  409.   r7 = rotate_mask_and(r7,0,24,31)
  410.   r7 = addi(r7,62)
  411.   r7 = r7 ^ r5
  412.   r7 = r7 ^ r28
  413.   r5 = rotate_mask_and(r31,0,24,31)
  414.   r7 = r7 ^ r5
  415.   r7 = r7 ^ r6
  416.   r6 = rotate_mask_and(r7,0,24,31)
  417.   r6 = r6 >> 7
  418.   r6 = r6 ^ rotate_mask_and(r7,-1,23,30)
  419.   r7 = rotate_mask_and(r6,0,24,31)
  420.   r7 = addi(r7,-6)
  421.   r7 = r7 ^ r25
  422.   r6 = rotate_mask_and(r7,0,24,31)
  423.   r6 = r6 >> 4
  424.   r6 = r6 ^ rotate_mask_and(r7,-4,20,27)
  425.   r7 = rotate_mask_and(r6,0,24,31)
  426.   r6 = r7 >> 5
  427.   r6 = r6 ^ rotate_mask_and(r7,-3,21,28)
  428.   r7 = rotate_mask_and(r6,0,24,31)
  429.   r6 = r7 >> 3
  430.   r6 = r6 ^ rotate_mask_and(r7,-5,19,26)
  431.   r7 = rotate_mask_and(r6,-31,25,31)
  432.   r7 = r7 ^ rotate_mask_and(r6,-7,17,24)
  433.   r6 = rotate_mask_and(r7,-26,30,31)
  434.   r6 = r6 ^ rotate_mask_and(r7,-2,22,29)
  435.   r7 = rotate_mask_and(r6,0,24,31)
  436.   r7 = addi(r7,-80)
  437.   r7 = r7 ^ r0
  438.   r6 = rotate_mask_and(r7,-2,22,29)
  439.   r6 = rotate_mask_insert(r6,r7,-26,30,31)
  440.   r6 = rotate_mask_and(r6,0,24,31)
  441.   r6 = addi(r6,int("BC",16))
  442.   r6 = r6 ^ r4
  443.   r6 = addi(r6,int("-75",16))
  444.   r6 = r6 ^ r3
  445.   r6 = r6 ^ r0
  446.   r0 = char_to_bits(name[1%ln])
  447.   r3 = rotate_mask_and(r6,-8,16,23)
  448.   r3 = r3 ^ rotate_mask_and(r6,-0,24,31)
  449.   r3 = rotate_mask_and(r3,0,24,31)
  450.   r3 = r3 ^ r0
  451.   r3 = r3 ^ r5
  452.   r0 = rotate_mask_and(r3,0,24,31)
  453.   r0 = r0 >> 1
  454.   r0 = r0 ^ rotate_mask_and(r3,-7,17,24)
  455.   r3 = rotate_mask_and(r0,0,24,31)
  456.   r0 = rotate_mask_and(r0,-27,29,31)
  457.   r0 = r0 ^ rotate_mask_and(r3,-3,21,28)
  458.   r3 = rotate_mask_and(r0,0,24,31)
  459.   r3 = addi(r3,int("69",16))
  460.   r0 = rotate_mask_and(r3,-30,26,31)
  461.   r0 = r0 ^ rotate_mask_and(r3,-6,18,25)
  462.   r3 = rotate_mask_and(r0,-8,16,23)
  463.   r3 = r3 ^ rotate_mask_and(r0,-0,24,31)
  464.   r0 = rotate_mask_and(r3,-3,21,28)
  465.   r0 = rotate_mask_insert(r0,r3,-27,29,31)
  466.   r25 = rotate_mask_and(r0,0,24,31)
  467.  
  468.   # proc1182 returns current timnestamp in r3    
  469.   # r0 = rotate_mask_and(r3,0,24,31)
  470.   # r19 = rotate_mask_and(r25,-0,29,30)
  471.   # r3 = r25 ^ r0
  472.   # overwritten shortly, so unused
  473.    
  474.   r0 = rotate_mask_and(r19,0,24,31)
  475.   r19 = addi(r19,-1)
  476.   # proc189 call is bypassed as long as r19 minus 1 is not equal to r19[24:]
  477.  
  478.   r3 = char_to_bits(game[1]) # V
  479.   r0 = char_to_bits(name[12%ln])
  480.   r25 = r25 ^ r3
  481.   r3 = char_to_bits(game[2]) # " "
  482.   r25 = r25 ^ r0
  483.   r0 = char_to_bits(name[1%ln])
  484.   r4 = rotate_mask_and(r25,-6,18,25)
  485.   r4 = rotate_mask_insert(r4,r25,-30,26,31)
  486.   r5 = rotate_mask_and(r4,0,24,31)
  487.   r5 = r5 ^ r3
  488.   r5 = r5 ^ r0
  489.   r0 = rotate_mask_and(r5,0,24,31)
  490.  
  491.   if int(r0.bin,2) > int("DB",16):
  492.     r0 = r5 ^ r28
  493.     r5 = rotate_mask_and(r0,0,24,31)
  494.  
  495.   r0 = char_to_bits(name[6%ln])
  496.   r5 = r5 ^ r0
  497.   r0 = rotate_mask_and(r5,0,24,31)
  498.  
  499.   if int(r0.bin,2) > int("A2",16):
  500.     r5 = r0
  501.  
  502.   r4 = char_to_bits(name[13%ln])
  503.   r5 = addi(r5,int("7B",16))
  504.   r3 = rotate_mask_and(r31,0,24,31)
  505.   r0 = char_to_bits(name[5%ln])
  506.   r5 = r5 ^ r4
  507.   r5 = r5 ^ r3
  508.   r4 = rotate_mask_and(r5,-25,31,31)
  509.   r4 = r4 ^ rotate_mask_and(r5,-1,23,30)
  510.   r3 = rotate_mask_and(r4,-2,22,29)
  511.   r3 = rotate_mask_insert(r3,r4,-26,30,31)
  512.   r5 = rotate_mask_and(r3,0,24,31)
  513.   r5 = r5 ^ r0
  514.   r0 = rotate_mask_and(r5,0,24,31)
  515.  
  516.   return r0[16:]
  517.  
  518.  
  519. def make_hash2_f2(name,number,game):
  520.   name = name.upper().replace(' ','')
  521.   ln = len(name)
  522.  
  523.   r31 = BitArray('0b'+format(number,'032b'))
  524.  
  525.   r19 = BitArray(32)
  526.  
  527.   r3 = rotate_mask_and(r31,0,24,31)
  528.   r0 = char_to_bits(name[5%ln])
  529.   r19 = r19 ^ r3
  530.   r19 = addi(r19,50)
  531.   r19 = r19 ^ r3
  532.   r3 = rotate_mask_and(r19,0,24,31)
  533.  
  534.   if int(r3.bin,2) < int(r0.bin,2):
  535.     r0 = addi(r19,90)
  536.     r19 = rotate_mask_and(r0,0,24,31)
  537.  
  538.   r4 = char_to_bits(game[5]) # v
  539.   r3 = rotate_mask_and(r31,0,24,31)
  540.   r0 = char_to_bits(name[3%ln])
  541.   r19 = r19 ^ r4
  542.   r19 = addi(r19,int("6A",16))
  543.   r19 = r19 ^ r3
  544.   r19 = r19 ^ r0
  545.  
  546.   # proc235 returns value in r3, unused  
  547.  
  548.   r0 = char_to_bits(name[14%ln])
  549.   r28 = char_to_bits(game[2]) # " "
  550.   r19 = r19 ^ r0
  551.   r0 = rotate_mask_and(r19,-28,28,31)
  552.   r0 = r0 ^ rotate_mask_and(r19,-4,20,27)
  553.   r3 = rotate_mask_and(r0,0,24,31)
  554.   r3 = r3 ^ r28
  555.   r0 = addi(r3,-28)
  556.   r3 = rotate_mask_and(r0,-8,16,23)
  557.   r3 = r3 ^ rotate_mask_and(r0,-0,24,31)
  558.   r0 = rotate_mask_and(r3,-3,21,28)
  559.   r0 = rotate_mask_insert(r0,r3,-27,29,31)
  560.   r3 = rotate_mask_and(r0,0,24,31)
  561.   r3 = addi(r3,2)
  562.   r0 = rotate_mask_and(r3,0,24,31)
  563.  
  564.   if int(r0.bin,2) > int("CC",16):
  565.     r0 = rotate_mask_and(r3,-7,17,24)
  566.     r0 = rotate_mask_insert(r0,r3,-31,25,31)
  567.     r3 = rotate_mask_and(r0,0,24,31)
  568.  
  569.   r0 = rotate_mask_and(r3,-28,28,31)
  570.   r0 = r0 ^ rotate_mask_and(r3,-4,20,27)
  571.   r3 = rotate_mask_and(r0,0,24,31)
  572.   r0 = addi(r3,int("-7C",16))
  573.   r3 = rotate_mask_and(r0,-26,30,31)
  574.   r3 = r3 ^ rotate_mask_and(r0,-2,22,29)
  575.   r0 = rotate_mask_and(r3,-4,20,27)
  576.   r0 = rotate_mask_insert(r0,r3,-28,28,31)
  577.   r18 = rotate_mask_and(r0,0,24,31)
  578.  
  579.   # proc1162 and proc1161 appear unused, although they change r0-r12 values
  580.  
  581.   r27 = char_to_bits(game[0]) # E
  582.   r0 = rotate_mask_and(r31,0,24,31)
  583.   r3 = char_to_bits(name[11%ln])
  584.   r18 = r18 ^ r27
  585.   r18 = r18 ^ r3
  586.   r4 = rotate_mask_and(r18,-28,28,31)
  587.   r4 = r4 ^ rotate_mask_and(r18,-4,20,27)
  588.   r3 = rotate_mask_and(r4,-28,28,31)
  589.   r3 = r3 ^ rotate_mask_and(r4,-4,20,27)
  590.   r3 = rotate_mask_and(r3,0,24,31)
  591.   r3 = r3 ^ r0
  592.   r0 = rotate_mask_and(r3,-6,18,25)
  593.   r0 = rotate_mask_insert(r0,r3,-30,26,31)
  594.   r4 = rotate_mask_and(r0,0,24,31)
  595.  
  596.   if int(r4.bin,2) > int("79",16):
  597.     r0 = char_to_bits(game[0]) # E
  598.     r0 = r4 ^ r0
  599.     r4 = rotate_mask_and(r0,0,24,31)
  600.  
  601.   r3 = rotate_mask_and(r31,0,24,31)
  602.   r4 = r4 ^ r3
  603.   r0 = rotate_mask_and(r4,-26,30,31)
  604.   r0 = r0 ^ rotate_mask_and(r4,-2,22,29)
  605.   r0 = rotate_mask_and(r0,0,24,31)
  606.   r0 = r0 ^ r3
  607.   r3 = rotate_mask_and(r0,-28,28,31)
  608.   r3 = r3 ^ rotate_mask_and(r0,-4,20,27)
  609.   r0 = rotate_mask_and(r3,-1,23,30)
  610.   r0 = rotate_mask_insert(r0,r3,-25,31,31)
  611.   r18 = rotate_mask_and(r0,0,24,31)
  612.  
  613.   # bl       proc188
  614.   # mullw    r3,r18,r3
  615.   # seems that r3 is just 1 upon return from 188 in normal operation, so use mr r3,r18
  616.   r3 = r18
  617.  
  618.   r0 = char_to_bits(game[1]) # V
  619.   r19 = char_to_bits(game[6]) # a
  620.   r3 = rotate_mask_and(r3,0,24,31)
  621.   r18 = r3 ^ r0
  622.   r18 = addi(r18,-47)
  623.   r18 = r18 ^ r19
  624.   r18 = addi(r18,36)
  625.   r0 = rotate_mask_and(r18,0,24,31)
  626.   r26 = r28
  627.  
  628.   if int(r0.bin,2) < int(r26.bin,2):
  629.     r0 = char_to_bits(name[8%ln])
  630.     r0 = r18 ^ r0
  631.     r18 = rotate_mask_and(r0,0,24,31)
  632.  
  633.   r3 = rotate_mask_and(r31,0,24,31)
  634.   r0 = char_to_bits(game[4]) # o
  635.   r18 = r18 ^ r3
  636.   r18 = r18 ^ r0
  637.  
  638.   # proc1162 and proc1161 appear unused, although they change r0-r12 values
  639.  
  640.   r4 = char_to_bits(name[9%ln])
  641.   r0 = char_to_bits(name[0%ln])
  642.   r18 = r18 ^ r4
  643.   r18 = r18 ^ r0
  644.   r18 = rotate_mask_and(r18,0,24,31)
  645.  
  646.   # lbzx     r3,r21,r18
  647.   # addi     r0,r3,1  
  648.   # stbx     r0,r21,r18
  649.   # this snippet appears to be storing some sort of counter
  650.   # perhaps used when flagging too many attempts or invalid codes
  651.   # (codes can be blacklisted locally in the saved license file)
  652.  
  653.   if int(r18.bin,2) > int(r0.bin,2):
  654.     r0 = r18 << 7
  655.     r0 = rotate_mask_insert(r0,r18,-31,25,31)
  656.     r18 = rotate_mask_and(r0,0,24,31)
  657.  
  658.   r18 = addi(r18,29)
  659.   r18 = r18 ^ r28
  660.   r18 = r18 ^ r4
  661.  
  662.   # proc235 returns value in r3, unused
  663.  
  664.   r3 = char_to_bits(name[2%ln]) # C
  665.   r0 = rotate_mask_and(r31,0,24,31)
  666.   r18 = r18 ^ r3
  667.   r3 = rotate_mask_and(r18,-6,18,25)
  668.   r3 = rotate_mask_insert(r3,r18,-30,26,31)
  669.   r21 = rotate_mask_and(r3,0,24,31)
  670.   r21 = r21 ^ r19
  671.   r21 = r21 ^ r0
  672.  
  673.   # proc235 returns value in r3, unused
  674.  
  675.   r0 = rotate_mask_and(r31,0,24,31)
  676.   r4 = char_to_bits(name[6%ln])
  677.   r21 = addi(r21,int("-C3",16))
  678.   r28 = char_to_bits(game[2]) # " '"
  679.   r21 = r21 ^ r0
  680.   r3 = char_to_bits(name[3%ln])
  681.   r5 = rotate_mask_and(r21,-8,16,23)
  682.   r5 = r5 ^ rotate_mask_and(r21,-0,24,31)
  683.   r6 = rotate_mask_and(r5,0,24,31)
  684.   r5 = r6 >> 5
  685.   r5 = r5 ^ rotate_mask_and(r6,-3,21,28)
  686.   r5 = rotate_mask_and(r5,0,24,31)
  687.   r6 = addi(r5,-3)
  688.   r5 = rotate_mask_and(r6,-8,16,23)
  689.   r5 = r5 ^ rotate_mask_and(r6,-0,24,31)
  690.   r5 = rotate_mask_and(r5,0,24,31)
  691.   r5 = addi(r5,-60)
  692.   r5 = rotate_mask_and(r5,0,24,31)
  693.   r6 = r5 ^ r27
  694.   r5 = rotate_mask_and(r6,0,24,31)
  695.   r5 = r5 >> 1
  696.   r5 = r5 ^ rotate_mask_and(r6,-7,17,24)
  697.   r6 = rotate_mask_and(r5,0,24,31)
  698.   r5 = r6 >> 3
  699.   r5 = r5 ^ rotate_mask_and(r6,-5,19,26)
  700.   r5 = rotate_mask_and(r5,0,24,31)
  701.   r6 = addi(r5,8)
  702.   r5 = rotate_mask_and(r6,0,24,31)
  703.   r5 = r5 >> 2
  704.   r5 = r5 ^ rotate_mask_and(r6,-6,18,25)
  705.   r5 = rotate_mask_and(r5,0,24,31)
  706.   r5 = r5 ^ r4
  707.   r5 = r5 ^ r28
  708.   r5 = r5 ^ r3
  709.   r5 = addi(r5,-27)
  710.   r5 = r5 ^ r0
  711.   r0 = rotate_mask_and(r5,0,24,31)
  712.   r0 = r0 >> 5
  713.   r0 = r0 ^ rotate_mask_and(r5,-3,21,28)
  714.   r3 = rotate_mask_and(r0,-31,25,31)
  715.   r3 = r3 ^ rotate_mask_and(r0,-7,17,24)
  716.   r0 = rotate_mask_and(r3,-30,26,31)
  717.   r0 = r0 ^ rotate_mask_and(r3,-6,18,25)
  718.   r3 = rotate_mask_and(r0,0,24,31)
  719.   r3 = addi(r3,-71)
  720.   r0 = rotate_mask_and(r3,-2,22,29)
  721.   r0 = rotate_mask_insert(r0,r3,-26,30,31)
  722.   r4 = rotate_mask_and(r0,0,24,31)
  723.   r0 = r28
  724.  
  725.   if int(r4.bin,2) > int(r0.bin,2):
  726.     r0 = r4 << 2
  727.     r0 = rotate_mask_insert(r0,r4,-26,30,31)
  728.     r4 = rotate_mask_and(r0,0,24,31)
  729.  
  730.   r3 = char_to_bits(name[13%ln]) # S
  731.   r4 = addi(r4,75)
  732.   r0 = char_to_bits(name[8%ln]) # L
  733.   r4 = r4 ^ r3
  734.   r4 = r4 ^ r0
  735.   r0 = rotate_mask_and(r4,0,24,31)
  736.  
  737.   if int(r0.bin,2) < 44:
  738.     r0 = addi(r4,-53)
  739.     r4 = rotate_mask_and(r0,0,24,31)
  740.  
  741.   r3 = addi(r4,73)
  742.   r0 = rotate_mask_and(r3,-6,18,25)
  743.   r0 = rotate_mask_insert(r0,r3,-30,26,31)
  744.   r18 = rotate_mask_and(r0,0,24,31)
  745.  
  746.   # these next few lines seem irrelevant if skipping proc235
  747.   # cmp      cr0,0,r18,r26      
  748.   # bc       IF_NOT,cr0_GT,lak_41
  749.   # bl       proc235            
  750.  
  751.   r0 = char_to_bits(name[10%ln])
  752.   r4 = rotate_mask_and(r31,0,24,31)
  753.   r6 = char_to_bits(name[14%ln])
  754.   r18 = r18 ^ r0
  755.   r5 = char_to_bits(name[6%ln])
  756.   r8 = addi(r18,-45)
  757.   r3 = char_to_bits(name[4%ln])
  758.   r7 = rotate_mask_and(r8,0,24,31)
  759.   r0 = char_to_bits(name[3%ln])
  760.   r7 = r7 >> 1
  761.   r7 = r7 ^ rotate_mask_and(r8,-7,17,24)
  762.   r7 = rotate_mask_and(r7,0,24,31)
  763.   r7 = addi(r7,34)
  764.   r7 = r7 ^ r6
  765.   r6 = rotate_mask_and(r7,0,24,31)
  766.   r6 = r6 >> 6
  767.   r6 = r6 ^ rotate_mask_and(r7,-2,22,29)
  768.   r6 = rotate_mask_and(r6,0,24,31)
  769.   r6 = r6 ^ r5
  770.   r5 = rotate_mask_and(r6,0,24,31)
  771.   r5 = r5 >> 5
  772.   r5 = r5 ^ rotate_mask_and(r6,-3,21,28)
  773.   r6 = rotate_mask_and(r5,0,24,31)
  774.   r5 = rotate_mask_and(r5,-29,27,31)
  775.   r5 = r5 ^ rotate_mask_and(r6,-5,19,26)
  776.   r5 = rotate_mask_and(r5,0,24,31)
  777.   r5 = r5 ^ r3
  778.   r5 = r5 ^ r4
  779.   r5 = r5 ^ r4
  780.   r5 = r5 ^ r4
  781.   r5 = addi(r5,86)
  782.   r5 = r5 ^ r28
  783.   r3 = rotate_mask_and(r5,-25,31,31)
  784.   r3 = r3 ^ rotate_mask_and(r5,-1,23,30)
  785.   r5 = rotate_mask_and(r3,0,24,31)
  786.   r5 = r5 ^ r4
  787.   r3 = rotate_mask_and(r5,-7,17,24)
  788.   r3 = rotate_mask_insert(r3,r5,-31,25,31)
  789.   r19 = rotate_mask_and(r3,0,24,31)
  790.   r19 = r19 ^ r0
  791.   r19 = r19 ^ r4
  792.  
  793.   # proc235 returns value in r3, unused
  794.  
  795.   r19 = addi(r19,int("6D",16))
  796.   r0 = rotate_mask_and(r19,0,24,31)
  797.  
  798.   return r0[16:]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement