1 /* 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 25 mc_comm_ctx cp_ctx; 26 27 // ------------------------------------------------------------- 28 static 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 // ------------------------------------------------------------- 48 static 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 65 extern "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 129 extern "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 193