@@ -10,7 +10,7 @@ class SecureChannel:
1010 0x38 , 0x39 , 0x3A , 0x3B , 0x3C , 0x3D , 0x3E , 0x3F
1111 ])
1212
13- def __init__ (self ):
13+ def __init__ (self , master_key : bytes ):
1414 self ._cmac = None
1515 self ._enc = None
1616 self ._rmac = None
@@ -21,17 +21,26 @@ def __init__(self):
2121 self .server_cryptogram = None
2222 self .is_initialized = False
2323 self .is_established = False
24+ self .master_key = master_key
25+ self .is_scbkd = False
26+ self .cuid = None
27+ self .scbk = None
2428 self .reset ()
2529
2630 def initialize (self , cuid : bytes , client_random_number : bytes , client_cryptogram : bytes ):
31+ self .cuid = cuid
32+ if self .is_scbkd == True :
33+ self .scbk = self .default_secure_channel_key
34+ else :
35+ self .scbk = self .calculate_scbk ()
2736 self ._enc = self .generate_key (
2837 bytes ([
2938 0x01 , 0x82 ,
3039 self .server_random_number [0 ], self .server_random_number [1 ], self .server_random_number [2 ],
3140 self .server_random_number [3 ], self .server_random_number [4 ], self .server_random_number [5 ]
3241 ]),
3342 bytes ([0x00 ] * 8 ),
34- self .default_secure_channel_key
43+ self .scbk
3544 )
3645
3746 if client_cryptogram != self .generate_key (self .server_random_number , client_random_number , self ._enc ):
@@ -44,7 +53,7 @@ def initialize(self, cuid: bytes, client_random_number: bytes, client_cryptogram
4453 self .server_random_number [3 ], self .server_random_number [4 ], self .server_random_number [5 ]
4554 ]),
4655 bytes ([0x00 ] * 8 ),
47- self .default_secure_channel_key
56+ self .scbk
4857 )
4958 self ._smac2 = self .generate_key (
5059 bytes ([
@@ -54,7 +63,7 @@ def initialize(self, cuid: bytes, client_random_number: bytes, client_cryptogram
5463 self .server_random_number [4 ], self .server_random_number [5 ]
5564 ]),
5665 bytes ([0x00 ] * 8 ),
57- self .default_secure_channel_key
66+ self .scbk
5867 )
5968 self .server_cryptogram = self .generate_key (
6069 client_random_number ,
@@ -132,3 +141,19 @@ def reset(self):
132141 def generate_key (self , first : bytes , second : bytes , key : bytes ) -> bytes :
133142 cipher = AES .new (key , AES .MODE_ECB )
134143 return cipher .encrypt (first + second )
144+
145+ def select_scbk (self , byte ):
146+ if byte == 0x0 :
147+ self .is_scbkd = True
148+ else :
149+ self .is_scbkd = False
150+
151+ def calculate_scbk (self ):
152+ inv_cuid = bytes ([(~ b ) & 0xFF for b in self .cuid ])
153+ scbk = self .generate_key (
154+ self .cuid ,
155+ inv_cuid ,
156+ self .master_key
157+ )
158+
159+ return scbk
0 commit comments