|
|
|
/*
|
|
|
|
* Copyright (C) 2017 The Android Open Source Project
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef CLEAR_KEY_ECM_GENERATOR_H_
|
|
|
|
#define CLEAR_KEY_ECM_GENERATOR_H_
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
#include "protos/license_protos.pb.h"
|
|
|
|
|
|
|
|
#include <media/stagefright/foundation/ABuffer.h>
|
|
|
|
#include <media/stagefright/MediaErrors.h>
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
namespace android {
|
|
|
|
namespace clearkeycas {
|
|
|
|
enum {
|
|
|
|
CLEARKEY_STATUS_BASE = ERROR_CAS_VENDOR_MAX,
|
|
|
|
CLEARKEY_STATUS_INVALIDASSETID = CLEARKEY_STATUS_BASE - 1,
|
|
|
|
CLEARKEY_STATUS_INVALIDSYSTEMID = CLEARKEY_STATUS_BASE - 2,
|
|
|
|
CLEARKEY_STATUS_INVALID_PARAMETER = CLEARKEY_STATUS_BASE - 3,
|
|
|
|
};
|
|
|
|
class Organization;
|
|
|
|
|
|
|
|
namespace ecm_generator {
|
|
|
|
|
|
|
|
// Layout of the ECM
|
|
|
|
// ECM
|
|
|
|
// 0 - 3 : Old ECM version (deprecated)
|
|
|
|
// 4 - 7 : Clear lead (milliseconds)
|
|
|
|
// 8 : ECM Version
|
|
|
|
// 9 - 11 : System ID
|
|
|
|
// 12 - 15 : Asset ID
|
|
|
|
// 16 - 31 : Content Key (clear)
|
|
|
|
//
|
|
|
|
// The clear asset ID (bytes 12-15) is compared to the encrypted asset ID
|
|
|
|
// (bytes 48-51) as a consistency check.
|
|
|
|
|
|
|
|
struct DefaultEcmFields {
|
|
|
|
uint32_t old_version;
|
|
|
|
uint32_t clear_lead;
|
|
|
|
uint32_t ecm_version;
|
|
|
|
uint32_t system_id;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Decodes a clear key ecm.
|
|
|
|
// The following fields are decoded from the clear fields portion of the ecm:
|
|
|
|
// asset->id
|
|
|
|
// default_fields->old_version
|
|
|
|
// default_fields->clear_lead
|
|
|
|
// default_fields->system_id
|
|
|
|
// default_fields->ecm_version
|
|
|
|
//
|
|
|
|
// The following fields are decoded from the content key portion of the ecm:
|
|
|
|
// content_key
|
|
|
|
//
|
|
|
|
// |asset|, |content_key|, |default_fields| are owned by caller and must not
|
|
|
|
// be NULL.
|
|
|
|
// Returns failure via ecm_generator::DecodeECMClearFields.
|
|
|
|
//
|
|
|
|
// Example usage:
|
|
|
|
// Asset asset;
|
|
|
|
// string content_key;
|
|
|
|
// DefaultEcmFields default_fields;
|
|
|
|
// // Get a clear key |ecm|.
|
|
|
|
// status_t status = ecm_generator::DecodeECM(ecm, &asset, &content_key, &default_fields);
|
|
|
|
status_t DecodeECM(const sp<ABuffer>& ecm, Asset* asset,
|
|
|
|
sp<ABuffer> *content_key, DefaultEcmFields* default_fields);
|
|
|
|
|
|
|
|
// Decodes the following fields from the clear fields portion of the ecm:
|
|
|
|
// asset->id
|
|
|
|
// default_fields->old_version
|
|
|
|
// default_fields->clear_lead
|
|
|
|
// default_fields->system_id
|
|
|
|
// default_fields->ecm_version
|
|
|
|
//
|
|
|
|
// offset, asset and default_fields are owned by caller and must not be NULL.
|
|
|
|
// offset is updated to show the number of bytes consumed.
|
|
|
|
// Returns:
|
|
|
|
// - BAD_VALUE on short ECM, or
|
|
|
|
// - CLEARKEY_STATUS_INVALIDASSETID via ecm_generator::DecodeEcmClearFields if
|
|
|
|
// asset_id is 0, or
|
|
|
|
// - CLEARKEY_STATUS_INVALIDSYSTEMID via ecm_generator::DecodeEcmClearFields if
|
|
|
|
// system_id is 0.
|
|
|
|
//
|
|
|
|
// Example usage:
|
|
|
|
// Asset asset;
|
|
|
|
// DefaultEcmFields default_fields;
|
|
|
|
// // Get a clear key ecm.
|
|
|
|
// status_t status = ecm_generator::DecodeECMClearFields(ecm, &asset, &default_fields);
|
|
|
|
status_t DecodeECMClearFields(const sp<ABuffer>& ecm, Asset* asset,
|
|
|
|
DefaultEcmFields* default_fields);
|
|
|
|
|
|
|
|
} // namespace ecm_generator
|
|
|
|
} // namespace clearkeycas
|
|
|
|
} // namespace android
|
|
|
|
#endif // CLEAR_KEY_ECM_GENERATOR_H_
|