/* * 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 #include "protos/license_protos.pb.h" #include #include 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& ecm, Asset* asset, sp *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& ecm, Asset* asset, DefaultEcmFields* default_fields); } // namespace ecm_generator } // namespace clearkeycas } // namespace android #endif // CLEAR_KEY_ECM_GENERATOR_H_