2 * Copyright (c) 2000-2015 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (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
8 * http://floralicense.org/license/
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.
17 * @brief TADC Testcase temporarily.
18 * @author Sangil Yoon (si83.yoon@samsung.com)
23 #include "TADC_Core.h"
26 #include "TADC_ErrorCode.h"
28 #include "DrmTdcSvc.h"
30 #define DHINFO_MAX 100
31 #define DHINFO_REQIDLEN 20
33 #define TDC_DECRYPT_IOLEN 1024 * 1024 // 1024 Kbyte
35 //DH Session Info Structure
37 BYTE hashReqID[DHINFO_MAX][DHINFO_REQIDLEN]; //LicenseRequest Request ID Hash 20byte
38 T_ROACQ_INFO t_ROAcqInfo[DHINFO_MAX]; //DH Info
42 static DrmTdcDHInfo g_DrmTdcDHInfo;
43 static BOOL g_DrmTdcDHFlag = FALSE;
45 static char g_sTimeStamp[21]; //2011.03.08, GMT ("CCCC-YY-MMThh:mm:ssZ")
47 bool DrmTdcGetFileHeader(const char *pTADCFilepath,
48 DrmTdcFileHeader *pFileHeader)
50 T_FILE_HEADER t_FileHeader;
51 T_DRM_HEADER t_DRMHeader;
54 if (!pTADCFilepath || !pFileHeader) {
55 DRM_TAPPS_EXCEPTION("DrmTdcGetFileHeader Error : Parameter Null");
60 memset(&t_FileHeader, 0x00, sizeof(T_FILE_HEADER));
61 memset(&t_DRMHeader, 0x00, sizeof(T_DRM_HEADER));
62 memset(pFileHeader, 0x00, sizeof(DrmTdcFileHeader));
65 if (TADC_GetDRMHeaderFromFile(pTADCFilepath, &t_FileHeader, &t_DRMHeader) < 0) {
66 DRM_TAPPS_EXCEPTION("TADC_GetDRMHeaderFromFile (%s)", pTADCFilepath);
67 TADC_MEMFree_DRMHeader(&t_DRMHeader);
71 //Copy to pFileHeader ( CID, RIURL )
72 if ((sizeof(pFileHeader->cid) < strlen((char *)t_DRMHeader.CID) + 1) ||
73 (sizeof(pFileHeader->riurl) < strlen((char *)t_DRMHeader.RIURL) + 1)) {
74 DRM_TAPPS_EXCEPTION("TADC_GetDRMHeaderFromFile. Invalid cid or riurl(%s)",
76 TADC_MEMFree_FileHeader(&t_FileHeader);
77 TADC_MEMFree_DRMHeader(&t_DRMHeader);
81 memcpy(pFileHeader->cid, t_DRMHeader.CID, strlen((char *)t_DRMHeader.CID) + 1);
82 memcpy(pFileHeader->riurl, t_DRMHeader.RIURL,
83 strlen((char *)t_DRMHeader.RIURL) + 1);
86 TADC_MEMFree_FileHeader(&t_FileHeader);
87 TADC_MEMFree_DRMHeader(&t_DRMHeader);
92 bool DrmTdcDecryptPackage(const char *pTADCFilepath, const char *pLicenseBuf,
93 unsigned int licenseBufLen, const char *pDecryptedFile)
95 T_FILE_HEADER t_FileHeader;
96 T_DRM_HEADER t_DRMHeader;
97 T_DEVICE_INFO t_DeviceInfo;
100 FILE *hFile1 = INVALID_HOBJ; //TDC drm file
101 FILE *hFile2 = INVALID_HOBJ; //Decrypted file
104 memset(&t_FileHeader, 0x00, sizeof(T_FILE_HEADER));
105 memset(&t_DRMHeader, 0x00, sizeof(T_DRM_HEADER));
106 memset(&t_DeviceInfo, 0x00, sizeof(T_DEVICE_INFO));
107 memset(&t_RO, 0x00, sizeof(T_RO));
113 || licenseBufLen < 1) {
114 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage Error : Parameter Null");
119 if (TADC_SetDeviceInfo(&t_DeviceInfo) < 0) {
120 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage Error : TADC_SetDeviceInfo");
124 auto pReadBuf = (TADC_U8 *)TADC_IF_Malloc(TDC_DECRYPT_IOLEN);
127 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage Error : pReadBuf Malloc Fail");
131 //Get DRM Header Info
132 if (TADC_GetDRMHeaderFromFile(pTADCFilepath, &t_FileHeader, &t_DRMHeader) < 0) {
133 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage Error : TADC_GetDRMHeaderFromFile");
134 TADC_MEMFree_FileHeader(&t_FileHeader);
135 TADC_MEMFree_DRMHeader(&t_DRMHeader);
136 TADC_IF_Free(pReadBuf);
141 if (TADC_GetResponseROInfo((unsigned char *)pLicenseBuf, &t_RO) < 0) {
142 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage Error : TADC_GetResponseROInfo");
143 TADC_MEMFree_FileHeader(&t_FileHeader);
144 TADC_MEMFree_DRMHeader(&t_DRMHeader);
145 TADC_MEMFree_RO(&t_RO);
146 TADC_IF_Free(pReadBuf);
152 if (TADC_GetCEK(&t_DeviceInfo, &t_RO, &t_DRMHeader) < 0) {
153 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage Error : TADC_GetCEK");
154 TADC_MEMFree_FileHeader(&t_FileHeader);
155 TADC_MEMFree_DRMHeader(&t_DRMHeader);
156 TADC_MEMFree_RO(&t_RO);
157 TADC_IF_Free(pReadBuf);
162 //File Open ( DRM File )
163 if ((hFile1 = fopen(pTADCFilepath, "rb")) == INVALID_HOBJ) {
164 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage Error : DRM FmOpenFile (%s)",
166 TADC_MEMFree_FileHeader(&t_FileHeader);
167 TADC_MEMFree_DRMHeader(&t_DRMHeader);
168 TADC_MEMFree_RO(&t_RO);
169 TADC_IF_Free(pReadBuf);
173 //File Create ( Decrypted File )
174 if ((hFile2 = fopen(pDecryptedFile, "w+b")) == INVALID_HOBJ) {
175 DRM_TAPPS_EXCEPTION("Decrypted File FmOpenFile (%s)", pDecryptedFile);
177 TADC_MEMFree_FileHeader(&t_FileHeader);
178 TADC_MEMFree_DRMHeader(&t_DRMHeader);
179 TADC_MEMFree_RO(&t_RO);
180 TADC_IF_Free(pReadBuf);
184 fseek(hFile1, 0, SEEK_END);
185 auto size1 = ftell(hFile1);
187 auto offset = t_FileHeader.Offset1 + 35 + t_DRMHeader.XmlSize;
188 fseek(hFile1, offset, SEEK_SET);
190 auto size2 = size1 - offset; //plain file size
191 auto BlockCnt = (size2 / 512) + ((size2 % 512) ? 1 : 0);
193 auto EncBlockCnt = BlockCnt;
195 if (t_DRMHeader.EncryptionRange != -1)
196 EncBlockCnt = t_DRMHeader.EncryptionRange;
200 while (i < BlockCnt) {
201 size_t ReadLen = fread(pReadBuf, 1, TDC_DECRYPT_IOLEN, hFile1);
206 for (size_t k = 0; k < ReadLen; k += 512) {
207 if (i < EncBlockCnt) {
208 size_t DecLen = ReadLen - k;
209 DecLen = (DecLen > 512) ? 512 : DecLen;
211 if (TADC_DecryptBlock((char *)pReadBuf + k, DecLen, &t_DRMHeader) < 0) {
212 DRM_TAPPS_EXCEPTION("TADC_DecryptBlock");
215 TADC_MEMFree_FileHeader(&t_FileHeader);
216 TADC_MEMFree_DRMHeader(&t_DRMHeader);
217 TADC_MEMFree_RO(&t_RO);
218 TADC_IF_Free(pReadBuf);
226 fwrite(pReadBuf, 1, ReadLen, hFile2);
229 fclose(hFile1); //sample drm file
230 fclose(hFile2); //plain file
232 TADC_MEMFree_FileHeader(&t_FileHeader);
233 TADC_MEMFree_DRMHeader(&t_DRMHeader);
234 TADC_MEMFree_RO(&t_RO);
235 TADC_IF_Free(pReadBuf);
240 bool DrmTdcDecryptPackage2(const char *pTADCFilepath, T_RO t_RO,
241 const char *pDecryptedFile)
243 T_FILE_HEADER t_FileHeader;
244 T_DRM_HEADER t_DRMHeader;
245 T_DEVICE_INFO t_DeviceInfo;
247 FILE *hFile1 = INVALID_HOBJ; //TDC drm file
248 FILE *hFile2 = INVALID_HOBJ; //Decrypted file
251 memset(&t_FileHeader, 0x00, sizeof(T_FILE_HEADER));
252 memset(&t_DRMHeader, 0x00, sizeof(T_DRM_HEADER));
253 memset(&t_DeviceInfo, 0x00, sizeof(T_DEVICE_INFO));
255 if (!pTADCFilepath || !pDecryptedFile) {
256 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage2 Error : Parameter Null");
261 if (TADC_SetDeviceInfo(&t_DeviceInfo) == TADC_GETDUID_ERROR) {
262 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage2 Error : TADC_SetDeviceInfo");
266 auto pReadBuf = (TADC_U8 *)TADC_IF_Malloc(TDC_DECRYPT_IOLEN);
269 DRM_TAPPS_EXCEPTION("pReadBuf Malloc Fail");
273 //Get DRM Header Info
274 if (TADC_GetDRMHeaderFromFile(pTADCFilepath, &t_FileHeader, &t_DRMHeader) < 0) {
275 DRM_TAPPS_EXCEPTION("TADC_GetDRMHeaderFromFile");
276 TADC_MEMFree_FileHeader(&t_FileHeader);
277 TADC_MEMFree_DRMHeader(&t_DRMHeader);
278 TADC_IF_Free(pReadBuf);
283 if (TADC_GetCEK(&t_DeviceInfo, &t_RO, &t_DRMHeader) < 0) {
284 DRM_TAPPS_EXCEPTION("TADC_GetCEK");
285 TADC_MEMFree_FileHeader(&t_FileHeader);
286 TADC_MEMFree_DRMHeader(&t_DRMHeader);
287 TADC_IF_Free(pReadBuf);
292 //File Open ( DRM File )
293 if ((hFile1 = fopen(pTADCFilepath, "rb")) == INVALID_HOBJ) {
294 DRM_TAPPS_EXCEPTION("DRM FmOpenFile (%s)", pTADCFilepath);
295 TADC_MEMFree_FileHeader(&t_FileHeader);
296 TADC_MEMFree_DRMHeader(&t_DRMHeader);
297 TADC_IF_Free(pReadBuf);
301 //File Create ( Decrypted File )
302 if ((hFile2 = fopen(pDecryptedFile, "w+b")) == INVALID_HOBJ) {
303 DRM_TAPPS_EXCEPTION("Decrypted File FmOpenFile (%s)", pDecryptedFile);
305 TADC_MEMFree_FileHeader(&t_FileHeader);
306 TADC_MEMFree_DRMHeader(&t_DRMHeader);
307 TADC_IF_Free(pReadBuf);
311 fseek(hFile1, 0, SEEK_END);
312 auto size1 = ftell(hFile1);
314 auto offset = t_FileHeader.Offset1 + 35 + t_DRMHeader.XmlSize;
315 fseek(hFile1, offset, SEEK_SET);
317 auto size2 = size1 - offset; //plain file size
318 auto BlockCnt = (size2 / 512) + ((size2 % 512) ? 1 : 0);
320 auto EncBlockCnt = BlockCnt;
322 if (t_DRMHeader.EncryptionRange != -1)
323 EncBlockCnt = t_DRMHeader.EncryptionRange;
327 while (i < BlockCnt) {
328 auto ReadLen = fread(pReadBuf, 1, TDC_DECRYPT_IOLEN, hFile1);
333 for (size_t k = 0; k < ReadLen; k += 512) {
334 if (i < EncBlockCnt) {
335 auto DecLen = ReadLen - k;
336 DecLen = (DecLen > 512) ? 512 : DecLen;
338 if (TADC_DecryptBlock((char *)pReadBuf + k, DecLen, &t_DRMHeader) < 0) {
339 DRM_TAPPS_EXCEPTION("TADC_DecryptBlock");
342 TADC_MEMFree_FileHeader(&t_FileHeader);
343 TADC_MEMFree_DRMHeader(&t_DRMHeader);
344 TADC_IF_Free(pReadBuf);
352 fwrite(pReadBuf, 1, ReadLen, hFile2);
355 fclose(hFile1); //sample drm file
356 fclose(hFile2); //plain file
358 TADC_MEMFree_FileHeader(&t_FileHeader);
359 TADC_MEMFree_DRMHeader(&t_DRMHeader);
360 TADC_IF_Free(pReadBuf);
365 bool DrmTdcGeneratePurchaseRequest(const char *pTADCFilepath, char *pReqBuf,
366 unsigned int *pReqBufLen, char *pLicenseUrl,
367 unsigned int *pLicenseUrlLen)
369 T_FILE_HEADER t_FileHeader;
370 T_DRM_HEADER t_DRMHeader;
371 T_DEVICE_INFO t_DeviceInfo;
372 char ReqLicBuf[REQU_MAXSIZE] = {0, };
379 || *pLicenseUrlLen < 512) {
380 DRM_TAPPS_EXCEPTION("Parameter Null");
384 memset(&t_FileHeader, 0x00, sizeof(T_FILE_HEADER));
385 memset(&t_DRMHeader, 0x00, sizeof(T_DRM_HEADER));
386 memset(&t_DeviceInfo, 0x00, sizeof(T_DEVICE_INFO));
389 if (TADC_SetDeviceInfo(&t_DeviceInfo) == TADC_GETDUID_ERROR) {
390 DRM_TAPPS_EXCEPTION("TADC_SetDeviceInfo");
394 //Get DRM Header Info
395 if (TADC_GetDRMHeaderFromFile(pTADCFilepath, &t_FileHeader, &t_DRMHeader) < 0) {
396 DRM_TAPPS_EXCEPTION("TADC_GetDRMHeaderFromFile");
397 TADC_MEMFree_DRMHeader(&t_DRMHeader);
401 if (TADC_MakeRequestLicense(&t_DeviceInfo, &t_FileHeader, &t_DRMHeader,
402 (unsigned char *)ReqLicBuf, sizeof(ReqLicBuf)) < 0) {
403 DRM_TAPPS_EXCEPTION("TADC_MakeRequestLicense");
404 TADC_MEMFree_DRMHeader(&t_DRMHeader);
409 size_t tmpLen = strlen((char *)ReqLicBuf);
411 if (*pReqBufLen <= tmpLen) {
412 DRM_TAPPS_EXCEPTION("*pReqBufLen(%d) <= %d", *pReqBufLen, tmpLen);
413 TADC_MEMFree_DRMHeader(&t_DRMHeader);
417 memcpy(pReqBuf, ReqLicBuf, tmpLen + 1);
420 tmpLen = strlen((char *)t_DRMHeader.RIURL);
422 if (*pLicenseUrlLen <= tmpLen) {
423 DRM_TAPPS_EXCEPTION("*pLicenseUrlLen(%d) <= %d", *pLicenseUrlLen, tmpLen);
424 TADC_MEMFree_DRMHeader(&t_DRMHeader);
428 memcpy(pLicenseUrl, t_DRMHeader.RIURL, tmpLen + 1);
431 TADC_MEMFree_FileHeader(&t_FileHeader);
432 TADC_MEMFree_DRMHeader(&t_DRMHeader);
437 int DrmTdcGenerateLicenseRequest(const char *pRespBuf, unsigned int respBufLen,
438 char *pReqBuf, unsigned int *pReqBufLen, char *pLicenseUrl,
439 unsigned int *pLicenseUrlLen)
441 T_ROACQ_INFO *pt_ROAcqInfo = NULL;
443 char ReqROBuf[REQU_MAXSIZE] = {0}; //Request buff max size. (2011.03.08)
444 BYTE sha1_tmp[DHINFO_REQIDLEN] = {0};
446 unsigned char ROVer[2]; //2011.03.08
454 || *pLicenseUrlLen < 512) {
455 DRM_TAPPS_EXCEPTION("Parameter Null");
456 return TADC_PARAMETER_ERROR;
459 if (g_DrmTdcDHFlag == FALSE) {
461 g_DrmTdcDHFlag = TRUE;
464 for (idx = 0; idx < DHINFO_MAX; idx++) {
466 g_DrmTdcDHInfo.hashReqID[idx], sha1_tmp, DHINFO_REQIDLEN)) {
467 pt_ROAcqInfo = &g_DrmTdcDHInfo.t_ROAcqInfo[idx];
473 DRM_TAPPS_LOG("DrmTdcGenerateLicenseRequest ID Idx = %d", idx);
475 if (idx == DHINFO_MAX) {
476 DRM_TAPPS_EXCEPTION("idx == DHINFO_MAX");
477 return TADC_DHINFO_MAX_ERROR;
481 if (TADC_GetROAcqInfo((unsigned char *)pRespBuf, pt_ROAcqInfo) < 0) {
482 DRM_TAPPS_EXCEPTION("TADC_GetROAcqInfo");
483 return TADC_GET_ROACQ_INFO_ERROR;
489 if (TADC_MakeRequestRO(pt_ROAcqInfo, (unsigned char *)ReqROBuf,
490 sizeof(ReqROBuf), ROVer) < 0) {
491 DRM_TAPPS_EXCEPTION("TADC_MakeRequestRO");
492 return TADC_MAKE_LICENSEREQ_ERROR;
496 DRM_TAPPS_LOG("Debug Log == Copy ReqID Hash Successfully Done!");
499 TADC_IF_SHA1(pt_ROAcqInfo -> ReqID,
500 TADC_IF_StrLen((char *)pt_ROAcqInfo -> ReqID),
501 g_DrmTdcDHInfo.hashReqID[idx]);
504 size_t tmpLen = strlen((char *)ReqROBuf);
506 if (*pReqBufLen <= tmpLen) {
507 DRM_TAPPS_EXCEPTION("*pReqBufLen(%d) <= %d", *pReqBufLen, tmpLen);
508 return TADC_MEMAlOC_ERROR;
511 memcpy(pReqBuf, ReqROBuf, tmpLen + 1);
514 tmpLen = strlen((char *)pt_ROAcqInfo->ROAcqURL);
516 if (*pLicenseUrlLen <= tmpLen) {
517 DRM_TAPPS_EXCEPTION("*pLicenseUrlLen(%d) <= %d", *pLicenseUrlLen, tmpLen);
518 return TADC_MEMAlOC_ERROR;
521 memcpy(pLicenseUrl, (char *)pt_ROAcqInfo->ROAcqURL, tmpLen + 1);
524 DRM_TAPPS_LOG("Debug Log == DrmTdcGenerateLicenseRequest Successfully Done!");
529 int DrmTdcDecryptLicense(const char *pRespBuf, unsigned int respBufLen,
530 char *pDecLicenseBuf, unsigned int *decLicenseBufLen)
532 T_ROACQ_INFO *pt_ROAcqInfo = NULL;
536 BYTE sha1_tmp[20] = {0};
542 || *decLicenseBufLen < 512) {
543 DRM_TAPPS_EXCEPTION("Parameter Null");
544 return TADC_PARAMETER_ERROR;
547 memset(&t_RO, 0x00, sizeof(T_RO));
549 if (TADC_GetHashReqID((unsigned char *)pRespBuf, sha1_tmp) < 0) {
550 DRM_TAPPS_EXCEPTION("TADC_GetHashReqID");
551 return TADC_GET_HASHREQID_ERROR;
554 for (idx = 0; idx < DHINFO_MAX; idx++) {
555 if (!TADC_IF_MemCmp(g_DrmTdcDHInfo.hashReqID[idx], sha1_tmp, 20)) {
556 pt_ROAcqInfo = &g_DrmTdcDHInfo.t_ROAcqInfo[idx];
561 if (idx == DHINFO_MAX) {
562 DRM_TAPPS_EXCEPTION("idx == DHINFO_MAX!, Session-key is not same.");
563 return TADC_DHINFO_MAX_ERROR;
566 //Get Decrypted License
567 if ((ret = TADC_GetResponseRO((unsigned char *)pRespBuf, pt_ROAcqInfo, &t_RO,
568 (unsigned char *)pDecLicenseBuf)) < 0) {
569 DrmTdcDHInfoFree(idx); //2010.02.26
570 DRM_TAPPS_EXCEPTION("TADC_GetResponseRO! Ret[%x]", ret);
571 return TADC_GET_RORES_INFO_ERROR;
574 *decLicenseBufLen = strlen(pDecLicenseBuf) + 1;
576 // Check Signature and Certificate Chain
577 if ((ret = TADC_VerifyROSignature((unsigned char *)pDecLicenseBuf))) {
578 DRM_TAPPS_EXCEPTION("TADC_VerifyROSignature Error Code = %x", ret);
579 return TADC_RO_SIGNATURE_ERROR;
582 //2011.03.08, return time stamp
583 memcpy(g_sTimeStamp, pt_ROAcqInfo->sTimeStamp,
584 strlen((char *)pt_ROAcqInfo->sTimeStamp) + 1);
587 TADC_MEMFree_RO(&t_RO);
588 DrmTdcDHInfoFree(idx);
593 void DrmTdcDHInfoInit(void)
595 memset(&g_DrmTdcDHInfo, 0x00, sizeof(DrmTdcDHInfo));
598 bool DrmTdcDHInfoFree(int idx)
600 memset(&g_DrmTdcDHInfo.hashReqID[idx], 0x00,
601 sizeof(g_DrmTdcDHInfo.hashReqID[idx]));
603 if (TADC_MEMFree_ROAcqInfo(&g_DrmTdcDHInfo.t_ROAcqInfo[idx]) < 0)