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 long size1 = ftell(hFile1);
187 long offset = static_cast<long>(t_FileHeader.Offset1 + 35 + t_DRMHeader.XmlSize);
188 fseek(hFile1, offset, SEEK_SET);
190 if (size1 < offset) {
191 DRM_TAPPS_EXCEPTION("Invalid offset... offset is bigger than file size");
194 TADC_MEMFree_FileHeader(&t_FileHeader);
195 TADC_MEMFree_DRMHeader(&t_DRMHeader);
196 TADC_MEMFree_RO(&t_RO);
197 TADC_IF_Free(pReadBuf);
201 long size2 = size1 - offset; //plain file size
202 long BlockCnt = (size2 / 512) + ((size2 % 512) ? 1 : 0);
204 long EncBlockCnt = BlockCnt;
206 if (t_DRMHeader.EncryptionRange != -1)
207 EncBlockCnt = t_DRMHeader.EncryptionRange;
211 while (i < BlockCnt) {
212 size_t ReadLen = fread(pReadBuf, 1, TDC_DECRYPT_IOLEN, hFile1);
217 for (size_t k = 0; k < ReadLen; k += 512) {
218 if (i < EncBlockCnt) {
219 size_t DecLen = ReadLen - k;
220 DecLen = (DecLen > 512) ? 512 : DecLen;
222 if (TADC_DecryptBlock((char *)pReadBuf + k, DecLen, &t_DRMHeader) < 0) {
223 DRM_TAPPS_EXCEPTION("TADC_DecryptBlock");
226 TADC_MEMFree_FileHeader(&t_FileHeader);
227 TADC_MEMFree_DRMHeader(&t_DRMHeader);
228 TADC_MEMFree_RO(&t_RO);
229 TADC_IF_Free(pReadBuf);
237 fwrite(pReadBuf, 1, ReadLen, hFile2);
240 fclose(hFile1); //sample drm file
241 fclose(hFile2); //plain file
243 TADC_MEMFree_FileHeader(&t_FileHeader);
244 TADC_MEMFree_DRMHeader(&t_DRMHeader);
245 TADC_MEMFree_RO(&t_RO);
246 TADC_IF_Free(pReadBuf);
251 bool DrmTdcDecryptPackage2(const char *pTADCFilepath, T_RO t_RO,
252 const char *pDecryptedFile)
254 T_FILE_HEADER t_FileHeader;
255 T_DRM_HEADER t_DRMHeader;
256 T_DEVICE_INFO t_DeviceInfo;
258 FILE *hFile1 = INVALID_HOBJ; //TDC drm file
259 FILE *hFile2 = INVALID_HOBJ; //Decrypted file
262 memset(&t_FileHeader, 0x00, sizeof(T_FILE_HEADER));
263 memset(&t_DRMHeader, 0x00, sizeof(T_DRM_HEADER));
264 memset(&t_DeviceInfo, 0x00, sizeof(T_DEVICE_INFO));
266 if (!pTADCFilepath || !pDecryptedFile) {
267 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage2 Error : Parameter Null");
272 if (TADC_SetDeviceInfo(&t_DeviceInfo) == TADC_GETDUID_ERROR) {
273 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage2 Error : TADC_SetDeviceInfo");
277 auto pReadBuf = (TADC_U8 *)TADC_IF_Malloc(TDC_DECRYPT_IOLEN);
280 DRM_TAPPS_EXCEPTION("pReadBuf Malloc Fail");
284 //Get DRM Header Info
285 if (TADC_GetDRMHeaderFromFile(pTADCFilepath, &t_FileHeader, &t_DRMHeader) < 0) {
286 DRM_TAPPS_EXCEPTION("TADC_GetDRMHeaderFromFile");
287 TADC_MEMFree_FileHeader(&t_FileHeader);
288 TADC_MEMFree_DRMHeader(&t_DRMHeader);
289 TADC_IF_Free(pReadBuf);
294 if (TADC_GetCEK(&t_DeviceInfo, &t_RO, &t_DRMHeader) < 0) {
295 DRM_TAPPS_EXCEPTION("TADC_GetCEK");
296 TADC_MEMFree_FileHeader(&t_FileHeader);
297 TADC_MEMFree_DRMHeader(&t_DRMHeader);
298 TADC_IF_Free(pReadBuf);
303 //File Open ( DRM File )
304 if ((hFile1 = fopen(pTADCFilepath, "rb")) == INVALID_HOBJ) {
305 DRM_TAPPS_EXCEPTION("DRM FmOpenFile (%s)", pTADCFilepath);
306 TADC_MEMFree_FileHeader(&t_FileHeader);
307 TADC_MEMFree_DRMHeader(&t_DRMHeader);
308 TADC_IF_Free(pReadBuf);
312 //File Create ( Decrypted File )
313 if ((hFile2 = fopen(pDecryptedFile, "w+b")) == INVALID_HOBJ) {
314 DRM_TAPPS_EXCEPTION("Decrypted File FmOpenFile (%s)", pDecryptedFile);
316 TADC_MEMFree_FileHeader(&t_FileHeader);
317 TADC_MEMFree_DRMHeader(&t_DRMHeader);
318 TADC_IF_Free(pReadBuf);
322 fseek(hFile1, 0, SEEK_END);
323 long size1 = ftell(hFile1);
325 long offset = static_cast<long>(t_FileHeader.Offset1 + 35 + t_DRMHeader.XmlSize);
326 fseek(hFile1, offset, SEEK_SET);
328 if (size1 < offset) {
329 DRM_TAPPS_EXCEPTION("Invalid offset... offset is bigger than file size");
332 TADC_MEMFree_FileHeader(&t_FileHeader);
333 TADC_MEMFree_DRMHeader(&t_DRMHeader);
334 TADC_IF_Free(pReadBuf);
338 long size2 = size1 - offset; //plain file size
339 long BlockCnt = (size2 / 512) + ((size2 % 512) ? 1 : 0);
341 long EncBlockCnt = BlockCnt;
343 if (t_DRMHeader.EncryptionRange != -1)
344 EncBlockCnt = t_DRMHeader.EncryptionRange;
348 while (i < BlockCnt) {
349 auto ReadLen = fread(pReadBuf, 1, TDC_DECRYPT_IOLEN, hFile1);
354 for (size_t k = 0; k < ReadLen; k += 512) {
355 if (i < EncBlockCnt) {
356 auto DecLen = ReadLen - k;
357 DecLen = (DecLen > 512) ? 512 : DecLen;
359 if (TADC_DecryptBlock((char *)pReadBuf + k, DecLen, &t_DRMHeader) < 0) {
360 DRM_TAPPS_EXCEPTION("TADC_DecryptBlock");
363 TADC_MEMFree_FileHeader(&t_FileHeader);
364 TADC_MEMFree_DRMHeader(&t_DRMHeader);
365 TADC_IF_Free(pReadBuf);
373 fwrite(pReadBuf, 1, ReadLen, hFile2);
376 fclose(hFile1); //sample drm file
377 fclose(hFile2); //plain file
379 TADC_MEMFree_FileHeader(&t_FileHeader);
380 TADC_MEMFree_DRMHeader(&t_DRMHeader);
381 TADC_IF_Free(pReadBuf);
386 bool DrmTdcGeneratePurchaseRequest(const char *pTADCFilepath, char *pReqBuf,
387 unsigned int *pReqBufLen, char *pLicenseUrl,
388 unsigned int *pLicenseUrlLen)
390 T_FILE_HEADER t_FileHeader;
391 T_DRM_HEADER t_DRMHeader;
392 T_DEVICE_INFO t_DeviceInfo;
393 char ReqLicBuf[REQU_MAXSIZE] = {0, };
400 || *pLicenseUrlLen < 512) {
401 DRM_TAPPS_EXCEPTION("Parameter Null");
405 memset(&t_FileHeader, 0x00, sizeof(T_FILE_HEADER));
406 memset(&t_DRMHeader, 0x00, sizeof(T_DRM_HEADER));
407 memset(&t_DeviceInfo, 0x00, sizeof(T_DEVICE_INFO));
410 if (TADC_SetDeviceInfo(&t_DeviceInfo) == TADC_GETDUID_ERROR) {
411 DRM_TAPPS_EXCEPTION("TADC_SetDeviceInfo");
415 //Get DRM Header Info
416 if (TADC_GetDRMHeaderFromFile(pTADCFilepath, &t_FileHeader, &t_DRMHeader) < 0) {
417 DRM_TAPPS_EXCEPTION("TADC_GetDRMHeaderFromFile");
418 TADC_MEMFree_DRMHeader(&t_DRMHeader);
422 if (TADC_MakeRequestLicense(&t_DeviceInfo, &t_FileHeader, &t_DRMHeader,
423 (unsigned char *)ReqLicBuf, sizeof(ReqLicBuf)) < 0) {
424 DRM_TAPPS_EXCEPTION("TADC_MakeRequestLicense");
425 TADC_MEMFree_DRMHeader(&t_DRMHeader);
430 size_t tmpLen = strlen((char *)ReqLicBuf);
432 if (*pReqBufLen <= tmpLen) {
433 DRM_TAPPS_EXCEPTION("*pReqBufLen(%d) <= %d", *pReqBufLen, tmpLen);
434 TADC_MEMFree_DRMHeader(&t_DRMHeader);
438 memcpy(pReqBuf, ReqLicBuf, tmpLen + 1);
441 tmpLen = strlen((char *)t_DRMHeader.RIURL);
443 if (*pLicenseUrlLen <= tmpLen) {
444 DRM_TAPPS_EXCEPTION("*pLicenseUrlLen(%d) <= %d", *pLicenseUrlLen, tmpLen);
445 TADC_MEMFree_DRMHeader(&t_DRMHeader);
449 memcpy(pLicenseUrl, t_DRMHeader.RIURL, tmpLen + 1);
452 TADC_MEMFree_FileHeader(&t_FileHeader);
453 TADC_MEMFree_DRMHeader(&t_DRMHeader);
458 int DrmTdcGenerateLicenseRequest(const char *pRespBuf, unsigned int respBufLen,
459 char *pReqBuf, unsigned int *pReqBufLen, char *pLicenseUrl,
460 unsigned int *pLicenseUrlLen)
462 T_ROACQ_INFO *pt_ROAcqInfo = NULL;
464 char ReqROBuf[REQU_MAXSIZE] = {0}; //Request buff max size. (2011.03.08)
465 BYTE sha1_tmp[DHINFO_REQIDLEN] = {0};
467 unsigned char ROVer[2]; //2011.03.08
475 || *pLicenseUrlLen < 512) {
476 DRM_TAPPS_EXCEPTION("Parameter Null");
477 return TADC_PARAMETER_ERROR;
480 if (g_DrmTdcDHFlag == FALSE) {
482 g_DrmTdcDHFlag = TRUE;
485 for (idx = 0; idx < DHINFO_MAX; idx++) {
487 g_DrmTdcDHInfo.hashReqID[idx], sha1_tmp, DHINFO_REQIDLEN)) {
488 pt_ROAcqInfo = &g_DrmTdcDHInfo.t_ROAcqInfo[idx];
494 DRM_TAPPS_LOG("DrmTdcGenerateLicenseRequest ID Idx = %d", idx);
496 if (idx == DHINFO_MAX) {
497 DRM_TAPPS_EXCEPTION("idx == DHINFO_MAX");
498 return TADC_DHINFO_MAX_ERROR;
502 if (TADC_GetROAcqInfo((unsigned char *)pRespBuf, pt_ROAcqInfo) < 0) {
503 DRM_TAPPS_EXCEPTION("TADC_GetROAcqInfo");
504 return TADC_GET_ROACQ_INFO_ERROR;
510 if (TADC_MakeRequestRO(pt_ROAcqInfo, (unsigned char *)ReqROBuf,
511 sizeof(ReqROBuf), ROVer) < 0) {
512 DRM_TAPPS_EXCEPTION("TADC_MakeRequestRO");
513 return TADC_MAKE_LICENSEREQ_ERROR;
517 DRM_TAPPS_LOG("Debug Log == Copy ReqID Hash Successfully Done!");
520 TADC_IF_SHA1(pt_ROAcqInfo -> ReqID,
521 TADC_IF_StrLen((char *)pt_ROAcqInfo -> ReqID),
522 g_DrmTdcDHInfo.hashReqID[idx]);
525 size_t tmpLen = strlen((char *)ReqROBuf);
527 if (*pReqBufLen <= tmpLen) {
528 DRM_TAPPS_EXCEPTION("*pReqBufLen(%d) <= %d", *pReqBufLen, tmpLen);
529 return TADC_MEMAlOC_ERROR;
532 memcpy(pReqBuf, ReqROBuf, tmpLen + 1);
535 tmpLen = strlen((char *)pt_ROAcqInfo->ROAcqURL);
537 if (*pLicenseUrlLen <= tmpLen) {
538 DRM_TAPPS_EXCEPTION("*pLicenseUrlLen(%d) <= %d", *pLicenseUrlLen, tmpLen);
539 return TADC_MEMAlOC_ERROR;
542 memcpy(pLicenseUrl, (char *)pt_ROAcqInfo->ROAcqURL, tmpLen + 1);
545 DRM_TAPPS_LOG("Debug Log == DrmTdcGenerateLicenseRequest Successfully Done!");
550 int DrmTdcDecryptLicense(const char *pRespBuf, unsigned int respBufLen,
551 char *pDecLicenseBuf, unsigned int *decLicenseBufLen)
553 T_ROACQ_INFO *pt_ROAcqInfo = NULL;
557 BYTE sha1_tmp[20] = {0};
563 || *decLicenseBufLen < 512) {
564 DRM_TAPPS_EXCEPTION("Parameter Null");
565 return TADC_PARAMETER_ERROR;
568 memset(&t_RO, 0x00, sizeof(T_RO));
570 if (TADC_GetHashReqID((unsigned char *)pRespBuf, sha1_tmp) < 0) {
571 DRM_TAPPS_EXCEPTION("TADC_GetHashReqID");
572 return TADC_GET_HASHREQID_ERROR;
575 for (idx = 0; idx < DHINFO_MAX; idx++) {
576 if (!TADC_IF_MemCmp(g_DrmTdcDHInfo.hashReqID[idx], sha1_tmp, 20)) {
577 pt_ROAcqInfo = &g_DrmTdcDHInfo.t_ROAcqInfo[idx];
582 if (idx == DHINFO_MAX) {
583 DRM_TAPPS_EXCEPTION("idx == DHINFO_MAX!, Session-key is not same.");
584 return TADC_DHINFO_MAX_ERROR;
587 if (pt_ROAcqInfo == NULL) {
588 DRM_TAPPS_EXCEPTION("pt_ROAcqInfo is NULL.");
589 return TADC_DHINFO_MAX_ERROR;
592 //Get Decrypted License
593 if ((ret = TADC_GetResponseRO((unsigned char *)pRespBuf, pt_ROAcqInfo, &t_RO,
594 (unsigned char *)pDecLicenseBuf)) < 0) {
595 DrmTdcDHInfoFree(idx); //2010.02.26
596 DRM_TAPPS_EXCEPTION("TADC_GetResponseRO! Ret[%x]", ret);
597 return TADC_GET_RORES_INFO_ERROR;
600 *decLicenseBufLen = strlen(pDecLicenseBuf) + 1;
602 // Check Signature and Certificate Chain
603 if ((ret = TADC_VerifyROSignature((unsigned char *)pDecLicenseBuf))) {
604 DRM_TAPPS_EXCEPTION("TADC_VerifyROSignature Error Code = %x", ret);
605 return TADC_RO_SIGNATURE_ERROR;
608 //2011.03.08, return time stamp
609 memcpy(g_sTimeStamp, pt_ROAcqInfo->sTimeStamp,
610 strlen((char *)pt_ROAcqInfo->sTimeStamp) + 1);
613 TADC_MEMFree_RO(&t_RO);
614 DrmTdcDHInfoFree(idx);
619 void DrmTdcDHInfoInit(void)
621 memset(&g_DrmTdcDHInfo, 0x00, sizeof(DrmTdcDHInfo));
624 bool DrmTdcDHInfoFree(int idx)
626 memset(&g_DrmTdcDHInfo.hashReqID[idx], 0x00,
627 sizeof(g_DrmTdcDHInfo.hashReqID[idx]));
629 if (TADC_MEMFree_ROAcqInfo(&g_DrmTdcDHInfo.t_ROAcqInfo[idx]) < 0)