From dce1deab2830763a092da09e46833004ae622f57 Mon Sep 17 00:00:00 2001 From: stratumadev Date: Wed, 7 May 2025 14:01:51 +0200 Subject: [PATCH] linting and added prettier config --- .prettierrc | 20 + modules/widevine/cmac.ts | 180 +- modules/widevine/license.ts | 502 ++-- modules/widevine/license_protocol_pb3.ts | 3304 +++++++++++----------- 4 files changed, 2013 insertions(+), 1993 deletions(-) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..64aca77 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,20 @@ +{ + "arrowParens": "always", + "bracketSameLine": false, + "bracketSpacing": true, + "embeddedLanguageFormatting": "auto", + "htmlWhitespaceSensitivity": "strict", + "insertPragma": false, + "jsxSingleQuote": false, + "proseWrap": "never", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "none", + "useTabs": false, + "vueIndentScriptAndStyle": false, + "printWidth": 180, + "endOfLine": "auto" +} diff --git a/modules/widevine/cmac.ts b/modules/widevine/cmac.ts index c6d1567..4374198 100644 --- a/modules/widevine/cmac.ts +++ b/modules/widevine/cmac.ts @@ -1,113 +1,113 @@ // Modified version of https://github.com/Frooastside/node-widevine -import crypto from 'crypto' +import crypto from 'crypto'; export class AES_CMAC { - private readonly BLOCK_SIZE = 16 - private readonly XOR_RIGHT = Buffer.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87]) - private readonly EMPTY_BLOCK_SIZE_BUFFER = Buffer.alloc(this.BLOCK_SIZE) + private readonly BLOCK_SIZE = 16; + private readonly XOR_RIGHT = Buffer.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87]); + private readonly EMPTY_BLOCK_SIZE_BUFFER = Buffer.alloc(this.BLOCK_SIZE); - private _key: Buffer - private _subkeys: { first: Buffer; second: Buffer } + private _key: Buffer; + private _subkeys: { first: Buffer; second: Buffer }; - public constructor(key: Buffer) { - if (![16, 24, 32].includes(key.length)) { - throw new Error('Key size must be 128, 192, or 256 bits.') - } - this._key = key - this._subkeys = this._generateSubkeys() + public constructor(key: Buffer) { + if (![16, 24, 32].includes(key.length)) { + throw new Error('Key size must be 128, 192, or 256 bits.'); + } + this._key = key; + this._subkeys = this._generateSubkeys(); + } + + public calculate(message: Buffer): Buffer { + const blockCount = this._getBlockCount(message); + + let x = this.EMPTY_BLOCK_SIZE_BUFFER; + let y; + + for (let i = 0; i < blockCount - 1; i++) { + const from = i * this.BLOCK_SIZE; + const block = message.subarray(from, from + this.BLOCK_SIZE); + y = this._xor(x, block); + x = this._aes(y); } - public calculate(message: Buffer): Buffer { - const blockCount = this._getBlockCount(message) + y = this._xor(x, this._getLastBlock(message)); + x = this._aes(y); - let x = this.EMPTY_BLOCK_SIZE_BUFFER - let y + return x; + } - for (let i = 0; i < blockCount - 1; i++) { - const from = i * this.BLOCK_SIZE - const block = message.subarray(from, from + this.BLOCK_SIZE) - y = this._xor(x, block) - x = this._aes(y) - } + private _generateSubkeys(): { first: Buffer; second: Buffer } { + const l = this._aes(this.EMPTY_BLOCK_SIZE_BUFFER); - y = this._xor(x, this._getLastBlock(message)) - x = this._aes(y) - - return x + let first = this._bitShiftLeft(l); + if (l[0] & 0x80) { + first = this._xor(first, this.XOR_RIGHT); } - private _generateSubkeys(): { first: Buffer; second: Buffer } { - const l = this._aes(this.EMPTY_BLOCK_SIZE_BUFFER) - - let first = this._bitShiftLeft(l) - if (l[0] & 0x80) { - first = this._xor(first, this.XOR_RIGHT) - } - - let second = this._bitShiftLeft(first) - if (first[0] & 0x80) { - second = this._xor(second, this.XOR_RIGHT) - } - - return { first: first, second: second } + let second = this._bitShiftLeft(first); + if (first[0] & 0x80) { + second = this._xor(second, this.XOR_RIGHT); } - private _getBlockCount(message: Buffer): number { - const blockCount = Math.ceil(message.length / this.BLOCK_SIZE) - return blockCount === 0 ? 1 : blockCount + return { first: first, second: second }; + } + + private _getBlockCount(message: Buffer): number { + const blockCount = Math.ceil(message.length / this.BLOCK_SIZE); + return blockCount === 0 ? 1 : blockCount; + } + + private _aes(message: Buffer): Buffer { + const cipher = crypto.createCipheriv(`aes-${this._key.length * 8}-cbc`, this._key, Buffer.alloc(this.BLOCK_SIZE)); + const result = cipher.update(message).subarray(0, 16); + cipher.destroy(); + return result; + } + + private _getLastBlock(message: Buffer): Buffer { + const blockCount = this._getBlockCount(message); + const paddedBlock = this._padding(message, blockCount - 1); + + let complete = false; + if (message.length > 0) { + complete = message.length % this.BLOCK_SIZE === 0; } - private _aes(message: Buffer): Buffer { - const cipher = crypto.createCipheriv(`aes-${this._key.length * 8}-cbc`, this._key, Buffer.alloc(this.BLOCK_SIZE)) - const result = cipher.update(message).subarray(0, 16) - cipher.destroy() - return result + const key = complete ? this._subkeys.first : this._subkeys.second; + return this._xor(paddedBlock, key); + } + + private _padding(message: Buffer, blockIndex: number): Buffer { + const block = Buffer.alloc(this.BLOCK_SIZE); + + const from = blockIndex * this.BLOCK_SIZE; + + const slice = message.subarray(from, from + this.BLOCK_SIZE); + block.set(slice); + + if (slice.length !== this.BLOCK_SIZE) { + block[slice.length] = 0x80; } - private _getLastBlock(message: Buffer): Buffer { - const blockCount = this._getBlockCount(message) - const paddedBlock = this._padding(message, blockCount - 1) + return block; + } - let complete = false - if (message.length > 0) { - complete = message.length % this.BLOCK_SIZE === 0 - } - - const key = complete ? this._subkeys.first : this._subkeys.second - return this._xor(paddedBlock, key) + private _bitShiftLeft(input: Buffer): Buffer { + const output = Buffer.alloc(input.length); + let overflow = 0; + for (let i = input.length - 1; i >= 0; i--) { + output[i] = (input[i] << 1) | overflow; + overflow = input[i] & 0x80 ? 1 : 0; } + return output; + } - private _padding(message: Buffer, blockIndex: number): Buffer { - const block = Buffer.alloc(this.BLOCK_SIZE) - - const from = blockIndex * this.BLOCK_SIZE - - const slice = message.subarray(from, from + this.BLOCK_SIZE) - block.set(slice) - - if (slice.length !== this.BLOCK_SIZE) { - block[slice.length] = 0x80 - } - - return block - } - - private _bitShiftLeft(input: Buffer): Buffer { - const output = Buffer.alloc(input.length) - let overflow = 0 - for (let i = input.length - 1; i >= 0; i--) { - output[i] = (input[i] << 1) | overflow - overflow = input[i] & 0x80 ? 1 : 0 - } - return output - } - - private _xor(a: Buffer, b: Buffer): Buffer { - const length = Math.min(a.length, b.length) - const output = Buffer.alloc(length) - for (let i = 0; i < length; i++) { - output[i] = a[i] ^ b[i] - } - return output + private _xor(a: Buffer, b: Buffer): Buffer { + const length = Math.min(a.length, b.length); + const output = Buffer.alloc(length); + for (let i = 0; i < length; i++) { + output[i] = a[i] ^ b[i]; } + return output; + } } diff --git a/modules/widevine/license.ts b/modules/widevine/license.ts index 77bbf98..8a8ba01 100644 --- a/modules/widevine/license.ts +++ b/modules/widevine/license.ts @@ -1,301 +1,301 @@ // Modified version of https://github.com/Frooastside/node-widevine -import { AES_CMAC } from './cmac' -import forge from 'node-forge' +import { AES_CMAC } from './cmac'; +import forge from 'node-forge'; import { - ClientIdentification, - ClientIdentificationSchema, - DrmCertificateSchema, - EncryptedClientIdentification, - EncryptedClientIdentificationSchema, - LicenseRequest, - LicenseRequest_ContentIdentification_WidevinePsshDataSchema, - LicenseRequest_ContentIdentificationSchema, - LicenseRequest_RequestType, - LicenseRequestSchema, - LicenseSchema, - LicenseType, - ProtocolVersion, - SignedDrmCertificate, - SignedDrmCertificateSchema, - SignedMessage, - SignedMessage_MessageType, - SignedMessageSchema, - WidevinePsshData, - WidevinePsshDataSchema -} from './license_protocol_pb3' -import { create, fromBinary, toBinary } from '@bufbuild/protobuf' + ClientIdentification, + ClientIdentificationSchema, + DrmCertificateSchema, + EncryptedClientIdentification, + EncryptedClientIdentificationSchema, + LicenseRequest, + LicenseRequest_ContentIdentification_WidevinePsshDataSchema, + LicenseRequest_ContentIdentificationSchema, + LicenseRequest_RequestType, + LicenseRequestSchema, + LicenseSchema, + LicenseType, + ProtocolVersion, + SignedDrmCertificate, + SignedDrmCertificateSchema, + SignedMessage, + SignedMessage_MessageType, + SignedMessageSchema, + WidevinePsshData, + WidevinePsshDataSchema +} from './license_protocol_pb3'; +import { create, fromBinary, toBinary } from '@bufbuild/protobuf'; -const WIDEVINE_SYSTEM_ID = new Uint8Array([0xed, 0xef, 0x8b, 0xa9, 0x79, 0xd6, 0x4a, 0xce, 0xa3, 0xc8, 0x27, 0xdc, 0xd5, 0x1d, 0x21, 0xed]) +const WIDEVINE_SYSTEM_ID = new Uint8Array([0xed, 0xef, 0x8b, 0xa9, 0x79, 0xd6, 0x4a, 0xce, 0xa3, 0xc8, 0x27, 0xdc, 0xd5, 0x1d, 0x21, 0xed]); const WIDEVINE_ROOT_PUBLIC_KEY = new Uint8Array([ - 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, 0x00, 0xb4, 0xfe, 0x39, 0xc3, 0x65, 0x90, 0x03, 0xdb, 0x3c, 0x11, 0x97, 0x09, 0xe8, 0x68, 0xcd, 0xf2, 0xc3, 0x5e, 0x9b, 0xf2, - 0xe7, 0x4d, 0x23, 0xb1, 0x10, 0xdb, 0x87, 0x65, 0xdf, 0xdc, 0xfb, 0x9f, 0x35, 0xa0, 0x57, 0x03, 0x53, 0x4c, 0xf6, 0x6d, 0x35, 0x7d, 0xa6, 0x78, 0xdb, 0xb3, 0x36, 0xd2, 0x3f, - 0x9c, 0x40, 0xa9, 0x95, 0x26, 0x72, 0x7f, 0xb8, 0xbe, 0x66, 0xdf, 0xc5, 0x21, 0x98, 0x78, 0x15, 0x16, 0x68, 0x5d, 0x2f, 0x46, 0x0e, 0x43, 0xcb, 0x8a, 0x84, 0x39, 0xab, 0xfb, - 0xb0, 0x35, 0x80, 0x22, 0xbe, 0x34, 0x23, 0x8b, 0xab, 0x53, 0x5b, 0x72, 0xec, 0x4b, 0xb5, 0x48, 0x69, 0x53, 0x3e, 0x47, 0x5f, 0xfd, 0x09, 0xfd, 0xa7, 0x76, 0x13, 0x8f, 0x0f, - 0x92, 0xd6, 0x4c, 0xdf, 0xae, 0x76, 0xa9, 0xba, 0xd9, 0x22, 0x10, 0xa9, 0x9d, 0x71, 0x45, 0xd6, 0xd7, 0xe1, 0x19, 0x25, 0x85, 0x9c, 0x53, 0x9a, 0x97, 0xeb, 0x84, 0xd7, 0xcc, - 0xa8, 0x88, 0x82, 0x20, 0x70, 0x26, 0x20, 0xfd, 0x7e, 0x40, 0x50, 0x27, 0xe2, 0x25, 0x93, 0x6f, 0xbc, 0x3e, 0x72, 0xa0, 0xfa, 0xc1, 0xbd, 0x29, 0xb4, 0x4d, 0x82, 0x5c, 0xc1, - 0xb4, 0xcb, 0x9c, 0x72, 0x7e, 0xb0, 0xe9, 0x8a, 0x17, 0x3e, 0x19, 0x63, 0xfc, 0xfd, 0x82, 0x48, 0x2b, 0xb7, 0xb2, 0x33, 0xb9, 0x7d, 0xec, 0x4b, 0xba, 0x89, 0x1f, 0x27, 0xb8, - 0x9b, 0x88, 0x48, 0x84, 0xaa, 0x18, 0x92, 0x0e, 0x65, 0xf5, 0xc8, 0x6c, 0x11, 0xff, 0x6b, 0x36, 0xe4, 0x74, 0x34, 0xca, 0x8c, 0x33, 0xb1, 0xf9, 0xb8, 0x8e, 0xb4, 0xe6, 0x12, - 0xe0, 0x02, 0x98, 0x79, 0x52, 0x5e, 0x45, 0x33, 0xff, 0x11, 0xdc, 0xeb, 0xc3, 0x53, 0xba, 0x7c, 0x60, 0x1a, 0x11, 0x3d, 0x00, 0xfb, 0xd2, 0xb7, 0xaa, 0x30, 0xfa, 0x4f, 0x5e, - 0x48, 0x77, 0x5b, 0x17, 0xdc, 0x75, 0xef, 0x6f, 0xd2, 0x19, 0x6d, 0xdc, 0xbe, 0x7f, 0xb0, 0x78, 0x8f, 0xdc, 0x82, 0x60, 0x4c, 0xbf, 0xe4, 0x29, 0x06, 0x5e, 0x69, 0x8c, 0x39, - 0x13, 0xad, 0x14, 0x25, 0xed, 0x19, 0xb2, 0xf2, 0x9f, 0x01, 0x82, 0x0d, 0x56, 0x44, 0x88, 0xc8, 0x35, 0xec, 0x1f, 0x11, 0xb3, 0x24, 0xe0, 0x59, 0x0d, 0x37, 0xe4, 0x47, 0x3c, - 0xea, 0x4b, 0x7f, 0x97, 0x31, 0x1c, 0x81, 0x7c, 0x94, 0x8a, 0x4c, 0x7d, 0x68, 0x15, 0x84, 0xff, 0xa5, 0x08, 0xfd, 0x18, 0xe7, 0xe7, 0x2b, 0xe4, 0x47, 0x27, 0x12, 0x11, 0xb8, - 0x23, 0xec, 0x58, 0x93, 0x3c, 0xac, 0x12, 0xd2, 0x88, 0x6d, 0x41, 0x3d, 0xc5, 0xfe, 0x1c, 0xdc, 0xb9, 0xf8, 0xd4, 0x51, 0x3e, 0x07, 0xe5, 0x03, 0x6f, 0xa7, 0x12, 0xe8, 0x12, - 0xf7, 0xb5, 0xce, 0xa6, 0x96, 0x55, 0x3f, 0x78, 0xb4, 0x64, 0x82, 0x50, 0xd2, 0x33, 0x5f, 0x91, 0x02, 0x03, 0x01, 0x00, 0x01 -]) + 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, 0x00, 0xb4, 0xfe, 0x39, 0xc3, 0x65, 0x90, 0x03, 0xdb, 0x3c, 0x11, 0x97, 0x09, 0xe8, 0x68, 0xcd, 0xf2, 0xc3, 0x5e, 0x9b, 0xf2, + 0xe7, 0x4d, 0x23, 0xb1, 0x10, 0xdb, 0x87, 0x65, 0xdf, 0xdc, 0xfb, 0x9f, 0x35, 0xa0, 0x57, 0x03, 0x53, 0x4c, 0xf6, 0x6d, 0x35, 0x7d, 0xa6, 0x78, 0xdb, 0xb3, 0x36, 0xd2, 0x3f, + 0x9c, 0x40, 0xa9, 0x95, 0x26, 0x72, 0x7f, 0xb8, 0xbe, 0x66, 0xdf, 0xc5, 0x21, 0x98, 0x78, 0x15, 0x16, 0x68, 0x5d, 0x2f, 0x46, 0x0e, 0x43, 0xcb, 0x8a, 0x84, 0x39, 0xab, 0xfb, + 0xb0, 0x35, 0x80, 0x22, 0xbe, 0x34, 0x23, 0x8b, 0xab, 0x53, 0x5b, 0x72, 0xec, 0x4b, 0xb5, 0x48, 0x69, 0x53, 0x3e, 0x47, 0x5f, 0xfd, 0x09, 0xfd, 0xa7, 0x76, 0x13, 0x8f, 0x0f, + 0x92, 0xd6, 0x4c, 0xdf, 0xae, 0x76, 0xa9, 0xba, 0xd9, 0x22, 0x10, 0xa9, 0x9d, 0x71, 0x45, 0xd6, 0xd7, 0xe1, 0x19, 0x25, 0x85, 0x9c, 0x53, 0x9a, 0x97, 0xeb, 0x84, 0xd7, 0xcc, + 0xa8, 0x88, 0x82, 0x20, 0x70, 0x26, 0x20, 0xfd, 0x7e, 0x40, 0x50, 0x27, 0xe2, 0x25, 0x93, 0x6f, 0xbc, 0x3e, 0x72, 0xa0, 0xfa, 0xc1, 0xbd, 0x29, 0xb4, 0x4d, 0x82, 0x5c, 0xc1, + 0xb4, 0xcb, 0x9c, 0x72, 0x7e, 0xb0, 0xe9, 0x8a, 0x17, 0x3e, 0x19, 0x63, 0xfc, 0xfd, 0x82, 0x48, 0x2b, 0xb7, 0xb2, 0x33, 0xb9, 0x7d, 0xec, 0x4b, 0xba, 0x89, 0x1f, 0x27, 0xb8, + 0x9b, 0x88, 0x48, 0x84, 0xaa, 0x18, 0x92, 0x0e, 0x65, 0xf5, 0xc8, 0x6c, 0x11, 0xff, 0x6b, 0x36, 0xe4, 0x74, 0x34, 0xca, 0x8c, 0x33, 0xb1, 0xf9, 0xb8, 0x8e, 0xb4, 0xe6, 0x12, + 0xe0, 0x02, 0x98, 0x79, 0x52, 0x5e, 0x45, 0x33, 0xff, 0x11, 0xdc, 0xeb, 0xc3, 0x53, 0xba, 0x7c, 0x60, 0x1a, 0x11, 0x3d, 0x00, 0xfb, 0xd2, 0xb7, 0xaa, 0x30, 0xfa, 0x4f, 0x5e, + 0x48, 0x77, 0x5b, 0x17, 0xdc, 0x75, 0xef, 0x6f, 0xd2, 0x19, 0x6d, 0xdc, 0xbe, 0x7f, 0xb0, 0x78, 0x8f, 0xdc, 0x82, 0x60, 0x4c, 0xbf, 0xe4, 0x29, 0x06, 0x5e, 0x69, 0x8c, 0x39, + 0x13, 0xad, 0x14, 0x25, 0xed, 0x19, 0xb2, 0xf2, 0x9f, 0x01, 0x82, 0x0d, 0x56, 0x44, 0x88, 0xc8, 0x35, 0xec, 0x1f, 0x11, 0xb3, 0x24, 0xe0, 0x59, 0x0d, 0x37, 0xe4, 0x47, 0x3c, + 0xea, 0x4b, 0x7f, 0x97, 0x31, 0x1c, 0x81, 0x7c, 0x94, 0x8a, 0x4c, 0x7d, 0x68, 0x15, 0x84, 0xff, 0xa5, 0x08, 0xfd, 0x18, 0xe7, 0xe7, 0x2b, 0xe4, 0x47, 0x27, 0x12, 0x11, 0xb8, + 0x23, 0xec, 0x58, 0x93, 0x3c, 0xac, 0x12, 0xd2, 0x88, 0x6d, 0x41, 0x3d, 0xc5, 0xfe, 0x1c, 0xdc, 0xb9, 0xf8, 0xd4, 0x51, 0x3e, 0x07, 0xe5, 0x03, 0x6f, 0xa7, 0x12, 0xe8, 0x12, + 0xf7, 0xb5, 0xce, 0xa6, 0x96, 0x55, 0x3f, 0x78, 0xb4, 0x64, 0x82, 0x50, 0xd2, 0x33, 0x5f, 0x91, 0x02, 0x03, 0x01, 0x00, 0x01 +]); -export const SERVICE_CERTIFICATE_CHALLENGE = new Uint8Array([0x08, 0x04]) +export const SERVICE_CERTIFICATE_CHALLENGE = new Uint8Array([0x08, 0x04]); const COMMON_SERVICE_CERTIFICATE = new Uint8Array([ - 0x08, 0x05, 0x12, 0xc7, 0x05, 0x0a, 0xc1, 0x02, 0x08, 0x03, 0x12, 0x10, 0x17, 0x05, 0xb9, 0x17, 0xcc, 0x12, 0x04, 0x86, 0x8b, 0x06, 0x33, 0x3a, 0x2f, 0x77, 0x2a, 0x8c, 0x18, - 0x82, 0xb4, 0x82, 0x92, 0x05, 0x22, 0x8e, 0x02, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x99, 0xed, 0x5b, 0x3b, 0x32, 0x7d, 0xab, 0x5e, 0x24, 0xef, 0xc3, 0xb6, - 0x2a, 0x95, 0xb5, 0x98, 0x52, 0x0a, 0xd5, 0xbc, 0xcb, 0x37, 0x50, 0x3e, 0x06, 0x45, 0xb8, 0x14, 0xd8, 0x76, 0xb8, 0xdf, 0x40, 0x51, 0x04, 0x41, 0xad, 0x8c, 0xe3, 0xad, 0xb1, - 0x1b, 0xb8, 0x8c, 0x4e, 0x72, 0x5a, 0x5e, 0x4a, 0x9e, 0x07, 0x95, 0x29, 0x1d, 0x58, 0x58, 0x40, 0x23, 0xa7, 0xe1, 0xaf, 0x0e, 0x38, 0xa9, 0x12, 0x79, 0x39, 0x30, 0x08, 0x61, - 0x0b, 0x6f, 0x15, 0x8c, 0x87, 0x8c, 0x7e, 0x21, 0xbf, 0xfb, 0xfe, 0xea, 0x77, 0xe1, 0x01, 0x9e, 0x1e, 0x57, 0x81, 0xe8, 0xa4, 0x5f, 0x46, 0x26, 0x3d, 0x14, 0xe6, 0x0e, 0x80, - 0x58, 0xa8, 0x60, 0x7a, 0xdc, 0xe0, 0x4f, 0xac, 0x84, 0x57, 0xb1, 0x37, 0xa8, 0xd6, 0x7c, 0xcd, 0xeb, 0x33, 0x70, 0x5d, 0x98, 0x3a, 0x21, 0xfb, 0x4e, 0xec, 0xbd, 0x4a, 0x10, - 0xca, 0x47, 0x49, 0x0c, 0xa4, 0x7e, 0xaa, 0x5d, 0x43, 0x82, 0x18, 0xdd, 0xba, 0xf1, 0xca, 0xde, 0x33, 0x92, 0xf1, 0x3d, 0x6f, 0xfb, 0x64, 0x42, 0xfd, 0x31, 0xe1, 0xbf, 0x40, - 0xb0, 0xc6, 0x04, 0xd1, 0xc4, 0xba, 0x4c, 0x95, 0x20, 0xa4, 0xbf, 0x97, 0xee, 0xbd, 0x60, 0x92, 0x9a, 0xfc, 0xee, 0xf5, 0x5b, 0xba, 0xf5, 0x64, 0xe2, 0xd0, 0xe7, 0x6c, 0xd7, - 0xc5, 0x5c, 0x73, 0xa0, 0x82, 0xb9, 0x96, 0x12, 0x0b, 0x83, 0x59, 0xed, 0xce, 0x24, 0x70, 0x70, 0x82, 0x68, 0x0d, 0x6f, 0x67, 0xc6, 0xd8, 0x2c, 0x4a, 0xc5, 0xf3, 0x13, 0x44, - 0x90, 0xa7, 0x4e, 0xec, 0x37, 0xaf, 0x4b, 0x2f, 0x01, 0x0c, 0x59, 0xe8, 0x28, 0x43, 0xe2, 0x58, 0x2f, 0x0b, 0x6b, 0x9f, 0x5d, 0xb0, 0xfc, 0x5e, 0x6e, 0xdf, 0x64, 0xfb, 0xd3, - 0x08, 0xb4, 0x71, 0x1b, 0xcf, 0x12, 0x50, 0x01, 0x9c, 0x9f, 0x5a, 0x09, 0x02, 0x03, 0x01, 0x00, 0x01, 0x3a, 0x14, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x77, 0x69, - 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x12, 0x80, 0x03, 0xae, 0x34, 0x73, 0x14, 0xb5, 0xa8, 0x35, 0x29, 0x7f, 0x27, 0x13, 0x88, 0xfb, 0x7b, 0xb8, 0xcb, - 0x52, 0x77, 0xd2, 0x49, 0x82, 0x3c, 0xdd, 0xd1, 0xda, 0x30, 0xb9, 0x33, 0x39, 0x51, 0x1e, 0xb3, 0xcc, 0xbd, 0xea, 0x04, 0xb9, 0x44, 0xb9, 0x27, 0xc1, 0x21, 0x34, 0x6e, 0xfd, - 0xbd, 0xea, 0xc9, 0xd4, 0x13, 0x91, 0x7e, 0x6e, 0xc1, 0x76, 0xa1, 0x04, 0x38, 0x46, 0x0a, 0x50, 0x3b, 0xc1, 0x95, 0x2b, 0x9b, 0xa4, 0xe4, 0xce, 0x0f, 0xc4, 0xbf, 0xc2, 0x0a, - 0x98, 0x08, 0xaa, 0xaf, 0x4b, 0xfc, 0xd1, 0x9c, 0x1d, 0xcf, 0xcd, 0xf5, 0x74, 0xcc, 0xac, 0x28, 0xd1, 0xb4, 0x10, 0x41, 0x6c, 0xf9, 0xde, 0x88, 0x04, 0x30, 0x1c, 0xbd, 0xb3, - 0x34, 0xca, 0xfc, 0xd0, 0xd4, 0x09, 0x78, 0x42, 0x3a, 0x64, 0x2e, 0x54, 0x61, 0x3d, 0xf0, 0xaf, 0xcf, 0x96, 0xca, 0x4a, 0x92, 0x49, 0xd8, 0x55, 0xe4, 0x2b, 0x3a, 0x70, 0x3e, - 0xf1, 0x76, 0x7f, 0x6a, 0x9b, 0xd3, 0x6d, 0x6b, 0xf8, 0x2b, 0xe7, 0x6b, 0xbf, 0x0c, 0xba, 0x4f, 0xde, 0x59, 0xd2, 0xab, 0xcc, 0x76, 0xfe, 0xb6, 0x42, 0x47, 0xb8, 0x5c, 0x43, - 0x1f, 0xbc, 0xa5, 0x22, 0x66, 0xb6, 0x19, 0xfc, 0x36, 0x97, 0x95, 0x43, 0xfc, 0xa9, 0xcb, 0xbd, 0xbb, 0xfa, 0xfa, 0x0e, 0x1a, 0x55, 0xe7, 0x55, 0xa3, 0xc7, 0xbc, 0xe6, 0x55, - 0xf9, 0x64, 0x6f, 0x58, 0x2a, 0xb9, 0xcf, 0x70, 0xaa, 0x08, 0xb9, 0x79, 0xf8, 0x67, 0xf6, 0x3a, 0x0b, 0x2b, 0x7f, 0xdb, 0x36, 0x2c, 0x5b, 0xc4, 0xec, 0xd5, 0x55, 0xd8, 0x5b, - 0xca, 0xa9, 0xc5, 0x93, 0xc3, 0x83, 0xc8, 0x57, 0xd4, 0x9d, 0xaa, 0xb7, 0x7e, 0x40, 0xb7, 0x85, 0x1d, 0xdf, 0xd2, 0x49, 0x98, 0x80, 0x8e, 0x35, 0xb2, 0x58, 0xe7, 0x5d, 0x78, - 0xea, 0xc0, 0xca, 0x16, 0xf7, 0x04, 0x73, 0x04, 0xc2, 0x0d, 0x93, 0xed, 0xe4, 0xe8, 0xff, 0x1c, 0x6f, 0x17, 0xe6, 0x24, 0x3e, 0x3f, 0x3d, 0xa8, 0xfc, 0x17, 0x09, 0x87, 0x0e, - 0xc4, 0x5f, 0xba, 0x82, 0x3a, 0x26, 0x3f, 0x0c, 0xef, 0xa1, 0xf7, 0x09, 0x3b, 0x19, 0x09, 0x92, 0x83, 0x26, 0x33, 0x37, 0x05, 0x04, 0x3a, 0x29, 0xbd, 0xa6, 0xf9, 0xb4, 0x34, - 0x2c, 0xc8, 0xdf, 0x54, 0x3c, 0xb1, 0xa1, 0x18, 0x2f, 0x7c, 0x5f, 0xff, 0x33, 0xf1, 0x04, 0x90, 0xfa, 0xca, 0x5b, 0x25, 0x36, 0x0b, 0x76, 0x01, 0x5e, 0x9c, 0x5a, 0x06, 0xab, - 0x8e, 0xe0, 0x2f, 0x00, 0xd2, 0xe8, 0xd5, 0x98, 0x61, 0x04, 0xaa, 0xcc, 0x4d, 0xd4, 0x75, 0xfd, 0x96, 0xee, 0x9c, 0xe4, 0xe3, 0x26, 0xf2, 0x1b, 0x83, 0xc7, 0x05, 0x85, 0x77, - 0xb3, 0x87, 0x32, 0xcd, 0xda, 0xbc, 0x6a, 0x6b, 0xed, 0x13, 0xfb, 0x0d, 0x49, 0xd3, 0x8a, 0x45, 0xeb, 0x87, 0xa5, 0xf4 -]) + 0x08, 0x05, 0x12, 0xc7, 0x05, 0x0a, 0xc1, 0x02, 0x08, 0x03, 0x12, 0x10, 0x17, 0x05, 0xb9, 0x17, 0xcc, 0x12, 0x04, 0x86, 0x8b, 0x06, 0x33, 0x3a, 0x2f, 0x77, 0x2a, 0x8c, 0x18, + 0x82, 0xb4, 0x82, 0x92, 0x05, 0x22, 0x8e, 0x02, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x99, 0xed, 0x5b, 0x3b, 0x32, 0x7d, 0xab, 0x5e, 0x24, 0xef, 0xc3, 0xb6, + 0x2a, 0x95, 0xb5, 0x98, 0x52, 0x0a, 0xd5, 0xbc, 0xcb, 0x37, 0x50, 0x3e, 0x06, 0x45, 0xb8, 0x14, 0xd8, 0x76, 0xb8, 0xdf, 0x40, 0x51, 0x04, 0x41, 0xad, 0x8c, 0xe3, 0xad, 0xb1, + 0x1b, 0xb8, 0x8c, 0x4e, 0x72, 0x5a, 0x5e, 0x4a, 0x9e, 0x07, 0x95, 0x29, 0x1d, 0x58, 0x58, 0x40, 0x23, 0xa7, 0xe1, 0xaf, 0x0e, 0x38, 0xa9, 0x12, 0x79, 0x39, 0x30, 0x08, 0x61, + 0x0b, 0x6f, 0x15, 0x8c, 0x87, 0x8c, 0x7e, 0x21, 0xbf, 0xfb, 0xfe, 0xea, 0x77, 0xe1, 0x01, 0x9e, 0x1e, 0x57, 0x81, 0xe8, 0xa4, 0x5f, 0x46, 0x26, 0x3d, 0x14, 0xe6, 0x0e, 0x80, + 0x58, 0xa8, 0x60, 0x7a, 0xdc, 0xe0, 0x4f, 0xac, 0x84, 0x57, 0xb1, 0x37, 0xa8, 0xd6, 0x7c, 0xcd, 0xeb, 0x33, 0x70, 0x5d, 0x98, 0x3a, 0x21, 0xfb, 0x4e, 0xec, 0xbd, 0x4a, 0x10, + 0xca, 0x47, 0x49, 0x0c, 0xa4, 0x7e, 0xaa, 0x5d, 0x43, 0x82, 0x18, 0xdd, 0xba, 0xf1, 0xca, 0xde, 0x33, 0x92, 0xf1, 0x3d, 0x6f, 0xfb, 0x64, 0x42, 0xfd, 0x31, 0xe1, 0xbf, 0x40, + 0xb0, 0xc6, 0x04, 0xd1, 0xc4, 0xba, 0x4c, 0x95, 0x20, 0xa4, 0xbf, 0x97, 0xee, 0xbd, 0x60, 0x92, 0x9a, 0xfc, 0xee, 0xf5, 0x5b, 0xba, 0xf5, 0x64, 0xe2, 0xd0, 0xe7, 0x6c, 0xd7, + 0xc5, 0x5c, 0x73, 0xa0, 0x82, 0xb9, 0x96, 0x12, 0x0b, 0x83, 0x59, 0xed, 0xce, 0x24, 0x70, 0x70, 0x82, 0x68, 0x0d, 0x6f, 0x67, 0xc6, 0xd8, 0x2c, 0x4a, 0xc5, 0xf3, 0x13, 0x44, + 0x90, 0xa7, 0x4e, 0xec, 0x37, 0xaf, 0x4b, 0x2f, 0x01, 0x0c, 0x59, 0xe8, 0x28, 0x43, 0xe2, 0x58, 0x2f, 0x0b, 0x6b, 0x9f, 0x5d, 0xb0, 0xfc, 0x5e, 0x6e, 0xdf, 0x64, 0xfb, 0xd3, + 0x08, 0xb4, 0x71, 0x1b, 0xcf, 0x12, 0x50, 0x01, 0x9c, 0x9f, 0x5a, 0x09, 0x02, 0x03, 0x01, 0x00, 0x01, 0x3a, 0x14, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x77, 0x69, + 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x12, 0x80, 0x03, 0xae, 0x34, 0x73, 0x14, 0xb5, 0xa8, 0x35, 0x29, 0x7f, 0x27, 0x13, 0x88, 0xfb, 0x7b, 0xb8, 0xcb, + 0x52, 0x77, 0xd2, 0x49, 0x82, 0x3c, 0xdd, 0xd1, 0xda, 0x30, 0xb9, 0x33, 0x39, 0x51, 0x1e, 0xb3, 0xcc, 0xbd, 0xea, 0x04, 0xb9, 0x44, 0xb9, 0x27, 0xc1, 0x21, 0x34, 0x6e, 0xfd, + 0xbd, 0xea, 0xc9, 0xd4, 0x13, 0x91, 0x7e, 0x6e, 0xc1, 0x76, 0xa1, 0x04, 0x38, 0x46, 0x0a, 0x50, 0x3b, 0xc1, 0x95, 0x2b, 0x9b, 0xa4, 0xe4, 0xce, 0x0f, 0xc4, 0xbf, 0xc2, 0x0a, + 0x98, 0x08, 0xaa, 0xaf, 0x4b, 0xfc, 0xd1, 0x9c, 0x1d, 0xcf, 0xcd, 0xf5, 0x74, 0xcc, 0xac, 0x28, 0xd1, 0xb4, 0x10, 0x41, 0x6c, 0xf9, 0xde, 0x88, 0x04, 0x30, 0x1c, 0xbd, 0xb3, + 0x34, 0xca, 0xfc, 0xd0, 0xd4, 0x09, 0x78, 0x42, 0x3a, 0x64, 0x2e, 0x54, 0x61, 0x3d, 0xf0, 0xaf, 0xcf, 0x96, 0xca, 0x4a, 0x92, 0x49, 0xd8, 0x55, 0xe4, 0x2b, 0x3a, 0x70, 0x3e, + 0xf1, 0x76, 0x7f, 0x6a, 0x9b, 0xd3, 0x6d, 0x6b, 0xf8, 0x2b, 0xe7, 0x6b, 0xbf, 0x0c, 0xba, 0x4f, 0xde, 0x59, 0xd2, 0xab, 0xcc, 0x76, 0xfe, 0xb6, 0x42, 0x47, 0xb8, 0x5c, 0x43, + 0x1f, 0xbc, 0xa5, 0x22, 0x66, 0xb6, 0x19, 0xfc, 0x36, 0x97, 0x95, 0x43, 0xfc, 0xa9, 0xcb, 0xbd, 0xbb, 0xfa, 0xfa, 0x0e, 0x1a, 0x55, 0xe7, 0x55, 0xa3, 0xc7, 0xbc, 0xe6, 0x55, + 0xf9, 0x64, 0x6f, 0x58, 0x2a, 0xb9, 0xcf, 0x70, 0xaa, 0x08, 0xb9, 0x79, 0xf8, 0x67, 0xf6, 0x3a, 0x0b, 0x2b, 0x7f, 0xdb, 0x36, 0x2c, 0x5b, 0xc4, 0xec, 0xd5, 0x55, 0xd8, 0x5b, + 0xca, 0xa9, 0xc5, 0x93, 0xc3, 0x83, 0xc8, 0x57, 0xd4, 0x9d, 0xaa, 0xb7, 0x7e, 0x40, 0xb7, 0x85, 0x1d, 0xdf, 0xd2, 0x49, 0x98, 0x80, 0x8e, 0x35, 0xb2, 0x58, 0xe7, 0x5d, 0x78, + 0xea, 0xc0, 0xca, 0x16, 0xf7, 0x04, 0x73, 0x04, 0xc2, 0x0d, 0x93, 0xed, 0xe4, 0xe8, 0xff, 0x1c, 0x6f, 0x17, 0xe6, 0x24, 0x3e, 0x3f, 0x3d, 0xa8, 0xfc, 0x17, 0x09, 0x87, 0x0e, + 0xc4, 0x5f, 0xba, 0x82, 0x3a, 0x26, 0x3f, 0x0c, 0xef, 0xa1, 0xf7, 0x09, 0x3b, 0x19, 0x09, 0x92, 0x83, 0x26, 0x33, 0x37, 0x05, 0x04, 0x3a, 0x29, 0xbd, 0xa6, 0xf9, 0xb4, 0x34, + 0x2c, 0xc8, 0xdf, 0x54, 0x3c, 0xb1, 0xa1, 0x18, 0x2f, 0x7c, 0x5f, 0xff, 0x33, 0xf1, 0x04, 0x90, 0xfa, 0xca, 0x5b, 0x25, 0x36, 0x0b, 0x76, 0x01, 0x5e, 0x9c, 0x5a, 0x06, 0xab, + 0x8e, 0xe0, 0x2f, 0x00, 0xd2, 0xe8, 0xd5, 0x98, 0x61, 0x04, 0xaa, 0xcc, 0x4d, 0xd4, 0x75, 0xfd, 0x96, 0xee, 0x9c, 0xe4, 0xe3, 0x26, 0xf2, 0x1b, 0x83, 0xc7, 0x05, 0x85, 0x77, + 0xb3, 0x87, 0x32, 0xcd, 0xda, 0xbc, 0x6a, 0x6b, 0xed, 0x13, 0xfb, 0x0d, 0x49, 0xd3, 0x8a, 0x45, 0xeb, 0x87, 0xa5, 0xf4 +]); export type KeyContainer = { - kid: string - key: string -} + kid: string; + key: string; +}; export type ContentDecryptionModule = { - privateKey: Buffer - identifierBlob: Buffer -} + privateKey: Buffer; + identifierBlob: Buffer; +}; export class Session { - private _devicePrivateKey: forge.pki.rsa.PrivateKey - private _identifierBlob: ClientIdentification - private _pssh: Buffer - private _rawLicenseRequest?: Buffer - private _serviceCertificate?: SignedDrmCertificate + private _devicePrivateKey: forge.pki.rsa.PrivateKey; + private _identifierBlob: ClientIdentification; + private _pssh: Buffer; + private _rawLicenseRequest?: Buffer; + private _serviceCertificate?: SignedDrmCertificate; - constructor(contentDecryptionModule: ContentDecryptionModule, pssh: Buffer) { - this._devicePrivateKey = forge.pki.privateKeyFromPem(contentDecryptionModule.privateKey.toString('binary')) + constructor(contentDecryptionModule: ContentDecryptionModule, pssh: Buffer) { + this._devicePrivateKey = forge.pki.privateKeyFromPem(contentDecryptionModule.privateKey.toString('binary')); - this._identifierBlob = fromBinary(ClientIdentificationSchema, contentDecryptionModule.identifierBlob) - this._pssh = pssh + this._identifierBlob = fromBinary(ClientIdentificationSchema, contentDecryptionModule.identifierBlob); + this._pssh = pssh; + } + + async setDefaultServiceCertificate() { + await this.setServiceCertificate(Buffer.from(COMMON_SERVICE_CERTIFICATE)); + } + + async setServiceCertificateFromMessage(rawSignedMessage: Buffer) { + const signedMessage: SignedMessage = fromBinary(SignedMessageSchema, rawSignedMessage); + if (!signedMessage.msg) { + throw new Error('the service certificate message does not contain a message'); + } + await this.setServiceCertificate(Buffer.from(signedMessage.msg)); + } + + async setServiceCertificate(serviceCertificate: Buffer) { + const signedServiceCertificate: SignedDrmCertificate = fromBinary(SignedDrmCertificateSchema, serviceCertificate); + if (!(await this._verifyServiceCertificate(signedServiceCertificate))) { + throw new Error('Service certificate is not signed by the Widevine root certificate'); + } + this._serviceCertificate = signedServiceCertificate; + } + + createLicenseRequest(licenseType: LicenseType = LicenseType.STREAMING, android: boolean = false): Buffer { + if (!this._pssh.subarray(12, 28).equals(Buffer.from(WIDEVINE_SYSTEM_ID))) { + throw new Error('the pssh is not an actuall pssh'); } - async setDefaultServiceCertificate() { - await this.setServiceCertificate(Buffer.from(COMMON_SERVICE_CERTIFICATE)) + const pssh = this._parsePSSH(this._pssh); + if (!pssh) { + throw new Error('pssh is invalid'); } - async setServiceCertificateFromMessage(rawSignedMessage: Buffer) { - const signedMessage: SignedMessage = fromBinary(SignedMessageSchema, rawSignedMessage) - if (!signedMessage.msg) { - throw new Error('the service certificate message does not contain a message') + const licenseRequest: LicenseRequest = create(LicenseRequestSchema, { + type: LicenseRequest_RequestType.NEW, + contentId: create(LicenseRequest_ContentIdentificationSchema, { + contentIdVariant: { + case: 'widevinePsshData', + value: create(LicenseRequest_ContentIdentification_WidevinePsshDataSchema, { + psshData: [this._pssh.subarray(32)], + licenseType: licenseType, + requestId: android ? this._generateAndroidIdentifier() : this._generateGenericIdentifier() + }) } - await this.setServiceCertificate(Buffer.from(signedMessage.msg)) + }), + requestTime: BigInt(Date.now()) / BigInt(1000), + protocolVersion: ProtocolVersion.VERSION_2_1, + keyControlNonce: Math.floor(Math.random() * 2 ** 31) + }); + + if (this._serviceCertificate) { + const encryptedClientIdentification = this._encryptClientIdentification(this._identifierBlob, this._serviceCertificate); + licenseRequest.encryptedClientId = encryptedClientIdentification; + } else { + licenseRequest.clientId = this._identifierBlob; } - async setServiceCertificate(serviceCertificate: Buffer) { - const signedServiceCertificate: SignedDrmCertificate = fromBinary(SignedDrmCertificateSchema, serviceCertificate) - if (!(await this._verifyServiceCertificate(signedServiceCertificate))) { - throw new Error('Service certificate is not signed by the Widevine root certificate') - } - this._serviceCertificate = signedServiceCertificate + this._rawLicenseRequest = Buffer.from(toBinary(LicenseRequestSchema, licenseRequest)); + + const pss: forge.pss.PSS = forge.pss.create({ md: forge.md.sha1.create(), mgf: forge.mgf.mgf1.create(forge.md.sha1.create()), saltLength: 20 }); + const md = forge.md.sha1.create(); + md.update(this._rawLicenseRequest.toString('binary'), 'raw'); + const signature = Buffer.from(this._devicePrivateKey.sign(md, pss), 'binary'); + + const signedLicenseRequest: SignedMessage = create(SignedMessageSchema, { + type: SignedMessage_MessageType.LICENSE_REQUEST, + msg: this._rawLicenseRequest, + signature: signature + }); + + return Buffer.from(toBinary(SignedMessageSchema, signedLicenseRequest)); + } + + parseLicense(rawLicense: Buffer) { + if (!this._rawLicenseRequest) { + throw new Error('please request a license first'); } - createLicenseRequest(licenseType: LicenseType = LicenseType.STREAMING, android: boolean = false): Buffer { - if (!this._pssh.subarray(12, 28).equals(Buffer.from(WIDEVINE_SYSTEM_ID))) { - throw new Error('the pssh is not an actuall pssh') - } - - const pssh = this._parsePSSH(this._pssh) - if (!pssh) { - throw new Error('pssh is invalid') - } - - const licenseRequest: LicenseRequest = create(LicenseRequestSchema, { - type: LicenseRequest_RequestType.NEW, - contentId: create(LicenseRequest_ContentIdentificationSchema, { - contentIdVariant: { - case: 'widevinePsshData', - value: create(LicenseRequest_ContentIdentification_WidevinePsshDataSchema, { - psshData: [this._pssh.subarray(32)], - licenseType: licenseType, - requestId: android ? this._generateAndroidIdentifier() : this._generateGenericIdentifier() - }) - } - }), - requestTime: BigInt(Date.now()) / BigInt(1000), - protocolVersion: ProtocolVersion.VERSION_2_1, - keyControlNonce: Math.floor(Math.random() * 2 ** 31) - }) - - if (this._serviceCertificate) { - const encryptedClientIdentification = this._encryptClientIdentification(this._identifierBlob, this._serviceCertificate) - licenseRequest.encryptedClientId = encryptedClientIdentification - } else { - licenseRequest.clientId = this._identifierBlob - } - - this._rawLicenseRequest = Buffer.from(toBinary(LicenseRequestSchema, licenseRequest)) - - const pss: forge.pss.PSS = forge.pss.create({ md: forge.md.sha1.create(), mgf: forge.mgf.mgf1.create(forge.md.sha1.create()), saltLength: 20 }) - const md = forge.md.sha1.create() - md.update(this._rawLicenseRequest.toString('binary'), 'raw') - const signature = Buffer.from(this._devicePrivateKey.sign(md, pss), 'binary') - - const signedLicenseRequest: SignedMessage = create(SignedMessageSchema, { - type: SignedMessage_MessageType.LICENSE_REQUEST, - msg: this._rawLicenseRequest, - signature: signature - }) - - return Buffer.from(toBinary(SignedMessageSchema, signedLicenseRequest)) + const signedLicense = fromBinary(SignedMessageSchema, rawLicense); + if (!signedLicense.sessionKey) { + throw new Error('the license does not contain a session key'); + } + if (!signedLicense.msg) { + throw new Error('the license does not contain a message'); + } + if (!signedLicense.signature) { + throw new Error('the license does not contain a signature'); } - parseLicense(rawLicense: Buffer) { - if (!this._rawLicenseRequest) { - throw new Error('please request a license first') - } + const sessionKey = this._devicePrivateKey.decrypt(Buffer.from(signedLicense.sessionKey).toString('binary'), 'RSA-OAEP', { + md: forge.md.sha1.create() + }); - const signedLicense = fromBinary(SignedMessageSchema, rawLicense) - if (!signedLicense.sessionKey) { - throw new Error('the license does not contain a session key') - } - if (!signedLicense.msg) { - throw new Error('the license does not contain a message') - } - if (!signedLicense.signature) { - throw new Error('the license does not contain a signature') - } + const cmac = new AES_CMAC(Buffer.from(sessionKey, 'binary')); - const sessionKey = this._devicePrivateKey.decrypt(Buffer.from(signedLicense.sessionKey).toString('binary'), 'RSA-OAEP', { - md: forge.md.sha1.create() - }) + const encKeyBase = Buffer.concat([Buffer.from('ENCRYPTION'), Buffer.from('\x00', 'ascii'), this._rawLicenseRequest, Buffer.from('\x00\x00\x00\x80', 'ascii')]); + const authKeyBase = Buffer.concat([Buffer.from('AUTHENTICATION'), Buffer.from('\x00', 'ascii'), this._rawLicenseRequest, Buffer.from('\x00\x00\x02\x00', 'ascii')]); - const cmac = new AES_CMAC(Buffer.from(sessionKey, 'binary')) - - const encKeyBase = Buffer.concat([Buffer.from('ENCRYPTION'), Buffer.from('\x00', 'ascii'), this._rawLicenseRequest, Buffer.from('\x00\x00\x00\x80', 'ascii')]) - const authKeyBase = Buffer.concat([Buffer.from('AUTHENTICATION'), Buffer.from('\x00', 'ascii'), this._rawLicenseRequest, Buffer.from('\x00\x00\x02\x00', 'ascii')]) - - const encKey = cmac.calculate(Buffer.concat([Buffer.from('\x01'), encKeyBase])) - const serverKey = Buffer.concat([cmac.calculate(Buffer.concat([Buffer.from('\x01'), authKeyBase])), cmac.calculate(Buffer.concat([Buffer.from('\x02'), authKeyBase]))]) - /*const clientKey = Buffer.concat([ + const encKey = cmac.calculate(Buffer.concat([Buffer.from('\x01'), encKeyBase])); + const serverKey = Buffer.concat([cmac.calculate(Buffer.concat([Buffer.from('\x01'), authKeyBase])), cmac.calculate(Buffer.concat([Buffer.from('\x02'), authKeyBase]))]); + /*const clientKey = Buffer.concat([ cmac.calculate(Buffer.concat([Buffer.from("\x03"), authKeyBase])), cmac.calculate(Buffer.concat([Buffer.from("\x04"), authKeyBase])) ]);*/ - const hmac = forge.hmac.create() - hmac.start(forge.md.sha256.create(), serverKey.toString('binary')) - hmac.update(Buffer.from(signedLicense.msg).toString('binary')) - const calculatedSignature = Buffer.from(hmac.digest().data, 'binary') + const hmac = forge.hmac.create(); + hmac.start(forge.md.sha256.create(), serverKey.toString('binary')); + hmac.update(Buffer.from(signedLicense.msg).toString('binary')); + const calculatedSignature = Buffer.from(hmac.digest().data, 'binary'); - if (!calculatedSignature.equals(signedLicense.signature)) { - throw new Error('signatures do not match') - } - - const license = fromBinary(LicenseSchema, signedLicense.msg) - - const keyContainers = license.key.map((keyContainer) => { - if (keyContainer.type && keyContainer.key && keyContainer.iv) { - const keyId = keyContainer.id ? Buffer.from(keyContainer.id).toString('hex') : '00000000000000000000000000000000' - const decipher = forge.cipher.createDecipher('AES-CBC', encKey.toString('binary')) - decipher.start({ iv: Buffer.from(keyContainer.iv).toString('binary') }) - decipher.update(forge.util.createBuffer(keyContainer.key)) - decipher.finish() - const decryptedKey = Buffer.from(decipher.output.data, 'binary') - const key: KeyContainer = { - kid: keyId, - key: decryptedKey.toString('hex') - } - return key - } - }) - if (keyContainers.filter((container) => !!container).length < 1) { - throw new Error('there was not a single valid key in the response') - } - return keyContainers + if (!calculatedSignature.equals(signedLicense.signature)) { + throw new Error('signatures do not match'); } - private _encryptClientIdentification(clientIdentification: ClientIdentification, signedServiceCertificate: SignedDrmCertificate): EncryptedClientIdentification { - if (!signedServiceCertificate.drmCertificate) { - throw new Error('the service certificate does not contain an actual certificate') - } + const license = fromBinary(LicenseSchema, signedLicense.msg); - const serviceCertificate = fromBinary(DrmCertificateSchema, signedServiceCertificate.drmCertificate) - if (!serviceCertificate.publicKey) { - throw new Error('the service certificate does not contain a public key') - } + const keyContainers = license.key.map((keyContainer) => { + if (keyContainer.type && keyContainer.key && keyContainer.iv) { + const keyId = keyContainer.id ? Buffer.from(keyContainer.id).toString('hex') : '00000000000000000000000000000000'; + const decipher = forge.cipher.createDecipher('AES-CBC', encKey.toString('binary')); + decipher.start({ iv: Buffer.from(keyContainer.iv).toString('binary') }); + decipher.update(forge.util.createBuffer(keyContainer.key)); + decipher.finish(); + const decryptedKey = Buffer.from(decipher.output.data, 'binary'); + const key: KeyContainer = { + kid: keyId, + key: decryptedKey.toString('hex') + }; + return key; + } + }); + if (keyContainers.filter((container) => !!container).length < 1) { + throw new Error('there was not a single valid key in the response'); + } + return keyContainers; + } - const key = forge.random.getBytesSync(16) - const iv = forge.random.getBytesSync(16) - const cipher = forge.cipher.createCipher('AES-CBC', key) - cipher.start({ iv: iv }) - cipher.update(forge.util.createBuffer(toBinary(ClientIdentificationSchema, clientIdentification))) - cipher.finish() - const rawEncryptedClientIdentification = Buffer.from(cipher.output.data, 'binary') - - const publicKey = forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(Buffer.from(serviceCertificate.publicKey).toString('binary'))) - const encryptedKey = publicKey.encrypt(key, 'RSA-OAEP', { md: forge.md.sha1.create() }) - - const encryptedClientIdentification: EncryptedClientIdentification = create(EncryptedClientIdentificationSchema, { - encryptedClientId: rawEncryptedClientIdentification, - encryptedClientIdIv: Buffer.from(iv, 'binary'), - encryptedPrivacyKey: Buffer.from(encryptedKey, 'binary'), - providerId: serviceCertificate.providerId, - serviceCertificateSerialNumber: serviceCertificate.serialNumber - }) - return encryptedClientIdentification + private _encryptClientIdentification(clientIdentification: ClientIdentification, signedServiceCertificate: SignedDrmCertificate): EncryptedClientIdentification { + if (!signedServiceCertificate.drmCertificate) { + throw new Error('the service certificate does not contain an actual certificate'); } - private async _verifyServiceCertificate(signedServiceCertificate: SignedDrmCertificate): Promise { - if (!signedServiceCertificate.drmCertificate) { - throw new Error('the service certificate does not contain an actual certificate') - } - if (!signedServiceCertificate.signature) { - throw new Error('the service certificate does not contain a signature') - } - - const publicKey = forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(Buffer.from(WIDEVINE_ROOT_PUBLIC_KEY).toString('binary'))) - const pss: forge.pss.PSS = forge.pss.create({ md: forge.md.sha1.create(), mgf: forge.mgf.mgf1.create(forge.md.sha1.create()), saltLength: 20 }) - const sha1 = forge.md.sha1.create() - sha1.update(Buffer.from(signedServiceCertificate.drmCertificate).toString('binary'), 'raw') - return publicKey.verify(sha1.digest().bytes(), Buffer.from(signedServiceCertificate.signature).toString('binary'), pss) + const serviceCertificate = fromBinary(DrmCertificateSchema, signedServiceCertificate.drmCertificate); + if (!serviceCertificate.publicKey) { + throw new Error('the service certificate does not contain a public key'); } - private _parsePSSH(pssh: Buffer): WidevinePsshData | null { - try { - return fromBinary(WidevinePsshDataSchema, pssh.subarray(32)) - } catch { - return null - } + const key = forge.random.getBytesSync(16); + const iv = forge.random.getBytesSync(16); + const cipher = forge.cipher.createCipher('AES-CBC', key); + cipher.start({ iv: iv }); + cipher.update(forge.util.createBuffer(toBinary(ClientIdentificationSchema, clientIdentification))); + cipher.finish(); + const rawEncryptedClientIdentification = Buffer.from(cipher.output.data, 'binary'); + + const publicKey = forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(Buffer.from(serviceCertificate.publicKey).toString('binary'))); + const encryptedKey = publicKey.encrypt(key, 'RSA-OAEP', { md: forge.md.sha1.create() }); + + const encryptedClientIdentification: EncryptedClientIdentification = create(EncryptedClientIdentificationSchema, { + encryptedClientId: rawEncryptedClientIdentification, + encryptedClientIdIv: Buffer.from(iv, 'binary'), + encryptedPrivacyKey: Buffer.from(encryptedKey, 'binary'), + providerId: serviceCertificate.providerId, + serviceCertificateSerialNumber: serviceCertificate.serialNumber + }); + return encryptedClientIdentification; + } + + private async _verifyServiceCertificate(signedServiceCertificate: SignedDrmCertificate): Promise { + if (!signedServiceCertificate.drmCertificate) { + throw new Error('the service certificate does not contain an actual certificate'); + } + if (!signedServiceCertificate.signature) { + throw new Error('the service certificate does not contain a signature'); } - private _generateAndroidIdentifier(): Buffer { - return Buffer.from(`${forge.util.bytesToHex(forge.random.getBytesSync(8))}${'01'}${'00000000000000'}`) - } + const publicKey = forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(Buffer.from(WIDEVINE_ROOT_PUBLIC_KEY).toString('binary'))); + const pss: forge.pss.PSS = forge.pss.create({ md: forge.md.sha1.create(), mgf: forge.mgf.mgf1.create(forge.md.sha1.create()), saltLength: 20 }); + const sha1 = forge.md.sha1.create(); + sha1.update(Buffer.from(signedServiceCertificate.drmCertificate).toString('binary'), 'raw'); + return publicKey.verify(sha1.digest().bytes(), Buffer.from(signedServiceCertificate.signature).toString('binary'), pss); + } - private _generateGenericIdentifier(): Buffer { - return Buffer.from(forge.random.getBytesSync(16), 'binary') + private _parsePSSH(pssh: Buffer): WidevinePsshData | null { + try { + return fromBinary(WidevinePsshDataSchema, pssh.subarray(32)); + } catch { + return null; } + } - get pssh(): Buffer { - return this._pssh - } + private _generateAndroidIdentifier(): Buffer { + return Buffer.from(`${forge.util.bytesToHex(forge.random.getBytesSync(8))}${'01'}${'00000000000000'}`); + } + + private _generateGenericIdentifier(): Buffer { + return Buffer.from(forge.random.getBytesSync(16), 'binary'); + } + + get pssh(): Buffer { + return this._pssh; + } } diff --git a/modules/widevine/license_protocol_pb3.ts b/modules/widevine/license_protocol_pb3.ts index 22aaae4..16227eb 100644 --- a/modules/widevine/license_protocol_pb3.ts +++ b/modules/widevine/license_protocol_pb3.ts @@ -2,18 +2,18 @@ // @generated from file license_protocol.proto (package license_protocol, syntax proto3) /* eslint-disable */ -import type { GenEnum, GenFile, GenMessage } from '@bufbuild/protobuf/codegenv1' -import { enumDesc, fileDesc, messageDesc } from '@bufbuild/protobuf/codegenv1' -import type { Message } from '@bufbuild/protobuf' +import type { GenEnum, GenFile, GenMessage } from '@bufbuild/protobuf/codegenv1'; +import { enumDesc, fileDesc, messageDesc } from '@bufbuild/protobuf/codegenv1'; +import type { Message } from '@bufbuild/protobuf'; /** * Describes the file license_protocol.proto. */ export const file_license_protocol: GenFile = - /*@__PURE__*/ - fileDesc( - 'ChZsaWNlbnNlX3Byb3RvY29sLnByb3RvEhBsaWNlbnNlX3Byb3RvY29sIq4CChVMaWNlbnNlSWRlbnRpZmljYXRpb24SFwoKcmVxdWVzdF9pZBgBIAEoDEgAiAEBEhcKCnNlc3Npb25faWQYAiABKAxIAYgBARIYCgtwdXJjaGFzZV9pZBgDIAEoDEgCiAEBEjAKBHR5cGUYBCABKA4yHS5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VUeXBlSAOIAQESFAoHdmVyc2lvbhgFIAEoBUgEiAEBEiMKFnByb3ZpZGVyX3Nlc3Npb25fdG9rZW4YBiABKAxIBYgBAUINCgtfcmVxdWVzdF9pZEINCgtfc2Vzc2lvbl9pZEIOCgxfcHVyY2hhc2VfaWRCBwoFX3R5cGVCCgoIX3ZlcnNpb25CGQoXX3Byb3ZpZGVyX3Nlc3Npb25fdG9rZW4izCAKB0xpY2Vuc2USOAoCaWQYASABKAsyJy5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VJZGVudGlmaWNhdGlvbkgAiAEBEjUKBnBvbGljeRgCIAEoCzIgLmxpY2Vuc2VfcHJvdG9jb2wuTGljZW5zZS5Qb2xpY3lIAYgBARIzCgNrZXkYAyADKAsyJi5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2UuS2V5Q29udGFpbmVyEh8KEmxpY2Vuc2Vfc3RhcnRfdGltZRgEIAEoA0gCiAEBEigKG3JlbW90ZV9hdHRlc3RhdGlvbl92ZXJpZmllZBgFIAEoCEgDiAEBEiIKFXByb3ZpZGVyX2NsaWVudF90b2tlbhgGIAEoDEgEiAEBEh4KEXByb3RlY3Rpb25fc2NoZW1lGAcgASgNSAWIAQESHAoPc3JtX3JlcXVpcmVtZW50GAggASgMSAaIAQESFwoKc3JtX3VwZGF0ZRgJIAEoDEgHiAEBElcKHHBsYXRmb3JtX3ZlcmlmaWNhdGlvbl9zdGF0dXMYCiABKA4yLC5saWNlbnNlX3Byb3RvY29sLlBsYXRmb3JtVmVyaWZpY2F0aW9uU3RhdHVzSAiIAQESEQoJZ3JvdXBfaWRzGAsgAygMGsoHCgZQb2xpY3kSFQoIY2FuX3BsYXkYASABKAhIAIgBARIYCgtjYW5fcGVyc2lzdBgCIAEoCEgBiAEBEhYKCWNhbl9yZW5ldxgDIAEoCEgCiAEBEiQKF3JlbnRhbF9kdXJhdGlvbl9zZWNvbmRzGAQgASgDSAOIAQESJgoZcGxheWJhY2tfZHVyYXRpb25fc2Vjb25kcxgFIAEoA0gEiAEBEiUKGGxpY2Vuc2VfZHVyYXRpb25fc2Vjb25kcxgGIAEoA0gFiAEBEi4KIXJlbmV3YWxfcmVjb3ZlcnlfZHVyYXRpb25fc2Vjb25kcxgHIAEoA0gGiAEBEh8KEnJlbmV3YWxfc2VydmVyX3VybBgIIAEoCUgHiAEBEiIKFXJlbmV3YWxfZGVsYXlfc2Vjb25kcxgJIAEoA0gIiAEBEisKHnJlbmV3YWxfcmV0cnlfaW50ZXJ2YWxfc2Vjb25kcxgKIAEoA0gJiAEBEh0KEHJlbmV3X3dpdGhfdXNhZ2UYCyABKAhICogBARIlChhhbHdheXNfaW5jbHVkZV9jbGllbnRfaWQYDCABKAhIC4gBARIsCh9wbGF5X3N0YXJ0X2dyYWNlX3BlcmlvZF9zZWNvbmRzGA0gASgDSAyIAQESKwoec29mdF9lbmZvcmNlX3BsYXliYWNrX2R1cmF0aW9uGA4gASgISA2IAQESKQocc29mdF9lbmZvcmNlX3JlbnRhbF9kdXJhdGlvbhgPIAEoCEgOiAEBQgsKCV9jYW5fcGxheUIOCgxfY2FuX3BlcnNpc3RCDAoKX2Nhbl9yZW5ld0IaChhfcmVudGFsX2R1cmF0aW9uX3NlY29uZHNCHAoaX3BsYXliYWNrX2R1cmF0aW9uX3NlY29uZHNCGwoZX2xpY2Vuc2VfZHVyYXRpb25fc2Vjb25kc0IkCiJfcmVuZXdhbF9yZWNvdmVyeV9kdXJhdGlvbl9zZWNvbmRzQhUKE19yZW5ld2FsX3NlcnZlcl91cmxCGAoWX3JlbmV3YWxfZGVsYXlfc2Vjb25kc0IhCh9fcmVuZXdhbF9yZXRyeV9pbnRlcnZhbF9zZWNvbmRzQhMKEV9yZW5ld193aXRoX3VzYWdlQhsKGV9hbHdheXNfaW5jbHVkZV9jbGllbnRfaWRCIgogX3BsYXlfc3RhcnRfZ3JhY2VfcGVyaW9kX3NlY29uZHNCIQofX3NvZnRfZW5mb3JjZV9wbGF5YmFja19kdXJhdGlvbkIfCh1fc29mdF9lbmZvcmNlX3JlbnRhbF9kdXJhdGlvbhreEwoMS2V5Q29udGFpbmVyEg8KAmlkGAEgASgMSACIAQESDwoCaXYYAiABKAxIAYgBARIQCgNrZXkYAyABKAxIAogBARJBCgR0eXBlGAQgASgOMi4ubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5LZXlUeXBlSAOIAQESSAoFbGV2ZWwYBSABKA4yNC5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2UuS2V5Q29udGFpbmVyLlNlY3VyaXR5TGV2ZWxIBIgBARJZChNyZXF1aXJlZF9wcm90ZWN0aW9uGAYgASgLMjcubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PdXRwdXRQcm90ZWN0aW9uSAWIAQESWgoUcmVxdWVzdGVkX3Byb3RlY3Rpb24YByABKAsyNy5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2UuS2V5Q29udGFpbmVyLk91dHB1dFByb3RlY3Rpb25IBogBARJLCgtrZXlfY29udHJvbBgIIAEoCzIxLmxpY2Vuc2VfcHJvdG9jb2wuTGljZW5zZS5LZXlDb250YWluZXIuS2V5Q29udHJvbEgHiAEBEnMKIG9wZXJhdG9yX3Nlc3Npb25fa2V5X3Blcm1pc3Npb25zGAkgASgLMkQubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PcGVyYXRvclNlc3Npb25LZXlQZXJtaXNzaW9uc0gIiAEBEmYKHHZpZGVvX3Jlc29sdXRpb25fY29uc3RyYWludHMYCiADKAsyQC5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2UuS2V5Q29udGFpbmVyLlZpZGVvUmVzb2x1dGlvbkNvbnN0cmFpbnQSJgoZYW50aV9yb2xsYmFja191c2FnZV90YWJsZRgLIAEoCEgJiAEBEhgKC3RyYWNrX2xhYmVsGAwgASgJSAqIAQEaWgoKS2V5Q29udHJvbBIeChFrZXlfY29udHJvbF9ibG9jaxgBIAEoDEgAiAEBEg8KAml2GAIgASgMSAGIAQFCFAoSX2tleV9jb250cm9sX2Jsb2NrQgUKA19pdhq7BQoQT3V0cHV0UHJvdGVjdGlvbhJPCgRoZGNwGAEgASgOMjwubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PdXRwdXRQcm90ZWN0aW9uLkhEQ1BIAIgBARJVCgpjZ21zX2ZsYWdzGAIgASgOMjwubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PdXRwdXRQcm90ZWN0aW9uLkNHTVNIAYgBARJfCg1oZGNwX3NybV9ydWxlGAMgASgOMkMubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PdXRwdXRQcm90ZWN0aW9uLkhkY3BTcm1SdWxlSAKIAQESIgoVZGlzYWJsZV9hbmFsb2dfb3V0cHV0GAQgASgISAOIAQESIwoWZGlzYWJsZV9kaWdpdGFsX291dHB1dBgFIAEoCEgEiAEBInkKBEhEQ1ASDQoJSERDUF9OT05FEAASCwoHSERDUF9WMRABEgsKB0hEQ1BfVjIQAhINCglIRENQX1YyXzEQAxINCglIRENQX1YyXzIQBBINCglIRENQX1YyXzMQBRIbChZIRENQX05PX0RJR0lUQUxfT1VUUFVUEP8BIkMKBENHTVMSDQoJQ09QWV9GUkVFEAASDQoJQ0dNU19OT05FECoSDQoJQ09QWV9PTkNFEAISDgoKQ09QWV9ORVZFUhADIjYKC0hkY3BTcm1SdWxlEhYKEkhEQ1BfU1JNX1JVTEVfTk9ORRAAEg8KC0NVUlJFTlRfU1JNEAFCBwoFX2hkY3BCDQoLX2NnbXNfZmxhZ3NCEAoOX2hkY3Bfc3JtX3J1bGVCGAoWX2Rpc2FibGVfYW5hbG9nX291dHB1dEIZChdfZGlzYWJsZV9kaWdpdGFsX291dHB1dBqKAgoZVmlkZW9SZXNvbHV0aW9uQ29uc3RyYWludBIiChVtaW5fcmVzb2x1dGlvbl9waXhlbHMYASABKA1IAIgBARIiChVtYXhfcmVzb2x1dGlvbl9waXhlbHMYAiABKA1IAYgBARJZChNyZXF1aXJlZF9wcm90ZWN0aW9uGAMgASgLMjcubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PdXRwdXRQcm90ZWN0aW9uSAKIAQFCGAoWX21pbl9yZXNvbHV0aW9uX3BpeGVsc0IYChZfbWF4X3Jlc29sdXRpb25fcGl4ZWxzQhYKFF9yZXF1aXJlZF9wcm90ZWN0aW9uGuMBCh1PcGVyYXRvclNlc3Npb25LZXlQZXJtaXNzaW9ucxIaCg1hbGxvd19lbmNyeXB0GAEgASgISACIAQESGgoNYWxsb3dfZGVjcnlwdBgCIAEoCEgBiAEBEhcKCmFsbG93X3NpZ24YAyABKAhIAogBARIjChZhbGxvd19zaWduYXR1cmVfdmVyaWZ5GAQgASgISAOIAQFCEAoOX2FsbG93X2VuY3J5cHRCEAoOX2FsbG93X2RlY3J5cHRCDQoLX2FsbG93X3NpZ25CGQoXX2FsbG93X3NpZ25hdHVyZV92ZXJpZnkihAEKB0tleVR5cGUSFgoSS0VZVFlQRV9VTlZFUklGSUVEEAASCwoHU0lHTklORxABEgsKB0NPTlRFTlQQAhIPCgtLRVlfQ09OVFJPTBADEhQKEE9QRVJBVE9SX1NFU1NJT04QBBIPCgtFTlRJVExFTUVOVBAFEg8KC09FTV9DT05URU5UEAYimAEKDVNlY3VyaXR5TGV2ZWwSHAoYU0VDVVJJVFlMRVZFTF9VTlZFUklGSUVEEAASFAoQU1dfU0VDVVJFX0NSWVBUTxABEhQKEFNXX1NFQ1VSRV9ERUNPREUQAhIUChBIV19TRUNVUkVfQ1JZUFRPEAMSFAoQSFdfU0VDVVJFX0RFQ09ERRAEEhEKDUhXX1NFQ1VSRV9BTEwQBUIFCgNfaWRCBQoDX2l2QgYKBF9rZXlCBwoFX3R5cGVCCAoGX2xldmVsQhYKFF9yZXF1aXJlZF9wcm90ZWN0aW9uQhcKFV9yZXF1ZXN0ZWRfcHJvdGVjdGlvbkIOCgxfa2V5X2NvbnRyb2xCIwohX29wZXJhdG9yX3Nlc3Npb25fa2V5X3Blcm1pc3Npb25zQhwKGl9hbnRpX3JvbGxiYWNrX3VzYWdlX3RhYmxlQg4KDF90cmFja19sYWJlbEIFCgNfaWRCCQoHX3BvbGljeUIVChNfbGljZW5zZV9zdGFydF90aW1lQh4KHF9yZW1vdGVfYXR0ZXN0YXRpb25fdmVyaWZpZWRCGAoWX3Byb3ZpZGVyX2NsaWVudF90b2tlbkIUChJfcHJvdGVjdGlvbl9zY2hlbWVCEgoQX3NybV9yZXF1aXJlbWVudEINCgtfc3JtX3VwZGF0ZUIfCh1fcGxhdGZvcm1fdmVyaWZpY2F0aW9uX3N0YXR1cyLAEAoOTGljZW5zZVJlcXVlc3QSPgoJY2xpZW50X2lkGAEgASgLMiYubGljZW5zZV9wcm90b2NvbC5DbGllbnRJZGVudGlmaWNhdGlvbkgAiAEBEk8KCmNvbnRlbnRfaWQYAiABKAsyNi5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VSZXF1ZXN0LkNvbnRlbnRJZGVudGlmaWNhdGlvbkgBiAEBEj8KBHR5cGUYAyABKA4yLC5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VSZXF1ZXN0LlJlcXVlc3RUeXBlSAKIAQESGQoMcmVxdWVzdF90aW1lGAQgASgDSAOIAQESKQoca2V5X2NvbnRyb2xfbm9uY2VfZGVwcmVjYXRlZBgFIAEoDEgEiAEBEkAKEHByb3RvY29sX3ZlcnNpb24YBiABKA4yIS5saWNlbnNlX3Byb3RvY29sLlByb3RvY29sVmVyc2lvbkgFiAEBEh4KEWtleV9jb250cm9sX25vbmNlGAcgASgNSAaIAQESUQoTZW5jcnlwdGVkX2NsaWVudF9pZBgIIAEoCzIvLmxpY2Vuc2VfcHJvdG9jb2wuRW5jcnlwdGVkQ2xpZW50SWRlbnRpZmljYXRpb25IB4gBARr3CgoVQ29udGVudElkZW50aWZpY2F0aW9uEmUKEndpZGV2aW5lX3Bzc2hfZGF0YRgBIAEoCzJHLmxpY2Vuc2VfcHJvdG9jb2wuTGljZW5zZVJlcXVlc3QuQ29udGVudElkZW50aWZpY2F0aW9uLldpZGV2aW5lUHNzaERhdGFIABJXCgt3ZWJtX2tleV9pZBgCIAEoCzJALmxpY2Vuc2VfcHJvdG9jb2wuTGljZW5zZVJlcXVlc3QuQ29udGVudElkZW50aWZpY2F0aW9uLldlYm1LZXlJZEgAEmIKEGV4aXN0aW5nX2xpY2Vuc2UYAyABKAsyRi5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VSZXF1ZXN0LkNvbnRlbnRJZGVudGlmaWNhdGlvbi5FeGlzdGluZ0xpY2Vuc2VIABJUCglpbml0X2RhdGEYBCABKAsyPy5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VSZXF1ZXN0LkNvbnRlbnRJZGVudGlmaWNhdGlvbi5Jbml0RGF0YUgAGpgBChBXaWRldmluZVBzc2hEYXRhEhEKCXBzc2hfZGF0YRgBIAMoDBI4CgxsaWNlbnNlX3R5cGUYAiABKA4yHS5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VUeXBlSACIAQESFwoKcmVxdWVzdF9pZBgDIAEoDEgBiAEBQg8KDV9saWNlbnNlX3R5cGVCDQoLX3JlcXVlc3RfaWQangEKCVdlYm1LZXlJZBITCgZoZWFkZXIYASABKAxIAIgBARI4CgxsaWNlbnNlX3R5cGUYAiABKA4yHS5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VUeXBlSAGIAQESFwoKcmVxdWVzdF9pZBgDIAEoDEgCiAEBQgkKB19oZWFkZXJCDwoNX2xpY2Vuc2VfdHlwZUINCgtfcmVxdWVzdF9pZBqsAgoPRXhpc3RpbmdMaWNlbnNlEkAKCmxpY2Vuc2VfaWQYASABKAsyJy5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VJZGVudGlmaWNhdGlvbkgAiAEBEiIKFXNlY29uZHNfc2luY2Vfc3RhcnRlZBgCIAEoA0gBiAEBEiYKGXNlY29uZHNfc2luY2VfbGFzdF9wbGF5ZWQYAyABKANIAogBARImChlzZXNzaW9uX3VzYWdlX3RhYmxlX2VudHJ5GAQgASgMSAOIAQFCDQoLX2xpY2Vuc2VfaWRCGAoWX3NlY29uZHNfc2luY2Vfc3RhcnRlZEIcChpfc2Vjb25kc19zaW5jZV9sYXN0X3BsYXllZEIcChpfc2Vzc2lvbl91c2FnZV90YWJsZV9lbnRyeRriAgoISW5pdERhdGESaQoOaW5pdF9kYXRhX3R5cGUYASABKA4yTC5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VSZXF1ZXN0LkNvbnRlbnRJZGVudGlmaWNhdGlvbi5Jbml0RGF0YS5Jbml0RGF0YVR5cGVIAIgBARIWCglpbml0X2RhdGEYAiABKAxIAYgBARI4CgxsaWNlbnNlX3R5cGUYAyABKA4yHS5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VUeXBlSAKIAQESFwoKcmVxdWVzdF9pZBgEIAEoDEgDiAEBIj8KDEluaXREYXRhVHlwZRIbChdJTklUREFUQVRZUEVfVU5WRVJJRklFRBAAEggKBENFTkMQARIICgRXRUJNEAJCEQoPX2luaXRfZGF0YV90eXBlQgwKCl9pbml0X2RhdGFCDwoNX2xpY2Vuc2VfdHlwZUINCgtfcmVxdWVzdF9pZEIUChJjb250ZW50X2lkX3ZhcmlhbnQiTAoLUmVxdWVzdFR5cGUSGgoWUkVRVUVTVFRZUEVfVU5WRVJJRklFRBAAEgcKA05FVxABEgsKB1JFTkVXQUwQAhILCgdSRUxFQVNFEANCDAoKX2NsaWVudF9pZEINCgtfY29udGVudF9pZEIHCgVfdHlwZUIPCg1fcmVxdWVzdF90aW1lQh8KHV9rZXlfY29udHJvbF9ub25jZV9kZXByZWNhdGVkQhMKEV9wcm90b2NvbF92ZXJzaW9uQhQKEl9rZXlfY29udHJvbF9ub25jZUIWChRfZW5jcnlwdGVkX2NsaWVudF9pZCKmAgoKTWV0cmljRGF0YRIXCgpzdGFnZV9uYW1lGAEgASgJSACIAQESOwoLbWV0cmljX2RhdGEYAiADKAsyJi5saWNlbnNlX3Byb3RvY29sLk1ldHJpY0RhdGEuVHlwZVZhbHVlGm4KCVR5cGVWYWx1ZRI6CgR0eXBlGAEgASgOMicubGljZW5zZV9wcm90b2NvbC5NZXRyaWNEYXRhLk1ldHJpY1R5cGVIAIgBARISCgV2YWx1ZRgCIAEoA0gBiAEBQgcKBV90eXBlQggKBl92YWx1ZSJDCgpNZXRyaWNUeXBlEhkKFU1FVFJJQ1RZUEVfVU5WRVJJRklFRBAAEgsKB0xBVEVOQ1kQARINCglUSU1FU1RBTVAQAkINCgtfc3RhZ2VfbmFtZSKJAQoLVmVyc2lvbkluZm8SIAoTbGljZW5zZV9zZGtfdmVyc2lvbhgBIAEoCUgAiAEBEiQKF2xpY2Vuc2Vfc2VydmljZV92ZXJzaW9uGAIgASgJSAGIAQFCFgoUX2xpY2Vuc2Vfc2RrX3ZlcnNpb25CGgoYX2xpY2Vuc2Vfc2VydmljZV92ZXJzaW9uIowHCg1TaWduZWRNZXNzYWdlEj4KBHR5cGUYASABKA4yKy5saWNlbnNlX3Byb3RvY29sLlNpZ25lZE1lc3NhZ2UuTWVzc2FnZVR5cGVIAIgBARIQCgNtc2cYAiABKAxIAYgBARIWCglzaWduYXR1cmUYAyABKAxIAogBARIYCgtzZXNzaW9uX2tleRgEIAEoDEgDiAEBEh8KEnJlbW90ZV9hdHRlc3RhdGlvbhgFIAEoDEgEiAEBEjEKC21ldHJpY19kYXRhGAYgAygLMhwubGljZW5zZV9wcm90b2NvbC5NZXRyaWNEYXRhEkAKFHNlcnZpY2VfdmVyc2lvbl9pbmZvGAcgASgLMh0ubGljZW5zZV9wcm90b2NvbC5WZXJzaW9uSW5mb0gFiAEBEk0KEHNlc3Npb25fa2V5X3R5cGUYCCABKA4yLi5saWNlbnNlX3Byb3RvY29sLlNpZ25lZE1lc3NhZ2UuU2Vzc2lvbktleVR5cGVIBogBARIjChZvZW1jcnlwdG9fY29yZV9tZXNzYWdlGAkgASgMSAeIAQEiiAIKC01lc3NhZ2VUeXBlEhoKFk1FU1NBR0VUWVBFX1VOVkVSSUZJRUQQABITCg9MSUNFTlNFX1JFUVVFU1QQARILCgdMSUNFTlNFEAISEgoORVJST1JfUkVTUE9OU0UQAxIfChtTRVJWSUNFX0NFUlRJRklDQVRFX1JFUVVFU1QQBBIXChNTRVJWSUNFX0NFUlRJRklDQVRFEAUSDwoLU1VCX0xJQ0VOU0UQBhIXChNDQVNfTElDRU5TRV9SRVFVRVNUEAcSDwoLQ0FTX0xJQ0VOU0UQCBIcChhFWFRFUk5BTF9MSUNFTlNFX1JFUVVFU1QQCRIUChBFWFRFUk5BTF9MSUNFTlNFEAoiUwoOU2Vzc2lvbktleVR5cGUSDQoJVU5ERUZJTkVEEAASEwoPV1JBUFBFRF9BRVNfS0VZEAESHQoZRVBIRVJNRVJBTF9FQ0NfUFVCTElDX0tFWRACQgcKBV90eXBlQgYKBF9tc2dCDAoKX3NpZ25hdHVyZUIOCgxfc2Vzc2lvbl9rZXlCFQoTX3JlbW90ZV9hdHRlc3RhdGlvbkIXChVfc2VydmljZV92ZXJzaW9uX2luZm9CEwoRX3Nlc3Npb25fa2V5X3R5cGVCGQoXX29lbWNyeXB0b19jb3JlX21lc3NhZ2UijxEKFENsaWVudElkZW50aWZpY2F0aW9uEkMKBHR5cGUYASABKA4yMC5saWNlbnNlX3Byb3RvY29sLkNsaWVudElkZW50aWZpY2F0aW9uLlRva2VuVHlwZUgAiAEBEhIKBXRva2VuGAIgASgMSAGIAQESRQoLY2xpZW50X2luZm8YAyADKAsyMC5saWNlbnNlX3Byb3RvY29sLkNsaWVudElkZW50aWZpY2F0aW9uLk5hbWVWYWx1ZRIiChVwcm92aWRlcl9jbGllbnRfdG9rZW4YBCABKAxIAogBARIcCg9saWNlbnNlX2NvdW50ZXIYBSABKA1IA4gBARJbChNjbGllbnRfY2FwYWJpbGl0aWVzGAYgASgLMjkubGljZW5zZV9wcm90b2NvbC5DbGllbnRJZGVudGlmaWNhdGlvbi5DbGllbnRDYXBhYmlsaXRpZXNIBIgBARIVCgh2bXBfZGF0YRgHIAEoDEgFiAEBElQKEmRldmljZV9jcmVkZW50aWFscxgIIAMoCzI4LmxpY2Vuc2VfcHJvdG9jb2wuQ2xpZW50SWRlbnRpZmljYXRpb24uQ2xpZW50Q3JlZGVudGlhbHMaRQoJTmFtZVZhbHVlEhEKBG5hbWUYASABKAlIAIgBARISCgV2YWx1ZRgCIAEoCUgBiAEBQgcKBV9uYW1lQggKBl92YWx1ZRqnCgoSQ2xpZW50Q2FwYWJpbGl0aWVzEhkKDGNsaWVudF90b2tlbhgBIAEoCEgAiAEBEhoKDXNlc3Npb25fdG9rZW4YAiABKAhIAYgBARIpChx2aWRlb19yZXNvbHV0aW9uX2NvbnN0cmFpbnRzGAMgASgISAKIAQESZAoQbWF4X2hkY3BfdmVyc2lvbhgEIAEoDjJFLmxpY2Vuc2VfcHJvdG9jb2wuQ2xpZW50SWRlbnRpZmljYXRpb24uQ2xpZW50Q2FwYWJpbGl0aWVzLkhkY3BWZXJzaW9uSAOIAQESIwoWb2VtX2NyeXB0b19hcGlfdmVyc2lvbhgFIAEoDUgEiAEBEiYKGWFudGlfcm9sbGJhY2tfdXNhZ2VfdGFibGUYBiABKAhIBYgBARIYCgtzcm1fdmVyc2lvbhgHIAEoDUgGiAEBEhsKDmNhbl91cGRhdGVfc3JtGAggASgISAeIAQESdAoec3VwcG9ydGVkX2NlcnRpZmljYXRlX2tleV90eXBlGAkgAygOMkwubGljZW5zZV9wcm90b2NvbC5DbGllbnRJZGVudGlmaWNhdGlvbi5DbGllbnRDYXBhYmlsaXRpZXMuQ2VydGlmaWNhdGVLZXlUeXBlEnsKGmFuYWxvZ19vdXRwdXRfY2FwYWJpbGl0aWVzGAogASgOMlIubGljZW5zZV9wcm90b2NvbC5DbGllbnRJZGVudGlmaWNhdGlvbi5DbGllbnRDYXBhYmlsaXRpZXMuQW5hbG9nT3V0cHV0Q2FwYWJpbGl0aWVzSAiIAQESJgoZY2FuX2Rpc2FibGVfYW5hbG9nX291dHB1dBgLIAEoCEgJiAEBEiEKFHJlc291cmNlX3JhdGluZ190aWVyGAwgASgNSAqIAQEigAEKC0hkY3BWZXJzaW9uEg0KCUhEQ1BfTk9ORRAAEgsKB0hEQ1BfVjEQARILCgdIRENQX1YyEAISDQoJSERDUF9WMl8xEAMSDQoJSERDUF9WMl8yEAQSDQoJSERDUF9WMl8zEAUSGwoWSERDUF9OT19ESUdJVEFMX09VVFBVVBD/ASJpChJDZXJ0aWZpY2F0ZUtleVR5cGUSDAoIUlNBXzIwNDgQABIMCghSU0FfMzA3MhABEhEKDUVDQ19TRUNQMjU2UjEQAhIRCg1FQ0NfU0VDUDM4NFIxEAMSEQoNRUNDX1NFQ1A1MjFSMRAEIo0BChhBbmFsb2dPdXRwdXRDYXBhYmlsaXRpZXMSGQoVQU5BTE9HX09VVFBVVF9VTktOT1dOEAASFgoSQU5BTE9HX09VVFBVVF9OT05FEAESGwoXQU5BTE9HX09VVFBVVF9TVVBQT1JURUQQAhIhCh1BTkFMT0dfT1VUUFVUX1NVUFBPUlRTX0NHTVNfQRADQg8KDV9jbGllbnRfdG9rZW5CEAoOX3Nlc3Npb25fdG9rZW5CHwodX3ZpZGVvX3Jlc29sdXRpb25fY29uc3RyYWludHNCEwoRX21heF9oZGNwX3ZlcnNpb25CGQoXX29lbV9jcnlwdG9fYXBpX3ZlcnNpb25CHAoaX2FudGlfcm9sbGJhY2tfdXNhZ2VfdGFibGVCDgoMX3NybV92ZXJzaW9uQhEKD19jYW5fdXBkYXRlX3NybUIdChtfYW5hbG9nX291dHB1dF9jYXBhYmlsaXRpZXNCHAoaX2Nhbl9kaXNhYmxlX2FuYWxvZ19vdXRwdXRCFwoVX3Jlc291cmNlX3JhdGluZ190aWVyGn8KEUNsaWVudENyZWRlbnRpYWxzEkMKBHR5cGUYASABKA4yMC5saWNlbnNlX3Byb3RvY29sLkNsaWVudElkZW50aWZpY2F0aW9uLlRva2VuVHlwZUgAiAEBEhIKBXRva2VuGAIgASgMSAGIAQFCBwoFX3R5cGVCCAoGX3Rva2VuInMKCVRva2VuVHlwZRIKCgZLRVlCT1gQABIaChZEUk1fREVWSUNFX0NFUlRJRklDQVRFEAESIgoeUkVNT1RFX0FUVEVTVEFUSU9OX0NFUlRJRklDQVRFEAISGgoWT0VNX0RFVklDRV9DRVJUSUZJQ0FURRADQgcKBV90eXBlQggKBl90b2tlbkIYChZfcHJvdmlkZXJfY2xpZW50X3Rva2VuQhIKEF9saWNlbnNlX2NvdW50ZXJCFgoUX2NsaWVudF9jYXBhYmlsaXRpZXNCCwoJX3ZtcF9kYXRhItcCCh1FbmNyeXB0ZWRDbGllbnRJZGVudGlmaWNhdGlvbhIYCgtwcm92aWRlcl9pZBgBIAEoCUgAiAEBEi4KIXNlcnZpY2VfY2VydGlmaWNhdGVfc2VyaWFsX251bWJlchgCIAEoDEgBiAEBEiAKE2VuY3J5cHRlZF9jbGllbnRfaWQYAyABKAxIAogBARIjChZlbmNyeXB0ZWRfY2xpZW50X2lkX2l2GAQgASgMSAOIAQESIgoVZW5jcnlwdGVkX3ByaXZhY3lfa2V5GAUgASgMSASIAQFCDgoMX3Byb3ZpZGVyX2lkQiQKIl9zZXJ2aWNlX2NlcnRpZmljYXRlX3NlcmlhbF9udW1iZXJCFgoUX2VuY3J5cHRlZF9jbGllbnRfaWRCGQoXX2VuY3J5cHRlZF9jbGllbnRfaWRfaXZCGAoWX2VuY3J5cHRlZF9wcml2YWN5X2tleSKdCQoORHJtQ2VydGlmaWNhdGUSOAoEdHlwZRgBIAEoDjIlLmxpY2Vuc2VfcHJvdG9jb2wuRHJtQ2VydGlmaWNhdGUuVHlwZUgAiAEBEhoKDXNlcmlhbF9udW1iZXIYAiABKAxIAYgBARIiChVjcmVhdGlvbl90aW1lX3NlY29uZHMYAyABKA1IAogBARIkChdleHBpcmF0aW9uX3RpbWVfc2Vjb25kcxgMIAEoDUgDiAEBEhcKCnB1YmxpY19rZXkYBCABKAxIBIgBARIWCglzeXN0ZW1faWQYBSABKA1IBYgBARInChZ0ZXN0X2RldmljZV9kZXByZWNhdGVkGAYgASgIQgIYAUgGiAEBEhgKC3Byb3ZpZGVyX2lkGAcgASgJSAeIAQESQwoNc2VydmljZV90eXBlcxgIIAMoDjIsLmxpY2Vuc2VfcHJvdG9jb2wuRHJtQ2VydGlmaWNhdGUuU2VydmljZVR5cGUSQgoJYWxnb3JpdGhtGAkgASgOMioubGljZW5zZV9wcm90b2NvbC5Ecm1DZXJ0aWZpY2F0ZS5BbGdvcml0aG1ICIgBARITCgZyb3RfaWQYCiABKAxICYgBARJLCg5lbmNyeXB0aW9uX2tleRgLIAEoCzIuLmxpY2Vuc2VfcHJvdG9jb2wuRHJtQ2VydGlmaWNhdGUuRW5jcnlwdGlvbktleUgKiAEBGokBCg1FbmNyeXB0aW9uS2V5EhcKCnB1YmxpY19rZXkYASABKAxIAIgBARJCCglhbGdvcml0aG0YAiABKA4yKi5saWNlbnNlX3Byb3RvY29sLkRybUNlcnRpZmljYXRlLkFsZ29yaXRobUgBiAEBQg0KC19wdWJsaWNfa2V5QgwKCl9hbGdvcml0aG0iTAoEVHlwZRIICgRST09UEAASEAoMREVWSUNFX01PREVMEAESCgoGREVWSUNFEAISCwoHU0VSVklDRRADEg8KC1BST1ZJU0lPTkVSEAQihgEKC1NlcnZpY2VUeXBlEhgKFFVOS05PV05fU0VSVklDRV9UWVBFEAASFgoSTElDRU5TRV9TRVJWRVJfU0RLEAESHAoYTElDRU5TRV9TRVJWRVJfUFJPWFlfU0RLEAISFAoQUFJPVklTSU9OSU5HX1NESxADEhEKDUNBU19QUk9YWV9TREsQBCJkCglBbGdvcml0aG0SFQoRVU5LTk9XTl9BTEdPUklUSE0QABIHCgNSU0EQARIRCg1FQ0NfU0VDUDI1NlIxEAISEQoNRUNDX1NFQ1AzODRSMRADEhEKDUVDQ19TRUNQNTIxUjEQBEIHCgVfdHlwZUIQCg5fc2VyaWFsX251bWJlckIYChZfY3JlYXRpb25fdGltZV9zZWNvbmRzQhoKGF9leHBpcmF0aW9uX3RpbWVfc2Vjb25kc0INCgtfcHVibGljX2tleUIMCgpfc3lzdGVtX2lkQhkKF190ZXN0X2RldmljZV9kZXByZWNhdGVkQg4KDF9wcm92aWRlcl9pZEIMCgpfYWxnb3JpdGhtQgkKB19yb3RfaWRCEQoPX2VuY3J5cHRpb25fa2V5IowCChRTaWduZWREcm1DZXJ0aWZpY2F0ZRIcCg9kcm1fY2VydGlmaWNhdGUYASABKAxIAIgBARIWCglzaWduYXR1cmUYAiABKAxIAYgBARI7CgZzaWduZXIYAyABKAsyJi5saWNlbnNlX3Byb3RvY29sLlNpZ25lZERybUNlcnRpZmljYXRlSAKIAQESQQoOaGFzaF9hbGdvcml0aG0YBCABKA4yJC5saWNlbnNlX3Byb3RvY29sLkhhc2hBbGdvcml0aG1Qcm90b0gDiAEBQhIKEF9kcm1fY2VydGlmaWNhdGVCDAoKX3NpZ25hdHVyZUIJCgdfc2lnbmVyQhEKD19oYXNoX2FsZ29yaXRobSK7CAoQV2lkZXZpbmVQc3NoRGF0YRIPCgdrZXlfaWRzGAIgAygMEhcKCmNvbnRlbnRfaWQYBCABKAxIAIgBARIgChNjcnlwdG9fcGVyaW9kX2luZGV4GAcgASgNSAGIAQESHgoRcHJvdGVjdGlvbl9zY2hlbWUYCSABKA1IAogBARIiChVjcnlwdG9fcGVyaW9kX3NlY29uZHMYCiABKA1IA4gBARI6CgR0eXBlGAsgASgOMicubGljZW5zZV9wcm90b2NvbC5XaWRldmluZVBzc2hEYXRhLlR5cGVIBIgBARIZCgxrZXlfc2VxdWVuY2UYDCABKA1IBYgBARIRCglncm91cF9pZHMYDSADKAwSRQoNZW50aXRsZWRfa2V5cxgOIAMoCzIuLmxpY2Vuc2VfcHJvdG9jb2wuV2lkZXZpbmVQc3NoRGF0YS5FbnRpdGxlZEtleRIaCg12aWRlb19mZWF0dXJlGA8gASgJSAaIAQESSAoJYWxnb3JpdGhtGAEgASgOMiwubGljZW5zZV9wcm90b2NvbC5XaWRldmluZVBzc2hEYXRhLkFsZ29yaXRobUICGAFIB4gBARIZCghwcm92aWRlchgDIAEoCUICGAFICIgBARIbCgp0cmFja190eXBlGAUgASgJQgIYAUgJiAEBEhcKBnBvbGljeRgGIAEoCUICGAFICogBARIgCg9ncm91cGVkX2xpY2Vuc2UYCCABKAxCAhgBSAuIAQEa3wEKC0VudGl0bGVkS2V5Eh8KEmVudGl0bGVtZW50X2tleV9pZBgBIAEoDEgAiAEBEhMKBmtleV9pZBgCIAEoDEgBiAEBEhAKA2tleRgDIAEoDEgCiAEBEg8KAml2GAQgASgMSAOIAQESJwoaZW50aXRsZW1lbnRfa2V5X3NpemVfYnl0ZXMYBSABKA1IBIgBAUIVChNfZW50aXRsZW1lbnRfa2V5X2lkQgkKB19rZXlfaWRCBgoEX2tleUIFCgNfaXZCHQobX2VudGl0bGVtZW50X2tleV9zaXplX2J5dGVzIjUKBFR5cGUSCgoGU0lOR0xFEAASDwoLRU5USVRMRU1FTlQQARIQCgxFTlRJVExFRF9LRVkQAiIoCglBbGdvcml0aG0SDwoLVU5FTkNSWVBURUQQABIKCgZBRVNDVFIQAUINCgtfY29udGVudF9pZEIWChRfY3J5cHRvX3BlcmlvZF9pbmRleEIUChJfcHJvdGVjdGlvbl9zY2hlbWVCGAoWX2NyeXB0b19wZXJpb2Rfc2Vjb25kc0IHCgVfdHlwZUIPCg1fa2V5X3NlcXVlbmNlQhAKDl92aWRlb19mZWF0dXJlQgwKCl9hbGdvcml0aG1CCwoJX3Byb3ZpZGVyQg0KC190cmFja190eXBlQgkKB19wb2xpY3lCEgoQX2dyb3VwZWRfbGljZW5zZSK4AgoKRmlsZUhhc2hlcxITCgZzaWduZXIYASABKAxIAIgBARI6CgpzaWduYXR1cmVzGAIgAygLMiYubGljZW5zZV9wcm90b2NvbC5GaWxlSGFzaGVzLlNpZ25hdHVyZRrNAQoJU2lnbmF0dXJlEhUKCGZpbGVuYW1lGAEgASgJSACIAQESGQoMdGVzdF9zaWduaW5nGAIgASgISAGIAQESFwoKU0hBNTEySGFzaBgDIAEoDEgCiAEBEhUKCG1haW5fZXhlGAQgASgISAOIAQESFgoJc2lnbmF0dXJlGAUgASgMSASIAQFCCwoJX2ZpbGVuYW1lQg8KDV90ZXN0X3NpZ25pbmdCDQoLX1NIQTUxMkhhc2hCCwoJX21haW5fZXhlQgwKCl9zaWduYXR1cmVCCQoHX3NpZ25lcipUCgtMaWNlbnNlVHlwZRIaChZMSUNFTlNFVFlQRV9VTlZFUklGSUVEEAASDQoJU1RSRUFNSU5HEAESCwoHT0ZGTElORRACEg0KCUFVVE9NQVRJQxADKtkBChpQbGF0Zm9ybVZlcmlmaWNhdGlvblN0YXR1cxIXChNQTEFURk9STV9VTlZFUklGSUVEEAASFQoRUExBVEZPUk1fVEFNUEVSRUQQARIeChpQTEFURk9STV9TT0ZUV0FSRV9WRVJJRklFRBACEh4KGlBMQVRGT1JNX0hBUkRXQVJFX1ZFUklGSUVEEAMSHAoYUExBVEZPUk1fTk9fVkVSSUZJQ0FUSU9OEAQSLQopUExBVEZPUk1fU0VDVVJFX1NUT1JBR0VfU09GVFdBUkVfVkVSSUZJRUQQBSpcCg9Qcm90b2NvbFZlcnNpb24SFgoSVkVSU0lPTl9VTlZFUklGSUVEEAASDwoLVkVSU0lPTl8yXzAQFBIPCgtWRVJTSU9OXzJfMRAVEg8KC1ZFUlNJT05fMl8yEBYqhgEKEkhhc2hBbGdvcml0aG1Qcm90bxIeChpIQVNIX0FMR09SSVRITV9VTlNQRUNJRklFRBAAEhgKFEhBU0hfQUxHT1JJVEhNX1NIQV8xEAESGgoWSEFTSF9BTEdPUklUSE1fU0hBXzI1NhACEhoKFkhBU0hfQUxHT1JJVEhNX1NIQV8zODQQA2IGcHJvdG8z' - ) + /*@__PURE__*/ + fileDesc( + 'ChZsaWNlbnNlX3Byb3RvY29sLnByb3RvEhBsaWNlbnNlX3Byb3RvY29sIq4CChVMaWNlbnNlSWRlbnRpZmljYXRpb24SFwoKcmVxdWVzdF9pZBgBIAEoDEgAiAEBEhcKCnNlc3Npb25faWQYAiABKAxIAYgBARIYCgtwdXJjaGFzZV9pZBgDIAEoDEgCiAEBEjAKBHR5cGUYBCABKA4yHS5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VUeXBlSAOIAQESFAoHdmVyc2lvbhgFIAEoBUgEiAEBEiMKFnByb3ZpZGVyX3Nlc3Npb25fdG9rZW4YBiABKAxIBYgBAUINCgtfcmVxdWVzdF9pZEINCgtfc2Vzc2lvbl9pZEIOCgxfcHVyY2hhc2VfaWRCBwoFX3R5cGVCCgoIX3ZlcnNpb25CGQoXX3Byb3ZpZGVyX3Nlc3Npb25fdG9rZW4izCAKB0xpY2Vuc2USOAoCaWQYASABKAsyJy5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VJZGVudGlmaWNhdGlvbkgAiAEBEjUKBnBvbGljeRgCIAEoCzIgLmxpY2Vuc2VfcHJvdG9jb2wuTGljZW5zZS5Qb2xpY3lIAYgBARIzCgNrZXkYAyADKAsyJi5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2UuS2V5Q29udGFpbmVyEh8KEmxpY2Vuc2Vfc3RhcnRfdGltZRgEIAEoA0gCiAEBEigKG3JlbW90ZV9hdHRlc3RhdGlvbl92ZXJpZmllZBgFIAEoCEgDiAEBEiIKFXByb3ZpZGVyX2NsaWVudF90b2tlbhgGIAEoDEgEiAEBEh4KEXByb3RlY3Rpb25fc2NoZW1lGAcgASgNSAWIAQESHAoPc3JtX3JlcXVpcmVtZW50GAggASgMSAaIAQESFwoKc3JtX3VwZGF0ZRgJIAEoDEgHiAEBElcKHHBsYXRmb3JtX3ZlcmlmaWNhdGlvbl9zdGF0dXMYCiABKA4yLC5saWNlbnNlX3Byb3RvY29sLlBsYXRmb3JtVmVyaWZpY2F0aW9uU3RhdHVzSAiIAQESEQoJZ3JvdXBfaWRzGAsgAygMGsoHCgZQb2xpY3kSFQoIY2FuX3BsYXkYASABKAhIAIgBARIYCgtjYW5fcGVyc2lzdBgCIAEoCEgBiAEBEhYKCWNhbl9yZW5ldxgDIAEoCEgCiAEBEiQKF3JlbnRhbF9kdXJhdGlvbl9zZWNvbmRzGAQgASgDSAOIAQESJgoZcGxheWJhY2tfZHVyYXRpb25fc2Vjb25kcxgFIAEoA0gEiAEBEiUKGGxpY2Vuc2VfZHVyYXRpb25fc2Vjb25kcxgGIAEoA0gFiAEBEi4KIXJlbmV3YWxfcmVjb3ZlcnlfZHVyYXRpb25fc2Vjb25kcxgHIAEoA0gGiAEBEh8KEnJlbmV3YWxfc2VydmVyX3VybBgIIAEoCUgHiAEBEiIKFXJlbmV3YWxfZGVsYXlfc2Vjb25kcxgJIAEoA0gIiAEBEisKHnJlbmV3YWxfcmV0cnlfaW50ZXJ2YWxfc2Vjb25kcxgKIAEoA0gJiAEBEh0KEHJlbmV3X3dpdGhfdXNhZ2UYCyABKAhICogBARIlChhhbHdheXNfaW5jbHVkZV9jbGllbnRfaWQYDCABKAhIC4gBARIsCh9wbGF5X3N0YXJ0X2dyYWNlX3BlcmlvZF9zZWNvbmRzGA0gASgDSAyIAQESKwoec29mdF9lbmZvcmNlX3BsYXliYWNrX2R1cmF0aW9uGA4gASgISA2IAQESKQocc29mdF9lbmZvcmNlX3JlbnRhbF9kdXJhdGlvbhgPIAEoCEgOiAEBQgsKCV9jYW5fcGxheUIOCgxfY2FuX3BlcnNpc3RCDAoKX2Nhbl9yZW5ld0IaChhfcmVudGFsX2R1cmF0aW9uX3NlY29uZHNCHAoaX3BsYXliYWNrX2R1cmF0aW9uX3NlY29uZHNCGwoZX2xpY2Vuc2VfZHVyYXRpb25fc2Vjb25kc0IkCiJfcmVuZXdhbF9yZWNvdmVyeV9kdXJhdGlvbl9zZWNvbmRzQhUKE19yZW5ld2FsX3NlcnZlcl91cmxCGAoWX3JlbmV3YWxfZGVsYXlfc2Vjb25kc0IhCh9fcmVuZXdhbF9yZXRyeV9pbnRlcnZhbF9zZWNvbmRzQhMKEV9yZW5ld193aXRoX3VzYWdlQhsKGV9hbHdheXNfaW5jbHVkZV9jbGllbnRfaWRCIgogX3BsYXlfc3RhcnRfZ3JhY2VfcGVyaW9kX3NlY29uZHNCIQofX3NvZnRfZW5mb3JjZV9wbGF5YmFja19kdXJhdGlvbkIfCh1fc29mdF9lbmZvcmNlX3JlbnRhbF9kdXJhdGlvbhreEwoMS2V5Q29udGFpbmVyEg8KAmlkGAEgASgMSACIAQESDwoCaXYYAiABKAxIAYgBARIQCgNrZXkYAyABKAxIAogBARJBCgR0eXBlGAQgASgOMi4ubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5LZXlUeXBlSAOIAQESSAoFbGV2ZWwYBSABKA4yNC5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2UuS2V5Q29udGFpbmVyLlNlY3VyaXR5TGV2ZWxIBIgBARJZChNyZXF1aXJlZF9wcm90ZWN0aW9uGAYgASgLMjcubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PdXRwdXRQcm90ZWN0aW9uSAWIAQESWgoUcmVxdWVzdGVkX3Byb3RlY3Rpb24YByABKAsyNy5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2UuS2V5Q29udGFpbmVyLk91dHB1dFByb3RlY3Rpb25IBogBARJLCgtrZXlfY29udHJvbBgIIAEoCzIxLmxpY2Vuc2VfcHJvdG9jb2wuTGljZW5zZS5LZXlDb250YWluZXIuS2V5Q29udHJvbEgHiAEBEnMKIG9wZXJhdG9yX3Nlc3Npb25fa2V5X3Blcm1pc3Npb25zGAkgASgLMkQubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PcGVyYXRvclNlc3Npb25LZXlQZXJtaXNzaW9uc0gIiAEBEmYKHHZpZGVvX3Jlc29sdXRpb25fY29uc3RyYWludHMYCiADKAsyQC5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2UuS2V5Q29udGFpbmVyLlZpZGVvUmVzb2x1dGlvbkNvbnN0cmFpbnQSJgoZYW50aV9yb2xsYmFja191c2FnZV90YWJsZRgLIAEoCEgJiAEBEhgKC3RyYWNrX2xhYmVsGAwgASgJSAqIAQEaWgoKS2V5Q29udHJvbBIeChFrZXlfY29udHJvbF9ibG9jaxgBIAEoDEgAiAEBEg8KAml2GAIgASgMSAGIAQFCFAoSX2tleV9jb250cm9sX2Jsb2NrQgUKA19pdhq7BQoQT3V0cHV0UHJvdGVjdGlvbhJPCgRoZGNwGAEgASgOMjwubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PdXRwdXRQcm90ZWN0aW9uLkhEQ1BIAIgBARJVCgpjZ21zX2ZsYWdzGAIgASgOMjwubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PdXRwdXRQcm90ZWN0aW9uLkNHTVNIAYgBARJfCg1oZGNwX3NybV9ydWxlGAMgASgOMkMubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PdXRwdXRQcm90ZWN0aW9uLkhkY3BTcm1SdWxlSAKIAQESIgoVZGlzYWJsZV9hbmFsb2dfb3V0cHV0GAQgASgISAOIAQESIwoWZGlzYWJsZV9kaWdpdGFsX291dHB1dBgFIAEoCEgEiAEBInkKBEhEQ1ASDQoJSERDUF9OT05FEAASCwoHSERDUF9WMRABEgsKB0hEQ1BfVjIQAhINCglIRENQX1YyXzEQAxINCglIRENQX1YyXzIQBBINCglIRENQX1YyXzMQBRIbChZIRENQX05PX0RJR0lUQUxfT1VUUFVUEP8BIkMKBENHTVMSDQoJQ09QWV9GUkVFEAASDQoJQ0dNU19OT05FECoSDQoJQ09QWV9PTkNFEAISDgoKQ09QWV9ORVZFUhADIjYKC0hkY3BTcm1SdWxlEhYKEkhEQ1BfU1JNX1JVTEVfTk9ORRAAEg8KC0NVUlJFTlRfU1JNEAFCBwoFX2hkY3BCDQoLX2NnbXNfZmxhZ3NCEAoOX2hkY3Bfc3JtX3J1bGVCGAoWX2Rpc2FibGVfYW5hbG9nX291dHB1dEIZChdfZGlzYWJsZV9kaWdpdGFsX291dHB1dBqKAgoZVmlkZW9SZXNvbHV0aW9uQ29uc3RyYWludBIiChVtaW5fcmVzb2x1dGlvbl9waXhlbHMYASABKA1IAIgBARIiChVtYXhfcmVzb2x1dGlvbl9waXhlbHMYAiABKA1IAYgBARJZChNyZXF1aXJlZF9wcm90ZWN0aW9uGAMgASgLMjcubGljZW5zZV9wcm90b2NvbC5MaWNlbnNlLktleUNvbnRhaW5lci5PdXRwdXRQcm90ZWN0aW9uSAKIAQFCGAoWX21pbl9yZXNvbHV0aW9uX3BpeGVsc0IYChZfbWF4X3Jlc29sdXRpb25fcGl4ZWxzQhYKFF9yZXF1aXJlZF9wcm90ZWN0aW9uGuMBCh1PcGVyYXRvclNlc3Npb25LZXlQZXJtaXNzaW9ucxIaCg1hbGxvd19lbmNyeXB0GAEgASgISACIAQESGgoNYWxsb3dfZGVjcnlwdBgCIAEoCEgBiAEBEhcKCmFsbG93X3NpZ24YAyABKAhIAogBARIjChZhbGxvd19zaWduYXR1cmVfdmVyaWZ5GAQgASgISAOIAQFCEAoOX2FsbG93X2VuY3J5cHRCEAoOX2FsbG93X2RlY3J5cHRCDQoLX2FsbG93X3NpZ25CGQoXX2FsbG93X3NpZ25hdHVyZV92ZXJpZnkihAEKB0tleVR5cGUSFgoSS0VZVFlQRV9VTlZFUklGSUVEEAASCwoHU0lHTklORxABEgsKB0NPTlRFTlQQAhIPCgtLRVlfQ09OVFJPTBADEhQKEE9QRVJBVE9SX1NFU1NJT04QBBIPCgtFTlRJVExFTUVOVBAFEg8KC09FTV9DT05URU5UEAYimAEKDVNlY3VyaXR5TGV2ZWwSHAoYU0VDVVJJVFlMRVZFTF9VTlZFUklGSUVEEAASFAoQU1dfU0VDVVJFX0NSWVBUTxABEhQKEFNXX1NFQ1VSRV9ERUNPREUQAhIUChBIV19TRUNVUkVfQ1JZUFRPEAMSFAoQSFdfU0VDVVJFX0RFQ09ERRAEEhEKDUhXX1NFQ1VSRV9BTEwQBUIFCgNfaWRCBQoDX2l2QgYKBF9rZXlCBwoFX3R5cGVCCAoGX2xldmVsQhYKFF9yZXF1aXJlZF9wcm90ZWN0aW9uQhcKFV9yZXF1ZXN0ZWRfcHJvdGVjdGlvbkIOCgxfa2V5X2NvbnRyb2xCIwohX29wZXJhdG9yX3Nlc3Npb25fa2V5X3Blcm1pc3Npb25zQhwKGl9hbnRpX3JvbGxiYWNrX3VzYWdlX3RhYmxlQg4KDF90cmFja19sYWJlbEIFCgNfaWRCCQoHX3BvbGljeUIVChNfbGljZW5zZV9zdGFydF90aW1lQh4KHF9yZW1vdGVfYXR0ZXN0YXRpb25fdmVyaWZpZWRCGAoWX3Byb3ZpZGVyX2NsaWVudF90b2tlbkIUChJfcHJvdGVjdGlvbl9zY2hlbWVCEgoQX3NybV9yZXF1aXJlbWVudEINCgtfc3JtX3VwZGF0ZUIfCh1fcGxhdGZvcm1fdmVyaWZpY2F0aW9uX3N0YXR1cyLAEAoOTGljZW5zZVJlcXVlc3QSPgoJY2xpZW50X2lkGAEgASgLMiYubGljZW5zZV9wcm90b2NvbC5DbGllbnRJZGVudGlmaWNhdGlvbkgAiAEBEk8KCmNvbnRlbnRfaWQYAiABKAsyNi5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VSZXF1ZXN0LkNvbnRlbnRJZGVudGlmaWNhdGlvbkgBiAEBEj8KBHR5cGUYAyABKA4yLC5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VSZXF1ZXN0LlJlcXVlc3RUeXBlSAKIAQESGQoMcmVxdWVzdF90aW1lGAQgASgDSAOIAQESKQoca2V5X2NvbnRyb2xfbm9uY2VfZGVwcmVjYXRlZBgFIAEoDEgEiAEBEkAKEHByb3RvY29sX3ZlcnNpb24YBiABKA4yIS5saWNlbnNlX3Byb3RvY29sLlByb3RvY29sVmVyc2lvbkgFiAEBEh4KEWtleV9jb250cm9sX25vbmNlGAcgASgNSAaIAQESUQoTZW5jcnlwdGVkX2NsaWVudF9pZBgIIAEoCzIvLmxpY2Vuc2VfcHJvdG9jb2wuRW5jcnlwdGVkQ2xpZW50SWRlbnRpZmljYXRpb25IB4gBARr3CgoVQ29udGVudElkZW50aWZpY2F0aW9uEmUKEndpZGV2aW5lX3Bzc2hfZGF0YRgBIAEoCzJHLmxpY2Vuc2VfcHJvdG9jb2wuTGljZW5zZVJlcXVlc3QuQ29udGVudElkZW50aWZpY2F0aW9uLldpZGV2aW5lUHNzaERhdGFIABJXCgt3ZWJtX2tleV9pZBgCIAEoCzJALmxpY2Vuc2VfcHJvdG9jb2wuTGljZW5zZVJlcXVlc3QuQ29udGVudElkZW50aWZpY2F0aW9uLldlYm1LZXlJZEgAEmIKEGV4aXN0aW5nX2xpY2Vuc2UYAyABKAsyRi5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VSZXF1ZXN0LkNvbnRlbnRJZGVudGlmaWNhdGlvbi5FeGlzdGluZ0xpY2Vuc2VIABJUCglpbml0X2RhdGEYBCABKAsyPy5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VSZXF1ZXN0LkNvbnRlbnRJZGVudGlmaWNhdGlvbi5Jbml0RGF0YUgAGpgBChBXaWRldmluZVBzc2hEYXRhEhEKCXBzc2hfZGF0YRgBIAMoDBI4CgxsaWNlbnNlX3R5cGUYAiABKA4yHS5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VUeXBlSACIAQESFwoKcmVxdWVzdF9pZBgDIAEoDEgBiAEBQg8KDV9saWNlbnNlX3R5cGVCDQoLX3JlcXVlc3RfaWQangEKCVdlYm1LZXlJZBITCgZoZWFkZXIYASABKAxIAIgBARI4CgxsaWNlbnNlX3R5cGUYAiABKA4yHS5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VUeXBlSAGIAQESFwoKcmVxdWVzdF9pZBgDIAEoDEgCiAEBQgkKB19oZWFkZXJCDwoNX2xpY2Vuc2VfdHlwZUINCgtfcmVxdWVzdF9pZBqsAgoPRXhpc3RpbmdMaWNlbnNlEkAKCmxpY2Vuc2VfaWQYASABKAsyJy5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VJZGVudGlmaWNhdGlvbkgAiAEBEiIKFXNlY29uZHNfc2luY2Vfc3RhcnRlZBgCIAEoA0gBiAEBEiYKGXNlY29uZHNfc2luY2VfbGFzdF9wbGF5ZWQYAyABKANIAogBARImChlzZXNzaW9uX3VzYWdlX3RhYmxlX2VudHJ5GAQgASgMSAOIAQFCDQoLX2xpY2Vuc2VfaWRCGAoWX3NlY29uZHNfc2luY2Vfc3RhcnRlZEIcChpfc2Vjb25kc19zaW5jZV9sYXN0X3BsYXllZEIcChpfc2Vzc2lvbl91c2FnZV90YWJsZV9lbnRyeRriAgoISW5pdERhdGESaQoOaW5pdF9kYXRhX3R5cGUYASABKA4yTC5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VSZXF1ZXN0LkNvbnRlbnRJZGVudGlmaWNhdGlvbi5Jbml0RGF0YS5Jbml0RGF0YVR5cGVIAIgBARIWCglpbml0X2RhdGEYAiABKAxIAYgBARI4CgxsaWNlbnNlX3R5cGUYAyABKA4yHS5saWNlbnNlX3Byb3RvY29sLkxpY2Vuc2VUeXBlSAKIAQESFwoKcmVxdWVzdF9pZBgEIAEoDEgDiAEBIj8KDEluaXREYXRhVHlwZRIbChdJTklUREFUQVRZUEVfVU5WRVJJRklFRBAAEggKBENFTkMQARIICgRXRUJNEAJCEQoPX2luaXRfZGF0YV90eXBlQgwKCl9pbml0X2RhdGFCDwoNX2xpY2Vuc2VfdHlwZUINCgtfcmVxdWVzdF9pZEIUChJjb250ZW50X2lkX3ZhcmlhbnQiTAoLUmVxdWVzdFR5cGUSGgoWUkVRVUVTVFRZUEVfVU5WRVJJRklFRBAAEgcKA05FVxABEgsKB1JFTkVXQUwQAhILCgdSRUxFQVNFEANCDAoKX2NsaWVudF9pZEINCgtfY29udGVudF9pZEIHCgVfdHlwZUIPCg1fcmVxdWVzdF90aW1lQh8KHV9rZXlfY29udHJvbF9ub25jZV9kZXByZWNhdGVkQhMKEV9wcm90b2NvbF92ZXJzaW9uQhQKEl9rZXlfY29udHJvbF9ub25jZUIWChRfZW5jcnlwdGVkX2NsaWVudF9pZCKmAgoKTWV0cmljRGF0YRIXCgpzdGFnZV9uYW1lGAEgASgJSACIAQESOwoLbWV0cmljX2RhdGEYAiADKAsyJi5saWNlbnNlX3Byb3RvY29sLk1ldHJpY0RhdGEuVHlwZVZhbHVlGm4KCVR5cGVWYWx1ZRI6CgR0eXBlGAEgASgOMicubGljZW5zZV9wcm90b2NvbC5NZXRyaWNEYXRhLk1ldHJpY1R5cGVIAIgBARISCgV2YWx1ZRgCIAEoA0gBiAEBQgcKBV90eXBlQggKBl92YWx1ZSJDCgpNZXRyaWNUeXBlEhkKFU1FVFJJQ1RZUEVfVU5WRVJJRklFRBAAEgsKB0xBVEVOQ1kQARINCglUSU1FU1RBTVAQAkINCgtfc3RhZ2VfbmFtZSKJAQoLVmVyc2lvbkluZm8SIAoTbGljZW5zZV9zZGtfdmVyc2lvbhgBIAEoCUgAiAEBEiQKF2xpY2Vuc2Vfc2VydmljZV92ZXJzaW9uGAIgASgJSAGIAQFCFgoUX2xpY2Vuc2Vfc2RrX3ZlcnNpb25CGgoYX2xpY2Vuc2Vfc2VydmljZV92ZXJzaW9uIowHCg1TaWduZWRNZXNzYWdlEj4KBHR5cGUYASABKA4yKy5saWNlbnNlX3Byb3RvY29sLlNpZ25lZE1lc3NhZ2UuTWVzc2FnZVR5cGVIAIgBARIQCgNtc2cYAiABKAxIAYgBARIWCglzaWduYXR1cmUYAyABKAxIAogBARIYCgtzZXNzaW9uX2tleRgEIAEoDEgDiAEBEh8KEnJlbW90ZV9hdHRlc3RhdGlvbhgFIAEoDEgEiAEBEjEKC21ldHJpY19kYXRhGAYgAygLMhwubGljZW5zZV9wcm90b2NvbC5NZXRyaWNEYXRhEkAKFHNlcnZpY2VfdmVyc2lvbl9pbmZvGAcgASgLMh0ubGljZW5zZV9wcm90b2NvbC5WZXJzaW9uSW5mb0gFiAEBEk0KEHNlc3Npb25fa2V5X3R5cGUYCCABKA4yLi5saWNlbnNlX3Byb3RvY29sLlNpZ25lZE1lc3NhZ2UuU2Vzc2lvbktleVR5cGVIBogBARIjChZvZW1jcnlwdG9fY29yZV9tZXNzYWdlGAkgASgMSAeIAQEiiAIKC01lc3NhZ2VUeXBlEhoKFk1FU1NBR0VUWVBFX1VOVkVSSUZJRUQQABITCg9MSUNFTlNFX1JFUVVFU1QQARILCgdMSUNFTlNFEAISEgoORVJST1JfUkVTUE9OU0UQAxIfChtTRVJWSUNFX0NFUlRJRklDQVRFX1JFUVVFU1QQBBIXChNTRVJWSUNFX0NFUlRJRklDQVRFEAUSDwoLU1VCX0xJQ0VOU0UQBhIXChNDQVNfTElDRU5TRV9SRVFVRVNUEAcSDwoLQ0FTX0xJQ0VOU0UQCBIcChhFWFRFUk5BTF9MSUNFTlNFX1JFUVVFU1QQCRIUChBFWFRFUk5BTF9MSUNFTlNFEAoiUwoOU2Vzc2lvbktleVR5cGUSDQoJVU5ERUZJTkVEEAASEwoPV1JBUFBFRF9BRVNfS0VZEAESHQoZRVBIRVJNRVJBTF9FQ0NfUFVCTElDX0tFWRACQgcKBV90eXBlQgYKBF9tc2dCDAoKX3NpZ25hdHVyZUIOCgxfc2Vzc2lvbl9rZXlCFQoTX3JlbW90ZV9hdHRlc3RhdGlvbkIXChVfc2VydmljZV92ZXJzaW9uX2luZm9CEwoRX3Nlc3Npb25fa2V5X3R5cGVCGQoXX29lbWNyeXB0b19jb3JlX21lc3NhZ2UijxEKFENsaWVudElkZW50aWZpY2F0aW9uEkMKBHR5cGUYASABKA4yMC5saWNlbnNlX3Byb3RvY29sLkNsaWVudElkZW50aWZpY2F0aW9uLlRva2VuVHlwZUgAiAEBEhIKBXRva2VuGAIgASgMSAGIAQESRQoLY2xpZW50X2luZm8YAyADKAsyMC5saWNlbnNlX3Byb3RvY29sLkNsaWVudElkZW50aWZpY2F0aW9uLk5hbWVWYWx1ZRIiChVwcm92aWRlcl9jbGllbnRfdG9rZW4YBCABKAxIAogBARIcCg9saWNlbnNlX2NvdW50ZXIYBSABKA1IA4gBARJbChNjbGllbnRfY2FwYWJpbGl0aWVzGAYgASgLMjkubGljZW5zZV9wcm90b2NvbC5DbGllbnRJZGVudGlmaWNhdGlvbi5DbGllbnRDYXBhYmlsaXRpZXNIBIgBARIVCgh2bXBfZGF0YRgHIAEoDEgFiAEBElQKEmRldmljZV9jcmVkZW50aWFscxgIIAMoCzI4LmxpY2Vuc2VfcHJvdG9jb2wuQ2xpZW50SWRlbnRpZmljYXRpb24uQ2xpZW50Q3JlZGVudGlhbHMaRQoJTmFtZVZhbHVlEhEKBG5hbWUYASABKAlIAIgBARISCgV2YWx1ZRgCIAEoCUgBiAEBQgcKBV9uYW1lQggKBl92YWx1ZRqnCgoSQ2xpZW50Q2FwYWJpbGl0aWVzEhkKDGNsaWVudF90b2tlbhgBIAEoCEgAiAEBEhoKDXNlc3Npb25fdG9rZW4YAiABKAhIAYgBARIpChx2aWRlb19yZXNvbHV0aW9uX2NvbnN0cmFpbnRzGAMgASgISAKIAQESZAoQbWF4X2hkY3BfdmVyc2lvbhgEIAEoDjJFLmxpY2Vuc2VfcHJvdG9jb2wuQ2xpZW50SWRlbnRpZmljYXRpb24uQ2xpZW50Q2FwYWJpbGl0aWVzLkhkY3BWZXJzaW9uSAOIAQESIwoWb2VtX2NyeXB0b19hcGlfdmVyc2lvbhgFIAEoDUgEiAEBEiYKGWFudGlfcm9sbGJhY2tfdXNhZ2VfdGFibGUYBiABKAhIBYgBARIYCgtzcm1fdmVyc2lvbhgHIAEoDUgGiAEBEhsKDmNhbl91cGRhdGVfc3JtGAggASgISAeIAQESdAoec3VwcG9ydGVkX2NlcnRpZmljYXRlX2tleV90eXBlGAkgAygOMkwubGljZW5zZV9wcm90b2NvbC5DbGllbnRJZGVudGlmaWNhdGlvbi5DbGllbnRDYXBhYmlsaXRpZXMuQ2VydGlmaWNhdGVLZXlUeXBlEnsKGmFuYWxvZ19vdXRwdXRfY2FwYWJpbGl0aWVzGAogASgOMlIubGljZW5zZV9wcm90b2NvbC5DbGllbnRJZGVudGlmaWNhdGlvbi5DbGllbnRDYXBhYmlsaXRpZXMuQW5hbG9nT3V0cHV0Q2FwYWJpbGl0aWVzSAiIAQESJgoZY2FuX2Rpc2FibGVfYW5hbG9nX291dHB1dBgLIAEoCEgJiAEBEiEKFHJlc291cmNlX3JhdGluZ190aWVyGAwgASgNSAqIAQEigAEKC0hkY3BWZXJzaW9uEg0KCUhEQ1BfTk9ORRAAEgsKB0hEQ1BfVjEQARILCgdIRENQX1YyEAISDQoJSERDUF9WMl8xEAMSDQoJSERDUF9WMl8yEAQSDQoJSERDUF9WMl8zEAUSGwoWSERDUF9OT19ESUdJVEFMX09VVFBVVBD/ASJpChJDZXJ0aWZpY2F0ZUtleVR5cGUSDAoIUlNBXzIwNDgQABIMCghSU0FfMzA3MhABEhEKDUVDQ19TRUNQMjU2UjEQAhIRCg1FQ0NfU0VDUDM4NFIxEAMSEQoNRUNDX1NFQ1A1MjFSMRAEIo0BChhBbmFsb2dPdXRwdXRDYXBhYmlsaXRpZXMSGQoVQU5BTE9HX09VVFBVVF9VTktOT1dOEAASFgoSQU5BTE9HX09VVFBVVF9OT05FEAESGwoXQU5BTE9HX09VVFBVVF9TVVBQT1JURUQQAhIhCh1BTkFMT0dfT1VUUFVUX1NVUFBPUlRTX0NHTVNfQRADQg8KDV9jbGllbnRfdG9rZW5CEAoOX3Nlc3Npb25fdG9rZW5CHwodX3ZpZGVvX3Jlc29sdXRpb25fY29uc3RyYWludHNCEwoRX21heF9oZGNwX3ZlcnNpb25CGQoXX29lbV9jcnlwdG9fYXBpX3ZlcnNpb25CHAoaX2FudGlfcm9sbGJhY2tfdXNhZ2VfdGFibGVCDgoMX3NybV92ZXJzaW9uQhEKD19jYW5fdXBkYXRlX3NybUIdChtfYW5hbG9nX291dHB1dF9jYXBhYmlsaXRpZXNCHAoaX2Nhbl9kaXNhYmxlX2FuYWxvZ19vdXRwdXRCFwoVX3Jlc291cmNlX3JhdGluZ190aWVyGn8KEUNsaWVudENyZWRlbnRpYWxzEkMKBHR5cGUYASABKA4yMC5saWNlbnNlX3Byb3RvY29sLkNsaWVudElkZW50aWZpY2F0aW9uLlRva2VuVHlwZUgAiAEBEhIKBXRva2VuGAIgASgMSAGIAQFCBwoFX3R5cGVCCAoGX3Rva2VuInMKCVRva2VuVHlwZRIKCgZLRVlCT1gQABIaChZEUk1fREVWSUNFX0NFUlRJRklDQVRFEAESIgoeUkVNT1RFX0FUVEVTVEFUSU9OX0NFUlRJRklDQVRFEAISGgoWT0VNX0RFVklDRV9DRVJUSUZJQ0FURRADQgcKBV90eXBlQggKBl90b2tlbkIYChZfcHJvdmlkZXJfY2xpZW50X3Rva2VuQhIKEF9saWNlbnNlX2NvdW50ZXJCFgoUX2NsaWVudF9jYXBhYmlsaXRpZXNCCwoJX3ZtcF9kYXRhItcCCh1FbmNyeXB0ZWRDbGllbnRJZGVudGlmaWNhdGlvbhIYCgtwcm92aWRlcl9pZBgBIAEoCUgAiAEBEi4KIXNlcnZpY2VfY2VydGlmaWNhdGVfc2VyaWFsX251bWJlchgCIAEoDEgBiAEBEiAKE2VuY3J5cHRlZF9jbGllbnRfaWQYAyABKAxIAogBARIjChZlbmNyeXB0ZWRfY2xpZW50X2lkX2l2GAQgASgMSAOIAQESIgoVZW5jcnlwdGVkX3ByaXZhY3lfa2V5GAUgASgMSASIAQFCDgoMX3Byb3ZpZGVyX2lkQiQKIl9zZXJ2aWNlX2NlcnRpZmljYXRlX3NlcmlhbF9udW1iZXJCFgoUX2VuY3J5cHRlZF9jbGllbnRfaWRCGQoXX2VuY3J5cHRlZF9jbGllbnRfaWRfaXZCGAoWX2VuY3J5cHRlZF9wcml2YWN5X2tleSKdCQoORHJtQ2VydGlmaWNhdGUSOAoEdHlwZRgBIAEoDjIlLmxpY2Vuc2VfcHJvdG9jb2wuRHJtQ2VydGlmaWNhdGUuVHlwZUgAiAEBEhoKDXNlcmlhbF9udW1iZXIYAiABKAxIAYgBARIiChVjcmVhdGlvbl90aW1lX3NlY29uZHMYAyABKA1IAogBARIkChdleHBpcmF0aW9uX3RpbWVfc2Vjb25kcxgMIAEoDUgDiAEBEhcKCnB1YmxpY19rZXkYBCABKAxIBIgBARIWCglzeXN0ZW1faWQYBSABKA1IBYgBARInChZ0ZXN0X2RldmljZV9kZXByZWNhdGVkGAYgASgIQgIYAUgGiAEBEhgKC3Byb3ZpZGVyX2lkGAcgASgJSAeIAQESQwoNc2VydmljZV90eXBlcxgIIAMoDjIsLmxpY2Vuc2VfcHJvdG9jb2wuRHJtQ2VydGlmaWNhdGUuU2VydmljZVR5cGUSQgoJYWxnb3JpdGhtGAkgASgOMioubGljZW5zZV9wcm90b2NvbC5Ecm1DZXJ0aWZpY2F0ZS5BbGdvcml0aG1ICIgBARITCgZyb3RfaWQYCiABKAxICYgBARJLCg5lbmNyeXB0aW9uX2tleRgLIAEoCzIuLmxpY2Vuc2VfcHJvdG9jb2wuRHJtQ2VydGlmaWNhdGUuRW5jcnlwdGlvbktleUgKiAEBGokBCg1FbmNyeXB0aW9uS2V5EhcKCnB1YmxpY19rZXkYASABKAxIAIgBARJCCglhbGdvcml0aG0YAiABKA4yKi5saWNlbnNlX3Byb3RvY29sLkRybUNlcnRpZmljYXRlLkFsZ29yaXRobUgBiAEBQg0KC19wdWJsaWNfa2V5QgwKCl9hbGdvcml0aG0iTAoEVHlwZRIICgRST09UEAASEAoMREVWSUNFX01PREVMEAESCgoGREVWSUNFEAISCwoHU0VSVklDRRADEg8KC1BST1ZJU0lPTkVSEAQihgEKC1NlcnZpY2VUeXBlEhgKFFVOS05PV05fU0VSVklDRV9UWVBFEAASFgoSTElDRU5TRV9TRVJWRVJfU0RLEAESHAoYTElDRU5TRV9TRVJWRVJfUFJPWFlfU0RLEAISFAoQUFJPVklTSU9OSU5HX1NESxADEhEKDUNBU19QUk9YWV9TREsQBCJkCglBbGdvcml0aG0SFQoRVU5LTk9XTl9BTEdPUklUSE0QABIHCgNSU0EQARIRCg1FQ0NfU0VDUDI1NlIxEAISEQoNRUNDX1NFQ1AzODRSMRADEhEKDUVDQ19TRUNQNTIxUjEQBEIHCgVfdHlwZUIQCg5fc2VyaWFsX251bWJlckIYChZfY3JlYXRpb25fdGltZV9zZWNvbmRzQhoKGF9leHBpcmF0aW9uX3RpbWVfc2Vjb25kc0INCgtfcHVibGljX2tleUIMCgpfc3lzdGVtX2lkQhkKF190ZXN0X2RldmljZV9kZXByZWNhdGVkQg4KDF9wcm92aWRlcl9pZEIMCgpfYWxnb3JpdGhtQgkKB19yb3RfaWRCEQoPX2VuY3J5cHRpb25fa2V5IowCChRTaWduZWREcm1DZXJ0aWZpY2F0ZRIcCg9kcm1fY2VydGlmaWNhdGUYASABKAxIAIgBARIWCglzaWduYXR1cmUYAiABKAxIAYgBARI7CgZzaWduZXIYAyABKAsyJi5saWNlbnNlX3Byb3RvY29sLlNpZ25lZERybUNlcnRpZmljYXRlSAKIAQESQQoOaGFzaF9hbGdvcml0aG0YBCABKA4yJC5saWNlbnNlX3Byb3RvY29sLkhhc2hBbGdvcml0aG1Qcm90b0gDiAEBQhIKEF9kcm1fY2VydGlmaWNhdGVCDAoKX3NpZ25hdHVyZUIJCgdfc2lnbmVyQhEKD19oYXNoX2FsZ29yaXRobSK7CAoQV2lkZXZpbmVQc3NoRGF0YRIPCgdrZXlfaWRzGAIgAygMEhcKCmNvbnRlbnRfaWQYBCABKAxIAIgBARIgChNjcnlwdG9fcGVyaW9kX2luZGV4GAcgASgNSAGIAQESHgoRcHJvdGVjdGlvbl9zY2hlbWUYCSABKA1IAogBARIiChVjcnlwdG9fcGVyaW9kX3NlY29uZHMYCiABKA1IA4gBARI6CgR0eXBlGAsgASgOMicubGljZW5zZV9wcm90b2NvbC5XaWRldmluZVBzc2hEYXRhLlR5cGVIBIgBARIZCgxrZXlfc2VxdWVuY2UYDCABKA1IBYgBARIRCglncm91cF9pZHMYDSADKAwSRQoNZW50aXRsZWRfa2V5cxgOIAMoCzIuLmxpY2Vuc2VfcHJvdG9jb2wuV2lkZXZpbmVQc3NoRGF0YS5FbnRpdGxlZEtleRIaCg12aWRlb19mZWF0dXJlGA8gASgJSAaIAQESSAoJYWxnb3JpdGhtGAEgASgOMiwubGljZW5zZV9wcm90b2NvbC5XaWRldmluZVBzc2hEYXRhLkFsZ29yaXRobUICGAFIB4gBARIZCghwcm92aWRlchgDIAEoCUICGAFICIgBARIbCgp0cmFja190eXBlGAUgASgJQgIYAUgJiAEBEhcKBnBvbGljeRgGIAEoCUICGAFICogBARIgCg9ncm91cGVkX2xpY2Vuc2UYCCABKAxCAhgBSAuIAQEa3wEKC0VudGl0bGVkS2V5Eh8KEmVudGl0bGVtZW50X2tleV9pZBgBIAEoDEgAiAEBEhMKBmtleV9pZBgCIAEoDEgBiAEBEhAKA2tleRgDIAEoDEgCiAEBEg8KAml2GAQgASgMSAOIAQESJwoaZW50aXRsZW1lbnRfa2V5X3NpemVfYnl0ZXMYBSABKA1IBIgBAUIVChNfZW50aXRsZW1lbnRfa2V5X2lkQgkKB19rZXlfaWRCBgoEX2tleUIFCgNfaXZCHQobX2VudGl0bGVtZW50X2tleV9zaXplX2J5dGVzIjUKBFR5cGUSCgoGU0lOR0xFEAASDwoLRU5USVRMRU1FTlQQARIQCgxFTlRJVExFRF9LRVkQAiIoCglBbGdvcml0aG0SDwoLVU5FTkNSWVBURUQQABIKCgZBRVNDVFIQAUINCgtfY29udGVudF9pZEIWChRfY3J5cHRvX3BlcmlvZF9pbmRleEIUChJfcHJvdGVjdGlvbl9zY2hlbWVCGAoWX2NyeXB0b19wZXJpb2Rfc2Vjb25kc0IHCgVfdHlwZUIPCg1fa2V5X3NlcXVlbmNlQhAKDl92aWRlb19mZWF0dXJlQgwKCl9hbGdvcml0aG1CCwoJX3Byb3ZpZGVyQg0KC190cmFja190eXBlQgkKB19wb2xpY3lCEgoQX2dyb3VwZWRfbGljZW5zZSK4AgoKRmlsZUhhc2hlcxITCgZzaWduZXIYASABKAxIAIgBARI6CgpzaWduYXR1cmVzGAIgAygLMiYubGljZW5zZV9wcm90b2NvbC5GaWxlSGFzaGVzLlNpZ25hdHVyZRrNAQoJU2lnbmF0dXJlEhUKCGZpbGVuYW1lGAEgASgJSACIAQESGQoMdGVzdF9zaWduaW5nGAIgASgISAGIAQESFwoKU0hBNTEySGFzaBgDIAEoDEgCiAEBEhUKCG1haW5fZXhlGAQgASgISAOIAQESFgoJc2lnbmF0dXJlGAUgASgMSASIAQFCCwoJX2ZpbGVuYW1lQg8KDV90ZXN0X3NpZ25pbmdCDQoLX1NIQTUxMkhhc2hCCwoJX21haW5fZXhlQgwKCl9zaWduYXR1cmVCCQoHX3NpZ25lcipUCgtMaWNlbnNlVHlwZRIaChZMSUNFTlNFVFlQRV9VTlZFUklGSUVEEAASDQoJU1RSRUFNSU5HEAESCwoHT0ZGTElORRACEg0KCUFVVE9NQVRJQxADKtkBChpQbGF0Zm9ybVZlcmlmaWNhdGlvblN0YXR1cxIXChNQTEFURk9STV9VTlZFUklGSUVEEAASFQoRUExBVEZPUk1fVEFNUEVSRUQQARIeChpQTEFURk9STV9TT0ZUV0FSRV9WRVJJRklFRBACEh4KGlBMQVRGT1JNX0hBUkRXQVJFX1ZFUklGSUVEEAMSHAoYUExBVEZPUk1fTk9fVkVSSUZJQ0FUSU9OEAQSLQopUExBVEZPUk1fU0VDVVJFX1NUT1JBR0VfU09GVFdBUkVfVkVSSUZJRUQQBSpcCg9Qcm90b2NvbFZlcnNpb24SFgoSVkVSU0lPTl9VTlZFUklGSUVEEAASDwoLVkVSU0lPTl8yXzAQFBIPCgtWRVJTSU9OXzJfMRAVEg8KC1ZFUlNJT05fMl8yEBYqhgEKEkhhc2hBbGdvcml0aG1Qcm90bxIeChpIQVNIX0FMR09SSVRITV9VTlNQRUNJRklFRBAAEhgKFEhBU0hfQUxHT1JJVEhNX1NIQV8xEAESGgoWSEFTSF9BTEdPUklUSE1fU0hBXzI1NhACEhoKFkhBU0hfQUxHT1JJVEhNX1NIQV8zODQQA2IGcHJvdG8z' + ); /** * LicenseIdentification is propagated from LicenseRequest to License, @@ -22,417 +22,417 @@ export const file_license_protocol: GenFile = * @generated from message license_protocol.LicenseIdentification */ export type LicenseIdentification = Message<'license_protocol.LicenseIdentification'> & { - /** - * @generated from field: optional bytes request_id = 1; - */ - requestId?: Uint8Array + /** + * @generated from field: optional bytes request_id = 1; + */ + requestId?: Uint8Array; - /** - * @generated from field: optional bytes session_id = 2; - */ - sessionId?: Uint8Array + /** + * @generated from field: optional bytes session_id = 2; + */ + sessionId?: Uint8Array; - /** - * @generated from field: optional bytes purchase_id = 3; - */ - purchaseId?: Uint8Array + /** + * @generated from field: optional bytes purchase_id = 3; + */ + purchaseId?: Uint8Array; - /** - * @generated from field: optional license_protocol.LicenseType type = 4; - */ - type?: LicenseType + /** + * @generated from field: optional license_protocol.LicenseType type = 4; + */ + type?: LicenseType; - /** - * @generated from field: optional int32 version = 5; - */ - version?: number + /** + * @generated from field: optional int32 version = 5; + */ + version?: number; - /** - * @generated from field: optional bytes provider_session_token = 6; - */ - providerSessionToken?: Uint8Array -} + /** + * @generated from field: optional bytes provider_session_token = 6; + */ + providerSessionToken?: Uint8Array; +}; /** * Describes the message license_protocol.LicenseIdentification. * Use `create(LicenseIdentificationSchema)` to create a new message. */ -export const LicenseIdentificationSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 0) +export const LicenseIdentificationSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 0); /** * @generated from message license_protocol.License */ export type License = Message<'license_protocol.License'> & { - /** - * @generated from field: optional license_protocol.LicenseIdentification id = 1; - */ - id?: LicenseIdentification + /** + * @generated from field: optional license_protocol.LicenseIdentification id = 1; + */ + id?: LicenseIdentification; - /** - * @generated from field: optional license_protocol.License.Policy policy = 2; - */ - policy?: License_Policy + /** + * @generated from field: optional license_protocol.License.Policy policy = 2; + */ + policy?: License_Policy; - /** - * @generated from field: repeated license_protocol.License.KeyContainer key = 3; - */ - key: License_KeyContainer[] + /** + * @generated from field: repeated license_protocol.License.KeyContainer key = 3; + */ + key: License_KeyContainer[]; - /** - * Time of the request in seconds (UTC) as set in - * LicenseRequest.request_time. If this time is not set in the request, - * the local time at the license service is used in this field. - * - * @generated from field: optional int64 license_start_time = 4; - */ - licenseStartTime?: bigint + /** + * Time of the request in seconds (UTC) as set in + * LicenseRequest.request_time. If this time is not set in the request, + * the local time at the license service is used in this field. + * + * @generated from field: optional int64 license_start_time = 4; + */ + licenseStartTime?: bigint; - /** - * @generated from field: optional bool remote_attestation_verified = 5; - */ - remoteAttestationVerified?: boolean + /** + * @generated from field: optional bool remote_attestation_verified = 5; + */ + remoteAttestationVerified?: boolean; - /** - * Client token generated by the content provider. Optional. - * - * @generated from field: optional bytes provider_client_token = 6; - */ - providerClientToken?: Uint8Array + /** + * Client token generated by the content provider. Optional. + * + * @generated from field: optional bytes provider_client_token = 6; + */ + providerClientToken?: Uint8Array; - /** - * 4cc code specifying the CENC protection scheme as defined in the CENC 3.0 - * specification. Propagated from Widevine PSSH box. Optional. - * - * @generated from field: optional uint32 protection_scheme = 7; - */ - protectionScheme?: number + /** + * 4cc code specifying the CENC protection scheme as defined in the CENC 3.0 + * specification. Propagated from Widevine PSSH box. Optional. + * + * @generated from field: optional uint32 protection_scheme = 7; + */ + protectionScheme?: number; - /** - * 8 byte verification field "HDCPDATA" followed by unsigned 32 bit minimum - * HDCP SRM version (whether the version is for HDCP1 SRM or HDCP2 SRM - * depends on client max_hdcp_version). - * Additional details can be found in Widevine Modular DRM Security - * Integration Guide for CENC. - * - * @generated from field: optional bytes srm_requirement = 8; - */ - srmRequirement?: Uint8Array + /** + * 8 byte verification field "HDCPDATA" followed by unsigned 32 bit minimum + * HDCP SRM version (whether the version is for HDCP1 SRM or HDCP2 SRM + * depends on client max_hdcp_version). + * Additional details can be found in Widevine Modular DRM Security + * Integration Guide for CENC. + * + * @generated from field: optional bytes srm_requirement = 8; + */ + srmRequirement?: Uint8Array; - /** - * If present this contains a signed SRM file (either HDCP1 SRM or HDCP2 SRM - * depending on client max_hdcp_version) that should be installed on the - * client device. - * - * @generated from field: optional bytes srm_update = 9; - */ - srmUpdate?: Uint8Array + /** + * If present this contains a signed SRM file (either HDCP1 SRM or HDCP2 SRM + * depending on client max_hdcp_version) that should be installed on the + * client device. + * + * @generated from field: optional bytes srm_update = 9; + */ + srmUpdate?: Uint8Array; - /** - * Indicates the status of any type of platform verification performed by the - * server. - * - * @generated from field: optional license_protocol.PlatformVerificationStatus platform_verification_status = 10; - */ - platformVerificationStatus?: PlatformVerificationStatus + /** + * Indicates the status of any type of platform verification performed by the + * server. + * + * @generated from field: optional license_protocol.PlatformVerificationStatus platform_verification_status = 10; + */ + platformVerificationStatus?: PlatformVerificationStatus; - /** - * IDs of the groups for which keys are delivered in this license, if any. - * - * @generated from field: repeated bytes group_ids = 11; - */ - groupIds: Uint8Array[] -} + /** + * IDs of the groups for which keys are delivered in this license, if any. + * + * @generated from field: repeated bytes group_ids = 11; + */ + groupIds: Uint8Array[]; +}; /** * Describes the message license_protocol.License. * Use `create(LicenseSchema)` to create a new message. */ -export const LicenseSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 1) +export const LicenseSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 1); /** * @generated from message license_protocol.License.Policy */ export type License_Policy = Message<'license_protocol.License.Policy'> & { - /** - * Indicates that playback of the content is allowed. - * - * @generated from field: optional bool can_play = 1; - */ - canPlay?: boolean + /** + * Indicates that playback of the content is allowed. + * + * @generated from field: optional bool can_play = 1; + */ + canPlay?: boolean; - /** - * Indicates that the license may be persisted to non-volatile - * storage for offline use. - * - * @generated from field: optional bool can_persist = 2; - */ - canPersist?: boolean + /** + * Indicates that the license may be persisted to non-volatile + * storage for offline use. + * + * @generated from field: optional bool can_persist = 2; + */ + canPersist?: boolean; - /** - * Indicates that renewal of this license is allowed. - * - * @generated from field: optional bool can_renew = 3; - */ - canRenew?: boolean + /** + * Indicates that renewal of this license is allowed. + * + * @generated from field: optional bool can_renew = 3; + */ + canRenew?: boolean; - /** - * Indicates the rental window. - * - * @generated from field: optional int64 rental_duration_seconds = 4; - */ - rentalDurationSeconds?: bigint + /** + * Indicates the rental window. + * + * @generated from field: optional int64 rental_duration_seconds = 4; + */ + rentalDurationSeconds?: bigint; - /** - * Indicates the viewing window, once playback has begun. - * - * @generated from field: optional int64 playback_duration_seconds = 5; - */ - playbackDurationSeconds?: bigint + /** + * Indicates the viewing window, once playback has begun. + * + * @generated from field: optional int64 playback_duration_seconds = 5; + */ + playbackDurationSeconds?: bigint; - /** - * Indicates the time window for this specific license. - * - * @generated from field: optional int64 license_duration_seconds = 6; - */ - licenseDurationSeconds?: bigint + /** + * Indicates the time window for this specific license. + * + * @generated from field: optional int64 license_duration_seconds = 6; + */ + licenseDurationSeconds?: bigint; - /** - * The window of time, in which playback is allowed to continue while - * renewal is attempted, yet unsuccessful due to backend problems with - * the license server. - * - * @generated from field: optional int64 renewal_recovery_duration_seconds = 7; - */ - renewalRecoveryDurationSeconds?: bigint + /** + * The window of time, in which playback is allowed to continue while + * renewal is attempted, yet unsuccessful due to backend problems with + * the license server. + * + * @generated from field: optional int64 renewal_recovery_duration_seconds = 7; + */ + renewalRecoveryDurationSeconds?: bigint; - /** - * All renewal requests for this license shall be directed to the - * specified URL. - * - * @generated from field: optional string renewal_server_url = 8; - */ - renewalServerUrl?: string + /** + * All renewal requests for this license shall be directed to the + * specified URL. + * + * @generated from field: optional string renewal_server_url = 8; + */ + renewalServerUrl?: string; - /** - * How many seconds after license_start_time, before renewal is first - * attempted. - * - * @generated from field: optional int64 renewal_delay_seconds = 9; - */ - renewalDelaySeconds?: bigint + /** + * How many seconds after license_start_time, before renewal is first + * attempted. + * + * @generated from field: optional int64 renewal_delay_seconds = 9; + */ + renewalDelaySeconds?: bigint; - /** - * Specifies the delay in seconds between subsequent license - * renewal requests, in case of failure. - * - * @generated from field: optional int64 renewal_retry_interval_seconds = 10; - */ - renewalRetryIntervalSeconds?: bigint + /** + * Specifies the delay in seconds between subsequent license + * renewal requests, in case of failure. + * + * @generated from field: optional int64 renewal_retry_interval_seconds = 10; + */ + renewalRetryIntervalSeconds?: bigint; - /** - * Indicates that the license shall be sent for renewal when usage is - * started. - * - * @generated from field: optional bool renew_with_usage = 11; - */ - renewWithUsage?: boolean + /** + * Indicates that the license shall be sent for renewal when usage is + * started. + * + * @generated from field: optional bool renew_with_usage = 11; + */ + renewWithUsage?: boolean; - /** - * Indicates to client that license renewal and release requests ought to - * include ClientIdentification (client_id). - * - * @generated from field: optional bool always_include_client_id = 12; - */ - alwaysIncludeClientId?: boolean + /** + * Indicates to client that license renewal and release requests ought to + * include ClientIdentification (client_id). + * + * @generated from field: optional bool always_include_client_id = 12; + */ + alwaysIncludeClientId?: boolean; - /** - * Duration of grace period before playback_duration_seconds (short window) - * goes into effect. Optional. - * - * @generated from field: optional int64 play_start_grace_period_seconds = 13; - */ - playStartGracePeriodSeconds?: bigint + /** + * Duration of grace period before playback_duration_seconds (short window) + * goes into effect. Optional. + * + * @generated from field: optional int64 play_start_grace_period_seconds = 13; + */ + playStartGracePeriodSeconds?: bigint; - /** - * Enables "soft enforcement" of playback_duration_seconds, letting the user - * finish playback even if short window expires. Optional. - * - * @generated from field: optional bool soft_enforce_playback_duration = 14; - */ - softEnforcePlaybackDuration?: boolean + /** + * Enables "soft enforcement" of playback_duration_seconds, letting the user + * finish playback even if short window expires. Optional. + * + * @generated from field: optional bool soft_enforce_playback_duration = 14; + */ + softEnforcePlaybackDuration?: boolean; - /** - * Enables "soft enforcement" of rental_duration_seconds. Initial playback - * must always start before rental duration expires. In order to allow - * subsequent playbacks to start after the rental duration expires, - * soft_enforce_playback_duration must be true. Otherwise, subsequent - * playbacks will not be allowed once rental duration expires. Optional. - * - * @generated from field: optional bool soft_enforce_rental_duration = 15; - */ - softEnforceRentalDuration?: boolean -} + /** + * Enables "soft enforcement" of rental_duration_seconds. Initial playback + * must always start before rental duration expires. In order to allow + * subsequent playbacks to start after the rental duration expires, + * soft_enforce_playback_duration must be true. Otherwise, subsequent + * playbacks will not be allowed once rental duration expires. Optional. + * + * @generated from field: optional bool soft_enforce_rental_duration = 15; + */ + softEnforceRentalDuration?: boolean; +}; /** * Describes the message license_protocol.License.Policy. * Use `create(License_PolicySchema)` to create a new message. */ -export const License_PolicySchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 1, 0) +export const License_PolicySchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 1, 0); /** * @generated from message license_protocol.License.KeyContainer */ export type License_KeyContainer = Message<'license_protocol.License.KeyContainer'> & { - /** - * @generated from field: optional bytes id = 1; - */ - id?: Uint8Array + /** + * @generated from field: optional bytes id = 1; + */ + id?: Uint8Array; - /** - * @generated from field: optional bytes iv = 2; - */ - iv?: Uint8Array + /** + * @generated from field: optional bytes iv = 2; + */ + iv?: Uint8Array; - /** - * @generated from field: optional bytes key = 3; - */ - key?: Uint8Array + /** + * @generated from field: optional bytes key = 3; + */ + key?: Uint8Array; - /** - * @generated from field: optional license_protocol.License.KeyContainer.KeyType type = 4; - */ - type?: License_KeyContainer_KeyType + /** + * @generated from field: optional license_protocol.License.KeyContainer.KeyType type = 4; + */ + type?: License_KeyContainer_KeyType; - /** - * @generated from field: optional license_protocol.License.KeyContainer.SecurityLevel level = 5; - */ - level?: License_KeyContainer_SecurityLevel + /** + * @generated from field: optional license_protocol.License.KeyContainer.SecurityLevel level = 5; + */ + level?: License_KeyContainer_SecurityLevel; - /** - * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection required_protection = 6; - */ - requiredProtection?: License_KeyContainer_OutputProtection + /** + * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection required_protection = 6; + */ + requiredProtection?: License_KeyContainer_OutputProtection; - /** - * NOTE: Use of requested_protection is not recommended as it is only - * supported on a small number of platforms. - * - * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection requested_protection = 7; - */ - requestedProtection?: License_KeyContainer_OutputProtection + /** + * NOTE: Use of requested_protection is not recommended as it is only + * supported on a small number of platforms. + * + * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection requested_protection = 7; + */ + requestedProtection?: License_KeyContainer_OutputProtection; - /** - * @generated from field: optional license_protocol.License.KeyContainer.KeyControl key_control = 8; - */ - keyControl?: License_KeyContainer_KeyControl + /** + * @generated from field: optional license_protocol.License.KeyContainer.KeyControl key_control = 8; + */ + keyControl?: License_KeyContainer_KeyControl; - /** - * @generated from field: optional license_protocol.License.KeyContainer.OperatorSessionKeyPermissions operator_session_key_permissions = 9; - */ - operatorSessionKeyPermissions?: License_KeyContainer_OperatorSessionKeyPermissions + /** + * @generated from field: optional license_protocol.License.KeyContainer.OperatorSessionKeyPermissions operator_session_key_permissions = 9; + */ + operatorSessionKeyPermissions?: License_KeyContainer_OperatorSessionKeyPermissions; - /** - * Optional video resolution constraints. If the video resolution of the - * content being decrypted/decoded falls within one of the specified ranges, - * the optional required_protections may be applied. Otherwise an error will - * be reported. - * NOTE: Use of this feature is not recommended, as it is only supported on - * a small number of platforms. - * - * @generated from field: repeated license_protocol.License.KeyContainer.VideoResolutionConstraint video_resolution_constraints = 10; - */ - videoResolutionConstraints: License_KeyContainer_VideoResolutionConstraint[] + /** + * Optional video resolution constraints. If the video resolution of the + * content being decrypted/decoded falls within one of the specified ranges, + * the optional required_protections may be applied. Otherwise an error will + * be reported. + * NOTE: Use of this feature is not recommended, as it is only supported on + * a small number of platforms. + * + * @generated from field: repeated license_protocol.License.KeyContainer.VideoResolutionConstraint video_resolution_constraints = 10; + */ + videoResolutionConstraints: License_KeyContainer_VideoResolutionConstraint[]; - /** - * Optional flag to indicate the key must only be used if the client - * supports anti rollback of the user table. Content provider can query the - * client capabilities to determine if the client support this feature. - * - * @generated from field: optional bool anti_rollback_usage_table = 11; - */ - antiRollbackUsageTable?: boolean + /** + * Optional flag to indicate the key must only be used if the client + * supports anti rollback of the user table. Content provider can query the + * client capabilities to determine if the client support this feature. + * + * @generated from field: optional bool anti_rollback_usage_table = 11; + */ + antiRollbackUsageTable?: boolean; - /** - * Optional not limited to commonly known track types such as SD, HD. - * It can be some provider defined label to identify the track. - * - * @generated from field: optional string track_label = 12; - */ - trackLabel?: string -} + /** + * Optional not limited to commonly known track types such as SD, HD. + * It can be some provider defined label to identify the track. + * + * @generated from field: optional string track_label = 12; + */ + trackLabel?: string; +}; /** * Describes the message license_protocol.License.KeyContainer. * Use `create(License_KeyContainerSchema)` to create a new message. */ -export const License_KeyContainerSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 1, 1) +export const License_KeyContainerSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 1, 1); /** * @generated from message license_protocol.License.KeyContainer.KeyControl */ export type License_KeyContainer_KeyControl = Message<'license_protocol.License.KeyContainer.KeyControl'> & { - /** - * |key_control| is documented in: - * Widevine Modular DRM Security Integration Guide for CENC - * If present, the key control must be communicated to the secure - * environment prior to any usage. This message is automatically generated - * by the Widevine License Server SDK. - * - * @generated from field: optional bytes key_control_block = 1; - */ - keyControlBlock?: Uint8Array + /** + * |key_control| is documented in: + * Widevine Modular DRM Security Integration Guide for CENC + * If present, the key control must be communicated to the secure + * environment prior to any usage. This message is automatically generated + * by the Widevine License Server SDK. + * + * @generated from field: optional bytes key_control_block = 1; + */ + keyControlBlock?: Uint8Array; - /** - * @generated from field: optional bytes iv = 2; - */ - iv?: Uint8Array -} + /** + * @generated from field: optional bytes iv = 2; + */ + iv?: Uint8Array; +}; /** * Describes the message license_protocol.License.KeyContainer.KeyControl. * Use `create(License_KeyContainer_KeyControlSchema)` to create a new message. */ -export const License_KeyContainer_KeyControlSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 1, 1, 0) +export const License_KeyContainer_KeyControlSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 1, 1, 0); /** * @generated from message license_protocol.License.KeyContainer.OutputProtection */ export type License_KeyContainer_OutputProtection = Message<'license_protocol.License.KeyContainer.OutputProtection'> & { - /** - * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection.HDCP hdcp = 1; - */ - hdcp?: License_KeyContainer_OutputProtection_HDCP + /** + * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection.HDCP hdcp = 1; + */ + hdcp?: License_KeyContainer_OutputProtection_HDCP; - /** - * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection.CGMS cgms_flags = 2; - */ - cgmsFlags?: License_KeyContainer_OutputProtection_CGMS + /** + * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection.CGMS cgms_flags = 2; + */ + cgmsFlags?: License_KeyContainer_OutputProtection_CGMS; - /** - * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection.HdcpSrmRule hdcp_srm_rule = 3; - */ - hdcpSrmRule?: License_KeyContainer_OutputProtection_HdcpSrmRule + /** + * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection.HdcpSrmRule hdcp_srm_rule = 3; + */ + hdcpSrmRule?: License_KeyContainer_OutputProtection_HdcpSrmRule; - /** - * Optional requirement to indicate analog output is not allowed. - * - * @generated from field: optional bool disable_analog_output = 4; - */ - disableAnalogOutput?: boolean + /** + * Optional requirement to indicate analog output is not allowed. + * + * @generated from field: optional bool disable_analog_output = 4; + */ + disableAnalogOutput?: boolean; - /** - * Optional requirement to indicate digital output is not allowed. - * - * @generated from field: optional bool disable_digital_output = 5; - */ - disableDigitalOutput?: boolean -} + /** + * Optional requirement to indicate digital output is not allowed. + * + * @generated from field: optional bool disable_digital_output = 5; + */ + disableDigitalOutput?: boolean; +}; /** * Describes the message license_protocol.License.KeyContainer.OutputProtection. * Use `create(License_KeyContainer_OutputProtectionSchema)` to create a new message. */ -export const License_KeyContainer_OutputProtectionSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 1, 1, 1) +export const License_KeyContainer_OutputProtectionSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 1, 1, 1); /** * Indicates whether HDCP is required on digital outputs, and which @@ -441,46 +441,46 @@ export const License_KeyContainer_OutputProtectionSchema: GenMessage = /*@__PURE__*/ enumDesc(file_license_protocol, 1, 1, 1, 0) +export const License_KeyContainer_OutputProtection_HDCPSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 1, 1, 1, 0); /** * Indicate the CGMS setting to be inserted on analog output. @@ -488,186 +488,186 @@ export const License_KeyContainer_OutputProtection_HDCPSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 1, 1, 1, 1) +export const License_KeyContainer_OutputProtection_CGMSSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 1, 1, 1, 1); /** * @generated from enum license_protocol.License.KeyContainer.OutputProtection.HdcpSrmRule */ export enum License_KeyContainer_OutputProtection_HdcpSrmRule { - /** - * @generated from enum value: HDCP_SRM_RULE_NONE = 0; - */ - HDCP_SRM_RULE_NONE = 0, + /** + * @generated from enum value: HDCP_SRM_RULE_NONE = 0; + */ + HDCP_SRM_RULE_NONE = 0, - /** - * In 'required_protection', this means most current SRM is required. - * Update the SRM on the device. If update cannot happen, - * do not allow the key. - * In 'requested_protection', this means most current SRM is requested. - * Update the SRM on the device. If update cannot happen, - * allow use of the key anyway. - * - * @generated from enum value: CURRENT_SRM = 1; - */ - CURRENT_SRM = 1 + /** + * In 'required_protection', this means most current SRM is required. + * Update the SRM on the device. If update cannot happen, + * do not allow the key. + * In 'requested_protection', this means most current SRM is requested. + * Update the SRM on the device. If update cannot happen, + * allow use of the key anyway. + * + * @generated from enum value: CURRENT_SRM = 1; + */ + CURRENT_SRM = 1 } /** * Describes the enum license_protocol.License.KeyContainer.OutputProtection.HdcpSrmRule. */ export const License_KeyContainer_OutputProtection_HdcpSrmRuleSchema: GenEnum = - /*@__PURE__*/ - enumDesc(file_license_protocol, 1, 1, 1, 2) + /*@__PURE__*/ + enumDesc(file_license_protocol, 1, 1, 1, 2); /** * @generated from message license_protocol.License.KeyContainer.VideoResolutionConstraint */ export type License_KeyContainer_VideoResolutionConstraint = Message<'license_protocol.License.KeyContainer.VideoResolutionConstraint'> & { - /** - * Minimum and maximum video resolutions in the range (height x width). - * - * @generated from field: optional uint32 min_resolution_pixels = 1; - */ - minResolutionPixels?: number + /** + * Minimum and maximum video resolutions in the range (height x width). + * + * @generated from field: optional uint32 min_resolution_pixels = 1; + */ + minResolutionPixels?: number; - /** - * @generated from field: optional uint32 max_resolution_pixels = 2; - */ - maxResolutionPixels?: number + /** + * @generated from field: optional uint32 max_resolution_pixels = 2; + */ + maxResolutionPixels?: number; - /** - * Optional output protection requirements for this range. If not - * specified, the OutputProtection in the KeyContainer applies. - * - * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection required_protection = 3; - */ - requiredProtection?: License_KeyContainer_OutputProtection -} + /** + * Optional output protection requirements for this range. If not + * specified, the OutputProtection in the KeyContainer applies. + * + * @generated from field: optional license_protocol.License.KeyContainer.OutputProtection required_protection = 3; + */ + requiredProtection?: License_KeyContainer_OutputProtection; +}; /** * Describes the message license_protocol.License.KeyContainer.VideoResolutionConstraint. * Use `create(License_KeyContainer_VideoResolutionConstraintSchema)` to create a new message. */ export const License_KeyContainer_VideoResolutionConstraintSchema: GenMessage = - /*@__PURE__*/ - messageDesc(file_license_protocol, 1, 1, 2) + /*@__PURE__*/ + messageDesc(file_license_protocol, 1, 1, 2); /** * @generated from message license_protocol.License.KeyContainer.OperatorSessionKeyPermissions */ export type License_KeyContainer_OperatorSessionKeyPermissions = Message<'license_protocol.License.KeyContainer.OperatorSessionKeyPermissions'> & { - /** - * Permissions/key usage flags for operator service keys - * (type = OPERATOR_SESSION). - * - * @generated from field: optional bool allow_encrypt = 1; - */ - allowEncrypt?: boolean + /** + * Permissions/key usage flags for operator service keys + * (type = OPERATOR_SESSION). + * + * @generated from field: optional bool allow_encrypt = 1; + */ + allowEncrypt?: boolean; - /** - * @generated from field: optional bool allow_decrypt = 2; - */ - allowDecrypt?: boolean + /** + * @generated from field: optional bool allow_decrypt = 2; + */ + allowDecrypt?: boolean; - /** - * @generated from field: optional bool allow_sign = 3; - */ - allowSign?: boolean + /** + * @generated from field: optional bool allow_sign = 3; + */ + allowSign?: boolean; - /** - * @generated from field: optional bool allow_signature_verify = 4; - */ - allowSignatureVerify?: boolean -} + /** + * @generated from field: optional bool allow_signature_verify = 4; + */ + allowSignatureVerify?: boolean; +}; /** * Describes the message license_protocol.License.KeyContainer.OperatorSessionKeyPermissions. * Use `create(License_KeyContainer_OperatorSessionKeyPermissionsSchema)` to create a new message. */ export const License_KeyContainer_OperatorSessionKeyPermissionsSchema: GenMessage = - /*@__PURE__*/ - messageDesc(file_license_protocol, 1, 1, 3) + /*@__PURE__*/ + messageDesc(file_license_protocol, 1, 1, 3); /** * @generated from enum license_protocol.License.KeyContainer.KeyType */ export enum License_KeyContainer_KeyType { - /** - * @generated from enum value: KEYTYPE_UNVERIFIED = 0; - */ - KEYTYPE_UNVERIFIED = 0, + /** + * @generated from enum value: KEYTYPE_UNVERIFIED = 0; + */ + KEYTYPE_UNVERIFIED = 0, - /** - * Exactly one key of this type must appear. - * - * @generated from enum value: SIGNING = 1; - */ - SIGNING = 1, + /** + * Exactly one key of this type must appear. + * + * @generated from enum value: SIGNING = 1; + */ + SIGNING = 1, - /** - * Content key. - * - * @generated from enum value: CONTENT = 2; - */ - CONTENT = 2, + /** + * Content key. + * + * @generated from enum value: CONTENT = 2; + */ + CONTENT = 2, - /** - * Key control block for license renewals. No key. - * - * @generated from enum value: KEY_CONTROL = 3; - */ - KEY_CONTROL = 3, + /** + * Key control block for license renewals. No key. + * + * @generated from enum value: KEY_CONTROL = 3; + */ + KEY_CONTROL = 3, - /** - * wrapped keys for auxiliary crypto operations. - * - * @generated from enum value: OPERATOR_SESSION = 4; - */ - OPERATOR_SESSION = 4, + /** + * wrapped keys for auxiliary crypto operations. + * + * @generated from enum value: OPERATOR_SESSION = 4; + */ + OPERATOR_SESSION = 4, - /** - * Entitlement keys. - * - * @generated from enum value: ENTITLEMENT = 5; - */ - ENTITLEMENT = 5, + /** + * Entitlement keys. + * + * @generated from enum value: ENTITLEMENT = 5; + */ + ENTITLEMENT = 5, - /** - * Partner-specific content key. - * - * @generated from enum value: OEM_CONTENT = 6; - */ - OEM_CONTENT = 6 + /** + * Partner-specific content key. + * + * @generated from enum value: OEM_CONTENT = 6; + */ + OEM_CONTENT = 6 } /** * Describes the enum license_protocol.License.KeyContainer.KeyType. */ -export const License_KeyContainer_KeyTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 1, 1, 0) +export const License_KeyContainer_KeyTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 1, 1, 0); /** * The SecurityLevel enumeration allows the server to communicate the level @@ -676,627 +676,627 @@ export const License_KeyContainer_KeyTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 1, 1, 1) +export const License_KeyContainer_SecurityLevelSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 1, 1, 1); /** * @generated from message license_protocol.LicenseRequest */ export type LicenseRequest = Message<'license_protocol.LicenseRequest'> & { - /** - * The client_id provides information authenticating the calling device. It - * contains the Widevine keybox token that was installed on the device at the - * factory. This field or encrypted_client_id below is required for a valid - * license request, but both should never be present in the same request. - * - * @generated from field: optional license_protocol.ClientIdentification client_id = 1; - */ - clientId?: ClientIdentification + /** + * The client_id provides information authenticating the calling device. It + * contains the Widevine keybox token that was installed on the device at the + * factory. This field or encrypted_client_id below is required for a valid + * license request, but both should never be present in the same request. + * + * @generated from field: optional license_protocol.ClientIdentification client_id = 1; + */ + clientId?: ClientIdentification; - /** - * @generated from field: optional license_protocol.LicenseRequest.ContentIdentification content_id = 2; - */ - contentId?: LicenseRequest_ContentIdentification + /** + * @generated from field: optional license_protocol.LicenseRequest.ContentIdentification content_id = 2; + */ + contentId?: LicenseRequest_ContentIdentification; - /** - * @generated from field: optional license_protocol.LicenseRequest.RequestType type = 3; - */ - type?: LicenseRequest_RequestType + /** + * @generated from field: optional license_protocol.LicenseRequest.RequestType type = 3; + */ + type?: LicenseRequest_RequestType; - /** - * Time of the request in seconds (UTC) as set by the client. - * - * @generated from field: optional int64 request_time = 4; - */ - requestTime?: bigint + /** + * Time of the request in seconds (UTC) as set by the client. + * + * @generated from field: optional int64 request_time = 4; + */ + requestTime?: bigint; - /** - * Old-style decimal-encoded string key control nonce. - * - * @generated from field: optional bytes key_control_nonce_deprecated = 5; - */ - keyControlNonceDeprecated?: Uint8Array + /** + * Old-style decimal-encoded string key control nonce. + * + * @generated from field: optional bytes key_control_nonce_deprecated = 5; + */ + keyControlNonceDeprecated?: Uint8Array; - /** - * @generated from field: optional license_protocol.ProtocolVersion protocol_version = 6; - */ - protocolVersion?: ProtocolVersion + /** + * @generated from field: optional license_protocol.ProtocolVersion protocol_version = 6; + */ + protocolVersion?: ProtocolVersion; - /** - * New-style uint32 key control nonce, please use instead of - * key_control_nonce_deprecated. - * - * @generated from field: optional uint32 key_control_nonce = 7; - */ - keyControlNonce?: number + /** + * New-style uint32 key control nonce, please use instead of + * key_control_nonce_deprecated. + * + * @generated from field: optional uint32 key_control_nonce = 7; + */ + keyControlNonce?: number; - /** - * Encrypted ClientIdentification message, used for privacy purposes. - * - * @generated from field: optional license_protocol.EncryptedClientIdentification encrypted_client_id = 8; - */ - encryptedClientId?: EncryptedClientIdentification -} + /** + * Encrypted ClientIdentification message, used for privacy purposes. + * + * @generated from field: optional license_protocol.EncryptedClientIdentification encrypted_client_id = 8; + */ + encryptedClientId?: EncryptedClientIdentification; +}; /** * Describes the message license_protocol.LicenseRequest. * Use `create(LicenseRequestSchema)` to create a new message. */ -export const LicenseRequestSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 2) +export const LicenseRequestSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 2); /** * @generated from message license_protocol.LicenseRequest.ContentIdentification */ export type LicenseRequest_ContentIdentification = Message<'license_protocol.LicenseRequest.ContentIdentification'> & { - /** - * @generated from oneof license_protocol.LicenseRequest.ContentIdentification.content_id_variant - */ - contentIdVariant: - | { - /** - * Exactly one of these must be present. - * - * @generated from field: license_protocol.LicenseRequest.ContentIdentification.WidevinePsshData widevine_pssh_data = 1; - */ - value: LicenseRequest_ContentIdentification_WidevinePsshData - case: 'widevinePsshData' - } - | { - /** - * @generated from field: license_protocol.LicenseRequest.ContentIdentification.WebmKeyId webm_key_id = 2; - */ - value: LicenseRequest_ContentIdentification_WebmKeyId - case: 'webmKeyId' - } - | { - /** - * @generated from field: license_protocol.LicenseRequest.ContentIdentification.ExistingLicense existing_license = 3; - */ - value: LicenseRequest_ContentIdentification_ExistingLicense - case: 'existingLicense' - } - | { - /** - * @generated from field: license_protocol.LicenseRequest.ContentIdentification.InitData init_data = 4; - */ - value: LicenseRequest_ContentIdentification_InitData - case: 'initData' - } - | { case: undefined; value?: undefined } -} + /** + * @generated from oneof license_protocol.LicenseRequest.ContentIdentification.content_id_variant + */ + contentIdVariant: + | { + /** + * Exactly one of these must be present. + * + * @generated from field: license_protocol.LicenseRequest.ContentIdentification.WidevinePsshData widevine_pssh_data = 1; + */ + value: LicenseRequest_ContentIdentification_WidevinePsshData; + case: 'widevinePsshData'; + } + | { + /** + * @generated from field: license_protocol.LicenseRequest.ContentIdentification.WebmKeyId webm_key_id = 2; + */ + value: LicenseRequest_ContentIdentification_WebmKeyId; + case: 'webmKeyId'; + } + | { + /** + * @generated from field: license_protocol.LicenseRequest.ContentIdentification.ExistingLicense existing_license = 3; + */ + value: LicenseRequest_ContentIdentification_ExistingLicense; + case: 'existingLicense'; + } + | { + /** + * @generated from field: license_protocol.LicenseRequest.ContentIdentification.InitData init_data = 4; + */ + value: LicenseRequest_ContentIdentification_InitData; + case: 'initData'; + } + | { case: undefined; value?: undefined }; +}; /** * Describes the message license_protocol.LicenseRequest.ContentIdentification. * Use `create(LicenseRequest_ContentIdentificationSchema)` to create a new message. */ -export const LicenseRequest_ContentIdentificationSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 2, 0) +export const LicenseRequest_ContentIdentificationSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 2, 0); /** * @generated from message license_protocol.LicenseRequest.ContentIdentification.WidevinePsshData */ export type LicenseRequest_ContentIdentification_WidevinePsshData = Message<'license_protocol.LicenseRequest.ContentIdentification.WidevinePsshData'> & { - /** - * @generated from field: repeated bytes pssh_data = 1; - */ - psshData: Uint8Array[] + /** + * @generated from field: repeated bytes pssh_data = 1; + */ + psshData: Uint8Array[]; - /** - * @generated from field: optional license_protocol.LicenseType license_type = 2; - */ - licenseType?: LicenseType + /** + * @generated from field: optional license_protocol.LicenseType license_type = 2; + */ + licenseType?: LicenseType; - /** - * Opaque, client-specified. - * - * @generated from field: optional bytes request_id = 3; - */ - requestId?: Uint8Array -} + /** + * Opaque, client-specified. + * + * @generated from field: optional bytes request_id = 3; + */ + requestId?: Uint8Array; +}; /** * Describes the message license_protocol.LicenseRequest.ContentIdentification.WidevinePsshData. * Use `create(LicenseRequest_ContentIdentification_WidevinePsshDataSchema)` to create a new message. */ export const LicenseRequest_ContentIdentification_WidevinePsshDataSchema: GenMessage = - /*@__PURE__*/ - messageDesc(file_license_protocol, 2, 0, 0) + /*@__PURE__*/ + messageDesc(file_license_protocol, 2, 0, 0); /** * @generated from message license_protocol.LicenseRequest.ContentIdentification.WebmKeyId */ export type LicenseRequest_ContentIdentification_WebmKeyId = Message<'license_protocol.LicenseRequest.ContentIdentification.WebmKeyId'> & { - /** - * @generated from field: optional bytes header = 1; - */ - header?: Uint8Array + /** + * @generated from field: optional bytes header = 1; + */ + header?: Uint8Array; - /** - * @generated from field: optional license_protocol.LicenseType license_type = 2; - */ - licenseType?: LicenseType + /** + * @generated from field: optional license_protocol.LicenseType license_type = 2; + */ + licenseType?: LicenseType; - /** - * Opaque, client-specified. - * - * @generated from field: optional bytes request_id = 3; - */ - requestId?: Uint8Array -} + /** + * Opaque, client-specified. + * + * @generated from field: optional bytes request_id = 3; + */ + requestId?: Uint8Array; +}; /** * Describes the message license_protocol.LicenseRequest.ContentIdentification.WebmKeyId. * Use `create(LicenseRequest_ContentIdentification_WebmKeyIdSchema)` to create a new message. */ export const LicenseRequest_ContentIdentification_WebmKeyIdSchema: GenMessage = - /*@__PURE__*/ - messageDesc(file_license_protocol, 2, 0, 1) + /*@__PURE__*/ + messageDesc(file_license_protocol, 2, 0, 1); /** * @generated from message license_protocol.LicenseRequest.ContentIdentification.ExistingLicense */ export type LicenseRequest_ContentIdentification_ExistingLicense = Message<'license_protocol.LicenseRequest.ContentIdentification.ExistingLicense'> & { - /** - * @generated from field: optional license_protocol.LicenseIdentification license_id = 1; - */ - licenseId?: LicenseIdentification + /** + * @generated from field: optional license_protocol.LicenseIdentification license_id = 1; + */ + licenseId?: LicenseIdentification; - /** - * @generated from field: optional int64 seconds_since_started = 2; - */ - secondsSinceStarted?: bigint + /** + * @generated from field: optional int64 seconds_since_started = 2; + */ + secondsSinceStarted?: bigint; - /** - * @generated from field: optional int64 seconds_since_last_played = 3; - */ - secondsSinceLastPlayed?: bigint + /** + * @generated from field: optional int64 seconds_since_last_played = 3; + */ + secondsSinceLastPlayed?: bigint; - /** - * @generated from field: optional bytes session_usage_table_entry = 4; - */ - sessionUsageTableEntry?: Uint8Array -} + /** + * @generated from field: optional bytes session_usage_table_entry = 4; + */ + sessionUsageTableEntry?: Uint8Array; +}; /** * Describes the message license_protocol.LicenseRequest.ContentIdentification.ExistingLicense. * Use `create(LicenseRequest_ContentIdentification_ExistingLicenseSchema)` to create a new message. */ export const LicenseRequest_ContentIdentification_ExistingLicenseSchema: GenMessage = - /*@__PURE__*/ - messageDesc(file_license_protocol, 2, 0, 2) + /*@__PURE__*/ + messageDesc(file_license_protocol, 2, 0, 2); /** * @generated from message license_protocol.LicenseRequest.ContentIdentification.InitData */ export type LicenseRequest_ContentIdentification_InitData = Message<'license_protocol.LicenseRequest.ContentIdentification.InitData'> & { - /** - * @generated from field: optional license_protocol.LicenseRequest.ContentIdentification.InitData.InitDataType init_data_type = 1; - */ - initDataType?: LicenseRequest_ContentIdentification_InitData_InitDataType + /** + * @generated from field: optional license_protocol.LicenseRequest.ContentIdentification.InitData.InitDataType init_data_type = 1; + */ + initDataType?: LicenseRequest_ContentIdentification_InitData_InitDataType; - /** - * @generated from field: optional bytes init_data = 2; - */ - initData?: Uint8Array + /** + * @generated from field: optional bytes init_data = 2; + */ + initData?: Uint8Array; - /** - * @generated from field: optional license_protocol.LicenseType license_type = 3; - */ - licenseType?: LicenseType + /** + * @generated from field: optional license_protocol.LicenseType license_type = 3; + */ + licenseType?: LicenseType; - /** - * @generated from field: optional bytes request_id = 4; - */ - requestId?: Uint8Array -} + /** + * @generated from field: optional bytes request_id = 4; + */ + requestId?: Uint8Array; +}; /** * Describes the message license_protocol.LicenseRequest.ContentIdentification.InitData. * Use `create(LicenseRequest_ContentIdentification_InitDataSchema)` to create a new message. */ export const LicenseRequest_ContentIdentification_InitDataSchema: GenMessage = - /*@__PURE__*/ - messageDesc(file_license_protocol, 2, 0, 3) + /*@__PURE__*/ + messageDesc(file_license_protocol, 2, 0, 3); /** * @generated from enum license_protocol.LicenseRequest.ContentIdentification.InitData.InitDataType */ export enum LicenseRequest_ContentIdentification_InitData_InitDataType { - /** - * @generated from enum value: INITDATATYPE_UNVERIFIED = 0; - */ - INITDATATYPE_UNVERIFIED = 0, + /** + * @generated from enum value: INITDATATYPE_UNVERIFIED = 0; + */ + INITDATATYPE_UNVERIFIED = 0, - /** - * @generated from enum value: CENC = 1; - */ - CENC = 1, + /** + * @generated from enum value: CENC = 1; + */ + CENC = 1, - /** - * @generated from enum value: WEBM = 2; - */ - WEBM = 2 + /** + * @generated from enum value: WEBM = 2; + */ + WEBM = 2 } /** * Describes the enum license_protocol.LicenseRequest.ContentIdentification.InitData.InitDataType. */ export const LicenseRequest_ContentIdentification_InitData_InitDataTypeSchema: GenEnum = - /*@__PURE__*/ - enumDesc(file_license_protocol, 2, 0, 3, 0) + /*@__PURE__*/ + enumDesc(file_license_protocol, 2, 0, 3, 0); /** * @generated from enum license_protocol.LicenseRequest.RequestType */ export enum LicenseRequest_RequestType { - /** - * @generated from enum value: REQUESTTYPE_UNVERIFIED = 0; - */ - REQUESTTYPE_UNVERIFIED = 0, + /** + * @generated from enum value: REQUESTTYPE_UNVERIFIED = 0; + */ + REQUESTTYPE_UNVERIFIED = 0, - /** - * @generated from enum value: NEW = 1; - */ - NEW = 1, + /** + * @generated from enum value: NEW = 1; + */ + NEW = 1, - /** - * @generated from enum value: RENEWAL = 2; - */ - RENEWAL = 2, + /** + * @generated from enum value: RENEWAL = 2; + */ + RENEWAL = 2, - /** - * @generated from enum value: RELEASE = 3; - */ - RELEASE = 3 + /** + * @generated from enum value: RELEASE = 3; + */ + RELEASE = 3 } /** * Describes the enum license_protocol.LicenseRequest.RequestType. */ -export const LicenseRequest_RequestTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 2, 0) +export const LicenseRequest_RequestTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 2, 0); /** * @generated from message license_protocol.MetricData */ export type MetricData = Message<'license_protocol.MetricData'> & { - /** - * 'stage' that is currently processing the SignedMessage. Required. - * - * @generated from field: optional string stage_name = 1; - */ - stageName?: string + /** + * 'stage' that is currently processing the SignedMessage. Required. + * + * @generated from field: optional string stage_name = 1; + */ + stageName?: string; - /** - * metric and associated value. - * - * @generated from field: repeated license_protocol.MetricData.TypeValue metric_data = 2; - */ - metricData: MetricData_TypeValue[] -} + /** + * metric and associated value. + * + * @generated from field: repeated license_protocol.MetricData.TypeValue metric_data = 2; + */ + metricData: MetricData_TypeValue[]; +}; /** * Describes the message license_protocol.MetricData. * Use `create(MetricDataSchema)` to create a new message. */ -export const MetricDataSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 3) +export const MetricDataSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 3); /** * @generated from message license_protocol.MetricData.TypeValue */ export type MetricData_TypeValue = Message<'license_protocol.MetricData.TypeValue'> & { - /** - * @generated from field: optional license_protocol.MetricData.MetricType type = 1; - */ - type?: MetricData_MetricType + /** + * @generated from field: optional license_protocol.MetricData.MetricType type = 1; + */ + type?: MetricData_MetricType; - /** - * The value associated with 'type'. For example if type == LATENCY, the - * value would be the time in microseconds spent in this 'stage'. - * - * @generated from field: optional int64 value = 2; - */ - value?: bigint -} + /** + * The value associated with 'type'. For example if type == LATENCY, the + * value would be the time in microseconds spent in this 'stage'. + * + * @generated from field: optional int64 value = 2; + */ + value?: bigint; +}; /** * Describes the message license_protocol.MetricData.TypeValue. * Use `create(MetricData_TypeValueSchema)` to create a new message. */ -export const MetricData_TypeValueSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 3, 0) +export const MetricData_TypeValueSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 3, 0); /** * @generated from enum license_protocol.MetricData.MetricType */ export enum MetricData_MetricType { - /** - * @generated from enum value: METRICTYPE_UNVERIFIED = 0; - */ - METRICTYPE_UNVERIFIED = 0, + /** + * @generated from enum value: METRICTYPE_UNVERIFIED = 0; + */ + METRICTYPE_UNVERIFIED = 0, - /** - * The time spent in the 'stage', specified in microseconds. - * - * @generated from enum value: LATENCY = 1; - */ - LATENCY = 1, + /** + * The time spent in the 'stage', specified in microseconds. + * + * @generated from enum value: LATENCY = 1; + */ + LATENCY = 1, - /** - * The UNIX epoch timestamp at which the 'stage' was first accessed in - * microseconds. - * - * @generated from enum value: TIMESTAMP = 2; - */ - TIMESTAMP = 2 + /** + * The UNIX epoch timestamp at which the 'stage' was first accessed in + * microseconds. + * + * @generated from enum value: TIMESTAMP = 2; + */ + TIMESTAMP = 2 } /** * Describes the enum license_protocol.MetricData.MetricType. */ -export const MetricData_MetricTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 3, 0) +export const MetricData_MetricTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 3, 0); /** * @generated from message license_protocol.VersionInfo */ export type VersionInfo = Message<'license_protocol.VersionInfo'> & { - /** - * License SDK version reported by the Widevine License SDK. This field - * is populated automatically by the SDK. - * - * @generated from field: optional string license_sdk_version = 1; - */ - licenseSdkVersion?: string + /** + * License SDK version reported by the Widevine License SDK. This field + * is populated automatically by the SDK. + * + * @generated from field: optional string license_sdk_version = 1; + */ + licenseSdkVersion?: string; - /** - * Version of the service hosting the license SDK. This field is optional. - * It may be provided by the hosting service. - * - * @generated from field: optional string license_service_version = 2; - */ - licenseServiceVersion?: string -} + /** + * Version of the service hosting the license SDK. This field is optional. + * It may be provided by the hosting service. + * + * @generated from field: optional string license_service_version = 2; + */ + licenseServiceVersion?: string; +}; /** * Describes the message license_protocol.VersionInfo. * Use `create(VersionInfoSchema)` to create a new message. */ -export const VersionInfoSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 4) +export const VersionInfoSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 4); /** * @generated from message license_protocol.SignedMessage */ export type SignedMessage = Message<'license_protocol.SignedMessage'> & { - /** - * @generated from field: optional license_protocol.SignedMessage.MessageType type = 1; - */ - type?: SignedMessage_MessageType + /** + * @generated from field: optional license_protocol.SignedMessage.MessageType type = 1; + */ + type?: SignedMessage_MessageType; - /** - * @generated from field: optional bytes msg = 2; - */ - msg?: Uint8Array + /** + * @generated from field: optional bytes msg = 2; + */ + msg?: Uint8Array; - /** - * Required field that contains the signature of the bytes of msg. - * For license requests, the signing algorithm is determined by the - * certificate contained in the request. - * For license responses, the signing algorithm is HMAC with signing key based - * on |session_key|. - * - * @generated from field: optional bytes signature = 3; - */ - signature?: Uint8Array + /** + * Required field that contains the signature of the bytes of msg. + * For license requests, the signing algorithm is determined by the + * certificate contained in the request. + * For license responses, the signing algorithm is HMAC with signing key based + * on |session_key|. + * + * @generated from field: optional bytes signature = 3; + */ + signature?: Uint8Array; - /** - * If populated, the contents of this field will be signaled by the - * |session_key_type| type. If the |session_key_type| is WRAPPED_AES_KEY the - * key is the bytes of an encrypted AES key. If the |session_key_type| is - * EPHERMERAL_ECC_PUBLIC_KEY the field contains the bytes of an RFC5208 ASN1 - * serialized ECC public key. - * - * @generated from field: optional bytes session_key = 4; - */ - sessionKey?: Uint8Array + /** + * If populated, the contents of this field will be signaled by the + * |session_key_type| type. If the |session_key_type| is WRAPPED_AES_KEY the + * key is the bytes of an encrypted AES key. If the |session_key_type| is + * EPHERMERAL_ECC_PUBLIC_KEY the field contains the bytes of an RFC5208 ASN1 + * serialized ECC public key. + * + * @generated from field: optional bytes session_key = 4; + */ + sessionKey?: Uint8Array; - /** - * Remote attestation data which will be present in the initial license - * request for ChromeOS client devices operating in verified mode. Remote - * attestation challenge data is |msg| field above. Optional. - * - * @generated from field: optional bytes remote_attestation = 5; - */ - remoteAttestation?: Uint8Array + /** + * Remote attestation data which will be present in the initial license + * request for ChromeOS client devices operating in verified mode. Remote + * attestation challenge data is |msg| field above. Optional. + * + * @generated from field: optional bytes remote_attestation = 5; + */ + remoteAttestation?: Uint8Array; - /** - * @generated from field: repeated license_protocol.MetricData metric_data = 6; - */ - metricData: MetricData[] + /** + * @generated from field: repeated license_protocol.MetricData metric_data = 6; + */ + metricData: MetricData[]; - /** - * Version information from the SDK and license service. This information is - * provided in the license response. - * - * @generated from field: optional license_protocol.VersionInfo service_version_info = 7; - */ - serviceVersionInfo?: VersionInfo + /** + * Version information from the SDK and license service. This information is + * provided in the license response. + * + * @generated from field: optional license_protocol.VersionInfo service_version_info = 7; + */ + serviceVersionInfo?: VersionInfo; - /** - * Optional field that contains the algorithm type used to generate the - * session_key and signature in a LICENSE message. - * - * @generated from field: optional license_protocol.SignedMessage.SessionKeyType session_key_type = 8; - */ - sessionKeyType?: SignedMessage_SessionKeyType + /** + * Optional field that contains the algorithm type used to generate the + * session_key and signature in a LICENSE message. + * + * @generated from field: optional license_protocol.SignedMessage.SessionKeyType session_key_type = 8; + */ + sessionKeyType?: SignedMessage_SessionKeyType; - /** - * The core message is the simple serialization of fields used by OEMCrypto. - * This field was introduced in OEMCrypto API v16. - * - * @generated from field: optional bytes oemcrypto_core_message = 9; - */ - oemcryptoCoreMessage?: Uint8Array -} + /** + * The core message is the simple serialization of fields used by OEMCrypto. + * This field was introduced in OEMCrypto API v16. + * + * @generated from field: optional bytes oemcrypto_core_message = 9; + */ + oemcryptoCoreMessage?: Uint8Array; +}; /** * Describes the message license_protocol.SignedMessage. * Use `create(SignedMessageSchema)` to create a new message. */ -export const SignedMessageSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 5) +export const SignedMessageSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 5); /** * @generated from enum license_protocol.SignedMessage.MessageType */ export enum SignedMessage_MessageType { - /** - * @generated from enum value: MESSAGETYPE_UNVERIFIED = 0; - */ - MESSAGETYPE_UNVERIFIED = 0, + /** + * @generated from enum value: MESSAGETYPE_UNVERIFIED = 0; + */ + MESSAGETYPE_UNVERIFIED = 0, - /** - * @generated from enum value: LICENSE_REQUEST = 1; - */ - LICENSE_REQUEST = 1, + /** + * @generated from enum value: LICENSE_REQUEST = 1; + */ + LICENSE_REQUEST = 1, - /** - * @generated from enum value: LICENSE = 2; - */ - LICENSE = 2, + /** + * @generated from enum value: LICENSE = 2; + */ + LICENSE = 2, - /** - * @generated from enum value: ERROR_RESPONSE = 3; - */ - ERROR_RESPONSE = 3, + /** + * @generated from enum value: ERROR_RESPONSE = 3; + */ + ERROR_RESPONSE = 3, - /** - * @generated from enum value: SERVICE_CERTIFICATE_REQUEST = 4; - */ - SERVICE_CERTIFICATE_REQUEST = 4, + /** + * @generated from enum value: SERVICE_CERTIFICATE_REQUEST = 4; + */ + SERVICE_CERTIFICATE_REQUEST = 4, - /** - * @generated from enum value: SERVICE_CERTIFICATE = 5; - */ - SERVICE_CERTIFICATE = 5, + /** + * @generated from enum value: SERVICE_CERTIFICATE = 5; + */ + SERVICE_CERTIFICATE = 5, - /** - * @generated from enum value: SUB_LICENSE = 6; - */ - SUB_LICENSE = 6, + /** + * @generated from enum value: SUB_LICENSE = 6; + */ + SUB_LICENSE = 6, - /** - * @generated from enum value: CAS_LICENSE_REQUEST = 7; - */ - CAS_LICENSE_REQUEST = 7, + /** + * @generated from enum value: CAS_LICENSE_REQUEST = 7; + */ + CAS_LICENSE_REQUEST = 7, - /** - * @generated from enum value: CAS_LICENSE = 8; - */ - CAS_LICENSE = 8, + /** + * @generated from enum value: CAS_LICENSE = 8; + */ + CAS_LICENSE = 8, - /** - * @generated from enum value: EXTERNAL_LICENSE_REQUEST = 9; - */ - EXTERNAL_LICENSE_REQUEST = 9, + /** + * @generated from enum value: EXTERNAL_LICENSE_REQUEST = 9; + */ + EXTERNAL_LICENSE_REQUEST = 9, - /** - * @generated from enum value: EXTERNAL_LICENSE = 10; - */ - EXTERNAL_LICENSE = 10 + /** + * @generated from enum value: EXTERNAL_LICENSE = 10; + */ + EXTERNAL_LICENSE = 10 } /** * Describes the enum license_protocol.SignedMessage.MessageType. */ -export const SignedMessage_MessageTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 5, 0) +export const SignedMessage_MessageTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 5, 0); /** * @generated from enum license_protocol.SignedMessage.SessionKeyType */ export enum SignedMessage_SessionKeyType { - /** - * @generated from enum value: UNDEFINED = 0; - */ - UNDEFINED = 0, + /** + * @generated from enum value: UNDEFINED = 0; + */ + UNDEFINED = 0, - /** - * @generated from enum value: WRAPPED_AES_KEY = 1; - */ - WRAPPED_AES_KEY = 1, + /** + * @generated from enum value: WRAPPED_AES_KEY = 1; + */ + WRAPPED_AES_KEY = 1, - /** - * @generated from enum value: EPHERMERAL_ECC_PUBLIC_KEY = 2; - */ - EPHERMERAL_ECC_PUBLIC_KEY = 2 + /** + * @generated from enum value: EPHERMERAL_ECC_PUBLIC_KEY = 2; + */ + EPHERMERAL_ECC_PUBLIC_KEY = 2 } /** * Describes the enum license_protocol.SignedMessage.SessionKeyType. */ -export const SignedMessage_SessionKeyTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 5, 1) +export const SignedMessage_SessionKeyTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 5, 1); /** * ClientIdentification message used to authenticate the client device. @@ -1304,90 +1304,90 @@ export const SignedMessage_SessionKeyTypeSchema: GenEnum & { - /** - * Type of factory-provisioned device root of trust. Optional. - * - * @generated from field: optional license_protocol.ClientIdentification.TokenType type = 1; - */ - type?: ClientIdentification_TokenType + /** + * Type of factory-provisioned device root of trust. Optional. + * + * @generated from field: optional license_protocol.ClientIdentification.TokenType type = 1; + */ + type?: ClientIdentification_TokenType; - /** - * Factory-provisioned device root of trust. Required. - * - * @generated from field: optional bytes token = 2; - */ - token?: Uint8Array + /** + * Factory-provisioned device root of trust. Required. + * + * @generated from field: optional bytes token = 2; + */ + token?: Uint8Array; - /** - * Optional client information name/value pairs. - * - * @generated from field: repeated license_protocol.ClientIdentification.NameValue client_info = 3; - */ - clientInfo: ClientIdentification_NameValue[] + /** + * Optional client information name/value pairs. + * + * @generated from field: repeated license_protocol.ClientIdentification.NameValue client_info = 3; + */ + clientInfo: ClientIdentification_NameValue[]; - /** - * Client token generated by the content provider. Optional. - * - * @generated from field: optional bytes provider_client_token = 4; - */ - providerClientToken?: Uint8Array + /** + * Client token generated by the content provider. Optional. + * + * @generated from field: optional bytes provider_client_token = 4; + */ + providerClientToken?: Uint8Array; - /** - * Number of licenses received by the client to which the token above belongs. - * Only present if client_token is specified. - * - * @generated from field: optional uint32 license_counter = 5; - */ - licenseCounter?: number + /** + * Number of licenses received by the client to which the token above belongs. + * Only present if client_token is specified. + * + * @generated from field: optional uint32 license_counter = 5; + */ + licenseCounter?: number; - /** - * List of non-baseline client capabilities. - * - * @generated from field: optional license_protocol.ClientIdentification.ClientCapabilities client_capabilities = 6; - */ - clientCapabilities?: ClientIdentification_ClientCapabilities + /** + * List of non-baseline client capabilities. + * + * @generated from field: optional license_protocol.ClientIdentification.ClientCapabilities client_capabilities = 6; + */ + clientCapabilities?: ClientIdentification_ClientCapabilities; - /** - * Serialized VmpData message. Optional. - * - * @generated from field: optional bytes vmp_data = 7; - */ - vmpData?: Uint8Array + /** + * Serialized VmpData message. Optional. + * + * @generated from field: optional bytes vmp_data = 7; + */ + vmpData?: Uint8Array; - /** - * Optional field that may contain additional provisioning credentials. - * - * @generated from field: repeated license_protocol.ClientIdentification.ClientCredentials device_credentials = 8; - */ - deviceCredentials: ClientIdentification_ClientCredentials[] -} + /** + * Optional field that may contain additional provisioning credentials. + * + * @generated from field: repeated license_protocol.ClientIdentification.ClientCredentials device_credentials = 8; + */ + deviceCredentials: ClientIdentification_ClientCredentials[]; +}; /** * Describes the message license_protocol.ClientIdentification. * Use `create(ClientIdentificationSchema)` to create a new message. */ -export const ClientIdentificationSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 6) +export const ClientIdentificationSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 6); /** * @generated from message license_protocol.ClientIdentification.NameValue */ export type ClientIdentification_NameValue = Message<'license_protocol.ClientIdentification.NameValue'> & { - /** - * @generated from field: optional string name = 1; - */ - name?: string + /** + * @generated from field: optional string name = 1; + */ + name?: string; - /** - * @generated from field: optional string value = 2; - */ - value?: string -} + /** + * @generated from field: optional string value = 2; + */ + value?: string; +}; /** * Describes the message license_protocol.ClientIdentification.NameValue. * Use `create(ClientIdentification_NameValueSchema)` to create a new message. */ -export const ClientIdentification_NameValueSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 6, 0) +export const ClientIdentification_NameValueSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 6, 0); /** * Capabilities which not all clients may support. Used for the license @@ -1396,256 +1396,256 @@ export const ClientIdentification_NameValueSchema: GenMessage & { - /** - * @generated from field: optional bool client_token = 1; - */ - clientToken?: boolean + /** + * @generated from field: optional bool client_token = 1; + */ + clientToken?: boolean; - /** - * @generated from field: optional bool session_token = 2; - */ - sessionToken?: boolean + /** + * @generated from field: optional bool session_token = 2; + */ + sessionToken?: boolean; - /** - * @generated from field: optional bool video_resolution_constraints = 3; - */ - videoResolutionConstraints?: boolean + /** + * @generated from field: optional bool video_resolution_constraints = 3; + */ + videoResolutionConstraints?: boolean; - /** - * @generated from field: optional license_protocol.ClientIdentification.ClientCapabilities.HdcpVersion max_hdcp_version = 4; - */ - maxHdcpVersion?: ClientIdentification_ClientCapabilities_HdcpVersion + /** + * @generated from field: optional license_protocol.ClientIdentification.ClientCapabilities.HdcpVersion max_hdcp_version = 4; + */ + maxHdcpVersion?: ClientIdentification_ClientCapabilities_HdcpVersion; - /** - * @generated from field: optional uint32 oem_crypto_api_version = 5; - */ - oemCryptoApiVersion?: number + /** + * @generated from field: optional uint32 oem_crypto_api_version = 5; + */ + oemCryptoApiVersion?: number; - /** - * Client has hardware support for protecting the usage table, such as - * storing the generation number in secure memory. For Details, see: - * Widevine Modular DRM Security Integration Guide for CENC - * - * @generated from field: optional bool anti_rollback_usage_table = 6; - */ - antiRollbackUsageTable?: boolean + /** + * Client has hardware support for protecting the usage table, such as + * storing the generation number in secure memory. For Details, see: + * Widevine Modular DRM Security Integration Guide for CENC + * + * @generated from field: optional bool anti_rollback_usage_table = 6; + */ + antiRollbackUsageTable?: boolean; - /** - * The client shall report |srm_version| if available. - * - * @generated from field: optional uint32 srm_version = 7; - */ - srmVersion?: number + /** + * The client shall report |srm_version| if available. + * + * @generated from field: optional uint32 srm_version = 7; + */ + srmVersion?: number; - /** - * A device may have SRM data, and report a version, but may not be capable - * of updating SRM data. - * - * @generated from field: optional bool can_update_srm = 8; - */ - canUpdateSrm?: boolean + /** + * A device may have SRM data, and report a version, but may not be capable + * of updating SRM data. + * + * @generated from field: optional bool can_update_srm = 8; + */ + canUpdateSrm?: boolean; - /** - * @generated from field: repeated license_protocol.ClientIdentification.ClientCapabilities.CertificateKeyType supported_certificate_key_type = 9; - */ - supportedCertificateKeyType: ClientIdentification_ClientCapabilities_CertificateKeyType[] + /** + * @generated from field: repeated license_protocol.ClientIdentification.ClientCapabilities.CertificateKeyType supported_certificate_key_type = 9; + */ + supportedCertificateKeyType: ClientIdentification_ClientCapabilities_CertificateKeyType[]; - /** - * @generated from field: optional license_protocol.ClientIdentification.ClientCapabilities.AnalogOutputCapabilities analog_output_capabilities = 10; - */ - analogOutputCapabilities?: ClientIdentification_ClientCapabilities_AnalogOutputCapabilities + /** + * @generated from field: optional license_protocol.ClientIdentification.ClientCapabilities.AnalogOutputCapabilities analog_output_capabilities = 10; + */ + analogOutputCapabilities?: ClientIdentification_ClientCapabilities_AnalogOutputCapabilities; - /** - * @generated from field: optional bool can_disable_analog_output = 11; - */ - canDisableAnalogOutput?: boolean + /** + * @generated from field: optional bool can_disable_analog_output = 11; + */ + canDisableAnalogOutput?: boolean; - /** - * Clients can indicate a performance level supported by OEMCrypto. - * This will allow applications and providers to choose an appropriate - * quality of content to serve. Currently defined tiers are - * 1 (low), 2 (medium) and 3 (high). Any other value indicates that - * the resource rating is unavailable or reporting erroneous values - * for that device. For details see, - * Widevine Modular DRM Security Integration Guide for CENC - * - * @generated from field: optional uint32 resource_rating_tier = 12; - */ - resourceRatingTier?: number -} + /** + * Clients can indicate a performance level supported by OEMCrypto. + * This will allow applications and providers to choose an appropriate + * quality of content to serve. Currently defined tiers are + * 1 (low), 2 (medium) and 3 (high). Any other value indicates that + * the resource rating is unavailable or reporting erroneous values + * for that device. For details see, + * Widevine Modular DRM Security Integration Guide for CENC + * + * @generated from field: optional uint32 resource_rating_tier = 12; + */ + resourceRatingTier?: number; +}; /** * Describes the message license_protocol.ClientIdentification.ClientCapabilities. * Use `create(ClientIdentification_ClientCapabilitiesSchema)` to create a new message. */ -export const ClientIdentification_ClientCapabilitiesSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 6, 1) +export const ClientIdentification_ClientCapabilitiesSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 6, 1); /** * @generated from enum license_protocol.ClientIdentification.ClientCapabilities.HdcpVersion */ export enum ClientIdentification_ClientCapabilities_HdcpVersion { - /** - * @generated from enum value: HDCP_NONE = 0; - */ - HDCP_NONE = 0, + /** + * @generated from enum value: HDCP_NONE = 0; + */ + HDCP_NONE = 0, - /** - * @generated from enum value: HDCP_V1 = 1; - */ - HDCP_V1 = 1, + /** + * @generated from enum value: HDCP_V1 = 1; + */ + HDCP_V1 = 1, - /** - * @generated from enum value: HDCP_V2 = 2; - */ - HDCP_V2 = 2, + /** + * @generated from enum value: HDCP_V2 = 2; + */ + HDCP_V2 = 2, - /** - * @generated from enum value: HDCP_V2_1 = 3; - */ - HDCP_V2_1 = 3, + /** + * @generated from enum value: HDCP_V2_1 = 3; + */ + HDCP_V2_1 = 3, - /** - * @generated from enum value: HDCP_V2_2 = 4; - */ - HDCP_V2_2 = 4, + /** + * @generated from enum value: HDCP_V2_2 = 4; + */ + HDCP_V2_2 = 4, - /** - * @generated from enum value: HDCP_V2_3 = 5; - */ - HDCP_V2_3 = 5, + /** + * @generated from enum value: HDCP_V2_3 = 5; + */ + HDCP_V2_3 = 5, - /** - * @generated from enum value: HDCP_NO_DIGITAL_OUTPUT = 255; - */ - HDCP_NO_DIGITAL_OUTPUT = 255 + /** + * @generated from enum value: HDCP_NO_DIGITAL_OUTPUT = 255; + */ + HDCP_NO_DIGITAL_OUTPUT = 255 } /** * Describes the enum license_protocol.ClientIdentification.ClientCapabilities.HdcpVersion. */ export const ClientIdentification_ClientCapabilities_HdcpVersionSchema: GenEnum = - /*@__PURE__*/ - enumDesc(file_license_protocol, 6, 1, 0) + /*@__PURE__*/ + enumDesc(file_license_protocol, 6, 1, 0); /** * @generated from enum license_protocol.ClientIdentification.ClientCapabilities.CertificateKeyType */ export enum ClientIdentification_ClientCapabilities_CertificateKeyType { - /** - * @generated from enum value: RSA_2048 = 0; - */ - RSA_2048 = 0, + /** + * @generated from enum value: RSA_2048 = 0; + */ + RSA_2048 = 0, - /** - * @generated from enum value: RSA_3072 = 1; - */ - RSA_3072 = 1, + /** + * @generated from enum value: RSA_3072 = 1; + */ + RSA_3072 = 1, - /** - * @generated from enum value: ECC_SECP256R1 = 2; - */ - ECC_SECP256R1 = 2, + /** + * @generated from enum value: ECC_SECP256R1 = 2; + */ + ECC_SECP256R1 = 2, - /** - * @generated from enum value: ECC_SECP384R1 = 3; - */ - ECC_SECP384R1 = 3, + /** + * @generated from enum value: ECC_SECP384R1 = 3; + */ + ECC_SECP384R1 = 3, - /** - * @generated from enum value: ECC_SECP521R1 = 4; - */ - ECC_SECP521R1 = 4 + /** + * @generated from enum value: ECC_SECP521R1 = 4; + */ + ECC_SECP521R1 = 4 } /** * Describes the enum license_protocol.ClientIdentification.ClientCapabilities.CertificateKeyType. */ export const ClientIdentification_ClientCapabilities_CertificateKeyTypeSchema: GenEnum = - /*@__PURE__*/ - enumDesc(file_license_protocol, 6, 1, 1) + /*@__PURE__*/ + enumDesc(file_license_protocol, 6, 1, 1); /** * @generated from enum license_protocol.ClientIdentification.ClientCapabilities.AnalogOutputCapabilities */ export enum ClientIdentification_ClientCapabilities_AnalogOutputCapabilities { - /** - * @generated from enum value: ANALOG_OUTPUT_UNKNOWN = 0; - */ - ANALOG_OUTPUT_UNKNOWN = 0, + /** + * @generated from enum value: ANALOG_OUTPUT_UNKNOWN = 0; + */ + ANALOG_OUTPUT_UNKNOWN = 0, - /** - * @generated from enum value: ANALOG_OUTPUT_NONE = 1; - */ - ANALOG_OUTPUT_NONE = 1, + /** + * @generated from enum value: ANALOG_OUTPUT_NONE = 1; + */ + ANALOG_OUTPUT_NONE = 1, - /** - * @generated from enum value: ANALOG_OUTPUT_SUPPORTED = 2; - */ - ANALOG_OUTPUT_SUPPORTED = 2, + /** + * @generated from enum value: ANALOG_OUTPUT_SUPPORTED = 2; + */ + ANALOG_OUTPUT_SUPPORTED = 2, - /** - * @generated from enum value: ANALOG_OUTPUT_SUPPORTS_CGMS_A = 3; - */ - ANALOG_OUTPUT_SUPPORTS_CGMS_A = 3 + /** + * @generated from enum value: ANALOG_OUTPUT_SUPPORTS_CGMS_A = 3; + */ + ANALOG_OUTPUT_SUPPORTS_CGMS_A = 3 } /** * Describes the enum license_protocol.ClientIdentification.ClientCapabilities.AnalogOutputCapabilities. */ export const ClientIdentification_ClientCapabilities_AnalogOutputCapabilitiesSchema: GenEnum = - /*@__PURE__*/ - enumDesc(file_license_protocol, 6, 1, 2) + /*@__PURE__*/ + enumDesc(file_license_protocol, 6, 1, 2); /** * @generated from message license_protocol.ClientIdentification.ClientCredentials */ export type ClientIdentification_ClientCredentials = Message<'license_protocol.ClientIdentification.ClientCredentials'> & { - /** - * @generated from field: optional license_protocol.ClientIdentification.TokenType type = 1; - */ - type?: ClientIdentification_TokenType + /** + * @generated from field: optional license_protocol.ClientIdentification.TokenType type = 1; + */ + type?: ClientIdentification_TokenType; - /** - * @generated from field: optional bytes token = 2; - */ - token?: Uint8Array -} + /** + * @generated from field: optional bytes token = 2; + */ + token?: Uint8Array; +}; /** * Describes the message license_protocol.ClientIdentification.ClientCredentials. * Use `create(ClientIdentification_ClientCredentialsSchema)` to create a new message. */ -export const ClientIdentification_ClientCredentialsSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 6, 2) +export const ClientIdentification_ClientCredentialsSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 6, 2); /** * @generated from enum license_protocol.ClientIdentification.TokenType */ export enum ClientIdentification_TokenType { - /** - * @generated from enum value: KEYBOX = 0; - */ - KEYBOX = 0, + /** + * @generated from enum value: KEYBOX = 0; + */ + KEYBOX = 0, - /** - * @generated from enum value: DRM_DEVICE_CERTIFICATE = 1; - */ - DRM_DEVICE_CERTIFICATE = 1, + /** + * @generated from enum value: DRM_DEVICE_CERTIFICATE = 1; + */ + DRM_DEVICE_CERTIFICATE = 1, - /** - * @generated from enum value: REMOTE_ATTESTATION_CERTIFICATE = 2; - */ - REMOTE_ATTESTATION_CERTIFICATE = 2, + /** + * @generated from enum value: REMOTE_ATTESTATION_CERTIFICATE = 2; + */ + REMOTE_ATTESTATION_CERTIFICATE = 2, - /** - * @generated from enum value: OEM_DEVICE_CERTIFICATE = 3; - */ - OEM_DEVICE_CERTIFICATE = 3 + /** + * @generated from enum value: OEM_DEVICE_CERTIFICATE = 3; + */ + OEM_DEVICE_CERTIFICATE = 3 } /** * Describes the enum license_protocol.ClientIdentification.TokenType. */ -export const ClientIdentification_TokenTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 6, 0) +export const ClientIdentification_TokenTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 6, 0); /** * EncryptedClientIdentification message used to hold ClientIdentification @@ -1654,50 +1654,50 @@ export const ClientIdentification_TokenTypeSchema: GenEnum & { - /** - * Provider ID for which the ClientIdentifcation is encrypted (owner of - * service certificate). - * - * @generated from field: optional string provider_id = 1; - */ - providerId?: string + /** + * Provider ID for which the ClientIdentifcation is encrypted (owner of + * service certificate). + * + * @generated from field: optional string provider_id = 1; + */ + providerId?: string; - /** - * Serial number for the service certificate for which ClientIdentification is - * encrypted. - * - * @generated from field: optional bytes service_certificate_serial_number = 2; - */ - serviceCertificateSerialNumber?: Uint8Array + /** + * Serial number for the service certificate for which ClientIdentification is + * encrypted. + * + * @generated from field: optional bytes service_certificate_serial_number = 2; + */ + serviceCertificateSerialNumber?: Uint8Array; - /** - * Serialized ClientIdentification message, encrypted with the privacy key - * using AES-128-CBC with PKCS#5 padding. - * - * @generated from field: optional bytes encrypted_client_id = 3; - */ - encryptedClientId?: Uint8Array + /** + * Serialized ClientIdentification message, encrypted with the privacy key + * using AES-128-CBC with PKCS#5 padding. + * + * @generated from field: optional bytes encrypted_client_id = 3; + */ + encryptedClientId?: Uint8Array; - /** - * Initialization vector needed to decrypt encrypted_client_id. - * - * @generated from field: optional bytes encrypted_client_id_iv = 4; - */ - encryptedClientIdIv?: Uint8Array + /** + * Initialization vector needed to decrypt encrypted_client_id. + * + * @generated from field: optional bytes encrypted_client_id_iv = 4; + */ + encryptedClientIdIv?: Uint8Array; - /** - * AES-128 privacy key, encrypted with the service public key using RSA-OAEP. - * - * @generated from field: optional bytes encrypted_privacy_key = 5; - */ - encryptedPrivacyKey?: Uint8Array -} + /** + * AES-128 privacy key, encrypted with the service public key using RSA-OAEP. + * + * @generated from field: optional bytes encrypted_privacy_key = 5; + */ + encryptedPrivacyKey?: Uint8Array; +}; /** * Describes the message license_protocol.EncryptedClientIdentification. * Use `create(EncryptedClientIdentificationSchema)` to create a new message. */ -export const EncryptedClientIdentificationSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 7) +export const EncryptedClientIdentificationSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 7); /** * DRM certificate definition for user devices, intermediate, service, and root @@ -1706,252 +1706,252 @@ export const EncryptedClientIdentificationSchema: GenMessage & { - /** - * Type of certificate. Required. - * - * @generated from field: optional license_protocol.DrmCertificate.Type type = 1; - */ - type?: DrmCertificate_Type + /** + * Type of certificate. Required. + * + * @generated from field: optional license_protocol.DrmCertificate.Type type = 1; + */ + type?: DrmCertificate_Type; - /** - * 128-bit globally unique serial number of certificate. - * Value is 0 for root certificate. Required. - * - * @generated from field: optional bytes serial_number = 2; - */ - serialNumber?: Uint8Array + /** + * 128-bit globally unique serial number of certificate. + * Value is 0 for root certificate. Required. + * + * @generated from field: optional bytes serial_number = 2; + */ + serialNumber?: Uint8Array; - /** - * POSIX time, in seconds, when the certificate was created. Required. - * - * @generated from field: optional uint32 creation_time_seconds = 3; - */ - creationTimeSeconds?: number + /** + * POSIX time, in seconds, when the certificate was created. Required. + * + * @generated from field: optional uint32 creation_time_seconds = 3; + */ + creationTimeSeconds?: number; - /** - * POSIX time, in seconds, when the certificate should expire. Value of zero - * denotes indefinite expiry time. For more information on limited lifespan - * DRM certificates see (go/limited-lifespan-drm-certificates). - * - * @generated from field: optional uint32 expiration_time_seconds = 12; - */ - expirationTimeSeconds?: number + /** + * POSIX time, in seconds, when the certificate should expire. Value of zero + * denotes indefinite expiry time. For more information on limited lifespan + * DRM certificates see (go/limited-lifespan-drm-certificates). + * + * @generated from field: optional uint32 expiration_time_seconds = 12; + */ + expirationTimeSeconds?: number; - /** - * Device public key. PKCS#1 ASN.1 DER-encoded. Required. - * - * @generated from field: optional bytes public_key = 4; - */ - publicKey?: Uint8Array + /** + * Device public key. PKCS#1 ASN.1 DER-encoded. Required. + * + * @generated from field: optional bytes public_key = 4; + */ + publicKey?: Uint8Array; - /** - * Widevine system ID for the device. Required for intermediate and - * user device certificates. - * - * @generated from field: optional uint32 system_id = 5; - */ - systemId?: number + /** + * Widevine system ID for the device. Required for intermediate and + * user device certificates. + * + * @generated from field: optional uint32 system_id = 5; + */ + systemId?: number; - /** - * Deprecated field, which used to indicate whether the device was a test - * (non-production) device. The test_device field in ProvisionedDeviceInfo - * below should be observed instead. - * - * @generated from field: optional bool test_device_deprecated = 6 [deprecated = true]; - * @deprecated - */ - testDeviceDeprecated?: boolean + /** + * Deprecated field, which used to indicate whether the device was a test + * (non-production) device. The test_device field in ProvisionedDeviceInfo + * below should be observed instead. + * + * @generated from field: optional bool test_device_deprecated = 6 [deprecated = true]; + * @deprecated + */ + testDeviceDeprecated?: boolean; - /** - * Service identifier (web origin) for the provider which owns the - * certificate. Required for service and provisioner certificates. - * - * @generated from field: optional string provider_id = 7; - */ - providerId?: string + /** + * Service identifier (web origin) for the provider which owns the + * certificate. Required for service and provisioner certificates. + * + * @generated from field: optional string provider_id = 7; + */ + providerId?: string; - /** - * This field is used only when type = SERVICE to specify which SDK uses - * service certificate. This repeated field is treated as a set. A certificate - * may be used for the specified service SDK if the appropriate ServiceType - * is specified in this field. - * - * @generated from field: repeated license_protocol.DrmCertificate.ServiceType service_types = 8; - */ - serviceTypes: DrmCertificate_ServiceType[] + /** + * This field is used only when type = SERVICE to specify which SDK uses + * service certificate. This repeated field is treated as a set. A certificate + * may be used for the specified service SDK if the appropriate ServiceType + * is specified in this field. + * + * @generated from field: repeated license_protocol.DrmCertificate.ServiceType service_types = 8; + */ + serviceTypes: DrmCertificate_ServiceType[]; - /** - * Required. The algorithm field contains the curve used to create the - * |public_key| if algorithm is one of the ECC types. - * The |algorithm| is used for both to determine the if the certificate is ECC - * or RSA. The |algorithm| also specifies the parameters that were used to - * create |public_key| and are used to create an ephemeral session key. - * - * @generated from field: optional license_protocol.DrmCertificate.Algorithm algorithm = 9; - */ - algorithm?: DrmCertificate_Algorithm + /** + * Required. The algorithm field contains the curve used to create the + * |public_key| if algorithm is one of the ECC types. + * The |algorithm| is used for both to determine the if the certificate is ECC + * or RSA. The |algorithm| also specifies the parameters that were used to + * create |public_key| and are used to create an ephemeral session key. + * + * @generated from field: optional license_protocol.DrmCertificate.Algorithm algorithm = 9; + */ + algorithm?: DrmCertificate_Algorithm; - /** - * Optional. May be present in DEVICE certificate types. This is the root - * of trust identifier that holds an encrypted value that identifies the - * keybox or other root of trust that was used to provision a DEVICE drm - * certificate. - * - * @generated from field: optional bytes rot_id = 10; - */ - rotId?: Uint8Array + /** + * Optional. May be present in DEVICE certificate types. This is the root + * of trust identifier that holds an encrypted value that identifies the + * keybox or other root of trust that was used to provision a DEVICE drm + * certificate. + * + * @generated from field: optional bytes rot_id = 10; + */ + rotId?: Uint8Array; - /** - * Optional. May be present in devices that explicitly support dual keys. When - * present the |public_key| is used for verification of received license - * request messages. - * - * @generated from field: optional license_protocol.DrmCertificate.EncryptionKey encryption_key = 11; - */ - encryptionKey?: DrmCertificate_EncryptionKey -} + /** + * Optional. May be present in devices that explicitly support dual keys. When + * present the |public_key| is used for verification of received license + * request messages. + * + * @generated from field: optional license_protocol.DrmCertificate.EncryptionKey encryption_key = 11; + */ + encryptionKey?: DrmCertificate_EncryptionKey; +}; /** * Describes the message license_protocol.DrmCertificate. * Use `create(DrmCertificateSchema)` to create a new message. */ -export const DrmCertificateSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 8) +export const DrmCertificateSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 8); /** * @generated from message license_protocol.DrmCertificate.EncryptionKey */ export type DrmCertificate_EncryptionKey = Message<'license_protocol.DrmCertificate.EncryptionKey'> & { - /** - * Device public key. PKCS#1 ASN.1 DER-encoded. Required. - * - * @generated from field: optional bytes public_key = 1; - */ - publicKey?: Uint8Array + /** + * Device public key. PKCS#1 ASN.1 DER-encoded. Required. + * + * @generated from field: optional bytes public_key = 1; + */ + publicKey?: Uint8Array; - /** - * Required. The algorithm field contains the curve used to create the - * |public_key| if algorithm is one of the ECC types. - * The |algorithm| is used for both to determine the if the certificate is - * ECC or RSA. The |algorithm| also specifies the parameters that were used - * to create |public_key| and are used to create an ephemeral session key. - * - * @generated from field: optional license_protocol.DrmCertificate.Algorithm algorithm = 2; - */ - algorithm?: DrmCertificate_Algorithm -} + /** + * Required. The algorithm field contains the curve used to create the + * |public_key| if algorithm is one of the ECC types. + * The |algorithm| is used for both to determine the if the certificate is + * ECC or RSA. The |algorithm| also specifies the parameters that were used + * to create |public_key| and are used to create an ephemeral session key. + * + * @generated from field: optional license_protocol.DrmCertificate.Algorithm algorithm = 2; + */ + algorithm?: DrmCertificate_Algorithm; +}; /** * Describes the message license_protocol.DrmCertificate.EncryptionKey. * Use `create(DrmCertificate_EncryptionKeySchema)` to create a new message. */ -export const DrmCertificate_EncryptionKeySchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 8, 0) +export const DrmCertificate_EncryptionKeySchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 8, 0); /** * @generated from enum license_protocol.DrmCertificate.Type */ export enum DrmCertificate_Type { - /** - * ProtoBestPractices: ignore. - * - * @generated from enum value: ROOT = 0; - */ - ROOT = 0, + /** + * ProtoBestPractices: ignore. + * + * @generated from enum value: ROOT = 0; + */ + ROOT = 0, - /** - * @generated from enum value: DEVICE_MODEL = 1; - */ - DEVICE_MODEL = 1, + /** + * @generated from enum value: DEVICE_MODEL = 1; + */ + DEVICE_MODEL = 1, - /** - * @generated from enum value: DEVICE = 2; - */ - DEVICE = 2, + /** + * @generated from enum value: DEVICE = 2; + */ + DEVICE = 2, - /** - * @generated from enum value: SERVICE = 3; - */ - SERVICE = 3, + /** + * @generated from enum value: SERVICE = 3; + */ + SERVICE = 3, - /** - * @generated from enum value: PROVISIONER = 4; - */ - PROVISIONER = 4 + /** + * @generated from enum value: PROVISIONER = 4; + */ + PROVISIONER = 4 } /** * Describes the enum license_protocol.DrmCertificate.Type. */ -export const DrmCertificate_TypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 8, 0) +export const DrmCertificate_TypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 8, 0); /** * @generated from enum license_protocol.DrmCertificate.ServiceType */ export enum DrmCertificate_ServiceType { - /** - * @generated from enum value: UNKNOWN_SERVICE_TYPE = 0; - */ - UNKNOWN_SERVICE_TYPE = 0, + /** + * @generated from enum value: UNKNOWN_SERVICE_TYPE = 0; + */ + UNKNOWN_SERVICE_TYPE = 0, - /** - * @generated from enum value: LICENSE_SERVER_SDK = 1; - */ - LICENSE_SERVER_SDK = 1, + /** + * @generated from enum value: LICENSE_SERVER_SDK = 1; + */ + LICENSE_SERVER_SDK = 1, - /** - * @generated from enum value: LICENSE_SERVER_PROXY_SDK = 2; - */ - LICENSE_SERVER_PROXY_SDK = 2, + /** + * @generated from enum value: LICENSE_SERVER_PROXY_SDK = 2; + */ + LICENSE_SERVER_PROXY_SDK = 2, - /** - * @generated from enum value: PROVISIONING_SDK = 3; - */ - PROVISIONING_SDK = 3, + /** + * @generated from enum value: PROVISIONING_SDK = 3; + */ + PROVISIONING_SDK = 3, - /** - * @generated from enum value: CAS_PROXY_SDK = 4; - */ - CAS_PROXY_SDK = 4 + /** + * @generated from enum value: CAS_PROXY_SDK = 4; + */ + CAS_PROXY_SDK = 4 } /** * Describes the enum license_protocol.DrmCertificate.ServiceType. */ -export const DrmCertificate_ServiceTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 8, 1) +export const DrmCertificate_ServiceTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 8, 1); /** * @generated from enum license_protocol.DrmCertificate.Algorithm */ export enum DrmCertificate_Algorithm { - /** - * @generated from enum value: UNKNOWN_ALGORITHM = 0; - */ - UNKNOWN_ALGORITHM = 0, + /** + * @generated from enum value: UNKNOWN_ALGORITHM = 0; + */ + UNKNOWN_ALGORITHM = 0, - /** - * @generated from enum value: RSA = 1; - */ - RSA = 1, + /** + * @generated from enum value: RSA = 1; + */ + RSA = 1, - /** - * @generated from enum value: ECC_SECP256R1 = 2; - */ - ECC_SECP256R1 = 2, + /** + * @generated from enum value: ECC_SECP256R1 = 2; + */ + ECC_SECP256R1 = 2, - /** - * @generated from enum value: ECC_SECP384R1 = 3; - */ - ECC_SECP384R1 = 3, + /** + * @generated from enum value: ECC_SECP384R1 = 3; + */ + ECC_SECP384R1 = 3, - /** - * @generated from enum value: ECC_SECP521R1 = 4; - */ - ECC_SECP521R1 = 4 + /** + * @generated from enum value: ECC_SECP521R1 = 4; + */ + ECC_SECP521R1 = 4 } /** * Describes the enum license_protocol.DrmCertificate.Algorithm. */ -export const DrmCertificate_AlgorithmSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 8, 2) +export const DrmCertificate_AlgorithmSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 8, 2); /** * DrmCertificate signed by a higher (CA) DRM certificate. @@ -1959,267 +1959,267 @@ export const DrmCertificate_AlgorithmSchema: GenEnum = * @generated from message license_protocol.SignedDrmCertificate */ export type SignedDrmCertificate = Message<'license_protocol.SignedDrmCertificate'> & { - /** - * Serialized certificate. Required. - * - * @generated from field: optional bytes drm_certificate = 1; - */ - drmCertificate?: Uint8Array + /** + * Serialized certificate. Required. + * + * @generated from field: optional bytes drm_certificate = 1; + */ + drmCertificate?: Uint8Array; - /** - * Signature of certificate. Signed with root or intermediate - * certificate specified below. Required. - * - * @generated from field: optional bytes signature = 2; - */ - signature?: Uint8Array + /** + * Signature of certificate. Signed with root or intermediate + * certificate specified below. Required. + * + * @generated from field: optional bytes signature = 2; + */ + signature?: Uint8Array; - /** - * SignedDrmCertificate used to sign this certificate. - * - * @generated from field: optional license_protocol.SignedDrmCertificate signer = 3; - */ - signer?: SignedDrmCertificate + /** + * SignedDrmCertificate used to sign this certificate. + * + * @generated from field: optional license_protocol.SignedDrmCertificate signer = 3; + */ + signer?: SignedDrmCertificate; - /** - * Optional field that indicates the hash algorithm used in signature scheme. - * - * @generated from field: optional license_protocol.HashAlgorithmProto hash_algorithm = 4; - */ - hashAlgorithm?: HashAlgorithmProto -} + /** + * Optional field that indicates the hash algorithm used in signature scheme. + * + * @generated from field: optional license_protocol.HashAlgorithmProto hash_algorithm = 4; + */ + hashAlgorithm?: HashAlgorithmProto; +}; /** * Describes the message license_protocol.SignedDrmCertificate. * Use `create(SignedDrmCertificateSchema)` to create a new message. */ -export const SignedDrmCertificateSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 9) +export const SignedDrmCertificateSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 9); /** * @generated from message license_protocol.WidevinePsshData */ export type WidevinePsshData = Message<'license_protocol.WidevinePsshData'> & { - /** - * Entitlement or content key IDs. Can onnly present in SINGLE or ENTITLEMENT - * PSSHs. May be repeated to facilitate delivery of multiple keys in a - * single license. Cannot be used in conjunction with content_id or - * group_ids, which are the preferred mechanism. - * - * @generated from field: repeated bytes key_ids = 2; - */ - keyIds: Uint8Array[] + /** + * Entitlement or content key IDs. Can onnly present in SINGLE or ENTITLEMENT + * PSSHs. May be repeated to facilitate delivery of multiple keys in a + * single license. Cannot be used in conjunction with content_id or + * group_ids, which are the preferred mechanism. + * + * @generated from field: repeated bytes key_ids = 2; + */ + keyIds: Uint8Array[]; - /** - * Content identifier which may map to multiple entitlement or content key - * IDs to facilitate the delivery of multiple keys in a single license. - * Cannot be present in conjunction with key_ids, but if used must be in all - * PSSHs. - * - * @generated from field: optional bytes content_id = 4; - */ - contentId?: Uint8Array + /** + * Content identifier which may map to multiple entitlement or content key + * IDs to facilitate the delivery of multiple keys in a single license. + * Cannot be present in conjunction with key_ids, but if used must be in all + * PSSHs. + * + * @generated from field: optional bytes content_id = 4; + */ + contentId?: Uint8Array; - /** - * Crypto period index, for media using key rotation. Always corresponds to - * The content key period. This means that if using entitlement licensing - * the ENTITLED_KEY PSSHs will have sequential crypto_period_index's, whereas - * the ENTITELEMENT PSSHs will have gaps in the sequence. Required if doing - * key rotation. - * - * @generated from field: optional uint32 crypto_period_index = 7; - */ - cryptoPeriodIndex?: number + /** + * Crypto period index, for media using key rotation. Always corresponds to + * The content key period. This means that if using entitlement licensing + * the ENTITLED_KEY PSSHs will have sequential crypto_period_index's, whereas + * the ENTITELEMENT PSSHs will have gaps in the sequence. Required if doing + * key rotation. + * + * @generated from field: optional uint32 crypto_period_index = 7; + */ + cryptoPeriodIndex?: number; - /** - * Protection scheme identifying the encryption algorithm. The protection - * scheme is represented as a uint32 value. The uint32 contains 4 bytes each - * representing a single ascii character in one of the 4CC protection scheme - * values. To be deprecated in favor of signaling from content. - * 'cenc' (AES-CTR) protection_scheme = 0x63656E63, - * 'cbc1' (AES-CBC) protection_scheme = 0x63626331, - * 'cens' (AES-CTR pattern encryption) protection_scheme = 0x63656E73, - * 'cbcs' (AES-CBC pattern encryption) protection_scheme = 0x63626373. - * - * @generated from field: optional uint32 protection_scheme = 9; - */ - protectionScheme?: number + /** + * Protection scheme identifying the encryption algorithm. The protection + * scheme is represented as a uint32 value. The uint32 contains 4 bytes each + * representing a single ascii character in one of the 4CC protection scheme + * values. To be deprecated in favor of signaling from content. + * 'cenc' (AES-CTR) protection_scheme = 0x63656E63, + * 'cbc1' (AES-CBC) protection_scheme = 0x63626331, + * 'cens' (AES-CTR pattern encryption) protection_scheme = 0x63656E73, + * 'cbcs' (AES-CBC pattern encryption) protection_scheme = 0x63626373. + * + * @generated from field: optional uint32 protection_scheme = 9; + */ + protectionScheme?: number; - /** - * Optional. For media using key rotation, this represents the duration - * of each crypto period in seconds. - * - * @generated from field: optional uint32 crypto_period_seconds = 10; - */ - cryptoPeriodSeconds?: number + /** + * Optional. For media using key rotation, this represents the duration + * of each crypto period in seconds. + * + * @generated from field: optional uint32 crypto_period_seconds = 10; + */ + cryptoPeriodSeconds?: number; - /** - * Type of PSSH. Required if not SINGLE. - * - * @generated from field: optional license_protocol.WidevinePsshData.Type type = 11; - */ - type?: WidevinePsshData_Type + /** + * Type of PSSH. Required if not SINGLE. + * + * @generated from field: optional license_protocol.WidevinePsshData.Type type = 11; + */ + type?: WidevinePsshData_Type; - /** - * Key sequence for Widevine-managed keys. Optional. - * - * @generated from field: optional uint32 key_sequence = 12; - */ - keySequence?: number + /** + * Key sequence for Widevine-managed keys. Optional. + * + * @generated from field: optional uint32 key_sequence = 12; + */ + keySequence?: number; - /** - * Group identifiers for all groups to which the content belongs. This can - * be used to deliver licenses to unlock multiple titles / channels. - * Optional, and may only be present in ENTITLEMENT and ENTITLED_KEY PSSHs, and - * not in conjunction with key_ids. - * - * @generated from field: repeated bytes group_ids = 13; - */ - groupIds: Uint8Array[] + /** + * Group identifiers for all groups to which the content belongs. This can + * be used to deliver licenses to unlock multiple titles / channels. + * Optional, and may only be present in ENTITLEMENT and ENTITLED_KEY PSSHs, and + * not in conjunction with key_ids. + * + * @generated from field: repeated bytes group_ids = 13; + */ + groupIds: Uint8Array[]; - /** - * Copy/copies of the content key used to decrypt the media stream in which - * the PSSH box is embedded, each wrapped with a different entitlement key. - * May also contain sub-licenses to support devices with OEMCrypto 13 or - * older. May be repeated if using group entitlement keys. Present only in - * PSSHs of type ENTITLED_KEY. - * - * @generated from field: repeated license_protocol.WidevinePsshData.EntitledKey entitled_keys = 14; - */ - entitledKeys: WidevinePsshData_EntitledKey[] + /** + * Copy/copies of the content key used to decrypt the media stream in which + * the PSSH box is embedded, each wrapped with a different entitlement key. + * May also contain sub-licenses to support devices with OEMCrypto 13 or + * older. May be repeated if using group entitlement keys. Present only in + * PSSHs of type ENTITLED_KEY. + * + * @generated from field: repeated license_protocol.WidevinePsshData.EntitledKey entitled_keys = 14; + */ + entitledKeys: WidevinePsshData_EntitledKey[]; - /** - * Video feature identifier, which is used in conjunction with |content_id| - * to determine the set of keys to be returned in the license. Cannot be - * present in conjunction with |key_ids|. - * Current values are "HDR". - * - * @generated from field: optional string video_feature = 15; - */ - videoFeature?: string + /** + * Video feature identifier, which is used in conjunction with |content_id| + * to determine the set of keys to be returned in the license. Cannot be + * present in conjunction with |key_ids|. + * Current values are "HDR". + * + * @generated from field: optional string video_feature = 15; + */ + videoFeature?: string; - /** - * @generated from field: optional license_protocol.WidevinePsshData.Algorithm algorithm = 1 [deprecated = true]; - * @deprecated - */ - algorithm?: WidevinePsshData_Algorithm + /** + * @generated from field: optional license_protocol.WidevinePsshData.Algorithm algorithm = 1 [deprecated = true]; + * @deprecated + */ + algorithm?: WidevinePsshData_Algorithm; - /** - * Content provider name. - * - * @generated from field: optional string provider = 3 [deprecated = true]; - * @deprecated - */ - provider?: string + /** + * Content provider name. + * + * @generated from field: optional string provider = 3 [deprecated = true]; + * @deprecated + */ + provider?: string; - /** - * Track type. Acceptable values are SD, HD and AUDIO. Used to - * differentiate content keys used by an asset. - * - * @generated from field: optional string track_type = 5 [deprecated = true]; - * @deprecated - */ - trackType?: string + /** + * Track type. Acceptable values are SD, HD and AUDIO. Used to + * differentiate content keys used by an asset. + * + * @generated from field: optional string track_type = 5 [deprecated = true]; + * @deprecated + */ + trackType?: string; - /** - * The name of a registered policy to be used for this asset. - * - * @generated from field: optional string policy = 6 [deprecated = true]; - * @deprecated - */ - policy?: string + /** + * The name of a registered policy to be used for this asset. + * + * @generated from field: optional string policy = 6 [deprecated = true]; + * @deprecated + */ + policy?: string; - /** - * Optional protected context for group content. The grouped_license is a - * serialized SignedMessage. - * - * @generated from field: optional bytes grouped_license = 8 [deprecated = true]; - * @deprecated - */ - groupedLicense?: Uint8Array -} + /** + * Optional protected context for group content. The grouped_license is a + * serialized SignedMessage. + * + * @generated from field: optional bytes grouped_license = 8 [deprecated = true]; + * @deprecated + */ + groupedLicense?: Uint8Array; +}; /** * Describes the message license_protocol.WidevinePsshData. * Use `create(WidevinePsshDataSchema)` to create a new message. */ -export const WidevinePsshDataSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 10) +export const WidevinePsshDataSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 10); /** * @generated from message license_protocol.WidevinePsshData.EntitledKey */ export type WidevinePsshData_EntitledKey = Message<'license_protocol.WidevinePsshData.EntitledKey'> & { - /** - * ID of entitlement key used for wrapping |key|. - * - * @generated from field: optional bytes entitlement_key_id = 1; - */ - entitlementKeyId?: Uint8Array + /** + * ID of entitlement key used for wrapping |key|. + * + * @generated from field: optional bytes entitlement_key_id = 1; + */ + entitlementKeyId?: Uint8Array; - /** - * ID of the entitled key. - * - * @generated from field: optional bytes key_id = 2; - */ - keyId?: Uint8Array + /** + * ID of the entitled key. + * + * @generated from field: optional bytes key_id = 2; + */ + keyId?: Uint8Array; - /** - * Wrapped key. Required. - * - * @generated from field: optional bytes key = 3; - */ - key?: Uint8Array + /** + * Wrapped key. Required. + * + * @generated from field: optional bytes key = 3; + */ + key?: Uint8Array; - /** - * IV used for wrapping |key|. Required. - * - * @generated from field: optional bytes iv = 4; - */ - iv?: Uint8Array + /** + * IV used for wrapping |key|. Required. + * + * @generated from field: optional bytes iv = 4; + */ + iv?: Uint8Array; - /** - * Size of entitlement key used for wrapping |key|. - * - * @generated from field: optional uint32 entitlement_key_size_bytes = 5; - */ - entitlementKeySizeBytes?: number -} + /** + * Size of entitlement key used for wrapping |key|. + * + * @generated from field: optional uint32 entitlement_key_size_bytes = 5; + */ + entitlementKeySizeBytes?: number; +}; /** * Describes the message license_protocol.WidevinePsshData.EntitledKey. * Use `create(WidevinePsshData_EntitledKeySchema)` to create a new message. */ -export const WidevinePsshData_EntitledKeySchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 10, 0) +export const WidevinePsshData_EntitledKeySchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 10, 0); /** * @generated from enum license_protocol.WidevinePsshData.Type */ export enum WidevinePsshData_Type { - /** - * Single PSSH to be used to retrieve content keys. - * - * @generated from enum value: SINGLE = 0; - */ - SINGLE = 0, + /** + * Single PSSH to be used to retrieve content keys. + * + * @generated from enum value: SINGLE = 0; + */ + SINGLE = 0, - /** - * Primary PSSH used to retrieve entitlement keys. - * - * @generated from enum value: ENTITLEMENT = 1; - */ - ENTITLEMENT = 1, + /** + * Primary PSSH used to retrieve entitlement keys. + * + * @generated from enum value: ENTITLEMENT = 1; + */ + ENTITLEMENT = 1, - /** - * Secondary PSSH containing entitled key(s). - * - * @generated from enum value: ENTITLED_KEY = 2; - */ - ENTITLED_KEY = 2 + /** + * Secondary PSSH containing entitled key(s). + * + * @generated from enum value: ENTITLED_KEY = 2; + */ + ENTITLED_KEY = 2 } /** * Describes the enum license_protocol.WidevinePsshData.Type. */ -export const WidevinePsshData_TypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 10, 0) +export const WidevinePsshData_TypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 10, 0); /** * ////////////////////////// Deprecated Fields //////////////////////////// @@ -2227,21 +2227,21 @@ export const WidevinePsshData_TypeSchema: GenEnum = /*@__ * @generated from enum license_protocol.WidevinePsshData.Algorithm */ export enum WidevinePsshData_Algorithm { - /** - * @generated from enum value: UNENCRYPTED = 0; - */ - UNENCRYPTED = 0, + /** + * @generated from enum value: UNENCRYPTED = 0; + */ + UNENCRYPTED = 0, - /** - * @generated from enum value: AESCTR = 1; - */ - AESCTR = 1 + /** + * @generated from enum value: AESCTR = 1; + */ + AESCTR = 1 } /** * Describes the enum license_protocol.WidevinePsshData.Algorithm. */ -export const WidevinePsshData_AlgorithmSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 10, 1) +export const WidevinePsshData_AlgorithmSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 10, 1); /** * File Hashes for Verified Media Path (VMP) support. @@ -2249,207 +2249,207 @@ export const WidevinePsshData_AlgorithmSchema: GenEnum & { - /** - * @generated from field: optional bytes signer = 1; - */ - signer?: Uint8Array + /** + * @generated from field: optional bytes signer = 1; + */ + signer?: Uint8Array; - /** - * @generated from field: repeated license_protocol.FileHashes.Signature signatures = 2; - */ - signatures: FileHashes_Signature[] -} + /** + * @generated from field: repeated license_protocol.FileHashes.Signature signatures = 2; + */ + signatures: FileHashes_Signature[]; +}; /** * Describes the message license_protocol.FileHashes. * Use `create(FileHashesSchema)` to create a new message. */ -export const FileHashesSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 11) +export const FileHashesSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 11); /** * @generated from message license_protocol.FileHashes.Signature */ export type FileHashes_Signature = Message<'license_protocol.FileHashes.Signature'> & { - /** - * @generated from field: optional string filename = 1; - */ - filename?: string + /** + * @generated from field: optional string filename = 1; + */ + filename?: string; - /** - * 0 - release, 1 - testing - * - * @generated from field: optional bool test_signing = 2; - */ - testSigning?: boolean + /** + * 0 - release, 1 - testing + * + * @generated from field: optional bool test_signing = 2; + */ + testSigning?: boolean; - /** - * @generated from field: optional bytes SHA512Hash = 3; - */ - SHA512Hash?: Uint8Array + /** + * @generated from field: optional bytes SHA512Hash = 3; + */ + SHA512Hash?: Uint8Array; - /** - * 0 for dlls, 1 for exe, this is field 3 in file - * - * @generated from field: optional bool main_exe = 4; - */ - mainExe?: boolean + /** + * 0 for dlls, 1 for exe, this is field 3 in file + * + * @generated from field: optional bool main_exe = 4; + */ + mainExe?: boolean; - /** - * @generated from field: optional bytes signature = 5; - */ - signature?: Uint8Array -} + /** + * @generated from field: optional bytes signature = 5; + */ + signature?: Uint8Array; +}; /** * Describes the message license_protocol.FileHashes.Signature. * Use `create(FileHashes_SignatureSchema)` to create a new message. */ -export const FileHashes_SignatureSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 11, 0) +export const FileHashes_SignatureSchema: GenMessage = /*@__PURE__*/ messageDesc(file_license_protocol, 11, 0); /** * @generated from enum license_protocol.LicenseType */ export enum LicenseType { - /** - * @generated from enum value: LICENSETYPE_UNVERIFIED = 0; - */ - LICENSETYPE_UNVERIFIED = 0, + /** + * @generated from enum value: LICENSETYPE_UNVERIFIED = 0; + */ + LICENSETYPE_UNVERIFIED = 0, - /** - * @generated from enum value: STREAMING = 1; - */ - STREAMING = 1, + /** + * @generated from enum value: STREAMING = 1; + */ + STREAMING = 1, - /** - * @generated from enum value: OFFLINE = 2; - */ - OFFLINE = 2, + /** + * @generated from enum value: OFFLINE = 2; + */ + OFFLINE = 2, - /** - * License type decision is left to provider. - * - * @generated from enum value: AUTOMATIC = 3; - */ - AUTOMATIC = 3 + /** + * License type decision is left to provider. + * + * @generated from enum value: AUTOMATIC = 3; + */ + AUTOMATIC = 3 } /** * Describes the enum license_protocol.LicenseType. */ -export const LicenseTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 0) +export const LicenseTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 0); /** * @generated from enum license_protocol.PlatformVerificationStatus */ export enum PlatformVerificationStatus { - /** - * The platform is not verified. - * - * @generated from enum value: PLATFORM_UNVERIFIED = 0; - */ - PLATFORM_UNVERIFIED = 0, + /** + * The platform is not verified. + * + * @generated from enum value: PLATFORM_UNVERIFIED = 0; + */ + PLATFORM_UNVERIFIED = 0, - /** - * Tampering detected on the platform. - * - * @generated from enum value: PLATFORM_TAMPERED = 1; - */ - PLATFORM_TAMPERED = 1, + /** + * Tampering detected on the platform. + * + * @generated from enum value: PLATFORM_TAMPERED = 1; + */ + PLATFORM_TAMPERED = 1, - /** - * The platform has been verified by means of software. - * - * @generated from enum value: PLATFORM_SOFTWARE_VERIFIED = 2; - */ - PLATFORM_SOFTWARE_VERIFIED = 2, + /** + * The platform has been verified by means of software. + * + * @generated from enum value: PLATFORM_SOFTWARE_VERIFIED = 2; + */ + PLATFORM_SOFTWARE_VERIFIED = 2, - /** - * The platform has been verified by means of hardware (e.g. secure boot). - * - * @generated from enum value: PLATFORM_HARDWARE_VERIFIED = 3; - */ - PLATFORM_HARDWARE_VERIFIED = 3, + /** + * The platform has been verified by means of hardware (e.g. secure boot). + * + * @generated from enum value: PLATFORM_HARDWARE_VERIFIED = 3; + */ + PLATFORM_HARDWARE_VERIFIED = 3, - /** - * Platform verification was not performed. - * - * @generated from enum value: PLATFORM_NO_VERIFICATION = 4; - */ - PLATFORM_NO_VERIFICATION = 4, + /** + * Platform verification was not performed. + * + * @generated from enum value: PLATFORM_NO_VERIFICATION = 4; + */ + PLATFORM_NO_VERIFICATION = 4, - /** - * Platform and secure storage capability have been verified by means of - * software. - * - * @generated from enum value: PLATFORM_SECURE_STORAGE_SOFTWARE_VERIFIED = 5; - */ - PLATFORM_SECURE_STORAGE_SOFTWARE_VERIFIED = 5 + /** + * Platform and secure storage capability have been verified by means of + * software. + * + * @generated from enum value: PLATFORM_SECURE_STORAGE_SOFTWARE_VERIFIED = 5; + */ + PLATFORM_SECURE_STORAGE_SOFTWARE_VERIFIED = 5 } /** * Describes the enum license_protocol.PlatformVerificationStatus. */ -export const PlatformVerificationStatusSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 1) +export const PlatformVerificationStatusSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 1); /** * @generated from enum license_protocol.ProtocolVersion */ export enum ProtocolVersion { - /** - * @generated from enum value: VERSION_UNVERIFIED = 0; - */ - VERSION_UNVERIFIED = 0, + /** + * @generated from enum value: VERSION_UNVERIFIED = 0; + */ + VERSION_UNVERIFIED = 0, - /** - * @generated from enum value: VERSION_2_0 = 20; - */ - VERSION_2_0 = 20, + /** + * @generated from enum value: VERSION_2_0 = 20; + */ + VERSION_2_0 = 20, - /** - * @generated from enum value: VERSION_2_1 = 21; - */ - VERSION_2_1 = 21, + /** + * @generated from enum value: VERSION_2_1 = 21; + */ + VERSION_2_1 = 21, - /** - * @generated from enum value: VERSION_2_2 = 22; - */ - VERSION_2_2 = 22 + /** + * @generated from enum value: VERSION_2_2 = 22; + */ + VERSION_2_2 = 22 } /** * Describes the enum license_protocol.ProtocolVersion. */ -export const ProtocolVersionSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 2) +export const ProtocolVersionSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 2); /** * @generated from enum license_protocol.HashAlgorithmProto */ export enum HashAlgorithmProto { - /** - * Unspecified hash algorithm: SHA_256 shall be used for ECC based algorithms - * and SHA_1 shall be used otherwise. - * - * @generated from enum value: HASH_ALGORITHM_UNSPECIFIED = 0; - */ - HASH_ALGORITHM_UNSPECIFIED = 0, + /** + * Unspecified hash algorithm: SHA_256 shall be used for ECC based algorithms + * and SHA_1 shall be used otherwise. + * + * @generated from enum value: HASH_ALGORITHM_UNSPECIFIED = 0; + */ + HASH_ALGORITHM_UNSPECIFIED = 0, - /** - * @generated from enum value: HASH_ALGORITHM_SHA_1 = 1; - */ - HASH_ALGORITHM_SHA_1 = 1, + /** + * @generated from enum value: HASH_ALGORITHM_SHA_1 = 1; + */ + HASH_ALGORITHM_SHA_1 = 1, - /** - * @generated from enum value: HASH_ALGORITHM_SHA_256 = 2; - */ - HASH_ALGORITHM_SHA_256 = 2, + /** + * @generated from enum value: HASH_ALGORITHM_SHA_256 = 2; + */ + HASH_ALGORITHM_SHA_256 = 2, - /** - * @generated from enum value: HASH_ALGORITHM_SHA_384 = 3; - */ - HASH_ALGORITHM_SHA_384 = 3 + /** + * @generated from enum value: HASH_ALGORITHM_SHA_384 = 3; + */ + HASH_ALGORITHM_SHA_384 = 3 } /** * Describes the enum license_protocol.HashAlgorithmProto. */ -export const HashAlgorithmProtoSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 3) +export const HashAlgorithmProtoSchema: GenEnum = /*@__PURE__*/ enumDesc(file_license_protocol, 3);