EZDRM - Widevine

1
Use EZDRM CPIX API to create your content encryption keys

Get response from the following url:
https://cpix.ezdrm.com/KeyGenerator/cpix.aspx?k=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&u=username&p=password&c=resourcename&m=1

URL params described below:

ParameterDescription
k=Key ID value (client generated) in GUID format
u=EZDRM account username or email
p=EZDRM account password
c=Content Resource ID (such as a stream name or media asset name)
m=0 or not providedDefault (returns all available keys)
m=1Widevine and Playready
m=2Fairplay

2
Get your content encryption keys from EZDRM XML response

EZDRM XML response example shown below:

<cpix:CPIX xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" id="bunny">
    <cpix:ContentKeyList>
        <cpix:ContentKey kid="297f600f-1234-1234-b060-2ac13cc42585">
            <cpix:Data>
                <pskc:Secret>
                    <pskc:PlainValue>jgE7ws6lbo4GBatA0vEoKQ==</pskc:PlainValue>
                </pskc:Secret>
            </cpix:Data>
        </cpix:ContentKey>
    </cpix:ContentKeyList>
    <cpix:DRMSystemList>
        <cpix:DRMSystem kid="297f600f-1234-1234-b060-2ac13cc42585" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
            <cpix:PSSH>AAAAdnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFYIARIQKX9gD08XTA+wYCrBPMQlhRoIbW92aWRvbmUiMnsia2lkIjoiS1g5Z0QwOFhUQSt3WUNyQlBNUWxoUT09IiwidHJhY2tzIjpbIlNEIl19KgJTRA==</cpix:PSSH>
            <cpix:ContentProtectionData/>
        </cpix:DRMSystem>
        <cpix:DRMSystem kid="297f600f-1234-1234-b060-2ac13cc42585" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
            <cpix:PSSH>AAADBnBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAubmAgAAAQABANwCPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBEADIAQgAvAEsAUgBkAFAARAAwAHkAdwBZAEMAcgBCAFAATQBRAGwAaABRAD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAHAAbABhAHkAcgBlAGEAZAB5AC4AZQB6AGQAcgBtAC4AYwBvAG0ALwBjAGUAbgBjAHkALwBwAHIAZQBhAHUAdABoAC4AYQBzAHAAeAA/AHAAWAA9AEEAMQBGAEQANABEADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4AVgBsAFIANwBJAGQAcwBJAEoARQB1AFIAZAAwADYATABhAHEAcwAyAGoAdwA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AeABMAEEAeABpAHAAVwA1AGsAYQBFAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</cpix:PSSH>
            <cpix:ContentProtectionData>PG1zcHI6cHJvPjVnSUFBQUVBQVFEY0Fqd0FWd0JTQUUwQVNBQkZBRUVBUkFCRkFGSUFJQUI0QUcwQWJBQnVBSE1BUFFBaUFHZ0FkQUIwQUhBQU9nQXZBQzhBY3dCakFHZ0FaUUJ0QUdFQWN3QXVBRzBBYVFCakFISUFid0J6QUc4QVpnQjBBQzRBWXdCdkFHMEFMd0JFQUZJQVRRQXZBRElBTUFBd0FEY0FMd0F3QURNQUx3QlFBR3dBWVFCNUFGSUFaUUJoQUdRQWVRQklBR1VBWVFCa0FHVUFjZ0FpQUNBQWRnQmxBSElBY3dCcEFHOEFiZ0E5QUNJQU5BQXVBREFBTGdBd0FDNEFNQUFpQUQ0QVBBQkVBRUVBVkFCQkFENEFQQUJRQUZJQVR3QlVBRVVBUXdCVUFFa0FUZ0JHQUU4QVBnQThBRXNBUlFCWkFFd0FSUUJPQUQ0QU1RQTJBRHdBTHdCTEFFVUFXUUJNQUVVQVRnQStBRHdBUVFCTUFFY0FTUUJFQUQ0QVFRQkZBRk1BUXdCVUFGSUFQQUF2QUVFQVRBQkhBRWtBUkFBK0FEd0FMd0JRQUZJQVR3QlVBRVVBUXdCVUFFa0FUZ0JHQUU4QVBnQThBRXNBU1FCRUFENEFSQUF5QUVJQUx3QkxBRklBWkFCUUFFUUFNQUI1QUhjQVdRQkRBSElBUWdCUUFFMEFVUUJzQUdnQVVRQTlBRDBBUEFBdkFFc0FTUUJFQUQ0QVBBQk1BRUVBWHdCVkFGSUFUQUErQUdnQWRBQjBBSEFBY3dBNkFDOEFMd0J3QUd3QVlRQjVBSElBWlFCaEFHUUFlUUF1QUdVQWVnQmtBSElBYlFBdUFHTUFid0J0QUM4QVl3QmxBRzRBWXdCNUFDOEFjQUJ5QUdVQVlRQjFBSFFBYUFBdUFHRUFjd0J3QUhnQVB3QndBRmdBUFFCQkFERUFSZ0JFQURRQVJBQThBQzhBVEFCQkFGOEFWUUJTQUV3QVBnQThBRVFBVXdCZkFFa0FSQUErQUZZQWJBQlNBRGNBU1FCa0FITUFTUUJLQUVVQWRRQlNBR1FBTUFBMkFFd0FZUUJ4QUhNQU1nQnFBSGNBUFFBOUFEd0FMd0JFQUZNQVh3QkpBRVFBUGdBOEFFTUFTQUJGQUVNQVN3QlRBRlVBVFFBK0FIZ0FUQUJCQUhnQWFRQndBRmNBTlFCckFHRUFSUUE5QUR3QUx3QkRBRWdBUlFCREFFc0FVd0JWQUUwQVBnQThBQzhBUkFCQkFGUUFRUUErQUR3QUx3QlhBRklBVFFCSUFFVUFRUUJFQUVVQVVnQStBQT09PC9tc3ByOnBybz4=</cpix:ContentProtectionData>
        </cpix:DRMSystem>
    </cpix:DRMSystemList>
