diff --git a/init_pssh.py b/init_pssh.py new file mode 100644 index 0000000..8fc3f08 --- /dev/null +++ b/init_pssh.py @@ -0,0 +1,66 @@ +import base64 +import sys +from pathlib import Path +from google.protobuf.message import DecodeError +from cdm.wks import WidevineCencHeader + +# File path to read the raw data +file_path = "your init" + +# Read the raw data from the file +raw = Path(file_path).read_bytes() + +# Find the offset of 'pssh' in the raw data +pssh_offset = raw.rfind(b'pssh') + +if pssh_offset == -1: + print("[ERROR] 'pssh' not found in the file.") + sys.exit(1) +else: + # Extract the PSSH data based on the offset and length information + _start = max(pssh_offset - 4, 0) + _end = min(pssh_offset - 4 + raw[pssh_offset - 1], len(raw)) + pssh = raw[_start:_end] + + # Display the PSSH data in base64 format + print('\n[INFO] PSSH:', base64.b64encode(pssh).decode('utf-8')) + pssh_b64 = base64.b64encode(pssh) + print("\n[SUCCESS] PSSH extracted successfully.") + +# Check if the PSSH data needs modification +if not pssh[12:28] == bytes([237, 239, 139, 169, 121, 214, 74, 206, 163, 200, 39, 220, 213, 29, 33, 237]): + print("[Modifying PSSH data...]") + # Create a new PSSH data with the required modifications + 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:] = [237, 239, 139, 169, 121, 214, 74, 206, 163, 200, 39, 220, 213, 29, 33, 237] + new_pssh[29:] = [0, 0, 0, 0] + new_pssh[31] = len(pssh) + new_pssh[32:] = pssh + pssh_b64 = base64.b64encode(new_pssh) + print("[Modified PSSH data:", pssh_b64.decode(), "]") +else: + print("[PSSH data doesn't need modification.]") + +# Parse the modified or original PSSH data using WidevineCencHeader +parsed_init_data = WidevineCencHeader() + +try: + parsed_init_data.ParseFromString(base64.b64decode(pssh_b64)) + print("[PSSH data parsed successfully.]") +except (DecodeError, SystemError) as e: + print("[Error parsing PSSH data:", e, "]") + try: + # Attempt to parse PSSH data from byte offset 32 + id_bytes = parsed_init_data.ParseFromString(base64.b64decode(pssh_b64)[32:]) + print("[PSSH data parsed successfully from byte offset 32.]") + except DecodeError as de: + print("[Error parsing PSSH data from byte offset 32:", de, "]") + sys.exit(1) + +# Convert the parsed key_id to a hexadecimal string +key_id_str = ''.join(['{:02x}'.format(b) for b in parsed_init_data.key_id[0]]) +print("[Key ID in hexadecimal:", key_id_str, "]") +print("\n[SUCCESS] [Done]\n") \ No newline at end of file