1- import argparse
1+ import json
22import re
33from random import randint
44
1414 "Suite" : 2 ,
1515}
1616
17- parser = argparse .ArgumentParser ()
18- parser .add_argument ("-i" , "--hwid" , help = "Your hardware code" , required = True )
19- parser .add_argument ("-o" , "--output" , help = "Authorization file" , default = "Authorize.auz" )
20- parser .add_argument ("-v" , "--version" , help = "Ableton Live version" , type = int , choices = range (9 , 13 ), default = 12 )
21- parser .add_argument ("-e" , "--edition" , help = "Ableton Live edition" , type = str .capitalize , choices = EDITIONS , default = "Suite" )
22- args = parser .parse_args ()
23-
17+ def load_config (filename : str ):
18+ with open (filename , 'r' ) as f :
19+ return json .load (f )
2420
2521def construct_key (* , p , q , g , y , x ) -> dsa .DSAPrivateKey :
2622 params = dsa .DSAParameterNumbers (p , q , g )
2723 pub = dsa .DSAPublicNumbers (y , params )
2824 priv = dsa .DSAPrivateNumbers (x , pub )
2925 return priv .private_key (backend = default_backend ())
3026
31-
3227def sign (k : dsa .DSAPrivateKey , m : str ) -> str :
3328 """P1363 format sig over m as a string of hex digits"""
3429 assert k .key_size == 1024
3530 sig = k .sign (m .encode (), SHA1 ())
3631 r , s = decode_dss_signature (sig )
3732 return "{:040X}{:040X}" .format (r , s )
3833
39-
4034def fix_group_checksum (group_number : int , n : int ) -> int :
4135 checksum = n >> 4 & 0xf ^ \
4236 n >> 5 & 0x8 ^ \
@@ -46,21 +40,18 @@ def fix_group_checksum(group_number: int, n: int) -> int:
4640 group_number
4741 return n & 0xfff0 | checksum
4842
49-
5043def overall_checksum (groups : list [int ]) -> int :
5144 r = 0
5245 for i in range (20 ):
5346 g , digit = divmod (i , 4 )
5447 v = groups [g ] >> (digit * 8 ) & 0xff
55- # v is lowbyte, highbyte, 0, 0 in turn for each group
5648 r ^= v << 8
5749 for _ in range (8 ):
5850 r <<= 1
5951 if r & 0x10000 :
6052 r ^= 0x8005
6153 return r & 0xffff
6254
63-
6455def random_serial ():
6556 """
6657 3xxc-xxxc-xxxc-xxxc-xxxc-dddd
@@ -78,23 +69,20 @@ def random_serial():
7869 d = overall_checksum (groups )
7970 return "{:04X}-{:04X}-{:04X}-{:04X}-{:04X}-{:04X}" .format (* groups , d )
8071
81-
8272def generate_single (k : dsa .DSAPrivateKey , id1 : int , id2 : int , hwid : str ) -> str :
8373 f = "{},{:02X},{:02X},Standard,{}"
8474 serial = random_serial ()
8575 msg = f .format (serial , id1 , id2 , hwid )
8676 sig = sign (k , msg )
8777 return f .format (serial , id1 , id2 , sig )
8878
89-
9079def generate_all (k : dsa .DSAPrivateKey , edition : str , version : int , hwid : str ) -> str :
9180 yield generate_single (k , EDITIONS [edition ], version << 4 , hwid )
9281 for i in range (0x40 , 0xff + 1 ):
9382 yield generate_single (k , i , 0x10 , hwid )
9483 for i in range (0x8000 , 0x80ff + 1 ):
9584 yield generate_single (k , i , 0x10 , hwid )
9685
97-
9886team_r2r_key = construct_key (
9987 p = 0xbab5a10970f083e266a1252897daac1d67374712e79d3df1bc8c08a3493c6aa9a2ff33be4513d8b6767ab6aae2af6cc9107976fa75fee134e8b7be03d78cc64e089c845207d306a6035f172c5b750275f00bd3ca2331b8a59d54fe79393854dd884b8d334d553b38bc5e886c0a2dd0e4ec32f7d88de1a7c9df5c424ee7b1ce6d ,
10088 q = 0xc37be90e3f8e64e03a42ca8d68ad5c83eb47d3a9 ,
@@ -103,11 +91,14 @@ def generate_all(k: dsa.DSAPrivateKey, edition: str, version: int, hwid: str) ->
10391 x = 0xc369ea757b46484d1df3819cc4183f6f9a9bcf3c
10492)
10593
106- hwid = args .hwid .upper ()
94+ # Load configuration
95+ config = load_config ('config.json' )
96+
97+ hwid = config .get ('hwid' , '' ).upper ()
10798if len (hwid ) == 24 :
10899 hwid = "-" .join (hwid [i :i + 4 ] for i in range (0 , 24 , 4 ))
109100assert re .fullmatch (r"([0-9A-F]{4}-){5}[0-9A-F]{4}" , hwid ), f"Expected hardware ID like 1111-1111-1111-1111-1111-1111, not { hwid } "
110101
111- lines = generate_all (team_r2r_key , args . edition , args . version , hwid )
112- with open (args . output , mode = "w" , newline = "\n " ) as f :
102+ lines = generate_all (team_r2r_key , config . get ( ' edition' , 'Suite' ), config . get ( ' version' , 12 ) , hwid )
103+ with open (config . get ( 'authorize_file_output' , 'Authorize.auz' ) , mode = "w" , newline = "\n " ) as f :
113104 f .write ("\n " .join (lines ))
0 commit comments