105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim/*
205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim * Copyright (C) 2012 Samsung Electronics Co., LTD
305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim *
405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim * Licensed under the Apache License, Version 2.0 (the "License");
505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim * you may not use this file except in compliance with the License.
605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim * You may obtain a copy of the License at
705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim *
805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim *      http://www.apache.org/licenses/LICENSE-2.0
905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim *
1005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim * Unless required by applicable law or agreed to in writing, software
1105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim * distributed under the License is distributed on an "AS IS" BASIS,
1205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim * See the License for the specific language governing permissions and
1405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim * limitations under the License.
1505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim */
1605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
1705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim#include <stdio.h>
1805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
1905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim#include "tlwvdrm_api.h"
2005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim#define LOG_TAG "drm_content_protect"
2105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim#include "log.h"
2205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim#include "tlc_communication.h"
2305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim#include "content_protect.h"
2405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
2505e767638571bc50d7a26471fbe07005f3c875faJungtae Kimmc_comm_ctx cp_ctx;
2605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
2705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim// -------------------------------------------------------------
2805e767638571bc50d7a26471fbe07005f3c875faJungtae Kimstatic mcResult_t tlc_initialize(void) {
2905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	mcResult_t	mcRet;
3005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
3105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	memset(&cp_ctx, 0x00, sizeof(cp_ctx));
3205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	cp_ctx.device_id	= MC_DEVICE_ID_DEFAULT;
3305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	cp_ctx.uuid 	= (mcUuid_t)TL_WV_DRM_UUID;
3405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	cp_ctx.initialized = false;
3505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
3605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	mcRet = tlc_open(&cp_ctx);
3705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	if (MC_DRV_OK != mcRet) {
3805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		   LOG_E("open TL session failed!");
3905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		   return mcRet;
4005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	}
4105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
4205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	cp_ctx.initialized = true;
4305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
4405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	return MC_DRV_OK;
4505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim}
4605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
4705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim// -------------------------------------------------------------
4805e767638571bc50d7a26471fbe07005f3c875faJungtae Kimstatic mcResult_t tlc_terminate(void) {
4905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	mcResult_t mcRet;
5005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
5105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	if (cp_ctx.initialized == true) {
5205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		mcRet = tlc_close(&cp_ctx);
5305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		if (MC_DRV_OK != mcRet) {
5405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			   LOG_E("close TL session failed!");
5505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			   return mcRet;
5605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		}
5705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
5805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		memset(&cp_ctx, 0x00, sizeof(cp_ctx));
5905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		cp_ctx.initialized = false;
6005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	}
6105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
6205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	return MC_DRV_OK;
6305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim}
6405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
6505e767638571bc50d7a26471fbe07005f3c875faJungtae Kimextern "C" cpResult_t CP_Enable_Path_Protection(uint32_t protect_ip)
6605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim{
6705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	cpResult_t cp_result = CP_SUCCESS;
6805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	mcResult_t mcRet;
6905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	tciMessage_t *tci = NULL;
7005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
7105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	LOG_I("[CONTENT_PROTECT] : CP_Enable_Path_Protection");
7205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	do {
7305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
7405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 1: Call the Trustlet Open function.
7505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		mcRet = tlc_initialize();
7605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		if (MC_DRV_OK != mcRet) {
7705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			LOG_E("Tlc Open Error");
7805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
7905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			break;
8005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		}
8105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
8205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
8305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 2: Check TCI buffer.
8405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		tci = cp_ctx.tci_msg;
8505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		if (NULL == tci) {
8605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			LOG_E("TCI has not been set up properly - exiting");
8705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
8805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			break;
8905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		}
9005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
9105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
9205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 3: Call the Trustlet functions
9305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 3.1: Prepare command message in TCI
9405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		tci->cmd.id = CMD_WV_DRM_ENABLE_PATH_PROTECTION;
9505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		memcpy(tci->cmd.data, &protect_ip, sizeof(protect_ip));
9605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		tci->cmd.data_len = sizeof(protect_ip);
9705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
9805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
9905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 3.2: Send Trustlet TCI Message
10005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		mcRet = tlc_communicate(&cp_ctx);
10105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		if (MC_DRV_OK != mcRet) {
10205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			LOG_E("Tlc Communicate Error");
10305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
10405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			break;
10505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		}
10605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
10705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
10805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 3.3: Verify that the Trustlet sent a response
10905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		if ((RSP_ID(CMD_WV_DRM_ENABLE_PATH_PROTECTION) != tci->resp.id)) {
11005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			LOG_E("Trustlet did not send a response: %d", tci->resp.id);
11105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
11205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			break;
11305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		}
11405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
11505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
11605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 3.4: Check the Trustlet return code
11705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		if (tci->resp.return_code != RET_TL_WV_DRM_OK) {
11805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			LOG_E("Trustlet did not send a valid return code: %d", tci->resp.return_code);
11905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
12005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			break;
12105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		}
12205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	} while(0);
12305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
12405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	tlc_terminate();
12505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	LOG_I("[CONTENT_PROTECT] : CP_Enable_Path_Protection. return value(%d)", cp_result);
12605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	return cp_result;
12705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim}
12805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
12905e767638571bc50d7a26471fbe07005f3c875faJungtae Kimextern "C" cpResult_t CP_Disable_Path_Protection(uint32_t protect_ip)
13005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim{
13105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	cpResult_t cp_result = CP_SUCCESS;
13205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	mcResult_t mcRet;
13305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	tciMessage_t *tci = NULL;
13405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
13505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	LOG_I("[CONTENT_PROTECT] : CP_Disable_Path_Protection");
13605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	do {
13705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
13805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 1: Call the Trustlet Open function.
13905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		mcRet = tlc_initialize();
14005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		if (MC_DRV_OK != mcRet) {
14105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			LOG_E("Tlc Open Error");
14205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
14305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			break;
14405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		}
14505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
14605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
14705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 2: Check TCI buffer.
14805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		tci = cp_ctx.tci_msg;
14905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		if (NULL == tci) {
15005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			LOG_E("TCI has not been set up properly - exiting");
15105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
15205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			break;
15305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		}
15405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
15505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
15605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 3: Call the Trustlet functions
15705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 3.1: Prepare command message in TCI
15805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		tci->cmd.id = CMD_WV_DRM_DISABLE_PATH_PROTECTION;
15905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		memcpy(tci->cmd.data, &protect_ip, sizeof(protect_ip));
16005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		tci->cmd.data_len = sizeof(protect_ip);
16105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
16205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
16305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 3.2: Send Trustlet TCI Message
16405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		mcRet = tlc_communicate(&cp_ctx);
16505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		if (MC_DRV_OK != mcRet) {
16605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			LOG_E("Tlc Communicate Error");
16705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
16805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			break;
16905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		}
17005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
17105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
17205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 3.3: Verify that the Trustlet sent a response
17305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		if ((RSP_ID(CMD_WV_DRM_DISABLE_PATH_PROTECTION) != tci->resp.id)) {
17405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			LOG_E("Trustlet did not send a response: %d", tci->resp.id);
17505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
17605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			break;
17705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		}
17805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
17905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// -------------------------------------------------------------
18005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		// Step 3.4: Check the Trustlet return code
18105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		if (tci->resp.return_code != RET_TL_WV_DRM_OK) {
18205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			LOG_E("Trustlet did not send a valid return code: %d", tci->resp.return_code);
18305e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
18405e767638571bc50d7a26471fbe07005f3c875faJungtae Kim			break;
18505e767638571bc50d7a26471fbe07005f3c875faJungtae Kim		}
18605e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	} while(0);
18705e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
18805e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	tlc_terminate();
18905e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	LOG_I("[CONTENT_PROTECT] : CP_Disable_Path_Protection. return value(%d)", cp_result);
19005e767638571bc50d7a26471fbe07005f3c875faJungtae Kim	return cp_result;
19105e767638571bc50d7a26471fbe07005f3c875faJungtae Kim}
19205e767638571bc50d7a26471fbe07005f3c875faJungtae Kim
193