blob: a1a1d5e0baade096b67fa2ba486ed452c3154d9d [file] [log] [blame]
Jungtae Kim05e76762012-10-02 16:08:56 -07001/*
2 * Copyright (C) 2012 Samsung Electronics Co., LTD
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#include <stdio.h>
18
19#include "tlwvdrm_api.h"
20#define LOG_TAG "drm_content_protect"
21#include "log.h"
22#include "tlc_communication.h"
23#include "content_protect.h"
24
25mc_comm_ctx cp_ctx;
26
27// -------------------------------------------------------------
28static mcResult_t tlc_initialize(void) {
29 mcResult_t mcRet;
30
31 memset(&cp_ctx, 0x00, sizeof(cp_ctx));
32 cp_ctx.device_id = MC_DEVICE_ID_DEFAULT;
33 cp_ctx.uuid = (mcUuid_t)TL_WV_DRM_UUID;
34 cp_ctx.initialized = false;
35
36 mcRet = tlc_open(&cp_ctx);
37 if (MC_DRV_OK != mcRet) {
38 LOG_E("open TL session failed!");
39 return mcRet;
40 }
41
42 cp_ctx.initialized = true;
43
44 return MC_DRV_OK;
45}
46
47// -------------------------------------------------------------
48static mcResult_t tlc_terminate(void) {
49 mcResult_t mcRet;
50
51 if (cp_ctx.initialized == true) {
52 mcRet = tlc_close(&cp_ctx);
53 if (MC_DRV_OK != mcRet) {
54 LOG_E("close TL session failed!");
55 return mcRet;
56 }
57
58 memset(&cp_ctx, 0x00, sizeof(cp_ctx));
59 cp_ctx.initialized = false;
60 }
61
62 return MC_DRV_OK;
63}
64
65extern "C" cpResult_t CP_Enable_Path_Protection(uint32_t protect_ip)
66{
67 cpResult_t cp_result = CP_SUCCESS;
68 mcResult_t mcRet;
69 tciMessage_t *tci = NULL;
70
71 LOG_I("[CONTENT_PROTECT] : CP_Enable_Path_Protection");
72 do {
73 // -------------------------------------------------------------
74 // Step 1: Call the Trustlet Open function.
75 mcRet = tlc_initialize();
76 if (MC_DRV_OK != mcRet) {
77 LOG_E("Tlc Open Error");
78 cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
79 break;
80 }
81
82 // -------------------------------------------------------------
83 // Step 2: Check TCI buffer.
84 tci = cp_ctx.tci_msg;
85 if (NULL == tci) {
86 LOG_E("TCI has not been set up properly - exiting");
87 cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
88 break;
89 }
90
91 // -------------------------------------------------------------
92 // Step 3: Call the Trustlet functions
93 // Step 3.1: Prepare command message in TCI
94 tci->cmd.id = CMD_WV_DRM_ENABLE_PATH_PROTECTION;
95 memcpy(tci->cmd.data, &protect_ip, sizeof(protect_ip));
96 tci->cmd.data_len = sizeof(protect_ip);
97
98 // -------------------------------------------------------------
99 // Step 3.2: Send Trustlet TCI Message
100 mcRet = tlc_communicate(&cp_ctx);
101 if (MC_DRV_OK != mcRet) {
102 LOG_E("Tlc Communicate Error");
103 cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
104 break;
105 }
106
107 // -------------------------------------------------------------
108 // Step 3.3: Verify that the Trustlet sent a response
109 if ((RSP_ID(CMD_WV_DRM_ENABLE_PATH_PROTECTION) != tci->resp.id)) {
110 LOG_E("Trustlet did not send a response: %d", tci->resp.id);
111 cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
112 break;
113 }
114
115 // -------------------------------------------------------------
116 // Step 3.4: Check the Trustlet return code
117 if (tci->resp.return_code != RET_TL_WV_DRM_OK) {
118 LOG_E("Trustlet did not send a valid return code: %d", tci->resp.return_code);
119 cp_result = CP_ERROR_ENABLE_PATH_PROTECTION_FAILED;
120 break;
121 }
122 } while(0);
123
124 tlc_terminate();
125 LOG_I("[CONTENT_PROTECT] : CP_Enable_Path_Protection. return value(%d)", cp_result);
126 return cp_result;
127}
128
129extern "C" cpResult_t CP_Disable_Path_Protection(uint32_t protect_ip)
130{
131 cpResult_t cp_result = CP_SUCCESS;
132 mcResult_t mcRet;
133 tciMessage_t *tci = NULL;
134
135 LOG_I("[CONTENT_PROTECT] : CP_Disable_Path_Protection");
136 do {
137 // -------------------------------------------------------------
138 // Step 1: Call the Trustlet Open function.
139 mcRet = tlc_initialize();
140 if (MC_DRV_OK != mcRet) {
141 LOG_E("Tlc Open Error");
142 cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
143 break;
144 }
145
146 // -------------------------------------------------------------
147 // Step 2: Check TCI buffer.
148 tci = cp_ctx.tci_msg;
149 if (NULL == tci) {
150 LOG_E("TCI has not been set up properly - exiting");
151 cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
152 break;
153 }
154
155 // -------------------------------------------------------------
156 // Step 3: Call the Trustlet functions
157 // Step 3.1: Prepare command message in TCI
158 tci->cmd.id = CMD_WV_DRM_DISABLE_PATH_PROTECTION;
159 memcpy(tci->cmd.data, &protect_ip, sizeof(protect_ip));
160 tci->cmd.data_len = sizeof(protect_ip);
161
162 // -------------------------------------------------------------
163 // Step 3.2: Send Trustlet TCI Message
164 mcRet = tlc_communicate(&cp_ctx);
165 if (MC_DRV_OK != mcRet) {
166 LOG_E("Tlc Communicate Error");
167 cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
168 break;
169 }
170
171 // -------------------------------------------------------------
172 // Step 3.3: Verify that the Trustlet sent a response
173 if ((RSP_ID(CMD_WV_DRM_DISABLE_PATH_PROTECTION) != tci->resp.id)) {
174 LOG_E("Trustlet did not send a response: %d", tci->resp.id);
175 cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
176 break;
177 }
178
179 // -------------------------------------------------------------
180 // Step 3.4: Check the Trustlet return code
181 if (tci->resp.return_code != RET_TL_WV_DRM_OK) {
182 LOG_E("Trustlet did not send a valid return code: %d", tci->resp.return_code);
183 cp_result = CP_ERROR_DISABLE_PATH_PROTECTION_FAILED;
184 break;
185 }
186 } while(0);
187
188 tlc_terminate();
189 LOG_I("[CONTENT_PROTECT] : CP_Disable_Path_Protection. return value(%d)", cp_result);
190 return cp_result;
191}
192