</cpix:CPIX>

You need to provide three params to Qencode API in order to enable DRM encryption:

  1. key_id: this is the value you provided for "k" param in the URL described on step 1 above. You also can get it from "kid" attribute of cpix:ContentKey or cpix:DRMSystem tags in EZDRM XML response.

    Warning
    Warning:
    Please make sure you remove dash - characters from key_id value when submitting in Qencode API request since it should be in hex format.

  2. key: you need to get pskc:PlainValue xml tag content, decode it from base64 format and convert to hex. Here's a line in python you can use for that:

>>> 'jgE7ws6lbo4GBatA0vEoKQ=='.decode('base64').encode('hex')
'8e013bc2cea56e8e0605ab40d2f12829'

So in our example hex key value will be 8e013bc2cea56e8e0605ab40d2f12829.

  1. pssh:
  • For Widevine use cpix:PSSH xml tag content from cpix:DRMSystem tag with systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed".

3
Add a 'cenc_drm' object to your Qencode API request JSON

In our example it will be as follows:

"cenc_drm": {
  "key_id" : "297f600f12341234b0602ac13cc42585",
  "key"    : "8e013bc2cea56e8e0605ab40d2f12829",
  "pssh" : "AAAAdnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFYIARIQKX9gD08XTA+wYCrBPMQlhRoIbW92aWRvbmUiMnsia2lkIjoiS1g5Z0QwOFhUQSt3WUNyQlBNUWxoUT09IiwidHJhY2tzIjpbIlNEIl19KgJTRA=="
}

You need to add 'cenc_drm' object as a direct child of the format object. Here's the full example:

{
  "query": {
    "source": "https://yourserver.com/video.mp4"
    "format": [
      {
        "output": "advanced_dash",
        "destination": {
          ...
        },
        "stream": [
          {
            "video_codec": "libx264",
            "height": 720,
            "width": 1280,
            "audio_bitrate": 128,
            "keyframe": 25,
            "bitrate": 3100
          }
        ],
        "cenc_drm": {
          "key_id" : "297f600f12341234b0602ac13cc42585",
          "key"    : "8e013bc2cea56e8e0605ab40d2f12829",
          "pssh" : "AAAAdnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFYIARIQKX9gD08XTA+wYCrBPMQlhRoIbW92aWRvbmUiMnsia2lkIjoiS1g5Z0QwOFhUQSt3WUNyQlBNUWxoUT09IiwidHJhY2tzIjpbIlNEIl19KgJTRA=="
        }
      }
    ]
  }
}