Skip to main content

SPEKE

Axinom Key Service supports an AWS protocol for key acquisition called SPEKE (Secure Packager and Encoder Key Exchange).

The integration endpoint is /Speke of the Key Acquisition API (or /SpekeV2 for the SPEKE 2.0).

See also:

Functionality​

The Client requests one or more content keys. The Key Service generates the necessary keys using the Key Seed model and returns the keys with additional DRM-specific metadata where needed.

SPEKE - Request/Response

Authorization​

This endpoint requires an authorization header - the same as described under the Key Service Management API.

Request/Response Format​

The original SPEKE version is 1.0. Since March 2021, AWS also supports the version 2.0.

SPEKE 2.0 brings the following evolutions compared to SPEKE v1.0:

  • Support for multiple content keys
  • All tags from the SPEKE XML namespace are deprecated in favor of equivalent tags in the CPIX XML namespace
  • SPEKE:ProtectionHeader is deprecated and replaced by CPIX:DRMSystem.SmoothStreamingProtectionHeaderData
  • CPIX:URIExtXKey, SPEKE:KeyFormat and SPEKE:KeyFormatVersions are deprecated and replaced by CPIX:DRMSystem.HLSsignallingData
  • CPIX@id is replaced by CPIX@contentId
  • New mandatory CPIX attributes: CPIX@version, ContentKey@commonEncryptionScheme
  • New optional CPIX element: DRMSystem.ContentProtectionData
  • Cross-versioning mechanism between SPEKE and CPIX
  • HTTP headers evolution: new X-Speke-Version header, Speke-User-Agent header renamed to X-Speke-User-Agent
  • Heartbeat API deprecation

Axinom Key Service supports both versions: 1.0 and 2.0, there are two separate endpoints. Below, you can find request/response samples for both versions.

In both cases, the Client creates a CPIX document in the format which it desires to get, just without the values for the keys, and sends this document to the Key Service. The Key Service generates the specified keys, adds this information to the document, and returns the CPIX document to the Client.

SPEKE 2.0​

For SPEKE 2.0 to work, you need to add the following HTTP Header to your request:

X-Speke-Version: 2.0

SPEKE 2.0 Request Sample​

SPEKE 2.0 Request Sample

<cpix:CPIX contentId="abc123" version="2.3" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
<cpix:ContentKeyList>
<cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="98ee5596-cd3e-a20d-163a-e382420c6eff" commonEncryptionScheme="cbcs"/>
<cpix:ContentKey explicitIV="L6jzdXrXAFbCJGBuMrrKrG==" kid="53abdba2-f210-43cb-bc90-f18f9a890a02" commonEncryptionScheme="cbcs"/>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
<cpix:HLSSignalingData playlist="media"/>
<cpix:HLSSignalingData playlist="master"/>
</cpix:DRMSystem>
<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
<cpix:HLSSignalingData playlist="media"/>
<cpix:HLSSignalingData playlist="master"/>
</cpix:DRMSystem>
<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
<cpix:PSSH/>
<cpix:ContentProtectionData/>
<cpix:HLSSignalingData playlist="media"/>
<cpix:HLSSignalingData playlist="master"/>
<cpix:SmoothStreamingProtectionHeaderData/>
</cpix:DRMSystem>
<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
<cpix:PSSH/>
<cpix:ContentProtectionData/>
<cpix:HLSSignalingData playlist="media"/>
<cpix:HLSSignalingData playlist="master"/>
<cpix:SmoothStreamingProtectionHeaderData/>
</cpix:DRMSystem>
<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cpix:PSSH/>
<cpix:ContentProtectionData/>
<cpix:HLSSignalingData playlist="media"/>
<cpix:HLSSignalingData playlist="master"/>
</cpix:DRMSystem>
<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cpix:PSSH/>
<cpix:ContentProtectionData/>
<cpix:HLSSignalingData playlist="media"/>
<cpix:HLSSignalingData playlist="master"/>
</cpix:DRMSystem>
</cpix:DRMSystemList>
<cpix:ContentKeyUsageRuleList>
<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="VIDEO">
<cpix:VideoFilter />
</cpix:ContentKeyUsageRule>
<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
<cpix:AudioFilter />
</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>

