From b2daa867fcbc3285a40ed3c6baafb390d73454a0 Mon Sep 17 00:00:00 2001 From: TPD94 Date: Fri, 2 Sep 2022 18:44:42 -0400 Subject: [PATCH] WKS-Keys --- README.md | 92 - __pycache__/getPSSH.cpython-37.pyc | Bin 0 -> 699 bytes __pycache__/headers.cpython-36.pyc | Bin 0 -> 2666 bytes __pycache__/headers.cpython-37.pyc | Bin 0 -> 7480 bytes __pycache__/headers.cpython-39.pyc | Bin 0 -> 14759 bytes headers.py | 0 l1.py | 29 + l3.py | 29 + pywidevine/L1/__init__.py | 0 pywidevine/L1/cdm/__init__.py | 0 .../cdm/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 148 bytes .../cdm/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 163 bytes .../cdm/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 160 bytes .../cdm/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 158 bytes .../L1/cdm/__pycache__/cdm.cpython-36.pyc | Bin 0 -> 10282 bytes .../L1/cdm/__pycache__/cdm.cpython-37.pyc | Bin 0 -> 10287 bytes .../L1/cdm/__pycache__/cdm.cpython-38.pyc | Bin 0 -> 10325 bytes .../L1/cdm/__pycache__/cdm.cpython-39.pyc | Bin 0 -> 10393 bytes .../__pycache__/deviceconfig.cpython-36.pyc | Bin 0 -> 1870 bytes .../__pycache__/deviceconfig.cpython-37.pyc | Bin 0 -> 1866 bytes .../__pycache__/deviceconfig.cpython-38.pyc | Bin 0 -> 1932 bytes .../__pycache__/deviceconfig.cpython-39.pyc | Bin 0 -> 1894 bytes .../L1/cdm/__pycache__/key.cpython-36.pyc | Bin 0 -> 811 bytes .../L1/cdm/__pycache__/key.cpython-37.pyc | Bin 0 -> 826 bytes .../L1/cdm/__pycache__/key.cpython-38.pyc | Bin 0 -> 835 bytes .../L1/cdm/__pycache__/key.cpython-39.pyc | Bin 0 -> 833 bytes .../L1/cdm/__pycache__/session.cpython-36.pyc | Bin 0 -> 705 bytes .../L1/cdm/__pycache__/session.cpython-37.pyc | Bin 0 -> 720 bytes .../L1/cdm/__pycache__/session.cpython-38.pyc | Bin 0 -> 727 bytes .../L1/cdm/__pycache__/session.cpython-39.pyc | Bin 0 -> 725 bytes pywidevine/L1/cdm/cdm.py | 362 ++ pywidevine/L1/cdm/deviceconfig.py | 53 + pywidevine/L1/cdm/formats/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 156 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 171 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 168 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 166 bytes .../__pycache__/wv_proto2_pb2.cpython-36.pyc | Bin 0 -> 44592 bytes .../__pycache__/wv_proto2_pb2.cpython-37.pyc | Bin 0 -> 44607 bytes .../__pycache__/wv_proto2_pb2.cpython-38.pyc | Bin 0 -> 48896 bytes .../__pycache__/wv_proto2_pb2.cpython-39.pyc | Bin 0 -> 45460 bytes pywidevine/L1/cdm/formats/wv_proto2.proto | 466 +++ pywidevine/L1/cdm/formats/wv_proto2_pb2.py | 3324 +++++++++++++++++ pywidevine/L1/cdm/formats/wv_proto3.proto | 389 ++ pywidevine/L1/cdm/formats/wv_proto3_pb2.py | 2686 +++++++++++++ pywidevine/L1/cdm/key.py | 14 + pywidevine/L1/cdm/session.py | 18 + pywidevine/L1/cdm/vmp.py | 102 + pywidevine/L1/decrypt/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 152 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 148 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 171 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 146 bytes .../__pycache__/wvdecrypt.cpython-38.pyc | Bin 0 -> 2483 bytes .../__pycache__/wvdecrypt.cpython-39.pyc | Bin 0 -> 2582 bytes .../wvdecryptconfig.cpython-38.pyc | Bin 0 -> 1871 bytes .../wvdecryptcustom.cpython-36.pyc | Bin 0 -> 2235 bytes .../wvdecryptcustom.cpython-37.pyc | Bin 0 -> 2231 bytes .../wvdecryptcustom.cpython-39.pyc | Bin 0 -> 2274 bytes pywidevine/L1/decrypt/wvdecryptcustom.py | 59 + pywidevine/L1/getPSSH.py | 14 + pywidevine/L3/__init__.py | 0 .../L3/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 143 bytes .../L3/__pycache__/getPSSH.cpython-37.pyc | Bin 0 -> 713 bytes pywidevine/L3/cdm/__init__.py | 0 .../cdm/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 148 bytes .../cdm/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 163 bytes .../cdm/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 160 bytes .../cdm/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 158 bytes .../L3/cdm/__pycache__/cdm.cpython-36.pyc | Bin 0 -> 10282 bytes .../L3/cdm/__pycache__/cdm.cpython-37.pyc | Bin 0 -> 10280 bytes .../L3/cdm/__pycache__/cdm.cpython-38.pyc | Bin 0 -> 10325 bytes .../L3/cdm/__pycache__/cdm.cpython-39.pyc | Bin 0 -> 10393 bytes .../__pycache__/deviceconfig.cpython-36.pyc | Bin 0 -> 1870 bytes .../__pycache__/deviceconfig.cpython-37.pyc | Bin 0 -> 1866 bytes .../__pycache__/deviceconfig.cpython-38.pyc | Bin 0 -> 1932 bytes .../__pycache__/deviceconfig.cpython-39.pyc | Bin 0 -> 1894 bytes .../L3/cdm/__pycache__/key.cpython-36.pyc | Bin 0 -> 811 bytes .../L3/cdm/__pycache__/key.cpython-37.pyc | Bin 0 -> 826 bytes .../L3/cdm/__pycache__/key.cpython-38.pyc | Bin 0 -> 835 bytes .../L3/cdm/__pycache__/key.cpython-39.pyc | Bin 0 -> 833 bytes .../L3/cdm/__pycache__/session.cpython-36.pyc | Bin 0 -> 705 bytes .../L3/cdm/__pycache__/session.cpython-37.pyc | Bin 0 -> 720 bytes .../L3/cdm/__pycache__/session.cpython-38.pyc | Bin 0 -> 727 bytes .../L3/cdm/__pycache__/session.cpython-39.pyc | Bin 0 -> 725 bytes pywidevine/L3/cdm/cdm.py | 362 ++ pywidevine/L3/cdm/deviceconfig.py | 53 + .../cdm/devices/android_generic/config.json | 20 + .../android_generic/device_client_id_blob | Bin 0 -> 1651 bytes .../android_generic/device_private_key | 27 + .../L3/cdm/devices/android_generic/token.bin | Bin 0 -> 1259 bytes pywidevine/L3/cdm/formats/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 156 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 171 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 168 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 166 bytes .../__pycache__/wv_proto2_pb2.cpython-36.pyc | Bin 0 -> 44592 bytes .../__pycache__/wv_proto2_pb2.cpython-37.pyc | Bin 0 -> 44607 bytes .../__pycache__/wv_proto2_pb2.cpython-38.pyc | Bin 0 -> 48896 bytes .../__pycache__/wv_proto2_pb2.cpython-39.pyc | Bin 0 -> 45460 bytes pywidevine/L3/cdm/formats/wv_proto2.proto | 466 +++ pywidevine/L3/cdm/formats/wv_proto2_pb2.py | 3324 +++++++++++++++++ pywidevine/L3/cdm/formats/wv_proto3.proto | 389 ++ pywidevine/L3/cdm/formats/wv_proto3_pb2.py | 2686 +++++++++++++ pywidevine/L3/cdm/key.py | 14 + pywidevine/L3/cdm/session.py | 18 + pywidevine/L3/cdm/vmp.py | 102 + pywidevine/L3/decrypt/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 152 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 148 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 171 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 146 bytes .../__pycache__/wvdecrypt.cpython-38.pyc | Bin 0 -> 2483 bytes .../__pycache__/wvdecrypt.cpython-39.pyc | Bin 0 -> 2582 bytes .../wvdecryptconfig.cpython-38.pyc | Bin 0 -> 1871 bytes .../wvdecryptcustom.cpython-36.pyc | Bin 0 -> 2235 bytes .../wvdecryptcustom.cpython-37.pyc | Bin 0 -> 2237 bytes .../wvdecryptcustom.cpython-39.pyc | Bin 0 -> 2274 bytes pywidevine/L3/decrypt/wvdecryptcustom.py | 59 + pywidevine/L3/getPSSH.py | 14 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 144 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 140 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 154 bytes pywidevine/__pycache__/getPSSH.cpython-36.pyc | Bin 0 -> 714 bytes pywidevine/__pycache__/getPSSH.cpython-37.pyc | Bin 0 -> 710 bytes pywidevine/__pycache__/getPSSH.cpython-39.pyc | Bin 0 -> 720 bytes 126 files changed, 15079 insertions(+), 92 deletions(-) delete mode 100644 README.md create mode 100644 __pycache__/getPSSH.cpython-37.pyc create mode 100644 __pycache__/headers.cpython-36.pyc create mode 100644 __pycache__/headers.cpython-37.pyc create mode 100644 __pycache__/headers.cpython-39.pyc create mode 100644 headers.py create mode 100644 l1.py create mode 100644 l3.py create mode 100644 pywidevine/L1/__init__.py create mode 100644 pywidevine/L1/cdm/__init__.py create mode 100644 pywidevine/L1/cdm/__pycache__/__init__.cpython-36.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/__init__.cpython-37.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/__init__.cpython-38.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/__init__.cpython-39.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/cdm.cpython-36.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/cdm.cpython-37.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/cdm.cpython-38.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/cdm.cpython-39.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/deviceconfig.cpython-36.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/deviceconfig.cpython-37.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/deviceconfig.cpython-38.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/deviceconfig.cpython-39.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/key.cpython-36.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/key.cpython-37.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/key.cpython-38.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/key.cpython-39.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/session.cpython-36.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/session.cpython-37.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/session.cpython-38.pyc create mode 100644 pywidevine/L1/cdm/__pycache__/session.cpython-39.pyc create mode 100644 pywidevine/L1/cdm/cdm.py create mode 100644 pywidevine/L1/cdm/deviceconfig.py create mode 100644 pywidevine/L1/cdm/formats/__init__.py create mode 100644 pywidevine/L1/cdm/formats/__pycache__/__init__.cpython-36.pyc create mode 100644 pywidevine/L1/cdm/formats/__pycache__/__init__.cpython-37.pyc create mode 100644 pywidevine/L1/cdm/formats/__pycache__/__init__.cpython-38.pyc create mode 100644 pywidevine/L1/cdm/formats/__pycache__/__init__.cpython-39.pyc create mode 100644 pywidevine/L1/cdm/formats/__pycache__/wv_proto2_pb2.cpython-36.pyc create mode 100644 pywidevine/L1/cdm/formats/__pycache__/wv_proto2_pb2.cpython-37.pyc create mode 100644 pywidevine/L1/cdm/formats/__pycache__/wv_proto2_pb2.cpython-38.pyc create mode 100644 pywidevine/L1/cdm/formats/__pycache__/wv_proto2_pb2.cpython-39.pyc create mode 100644 pywidevine/L1/cdm/formats/wv_proto2.proto create mode 100644 pywidevine/L1/cdm/formats/wv_proto2_pb2.py create mode 100644 pywidevine/L1/cdm/formats/wv_proto3.proto create mode 100644 pywidevine/L1/cdm/formats/wv_proto3_pb2.py create mode 100644 pywidevine/L1/cdm/key.py create mode 100644 pywidevine/L1/cdm/session.py create mode 100644 pywidevine/L1/cdm/vmp.py create mode 100644 pywidevine/L1/decrypt/__init__.py create mode 100644 pywidevine/L1/decrypt/__pycache__/__init__.cpython-36.pyc create mode 100644 pywidevine/L1/decrypt/__pycache__/__init__.cpython-37.pyc create mode 100644 pywidevine/L1/decrypt/__pycache__/__init__.cpython-38.pyc create mode 100644 pywidevine/L1/decrypt/__pycache__/__init__.cpython-39.pyc create mode 100644 pywidevine/L1/decrypt/__pycache__/wvdecrypt.cpython-38.pyc create mode 100644 pywidevine/L1/decrypt/__pycache__/wvdecrypt.cpython-39.pyc create mode 100644 pywidevine/L1/decrypt/__pycache__/wvdecryptconfig.cpython-38.pyc create mode 100644 pywidevine/L1/decrypt/__pycache__/wvdecryptcustom.cpython-36.pyc create mode 100644 pywidevine/L1/decrypt/__pycache__/wvdecryptcustom.cpython-37.pyc create mode 100644 pywidevine/L1/decrypt/__pycache__/wvdecryptcustom.cpython-39.pyc create mode 100644 pywidevine/L1/decrypt/wvdecryptcustom.py create mode 100644 pywidevine/L1/getPSSH.py create mode 100644 pywidevine/L3/__init__.py create mode 100644 pywidevine/L3/__pycache__/__init__.cpython-37.pyc create mode 100644 pywidevine/L3/__pycache__/getPSSH.cpython-37.pyc create mode 100644 pywidevine/L3/cdm/__init__.py create mode 100644 pywidevine/L3/cdm/__pycache__/__init__.cpython-36.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/__init__.cpython-37.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/__init__.cpython-38.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/__init__.cpython-39.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/cdm.cpython-36.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/cdm.cpython-37.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/cdm.cpython-38.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/cdm.cpython-39.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/deviceconfig.cpython-36.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/deviceconfig.cpython-37.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/deviceconfig.cpython-38.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/deviceconfig.cpython-39.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/key.cpython-36.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/key.cpython-37.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/key.cpython-38.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/key.cpython-39.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/session.cpython-36.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/session.cpython-37.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/session.cpython-38.pyc create mode 100644 pywidevine/L3/cdm/__pycache__/session.cpython-39.pyc create mode 100644 pywidevine/L3/cdm/cdm.py create mode 100644 pywidevine/L3/cdm/deviceconfig.py create mode 100644 pywidevine/L3/cdm/devices/android_generic/config.json create mode 100644 pywidevine/L3/cdm/devices/android_generic/device_client_id_blob create mode 100644 pywidevine/L3/cdm/devices/android_generic/device_private_key create mode 100644 pywidevine/L3/cdm/devices/android_generic/token.bin create mode 100644 pywidevine/L3/cdm/formats/__init__.py create mode 100644 pywidevine/L3/cdm/formats/__pycache__/__init__.cpython-36.pyc create mode 100644 pywidevine/L3/cdm/formats/__pycache__/__init__.cpython-37.pyc create mode 100644 pywidevine/L3/cdm/formats/__pycache__/__init__.cpython-38.pyc create mode 100644 pywidevine/L3/cdm/formats/__pycache__/__init__.cpython-39.pyc create mode 100644 pywidevine/L3/cdm/formats/__pycache__/wv_proto2_pb2.cpython-36.pyc create mode 100644 pywidevine/L3/cdm/formats/__pycache__/wv_proto2_pb2.cpython-37.pyc create mode 100644 pywidevine/L3/cdm/formats/__pycache__/wv_proto2_pb2.cpython-38.pyc create mode 100644 pywidevine/L3/cdm/formats/__pycache__/wv_proto2_pb2.cpython-39.pyc create mode 100644 pywidevine/L3/cdm/formats/wv_proto2.proto create mode 100644 pywidevine/L3/cdm/formats/wv_proto2_pb2.py create mode 100644 pywidevine/L3/cdm/formats/wv_proto3.proto create mode 100644 pywidevine/L3/cdm/formats/wv_proto3_pb2.py create mode 100644 pywidevine/L3/cdm/key.py create mode 100644 pywidevine/L3/cdm/session.py create mode 100644 pywidevine/L3/cdm/vmp.py create mode 100644 pywidevine/L3/decrypt/__init__.py create mode 100644 pywidevine/L3/decrypt/__pycache__/__init__.cpython-36.pyc create mode 100644 pywidevine/L3/decrypt/__pycache__/__init__.cpython-37.pyc create mode 100644 pywidevine/L3/decrypt/__pycache__/__init__.cpython-38.pyc create mode 100644 pywidevine/L3/decrypt/__pycache__/__init__.cpython-39.pyc create mode 100644 pywidevine/L3/decrypt/__pycache__/wvdecrypt.cpython-38.pyc create mode 100644 pywidevine/L3/decrypt/__pycache__/wvdecrypt.cpython-39.pyc create mode 100644 pywidevine/L3/decrypt/__pycache__/wvdecryptconfig.cpython-38.pyc create mode 100644 pywidevine/L3/decrypt/__pycache__/wvdecryptcustom.cpython-36.pyc create mode 100644 pywidevine/L3/decrypt/__pycache__/wvdecryptcustom.cpython-37.pyc create mode 100644 pywidevine/L3/decrypt/__pycache__/wvdecryptcustom.cpython-39.pyc create mode 100644 pywidevine/L3/decrypt/wvdecryptcustom.py create mode 100644 pywidevine/L3/getPSSH.py create mode 100644 pywidevine/__pycache__/__init__.cpython-36.pyc create mode 100644 pywidevine/__pycache__/__init__.cpython-37.pyc create mode 100644 pywidevine/__pycache__/__init__.cpython-39.pyc create mode 100644 pywidevine/__pycache__/getPSSH.cpython-36.pyc create mode 100644 pywidevine/__pycache__/getPSSH.cpython-37.pyc create mode 100644 pywidevine/__pycache__/getPSSH.cpython-39.pyc diff --git a/README.md b/README.md deleted file mode 100644 index 3679a82..0000000 --- a/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# WKS-Keys - - - -## Getting started - -To make it easy for you to get started with GitLab, here's a list of recommended next steps. - -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! - -## Add your files - -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: - -``` -cd existing_repo -git remote add origin https://CDM-Project.com/cdm-tools/wks-keys.git -git branch -M main -git push -uf origin main -``` - -## Integrate with your tools - -- [ ] [Set up project integrations](https://CDM-Project.com/cdm-tools/wks-keys/-/settings/integrations) - -## Collaborate with your team - -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) - -## Test and Deploy - -Use the built-in continuous integration in GitLab. - -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) - -*** - -# Editing this README - -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. - -## Suggestions for a good README -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. - -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. - -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. - -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. - -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. - -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. - -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. - -## Contributing -State if you are open to contributions and what your requirements are for accepting them. - -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. - -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. - -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. - -## License -For open source projects, say how it is licensed. - -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/__pycache__/getPSSH.cpython-37.pyc b/__pycache__/getPSSH.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9d893ec047f3fb03e909b553fdd02ee31ac8d11 GIT binary patch literal 699 zcmYjPO>fgc5Z(1x?2w=qBt#@`a3F_(S_*9=gh~@tfJ7B3RF$lt)b&iMllY^%>o$#? z8wW1@hvdjlVy}n;{{V4foC=At-kW_hv*TIq?$_&8M)v#X_mhVPV?Rpq&q%X9f_y{- z4ETikH=g@^r48Qz1I*9NH-YzA)A~h~>@eh|BXbEhp+k^gh!h*~f;xTWb6)U;v1FVn zb72*HWH0&LP|l)4a0_F}Nt=ZUMuUM#uo`S`P4^3{%RaW}c431}QDZl?J2C zgSk^U;5OL8TQcw{dqTQOdn*?w$L!+Zm=zV8^wwdMYcm%U-+bTe`c4l;l!9M>4MC;? z6{SfZ)y&(AqZmJ2XE^gNBf#`&oNf8*oitIHsGdj_hGp%nwkN}LjPWfTiD=f!Mbggm z2-*mEwsRWnwzhZSMQbYvu@yWEcUqg<5W@2f*xW#vc_AiYJCpLfS=FwLNwhuaq8zI< z8(duu$9OFVG-j{gfAb`})-J7w% literal 0 HcmV?d00001 diff --git a/__pycache__/headers.cpython-36.pyc b/__pycache__/headers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b295729b4c0ba5a639a6879365097217d84abda7 GIT binary patch literal 2666 zcmb_e+m74D8D2ZFoor(}w=GaW*oz_#R$7vh)>bx2qa&BHII<{;BN7XwB!?>=hKGoh zD9&{sqc6}`+S|TE3-qf0Q0w(JK<*-e#LQskKYai9f1LKqm#6<0|MNF=dUEowlSjYT zF#ZXi{4ek#C*%ovNlV{{Pc>(_~$d}}l{DFK$UjE~ibwXY(Pu{#{r;+DnO`8UL zkNtGkKxuK+Zw$6}Le8%CKb-Y?XXlMGIZZdzYYhEu8hgiek+0Va!7l!|#Gd|DV7Z#I zfKvOS+Y%bz;2S0eZ@I8Fkn|Kk-lRU6x%81;nY>a$o zEK(v*A~^3WVfI#u`8vs*c#<#Ih!Jc=hD-}gT1$(42aaS;|X=yE$OC>RwwVvL(u@S?=>`AY5<6dmz166`DaN5(%lIYIF2Mqg| zje9%rQQa=fz*_sIy`K6+rh6y)b(|BC$o^#=8}5l@EV4Q_h)EswOLbTV=GqW!xx3;R zI&DMH*DBzn9#kE$<9p!Yz>~F>deLJXy9SZ@-g~?sV;R?eciQ9Fs3Dk@a;fU3h*$*p zY{35FfUbpHNwmE!8N1arU?dwAxu)Y!Sfkv=#*U0>1hEH5--u?|uS~WnEO|=Rr68zm z8qctDFk_`q^+{-jW?Pl5z`{z&@v~$@f;!TbWI){}xt85`Bno<`MJ?OJ+NAf|Rv zB?w5GL^G@f+{avZyC`0<`ACt>aKpGg9;1UPb0xq$0Sss^&PIzIRb^*3QgYRRoMN;m zP-8ctBS+FG_hlF=CvoY>6Tt!wIfh1oLy#NVTk?t%J2m6p80tyQc1?KBgNR@xETmpk zb0zizM-Y8)sDKZRl9-0p>fw9@9NYqL>%3k00KBk(cjC%h59$~I3ud>qz01!hh`NcD znUe7k<8nOxuolDtuI+!s{-Yla?2YUGaOFwY;dPk|DyMB_V7K}d<1{xh+B$erL0ttU z;do3!Q|gIMqAegNsE0<~=ppWutf#rPjyOJ|3w2uZJ`ARzI`ZjUH)6FCx`>UdnXZLM zRtr;KN!C&f=6YW=r3Evwd9bj_&)?gk15-NI;CHaaW3K!0-d1es;FI|Q@TG0)Jg$X= z!bJfb5z$cSsuBoPY(*wEsD+PpH=(YOKlDEW-e{F09iSh%o``#>V_hFTQh~!R&qE*q zXam*oY$XnA-o+Epx^Ch^AA#;6U9_ee=!Y7PbG{EaR;g>T2WJ_%1`c6yn z`^RMc4sczxLX~s-paz0qGA*3pF~qxq_@feG6sgiAR0lf zdplFAdoBdLyJ&<0wGty$UUY$DbS{sJ`KT{~zCc~46k(-ff$o5|@Y-a6gJ@x`*3IAk z_Gr8oC1`eG!*_z`$ZLn$Do4YzJsWLuh~=<`e4%Hzkk2h>-|?GJ_lv<`KjiZ}h2{Qqh$X6ojF-sOwdOke$i(i-myRXMUmy-U0jr9*~;v# z9jCjb$mlL_xoON!-EErZ%{(YP>vK2V=6BD$I4dgl$H(Vf-%b*bcKDGC*3F9MKs(Qh zt6zQ)TD@~GX|9&__#KSv!P|2$uLqas+g&~AzIkeFYR67r`v$l7mvFans@8LWy5+t z-v*l?VXu~8e&QA2VF|fCo~tSOzxl|^i|sSGy0OLvNnkz3@Goc-#D+ zCtJAE9AEzxhu_`s5c8WpiGw5n19p*aZ@^Skq}ffm|2gui{O0~_E359l_&!d_j(R^n P&_kO(FSBm_nVOwKu*oWX#}Iaba2 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 OK<8g?|8uK>_WuH9ess+M literal 0 HcmV?d00001 diff --git a/__pycache__/headers.cpython-39.pyc b/__pycache__/headers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17e7174fc0f482cf01e94e8c365e0bb4bcbcbdae GIT binary patch literal 14759 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 Z#$WyWKi_%(?O*@ZH?Qjdk9Yp@{{lm~Ap8IT literal 0 HcmV?d00001 diff --git a/headers.py b/headers.py new file mode 100644 index 0000000..e69de29 diff --git a/l1.py b/l1.py new file mode 100644 index 0000000..d1c0ab4 --- /dev/null +++ b/l1.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Module: KEYS-L1 +# Created on: 11-10-2021 +# Authors: -∞WKS∞- +# Version: 1.1.0 + +import base64, requests, sys, xmltodict +import headers +from pywidevine.L1.cdm import cdm, deviceconfig +from base64 import b64encode +from pywidevine.L1.getPSSH import get_pssh +from pywidevine.L1.decrypt.wvdecryptcustom import WvDecrypt + +pssh = input('\nPSSH: ') +lic_url = input('License URL: ') + +def WV_Function(pssh, lic_url, cert_b64=None): + wvdecrypt = WvDecrypt(init_data_b64=pssh, cert_data_b64=cert_b64, device=deviceconfig.device_android_generic) + widevine_license = requests.post(url=lic_url, data=wvdecrypt.get_challenge(), headers=headers.headers) + license_b64 = b64encode(widevine_license.content) + wvdecrypt.update_license(license_b64) + Correct, keyswvdecrypt = wvdecrypt.start_process() + if Correct: + return Correct, keyswvdecrypt +correct, keys = WV_Function(pssh, lic_url) + +print() +for key in keys: + print('--key ' + key) diff --git a/l3.py b/l3.py new file mode 100644 index 0000000..7e43c4a --- /dev/null +++ b/l3.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Module: KEYS-L3 +# Created on: 11-10-2021 +# Authors: -∞WKS∞- +# Version: 1.1.0 + +import base64, requests, sys, xmltodict +import headers +from pywidevine.L3.cdm import cdm, deviceconfig +from base64 import b64encode +from pywidevine.L3.getPSSH import get_pssh +from pywidevine.L3.decrypt.wvdecryptcustom import WvDecrypt + +pssh = input('\nPSSH: ') +lic_url = input('License URL: ') + +def WV_Function(pssh, lic_url, cert_b64=None): + wvdecrypt = WvDecrypt(init_data_b64=pssh, cert_data_b64=cert_b64, device=deviceconfig.device_android_generic) + widevine_license = requests.post(url=lic_url, data=wvdecrypt.get_challenge(), headers=headers.headers) + license_b64 = b64encode(widevine_license.content) + wvdecrypt.update_license(license_b64) + Correct, keyswvdecrypt = wvdecrypt.start_process() + if Correct: + return Correct, keyswvdecrypt +correct, keys = WV_Function(pssh, lic_url) + +print() +for key in keys: + print('--key ' + key) diff --git a/pywidevine/L1/__init__.py b/pywidevine/L1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pywidevine/L1/cdm/__init__.py b/pywidevine/L1/cdm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pywidevine/L1/cdm/__pycache__/__init__.cpython-36.pyc b/pywidevine/L1/cdm/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87b1c6b8547c09f9529337dcaf284b387633c656 GIT binary patch literal 148 zcmXr!<>lHK_9lh_2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CUyjaJF`>n&Ma40W zDY=<>nZ+eVi6!|(F)pda*(Lb}G390P*{PMqF$I<7nJKAdnR%%($tk%p@$o>lCGqik W1(mlrY;yBcN^?@}Kt>k>F#`a0)h8JM literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/__init__.cpython-37.pyc b/pywidevine/L1/cdm/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fb722d2c7500924ee92094609213c60fef1daee GIT binary patch literal 163 zcmZ?b<>g`kf{kHsVnFm`5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6wq*(xTqIJKxa zCaW|r(>%r{wK%&ZzaS>u)k)XICqBgA-zPYxJToP=EHf`PK0CFtIHsTy#*ax($&HDR d&&g`kf{kHsVnFm`5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HkvsFxJacWU< zOjc=Lrg@A@YH@Z+enCvQtCOyaPke~KzfW*XURq*qRbEU%WqD>wYFTDpYD{uUZcKc9 dW?p7Ve7s&kg`kf{kHsVnFm`5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HsvsFxJacWU< zOmJdeNoHbtevC_Madt_5K}>mSl5R>)OnF&+c4}pDOhILNW=d*VW?pJca!PJYe0*kJ bW=VX!UP0w84x8Nkl+v73JCNa@ftUdRC3Tx* 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 literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/cdm.cpython-37.pyc b/pywidevine/L1/cdm/__pycache__/cdm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86f23ef330bf3f8f9c26f54a10109d6a794bad80 GIT binary patch literal 10287 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 Z0tL=_B&kq?gf5Xjgx?bBg!rbE{{#GwBYXe= literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/cdm.cpython-38.pyc b/pywidevine/L1/cdm/__pycache__/cdm.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6a46a153c8acad21631540503859446e02189fc GIT binary patch literal 10325 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 literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/cdm.cpython-39.pyc b/pywidevine/L1/cdm/__pycache__/cdm.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c25ee341be45aa33e9c14f12ea0b164e184d7a4 GIT binary patch literal 10393 zcmbVSO>7%UcJ6LA|9?fv`m-&!|IHa&Bg-DojMw8?jU=zVW6N5}p2>8aX;7?|)HKPa ztDEwux48)72@nL>#HXAoV1eugdr3|?<{Siz92b2J5MY2sE*s>KQ@&T-q)3it7YGSf z*Uzi!s#ov5`ra#6^ZAT~&p&?tyBB|dPm=zF3d5fm3O~fp36L;}$qh*lpRz8CvZ5>E z8Pj8UDh;(6*W)tL#2SfaQcsG!+DJ9idPd~qjchZg=R`iy$TtgmLFAK-VzZ=|L_UT5 zggzni=|;IZsZTbi^eIu!G)^_A_37q}KGU4lXPa~SoT$$>=9{PW(;}a1oN1ob&x(A$ zvCurHpA&hxq3PO>BvxR>ZzNWHqv+?Eye(Bq-(r2zMnw*?Yi7-6<~rv#r=n|q?Hao_ zZ&qCt^REw#Hn&}S*=X-9qawL&I*w(xkd1w29^z5jGhKsMTg+}6JBP06pe_-XD@u^r z{A_jmrtx%TeKUxytZ!G;KwW*ZvKl0|AFeFFehX6S6Py!P!nfqmccW@vMh&ZlI2+e&lD@N z5}s)`!OD1MSPZP03Sz6QS(As}M|pbXDt^v15?AWUu5u*%k`c2cq$-opRofIO59g{mRwyQ1I zs_xk@)=cN6Yqwv#Hg|5Y#tUr8OY_iq(LQ`_G4sG`nJ;RrNx#MRA-&3KS*~Hs&}3C4 zlAM#h9M-hhZ`ycJi&I1N$>Ev6Pb}|$knyED7RcnD;>*5rgoVmsU5tf!rLMBrONH++ zwHFuMmfQqOzLD3YH}a9(jk8oY!P4ENANLb8lAoNBx+y=^OR@}FQ>|-0jgZ9%o|~e6 z-L#)ZeM!7I&2sccmfx2A82_c4@nde*&Fw006#h#;*3Ga2Se_^9UcsmLWmu7F{0#p$ zx9F$*jIa3W8?~Dqj940sn8iCve(GL-MH6CmDQsVP!@Fj;&6W}E%{9SDR&}e!&YjyI z|FnBuBYxLRWW5=p#5QX!^R))vYf&dX302^>#R6$Wh7|CXcEh3HtYGq=mAW!X5|fVP z&m~!U1rf$H6uq?a>FV10gQc6xw{E|G=YtPF+NdZzg+4)|wr^tsP%LF}DUb~zGhs4M z?df}aX3PA#&F^a{{vJQcyGUC9|4Wco`8{ zG_%1ldKMDa7s>Jc&JFMDX-v&oMk2{m(D{rqE35eCC@-hvL@b9=SyAPbl93a5mK3VV zkbNkP3rURxw*MgpWbqRg;$M&k%t5qe z=?kg#l`6T(!@rRs=E9axpBS}yXHM?bjiJ{C(d(~WiMQ{=rwEWQh&$g3Av{fk#BupbgiU#m$=AIQ&+_TD`mD zGF^3USk84V>i^nu_cd-d?E?rkNszWrP<#S4tL~Z4?5In|X*VpFnW&QD5WZqkI5uo zLa&eUa~6OmF0r$O^IV^Oy5RCkETuHCq(ZnWU!fo!|5m#JF4j) zO*oV5>Vd@9=-G>tC=L!UA#hB^u@d%((*YNb!4lg-peo4??@X;>J7!n$fe%jSqwu^o4;CQ%%rb^;?1NjwH@T-)NnF0Q>+rLu6 zO?aPb2^tKU`TWQX2?RN0z$Gx1be%L_Rm!qALF^r&tsW3wUil6@;5 z0)x{xTGPlV(HLnO!!7nO3mBFOVOYxDMA+(!8NQWYT?gEW8D$2*Vob6u%uH^>d(Qzr z2B0J0VAM?RTDw-Q>YAf+bzP$-Az-J`!6gBUI*FF3lQ-L!CyQy!Hl5a0S2Mr199PJc zcX_vJHDFi7nLJP4c&Ym!YoJn9v+f zb26qSv?mnrG->?zyko?!60%C;Cv<-q$TX640s6n!uFCwwNK1xoX{h-MS`vKAP4-gI z;aDq$T$*xtX2>GA*?O**2lOx0i$}8a7tu&U|4C=vQrN~4ZaX$_2 zFB13PDu*~KhU}$qpuU84|AYK5-;~}e&i=>_sP#qgRoLffcIBbjO$wX)UT=wjTkmFM zb2A~O55CG6@zpQfWi|x|G8;W}?ycT!KkMGAzwhUcV%@x-@7-}f=zR!T`shevQ{>Ke z3+~dV9q0M{ndvz9;=jUon0hxvX(^iuy!n zE1hH0RCYhZJRuvj7R+(VeT*_V)qCPkp?u0e1-aeuV;Jda#M2qkkNBw6pMEbVW3T>8 z(8t)Um}_`;&h->`v-cA}7QQdC3!;S6Z5|++qCX8BZ7m=sZocZksTn=lD&7oe#DNyk z0W1qTZ?1osJz5ionLtQGr`fwL8(_*ZTdoF*orb-mRS$5$2@ey9S#$T{f`;cyfM|qw zIikklIDT^BY!iX3ozAW|yVJ266j;*6W~3J%KU!Vi*j_ib)_?MRefyc7eEQ(Q<3}6o zK@tx6%Jaw1^w`Gw7kYB_`PSC@#4@5*uh4^H}%=pfSQAkwa!gbuWZ4W|R|hL6Ax+k)oyS*~Ffh%$p&&Z~`B_(img! zdNX4+S`EAqV~jW8M7^s4X>a`zB=8>Q%>^8Y&icop7;c5qwN-tsPlX_0v_YR*6*BdR zVG$wvKtMB4Y$s6LRd*l30|Hczo)6h!)a=%-wWlxii=sEh9Y`XLT>vf$?gc9O;sT41 zZ(n604$1cYET9fO{&}_0F*%*Nd<}`7UbVrZw(`eMk-+zeB{g zh&UUqg8+=4j+TiYg|YQzqoxq(SS>eDU8`y8gL*0yHz}-Jvm2iy)`<1%(~gNC1-6{l z>vFqcv}}Y*!njkKA{ZjHq8AbNrCEbwLl8Wmxy2yGdgcLm@lc4hJ{xfh^`m^!v&J#m z7z7jX8crelAcm+%kb3fTZQWS?bX8AAqRS^lW4p?NiEWcx)rRE_d{|zjsiYyHaIY~< z0mF3I=y4FJr#Cx04XZ{p1cLOl>!HS&>?GOH(|8r(cQ88_zICJ1+%dVn5H$<|%#rqq z?~JQYey8fu!BFL92sbe^$Ur2g`l(1G#r6zLpnf{y@o?)v95YelORTYgHFEM05o?CV z25HiZs@vgaPy`!>jkmzjB5nYV6XcyfhP?bCjq`#SmJSUFv>=doQR;^T^jv>D3d-pj z+Wyec>1iPfbVDGJv7V()RnwtGA-;%$b)aYHS+m-(Ir=1KKxWKDO<(8qvJ<&dZLx!* zbD>`sb(|RLh~a4bxuL55SmDh^5JP*Q(j@gXaYyiF9Jf!NaL#=LMmWDfBK+LKr7VyO~~=f_8*GfHcXw&mI2V2+kB44!E`v$&3+XAYMT^vtu8coy8bI=yAuoo5q2SGq;N2qY+Q zD{^P>hSG@?z@EU0A;rXr6yka$q9~t80S{p?#^i|Mn>if?`f`&#`H&bH<+`#2a!^%p=5-Gl;g$^t2<% zJ>R>4_KVo<@H%ORxIr~9V?f8`M^Zdb;86Dxn`86v2et03Kij)JDksMtM=SI%{%P31 zK;P4%??TuY9su^0W;E=pL_L2u+%uYi@b@CQISV9wg;rI+N>^NBU7~~#^KZLz{#^YU z=Kdi)yYsDCcxsjUJN0*a*HLo=sC$tuK-%U}y4pRB^u6wxahmQ~cRu1~8Qh$&FZpNK zxu3_n3;qIR^fdaP^UpHvrGhv8c2DYR80Tj9ynnv8EM#7Lp>!{FFZvgmDrkP~YrR|k zh5Bup?c3O^U%T)7+8g9ss^}f7-|5|Quln=;S>Yj_W9Q*NYH!qt{!+w;3shzof%q?N zc#BcEsE_(b(f;*5q>ir4Djp800T>-bnxaF(1LzRf$tS}9^K_TR35ZtvqxM|~ZP((C zd)}*zh1UmkH?-QmS$jFa{EnB3-g(ypki#KMuoafy(RP8d`nPwYhHg66H&(a4+JTrht;5&VLoW}WYT}NIX6MB_?(U5bu?hu;d+F)s`qs*`r(4GM z`t~+>8~PsQNJ1zA*=UF@2xEaC{Sgm_K|p{5m8FQedjM5)6{4Y(N0`pAy|B(Zy+x5T%4`!RcyVR{%Ye(em^h=0p&@O1Ce1 z5+wok)eX2Ip>y$0*yn(MPMHPcX`2+u=ErN=gg{zC_Z&U*82-)!%WNj#AkVIv?LMF*LJATXO=nNfK^2HS z23=L@d7%@7BEfxu+cJatoBDBnc_@EtD1Tc|)tc3sVeiz#@kI%v>P0b5zX;_Ut5_bd zxHVpJTc0`}qh>d;ec0cdC)O_OWNnOn%!SjP6*q`=30j`T^!zavMGd#m1`my*(m=ri z`NH$;BVU?)7P~jttT+|0XUueJ+-hS}gZP1PE5}03#W6$u-*`_1S8+YuhpQs2tO9z5 zfo2LP6Kn+d1dPl9Rw4y8plA36v?S|% z-&|2P9#pdY6xxG~LH7uq2K^N%XBe+wxx+sOak{+cA5cQ~r~Fe&eoRS~5}%STCC8Hx zIr`TJFC(FNzPJPgch$^=)I=(qdNt- z{rd}Iu3j8#70$Xoef+$z(+MEHSE($K{8lXfFW-3zz)J|O~!qHC#8eS{*BGKAlfJR9Xw%KrgnHY3si literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/deviceconfig.cpython-36.pyc b/pywidevine/L1/cdm/__pycache__/deviceconfig.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c9dbb61a88a71e9cfe113b1bdecd5f3bc8aa566 GIT binary patch literal 1870 zcmah~&5qne5bm};ws-z#lnn_%(TGEok)mASfKY;h_6H$Fia^8h>mFTj;Y;31IcD+iPZ;KGTjws&WC!ww!*`EynG*FW_$A9Xs-hkyO?&EHKz z{v>Np2>2O@`UDgwoMt2<+~F?wc!T>q011B%A}Z(+jU2uexnB_8`3H7rpf8BHjI=$;b}2S`24L4LrqXSUhR(qxDELpsW(=485!nlihX>Kc#bL&Wo zT+1S3d66d~3b=gN7 zdX(TyeDLjq?0~4>DIsT+)4Sx1Fhq_;6p(9?1IV+;1=O&}1LRxO02EjR_kKo?eW`UY z3ujwaH+Acr>Nbo)e#*nUsh`&@7H|4Zs6q1Isty1mZtDkRF6s zHc(-}Wq=AxNN%Bm;v%L82{|pkXNPGfFs~!OGMHOc_OV1rz4AiVV@_JDxmSOz=k_Jf z@Li|5e=$2tMXs?prdcsvv2XvU-`uIqP%PIb^safvL##`?Lp;p?oZTsu@yb|#YrI*J z<|g2&w6z^FyC=p>d;iPldoS7kSI>9%UdT3HTL)DaRS#7k)Yvhe64{~gtHpmI@_jJ> zv$yl<oi#xGb00FxIXKPNIUnMsJ^kUwN29f#Xuq$v#oBbGGg{kv0$nyo>w%ENdkkII zKP==t)^Y$lyfLn0D(|2lZ@*Ia0O18nQA)->hA(9sA${jssu2g{1`fv)LHL`D%?o~# zA#OAF-ASBP9*ON&-oISt>VmQb4&1213JhuZp|y+~5+i7CR{>_%{(hoCWml^|2>Bk2 fw{zEyWY?w$uibF|NP#}Z~nYL{-o1s5@`4S`s16w z0sV;|=Pd;A7`lE4f)h?t5)tljmwUXyeI7s$e-0ul=pl_9z7@Hj65iykmxQ-|bRv(_ zXJp)d4YSF9)QdB&a>?1D$b^!~$*@+8bUEiTA0>SD+J&Jes10B3jRWIl@l2Q&7dlb0 zC}p0Rt`^B$$#Th3u@I^0X`wY37?79CLYVDB$wgcWb}W`GUc@qur>QXRVpf=&T4dZB zk~}L_p0X^@5)lPlEMx+!;BL>G1K=@q{SF90BFYJzlXB-JiCnw~c*9-5DSgx4wFEnP zb|4QEoQVzJ0rVZ{`gcmmDdqGwIVB8{V-W@9TI2xoEOG%gEb;*P7Bv6`7Qwxr(qmth zWpEU}+Oo1)w$5nThB3%bd3c+gd9Y3=8(lYwZ&f3B)3W_`-8f)t)@AuLeyhSTCKTLf2_y$ z1<&wJqq%!NJC!0UF*&AbK3%bI|EJyDs@0GzS0?nXSjI!lOS?ln%>SI-$+hu{xct_5 zN4d;Qz@@Ue9WuKo#!P$fv!_pmiv^~;o)pU$5@%#$0;OhBO@<->>H45p8rX)+ zWXaeN$n<>>gf`b7C#3H=qgpmCUdfZ~-L>?8aL$!L#@mK(3>ro8qobSA0o=xKgrfP@8M-V`u>OeqqSOSzb}`=T6L)+THSi!TogrX0awF&4As^@ z$ki+^)c|&Qtv|<9-9kIwdL`}v!V6TQP>j6~U)mNx`o^_XBlgD)9F8Xfw>KG^<$RtZ zZZr0L9;cN>VcAu8FP6EyplX2uH>xr7LK?nnHRFat4@NgD2eT``ooG<$_3Fo<-h%OV e?%I*;TGhEes&@A=`cU7%wOog;p3wCj&-oY4-|lt* literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/deviceconfig.cpython-38.pyc b/pywidevine/L1/cdm/__pycache__/deviceconfig.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec802c1883307aa55f1e6bc7a5838ecd77650649 GIT binary patch literal 1932 zcmah~&2Aev5GGfvm8^dWb(%Cqu;`(vfYh*&772o+2x{3y0mClp1O*lXh?PhsE3bC9 zjU%PDq zvpGE^{l*(uP4>N3D57{Cvvl<0?&jx{ldY`prvAuHwl>{KAZO2gDcpM-TN|5hI1lf* zN{o+XkS^R%%tiR71Vp;xM_k4Mf4tkTXgl&}Lf5%aV;LlA5J$STT*S;G-Bv;=FtC8L zbdd;4ScjqZd0;OQ7wE*s(s$To=jlM-@DIlVzn z2}5KVL;;lyvH;lzl>n6uvH>{;l>t=@g4a2vM~+O>%C!1=&FETMKci^_<{&@i)f?o@ zhJBimd(|wymd)Tb!}iBj^MI|Ev$a;R)eT#V!x@g8pQ-Gv;A`Z3?G=1Y!`J4moNu&( zua)z4R`9hAUx#;czTa2yb#lJ$3cjx4>v94y(A$?bJh3dJa!}!`OH4Gmh6)o>w;?b` z@e4KyAVna)JtrH`?`2WQ#zLkSR)~I#O*5)*=AB}UpY!zIHR@Z-)nOo_6q95W#-j`N z_5ZZ%>-jJw&07oFZ&~_1%ujPdyv+aH-HMgA6F+^X?P(lDy21l#a=gmSnHbZJ-LLm{ z4%zO(-eBij*+927QMFLDQFTD|Ep00iPPCJ4{wt9m!0^KprG*=rt+H!9 Y$PV`fKB2mXTa_$Y`2FqF9Lu);1@heeasU7T literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/deviceconfig.cpython-39.pyc b/pywidevine/L1/cdm/__pycache__/deviceconfig.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e234f03fc97e186e6472b6e70ebedebdef05cf9 GIT binary patch literal 1894 zcmah~&2Ah;5bmCtomtQRudqo7idGy@R!VZp0U^MS-jD+DbTB(_xZku*yXO`~q znsuBLc>o@OLww}QBk&MN^pyk318{&7RXyYN*uhJ$s^;se?yvu zeKKypf!Sm)>ctsXx#a9nWJ1a0bXXZix;W-CA0>SD#)Y9Ks2pGIjsxRm@l2Q&7dlaL zUdTK%T`iJhC5t6X#X_W}r-jzwU_f3h=fZ5xm0ZMyV9&*p#fw;`@iZ02UCicYON)$K zN0MiS%2Sr*St6okX^JqIFJ-HjF`j%A2>zxd-cXve8YW_(nN`hnDTvo5lfKSh022u(d2(m%|{WW|&%h%`qitm>-eEo`Vu!e77`39Uo3=H>_ z2T!aTsC-oT>IzdyZJ@%GGd&2*Y5qMskg34{N=Zz$BTb`Sg-~^FRIOR%M2yxi+D9%`+Zie%c-4VgBdrPOgnNkBe`O zca+P_1Y9bc<4tDw#F%OCe*WyqKHL4`+0K(MRU5CZgQ|1>=;jr^uYM#;y)Ah z9+>}my8ZFwYb}(X?8jLloS@ n%~p4y-i7gYZtX~Rt@2!-l)L*3-%xMiTCPKDzrX#^cRc4`ZYT6Q literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/key.cpython-36.pyc b/pywidevine/L1/cdm/__pycache__/key.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5c8a7a0c1a51e1aee35949f8e322f466c513b9c GIT binary patch literal 811 zcmaJ<&5qMB5FXoUT1qRpA)yu8<3?KTg&SHBt7R7wF^$0HrUyplyGWa zh9j@zD<>qLfD@0!$Q{3)8f&#_n5W{m& zT!{@RvF0&TYy?s89sMwv5N_9>*nPBUz?%^B_b|l>#WyS#N~mB1aiCh5A@t&j5ej{ev*j`O? z1Gn%N|`Oy<(%}Mlpin0^TuN-iM>NW p)b9YjW$90%$vYZOhxNkR5^>w#dUqn~1Wk#@&1+9+R*sT%_%Bt3xk~^5 literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/key.cpython-37.pyc b/pywidevine/L1/cdm/__pycache__/key.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..736c7e8f7bd909004b56df3ca9e43f8d1f12c863 GIT binary patch literal 826 zcmaJ<&2AGh5FXo`O$e#rhJ-5AV^=D@A|XJ~HdKfzLEQpUw2~EK2b`bHVkf|c@zKss6L5Te@gupx0lv|p8UlrfxZF(y1&U3e z2dAL85-U*RGw(6QVu*t8Xot>#uo{1S_fVq&Z$gj1h9P<=zG6M0gbG&B3semwgkC(= z`JndOn|6E*9OH7k2n8!ZLctMPArN^HAPNQO%sNrv#n>nx%=1j6sB?cc({^f{Gqco1 zH6J)V8CrUj4G1WM4H3S8ZQ%Cv^!RS_+-d8Q(IPc>k`wL5^I4X>Y#-e|Ig=ON?pd6? zH%h-Vsg{_*C0SmblYyEhs5{JZ-;mOzW-cY=aTFU^Sk7e&YdoyX14bqswAXQ!#Xd%% zfDv*%=5}B4ODueZWshJkF0tfMZB3eR9mLpye_7W8EksMu@z=Z0+UJihy5}-($MKVH zXL*3H+()YJfBbZ?M{Jb>D$9L~GdxGj-T&NMZ%*z!f|aVOD2WO8SV7dIGG;Zt;q)jj@AG#G7ey}3uVDrR#n`{rLSB`=-_%92U By_f(1 literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/key.cpython-38.pyc b/pywidevine/L1/cdm/__pycache__/key.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf488d4f5c2aafc336c40e330722be98076ffb0f GIT binary patch literal 835 zcmaJ<&2G~`5T0E-P6&zMR;j8`kF`{KMM8iIZ9s@BL3ImKWN8($8`vav%x(fWm=k%B z=E#xP*()a`o`4fG4gnt!W9{eJnceyMW-r_ACZK$M@gv^h0N-d+6%RMZxa=;11j(k* zhbJJp^j09f&%Dnhiy-vBqaV6M!m9kazmHZ0cpCcrHH`3<wD1q~y zseD+gL?9gtgA-hK520WM2q-urD?CJA_=uha48Xdf@4ShY&Y$O*LRIDNdZtXGt<|&C zhBfC~H60l$%=iS9!2}3jz%=mp^Z4X$d})=j@pzHyJMpQqlld%*Uv?hdK0Ol`z1~?A zr=vl#OyewnucdmYQxy+o5@WifEO!kdbgJh$i|z$5nRv z7?lFXNce=C1Ie$j>oN8`hPiiz{f=vEvIJ{C!ZG~IyY|pSocLXLv-iAn{_vuAE}~8p zJ?(Xuhgj(W@^t^>r^9`ss#MTe{wsvxK3wko=X4m>OCDV?nwexUFPU|XS2`Woq1LYc zMtzv-QT~_bkQwT;Bzptba7&~al^G%EMOqpNuqM03x0G$1U7R4EOb3Y)!Zn3RW^yql zy(Prk#bCPe7z$!;5D@(ppj?Jt6ukgT18T5VP+CH6+FNhsMj2pJ;=N6_2Q({7K^puQ DcuTst literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/key.cpython-39.pyc b/pywidevine/L1/cdm/__pycache__/key.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed7d9d095d9d4aca416c9b08f32dbae6de9c0203 GIT binary patch literal 833 zcmaJl^YpizK+EB#bcp*07U)hbo3@PFbs@ua?r)N)I56@(H8ip^1gViD4 z^Z-?Q^zqZ-J_%Jj7_9#dxo{q=_WrXv2->xZl|Nb7d7Rg}R-JQ`#%^p()qbZxBxX|l zRXJdm>a3;S!VR2~XjW%dN_vlu+5xP~?(v;u+vEWIhbz-~uBEKHQqC9ZG9kYw<@?Jx x*=8(}*jof7e*@?&OYe#L@2Ei?*7NH~z-@n*ZS1HCwpV<(J?)r!<%p!ie*qhTyEy;= literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/session.cpython-36.pyc b/pywidevine/L1/cdm/__pycache__/session.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86d768335681dd08f1eb0e1ecf4f4d860fcc6bce GIT binary patch literal 705 zcmYjP!EV$r5Vf7`CQWxmMLF^Vxl{sf2%(}@aN7fIIjkaCQ9LPDv&q)>ZnY@4_A~ea zj{J_VT=@b{%s5$CNAv6%&l^8`@@78Iet!8~d=`xTVh1C_^*Ne-j_`>oruY-uqgXN} zu2>#b82>krJ!HSY1+XPoY$+61;)yLI6=8ntlPj=RcWpHpX*9=Z7ijhxq31o5tQUy9 zj}b*5Ax4TJ#sMcNB#8M=JJS$L0;U0v6tS~gVjL?*LKk`DBWNo>EjR9~d^OImKjt%^ z*+G-k${*=gJE=-n`lPGtMz`SS3bwieS#@o#Z+$kpcd+xvdn!3I1x9Z{Np!4#)*z>~ zAPwAaz&f9d0e@=23%8h#{Ugu_otuW0@#Wxwi1dfam`kq^66t0&eX*MhoQqAMeOLD7`uv*&_(Q756a9=)3*60pAYkk z_wmd|rq?93vOBuejZ|rq+MvqwLYH9Y3a)epGONm5pWA3~FJNnTM=Cip1+~5cCDAeV zQGuM&fUM!N1=HAI2-tlCb)OLGM&~+98?dtta?@-p*Odb6Q;K+EeFH^a(;L-Of{-9U zxMel<WSIKA0XOi!2sb40?U@n?!lYD)5`0V&Zo}HeaER!FaB$wcXC7bQ&Cz)C& zLj?z$tqrAgeLI@$c&`Y(I*cPOfB`b<2#Wd?|vBrBG&=GimO8$Ww;F`dQ??fZwH;=RY%4+?h8$KW-(eTZ&+KU+6{@h+Yx{k-!nUAiKIi(d9eydu^wboLk6m$!5P literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/__pycache__/session.cpython-39.pyc b/pywidevine/L1/cdm/__pycache__/session.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02511fa68e9117fb50da34be489b543bc2c0f5d0 GIT binary patch literal 725 zcmY*X!H&}~5Ve!E$!1%DSkByYU?n&rgb=%eTMu;MP(`v#JSo48BcKmY{3;<1d6NRmMuaRA}4b39IVw%U5t*Xw2sg((CrmM$2%ri z7a;O3LJYbPF;omO@;E|4UepiT8T(x9G4Xh!h@CEpajF;zo@Jp6p)TB5ZrZQn#W25o zpG{n9dtE{+ccN?E3ME_V;-)MsU4xq{*y;jA(bT10x^xJyVed{4R0<{vjNXD07+CkH zLQZW#7`WMhZCyMh+?fT_7X;JlQWvrXH(4WB7JIR36u5{=WFr?@s7ga`WX1#uL5%Q| z8S2gNcNeenPgu|9b6K}qE}Q%k>~-6$^BsJ7uBv>u^?LI4ey2%!4SAtf`5^p!y?2Qa z{?>w;XrCc4KK?g?faCa+j1IYPkB3H{ABZ#TE>@}K3WRW}pi68jT2F+y*~qHjG4ykI l-A8anIZkJyTau7)AJ4LWKKhofY>42J*ZmQ1i1mQZ{sLztxAg!3 literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/cdm.py b/pywidevine/L1/cdm/cdm.py new file mode 100644 index 0000000..8840616 --- /dev/null +++ b/pywidevine/L1/cdm/cdm.py @@ -0,0 +1,362 @@ +import base64 + +import os +import time +import binascii + +from google.protobuf.message import DecodeError +from google.protobuf import text_format + +from pywidevine.L1.cdm.formats import wv_proto2_pb2 as wv_proto2 +from pywidevine.L1.cdm.session import Session +from pywidevine.L1.cdm.key import Key +from Cryptodome.Random import get_random_bytes +from Cryptodome.Random import random +from Cryptodome.Cipher import PKCS1_OAEP, AES +from Cryptodome.Hash import CMAC, SHA256, HMAC, SHA1 +from Cryptodome.PublicKey import RSA +from Cryptodome.Signature import pss +from Cryptodome.Util import Padding +import logging + +class Cdm: + def __init__(self): + self.logger = logging.getLogger(__name__) + self.sessions = {} + + def open_session(self, init_data_b64, device, raw_init_data = None, offline=False): + self.logger.debug("open_session(init_data_b64={}, device={}".format(init_data_b64, device)) + self.logger.info("opening new cdm session") + if device.session_id_type == 'android': + # format: 16 random hexdigits, 2 digit counter, 14 0s + rand_ascii = ''.join(random.choice('ABCDEF0123456789') for _ in range(16)) + counter = '01' # this resets regularly so its fine to use 01 + rest = '00000000000000' + session_id = rand_ascii + counter + rest + session_id = session_id.encode('ascii') + elif device.session_id_type == 'chrome': + rand_bytes = get_random_bytes(16) + session_id = rand_bytes + else: + # other formats NYI + self.logger.error("device type is unusable") + return 1 + if raw_init_data and isinstance(raw_init_data, (bytes, bytearray)): + # used for NF key exchange, where they don't provide a valid PSSH + init_data = raw_init_data + self.raw_pssh = True + else: + init_data = self._parse_init_data(init_data_b64) + self.raw_pssh = False + + if init_data: + new_session = Session(session_id, init_data, device, offline) + else: + self.logger.error("unable to parse init data") + return 1 + self.sessions[session_id] = new_session + self.logger.info("session opened and init data parsed successfully") + return session_id + + def _parse_init_data(self, init_data_b64): + parsed_init_data = wv_proto2.WidevineCencHeader() + try: + self.logger.debug("trying to parse init_data directly") + parsed_init_data.ParseFromString(base64.b64decode(init_data_b64)[32:]) + except DecodeError: + self.logger.debug("unable to parse as-is, trying with removed pssh box header") + try: + id_bytes = parsed_init_data.ParseFromString(base64.b64decode(init_data_b64)[32:]) + except DecodeError: + self.logger.error("unable to parse, unsupported init data format") + return None + self.logger.debug("init_data:") + for line in text_format.MessageToString(parsed_init_data).splitlines(): + self.logger.debug(line) + return parsed_init_data + + def close_session(self, session_id): + self.logger.debug("close_session(session_id={})".format(session_id)) + self.logger.info("closing cdm session") + if session_id in self.sessions: + self.sessions.pop(session_id) + self.logger.info("cdm session closed") + return 0 + else: + self.logger.info("session {} not found".format(session_id)) + return 1 + + def set_service_certificate(self, session_id, cert_b64): + self.logger.debug("set_service_certificate(session_id={}, cert={})".format(session_id, cert_b64)) + self.logger.info("setting service certificate") + + if session_id not in self.sessions: + self.logger.error("session id doesn't exist") + return 1 + + session = self.sessions[session_id] + + message = wv_proto2.SignedMessage() + + try: + message.ParseFromString(base64.b64decode(cert_b64)) + except DecodeError: + self.logger.error("failed to parse cert as SignedMessage") + + service_certificate = wv_proto2.SignedDeviceCertificate() + + if message.Type: + self.logger.debug("service cert provided as signedmessage") + try: + service_certificate.ParseFromString(message.Msg) + except DecodeError: + self.logger.error("failed to parse service certificate") + return 1 + else: + self.logger.debug("service cert provided as signeddevicecertificate") + try: + service_certificate.ParseFromString(base64.b64decode(cert_b64)) + except DecodeError: + self.logger.error("failed to parse service certificate") + return 1 + + self.logger.debug("service certificate:") + for line in text_format.MessageToString(service_certificate).splitlines(): + self.logger.debug(line) + + session.service_certificate = service_certificate + session.privacy_mode = True + + return 0 + + def get_license_request(self, session_id): + self.logger.debug("get_license_request(session_id={})".format(session_id)) + self.logger.info("getting license request") + + if session_id not in self.sessions: + self.logger.error("session ID does not exist") + return 1 + + session = self.sessions[session_id] + + # raw pssh will be treated as bytes and not parsed + if self.raw_pssh: + license_request = wv_proto2.SignedLicenseRequestRaw() + else: + license_request = wv_proto2.SignedLicenseRequest() + client_id = wv_proto2.ClientIdentification() + + if not os.path.exists(session.device_config.device_client_id_blob_filename): + self.logger.error("no client ID blob available for this device") + return 1 + + with open(session.device_config.device_client_id_blob_filename, "rb") as f: + try: + cid_bytes = client_id.ParseFromString(f.read()) + except DecodeError: + self.logger.error("client id failed to parse as protobuf") + return 1 + + self.logger.debug("building license request") + if not self.raw_pssh: + license_request.Type = wv_proto2.SignedLicenseRequest.MessageType.Value('LICENSE_REQUEST') + license_request.Msg.ContentId.CencId.Pssh.CopyFrom(session.init_data) + else: + license_request.Type = wv_proto2.SignedLicenseRequestRaw.MessageType.Value('LICENSE_REQUEST') + license_request.Msg.ContentId.CencId.Pssh = session.init_data # bytes + + if session.offline: + license_type = wv_proto2.LicenseType.Value('OFFLINE') + else: + license_type = wv_proto2.LicenseType.Value('DEFAULT') + license_request.Msg.ContentId.CencId.LicenseType = license_type + license_request.Msg.ContentId.CencId.RequestId = session_id + license_request.Msg.Type = wv_proto2.LicenseRequest.RequestType.Value('NEW') + license_request.Msg.RequestTime = int(time.time()) + license_request.Msg.ProtocolVersion = wv_proto2.ProtocolVersion.Value('CURRENT') + if session.device_config.send_key_control_nonce: + license_request.Msg.KeyControlNonce = random.randrange(1, 2**31) + + if session.privacy_mode: + if session.device_config.vmp: + self.logger.debug("vmp required, adding to client_id") + self.logger.debug("reading vmp hashes") + vmp_hashes = wv_proto2.FileHashes() + with open(session.device_config.device_vmp_blob_filename, "rb") as f: + try: + vmp_bytes = vmp_hashes.ParseFromString(f.read()) + except DecodeError: + self.logger.error("vmp hashes failed to parse as protobuf") + return 1 + client_id._FileHashes.CopyFrom(vmp_hashes) + self.logger.debug("privacy mode & service certificate loaded, encrypting client id") + self.logger.debug("unencrypted client id:") + for line in text_format.MessageToString(client_id).splitlines(): + self.logger.debug(line) + cid_aes_key = get_random_bytes(16) + cid_iv = get_random_bytes(16) + + cid_cipher = AES.new(cid_aes_key, AES.MODE_CBC, cid_iv) + + encrypted_client_id = cid_cipher.encrypt(Padding.pad(client_id.SerializeToString(), 16)) + + service_public_key = RSA.importKey(session.service_certificate._DeviceCertificate.PublicKey) + + service_cipher = PKCS1_OAEP.new(service_public_key) + + encrypted_cid_key = service_cipher.encrypt(cid_aes_key) + + encrypted_client_id_proto = wv_proto2.EncryptedClientIdentification() + + encrypted_client_id_proto.ServiceId = session.service_certificate._DeviceCertificate.ServiceId + encrypted_client_id_proto.ServiceCertificateSerialNumber = session.service_certificate._DeviceCertificate.SerialNumber + encrypted_client_id_proto.EncryptedClientId = encrypted_client_id + encrypted_client_id_proto.EncryptedClientIdIv = cid_iv + encrypted_client_id_proto.EncryptedPrivacyKey = encrypted_cid_key + + license_request.Msg.EncryptedClientId.CopyFrom(encrypted_client_id_proto) + else: + license_request.Msg.ClientId.CopyFrom(client_id) + + if session.device_config.private_key_available: + key = RSA.importKey(open(session.device_config.device_private_key_filename).read()) + session.device_key = key + else: + self.logger.error("need device private key, other methods unimplemented") + return 1 + + self.logger.debug("signing license request") + + hash = SHA1.new(license_request.Msg.SerializeToString()) + signature = pss.new(key).sign(hash) + + license_request.Signature = signature + + session.license_request = license_request + + self.logger.debug("license request:") + for line in text_format.MessageToString(session.license_request).splitlines(): + self.logger.debug(line) + self.logger.info("license request created") + self.logger.debug("license request b64: {}".format(base64.b64encode(license_request.SerializeToString()))) + return license_request.SerializeToString() + + def provide_license(self, session_id, license_b64): + self.logger.debug("provide_license(session_id={}, license_b64={})".format(session_id, license_b64)) + self.logger.info("decrypting provided license") + + if session_id not in self.sessions: + self.logger.error("session does not exist") + return 1 + + session = self.sessions[session_id] + + if not session.license_request: + self.logger.error("generate a license request first!") + return 1 + + license = wv_proto2.SignedLicense() + try: + license.ParseFromString(base64.b64decode(license_b64)) + except DecodeError: + self.logger.error("unable to parse license - check protobufs") + return 1 + + session.license = license + + self.logger.debug("license:") + for line in text_format.MessageToString(license).splitlines(): + self.logger.debug(line) + + self.logger.debug("deriving keys from session key") + + oaep_cipher = PKCS1_OAEP.new(session.device_key) + + session.session_key = oaep_cipher.decrypt(license.SessionKey) + + lic_req_msg = session.license_request.Msg.SerializeToString() + + enc_key_base = b"ENCRYPTION\000" + lic_req_msg + b"\0\0\0\x80" + auth_key_base = b"AUTHENTICATION\0" + lic_req_msg + b"\0\0\2\0" + + enc_key = b"\x01" + enc_key_base + auth_key_1 = b"\x01" + auth_key_base + auth_key_2 = b"\x02" + auth_key_base + auth_key_3 = b"\x03" + auth_key_base + auth_key_4 = b"\x04" + auth_key_base + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(enc_key) + + enc_cmac_key = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_1) + auth_cmac_key_1 = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_2) + auth_cmac_key_2 = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_3) + auth_cmac_key_3 = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_4) + auth_cmac_key_4 = cmac_obj.digest() + + auth_cmac_combined_1 = auth_cmac_key_1 + auth_cmac_key_2 + auth_cmac_combined_2 = auth_cmac_key_3 + auth_cmac_key_4 + + session.derived_keys['enc'] = enc_cmac_key + session.derived_keys['auth_1'] = auth_cmac_combined_1 + session.derived_keys['auth_2'] = auth_cmac_combined_2 + + self.logger.debug('verifying license signature') + + lic_hmac = HMAC.new(session.derived_keys['auth_1'], digestmod=SHA256) + lic_hmac.update(license.Msg.SerializeToString()) + + self.logger.debug("calculated sig: {} actual sig: {}".format(lic_hmac.hexdigest(), binascii.hexlify(license.Signature))) + + if lic_hmac.digest() != license.Signature: + self.logger.info("license signature doesn't match - writing bin so they can be debugged") + with open("original_lic.bin", "wb") as f: + f.write(base64.b64decode(license_b64)) + with open("parsed_lic.bin", "wb") as f: + f.write(license.SerializeToString()) + self.logger.info("continuing anyway") + + self.logger.debug("key count: {}".format(len(license.Msg.Key))) + for key in license.Msg.Key: + if key.Id: + key_id = key.Id + else: + key_id = wv_proto2.License.KeyContainer.KeyType.Name(key.Type).encode('utf-8') + encrypted_key = key.Key + iv = key.Iv + type = wv_proto2.License.KeyContainer.KeyType.Name(key.Type) + + cipher = AES.new(session.derived_keys['enc'], AES.MODE_CBC, iv=iv) + decrypted_key = cipher.decrypt(encrypted_key) + if type == "OPERATOR_SESSION": + permissions = [] + perms = key._OperatorSessionKeyPermissions + for (descriptor, value) in perms.ListFields(): + if value == 1: + permissions.append(descriptor.name) + print(permissions) + else: + permissions = [] + session.keys.append(Key(key_id, type, Padding.unpad(decrypted_key, 16), permissions)) + + self.logger.info("decrypted all keys") + return 0 + + def get_keys(self, session_id): + if session_id in self.sessions: + return self.sessions[session_id].keys + else: + self.logger.error("session not found") + return 1 diff --git a/pywidevine/L1/cdm/deviceconfig.py b/pywidevine/L1/cdm/deviceconfig.py new file mode 100644 index 0000000..eaa382e --- /dev/null +++ b/pywidevine/L1/cdm/deviceconfig.py @@ -0,0 +1,53 @@ +import os + +device_android_generic = { + 'name': 'android_generic', + 'description': 'android studio cdm', + 'security_level': 3, + 'session_id_type': 'android', + 'private_key_available': True, + 'vmp': False, + 'send_key_control_nonce': True +} + +devices_available = [device_android_generic] + +FILES_FOLDER = 'devices' + +class DeviceConfig: + def __init__(self, device): + self.device_name = device['name'] + self.description = device['description'] + self.security_level = device['security_level'] + self.session_id_type = device['session_id_type'] + self.private_key_available = device['private_key_available'] + self.vmp = device['vmp'] + self.send_key_control_nonce = device['send_key_control_nonce'] + + if 'keybox_filename' in device: + self.keybox_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['keybox_filename']) + else: + self.keybox_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'keybox') + + if 'device_cert_filename' in device: + self.device_cert_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_cert_filename']) + else: + self.device_cert_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_cert') + + if 'device_private_key_filename' in device: + self.device_private_key_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_private_key_filename']) + else: + self.device_private_key_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_private_key') + + if 'device_client_id_blob_filename' in device: + self.device_client_id_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_client_id_blob_filename']) + else: + self.device_client_id_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_client_id_blob') + + if 'device_vmp_blob_filename' in device: + self.device_vmp_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_vmp_blob_filename']) + else: + self.device_vmp_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_vmp_blob') + + def __repr__(self): + return "DeviceConfig(name={}, description={}, security_level={}, session_id_type={}, private_key_available={}, vmp={})".format(self.device_name, self.description, self.security_level, self.session_id_type, self.private_key_available, self.vmp) diff --git a/pywidevine/L1/cdm/formats/__init__.py b/pywidevine/L1/cdm/formats/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pywidevine/L1/cdm/formats/__pycache__/__init__.cpython-36.pyc b/pywidevine/L1/cdm/formats/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3432e45fefcb51638cad4df2b5e28676d821c83a GIT binary patch literal 156 zcmXr!<>hj(I3B|Q1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFHdKyn9$g`k0{4pJF(CReh=2h`Aj1KOi&=m~3PUi1CZpdI zlU16RX&&Q}TAW>yUl0@S>ZI%96CdL5?-LwTo|%$bmYJ6tpPgD+98*vUg`k0{4pJF(CReh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w)*(xTqIJKxa zCaW|r(>%r{wK%&ZzaS>u)k)XICqBgA-zPXGFD)^*Dlev>vOF^-wJb9)H6}SFHzqB= lC^xaBI3_+mGcU6wK3=b&@)n0pZhlH>PO2Tqn$JMY000lYDyIMd literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/formats/__pycache__/__init__.cpython-39.pyc b/pywidevine/L1/cdm/formats/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71c0f73c45fc5a68bd9575ffd8495a7a79ed0f92 GIT binary patch literal 166 zcmYe~<>g`k0{4pJF(CReh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w;*(xTqIJKxa zCO9##Br`ERKgK1sIJ+djAf`MuNjD`Yro1dZJGHVnrl7JsGbObwGcPqJIVCqHEx#x? jv7|UAK0Y%qvm`!Vub}c4hfQvNN@-529mtZ;K+FID5Z@~( literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/formats/__pycache__/wv_proto2_pb2.cpython-36.pyc b/pywidevine/L1/cdm/formats/__pycache__/wv_proto2_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d09037ed9d6c3273028b8609a1d24bcdbbe5039 GIT binary patch literal 44592 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 SBRU+YV7&jo{uSIvj{hGI=wo~U literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/formats/__pycache__/wv_proto2_pb2.cpython-38.pyc b/pywidevine/L1/cdm/formats/__pycache__/wv_proto2_pb2.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84af63f93bba74b4b994ed6dde0f76014feb5761 GIT binary patch literal 48896 zcmeHP33we>b(Wr`Cuy`;e%@qxljT)jo^3f!oWxEdOV74!SyCj~jweoDWX)I^M;q@+ zjy;63Bmn{#0;MTSY2%c=P|8v$fkNw)C2dNfZ0#$dY+Vd3(9)8YCGq0`zB@F|E)siCj9b0x~{BDE7Quy z%G5Hw>~y(Swxmo;+*Ouaq0P}M?kk&GqgB$sY64Knu{q-vYDGDJVH(u!KkX$9#zwVu3Le6RFXe${*Gh=ABF(9Qb)ymXm+Cp`? zwpd-EEmv1E#ujarjj=UA_v!%MYut1*Z)>##{v;<{vQAr%KUp$b$*B!m8&lT8l(pD$ z+o)}_``;Yse@meMw7Y*Px2@VX#=VMhud;D(*V=8|I|8_`3gF)9#?72u?dEN?f;qWH z+r_=La&N76Z`W$q*}YvK=xw*Vw^1RlJ=zV7X*FY7ZDYDoyUE7X5x}$;m~72qDm#() zjzAak8G8f--TSot+}j%NZH?XA0j=Ba?I3#d>gl0CZ#{wD4x=|`yhU%lS|9hemU~-k z_tvl7Z1*-0=xs32+fbmlBktaq|D)*rn9Z%ww_CL1-2Xc6f1TaGs@-b$eXuw(R9QVJ8``={uZ)(rA`@bi^?epB+%6a-5+VdIHX2!JH#`GNR1vaLi2Pa#& z|1GZmU-)zFKh6E8UH!l4=i2{P?tiPR|9gL~{cq#`x5@suYximQQ~&r?oo?4&ti6P_ z`K8)Rp|KCZSE#?Y{NWwi%P!DLNPiFT^X2E~GW;vF^Q`MJ;71dqW%S258aVYz?N!=? z=Nr|lfNQ(HN`6y&EmQJam?sO-tC-LJ{vXnQoBNN3dY$%qo`2C$Z_wVzbMkkz zH%0XLyV~#ZJS~cAw32w!TSkSn1g8(fb0AK4GN%``3ocF{(SDyfrG6pvBAmWidkb^= zR_$#}ofr+jJl?LogE=Lrg!TYSJ2-0Z)c$}ueHTU7c zyWXos)Al~?{ebyEaj4NM$n7e9=V(G-<&oYW!#5)7UCq+_p!PwJ^ga|rdVivQn59>m z<43iR#L$(GYJVD2f*;d99z%kEru{ifu&7qCoG)sRu>>QzASptQtsV*f1^hjd;5974 zPiUWTN$^j!PqG9fv2y>P(mu^njGiHnYkvs|u8$b!IZWYd4~2gPKawci#S}iFJ>jD8 zQSGmp!f5GSt9^#4E2{e;7U*xZ&vLKVa<8A$KIiK7qV~7kYYf}Q()qmhg_t__MeR$h zVsd79-)jZdvq+r6HhFCDKWJZJ30%h#cv5@PC4sMM{}@v5sdPA(f-XP zoqyN9%hGuhY#OalVrBGO(C=yAXURlE{fG9SER|@eA87x@5{aG%|E>KnhD4sy{wIdT z`CsivY;mG{{IT{E$ly)TX4iTW;WhkJdzzu6vHt8q?2iEB+q6hHK$YW{0Nh)Fwa8eE z*80a5ZRX%t!Q;D|#uvFt{F2TXBUgoAHIH+o9s;TcKZVD-D5S7J`Wm<8L#tZ6)spSo zBdMrES-ppf29(UT=VGKK0AwS6^X&Op6gp@R(JqDGe5U3GNzDS3;N8jc5s_Pj-(sew z)W|deatTvX3bGlHOL-2If?Nj3<z7 zdMlu}G2M|?lPJ+10qk~n7fVvUCn|O>%LDKkk*m_y?Z2?ew@#~D9aZ+ksfXu{L zeclPUeWh1qiFH4q4@9p+{O+(@?;xAzykVkUx0LN(Dcgf6JLr+^A(Zs6Y>R5-XgS#v zeZ9|aAJ*>RaqE=0dx5FXgS#IkHxjJ}Ujo*DHVv=&tFmsICa!uz41T&zoZluXB>dIpeZN>j}%%-u}0HA9N6 z8)t#>Tr6v40`j?Rts=*cc+!>v_8zuaR{!GMD!9Tu50JkRZLJvN7XkPD=(T9H8l$j( zv|Qidvpg?=&e4i-K#l-eo)>!bhAhvEW-*iRjX9I=yUdw12JxZfPl-Le}S%OmitnvOceR#@6SM zaFA7y>s5Zn5^aTeC+cVb(gH^sC*zZ=8)^uYSG`K-_H zL23{47#x;kZ~-M3oH5WohWsNu0;M$g_W}849)Xy<2Y`PIes5(Bir?mKX!CX+m-ubo zfi~~t5sKgD576daJW`RIYh<6_&EsTgRH(-Xs6WK-Jv>rHG15ALm13iBoc;)_JgpMF za+KZ+Oz#z=B;JpGEBpIU|9)=KCtG{~B_D`r@yDqDAh+n3Ek1;j4@I>26V!j0Tih&L zJc^P>9o<3hBlvwZ*8KfbKz?kN+VgR=`Lnp%L-vRMJRZ=W1H(n;VL{k%qILxS36TFBcMeG&{{?OSHMT@90s7msw7uU! zn}1{58{c04JKB7=^m+-X@8S1-w!?A8|33izpQU%X0rdm?{wsQ)dlWlJuQ zmOo`#s8SYBqvUCyEPfVK772!1T>J#nmIcKNQQTS_jrhug6kkM9W^te&1@xR)vPgSm zkRjTi(AF5 z*T`HA=Q{K~fY_t2!LviZfuA>W$xYm59pmiKZ$jBxy~D=5j?%!{&RF)yoPf4+JGt!* zvhEtr-6(T{)|)7&y^d@4>K)wsT7Is>^Ll+R_pzDlcgx(3oa>Oet(;r0cQWK5A#U!-STB^mB-AGf%JTkO~Op{z^a&t+p=mXWy$&h3-A zJ)AqB?+5(V`T>T|OB^CM!?_JqC-tJ4(@Rl)QooMVUzAujFm2s7Z9RH7mmGAJ97M_W z`XLv!J^CS(b?ZGYY7fesp!Sf=32G1PJ%GPjKkTBmN9F{zZIrXArL;vYr3JNz^)_JH zsQ03TWw0^4%eVEcNXps}px9Vv?Z`DuO(0eKE zf)+UeeL~*~=xzFKHuO~qjqMsY zHg%lakK1scu;F%j;3gPu!iIaohP&1SH_335Hr(fIxa&M{Qw%p{!#!!kUGIT=4#Pdi zf+KCRA&IZ=*ty;Ab|gW-ZnSGfzS7R`34yM&Yi|gtU0~PV7*g9}*WTo*?U1?6=aU%M zy)w6j$1cab<(M}byWHu#D?RN_pPupL&UkWndva$vC-^;RQ`PCFN@=JuT7@Vv^g_RKi8c;eUB&i zJWuX7I4Agc$nLuoU)>(s1hm7~!H`;quS1^N9+?w-9hN!4*YlaL=iBr?-^CZwF1{$| z@I^T{UydE=b@#2lfbqY;C4u+a66o_lzK|hb=z{!!4cYI3d=W#w$OZW!8}eok4Sd7dH9+mKktY{(NH$X7DtD_xKcHsoy{$X7Ast6Y$)ZAii4 z$L;*>?v{F1=C<*ye~|G!$au&iK6v`ol-9}z%QkFJl$Bkgi?O|z=HNL}PHFicrRmp+ zU%mp5d&&mO+RA(1QTC4VLiyPoHQ>jO20E`haU`$j@+VHuOc>Xk=+g6dO;1jpIF{MF zrK=}9)YsQDcw*wz@VGf~V(Q%8hNhn}CiD{{+W3i6lezKX>HLYi&t#`^lhc#!*{PH5 z>8W#t>fK|*<0rM@8!FMw5AZ9?RpAk!kf>k^>B8?lWeeV_9u@didmUo&Xx0mc*L5&Jn;?2w;t&hE}Qd!VBX6O^s-5MUoDPsgun4Cy$Q7VSOR8x6NVnajw z%5)e|dT8=4eS*MJ>y=8*G$mTfH`KN_r3a1C30>>L(2cEro9494 z0dx`Uy~E@B(c!TfJ+)Ms-=CX215L<@#-gtZ^i`Kyq%`!PlZm|EIXN>it>>C5QC^?Q zDD$%dx^sAH_@psrOdEQ>DaizG2xlk=pK4KRv-^xO{lIYkPBgFL=Cx_3sCk1@oISd|vE0eDHzpt$0eG}MyS;Ia zJKNq^(K@KqII5*6$wQgrd;4wy!bM7|D|58FGn4Ji3=DPe>+b9r$^dt(vSJ`}xNj(v z?HC%$3=VY+b@%mpU=pnt-6eN6}l;0f@9qeOcFeU~x6Y zGpF<988XK4GBh$dp;;p`PpRpjIXPyG9MaG6VAQ1=mFmHB`DuN;TayaAOj$6b=cfe$ zUHVi`$6VAk*4X+KPz>rhnoejyT3FY5NSW)Wty-xV=<6GTs2Y{J?%tuyz~M|+w-C}? zrS`~RW*{phh(W;cAW!0KoYVT)edWsH0P};>!_zbQl%HkN(7M!hN>bFb2pZZq28Ac; z-6E72H!6zgteflr>1S>GqBPHP(pbxMP;KibWuA*qiJ%5ktD~p8OQ_jE=4jucOjl!h z>!h-@2p2s@e!AE&i7B@uq$BV~Hma!@Z><;KQ?4w}OpMS3(KRuTea6%?c4Sd&QtOlz zayZ?r=>fG`qRb26#xzd|jSEzDpMfm>mHj#6%<#xL(!ENmY`yq9<;p^7G=roL=+Bvf z9zxB;Ff;XRh)^VyJ*6o9Gr5sFv1p-;tWI63SxzKjYwFSxKTnytN|ncMq@e4TMfVsv zvd*CILW5Ez+hcAgBq^jJ;Z(OMRoVW@F=ON$6Ik0m*8)t7Vqlp={EG!=px>b^~Pt`h?h^zc~MOpYnDY!8h@eQKq$m{6V^9=Xd8AShpxuY!QdRD5cx(Vh?Tnr~ z=Z9lfh)D@Ynyu%K3=gxK05`JcQ%mPvv2#Y)e z9W$oyJVMS?Q!UD?n;-jdjZ)_sM8#H@I*2cU2_aOr)=~h{)lD8Tqb#JCie}&oO9fuacr^WaMr~sDIhq*|E)lg7uGGfn z?TX?Wp2f;sC%1QOa^x;{I310Lm2bXBSspzOSk*hm#wPEUs|X9Jp4NIU?b3NkV~*MV z;8ODI+3wVn4Y!NnCFHQV3yUcH8yL3Nmn%z(4i}k(!v@Tl<;C_JXZ5kXB!Mc2&ju=K zBG(t0TC@hmo)xVJl`6=OXE!-P-TQmHd-n?;wX+XiQ|}N)1pX2n&ny)T^z~p!7C^!J zGXot%eFNFS%-|q=OgO8iQtzGn02@38fX*WW@KXnl_Yd^}wWqWz)7jTWqmI%8epv3v zDV4Al@Br(b(vF^<#>&=l#jU;ssV}{d`MVxgyQa);p9+(O`wr z+}+EblynR|ZgY7G_0qWtt52jBEAyojnLX0makQhmr(X{mhQ~-c9J)LOg~AlBQ(!y;mu3M zij;R6Z4RgQ+3p(KhT8U>@fv5&!m%+XMrBXUS(r+qWtCFVpU>YZb!2|}7+!g46Ns2Q zpbujo03fxp6^*5|%U-V&j;o~Ia#EXnlnN%eK}iZc+(q4GVj~+j*T)02qec>D4?{7x z6?RU#IfDiijlE7dl)}!zEpu1)4CklGk3+q9%jbGtjM*U?8a_FuXC~l5i5JY)ZH{)+ z4o#IZr#Ev<*tmfVk{vzb6>uQalj#`b8T*bZWuAA?2ZryCKWVQIPTCDVJpjHU^LDdm z-mVB~XU$dO=Kt%|eW>Wv-Q%0OTS6odF?-S6GkfDV=lRg>pTN6fckk2x=7Vw$V<*g> z!& zzA4%_&HIa`eQ8}J_a-DX+|VgN>#c?|FR%%K{p?!T298{?O03{1OpU?eG4V#vLM5-7 zU1%{Bt@TQ+eCz6-Fs54@?5$wh{L)*OD@(=xx~prdnaR^0SL?+WV=J%N27FpcWdj>z zlI~P+lZ*EqZR*6U^akwv(e}PjoQU22)}_i4L5Hmj5dUFu9Ksv2^`cr9r8dY#fONK@ zy;+_j$lA30SGw(U4(CT%pX1P72`>TBCm>A=voK2NE2_c&jf z+k>sr-oZ?EAanB(>@thRR2D+#Qc6Q+U;r-%1DV18J^f&7SfbF zPLWd|(i#!&HbK$8Q5|h7;aFkhE^)Y}d7a=ILOL}$Mmuig`|=(Szb{T^v29>XYFT4K z)6Yt87jE!qZgOTy*Rp6rXEi+4>r&X>1SxW3ESncQV`5(j{d*DS<(4|{2({wW#o>^) zwtL|?(#sYb1{@l6WClBj2CyT1@zI2`KG*EyGmM&G^+6sXo=h_zDTf`A_Jt#ym9_|Y_-bJ#20ugWTN@sGaEsQxwXx^Fh0tbk?=db-K+G=Gx{lmwadqIfYa4331j<3jmx-IvdFn zI;`@%H1iS0;DL^v+uP~pL7Ik9m?U|)vZKy1UofgWmH*j7=fAbJZ`Q&`q;hEPc6&*9wU zY@t5S2XBUn^=ay4!M(9i;BMP0bMq1JQK;lat&l{_2TpzqRg=P#EL2S6rL<5b>AFO5 zFoh~f*d+wblo{`A!Q&tBXsZ#ZYEI3Jjb)i0Tatwel4&7{;}4v`73R{K3_(Gfya?x( z65d7^u{es#O&1zmCHjO`@b69)EE!x{NTfVTr2H5U)qQqv?yz>|+?!2ucg`I_;SLT^ zo#TGhI_kF)?Xr@N_?=|?C5oys3<$;eQ#@4Xq~BZ-N`V~-pvpJ^H6#W=Eph&De4IK= zA^b=6pP8Gh0`9Q;yqdht0w1cYo&$B&eVDFV2kFK?p$lUhcvORD)@ECvC*ifb`x7Oq zINVn8?#Bn)#uGqkJVkifSpq1oq91#r5c67!TFEdv3Od_TzbJR0I3# z?h>(It_Jqi-6aynyPtlE;<}6xBJ4>#3SxuYOi6-VyXR`embn_SU0w*=DmR)M(BoM= z3ift1bk1y+{Yvi=FDQH#$ofcId88Y>jYkRI!ZV(l2TbczWo71aZ)5VoT4k{BKx=D*1M$`rfS6 zsJANB7PIS(%D^?GG6T1%U~=pi2Xk5Q1UV?2aQ$4YT z=2bC!PrHM4)QCt#b8lRXMURN{sxOMsygDvUZ}j6OnAWmO6tAm>MKYS#$3+_w25Gz= zYE=jgp)K&6in$~dJ6mxPGHW)6Lr`q(B`m>Zmnc>l%e4s8ML?XnGPH#QpoWFZnj1n} zvElay)?TWk4jZIFl2NrqjD{CT4GXy~(s4*|?j;JbF1X`u&6ZH2T@ksLC?fmPCTbXr z?lcz#Jgzj09_sIe+LOSTdLnFRm}r_+K$iz$`^jk!Sq zVam=R7U?G4ea84p+L!q;?aM@mcAD+sTt`Lps-9p_^Tyd@z?-uZO)AmJDALPEClSy~ zJCM`+u(|tkNu$lVj6hZ9X6@3*_!(wI4 zy`dx*MUoDQw*}&0obBup2XUw&;qPY0ED5F^6>kK+aSsG*ETr8zPt?D;APhC8mF6r& zo@rIQ;!J@qikMAd2x+*S<F10``k4wC#@(zm{xa{MQ z;S7}wZX^iaJm1xb`CW@`>;lK>#$=8{7z;9>*W4D1TxyaQA;2*iGfc9uU}W>aWg&G(F7uSrHMK}M zvw7$l_u#}vQzv0D(U;vx7&7Ao4dQ>(Acn``+ix?Gx?hm7`sSus0uX`ystogu*$CQ) zh<+uDc2_M2EK67Lc{fk3!=Gc5n zI~|)nZgg4faZ8&$^P0F~@mXct)s?7<^XF^mSYyA%ijN}1_L{wy$p|(nN9a2Sd_To8 zv(E%ym_@bS;!^VRJ1@nhBFtrcc#J$*N^85I6d~3?881g*kZ}QLe}&-H8NVrGYNfTb zJ;<=0Y`@P{$@4VgT%Sy*ZzZAre74Ft4Y0jjS06r07zX0QXRZ!vR?z%yL`;J5c@k3i zg#~j3yV3r83~Bq^gDx+aONszZj;Nmd3}$OMp!?2)TFDm~%%w#@=^})6Ho=l_2?rEM z2Lz!yS0l`o;lTFY33GKgfH%y=bu+>&(!F!cV|kS z#}=G0M5Bwyc{h>cz9V70hl)Q+#n#a_9oOi_$Ef@XDv!D|VSI+bzC&QeZcY?J?oF5* zMSw=&04W{3V_~i;25U2}%6k>&iYQQ=?R=N0oo)iP#qU=bXHajvnt;5wEXOM64H%iT#-=2uSS>~LRy7hqQK|6 zCdY7jB9v-TrOx+Wf8fwlb6rReA#keyzJ=Ku($IG&Lk-@=FxP}MgTTBuHq`K&8lmFw z5}Oz9g@G?y!~6(k@h&L7@F;1t_!QsLJ8y$DsjZwqz8YJ5Exq*DJBqt5j20ZM`0SGL zBZ>yQ3V~3T-SDEs3T!S5Lq$t7uPf3j1)4D%(qsfH9Zp({VV5t$Gz;5`!36oa2CNw7 za>r=MzAd96vx0VMFRU_`y|9WLI;D-UD;!Zv8)4N1X?h;WF&WLVV&CwSjn5sEZ#E$znc7I6J`JPNK` z397u4V9s;3rZ##`bzM&|7y7Ejtp(!;B*Zn&mlD(XQes+uDKTw-DUrUX*p?_LUAPxE z(2b9B3>1`Xc6?Hs8Pl`bwu;=f5O}VK9&ez>8}VpM<_t=orpFjP#_8eISLE)bf(dVF zWp0`Z&d}qmw`xxAoWJ13-h$T@=H$;I_7DfYlzxM0Wo`-%wv?Uk^T@L*Hh}Z9s7j{zX|1 z2Ba(pEh)>j;h|oY?d<8sosjM>dhk~S`Fnv}*xAwFvA4UYd#F1zn5EAbN_6VV@K!_k z@LVs`+bX}1;)*(UU;1R2jX@atT;Y*HH>4<0H(Aoi;yW}HSKonqE(6)VBSZc8AIxSt z#di)7yss_~2S!WocXfC*f2F2-=s4e%M)aN(zqrQAPj#tPC~v)5cUKwh3SZ?w$1zX+ zIvSLt-83ATF7e^P?%sWU*<(k&JvV3R0zszhFg~l(u|JcQ|8gJ8v&S${N5MON8{|Ny zqYFal=-J;l&^>hEu)0b%m84r#x-qN?1tD79P!;Ij4TZV; zD4^I?kksJpXnHX{>g_n3!FPC$WYi7eiY9c{t)A+_P)HSTD*Tm97ny2PuuQ7ivSKwo z-Gf8wimZLFHf++Ui!2TBP9}A(Ri5qdgG7(3>+FI^ZB|>t;bbFxiAmiN4q<(pNq(9M z4e+t1!`=Lyra^UUc%!2ryASuZ`+APhT*53H92&qp8-i>tMR3!rR$Ikty_FL4WTTa} zG*I4z@yZ3$yth-035zcxA69q9!<)GUqlK?nNut%Yv6?x= zHg-Qh8{)Qv_DdN^mcRkDG}I2M3!HMuuCJeTV9-};NoJu3*1F@5?!>2OU0iG&PVLEzrk-IF=cF?ay0CgH=HHjsgL;S`H|77gN_MfT)5zWkW$pjG)M zJPHe?Um~tsSOA5TZeP2w%G7215#ff96N(Qb(%FsNd*Ho{Dw!!%XvWBNuAi3txt3cZ z>s;QRN)+5qk1RdzpodP696cQWF3c0m6UcMv!ET+;?Rx=LypSF*qQ|}TxQ`z9)8i%d zcqu&|pvTMT@d|pJr^kczcr87CiyjZrAoa)Mo@&x}Sf09fp2`iVNR2lxL?xz(M5xJ)l4FW^r+sP&+p_CWF@v}ry z!u@BmQNUFIwqi~Z_^3Xk>b{p)B>VYBvgJx}^o;5IK_Vq7`sd`bm=ygup~yDhO)iMp zCQ2%oL&MJ#pSQ1HhB5T%^<`+mGsobS%9S2NFZRok`IXkvXHJn9Lsaf^_>IEnt^0Xm zcPwbR%WjkPCi`7hXIXN}{ivb}nk;Lqe|-@DlW0sN082mdN2#wS*V=O+v>(7&c#HJ& z3xW7%Vl6mHBz~5dBe@ZreL8vlF9ScxUxd`YnAnlPavYG!qsfEMR3=w~pDTf*w66Jj zVVQ*JNlBUb@Py2-(zN&>{v)wCRA;}GOh41{@%2<}uCI&k$7eA@crGoKX8}UYb-(3$ zywps87AOgkh)?pD1>vLgD~Zj}6F*elMxF&!x4*$BXd$eA<}!NV0oY z68Tx8Cg`2O(tIn~GAle7XFo?idP5+5JYTW-^^2k;$Z=^sm_39~YQJRmvD&ARrS0S8 zNUih;KV!Lu=1Ptx;XOaN=D$CAbM*Z4X+bP%{ZjMc`1Smw_xHd%ykC=iQv3D% zizT&L%Qcop`^P5Oi(lt`5Jl!+MPUAwzyoUiv;^N(elZX}j<1AVS!(bbJo|9)0K8J8 zmB9B#3n~3uvdLxHt`rQ;xct%$^6iJ1^#~QSkXxPwj^aq>vbgryuMo}kN$yH<&F7Gj zZ`vWWl&1DdK=?Qg-Die=e>%C_HPV+QeP2%@9GBM0(j1q@Q5vE&rKRa8jl&1Q?|LDY zNx$aDC%Ipb5B#cUPv2(07G8<*nKh1(Qvg`t z$CKAZ+u>Qujdw(0;mKdI_m^l#G>HhCB>tR88&N`eQJO4oz#qZTAEoNJgi0G^YXKwR zL>aXvSOF#e6@6Ivqw6i~0*BRS@qY=M;`(#=DV0JigatJ~Diu#xSIK`7|5NdOWxhgk zk#$NX;25fOs?o;Rm}r!ki~LJHeWSV+&o3xjxj!kh2HBE&1D0ZVsQsntrG!OUMeSK~ Zm(#-LO;F1H{xX$W5+IJBQtFiQ{{wW03$y?L literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/formats/__pycache__/wv_proto2_pb2.cpython-39.pyc b/pywidevine/L1/cdm/formats/__pycache__/wv_proto2_pb2.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47a6534ef836e80737393f0962cbe000c8f2d65a GIT binary patch literal 45460 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 Qr!q$Z#PQQwomT$;0B#ZtqW}N^ literal 0 HcmV?d00001 diff --git a/pywidevine/L1/cdm/formats/wv_proto2.proto b/pywidevine/L1/cdm/formats/wv_proto2.proto new file mode 100644 index 0000000..04c9809 --- /dev/null +++ b/pywidevine/L1/cdm/formats/wv_proto2.proto @@ -0,0 +1,466 @@ +syntax = "proto2"; + +// from x86 (partial), most of it from the ARM version: +message ClientIdentification { + enum TokenType { + KEYBOX = 0; + DEVICE_CERTIFICATE = 1; + REMOTE_ATTESTATION_CERTIFICATE = 2; + } + message NameValue { + required string Name = 1; + required string Value = 2; + } + message ClientCapabilities { + enum HdcpVersion { + HDCP_NONE = 0; + HDCP_V1 = 1; + HDCP_V2 = 2; + HDCP_V2_1 = 3; + HDCP_V2_2 = 4; + } + optional uint32 ClientToken = 1; + optional uint32 SessionToken = 2; + optional uint32 VideoResolutionConstraints = 3; + optional HdcpVersion MaxHdcpVersion = 4; + optional uint32 OemCryptoApiVersion = 5; + } + required TokenType Type = 1; + //optional bytes Token = 2; // by default the client treats this as blob, but it's usually a DeviceCertificate, so for usefulness sake, I'm replacing it with this one: + optional SignedDeviceCertificate Token = 2; // use this when parsing, "bytes" when building a client id blob + repeated NameValue ClientInfo = 3; + optional bytes ProviderClientToken = 4; + optional uint32 LicenseCounter = 5; + optional ClientCapabilities _ClientCapabilities = 6; // how should we deal with duped names? will have to look at proto docs later + optional FileHashes _FileHashes = 7; // vmp blob goes here +} + +message DeviceCertificate { + enum CertificateType { + ROOT = 0; + INTERMEDIATE = 1; + USER_DEVICE = 2; + SERVICE = 3; + } + required CertificateType Type = 1; // the compiled code reused this as ProvisionedDeviceInfo.WvSecurityLevel, however that is incorrect (compiler aliased it as they're both identical as a structure) + optional bytes SerialNumber = 2; + optional uint32 CreationTimeSeconds = 3; + optional bytes PublicKey = 4; + optional uint32 SystemId = 5; + optional uint32 TestDeviceDeprecated = 6; // is it bool or int? + optional bytes ServiceId = 7; // service URL for service certificates +} + +// missing some references, +message DeviceCertificateStatus { + enum CertificateStatus { + VALID = 0; + REVOKED = 1; + } + optional bytes SerialNumber = 1; + optional CertificateStatus Status = 2; + optional ProvisionedDeviceInfo DeviceInfo = 4; // where is 3? is it deprecated? +} + +message DeviceCertificateStatusList { + optional uint32 CreationTimeSeconds = 1; + repeated DeviceCertificateStatus CertificateStatus = 2; +} + +message EncryptedClientIdentification { + required string ServiceId = 1; + optional bytes ServiceCertificateSerialNumber = 2; + required bytes EncryptedClientId = 3; + required bytes EncryptedClientIdIv = 4; + required bytes EncryptedPrivacyKey = 5; +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +enum LicenseType { + ZERO = 0; + DEFAULT = 1; // 1 is STREAMING/temporary license; on recent versions may go up to 3 (latest x86); it might be persist/don't persist type, unconfirmed + OFFLINE = 2; +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +// this is just a guess because these globals got lost, but really, do we need more? +enum ProtocolVersion { + CURRENT = 21; // don't have symbols for this +} + + +message LicenseIdentification { + optional bytes RequestId = 1; + optional bytes SessionId = 2; + optional bytes PurchaseId = 3; + optional LicenseType Type = 4; + optional uint32 Version = 5; + optional bytes ProviderSessionToken = 6; +} + + +message License { + message Policy { + optional bool CanPlay = 1; // changed from uint32 to bool + optional bool CanPersist = 2; + optional bool CanRenew = 3; + optional uint32 RentalDurationSeconds = 4; + optional uint32 PlaybackDurationSeconds = 5; + optional uint32 LicenseDurationSeconds = 6; + optional uint32 RenewalRecoveryDurationSeconds = 7; + optional string RenewalServerUrl = 8; + optional uint32 RenewalDelaySeconds = 9; + optional uint32 RenewalRetryIntervalSeconds = 10; + optional bool RenewWithUsage = 11; // was uint32 + } + message KeyContainer { + enum KeyType { + SIGNING = 1; + CONTENT = 2; + KEY_CONTROL = 3; + OPERATOR_SESSION = 4; + } + enum SecurityLevel { + SW_SECURE_CRYPTO = 1; + SW_SECURE_DECODE = 2; + HW_SECURE_CRYPTO = 3; + HW_SECURE_DECODE = 4; + HW_SECURE_ALL = 5; + } + message OutputProtection { + enum CGMS { + COPY_FREE = 0; + COPY_ONCE = 2; + COPY_NEVER = 3; + CGMS_NONE = 0x2A; // PC default! + } + optional ClientIdentification.ClientCapabilities.HdcpVersion Hdcp = 1; // it's most likely a copy of Hdcp version available here, but compiler optimized it away + optional CGMS CgmsFlags = 2; + } + message KeyControl { + required bytes KeyControlBlock = 1; // what is this? + required bytes Iv = 2; + } + message OperatorSessionKeyPermissions { + optional uint32 AllowEncrypt = 1; + optional uint32 AllowDecrypt = 2; + optional uint32 AllowSign = 3; + optional uint32 AllowSignatureVerify = 4; + } + message VideoResolutionConstraint { + optional uint32 MinResolutionPixels = 1; + optional uint32 MaxResolutionPixels = 2; + optional OutputProtection RequiredProtection = 3; + } + optional bytes Id = 1; + optional bytes Iv = 2; + optional bytes Key = 3; + optional KeyType Type = 4; + optional SecurityLevel Level = 5; + optional OutputProtection RequiredProtection = 6; + optional OutputProtection RequestedProtection = 7; + optional KeyControl _KeyControl = 8; // duped names, etc + optional OperatorSessionKeyPermissions _OperatorSessionKeyPermissions = 9; // duped names, etc + repeated VideoResolutionConstraint VideoResolutionConstraints = 10; + } + optional LicenseIdentification Id = 1; + optional Policy _Policy = 2; // duped names, etc + repeated KeyContainer Key = 3; + optional uint32 LicenseStartTime = 4; + optional uint32 RemoteAttestationVerified = 5; // bool? + optional bytes ProviderClientToken = 6; + // there might be more, check with newer versions (I see field 7-8 in a lic) + // this appeared in latest x86: + optional uint32 ProtectionScheme = 7; // type unconfirmed fully, but it's likely as WidevineCencHeader describesit (fourcc) +} + +message LicenseError { + enum Error { + INVALID_DEVICE_CERTIFICATE = 1; + REVOKED_DEVICE_CERTIFICATE = 2; + SERVICE_UNAVAILABLE = 3; + } + //LicenseRequest.RequestType ErrorCode; // clang mismatch + optional Error ErrorCode = 1; +} + +message LicenseRequest { + message ContentIdentification { + message CENC { + //optional bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: + optional WidevineCencHeader Pssh = 1; + optional LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 (is this persist/don't persist? look into it!) + optional bytes RequestId = 3; + } + message WebM { + optional bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used + optional LicenseType LicenseType = 2; + optional bytes RequestId = 3; + } + message ExistingLicense { + optional LicenseIdentification LicenseId = 1; + optional uint32 SecondsSinceStarted = 2; + optional uint32 SecondsSinceLastPlayed = 3; + optional bytes SessionUsageTableEntry = 4; // interesting! try to figure out the connection between the usage table blob and KCB! + } + optional CENC CencId = 1; + optional WebM WebmId = 2; + optional ExistingLicense License = 3; + } + enum RequestType { + NEW = 1; + RENEWAL = 2; + RELEASE = 3; + } + optional ClientIdentification ClientId = 1; + optional ContentIdentification ContentId = 2; + optional RequestType Type = 3; + optional uint32 RequestTime = 4; + optional bytes KeyControlNonceDeprecated = 5; + optional ProtocolVersion ProtocolVersion = 6; // lacking symbols for this + optional uint32 KeyControlNonce = 7; + optional EncryptedClientIdentification EncryptedClientId = 8; +} + +// raw pssh hack +message LicenseRequestRaw { + message ContentIdentification { + message CENC { + optional bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: + //optional WidevineCencHeader Pssh = 1; + optional LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 (is this persist/don't persist? look into it!) + optional bytes RequestId = 3; + } + message WebM { + optional bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used + optional LicenseType LicenseType = 2; + optional bytes RequestId = 3; + } + message ExistingLicense { + optional LicenseIdentification LicenseId = 1; + optional uint32 SecondsSinceStarted = 2; + optional uint32 SecondsSinceLastPlayed = 3; + optional bytes SessionUsageTableEntry = 4; // interesting! try to figure out the connection between the usage table blob and KCB! + } + optional CENC CencId = 1; + optional WebM WebmId = 2; + optional ExistingLicense License = 3; + } + enum RequestType { + NEW = 1; + RENEWAL = 2; + RELEASE = 3; + } + optional ClientIdentification ClientId = 1; + optional ContentIdentification ContentId = 2; + optional RequestType Type = 3; + optional uint32 RequestTime = 4; + optional bytes KeyControlNonceDeprecated = 5; + optional ProtocolVersion ProtocolVersion = 6; // lacking symbols for this + optional uint32 KeyControlNonce = 7; + optional EncryptedClientIdentification EncryptedClientId = 8; +} + + +message ProvisionedDeviceInfo { + enum WvSecurityLevel { + LEVEL_UNSPECIFIED = 0; + LEVEL_1 = 1; + LEVEL_2 = 2; + LEVEL_3 = 3; + } + optional uint32 SystemId = 1; + optional string Soc = 2; + optional string Manufacturer = 3; + optional string Model = 4; + optional string DeviceType = 5; + optional uint32 ModelYear = 6; + optional WvSecurityLevel SecurityLevel = 7; + optional uint32 TestDevice = 8; // bool? +} + + +// todo: fill +message ProvisioningOptions { +} + +// todo: fill +message ProvisioningRequest { +} + +// todo: fill +message ProvisioningResponse { +} + +message RemoteAttestation { + optional EncryptedClientIdentification Certificate = 1; + optional string Salt = 2; + optional string Signature = 3; +} + +// todo: fill +message SessionInit { +} + +// todo: fill +message SessionState { +} + +// todo: fill +message SignedCertificateStatusList { +} + +message SignedDeviceCertificate { + + //optional bytes DeviceCertificate = 1; // again, they use a buffer where it's supposed to be a message, so we'll replace it with what it really is: + optional DeviceCertificate _DeviceCertificate = 1; // how should we deal with duped names? will have to look at proto docs later + optional bytes Signature = 2; + optional SignedDeviceCertificate Signer = 3; +} + + +// todo: fill +message SignedProvisioningMessage { +} + +// the root of all messages, from either server or client +message SignedMessage { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional bytes Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + + + +// This message is copied from google's docs, not reversed: +message WidevineCencHeader { + enum Algorithm { + UNENCRYPTED = 0; + AESCTR = 1; + }; + optional Algorithm algorithm = 1; + repeated bytes key_id = 2; + + // Content provider name. + optional string provider = 3; + + // A content identifier, specified by content provider. + optional bytes content_id = 4; + + // Track type. Acceptable values are SD, HD and AUDIO. Used to + // differentiate content keys used by an asset. + optional string track_type_deprecated = 5; + + // The name of a registered policy to be used for this asset. + optional string policy = 6; + + // Crypto period index, for media using key rotation. + optional uint32 crypto_period_index = 7; + + // Optional protected context for group content. The grouped_license is a + // serialized SignedMessage. + optional bytes grouped_license = 8; + + // Protection scheme identifying the encryption algorithm. + // Represented as one of the following 4CC values: + // 'cenc' (AESCTR), 'cbc1' (AESCBC), + // 'cens' (AESCTR subsample), 'cbcs' (AESCBC subsample). + optional uint32 protection_scheme = 9; + + // Optional. For media using key rotation, this represents the duration + // of each crypto period in seconds. + optional uint32 crypto_period_seconds = 10; +} + + +// remove these when using it outside of protoc: + +// from here on, it's just for testing, these messages don't exist in the binaries, I'm adding them to avoid detecting type programmatically +message SignedLicenseRequest { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional LicenseRequest Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + +// hack +message SignedLicenseRequestRaw { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional LicenseRequestRaw Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + + +message SignedLicense { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional License Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + +message SignedServiceCertificate { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional SignedDeviceCertificate Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + +//vmp support +message FileHashes { + message Signature { + optional string filename = 1; + optional bool test_signing = 2; //0 - release, 1 - testing + optional bytes SHA512Hash = 3; + optional bool main_exe = 4; //0 for dlls, 1 for exe, this is field 3 in file + optional bytes signature = 5; + } + optional bytes signer = 1; + repeated Signature signatures = 2; +} diff --git a/pywidevine/L1/cdm/formats/wv_proto2_pb2.py b/pywidevine/L1/cdm/formats/wv_proto2_pb2.py new file mode 100644 index 0000000..4c2a6d1 --- /dev/null +++ b/pywidevine/L1/cdm/formats/wv_proto2_pb2.py @@ -0,0 +1,3324 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: pywidevine/cdm/formats/wv_proto2.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='pywidevine/cdm/formats/wv_proto2.proto', + package='', + syntax='proto2', + serialized_pb=_b('\n&pywidevine/cdm/formats/wv_proto2.proto\"\xe7\x05\n\x14\x43lientIdentification\x12-\n\x04Type\x18\x01 \x02(\x0e\x32\x1f.ClientIdentification.TokenType\x12\'\n\x05Token\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x33\n\nClientInfo\x18\x03 \x03(\x0b\x32\x1f.ClientIdentification.NameValue\x12\x1b\n\x13ProviderClientToken\x18\x04 \x01(\x0c\x12\x16\n\x0eLicenseCounter\x18\x05 \x01(\r\x12\x45\n\x13_ClientCapabilities\x18\x06 \x01(\x0b\x32(.ClientIdentification.ClientCapabilities\x12 \n\x0b_FileHashes\x18\x07 \x01(\x0b\x32\x0b.FileHashes\x1a(\n\tNameValue\x12\x0c\n\x04Name\x18\x01 \x02(\t\x12\r\n\x05Value\x18\x02 \x02(\t\x1a\xa4\x02\n\x12\x43lientCapabilities\x12\x13\n\x0b\x43lientToken\x18\x01 \x01(\r\x12\x14\n\x0cSessionToken\x18\x02 \x01(\r\x12\"\n\x1aVideoResolutionConstraints\x18\x03 \x01(\r\x12L\n\x0eMaxHdcpVersion\x18\x04 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12\x1b\n\x13OemCryptoApiVersion\x18\x05 \x01(\r\"T\n\x0bHdcpVersion\x12\r\n\tHDCP_NONE\x10\x00\x12\x0b\n\x07HDCP_V1\x10\x01\x12\x0b\n\x07HDCP_V2\x10\x02\x12\r\n\tHDCP_V2_1\x10\x03\x12\r\n\tHDCP_V2_2\x10\x04\"S\n\tTokenType\x12\n\n\x06KEYBOX\x10\x00\x12\x16\n\x12\x44\x45VICE_CERTIFICATE\x10\x01\x12\"\n\x1eREMOTE_ATTESTATION_CERTIFICATE\x10\x02\"\x9b\x02\n\x11\x44\x65viceCertificate\x12\x30\n\x04Type\x18\x01 \x02(\x0e\x32\".DeviceCertificate.CertificateType\x12\x14\n\x0cSerialNumber\x18\x02 \x01(\x0c\x12\x1b\n\x13\x43reationTimeSeconds\x18\x03 \x01(\r\x12\x11\n\tPublicKey\x18\x04 \x01(\x0c\x12\x10\n\x08SystemId\x18\x05 \x01(\r\x12\x1c\n\x14TestDeviceDeprecated\x18\x06 \x01(\r\x12\x11\n\tServiceId\x18\x07 \x01(\x0c\"K\n\x0f\x43\x65rtificateType\x12\x08\n\x04ROOT\x10\x00\x12\x10\n\x0cINTERMEDIATE\x10\x01\x12\x0f\n\x0bUSER_DEVICE\x10\x02\x12\x0b\n\x07SERVICE\x10\x03\"\xc4\x01\n\x17\x44\x65viceCertificateStatus\x12\x14\n\x0cSerialNumber\x18\x01 \x01(\x0c\x12:\n\x06Status\x18\x02 \x01(\x0e\x32*.DeviceCertificateStatus.CertificateStatus\x12*\n\nDeviceInfo\x18\x04 \x01(\x0b\x32\x16.ProvisionedDeviceInfo\"+\n\x11\x43\x65rtificateStatus\x12\t\n\x05VALID\x10\x00\x12\x0b\n\x07REVOKED\x10\x01\"o\n\x1b\x44\x65viceCertificateStatusList\x12\x1b\n\x13\x43reationTimeSeconds\x18\x01 \x01(\r\x12\x33\n\x11\x43\x65rtificateStatus\x18\x02 \x03(\x0b\x32\x18.DeviceCertificateStatus\"\xaf\x01\n\x1d\x45ncryptedClientIdentification\x12\x11\n\tServiceId\x18\x01 \x02(\t\x12&\n\x1eServiceCertificateSerialNumber\x18\x02 \x01(\x0c\x12\x19\n\x11\x45ncryptedClientId\x18\x03 \x02(\x0c\x12\x1b\n\x13\x45ncryptedClientIdIv\x18\x04 \x02(\x0c\x12\x1b\n\x13\x45ncryptedPrivacyKey\x18\x05 \x02(\x0c\"\x9c\x01\n\x15LicenseIdentification\x12\x11\n\tRequestId\x18\x01 \x01(\x0c\x12\x11\n\tSessionId\x18\x02 \x01(\x0c\x12\x12\n\nPurchaseId\x18\x03 \x01(\x0c\x12\x1a\n\x04Type\x18\x04 \x01(\x0e\x32\x0c.LicenseType\x12\x0f\n\x07Version\x18\x05 \x01(\r\x12\x1c\n\x14ProviderSessionToken\x18\x06 \x01(\x0c\"\xa1\x0e\n\x07License\x12\"\n\x02Id\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12 \n\x07_Policy\x18\x02 \x01(\x0b\x32\x0f.License.Policy\x12\"\n\x03Key\x18\x03 \x03(\x0b\x32\x15.License.KeyContainer\x12\x18\n\x10LicenseStartTime\x18\x04 \x01(\r\x12!\n\x19RemoteAttestationVerified\x18\x05 \x01(\r\x12\x1b\n\x13ProviderClientToken\x18\x06 \x01(\x0c\x12\x18\n\x10ProtectionScheme\x18\x07 \x01(\r\x1a\xbb\x02\n\x06Policy\x12\x0f\n\x07\x43\x61nPlay\x18\x01 \x01(\x08\x12\x12\n\nCanPersist\x18\x02 \x01(\x08\x12\x10\n\x08\x43\x61nRenew\x18\x03 \x01(\x08\x12\x1d\n\x15RentalDurationSeconds\x18\x04 \x01(\r\x12\x1f\n\x17PlaybackDurationSeconds\x18\x05 \x01(\r\x12\x1e\n\x16LicenseDurationSeconds\x18\x06 \x01(\r\x12&\n\x1eRenewalRecoveryDurationSeconds\x18\x07 \x01(\r\x12\x18\n\x10RenewalServerUrl\x18\x08 \x01(\t\x12\x1b\n\x13RenewalDelaySeconds\x18\t \x01(\r\x12#\n\x1bRenewalRetryIntervalSeconds\x18\n \x01(\r\x12\x16\n\x0eRenewWithUsage\x18\x0b \x01(\x08\x1a\xf9\t\n\x0cKeyContainer\x12\n\n\x02Id\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x12\x0b\n\x03Key\x18\x03 \x01(\x0c\x12+\n\x04Type\x18\x04 \x01(\x0e\x32\x1d.License.KeyContainer.KeyType\x12\x32\n\x05Level\x18\x05 \x01(\x0e\x32#.License.KeyContainer.SecurityLevel\x12\x42\n\x12RequiredProtection\x18\x06 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x43\n\x13RequestedProtection\x18\x07 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x35\n\x0b_KeyControl\x18\x08 \x01(\x0b\x32 .License.KeyContainer.KeyControl\x12[\n\x1e_OperatorSessionKeyPermissions\x18\t \x01(\x0b\x32\x33.License.KeyContainer.OperatorSessionKeyPermissions\x12S\n\x1aVideoResolutionConstraints\x18\n \x03(\x0b\x32/.License.KeyContainer.VideoResolutionConstraint\x1a\xdb\x01\n\x10OutputProtection\x12\x42\n\x04Hdcp\x18\x01 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12>\n\tCgmsFlags\x18\x02 \x01(\x0e\x32+.License.KeyContainer.OutputProtection.CGMS\"C\n\x04\x43GMS\x12\r\n\tCOPY_FREE\x10\x00\x12\r\n\tCOPY_ONCE\x10\x02\x12\x0e\n\nCOPY_NEVER\x10\x03\x12\r\n\tCGMS_NONE\x10*\x1a\x31\n\nKeyControl\x12\x17\n\x0fKeyControlBlock\x18\x01 \x02(\x0c\x12\n\n\x02Iv\x18\x02 \x02(\x0c\x1a|\n\x1dOperatorSessionKeyPermissions\x12\x14\n\x0c\x41llowEncrypt\x18\x01 \x01(\r\x12\x14\n\x0c\x41llowDecrypt\x18\x02 \x01(\r\x12\x11\n\tAllowSign\x18\x03 \x01(\r\x12\x1c\n\x14\x41llowSignatureVerify\x18\x04 \x01(\r\x1a\x99\x01\n\x19VideoResolutionConstraint\x12\x1b\n\x13MinResolutionPixels\x18\x01 \x01(\r\x12\x1b\n\x13MaxResolutionPixels\x18\x02 \x01(\r\x12\x42\n\x12RequiredProtection\x18\x03 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\"J\n\x07KeyType\x12\x0b\n\x07SIGNING\x10\x01\x12\x0b\n\x07\x43ONTENT\x10\x02\x12\x0f\n\x0bKEY_CONTROL\x10\x03\x12\x14\n\x10OPERATOR_SESSION\x10\x04\"z\n\rSecurityLevel\x12\x14\n\x10SW_SECURE_CRYPTO\x10\x01\x12\x14\n\x10SW_SECURE_DECODE\x10\x02\x12\x14\n\x10HW_SECURE_CRYPTO\x10\x03\x12\x14\n\x10HW_SECURE_DECODE\x10\x04\x12\x11\n\rHW_SECURE_ALL\x10\x05\"\x98\x01\n\x0cLicenseError\x12&\n\tErrorCode\x18\x01 \x01(\x0e\x32\x13.LicenseError.Error\"`\n\x05\x45rror\x12\x1e\n\x1aINVALID_DEVICE_CERTIFICATE\x10\x01\x12\x1e\n\x1aREVOKED_DEVICE_CERTIFICATE\x10\x02\x12\x17\n\x13SERVICE_UNAVAILABLE\x10\x03\"\xac\x07\n\x0eLicenseRequest\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12\x38\n\tContentId\x18\x02 \x01(\x0b\x32%.LicenseRequest.ContentIdentification\x12)\n\x04Type\x18\x03 \x01(\x0e\x32\x1b.LicenseRequest.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\xa2\x04\n\x15\x43ontentIdentification\x12:\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.CENC\x12:\n\x06WebmId\x18\x02 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.WebM\x12\x46\n\x07License\x18\x03 \x01(\x0b\x32\x35.LicenseRequest.ContentIdentification.ExistingLicense\x1a_\n\x04\x43\x45NC\x12!\n\x04Pssh\x18\x01 \x01(\x0b\x32\x13.WidevineCencHeader\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"0\n\x0bRequestType\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa9\x07\n\x11LicenseRequestRaw\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12;\n\tContentId\x18\x02 \x01(\x0b\x32(.LicenseRequestRaw.ContentIdentification\x12,\n\x04Type\x18\x03 \x01(\x0e\x32\x1e.LicenseRequestRaw.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\x96\x04\n\x15\x43ontentIdentification\x12=\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32-.LicenseRequestRaw.ContentIdentification.CENC\x12=\n\x06WebmId\x18\x02 \x01(\x0b\x32-.LicenseRequestRaw.ContentIdentification.WebM\x12I\n\x07License\x18\x03 \x01(\x0b\x32\x38.LicenseRequestRaw.ContentIdentification.ExistingLicense\x1aJ\n\x04\x43\x45NC\x12\x0c\n\x04Pssh\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"0\n\x0bRequestType\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa6\x02\n\x15ProvisionedDeviceInfo\x12\x10\n\x08SystemId\x18\x01 \x01(\r\x12\x0b\n\x03Soc\x18\x02 \x01(\t\x12\x14\n\x0cManufacturer\x18\x03 \x01(\t\x12\r\n\x05Model\x18\x04 \x01(\t\x12\x12\n\nDeviceType\x18\x05 \x01(\t\x12\x11\n\tModelYear\x18\x06 \x01(\r\x12=\n\rSecurityLevel\x18\x07 \x01(\x0e\x32&.ProvisionedDeviceInfo.WvSecurityLevel\x12\x12\n\nTestDevice\x18\x08 \x01(\r\"O\n\x0fWvSecurityLevel\x12\x15\n\x11LEVEL_UNSPECIFIED\x10\x00\x12\x0b\n\x07LEVEL_1\x10\x01\x12\x0b\n\x07LEVEL_2\x10\x02\x12\x0b\n\x07LEVEL_3\x10\x03\"\x15\n\x13ProvisioningOptions\"\x15\n\x13ProvisioningRequest\"\x16\n\x14ProvisioningResponse\"i\n\x11RemoteAttestation\x12\x33\n\x0b\x43\x65rtificate\x18\x01 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x12\x0c\n\x04Salt\x18\x02 \x01(\t\x12\x11\n\tSignature\x18\x03 \x01(\t\"\r\n\x0bSessionInit\"\x0e\n\x0cSessionState\"\x1d\n\x1bSignedCertificateStatusList\"\x86\x01\n\x17SignedDeviceCertificate\x12.\n\x12_DeviceCertificate\x18\x01 \x01(\x0b\x32\x12.DeviceCertificate\x12\x11\n\tSignature\x18\x02 \x01(\x0c\x12(\n\x06Signer\x18\x03 \x01(\x0b\x32\x18.SignedDeviceCertificate\"\x1b\n\x19SignedProvisioningMessage\"\x9b\x02\n\rSignedMessage\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedMessage.MessageType\x12\x0b\n\x03Msg\x18\x02 \x01(\x0c\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc5\x02\n\x12WidevineCencHeader\x12\x30\n\talgorithm\x18\x01 \x01(\x0e\x32\x1d.WidevineCencHeader.Algorithm\x12\x0e\n\x06key_id\x18\x02 \x03(\x0c\x12\x10\n\x08provider\x18\x03 \x01(\t\x12\x12\n\ncontent_id\x18\x04 \x01(\x0c\x12\x1d\n\x15track_type_deprecated\x18\x05 \x01(\t\x12\x0e\n\x06policy\x18\x06 \x01(\t\x12\x1b\n\x13\x63rypto_period_index\x18\x07 \x01(\r\x12\x17\n\x0fgrouped_license\x18\x08 \x01(\x0c\x12\x19\n\x11protection_scheme\x18\t \x01(\r\x12\x1d\n\x15\x63rypto_period_seconds\x18\n \x01(\r\"(\n\tAlgorithm\x12\x0f\n\x0bUNENCRYPTED\x10\x00\x12\n\n\x06\x41\x45SCTR\x10\x01\"\xba\x02\n\x14SignedLicenseRequest\x12/\n\x04Type\x18\x01 \x01(\x0e\x32!.SignedLicenseRequest.MessageType\x12\x1c\n\x03Msg\x18\x02 \x01(\x0b\x32\x0f.LicenseRequest\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc3\x02\n\x17SignedLicenseRequestRaw\x12\x32\n\x04Type\x18\x01 \x01(\x0e\x32$.SignedLicenseRequestRaw.MessageType\x12\x1f\n\x03Msg\x18\x02 \x01(\x0b\x32\x12.LicenseRequestRaw\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xa5\x02\n\rSignedLicense\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedLicense.MessageType\x12\x15\n\x03Msg\x18\x02 \x01(\x0b\x32\x08.License\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xcb\x02\n\x18SignedServiceCertificate\x12\x33\n\x04Type\x18\x01 \x01(\x0e\x32%.SignedServiceCertificate.MessageType\x12%\n\x03Msg\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xb5\x01\n\nFileHashes\x12\x0e\n\x06signer\x18\x01 \x01(\x0c\x12)\n\nsignatures\x18\x02 \x03(\x0b\x32\x15.FileHashes.Signature\x1al\n\tSignature\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\x12\x14\n\x0ctest_signing\x18\x02 \x01(\x08\x12\x12\n\nSHA512Hash\x18\x03 \x01(\x0c\x12\x10\n\x08main_exe\x18\x04 \x01(\x08\x12\x11\n\tsignature\x18\x05 \x01(\x0c*1\n\x0bLicenseType\x12\x08\n\x04ZERO\x10\x00\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x01\x12\x0b\n\x07OFFLINE\x10\x02*\x1e\n\x0fProtocolVersion\x12\x0b\n\x07\x43URRENT\x10\x15') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +_LICENSETYPE = _descriptor.EnumDescriptor( + name='LicenseType', + full_name='LicenseType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ZERO', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OFFLINE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=8362, + serialized_end=8411, +) +_sym_db.RegisterEnumDescriptor(_LICENSETYPE) + +LicenseType = enum_type_wrapper.EnumTypeWrapper(_LICENSETYPE) +_PROTOCOLVERSION = _descriptor.EnumDescriptor( + name='ProtocolVersion', + full_name='ProtocolVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='CURRENT', index=0, number=21, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=8413, + serialized_end=8443, +) +_sym_db.RegisterEnumDescriptor(_PROTOCOLVERSION) + +ProtocolVersion = enum_type_wrapper.EnumTypeWrapper(_PROTOCOLVERSION) +ZERO = 0 +DEFAULT = 1 +OFFLINE = 2 +CURRENT = 21 + + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION = _descriptor.EnumDescriptor( + name='HdcpVersion', + full_name='ClientIdentification.ClientCapabilities.HdcpVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='HDCP_NONE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_1', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_2', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=617, + serialized_end=701, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION) + +_CLIENTIDENTIFICATION_TOKENTYPE = _descriptor.EnumDescriptor( + name='TokenType', + full_name='ClientIdentification.TokenType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='KEYBOX', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEVICE_CERTIFICATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REMOTE_ATTESTATION_CERTIFICATE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=703, + serialized_end=786, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_TOKENTYPE) + +_DEVICECERTIFICATE_CERTIFICATETYPE = _descriptor.EnumDescriptor( + name='CertificateType', + full_name='DeviceCertificate.CertificateType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ROOT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INTERMEDIATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='USER_DEVICE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=997, + serialized_end=1072, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATE_CERTIFICATETYPE) + +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS = _descriptor.EnumDescriptor( + name='CertificateStatus', + full_name='DeviceCertificateStatus.CertificateStatus', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='VALID', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1228, + serialized_end=1271, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS = _descriptor.EnumDescriptor( + name='CGMS', + full_name='License.KeyContainer.OutputProtection.CGMS', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='COPY_FREE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_ONCE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_NEVER', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CGMS_NONE', index=3, number=42, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2949, + serialized_end=3016, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS) + +_LICENSE_KEYCONTAINER_KEYTYPE = _descriptor.EnumDescriptor( + name='KeyType', + full_name='License.KeyContainer.KeyType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SIGNING', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CONTENT', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='KEY_CONTROL', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OPERATOR_SESSION', index=3, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3351, + serialized_end=3425, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_KEYTYPE) + +_LICENSE_KEYCONTAINER_SECURITYLEVEL = _descriptor.EnumDescriptor( + name='SecurityLevel', + full_name='License.KeyContainer.SecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SW_SECURE_CRYPTO', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SW_SECURE_DECODE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_CRYPTO', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_DECODE', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_ALL', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3427, + serialized_end=3549, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_SECURITYLEVEL) + +_LICENSEERROR_ERROR = _descriptor.EnumDescriptor( + name='Error', + full_name='LicenseError.Error', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='INVALID_DEVICE_CERTIFICATE', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED_DEVICE_CERTIFICATE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_UNAVAILABLE', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3608, + serialized_end=3704, +) +_sym_db.RegisterEnumDescriptor(_LICENSEERROR_ERROR) + +_LICENSEREQUEST_REQUESTTYPE = _descriptor.EnumDescriptor( + name='RequestType', + full_name='LicenseRequest.RequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NEW', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RENEWAL', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RELEASE', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4599, + serialized_end=4647, +) +_sym_db.RegisterEnumDescriptor(_LICENSEREQUEST_REQUESTTYPE) + +_LICENSEREQUESTRAW_REQUESTTYPE = _descriptor.EnumDescriptor( + name='RequestType', + full_name='LicenseRequestRaw.RequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NEW', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RENEWAL', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RELEASE', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4599, + serialized_end=4647, +) +_sym_db.RegisterEnumDescriptor(_LICENSEREQUESTRAW_REQUESTTYPE) + +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL = _descriptor.EnumDescriptor( + name='WvSecurityLevel', + full_name='ProvisionedDeviceInfo.WvSecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LEVEL_UNSPECIFIED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_3', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5805, + serialized_end=5884, +) +_sym_db.RegisterEnumDescriptor(_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL) + +_SIGNEDMESSAGE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedMessage.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDMESSAGE_MESSAGETYPE) + +_WIDEVINECENCHEADER_ALGORITHM = _descriptor.EnumDescriptor( + name='Algorithm', + full_name='WidevineCencHeader.Algorithm', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNENCRYPTED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='AESCTR', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6863, + serialized_end=6903, +) +_sym_db.RegisterEnumDescriptor(_WIDEVINECENCHEADER_ALGORITHM) + +_SIGNEDLICENSEREQUEST_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicenseRequest.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSEREQUEST_MESSAGETYPE) + +_SIGNEDLICENSEREQUESTRAW_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicenseRequestRaw.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSEREQUESTRAW_MESSAGETYPE) + +_SIGNEDLICENSE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicense.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSE_MESSAGETYPE) + +_SIGNEDSERVICECERTIFICATE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedServiceCertificate.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDSERVICECERTIFICATE_MESSAGETYPE) + + +_CLIENTIDENTIFICATION_NAMEVALUE = _descriptor.Descriptor( + name='NameValue', + full_name='ClientIdentification.NameValue', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Name', full_name='ClientIdentification.NameValue.Name', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Value', full_name='ClientIdentification.NameValue.Value', index=1, + number=2, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=366, + serialized_end=406, +) + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES = _descriptor.Descriptor( + name='ClientCapabilities', + full_name='ClientIdentification.ClientCapabilities', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientToken', full_name='ClientIdentification.ClientCapabilities.ClientToken', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionToken', full_name='ClientIdentification.ClientCapabilities.SessionToken', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='ClientIdentification.ClientCapabilities.VideoResolutionConstraints', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxHdcpVersion', full_name='ClientIdentification.ClientCapabilities.MaxHdcpVersion', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='OemCryptoApiVersion', full_name='ClientIdentification.ClientCapabilities.OemCryptoApiVersion', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=409, + serialized_end=701, +) + +_CLIENTIDENTIFICATION = _descriptor.Descriptor( + name='ClientIdentification', + full_name='ClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='ClientIdentification.Type', index=0, + number=1, type=14, cpp_type=8, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Token', full_name='ClientIdentification.Token', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ClientInfo', full_name='ClientIdentification.ClientInfo', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='ClientIdentification.ProviderClientToken', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseCounter', full_name='ClientIdentification.LicenseCounter', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_ClientCapabilities', full_name='ClientIdentification._ClientCapabilities', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_FileHashes', full_name='ClientIdentification._FileHashes', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_CLIENTIDENTIFICATION_NAMEVALUE, _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, ], + enum_types=[ + _CLIENTIDENTIFICATION_TOKENTYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=43, + serialized_end=786, +) + + +_DEVICECERTIFICATE = _descriptor.Descriptor( + name='DeviceCertificate', + full_name='DeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='DeviceCertificate.Type', index=0, + number=1, type=14, cpp_type=8, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificate.SerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificate.CreationTimeSeconds', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PublicKey', full_name='DeviceCertificate.PublicKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SystemId', full_name='DeviceCertificate.SystemId', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDeviceDeprecated', full_name='DeviceCertificate.TestDeviceDeprecated', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceId', full_name='DeviceCertificate.ServiceId', index=6, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATE_CERTIFICATETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=789, + serialized_end=1072, +) + + +_DEVICECERTIFICATESTATUS = _descriptor.Descriptor( + name='DeviceCertificateStatus', + full_name='DeviceCertificateStatus', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificateStatus.SerialNumber', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Status', full_name='DeviceCertificateStatus.Status', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceInfo', full_name='DeviceCertificateStatus.DeviceInfo', index=2, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1075, + serialized_end=1271, +) + + +_DEVICECERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='DeviceCertificateStatusList', + full_name='DeviceCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificateStatusList.CreationTimeSeconds', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CertificateStatus', full_name='DeviceCertificateStatusList.CertificateStatus', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1273, + serialized_end=1384, +) + + +_ENCRYPTEDCLIENTIDENTIFICATION = _descriptor.Descriptor( + name='EncryptedClientIdentification', + full_name='EncryptedClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ServiceId', full_name='EncryptedClientIdentification.ServiceId', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceCertificateSerialNumber', full_name='EncryptedClientIdentification.ServiceCertificateSerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='EncryptedClientIdentification.EncryptedClientId', index=2, + number=3, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientIdIv', full_name='EncryptedClientIdentification.EncryptedClientIdIv', index=3, + number=4, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedPrivacyKey', full_name='EncryptedClientIdentification.EncryptedPrivacyKey', index=4, + number=5, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1387, + serialized_end=1562, +) + + +_LICENSEIDENTIFICATION = _descriptor.Descriptor( + name='LicenseIdentification', + full_name='LicenseIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseIdentification.RequestId', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionId', full_name='LicenseIdentification.SessionId', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PurchaseId', full_name='LicenseIdentification.PurchaseId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseIdentification.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Version', full_name='LicenseIdentification.Version', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderSessionToken', full_name='LicenseIdentification.ProviderSessionToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1565, + serialized_end=1721, +) + + +_LICENSE_POLICY = _descriptor.Descriptor( + name='Policy', + full_name='License.Policy', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CanPlay', full_name='License.Policy.CanPlay', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanPersist', full_name='License.Policy.CanPersist', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanRenew', full_name='License.Policy.CanRenew', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RentalDurationSeconds', full_name='License.Policy.RentalDurationSeconds', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PlaybackDurationSeconds', full_name='License.Policy.PlaybackDurationSeconds', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseDurationSeconds', full_name='License.Policy.LicenseDurationSeconds', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRecoveryDurationSeconds', full_name='License.Policy.RenewalRecoveryDurationSeconds', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalServerUrl', full_name='License.Policy.RenewalServerUrl', index=7, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalDelaySeconds', full_name='License.Policy.RenewalDelaySeconds', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRetryIntervalSeconds', full_name='License.Policy.RenewalRetryIntervalSeconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewWithUsage', full_name='License.Policy.RenewWithUsage', index=10, + number=11, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1958, + serialized_end=2273, +) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION = _descriptor.Descriptor( + name='OutputProtection', + full_name='License.KeyContainer.OutputProtection', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Hdcp', full_name='License.KeyContainer.OutputProtection.Hdcp', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CgmsFlags', full_name='License.KeyContainer.OutputProtection.CgmsFlags', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2797, + serialized_end=3016, +) + +_LICENSE_KEYCONTAINER_KEYCONTROL = _descriptor.Descriptor( + name='KeyControl', + full_name='License.KeyContainer.KeyControl', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='KeyControlBlock', full_name='License.KeyContainer.KeyControl.KeyControlBlock', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.KeyControl.Iv', index=1, + number=2, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3018, + serialized_end=3067, +) + +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS = _descriptor.Descriptor( + name='OperatorSessionKeyPermissions', + full_name='License.KeyContainer.OperatorSessionKeyPermissions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='AllowEncrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowEncrypt', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowDecrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowDecrypt', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSign', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSign', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSignatureVerify', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSignatureVerify', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3069, + serialized_end=3193, +) + +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT = _descriptor.Descriptor( + name='VideoResolutionConstraint', + full_name='License.KeyContainer.VideoResolutionConstraint', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='MinResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MinResolutionPixels', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MaxResolutionPixels', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.VideoResolutionConstraint.RequiredProtection', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3196, + serialized_end=3349, +) + +_LICENSE_KEYCONTAINER = _descriptor.Descriptor( + name='KeyContainer', + full_name='License.KeyContainer', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.KeyContainer.Id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.Iv', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.KeyContainer.Key', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='License.KeyContainer.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Level', full_name='License.KeyContainer.Level', index=4, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.RequiredProtection', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestedProtection', full_name='License.KeyContainer.RequestedProtection', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_KeyControl', full_name='License.KeyContainer._KeyControl', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_OperatorSessionKeyPermissions', full_name='License.KeyContainer._OperatorSessionKeyPermissions', index=8, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='License.KeyContainer.VideoResolutionConstraints', index=9, + number=10, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_KEYCONTAINER_OUTPUTPROTECTION, _LICENSE_KEYCONTAINER_KEYCONTROL, _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, ], + enum_types=[ + _LICENSE_KEYCONTAINER_KEYTYPE, + _LICENSE_KEYCONTAINER_SECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2276, + serialized_end=3549, +) + +_LICENSE = _descriptor.Descriptor( + name='License', + full_name='License', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.Id', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_Policy', full_name='License._Policy', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.Key', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseStartTime', full_name='License.LicenseStartTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestationVerified', full_name='License.RemoteAttestationVerified', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='License.ProviderClientToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtectionScheme', full_name='License.ProtectionScheme', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_POLICY, _LICENSE_KEYCONTAINER, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1724, + serialized_end=3549, +) + + +_LICENSEERROR = _descriptor.Descriptor( + name='LicenseError', + full_name='LicenseError', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ErrorCode', full_name='LicenseError.ErrorCode', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSEERROR_ERROR, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3552, + serialized_end=3704, +) + + +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC = _descriptor.Descriptor( + name='CENC', + full_name='LicenseRequest.ContentIdentification.CENC', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Pssh', full_name='LicenseRequest.ContentIdentification.CENC.Pssh', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.CENC.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.CENC.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4268, + serialized_end=4363, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM = _descriptor.Descriptor( + name='WebM', + full_name='LicenseRequest.ContentIdentification.WebM', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Header', full_name='LicenseRequest.ContentIdentification.WebM.Header', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.WebM.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.WebM.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4365, + serialized_end=4441, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE = _descriptor.Descriptor( + name='ExistingLicense', + full_name='LicenseRequest.ContentIdentification.ExistingLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='LicenseId', full_name='LicenseRequest.ContentIdentification.ExistingLicense.LicenseId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceStarted', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceStarted', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceLastPlayed', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceLastPlayed', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionUsageTableEntry', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SessionUsageTableEntry', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4444, + serialized_end=4597, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION = _descriptor.Descriptor( + name='ContentIdentification', + full_name='LicenseRequest.ContentIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CencId', full_name='LicenseRequest.ContentIdentification.CencId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='WebmId', full_name='LicenseRequest.ContentIdentification.WebmId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='License', full_name='LicenseRequest.ContentIdentification.License', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4051, + serialized_end=4597, +) + +_LICENSEREQUEST = _descriptor.Descriptor( + name='LicenseRequest', + full_name='LicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientId', full_name='LicenseRequest.ClientId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ContentId', full_name='LicenseRequest.ContentId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseRequest.Type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestTime', full_name='LicenseRequest.RequestTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonceDeprecated', full_name='LicenseRequest.KeyControlNonceDeprecated', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtocolVersion', full_name='LicenseRequest.ProtocolVersion', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=21, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonce', full_name='LicenseRequest.KeyControlNonce', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='LicenseRequest.EncryptedClientId', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION, ], + enum_types=[ + _LICENSEREQUEST_REQUESTTYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3707, + serialized_end=4647, +) + + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC = _descriptor.Descriptor( + name='CENC', + full_name='LicenseRequestRaw.ContentIdentification.CENC', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Pssh', full_name='LicenseRequestRaw.ContentIdentification.CENC.Pssh', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequestRaw.ContentIdentification.CENC.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequestRaw.ContentIdentification.CENC.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5229, + serialized_end=5303, +) + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM = _descriptor.Descriptor( + name='WebM', + full_name='LicenseRequestRaw.ContentIdentification.WebM', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Header', full_name='LicenseRequestRaw.ContentIdentification.WebM.Header', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequestRaw.ContentIdentification.WebM.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequestRaw.ContentIdentification.WebM.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4365, + serialized_end=4441, +) + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE = _descriptor.Descriptor( + name='ExistingLicense', + full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='LicenseId', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.LicenseId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceStarted', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.SecondsSinceStarted', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceLastPlayed', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.SecondsSinceLastPlayed', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionUsageTableEntry', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.SessionUsageTableEntry', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4444, + serialized_end=4597, +) + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION = _descriptor.Descriptor( + name='ContentIdentification', + full_name='LicenseRequestRaw.ContentIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CencId', full_name='LicenseRequestRaw.ContentIdentification.CencId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='WebmId', full_name='LicenseRequestRaw.ContentIdentification.WebmId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='License', full_name='LicenseRequestRaw.ContentIdentification.License', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC, _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM, _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5003, + serialized_end=5537, +) + +_LICENSEREQUESTRAW = _descriptor.Descriptor( + name='LicenseRequestRaw', + full_name='LicenseRequestRaw', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientId', full_name='LicenseRequestRaw.ClientId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ContentId', full_name='LicenseRequestRaw.ContentId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseRequestRaw.Type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestTime', full_name='LicenseRequestRaw.RequestTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonceDeprecated', full_name='LicenseRequestRaw.KeyControlNonceDeprecated', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtocolVersion', full_name='LicenseRequestRaw.ProtocolVersion', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=21, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonce', full_name='LicenseRequestRaw.KeyControlNonce', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='LicenseRequestRaw.EncryptedClientId', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUESTRAW_CONTENTIDENTIFICATION, ], + enum_types=[ + _LICENSEREQUESTRAW_REQUESTTYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4650, + serialized_end=5587, +) + + +_PROVISIONEDDEVICEINFO = _descriptor.Descriptor( + name='ProvisionedDeviceInfo', + full_name='ProvisionedDeviceInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SystemId', full_name='ProvisionedDeviceInfo.SystemId', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Soc', full_name='ProvisionedDeviceInfo.Soc', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Manufacturer', full_name='ProvisionedDeviceInfo.Manufacturer', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Model', full_name='ProvisionedDeviceInfo.Model', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceType', full_name='ProvisionedDeviceInfo.DeviceType', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ModelYear', full_name='ProvisionedDeviceInfo.ModelYear', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecurityLevel', full_name='ProvisionedDeviceInfo.SecurityLevel', index=6, + number=7, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDevice', full_name='ProvisionedDeviceInfo.TestDevice', index=7, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5590, + serialized_end=5884, +) + + +_PROVISIONINGOPTIONS = _descriptor.Descriptor( + name='ProvisioningOptions', + full_name='ProvisioningOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5886, + serialized_end=5907, +) + + +_PROVISIONINGREQUEST = _descriptor.Descriptor( + name='ProvisioningRequest', + full_name='ProvisioningRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5909, + serialized_end=5930, +) + + +_PROVISIONINGRESPONSE = _descriptor.Descriptor( + name='ProvisioningResponse', + full_name='ProvisioningResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5932, + serialized_end=5954, +) + + +_REMOTEATTESTATION = _descriptor.Descriptor( + name='RemoteAttestation', + full_name='RemoteAttestation', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Certificate', full_name='RemoteAttestation.Certificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Salt', full_name='RemoteAttestation.Salt', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='RemoteAttestation.Signature', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5956, + serialized_end=6061, +) + + +_SESSIONINIT = _descriptor.Descriptor( + name='SessionInit', + full_name='SessionInit', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6063, + serialized_end=6076, +) + + +_SESSIONSTATE = _descriptor.Descriptor( + name='SessionState', + full_name='SessionState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6078, + serialized_end=6092, +) + + +_SIGNEDCERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='SignedCertificateStatusList', + full_name='SignedCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6094, + serialized_end=6123, +) + + +_SIGNEDDEVICECERTIFICATE = _descriptor.Descriptor( + name='SignedDeviceCertificate', + full_name='SignedDeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='_DeviceCertificate', full_name='SignedDeviceCertificate._DeviceCertificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedDeviceCertificate.Signature', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signer', full_name='SignedDeviceCertificate.Signer', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6126, + serialized_end=6260, +) + + +_SIGNEDPROVISIONINGMESSAGE = _descriptor.Descriptor( + name='SignedProvisioningMessage', + full_name='SignedProvisioningMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6262, + serialized_end=6289, +) + + +_SIGNEDMESSAGE = _descriptor.Descriptor( + name='SignedMessage', + full_name='SignedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedMessage.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedMessage.Msg', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedMessage.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedMessage.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedMessage.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDMESSAGE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6292, + serialized_end=6575, +) + + +_WIDEVINECENCHEADER = _descriptor.Descriptor( + name='WidevineCencHeader', + full_name='WidevineCencHeader', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='algorithm', full_name='WidevineCencHeader.algorithm', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='key_id', full_name='WidevineCencHeader.key_id', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='provider', full_name='WidevineCencHeader.provider', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='content_id', full_name='WidevineCencHeader.content_id', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='track_type_deprecated', full_name='WidevineCencHeader.track_type_deprecated', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='policy', full_name='WidevineCencHeader.policy', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_index', full_name='WidevineCencHeader.crypto_period_index', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='grouped_license', full_name='WidevineCencHeader.grouped_license', index=7, + number=8, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='protection_scheme', full_name='WidevineCencHeader.protection_scheme', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_seconds', full_name='WidevineCencHeader.crypto_period_seconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _WIDEVINECENCHEADER_ALGORITHM, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6578, + serialized_end=6903, +) + + +_SIGNEDLICENSEREQUEST = _descriptor.Descriptor( + name='SignedLicenseRequest', + full_name='SignedLicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicenseRequest.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicenseRequest.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicenseRequest.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicenseRequest.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicenseRequest.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSEREQUEST_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6906, + serialized_end=7220, +) + + +_SIGNEDLICENSEREQUESTRAW = _descriptor.Descriptor( + name='SignedLicenseRequestRaw', + full_name='SignedLicenseRequestRaw', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicenseRequestRaw.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicenseRequestRaw.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicenseRequestRaw.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicenseRequestRaw.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicenseRequestRaw.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSEREQUESTRAW_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7223, + serialized_end=7546, +) + + +_SIGNEDLICENSE = _descriptor.Descriptor( + name='SignedLicense', + full_name='SignedLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicense.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicense.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicense.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicense.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicense.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7549, + serialized_end=7842, +) + + +_SIGNEDSERVICECERTIFICATE = _descriptor.Descriptor( + name='SignedServiceCertificate', + full_name='SignedServiceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedServiceCertificate.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedServiceCertificate.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedServiceCertificate.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedServiceCertificate.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedServiceCertificate.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDSERVICECERTIFICATE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7845, + serialized_end=8176, +) + + +_FILEHASHES_SIGNATURE = _descriptor.Descriptor( + name='Signature', + full_name='FileHashes.Signature', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='filename', full_name='FileHashes.Signature.filename', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='test_signing', full_name='FileHashes.Signature.test_signing', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SHA512Hash', full_name='FileHashes.Signature.SHA512Hash', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='main_exe', full_name='FileHashes.Signature.main_exe', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='signature', full_name='FileHashes.Signature.signature', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8252, + serialized_end=8360, +) + +_FILEHASHES = _descriptor.Descriptor( + name='FileHashes', + full_name='FileHashes', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='signer', full_name='FileHashes.signer', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='signatures', full_name='FileHashes.signatures', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_FILEHASHES_SIGNATURE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8179, + serialized_end=8360, +) + +_CLIENTIDENTIFICATION_NAMEVALUE.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.fields_by_name['MaxHdcpVersion'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION.containing_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION.fields_by_name['Type'].enum_type = _CLIENTIDENTIFICATION_TOKENTYPE +_CLIENTIDENTIFICATION.fields_by_name['Token'].message_type = _SIGNEDDEVICECERTIFICATE +_CLIENTIDENTIFICATION.fields_by_name['ClientInfo'].message_type = _CLIENTIDENTIFICATION_NAMEVALUE +_CLIENTIDENTIFICATION.fields_by_name['_ClientCapabilities'].message_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION.fields_by_name['_FileHashes'].message_type = _FILEHASHES +_CLIENTIDENTIFICATION_TOKENTYPE.containing_type = _CLIENTIDENTIFICATION +_DEVICECERTIFICATE.fields_by_name['Type'].enum_type = _DEVICECERTIFICATE_CERTIFICATETYPE +_DEVICECERTIFICATE_CERTIFICATETYPE.containing_type = _DEVICECERTIFICATE +_DEVICECERTIFICATESTATUS.fields_by_name['Status'].enum_type = _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS +_DEVICECERTIFICATESTATUS.fields_by_name['DeviceInfo'].message_type = _PROVISIONEDDEVICEINFO +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS.containing_type = _DEVICECERTIFICATESTATUS +_DEVICECERTIFICATESTATUSLIST.fields_by_name['CertificateStatus'].message_type = _DEVICECERTIFICATESTATUS +_LICENSEIDENTIFICATION.fields_by_name['Type'].enum_type = _LICENSETYPE +_LICENSE_POLICY.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['Hdcp'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['CgmsFlags'].enum_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS.containing_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_KEYCONTROL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER.fields_by_name['Type'].enum_type = _LICENSE_KEYCONTAINER_KEYTYPE +_LICENSE_KEYCONTAINER.fields_by_name['Level'].enum_type = _LICENSE_KEYCONTAINER_SECURITYLEVEL +_LICENSE_KEYCONTAINER.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['RequestedProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['_KeyControl'].message_type = _LICENSE_KEYCONTAINER_KEYCONTROL +_LICENSE_KEYCONTAINER.fields_by_name['_OperatorSessionKeyPermissions'].message_type = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS +_LICENSE_KEYCONTAINER.fields_by_name['VideoResolutionConstraints'].message_type = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT +_LICENSE_KEYCONTAINER.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_KEYTYPE.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_SECURITYLEVEL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE.fields_by_name['Id'].message_type = _LICENSEIDENTIFICATION +_LICENSE.fields_by_name['_Policy'].message_type = _LICENSE_POLICY +_LICENSE.fields_by_name['Key'].message_type = _LICENSE_KEYCONTAINER +_LICENSEERROR.fields_by_name['ErrorCode'].enum_type = _LICENSEERROR_ERROR +_LICENSEERROR_ERROR.containing_type = _LICENSEERROR +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['Pssh'].message_type = _WIDEVINECENCHEADER +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.fields_by_name['LicenseId'].message_type = _LICENSEIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['CencId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['WebmId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['License'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE +_LICENSEREQUEST_CONTENTIDENTIFICATION.containing_type = _LICENSEREQUEST +_LICENSEREQUEST.fields_by_name['ClientId'].message_type = _CLIENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['ContentId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['Type'].enum_type = _LICENSEREQUEST_REQUESTTYPE +_LICENSEREQUEST.fields_by_name['ProtocolVersion'].enum_type = _PROTOCOLVERSION +_LICENSEREQUEST.fields_by_name['EncryptedClientId'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_LICENSEREQUEST_REQUESTTYPE.containing_type = _LICENSEREQUEST +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC.containing_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM.containing_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE.fields_by_name['LicenseId'].message_type = _LICENSEIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE.containing_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.fields_by_name['CencId'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.fields_by_name['WebmId'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.fields_by_name['License'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.containing_type = _LICENSEREQUESTRAW +_LICENSEREQUESTRAW.fields_by_name['ClientId'].message_type = _CLIENTIDENTIFICATION +_LICENSEREQUESTRAW.fields_by_name['ContentId'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW.fields_by_name['Type'].enum_type = _LICENSEREQUESTRAW_REQUESTTYPE +_LICENSEREQUESTRAW.fields_by_name['ProtocolVersion'].enum_type = _PROTOCOLVERSION +_LICENSEREQUESTRAW.fields_by_name['EncryptedClientId'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_LICENSEREQUESTRAW_REQUESTTYPE.containing_type = _LICENSEREQUESTRAW +_PROVISIONEDDEVICEINFO.fields_by_name['SecurityLevel'].enum_type = _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL.containing_type = _PROVISIONEDDEVICEINFO +_REMOTEATTESTATION.fields_by_name['Certificate'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_SIGNEDDEVICECERTIFICATE.fields_by_name['_DeviceCertificate'].message_type = _DEVICECERTIFICATE +_SIGNEDDEVICECERTIFICATE.fields_by_name['Signer'].message_type = _SIGNEDDEVICECERTIFICATE +_SIGNEDMESSAGE.fields_by_name['Type'].enum_type = _SIGNEDMESSAGE_MESSAGETYPE +_SIGNEDMESSAGE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDMESSAGE_MESSAGETYPE.containing_type = _SIGNEDMESSAGE +_WIDEVINECENCHEADER.fields_by_name['algorithm'].enum_type = _WIDEVINECENCHEADER_ALGORITHM +_WIDEVINECENCHEADER_ALGORITHM.containing_type = _WIDEVINECENCHEADER +_SIGNEDLICENSEREQUEST.fields_by_name['Type'].enum_type = _SIGNEDLICENSEREQUEST_MESSAGETYPE +_SIGNEDLICENSEREQUEST.fields_by_name['Msg'].message_type = _LICENSEREQUEST +_SIGNEDLICENSEREQUEST.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSEREQUEST_MESSAGETYPE.containing_type = _SIGNEDLICENSEREQUEST +_SIGNEDLICENSEREQUESTRAW.fields_by_name['Type'].enum_type = _SIGNEDLICENSEREQUESTRAW_MESSAGETYPE +_SIGNEDLICENSEREQUESTRAW.fields_by_name['Msg'].message_type = _LICENSEREQUESTRAW +_SIGNEDLICENSEREQUESTRAW.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSEREQUESTRAW_MESSAGETYPE.containing_type = _SIGNEDLICENSEREQUESTRAW +_SIGNEDLICENSE.fields_by_name['Type'].enum_type = _SIGNEDLICENSE_MESSAGETYPE +_SIGNEDLICENSE.fields_by_name['Msg'].message_type = _LICENSE +_SIGNEDLICENSE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSE_MESSAGETYPE.containing_type = _SIGNEDLICENSE +_SIGNEDSERVICECERTIFICATE.fields_by_name['Type'].enum_type = _SIGNEDSERVICECERTIFICATE_MESSAGETYPE +_SIGNEDSERVICECERTIFICATE.fields_by_name['Msg'].message_type = _SIGNEDDEVICECERTIFICATE +_SIGNEDSERVICECERTIFICATE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDSERVICECERTIFICATE_MESSAGETYPE.containing_type = _SIGNEDSERVICECERTIFICATE +_FILEHASHES_SIGNATURE.containing_type = _FILEHASHES +_FILEHASHES.fields_by_name['signatures'].message_type = _FILEHASHES_SIGNATURE +DESCRIPTOR.message_types_by_name['ClientIdentification'] = _CLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['DeviceCertificate'] = _DEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['DeviceCertificateStatus'] = _DEVICECERTIFICATESTATUS +DESCRIPTOR.message_types_by_name['DeviceCertificateStatusList'] = _DEVICECERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['EncryptedClientIdentification'] = _ENCRYPTEDCLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['LicenseIdentification'] = _LICENSEIDENTIFICATION +DESCRIPTOR.message_types_by_name['License'] = _LICENSE +DESCRIPTOR.message_types_by_name['LicenseError'] = _LICENSEERROR +DESCRIPTOR.message_types_by_name['LicenseRequest'] = _LICENSEREQUEST +DESCRIPTOR.message_types_by_name['LicenseRequestRaw'] = _LICENSEREQUESTRAW +DESCRIPTOR.message_types_by_name['ProvisionedDeviceInfo'] = _PROVISIONEDDEVICEINFO +DESCRIPTOR.message_types_by_name['ProvisioningOptions'] = _PROVISIONINGOPTIONS +DESCRIPTOR.message_types_by_name['ProvisioningRequest'] = _PROVISIONINGREQUEST +DESCRIPTOR.message_types_by_name['ProvisioningResponse'] = _PROVISIONINGRESPONSE +DESCRIPTOR.message_types_by_name['RemoteAttestation'] = _REMOTEATTESTATION +DESCRIPTOR.message_types_by_name['SessionInit'] = _SESSIONINIT +DESCRIPTOR.message_types_by_name['SessionState'] = _SESSIONSTATE +DESCRIPTOR.message_types_by_name['SignedCertificateStatusList'] = _SIGNEDCERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['SignedDeviceCertificate'] = _SIGNEDDEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['SignedProvisioningMessage'] = _SIGNEDPROVISIONINGMESSAGE +DESCRIPTOR.message_types_by_name['SignedMessage'] = _SIGNEDMESSAGE +DESCRIPTOR.message_types_by_name['WidevineCencHeader'] = _WIDEVINECENCHEADER +DESCRIPTOR.message_types_by_name['SignedLicenseRequest'] = _SIGNEDLICENSEREQUEST +DESCRIPTOR.message_types_by_name['SignedLicenseRequestRaw'] = _SIGNEDLICENSEREQUESTRAW +DESCRIPTOR.message_types_by_name['SignedLicense'] = _SIGNEDLICENSE +DESCRIPTOR.message_types_by_name['SignedServiceCertificate'] = _SIGNEDSERVICECERTIFICATE +DESCRIPTOR.message_types_by_name['FileHashes'] = _FILEHASHES +DESCRIPTOR.enum_types_by_name['LicenseType'] = _LICENSETYPE +DESCRIPTOR.enum_types_by_name['ProtocolVersion'] = _PROTOCOLVERSION + +ClientIdentification = _reflection.GeneratedProtocolMessageType('ClientIdentification', (_message.Message,), dict( + + NameValue = _reflection.GeneratedProtocolMessageType('NameValue', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_NAMEVALUE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.NameValue) + )) + , + + ClientCapabilities = _reflection.GeneratedProtocolMessageType('ClientCapabilities', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.ClientCapabilities) + )) + , + DESCRIPTOR = _CLIENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification) + )) +_sym_db.RegisterMessage(ClientIdentification) +_sym_db.RegisterMessage(ClientIdentification.NameValue) +_sym_db.RegisterMessage(ClientIdentification.ClientCapabilities) + +DeviceCertificate = _reflection.GeneratedProtocolMessageType('DeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificate) + )) +_sym_db.RegisterMessage(DeviceCertificate) + +DeviceCertificateStatus = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatus', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUS, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatus) + )) +_sym_db.RegisterMessage(DeviceCertificateStatus) + +DeviceCertificateStatusList = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUSLIST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatusList) + )) +_sym_db.RegisterMessage(DeviceCertificateStatusList) + +EncryptedClientIdentification = _reflection.GeneratedProtocolMessageType('EncryptedClientIdentification', (_message.Message,), dict( + DESCRIPTOR = _ENCRYPTEDCLIENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:EncryptedClientIdentification) + )) +_sym_db.RegisterMessage(EncryptedClientIdentification) + +LicenseIdentification = _reflection.GeneratedProtocolMessageType('LicenseIdentification', (_message.Message,), dict( + DESCRIPTOR = _LICENSEIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseIdentification) + )) +_sym_db.RegisterMessage(LicenseIdentification) + +License = _reflection.GeneratedProtocolMessageType('License', (_message.Message,), dict( + + Policy = _reflection.GeneratedProtocolMessageType('Policy', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_POLICY, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.Policy) + )) + , + + KeyContainer = _reflection.GeneratedProtocolMessageType('KeyContainer', (_message.Message,), dict( + + OutputProtection = _reflection.GeneratedProtocolMessageType('OutputProtection', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OutputProtection) + )) + , + + KeyControl = _reflection.GeneratedProtocolMessageType('KeyControl', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_KEYCONTROL, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.KeyControl) + )) + , + + OperatorSessionKeyPermissions = _reflection.GeneratedProtocolMessageType('OperatorSessionKeyPermissions', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OperatorSessionKeyPermissions) + )) + , + + VideoResolutionConstraint = _reflection.GeneratedProtocolMessageType('VideoResolutionConstraint', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.VideoResolutionConstraint) + )) + , + DESCRIPTOR = _LICENSE_KEYCONTAINER, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer) + )) + , + DESCRIPTOR = _LICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License) + )) +_sym_db.RegisterMessage(License) +_sym_db.RegisterMessage(License.Policy) +_sym_db.RegisterMessage(License.KeyContainer) +_sym_db.RegisterMessage(License.KeyContainer.OutputProtection) +_sym_db.RegisterMessage(License.KeyContainer.KeyControl) +_sym_db.RegisterMessage(License.KeyContainer.OperatorSessionKeyPermissions) +_sym_db.RegisterMessage(License.KeyContainer.VideoResolutionConstraint) + +LicenseError = _reflection.GeneratedProtocolMessageType('LicenseError', (_message.Message,), dict( + DESCRIPTOR = _LICENSEERROR, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseError) + )) +_sym_db.RegisterMessage(LicenseError) + +LicenseRequest = _reflection.GeneratedProtocolMessageType('LicenseRequest', (_message.Message,), dict( + + ContentIdentification = _reflection.GeneratedProtocolMessageType('ContentIdentification', (_message.Message,), dict( + + CENC = _reflection.GeneratedProtocolMessageType('CENC', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.CENC) + )) + , + + WebM = _reflection.GeneratedProtocolMessageType('WebM', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.WebM) + )) + , + + ExistingLicense = _reflection.GeneratedProtocolMessageType('ExistingLicense', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.ExistingLicense) + )) + , + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification) + )) + , + DESCRIPTOR = _LICENSEREQUEST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest) + )) +_sym_db.RegisterMessage(LicenseRequest) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.CENC) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.WebM) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.ExistingLicense) + +LicenseRequestRaw = _reflection.GeneratedProtocolMessageType('LicenseRequestRaw', (_message.Message,), dict( + + ContentIdentification = _reflection.GeneratedProtocolMessageType('ContentIdentification', (_message.Message,), dict( + + CENC = _reflection.GeneratedProtocolMessageType('CENC', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification.CENC) + )) + , + + WebM = _reflection.GeneratedProtocolMessageType('WebM', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification.WebM) + )) + , + + ExistingLicense = _reflection.GeneratedProtocolMessageType('ExistingLicense', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification.ExistingLicense) + )) + , + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification) + )) + , + DESCRIPTOR = _LICENSEREQUESTRAW, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw) + )) +_sym_db.RegisterMessage(LicenseRequestRaw) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification.CENC) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification.WebM) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification.ExistingLicense) + +ProvisionedDeviceInfo = _reflection.GeneratedProtocolMessageType('ProvisionedDeviceInfo', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONEDDEVICEINFO, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisionedDeviceInfo) + )) +_sym_db.RegisterMessage(ProvisionedDeviceInfo) + +ProvisioningOptions = _reflection.GeneratedProtocolMessageType('ProvisioningOptions', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGOPTIONS, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningOptions) + )) +_sym_db.RegisterMessage(ProvisioningOptions) + +ProvisioningRequest = _reflection.GeneratedProtocolMessageType('ProvisioningRequest', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGREQUEST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningRequest) + )) +_sym_db.RegisterMessage(ProvisioningRequest) + +ProvisioningResponse = _reflection.GeneratedProtocolMessageType('ProvisioningResponse', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGRESPONSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningResponse) + )) +_sym_db.RegisterMessage(ProvisioningResponse) + +RemoteAttestation = _reflection.GeneratedProtocolMessageType('RemoteAttestation', (_message.Message,), dict( + DESCRIPTOR = _REMOTEATTESTATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:RemoteAttestation) + )) +_sym_db.RegisterMessage(RemoteAttestation) + +SessionInit = _reflection.GeneratedProtocolMessageType('SessionInit', (_message.Message,), dict( + DESCRIPTOR = _SESSIONINIT, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SessionInit) + )) +_sym_db.RegisterMessage(SessionInit) + +SessionState = _reflection.GeneratedProtocolMessageType('SessionState', (_message.Message,), dict( + DESCRIPTOR = _SESSIONSTATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SessionState) + )) +_sym_db.RegisterMessage(SessionState) + +SignedCertificateStatusList = _reflection.GeneratedProtocolMessageType('SignedCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDCERTIFICATESTATUSLIST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedCertificateStatusList) + )) +_sym_db.RegisterMessage(SignedCertificateStatusList) + +SignedDeviceCertificate = _reflection.GeneratedProtocolMessageType('SignedDeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDDEVICECERTIFICATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedDeviceCertificate) + )) +_sym_db.RegisterMessage(SignedDeviceCertificate) + +SignedProvisioningMessage = _reflection.GeneratedProtocolMessageType('SignedProvisioningMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDPROVISIONINGMESSAGE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedProvisioningMessage) + )) +_sym_db.RegisterMessage(SignedProvisioningMessage) + +SignedMessage = _reflection.GeneratedProtocolMessageType('SignedMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDMESSAGE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedMessage) + )) +_sym_db.RegisterMessage(SignedMessage) + +WidevineCencHeader = _reflection.GeneratedProtocolMessageType('WidevineCencHeader', (_message.Message,), dict( + DESCRIPTOR = _WIDEVINECENCHEADER, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:WidevineCencHeader) + )) +_sym_db.RegisterMessage(WidevineCencHeader) + +SignedLicenseRequest = _reflection.GeneratedProtocolMessageType('SignedLicenseRequest', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSEREQUEST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedLicenseRequest) + )) +_sym_db.RegisterMessage(SignedLicenseRequest) + +SignedLicenseRequestRaw = _reflection.GeneratedProtocolMessageType('SignedLicenseRequestRaw', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSEREQUESTRAW, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedLicenseRequestRaw) + )) +_sym_db.RegisterMessage(SignedLicenseRequestRaw) + +SignedLicense = _reflection.GeneratedProtocolMessageType('SignedLicense', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedLicense) + )) +_sym_db.RegisterMessage(SignedLicense) + +SignedServiceCertificate = _reflection.GeneratedProtocolMessageType('SignedServiceCertificate', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDSERVICECERTIFICATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedServiceCertificate) + )) +_sym_db.RegisterMessage(SignedServiceCertificate) + +FileHashes = _reflection.GeneratedProtocolMessageType('FileHashes', (_message.Message,), dict( + + Signature = _reflection.GeneratedProtocolMessageType('Signature', (_message.Message,), dict( + DESCRIPTOR = _FILEHASHES_SIGNATURE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:FileHashes.Signature) + )) + , + DESCRIPTOR = _FILEHASHES, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:FileHashes) + )) +_sym_db.RegisterMessage(FileHashes) +_sym_db.RegisterMessage(FileHashes.Signature) + + +# @@protoc_insertion_point(module_scope) diff --git a/pywidevine/L1/cdm/formats/wv_proto3.proto b/pywidevine/L1/cdm/formats/wv_proto3.proto new file mode 100644 index 0000000..7861b02 --- /dev/null +++ b/pywidevine/L1/cdm/formats/wv_proto3.proto @@ -0,0 +1,389 @@ +// beware proto3 won't show missing fields it seems, need to change to "proto2" and add "optional" before every field, and remove all the dummy enum members I added: +syntax = "proto3"; + +// from x86 (partial), most of it from the ARM version: +message ClientIdentification { + enum TokenType { + KEYBOX = 0; + DEVICE_CERTIFICATE = 1; + REMOTE_ATTESTATION_CERTIFICATE = 2; + } + message NameValue { + string Name = 1; + string Value = 2; + } + message ClientCapabilities { + enum HdcpVersion { + HDCP_NONE = 0; + HDCP_V1 = 1; + HDCP_V2 = 2; + HDCP_V2_1 = 3; + HDCP_V2_2 = 4; + } + uint32 ClientToken = 1; + uint32 SessionToken = 2; + uint32 VideoResolutionConstraints = 3; + HdcpVersion MaxHdcpVersion = 4; + uint32 OemCryptoApiVersion = 5; + } + TokenType Type = 1; + //bytes Token = 2; // by default the client treats this as blob, but it's usually a DeviceCertificate, so for usefulness sake, I'm replacing it with this one: + SignedDeviceCertificate Token = 2; + repeated NameValue ClientInfo = 3; + bytes ProviderClientToken = 4; + uint32 LicenseCounter = 5; + ClientCapabilities _ClientCapabilities = 6; // how should we deal with duped names? will have to look at proto docs later +} + +message DeviceCertificate { + enum CertificateType { + ROOT = 0; + INTERMEDIATE = 1; + USER_DEVICE = 2; + SERVICE = 3; + } + //ProvisionedDeviceInfo.WvSecurityLevel Type = 1; // is this how one is supposed to call it? (it's an enum) there might be a bug here, with CertificateType getting confused with WvSecurityLevel, for now renaming it (verify against other binaries) + CertificateType Type = 1; + bytes SerialNumber = 2; + uint32 CreationTimeSeconds = 3; + bytes PublicKey = 4; + uint32 SystemId = 5; + uint32 TestDeviceDeprecated = 6; // is it bool or int? + bytes ServiceId = 7; // service URL for service certificates +} + +// missing some references, +message DeviceCertificateStatus { + enum CertificateStatus { + VALID = 0; + REVOKED = 1; + } + bytes SerialNumber = 1; + CertificateStatus Status = 2; + ProvisionedDeviceInfo DeviceInfo = 4; // where is 3? is it deprecated? +} + +message DeviceCertificateStatusList { + uint32 CreationTimeSeconds = 1; + repeated DeviceCertificateStatus CertificateStatus = 2; +} + +message EncryptedClientIdentification { + string ServiceId = 1; + bytes ServiceCertificateSerialNumber = 2; + bytes EncryptedClientId = 3; + bytes EncryptedClientIdIv = 4; + bytes EncryptedPrivacyKey = 5; +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +enum LicenseType { + ZERO = 0; + DEFAULT = 1; // do not know what this is either, but should be 1; on recent versions may go up to 3 (latest x86) +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +// this is just a guess because these globals got lost, but really, do we need more? +enum ProtocolVersion { + DUMMY = 0; + CURRENT = 21; // don't have symbols for this +} + + +message LicenseIdentification { + bytes RequestId = 1; + bytes SessionId = 2; + bytes PurchaseId = 3; + LicenseType Type = 4; + uint32 Version = 5; + bytes ProviderSessionToken = 6; +} + + +message License { + message Policy { + uint32 CanPlay = 1; + uint32 CanPersist = 2; + uint32 CanRenew = 3; + uint32 RentalDurationSeconds = 4; + uint32 PlaybackDurationSeconds = 5; + uint32 LicenseDurationSeconds = 6; + uint32 RenewalRecoveryDurationSeconds = 7; + string RenewalServerUrl = 8; + uint32 RenewalDelaySeconds = 9; + uint32 RenewalRetryIntervalSeconds = 10; + uint32 RenewWithUsage = 11; + uint32 UnknownPolicy12 = 12; + } + message KeyContainer { + enum KeyType { + _NOKEYTYPE = 0; // dummy, added to satisfy proto3, not present in original + SIGNING = 1; + CONTENT = 2; + KEY_CONTROL = 3; + OPERATOR_SESSION = 4; + } + enum SecurityLevel { + _NOSECLEVEL = 0; // dummy, added to satisfy proto3, not present in original + SW_SECURE_CRYPTO = 1; + SW_SECURE_DECODE = 2; + HW_SECURE_CRYPTO = 3; + HW_SECURE_DECODE = 4; + HW_SECURE_ALL = 5; + } + message OutputProtection { + enum CGMS { + COPY_FREE = 0; + COPY_ONCE = 2; + COPY_NEVER = 3; + CGMS_NONE = 0x2A; // PC default! + } + ClientIdentification.ClientCapabilities.HdcpVersion Hdcp = 1; // it's most likely a copy of Hdcp version available here, but compiler optimized it away + CGMS CgmsFlags = 2; + } + message KeyControl { + bytes KeyControlBlock = 1; // what is this? + bytes Iv = 2; + } + message OperatorSessionKeyPermissions { + uint32 AllowEncrypt = 1; + uint32 AllowDecrypt = 2; + uint32 AllowSign = 3; + uint32 AllowSignatureVerify = 4; + } + message VideoResolutionConstraint { + uint32 MinResolutionPixels = 1; + uint32 MaxResolutionPixels = 2; + OutputProtection RequiredProtection = 3; + } + bytes Id = 1; + bytes Iv = 2; + bytes Key = 3; + KeyType Type = 4; + SecurityLevel Level = 5; + OutputProtection RequiredProtection = 6; + OutputProtection RequestedProtection = 7; + KeyControl _KeyControl = 8; // duped names, etc + OperatorSessionKeyPermissions _OperatorSessionKeyPermissions = 9; // duped names, etc + repeated VideoResolutionConstraint VideoResolutionConstraints = 10; + } + LicenseIdentification Id = 1; + Policy _Policy = 2; // duped names, etc + repeated KeyContainer Key = 3; + uint32 LicenseStartTime = 4; + uint32 RemoteAttestationVerified = 5; // bool? + bytes ProviderClientToken = 6; + // there might be more, check with newer versions (I see field 7-8 in a lic) + // this appeared in latest x86: + uint32 ProtectionScheme = 7; // type unconfirmed fully, but it's likely as WidevineCencHeader describesit (fourcc) + bytes UnknownHdcpDataField = 8; +} + +message LicenseError { + enum Error { + DUMMY_NO_ERROR = 0; // dummy, added to satisfy proto3 + INVALID_DEVICE_CERTIFICATE = 1; + REVOKED_DEVICE_CERTIFICATE = 2; + SERVICE_UNAVAILABLE = 3; + } + //LicenseRequest.RequestType ErrorCode; // clang mismatch + Error ErrorCode = 1; +} + +message LicenseRequest { + message ContentIdentification { + message CENC { + // bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: + WidevineCencHeader Pssh = 1; + LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 + bytes RequestId = 3; + } + message WebM { + bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used + LicenseType LicenseType = 2; + bytes RequestId = 3; + } + message ExistingLicense { + LicenseIdentification LicenseId = 1; + uint32 SecondsSinceStarted = 2; + uint32 SecondsSinceLastPlayed = 3; + bytes SessionUsageTableEntry = 4; + } + CENC CencId = 1; + WebM WebmId = 2; + ExistingLicense License = 3; + } + enum RequestType { + DUMMY_REQ_TYPE = 0; // dummy, added to satisfy proto3 + NEW = 1; + RENEWAL = 2; + RELEASE = 3; + } + ClientIdentification ClientId = 1; + ContentIdentification ContentId = 2; + RequestType Type = 3; + uint32 RequestTime = 4; + bytes KeyControlNonceDeprecated = 5; + ProtocolVersion ProtocolVersion = 6; // lacking symbols for this + uint32 KeyControlNonce = 7; + EncryptedClientIdentification EncryptedClientId = 8; +} + +message ProvisionedDeviceInfo { + enum WvSecurityLevel { + LEVEL_UNSPECIFIED = 0; + LEVEL_1 = 1; + LEVEL_2 = 2; + LEVEL_3 = 3; + } + uint32 SystemId = 1; + string Soc = 2; + string Manufacturer = 3; + string Model = 4; + string DeviceType = 5; + uint32 ModelYear = 6; + WvSecurityLevel SecurityLevel = 7; + uint32 TestDevice = 8; // bool? +} + + +// todo: fill +message ProvisioningOptions { +} + +// todo: fill +message ProvisioningRequest { +} + +// todo: fill +message ProvisioningResponse { +} + +message RemoteAttestation { + EncryptedClientIdentification Certificate = 1; + string Salt = 2; + string Signature = 3; +} + +// todo: fill +message SessionInit { +} + +// todo: fill +message SessionState { +} + +// todo: fill +message SignedCertificateStatusList { +} + +message SignedDeviceCertificate { + + //bytes DeviceCertificate = 1; // again, they use a buffer where it's supposed to be a message, so we'll replace it with what it really is: + DeviceCertificate _DeviceCertificate = 1; // how should we deal with duped names? will have to look at proto docs later + bytes Signature = 2; + SignedDeviceCertificate Signer = 3; +} + + +// todo: fill +message SignedProvisioningMessage { +} + +// the root of all messages, from either server or client +message SignedMessage { + enum MessageType { + DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + bytes Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + bytes SessionKey = 4; // often RSA wrapped for licenses + RemoteAttestation RemoteAttestation = 5; +} + + + +// This message is copied from google's docs, not reversed: +message WidevineCencHeader { + enum Algorithm { + UNENCRYPTED = 0; + AESCTR = 1; + }; + Algorithm algorithm = 1; + repeated bytes key_id = 2; + + // Content provider name. + string provider = 3; + + // A content identifier, specified by content provider. + bytes content_id = 4; + + // Track type. Acceptable values are SD, HD and AUDIO. Used to + // differentiate content keys used by an asset. + string track_type_deprecated = 5; + + // The name of a registered policy to be used for this asset. + string policy = 6; + + // Crypto period index, for media using key rotation. + uint32 crypto_period_index = 7; + + // Optional protected context for group content. The grouped_license is a + // serialized SignedMessage. + bytes grouped_license = 8; + + // Protection scheme identifying the encryption algorithm. + // Represented as one of the following 4CC values: + // 'cenc' (AESCTR), 'cbc1' (AESCBC), + // 'cens' (AESCTR subsample), 'cbcs' (AESCBC subsample). + uint32 protection_scheme = 9; + + // Optional. For media using key rotation, this represents the duration + // of each crypto period in seconds. + uint32 crypto_period_seconds = 10; +} + + + + +// from here on, it's just for testing, these messages don't exist in the binaries, I'm adding them to avoid detecting type programmatically +message SignedLicenseRequest { + enum MessageType { + DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + LicenseRequest Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + bytes SessionKey = 4; // often RSA wrapped for licenses + RemoteAttestation RemoteAttestation = 5; +} + +message SignedLicense { + enum MessageType { + DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + License Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + bytes SessionKey = 4; // often RSA wrapped for licenses + RemoteAttestation RemoteAttestation = 5; +} \ No newline at end of file diff --git a/pywidevine/L1/cdm/formats/wv_proto3_pb2.py b/pywidevine/L1/cdm/formats/wv_proto3_pb2.py new file mode 100644 index 0000000..11ae09f --- /dev/null +++ b/pywidevine/L1/cdm/formats/wv_proto3_pb2.py @@ -0,0 +1,2686 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: wv_proto3.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='wv_proto3.proto', + package='', + syntax='proto3', + serialized_pb=_b('\n\x0fwv_proto3.proto\"\xc5\x05\n\x14\x43lientIdentification\x12-\n\x04Type\x18\x01 \x01(\x0e\x32\x1f.ClientIdentification.TokenType\x12\'\n\x05Token\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x33\n\nClientInfo\x18\x03 \x03(\x0b\x32\x1f.ClientIdentification.NameValue\x12\x1b\n\x13ProviderClientToken\x18\x04 \x01(\x0c\x12\x16\n\x0eLicenseCounter\x18\x05 \x01(\r\x12\x45\n\x13_ClientCapabilities\x18\x06 \x01(\x0b\x32(.ClientIdentification.ClientCapabilities\x1a(\n\tNameValue\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\r\n\x05Value\x18\x02 \x01(\t\x1a\xa4\x02\n\x12\x43lientCapabilities\x12\x13\n\x0b\x43lientToken\x18\x01 \x01(\r\x12\x14\n\x0cSessionToken\x18\x02 \x01(\r\x12\"\n\x1aVideoResolutionConstraints\x18\x03 \x01(\r\x12L\n\x0eMaxHdcpVersion\x18\x04 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12\x1b\n\x13OemCryptoApiVersion\x18\x05 \x01(\r\"T\n\x0bHdcpVersion\x12\r\n\tHDCP_NONE\x10\x00\x12\x0b\n\x07HDCP_V1\x10\x01\x12\x0b\n\x07HDCP_V2\x10\x02\x12\r\n\tHDCP_V2_1\x10\x03\x12\r\n\tHDCP_V2_2\x10\x04\"S\n\tTokenType\x12\n\n\x06KEYBOX\x10\x00\x12\x16\n\x12\x44\x45VICE_CERTIFICATE\x10\x01\x12\"\n\x1eREMOTE_ATTESTATION_CERTIFICATE\x10\x02\"\x9b\x02\n\x11\x44\x65viceCertificate\x12\x30\n\x04Type\x18\x01 \x01(\x0e\x32\".DeviceCertificate.CertificateType\x12\x14\n\x0cSerialNumber\x18\x02 \x01(\x0c\x12\x1b\n\x13\x43reationTimeSeconds\x18\x03 \x01(\r\x12\x11\n\tPublicKey\x18\x04 \x01(\x0c\x12\x10\n\x08SystemId\x18\x05 \x01(\r\x12\x1c\n\x14TestDeviceDeprecated\x18\x06 \x01(\r\x12\x11\n\tServiceId\x18\x07 \x01(\x0c\"K\n\x0f\x43\x65rtificateType\x12\x08\n\x04ROOT\x10\x00\x12\x10\n\x0cINTERMEDIATE\x10\x01\x12\x0f\n\x0bUSER_DEVICE\x10\x02\x12\x0b\n\x07SERVICE\x10\x03\"\xc4\x01\n\x17\x44\x65viceCertificateStatus\x12\x14\n\x0cSerialNumber\x18\x01 \x01(\x0c\x12:\n\x06Status\x18\x02 \x01(\x0e\x32*.DeviceCertificateStatus.CertificateStatus\x12*\n\nDeviceInfo\x18\x04 \x01(\x0b\x32\x16.ProvisionedDeviceInfo\"+\n\x11\x43\x65rtificateStatus\x12\t\n\x05VALID\x10\x00\x12\x0b\n\x07REVOKED\x10\x01\"o\n\x1b\x44\x65viceCertificateStatusList\x12\x1b\n\x13\x43reationTimeSeconds\x18\x01 \x01(\r\x12\x33\n\x11\x43\x65rtificateStatus\x18\x02 \x03(\x0b\x32\x18.DeviceCertificateStatus\"\xaf\x01\n\x1d\x45ncryptedClientIdentification\x12\x11\n\tServiceId\x18\x01 \x01(\t\x12&\n\x1eServiceCertificateSerialNumber\x18\x02 \x01(\x0c\x12\x19\n\x11\x45ncryptedClientId\x18\x03 \x01(\x0c\x12\x1b\n\x13\x45ncryptedClientIdIv\x18\x04 \x01(\x0c\x12\x1b\n\x13\x45ncryptedPrivacyKey\x18\x05 \x01(\x0c\"\x9c\x01\n\x15LicenseIdentification\x12\x11\n\tRequestId\x18\x01 \x01(\x0c\x12\x11\n\tSessionId\x18\x02 \x01(\x0c\x12\x12\n\nPurchaseId\x18\x03 \x01(\x0c\x12\x1a\n\x04Type\x18\x04 \x01(\x0e\x32\x0c.LicenseType\x12\x0f\n\x07Version\x18\x05 \x01(\r\x12\x1c\n\x14ProviderSessionToken\x18\x06 \x01(\x0c\"\xfa\x0e\n\x07License\x12\"\n\x02Id\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12 \n\x07_Policy\x18\x02 \x01(\x0b\x32\x0f.License.Policy\x12\"\n\x03Key\x18\x03 \x03(\x0b\x32\x15.License.KeyContainer\x12\x18\n\x10LicenseStartTime\x18\x04 \x01(\r\x12!\n\x19RemoteAttestationVerified\x18\x05 \x01(\r\x12\x1b\n\x13ProviderClientToken\x18\x06 \x01(\x0c\x12\x18\n\x10ProtectionScheme\x18\x07 \x01(\r\x12\x1c\n\x14UnknownHdcpDataField\x18\x08 \x01(\x0c\x1a\xd4\x02\n\x06Policy\x12\x0f\n\x07\x43\x61nPlay\x18\x01 \x01(\r\x12\x12\n\nCanPersist\x18\x02 \x01(\r\x12\x10\n\x08\x43\x61nRenew\x18\x03 \x01(\r\x12\x1d\n\x15RentalDurationSeconds\x18\x04 \x01(\r\x12\x1f\n\x17PlaybackDurationSeconds\x18\x05 \x01(\r\x12\x1e\n\x16LicenseDurationSeconds\x18\x06 \x01(\r\x12&\n\x1eRenewalRecoveryDurationSeconds\x18\x07 \x01(\r\x12\x18\n\x10RenewalServerUrl\x18\x08 \x01(\t\x12\x1b\n\x13RenewalDelaySeconds\x18\t \x01(\r\x12#\n\x1bRenewalRetryIntervalSeconds\x18\n \x01(\r\x12\x16\n\x0eRenewWithUsage\x18\x0b \x01(\r\x12\x17\n\x0fUnknownPolicy12\x18\x0c \x01(\r\x1a\x9b\n\n\x0cKeyContainer\x12\n\n\x02Id\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x12\x0b\n\x03Key\x18\x03 \x01(\x0c\x12+\n\x04Type\x18\x04 \x01(\x0e\x32\x1d.License.KeyContainer.KeyType\x12\x32\n\x05Level\x18\x05 \x01(\x0e\x32#.License.KeyContainer.SecurityLevel\x12\x42\n\x12RequiredProtection\x18\x06 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x43\n\x13RequestedProtection\x18\x07 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x35\n\x0b_KeyControl\x18\x08 \x01(\x0b\x32 .License.KeyContainer.KeyControl\x12[\n\x1e_OperatorSessionKeyPermissions\x18\t \x01(\x0b\x32\x33.License.KeyContainer.OperatorSessionKeyPermissions\x12S\n\x1aVideoResolutionConstraints\x18\n \x03(\x0b\x32/.License.KeyContainer.VideoResolutionConstraint\x1a\xdb\x01\n\x10OutputProtection\x12\x42\n\x04Hdcp\x18\x01 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12>\n\tCgmsFlags\x18\x02 \x01(\x0e\x32+.License.KeyContainer.OutputProtection.CGMS\"C\n\x04\x43GMS\x12\r\n\tCOPY_FREE\x10\x00\x12\r\n\tCOPY_ONCE\x10\x02\x12\x0e\n\nCOPY_NEVER\x10\x03\x12\r\n\tCGMS_NONE\x10*\x1a\x31\n\nKeyControl\x12\x17\n\x0fKeyControlBlock\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x1a|\n\x1dOperatorSessionKeyPermissions\x12\x14\n\x0c\x41llowEncrypt\x18\x01 \x01(\r\x12\x14\n\x0c\x41llowDecrypt\x18\x02 \x01(\r\x12\x11\n\tAllowSign\x18\x03 \x01(\r\x12\x1c\n\x14\x41llowSignatureVerify\x18\x04 \x01(\r\x1a\x99\x01\n\x19VideoResolutionConstraint\x12\x1b\n\x13MinResolutionPixels\x18\x01 \x01(\r\x12\x1b\n\x13MaxResolutionPixels\x18\x02 \x01(\r\x12\x42\n\x12RequiredProtection\x18\x03 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\"Z\n\x07KeyType\x12\x0e\n\n_NOKEYTYPE\x10\x00\x12\x0b\n\x07SIGNING\x10\x01\x12\x0b\n\x07\x43ONTENT\x10\x02\x12\x0f\n\x0bKEY_CONTROL\x10\x03\x12\x14\n\x10OPERATOR_SESSION\x10\x04\"\x8b\x01\n\rSecurityLevel\x12\x0f\n\x0b_NOSECLEVEL\x10\x00\x12\x14\n\x10SW_SECURE_CRYPTO\x10\x01\x12\x14\n\x10SW_SECURE_DECODE\x10\x02\x12\x14\n\x10HW_SECURE_CRYPTO\x10\x03\x12\x14\n\x10HW_SECURE_DECODE\x10\x04\x12\x11\n\rHW_SECURE_ALL\x10\x05\"\xac\x01\n\x0cLicenseError\x12&\n\tErrorCode\x18\x01 \x01(\x0e\x32\x13.LicenseError.Error\"t\n\x05\x45rror\x12\x12\n\x0e\x44UMMY_NO_ERROR\x10\x00\x12\x1e\n\x1aINVALID_DEVICE_CERTIFICATE\x10\x01\x12\x1e\n\x1aREVOKED_DEVICE_CERTIFICATE\x10\x02\x12\x17\n\x13SERVICE_UNAVAILABLE\x10\x03\"\xc0\x07\n\x0eLicenseRequest\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12\x38\n\tContentId\x18\x02 \x01(\x0b\x32%.LicenseRequest.ContentIdentification\x12)\n\x04Type\x18\x03 \x01(\x0e\x32\x1b.LicenseRequest.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\xa2\x04\n\x15\x43ontentIdentification\x12:\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.CENC\x12:\n\x06WebmId\x18\x02 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.WebM\x12\x46\n\x07License\x18\x03 \x01(\x0b\x32\x35.LicenseRequest.ContentIdentification.ExistingLicense\x1a_\n\x04\x43\x45NC\x12!\n\x04Pssh\x18\x01 \x01(\x0b\x32\x13.WidevineCencHeader\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"D\n\x0bRequestType\x12\x12\n\x0e\x44UMMY_REQ_TYPE\x10\x00\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa6\x02\n\x15ProvisionedDeviceInfo\x12\x10\n\x08SystemId\x18\x01 \x01(\r\x12\x0b\n\x03Soc\x18\x02 \x01(\t\x12\x14\n\x0cManufacturer\x18\x03 \x01(\t\x12\r\n\x05Model\x18\x04 \x01(\t\x12\x12\n\nDeviceType\x18\x05 \x01(\t\x12\x11\n\tModelYear\x18\x06 \x01(\r\x12=\n\rSecurityLevel\x18\x07 \x01(\x0e\x32&.ProvisionedDeviceInfo.WvSecurityLevel\x12\x12\n\nTestDevice\x18\x08 \x01(\r\"O\n\x0fWvSecurityLevel\x12\x15\n\x11LEVEL_UNSPECIFIED\x10\x00\x12\x0b\n\x07LEVEL_1\x10\x01\x12\x0b\n\x07LEVEL_2\x10\x02\x12\x0b\n\x07LEVEL_3\x10\x03\"\x15\n\x13ProvisioningOptions\"\x15\n\x13ProvisioningRequest\"\x16\n\x14ProvisioningResponse\"i\n\x11RemoteAttestation\x12\x33\n\x0b\x43\x65rtificate\x18\x01 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x12\x0c\n\x04Salt\x18\x02 \x01(\t\x12\x11\n\tSignature\x18\x03 \x01(\t\"\r\n\x0bSessionInit\"\x0e\n\x0cSessionState\"\x1d\n\x1bSignedCertificateStatusList\"\x86\x01\n\x17SignedDeviceCertificate\x12.\n\x12_DeviceCertificate\x18\x01 \x01(\x0b\x32\x12.DeviceCertificate\x12\x11\n\tSignature\x18\x02 \x01(\x0c\x12(\n\x06Signer\x18\x03 \x01(\x0b\x32\x18.SignedDeviceCertificate\"\x1b\n\x19SignedProvisioningMessage\"\xb0\x02\n\rSignedMessage\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedMessage.MessageType\x12\x0b\n\x03Msg\x18\x02 \x01(\x0c\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc5\x02\n\x12WidevineCencHeader\x12\x30\n\talgorithm\x18\x01 \x01(\x0e\x32\x1d.WidevineCencHeader.Algorithm\x12\x0e\n\x06key_id\x18\x02 \x03(\x0c\x12\x10\n\x08provider\x18\x03 \x01(\t\x12\x12\n\ncontent_id\x18\x04 \x01(\x0c\x12\x1d\n\x15track_type_deprecated\x18\x05 \x01(\t\x12\x0e\n\x06policy\x18\x06 \x01(\t\x12\x1b\n\x13\x63rypto_period_index\x18\x07 \x01(\r\x12\x17\n\x0fgrouped_license\x18\x08 \x01(\x0c\x12\x19\n\x11protection_scheme\x18\t \x01(\r\x12\x1d\n\x15\x63rypto_period_seconds\x18\n \x01(\r\"(\n\tAlgorithm\x12\x0f\n\x0bUNENCRYPTED\x10\x00\x12\n\n\x06\x41\x45SCTR\x10\x01\"\xcf\x02\n\x14SignedLicenseRequest\x12/\n\x04Type\x18\x01 \x01(\x0e\x32!.SignedLicenseRequest.MessageType\x12\x1c\n\x03Msg\x18\x02 \x01(\x0b\x32\x0f.LicenseRequest\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xba\x02\n\rSignedLicense\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedLicense.MessageType\x12\x15\n\x03Msg\x18\x02 \x01(\x0b\x32\x08.License\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05*$\n\x0bLicenseType\x12\x08\n\x04ZERO\x10\x00\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x01*)\n\x0fProtocolVersion\x12\t\n\x05\x44UMMY\x10\x00\x12\x0b\n\x07\x43URRENT\x10\x15\x62\x06proto3') +) + +_LICENSETYPE = _descriptor.EnumDescriptor( + name='LicenseType', + full_name='LicenseType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ZERO', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6713, + serialized_end=6749, +) +_sym_db.RegisterEnumDescriptor(_LICENSETYPE) + +LicenseType = enum_type_wrapper.EnumTypeWrapper(_LICENSETYPE) +_PROTOCOLVERSION = _descriptor.EnumDescriptor( + name='ProtocolVersion', + full_name='ProtocolVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CURRENT', index=1, number=21, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6751, + serialized_end=6792, +) +_sym_db.RegisterEnumDescriptor(_PROTOCOLVERSION) + +ProtocolVersion = enum_type_wrapper.EnumTypeWrapper(_PROTOCOLVERSION) +ZERO = 0 +DEFAULT = 1 +DUMMY = 0 +CURRENT = 21 + + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION = _descriptor.EnumDescriptor( + name='HdcpVersion', + full_name='ClientIdentification.ClientCapabilities.HdcpVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='HDCP_NONE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_1', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_2', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=560, + serialized_end=644, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION) + +_CLIENTIDENTIFICATION_TOKENTYPE = _descriptor.EnumDescriptor( + name='TokenType', + full_name='ClientIdentification.TokenType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='KEYBOX', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEVICE_CERTIFICATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REMOTE_ATTESTATION_CERTIFICATE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=646, + serialized_end=729, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_TOKENTYPE) + +_DEVICECERTIFICATE_CERTIFICATETYPE = _descriptor.EnumDescriptor( + name='CertificateType', + full_name='DeviceCertificate.CertificateType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ROOT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INTERMEDIATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='USER_DEVICE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=940, + serialized_end=1015, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATE_CERTIFICATETYPE) + +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS = _descriptor.EnumDescriptor( + name='CertificateStatus', + full_name='DeviceCertificateStatus.CertificateStatus', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='VALID', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1171, + serialized_end=1214, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS = _descriptor.EnumDescriptor( + name='CGMS', + full_name='License.KeyContainer.OutputProtection.CGMS', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='COPY_FREE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_ONCE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_NEVER', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CGMS_NONE', index=3, number=42, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2947, + serialized_end=3014, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS) + +_LICENSE_KEYCONTAINER_KEYTYPE = _descriptor.EnumDescriptor( + name='KeyType', + full_name='License.KeyContainer.KeyType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='_NOKEYTYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SIGNING', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CONTENT', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='KEY_CONTROL', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OPERATOR_SESSION', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3349, + serialized_end=3439, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_KEYTYPE) + +_LICENSE_KEYCONTAINER_SECURITYLEVEL = _descriptor.EnumDescriptor( + name='SecurityLevel', + full_name='License.KeyContainer.SecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='_NOSECLEVEL', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SW_SECURE_CRYPTO', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SW_SECURE_DECODE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_CRYPTO', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_DECODE', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_ALL', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3442, + serialized_end=3581, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_SECURITYLEVEL) + +_LICENSEERROR_ERROR = _descriptor.EnumDescriptor( + name='Error', + full_name='LicenseError.Error', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_NO_ERROR', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INVALID_DEVICE_CERTIFICATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED_DEVICE_CERTIFICATE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_UNAVAILABLE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3640, + serialized_end=3756, +) +_sym_db.RegisterEnumDescriptor(_LICENSEERROR_ERROR) + +_LICENSEREQUEST_REQUESTTYPE = _descriptor.EnumDescriptor( + name='RequestType', + full_name='LicenseRequest.RequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_REQ_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NEW', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RENEWAL', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RELEASE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4651, + serialized_end=4719, +) +_sym_db.RegisterEnumDescriptor(_LICENSEREQUEST_REQUESTTYPE) + +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL = _descriptor.EnumDescriptor( + name='WvSecurityLevel', + full_name='ProvisionedDeviceInfo.WvSecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LEVEL_UNSPECIFIED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_3', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4937, + serialized_end=5016, +) +_sym_db.RegisterEnumDescriptor(_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL) + +_SIGNEDMESSAGE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedMessage.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_MSG_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5583, + serialized_end=5728, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDMESSAGE_MESSAGETYPE) + +_WIDEVINECENCHEADER_ALGORITHM = _descriptor.EnumDescriptor( + name='Algorithm', + full_name='WidevineCencHeader.Algorithm', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNENCRYPTED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='AESCTR', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6016, + serialized_end=6056, +) +_sym_db.RegisterEnumDescriptor(_WIDEVINECENCHEADER_ALGORITHM) + +_SIGNEDLICENSEREQUEST_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicenseRequest.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_MSG_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5583, + serialized_end=5728, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSEREQUEST_MESSAGETYPE) + +_SIGNEDLICENSE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicense.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_MSG_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5583, + serialized_end=5728, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSE_MESSAGETYPE) + + +_CLIENTIDENTIFICATION_NAMEVALUE = _descriptor.Descriptor( + name='NameValue', + full_name='ClientIdentification.NameValue', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Name', full_name='ClientIdentification.NameValue.Name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Value', full_name='ClientIdentification.NameValue.Value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=309, + serialized_end=349, +) + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES = _descriptor.Descriptor( + name='ClientCapabilities', + full_name='ClientIdentification.ClientCapabilities', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientToken', full_name='ClientIdentification.ClientCapabilities.ClientToken', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionToken', full_name='ClientIdentification.ClientCapabilities.SessionToken', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='ClientIdentification.ClientCapabilities.VideoResolutionConstraints', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxHdcpVersion', full_name='ClientIdentification.ClientCapabilities.MaxHdcpVersion', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='OemCryptoApiVersion', full_name='ClientIdentification.ClientCapabilities.OemCryptoApiVersion', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=352, + serialized_end=644, +) + +_CLIENTIDENTIFICATION = _descriptor.Descriptor( + name='ClientIdentification', + full_name='ClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='ClientIdentification.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Token', full_name='ClientIdentification.Token', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ClientInfo', full_name='ClientIdentification.ClientInfo', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='ClientIdentification.ProviderClientToken', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseCounter', full_name='ClientIdentification.LicenseCounter', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_ClientCapabilities', full_name='ClientIdentification._ClientCapabilities', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_CLIENTIDENTIFICATION_NAMEVALUE, _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, ], + enum_types=[ + _CLIENTIDENTIFICATION_TOKENTYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=20, + serialized_end=729, +) + + +_DEVICECERTIFICATE = _descriptor.Descriptor( + name='DeviceCertificate', + full_name='DeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='DeviceCertificate.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificate.SerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificate.CreationTimeSeconds', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PublicKey', full_name='DeviceCertificate.PublicKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SystemId', full_name='DeviceCertificate.SystemId', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDeviceDeprecated', full_name='DeviceCertificate.TestDeviceDeprecated', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceId', full_name='DeviceCertificate.ServiceId', index=6, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATE_CERTIFICATETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=732, + serialized_end=1015, +) + + +_DEVICECERTIFICATESTATUS = _descriptor.Descriptor( + name='DeviceCertificateStatus', + full_name='DeviceCertificateStatus', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificateStatus.SerialNumber', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Status', full_name='DeviceCertificateStatus.Status', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceInfo', full_name='DeviceCertificateStatus.DeviceInfo', index=2, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1018, + serialized_end=1214, +) + + +_DEVICECERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='DeviceCertificateStatusList', + full_name='DeviceCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificateStatusList.CreationTimeSeconds', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CertificateStatus', full_name='DeviceCertificateStatusList.CertificateStatus', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1216, + serialized_end=1327, +) + + +_ENCRYPTEDCLIENTIDENTIFICATION = _descriptor.Descriptor( + name='EncryptedClientIdentification', + full_name='EncryptedClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ServiceId', full_name='EncryptedClientIdentification.ServiceId', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceCertificateSerialNumber', full_name='EncryptedClientIdentification.ServiceCertificateSerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='EncryptedClientIdentification.EncryptedClientId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientIdIv', full_name='EncryptedClientIdentification.EncryptedClientIdIv', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedPrivacyKey', full_name='EncryptedClientIdentification.EncryptedPrivacyKey', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1330, + serialized_end=1505, +) + + +_LICENSEIDENTIFICATION = _descriptor.Descriptor( + name='LicenseIdentification', + full_name='LicenseIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseIdentification.RequestId', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionId', full_name='LicenseIdentification.SessionId', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PurchaseId', full_name='LicenseIdentification.PurchaseId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseIdentification.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Version', full_name='LicenseIdentification.Version', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderSessionToken', full_name='LicenseIdentification.ProviderSessionToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1508, + serialized_end=1664, +) + + +_LICENSE_POLICY = _descriptor.Descriptor( + name='Policy', + full_name='License.Policy', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CanPlay', full_name='License.Policy.CanPlay', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanPersist', full_name='License.Policy.CanPersist', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanRenew', full_name='License.Policy.CanRenew', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RentalDurationSeconds', full_name='License.Policy.RentalDurationSeconds', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PlaybackDurationSeconds', full_name='License.Policy.PlaybackDurationSeconds', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseDurationSeconds', full_name='License.Policy.LicenseDurationSeconds', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRecoveryDurationSeconds', full_name='License.Policy.RenewalRecoveryDurationSeconds', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalServerUrl', full_name='License.Policy.RenewalServerUrl', index=7, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalDelaySeconds', full_name='License.Policy.RenewalDelaySeconds', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRetryIntervalSeconds', full_name='License.Policy.RenewalRetryIntervalSeconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewWithUsage', full_name='License.Policy.RenewWithUsage', index=10, + number=11, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='UnknownPolicy12', full_name='License.Policy.UnknownPolicy12', index=11, + number=12, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1931, + serialized_end=2271, +) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION = _descriptor.Descriptor( + name='OutputProtection', + full_name='License.KeyContainer.OutputProtection', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Hdcp', full_name='License.KeyContainer.OutputProtection.Hdcp', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CgmsFlags', full_name='License.KeyContainer.OutputProtection.CgmsFlags', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2795, + serialized_end=3014, +) + +_LICENSE_KEYCONTAINER_KEYCONTROL = _descriptor.Descriptor( + name='KeyControl', + full_name='License.KeyContainer.KeyControl', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='KeyControlBlock', full_name='License.KeyContainer.KeyControl.KeyControlBlock', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.KeyControl.Iv', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3016, + serialized_end=3065, +) + +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS = _descriptor.Descriptor( + name='OperatorSessionKeyPermissions', + full_name='License.KeyContainer.OperatorSessionKeyPermissions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='AllowEncrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowEncrypt', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowDecrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowDecrypt', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSign', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSign', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSignatureVerify', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSignatureVerify', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3067, + serialized_end=3191, +) + +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT = _descriptor.Descriptor( + name='VideoResolutionConstraint', + full_name='License.KeyContainer.VideoResolutionConstraint', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='MinResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MinResolutionPixels', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MaxResolutionPixels', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.VideoResolutionConstraint.RequiredProtection', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3194, + serialized_end=3347, +) + +_LICENSE_KEYCONTAINER = _descriptor.Descriptor( + name='KeyContainer', + full_name='License.KeyContainer', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.KeyContainer.Id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.Iv', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.KeyContainer.Key', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='License.KeyContainer.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Level', full_name='License.KeyContainer.Level', index=4, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.RequiredProtection', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestedProtection', full_name='License.KeyContainer.RequestedProtection', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_KeyControl', full_name='License.KeyContainer._KeyControl', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_OperatorSessionKeyPermissions', full_name='License.KeyContainer._OperatorSessionKeyPermissions', index=8, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='License.KeyContainer.VideoResolutionConstraints', index=9, + number=10, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_KEYCONTAINER_OUTPUTPROTECTION, _LICENSE_KEYCONTAINER_KEYCONTROL, _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, ], + enum_types=[ + _LICENSE_KEYCONTAINER_KEYTYPE, + _LICENSE_KEYCONTAINER_SECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2274, + serialized_end=3581, +) + +_LICENSE = _descriptor.Descriptor( + name='License', + full_name='License', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.Id', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_Policy', full_name='License._Policy', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.Key', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseStartTime', full_name='License.LicenseStartTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestationVerified', full_name='License.RemoteAttestationVerified', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='License.ProviderClientToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtectionScheme', full_name='License.ProtectionScheme', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='UnknownHdcpDataField', full_name='License.UnknownHdcpDataField', index=7, + number=8, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_POLICY, _LICENSE_KEYCONTAINER, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1667, + serialized_end=3581, +) + + +_LICENSEERROR = _descriptor.Descriptor( + name='LicenseError', + full_name='LicenseError', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ErrorCode', full_name='LicenseError.ErrorCode', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSEERROR_ERROR, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3584, + serialized_end=3756, +) + + +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC = _descriptor.Descriptor( + name='CENC', + full_name='LicenseRequest.ContentIdentification.CENC', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Pssh', full_name='LicenseRequest.ContentIdentification.CENC.Pssh', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.CENC.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.CENC.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4320, + serialized_end=4415, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM = _descriptor.Descriptor( + name='WebM', + full_name='LicenseRequest.ContentIdentification.WebM', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Header', full_name='LicenseRequest.ContentIdentification.WebM.Header', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.WebM.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.WebM.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4417, + serialized_end=4493, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE = _descriptor.Descriptor( + name='ExistingLicense', + full_name='LicenseRequest.ContentIdentification.ExistingLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='LicenseId', full_name='LicenseRequest.ContentIdentification.ExistingLicense.LicenseId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceStarted', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceStarted', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceLastPlayed', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceLastPlayed', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionUsageTableEntry', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SessionUsageTableEntry', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4496, + serialized_end=4649, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION = _descriptor.Descriptor( + name='ContentIdentification', + full_name='LicenseRequest.ContentIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CencId', full_name='LicenseRequest.ContentIdentification.CencId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='WebmId', full_name='LicenseRequest.ContentIdentification.WebmId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='License', full_name='LicenseRequest.ContentIdentification.License', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4103, + serialized_end=4649, +) + +_LICENSEREQUEST = _descriptor.Descriptor( + name='LicenseRequest', + full_name='LicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientId', full_name='LicenseRequest.ClientId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ContentId', full_name='LicenseRequest.ContentId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseRequest.Type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestTime', full_name='LicenseRequest.RequestTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonceDeprecated', full_name='LicenseRequest.KeyControlNonceDeprecated', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtocolVersion', full_name='LicenseRequest.ProtocolVersion', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonce', full_name='LicenseRequest.KeyControlNonce', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='LicenseRequest.EncryptedClientId', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION, ], + enum_types=[ + _LICENSEREQUEST_REQUESTTYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3759, + serialized_end=4719, +) + + +_PROVISIONEDDEVICEINFO = _descriptor.Descriptor( + name='ProvisionedDeviceInfo', + full_name='ProvisionedDeviceInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SystemId', full_name='ProvisionedDeviceInfo.SystemId', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Soc', full_name='ProvisionedDeviceInfo.Soc', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Manufacturer', full_name='ProvisionedDeviceInfo.Manufacturer', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Model', full_name='ProvisionedDeviceInfo.Model', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceType', full_name='ProvisionedDeviceInfo.DeviceType', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ModelYear', full_name='ProvisionedDeviceInfo.ModelYear', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecurityLevel', full_name='ProvisionedDeviceInfo.SecurityLevel', index=6, + number=7, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDevice', full_name='ProvisionedDeviceInfo.TestDevice', index=7, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4722, + serialized_end=5016, +) + + +_PROVISIONINGOPTIONS = _descriptor.Descriptor( + name='ProvisioningOptions', + full_name='ProvisioningOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5018, + serialized_end=5039, +) + + +_PROVISIONINGREQUEST = _descriptor.Descriptor( + name='ProvisioningRequest', + full_name='ProvisioningRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5041, + serialized_end=5062, +) + + +_PROVISIONINGRESPONSE = _descriptor.Descriptor( + name='ProvisioningResponse', + full_name='ProvisioningResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5064, + serialized_end=5086, +) + + +_REMOTEATTESTATION = _descriptor.Descriptor( + name='RemoteAttestation', + full_name='RemoteAttestation', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Certificate', full_name='RemoteAttestation.Certificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Salt', full_name='RemoteAttestation.Salt', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='RemoteAttestation.Signature', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5088, + serialized_end=5193, +) + + +_SESSIONINIT = _descriptor.Descriptor( + name='SessionInit', + full_name='SessionInit', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5195, + serialized_end=5208, +) + + +_SESSIONSTATE = _descriptor.Descriptor( + name='SessionState', + full_name='SessionState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5210, + serialized_end=5224, +) + + +_SIGNEDCERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='SignedCertificateStatusList', + full_name='SignedCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5226, + serialized_end=5255, +) + + +_SIGNEDDEVICECERTIFICATE = _descriptor.Descriptor( + name='SignedDeviceCertificate', + full_name='SignedDeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='_DeviceCertificate', full_name='SignedDeviceCertificate._DeviceCertificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedDeviceCertificate.Signature', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signer', full_name='SignedDeviceCertificate.Signer', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5258, + serialized_end=5392, +) + + +_SIGNEDPROVISIONINGMESSAGE = _descriptor.Descriptor( + name='SignedProvisioningMessage', + full_name='SignedProvisioningMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5394, + serialized_end=5421, +) + + +_SIGNEDMESSAGE = _descriptor.Descriptor( + name='SignedMessage', + full_name='SignedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedMessage.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedMessage.Msg', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedMessage.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedMessage.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedMessage.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDMESSAGE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5424, + serialized_end=5728, +) + + +_WIDEVINECENCHEADER = _descriptor.Descriptor( + name='WidevineCencHeader', + full_name='WidevineCencHeader', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='algorithm', full_name='WidevineCencHeader.algorithm', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='key_id', full_name='WidevineCencHeader.key_id', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='provider', full_name='WidevineCencHeader.provider', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='content_id', full_name='WidevineCencHeader.content_id', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='track_type_deprecated', full_name='WidevineCencHeader.track_type_deprecated', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='policy', full_name='WidevineCencHeader.policy', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_index', full_name='WidevineCencHeader.crypto_period_index', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='grouped_license', full_name='WidevineCencHeader.grouped_license', index=7, + number=8, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='protection_scheme', full_name='WidevineCencHeader.protection_scheme', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_seconds', full_name='WidevineCencHeader.crypto_period_seconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _WIDEVINECENCHEADER_ALGORITHM, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5731, + serialized_end=6056, +) + + +_SIGNEDLICENSEREQUEST = _descriptor.Descriptor( + name='SignedLicenseRequest', + full_name='SignedLicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicenseRequest.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicenseRequest.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicenseRequest.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicenseRequest.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicenseRequest.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSEREQUEST_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6059, + serialized_end=6394, +) + + +_SIGNEDLICENSE = _descriptor.Descriptor( + name='SignedLicense', + full_name='SignedLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicense.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicense.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicense.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicense.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicense.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6397, + serialized_end=6711, +) + +_CLIENTIDENTIFICATION_NAMEVALUE.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.fields_by_name['MaxHdcpVersion'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION.containing_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION.fields_by_name['Type'].enum_type = _CLIENTIDENTIFICATION_TOKENTYPE +_CLIENTIDENTIFICATION.fields_by_name['Token'].message_type = _SIGNEDDEVICECERTIFICATE +_CLIENTIDENTIFICATION.fields_by_name['ClientInfo'].message_type = _CLIENTIDENTIFICATION_NAMEVALUE +_CLIENTIDENTIFICATION.fields_by_name['_ClientCapabilities'].message_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION_TOKENTYPE.containing_type = _CLIENTIDENTIFICATION +_DEVICECERTIFICATE.fields_by_name['Type'].enum_type = _DEVICECERTIFICATE_CERTIFICATETYPE +_DEVICECERTIFICATE_CERTIFICATETYPE.containing_type = _DEVICECERTIFICATE +_DEVICECERTIFICATESTATUS.fields_by_name['Status'].enum_type = _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS +_DEVICECERTIFICATESTATUS.fields_by_name['DeviceInfo'].message_type = _PROVISIONEDDEVICEINFO +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS.containing_type = _DEVICECERTIFICATESTATUS +_DEVICECERTIFICATESTATUSLIST.fields_by_name['CertificateStatus'].message_type = _DEVICECERTIFICATESTATUS +_LICENSEIDENTIFICATION.fields_by_name['Type'].enum_type = _LICENSETYPE +_LICENSE_POLICY.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['Hdcp'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['CgmsFlags'].enum_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS.containing_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_KEYCONTROL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER.fields_by_name['Type'].enum_type = _LICENSE_KEYCONTAINER_KEYTYPE +_LICENSE_KEYCONTAINER.fields_by_name['Level'].enum_type = _LICENSE_KEYCONTAINER_SECURITYLEVEL +_LICENSE_KEYCONTAINER.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['RequestedProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['_KeyControl'].message_type = _LICENSE_KEYCONTAINER_KEYCONTROL +_LICENSE_KEYCONTAINER.fields_by_name['_OperatorSessionKeyPermissions'].message_type = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS +_LICENSE_KEYCONTAINER.fields_by_name['VideoResolutionConstraints'].message_type = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT +_LICENSE_KEYCONTAINER.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_KEYTYPE.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_SECURITYLEVEL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE.fields_by_name['Id'].message_type = _LICENSEIDENTIFICATION +_LICENSE.fields_by_name['_Policy'].message_type = _LICENSE_POLICY +_LICENSE.fields_by_name['Key'].message_type = _LICENSE_KEYCONTAINER +_LICENSEERROR.fields_by_name['ErrorCode'].enum_type = _LICENSEERROR_ERROR +_LICENSEERROR_ERROR.containing_type = _LICENSEERROR +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['Pssh'].message_type = _WIDEVINECENCHEADER +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.fields_by_name['LicenseId'].message_type = _LICENSEIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['CencId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['WebmId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['License'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE +_LICENSEREQUEST_CONTENTIDENTIFICATION.containing_type = _LICENSEREQUEST +_LICENSEREQUEST.fields_by_name['ClientId'].message_type = _CLIENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['ContentId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['Type'].enum_type = _LICENSEREQUEST_REQUESTTYPE +_LICENSEREQUEST.fields_by_name['ProtocolVersion'].enum_type = _PROTOCOLVERSION +_LICENSEREQUEST.fields_by_name['EncryptedClientId'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_LICENSEREQUEST_REQUESTTYPE.containing_type = _LICENSEREQUEST +_PROVISIONEDDEVICEINFO.fields_by_name['SecurityLevel'].enum_type = _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL.containing_type = _PROVISIONEDDEVICEINFO +_REMOTEATTESTATION.fields_by_name['Certificate'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_SIGNEDDEVICECERTIFICATE.fields_by_name['_DeviceCertificate'].message_type = _DEVICECERTIFICATE +_SIGNEDDEVICECERTIFICATE.fields_by_name['Signer'].message_type = _SIGNEDDEVICECERTIFICATE +_SIGNEDMESSAGE.fields_by_name['Type'].enum_type = _SIGNEDMESSAGE_MESSAGETYPE +_SIGNEDMESSAGE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDMESSAGE_MESSAGETYPE.containing_type = _SIGNEDMESSAGE +_WIDEVINECENCHEADER.fields_by_name['algorithm'].enum_type = _WIDEVINECENCHEADER_ALGORITHM +_WIDEVINECENCHEADER_ALGORITHM.containing_type = _WIDEVINECENCHEADER +_SIGNEDLICENSEREQUEST.fields_by_name['Type'].enum_type = _SIGNEDLICENSEREQUEST_MESSAGETYPE +_SIGNEDLICENSEREQUEST.fields_by_name['Msg'].message_type = _LICENSEREQUEST +_SIGNEDLICENSEREQUEST.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSEREQUEST_MESSAGETYPE.containing_type = _SIGNEDLICENSEREQUEST +_SIGNEDLICENSE.fields_by_name['Type'].enum_type = _SIGNEDLICENSE_MESSAGETYPE +_SIGNEDLICENSE.fields_by_name['Msg'].message_type = _LICENSE +_SIGNEDLICENSE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSE_MESSAGETYPE.containing_type = _SIGNEDLICENSE +DESCRIPTOR.message_types_by_name['ClientIdentification'] = _CLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['DeviceCertificate'] = _DEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['DeviceCertificateStatus'] = _DEVICECERTIFICATESTATUS +DESCRIPTOR.message_types_by_name['DeviceCertificateStatusList'] = _DEVICECERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['EncryptedClientIdentification'] = _ENCRYPTEDCLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['LicenseIdentification'] = _LICENSEIDENTIFICATION +DESCRIPTOR.message_types_by_name['License'] = _LICENSE +DESCRIPTOR.message_types_by_name['LicenseError'] = _LICENSEERROR +DESCRIPTOR.message_types_by_name['LicenseRequest'] = _LICENSEREQUEST +DESCRIPTOR.message_types_by_name['ProvisionedDeviceInfo'] = _PROVISIONEDDEVICEINFO +DESCRIPTOR.message_types_by_name['ProvisioningOptions'] = _PROVISIONINGOPTIONS +DESCRIPTOR.message_types_by_name['ProvisioningRequest'] = _PROVISIONINGREQUEST +DESCRIPTOR.message_types_by_name['ProvisioningResponse'] = _PROVISIONINGRESPONSE +DESCRIPTOR.message_types_by_name['RemoteAttestation'] = _REMOTEATTESTATION +DESCRIPTOR.message_types_by_name['SessionInit'] = _SESSIONINIT +DESCRIPTOR.message_types_by_name['SessionState'] = _SESSIONSTATE +DESCRIPTOR.message_types_by_name['SignedCertificateStatusList'] = _SIGNEDCERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['SignedDeviceCertificate'] = _SIGNEDDEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['SignedProvisioningMessage'] = _SIGNEDPROVISIONINGMESSAGE +DESCRIPTOR.message_types_by_name['SignedMessage'] = _SIGNEDMESSAGE +DESCRIPTOR.message_types_by_name['WidevineCencHeader'] = _WIDEVINECENCHEADER +DESCRIPTOR.message_types_by_name['SignedLicenseRequest'] = _SIGNEDLICENSEREQUEST +DESCRIPTOR.message_types_by_name['SignedLicense'] = _SIGNEDLICENSE +DESCRIPTOR.enum_types_by_name['LicenseType'] = _LICENSETYPE +DESCRIPTOR.enum_types_by_name['ProtocolVersion'] = _PROTOCOLVERSION +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ClientIdentification = _reflection.GeneratedProtocolMessageType('ClientIdentification', (_message.Message,), dict( + + NameValue = _reflection.GeneratedProtocolMessageType('NameValue', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_NAMEVALUE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.NameValue) + )) + , + + ClientCapabilities = _reflection.GeneratedProtocolMessageType('ClientCapabilities', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.ClientCapabilities) + )) + , + DESCRIPTOR = _CLIENTIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification) + )) +_sym_db.RegisterMessage(ClientIdentification) +_sym_db.RegisterMessage(ClientIdentification.NameValue) +_sym_db.RegisterMessage(ClientIdentification.ClientCapabilities) + +DeviceCertificate = _reflection.GeneratedProtocolMessageType('DeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificate) + )) +_sym_db.RegisterMessage(DeviceCertificate) + +DeviceCertificateStatus = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatus', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUS, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatus) + )) +_sym_db.RegisterMessage(DeviceCertificateStatus) + +DeviceCertificateStatusList = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUSLIST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatusList) + )) +_sym_db.RegisterMessage(DeviceCertificateStatusList) + +EncryptedClientIdentification = _reflection.GeneratedProtocolMessageType('EncryptedClientIdentification', (_message.Message,), dict( + DESCRIPTOR = _ENCRYPTEDCLIENTIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:EncryptedClientIdentification) + )) +_sym_db.RegisterMessage(EncryptedClientIdentification) + +LicenseIdentification = _reflection.GeneratedProtocolMessageType('LicenseIdentification', (_message.Message,), dict( + DESCRIPTOR = _LICENSEIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseIdentification) + )) +_sym_db.RegisterMessage(LicenseIdentification) + +License = _reflection.GeneratedProtocolMessageType('License', (_message.Message,), dict( + + Policy = _reflection.GeneratedProtocolMessageType('Policy', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_POLICY, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.Policy) + )) + , + + KeyContainer = _reflection.GeneratedProtocolMessageType('KeyContainer', (_message.Message,), dict( + + OutputProtection = _reflection.GeneratedProtocolMessageType('OutputProtection', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OutputProtection) + )) + , + + KeyControl = _reflection.GeneratedProtocolMessageType('KeyControl', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_KEYCONTROL, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.KeyControl) + )) + , + + OperatorSessionKeyPermissions = _reflection.GeneratedProtocolMessageType('OperatorSessionKeyPermissions', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OperatorSessionKeyPermissions) + )) + , + + VideoResolutionConstraint = _reflection.GeneratedProtocolMessageType('VideoResolutionConstraint', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.VideoResolutionConstraint) + )) + , + DESCRIPTOR = _LICENSE_KEYCONTAINER, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer) + )) + , + DESCRIPTOR = _LICENSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License) + )) +_sym_db.RegisterMessage(License) +_sym_db.RegisterMessage(License.Policy) +_sym_db.RegisterMessage(License.KeyContainer) +_sym_db.RegisterMessage(License.KeyContainer.OutputProtection) +_sym_db.RegisterMessage(License.KeyContainer.KeyControl) +_sym_db.RegisterMessage(License.KeyContainer.OperatorSessionKeyPermissions) +_sym_db.RegisterMessage(License.KeyContainer.VideoResolutionConstraint) + +LicenseError = _reflection.GeneratedProtocolMessageType('LicenseError', (_message.Message,), dict( + DESCRIPTOR = _LICENSEERROR, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseError) + )) +_sym_db.RegisterMessage(LicenseError) + +LicenseRequest = _reflection.GeneratedProtocolMessageType('LicenseRequest', (_message.Message,), dict( + + ContentIdentification = _reflection.GeneratedProtocolMessageType('ContentIdentification', (_message.Message,), dict( + + CENC = _reflection.GeneratedProtocolMessageType('CENC', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.CENC) + )) + , + + WebM = _reflection.GeneratedProtocolMessageType('WebM', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.WebM) + )) + , + + ExistingLicense = _reflection.GeneratedProtocolMessageType('ExistingLicense', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.ExistingLicense) + )) + , + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification) + )) + , + DESCRIPTOR = _LICENSEREQUEST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest) + )) +_sym_db.RegisterMessage(LicenseRequest) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.CENC) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.WebM) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.ExistingLicense) + +ProvisionedDeviceInfo = _reflection.GeneratedProtocolMessageType('ProvisionedDeviceInfo', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONEDDEVICEINFO, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisionedDeviceInfo) + )) +_sym_db.RegisterMessage(ProvisionedDeviceInfo) + +ProvisioningOptions = _reflection.GeneratedProtocolMessageType('ProvisioningOptions', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGOPTIONS, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningOptions) + )) +_sym_db.RegisterMessage(ProvisioningOptions) + +ProvisioningRequest = _reflection.GeneratedProtocolMessageType('ProvisioningRequest', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGREQUEST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningRequest) + )) +_sym_db.RegisterMessage(ProvisioningRequest) + +ProvisioningResponse = _reflection.GeneratedProtocolMessageType('ProvisioningResponse', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGRESPONSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningResponse) + )) +_sym_db.RegisterMessage(ProvisioningResponse) + +RemoteAttestation = _reflection.GeneratedProtocolMessageType('RemoteAttestation', (_message.Message,), dict( + DESCRIPTOR = _REMOTEATTESTATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:RemoteAttestation) + )) +_sym_db.RegisterMessage(RemoteAttestation) + +SessionInit = _reflection.GeneratedProtocolMessageType('SessionInit', (_message.Message,), dict( + DESCRIPTOR = _SESSIONINIT, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SessionInit) + )) +_sym_db.RegisterMessage(SessionInit) + +SessionState = _reflection.GeneratedProtocolMessageType('SessionState', (_message.Message,), dict( + DESCRIPTOR = _SESSIONSTATE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SessionState) + )) +_sym_db.RegisterMessage(SessionState) + +SignedCertificateStatusList = _reflection.GeneratedProtocolMessageType('SignedCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDCERTIFICATESTATUSLIST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedCertificateStatusList) + )) +_sym_db.RegisterMessage(SignedCertificateStatusList) + +SignedDeviceCertificate = _reflection.GeneratedProtocolMessageType('SignedDeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDDEVICECERTIFICATE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedDeviceCertificate) + )) +_sym_db.RegisterMessage(SignedDeviceCertificate) + +SignedProvisioningMessage = _reflection.GeneratedProtocolMessageType('SignedProvisioningMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDPROVISIONINGMESSAGE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedProvisioningMessage) + )) +_sym_db.RegisterMessage(SignedProvisioningMessage) + +SignedMessage = _reflection.GeneratedProtocolMessageType('SignedMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDMESSAGE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedMessage) + )) +_sym_db.RegisterMessage(SignedMessage) + +WidevineCencHeader = _reflection.GeneratedProtocolMessageType('WidevineCencHeader', (_message.Message,), dict( + DESCRIPTOR = _WIDEVINECENCHEADER, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:WidevineCencHeader) + )) +_sym_db.RegisterMessage(WidevineCencHeader) + +SignedLicenseRequest = _reflection.GeneratedProtocolMessageType('SignedLicenseRequest', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSEREQUEST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedLicenseRequest) + )) +_sym_db.RegisterMessage(SignedLicenseRequest) + +SignedLicense = _reflection.GeneratedProtocolMessageType('SignedLicense', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedLicense) + )) +_sym_db.RegisterMessage(SignedLicense) + + +# @@protoc_insertion_point(module_scope) diff --git a/pywidevine/L1/cdm/key.py b/pywidevine/L1/cdm/key.py new file mode 100644 index 0000000..0f0b956 --- /dev/null +++ b/pywidevine/L1/cdm/key.py @@ -0,0 +1,14 @@ +import binascii + +class Key: + def __init__(self, kid, type, key, permissions=[]): + self.kid = kid + self.type = type + self.key = key + self.permissions = permissions + + def __repr__(self): + if self.type == "OPERATOR_SESSION": + return "key(kid={}, type={}, key={}, permissions={})".format(self.kid, self.type, binascii.hexlify(self.key), self.permissions) + else: + return "key(kid={}, type={}, key={})".format(self.kid, self.type, binascii.hexlify(self.key)) diff --git a/pywidevine/L1/cdm/session.py b/pywidevine/L1/cdm/session.py new file mode 100644 index 0000000..0f7295c --- /dev/null +++ b/pywidevine/L1/cdm/session.py @@ -0,0 +1,18 @@ +class Session: + def __init__(self, session_id, init_data, device_config, offline): + self.session_id = session_id + self.init_data = init_data + self.offline = offline + self.device_config = device_config + self.device_key = None + self.session_key = None + self.derived_keys = { + 'enc': None, + 'auth_1': None, + 'auth_2': None + } + self.license_request = None + self.license = None + self.service_certificate = None + self.privacy_mode = False + self.keys = [] diff --git a/pywidevine/L1/cdm/vmp.py b/pywidevine/L1/cdm/vmp.py new file mode 100644 index 0000000..42ab1bf --- /dev/null +++ b/pywidevine/L1/cdm/vmp.py @@ -0,0 +1,102 @@ +try: + from google.protobuf.internal.decoder import _DecodeVarint as _di # this was tested to work with protobuf 3, but it's an internal API (any varint decoder might work) +except ImportError: + # this is generic and does not depend on pb internals, however it will decode "larger" possible numbers than pb decoder which has them fixed + def LEB128_decode(buffer, pos, limit = 64): + result = 0 + shift = 0 + while True: + b = buffer[pos] + pos += 1 + result |= ((b & 0x7F) << shift) + if not (b & 0x80): + return (result, pos) + shift += 7 + if shift > limit: + raise Exception("integer too large, shift: {}".format(shift)) + _di = LEB128_decode + + +class FromFileMixin: + @classmethod + def from_file(cls, filename): + """Load given a filename""" + with open(filename,"rb") as f: + return cls(f.read()) + +# the signatures use a format internally similar to +# protobuf's encoding, but without wire types +class VariableReader(FromFileMixin): + """Protobuf-like encoding reader""" + + def __init__(self, buf): + self.buf = buf + self.pos = 0 + self.size = len(buf) + + def read_int(self): + """Read a variable length integer""" + # _DecodeVarint will take care of out of range errors + (val, nextpos) = _di(self.buf, self.pos) + self.pos = nextpos + return val + + def read_bytes_raw(self, size): + """Read size bytes""" + b = self.buf[self.pos:self.pos+size] + self.pos += size + return b + + def read_bytes(self): + """Read a bytes object""" + size = self.read_int() + return self.read_bytes_raw(size) + + def is_end(self): + return (self.size == self.pos) + + +class TaggedReader(VariableReader): + """Tagged reader, needed for implementing a WideVine signature reader""" + + def read_tag(self): + """Read a tagged buffer""" + return (self.read_int(), self.read_bytes()) + + def read_all_tags(self, max_tag=3): + tags = {} + while (not self.is_end()): + (tag, bytes) = self.read_tag() + if (tag > max_tag): + raise IndexError("tag out of bound: got {}, max {}".format(tag, max_tag)) + + tags[tag] = bytes + return tags + +class WideVineSignatureReader(FromFileMixin): + """Parses a widevine .sig signature file.""" + + SIGNER_TAG = 1 + SIGNATURE_TAG = 2 + ISMAINEXE_TAG = 3 + + def __init__(self, buf): + reader = TaggedReader(buf) + self.version = reader.read_int() + if (self.version != 0): + raise Exception("Unsupported signature format version {}".format(self.version)) + self.tags = reader.read_all_tags() + + self.signer = self.tags[self.SIGNER_TAG] + self.signature = self.tags[self.SIGNATURE_TAG] + + extra = self.tags[self.ISMAINEXE_TAG] + if (len(extra) != 1 or (extra[0] > 1)): + raise Exception("Unexpected 'ismainexe' field value (not '\\x00' or '\\x01'), please check: {0}".format(extra)) + + self.mainexe = bool(extra[0]) + + @classmethod + def get_tags(cls, filename): + """Return a dictionary of each tag in the signature file""" + return cls.from_file(filename).tags diff --git a/pywidevine/L1/decrypt/__init__.py b/pywidevine/L1/decrypt/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pywidevine/L1/decrypt/__pycache__/__init__.cpython-36.pyc b/pywidevine/L1/decrypt/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5709e8ff548e296c6d318b09186ed320920d5f9d GIT binary patch literal 152 zcmXr!<>g8Uh>T|dg2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m#ec?OlWaxQE`l8 zN^WLeW^qYTVo82cj7w^9c1eCgOnF&+c4}pDOhILNW=d*VW?pJcN@{XZWkE?yd^}Kn aNqoFsLFFwDo80`A(wtN~knzPp%m4tV%P0K+ literal 0 HcmV?d00001 diff --git a/pywidevine/L1/decrypt/__pycache__/__init__.cpython-37.pyc b/pywidevine/L1/decrypt/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8ffe8a1f27eeb4c854f2ca7c00e16273a86feb5 GIT binary patch literal 148 zcmZ?b<>g`kf`ov`co6*>sfEzT~g`kf`ov`co6*I zlU16RX&&Q}TAW>yUl0@S>ZI%96CdL5?-Lx8msXOWpQCGJU|?xz5K~ZDo|%$bmYJ6t olaiWTR9R3G6Ca2KczG$)edCSXCP((00KiQ00000 literal 0 HcmV?d00001 diff --git a/pywidevine/L1/decrypt/__pycache__/__init__.cpython-39.pyc b/pywidevine/L1/decrypt/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0008afe4a43bfb0f1e6f34dd7ed731ae45c9d6fa GIT binary patch literal 146 zcmYe~<>g`kf`ov`co6*I zlbcwQS{mb$U!IqfpO{h{Q&3r+nUY$TnU@-qlA2spSx^!aAD@|*SrQ+wS5SG2!zMRB Pr8Fni4rJhGAZ7pnjYJ~F literal 0 HcmV?d00001 diff --git a/pywidevine/L1/decrypt/__pycache__/wvdecrypt.cpython-38.pyc b/pywidevine/L1/decrypt/__pycache__/wvdecrypt.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e95ba504c1ac5a814c2beffe33fd71b295c1a45 GIT binary patch literal 2483 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 literal 0 HcmV?d00001 diff --git a/pywidevine/L1/decrypt/__pycache__/wvdecryptconfig.cpython-38.pyc b/pywidevine/L1/decrypt/__pycache__/wvdecryptconfig.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37565090101091da09f7fa3e78b362c926362344 GIT binary patch literal 1871 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 AA^-pY literal 0 HcmV?d00001 diff --git a/pywidevine/L1/decrypt/__pycache__/wvdecryptcustom.cpython-37.pyc b/pywidevine/L1/decrypt/__pycache__/wvdecryptcustom.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e620515ad1a67aa005858c9074a91cfe27e4b0a GIT binary patch literal 2231 zcmZuy%WoS+7@wJac)hXRkfupWp%keU7NH1ARYVn4g}5LpVGaqTSb=4;Gj^Q#)tPl# zyK4z4t*FF5VT%jB@n>-228U5^9FPx)J14$x*3P4Jt@+J2&+qvge_Sm31itmZu73Bu zN64Qzn0+<~x1gyq04JO_Nj2+fm6|cDGSgdC3wqYHTTaz!xmA~vPYJiU{fKZ| z$LR(MoC(}SDgo10%v-v^#X%z$ai?8t)MH$lee)pPf~M{Q2!iTB73B;s!2)R z+3zNkzd_UFAA}zfo+9)S{y?~c@EgKU2)`n{iSP{JcZ63FUI&OVaQHdUTxb?FwF8jS zCnO{(1Ei@1$P#O0j|oWD52QxX!$;oGenR%Fk&|Li4r$_!av-rW9pgz4WGcTkd-8y0 zJZ2P913p=mn1Uw!P%WBp7Ml76AR!}~k})09)TnyQ&XWYL+_MhpK2tv@HiQ>`br=s> z%0>>i6E~%YbQw-j0_)BpO&NrrJZ5W{;cUMRbGd8|Z-bHdf*tv6F1r!-_-hal=UKq&YpW^R=A3Bbxd5sc zwS{n#wo$5jZE-(DDWKX`qFH-N{w=TH*#1%pskZO*+Kmsk%R=oZo$mJigK%H;)poak zzk&7M7TaJCmK-cirMRb(PHVN>*M7V!;(c>BdZShV2=(a_Ezt!!PZyzIqy_l-Y;fhM zdRN1+(QYJRxVqNt#8Fe-Ts^)h@O9Cw@+gUn7sXh}Bs?0r84o1`UD{elW_BPFp%O|p zI&F!Cqzh$3)^$Txotv)dWhD~WD3Qn^UfZZO;wTY;BQL`-`4&Qe@HPT+M!o?M&}{t* z$l9BkkJ(m8enMUI^I74{MUVyy|MxXUd-1~_ZCr<@@IB*n1f_+g6tK#GJsd)w+*(Jr zq9kBOueMsMZVbu5m@(Jv)Wa4y9n}TesEh(SICrf3#Ew%uL#;-A0z#b(Y5&fHaticC z#vygf)_l7v+#SHV1OC;hIF zmq3*7BfN)`)_wy@e^)#JN%VF8_Jde-6G(qxWf3dl1xF<-Kg5$5r4s=xsw9HK>dHO%;UN359EAk>-B;Q3a*X5|=$HZf9pt#EH4)MVhs@mN{|LLG@_IB|6Xk E18o@~*#H0l literal 0 HcmV?d00001 diff --git a/pywidevine/L1/decrypt/__pycache__/wvdecryptcustom.cpython-39.pyc b/pywidevine/L1/decrypt/__pycache__/wvdecryptcustom.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1711752b9d6194efb2c550782e322a6a0ea1f833 GIT binary patch literal 2274 zcmZuz&2Jk;6rY)0uh)*9Ms1-jpGAVg77?JTDp7?}k+cXT%prlQmSI`%OdKcv>dYpo z-Hn8lR#f7DKz5Ok`k!#(28R(h4#)?@olE(>bsQ%xyPDs;w=?s;=DlY}<#LhXS^n$N zx8M1U{YlKx#|3j8!>j-#lf1>MlbKg}#*3=RW~b_47A?1(tLEBX)#L0FCLQVCXVO*q zeW&V6zRH5!7?M~e5Y~xh+m@u-X~rt-c$44{g5L;UCU^~?bAXuQG=1oUhv8tDIw0i_S;$fW7IW$clQcY%@ z!Z1Gr5;o*18}U7!X6hb@b1Z?_O=q8P3G-v(BC5_KzR&kWDuy}fCSD5e49;+tAj11R z6^JlR<{uI7Pk538uJF`qal%g|VSR21p}_1Od}qUa3ino73KudrN|kX5){b8S z1db+`W-vYv)=;E-#%zp<2;AB7j2a`8*|-eQCy9EMcKX(1a)>q-`?bWp#pNF5WU>zSLt)ss6qFzsRq;*=Vlbur?Iu{_B$%YV;tV>kY@2K67 zsK?y8Mzz)-vwthgS8HDyrA=)$>Lksm(XFj0vz2svwOv(zN49FaJK>hpoQ+g|MTZ86?Z@m8jV{4!?&j2HRyyu?rP1-$bZCA>v3xNw;6i(%O8 zG?Oq~TxxaWsAaA#&IAQTTh3Nxlth_7B|fodv6>nu~rb`g`%C}W!4j;2(z zrIoCTm$NFi`GYlk#;61vHC1>>Vw>yDI7(EI({JFI4hSw1yiM>H!3BcX38><%KQ*56 z!Ylw7_p-MrN+(_cH8}aKr!iSOeTXJ2moW^rJIRMgL`u9sR0iVSUcjxl-qr0W2}EX@ zb=syeF(tDnGi9#TZG>&O9W@l0Z!#r(@Z3!QksZ&}BWcb|&>$LYj}LC9D0HezD)JTf z^(CskO-G_4_34xk-ISpc#n8jo{Lmkvg=`jR9#K<3UEVo;i*;UbSyJpv&ghj+%GZU* zZlj{!L*pgxptf=qn_vE-vUa1gHpt!EyLxZ$=2|c}xmUk|i=s@_@4`6iCjFk$=RxYr z1efTev(-c)Y^b}SRNoeE+>KQ)K?jBz9O=Hz zX#nFc7f9hEzbHz=eNuGYCxbJyupT>gEU?re4)1mz%+ZkIet8AfWvP3LTx=l`J4S_C z-Pu+q$-JE;+tY^9?sy|=q3|2(3ItDY`-oY`_B@kv)St5ZCJ$$3A@QhbPm*tKYTXHh zWCtx^YGG#CG#TfnW~1Fa9ntyi9!mA_+y`VSX=dmIgR`>`9^Y083RGF0sI9`#7Q?XJ zmD??%OJR6tJ8Df<^eYgg-zUiO;6tK5BKVkK7PG?})}))-uc3PNx$pSrFy?(HTY=g< zYNXNZG;Gmq*AEiG3a#{uIAG^zop2F<53;M9v>2~j-&ApuiTOXx)?b=9agBcXvKXA_ G3*tYR(;=z= literal 0 HcmV?d00001 diff --git a/pywidevine/L1/decrypt/wvdecryptcustom.py b/pywidevine/L1/decrypt/wvdecryptcustom.py new file mode 100644 index 0000000..f4f9b42 --- /dev/null +++ b/pywidevine/L1/decrypt/wvdecryptcustom.py @@ -0,0 +1,59 @@ +# 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.L1.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 \ No newline at end of file diff --git a/pywidevine/L1/getPSSH.py b/pywidevine/L1/getPSSH.py new file mode 100644 index 0000000..3497c9d --- /dev/null +++ b/pywidevine/L1/getPSSH.py @@ -0,0 +1,14 @@ +import requests, xmltodict, json + +def get_pssh(mpd_url): + r = requests.get(url=mpd_url) + r.raise_for_status() + xml = xmltodict.parse(r.text) + mpd = json.loads(json.dumps(xml)) + tracks = mpd['MPD']['Period']['AdaptationSet'] + for video_tracks in tracks: + if video_tracks['@mimeType'] == 'video/mp4': + for t in video_tracks["ContentProtection"]: + if t['@schemeIdUri'].lower() == "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed": + pssh = t["cenc:pssh"] + return pssh \ No newline at end of file diff --git a/pywidevine/L3/__init__.py b/pywidevine/L3/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pywidevine/L3/__pycache__/__init__.cpython-37.pyc b/pywidevine/L3/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab4dd8aa2fc12465f04c22fe5237873743ba59dc GIT binary patch literal 143 zcmZ?b<>g`kf`ov`co6*+|Od{F< literal 0 HcmV?d00001 diff --git a/pywidevine/L3/__pycache__/getPSSH.cpython-37.pyc b/pywidevine/L3/__pycache__/getPSSH.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41179a7fbb4560b86207be90e1063c9806255442 GIT binary patch literal 713 zcmYjPO>fgc5Z(1x?9if?10oVPIFLg?rG>T;LZz)Lkf4ebs!A)P)Oe=UZT!*Qb(=)a zjRP0{LvrLNu~)=_e}FhKPKCr+@6EoM+0m?bcbAu&jO_Q%?=D!#BF)ZuMV-F#DX;j>PfJZCMmuj7dQ#762SaPT5O2by*$&H>7L9r#&zvvX-CCpnBp5alF6h~%B)+K z33L(gbn9cZ-PzoR=beox#!j>zZ*`t-LJZH=;OQE|B#1GKyMN(VTHaX`P++?yhE9` jBkMBh)fCiJM;8YMXQt{`de8a`AE&{O literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__init__.py b/pywidevine/L3/cdm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pywidevine/L3/cdm/__pycache__/__init__.cpython-36.pyc b/pywidevine/L3/cdm/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87b1c6b8547c09f9529337dcaf284b387633c656 GIT binary patch literal 148 zcmXr!<>lHK_9lh_2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CUyjaJF`>n&Ma40W zDY=<>nZ+eVi6!|(F)pda*(Lb}G390P*{PMqF$I<7nJKAdnR%%($tk%p@$o>lCGqik W1(mlrY;yBcN^?@}Kt>k>F#`a0)h8JM literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/__init__.cpython-37.pyc b/pywidevine/L3/cdm/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fb722d2c7500924ee92094609213c60fef1daee GIT binary patch literal 163 zcmZ?b<>g`kf{kHsVnFm`5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6wq*(xTqIJKxa zCaW|r(>%r{wK%&ZzaS>u)k)XICqBgA-zPYxJToP=EHf`PK0CFtIHsTy#*ax($&HDR d&&g`kf{kHsVnFm`5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HkvsFxJacWU< zOjc=Lrg@A@YH@Z+enCvQtCOyaPke~KzfW*XURq*qRbEU%WqD>wYFTDpYD{uUZcKc9 dW?p7Ve7s&kg`kf{kHsVnFm`5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HsvsFxJacWU< zOmJdeNoHbtevC_Madt_5K}>mSl5R>)OnF&+c4}pDOhILNW=d*VW?pJca!PJYe0*kJ bW=VX!UP0w84x8Nkl+v73JCNa@ftUdRC3Tx* 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 literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/cdm.cpython-37.pyc b/pywidevine/L3/cdm/__pycache__/cdm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d617eb5a9798bd0c3c4267a0f850b8ffbae9ae8 GIT binary patch literal 10280 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 literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/cdm.cpython-39.pyc b/pywidevine/L3/cdm/__pycache__/cdm.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c25ee341be45aa33e9c14f12ea0b164e184d7a4 GIT binary patch literal 10393 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 literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/deviceconfig.cpython-36.pyc b/pywidevine/L3/cdm/__pycache__/deviceconfig.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c9dbb61a88a71e9cfe113b1bdecd5f3bc8aa566 GIT binary patch literal 1870 zcmah~&5qne5bm};ws-z#lnn_%(TGEok)mASfKY;h_6H$Fia^8h>mFTj;Y;31IcD+iPZ;KGTjws&WC!ww!*`EynG*FW_$A9Xs-hkyO?&EHKz z{v>Np2>2O@`UDgwoMt2<+~F?wc!T>q011B%A}Z(+jU2uexnB_8`3H7rpf8BHjI=$;b}2S`24L4LrqXSUhR(qxDELpsW(=485!nlihX>Kc#bL&Wo zT+1S3d66d~3b=gN7 zdX(TyeDLjq?0~4>DIsT+)4Sx1Fhq_;6p(9?1IV+;1=O&}1LRxO02EjR_kKo?eW`UY z3ujwaH+Acr>Nbo)e#*nUsh`&@7H|4Zs6q1Isty1mZtDkRF6s zHc(-}Wq=AxNN%Bm;v%L82{|pkXNPGfFs~!OGMHOc_OV1rz4AiVV@_JDxmSOz=k_Jf z@Li|5e=$2tMXs?prdcsvv2XvU-`uIqP%PIb^safvL##`?Lp;p?oZTsu@yb|#YrI*J z<|g2&w6z^FyC=p>d;iPldoS7kSI>9%UdT3HTL)DaRS#7k)Yvhe64{~gtHpmI@_jJ> zv$yl<oi#xGb00FxIXKPNIUnMsJ^kUwN29f#Xuq$v#oBbGGg{kv0$nyo>w%ENdkkII zKP==t)^Y$lyfLn0D(|2lZ@*Ia0O18nQA)->hA(9sA${jssu2g{1`fv)LHL`D%?o~# zA#OAF-ASBP9*ON&-oISt>VmQb4&1213JhuZp|y+~5+i7CR{>_%{(hoCWml^|2>Bk2 fw{zEyWY?w$uibF|NP#}Z~nYL{-o1s5@`4S`s16w z0sV;|=Pd;A7`lE4f)h?t5)tljmwUXyeI7s$e-0ul=pl_9z7@Hj65iykmxQ-|bRv(_ zXJp)d4YSF9)QdB&a>?1D$b^!~$*@+8bUEiTA0>SD+J&Jes10B3jRWIl@l2Q&7dlb0 zC}p0Rt`^B$$#Th3u@I^0X`wY37?79CLYVDB$wgcWb}W`GUc@qur>QXRVpf=&T4dZB zk~}L_p0X^@5)lPlEMx+!;BL>G1K=@q{SF90BFYJzlXB-JiCnw~c*9-5DSgx4wFEnP zb|4QEoQVzJ0rVZ{`gcmmDdqGwIVB8{V-W@9TI2xoEOG%gEb;*P7Bv6`7Qwxr(qmth zWpEU}+Oo1)w$5nThB3%bd3c+gd9Y3=8(lYwZ&f3B)3W_`-8f)t)@AuLeyhSTCKTLf2_y$ z1<&wJqq%!NJC!0UF*&AbK3%bI|EJyDs@0GzS0?nXSjI!lOS?ln%>SI-$+hu{xct_5 zN4d;Qz@@Ue9WuKo#!P$fv!_pmiv^~;o)pU$5@%#$0;OhBO@<->>H45p8rX)+ zWXaeN$n<>>gf`b7C#3H=qgpmCUdfZ~-L>?8aL$!L#@mK(3>ro8qobSA0o=xKgrfP@8M-V`u>OeqqSOSzb}`=T6L)+THSi!TogrX0awF&4As^@ z$ki+^)c|&Qtv|<9-9kIwdL`}v!V6TQP>j6~U)mNx`o^_XBlgD)9F8Xfw>KG^<$RtZ zZZr0L9;cN>VcAu8FP6EyplX2uH>xr7LK?nnHRFat4@NgD2eT``ooG<$_3Fo<-h%OV e?%I*;TGhEes&@A=`cU7%wOog;p3wCj&-oY4-|lt* literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/deviceconfig.cpython-38.pyc b/pywidevine/L3/cdm/__pycache__/deviceconfig.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec802c1883307aa55f1e6bc7a5838ecd77650649 GIT binary patch literal 1932 zcmah~&2Aev5GGfvm8^dWb(%Cqu;`(vfYh*&772o+2x{3y0mClp1O*lXh?PhsE3bC9 zjU%PDq zvpGE^{l*(uP4>N3D57{Cvvl<0?&jx{ldY`prvAuHwl>{KAZO2gDcpM-TN|5hI1lf* zN{o+XkS^R%%tiR71Vp;xM_k4Mf4tkTXgl&}Lf5%aV;LlA5J$STT*S;G-Bv;=FtC8L zbdd;4ScjqZd0;OQ7wE*s(s$To=jlM-@DIlVzn z2}5KVL;;lyvH;lzl>n6uvH>{;l>t=@g4a2vM~+O>%C!1=&FETMKci^_<{&@i)f?o@ zhJBimd(|wymd)Tb!}iBj^MI|Ev$a;R)eT#V!x@g8pQ-Gv;A`Z3?G=1Y!`J4moNu&( zua)z4R`9hAUx#;czTa2yb#lJ$3cjx4>v94y(A$?bJh3dJa!}!`OH4Gmh6)o>w;?b` z@e4KyAVna)JtrH`?`2WQ#zLkSR)~I#O*5)*=AB}UpY!zIHR@Z-)nOo_6q95W#-j`N z_5ZZ%>-jJw&07oFZ&~_1%ujPdyv+aH-HMgA6F+^X?P(lDy21l#a=gmSnHbZJ-LLm{ z4%zO(-eBij*+927QMFLDQFTD|Ep00iPPCJ4{wt9m!0^KprG*=rt+H!9 Y$PV`fKB2mXTa_$Y`2FqF9Lu);1@heeasU7T literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/deviceconfig.cpython-39.pyc b/pywidevine/L3/cdm/__pycache__/deviceconfig.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e234f03fc97e186e6472b6e70ebedebdef05cf9 GIT binary patch literal 1894 zcmah~&2Ah;5bmCtomtQRudqo7idGy@R!VZp0U^MS-jD+DbTB(_xZku*yXO`~q znsuBLc>o@OLww}QBk&MN^pyk318{&7RXyYN*uhJ$s^;se?yvu zeKKypf!Sm)>ctsXx#a9nWJ1a0bXXZix;W-CA0>SD#)Y9Ks2pGIjsxRm@l2Q&7dlaL zUdTK%T`iJhC5t6X#X_W}r-jzwU_f3h=fZ5xm0ZMyV9&*p#fw;`@iZ02UCicYON)$K zN0MiS%2Sr*St6okX^JqIFJ-HjF`j%A2>zxd-cXve8YW_(nN`hnDTvo5lfKSh022u(d2(m%|{WW|&%h%`qitm>-eEo`Vu!e77`39Uo3=H>_ z2T!aTsC-oT>IzdyZJ@%GGd&2*Y5qMskg34{N=Zz$BTb`Sg-~^FRIOR%M2yxi+D9%`+Zie%c-4VgBdrPOgnNkBe`O zca+P_1Y9bc<4tDw#F%OCe*WyqKHL4`+0K(MRU5CZgQ|1>=;jr^uYM#;y)Ah z9+>}my8ZFwYb}(X?8jLloS@ n%~p4y-i7gYZtX~Rt@2!-l)L*3-%xMiTCPKDzrX#^cRc4`ZYT6Q literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/key.cpython-36.pyc b/pywidevine/L3/cdm/__pycache__/key.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5c8a7a0c1a51e1aee35949f8e322f466c513b9c GIT binary patch literal 811 zcmaJ<&5qMB5FXoUT1qRpA)yu8<3?KTg&SHBt7R7wF^$0HrUyplyGWa zh9j@zD<>qLfD@0!$Q{3)8f&#_n5W{m& zT!{@RvF0&TYy?s89sMwv5N_9>*nPBUz?%^B_b|l>#WyS#N~mB1aiCh5A@t&j5ej{ev*j`O? z1Gn%N|`Oy<(%}Mlpin0^TuN-iM>NW p)b9YjW$90%$vYZOhxNkR5^>w#dUqn~1Wk#@&1+9+R*sT%_%Bt3xk~^5 literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/key.cpython-37.pyc b/pywidevine/L3/cdm/__pycache__/key.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..736c7e8f7bd909004b56df3ca9e43f8d1f12c863 GIT binary patch literal 826 zcmaJ<&2AGh5FXo`O$e#rhJ-5AV^=D@A|XJ~HdKfzLEQpUw2~EK2b`bHVkf|c@zKss6L5Te@gupx0lv|p8UlrfxZF(y1&U3e z2dAL85-U*RGw(6QVu*t8Xot>#uo{1S_fVq&Z$gj1h9P<=zG6M0gbG&B3semwgkC(= z`JndOn|6E*9OH7k2n8!ZLctMPArN^HAPNQO%sNrv#n>nx%=1j6sB?cc({^f{Gqco1 zH6J)V8CrUj4G1WM4H3S8ZQ%Cv^!RS_+-d8Q(IPc>k`wL5^I4X>Y#-e|Ig=ON?pd6? zH%h-Vsg{_*C0SmblYyEhs5{JZ-;mOzW-cY=aTFU^Sk7e&YdoyX14bqswAXQ!#Xd%% zfDv*%=5}B4ODueZWshJkF0tfMZB3eR9mLpye_7W8EksMu@z=Z0+UJihy5}-($MKVH zXL*3H+()YJfBbZ?M{Jb>D$9L~GdxGj-T&NMZ%*z!f|aVOD2WO8SV7dIGG;Zt;q)jj@AG#G7ey}3uVDrR#n`{rLSB`=-_%92U By_f(1 literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/key.cpython-38.pyc b/pywidevine/L3/cdm/__pycache__/key.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf488d4f5c2aafc336c40e330722be98076ffb0f GIT binary patch literal 835 zcmaJ<&2G~`5T0E-P6&zMR;j8`kF`{KMM8iIZ9s@BL3ImKWN8($8`vav%x(fWm=k%B z=E#xP*()a`o`4fG4gnt!W9{eJnceyMW-r_ACZK$M@gv^h0N-d+6%RMZxa=;11j(k* zhbJJp^j09f&%Dnhiy-vBqaV6M!m9kazmHZ0cpCcrHH`3<wD1q~y zseD+gL?9gtgA-hK520WM2q-urD?CJA_=uha48Xdf@4ShY&Y$O*LRIDNdZtXGt<|&C zhBfC~H60l$%=iS9!2}3jz%=mp^Z4X$d})=j@pzHyJMpQqlld%*Uv?hdK0Ol`z1~?A zr=vl#OyewnucdmYQxy+o5@WifEO!kdbgJh$i|z$5nRv z7?lFXNce=C1Ie$j>oN8`hPiiz{f=vEvIJ{C!ZG~IyY|pSocLXLv-iAn{_vuAE}~8p zJ?(Xuhgj(W@^t^>r^9`ss#MTe{wsvxK3wko=X4m>OCDV?nwexUFPU|XS2`Woq1LYc zMtzv-QT~_bkQwT;Bzptba7&~al^G%EMOqpNuqM03x0G$1U7R4EOb3Y)!Zn3RW^yql zy(Prk#bCPe7z$!;5D@(ppj?Jt6ukgT18T5VP+CH6+FNhsMj2pJ;=N6_2Q({7K^puQ DcuTst literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/key.cpython-39.pyc b/pywidevine/L3/cdm/__pycache__/key.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed7d9d095d9d4aca416c9b08f32dbae6de9c0203 GIT binary patch literal 833 zcmaJl^YpizK+EB#bcp*07U)hbo3@PFbs@ua?r)N)I56@(H8ip^1gViD4 z^Z-?Q^zqZ-J_%Jj7_9#dxo{q=_WrXv2->xZl|Nb7d7Rg}R-JQ`#%^p()qbZxBxX|l zRXJdm>a3;S!VR2~XjW%dN_vlu+5xP~?(v;u+vEWIhbz-~uBEKHQqC9ZG9kYw<@?Jx x*=8(}*jof7e*@?&OYe#L@2Ei?*7NH~z-@n*ZS1HCwpV<(J?)r!<%p!ie*qhTyEy;= literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/session.cpython-36.pyc b/pywidevine/L3/cdm/__pycache__/session.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86d768335681dd08f1eb0e1ecf4f4d860fcc6bce GIT binary patch literal 705 zcmYjP!EV$r5Vf7`CQWxmMLF^Vxl{sf2%(}@aN7fIIjkaCQ9LPDv&q)>ZnY@4_A~ea zj{J_VT=@b{%s5$CNAv6%&l^8`@@78Iet!8~d=`xTVh1C_^*Ne-j_`>oruY-uqgXN} zu2>#b82>krJ!HSY1+XPoY$+61;)yLI6=8ntlPj=RcWpHpX*9=Z7ijhxq31o5tQUy9 zj}b*5Ax4TJ#sMcNB#8M=JJS$L0;U0v6tS~gVjL?*LKk`DBWNo>EjR9~d^OImKjt%^ z*+G-k${*=gJE=-n`lPGtMz`SS3bwieS#@o#Z+$kpcd+xvdn!3I1x9Z{Np!4#)*z>~ zAPwAaz&f9d0e@=23%8h#{Ugu_otuW0@#Wxwi1dfam`kq^66t0&eX*MhoQqAMeOLD7`uv*&_(Q756a9=)3*60pAYkk z_wmd|rq?93vOBuejZ|rq+MvqwLYH9Y3a)epGONm5pWA3~FJNnTM=Cip1+~5cCDAeV zQGuM&fUM!N1=HAI2-tlCb)OLGM&~+98?dtta?@-p*Odb6Q;K+EeFH^a(;L-Of{-9U zxMel<WSIKA0XOi!2sb40?U@n?!lYD)5`0V&Zo}HeaER!FaB$wcXC7bQ&Cz)C& zLj?z$tqrAgeLI@$c&`Y(I*cPOfB`b<2#Wd?|vBrBG&=GimO8$Ww;F`dQ??fZwH;=RY%4+?h8$KW-(eTZ&+KU+6{@h+Yx{k-!nUAiKIi(d9eydu^wboLk6m$!5P literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/__pycache__/session.cpython-39.pyc b/pywidevine/L3/cdm/__pycache__/session.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02511fa68e9117fb50da34be489b543bc2c0f5d0 GIT binary patch literal 725 zcmY*X!H&}~5Ve!E$!1%DSkByYU?n&rgb=%eTMu;MP(`v#JSo48BcKmY{3;<1d6NRmMuaRA}4b39IVw%U5t*Xw2sg((CrmM$2%ri z7a;O3LJYbPF;omO@;E|4UepiT8T(x9G4Xh!h@CEpajF;zo@Jp6p)TB5ZrZQn#W25o zpG{n9dtE{+ccN?E3ME_V;-)MsU4xq{*y;jA(bT10x^xJyVed{4R0<{vjNXD07+CkH zLQZW#7`WMhZCyMh+?fT_7X;JlQWvrXH(4WB7JIR36u5{=WFr?@s7ga`WX1#uL5%Q| z8S2gNcNeenPgu|9b6K}qE}Q%k>~-6$^BsJ7uBv>u^?LI4ey2%!4SAtf`5^p!y?2Qa z{?>w;XrCc4KK?g?faCa+j1IYPkB3H{ABZ#TE>@}K3WRW}pi68jT2F+y*~qHjG4ykI l-A8anIZkJyTau7)AJ4LWKKhofY>42J*ZmQ1i1mQZ{sLztxAg!3 literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/cdm.py b/pywidevine/L3/cdm/cdm.py new file mode 100644 index 0000000..a83caa6 --- /dev/null +++ b/pywidevine/L3/cdm/cdm.py @@ -0,0 +1,362 @@ +import base64 + +import os +import time +import binascii + +from google.protobuf.message import DecodeError +from google.protobuf import text_format + +from pywidevine.L3.cdm.formats import wv_proto2_pb2 as wv_proto2 +from pywidevine.L3.cdm.session import Session +from pywidevine.L3.cdm.key import Key +from Cryptodome.Random import get_random_bytes +from Cryptodome.Random import random +from Cryptodome.Cipher import PKCS1_OAEP, AES +from Cryptodome.Hash import CMAC, SHA256, HMAC, SHA1 +from Cryptodome.PublicKey import RSA +from Cryptodome.Signature import pss +from Cryptodome.Util import Padding +import logging + +class Cdm: + def __init__(self): + self.logger = logging.getLogger(__name__) + self.sessions = {} + + def open_session(self, init_data_b64, device, raw_init_data = None, offline=False): + self.logger.debug("open_session(init_data_b64={}, device={}".format(init_data_b64, device)) + self.logger.info("opening new cdm session") + if device.session_id_type == 'android': + # format: 16 random hexdigits, 2 digit counter, 14 0s + rand_ascii = ''.join(random.choice('ABCDEF0123456789') for _ in range(16)) + counter = '01' # this resets regularly so its fine to use 01 + rest = '00000000000000' + session_id = rand_ascii + counter + rest + session_id = session_id.encode('ascii') + elif device.session_id_type == 'chrome': + rand_bytes = get_random_bytes(16) + session_id = rand_bytes + else: + # other formats NYI + self.logger.error("device type is unusable") + return 1 + if raw_init_data and isinstance(raw_init_data, (bytes, bytearray)): + # used for NF key exchange, where they don't provide a valid PSSH + init_data = raw_init_data + self.raw_pssh = True + else: + init_data = self._parse_init_data(init_data_b64) + self.raw_pssh = False + + if init_data: + new_session = Session(session_id, init_data, device, offline) + else: + self.logger.error("unable to parse init data") + return 1 + self.sessions[session_id] = new_session + self.logger.info("session opened and init data parsed successfully") + return session_id + + def _parse_init_data(self, init_data_b64): + parsed_init_data = wv_proto2.WidevineCencHeader() + try: + self.logger.debug("trying to parse init_data directly") + parsed_init_data.ParseFromString(base64.b64decode(init_data_b64)[32:]) + except DecodeError: + self.logger.debug("unable to parse as-is, trying with removed pssh box header") + try: + id_bytes = parsed_init_data.ParseFromString(base64.b64decode(init_data_b64)[32:]) + except DecodeError: + self.logger.error("unable to parse, unsupported init data format") + return None + self.logger.debug("init_data:") + for line in text_format.MessageToString(parsed_init_data).splitlines(): + self.logger.debug(line) + return parsed_init_data + + def close_session(self, session_id): + self.logger.debug("close_session(session_id={})".format(session_id)) + self.logger.info("closing cdm session") + if session_id in self.sessions: + self.sessions.pop(session_id) + self.logger.info("cdm session closed") + return 0 + else: + self.logger.info("session {} not found".format(session_id)) + return 1 + + def set_service_certificate(self, session_id, cert_b64): + self.logger.debug("set_service_certificate(session_id={}, cert={})".format(session_id, cert_b64)) + self.logger.info("setting service certificate") + + if session_id not in self.sessions: + self.logger.error("session id doesn't exist") + return 1 + + session = self.sessions[session_id] + + message = wv_proto2.SignedMessage() + + try: + message.ParseFromString(base64.b64decode(cert_b64)) + except DecodeError: + self.logger.error("failed to parse cert as SignedMessage") + + service_certificate = wv_proto2.SignedDeviceCertificate() + + if message.Type: + self.logger.debug("service cert provided as signedmessage") + try: + service_certificate.ParseFromString(message.Msg) + except DecodeError: + self.logger.error("failed to parse service certificate") + return 1 + else: + self.logger.debug("service cert provided as signeddevicecertificate") + try: + service_certificate.ParseFromString(base64.b64decode(cert_b64)) + except DecodeError: + self.logger.error("failed to parse service certificate") + return 1 + + self.logger.debug("service certificate:") + for line in text_format.MessageToString(service_certificate).splitlines(): + self.logger.debug(line) + + session.service_certificate = service_certificate + session.privacy_mode = True + + return 0 + + def get_license_request(self, session_id): + self.logger.debug("get_license_request(session_id={})".format(session_id)) + self.logger.info("getting license request") + + if session_id not in self.sessions: + self.logger.error("session ID does not exist") + return 1 + + session = self.sessions[session_id] + + # raw pssh will be treated as bytes and not parsed + if self.raw_pssh: + license_request = wv_proto2.SignedLicenseRequestRaw() + else: + license_request = wv_proto2.SignedLicenseRequest() + client_id = wv_proto2.ClientIdentification() + + if not os.path.exists(session.device_config.device_client_id_blob_filename): + self.logger.error("no client ID blob available for this device") + return 1 + + with open(session.device_config.device_client_id_blob_filename, "rb") as f: + try: + cid_bytes = client_id.ParseFromString(f.read()) + except DecodeError: + self.logger.error("client id failed to parse as protobuf") + return 1 + + self.logger.debug("building license request") + if not self.raw_pssh: + license_request.Type = wv_proto2.SignedLicenseRequest.MessageType.Value('LICENSE_REQUEST') + license_request.Msg.ContentId.CencId.Pssh.CopyFrom(session.init_data) + else: + license_request.Type = wv_proto2.SignedLicenseRequestRaw.MessageType.Value('LICENSE_REQUEST') + license_request.Msg.ContentId.CencId.Pssh = session.init_data # bytes + + if session.offline: + license_type = wv_proto2.LicenseType.Value('OFFLINE') + else: + license_type = wv_proto2.LicenseType.Value('DEFAULT') + license_request.Msg.ContentId.CencId.LicenseType = license_type + license_request.Msg.ContentId.CencId.RequestId = session_id + license_request.Msg.Type = wv_proto2.LicenseRequest.RequestType.Value('NEW') + license_request.Msg.RequestTime = int(time.time()) + license_request.Msg.ProtocolVersion = wv_proto2.ProtocolVersion.Value('CURRENT') + if session.device_config.send_key_control_nonce: + license_request.Msg.KeyControlNonce = random.randrange(1, 2**31) + + if session.privacy_mode: + if session.device_config.vmp: + self.logger.debug("vmp required, adding to client_id") + self.logger.debug("reading vmp hashes") + vmp_hashes = wv_proto2.FileHashes() + with open(session.device_config.device_vmp_blob_filename, "rb") as f: + try: + vmp_bytes = vmp_hashes.ParseFromString(f.read()) + except DecodeError: + self.logger.error("vmp hashes failed to parse as protobuf") + return 1 + client_id._FileHashes.CopyFrom(vmp_hashes) + self.logger.debug("privacy mode & service certificate loaded, encrypting client id") + self.logger.debug("unencrypted client id:") + for line in text_format.MessageToString(client_id).splitlines(): + self.logger.debug(line) + cid_aes_key = get_random_bytes(16) + cid_iv = get_random_bytes(16) + + cid_cipher = AES.new(cid_aes_key, AES.MODE_CBC, cid_iv) + + encrypted_client_id = cid_cipher.encrypt(Padding.pad(client_id.SerializeToString(), 16)) + + service_public_key = RSA.importKey(session.service_certificate._DeviceCertificate.PublicKey) + + service_cipher = PKCS1_OAEP.new(service_public_key) + + encrypted_cid_key = service_cipher.encrypt(cid_aes_key) + + encrypted_client_id_proto = wv_proto2.EncryptedClientIdentification() + + encrypted_client_id_proto.ServiceId = session.service_certificate._DeviceCertificate.ServiceId + encrypted_client_id_proto.ServiceCertificateSerialNumber = session.service_certificate._DeviceCertificate.SerialNumber + encrypted_client_id_proto.EncryptedClientId = encrypted_client_id + encrypted_client_id_proto.EncryptedClientIdIv = cid_iv + encrypted_client_id_proto.EncryptedPrivacyKey = encrypted_cid_key + + license_request.Msg.EncryptedClientId.CopyFrom(encrypted_client_id_proto) + else: + license_request.Msg.ClientId.CopyFrom(client_id) + + if session.device_config.private_key_available: + key = RSA.importKey(open(session.device_config.device_private_key_filename).read()) + session.device_key = key + else: + self.logger.error("need device private key, other methods unimplemented") + return 1 + + self.logger.debug("signing license request") + + hash = SHA1.new(license_request.Msg.SerializeToString()) + signature = pss.new(key).sign(hash) + + license_request.Signature = signature + + session.license_request = license_request + + self.logger.debug("license request:") + for line in text_format.MessageToString(session.license_request).splitlines(): + self.logger.debug(line) + self.logger.info("license request created") + self.logger.debug("license request b64: {}".format(base64.b64encode(license_request.SerializeToString()))) + return license_request.SerializeToString() + + def provide_license(self, session_id, license_b64): + self.logger.debug("provide_license(session_id={}, license_b64={})".format(session_id, license_b64)) + self.logger.info("decrypting provided license") + + if session_id not in self.sessions: + self.logger.error("session does not exist") + return 1 + + session = self.sessions[session_id] + + if not session.license_request: + self.logger.error("generate a license request first!") + return 1 + + license = wv_proto2.SignedLicense() + try: + license.ParseFromString(base64.b64decode(license_b64)) + except DecodeError: + self.logger.error("unable to parse license - check protobufs") + return 1 + + session.license = license + + self.logger.debug("license:") + for line in text_format.MessageToString(license).splitlines(): + self.logger.debug(line) + + self.logger.debug("deriving keys from session key") + + oaep_cipher = PKCS1_OAEP.new(session.device_key) + + session.session_key = oaep_cipher.decrypt(license.SessionKey) + + lic_req_msg = session.license_request.Msg.SerializeToString() + + enc_key_base = b"ENCRYPTION\000" + lic_req_msg + b"\0\0\0\x80" + auth_key_base = b"AUTHENTICATION\0" + lic_req_msg + b"\0\0\2\0" + + enc_key = b"\x01" + enc_key_base + auth_key_1 = b"\x01" + auth_key_base + auth_key_2 = b"\x02" + auth_key_base + auth_key_3 = b"\x03" + auth_key_base + auth_key_4 = b"\x04" + auth_key_base + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(enc_key) + + enc_cmac_key = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_1) + auth_cmac_key_1 = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_2) + auth_cmac_key_2 = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_3) + auth_cmac_key_3 = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_4) + auth_cmac_key_4 = cmac_obj.digest() + + auth_cmac_combined_1 = auth_cmac_key_1 + auth_cmac_key_2 + auth_cmac_combined_2 = auth_cmac_key_3 + auth_cmac_key_4 + + session.derived_keys['enc'] = enc_cmac_key + session.derived_keys['auth_1'] = auth_cmac_combined_1 + session.derived_keys['auth_2'] = auth_cmac_combined_2 + + self.logger.debug('verifying license signature') + + lic_hmac = HMAC.new(session.derived_keys['auth_1'], digestmod=SHA256) + lic_hmac.update(license.Msg.SerializeToString()) + + self.logger.debug("calculated sig: {} actual sig: {}".format(lic_hmac.hexdigest(), binascii.hexlify(license.Signature))) + + if lic_hmac.digest() != license.Signature: + self.logger.info("license signature doesn't match - writing bin so they can be debugged") + with open("original_lic.bin", "wb") as f: + f.write(base64.b64decode(license_b64)) + with open("parsed_lic.bin", "wb") as f: + f.write(license.SerializeToString()) + self.logger.info("continuing anyway") + + self.logger.debug("key count: {}".format(len(license.Msg.Key))) + for key in license.Msg.Key: + if key.Id: + key_id = key.Id + else: + key_id = wv_proto2.License.KeyContainer.KeyType.Name(key.Type).encode('utf-8') + encrypted_key = key.Key + iv = key.Iv + type = wv_proto2.License.KeyContainer.KeyType.Name(key.Type) + + cipher = AES.new(session.derived_keys['enc'], AES.MODE_CBC, iv=iv) + decrypted_key = cipher.decrypt(encrypted_key) + if type == "OPERATOR_SESSION": + permissions = [] + perms = key._OperatorSessionKeyPermissions + for (descriptor, value) in perms.ListFields(): + if value == 1: + permissions.append(descriptor.name) + print(permissions) + else: + permissions = [] + session.keys.append(Key(key_id, type, Padding.unpad(decrypted_key, 16), permissions)) + + self.logger.info("decrypted all keys") + return 0 + + def get_keys(self, session_id): + if session_id in self.sessions: + return self.sessions[session_id].keys + else: + self.logger.error("session not found") + return 1 diff --git a/pywidevine/L3/cdm/deviceconfig.py b/pywidevine/L3/cdm/deviceconfig.py new file mode 100644 index 0000000..eaa382e --- /dev/null +++ b/pywidevine/L3/cdm/deviceconfig.py @@ -0,0 +1,53 @@ +import os + +device_android_generic = { + 'name': 'android_generic', + 'description': 'android studio cdm', + 'security_level': 3, + 'session_id_type': 'android', + 'private_key_available': True, + 'vmp': False, + 'send_key_control_nonce': True +} + +devices_available = [device_android_generic] + +FILES_FOLDER = 'devices' + +class DeviceConfig: + def __init__(self, device): + self.device_name = device['name'] + self.description = device['description'] + self.security_level = device['security_level'] + self.session_id_type = device['session_id_type'] + self.private_key_available = device['private_key_available'] + self.vmp = device['vmp'] + self.send_key_control_nonce = device['send_key_control_nonce'] + + if 'keybox_filename' in device: + self.keybox_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['keybox_filename']) + else: + self.keybox_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'keybox') + + if 'device_cert_filename' in device: + self.device_cert_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_cert_filename']) + else: + self.device_cert_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_cert') + + if 'device_private_key_filename' in device: + self.device_private_key_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_private_key_filename']) + else: + self.device_private_key_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_private_key') + + if 'device_client_id_blob_filename' in device: + self.device_client_id_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_client_id_blob_filename']) + else: + self.device_client_id_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_client_id_blob') + + if 'device_vmp_blob_filename' in device: + self.device_vmp_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_vmp_blob_filename']) + else: + self.device_vmp_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_vmp_blob') + + def __repr__(self): + return "DeviceConfig(name={}, description={}, security_level={}, session_id_type={}, private_key_available={}, vmp={})".format(self.device_name, self.description, self.security_level, self.session_id_type, self.private_key_available, self.vmp) diff --git a/pywidevine/L3/cdm/devices/android_generic/config.json b/pywidevine/L3/cdm/devices/android_generic/config.json new file mode 100644 index 0000000..dc1c38c --- /dev/null +++ b/pywidevine/L3/cdm/devices/android_generic/config.json @@ -0,0 +1,20 @@ +{ + "token": "token.bin", + "client_info": + { + "company_name": "motorola", + "model_name": "Nexus 6", + "architecture_name": "armeabi-v7a", + "device_name": "shamu", + "product_name": "shamu", + "build_info": "google/shamu/shamu:5.1.1/LMY48M/2167285:user/release-keys", + "device_id": "TU1JX0VGRkYwRkU2NUQ5OAAAAAAAAAAAAAAAAAAAAAA=", + "os_version": "5.1.1" + }, + "capabilities": + { + "session_token": 1, + "max_hdcp_version": "HDCP_V2_2", + "oem_crypto_api_version": 9 + } +} \ No newline at end of file diff --git a/pywidevine/L3/cdm/devices/android_generic/device_client_id_blob b/pywidevine/L3/cdm/devices/android_generic/device_client_id_blob new file mode 100644 index 0000000000000000000000000000000000000000..cc32780826673a1deb75a8f4dbf90d2925a2163b GIT binary patch literal 1651 zcmZuvcT`h{8c#xv;WC6Yg%DRtSyo0;_BLz{BEtz{2=`u+2;qh-Oql{cKvEPC3L>S5 zR#Y@BF~|}XsBto^2#K7j$&wSMOW-|#v#)%l6r;lWP0H*FtQwWio`K7UJ%C@p8frUr{`RSq&=eLm9E_Bcts z+)__t(>pju8qhkTN7d-YooqsD17YB+)T&b+dD!mW%;tA*8=?|ct9pxAvXciG-~EEk zyqNHyLYVoy+l`96gc=4fmR#7JtW-35M7Y;{rd_mZ-9RZ>>g0zzD_^QiN=>=Cm+GT( z>)&?E=I26%Mw0uFC37a^<@B+k8rP}tG+R%M1{#I7m^ThUTb$1|Qef^xbJv)l~(xXc(>gKr3a6m<9-nzHvXOV>Zu1CDGr^m}yN36wz^2o@x`! z8GPNt9T{4b6mc5L&9^XI5Ox4dza2)@DeP*wZW~^?A8Jye>|X5=FN(DR{l}_STjt)w z1o$ae=a_7&+2XfyIV&e@*vsGUjiK!l%Ws{+jLs$`+-D%CB3pc{63bC!Os} zS{E%T8A_A-uF@R;-Hgl+Qq5$Ok=)ivfiTpYeG3B&cdhvlz{7->`YhIb~mW+RatLZVx{9 z{Gn8KKj_7BmeR|_tY%rgW3toA=g}I1%WNAtu)2w*HeIWZ@*FW8H?NVMznKEOj($;n z;<1HA;}udz-xL(hFxB#|s09v_C!_v=pm!e;aK=I_Zr&Rxbl-PiE}qmwji zu-|;^HIMTf-uunv6c-n7ZInc2<*ZpvSxub)758L`qxDIlW=i?U_n^I&@6@!s)VgS-8^c2(`fN1hB%6nKtlcUg|Gmy}DvwPjtG z`vnU{w0j-!^?p@>?$eNhx-^&3bIUxM%v6tdUa@umxt_(mgZkVpC^a|#SMvQBpL?X1 zZffPs(IxJ;3hCE0df%0Rmoi+RsOXgX1On6_it@&*QPjJqrxV(}jI+NQnp8xWJ$e?> zr#H!Sz*k4xhXuGEJvIr~{ z-!^qG8+%@M+& zP{fB<^ctTS5}*aaVh;EZrp1EeVLk_BeBw+1Z5|(iM4)iRKoCH&4A$S#3?3VahyPYZ z0Klg(h{1`ELGasGc$@zxwfV2%E{@hzYpPAqK5rX)I|n-_XGa&20Omt*w1{ORgatyY zSXd$;Spk~=tjB@ylk$brs z1Fm?-@2-JkFF9R5hKP$zQj-m~&7K-R-{yB_qJN>dvniZGbMq@iYzM>^{wy8kiMai@JDx z=Yj50@-K_E;B-MwK3b(i9CxV_6`nxnZAmr)8J8CjB5!PQweRFUOtYBIjD|xK-pU~b zrxn9fspJV4DSag<)SQs%pMvSqGD1N1?ls6{kFOK{>dbnExqcRUjC=7) zEg^0Mza3IToKl;-Il^`+e{wU=-tzFb#s71u-eysS5u-6UC++~Cs zv;_*T0tf*T5M=8eD7uzTovKP_Yiq|W%NUc7rJe;Mjsh@(0SW?w0RaH1u}XGH8+tp5 z3^-snR7{|#s|4vYm6N5;^9$~z!=gwh<~1ZIWbuh`U& zK_=!D`S5^1h11vf3&GJmKKO zJm)b=R`F!uRC_F7m+>yxb^g=o75#OhEk8Jf8ncMt)*fe;4r+P%9o8!WSGBU*I5js1 zdz;iYn_Fv0yLhGDPU~i9@jh?2YEX~M29KR419-!G>{TnV+@00k=1NLA1`8gqPYW5C ztx(UTZogg4Akw&)*+Jos01+cr@URnEZI1+-GV_#Qh=B-VLX1LW1exGHsBM5pzOI_` zny|i>oE;yNElTgZ(2qyWEMx2;OJ>d1(jSBK2xc(Oc(WXX8@SpF2<~^U38iBz9mz&m z<64rYhJ6;qMNpBT0YHkIB?=n@yL-3&Ku@;&4*n87=&2p-T4^u@cp+c@Gt4iY2qL}} VQVk9yRaTvXEHqe5K3W>T8omOPMfCsx literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/formats/__init__.py b/pywidevine/L3/cdm/formats/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pywidevine/L3/cdm/formats/__pycache__/__init__.cpython-36.pyc b/pywidevine/L3/cdm/formats/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3432e45fefcb51638cad4df2b5e28676d821c83a GIT binary patch literal 156 zcmXr!<>hj(I3B|Q1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFHdKyn9$g`k0{4pJF(CReh=2h`Aj1KOi&=m~3PUi1CZpdI zlU16RX&&Q}TAW>yUl0@S>ZI%96CdL5?-LwTo|%$bmYJ6tpPgD+98*vUg`k0{4pJF(CReh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w)*(xTqIJKxa zCaW|r(>%r{wK%&ZzaS>u)k)XICqBgA-zPXGFD)^*Dlev>vOF^-wJb9)H6}SFHzqB= lC^xaBI3_+mGcU6wK3=b&@)n0pZhlH>PO2Tqn$JMY000lYDyIMd literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/formats/__pycache__/__init__.cpython-39.pyc b/pywidevine/L3/cdm/formats/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71c0f73c45fc5a68bd9575ffd8495a7a79ed0f92 GIT binary patch literal 166 zcmYe~<>g`k0{4pJF(CReh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w;*(xTqIJKxa zCO9##Br`ERKgK1sIJ+djAf`MuNjD`Yro1dZJGHVnrl7JsGbObwGcPqJIVCqHEx#x? jv7|UAK0Y%qvm`!Vub}c4hfQvNN@-529mtZ;K+FID5Z@~( literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/formats/__pycache__/wv_proto2_pb2.cpython-36.pyc b/pywidevine/L3/cdm/formats/__pycache__/wv_proto2_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d09037ed9d6c3273028b8609a1d24bcdbbe5039 GIT binary patch literal 44592 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 SBRU+YV7&jo{uSIvj{hGI=wo~U literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/formats/__pycache__/wv_proto2_pb2.cpython-38.pyc b/pywidevine/L3/cdm/formats/__pycache__/wv_proto2_pb2.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84af63f93bba74b4b994ed6dde0f76014feb5761 GIT binary patch literal 48896 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 Zm(#-LO;F1H{xX$W5+IJBQtFiQ{{wW03$y?L literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/formats/__pycache__/wv_proto2_pb2.cpython-39.pyc b/pywidevine/L3/cdm/formats/__pycache__/wv_proto2_pb2.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47a6534ef836e80737393f0962cbe000c8f2d65a GIT binary patch literal 45460 zcmeHv33y#cb-(m1JxN!K<>yV7H(6fg<=K|w#7XQVvh-}rmL)}!?fAyYL)N`kuB|Qa zNsfI9Wk~`AFoc$dy^T}$LMbg}2^3nVENN2;WousvW$R*SftHrEEaCqmQkWu}p6?t4_}|>Wq4$!Aux)?<+SNFI4C$ zv+R3#7b>}Afw2&O-jYSeV*JUH(K(!IGL{(4 z7i#oHz`fX9#JDRSX`+qI-3S?loSznYXn@0)LVdE?H-+$Db@2t>n}Oqm3zRVai&R z+%_7URR5bp{cj2NpZ4}I<+jz>#<*88?o|r+cB5V4-VwrmO$hf+FK*`KS}$*-70k(X z#xCxym3wPdyMvZ`=d!MnNdt1Z3tx>%lFuGN52hp2fPY;E9>k0LC7`?gUEqd!U`nb2X+}m2! zTfcFu>TMv@+hC}-p-^u}yuC61N74H+#jVh{+l=Gf|2pn}o$6mVZdd)E2=#wQsQ){? z{Y!nz8qZlycYg?rdIsc?^ka2p}qW(4k2#wg?7z_>SfaNqTF!`;TX+Z1lgIIVD> z0o{JvH3qu4 z_e5yGIpaL{zlrHeR4G{W3V&!u@aY z^#8(NYX52OKke!NMZeVkw{rhmJ^kPJOYMIf_rFc{zumasc!2uHuj+KW@nYj8tj#Yq zUJ8wU5WYhFedUkrFkW_%RzmuFke@HVFqh$9VO(Hcj{!fL7%ihe#?ip3R~oM}9=gz| zUjtm*jaM7L>7nGejMp$Fzm0ja5WR}|9PIyLX{gs3ujlz!8tM(k8+lH?$#`># z9)HL9U7n{!agA0IZ)VG=ke1-|5qJ*7=}zYKqH)o~>7&N)F{jioWL|{Rw-|3_PTyv{ zov9O}5tPR}jCV4p1eGuzWNC*-?On$2GpFyyC_}bllzCi(_}*juL1}JT3*Kw|A=a+< z8Kr6aBjb+&^Zw#cqg9aGHRjIIgt^Kmy+46(MAEyKrS}2j13u|}FoyI#WPF&VH#^6V z86SzED<3ufG^PYUW_&z`1pmzVbCzIHtztP}G9G6MmgIt@2syU;B={Hb_eg@*u>?P1 ze8MBa4;i0i36{jl{eQ~%G)uAc40*!%OGt2iiE*C86t4DB_*d{FiNak>;giOb9ts~b z{+cN)EuHI)&oFgGbw9!a{f+Ti?)7@^^>fDOJiT5r{+4@Kd|K^d- zzZ>6W>AV>>jaDeJG6pT^_l)neWJ*K*hw+~*mC{f@F#d}rQhFZzxADUm5_#JApBNVB ze~llp#VOt6kBy%|25*Kod)AW@Uc*m~XBfIP)}K9u{Sjb%yHOGjQ04d~0QWXvEix9P zwZXAPn>qMZ@c8bg@kOo@zoa|H$W`H2&Es5B4*^w!pT=Wd6jE3qbB)*Xp;ay3YRUHP zkyO;7tlmdO14`zqxmeN?0J0Ikd1^iug$~<8v`gVPpQ*V?QnLUhcz1GqMC2CXx0tD! zZDg7Nxr8a14YC=KOL-2=2DuE7%S+FL(Ta%CUV(NinX{WEXDujM<>RasC97j`wg!-E zV{x_)kn5SVqW;k+uZUjDgEkxR6JFyjlHQFd;hiSX3~wE|&G>CmdQsAz0+RG1t@L6x z=&gX>#&nmonna25C}6kythIRC4p>7#5!E}`J~^|b7$nKj8NKTd9(e#_IrgBU`EBeuoBsY>#=9d9!)TXob1fT*vR^4;uV#fcCqw z&qMRS1AUVf+Cx8|UeY+<#N%9&8bIBQ-z_}Gvq94Mb|}3p`nCY5z4&#Oo^euYU4YEQ zSbg3FxP7y)$P(**Kp!Z*4)MFgZnJ}In)`-{cHL68d!=j-qU@kgwueyC!?G=^k)!2g zPt5fJyM5Sr4v$->#N7)_eLmd%D7kg^aWm!tZh%M4p&|Nx_p5*#oPAD4+LIx)J;L;M zNqUc>1bdDi%YGY5j>oenOtT)7=G(85<`baj4yHLHX}%LBSs%^MLCNs!G6vL1{6?7K z+13~XkYZf8%-2@;fW6gZBFH>sf zlkXbZO&|?2yUdKak5axFbvIfIs`pE(b132cP*5(`r94WeV^KW=$g{Ik%`413OtUjX zime;xfbo1RYh?rSxooXUjveu2ECuYnY_XjF#ko~@g?k<#f1|XuVvJt|-1AGXMWfXi zh5e)D=7xafc>#2eR*VC31jzEd(5E+Kd0un{Gx@%lGx`3joXHP>o)dn zOxEY6S3vWFF=>9;RnqKQpM#QSvOX{O(M;Co6|pp(tdH0&oz13@^?4=JJR2lgpI1F= z>vKqQN7m;dA9rMZULA`&vOd2#`#c5|S)box?uvRSY<;@TgXW=-^?40i|2FGUkEHrx zlsxRCnyk-jV^K}k=XJAF&DKZkAv?3bl=XQ-Z0qyJE3iIqifw(~9Mk&zP7LeQ1MAZk zus**FsXfADa9EDPMU-50$H4d)@{jTe%%;J=2gtYZ2*lhy0Q_6=dmC#|{5Ee#n|JWI z#BcLXw0RegQ2aK(k2de-kt)f#LH7AQJWh^AMS6UI`UCvl%Oh13BdrryDK-Yi=?}5W z(<;#`N9ldQ^gc04;{7+uB1H&ceVLKtjTRef1CrY&VOVs}rw>TnOJc$y|K00!Ljo)Wt zNtUGaH!Rs%eIr1A7QfHUZqq}O{9Cm9Jkxws()e`-V>*#VpM?0r@Q@k5W4V{{+Z?jys1WkN<);{~B8&mjV6l zE401eL7RVL+Z*3r|2x`zclPxXP~XGv`)r5fjQ@WC`afsif3KS@6GCGz)$dd(3GT{5aMu z*bL9zMZ&0xEsN@ydXX?{u1FTz70IGDmMpdgWKjoB z>sb~jq%0ax(%{nz#KXpxMPqDP%)264q^?L7^JB?kTR;{I!1+R!#T{~vd>kcpo+UQPoa%KwPd z*P5$UFK@k?lP}O?e$!;$h=Xt-D~bfZHu|* z^e`-L6}Mg^b2XgnF!umrkGTfV4)Z2{-pnPpaGQ0Ev%|avWoyk2g?SyNfwP^l?2$PE z?c{cH+nZ$Fb)36d<^-*`P|kQA*X%Vrxc9aET!-h4=3ee&GuQ8yxtlrHA#+#N+}}QK@f>ck-`t0?E^|MZjd58< z<|a6|Pv-V;?tr-;@Yk9L7(Op?h};b4Hc*|^i)KzQMfpkd22OubV%fm7bt~F>%x*3@ z=qWjfk{iuK9%_5cLn!Mudpy)0lsQ4|A(<1@9yWUbf311gLv4@D32NIYr>Ld0LoKBR zwTI0%VA*K)qJ-p3y15Z0H<$yA_an^Hb>>md{Wa%~%G_r;x5>Os^)f(d=+t9ebDOyd zm^Pcox$NsGJBcyfjIu4JuG$=+G}`<Jvy^Pox`9)lL+VCOJ%!X>N}&+&Rt(eh(_DI=xis=eg(e9>|=6 z6fI8&^1UkG<;5iBd{otDB5LncwflUv`(-YDp%St=Aah$U%z<9pOrfnfvrj+Qn?8N7 zFZVoO?l(9m_;^_LJsV%$KH3Dd%h$n(T9>awzS$QODb->)G1eUL9=$QOAaKd2yY^+Ddp zkoS2YA5)M6KFIqS@_rBG;|g-n2l)U)KH!1;q=FpsLB5zFU+jT=LO~w!LB50`U*dsu z?b%TuNug(7Q;^4fkS}M*mwO<8 zs33J8~dt9Lbxx{E5NgiD_$ibn--(nLjf zGeaPqYFbf0=F|KF`KC!nkG?AoSJN!(=rFpMX>h{ zkDEt_$7ambQf+>JZt^TNAtxG(zADgHU22im(1T7U@@D7c%*3>rYpO(feJZ2P&kE?y z;i=)1)|fSInfaz96SyIop)h=^MXSy3v&PH=!}+_=yo#IGrro0E4O)#$YMoX=8J1g3 zs$Q#P4j`7qhMML}Z%JsWh(6|PwO+o;nf?V@-5?YPgW*cHKGmudt*iG zpjP9mmZl{SWsdLdyA22zX{oNv(eBPnwlgy@)V;5}vtuX&+^yP*fz08)p-i@8Xecu{ z)G^fE*Xx5xv|f5+LYo&>$ZbAFZ%v0F(jN6?UFU(xS;J$!Gvgr+56Xy#}-p#f=OUF#ujZjiQWtzw|BZwR7l)atr>hcW|)GhN+6NOQH?BZHZN ztdJlE0mFkliL-G|>*M#AYl}n74^9tH&*W1VHjz#G}9reeIcUV3l2wmdU2LKDO^#5@idQ{UK;MXgD#(^kmg^s;7# z)M|+~FN7P@JRvkLRMmYJvJ6)C=d82CBj-u?Dyg#d(woY)h0 z^=ybxB$Pd+Y5g;~k-M;Hp^U6fU8-45Bw=gn(h@&UnYmh(&u*lk>yAbD89B1fpzmUX zRwdhGZYLxuq#@B%w`f(_{>d?G+YPY#cq2?7YpS7?hQ+rfGwzMfQ-yBi)GfKfYZ=FSJW~InR^E24vd27Yj`2V@ zw6Bha2E8*mYx+EcruJ$nnnqU6G~9ugzQ?*~1bs8pQ!~>pbgGl2##7OUgoIt&9v8_@ zxGz#Zxk)h|we2m@6u5Ay+qD(hJ~*?(aAD;HMJ+UO++s_RZ=%7gZQl`%sbtgCU`ZcF zV|%+b8gWtIr}^Y8CV^IXRtu{l~NW1~TLvIoZBmtiOp=1Liu__GXS|282sQt%NJJv3a|ud4^}P zHrLJV9h)3E!w#pb@v!pE_iD>aj{{cqj3Ak8V-xFs>iQ_Zj#kUs_7&-n zTj%Al`O>2m+QMk&;gNTm6C=uB+8AU%vRS$_)7wej{4w(+y^hd4tA#f&6|1DY(`a)z zwNJTgY#VCZcgAa+IS0qani!QmHD_TeiI!DbMSnhjm(-E@>0@~1rA;7W?tnRreE@*e z%2qU%(k}bGPB^ZTcE?F=?$Iik;07%z@NgG(SBZ^m+}r>U(2g2Om>Py+ZY%7ZbaMtR zC>nd6a43bHgIngU>>18alOKnA@s`i^ycn}XG&Fp2%*;%{gAy;8t=nAfrX89pZBB3I zn6PmJ86-P;#4F%HrYF-e$TRkxRoXoNpbre+6Mxd)7@o8n0(t;^Mds~h-@IKB(axEx z#LfTJsrzuzskH4;Wwh#->Su40>;@eyjTN`-&8Jrwp(^5k&-r?binN!0f-0Q=dso(&wiV9m0Er!X}JhsVSlJqwk*YIdQ;P_))- zweqd2d%~J-ZBSdmwE1PWF4vZd{dG^*R5O#OJ+9VEFUD40u?_gNmdb`U$RypV@Fo}U zJ1XkLtMmr!`_cBkP@EFG{jE#2C4vs63=sceaU8-Mvh|``7Ns`GMSyg+p}kq2BFNgb z{8zf|a}MW6S)c3tG>Y9Q=#~54Dpo|CX@m!mU+QbyQ|Zvqwmwg*_4YVlo7;n}(%!*L zb|7=>5$rOH#Z(qT=TcfjW?%p>2LqYG{yqTWona-0O6;+E{c44w!s|bK_p~cpAAbOc z1rd(VHmzoOY;+QP4R?+6xHYsdk8qIE9S#s)Et6-=^I3~Li#hOLv4u1xk5lB-hqOk7 zyG>BEZ&XLyN;p;+IU^3Y48IdxLrAA4$7simd|%$<;rGSKEVd1-Nh51b80IWhbA|dmAG}#M z)~BhH1@Fc}fxB(1%*{u7zwL%gxA2|6fR80y`vQRONm(oI&r0X(8!4#?_VV4my zQ)a!Z1&@Egqpe1usyQ_?HkM_2lq3rkB-26?#~(O>E6k-e8G?c|c@fSnCA^IuVsR9e zn=UkXO3VqP5Zs+AI5N1rkVtuoNck}yy7%nf-r?-bc{iKn?wmJ*!W$f*yT|>ybJXu7 z+GQmj@w>_P%M?{(SrCf#r+Db@Nx!`!k^&V8pvyP_Jt77`pXL1D`Z#r%Limp!JTtdf zh1_B9c{O>P1wK^QeFy5g_b^>|4$`fELKoIH@TiB+tnIc?Pr_^W_9seoak#DH-H#8p zttWxfdYbU^VS>HUStsOXC7)oXBM%^S_t-%u>BvF%95J2kdD`p2_iKBtdO`C>UIgFP z_3%r$E?={^JBfBDvBP@LB9QYFJPO_yDOPhQc%H_?ZW*MN)bZz>aq{@O_Ub5z zfJ5xa!_j+h`!%9{Y5%6+hMyHNp%jtEacBh&PP11>8d?RFrqtyc%!Yk-<;?V{ExX$0 z@}iYPY++drA}q^+|FYaNJPOq#Q&YS=6)MMuPnu(ec?b*18s@3tnX&0CFJ*;#f3|L1 zYypU7H7bNMx0VprS$VhyIQyXun8I9@#OvWC-Yt0%6k&DtnpqfOrmYFA$JWDmv^9Fz zXeAC-(}R0WB9>#!$QLx#U%pT`0fz=Y0j=&-fC>{1`uP=Fy4_hk3c?+|I zg4(-dA@Uvuc(l6^4j{F+mPQz=EzA!Ub)U7jhYEeKj-lG_vmQKdP-<*EZWHSa#BVjj zToj_?SPSmSzr9l0D1W4@;}3TmI;MpTZ!HF^0CZ2>tKAZf*o}-;K762SHbG8Atn$?Z zKr*yMj|`Mm?|*?tjy3nL)7Emx$@(w}OGcX7j%}CGv3P3}ai_Ku2`VenvK*_AibJ)R zNVdH&B1BbJp{e%bFc1fD>d~>P_L=}ZfWr~3da+1WdtIP;k%(8_;V%%uYOf8nm)QUq zb{Qz{wrC)%y(NIAG`Jp$msR@b$W|gCQ^5hXIzmF30&gI#`_3!^iJ{sd7`;@Gt?#mfsjsiCsm>ox|wQV{X5*Pf+yJ09TOi0nL$vk?g{bYSj-}Qx-BTQm|{85m>U!jrtA)4k#5r6 zXRW`aeVHHAzD()RPP;vt>rxTDx-S^izWK^A;LX{MCY9)96zSEYlL+Xg9mwf@*xr4$ zq)}@vb{s|=fT1dNdzNmkDK@@6CE5lugeAB9U#n}Q~ z6tSD45YlkD%byP+E$OE(!nyckYfhhV(VXi&_FSh>-uJPc!y4jE z58dB!$5FO}4=--^=*4gJ*sGjQLO~%s$#Ln&Uh0529+!AeWqf9Dkfs1WduQwp9J5A~ zL8(lPZX^iaJm1}j`CW@`>;lK>#$=8{7z;9>*WMP3TxyaQA;2*iC}h?N8pQvmL5z;WS8p>Vb-y5E_3cfu1Rw(Ybs6Rxvk|lp5&ib&SUpG} z>+^HLne&P$StzKB8)`*W%*pQu6x=Ht%HAm$=Q4*qKR^n<3#)@K+`~}Ir_)ycOV=^= zC34Y)=N!13q1HyHS#ih}0TRe2doFVnJpMd)Vh0-pP^zi3Da_cI_3llzhTok1xPX_#htfnInT3TpWrs$L3So>DcUXqpM<% zTPpVK>*9(fV3n1tD^V5aFVN7n#zBh}A4P=iwR^9U5o}V9(02^@eu`^mpAEh!i>ln> z+2j>;UW!Xan9KO^7oVq1$za%(ZPER zX?5;Fmly0MMSvzpbl-gjyEPind*?x~c1B#;qg3#To5%$Vx zV0CxGUL6hK4|DO{jIfJz?;i75Un22}gFpX02kRM%!*`)KO2YXQ%h%Q6ma0LPO9 zL*#hxNLcTs;*V0XbF@vzHKz43Du0s7OWm2UK0{#NA+TaMCkhewChUzOKqGX3ln&pq zuvZm>RgCNMUWL7)6e!MizDv|jH-XyX_baTksJC8CK>k}6c1mD(0&qxq3l!IG&+}JM zk(7o5t4J+)u2_Au>ouU4babyAAe|h)|w0 zeC5j{k}>B0LJc56h#z?}>|d>6xB6VVI;^WWIeqiYD82v@qCv=+lIUxaBEwiSa3^K%_ovFzop(U5&RMnh%= z?b2R2WgdIs6uERt8=)#(QA-=))P!kz9>}pCT>+YkUJS683l`;>x@S=ml*%!Ps3xMN z3?ph?`ei6z6pYJ?Tn-|D!d$%-3|Ze_iC3ouZhXGG&gCdR&0Zc=m3AWUbzj82y($ve z8Q7Z>jxynHSU)Z)A&+iT7D@pt-h2<-&1T$6tphf3mfRhM>z%xS~fdA zY0Qk7*=$=yZWjceJ4BB+(BqAGv?X(QQQD%%8G4M-!>zB#jZ(q5zqB$pO$BG^an4^g zCwD$r@M3?#Zx-g{&m;B_2fpNq;U3+o$wDG~vd}a-IXOCJiZ4E%oH>=oC;!ac#PC=S zM^4yJ3{>YhimMipn0fgv${a=h6{@o``Z7mxaX2V&ze$Bc_ihw{HfGLWS!l>0deQ}^NRXLvj?Z)p^}4K#_Z>Rk zpK($7o9c5ZPsa0@_~K>`-Vl-9KhQVS*V)&D59rXhS#ldtoP&Q+mV*H)%Rx)Za&36% z*JL|;x^X9@yNe$D6+!-9AQyIa^mpv-?&%)t&J1Sh^Mw+fzB0Pi5I#KD%k;L&FQj;) zj=h&Y8D?V`hCWw#WY7yKO7u;RG_v>(4aL=W;GWAsw(rPLKmG@^nNIPYLj>>Z%cFtO zlKWj9UCm#q=^i@Hccl@%C&e$WvGP-2>J-Xbug=|7M!OU8YSWaYoy$MWnk4AfEZPTvMOkm=}x5ITDH_YHIp z9XPD7l1(M)4wYUEYa&62Rxgx8gGA)3TPrchyS&~J_Mm`qQL~{icOL~5dkT^UoE^g~ zrboRUhcoyN&ykG2AzIOd&U)2TUl<9g<4uLXlIbB+Zwi-5HCtA!rl)&wNMDgv_iCdi zjlRgy0RLpt=Q`!t{ys?bxV}yml+m6y?V7%tk*j!F;6x+Sw{oqO&GsiFwJ{A z^_Z~7GJ6l}JLBQa+=kJ@SF9w_`r25{++mVb>stctXqJ@VBtAGZvnw|CAU_-8wuJUe z8Az7E0kkyI4(SWra>%Z)pLAd_Q0ho#p%2!%0mahz=nb-!lb;`9GojJK$oj@en;;LyzC4$HVk^Ej?aO5B3=mr5*e}IX;9gJldNOq+FK&5WJu2@)hNE?%$m1 z%8K#?|0REtOlk=ymq02>ch)6x1Xb`Ou-%d7Z39US$-Omz93G<)HMgda+xQaOu zuu*+Pm3=R zm0wKkNWct-sCq1UaCWL@>vgvJpez+UQxzerNUBsTIm$t-D*qpe#gQZMrDS?`UKN&N zy0b2fBdC8tN@M4R?gaJqi73s9jdM0>$$EwFD~ZjJUXX@M$-QB|m8@d+@oeFPa`xh@ z#=Q6DHE;gIiM}9D@IQVxX|Nw6Eki}QuMK$e<%K>3W)NiZR1z9Ne>~gaEm12aO^HS2 zBeV)_*&+pT6y+vJSup?Y#EJ-RKbzbUrZaXQVov$A0@%Ks+#JTKcn$I%kuN!FLB6gc z@5BFRi315ZWf-St5*4m(#>l-TnGN$1TQ)K1B07R{QTT;z4#+m~kz{uXntqn33EMbu z@~vb`iB_Q0ClQ%flwIX0|GaQ2iNuhoZ18D$yEWiteCnd^Sb$spKCqK0$aN zzRx6XfDaV5Nq?NYHLL}tdLgW;{?}UIt|Tmr|C?G+5z+#m?nvG9uBoJJSDN?geiVLH z&$w)_HUi^F3P`qey^{3!l@ zUi72isF4o#J6m4S75T;l&G>Y3w@0!?xK&t+j9!q6+4MVzFW5d=YKsMX=XkUcncUT}4QCzwXt2zxVkLMI?UZ5{|N-3d?N01nVQ-1Thz$NZt^h5k+-_ z-!(9g$eyaV6MEN3V&6B3KX?CElu%xjCb16COc8&Ss^bzWZIG=6jDQnm)S6%gl=xTl z;ovV_?_d`=oIZ>HOV~8epUcl|DYU}IbpxbQ@l17<{1>~_72nt9Ya|z0r&R)up=M7t zDtwKJMv1w|ztqz=s$22=g0_|WlQL_NEvYwPDTasIU#?zCShQ8to+WoREfjBpQttQv Qr!q$Z#PQQwomT$;0B#ZtqW}N^ literal 0 HcmV?d00001 diff --git a/pywidevine/L3/cdm/formats/wv_proto2.proto b/pywidevine/L3/cdm/formats/wv_proto2.proto new file mode 100644 index 0000000..04c9809 --- /dev/null +++ b/pywidevine/L3/cdm/formats/wv_proto2.proto @@ -0,0 +1,466 @@ +syntax = "proto2"; + +// from x86 (partial), most of it from the ARM version: +message ClientIdentification { + enum TokenType { + KEYBOX = 0; + DEVICE_CERTIFICATE = 1; + REMOTE_ATTESTATION_CERTIFICATE = 2; + } + message NameValue { + required string Name = 1; + required string Value = 2; + } + message ClientCapabilities { + enum HdcpVersion { + HDCP_NONE = 0; + HDCP_V1 = 1; + HDCP_V2 = 2; + HDCP_V2_1 = 3; + HDCP_V2_2 = 4; + } + optional uint32 ClientToken = 1; + optional uint32 SessionToken = 2; + optional uint32 VideoResolutionConstraints = 3; + optional HdcpVersion MaxHdcpVersion = 4; + optional uint32 OemCryptoApiVersion = 5; + } + required TokenType Type = 1; + //optional bytes Token = 2; // by default the client treats this as blob, but it's usually a DeviceCertificate, so for usefulness sake, I'm replacing it with this one: + optional SignedDeviceCertificate Token = 2; // use this when parsing, "bytes" when building a client id blob + repeated NameValue ClientInfo = 3; + optional bytes ProviderClientToken = 4; + optional uint32 LicenseCounter = 5; + optional ClientCapabilities _ClientCapabilities = 6; // how should we deal with duped names? will have to look at proto docs later + optional FileHashes _FileHashes = 7; // vmp blob goes here +} + +message DeviceCertificate { + enum CertificateType { + ROOT = 0; + INTERMEDIATE = 1; + USER_DEVICE = 2; + SERVICE = 3; + } + required CertificateType Type = 1; // the compiled code reused this as ProvisionedDeviceInfo.WvSecurityLevel, however that is incorrect (compiler aliased it as they're both identical as a structure) + optional bytes SerialNumber = 2; + optional uint32 CreationTimeSeconds = 3; + optional bytes PublicKey = 4; + optional uint32 SystemId = 5; + optional uint32 TestDeviceDeprecated = 6; // is it bool or int? + optional bytes ServiceId = 7; // service URL for service certificates +} + +// missing some references, +message DeviceCertificateStatus { + enum CertificateStatus { + VALID = 0; + REVOKED = 1; + } + optional bytes SerialNumber = 1; + optional CertificateStatus Status = 2; + optional ProvisionedDeviceInfo DeviceInfo = 4; // where is 3? is it deprecated? +} + +message DeviceCertificateStatusList { + optional uint32 CreationTimeSeconds = 1; + repeated DeviceCertificateStatus CertificateStatus = 2; +} + +message EncryptedClientIdentification { + required string ServiceId = 1; + optional bytes ServiceCertificateSerialNumber = 2; + required bytes EncryptedClientId = 3; + required bytes EncryptedClientIdIv = 4; + required bytes EncryptedPrivacyKey = 5; +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +enum LicenseType { + ZERO = 0; + DEFAULT = 1; // 1 is STREAMING/temporary license; on recent versions may go up to 3 (latest x86); it might be persist/don't persist type, unconfirmed + OFFLINE = 2; +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +// this is just a guess because these globals got lost, but really, do we need more? +enum ProtocolVersion { + CURRENT = 21; // don't have symbols for this +} + + +message LicenseIdentification { + optional bytes RequestId = 1; + optional bytes SessionId = 2; + optional bytes PurchaseId = 3; + optional LicenseType Type = 4; + optional uint32 Version = 5; + optional bytes ProviderSessionToken = 6; +} + + +message License { + message Policy { + optional bool CanPlay = 1; // changed from uint32 to bool + optional bool CanPersist = 2; + optional bool CanRenew = 3; + optional uint32 RentalDurationSeconds = 4; + optional uint32 PlaybackDurationSeconds = 5; + optional uint32 LicenseDurationSeconds = 6; + optional uint32 RenewalRecoveryDurationSeconds = 7; + optional string RenewalServerUrl = 8; + optional uint32 RenewalDelaySeconds = 9; + optional uint32 RenewalRetryIntervalSeconds = 10; + optional bool RenewWithUsage = 11; // was uint32 + } + message KeyContainer { + enum KeyType { + SIGNING = 1; + CONTENT = 2; + KEY_CONTROL = 3; + OPERATOR_SESSION = 4; + } + enum SecurityLevel { + SW_SECURE_CRYPTO = 1; + SW_SECURE_DECODE = 2; + HW_SECURE_CRYPTO = 3; + HW_SECURE_DECODE = 4; + HW_SECURE_ALL = 5; + } + message OutputProtection { + enum CGMS { + COPY_FREE = 0; + COPY_ONCE = 2; + COPY_NEVER = 3; + CGMS_NONE = 0x2A; // PC default! + } + optional ClientIdentification.ClientCapabilities.HdcpVersion Hdcp = 1; // it's most likely a copy of Hdcp version available here, but compiler optimized it away + optional CGMS CgmsFlags = 2; + } + message KeyControl { + required bytes KeyControlBlock = 1; // what is this? + required bytes Iv = 2; + } + message OperatorSessionKeyPermissions { + optional uint32 AllowEncrypt = 1; + optional uint32 AllowDecrypt = 2; + optional uint32 AllowSign = 3; + optional uint32 AllowSignatureVerify = 4; + } + message VideoResolutionConstraint { + optional uint32 MinResolutionPixels = 1; + optional uint32 MaxResolutionPixels = 2; + optional OutputProtection RequiredProtection = 3; + } + optional bytes Id = 1; + optional bytes Iv = 2; + optional bytes Key = 3; + optional KeyType Type = 4; + optional SecurityLevel Level = 5; + optional OutputProtection RequiredProtection = 6; + optional OutputProtection RequestedProtection = 7; + optional KeyControl _KeyControl = 8; // duped names, etc + optional OperatorSessionKeyPermissions _OperatorSessionKeyPermissions = 9; // duped names, etc + repeated VideoResolutionConstraint VideoResolutionConstraints = 10; + } + optional LicenseIdentification Id = 1; + optional Policy _Policy = 2; // duped names, etc + repeated KeyContainer Key = 3; + optional uint32 LicenseStartTime = 4; + optional uint32 RemoteAttestationVerified = 5; // bool? + optional bytes ProviderClientToken = 6; + // there might be more, check with newer versions (I see field 7-8 in a lic) + // this appeared in latest x86: + optional uint32 ProtectionScheme = 7; // type unconfirmed fully, but it's likely as WidevineCencHeader describesit (fourcc) +} + +message LicenseError { + enum Error { + INVALID_DEVICE_CERTIFICATE = 1; + REVOKED_DEVICE_CERTIFICATE = 2; + SERVICE_UNAVAILABLE = 3; + } + //LicenseRequest.RequestType ErrorCode; // clang mismatch + optional Error ErrorCode = 1; +} + +message LicenseRequest { + message ContentIdentification { + message CENC { + //optional bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: + optional WidevineCencHeader Pssh = 1; + optional LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 (is this persist/don't persist? look into it!) + optional bytes RequestId = 3; + } + message WebM { + optional bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used + optional LicenseType LicenseType = 2; + optional bytes RequestId = 3; + } + message ExistingLicense { + optional LicenseIdentification LicenseId = 1; + optional uint32 SecondsSinceStarted = 2; + optional uint32 SecondsSinceLastPlayed = 3; + optional bytes SessionUsageTableEntry = 4; // interesting! try to figure out the connection between the usage table blob and KCB! + } + optional CENC CencId = 1; + optional WebM WebmId = 2; + optional ExistingLicense License = 3; + } + enum RequestType { + NEW = 1; + RENEWAL = 2; + RELEASE = 3; + } + optional ClientIdentification ClientId = 1; + optional ContentIdentification ContentId = 2; + optional RequestType Type = 3; + optional uint32 RequestTime = 4; + optional bytes KeyControlNonceDeprecated = 5; + optional ProtocolVersion ProtocolVersion = 6; // lacking symbols for this + optional uint32 KeyControlNonce = 7; + optional EncryptedClientIdentification EncryptedClientId = 8; +} + +// raw pssh hack +message LicenseRequestRaw { + message ContentIdentification { + message CENC { + optional bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: + //optional WidevineCencHeader Pssh = 1; + optional LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 (is this persist/don't persist? look into it!) + optional bytes RequestId = 3; + } + message WebM { + optional bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used + optional LicenseType LicenseType = 2; + optional bytes RequestId = 3; + } + message ExistingLicense { + optional LicenseIdentification LicenseId = 1; + optional uint32 SecondsSinceStarted = 2; + optional uint32 SecondsSinceLastPlayed = 3; + optional bytes SessionUsageTableEntry = 4; // interesting! try to figure out the connection between the usage table blob and KCB! + } + optional CENC CencId = 1; + optional WebM WebmId = 2; + optional ExistingLicense License = 3; + } + enum RequestType { + NEW = 1; + RENEWAL = 2; + RELEASE = 3; + } + optional ClientIdentification ClientId = 1; + optional ContentIdentification ContentId = 2; + optional RequestType Type = 3; + optional uint32 RequestTime = 4; + optional bytes KeyControlNonceDeprecated = 5; + optional ProtocolVersion ProtocolVersion = 6; // lacking symbols for this + optional uint32 KeyControlNonce = 7; + optional EncryptedClientIdentification EncryptedClientId = 8; +} + + +message ProvisionedDeviceInfo { + enum WvSecurityLevel { + LEVEL_UNSPECIFIED = 0; + LEVEL_1 = 1; + LEVEL_2 = 2; + LEVEL_3 = 3; + } + optional uint32 SystemId = 1; + optional string Soc = 2; + optional string Manufacturer = 3; + optional string Model = 4; + optional string DeviceType = 5; + optional uint32 ModelYear = 6; + optional WvSecurityLevel SecurityLevel = 7; + optional uint32 TestDevice = 8; // bool? +} + + +// todo: fill +message ProvisioningOptions { +} + +// todo: fill +message ProvisioningRequest { +} + +// todo: fill +message ProvisioningResponse { +} + +message RemoteAttestation { + optional EncryptedClientIdentification Certificate = 1; + optional string Salt = 2; + optional string Signature = 3; +} + +// todo: fill +message SessionInit { +} + +// todo: fill +message SessionState { +} + +// todo: fill +message SignedCertificateStatusList { +} + +message SignedDeviceCertificate { + + //optional bytes DeviceCertificate = 1; // again, they use a buffer where it's supposed to be a message, so we'll replace it with what it really is: + optional DeviceCertificate _DeviceCertificate = 1; // how should we deal with duped names? will have to look at proto docs later + optional bytes Signature = 2; + optional SignedDeviceCertificate Signer = 3; +} + + +// todo: fill +message SignedProvisioningMessage { +} + +// the root of all messages, from either server or client +message SignedMessage { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional bytes Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + + + +// This message is copied from google's docs, not reversed: +message WidevineCencHeader { + enum Algorithm { + UNENCRYPTED = 0; + AESCTR = 1; + }; + optional Algorithm algorithm = 1; + repeated bytes key_id = 2; + + // Content provider name. + optional string provider = 3; + + // A content identifier, specified by content provider. + optional bytes content_id = 4; + + // Track type. Acceptable values are SD, HD and AUDIO. Used to + // differentiate content keys used by an asset. + optional string track_type_deprecated = 5; + + // The name of a registered policy to be used for this asset. + optional string policy = 6; + + // Crypto period index, for media using key rotation. + optional uint32 crypto_period_index = 7; + + // Optional protected context for group content. The grouped_license is a + // serialized SignedMessage. + optional bytes grouped_license = 8; + + // Protection scheme identifying the encryption algorithm. + // Represented as one of the following 4CC values: + // 'cenc' (AESCTR), 'cbc1' (AESCBC), + // 'cens' (AESCTR subsample), 'cbcs' (AESCBC subsample). + optional uint32 protection_scheme = 9; + + // Optional. For media using key rotation, this represents the duration + // of each crypto period in seconds. + optional uint32 crypto_period_seconds = 10; +} + + +// remove these when using it outside of protoc: + +// from here on, it's just for testing, these messages don't exist in the binaries, I'm adding them to avoid detecting type programmatically +message SignedLicenseRequest { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional LicenseRequest Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + +// hack +message SignedLicenseRequestRaw { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional LicenseRequestRaw Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + + +message SignedLicense { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional License Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + +message SignedServiceCertificate { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional SignedDeviceCertificate Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + +//vmp support +message FileHashes { + message Signature { + optional string filename = 1; + optional bool test_signing = 2; //0 - release, 1 - testing + optional bytes SHA512Hash = 3; + optional bool main_exe = 4; //0 for dlls, 1 for exe, this is field 3 in file + optional bytes signature = 5; + } + optional bytes signer = 1; + repeated Signature signatures = 2; +} diff --git a/pywidevine/L3/cdm/formats/wv_proto2_pb2.py b/pywidevine/L3/cdm/formats/wv_proto2_pb2.py new file mode 100644 index 0000000..4c2a6d1 --- /dev/null +++ b/pywidevine/L3/cdm/formats/wv_proto2_pb2.py @@ -0,0 +1,3324 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: pywidevine/cdm/formats/wv_proto2.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='pywidevine/cdm/formats/wv_proto2.proto', + package='', + syntax='proto2', + serialized_pb=_b('\n&pywidevine/cdm/formats/wv_proto2.proto\"\xe7\x05\n\x14\x43lientIdentification\x12-\n\x04Type\x18\x01 \x02(\x0e\x32\x1f.ClientIdentification.TokenType\x12\'\n\x05Token\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x33\n\nClientInfo\x18\x03 \x03(\x0b\x32\x1f.ClientIdentification.NameValue\x12\x1b\n\x13ProviderClientToken\x18\x04 \x01(\x0c\x12\x16\n\x0eLicenseCounter\x18\x05 \x01(\r\x12\x45\n\x13_ClientCapabilities\x18\x06 \x01(\x0b\x32(.ClientIdentification.ClientCapabilities\x12 \n\x0b_FileHashes\x18\x07 \x01(\x0b\x32\x0b.FileHashes\x1a(\n\tNameValue\x12\x0c\n\x04Name\x18\x01 \x02(\t\x12\r\n\x05Value\x18\x02 \x02(\t\x1a\xa4\x02\n\x12\x43lientCapabilities\x12\x13\n\x0b\x43lientToken\x18\x01 \x01(\r\x12\x14\n\x0cSessionToken\x18\x02 \x01(\r\x12\"\n\x1aVideoResolutionConstraints\x18\x03 \x01(\r\x12L\n\x0eMaxHdcpVersion\x18\x04 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12\x1b\n\x13OemCryptoApiVersion\x18\x05 \x01(\r\"T\n\x0bHdcpVersion\x12\r\n\tHDCP_NONE\x10\x00\x12\x0b\n\x07HDCP_V1\x10\x01\x12\x0b\n\x07HDCP_V2\x10\x02\x12\r\n\tHDCP_V2_1\x10\x03\x12\r\n\tHDCP_V2_2\x10\x04\"S\n\tTokenType\x12\n\n\x06KEYBOX\x10\x00\x12\x16\n\x12\x44\x45VICE_CERTIFICATE\x10\x01\x12\"\n\x1eREMOTE_ATTESTATION_CERTIFICATE\x10\x02\"\x9b\x02\n\x11\x44\x65viceCertificate\x12\x30\n\x04Type\x18\x01 \x02(\x0e\x32\".DeviceCertificate.CertificateType\x12\x14\n\x0cSerialNumber\x18\x02 \x01(\x0c\x12\x1b\n\x13\x43reationTimeSeconds\x18\x03 \x01(\r\x12\x11\n\tPublicKey\x18\x04 \x01(\x0c\x12\x10\n\x08SystemId\x18\x05 \x01(\r\x12\x1c\n\x14TestDeviceDeprecated\x18\x06 \x01(\r\x12\x11\n\tServiceId\x18\x07 \x01(\x0c\"K\n\x0f\x43\x65rtificateType\x12\x08\n\x04ROOT\x10\x00\x12\x10\n\x0cINTERMEDIATE\x10\x01\x12\x0f\n\x0bUSER_DEVICE\x10\x02\x12\x0b\n\x07SERVICE\x10\x03\"\xc4\x01\n\x17\x44\x65viceCertificateStatus\x12\x14\n\x0cSerialNumber\x18\x01 \x01(\x0c\x12:\n\x06Status\x18\x02 \x01(\x0e\x32*.DeviceCertificateStatus.CertificateStatus\x12*\n\nDeviceInfo\x18\x04 \x01(\x0b\x32\x16.ProvisionedDeviceInfo\"+\n\x11\x43\x65rtificateStatus\x12\t\n\x05VALID\x10\x00\x12\x0b\n\x07REVOKED\x10\x01\"o\n\x1b\x44\x65viceCertificateStatusList\x12\x1b\n\x13\x43reationTimeSeconds\x18\x01 \x01(\r\x12\x33\n\x11\x43\x65rtificateStatus\x18\x02 \x03(\x0b\x32\x18.DeviceCertificateStatus\"\xaf\x01\n\x1d\x45ncryptedClientIdentification\x12\x11\n\tServiceId\x18\x01 \x02(\t\x12&\n\x1eServiceCertificateSerialNumber\x18\x02 \x01(\x0c\x12\x19\n\x11\x45ncryptedClientId\x18\x03 \x02(\x0c\x12\x1b\n\x13\x45ncryptedClientIdIv\x18\x04 \x02(\x0c\x12\x1b\n\x13\x45ncryptedPrivacyKey\x18\x05 \x02(\x0c\"\x9c\x01\n\x15LicenseIdentification\x12\x11\n\tRequestId\x18\x01 \x01(\x0c\x12\x11\n\tSessionId\x18\x02 \x01(\x0c\x12\x12\n\nPurchaseId\x18\x03 \x01(\x0c\x12\x1a\n\x04Type\x18\x04 \x01(\x0e\x32\x0c.LicenseType\x12\x0f\n\x07Version\x18\x05 \x01(\r\x12\x1c\n\x14ProviderSessionToken\x18\x06 \x01(\x0c\"\xa1\x0e\n\x07License\x12\"\n\x02Id\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12 \n\x07_Policy\x18\x02 \x01(\x0b\x32\x0f.License.Policy\x12\"\n\x03Key\x18\x03 \x03(\x0b\x32\x15.License.KeyContainer\x12\x18\n\x10LicenseStartTime\x18\x04 \x01(\r\x12!\n\x19RemoteAttestationVerified\x18\x05 \x01(\r\x12\x1b\n\x13ProviderClientToken\x18\x06 \x01(\x0c\x12\x18\n\x10ProtectionScheme\x18\x07 \x01(\r\x1a\xbb\x02\n\x06Policy\x12\x0f\n\x07\x43\x61nPlay\x18\x01 \x01(\x08\x12\x12\n\nCanPersist\x18\x02 \x01(\x08\x12\x10\n\x08\x43\x61nRenew\x18\x03 \x01(\x08\x12\x1d\n\x15RentalDurationSeconds\x18\x04 \x01(\r\x12\x1f\n\x17PlaybackDurationSeconds\x18\x05 \x01(\r\x12\x1e\n\x16LicenseDurationSeconds\x18\x06 \x01(\r\x12&\n\x1eRenewalRecoveryDurationSeconds\x18\x07 \x01(\r\x12\x18\n\x10RenewalServerUrl\x18\x08 \x01(\t\x12\x1b\n\x13RenewalDelaySeconds\x18\t \x01(\r\x12#\n\x1bRenewalRetryIntervalSeconds\x18\n \x01(\r\x12\x16\n\x0eRenewWithUsage\x18\x0b \x01(\x08\x1a\xf9\t\n\x0cKeyContainer\x12\n\n\x02Id\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x12\x0b\n\x03Key\x18\x03 \x01(\x0c\x12+\n\x04Type\x18\x04 \x01(\x0e\x32\x1d.License.KeyContainer.KeyType\x12\x32\n\x05Level\x18\x05 \x01(\x0e\x32#.License.KeyContainer.SecurityLevel\x12\x42\n\x12RequiredProtection\x18\x06 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x43\n\x13RequestedProtection\x18\x07 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x35\n\x0b_KeyControl\x18\x08 \x01(\x0b\x32 .License.KeyContainer.KeyControl\x12[\n\x1e_OperatorSessionKeyPermissions\x18\t \x01(\x0b\x32\x33.License.KeyContainer.OperatorSessionKeyPermissions\x12S\n\x1aVideoResolutionConstraints\x18\n \x03(\x0b\x32/.License.KeyContainer.VideoResolutionConstraint\x1a\xdb\x01\n\x10OutputProtection\x12\x42\n\x04Hdcp\x18\x01 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12>\n\tCgmsFlags\x18\x02 \x01(\x0e\x32+.License.KeyContainer.OutputProtection.CGMS\"C\n\x04\x43GMS\x12\r\n\tCOPY_FREE\x10\x00\x12\r\n\tCOPY_ONCE\x10\x02\x12\x0e\n\nCOPY_NEVER\x10\x03\x12\r\n\tCGMS_NONE\x10*\x1a\x31\n\nKeyControl\x12\x17\n\x0fKeyControlBlock\x18\x01 \x02(\x0c\x12\n\n\x02Iv\x18\x02 \x02(\x0c\x1a|\n\x1dOperatorSessionKeyPermissions\x12\x14\n\x0c\x41llowEncrypt\x18\x01 \x01(\r\x12\x14\n\x0c\x41llowDecrypt\x18\x02 \x01(\r\x12\x11\n\tAllowSign\x18\x03 \x01(\r\x12\x1c\n\x14\x41llowSignatureVerify\x18\x04 \x01(\r\x1a\x99\x01\n\x19VideoResolutionConstraint\x12\x1b\n\x13MinResolutionPixels\x18\x01 \x01(\r\x12\x1b\n\x13MaxResolutionPixels\x18\x02 \x01(\r\x12\x42\n\x12RequiredProtection\x18\x03 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\"J\n\x07KeyType\x12\x0b\n\x07SIGNING\x10\x01\x12\x0b\n\x07\x43ONTENT\x10\x02\x12\x0f\n\x0bKEY_CONTROL\x10\x03\x12\x14\n\x10OPERATOR_SESSION\x10\x04\"z\n\rSecurityLevel\x12\x14\n\x10SW_SECURE_CRYPTO\x10\x01\x12\x14\n\x10SW_SECURE_DECODE\x10\x02\x12\x14\n\x10HW_SECURE_CRYPTO\x10\x03\x12\x14\n\x10HW_SECURE_DECODE\x10\x04\x12\x11\n\rHW_SECURE_ALL\x10\x05\"\x98\x01\n\x0cLicenseError\x12&\n\tErrorCode\x18\x01 \x01(\x0e\x32\x13.LicenseError.Error\"`\n\x05\x45rror\x12\x1e\n\x1aINVALID_DEVICE_CERTIFICATE\x10\x01\x12\x1e\n\x1aREVOKED_DEVICE_CERTIFICATE\x10\x02\x12\x17\n\x13SERVICE_UNAVAILABLE\x10\x03\"\xac\x07\n\x0eLicenseRequest\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12\x38\n\tContentId\x18\x02 \x01(\x0b\x32%.LicenseRequest.ContentIdentification\x12)\n\x04Type\x18\x03 \x01(\x0e\x32\x1b.LicenseRequest.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\xa2\x04\n\x15\x43ontentIdentification\x12:\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.CENC\x12:\n\x06WebmId\x18\x02 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.WebM\x12\x46\n\x07License\x18\x03 \x01(\x0b\x32\x35.LicenseRequest.ContentIdentification.ExistingLicense\x1a_\n\x04\x43\x45NC\x12!\n\x04Pssh\x18\x01 \x01(\x0b\x32\x13.WidevineCencHeader\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"0\n\x0bRequestType\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa9\x07\n\x11LicenseRequestRaw\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12;\n\tContentId\x18\x02 \x01(\x0b\x32(.LicenseRequestRaw.ContentIdentification\x12,\n\x04Type\x18\x03 \x01(\x0e\x32\x1e.LicenseRequestRaw.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\x96\x04\n\x15\x43ontentIdentification\x12=\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32-.LicenseRequestRaw.ContentIdentification.CENC\x12=\n\x06WebmId\x18\x02 \x01(\x0b\x32-.LicenseRequestRaw.ContentIdentification.WebM\x12I\n\x07License\x18\x03 \x01(\x0b\x32\x38.LicenseRequestRaw.ContentIdentification.ExistingLicense\x1aJ\n\x04\x43\x45NC\x12\x0c\n\x04Pssh\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"0\n\x0bRequestType\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa6\x02\n\x15ProvisionedDeviceInfo\x12\x10\n\x08SystemId\x18\x01 \x01(\r\x12\x0b\n\x03Soc\x18\x02 \x01(\t\x12\x14\n\x0cManufacturer\x18\x03 \x01(\t\x12\r\n\x05Model\x18\x04 \x01(\t\x12\x12\n\nDeviceType\x18\x05 \x01(\t\x12\x11\n\tModelYear\x18\x06 \x01(\r\x12=\n\rSecurityLevel\x18\x07 \x01(\x0e\x32&.ProvisionedDeviceInfo.WvSecurityLevel\x12\x12\n\nTestDevice\x18\x08 \x01(\r\"O\n\x0fWvSecurityLevel\x12\x15\n\x11LEVEL_UNSPECIFIED\x10\x00\x12\x0b\n\x07LEVEL_1\x10\x01\x12\x0b\n\x07LEVEL_2\x10\x02\x12\x0b\n\x07LEVEL_3\x10\x03\"\x15\n\x13ProvisioningOptions\"\x15\n\x13ProvisioningRequest\"\x16\n\x14ProvisioningResponse\"i\n\x11RemoteAttestation\x12\x33\n\x0b\x43\x65rtificate\x18\x01 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x12\x0c\n\x04Salt\x18\x02 \x01(\t\x12\x11\n\tSignature\x18\x03 \x01(\t\"\r\n\x0bSessionInit\"\x0e\n\x0cSessionState\"\x1d\n\x1bSignedCertificateStatusList\"\x86\x01\n\x17SignedDeviceCertificate\x12.\n\x12_DeviceCertificate\x18\x01 \x01(\x0b\x32\x12.DeviceCertificate\x12\x11\n\tSignature\x18\x02 \x01(\x0c\x12(\n\x06Signer\x18\x03 \x01(\x0b\x32\x18.SignedDeviceCertificate\"\x1b\n\x19SignedProvisioningMessage\"\x9b\x02\n\rSignedMessage\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedMessage.MessageType\x12\x0b\n\x03Msg\x18\x02 \x01(\x0c\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc5\x02\n\x12WidevineCencHeader\x12\x30\n\talgorithm\x18\x01 \x01(\x0e\x32\x1d.WidevineCencHeader.Algorithm\x12\x0e\n\x06key_id\x18\x02 \x03(\x0c\x12\x10\n\x08provider\x18\x03 \x01(\t\x12\x12\n\ncontent_id\x18\x04 \x01(\x0c\x12\x1d\n\x15track_type_deprecated\x18\x05 \x01(\t\x12\x0e\n\x06policy\x18\x06 \x01(\t\x12\x1b\n\x13\x63rypto_period_index\x18\x07 \x01(\r\x12\x17\n\x0fgrouped_license\x18\x08 \x01(\x0c\x12\x19\n\x11protection_scheme\x18\t \x01(\r\x12\x1d\n\x15\x63rypto_period_seconds\x18\n \x01(\r\"(\n\tAlgorithm\x12\x0f\n\x0bUNENCRYPTED\x10\x00\x12\n\n\x06\x41\x45SCTR\x10\x01\"\xba\x02\n\x14SignedLicenseRequest\x12/\n\x04Type\x18\x01 \x01(\x0e\x32!.SignedLicenseRequest.MessageType\x12\x1c\n\x03Msg\x18\x02 \x01(\x0b\x32\x0f.LicenseRequest\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc3\x02\n\x17SignedLicenseRequestRaw\x12\x32\n\x04Type\x18\x01 \x01(\x0e\x32$.SignedLicenseRequestRaw.MessageType\x12\x1f\n\x03Msg\x18\x02 \x01(\x0b\x32\x12.LicenseRequestRaw\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xa5\x02\n\rSignedLicense\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedLicense.MessageType\x12\x15\n\x03Msg\x18\x02 \x01(\x0b\x32\x08.License\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xcb\x02\n\x18SignedServiceCertificate\x12\x33\n\x04Type\x18\x01 \x01(\x0e\x32%.SignedServiceCertificate.MessageType\x12%\n\x03Msg\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xb5\x01\n\nFileHashes\x12\x0e\n\x06signer\x18\x01 \x01(\x0c\x12)\n\nsignatures\x18\x02 \x03(\x0b\x32\x15.FileHashes.Signature\x1al\n\tSignature\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\x12\x14\n\x0ctest_signing\x18\x02 \x01(\x08\x12\x12\n\nSHA512Hash\x18\x03 \x01(\x0c\x12\x10\n\x08main_exe\x18\x04 \x01(\x08\x12\x11\n\tsignature\x18\x05 \x01(\x0c*1\n\x0bLicenseType\x12\x08\n\x04ZERO\x10\x00\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x01\x12\x0b\n\x07OFFLINE\x10\x02*\x1e\n\x0fProtocolVersion\x12\x0b\n\x07\x43URRENT\x10\x15') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +_LICENSETYPE = _descriptor.EnumDescriptor( + name='LicenseType', + full_name='LicenseType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ZERO', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OFFLINE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=8362, + serialized_end=8411, +) +_sym_db.RegisterEnumDescriptor(_LICENSETYPE) + +LicenseType = enum_type_wrapper.EnumTypeWrapper(_LICENSETYPE) +_PROTOCOLVERSION = _descriptor.EnumDescriptor( + name='ProtocolVersion', + full_name='ProtocolVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='CURRENT', index=0, number=21, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=8413, + serialized_end=8443, +) +_sym_db.RegisterEnumDescriptor(_PROTOCOLVERSION) + +ProtocolVersion = enum_type_wrapper.EnumTypeWrapper(_PROTOCOLVERSION) +ZERO = 0 +DEFAULT = 1 +OFFLINE = 2 +CURRENT = 21 + + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION = _descriptor.EnumDescriptor( + name='HdcpVersion', + full_name='ClientIdentification.ClientCapabilities.HdcpVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='HDCP_NONE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_1', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_2', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=617, + serialized_end=701, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION) + +_CLIENTIDENTIFICATION_TOKENTYPE = _descriptor.EnumDescriptor( + name='TokenType', + full_name='ClientIdentification.TokenType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='KEYBOX', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEVICE_CERTIFICATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REMOTE_ATTESTATION_CERTIFICATE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=703, + serialized_end=786, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_TOKENTYPE) + +_DEVICECERTIFICATE_CERTIFICATETYPE = _descriptor.EnumDescriptor( + name='CertificateType', + full_name='DeviceCertificate.CertificateType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ROOT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INTERMEDIATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='USER_DEVICE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=997, + serialized_end=1072, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATE_CERTIFICATETYPE) + +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS = _descriptor.EnumDescriptor( + name='CertificateStatus', + full_name='DeviceCertificateStatus.CertificateStatus', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='VALID', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1228, + serialized_end=1271, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS = _descriptor.EnumDescriptor( + name='CGMS', + full_name='License.KeyContainer.OutputProtection.CGMS', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='COPY_FREE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_ONCE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_NEVER', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CGMS_NONE', index=3, number=42, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2949, + serialized_end=3016, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS) + +_LICENSE_KEYCONTAINER_KEYTYPE = _descriptor.EnumDescriptor( + name='KeyType', + full_name='License.KeyContainer.KeyType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SIGNING', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CONTENT', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='KEY_CONTROL', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OPERATOR_SESSION', index=3, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3351, + serialized_end=3425, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_KEYTYPE) + +_LICENSE_KEYCONTAINER_SECURITYLEVEL = _descriptor.EnumDescriptor( + name='SecurityLevel', + full_name='License.KeyContainer.SecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SW_SECURE_CRYPTO', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SW_SECURE_DECODE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_CRYPTO', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_DECODE', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_ALL', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3427, + serialized_end=3549, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_SECURITYLEVEL) + +_LICENSEERROR_ERROR = _descriptor.EnumDescriptor( + name='Error', + full_name='LicenseError.Error', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='INVALID_DEVICE_CERTIFICATE', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED_DEVICE_CERTIFICATE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_UNAVAILABLE', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3608, + serialized_end=3704, +) +_sym_db.RegisterEnumDescriptor(_LICENSEERROR_ERROR) + +_LICENSEREQUEST_REQUESTTYPE = _descriptor.EnumDescriptor( + name='RequestType', + full_name='LicenseRequest.RequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NEW', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RENEWAL', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RELEASE', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4599, + serialized_end=4647, +) +_sym_db.RegisterEnumDescriptor(_LICENSEREQUEST_REQUESTTYPE) + +_LICENSEREQUESTRAW_REQUESTTYPE = _descriptor.EnumDescriptor( + name='RequestType', + full_name='LicenseRequestRaw.RequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NEW', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RENEWAL', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RELEASE', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4599, + serialized_end=4647, +) +_sym_db.RegisterEnumDescriptor(_LICENSEREQUESTRAW_REQUESTTYPE) + +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL = _descriptor.EnumDescriptor( + name='WvSecurityLevel', + full_name='ProvisionedDeviceInfo.WvSecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LEVEL_UNSPECIFIED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_3', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5805, + serialized_end=5884, +) +_sym_db.RegisterEnumDescriptor(_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL) + +_SIGNEDMESSAGE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedMessage.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDMESSAGE_MESSAGETYPE) + +_WIDEVINECENCHEADER_ALGORITHM = _descriptor.EnumDescriptor( + name='Algorithm', + full_name='WidevineCencHeader.Algorithm', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNENCRYPTED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='AESCTR', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6863, + serialized_end=6903, +) +_sym_db.RegisterEnumDescriptor(_WIDEVINECENCHEADER_ALGORITHM) + +_SIGNEDLICENSEREQUEST_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicenseRequest.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSEREQUEST_MESSAGETYPE) + +_SIGNEDLICENSEREQUESTRAW_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicenseRequestRaw.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSEREQUESTRAW_MESSAGETYPE) + +_SIGNEDLICENSE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicense.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSE_MESSAGETYPE) + +_SIGNEDSERVICECERTIFICATE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedServiceCertificate.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDSERVICECERTIFICATE_MESSAGETYPE) + + +_CLIENTIDENTIFICATION_NAMEVALUE = _descriptor.Descriptor( + name='NameValue', + full_name='ClientIdentification.NameValue', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Name', full_name='ClientIdentification.NameValue.Name', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Value', full_name='ClientIdentification.NameValue.Value', index=1, + number=2, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=366, + serialized_end=406, +) + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES = _descriptor.Descriptor( + name='ClientCapabilities', + full_name='ClientIdentification.ClientCapabilities', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientToken', full_name='ClientIdentification.ClientCapabilities.ClientToken', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionToken', full_name='ClientIdentification.ClientCapabilities.SessionToken', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='ClientIdentification.ClientCapabilities.VideoResolutionConstraints', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxHdcpVersion', full_name='ClientIdentification.ClientCapabilities.MaxHdcpVersion', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='OemCryptoApiVersion', full_name='ClientIdentification.ClientCapabilities.OemCryptoApiVersion', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=409, + serialized_end=701, +) + +_CLIENTIDENTIFICATION = _descriptor.Descriptor( + name='ClientIdentification', + full_name='ClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='ClientIdentification.Type', index=0, + number=1, type=14, cpp_type=8, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Token', full_name='ClientIdentification.Token', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ClientInfo', full_name='ClientIdentification.ClientInfo', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='ClientIdentification.ProviderClientToken', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseCounter', full_name='ClientIdentification.LicenseCounter', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_ClientCapabilities', full_name='ClientIdentification._ClientCapabilities', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_FileHashes', full_name='ClientIdentification._FileHashes', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_CLIENTIDENTIFICATION_NAMEVALUE, _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, ], + enum_types=[ + _CLIENTIDENTIFICATION_TOKENTYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=43, + serialized_end=786, +) + + +_DEVICECERTIFICATE = _descriptor.Descriptor( + name='DeviceCertificate', + full_name='DeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='DeviceCertificate.Type', index=0, + number=1, type=14, cpp_type=8, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificate.SerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificate.CreationTimeSeconds', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PublicKey', full_name='DeviceCertificate.PublicKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SystemId', full_name='DeviceCertificate.SystemId', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDeviceDeprecated', full_name='DeviceCertificate.TestDeviceDeprecated', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceId', full_name='DeviceCertificate.ServiceId', index=6, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATE_CERTIFICATETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=789, + serialized_end=1072, +) + + +_DEVICECERTIFICATESTATUS = _descriptor.Descriptor( + name='DeviceCertificateStatus', + full_name='DeviceCertificateStatus', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificateStatus.SerialNumber', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Status', full_name='DeviceCertificateStatus.Status', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceInfo', full_name='DeviceCertificateStatus.DeviceInfo', index=2, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1075, + serialized_end=1271, +) + + +_DEVICECERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='DeviceCertificateStatusList', + full_name='DeviceCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificateStatusList.CreationTimeSeconds', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CertificateStatus', full_name='DeviceCertificateStatusList.CertificateStatus', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1273, + serialized_end=1384, +) + + +_ENCRYPTEDCLIENTIDENTIFICATION = _descriptor.Descriptor( + name='EncryptedClientIdentification', + full_name='EncryptedClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ServiceId', full_name='EncryptedClientIdentification.ServiceId', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceCertificateSerialNumber', full_name='EncryptedClientIdentification.ServiceCertificateSerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='EncryptedClientIdentification.EncryptedClientId', index=2, + number=3, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientIdIv', full_name='EncryptedClientIdentification.EncryptedClientIdIv', index=3, + number=4, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedPrivacyKey', full_name='EncryptedClientIdentification.EncryptedPrivacyKey', index=4, + number=5, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1387, + serialized_end=1562, +) + + +_LICENSEIDENTIFICATION = _descriptor.Descriptor( + name='LicenseIdentification', + full_name='LicenseIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseIdentification.RequestId', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionId', full_name='LicenseIdentification.SessionId', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PurchaseId', full_name='LicenseIdentification.PurchaseId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseIdentification.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Version', full_name='LicenseIdentification.Version', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderSessionToken', full_name='LicenseIdentification.ProviderSessionToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1565, + serialized_end=1721, +) + + +_LICENSE_POLICY = _descriptor.Descriptor( + name='Policy', + full_name='License.Policy', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CanPlay', full_name='License.Policy.CanPlay', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanPersist', full_name='License.Policy.CanPersist', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanRenew', full_name='License.Policy.CanRenew', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RentalDurationSeconds', full_name='License.Policy.RentalDurationSeconds', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PlaybackDurationSeconds', full_name='License.Policy.PlaybackDurationSeconds', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseDurationSeconds', full_name='License.Policy.LicenseDurationSeconds', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRecoveryDurationSeconds', full_name='License.Policy.RenewalRecoveryDurationSeconds', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalServerUrl', full_name='License.Policy.RenewalServerUrl', index=7, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalDelaySeconds', full_name='License.Policy.RenewalDelaySeconds', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRetryIntervalSeconds', full_name='License.Policy.RenewalRetryIntervalSeconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewWithUsage', full_name='License.Policy.RenewWithUsage', index=10, + number=11, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1958, + serialized_end=2273, +) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION = _descriptor.Descriptor( + name='OutputProtection', + full_name='License.KeyContainer.OutputProtection', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Hdcp', full_name='License.KeyContainer.OutputProtection.Hdcp', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CgmsFlags', full_name='License.KeyContainer.OutputProtection.CgmsFlags', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2797, + serialized_end=3016, +) + +_LICENSE_KEYCONTAINER_KEYCONTROL = _descriptor.Descriptor( + name='KeyControl', + full_name='License.KeyContainer.KeyControl', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='KeyControlBlock', full_name='License.KeyContainer.KeyControl.KeyControlBlock', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.KeyControl.Iv', index=1, + number=2, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3018, + serialized_end=3067, +) + +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS = _descriptor.Descriptor( + name='OperatorSessionKeyPermissions', + full_name='License.KeyContainer.OperatorSessionKeyPermissions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='AllowEncrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowEncrypt', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowDecrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowDecrypt', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSign', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSign', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSignatureVerify', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSignatureVerify', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3069, + serialized_end=3193, +) + +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT = _descriptor.Descriptor( + name='VideoResolutionConstraint', + full_name='License.KeyContainer.VideoResolutionConstraint', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='MinResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MinResolutionPixels', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MaxResolutionPixels', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.VideoResolutionConstraint.RequiredProtection', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3196, + serialized_end=3349, +) + +_LICENSE_KEYCONTAINER = _descriptor.Descriptor( + name='KeyContainer', + full_name='License.KeyContainer', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.KeyContainer.Id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.Iv', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.KeyContainer.Key', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='License.KeyContainer.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Level', full_name='License.KeyContainer.Level', index=4, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.RequiredProtection', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestedProtection', full_name='License.KeyContainer.RequestedProtection', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_KeyControl', full_name='License.KeyContainer._KeyControl', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_OperatorSessionKeyPermissions', full_name='License.KeyContainer._OperatorSessionKeyPermissions', index=8, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='License.KeyContainer.VideoResolutionConstraints', index=9, + number=10, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_KEYCONTAINER_OUTPUTPROTECTION, _LICENSE_KEYCONTAINER_KEYCONTROL, _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, ], + enum_types=[ + _LICENSE_KEYCONTAINER_KEYTYPE, + _LICENSE_KEYCONTAINER_SECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2276, + serialized_end=3549, +) + +_LICENSE = _descriptor.Descriptor( + name='License', + full_name='License', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.Id', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_Policy', full_name='License._Policy', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.Key', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseStartTime', full_name='License.LicenseStartTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestationVerified', full_name='License.RemoteAttestationVerified', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='License.ProviderClientToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtectionScheme', full_name='License.ProtectionScheme', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_POLICY, _LICENSE_KEYCONTAINER, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1724, + serialized_end=3549, +) + + +_LICENSEERROR = _descriptor.Descriptor( + name='LicenseError', + full_name='LicenseError', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ErrorCode', full_name='LicenseError.ErrorCode', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSEERROR_ERROR, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3552, + serialized_end=3704, +) + + +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC = _descriptor.Descriptor( + name='CENC', + full_name='LicenseRequest.ContentIdentification.CENC', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Pssh', full_name='LicenseRequest.ContentIdentification.CENC.Pssh', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.CENC.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.CENC.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4268, + serialized_end=4363, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM = _descriptor.Descriptor( + name='WebM', + full_name='LicenseRequest.ContentIdentification.WebM', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Header', full_name='LicenseRequest.ContentIdentification.WebM.Header', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.WebM.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.WebM.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4365, + serialized_end=4441, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE = _descriptor.Descriptor( + name='ExistingLicense', + full_name='LicenseRequest.ContentIdentification.ExistingLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='LicenseId', full_name='LicenseRequest.ContentIdentification.ExistingLicense.LicenseId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceStarted', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceStarted', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceLastPlayed', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceLastPlayed', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionUsageTableEntry', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SessionUsageTableEntry', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4444, + serialized_end=4597, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION = _descriptor.Descriptor( + name='ContentIdentification', + full_name='LicenseRequest.ContentIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CencId', full_name='LicenseRequest.ContentIdentification.CencId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='WebmId', full_name='LicenseRequest.ContentIdentification.WebmId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='License', full_name='LicenseRequest.ContentIdentification.License', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4051, + serialized_end=4597, +) + +_LICENSEREQUEST = _descriptor.Descriptor( + name='LicenseRequest', + full_name='LicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientId', full_name='LicenseRequest.ClientId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ContentId', full_name='LicenseRequest.ContentId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseRequest.Type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestTime', full_name='LicenseRequest.RequestTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonceDeprecated', full_name='LicenseRequest.KeyControlNonceDeprecated', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtocolVersion', full_name='LicenseRequest.ProtocolVersion', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=21, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonce', full_name='LicenseRequest.KeyControlNonce', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='LicenseRequest.EncryptedClientId', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION, ], + enum_types=[ + _LICENSEREQUEST_REQUESTTYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3707, + serialized_end=4647, +) + + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC = _descriptor.Descriptor( + name='CENC', + full_name='LicenseRequestRaw.ContentIdentification.CENC', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Pssh', full_name='LicenseRequestRaw.ContentIdentification.CENC.Pssh', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequestRaw.ContentIdentification.CENC.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequestRaw.ContentIdentification.CENC.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5229, + serialized_end=5303, +) + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM = _descriptor.Descriptor( + name='WebM', + full_name='LicenseRequestRaw.ContentIdentification.WebM', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Header', full_name='LicenseRequestRaw.ContentIdentification.WebM.Header', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequestRaw.ContentIdentification.WebM.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequestRaw.ContentIdentification.WebM.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4365, + serialized_end=4441, +) + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE = _descriptor.Descriptor( + name='ExistingLicense', + full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='LicenseId', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.LicenseId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceStarted', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.SecondsSinceStarted', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceLastPlayed', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.SecondsSinceLastPlayed', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionUsageTableEntry', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.SessionUsageTableEntry', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4444, + serialized_end=4597, +) + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION = _descriptor.Descriptor( + name='ContentIdentification', + full_name='LicenseRequestRaw.ContentIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CencId', full_name='LicenseRequestRaw.ContentIdentification.CencId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='WebmId', full_name='LicenseRequestRaw.ContentIdentification.WebmId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='License', full_name='LicenseRequestRaw.ContentIdentification.License', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC, _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM, _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5003, + serialized_end=5537, +) + +_LICENSEREQUESTRAW = _descriptor.Descriptor( + name='LicenseRequestRaw', + full_name='LicenseRequestRaw', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientId', full_name='LicenseRequestRaw.ClientId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ContentId', full_name='LicenseRequestRaw.ContentId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseRequestRaw.Type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestTime', full_name='LicenseRequestRaw.RequestTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonceDeprecated', full_name='LicenseRequestRaw.KeyControlNonceDeprecated', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtocolVersion', full_name='LicenseRequestRaw.ProtocolVersion', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=21, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonce', full_name='LicenseRequestRaw.KeyControlNonce', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='LicenseRequestRaw.EncryptedClientId', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUESTRAW_CONTENTIDENTIFICATION, ], + enum_types=[ + _LICENSEREQUESTRAW_REQUESTTYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4650, + serialized_end=5587, +) + + +_PROVISIONEDDEVICEINFO = _descriptor.Descriptor( + name='ProvisionedDeviceInfo', + full_name='ProvisionedDeviceInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SystemId', full_name='ProvisionedDeviceInfo.SystemId', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Soc', full_name='ProvisionedDeviceInfo.Soc', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Manufacturer', full_name='ProvisionedDeviceInfo.Manufacturer', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Model', full_name='ProvisionedDeviceInfo.Model', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceType', full_name='ProvisionedDeviceInfo.DeviceType', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ModelYear', full_name='ProvisionedDeviceInfo.ModelYear', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecurityLevel', full_name='ProvisionedDeviceInfo.SecurityLevel', index=6, + number=7, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDevice', full_name='ProvisionedDeviceInfo.TestDevice', index=7, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5590, + serialized_end=5884, +) + + +_PROVISIONINGOPTIONS = _descriptor.Descriptor( + name='ProvisioningOptions', + full_name='ProvisioningOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5886, + serialized_end=5907, +) + + +_PROVISIONINGREQUEST = _descriptor.Descriptor( + name='ProvisioningRequest', + full_name='ProvisioningRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5909, + serialized_end=5930, +) + + +_PROVISIONINGRESPONSE = _descriptor.Descriptor( + name='ProvisioningResponse', + full_name='ProvisioningResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5932, + serialized_end=5954, +) + + +_REMOTEATTESTATION = _descriptor.Descriptor( + name='RemoteAttestation', + full_name='RemoteAttestation', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Certificate', full_name='RemoteAttestation.Certificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Salt', full_name='RemoteAttestation.Salt', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='RemoteAttestation.Signature', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5956, + serialized_end=6061, +) + + +_SESSIONINIT = _descriptor.Descriptor( + name='SessionInit', + full_name='SessionInit', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6063, + serialized_end=6076, +) + + +_SESSIONSTATE = _descriptor.Descriptor( + name='SessionState', + full_name='SessionState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6078, + serialized_end=6092, +) + + +_SIGNEDCERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='SignedCertificateStatusList', + full_name='SignedCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6094, + serialized_end=6123, +) + + +_SIGNEDDEVICECERTIFICATE = _descriptor.Descriptor( + name='SignedDeviceCertificate', + full_name='SignedDeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='_DeviceCertificate', full_name='SignedDeviceCertificate._DeviceCertificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedDeviceCertificate.Signature', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signer', full_name='SignedDeviceCertificate.Signer', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6126, + serialized_end=6260, +) + + +_SIGNEDPROVISIONINGMESSAGE = _descriptor.Descriptor( + name='SignedProvisioningMessage', + full_name='SignedProvisioningMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6262, + serialized_end=6289, +) + + +_SIGNEDMESSAGE = _descriptor.Descriptor( + name='SignedMessage', + full_name='SignedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedMessage.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedMessage.Msg', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedMessage.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedMessage.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedMessage.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDMESSAGE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6292, + serialized_end=6575, +) + + +_WIDEVINECENCHEADER = _descriptor.Descriptor( + name='WidevineCencHeader', + full_name='WidevineCencHeader', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='algorithm', full_name='WidevineCencHeader.algorithm', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='key_id', full_name='WidevineCencHeader.key_id', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='provider', full_name='WidevineCencHeader.provider', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='content_id', full_name='WidevineCencHeader.content_id', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='track_type_deprecated', full_name='WidevineCencHeader.track_type_deprecated', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='policy', full_name='WidevineCencHeader.policy', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_index', full_name='WidevineCencHeader.crypto_period_index', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='grouped_license', full_name='WidevineCencHeader.grouped_license', index=7, + number=8, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='protection_scheme', full_name='WidevineCencHeader.protection_scheme', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_seconds', full_name='WidevineCencHeader.crypto_period_seconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _WIDEVINECENCHEADER_ALGORITHM, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6578, + serialized_end=6903, +) + + +_SIGNEDLICENSEREQUEST = _descriptor.Descriptor( + name='SignedLicenseRequest', + full_name='SignedLicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicenseRequest.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicenseRequest.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicenseRequest.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicenseRequest.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicenseRequest.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSEREQUEST_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6906, + serialized_end=7220, +) + + +_SIGNEDLICENSEREQUESTRAW = _descriptor.Descriptor( + name='SignedLicenseRequestRaw', + full_name='SignedLicenseRequestRaw', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicenseRequestRaw.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicenseRequestRaw.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicenseRequestRaw.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicenseRequestRaw.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicenseRequestRaw.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSEREQUESTRAW_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7223, + serialized_end=7546, +) + + +_SIGNEDLICENSE = _descriptor.Descriptor( + name='SignedLicense', + full_name='SignedLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicense.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicense.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicense.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicense.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicense.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7549, + serialized_end=7842, +) + + +_SIGNEDSERVICECERTIFICATE = _descriptor.Descriptor( + name='SignedServiceCertificate', + full_name='SignedServiceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedServiceCertificate.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedServiceCertificate.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedServiceCertificate.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedServiceCertificate.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedServiceCertificate.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDSERVICECERTIFICATE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7845, + serialized_end=8176, +) + + +_FILEHASHES_SIGNATURE = _descriptor.Descriptor( + name='Signature', + full_name='FileHashes.Signature', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='filename', full_name='FileHashes.Signature.filename', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='test_signing', full_name='FileHashes.Signature.test_signing', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SHA512Hash', full_name='FileHashes.Signature.SHA512Hash', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='main_exe', full_name='FileHashes.Signature.main_exe', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='signature', full_name='FileHashes.Signature.signature', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8252, + serialized_end=8360, +) + +_FILEHASHES = _descriptor.Descriptor( + name='FileHashes', + full_name='FileHashes', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='signer', full_name='FileHashes.signer', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='signatures', full_name='FileHashes.signatures', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_FILEHASHES_SIGNATURE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8179, + serialized_end=8360, +) + +_CLIENTIDENTIFICATION_NAMEVALUE.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.fields_by_name['MaxHdcpVersion'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION.containing_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION.fields_by_name['Type'].enum_type = _CLIENTIDENTIFICATION_TOKENTYPE +_CLIENTIDENTIFICATION.fields_by_name['Token'].message_type = _SIGNEDDEVICECERTIFICATE +_CLIENTIDENTIFICATION.fields_by_name['ClientInfo'].message_type = _CLIENTIDENTIFICATION_NAMEVALUE +_CLIENTIDENTIFICATION.fields_by_name['_ClientCapabilities'].message_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION.fields_by_name['_FileHashes'].message_type = _FILEHASHES +_CLIENTIDENTIFICATION_TOKENTYPE.containing_type = _CLIENTIDENTIFICATION +_DEVICECERTIFICATE.fields_by_name['Type'].enum_type = _DEVICECERTIFICATE_CERTIFICATETYPE +_DEVICECERTIFICATE_CERTIFICATETYPE.containing_type = _DEVICECERTIFICATE +_DEVICECERTIFICATESTATUS.fields_by_name['Status'].enum_type = _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS +_DEVICECERTIFICATESTATUS.fields_by_name['DeviceInfo'].message_type = _PROVISIONEDDEVICEINFO +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS.containing_type = _DEVICECERTIFICATESTATUS +_DEVICECERTIFICATESTATUSLIST.fields_by_name['CertificateStatus'].message_type = _DEVICECERTIFICATESTATUS +_LICENSEIDENTIFICATION.fields_by_name['Type'].enum_type = _LICENSETYPE +_LICENSE_POLICY.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['Hdcp'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['CgmsFlags'].enum_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS.containing_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_KEYCONTROL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER.fields_by_name['Type'].enum_type = _LICENSE_KEYCONTAINER_KEYTYPE +_LICENSE_KEYCONTAINER.fields_by_name['Level'].enum_type = _LICENSE_KEYCONTAINER_SECURITYLEVEL +_LICENSE_KEYCONTAINER.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['RequestedProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['_KeyControl'].message_type = _LICENSE_KEYCONTAINER_KEYCONTROL +_LICENSE_KEYCONTAINER.fields_by_name['_OperatorSessionKeyPermissions'].message_type = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS +_LICENSE_KEYCONTAINER.fields_by_name['VideoResolutionConstraints'].message_type = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT +_LICENSE_KEYCONTAINER.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_KEYTYPE.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_SECURITYLEVEL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE.fields_by_name['Id'].message_type = _LICENSEIDENTIFICATION +_LICENSE.fields_by_name['_Policy'].message_type = _LICENSE_POLICY +_LICENSE.fields_by_name['Key'].message_type = _LICENSE_KEYCONTAINER +_LICENSEERROR.fields_by_name['ErrorCode'].enum_type = _LICENSEERROR_ERROR +_LICENSEERROR_ERROR.containing_type = _LICENSEERROR +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['Pssh'].message_type = _WIDEVINECENCHEADER +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.fields_by_name['LicenseId'].message_type = _LICENSEIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['CencId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['WebmId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['License'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE +_LICENSEREQUEST_CONTENTIDENTIFICATION.containing_type = _LICENSEREQUEST +_LICENSEREQUEST.fields_by_name['ClientId'].message_type = _CLIENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['ContentId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['Type'].enum_type = _LICENSEREQUEST_REQUESTTYPE +_LICENSEREQUEST.fields_by_name['ProtocolVersion'].enum_type = _PROTOCOLVERSION +_LICENSEREQUEST.fields_by_name['EncryptedClientId'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_LICENSEREQUEST_REQUESTTYPE.containing_type = _LICENSEREQUEST +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC.containing_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM.containing_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE.fields_by_name['LicenseId'].message_type = _LICENSEIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE.containing_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.fields_by_name['CencId'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.fields_by_name['WebmId'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.fields_by_name['License'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.containing_type = _LICENSEREQUESTRAW +_LICENSEREQUESTRAW.fields_by_name['ClientId'].message_type = _CLIENTIDENTIFICATION +_LICENSEREQUESTRAW.fields_by_name['ContentId'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW.fields_by_name['Type'].enum_type = _LICENSEREQUESTRAW_REQUESTTYPE +_LICENSEREQUESTRAW.fields_by_name['ProtocolVersion'].enum_type = _PROTOCOLVERSION +_LICENSEREQUESTRAW.fields_by_name['EncryptedClientId'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_LICENSEREQUESTRAW_REQUESTTYPE.containing_type = _LICENSEREQUESTRAW +_PROVISIONEDDEVICEINFO.fields_by_name['SecurityLevel'].enum_type = _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL.containing_type = _PROVISIONEDDEVICEINFO +_REMOTEATTESTATION.fields_by_name['Certificate'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_SIGNEDDEVICECERTIFICATE.fields_by_name['_DeviceCertificate'].message_type = _DEVICECERTIFICATE +_SIGNEDDEVICECERTIFICATE.fields_by_name['Signer'].message_type = _SIGNEDDEVICECERTIFICATE +_SIGNEDMESSAGE.fields_by_name['Type'].enum_type = _SIGNEDMESSAGE_MESSAGETYPE +_SIGNEDMESSAGE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDMESSAGE_MESSAGETYPE.containing_type = _SIGNEDMESSAGE +_WIDEVINECENCHEADER.fields_by_name['algorithm'].enum_type = _WIDEVINECENCHEADER_ALGORITHM +_WIDEVINECENCHEADER_ALGORITHM.containing_type = _WIDEVINECENCHEADER +_SIGNEDLICENSEREQUEST.fields_by_name['Type'].enum_type = _SIGNEDLICENSEREQUEST_MESSAGETYPE +_SIGNEDLICENSEREQUEST.fields_by_name['Msg'].message_type = _LICENSEREQUEST +_SIGNEDLICENSEREQUEST.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSEREQUEST_MESSAGETYPE.containing_type = _SIGNEDLICENSEREQUEST +_SIGNEDLICENSEREQUESTRAW.fields_by_name['Type'].enum_type = _SIGNEDLICENSEREQUESTRAW_MESSAGETYPE +_SIGNEDLICENSEREQUESTRAW.fields_by_name['Msg'].message_type = _LICENSEREQUESTRAW +_SIGNEDLICENSEREQUESTRAW.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSEREQUESTRAW_MESSAGETYPE.containing_type = _SIGNEDLICENSEREQUESTRAW +_SIGNEDLICENSE.fields_by_name['Type'].enum_type = _SIGNEDLICENSE_MESSAGETYPE +_SIGNEDLICENSE.fields_by_name['Msg'].message_type = _LICENSE +_SIGNEDLICENSE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSE_MESSAGETYPE.containing_type = _SIGNEDLICENSE +_SIGNEDSERVICECERTIFICATE.fields_by_name['Type'].enum_type = _SIGNEDSERVICECERTIFICATE_MESSAGETYPE +_SIGNEDSERVICECERTIFICATE.fields_by_name['Msg'].message_type = _SIGNEDDEVICECERTIFICATE +_SIGNEDSERVICECERTIFICATE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDSERVICECERTIFICATE_MESSAGETYPE.containing_type = _SIGNEDSERVICECERTIFICATE +_FILEHASHES_SIGNATURE.containing_type = _FILEHASHES +_FILEHASHES.fields_by_name['signatures'].message_type = _FILEHASHES_SIGNATURE +DESCRIPTOR.message_types_by_name['ClientIdentification'] = _CLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['DeviceCertificate'] = _DEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['DeviceCertificateStatus'] = _DEVICECERTIFICATESTATUS +DESCRIPTOR.message_types_by_name['DeviceCertificateStatusList'] = _DEVICECERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['EncryptedClientIdentification'] = _ENCRYPTEDCLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['LicenseIdentification'] = _LICENSEIDENTIFICATION +DESCRIPTOR.message_types_by_name['License'] = _LICENSE +DESCRIPTOR.message_types_by_name['LicenseError'] = _LICENSEERROR +DESCRIPTOR.message_types_by_name['LicenseRequest'] = _LICENSEREQUEST +DESCRIPTOR.message_types_by_name['LicenseRequestRaw'] = _LICENSEREQUESTRAW +DESCRIPTOR.message_types_by_name['ProvisionedDeviceInfo'] = _PROVISIONEDDEVICEINFO +DESCRIPTOR.message_types_by_name['ProvisioningOptions'] = _PROVISIONINGOPTIONS +DESCRIPTOR.message_types_by_name['ProvisioningRequest'] = _PROVISIONINGREQUEST +DESCRIPTOR.message_types_by_name['ProvisioningResponse'] = _PROVISIONINGRESPONSE +DESCRIPTOR.message_types_by_name['RemoteAttestation'] = _REMOTEATTESTATION +DESCRIPTOR.message_types_by_name['SessionInit'] = _SESSIONINIT +DESCRIPTOR.message_types_by_name['SessionState'] = _SESSIONSTATE +DESCRIPTOR.message_types_by_name['SignedCertificateStatusList'] = _SIGNEDCERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['SignedDeviceCertificate'] = _SIGNEDDEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['SignedProvisioningMessage'] = _SIGNEDPROVISIONINGMESSAGE +DESCRIPTOR.message_types_by_name['SignedMessage'] = _SIGNEDMESSAGE +DESCRIPTOR.message_types_by_name['WidevineCencHeader'] = _WIDEVINECENCHEADER +DESCRIPTOR.message_types_by_name['SignedLicenseRequest'] = _SIGNEDLICENSEREQUEST +DESCRIPTOR.message_types_by_name['SignedLicenseRequestRaw'] = _SIGNEDLICENSEREQUESTRAW +DESCRIPTOR.message_types_by_name['SignedLicense'] = _SIGNEDLICENSE +DESCRIPTOR.message_types_by_name['SignedServiceCertificate'] = _SIGNEDSERVICECERTIFICATE +DESCRIPTOR.message_types_by_name['FileHashes'] = _FILEHASHES +DESCRIPTOR.enum_types_by_name['LicenseType'] = _LICENSETYPE +DESCRIPTOR.enum_types_by_name['ProtocolVersion'] = _PROTOCOLVERSION + +ClientIdentification = _reflection.GeneratedProtocolMessageType('ClientIdentification', (_message.Message,), dict( + + NameValue = _reflection.GeneratedProtocolMessageType('NameValue', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_NAMEVALUE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.NameValue) + )) + , + + ClientCapabilities = _reflection.GeneratedProtocolMessageType('ClientCapabilities', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.ClientCapabilities) + )) + , + DESCRIPTOR = _CLIENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification) + )) +_sym_db.RegisterMessage(ClientIdentification) +_sym_db.RegisterMessage(ClientIdentification.NameValue) +_sym_db.RegisterMessage(ClientIdentification.ClientCapabilities) + +DeviceCertificate = _reflection.GeneratedProtocolMessageType('DeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificate) + )) +_sym_db.RegisterMessage(DeviceCertificate) + +DeviceCertificateStatus = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatus', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUS, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatus) + )) +_sym_db.RegisterMessage(DeviceCertificateStatus) + +DeviceCertificateStatusList = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUSLIST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatusList) + )) +_sym_db.RegisterMessage(DeviceCertificateStatusList) + +EncryptedClientIdentification = _reflection.GeneratedProtocolMessageType('EncryptedClientIdentification', (_message.Message,), dict( + DESCRIPTOR = _ENCRYPTEDCLIENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:EncryptedClientIdentification) + )) +_sym_db.RegisterMessage(EncryptedClientIdentification) + +LicenseIdentification = _reflection.GeneratedProtocolMessageType('LicenseIdentification', (_message.Message,), dict( + DESCRIPTOR = _LICENSEIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseIdentification) + )) +_sym_db.RegisterMessage(LicenseIdentification) + +License = _reflection.GeneratedProtocolMessageType('License', (_message.Message,), dict( + + Policy = _reflection.GeneratedProtocolMessageType('Policy', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_POLICY, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.Policy) + )) + , + + KeyContainer = _reflection.GeneratedProtocolMessageType('KeyContainer', (_message.Message,), dict( + + OutputProtection = _reflection.GeneratedProtocolMessageType('OutputProtection', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OutputProtection) + )) + , + + KeyControl = _reflection.GeneratedProtocolMessageType('KeyControl', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_KEYCONTROL, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.KeyControl) + )) + , + + OperatorSessionKeyPermissions = _reflection.GeneratedProtocolMessageType('OperatorSessionKeyPermissions', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OperatorSessionKeyPermissions) + )) + , + + VideoResolutionConstraint = _reflection.GeneratedProtocolMessageType('VideoResolutionConstraint', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.VideoResolutionConstraint) + )) + , + DESCRIPTOR = _LICENSE_KEYCONTAINER, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer) + )) + , + DESCRIPTOR = _LICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License) + )) +_sym_db.RegisterMessage(License) +_sym_db.RegisterMessage(License.Policy) +_sym_db.RegisterMessage(License.KeyContainer) +_sym_db.RegisterMessage(License.KeyContainer.OutputProtection) +_sym_db.RegisterMessage(License.KeyContainer.KeyControl) +_sym_db.RegisterMessage(License.KeyContainer.OperatorSessionKeyPermissions) +_sym_db.RegisterMessage(License.KeyContainer.VideoResolutionConstraint) + +LicenseError = _reflection.GeneratedProtocolMessageType('LicenseError', (_message.Message,), dict( + DESCRIPTOR = _LICENSEERROR, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseError) + )) +_sym_db.RegisterMessage(LicenseError) + +LicenseRequest = _reflection.GeneratedProtocolMessageType('LicenseRequest', (_message.Message,), dict( + + ContentIdentification = _reflection.GeneratedProtocolMessageType('ContentIdentification', (_message.Message,), dict( + + CENC = _reflection.GeneratedProtocolMessageType('CENC', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.CENC) + )) + , + + WebM = _reflection.GeneratedProtocolMessageType('WebM', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.WebM) + )) + , + + ExistingLicense = _reflection.GeneratedProtocolMessageType('ExistingLicense', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.ExistingLicense) + )) + , + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification) + )) + , + DESCRIPTOR = _LICENSEREQUEST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest) + )) +_sym_db.RegisterMessage(LicenseRequest) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.CENC) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.WebM) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.ExistingLicense) + +LicenseRequestRaw = _reflection.GeneratedProtocolMessageType('LicenseRequestRaw', (_message.Message,), dict( + + ContentIdentification = _reflection.GeneratedProtocolMessageType('ContentIdentification', (_message.Message,), dict( + + CENC = _reflection.GeneratedProtocolMessageType('CENC', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification.CENC) + )) + , + + WebM = _reflection.GeneratedProtocolMessageType('WebM', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification.WebM) + )) + , + + ExistingLicense = _reflection.GeneratedProtocolMessageType('ExistingLicense', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification.ExistingLicense) + )) + , + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification) + )) + , + DESCRIPTOR = _LICENSEREQUESTRAW, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw) + )) +_sym_db.RegisterMessage(LicenseRequestRaw) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification.CENC) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification.WebM) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification.ExistingLicense) + +ProvisionedDeviceInfo = _reflection.GeneratedProtocolMessageType('ProvisionedDeviceInfo', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONEDDEVICEINFO, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisionedDeviceInfo) + )) +_sym_db.RegisterMessage(ProvisionedDeviceInfo) + +ProvisioningOptions = _reflection.GeneratedProtocolMessageType('ProvisioningOptions', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGOPTIONS, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningOptions) + )) +_sym_db.RegisterMessage(ProvisioningOptions) + +ProvisioningRequest = _reflection.GeneratedProtocolMessageType('ProvisioningRequest', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGREQUEST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningRequest) + )) +_sym_db.RegisterMessage(ProvisioningRequest) + +ProvisioningResponse = _reflection.GeneratedProtocolMessageType('ProvisioningResponse', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGRESPONSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningResponse) + )) +_sym_db.RegisterMessage(ProvisioningResponse) + +RemoteAttestation = _reflection.GeneratedProtocolMessageType('RemoteAttestation', (_message.Message,), dict( + DESCRIPTOR = _REMOTEATTESTATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:RemoteAttestation) + )) +_sym_db.RegisterMessage(RemoteAttestation) + +SessionInit = _reflection.GeneratedProtocolMessageType('SessionInit', (_message.Message,), dict( + DESCRIPTOR = _SESSIONINIT, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SessionInit) + )) +_sym_db.RegisterMessage(SessionInit) + +SessionState = _reflection.GeneratedProtocolMessageType('SessionState', (_message.Message,), dict( + DESCRIPTOR = _SESSIONSTATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SessionState) + )) +_sym_db.RegisterMessage(SessionState) + +SignedCertificateStatusList = _reflection.GeneratedProtocolMessageType('SignedCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDCERTIFICATESTATUSLIST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedCertificateStatusList) + )) +_sym_db.RegisterMessage(SignedCertificateStatusList) + +SignedDeviceCertificate = _reflection.GeneratedProtocolMessageType('SignedDeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDDEVICECERTIFICATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedDeviceCertificate) + )) +_sym_db.RegisterMessage(SignedDeviceCertificate) + +SignedProvisioningMessage = _reflection.GeneratedProtocolMessageType('SignedProvisioningMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDPROVISIONINGMESSAGE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedProvisioningMessage) + )) +_sym_db.RegisterMessage(SignedProvisioningMessage) + +SignedMessage = _reflection.GeneratedProtocolMessageType('SignedMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDMESSAGE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedMessage) + )) +_sym_db.RegisterMessage(SignedMessage) + +WidevineCencHeader = _reflection.GeneratedProtocolMessageType('WidevineCencHeader', (_message.Message,), dict( + DESCRIPTOR = _WIDEVINECENCHEADER, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:WidevineCencHeader) + )) +_sym_db.RegisterMessage(WidevineCencHeader) + +SignedLicenseRequest = _reflection.GeneratedProtocolMessageType('SignedLicenseRequest', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSEREQUEST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedLicenseRequest) + )) +_sym_db.RegisterMessage(SignedLicenseRequest) + +SignedLicenseRequestRaw = _reflection.GeneratedProtocolMessageType('SignedLicenseRequestRaw', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSEREQUESTRAW, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedLicenseRequestRaw) + )) +_sym_db.RegisterMessage(SignedLicenseRequestRaw) + +SignedLicense = _reflection.GeneratedProtocolMessageType('SignedLicense', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedLicense) + )) +_sym_db.RegisterMessage(SignedLicense) + +SignedServiceCertificate = _reflection.GeneratedProtocolMessageType('SignedServiceCertificate', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDSERVICECERTIFICATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedServiceCertificate) + )) +_sym_db.RegisterMessage(SignedServiceCertificate) + +FileHashes = _reflection.GeneratedProtocolMessageType('FileHashes', (_message.Message,), dict( + + Signature = _reflection.GeneratedProtocolMessageType('Signature', (_message.Message,), dict( + DESCRIPTOR = _FILEHASHES_SIGNATURE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:FileHashes.Signature) + )) + , + DESCRIPTOR = _FILEHASHES, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:FileHashes) + )) +_sym_db.RegisterMessage(FileHashes) +_sym_db.RegisterMessage(FileHashes.Signature) + + +# @@protoc_insertion_point(module_scope) diff --git a/pywidevine/L3/cdm/formats/wv_proto3.proto b/pywidevine/L3/cdm/formats/wv_proto3.proto new file mode 100644 index 0000000..7861b02 --- /dev/null +++ b/pywidevine/L3/cdm/formats/wv_proto3.proto @@ -0,0 +1,389 @@ +// beware proto3 won't show missing fields it seems, need to change to "proto2" and add "optional" before every field, and remove all the dummy enum members I added: +syntax = "proto3"; + +// from x86 (partial), most of it from the ARM version: +message ClientIdentification { + enum TokenType { + KEYBOX = 0; + DEVICE_CERTIFICATE = 1; + REMOTE_ATTESTATION_CERTIFICATE = 2; + } + message NameValue { + string Name = 1; + string Value = 2; + } + message ClientCapabilities { + enum HdcpVersion { + HDCP_NONE = 0; + HDCP_V1 = 1; + HDCP_V2 = 2; + HDCP_V2_1 = 3; + HDCP_V2_2 = 4; + } + uint32 ClientToken = 1; + uint32 SessionToken = 2; + uint32 VideoResolutionConstraints = 3; + HdcpVersion MaxHdcpVersion = 4; + uint32 OemCryptoApiVersion = 5; + } + TokenType Type = 1; + //bytes Token = 2; // by default the client treats this as blob, but it's usually a DeviceCertificate, so for usefulness sake, I'm replacing it with this one: + SignedDeviceCertificate Token = 2; + repeated NameValue ClientInfo = 3; + bytes ProviderClientToken = 4; + uint32 LicenseCounter = 5; + ClientCapabilities _ClientCapabilities = 6; // how should we deal with duped names? will have to look at proto docs later +} + +message DeviceCertificate { + enum CertificateType { + ROOT = 0; + INTERMEDIATE = 1; + USER_DEVICE = 2; + SERVICE = 3; + } + //ProvisionedDeviceInfo.WvSecurityLevel Type = 1; // is this how one is supposed to call it? (it's an enum) there might be a bug here, with CertificateType getting confused with WvSecurityLevel, for now renaming it (verify against other binaries) + CertificateType Type = 1; + bytes SerialNumber = 2; + uint32 CreationTimeSeconds = 3; + bytes PublicKey = 4; + uint32 SystemId = 5; + uint32 TestDeviceDeprecated = 6; // is it bool or int? + bytes ServiceId = 7; // service URL for service certificates +} + +// missing some references, +message DeviceCertificateStatus { + enum CertificateStatus { + VALID = 0; + REVOKED = 1; + } + bytes SerialNumber = 1; + CertificateStatus Status = 2; + ProvisionedDeviceInfo DeviceInfo = 4; // where is 3? is it deprecated? +} + +message DeviceCertificateStatusList { + uint32 CreationTimeSeconds = 1; + repeated DeviceCertificateStatus CertificateStatus = 2; +} + +message EncryptedClientIdentification { + string ServiceId = 1; + bytes ServiceCertificateSerialNumber = 2; + bytes EncryptedClientId = 3; + bytes EncryptedClientIdIv = 4; + bytes EncryptedPrivacyKey = 5; +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +enum LicenseType { + ZERO = 0; + DEFAULT = 1; // do not know what this is either, but should be 1; on recent versions may go up to 3 (latest x86) +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +// this is just a guess because these globals got lost, but really, do we need more? +enum ProtocolVersion { + DUMMY = 0; + CURRENT = 21; // don't have symbols for this +} + + +message LicenseIdentification { + bytes RequestId = 1; + bytes SessionId = 2; + bytes PurchaseId = 3; + LicenseType Type = 4; + uint32 Version = 5; + bytes ProviderSessionToken = 6; +} + + +message License { + message Policy { + uint32 CanPlay = 1; + uint32 CanPersist = 2; + uint32 CanRenew = 3; + uint32 RentalDurationSeconds = 4; + uint32 PlaybackDurationSeconds = 5; + uint32 LicenseDurationSeconds = 6; + uint32 RenewalRecoveryDurationSeconds = 7; + string RenewalServerUrl = 8; + uint32 RenewalDelaySeconds = 9; + uint32 RenewalRetryIntervalSeconds = 10; + uint32 RenewWithUsage = 11; + uint32 UnknownPolicy12 = 12; + } + message KeyContainer { + enum KeyType { + _NOKEYTYPE = 0; // dummy, added to satisfy proto3, not present in original + SIGNING = 1; + CONTENT = 2; + KEY_CONTROL = 3; + OPERATOR_SESSION = 4; + } + enum SecurityLevel { + _NOSECLEVEL = 0; // dummy, added to satisfy proto3, not present in original + SW_SECURE_CRYPTO = 1; + SW_SECURE_DECODE = 2; + HW_SECURE_CRYPTO = 3; + HW_SECURE_DECODE = 4; + HW_SECURE_ALL = 5; + } + message OutputProtection { + enum CGMS { + COPY_FREE = 0; + COPY_ONCE = 2; + COPY_NEVER = 3; + CGMS_NONE = 0x2A; // PC default! + } + ClientIdentification.ClientCapabilities.HdcpVersion Hdcp = 1; // it's most likely a copy of Hdcp version available here, but compiler optimized it away + CGMS CgmsFlags = 2; + } + message KeyControl { + bytes KeyControlBlock = 1; // what is this? + bytes Iv = 2; + } + message OperatorSessionKeyPermissions { + uint32 AllowEncrypt = 1; + uint32 AllowDecrypt = 2; + uint32 AllowSign = 3; + uint32 AllowSignatureVerify = 4; + } + message VideoResolutionConstraint { + uint32 MinResolutionPixels = 1; + uint32 MaxResolutionPixels = 2; + OutputProtection RequiredProtection = 3; + } + bytes Id = 1; + bytes Iv = 2; + bytes Key = 3; + KeyType Type = 4; + SecurityLevel Level = 5; + OutputProtection RequiredProtection = 6; + OutputProtection RequestedProtection = 7; + KeyControl _KeyControl = 8; // duped names, etc + OperatorSessionKeyPermissions _OperatorSessionKeyPermissions = 9; // duped names, etc + repeated VideoResolutionConstraint VideoResolutionConstraints = 10; + } + LicenseIdentification Id = 1; + Policy _Policy = 2; // duped names, etc + repeated KeyContainer Key = 3; + uint32 LicenseStartTime = 4; + uint32 RemoteAttestationVerified = 5; // bool? + bytes ProviderClientToken = 6; + // there might be more, check with newer versions (I see field 7-8 in a lic) + // this appeared in latest x86: + uint32 ProtectionScheme = 7; // type unconfirmed fully, but it's likely as WidevineCencHeader describesit (fourcc) + bytes UnknownHdcpDataField = 8; +} + +message LicenseError { + enum Error { + DUMMY_NO_ERROR = 0; // dummy, added to satisfy proto3 + INVALID_DEVICE_CERTIFICATE = 1; + REVOKED_DEVICE_CERTIFICATE = 2; + SERVICE_UNAVAILABLE = 3; + } + //LicenseRequest.RequestType ErrorCode; // clang mismatch + Error ErrorCode = 1; +} + +message LicenseRequest { + message ContentIdentification { + message CENC { + // bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: + WidevineCencHeader Pssh = 1; + LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 + bytes RequestId = 3; + } + message WebM { + bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used + LicenseType LicenseType = 2; + bytes RequestId = 3; + } + message ExistingLicense { + LicenseIdentification LicenseId = 1; + uint32 SecondsSinceStarted = 2; + uint32 SecondsSinceLastPlayed = 3; + bytes SessionUsageTableEntry = 4; + } + CENC CencId = 1; + WebM WebmId = 2; + ExistingLicense License = 3; + } + enum RequestType { + DUMMY_REQ_TYPE = 0; // dummy, added to satisfy proto3 + NEW = 1; + RENEWAL = 2; + RELEASE = 3; + } + ClientIdentification ClientId = 1; + ContentIdentification ContentId = 2; + RequestType Type = 3; + uint32 RequestTime = 4; + bytes KeyControlNonceDeprecated = 5; + ProtocolVersion ProtocolVersion = 6; // lacking symbols for this + uint32 KeyControlNonce = 7; + EncryptedClientIdentification EncryptedClientId = 8; +} + +message ProvisionedDeviceInfo { + enum WvSecurityLevel { + LEVEL_UNSPECIFIED = 0; + LEVEL_1 = 1; + LEVEL_2 = 2; + LEVEL_3 = 3; + } + uint32 SystemId = 1; + string Soc = 2; + string Manufacturer = 3; + string Model = 4; + string DeviceType = 5; + uint32 ModelYear = 6; + WvSecurityLevel SecurityLevel = 7; + uint32 TestDevice = 8; // bool? +} + + +// todo: fill +message ProvisioningOptions { +} + +// todo: fill +message ProvisioningRequest { +} + +// todo: fill +message ProvisioningResponse { +} + +message RemoteAttestation { + EncryptedClientIdentification Certificate = 1; + string Salt = 2; + string Signature = 3; +} + +// todo: fill +message SessionInit { +} + +// todo: fill +message SessionState { +} + +// todo: fill +message SignedCertificateStatusList { +} + +message SignedDeviceCertificate { + + //bytes DeviceCertificate = 1; // again, they use a buffer where it's supposed to be a message, so we'll replace it with what it really is: + DeviceCertificate _DeviceCertificate = 1; // how should we deal with duped names? will have to look at proto docs later + bytes Signature = 2; + SignedDeviceCertificate Signer = 3; +} + + +// todo: fill +message SignedProvisioningMessage { +} + +// the root of all messages, from either server or client +message SignedMessage { + enum MessageType { + DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + bytes Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + bytes SessionKey = 4; // often RSA wrapped for licenses + RemoteAttestation RemoteAttestation = 5; +} + + + +// This message is copied from google's docs, not reversed: +message WidevineCencHeader { + enum Algorithm { + UNENCRYPTED = 0; + AESCTR = 1; + }; + Algorithm algorithm = 1; + repeated bytes key_id = 2; + + // Content provider name. + string provider = 3; + + // A content identifier, specified by content provider. + bytes content_id = 4; + + // Track type. Acceptable values are SD, HD and AUDIO. Used to + // differentiate content keys used by an asset. + string track_type_deprecated = 5; + + // The name of a registered policy to be used for this asset. + string policy = 6; + + // Crypto period index, for media using key rotation. + uint32 crypto_period_index = 7; + + // Optional protected context for group content. The grouped_license is a + // serialized SignedMessage. + bytes grouped_license = 8; + + // Protection scheme identifying the encryption algorithm. + // Represented as one of the following 4CC values: + // 'cenc' (AESCTR), 'cbc1' (AESCBC), + // 'cens' (AESCTR subsample), 'cbcs' (AESCBC subsample). + uint32 protection_scheme = 9; + + // Optional. For media using key rotation, this represents the duration + // of each crypto period in seconds. + uint32 crypto_period_seconds = 10; +} + + + + +// from here on, it's just for testing, these messages don't exist in the binaries, I'm adding them to avoid detecting type programmatically +message SignedLicenseRequest { + enum MessageType { + DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + LicenseRequest Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + bytes SessionKey = 4; // often RSA wrapped for licenses + RemoteAttestation RemoteAttestation = 5; +} + +message SignedLicense { + enum MessageType { + DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + License Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + bytes SessionKey = 4; // often RSA wrapped for licenses + RemoteAttestation RemoteAttestation = 5; +} \ No newline at end of file diff --git a/pywidevine/L3/cdm/formats/wv_proto3_pb2.py b/pywidevine/L3/cdm/formats/wv_proto3_pb2.py new file mode 100644 index 0000000..11ae09f --- /dev/null +++ b/pywidevine/L3/cdm/formats/wv_proto3_pb2.py @@ -0,0 +1,2686 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: wv_proto3.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='wv_proto3.proto', + package='', + syntax='proto3', + serialized_pb=_b('\n\x0fwv_proto3.proto\"\xc5\x05\n\x14\x43lientIdentification\x12-\n\x04Type\x18\x01 \x01(\x0e\x32\x1f.ClientIdentification.TokenType\x12\'\n\x05Token\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x33\n\nClientInfo\x18\x03 \x03(\x0b\x32\x1f.ClientIdentification.NameValue\x12\x1b\n\x13ProviderClientToken\x18\x04 \x01(\x0c\x12\x16\n\x0eLicenseCounter\x18\x05 \x01(\r\x12\x45\n\x13_ClientCapabilities\x18\x06 \x01(\x0b\x32(.ClientIdentification.ClientCapabilities\x1a(\n\tNameValue\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\r\n\x05Value\x18\x02 \x01(\t\x1a\xa4\x02\n\x12\x43lientCapabilities\x12\x13\n\x0b\x43lientToken\x18\x01 \x01(\r\x12\x14\n\x0cSessionToken\x18\x02 \x01(\r\x12\"\n\x1aVideoResolutionConstraints\x18\x03 \x01(\r\x12L\n\x0eMaxHdcpVersion\x18\x04 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12\x1b\n\x13OemCryptoApiVersion\x18\x05 \x01(\r\"T\n\x0bHdcpVersion\x12\r\n\tHDCP_NONE\x10\x00\x12\x0b\n\x07HDCP_V1\x10\x01\x12\x0b\n\x07HDCP_V2\x10\x02\x12\r\n\tHDCP_V2_1\x10\x03\x12\r\n\tHDCP_V2_2\x10\x04\"S\n\tTokenType\x12\n\n\x06KEYBOX\x10\x00\x12\x16\n\x12\x44\x45VICE_CERTIFICATE\x10\x01\x12\"\n\x1eREMOTE_ATTESTATION_CERTIFICATE\x10\x02\"\x9b\x02\n\x11\x44\x65viceCertificate\x12\x30\n\x04Type\x18\x01 \x01(\x0e\x32\".DeviceCertificate.CertificateType\x12\x14\n\x0cSerialNumber\x18\x02 \x01(\x0c\x12\x1b\n\x13\x43reationTimeSeconds\x18\x03 \x01(\r\x12\x11\n\tPublicKey\x18\x04 \x01(\x0c\x12\x10\n\x08SystemId\x18\x05 \x01(\r\x12\x1c\n\x14TestDeviceDeprecated\x18\x06 \x01(\r\x12\x11\n\tServiceId\x18\x07 \x01(\x0c\"K\n\x0f\x43\x65rtificateType\x12\x08\n\x04ROOT\x10\x00\x12\x10\n\x0cINTERMEDIATE\x10\x01\x12\x0f\n\x0bUSER_DEVICE\x10\x02\x12\x0b\n\x07SERVICE\x10\x03\"\xc4\x01\n\x17\x44\x65viceCertificateStatus\x12\x14\n\x0cSerialNumber\x18\x01 \x01(\x0c\x12:\n\x06Status\x18\x02 \x01(\x0e\x32*.DeviceCertificateStatus.CertificateStatus\x12*\n\nDeviceInfo\x18\x04 \x01(\x0b\x32\x16.ProvisionedDeviceInfo\"+\n\x11\x43\x65rtificateStatus\x12\t\n\x05VALID\x10\x00\x12\x0b\n\x07REVOKED\x10\x01\"o\n\x1b\x44\x65viceCertificateStatusList\x12\x1b\n\x13\x43reationTimeSeconds\x18\x01 \x01(\r\x12\x33\n\x11\x43\x65rtificateStatus\x18\x02 \x03(\x0b\x32\x18.DeviceCertificateStatus\"\xaf\x01\n\x1d\x45ncryptedClientIdentification\x12\x11\n\tServiceId\x18\x01 \x01(\t\x12&\n\x1eServiceCertificateSerialNumber\x18\x02 \x01(\x0c\x12\x19\n\x11\x45ncryptedClientId\x18\x03 \x01(\x0c\x12\x1b\n\x13\x45ncryptedClientIdIv\x18\x04 \x01(\x0c\x12\x1b\n\x13\x45ncryptedPrivacyKey\x18\x05 \x01(\x0c\"\x9c\x01\n\x15LicenseIdentification\x12\x11\n\tRequestId\x18\x01 \x01(\x0c\x12\x11\n\tSessionId\x18\x02 \x01(\x0c\x12\x12\n\nPurchaseId\x18\x03 \x01(\x0c\x12\x1a\n\x04Type\x18\x04 \x01(\x0e\x32\x0c.LicenseType\x12\x0f\n\x07Version\x18\x05 \x01(\r\x12\x1c\n\x14ProviderSessionToken\x18\x06 \x01(\x0c\"\xfa\x0e\n\x07License\x12\"\n\x02Id\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12 \n\x07_Policy\x18\x02 \x01(\x0b\x32\x0f.License.Policy\x12\"\n\x03Key\x18\x03 \x03(\x0b\x32\x15.License.KeyContainer\x12\x18\n\x10LicenseStartTime\x18\x04 \x01(\r\x12!\n\x19RemoteAttestationVerified\x18\x05 \x01(\r\x12\x1b\n\x13ProviderClientToken\x18\x06 \x01(\x0c\x12\x18\n\x10ProtectionScheme\x18\x07 \x01(\r\x12\x1c\n\x14UnknownHdcpDataField\x18\x08 \x01(\x0c\x1a\xd4\x02\n\x06Policy\x12\x0f\n\x07\x43\x61nPlay\x18\x01 \x01(\r\x12\x12\n\nCanPersist\x18\x02 \x01(\r\x12\x10\n\x08\x43\x61nRenew\x18\x03 \x01(\r\x12\x1d\n\x15RentalDurationSeconds\x18\x04 \x01(\r\x12\x1f\n\x17PlaybackDurationSeconds\x18\x05 \x01(\r\x12\x1e\n\x16LicenseDurationSeconds\x18\x06 \x01(\r\x12&\n\x1eRenewalRecoveryDurationSeconds\x18\x07 \x01(\r\x12\x18\n\x10RenewalServerUrl\x18\x08 \x01(\t\x12\x1b\n\x13RenewalDelaySeconds\x18\t \x01(\r\x12#\n\x1bRenewalRetryIntervalSeconds\x18\n \x01(\r\x12\x16\n\x0eRenewWithUsage\x18\x0b \x01(\r\x12\x17\n\x0fUnknownPolicy12\x18\x0c \x01(\r\x1a\x9b\n\n\x0cKeyContainer\x12\n\n\x02Id\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x12\x0b\n\x03Key\x18\x03 \x01(\x0c\x12+\n\x04Type\x18\x04 \x01(\x0e\x32\x1d.License.KeyContainer.KeyType\x12\x32\n\x05Level\x18\x05 \x01(\x0e\x32#.License.KeyContainer.SecurityLevel\x12\x42\n\x12RequiredProtection\x18\x06 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x43\n\x13RequestedProtection\x18\x07 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x35\n\x0b_KeyControl\x18\x08 \x01(\x0b\x32 .License.KeyContainer.KeyControl\x12[\n\x1e_OperatorSessionKeyPermissions\x18\t \x01(\x0b\x32\x33.License.KeyContainer.OperatorSessionKeyPermissions\x12S\n\x1aVideoResolutionConstraints\x18\n \x03(\x0b\x32/.License.KeyContainer.VideoResolutionConstraint\x1a\xdb\x01\n\x10OutputProtection\x12\x42\n\x04Hdcp\x18\x01 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12>\n\tCgmsFlags\x18\x02 \x01(\x0e\x32+.License.KeyContainer.OutputProtection.CGMS\"C\n\x04\x43GMS\x12\r\n\tCOPY_FREE\x10\x00\x12\r\n\tCOPY_ONCE\x10\x02\x12\x0e\n\nCOPY_NEVER\x10\x03\x12\r\n\tCGMS_NONE\x10*\x1a\x31\n\nKeyControl\x12\x17\n\x0fKeyControlBlock\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x1a|\n\x1dOperatorSessionKeyPermissions\x12\x14\n\x0c\x41llowEncrypt\x18\x01 \x01(\r\x12\x14\n\x0c\x41llowDecrypt\x18\x02 \x01(\r\x12\x11\n\tAllowSign\x18\x03 \x01(\r\x12\x1c\n\x14\x41llowSignatureVerify\x18\x04 \x01(\r\x1a\x99\x01\n\x19VideoResolutionConstraint\x12\x1b\n\x13MinResolutionPixels\x18\x01 \x01(\r\x12\x1b\n\x13MaxResolutionPixels\x18\x02 \x01(\r\x12\x42\n\x12RequiredProtection\x18\x03 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\"Z\n\x07KeyType\x12\x0e\n\n_NOKEYTYPE\x10\x00\x12\x0b\n\x07SIGNING\x10\x01\x12\x0b\n\x07\x43ONTENT\x10\x02\x12\x0f\n\x0bKEY_CONTROL\x10\x03\x12\x14\n\x10OPERATOR_SESSION\x10\x04\"\x8b\x01\n\rSecurityLevel\x12\x0f\n\x0b_NOSECLEVEL\x10\x00\x12\x14\n\x10SW_SECURE_CRYPTO\x10\x01\x12\x14\n\x10SW_SECURE_DECODE\x10\x02\x12\x14\n\x10HW_SECURE_CRYPTO\x10\x03\x12\x14\n\x10HW_SECURE_DECODE\x10\x04\x12\x11\n\rHW_SECURE_ALL\x10\x05\"\xac\x01\n\x0cLicenseError\x12&\n\tErrorCode\x18\x01 \x01(\x0e\x32\x13.LicenseError.Error\"t\n\x05\x45rror\x12\x12\n\x0e\x44UMMY_NO_ERROR\x10\x00\x12\x1e\n\x1aINVALID_DEVICE_CERTIFICATE\x10\x01\x12\x1e\n\x1aREVOKED_DEVICE_CERTIFICATE\x10\x02\x12\x17\n\x13SERVICE_UNAVAILABLE\x10\x03\"\xc0\x07\n\x0eLicenseRequest\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12\x38\n\tContentId\x18\x02 \x01(\x0b\x32%.LicenseRequest.ContentIdentification\x12)\n\x04Type\x18\x03 \x01(\x0e\x32\x1b.LicenseRequest.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\xa2\x04\n\x15\x43ontentIdentification\x12:\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.CENC\x12:\n\x06WebmId\x18\x02 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.WebM\x12\x46\n\x07License\x18\x03 \x01(\x0b\x32\x35.LicenseRequest.ContentIdentification.ExistingLicense\x1a_\n\x04\x43\x45NC\x12!\n\x04Pssh\x18\x01 \x01(\x0b\x32\x13.WidevineCencHeader\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"D\n\x0bRequestType\x12\x12\n\x0e\x44UMMY_REQ_TYPE\x10\x00\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa6\x02\n\x15ProvisionedDeviceInfo\x12\x10\n\x08SystemId\x18\x01 \x01(\r\x12\x0b\n\x03Soc\x18\x02 \x01(\t\x12\x14\n\x0cManufacturer\x18\x03 \x01(\t\x12\r\n\x05Model\x18\x04 \x01(\t\x12\x12\n\nDeviceType\x18\x05 \x01(\t\x12\x11\n\tModelYear\x18\x06 \x01(\r\x12=\n\rSecurityLevel\x18\x07 \x01(\x0e\x32&.ProvisionedDeviceInfo.WvSecurityLevel\x12\x12\n\nTestDevice\x18\x08 \x01(\r\"O\n\x0fWvSecurityLevel\x12\x15\n\x11LEVEL_UNSPECIFIED\x10\x00\x12\x0b\n\x07LEVEL_1\x10\x01\x12\x0b\n\x07LEVEL_2\x10\x02\x12\x0b\n\x07LEVEL_3\x10\x03\"\x15\n\x13ProvisioningOptions\"\x15\n\x13ProvisioningRequest\"\x16\n\x14ProvisioningResponse\"i\n\x11RemoteAttestation\x12\x33\n\x0b\x43\x65rtificate\x18\x01 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x12\x0c\n\x04Salt\x18\x02 \x01(\t\x12\x11\n\tSignature\x18\x03 \x01(\t\"\r\n\x0bSessionInit\"\x0e\n\x0cSessionState\"\x1d\n\x1bSignedCertificateStatusList\"\x86\x01\n\x17SignedDeviceCertificate\x12.\n\x12_DeviceCertificate\x18\x01 \x01(\x0b\x32\x12.DeviceCertificate\x12\x11\n\tSignature\x18\x02 \x01(\x0c\x12(\n\x06Signer\x18\x03 \x01(\x0b\x32\x18.SignedDeviceCertificate\"\x1b\n\x19SignedProvisioningMessage\"\xb0\x02\n\rSignedMessage\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedMessage.MessageType\x12\x0b\n\x03Msg\x18\x02 \x01(\x0c\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc5\x02\n\x12WidevineCencHeader\x12\x30\n\talgorithm\x18\x01 \x01(\x0e\x32\x1d.WidevineCencHeader.Algorithm\x12\x0e\n\x06key_id\x18\x02 \x03(\x0c\x12\x10\n\x08provider\x18\x03 \x01(\t\x12\x12\n\ncontent_id\x18\x04 \x01(\x0c\x12\x1d\n\x15track_type_deprecated\x18\x05 \x01(\t\x12\x0e\n\x06policy\x18\x06 \x01(\t\x12\x1b\n\x13\x63rypto_period_index\x18\x07 \x01(\r\x12\x17\n\x0fgrouped_license\x18\x08 \x01(\x0c\x12\x19\n\x11protection_scheme\x18\t \x01(\r\x12\x1d\n\x15\x63rypto_period_seconds\x18\n \x01(\r\"(\n\tAlgorithm\x12\x0f\n\x0bUNENCRYPTED\x10\x00\x12\n\n\x06\x41\x45SCTR\x10\x01\"\xcf\x02\n\x14SignedLicenseRequest\x12/\n\x04Type\x18\x01 \x01(\x0e\x32!.SignedLicenseRequest.MessageType\x12\x1c\n\x03Msg\x18\x02 \x01(\x0b\x32\x0f.LicenseRequest\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xba\x02\n\rSignedLicense\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedLicense.MessageType\x12\x15\n\x03Msg\x18\x02 \x01(\x0b\x32\x08.License\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05*$\n\x0bLicenseType\x12\x08\n\x04ZERO\x10\x00\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x01*)\n\x0fProtocolVersion\x12\t\n\x05\x44UMMY\x10\x00\x12\x0b\n\x07\x43URRENT\x10\x15\x62\x06proto3') +) + +_LICENSETYPE = _descriptor.EnumDescriptor( + name='LicenseType', + full_name='LicenseType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ZERO', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6713, + serialized_end=6749, +) +_sym_db.RegisterEnumDescriptor(_LICENSETYPE) + +LicenseType = enum_type_wrapper.EnumTypeWrapper(_LICENSETYPE) +_PROTOCOLVERSION = _descriptor.EnumDescriptor( + name='ProtocolVersion', + full_name='ProtocolVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CURRENT', index=1, number=21, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6751, + serialized_end=6792, +) +_sym_db.RegisterEnumDescriptor(_PROTOCOLVERSION) + +ProtocolVersion = enum_type_wrapper.EnumTypeWrapper(_PROTOCOLVERSION) +ZERO = 0 +DEFAULT = 1 +DUMMY = 0 +CURRENT = 21 + + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION = _descriptor.EnumDescriptor( + name='HdcpVersion', + full_name='ClientIdentification.ClientCapabilities.HdcpVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='HDCP_NONE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_1', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_2', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=560, + serialized_end=644, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION) + +_CLIENTIDENTIFICATION_TOKENTYPE = _descriptor.EnumDescriptor( + name='TokenType', + full_name='ClientIdentification.TokenType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='KEYBOX', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEVICE_CERTIFICATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REMOTE_ATTESTATION_CERTIFICATE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=646, + serialized_end=729, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_TOKENTYPE) + +_DEVICECERTIFICATE_CERTIFICATETYPE = _descriptor.EnumDescriptor( + name='CertificateType', + full_name='DeviceCertificate.CertificateType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ROOT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INTERMEDIATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='USER_DEVICE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=940, + serialized_end=1015, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATE_CERTIFICATETYPE) + +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS = _descriptor.EnumDescriptor( + name='CertificateStatus', + full_name='DeviceCertificateStatus.CertificateStatus', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='VALID', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1171, + serialized_end=1214, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS = _descriptor.EnumDescriptor( + name='CGMS', + full_name='License.KeyContainer.OutputProtection.CGMS', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='COPY_FREE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_ONCE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_NEVER', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CGMS_NONE', index=3, number=42, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2947, + serialized_end=3014, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS) + +_LICENSE_KEYCONTAINER_KEYTYPE = _descriptor.EnumDescriptor( + name='KeyType', + full_name='License.KeyContainer.KeyType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='_NOKEYTYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SIGNING', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CONTENT', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='KEY_CONTROL', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OPERATOR_SESSION', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3349, + serialized_end=3439, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_KEYTYPE) + +_LICENSE_KEYCONTAINER_SECURITYLEVEL = _descriptor.EnumDescriptor( + name='SecurityLevel', + full_name='License.KeyContainer.SecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='_NOSECLEVEL', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SW_SECURE_CRYPTO', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SW_SECURE_DECODE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_CRYPTO', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_DECODE', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_ALL', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3442, + serialized_end=3581, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_SECURITYLEVEL) + +_LICENSEERROR_ERROR = _descriptor.EnumDescriptor( + name='Error', + full_name='LicenseError.Error', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_NO_ERROR', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INVALID_DEVICE_CERTIFICATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED_DEVICE_CERTIFICATE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_UNAVAILABLE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3640, + serialized_end=3756, +) +_sym_db.RegisterEnumDescriptor(_LICENSEERROR_ERROR) + +_LICENSEREQUEST_REQUESTTYPE = _descriptor.EnumDescriptor( + name='RequestType', + full_name='LicenseRequest.RequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_REQ_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NEW', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RENEWAL', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RELEASE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4651, + serialized_end=4719, +) +_sym_db.RegisterEnumDescriptor(_LICENSEREQUEST_REQUESTTYPE) + +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL = _descriptor.EnumDescriptor( + name='WvSecurityLevel', + full_name='ProvisionedDeviceInfo.WvSecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LEVEL_UNSPECIFIED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_3', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4937, + serialized_end=5016, +) +_sym_db.RegisterEnumDescriptor(_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL) + +_SIGNEDMESSAGE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedMessage.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_MSG_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5583, + serialized_end=5728, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDMESSAGE_MESSAGETYPE) + +_WIDEVINECENCHEADER_ALGORITHM = _descriptor.EnumDescriptor( + name='Algorithm', + full_name='WidevineCencHeader.Algorithm', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNENCRYPTED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='AESCTR', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6016, + serialized_end=6056, +) +_sym_db.RegisterEnumDescriptor(_WIDEVINECENCHEADER_ALGORITHM) + +_SIGNEDLICENSEREQUEST_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicenseRequest.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_MSG_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5583, + serialized_end=5728, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSEREQUEST_MESSAGETYPE) + +_SIGNEDLICENSE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicense.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_MSG_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5583, + serialized_end=5728, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSE_MESSAGETYPE) + + +_CLIENTIDENTIFICATION_NAMEVALUE = _descriptor.Descriptor( + name='NameValue', + full_name='ClientIdentification.NameValue', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Name', full_name='ClientIdentification.NameValue.Name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Value', full_name='ClientIdentification.NameValue.Value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=309, + serialized_end=349, +) + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES = _descriptor.Descriptor( + name='ClientCapabilities', + full_name='ClientIdentification.ClientCapabilities', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientToken', full_name='ClientIdentification.ClientCapabilities.ClientToken', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionToken', full_name='ClientIdentification.ClientCapabilities.SessionToken', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='ClientIdentification.ClientCapabilities.VideoResolutionConstraints', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxHdcpVersion', full_name='ClientIdentification.ClientCapabilities.MaxHdcpVersion', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='OemCryptoApiVersion', full_name='ClientIdentification.ClientCapabilities.OemCryptoApiVersion', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=352, + serialized_end=644, +) + +_CLIENTIDENTIFICATION = _descriptor.Descriptor( + name='ClientIdentification', + full_name='ClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='ClientIdentification.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Token', full_name='ClientIdentification.Token', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ClientInfo', full_name='ClientIdentification.ClientInfo', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='ClientIdentification.ProviderClientToken', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseCounter', full_name='ClientIdentification.LicenseCounter', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_ClientCapabilities', full_name='ClientIdentification._ClientCapabilities', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_CLIENTIDENTIFICATION_NAMEVALUE, _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, ], + enum_types=[ + _CLIENTIDENTIFICATION_TOKENTYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=20, + serialized_end=729, +) + + +_DEVICECERTIFICATE = _descriptor.Descriptor( + name='DeviceCertificate', + full_name='DeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='DeviceCertificate.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificate.SerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificate.CreationTimeSeconds', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PublicKey', full_name='DeviceCertificate.PublicKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SystemId', full_name='DeviceCertificate.SystemId', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDeviceDeprecated', full_name='DeviceCertificate.TestDeviceDeprecated', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceId', full_name='DeviceCertificate.ServiceId', index=6, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATE_CERTIFICATETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=732, + serialized_end=1015, +) + + +_DEVICECERTIFICATESTATUS = _descriptor.Descriptor( + name='DeviceCertificateStatus', + full_name='DeviceCertificateStatus', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificateStatus.SerialNumber', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Status', full_name='DeviceCertificateStatus.Status', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceInfo', full_name='DeviceCertificateStatus.DeviceInfo', index=2, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1018, + serialized_end=1214, +) + + +_DEVICECERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='DeviceCertificateStatusList', + full_name='DeviceCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificateStatusList.CreationTimeSeconds', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CertificateStatus', full_name='DeviceCertificateStatusList.CertificateStatus', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1216, + serialized_end=1327, +) + + +_ENCRYPTEDCLIENTIDENTIFICATION = _descriptor.Descriptor( + name='EncryptedClientIdentification', + full_name='EncryptedClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ServiceId', full_name='EncryptedClientIdentification.ServiceId', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceCertificateSerialNumber', full_name='EncryptedClientIdentification.ServiceCertificateSerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='EncryptedClientIdentification.EncryptedClientId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientIdIv', full_name='EncryptedClientIdentification.EncryptedClientIdIv', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedPrivacyKey', full_name='EncryptedClientIdentification.EncryptedPrivacyKey', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1330, + serialized_end=1505, +) + + +_LICENSEIDENTIFICATION = _descriptor.Descriptor( + name='LicenseIdentification', + full_name='LicenseIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseIdentification.RequestId', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionId', full_name='LicenseIdentification.SessionId', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PurchaseId', full_name='LicenseIdentification.PurchaseId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseIdentification.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Version', full_name='LicenseIdentification.Version', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderSessionToken', full_name='LicenseIdentification.ProviderSessionToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1508, + serialized_end=1664, +) + + +_LICENSE_POLICY = _descriptor.Descriptor( + name='Policy', + full_name='License.Policy', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CanPlay', full_name='License.Policy.CanPlay', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanPersist', full_name='License.Policy.CanPersist', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanRenew', full_name='License.Policy.CanRenew', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RentalDurationSeconds', full_name='License.Policy.RentalDurationSeconds', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PlaybackDurationSeconds', full_name='License.Policy.PlaybackDurationSeconds', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseDurationSeconds', full_name='License.Policy.LicenseDurationSeconds', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRecoveryDurationSeconds', full_name='License.Policy.RenewalRecoveryDurationSeconds', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalServerUrl', full_name='License.Policy.RenewalServerUrl', index=7, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalDelaySeconds', full_name='License.Policy.RenewalDelaySeconds', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRetryIntervalSeconds', full_name='License.Policy.RenewalRetryIntervalSeconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewWithUsage', full_name='License.Policy.RenewWithUsage', index=10, + number=11, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='UnknownPolicy12', full_name='License.Policy.UnknownPolicy12', index=11, + number=12, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1931, + serialized_end=2271, +) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION = _descriptor.Descriptor( + name='OutputProtection', + full_name='License.KeyContainer.OutputProtection', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Hdcp', full_name='License.KeyContainer.OutputProtection.Hdcp', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CgmsFlags', full_name='License.KeyContainer.OutputProtection.CgmsFlags', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2795, + serialized_end=3014, +) + +_LICENSE_KEYCONTAINER_KEYCONTROL = _descriptor.Descriptor( + name='KeyControl', + full_name='License.KeyContainer.KeyControl', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='KeyControlBlock', full_name='License.KeyContainer.KeyControl.KeyControlBlock', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.KeyControl.Iv', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3016, + serialized_end=3065, +) + +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS = _descriptor.Descriptor( + name='OperatorSessionKeyPermissions', + full_name='License.KeyContainer.OperatorSessionKeyPermissions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='AllowEncrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowEncrypt', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowDecrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowDecrypt', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSign', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSign', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSignatureVerify', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSignatureVerify', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3067, + serialized_end=3191, +) + +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT = _descriptor.Descriptor( + name='VideoResolutionConstraint', + full_name='License.KeyContainer.VideoResolutionConstraint', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='MinResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MinResolutionPixels', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MaxResolutionPixels', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.VideoResolutionConstraint.RequiredProtection', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3194, + serialized_end=3347, +) + +_LICENSE_KEYCONTAINER = _descriptor.Descriptor( + name='KeyContainer', + full_name='License.KeyContainer', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.KeyContainer.Id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.Iv', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.KeyContainer.Key', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='License.KeyContainer.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Level', full_name='License.KeyContainer.Level', index=4, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.RequiredProtection', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestedProtection', full_name='License.KeyContainer.RequestedProtection', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_KeyControl', full_name='License.KeyContainer._KeyControl', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_OperatorSessionKeyPermissions', full_name='License.KeyContainer._OperatorSessionKeyPermissions', index=8, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='License.KeyContainer.VideoResolutionConstraints', index=9, + number=10, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_KEYCONTAINER_OUTPUTPROTECTION, _LICENSE_KEYCONTAINER_KEYCONTROL, _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, ], + enum_types=[ + _LICENSE_KEYCONTAINER_KEYTYPE, + _LICENSE_KEYCONTAINER_SECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2274, + serialized_end=3581, +) + +_LICENSE = _descriptor.Descriptor( + name='License', + full_name='License', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.Id', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_Policy', full_name='License._Policy', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.Key', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseStartTime', full_name='License.LicenseStartTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestationVerified', full_name='License.RemoteAttestationVerified', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='License.ProviderClientToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtectionScheme', full_name='License.ProtectionScheme', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='UnknownHdcpDataField', full_name='License.UnknownHdcpDataField', index=7, + number=8, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_POLICY, _LICENSE_KEYCONTAINER, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1667, + serialized_end=3581, +) + + +_LICENSEERROR = _descriptor.Descriptor( + name='LicenseError', + full_name='LicenseError', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ErrorCode', full_name='LicenseError.ErrorCode', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSEERROR_ERROR, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3584, + serialized_end=3756, +) + + +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC = _descriptor.Descriptor( + name='CENC', + full_name='LicenseRequest.ContentIdentification.CENC', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Pssh', full_name='LicenseRequest.ContentIdentification.CENC.Pssh', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.CENC.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.CENC.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4320, + serialized_end=4415, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM = _descriptor.Descriptor( + name='WebM', + full_name='LicenseRequest.ContentIdentification.WebM', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Header', full_name='LicenseRequest.ContentIdentification.WebM.Header', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.WebM.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.WebM.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4417, + serialized_end=4493, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE = _descriptor.Descriptor( + name='ExistingLicense', + full_name='LicenseRequest.ContentIdentification.ExistingLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='LicenseId', full_name='LicenseRequest.ContentIdentification.ExistingLicense.LicenseId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceStarted', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceStarted', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceLastPlayed', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceLastPlayed', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionUsageTableEntry', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SessionUsageTableEntry', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4496, + serialized_end=4649, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION = _descriptor.Descriptor( + name='ContentIdentification', + full_name='LicenseRequest.ContentIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CencId', full_name='LicenseRequest.ContentIdentification.CencId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='WebmId', full_name='LicenseRequest.ContentIdentification.WebmId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='License', full_name='LicenseRequest.ContentIdentification.License', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4103, + serialized_end=4649, +) + +_LICENSEREQUEST = _descriptor.Descriptor( + name='LicenseRequest', + full_name='LicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientId', full_name='LicenseRequest.ClientId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ContentId', full_name='LicenseRequest.ContentId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseRequest.Type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestTime', full_name='LicenseRequest.RequestTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonceDeprecated', full_name='LicenseRequest.KeyControlNonceDeprecated', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtocolVersion', full_name='LicenseRequest.ProtocolVersion', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonce', full_name='LicenseRequest.KeyControlNonce', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='LicenseRequest.EncryptedClientId', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION, ], + enum_types=[ + _LICENSEREQUEST_REQUESTTYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3759, + serialized_end=4719, +) + + +_PROVISIONEDDEVICEINFO = _descriptor.Descriptor( + name='ProvisionedDeviceInfo', + full_name='ProvisionedDeviceInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SystemId', full_name='ProvisionedDeviceInfo.SystemId', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Soc', full_name='ProvisionedDeviceInfo.Soc', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Manufacturer', full_name='ProvisionedDeviceInfo.Manufacturer', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Model', full_name='ProvisionedDeviceInfo.Model', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceType', full_name='ProvisionedDeviceInfo.DeviceType', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ModelYear', full_name='ProvisionedDeviceInfo.ModelYear', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecurityLevel', full_name='ProvisionedDeviceInfo.SecurityLevel', index=6, + number=7, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDevice', full_name='ProvisionedDeviceInfo.TestDevice', index=7, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4722, + serialized_end=5016, +) + + +_PROVISIONINGOPTIONS = _descriptor.Descriptor( + name='ProvisioningOptions', + full_name='ProvisioningOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5018, + serialized_end=5039, +) + + +_PROVISIONINGREQUEST = _descriptor.Descriptor( + name='ProvisioningRequest', + full_name='ProvisioningRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5041, + serialized_end=5062, +) + + +_PROVISIONINGRESPONSE = _descriptor.Descriptor( + name='ProvisioningResponse', + full_name='ProvisioningResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5064, + serialized_end=5086, +) + + +_REMOTEATTESTATION = _descriptor.Descriptor( + name='RemoteAttestation', + full_name='RemoteAttestation', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Certificate', full_name='RemoteAttestation.Certificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Salt', full_name='RemoteAttestation.Salt', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='RemoteAttestation.Signature', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5088, + serialized_end=5193, +) + + +_SESSIONINIT = _descriptor.Descriptor( + name='SessionInit', + full_name='SessionInit', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5195, + serialized_end=5208, +) + + +_SESSIONSTATE = _descriptor.Descriptor( + name='SessionState', + full_name='SessionState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5210, + serialized_end=5224, +) + + +_SIGNEDCERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='SignedCertificateStatusList', + full_name='SignedCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5226, + serialized_end=5255, +) + + +_SIGNEDDEVICECERTIFICATE = _descriptor.Descriptor( + name='SignedDeviceCertificate', + full_name='SignedDeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='_DeviceCertificate', full_name='SignedDeviceCertificate._DeviceCertificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedDeviceCertificate.Signature', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signer', full_name='SignedDeviceCertificate.Signer', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5258, + serialized_end=5392, +) + + +_SIGNEDPROVISIONINGMESSAGE = _descriptor.Descriptor( + name='SignedProvisioningMessage', + full_name='SignedProvisioningMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5394, + serialized_end=5421, +) + + +_SIGNEDMESSAGE = _descriptor.Descriptor( + name='SignedMessage', + full_name='SignedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedMessage.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedMessage.Msg', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedMessage.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedMessage.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedMessage.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDMESSAGE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5424, + serialized_end=5728, +) + + +_WIDEVINECENCHEADER = _descriptor.Descriptor( + name='WidevineCencHeader', + full_name='WidevineCencHeader', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='algorithm', full_name='WidevineCencHeader.algorithm', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='key_id', full_name='WidevineCencHeader.key_id', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='provider', full_name='WidevineCencHeader.provider', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='content_id', full_name='WidevineCencHeader.content_id', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='track_type_deprecated', full_name='WidevineCencHeader.track_type_deprecated', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='policy', full_name='WidevineCencHeader.policy', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_index', full_name='WidevineCencHeader.crypto_period_index', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='grouped_license', full_name='WidevineCencHeader.grouped_license', index=7, + number=8, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='protection_scheme', full_name='WidevineCencHeader.protection_scheme', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_seconds', full_name='WidevineCencHeader.crypto_period_seconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _WIDEVINECENCHEADER_ALGORITHM, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5731, + serialized_end=6056, +) + + +_SIGNEDLICENSEREQUEST = _descriptor.Descriptor( + name='SignedLicenseRequest', + full_name='SignedLicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicenseRequest.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicenseRequest.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicenseRequest.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicenseRequest.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicenseRequest.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSEREQUEST_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6059, + serialized_end=6394, +) + + +_SIGNEDLICENSE = _descriptor.Descriptor( + name='SignedLicense', + full_name='SignedLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicense.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicense.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicense.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicense.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicense.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6397, + serialized_end=6711, +) + +_CLIENTIDENTIFICATION_NAMEVALUE.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.fields_by_name['MaxHdcpVersion'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION.containing_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION.fields_by_name['Type'].enum_type = _CLIENTIDENTIFICATION_TOKENTYPE +_CLIENTIDENTIFICATION.fields_by_name['Token'].message_type = _SIGNEDDEVICECERTIFICATE +_CLIENTIDENTIFICATION.fields_by_name['ClientInfo'].message_type = _CLIENTIDENTIFICATION_NAMEVALUE +_CLIENTIDENTIFICATION.fields_by_name['_ClientCapabilities'].message_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION_TOKENTYPE.containing_type = _CLIENTIDENTIFICATION +_DEVICECERTIFICATE.fields_by_name['Type'].enum_type = _DEVICECERTIFICATE_CERTIFICATETYPE +_DEVICECERTIFICATE_CERTIFICATETYPE.containing_type = _DEVICECERTIFICATE +_DEVICECERTIFICATESTATUS.fields_by_name['Status'].enum_type = _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS +_DEVICECERTIFICATESTATUS.fields_by_name['DeviceInfo'].message_type = _PROVISIONEDDEVICEINFO +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS.containing_type = _DEVICECERTIFICATESTATUS +_DEVICECERTIFICATESTATUSLIST.fields_by_name['CertificateStatus'].message_type = _DEVICECERTIFICATESTATUS +_LICENSEIDENTIFICATION.fields_by_name['Type'].enum_type = _LICENSETYPE +_LICENSE_POLICY.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['Hdcp'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['CgmsFlags'].enum_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS.containing_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_KEYCONTROL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER.fields_by_name['Type'].enum_type = _LICENSE_KEYCONTAINER_KEYTYPE +_LICENSE_KEYCONTAINER.fields_by_name['Level'].enum_type = _LICENSE_KEYCONTAINER_SECURITYLEVEL +_LICENSE_KEYCONTAINER.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['RequestedProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['_KeyControl'].message_type = _LICENSE_KEYCONTAINER_KEYCONTROL +_LICENSE_KEYCONTAINER.fields_by_name['_OperatorSessionKeyPermissions'].message_type = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS +_LICENSE_KEYCONTAINER.fields_by_name['VideoResolutionConstraints'].message_type = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT +_LICENSE_KEYCONTAINER.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_KEYTYPE.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_SECURITYLEVEL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE.fields_by_name['Id'].message_type = _LICENSEIDENTIFICATION +_LICENSE.fields_by_name['_Policy'].message_type = _LICENSE_POLICY +_LICENSE.fields_by_name['Key'].message_type = _LICENSE_KEYCONTAINER +_LICENSEERROR.fields_by_name['ErrorCode'].enum_type = _LICENSEERROR_ERROR +_LICENSEERROR_ERROR.containing_type = _LICENSEERROR +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['Pssh'].message_type = _WIDEVINECENCHEADER +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.fields_by_name['LicenseId'].message_type = _LICENSEIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['CencId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['WebmId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['License'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE +_LICENSEREQUEST_CONTENTIDENTIFICATION.containing_type = _LICENSEREQUEST +_LICENSEREQUEST.fields_by_name['ClientId'].message_type = _CLIENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['ContentId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['Type'].enum_type = _LICENSEREQUEST_REQUESTTYPE +_LICENSEREQUEST.fields_by_name['ProtocolVersion'].enum_type = _PROTOCOLVERSION +_LICENSEREQUEST.fields_by_name['EncryptedClientId'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_LICENSEREQUEST_REQUESTTYPE.containing_type = _LICENSEREQUEST +_PROVISIONEDDEVICEINFO.fields_by_name['SecurityLevel'].enum_type = _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL.containing_type = _PROVISIONEDDEVICEINFO +_REMOTEATTESTATION.fields_by_name['Certificate'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_SIGNEDDEVICECERTIFICATE.fields_by_name['_DeviceCertificate'].message_type = _DEVICECERTIFICATE +_SIGNEDDEVICECERTIFICATE.fields_by_name['Signer'].message_type = _SIGNEDDEVICECERTIFICATE +_SIGNEDMESSAGE.fields_by_name['Type'].enum_type = _SIGNEDMESSAGE_MESSAGETYPE +_SIGNEDMESSAGE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDMESSAGE_MESSAGETYPE.containing_type = _SIGNEDMESSAGE +_WIDEVINECENCHEADER.fields_by_name['algorithm'].enum_type = _WIDEVINECENCHEADER_ALGORITHM +_WIDEVINECENCHEADER_ALGORITHM.containing_type = _WIDEVINECENCHEADER +_SIGNEDLICENSEREQUEST.fields_by_name['Type'].enum_type = _SIGNEDLICENSEREQUEST_MESSAGETYPE +_SIGNEDLICENSEREQUEST.fields_by_name['Msg'].message_type = _LICENSEREQUEST +_SIGNEDLICENSEREQUEST.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSEREQUEST_MESSAGETYPE.containing_type = _SIGNEDLICENSEREQUEST +_SIGNEDLICENSE.fields_by_name['Type'].enum_type = _SIGNEDLICENSE_MESSAGETYPE +_SIGNEDLICENSE.fields_by_name['Msg'].message_type = _LICENSE +_SIGNEDLICENSE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSE_MESSAGETYPE.containing_type = _SIGNEDLICENSE +DESCRIPTOR.message_types_by_name['ClientIdentification'] = _CLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['DeviceCertificate'] = _DEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['DeviceCertificateStatus'] = _DEVICECERTIFICATESTATUS +DESCRIPTOR.message_types_by_name['DeviceCertificateStatusList'] = _DEVICECERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['EncryptedClientIdentification'] = _ENCRYPTEDCLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['LicenseIdentification'] = _LICENSEIDENTIFICATION +DESCRIPTOR.message_types_by_name['License'] = _LICENSE +DESCRIPTOR.message_types_by_name['LicenseError'] = _LICENSEERROR +DESCRIPTOR.message_types_by_name['LicenseRequest'] = _LICENSEREQUEST +DESCRIPTOR.message_types_by_name['ProvisionedDeviceInfo'] = _PROVISIONEDDEVICEINFO +DESCRIPTOR.message_types_by_name['ProvisioningOptions'] = _PROVISIONINGOPTIONS +DESCRIPTOR.message_types_by_name['ProvisioningRequest'] = _PROVISIONINGREQUEST +DESCRIPTOR.message_types_by_name['ProvisioningResponse'] = _PROVISIONINGRESPONSE +DESCRIPTOR.message_types_by_name['RemoteAttestation'] = _REMOTEATTESTATION +DESCRIPTOR.message_types_by_name['SessionInit'] = _SESSIONINIT +DESCRIPTOR.message_types_by_name['SessionState'] = _SESSIONSTATE +DESCRIPTOR.message_types_by_name['SignedCertificateStatusList'] = _SIGNEDCERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['SignedDeviceCertificate'] = _SIGNEDDEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['SignedProvisioningMessage'] = _SIGNEDPROVISIONINGMESSAGE +DESCRIPTOR.message_types_by_name['SignedMessage'] = _SIGNEDMESSAGE +DESCRIPTOR.message_types_by_name['WidevineCencHeader'] = _WIDEVINECENCHEADER +DESCRIPTOR.message_types_by_name['SignedLicenseRequest'] = _SIGNEDLICENSEREQUEST +DESCRIPTOR.message_types_by_name['SignedLicense'] = _SIGNEDLICENSE +DESCRIPTOR.enum_types_by_name['LicenseType'] = _LICENSETYPE +DESCRIPTOR.enum_types_by_name['ProtocolVersion'] = _PROTOCOLVERSION +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ClientIdentification = _reflection.GeneratedProtocolMessageType('ClientIdentification', (_message.Message,), dict( + + NameValue = _reflection.GeneratedProtocolMessageType('NameValue', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_NAMEVALUE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.NameValue) + )) + , + + ClientCapabilities = _reflection.GeneratedProtocolMessageType('ClientCapabilities', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.ClientCapabilities) + )) + , + DESCRIPTOR = _CLIENTIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification) + )) +_sym_db.RegisterMessage(ClientIdentification) +_sym_db.RegisterMessage(ClientIdentification.NameValue) +_sym_db.RegisterMessage(ClientIdentification.ClientCapabilities) + +DeviceCertificate = _reflection.GeneratedProtocolMessageType('DeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificate) + )) +_sym_db.RegisterMessage(DeviceCertificate) + +DeviceCertificateStatus = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatus', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUS, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatus) + )) +_sym_db.RegisterMessage(DeviceCertificateStatus) + +DeviceCertificateStatusList = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUSLIST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatusList) + )) +_sym_db.RegisterMessage(DeviceCertificateStatusList) + +EncryptedClientIdentification = _reflection.GeneratedProtocolMessageType('EncryptedClientIdentification', (_message.Message,), dict( + DESCRIPTOR = _ENCRYPTEDCLIENTIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:EncryptedClientIdentification) + )) +_sym_db.RegisterMessage(EncryptedClientIdentification) + +LicenseIdentification = _reflection.GeneratedProtocolMessageType('LicenseIdentification', (_message.Message,), dict( + DESCRIPTOR = _LICENSEIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseIdentification) + )) +_sym_db.RegisterMessage(LicenseIdentification) + +License = _reflection.GeneratedProtocolMessageType('License', (_message.Message,), dict( + + Policy = _reflection.GeneratedProtocolMessageType('Policy', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_POLICY, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.Policy) + )) + , + + KeyContainer = _reflection.GeneratedProtocolMessageType('KeyContainer', (_message.Message,), dict( + + OutputProtection = _reflection.GeneratedProtocolMessageType('OutputProtection', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OutputProtection) + )) + , + + KeyControl = _reflection.GeneratedProtocolMessageType('KeyControl', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_KEYCONTROL, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.KeyControl) + )) + , + + OperatorSessionKeyPermissions = _reflection.GeneratedProtocolMessageType('OperatorSessionKeyPermissions', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OperatorSessionKeyPermissions) + )) + , + + VideoResolutionConstraint = _reflection.GeneratedProtocolMessageType('VideoResolutionConstraint', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.VideoResolutionConstraint) + )) + , + DESCRIPTOR = _LICENSE_KEYCONTAINER, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer) + )) + , + DESCRIPTOR = _LICENSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License) + )) +_sym_db.RegisterMessage(License) +_sym_db.RegisterMessage(License.Policy) +_sym_db.RegisterMessage(License.KeyContainer) +_sym_db.RegisterMessage(License.KeyContainer.OutputProtection) +_sym_db.RegisterMessage(License.KeyContainer.KeyControl) +_sym_db.RegisterMessage(License.KeyContainer.OperatorSessionKeyPermissions) +_sym_db.RegisterMessage(License.KeyContainer.VideoResolutionConstraint) + +LicenseError = _reflection.GeneratedProtocolMessageType('LicenseError', (_message.Message,), dict( + DESCRIPTOR = _LICENSEERROR, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseError) + )) +_sym_db.RegisterMessage(LicenseError) + +LicenseRequest = _reflection.GeneratedProtocolMessageType('LicenseRequest', (_message.Message,), dict( + + ContentIdentification = _reflection.GeneratedProtocolMessageType('ContentIdentification', (_message.Message,), dict( + + CENC = _reflection.GeneratedProtocolMessageType('CENC', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.CENC) + )) + , + + WebM = _reflection.GeneratedProtocolMessageType('WebM', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.WebM) + )) + , + + ExistingLicense = _reflection.GeneratedProtocolMessageType('ExistingLicense', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.ExistingLicense) + )) + , + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification) + )) + , + DESCRIPTOR = _LICENSEREQUEST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest) + )) +_sym_db.RegisterMessage(LicenseRequest) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.CENC) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.WebM) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.ExistingLicense) + +ProvisionedDeviceInfo = _reflection.GeneratedProtocolMessageType('ProvisionedDeviceInfo', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONEDDEVICEINFO, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisionedDeviceInfo) + )) +_sym_db.RegisterMessage(ProvisionedDeviceInfo) + +ProvisioningOptions = _reflection.GeneratedProtocolMessageType('ProvisioningOptions', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGOPTIONS, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningOptions) + )) +_sym_db.RegisterMessage(ProvisioningOptions) + +ProvisioningRequest = _reflection.GeneratedProtocolMessageType('ProvisioningRequest', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGREQUEST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningRequest) + )) +_sym_db.RegisterMessage(ProvisioningRequest) + +ProvisioningResponse = _reflection.GeneratedProtocolMessageType('ProvisioningResponse', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGRESPONSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningResponse) + )) +_sym_db.RegisterMessage(ProvisioningResponse) + +RemoteAttestation = _reflection.GeneratedProtocolMessageType('RemoteAttestation', (_message.Message,), dict( + DESCRIPTOR = _REMOTEATTESTATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:RemoteAttestation) + )) +_sym_db.RegisterMessage(RemoteAttestation) + +SessionInit = _reflection.GeneratedProtocolMessageType('SessionInit', (_message.Message,), dict( + DESCRIPTOR = _SESSIONINIT, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SessionInit) + )) +_sym_db.RegisterMessage(SessionInit) + +SessionState = _reflection.GeneratedProtocolMessageType('SessionState', (_message.Message,), dict( + DESCRIPTOR = _SESSIONSTATE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SessionState) + )) +_sym_db.RegisterMessage(SessionState) + +SignedCertificateStatusList = _reflection.GeneratedProtocolMessageType('SignedCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDCERTIFICATESTATUSLIST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedCertificateStatusList) + )) +_sym_db.RegisterMessage(SignedCertificateStatusList) + +SignedDeviceCertificate = _reflection.GeneratedProtocolMessageType('SignedDeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDDEVICECERTIFICATE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedDeviceCertificate) + )) +_sym_db.RegisterMessage(SignedDeviceCertificate) + +SignedProvisioningMessage = _reflection.GeneratedProtocolMessageType('SignedProvisioningMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDPROVISIONINGMESSAGE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedProvisioningMessage) + )) +_sym_db.RegisterMessage(SignedProvisioningMessage) + +SignedMessage = _reflection.GeneratedProtocolMessageType('SignedMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDMESSAGE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedMessage) + )) +_sym_db.RegisterMessage(SignedMessage) + +WidevineCencHeader = _reflection.GeneratedProtocolMessageType('WidevineCencHeader', (_message.Message,), dict( + DESCRIPTOR = _WIDEVINECENCHEADER, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:WidevineCencHeader) + )) +_sym_db.RegisterMessage(WidevineCencHeader) + +SignedLicenseRequest = _reflection.GeneratedProtocolMessageType('SignedLicenseRequest', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSEREQUEST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedLicenseRequest) + )) +_sym_db.RegisterMessage(SignedLicenseRequest) + +SignedLicense = _reflection.GeneratedProtocolMessageType('SignedLicense', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedLicense) + )) +_sym_db.RegisterMessage(SignedLicense) + + +# @@protoc_insertion_point(module_scope) diff --git a/pywidevine/L3/cdm/key.py b/pywidevine/L3/cdm/key.py new file mode 100644 index 0000000..0f0b956 --- /dev/null +++ b/pywidevine/L3/cdm/key.py @@ -0,0 +1,14 @@ +import binascii + +class Key: + def __init__(self, kid, type, key, permissions=[]): + self.kid = kid + self.type = type + self.key = key + self.permissions = permissions + + def __repr__(self): + if self.type == "OPERATOR_SESSION": + return "key(kid={}, type={}, key={}, permissions={})".format(self.kid, self.type, binascii.hexlify(self.key), self.permissions) + else: + return "key(kid={}, type={}, key={})".format(self.kid, self.type, binascii.hexlify(self.key)) diff --git a/pywidevine/L3/cdm/session.py b/pywidevine/L3/cdm/session.py new file mode 100644 index 0000000..0f7295c --- /dev/null +++ b/pywidevine/L3/cdm/session.py @@ -0,0 +1,18 @@ +class Session: + def __init__(self, session_id, init_data, device_config, offline): + self.session_id = session_id + self.init_data = init_data + self.offline = offline + self.device_config = device_config + self.device_key = None + self.session_key = None + self.derived_keys = { + 'enc': None, + 'auth_1': None, + 'auth_2': None + } + self.license_request = None + self.license = None + self.service_certificate = None + self.privacy_mode = False + self.keys = [] diff --git a/pywidevine/L3/cdm/vmp.py b/pywidevine/L3/cdm/vmp.py new file mode 100644 index 0000000..42ab1bf --- /dev/null +++ b/pywidevine/L3/cdm/vmp.py @@ -0,0 +1,102 @@ +try: + from google.protobuf.internal.decoder import _DecodeVarint as _di # this was tested to work with protobuf 3, but it's an internal API (any varint decoder might work) +except ImportError: + # this is generic and does not depend on pb internals, however it will decode "larger" possible numbers than pb decoder which has them fixed + def LEB128_decode(buffer, pos, limit = 64): + result = 0 + shift = 0 + while True: + b = buffer[pos] + pos += 1 + result |= ((b & 0x7F) << shift) + if not (b & 0x80): + return (result, pos) + shift += 7 + if shift > limit: + raise Exception("integer too large, shift: {}".format(shift)) + _di = LEB128_decode + + +class FromFileMixin: + @classmethod + def from_file(cls, filename): + """Load given a filename""" + with open(filename,"rb") as f: + return cls(f.read()) + +# the signatures use a format internally similar to +# protobuf's encoding, but without wire types +class VariableReader(FromFileMixin): + """Protobuf-like encoding reader""" + + def __init__(self, buf): + self.buf = buf + self.pos = 0 + self.size = len(buf) + + def read_int(self): + """Read a variable length integer""" + # _DecodeVarint will take care of out of range errors + (val, nextpos) = _di(self.buf, self.pos) + self.pos = nextpos + return val + + def read_bytes_raw(self, size): + """Read size bytes""" + b = self.buf[self.pos:self.pos+size] + self.pos += size + return b + + def read_bytes(self): + """Read a bytes object""" + size = self.read_int() + return self.read_bytes_raw(size) + + def is_end(self): + return (self.size == self.pos) + + +class TaggedReader(VariableReader): + """Tagged reader, needed for implementing a WideVine signature reader""" + + def read_tag(self): + """Read a tagged buffer""" + return (self.read_int(), self.read_bytes()) + + def read_all_tags(self, max_tag=3): + tags = {} + while (not self.is_end()): + (tag, bytes) = self.read_tag() + if (tag > max_tag): + raise IndexError("tag out of bound: got {}, max {}".format(tag, max_tag)) + + tags[tag] = bytes + return tags + +class WideVineSignatureReader(FromFileMixin): + """Parses a widevine .sig signature file.""" + + SIGNER_TAG = 1 + SIGNATURE_TAG = 2 + ISMAINEXE_TAG = 3 + + def __init__(self, buf): + reader = TaggedReader(buf) + self.version = reader.read_int() + if (self.version != 0): + raise Exception("Unsupported signature format version {}".format(self.version)) + self.tags = reader.read_all_tags() + + self.signer = self.tags[self.SIGNER_TAG] + self.signature = self.tags[self.SIGNATURE_TAG] + + extra = self.tags[self.ISMAINEXE_TAG] + if (len(extra) != 1 or (extra[0] > 1)): + raise Exception("Unexpected 'ismainexe' field value (not '\\x00' or '\\x01'), please check: {0}".format(extra)) + + self.mainexe = bool(extra[0]) + + @classmethod + def get_tags(cls, filename): + """Return a dictionary of each tag in the signature file""" + return cls.from_file(filename).tags diff --git a/pywidevine/L3/decrypt/__init__.py b/pywidevine/L3/decrypt/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pywidevine/L3/decrypt/__pycache__/__init__.cpython-36.pyc b/pywidevine/L3/decrypt/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5709e8ff548e296c6d318b09186ed320920d5f9d GIT binary patch literal 152 zcmXr!<>g8Uh>T|dg2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m#ec?OlWaxQE`l8 zN^WLeW^qYTVo82cj7w^9c1eCgOnF&+c4}pDOhILNW=d*VW?pJcN@{XZWkE?yd^}Kn aNqoFsLFFwDo80`A(wtN~knzPp%m4tV%P0K+ literal 0 HcmV?d00001 diff --git a/pywidevine/L3/decrypt/__pycache__/__init__.cpython-37.pyc b/pywidevine/L3/decrypt/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8ffe8a1f27eeb4c854f2ca7c00e16273a86feb5 GIT binary patch literal 148 zcmZ?b<>g`kf`ov`co6*>sfEzT~g`kf`ov`co6*I zlU16RX&&Q}TAW>yUl0@S>ZI%96CdL5?-Lx8msXOWpQCGJU|?xz5K~ZDo|%$bmYJ6t olaiWTR9R3G6Ca2KczG$)edCSXCP((00KiQ00000 literal 0 HcmV?d00001 diff --git a/pywidevine/L3/decrypt/__pycache__/__init__.cpython-39.pyc b/pywidevine/L3/decrypt/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0008afe4a43bfb0f1e6f34dd7ed731ae45c9d6fa GIT binary patch literal 146 zcmYe~<>g`kf`ov`co6*I zlbcwQS{mb$U!IqfpO{h{Q&3r+nUY$TnU@-qlA2spSx^!aAD@|*SrQ+wS5SG2!zMRB Pr8Fni4rJhGAZ7pnjYJ~F literal 0 HcmV?d00001 diff --git a/pywidevine/L3/decrypt/__pycache__/wvdecrypt.cpython-38.pyc b/pywidevine/L3/decrypt/__pycache__/wvdecrypt.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e95ba504c1ac5a814c2beffe33fd71b295c1a45 GIT binary patch literal 2483 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 literal 0 HcmV?d00001 diff --git a/pywidevine/L3/decrypt/__pycache__/wvdecryptconfig.cpython-38.pyc b/pywidevine/L3/decrypt/__pycache__/wvdecryptconfig.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37565090101091da09f7fa3e78b362c926362344 GIT binary patch literal 1871 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 AA^-pY literal 0 HcmV?d00001 diff --git a/pywidevine/L3/decrypt/__pycache__/wvdecryptcustom.cpython-37.pyc b/pywidevine/L3/decrypt/__pycache__/wvdecryptcustom.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b0c451ca5aedb3f0f2019ce3dddaa286d42e7cf GIT binary patch literal 2237 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 G3*tYR(;=z= literal 0 HcmV?d00001 diff --git a/pywidevine/L3/decrypt/wvdecryptcustom.py b/pywidevine/L3/decrypt/wvdecryptcustom.py new file mode 100644 index 0000000..744f17a --- /dev/null +++ b/pywidevine/L3/decrypt/wvdecryptcustom.py @@ -0,0 +1,59 @@ +# 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 \ No newline at end of file diff --git a/pywidevine/L3/getPSSH.py b/pywidevine/L3/getPSSH.py new file mode 100644 index 0000000..3497c9d --- /dev/null +++ b/pywidevine/L3/getPSSH.py @@ -0,0 +1,14 @@ +import requests, xmltodict, json + +def get_pssh(mpd_url): + r = requests.get(url=mpd_url) + r.raise_for_status() + xml = xmltodict.parse(r.text) + mpd = json.loads(json.dumps(xml)) + tracks = mpd['MPD']['Period']['AdaptationSet'] + for video_tracks in tracks: + if video_tracks['@mimeType'] == 'video/mp4': + for t in video_tracks["ContentProtection"]: + if t['@schemeIdUri'].lower() == "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed": + pssh = t["cenc:pssh"] + return pssh \ No newline at end of file diff --git a/pywidevine/__pycache__/__init__.cpython-36.pyc b/pywidevine/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e6d6c3fc56417417cc9cb292c8dff1268e5db5b GIT binary patch literal 144 zcmXr!<>g8Uh>T|dg2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m#wo^OlWaxQE`l8 zN^WLeW^qYTVo82cj7w^9c1eCgOnF&+c4}pDOhILNW=d*VW?pJcd^}KHNqoFsLFFwD So80`A(wtN~kg>%;%m4sU(g`kf`ov`co6*>sfEzT~g`kf`ov`co6*I z6P%b=l9`yEALEi*oL!P%5L2F-q??ixQ(hLIomyEOQ&3r+nUY$TnU@+9AD@|*SrQ+w XS5SG2!zMRBr8Fni4rK6WAZ7pnx638E literal 0 HcmV?d00001 diff --git a/pywidevine/__pycache__/getPSSH.cpython-36.pyc b/pywidevine/__pycache__/getPSSH.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38d93ed2d1fb17f44ae8efa50bf52228eb1d3330 GIT binary patch literal 714 zcmYjPO>fgc5Z(1x?9if=10oVPIFLg?{eZSng<4uwaG;75s!CQ+YCO}{N$hoZ*KHCx zr*PoH58)@VSHyvTfH*NuFJ0@snKv^Y&DyiMx?2DH`{(&Hi?Ltq-XYEQ3F?_&<5UPE$0tavXhushK^5g2!{mqjYzX0FR9aaKIbJLS_{URwucV+ z?t;%P?G0-LzqA&dv|ZX@H5u3hr^)8dyH^`rxF+ja|rbXn*V;gUa_wxi8>r@gTaF}z-fjdg@s5Mvg1a;2_Xb>mCCE>LM@>`T<9A)`d$ z;6liOqPYrXf=N2o0+Lu8H;<%3<7k{{;|!I^j5`()DC0tr=48g=7G=v1YiSMxx~<_d zw5dU8Qy}!TjN*|BSC)4h+$qDUS2fHJCL8q2{_P!h`lkw|>K{OwWQn3WEoA=))kurH ze|s|+;Z*hW=`DStn@ocud6j3ik;Odg^2!Efgc5Z(1x?2w`sBt#@`a3F_(S_*9=ghCTlfJ7B3RF$lt)b&iMoA{%<>o$p; z8wW1@hvdjlVy}n;{{V4foC=At-kW_h*)>@eh|BXbEhp+k^gh!nfv1$Fw$=e*zxW63yE z=E5rYg}vl+Lph5I!7Yp>Cv6rc7K(q_++mT${NV`{w&z*LQj-q7?kK*AQeX zP*IxnQO&$|9L4xyn&Hg5iU8B6aklMmbkam&qIx1#7?!oOT3d$a7~@+w649)gi=>t3 z5wsBSZ1*(SYwqm9i{^F^Vl#La?l!k}AcW_eu(gRW^FmC*Rwm_nqpDqjmpMu$wfPB^ zUKc?mad?)Bp`^KTsl7=&Rw+cG(smXIiP};)QQEqYX`=0M8i3R`M~NUDNx!z*+wewdPQA)uzA>>uNA_pC(;6H}6msw`PokYc7v)H$ z+2HzWIKrtMWYcT+xe`jwOy-8JnCysA+usqJ%AdPBsi#PL}v z#**f$r4DZLOqGx(O1o7oBx*Q9nA7C}cE>3zf#_Wi&uJQDqfP@w5k7 zG`${Aa3-T_Hl?3*ofa6;?8DLM-ScXueTv7Xp>1ye5fS5U?h`iXGu}jPE*{cK*Ab>n fc!mN)M!g;69&M7Q{Wp0Db%qD#rAhNpA6x$bSxCZ1 literal 0 HcmV?d00001