Skip to content

Commit f6dbebc

Browse files
committed
feat: Add DASH-IF Certurl support
Add DASH-IF Certurl support and test for CPIX-based DRM configuration that verifies LaURL and CertificateURL are properly inserted into MPD manifests for Widevine, PlayReady, and FairPlay systems. Changes: - Added TestParamToMPD test case for CPIX-based DRM with all three DRM systems - Extended pkg/drm/drm_test.go to verify CertificateURL population for all DRM systems (Widevine has empty, PlayReady and FairPlay have values) - Updated cpix_1key_cbcs_test.xml with all three DRM system IDs - Created DRM configuration file for app testdata - Fixed CertURL field reference in livempd.go (should be CertificateURL)
1 parent 8142f4d commit f6dbebc

File tree

10 files changed

+130
-7
lines changed

10 files changed

+130
-7
lines changed

cmd/livesim2/app/handler_livesim_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"strings"
1313
"testing"
1414

15+
"github.com/Dash-Industry-Forum/livesim2/pkg/drm"
1516
"github.com/Dash-Industry-Forum/livesim2/pkg/logging"
1617
"github.com/stretchr/testify/require"
1718
)
@@ -24,6 +25,12 @@ func TestParamToMPD(t *testing.T) {
2425
}
2526
err := logging.InitSlog(cfg.LogLevel, cfg.LogFormat)
2627
require.NoError(t, err)
28+
29+
// Load DRM configuration for tests
30+
drmCfg, err := drm.ReadDrmConfig("testdata/drm.json")
31+
require.NoError(t, err)
32+
cfg.DrmCfg = drmCfg
33+
2734
server, err := SetupServer(context.Background(), &cfg)
2835
require.NoError(t, err)
2936
ts := httptest.NewServer(server.Router)
@@ -75,6 +82,26 @@ func TestParamToMPD(t *testing.T) {
7582
`<dashif:Laurl xmlns:dashif="https://dashif.org/CPS" licenseType="EME-1.0">`,
7683
},
7784
},
85+
{
86+
desc: "CPIX-based DRM with Widevine, PlayReady, and FairPlay",
87+
mpd: "testpic_2s/Manifest.mpd",
88+
params: "drm_EZDRM-1-key-cbcs-test/",
89+
wantedStatusCode: http.StatusOK,
90+
//nolint:lll
91+
wantedInMPD: []string{
92+
// Widevine
93+
`<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"`,
94+
`<dashif:Laurl xmlns:dashif="https://dashif.org/CPS" licenseType="EME-1.0">https://widevine-dash.ezdrm.com/proxy?pX=FFFFFF</dashif:Laurl>`,
95+
// PlayReady with both LaURL and CertificateURL
96+
`<ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95"`,
97+
`<dashif:Laurl xmlns:dashif="https://dashif.org/CPS" licenseType="EME-1.0">https://playready.ezdrm.com/cency/preauth.asp?pX=FFFFFF</dashif:Laurl>`,
98+
`<dashif:Certurl xmlns:dashif="https://dashif.org/CPS">https://na-wv.ezdrm.com/demo/video/eleisure.cer</dashif:Certurl>`,
99+
// FairPlay with both LaURL and CertificateURL
100+
`<ContentProtection schemeIdUri="urn:uuid:94ce86fb-07ff-4f43-adb8-93d2fa968ca2"`,
101+
`<dashif:Laurl xmlns:dashif="https://dashif.org/CPS" licenseType="EME-1.0">https://us-dev.ezdrm.com/fps</dashif:Laurl>`,
102+
`<dashif:Certurl xmlns:dashif="https://dashif.org/CPS">https://na-fps.ezdrm.com/demo/video/eleisure.cer</dashif:Certurl>`,
103+
},
104+
},
78105
{
79106
desc: "MPD with Patch",
80107
mpd: "testpic_6s/Manifest.mpd",

cmd/livesim2/app/livempd.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,11 @@ func LiveMPD(a *asset, mpdName string, cfg *ResponseConfig, drmCfg *drm.DrmConfi
221221
Value: drmSys.SmoothStreamingProtectionHeaderData,
222222
}
223223
}
224+
certURL := d.URLs[drmSystem].CertificateURL
225+
if certURL != "" {
226+
cu := m.CerturlType{Value: m.AnyURI(certURL)}
227+
cp.Certurls = []m.CerturlType{cu}
228+
}
224229
as.ContentProtections = append(as.ContentProtections, cp)
225230
}
226231
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<cpix:CPIX xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" contentId="livesim2-0001" version="2.3">
3+
<cpix:ContentKeyList>
4+
<cpix:ContentKey explicitIV="ASNFZ4mrze8BI0VniavN7w==" kid="01234567-89ab-cdef-0123-456789abcdef" commonEncryptionScheme="cbcs">
5+
<cpix:Data>
6+
<pskc:Secret>
7+
<pskc:PlainValue>MTIzNDU2Nzg5YWJjZGVmCg==</pskc:PlainValue>
8+
</pskc:Secret>
9+
</cpix:Data>
10+
</cpix:ContentKey>
11+
</cpix:ContentKeyList>
12+
<cpix:DRMSystemList>
13+
<cpix:DRMSystem kid="01234567-89ab-cdef-0123-456789abcdef" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
14+
<cpix:PSSH>AAAAP3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAB8SEAEjRWeJq83vASNFZ4mrze8aBWV6ZHJtSPPGiZsG</cpix:PSSH>
15+
<cpix:PSSHData>EhABI0VniavN7wEjRWeJq83vGgVlemRybUjj3JWbBg==</cpix:PSSHData>
16+
<cpix:ContentProtectionData>PHBzc2ggeG1sbnM9InVybjptcGVnOmNlbmM6MjAxMyI+QUFBQVAzQnpjMmdBQUFBQTdlK0xxWG5XU3M2anlDZmMxUjBoN1FBQUFCOFNFQUVqUldlSnE4M3ZBU05GWjRtcnplOGFCV1Y2WkhKdFNQUEdpWnNHPC9wc3NoPg==</cpix:ContentProtectionData>
17+
<cpix:HLSSignalingData playlist="media">I0VYVC1YLUtFWTpNRVRIT0Q9U0FNUExFLUFFUyxLRVlJRD0weDAxMjM0NTY3ODlBQkNERUYwMTIzNDU2Nzg5QUJDREVGLFVSST0iZGF0YTp0ZXh0L3BsYWluO2Jhc2U2NCxBQUFBUDNCemMyZ0FBQUFBN2UrTHFYbldTczZqeUNmYzFSMGg3UUFBQUI4U0VBRWpSV2VKcTgzdkFTTkZaNG1yemU4YUJXVjZaSEp0U1BQR2lac0ciLEtFWUZPUk1BVD0idXJuOnV1aWQ6ZWRlZjhiYTktNzlkNi00YWNlLWEzYzgtMjdkY2Q1MWQyMWVkIixLRVlGT1JNQVRWRVJTSU9OUz0iMSI=</cpix:HLSSignalingData>
18+
<cpix:HLSSignalingData playlist="master">I0VYVC1YLVNFU1NJT04tS0VZOk1FVEhPRD1TQU1QTEUtQUVTLFVSST0iZGF0YTp0ZXh0L3BsYWluO2Jhc2U2NCxBQUFBUDNCemMyZ0FBQUFBN2UrTHFYbldTczZqeUNmYzFSMGg3UUFBQUI4U0VBRWpSV2VKcTgzdkFTTkZaNG1yemU4YUJXVjZaSEp0U1BQR2lac0ciLEtFWUZPUk1BVD0idXJuOnV1aWQ6ZWRlZjhiYTktNzlkNi00YWNlLWEzYzgtMjdkY2Q1MWQyMWVkIixLRVlGT1JNQVRWRVJTSU9OUz0iMSI=</cpix:HLSSignalingData>
19+
</cpix:DRMSystem>
20+
<cpix:DRMSystem kid="01234567-89ab-cdef-0123-456789abcdef" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
21+
<cpix:PSSH>AAACvnBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAp6eAgAAAQABAJQCPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMwAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAUwA+ADwASwBJAEQAIABBAEwARwBJAEQAPQAiAEEARQBTAEMAQgBDACIAIABWAEEATABVAEUAPQAiAFoAMABVAGoAQQBhAHUASgA3ADgAMABCAEkAMABWAG4AaQBhAHYATgA3AHcAPQA9ACIAPgA8AC8ASwBJAEQAPgA8AC8ASwBJAEQAUwA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAHAAbABhAHkAcgBlAGEAZAB5AC4AZQB6AGQAcgBtAC4AYwBvAG0ALwBjAGUAbgBjAHkALwBwAHIAZQBhAHUAdABoAC4AYQBzAHAAeAA/AHAAWAA9ADIANwA0AEYARgA0ADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4AVgBsAFIANwBJAGQAcwBJAEoARQB1AFIAZAAwADYATABhAHEAcwAyAGoAdwA9AD0APAAvAEQAUwBfAEkARAA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</cpix:PSSH>
22+
<cpix:ContentProtectionData>PHBzc2ggeG1sbnM9InVybjptcGVnOmNlbmM6MjAxMyI+QUFBQ3ZuQnpjMmdBQUFBQW1nVHdlWmhBUW9hcmt1WmI0SWhmbFFBQUFwNmVBZ0FBQVFBQkFKUUNQQUJYQUZJQVRRQklBRVVBUVFCRUFFVUFVZ0FnQUhnQWJRQnNBRzRBY3dBOUFDSUFhQUIwQUhRQWNBQTZBQzhBTHdCekFHTUFhQUJsQUcwQVlRQnpBQzRBYlFCcEFHTUFjZ0J2QUhNQWJ3Qm1BSFFBTGdCakFHOEFiUUF2QUVRQVVnQk5BQzhBTWdBd0FEQUFOd0F2QURBQU13QXZBRkFBYkFCaEFIa0FVZ0JsQUdFQVpBQjVBRWdBWlFCaEFHUUFaUUJ5QUNJQUlBQjJBR1VBY2dCekFHa0Fid0J1QUQwQUlnQTBBQzRBTXdBdUFEQUFMZ0F3QUNJQVBnQThBRVFBUVFCVUFFRUFQZ0E4QUZBQVVnQlBBRlFBUlFCREFGUUFTUUJPQUVZQVR3QStBRHdBU3dCSkFFUUFVd0ErQUR3QVN3QkpBRVFBSUFCQkFFd0FSd0JKQUVRQVBRQWlBRUVBUlFCVEFFTUFRZ0JEQUNJQUlBQldBRUVBVEFCVkFFVUFQUUFpQUZvQU1BQlZBR29BUVFCaEFIVUFTZ0EzQURnQU1BQkNBRWtBTUFCV0FHNEFhUUJoQUhZQVRnQTNBSGNBUFFBOUFDSUFQZ0E4QUM4QVN3QkpBRVFBUGdBOEFDOEFTd0JKQUVRQVV3QStBRHdBTHdCUUFGSUFUd0JVQUVVQVF3QlVBRWtBVGdCR0FFOEFQZ0E4QUV3QVFRQmZBRlVBVWdCTUFENEFhQUIwQUhRQWNBQnpBRG9BTHdBdkFIQUFiQUJoQUhrQWNnQmxBR0VBWkFCNUFDNEFaUUI2QUdRQWNnQnRBQzRBWXdCdkFHMEFMd0JqQUdVQWJnQmpBSGtBTHdCd0FISUFaUUJoQUhVQWRBQm9BQzRBWVFCekFIQUFlQUEvQUhBQVdBQTlBRElBTndBMEFFWUFSZ0EwQUR3QUx3Qk1BRUVBWHdCVkFGSUFUQUErQUR3QVJBQlRBRjhBU1FCRUFENEFWZ0JzQUZJQU53QkpBR1FBY3dCSkFFb0FSUUIxQUZJQVpBQXdBRFlBVEFCaEFIRUFjd0F5QUdvQWR3QTlBRDBBUEFBdkFFUUFVd0JmQUVrQVJBQStBRHdBTHdCRUFFRUFWQUJCQUQ0QVBBQXZBRmNBVWdCTkFFZ0FSUUJCQUVRQVJRQlNBRDRBPC9wc3NoPjxwcm8geG1sbnM9InVybjptaWNyb3NvZnQ6cGxheXJlYWR5Ij5uZ0lBQUFFQUFRQ1VBandBVndCU0FFMEFTQUJGQUVFQVJBQkZBRklBSUFCNEFHMEFiQUJ1QUhNQVBRQWlBR2dBZEFCMEFIQUFPZ0F2QUM4QWN3QmpBR2dBWlFCdEFHRUFjd0F1QUcwQWFRQmpBSElBYndCekFHOEFaZ0IwQUM0QVl3QnZBRzBBTHdCRUFGSUFUUUF2QURJQU1BQXdBRGNBTHdBd0FETUFMd0JRQUd3QVlRQjVBRklBWlFCaEFHUUFlUUJJQUdVQVlRQmtBR1VBY2dBaUFDQUFkZ0JsQUhJQWN3QnBBRzhBYmdBOUFDSUFOQUF1QURNQUxnQXdBQzRBTUFBaUFENEFQQUJFQUVFQVZBQkJBRDRBUEFCUUFGSUFUd0JVQUVVQVF3QlVBRWtBVGdCR0FFOEFQZ0E4QUVzQVNRQkVBRk1BUGdBOEFFc0FTUUJFQUNBQVFRQk1BRWNBU1FCRUFEMEFJZ0JCQUVVQVV3QkRBRUlBUXdBaUFDQUFWZ0JCQUV3QVZRQkZBRDBBSWdCYUFEQUFWUUJxQUVFQVlRQjFBRW9BTndBNEFEQUFRZ0JKQURBQVZnQnVBR2tBWVFCMkFFNEFOd0IzQUQwQVBRQWlBRDRBUEFBdkFFc0FTUUJFQUQ0QVBBQXZBRXNBU1FCRUFGTUFQZ0E4QUM4QVVBQlNBRThBVkFCRkFFTUFWQUJKQUU0QVJnQlBBRDRBUEFCTUFFRUFYd0JWQUZJQVRBQStBR2dBZEFCMEFIQUFjd0E2QUM4QUx3QndBR3dBWVFCNUFISUFaUUJoQUdRQWVRQXVBR1VBZWdCa0FISUFiUUF1QUdNQWJ3QnRBQzhBWXdCbEFHNEFZd0I1QUM4QWNBQnlBR1VBWVFCMUFIUUFhQUF1QUdFQWN3QndBSGdBUHdCd0FGZ0FQUUF5QURjQU5BQkdBRVlBTkFBOEFDOEFUQUJCQUY4QVZRQlNBRXdBUGdBOEFFUUFVd0JmQUVrQVJBQStBRllBYkFCU0FEY0FTUUJrQUhNQVNRQktBRVVBZFFCU0FHUUFNQUEyQUV3QVlRQnhBSE1BTWdCcUFIY0FQUUE5QUR3QUx3QkVBRk1BWHdCSkFFUUFQZ0E4QUM4QVJBQkJBRlFBUVFBK0FEd0FMd0JYQUZJQVRRQklBRVVBUVFCRUFFVUFVZ0ErQUE9PTwvcHJvPg==</cpix:ContentProtectionData>
23+
<cpix:HLSSignalingData playlist="master">I0VYVC1YLVNFU1NJT04tS0VZOk1FVEhPRD1TQU1QTEUtQUVTLFVSST0iZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTE2O2Jhc2U2NCxuZ0lBQUFFQUFRQ1VBandBVndCU0FFMEFTQUJGQUVFQVJBQkZBRklBSUFCNEFHMEFiQUJ1QUhNQVBRQWlBR2dBZEFCMEFIQUFPZ0F2QUM4QWN3QmpBR2dBWlFCdEFHRUFjd0F1QUcwQWFRQmpBSElBYndCekFHOEFaZ0IwQUM0QVl3QnZBRzBBTHdCRUFGSUFUUUF2QURJQU1BQXdBRGNBTHdBd0FETUFMd0JRQUd3QVlRQjVBRklBWlFCaEFHUUFlUUJJQUdVQVlRQmtBR1VBY2dBaUFDQUFkZ0JsQUhJQWN3QnBBRzhBYmdBOUFDSUFOQUF1QURNQUxnQXdBQzRBTUFBaUFENEFQQUJFQUVFQVZBQkJBRDRBUEFCUUFGSUFUd0JVQUVVQVF3QlVBRWtBVGdCR0FFOEFQZ0E4QUVzQVNRQkVBRk1BUGdBOEFFc0FTUUJFQUNBQVFRQk1BRWNBU1FCRUFEMEFJZ0JCQUVVQVV3QkRBRUlBUXdBaUFDQUFWZ0JCQUV3QVZRQkZBRDBBSWdCYUFEQUFWUUJxQUVFQVlRQjFBRW9BTndBNEFEQUFRZ0JKQURBQVZnQnVBR2tBWVFCMkFFNEFOd0IzQUQwQVBRQWlBRDRBUEFBdkFFc0FTUUJFQUQ0QVBBQXZBRXNBU1FCRUFGTUFQZ0E4QUM4QVVBQlNBRThBVkFCRkFFTUFWQUJKQUU0QVJnQlBBRDRBUEFCTUFFRUFYd0JWQUZJQVRBQStBR2dBZEFCMEFIQUFjd0E2QUM4QUx3QndBR3dBWVFCNUFISUFaUUJoQUdRQWVRQXVBR1VBZWdCa0FISUFiUUF1QUdNQWJ3QnRBQzhBWXdCbEFHNEFZd0I1QUM4QWNBQnlBR1VBWVFCMUFIUUFhQUF1QUdFQWN3QndBSGdBUHdCd0FGZ0FQUUF5QURjQU5BQkdBRVlBTkFBOEFDOEFUQUJCQUY4QVZRQlNBRXdBUGdBOEFFUUFVd0JmQUVrQVJBQStBRllBYkFCU0FEY0FTUUJrQUhNQVNRQktBRVVBZFFCU0FHUUFNQUEyQUV3QVlRQnhBSE1BTWdCcUFIY0FQUUE5QUR3QUx3QkVBRk1BWHdCSkFFUUFQZ0E4QUM4QVJBQkJBRlFBUVFBK0FEd0FMd0JYQUZJQVRRQklBRVVBUVFCRUFFVUFVZ0ErQUE9PSIsS0VZRk9STUFUPSJjb20ubWljcm9zb2Z0LnBsYXlyZWFkeSIsS0VZRk9STUFUVkVSU0lPTlM9IjEi</cpix:HLSSignalingData>
24+
<cpix:HLSSignalingData playlist="media">I0VYVC1YLUtFWTpNRVRIT0Q9U0FNUExFLUFFUyxVUkk9ImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PVVURi0xNjtiYXNlNjQsbmdJQUFBRUFBUUNVQWp3QVZ3QlNBRTBBU0FCRkFFRUFSQUJGQUZJQUlBQjRBRzBBYkFCdUFITUFQUUFpQUdnQWRBQjBBSEFBT2dBdkFDOEFjd0JqQUdnQVpRQnRBR0VBY3dBdUFHMEFhUUJqQUhJQWJ3QnpBRzhBWmdCMEFDNEFZd0J2QUcwQUx3QkVBRklBVFFBdkFESUFNQUF3QURjQUx3QXdBRE1BTHdCUUFHd0FZUUI1QUZJQVpRQmhBR1FBZVFCSUFHVUFZUUJrQUdVQWNnQWlBQ0FBZGdCbEFISUFjd0JwQUc4QWJnQTlBQ0lBTkFBdUFETUFMZ0F3QUM0QU1BQWlBRDRBUEFCRUFFRUFWQUJCQUQ0QVBBQlFBRklBVHdCVUFFVUFRd0JVQUVrQVRnQkdBRThBUGdBOEFFc0FTUUJFQUZNQVBnQThBRXNBU1FCRUFDQUFRUUJNQUVjQVNRQkVBRDBBSWdCQkFFVUFVd0JEQUVJQVF3QWlBQ0FBVmdCQkFFd0FWUUJGQUQwQUlnQmFBREFBVlFCcUFFRUFZUUIxQUVvQU53QTRBREFBUWdCSkFEQUFWZ0J1QUdrQVlRQjJBRTRBTndCM0FEMEFQUUFpQUQ0QVBBQXZBRXNBU1FCRUFENEFQQUF2QUVzQVNRQkVBRk1BUGdBOEFDOEFVQUJTQUU4QVZBQkZBRU1BVkFCSkFFNEFSZ0JQQUQ0QVBBQk1BRUVBWHdCVkFGSUFUQUErQUdnQWRBQjBBSEFBY3dBNkFDOEFMd0J3QUd3QVlRQjVBSElBWlFCaEFHUUFlUUF1QUdVQWVnQmtBSElBYlFBdUFHTUFid0J0QUM4QVl3QmxBRzRBWXdCNUFDOEFjQUJ5QUdVQVlRQjFBSFFBYUFBdUFHRUFjd0J3QUhnQVB3QndBRmdBUFFBeUFEY0FOQUJHQUVZQU5BQThBQzhBVEFCQkFGOEFWUUJTQUV3QVBnQThBRVFBVXdCZkFFa0FSQUErQUZZQWJBQlNBRGNBU1FCa0FITUFTUUJLQUVVQWRRQlNBR1FBTUFBMkFFd0FZUUJ4QUhNQU1nQnFBSGNBUFFBOUFEd0FMd0JFQUZNQVh3QkpBRVFBUGdBOEFDOEFSQUJCQUZRQVFRQStBRHdBTHdCWEFGSUFUUUJJQUVVQVFRQkVBRVVBVWdBK0FBPT0iLEtFWUZPUk1BVD0iY29tLm1pY3Jvc29mdC5wbGF5cmVhZHkiLEtFWUZPUk1BVFZFUlNJT05TPSIxIg==</cpix:HLSSignalingData>
25+
<cpix:SmoothStreamingProtectionHeaderData>ngIAAAEAAQCUAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADMALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAFMAPgA8AEsASQBEACAAQQBMAEcASQBEAD0AIgBBAEUAUwBDAEIAQwAiACAAVgBBAEwAVQBFAD0AIgBaADAAVQBqAEEAYQB1AEoANwA4ADAAQgBJADAAVgBuAGkAYQB2AE4ANwB3AD0APQAiAD4APAAvAEsASQBEAD4APAAvAEsASQBEAFMAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBwAGwAYQB5AHIAZQBhAGQAeQAuAGUAegBkAHIAbQAuAGMAbwBtAC8AYwBlAG4AYwB5AC8AcAByAGUAYQB1AHQAaAAuAGEAcwBwAHgAPwBwAFgAPQAyADcANABGAEYANAA8AC8ATABBAF8AVQBSAEwAPgA8AEQAUwBfAEkARAA+AFYAbABSADcASQBkAHMASQBKAEUAdQBSAGQAMAA2AEwAYQBxAHMAMgBqAHcAPQA9ADwALwBEAFMAXwBJAEQAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</cpix:SmoothStreamingProtectionHeaderData>
26+
</cpix:DRMSystem>
27+
<cpix:DRMSystem kid="01234567-89ab-cdef-0123-456789abcdef" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
28+
<cpix:HLSSignalingData playlist="media">I0VYVC1YLUtFWTpNRVRIT0Q9U0FNUExFLUFFUyxVUkk9InNrZDovLzAxMjM0NTY3LTg5YWItY2RlZi0wMTIzLTQ1Njc4OWFiY2RlZjowMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZiIsS0VZRk9STUFUPSJjb20uYXBwbGUuc3RyZWFtaW5na2V5ZGVsaXZlcnkiLEtFWUZPUk1BVFZFUlNJT05TPSIxIg==</cpix:HLSSignalingData>
29+
<cpix:HLSSignalingData playlist="master">I0VYVC1YLVNFU1NJT04tS0VZOk1FVEhPRD1TQU1QTEUtQUVTLFVSST0ic2tkOi8vMDEyMzQ1NjctODlhYi1jZGVmLTAxMjMtNDU2Nzg5YWJjZGVmOjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmIixLRVlGT1JNQVQ9ImNvbS5hcHBsZS5zdHJlYW1pbmdrZXlkZWxpdmVyeSIsS0VZRk9STUFUVkVSU0lPTlM9IjEi</cpix:HLSSignalingData>
30+
</cpix:DRMSystem>
31+
</cpix:DRMSystemList>
32+
<cpix:ContentKeyUsageRuleList>
33+
<cpix:ContentKeyUsageRule kid="01234567-89ab-cdef-0123-456789abcdef"> </cpix:ContentKeyUsageRule>
34+
</cpix:ContentKeyUsageRuleList>
35+
</cpix:CPIX>