The table below describes some important elements of the SPEKE 2.0 request XML.

ElementDescription
ContentKeyListThe list of the Key IDs for which the Keys shall be generated. Each key ID is a GUID.
DRMSystemListRequested DRM types, for which the PSSH boxes will be delivered. The IDs are as defined by DASH-IF. Axinom Key Service supports FairPlay, PlayReady, and Widevine (listed in the example above in this order).
ContentKeyUsageRuleListContent key usage rules for each key. It’s a pass-through that will only be returned to the Client.

SPEKE 2.0 Response Sample​

SPEKE 2.0 Response Sample

<?xml version="1.0" encoding="utf-8"?>
<cpix:CPIX contentId="abc123" version="2.3" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
<cpix:ContentKeyList>
<cpix:ContentKey kid="98ee5596-cd3e-a20d-163a-e382420c6eff" explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" commonEncryptionScheme="cbcs">
<cpix:Data>
<pskc:Secret>
<pskc:PlainValue>nFLKuNE4LJ1+eXVGiSiTvA==</pskc:PlainValue>
</pskc:Secret>
</cpix:Data>
</cpix:ContentKey>
<cpix:ContentKey kid="53abdba2-f210-43cb-bc90-f18f9a890a02" explicitIV="L6jzdXrXAFbCJGBuMrrKrA==" commonEncryptionScheme="cbcs">
<cpix:Data>
<pskc:Secret>
<pskc:PlainValue>5UUASLfS3ajx0cAUw+rzmQ==</pskc:PlainValue>
</pskc:Secret>
</cpix:Data>
</cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<cpix:DRMSystem systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2" kid="98ee5596-cd3e-a20d-163a-e382420c6eff">
<cpix:HLSSignalingData playlist="master">I0VYVC1YLVNFU1NJT04tS0VZOk1FVEhPRD1TQU1QTEUtQUVTLFVSST0ic2tkOi8vOThlZTU1OTYtY2QzZS1hMjBkLTE2M2EtZTM4MjQyMGM2ZWZmOjM4NThGNjIyMzBBQzNDOTE1RjMwMEM2NjQzMTJDNjNGIixLRVlGT1JNQVQ9ImNvbS5hcHBsZS5zdHJlYW1pbmdrZXlkZWxpdmVyeSIsS0VZRk9STUFUVkVSU0lPTlM9IjEi</cpix:HLSSignalingData>
<cpix:HLSSignalingData playlist="media">I0VYVC1YLUtFWTpNRVRIT0Q9U0FNUExFLUFFUyxVUkk9InNrZDovLzk4ZWU1NTk2LWNkM2UtYTIwZC0xNjNhLWUzODI0MjBjNmVmZjozODU4RjYyMjMwQUMzQzkxNUYzMDBDNjY0MzEyQzYzRiIsS0VZRk9STUFUPSJjb20uYXBwbGUuc3RyZWFtaW5na2V5ZGVsaXZlcnkiLEtFWUZPUk1BVFZFUlNJT05TPSIxIg==</cpix:HLSSignalingData>
</cpix:DRMSystem>
<cpix:DRMSystem systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2" kid="53abdba2-f210-43cb-bc90-f18f9a890a02">
<cpix:HLSSignalingData playlist="master">I0VYVC1YLVNFU1NJT04tS0VZOk1FVEhPRD1TQU1QTEUtQUVTLFVSST0ic2tkOi8vNTNhYmRiYTItZjIxMC00M2NiLWJjOTAtZjE4ZjlhODkwYTAyOjJGQThGMzc1N0FENzAwNTZDMjI0NjA2RTMyQkFDQUFDIixLRVlGT1JNQVQ9ImNvbS5hcHBsZS5zdHJlYW1pbmdrZXlkZWxpdmVyeSIsS0VZRk9STUFUVkVSU0lPTlM9IjEi</cpix:HLSSignalingData>
<cpix:HLSSignalingData playlist="media">I0VYVC1YLUtFWTpNRVRIT0Q9U0FNUExFLUFFUyxVUkk9InNrZDovLzUzYWJkYmEyLWYyMTAtNDNjYi1iYzkwLWYxOGY5YTg5MGEwMjoyRkE4RjM3NTdBRDcwMDU2QzIyNDYwNkUzMkJBQ0FBQyIsS0VZRk9STUFUPSJjb20uYXBwbGUuc3RyZWFtaW5na2V5ZGVsaXZlcnkiLEtFWUZPUk1BVFZFUlNJT05TPSIxIg==</cpix:HLSSignalingData>
</cpix:DRMSystem>
<cpix:DRMSystem systemId="9a04f079-9840-4286-ab92-e65be0885f95" kid="98ee5596-cd3e-a20d-163a-e382420c6eff">
<cpix:PSSH /> <cpix:ContentProtectionData>PHBzc2ggeG1sbnM9InVybjptcGVnOmNlbmM6MjAxMyI+QUFBQjVIQnpjMmdBQUFBQW1nVHdlWmhBUW9hcmt1WmI0SWhmbFFBQUFjVEVBUUFBQVFBQkFMb0JQQUJYQUZJQVRRQklBRVVBUVFCRUFFVUFVZ0FnQUhnQWJRQnNBRzRBY3dBOUFDSUFhQUIwQUhRQWNBQTZBQzhBTHdCekFHTUFhQUJsQUcwQVlRQnpBQzRBYlFCcEFHTUFjZ0J2QUhNQWJ3Qm1BSFFBTGdCakFHOEFiUUF2QUVRQVVnQk5BQzhBTWdBd0FEQUFOd0F2QURBQU13QXZBRkFBYkFCaEFIa0FVZ0JsQUdFQVpBQjVBRWdBWlFCaEFHUUFaUUJ5QUNJQUlBQjJBR1VBY2dCekFHa0Fid0J1QUQwQUlnQTBBQzRBTUFBdUFEQUFMZ0F3QUNJQVBnQThBRVFBUVFCVUFFRUFQZ0E4QUZBQVVnQlBBRlFBUlFCREFGUUFTUUJPQUVZQVR3QStBRHdBU3dCRkFGa0FUQUJGQUU0QVBnQXhBRFlBUEFBdkFFc0FSUUJaQUV3QVJRQk9BRDRBUEFCQkFFd0FSd0JKQUVRQVBnQkJBRVVBVXdCREFGUUFVZ0E4QUM4QVFRQk1BRWNBU1FCRUFENEFQQUF2QUZBQVVnQlBBRlFBUlFCREFGUUFTUUJPQUVZQVR3QStBRHdBU3dCSkFFUUFQZ0JzQUd3QVdBQjFBRzBBUkFBM0FFNEFSQUJoQUVrQVZ3QlBBSFVBVHdCREFGRUFad0I0QUhVQUx3QjNBRDBBUFFBOEFDOEFTd0JKQUVRQVBnQThBQzhBUkFCQkFGUUFRUUErQUR3QUx3QlhBRklBVFFCSUFFVUFRUUJFQUVVQVVnQStBQT09PC9wc3NoPjxwcm8geG1sbnM9InVybjptaWNyb3NvZnQ6cGxheXJlYWR5Ij54QUVBQUFFQUFRQzZBVHdBVndCU0FFMEFTQUJGQUVFQVJBQkZBRklBSUFCNEFHMEFiQUJ1QUhNQVBRQWlBR2dBZEFCMEFIQUFPZ0F2QUM4QWN3QmpBR2dBWlFCdEFHRUFjd0F1QUcwQWFRQmpBSElBYndCekFHOEFaZ0IwQUM0QVl3QnZBRzBBTHdCRUFGSUFUUUF2QURJQU1BQXdBRGNBTHdBd0FETUFMd0JRQUd3QVlRQjVBRklBWlFCaEFHUUFlUUJJQUdVQVlRQmtBR1VBY2dBaUFDQUFkZ0JsQUhJQWN3QnBBRzhBYmdBOUFDSUFOQUF1QURBQUxnQXdBQzRBTUFBaUFENEFQQUJFQUVFQVZBQkJBRDRBUEFCUUFGSUFUd0JVQUVVQVF3QlVBRWtBVGdCR0FFOEFQZ0E4QUVzQVJRQlpBRXdBUlFCT0FENEFNUUEyQUR3QUx3QkxBRVVBV1FCTUFFVUFUZ0ErQUR3QVFRQk1BRWNBU1FCRUFENEFRUUJGQUZNQVF3QlVBRklBUEFBdkFFRUFUQUJIQUVrQVJBQStBRHdBTHdCUUFGSUFUd0JVQUVVQVF3QlVBRWtBVGdCR0FFOEFQZ0E4QUVzQVNRQkVBRDRBYkFCc0FGZ0FkUUJ0QUVRQU53Qk9BRVFBWVFCSkFGY0FUd0IxQUU4QVF3QlJBR2NBZUFCMUFDOEFkd0E5QUQwQVBBQXZBRXNBU1FCRUFENEFQQUF2QUVRQVFRQlVBRUVBUGdBOEFDOEFWd0JTQUUwQVNBQkZBRUVBUkFCRkFGSUFQZ0E9PC9wcm8+</cpix:ContentProtectionData>
<cpix:HLSSignalingData playlist="master" />
<cpix:HLSSignalingData playlist="media" />
<cpix:SmoothStreamingProtectionHeaderData />
</cpix:DRMSystem>
<cpix:DRMSystem systemId="9a04f079-9840-4286-ab92-e65be0885f95" kid="53abdba2-f210-43cb-bc90-f18f9a890a02">
<cpix:PSSH /> <cpix:ContentProtectionData>PHBzc2ggeG1sbnM9InVybjptcGVnOmNlbmM6MjAxMyI+QUFBQjVIQnpjMmdBQUFBQW1nVHdlWmhBUW9hcmt1WmI0SWhmbFFBQUFjVEVBUUFBQVFBQkFMb0JQQUJYQUZJQVRRQklBRVVBUVFCRUFFVUFVZ0FnQUhnQWJRQnNBRzRBY3dBOUFDSUFhQUIwQUhRQWNBQTZBQzhBTHdCekFHTUFhQUJsQUcwQVlRQnpBQzRBYlFCcEFHTUFjZ0J2QUhNQWJ3Qm1BSFFBTGdCakFHOEFiUUF2QUVRQVVnQk5BQzhBTWdBd0FEQUFOd0F2QURBQU13QXZBRkFBYkFCaEFIa0FVZ0JsQUdFQVpBQjVBRWdBWlFCaEFHUUFaUUJ5QUNJQUlBQjJBR1VBY2dCekFHa0Fid0J1QUQwQUlnQTBBQzRBTUFBdUFEQUFMZ0F3QUNJQVBnQThBRVFBUVFCVUFFRUFQZ0E4QUZBQVVnQlBBRlFBUlFCREFGUUFTUUJPQUVZQVR3QStBRHdBU3dCRkFGa0FUQUJGQUU0QVBnQXhBRFlBUEFBdkFFc0FSUUJaQUV3QVJRQk9BRDRBUEFCQkFFd0FSd0JKQUVRQVBnQkJBRVVBVXdCREFGUUFVZ0E4QUM4QVFRQk1BRWNBU1FCRUFENEFQQUF2QUZBQVVnQlBBRlFBUlFCREFGUUFTUUJPQUVZQVR3QStBRHdBU3dCSkFFUUFQZ0J2QUhRQWRRQnlBRlVBZUFCRUFIa0FlUUF3QUU4QU9BQnJBRkFBUndCUUFHMEFid0JyQUVzQVFRQm5BRDBBUFFBOEFDOEFTd0JKQUVRQVBnQThBQzhBUkFCQkFGUUFRUUErQUR3QUx3QlhBRklBVFFCSUFFVUFRUUJFQUVVQVVnQStBQT09PC9wc3NoPjxwcm8geG1sbnM9InVybjptaWNyb3NvZnQ6cGxheXJlYWR5Ij54QUVBQUFFQUFRQzZBVHdBVndCU0FFMEFTQUJGQUVFQVJBQkZBRklBSUFCNEFHMEFiQUJ1QUhNQVBRQWlBR2dBZEFCMEFIQUFPZ0F2QUM4QWN3QmpBR2dBWlFCdEFHRUFjd0F1QUcwQWFRQmpBSElBYndCekFHOEFaZ0IwQUM0QVl3QnZBRzBBTHdCRUFGSUFUUUF2QURJQU1BQXdBRGNBTHdBd0FETUFMd0JRQUd3QVlRQjVBRklBWlFCaEFHUUFlUUJJQUdVQVlRQmtBR1VBY2dBaUFDQUFkZ0JsQUhJQWN3QnBBRzhBYmdBOUFDSUFOQUF1QURBQUxnQXdBQzRBTUFBaUFENEFQQUJFQUVFQVZBQkJBRDRBUEFCUUFGSUFUd0JVQUVVQVF3QlVBRWtBVGdCR0FFOEFQZ0E4QUVzQVJRQlpBRXdBUlFCT0FENEFNUUEyQUR3QUx3QkxBRVVBV1FCTUFFVUFUZ0ErQUR3QVFRQk1BRWNBU1FCRUFENEFRUUJGQUZNQVF3QlVBRklBUEFBdkFFRUFUQUJIQUVrQVJBQStBRHdBTHdCUUFGSUFUd0JVQUVVQVF3QlVBRWtBVGdCR0FFOEFQZ0E4QUVzQVNRQkVBRDRBYndCMEFIVUFjZ0JWQUhnQVJBQjVBSGtBTUFCUEFEZ0Fhd0JRQUVjQVVBQnRBRzhBYXdCTEFFRUFad0E5QUQwQVBBQXZBRXNBU1FCRUFENEFQQUF2QUVRQVFRQlVBRUVBUGdBOEFDOEFWd0JTQUUwQVNBQkZBRUVBUkFCRkFGSUFQZ0E9PC9wcm8+</cpix:ContentProtectionData>
<cpix:HLSSignalingData playlist="master" />
<cpix:HLSSignalingData playlist="media" />
<cpix:SmoothStreamingProtectionHeaderData />
</cpix:DRMSystem>
<cpix:DRMSystem systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" kid="98ee5596-cd3e-a20d-163a-e382420c6eff">
<cpix:PSSH />
<cpix:ContentProtectionData>PHBzc2ggeG1sbnM9InVybjptcGVnOmNlbmM6MjAxMyI+QUFBQU9IQnpjMmdBQUFBQTdlK0xxWG5XU3M2anlDZmMxUjBoN1FBQUFCZ1NFSmp1VlpiTlBxSU5GanJqZ2tJTWJ2OUk0OXlWbXdZPTwvcHNzaD4=</cpix:ContentProtectionData>
<cpix:HLSSignalingData playlist="master">I0VYVC1YLVNFU1NJT04tS0VZOk1FVEhPRD1TQU1QTEUtQUVTLUNUUixVUkk9ImRhdGE6dGV4dC9wbGFpbjtiYXNlNjQsQUFBQU9IQnpjMmdBQUFBQTdlK0xxWG5XU3M2anlDZmMxUjBoN1FBQUFCZ1NFSmp1VlpiTlBxSU5GanJqZ2tJTWJ2OUk0OXlWbXdZPSIsS0VZSUQ9MHg5OEVFNTU5NkNEM0VBMjBEMTYzQUUzODI0MjBDNkVGRixLRVlGT1JNQVQ9InVybjp1dWlkOmVkZWY4YmE5LTc5ZDYtNGFjZS1hM2M4LTI3ZGNkNTFkMjFlZCIsS0VZRk9STUFUVkVSU0lPTlM9IjEi</cpix:HLSSignalingData>
<cpix:HLSSignalingData playlist="media">I0VYVC1YLUtFWTpNRVRIT0Q9U0FNUExFLUFFUy1DVFIsVVJJPSJkYXRhOnRleHQvcGxhaW47YmFzZTY0LEFBQUFPSEJ6YzJnQUFBQUE3ZStMcVhuV1NzNmp5Q2ZjMVIwaDdRQUFBQmdTRUpqdVZaYk5QcUlORmpyamdrSU1idjlJNDl5Vm13WT0iLEtFWUlEPTB4OThFRTU1OTZDRDNFQTIwRDE2M0FFMzgyNDIwQzZFRkYsS0VZRk9STUFUPSJ1cm46dXVpZDplZGVmOGJhOS03OWQ2LTRhY2UtYTNjOC0yN2RjZDUxZDIxZWQiLEtFWUZPUk1BVFZFUlNJT05TPSIxIg==</cpix:HLSSignalingData>
</cpix:DRMSystem>
<cpix:DRMSystem systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" kid="53abdba2-f210-43cb-bc90-f18f9a890a02">
<cpix:PSSH />
<cpix:ContentProtectionData>PHBzc2ggeG1sbnM9InVybjptcGVnOmNlbmM6MjAxMyI+QUFBQU9IQnpjMmdBQUFBQTdlK0xxWG5XU3M2anlDZmMxUjBoN1FBQUFCZ1NFRk9yMjZMeUVFUEx2SkR4ajVxSkNnSkk0OXlWbXdZPTwvcHNzaD4=</cpix:ContentProtectionData>
<cpix:HLSSignalingData playlist="master">I0VYVC1YLVNFU1NJT04tS0VZOk1FVEhPRD1TQU1QTEUtQUVTLUNUUixVUkk9ImRhdGE6dGV4dC9wbGFpbjtiYXNlNjQsQUFBQU9IQnpjMmdBQUFBQTdlK0xxWG5XU3M2anlDZmMxUjBoN1FBQUFCZ1NFRk9yMjZMeUVFUEx2SkR4ajVxSkNnSkk0OXlWbXdZPSIsS0VZSUQ9MHg1M0FCREJBMkYyMTA0M0NCQkM5MEYxOEY5QTg5MEEwMixLRVlGT1JNQVQ9InVybjp1dWlkOmVkZWY4YmE5LTc5ZDYtNGFjZS1hM2M4LTI3ZGNkNTFkMjFlZCIsS0VZRk9STUFUVkVSU0lPTlM9IjEi</cpix:HLSSignalingData>
<cpix:HLSSignalingData playlist="media">I0VYVC1YLUtFWTpNRVRIT0Q9U0FNUExFLUFFUy1DVFIsVVJJPSJkYXRhOnRleHQvcGxhaW47YmFzZTY0LEFBQUFPSEJ6YzJnQUFBQUE3ZStMcVhuV1NzNmp5Q2ZjMVIwaDdRQUFBQmdTRUZPcjI2THlFRVBMdkpEeGo1cUpDZ0pJNDl5Vm13WT0iLEtFWUlEPTB4NTNBQkRCQTJGMjEwNDNDQkJDOTBGMThGOUE4OTBBMDIsS0VZRk9STUFUPSJ1cm46dXVpZDplZGVmOGJhOS03OWQ2LTRhY2UtYTNjOC0yN2RjZDUxZDIxZWQiLEtFWUZPUk1BVFZFUlNJT05TPSIxIg==</cpix:HLSSignalingData>
</cpix:DRMSystem>
</cpix:DRMSystemList>
<cpix:ContentKeyUsageRuleList>
<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="VIDEO">
<cpix:VideoFilter />
</cpix:ContentKeyUsageRule>
<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
<cpix:AudioFilter />
</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>

