fix(esn): Fixes ESN/Handshake race condition when user is not valid on Kodi startup
[plugin.video.netflix.git] / resources / lib / MSL.py
index 5b7381d74acfe6140654888086c5ff145f030d29..d0387972ceeab83ea253a55bf22fb89bc2c748eb 100644 (file)
@@ -42,7 +42,7 @@ class MSL:
     last_drm_context = ''
     last_playback_context = ''
     #esn = "NFCDCH-LX-CQE0NU6PA5714R25VPLXVU2A193T36"
-    esn = "WWW-BROWSE-D7GW1G4NPXGR1F0X1H3EQGY3V1F5WE"
+    #esn = "WWW-BROWSE-D7GW1G4NPXGR1F0X1H3EQGY3V1F5WE"
     #esn = "NFCDIE-02-DCH84Q2EK3N6VFVQJ0NLRQ27498N0F"
     current_message_id = 0
     session = requests.session()
@@ -71,13 +71,18 @@ class MSL:
         elif self.file_exists(self.kodi_helper.msl_data_path, 'rsa_key.bin'):
             self.kodi_helper.log(msg='RSA Keys do already exist load old ones')
             self.__load_rsa_keys()
-            self.__perform_key_handshake()
+            if self.kodi_helper.get_esn():
+                self.__perform_key_handshake()
         else:
             self.kodi_helper.log(msg='Create new RSA Keys')
             # Create new Key Pair and save
             self.rsa_key = RSA.generate(2048)
             self.__save_rsa_keys()
-            self.__perform_key_handshake()
+            if self.kodi_helper.get_esn():
+                self.__perform_key_handshake()
+    
+    def perform_key_handshake(self):
+        self.__perform_key_handshake()
 
     def load_manifest(self, viewable_id):
         """
@@ -406,6 +411,7 @@ class MSL:
         }
 
     def __generate_msl_request_data(self, data):
+        self.__load_msl_data()
         header_encryption_envelope = self.__encrypt(self.__generate_msl_header())
         header = {
             'headerdata': base64.standard_b64encode(header_encryption_envelope),
@@ -453,9 +459,10 @@ class MSL:
         :return: The base64 encoded JSON String of the header
         """
         self.current_message_id = self.rndm.randint(0, pow(2, 52))
+        esn = self.kodi_helper.get_esn()
 
         header_data = {
-            'sender': self.esn,
+            'sender': esn,
             'handshake': is_handshake,
             'nonreplayable': False,
             'capabilities': {
@@ -507,10 +514,12 @@ class MSL:
         :param plaintext:
         :return: Serialized JSON String of the encryption Envelope
         """
+        esn = self.kodi_helper.get_esn()
+
         iv = get_random_bytes(16)
         encryption_envelope = {
             'ciphertext': '',
-            'keyid': self.esn + '_' + str(self.sequence_number),
+            'keyid': esn + '_' + str(self.sequence_number),
             'sha256': 'AA==',
             'iv': base64.standard_b64encode(iv)
         }
@@ -535,11 +544,13 @@ class MSL:
 
     def __perform_key_handshake(self):
         header = self.__generate_msl_header(is_key_request=True, is_handshake=True, compressionalgo="", encrypt=False)
+        esn = self.kodi_helper.get_esn()
+
         request = {
             'entityauthdata': {
                 'scheme': 'NONE',
                 'authdata': {
-                    'identity': self.esn
+                    'identity': esn
                 }
             },
             'headerdata': base64.standard_b64encode(header),
@@ -596,6 +607,10 @@ class MSL:
         self.encryption_key = base64.standard_b64decode(msl_data['encryption_key'])
         self.sign_key = base64.standard_b64decode(msl_data['sign_key'])
 
+
+    def save_msl_data(self):
+        self.__save_msl_data()
+
     def __save_msl_data(self):
         """
         Saves the keys and tokens in json file