CPIX API 가이드
개요
CPIX API는 DASH 산업 포럼에서 정의한 Content Protection Information Exchange Format (CPIX) 표준 가이드에 따라 구현된 API로, 미디어 콘텐츠의 패키징 과정에서 멀티 DRM을 적용하는데 필요한 키를 연동하는 규격을 정의합니다. 본 API를 이용하면 CPIX 기반의 키 연동을 지원하는 인코더/트랜스코더 솔루션과 PallyCon 멀티 DRM을 쉽게 연동할 수 있습니다.
CPIX API 유형 및 구현 방식
PallyCon 멀티 DRM은 API의 구현 주체에 따라 다음과 같은 유형의 CPIX API와 연동 가능합니다.
-
PallyCon CPIX API
: PallyCon에서 구현한 CPIX API로, 인코더/트랜스코더 솔루션 업체에서 해당 API로 PallyCon 멀티 DRM과 연동할 수 있습니다.Flussonic Media Server
와의 연동에 PallyCon CPIX API가 적용되었습니다. -
SPEKE API
: AWS Elemental에서 구현한 CPIX API로, PallyCon과 사전 연동되어 AWS Elemental 미디어 서비스의 MediaPackage 또는 MediaConvert 제품에서 PallyCon 멀티 DRM을 쉽게 적용할 수 있습니다. SPEKE API 연동에 대한 자세한 내용은 해당 가이드를 참고하시기 바랍니다. -
ATEME NEA-DVR CPIX API
: Anevia(ATEME에 인수됨)에서 구현한 CPIX API로, NEA-DVR 솔루션과 사전 연동되어 PallyCon 멀티 DRM을 쉽게 적용할 수 있습니다.
또한 PallyCon CPIX API의 경우, 연동 구현 방식에 따라 다음 두 가지 방식 중 하나를 선택할 수 있습니다.
- PallyCon CPIX API 클라이언트
- KMS 연동 URL 직접 호출
PallyCon CPIX API 클라이언트 이용
PallyCon CPIX API 클라이언트는 주요 개발 언어 별로 미리 구현된 CPIX 클라이언트 모듈을 제공합니다. 해당 모듈에는 KMS 서버와의 통신을 위한 XML 규격의 요청 데이터 생성과 응답 데이터 해석 기능이 구현되어 있습니다.
지원 사양
현재 PallyCon CPIX API 클라이언트는 다음의 사양을 지원합니다.
항목 | 지원 사양 | 설명 |
---|---|---|
개발 언어 | C++, C#, Java, Python | DRM 패키징 연동 개발 환경에 따른 언어 별 샘플 제공 |
DRM 유형 | Widevine, PlayReady, FairPlay, NCG, HLS_NCG | - NCG : PallyCon 자체 DRM인 NCG 규격으로 패키징 대상 파일 전체를 암호화 할 때 사용- HLS_NCG : AES-128 암호화된 HLS 콘텐츠의 키를 NCG 규격으로 암호화하는 방식 |
암호화 방식 | CENC, CBC1, CENS, CBCS | 클라이언트 플랫폼에서 지원하는 AES 암호화 방식에 따라 일반적으로 CENC 또는 CBCS 를 지정 |
트랙 유형 | SD, HD, UHD1, UHD2, AUDIO | 멀티 키 패키징 시 트랙 별로 다른 암호화 키를 적용하기 위해 사용 |
CENC
(AES-CTR)와 CBCS
(AES-CBC with subsample) 두 가지만 사용됩니다. PlayReady와 Widevine DRM을 지원하는 DASH 콘텐츠 패키징에는 CENC가 사용되며, FairPlay 지원이 필요한 HLS 또는 CMAF 패키징 시에는 CBCS 암호화를 적용해야 합니다.
API 클라이언트 다운로드
PallyCon CPIX API 클라이언트는 다음의 Github 저장소에서 다운로드할 수 있습니다.
PallyCon CPIX API 클라이언트 Github 저장소API 클라이언트 사용 예시 (Python 기준)
1. KMS 토큰 값 설정
CpixClient
객체에 PallyCon KMS URL
과 KMS 토큰
값을 다음과 같이 입력합니다. (샘플 코드의 app_sample.py
소스 참고)
cpix_client = CpixClient(PALLYCON_KMS_URL, YOUR_KMS_TOKEN)
PALLYCON_KMS_URL
: 샘플 코드에 입력된 KMS V2 URL(https://kms.pallycon.com/v2/cpix/pallycon/getKey/)을 그대로 사용합니다.YOUR_KMS_TOKEN
: PallyCon 서비스 가입 시 해당 계정의 사이트에 대하여 생성되는 KMS 토큰 값을 입력합니다. (콘솔 사이트의멀티 DRM
>DRM 세팅
화면 참고)
2. CPIX API 요청
Python 버전의 CPIX API 클라이언트는 다음과 같은 코드를 통해 PallyCon KMS 서버에 CPIX 요청을 전송할 수 있습니다.
pack_info = cpix_client.get_content_key_info_from_pallycon_kms("test_content_id", DrmType.WIDEVINE | DrmType.PLAYREADY | DrmType.FAIRPLAY)
위 코드는 test_content_id
라는 ID를 가진 콘텐츠에 대해 Widevine, PlayReady, FairPlay 세 가지 DRM으로 패키징하기 위해 필요한 정보를 PallyCon KMS 서버에 요청합니다. 이 때 생략된 파라미터인 암호화 방식(encryption_scheme)
에는 기본값인 CENC
가 적용되는데, 해당 설정은 Widevine과 PlayReady의 PSSH 데이터에 반영됩니다. (FairPlay DRM의 응답 데이터는 encryption_scheme 입력값에 영향을 받지 않음)
CBCS
방식으로 암호화 처리되어야 합니다.
보다 명시적으로 암호화 방식을 지정하려면 아래와 같이 두 번에 나누어 API를 호출할 수도 있습니다.
# CENC encryption for DASH content with PlayReady and Widevine DRM
dash_pack_info = cpix_client.get_content_key_info_from_pallycon_kms("test_content_id", DrmType.WIDEVINE | DrmType.PLAYREADY, EncryptionScheme.CENC)
# CBCS encryption for HLS content with FairPlay DRM
hls_pack_info = cpix_client.get_content_key_info_from_pallycon_kms("test_content_id", DrmType.FAIRPLAY, EncryptionScheme.CBCS)
3. CPIX API 응답 확인
API 요청이 성공적으로 수행되면 다음과 같은 JSON 형식의 응답 데이터가 생성됩니다.
{
"content_id": "test_content_id",
"content_key_list": [
{
"key_id_hex": "cbbc38b6b50dab53f8263e06b7382aa3",
"key_id_b64": "y7w4trUNq1P4Jj4Gtzgqow==",
"key_hex": "959dbd673980e1d1bdf2d36209495f4e",
"key_b64": "lZ29ZzmA4dG98tNiCUlfTg==",
"iv_hex": "30313233343536373839616263646566",
"iv_b64": "MDEyMzQ1Njc4OWFiY2RlZg==",
"widevine": {
"pssh": "AAAATHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACwIARIQy7w4trUNq1P4Jj4GtzgqoxoMaW5rYWVudHdvcmtzIghkZW1vdGVzdA==",
"pssh_payload_only": "CAESEMu8OLa1DatT+CY+Brc4KqMaDGlua2FlbnR3b3JrcyIIZGVtb3Rlc3Q="
},
"playready": {
"pssh": "AAACknBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAnJyAgAAAQABAGgCPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMwAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAUwA+ADwASwBJAEQAIABBAEwARwBJAEQAPQAiAEEARQBTAEMAVABSACIAIABDAEgARQBDAEsAUwBVAE0APQAiAEgARQBzAHYAbABYAFUAeABuAFcAdwA9ACIAIABWAEEATABVAEUAPQAiAHQAagBpADgAeQB3ADIAMQBVADYAdgA0AEoAagA0AEcAdAB6AGcAcQBvAHcAPQA9ACIAPgA8AC8ASwBJAEQAPgA8AC8ASwBJAEQAUwA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAGUAbgBzAGUALgBwAGEAbABsAHkAYwBvAG4ALgBjAG8AbQAvAHIAaQAvAGwAaQBjAGUAbgBzAGUATQBhAG4AYQBnAGUAcgAuAGQAbwA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==",
"pssh_payload_only": "cgIAAAEAAQBoAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADMALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAFMAPgA8AEsASQBEACAAQQBMAEcASQBEAD0AIgBBAEUAUwBDAFQAUgAiACAAQwBIAEUAQwBLAFMAVQBNAD0AIgBIAEUAcwB2AGwAWABVAHgAbgBXAHcAPQAiACAAVgBBAEwAVQBFAD0AIgB0AGoAaQA4AHkAdwAyADEAVQA2AHYANABKAGoANABHAHQAegBnAHEAbwB3AD0APQAiAD4APAAvAEsASQBEAD4APAAvAEsASQBEAFMAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBsAGkAYwBlAG4AcwBlAC4AcABhAGwAbAB5AGMAbwBuAC4AYwBvAG0ALwByAGkALwBsAGkAYwBlAG4AcwBlAE0AYQBuAGEAZwBlAHIALgBkAG8APAAvAEwAQQBfAFUAUgBMAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA="
},
"fairplay": {
"key_uri": "skd://y7w4trUNq1P4Jj4Gtzgqow=="
}
}
]
}
각종 서드파티 인코더/트랜스코더/패키져 솔루션 연동 시, CPIX API 응답에서 다음과 같은 DRM 암호화 정보를 획득해 해당 솔루션에 입력합니다. 연동에 사용되는 값과 형식은 각 솔루션마다 다를 수 있으므로 해당 솔루션의 가이드를 참고하시기 바랍니다.
key_id_hex
,key_id_b64
,key_hex
,key_b64
,iv_hex
,iv_b64
: 각각 16진수 또는 Base64 형태의 Key ID, Key, IV 값을 나타냅니다.pssh
: PlayReady 또는 Widevine 에서 사용되는 PSSH 데이터입니다. (헤더 포함)pssh_payload_only
:pssh
데이터에서 헤더가 제거된 payload 부분입니다.key_uri
: FairPlay DRM이 적용된 HLS m3u8 파일의#EXT-X-Key
태그에 포함되는URI
파라미터 값입니다.
다른 언어 버전의 CPIX 클라이언트 사용 방법은 Github 저장소의 각 개발 언어 별 폴더에 포함된 README 문서를 참고하시기 바랍니다.
KMS 연동 URL 직접 호출
PallyCon CPIX API 클라이언트 대신 KMS URL을 직접 호출해 CPIX API를 연동하는 경우, 다음과 같은 사항을 확인해 요청 데이터 생성과 응답 데이터 해석 및 적용을 처리합니다.
지원 기능
KMS URL 직접 호출을 통한 연동은 아래와 같은 콘텐츠와 기능을 지원합니다.
PlayReady | Widevine | FairPlay | AES-128 | |
---|---|---|---|---|
DASH | (키 로테이션 지원) | (키 로테이션 지원) | ||
HLS | (키 로테이션 지원) | (NCG DRM 지원) |
KMS 연동 URL 규격
PallyCon CPIX API에서 제공하는 KMS 연동 URL 규격은 다음과 같습니다. URL 마지막 부분의 enc-token
은 PallyCon 서비스 가입 시 생성되는 API 인증 토큰으로, PallyCon 콘솔 사이트에서 확인할 수 있습니다.
V1 규격 KMS URL - https://kms.pallycon.com/v1/cpix/pallycon/getKey/{enc-token}
V2 규격 KMS URL - https://kms.pallycon.com/v2/cpix/pallycon/getKey/{enc-token}
인코더/트랜스코더 솔루션에서 위 URL을 호출하여 DRM 암호화에 필요한 키를 발급 받습니다. 요청 데이터의 Body 부분에 아래 예제와 같은 CPIX 데이터를 추가하여
POST
방식으로 호출합니다.
라이브 스트림 패키징 시 키 로테이션을 적용하려면 위 V2 규격 KMS URL에 key-rotation=true
파라미터를 추가해야 합니다. 키 로테이션이 적용된 URL의 형태는 다음과 같습니다.
https://kms.pallycon.com/v2/cpix/pallycon/getKey/{enc-token}?key-rotation=true
KMS 연동 V2 규격 및 멀티키 패키징 지원
V2 규격에는 멀티키 패키징을 위한 요청/응답 데이터가 추가되었습니다. 멀티키 패키징은 해상도별 영상 트랙을 각각 다른 키로 암호화하는 것으로, 헐리우드 스튜디오의 요구 사항인 해상도 별 보안 레벨 설정을 위해 필요합니다.
멀티키 패키징 시, 해당 XML 요청 데이터에 아래와 같은 사항을 추가로 입력해 전송합니다.
싱글키 패키징 시에는 요청 데이터 XML 예제에서 아래 항목들을 제외하고 요청합니다.
IntendedTrackType
cpix:ContentKeyUsageRule
태그에 추가되는 파라미터로, 해당 kid로 암호화될 트랙(SD, HD 등)을 설정합니다.
입력 가능한 값과 기본 해상도는 아래와 같습니다.
- AUDIO: 오디오 트랙용
- SD: 576p 이하 해상도
- HD: 720p ~ 1080p
- UHD1: 4K
- UHD2: 8K
VideoFilter
minPixels
와 maxPixels
파라미터로 해당 비디오 트랙의 최소/최대 픽셀 수를 지정합니다.
Content ID 입력
PallyCon CPIX API를 이용해 콘텐츠를 패키징할 때, 콘텐츠 서비스의 CMS에서 관리하는 해당 콘텐츠의 고유 ID(CID)를 입력해야 합니다. 해당 CID는 PallyCon 라이선스 서버에 등록되어 콘텐츠 재생 시 DRM 라이선스의 요청 및 발급에 사용됩니다.
아래 각 콘텐츠 유형 별 요청 규격(XML)의 cpix:CPIX
태그에 아래와 같이 콘텐츠 ID를 입력해 전송합니다. (최대 200자리 영숫자 문자열)
<cpix:CPIX id="your-content-id"
요청 및 응답 데이터 예제
예제 - VOD DASH 콘텐츠
Request body
<?xml version="1.0" encoding="UTF-8"?>
<cpix:CPIX id="your-content-id" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke">
<cpix:ContentKeyList>
<cpix:ContentKey kid="681e5b39-49f2-4dfa-b744-86573c22e6fb"></cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<!-- Common encryption / MSS (Playready) -->
<cpix:DRMSystem kid="681e5b39-49f2-4dfa-b744-86573c22e6fb" systemId="9a04f079-9840-4286-ab92-e65be0885f95" />
<!-- Common encryption (Widevine)-->
<cpix:DRMSystem kid="681e5b39-49f2-4dfa-b744-86573c22e6fb" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" />
</cpix:DRMSystemList>
</cpix:CPIX>
<cpix:CPIX id=""
: 패키징할 콘텐츠의 고유 ID를 입력합니다. 싱글키 패키징의 경우에는 위 예제에서 이 부분만 수정해 이용할 수 있습니다.kid
: 멀티키 패키징 시 각 트랙 별로 발급될 키를 구분하기 위해 사용됩니다. 싱글키 패키징의 경우에는 사용되지 않는 값이므로 임의의 값을 입력할 수 있습니다.systemId
: 각 DRM 별로 지정된 고유한 uuid 값을 입력합니다. (대소문자 구분 없음)
Response
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cpix:CPIX id="cpix-test-cid" xmlns:cpix="urn:dashif:org:cpix" xmlns:speke="urn:aws:amazon:com:speke" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" >
<cpix:ContentKeyList>
<cpix:ContentKey explicitIV="MDEyMzQ1Njc4OWFiY2RlZg==" kid="12ea753c-23e7-bc02-4474-b2b976c43beb">
<cpix:Data>
<pskc:Secret>
<pskc:PlainValue>SzC1qc1cEpyFU6t/lL7Byw==</pskc:PlainValue>
</pskc:Secret>
</cpix:Data>
</cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<!-- Common encryption / MSS (Playready) -->
<cpix:DRMSystem kid="12ea753c-23e7-bc02-4474-b2b976c43beb" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
<cpix:ContentProtectionData>qAUAAAEAAQCeB...A=</cpix:ContentProtectionData><!-- V2에 추가됨 -->
<cpix:PSSH>AAACwnBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAqKiAgAAAQABAJgCPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBQAEgAWABxAEUAdQBjAGoAQQByAHgARQBkAEwASwA1AGQAcwBRADcANgB3AD0APQA8AC8ASwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+AC8ARgA3AEIAMQBmAEgAMgBlADAAYwA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAHQAZQBzAHQAdABvAGsAeQBvAC4AcABhAGwAbAB5AGMAbwBuAC4AYwBvAG0ALwByAGkALwBwAGwAYQB5AHIAZQBhAGQAeQAvAGwAaQBjAGUAbgBzAGUATQBhAG4AYQBnAGUAcgAuAGQAbwA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</cpix:PSSH>
</cpix:DRMSystem>
<!-- Common encryption (Widevine)-->
<cpix:DRMSystem kid="12ea753c-23e7-bc02-4474-b2b976c43beb" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cpix:ContentProtectionData>qAUAAAEAAQCeB...A=</cpix:ContentProtectionData><!-- V2에 추가됨 -->
<cpix:PSSH>AAAAVXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADUIARIQEup1PCPnvAJEdLK5dsQ76xoMaW5rYWVudHdvcmtzIg1jcGl4LXRlc3QtY2lkKgJIRA==</cpix:PSSH>
</cpix:DRMSystem>
</cpix:DRMSystemList>
</cpix:CPIX>
<cpix:CPIX id=""
: 요청 데이터에 입력한 CID 값이 리턴됩니다.<cpix:ContentKey>
: 콘텐츠 암호화에 사용될 키 값(<pskc:PlainValue>
)과 IV(explicitIV
), 그리고 해당 키에 대한kid
값이 리턴됩니다.kid
값은 요청 데이터에 입력된 값과 별개로 KMS에서 새로 생성된 값이 적용되며, 키와 IV는 Base64 인코딩된 형태로 리턴됩니다.<cpix:DRMSystem>
: PlayReady와 Widevine 각각의 DRM에 대한 PSSH 데이터가 리턴됩니다.<cpix:PSSH>
태그에는 기본 PSSH 값이 표시되며,<cpix:ContentProtectionData>
태그에는 헤더 부분이 제거된 PSSH 데이터가 표시됩니다.
예제 - VOD HLS 콘텐츠
Request body
<?xml version="1.0" encoding="UTF-8"?>
<cpix:CPIX id="your-content-id" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke">
<cpix:ContentKeyList>
<cpix:ContentKey kid="681e5b39-49f2-4dfa-b744-86573c22e6fb"></cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<!-- HLS SAMPLE-AES (FairPlay) -->
<cpix:DRMSystem kid="681e5b39-49f2-4dfa-b744-86573c22e6fb" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2" />
</cpix:DRMSystemList>
</cpix:CPIX>
<cpix:CPIX id=""
: 패키징할 콘텐츠의 고유 ID를 입력합니다. 싱글키 패키징의 경우에는 위 예제에서 이 부분만 수정해 이용할 수 있습니다.kid
: 멀티키 패키징 시 각 트랙 별로 발급될 키를 구분하기 위해 사용됩니다. 싱글키 패키징의 경우에는 사용되지 않는 값이므로 임의의 값을 입력할 수 있습니다.systemId
: FairPlay DRM에 해당되는 고유한 uuid 값을 입력합니다. (대소문자 구분 없음)
Response
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cpix:CPIX id="cpix-test-cid" xmlns:cpix="urn:dashif:org:cpix" xmlns:speke="urn:aws:amazon:com:speke" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" >
<cpix:ContentKeyList>
<cpix:ContentKey explicitIV="MDEyMzQ1Njc4OWFiY2RlZg==" kid="12ea753c-23e7-bc02-4474-b2b976c43beb">
<cpix:Data>
<pskc:Secret>
<pskc:PlainValue>ODQ4REQwMTM5OURGNDczQQ==</pskc:PlainValue>
</pskc:Secret>
</cpix:Data>
</cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<!-- HLS SAMPLE-AES (FairPlay) -->
<cpix:DRMSystem kid="12ea753c-23e7-bc02-4474-b2b976c43beb" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
<cpix:HLSSignalingData>I0VYVC1YLUtFWTpN...DA1</cpix:HLSSignalingData><!-- V2에 추가됨 -->
<cpix:HLSSignalingData playlist="master">I0VYVC1YLVNFU...DU=</cpix:HLSSignalingData><!-- V2에 추가됨 -->
<cpix:URIExtXKey>c2tkOi8vRXVwMVBDUG52QUpFZExLNWRzUTc2dz09</cpix:URIExtXKey>
</cpix:DRMSystem>
</cpix:DRMSystemList>
</cpix:CPIX>
<cpix:CPIX id=""
: 요청 데이터에 입력한 CID 값이 리턴됩니다.<cpix:ContentKey>
: 콘텐츠 암호화에 사용될 키 값(<pskc:PlainValue>
)과 IV(explicitIV
), 그리고 해당 키에 대한kid
값이 리턴됩니다.kid
값은 요청 데이터에 입력된 값과 별개로 KMS에서 새로 생성된 값이 적용되며, 키와 IV는 Base64 인코딩된 형태로 리턴됩니다.<cpix:URIExtXKey>
: m3u8의#EXT-X-KEY
태그에 포함되는URI
파라미터에 들어갈skd://
URI 값이 Base64 인코딩된 형태로 리턴됩니다.
예제 - 라이브 DASH 콘텐츠
라이브 콘텐츠의 경우, ContentKeyPeriodList index 값에 따라 로테이션 된 키 값을 응답합니다.
Request body
<?xml version="1.0" encoding="UTF-8"?>
<cpix:CPIX id="cpix-test-cid" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke">
<cpix:ContentKeyList>
<cpix:ContentKey kid="ca65e643-482c-4a21-a204-05570a1e276c"></cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<!-- Common encryption / MSS (Playready) -->
<cpix:DRMSystem kid="ca65e643-482c-4a21-a204-05570a1e276c" systemId="9a04f079-9840-4286-ab92-e65be0885f95" />
<!-- Common encryption (Widevine)-->
<cpix:DRMSystem kid="681e5b39-49f2-4dfa-b744-86573c22e6fb" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" />
</cpix:DRMSystemList>
<cpix:ContentKeyPeriodList>
<cpix:ContentKeyPeriod id="keyPeriod_e7c4423c-a2c6-46f4-bef3-2bfed6bae9c9" index="128"/>
</cpix:ContentKeyPeriodList>
<cpix:ContentKeyUsageRuleList>
<cpix:ContentKeyUsageRule intendedTrackType="HD" kid="ca65e643-482c-4a21-a204-05570a1e276c"> <!-- V2에 추가됨 : intendedTrackType -->
<cpix:KeyPeriodFilter periodId="keyPeriod_e7c4423c-a2c6-46f4-bef3-2bfed6bae9c9"/>
<cpix:VideoFilter maxPixels="2073600" minPixels="921600"/><!-- V2 추가됨 -->
</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>
Response
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cpix:CPIX id="cpix-test-cid" xmlns:cpix="urn:dashif:org:cpix" xmlns:speke="urn:aws:amazon:com:speke" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" >
<cpix:ContentKeyList>
<cpix:ContentKey explicitIV="S2ljHDlFRStjCuOpN8I7+w==" kid="6bac8ec3-0ee3-379f-3d21-290b3a2bc9c3">
<cpix:Data>
<pskc:Secret>
<pskc:PlainValue>OlRFK6LSytFr2HnN1HqwWw==</pskc:PlainValue>
</pskc:Secret>
</cpix:Data>
</cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:ContentKeyPeriodList>
<cpix:ContentKeyPeriod id="keyPeriod_e7c4423c-a2c6-46f4-bef3-2bfed6bae9c9" index="128"/>
</cpix:ContentKeyPeriodList>
<cpix:ContentKeyUsageRuleList>
<cpix:ContentKeyUsageRule intendedTrackType="HD" kid="6bac8ec3-0ee3-379f-3d21-290b3a2bc9c3"><!-- V2에 추가됨 : intendedTrackType -->
<cpix:KeyPeriodFilter periodId="keyPeriod_e7c4423c-a2c6-46f4-bef3-2bfed6bae9c9"/>
<cpix:VideoFilter maxPixels="2073600" minPixels="921600"/><!-- V2에 추가됨 -->
</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
<cpix:DRMSystemList>
<cpix:DRMSystem kid="6bac8ec3-0ee3-379f-3d21-290b3a2bc9c3" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
<cpix:ContentProtectionData>qAUAAAEAAQCeB...A=</cpix:ContentProtectionData><!-- V2에 추가됨 -->
<cpix:PSSH>AAADTHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAywsAwAAAQABACIDPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgB3ADQANgBzAGEAKwBNAE8AbgB6AGMAOQBJAFMAawBMAE8AaQB2AEoAdwB3AD0APQA8AC8ASwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+ADYAaQBiAFAANAAwAHUAVABPAFoAMAA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAHQAZQBzAHQAdABvAGsAeQBvAC4AcABhAGwAbAB5AGMAbwBuAC4AYwBvAG0ALwByAGkALwBwAGwAYQB5AHIAZQBhAGQAeQAvAGwAaQBjAGUAbgBzAGUATQBhAG4AYQBnAGUAcgAuAGQAbwA8AC8ATABBAF8AVQBSAEwAPgA8AEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAPgA8AFAARQBSAEkATwBEAF8ASQBOAEQARQBYAD4AMQAyADgAPAAvAFAARQBSAEkATwBEAF8ASQBOAEQARQBYAD4APAAvAEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</cpix:PSSH>
</cpix:DRMSystem>
<cpix:DRMSystem kid="6bac8ec3-0ee3-379f-3d21-290b3a2bc9c3" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cpix:ContentProtectionData>qAUAAAEAAQCeB...A=</cpix:ContentProtectionData><!-- V2에 추가됨 -->
<cpix:PSSH>AAAAaHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEgIARIQa6yOww7jN589ISkLOivJwxoMaW5rYWVudHdvcmtzIh1jcGl4LXRlc3QtY2lkMDAwMDAwMDAwMDAwMDA4MCoCSEQ4gAE=</cpix:PSSH>
</cpix:DRMSystem>
</cpix:DRMSystemList>
</cpix:CPIX>
예제 - 라이브 HLS 콘텐츠
Request body
<?xml version="1.0" encoding="UTF-8"?>
<cpix:CPIX id="cpix-test-cid" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke" >
<cpix:ContentKeyList>
<cpix:ContentKey kid="681e5b39-49f2-4dfa-b744-86573c22e6fb"></cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<!-- HLS SAMPLE-AES (FairPlay) -->
<cpix:DRMSystem kid="681e5b39-49f2-4dfa-b744-86573c22e6fb" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
<cpix:ContentProtectionData />
<cpix:PSSH />
<cpix:URIExtXKey />
</cpix:DRMSystem>
</cpix:DRMSystemList>
</cpix:CPIX>
Response
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cpix:CPIX id="cpix-test-cid" xmlns:cpix="urn:dashif:org:cpix" xmlns:speke="urn:aws:amazon:com:speke" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" >
<cpix:ContentKeyList>
<cpix:ContentKey explicitIV="S2ljHDlFRStjCuOpN8I7+w==" kid="6bac8ec3-0ee3-379f-3d21-290b3a2bc9c3">
<cpix:Data>
<pskc:Secret>
<pskc:PlainValue>OlRFK6LSytFr2HnN1HqwWw==</pskc:PlainValue>
</pskc:Secret>
</cpix:Data>
</cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:ContentKeyPeriodList>
<cpix:ContentKeyPeriod id="keyPeriod_e7c4423c-a2c6-46f4-bef3-2bfed6bae9c9" index="128"/>
</cpix:ContentKeyPeriodList>
<cpix:ContentKeyUsageRuleList>
<cpix:ContentKeyUsageRule intendedTrackType="HD" kid="6bac8ec3-0ee3-379f-3d21-290b3a2bc9c3"><!-- V2에 추가됨 : intendedTrackType -->
<cpix:KeyPeriodFilter periodId="keyPeriod_e7c4423c-a2c6-46f4-bef3-2bfed6bae9c9"/>
<cpix:VideoFilter maxPixels="2073600" minPixels="921600"/><!-- V2에 추가됨 -->
</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
<cpix:DRMSystemList>
<!-- HLS SAMPLE-AES (FairPlay) -->
<cpix:DRMSystem kid="6bac8ec3-0ee3-379f-3d21-290b3a2bc9c3" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
<cpix:HLSSignalingData>I0VYVC1YLUtFWTpN...DA1</cpix:HLSSignalingData><!-- V2에 추가됨 -->
<cpix:HLSSignalingData playlist="master">I0VYVC1YLVNFU...DU=</cpix:HLSSignalingData><!-- V2에 추가됨 -->
<cpix:URIExtXKey>c2tkOi8vY3BpeC10ZXN0LWNpZDAwMDAwMDAwMDAwMDAwODA=</cpix:URIExtXKey>
</cpix:DRMSystem>
</cpix:DRMSystemList>
</cpix:CPIX>
PallyCon CPIX API를 통한 서드파티 솔루션 연동
Nginx 실시간 패키징 연동
Nginx VOD Module을 이용해 실시간 패키징을 처리하려는 경우, PallyCon CPIX API 클라이언트 또는 KMS URL 호출을 통해 DRM 암호화 연동을 처리할 수 있습니다.
위 링크된 가이드의 JSON 파라미터에 CPIX 응답 데이터의 암호화 키(<pskc:PlainValue>
), IV(explicitIV
), kid, PSSH 값들을 입력해 적용합니다. 이 때 PSSH 값은 <cpix:ContentProtectionData>
태그의 값을 입력해야 하며, kid 값은 uuid 문자열을 Base64 인코딩된 128비트 바이너리 값으로 변환해 입력해야 합니다.
Flussonic Media Server 연동
Flussonic Media Server
는 멀티 디바이스 클라이언트를 대상으로 비디오 캡쳐, 트랜스코딩, 녹화, 보안 및 전송까지 온라인 비디오 서비스를 구축할 수 있도록 해주는 서버 소프트웨어입니다. Flussonic Media Server
제품은 PallyCon CPIX API
를 통해 PallyCon 멀티 DRM 서비스와 연동되어 있습니다.
- Flussonic Media Server 웹사이트 : https://flussonic.com/flussonic-media-server
- Flussonic - Pallycon 연동 가이드 : https://flussonic.com/doc/content-protection-with-drm/pallycon-drm
SPEKE API
Secure Packager and Encoder Key Exchange (SPEKE) API는 AWS Elemental에서 구현한 CPIX API로, AWS Elemental MediaPackage 또는 MediaConvert 제품과의 연동에 사용됩니다. 연동 URL 이외에 기본 규격은 PallyCon CPIX API와 동일하며, 상세한 연동 방법은 해당 가이드를 참고하시기 바랍니다.
KMS 연동 URL 규격
SPEKE API 연동을 위한 KMS URL 규격은 다음과 같습니다. URL 마지막 부분의 enc-token
은 PallyCon 서비스 가입 시 생성되는 API 인증 토큰으로, PallyCon 콘솔 사이트에서 확인할 수 있습니다.
https://kms.pallycon.com/cpix/getKey?enc-token={enc-token}
ATEME NEA-DVR CPIX API
Anevia(현재는 ATEME에 인수됨)의 NEA-DVR
솔루션과 연동을 위한 CPIX API입니다. 해당 API를 통하여 PallyCon과 사전 연동되어 NEA-DVR 솔루션에 PallyCon 멀티 DRM을 쉽게 적용할 수 있습니다.
TITAN Live
또는 TITAN File
등 ATEME의 다른 솔루션들과는 호환되지 않습니다. ATEME TITAN 솔루션과의 DRM 패키징 연동을 원하는 고객은 헬프데스크를 통해 문의해 주시기 바랍니다.
지원 기능
ATEME NEA-DVR CPIX API를 통한 연동은 아래와 같은 콘텐츠와 기능을 지원합니다.
PlayReady | Widevine | FairPlay | AES-128 | |
---|---|---|---|---|
DASH | ||||
HLS |
KMS 연동 URL 규격
ATEME NEA-DVR CPIX API 연동을 위한 KMS URL 규격은 다음과 같습니다. 아래 규격에 따라 생성된 URL을 Anevia 솔루션에서 GET
방식으로 호출하여 키를 발급 받습니다.
https://kms.pallycon.com/cpix/anevia/{streamingFormat}/{encToken}/{cid}
Path | Description |
---|---|
streamFormat | dash/hls. streaming format type에 따라 지원하는 drm type으로 key를 발급합니다. |
encToken | PallyCon 서비스 가입 시 생성되는 API 인증 토큰으로, PallyCon 콘솔 사이트에서 확인할 수 있습니다. |
cid | 콘텐츠의 고유 ID, 최대 200 바이트 영숫자 |
ATEME NEA-DVR CPIX API 예제
요청 URL 예제
https://kms.pallycon.com/cpix/anevia/dash/eyJzaXRlX2lkIjoiREVNTyIsICJhY2Nlc3Nfa2V5IjoiZHNJb2xjN2gxRzhUVW1JMTdiWXd4aFV1TkZvRmNlNzJjeDllTU9rNjJ3YjhWTjJQZGdwV1lISXhTRVg5ZjBIaSJ9/test-cid
응답 데이터 예제
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cpix:CPIX id="test-cid" xmlns:cpix="urn:dashif:org:cpix" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:ns3="urn:aws:amazon:com:speke" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<cpix:ContentKeyList>
<cpix:ContentKey explicitIV="MDEyMzQ1Njc4OWFiY2RlZg==" kid="cbc2eedd-4284-fd94-c17b-0d6fb56c146b">
<cpix:Data>
<pskc:Secret>
<pskc:PlainValue>dLlreLqTHdROTxGnw/3G7g==</pskc:PlainValue>
</pskc:Secret>
</cpix:Data>
</cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<cpix:DRMSystem kid="cbc2eedd-4284-fd94-c17b-0d6fb56c146b" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
<cpix:PSSH>AAACvnBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAp6eAgAAAQABAJQCPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgAzAGUANwBDAHkANABSAEMAbABQADMAQgBlAHcAMQB2AHQAVwB3AFUAYQB3AD0APQA8AC8ASwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+AFQAWABrAFkAcgAwAGQAdgBIAEgAYwA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAGUAbgBzAGUALgBwAGEAbABsAHkAYwBvAG4ALgBjAG8AbQAvAHIAaQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AbABpAGMAZQBuAHMAZQBNAGEAbgBhAGcAZQByAC4AZABvADwALwBMAEEAXwBVAFIATAA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</cpix:PSSH>
</cpix:DRMSystem>
<cpix:DRMSystem kid="cbc2eedd-4284-fd94-c17b-0d6fb56c146b" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cpix:PSSH>AAAAUHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADAIARIQy8Lu3UKE/ZTBew1vtWwUaxoMaW5rYWVudHdvcmtzIgh0ZXN0LWNpZCoCSEQ=</cpix:PSSH>
</cpix:DRMSystem>
</cpix:DRMSystemList>
</cpix:CPIX>