The table below explains the key elements of the SPEKE 2.0 response XML.

ElementDescription
ContentKeyListA generated Key and an initialization vector (IV) for each Key ID.
DRMSystemListAdditional protection data for each requested DRM system and each key.
ContentKeyUsageRuleListContent key usage rules, the same as in the request.

SPEKE 1.0​

SPEKE 1.0 Request Sample​

SPEKE 1.0 Request Sample

<?xml version="1.0"?>
<cpix:CPIX xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" id="test_ch1">
<cpix:ContentKeyList>
<cpix:ContentKey kid="af1ed63c-5784-460b-9e51-309dd47b7d9c"/>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<cpix:DRMSystem systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2" kid="af1ed63c-5784-460b-9e51-309dd47b7d9c"/>
<cpix:DRMSystem systemId="9a04f079-9840-4286-ab92-e65be0885f95" kid="af1ed63c-5784-460b-9e51-309dd47b7d9c"/>
<cpix:DRMSystem systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" kid="af1ed63c-5784-460b-9e51-309dd47b7d9c"/>
</cpix:DRMSystemList>
<cpix:ContentKeyPeriodList>
<cpix:ContentKeyPeriod id="keyPeriod_19d21813-874e-4804-8a56-1952722abeb5" index="213"/>
</cpix:ContentKeyPeriodList>
<cpix:ContentKeyUsageRuleList>
<cpix:ContentKeyUsageRule kid="af1ed63c-5784-460b-9e51-309dd47b7d9c">
<cpix:KeyPeriodFilter periodId="keyPeriod_19d21813-874e-4804-8a56-1952722abeb5"/>
</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>