cmd/livesim2/app/testdata/drm.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"version": "0.5",
3+
"packages":
4+
[
5+
{
6+
"name": "EZDRM-1-key-cbcs-test",
7+
"desc": "EZDRM-provided DRM setup with one-key CBCS encryption with Widevine, PlayReady, and FairPlay",
8+
"cpixFile": "cpix_1key_cbcs_test.xml",
9+
"licenseURLs": {
10+
"widevine": {
11+
"laURL": "https://widevine-dash.ezdrm.com/proxy?pX=FFFFFF"
12+
},
13+
"playready": {
14+
"laURL": "https://playready.ezdrm.com/cency/preauth.asp?pX=FFFFFF",
15+
"certURL": "https://na-wv.ezdrm.com/demo/video/eleisure.cer"
16+
},
17+
"fairplay": {
18+
"laURL": "https://us-dev.ezdrm.com/fps",
19+
"certURL": "https://na-fps.ezdrm.com/demo/video/eleisure.cer"
20+
}
21+
}
22+
}
23+
]
24+
}

go.mod

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ toolchain go1.23.5
66

77
require (
88
github.com/Comcast/gots/v2 v2.2.1
9-
github.com/Eyevinn/dash-mpd v0.13.0
9+
github.com/Eyevinn/dash-mpd v0.14.0
1010
github.com/Eyevinn/mp4ff v0.50.0
1111
github.com/beevik/etree v1.5.0
1212
github.com/caddyserver/certmagic v0.22.0
@@ -18,7 +18,6 @@ require (
1818
github.com/prometheus/client_golang v1.21.1
1919
github.com/spf13/pflag v1.0.6
2020
github.com/stretchr/testify v1.10.0
21-
2221
)
2322

2423
require (

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
55
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
66
github.com/Comcast/gots/v2 v2.2.1 h1:LU/SRg7p2KQqVkNqInV7I4MOQKAqvWQP/PSSLtygP2s=
77
github.com/Comcast/gots/v2 v2.2.1/go.mod h1:firJ11on3eUiGHAhbY5cZNqG0OqhQ1+nSZHfsEEzVVU=
8-
github.com/Eyevinn/dash-mpd v0.13.0 h1:nKBARYjBEgeGVYUA26OPKyyGw7+J4xf2Az1nUK2ln2U=
9-
github.com/Eyevinn/dash-mpd v0.13.0/go.mod h1:yym2itvB74evfJFDZB99p700LQddQFsN1YCbk9t6mAA=
8+
github.com/Eyevinn/dash-mpd v0.14.0 h1:jKK3/EE/erPb6B6JBVzGJI27G3NXBjazGsQm2caogQk=
9+
github.com/Eyevinn/dash-mpd v0.14.0/go.mod h1:yym2itvB74evfJFDZB99p700LQddQFsN1YCbk9t6mAA=
1010
github.com/Eyevinn/mp4ff v0.50.0 h1:vFlsvpQh5Jfz++cuaeTI90vbID5dAabebvvN/l9lom0=
1111
github.com/Eyevinn/mp4ff v0.50.0/go.mod h1:hJNUUqOBryLAzUW9wpCJyw2HaI+TCd2rUPhafoS5lgg=
1212
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=

pkg/drm/cpix_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func TestCPIXParser(t *testing.T) {
2222
file: "testdata/cpix_1key_cbcs_test.xml",
2323
wantedContentID: "livesim2-0001",
2424
wantedNrKeys: 1,
25-
wantedNrDRMs: 2,
25+
wantedNrDRMs: 3,
2626
},
2727
{
2828
desc: "2 keys, CBCS, with usage rules for video and audio",

pkg/drm/drm_test.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,30 @@ func TestReadFullConfig(t *testing.T) {
1616
require.True(t, ok)
1717
require.NotNil(t, cfg)
1818
require.Equal(t, 1, len(cfg.CPIXData.ContentKeys))
19-
require.Equal(t, 2, len(cfg.CPIXData.DRMSystems))
19+
require.Equal(t, 3, len(cfg.CPIXData.DRMSystems))
2020
require.Equal(t, 1, len(cfg.CPIXData.UsageRules))
2121
require.Equal(t, "livesim2-0001", cfg.CPIXData.ContentID)
22+
23+
// Check that CertificateURL is properly read for FairPlay
24+
fairplayURL, ok := cfg.URLs["fairplay"]
25+
require.True(t, ok)
26+
require.NotNil(t, fairplayURL)
27+
require.Equal(t, "https://us-dev.ezdrm.com/fps", fairplayURL.LaURL)
28+
require.Equal(t, "https://na-fps.ezdrm.com/demo/video/eleisure.cer", fairplayURL.CertificateURL)
29+
30+
// Check PlayReady has both LaURL and CertificateURL
31+
playreadyURL, ok := cfg.URLs["playready"]
32+
require.True(t, ok)
33+
require.NotNil(t, playreadyURL)
34+
require.Equal(t, "https://playready.ezdrm.com/cency/preauth.asp?pX=FFFFFF", playreadyURL.LaURL)
35+
require.Equal(t, "https://na-wv.ezdrm.com/demo/video/eleisure.cer", playreadyURL.CertificateURL)
36+
37+
// Check Widevine has LaURL but empty CertificateURL
38+
widevineURL, ok := cfg.URLs["widevine"]
39+
require.True(t, ok)
40+
require.NotNil(t, widevineURL)
41+
require.Equal(t, "https://widevine-dash.ezdrm.com/proxy?pX=FFFFFF", widevineURL.LaURL)
42+
require.Equal(t, "", widevineURL.CertificateURL)
2243
}
2344

2445
func TestToUUIDStr(t *testing.T) {

0 commit comments

Comments
 (0)