59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
|
# uncompyle6 version 3.7.3
|
||
|
# Python bytecode 3.6 (3379)
|
||
|
# Decompiled from: Python 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 08:53:46) [MSC v.1916 64 bit (AMD64)]
|
||
|
# Embedded file name: pywidevine\decrypt\wvdecryptcustom.py
|
||
|
import logging, subprocess, re, base64
|
||
|
from pywidevine.L3.cdm import cdm, deviceconfig
|
||
|
|
||
|
class WvDecrypt(object):
|
||
|
WV_SYSTEM_ID = [
|
||
|
237, 239, 139, 169, 121, 214, 74, 206, 163, 200, 39, 220, 213, 29, 33, 237]
|
||
|
|
||
|
def __init__(self, init_data_b64, cert_data_b64, device):
|
||
|
self.init_data_b64 = init_data_b64
|
||
|
self.cert_data_b64 = cert_data_b64
|
||
|
self.device = device
|
||
|
self.cdm = cdm.Cdm()
|
||
|
|
||
|
def check_pssh(pssh_b64):
|
||
|
pssh = base64.b64decode(pssh_b64)
|
||
|
if not pssh[12:28] == bytes(self.WV_SYSTEM_ID):
|
||
|
new_pssh = bytearray([0, 0, 0])
|
||
|
new_pssh.append(32 + len(pssh))
|
||
|
new_pssh[4:] = bytearray(b'pssh')
|
||
|
new_pssh[8:] = [0, 0, 0, 0]
|
||
|
new_pssh[13:] = self.WV_SYSTEM_ID
|
||
|
new_pssh[29:] = [0, 0, 0, 0]
|
||
|
new_pssh[31] = len(pssh)
|
||
|
new_pssh[32:] = pssh
|
||
|
return base64.b64encode(new_pssh)
|
||
|
else:
|
||
|
return pssh_b64
|
||
|
|
||
|
self.session = self.cdm.open_session(check_pssh(self.init_data_b64), deviceconfig.DeviceConfig(self.device))
|
||
|
if self.cert_data_b64:
|
||
|
self.cdm.set_service_certificate(self.session, self.cert_data_b64)
|
||
|
|
||
|
def log_message(self, msg):
|
||
|
return '{}'.format(msg)
|
||
|
|
||
|
def start_process(self):
|
||
|
keyswvdecrypt = []
|
||
|
try:
|
||
|
for key in self.cdm.get_keys(self.session):
|
||
|
if key.type == 'CONTENT':
|
||
|
keyswvdecrypt.append(self.log_message('{}:{}'.format(key.kid.hex(), key.key.hex())))
|
||
|
|
||
|
except Exception:
|
||
|
return (
|
||
|
False, keyswvdecrypt)
|
||
|
else:
|
||
|
return (
|
||
|
True, keyswvdecrypt)
|
||
|
|
||
|
def get_challenge(self):
|
||
|
return self.cdm.get_license_request(self.session)
|
||
|
|
||
|
def update_license(self, license_b64):
|
||
|
self.cdm.provide_license(self.session, license_b64)
|
||
|
return True
|