The table below explains the key elements of the SPEKE 1.0 request XML.

ElementDescription
ContentKeyListThe list containing a single Key ID for which the Key shall be generated. Key ID is a GUID.
DRMSystemListRequested DRM types, for which the PSSH boxes will be delivered. The IDs are as defined by DASH-IF. Axinom Key Service supports FairPlay, PlayReady, and Widevine (listed in the example above in this order).
ContentKeyPeriodListA list of the ContentKeyPeriod elements.
ContentKeyUsageRuleListContent key usage rules for the key. It’s a pass-through that will only be returned to the Client.

SPEKE 1.0 Response Sample​

SPEKE 1.0 Response Sample

<?xml version="1.0" encoding="utf-8"?>
<cpix:CPIX
xmlns:cpix="urn:dashif:org:cpix"
xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke" id="test_ch1">
<cpix:ContentKeyList>
<cpix:ContentKey kid="af1ed63c-5784-460b-9e51-309dd47b7d9c" explicitIV="0sgFwyYt3dcIw/IEWRj8xg==">
<cpix:Data>
<pskc:Secret>
<pskc:PlainValue>BKp/7CmIS+8AuBPS3136Hw==</pskc:PlainValue>
</pskc:Secret>
</cpix:Data>
</cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<cpix:DRMSystem systemId="9a04f079-9840-4286-ab92-e65be0885f95" kid="af1ed63c-5784-460b-9e51-309dd47b7d9c" />
<cpix:DRMSystem systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" kid="af1ed63c-5784-460b-9e51-309dd47b7d9c" />
<cpix:DRMSystem systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2" kid="af1ed63c-5784-460b-9e51-309dd47b7d9c" />
</cpix:DRMSystemList>
<cpix:ContentKeyPeriodList>
<cpix:ContentKeyPeriod id="keyPeriod_19d21813-874e-4804-8a56-1952722abeb5" index="213" />
</cpix:ContentKeyPeriodList>
<cpix:ContentKeyUsageRuleList>
<cpix:ContentKeyUsageRule kid="af1ed63c-5784-460b-9e51-309dd47b7d9c">
<cpix:KeyPeriodFilter periodId="keyPeriod_19d21813-874e-4804-8a56-1952722abeb5" />
</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>

