/*
* Copyright (C) 2012 Samsung Electronics Co., LTD
*
* 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.
*/
#include <stdio.h>
#include "tlwvdrm_api.h"
#define LOG_TAG "drm_content_protect"
#include "log.h"
#include "tlc_communication.h"
#include "content_protect.h"
mc_comm_ctx cp_ctx;
// -------------------------------------------------------------
static mcResult_t tlc_initialize(void) {
mcResult_t mcRet;
memset(&cp_ctx, 0x00, sizeof(cp_ctx));
cp_ctx.device_id = MC_DEVICE_ID_DEFAULT;
cp_ctx.uuid = (mcUuid_t)TL_WV_DRM_UUID;
cp_ctx.initialized = false;
mcRet = tlc_open(&cp_ctx);
if (MC_DRV_OK != mcRet) {
LOG_E("open TL session failed!");
return mcRet;
}
cp_ctx.initialized = true;
return MC_DRV_OK;
}
// -------------------------------------------------------------
static mcResult_t tlc_terminate(void) {
mcResult_t mcRet;
if (cp_ctx.initialized == true) {
mcRet = tlc_close(&cp_ctx);
if (MC_DRV_OK != mcRet) {
LOG_E("close TL session failed!");
return mcRet;
}
memset(&cp_ctx, 0x00, sizeof(cp_ctx));
cp_ctx.initialized = false;
}
return MC_DRV_OK;
}
extern "C" cpResult_t CP_Enable_Path_Protection(uint32_t protect_ip)
{
cpResult_t cp_result = CP_SUCCESS;
mcResult_t mcRet;
tciMessage_t *tci = NULL;
LOG_I("[CONTENT_PROTECT] : CP_Enable_Path_Protection");
do {
// -------------------------------------------------------------
// Step 1: Call the Trustlet Open function.
mcRet = tlc_initialize();
if (MC_DRV_OK != mcRet) {
LOG_E("Tlc Open Error");
cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
break;
}
// -------------------------------------------------------------
// Step 2: Check TCI buffer.
tci = cp_ctx.tci_msg;
if (NULL == tci) {
LOG_E("TCI has not been set up properly - exiting");
cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
break;
}
// -------------------------------------------------------------
// Step 3: Call the Trustlet functions
// Step 3.1: Prepare command message in TCI
tci->cmd.id = CMD_WV_DRM_ENABLE_PATH_PROTECTION;
memcpy(tci->cmd.data, &protect_ip, sizeof(protect_ip));
tci->cmd.data_len = sizeof(protect_ip);
// -------------------------------------------------------------
// Step 3.2: Send Trustlet TCI Message
mcRet = tlc_communicate(&cp_ctx);
if (MC_DRV_OK != mcRet) {
LOG_E("Tlc Communicate Error");
cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
break;
}
// -------------------------------------------------------------
// Step 3.3: Verify that the Trustlet sent a response
if ((RSP_ID(CMD_WV_DRM_ENABLE_PATH_PROTECTION) != tci->resp.id)) {
LOG_E("Trustlet did not send a response: %d", tci->resp.id);
cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
break;
}
// -------------------------------------------------------------
// Step 3.4: Check the Trustlet return code
if (tci->resp.return_code != RET_TL_WV_DRM_OK) {
LOG_E("Trustlet did not send a valid return code: %d", tci->resp.return_code);
cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
break;
}
} while(0);
tlc_terminate();
LOG_I("[CONTENT_PROTECT] : CP_Enable_Path_Protection. return value(%d)", cp_result);
return cp_result;
}
extern "C" cpResult_t CP_Disable_Path_Protection(uint32_t protect_ip)
{
cpResult_t cp_result = CP_SUCCESS;
mcResult_t mcRet;
tciMessage_t *tci = NULL;
LOG_I("[CONTENT_PROTECT] : CP_Disable_Path_Protection");
do {
// -------------------------------------------------------------
// Step 1: Call the Trustlet Open function.
mcRet = tlc_initialize();
if (MC_DRV_OK != mcRet) {
LOG_E("Tlc Open Error");
cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
break;
}
// -------------------------------------------------------------
// Step 2: Check TCI buffer.
tci = cp_ctx.tci_msg;
if (NULL == tci) {
LOG_E("TCI has not been set up properly - exiting");
cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
break;
}
// -------------------------------------------------------------
// Step 3: Call the Trustlet functions
// Step 3.1: Prepare command message in TCI
tci->cmd.id = CMD_WV_DRM_DISABLE_PATH_PROTECTION;
memcpy(tci->cmd.data, &protect_ip, sizeof(protect_ip));
tci->cmd.data_len = sizeof(protect_ip);
// -------------------------------------------------------------
// Step 3.2: Send Trustlet TCI Message
mcRet = tlc_communicate(&cp_ctx);
if (MC_DRV_OK != mcRet) {
LOG_E("Tlc Communicate Error");
cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
break;
}
// -------------------------------------------------------------
// Step 3.3: Verify that the Trustlet sent a response
if ((RSP_ID(CMD_WV_DRM_DISABLE_PATH_PROTECTION) != tci->resp.id)) {
LOG_E("Trustlet did not send a response: %d", tci->resp.id);
cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
break;
}
// -------------------------------------------------------------
// Step 3.4: Check the Trustlet return code
if (tci->resp.return_code != RET_TL_WV_DRM_OK) {
LOG_E("Trustlet did not send a valid return code: %d", tci->resp.return_code);
cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
break;
}
} while(0);
tlc_terminate();
LOG_I("[CONTENT_PROTECT] : CP_Disable_Path_Protection. return value(%d)", cp_result);
return cp_result;
}