1/* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef CLEAR_KEY_ECM_GENERATOR_H_ 18#define CLEAR_KEY_ECM_GENERATOR_H_ 19 20#include <string> 21 22#include "protos/license_protos.pb.h" 23 24#include <media/stagefright/foundation/ABuffer.h> 25#include <media/stagefright/MediaErrors.h> 26 27using namespace std; 28 29namespace android { 30namespace clearkeycas { 31enum { 32 CLEARKEY_STATUS_BASE = ERROR_CAS_VENDOR_MAX, 33 CLEARKEY_STATUS_INVALIDASSETID = CLEARKEY_STATUS_BASE - 1, 34 CLEARKEY_STATUS_INVALIDSYSTEMID = CLEARKEY_STATUS_BASE - 2, 35 CLEARKEY_STATUS_INVALID_PARAMETER = CLEARKEY_STATUS_BASE - 3, 36}; 37class Organization; 38 39namespace ecm_generator { 40 41// Layout of the ECM 42// ECM 43// 0 - 3 : Old ECM version (deprecated) 44// 4 - 7 : Clear lead (milliseconds) 45// 8 : ECM Version 46// 9 - 11 : System ID 47// 12 - 15 : Asset ID 48// 16 - 31 : Content Key (clear) 49// 50// The clear asset ID (bytes 12-15) is compared to the encrypted asset ID 51// (bytes 48-51) as a consistency check. 52 53struct DefaultEcmFields { 54 uint32_t old_version; 55 uint32_t clear_lead; 56 uint32_t ecm_version; 57 uint32_t system_id; 58}; 59 60// Decodes a clear key ecm. 61// The following fields are decoded from the clear fields portion of the ecm: 62// asset->id 63// default_fields->old_version 64// default_fields->clear_lead 65// default_fields->system_id 66// default_fields->ecm_version 67// 68// The following fields are decoded from the content key portion of the ecm: 69// content_key 70// 71// |asset|, |content_key|, |default_fields| are owned by caller and must not 72// be NULL. 73// Returns failure via ecm_generator::DecodeECMClearFields. 74// 75// Example usage: 76// Asset asset; 77// string content_key; 78// DefaultEcmFields default_fields; 79// // Get a clear key |ecm|. 80// status_t status = ecm_generator::DecodeECM(ecm, &asset, &content_key, &default_fields); 81status_t DecodeECM(const sp<ABuffer>& ecm, Asset* asset, 82 sp<ABuffer> *content_key, DefaultEcmFields* default_fields); 83 84// Decodes the following fields from the clear fields portion of the ecm: 85// asset->id 86// default_fields->old_version 87// default_fields->clear_lead 88// default_fields->system_id 89// default_fields->ecm_version 90// 91// offset, asset and default_fields are owned by caller and must not be NULL. 92// offset is updated to show the number of bytes consumed. 93// Returns: 94// - BAD_VALUE on short ECM, or 95// - CLEARKEY_STATUS_INVALIDASSETID via ecm_generator::DecodeEcmClearFields if 96// asset_id is 0, or 97// - CLEARKEY_STATUS_INVALIDSYSTEMID via ecm_generator::DecodeEcmClearFields if 98// system_id is 0. 99// 100// Example usage: 101// Asset asset; 102// DefaultEcmFields default_fields; 103// // Get a clear key ecm. 104// status_t status = ecm_generator::DecodeECMClearFields(ecm, &asset, &default_fields); 105status_t DecodeECMClearFields(const sp<ABuffer>& ecm, Asset* asset, 106 DefaultEcmFields* default_fields); 107 108} // namespace ecm_generator 109} // namespace clearkeycas 110} // namespace android 111#endif // CLEAR_KEY_ECM_GENERATOR_H_ 112