The table below explains the key elements of the SPEKE 1.0 response XML.

ElementDescription
ContentKeyListA generated Key and an initialization vector (IV).
DRMSystemListAdditional protection data for each requested DRM system and each key.
ContentKeyPeriodListA list of the ContentKeyPeriod elements.
ContentKeyUsageRuleListContent key usage rules, the same as in the request.

How to get the KeyID?​

Packagers, when they request encryption keys from a Key Service, usually generate the related KeyID automatically. It’s important for the downstream DRM processes to know the Key ID, but not all packagers report the assigned Key ID back to the user. For example, AWS doesn’t report the Key ID.

They Key ID can be extracted from the created DASH/HLS manifest, but this can be inconvenient and can only be done after packaging is completed.

There are two possible workarounds for this issue.

It is possible to override the Key ID assigned by a packager by supplying a flag: ?overrideKeyIds=true. The new Key ID is then generated using a deterministic algorithm, see SPEKE Override Functionality.

An alternative solution can be a proxy which sits between a packager and the Key Service and reports the Key ID. Read Extracting Key ID from SPEKE requests for guidelines.

Encryption Schemes​

In SPEKE 2.0 the attribute commonEncryptionScheme is mandatory for each requested key.

Values supported for 'commonEncryptionScheme' and each of the DRM technologies

SchemeWidevinePlayReadyFairPlay
cencXX
cbcsXXX
censX
cbc1X

For SPEKE 1.0, If 'CMAF' is used with the encryption method 'AES-CBC subsample', the optional 'protectionScheme' parameter in the Key Service URL must be set to 'cbcs'.

https://key-server-management.axprod.net/api/Speke?protectionScheme=cbcs