b0b742cbfcab0114fadcd0bf48814499ba0d0f74
[platform/core/security/drm-service-core-tizen.git] / tadcore / Svc / DrmTdcSvc.cpp
1 /*
2  * Copyright (c) 2000-2015 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  *     http://floralicense.org/license/
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  * @file    DrmTdcSvc.cpp
17  * @brief   TADC Testcase temporarily.
18  * @author  Sangil Yoon (si83.yoon@samsung.com)
19  * @version 1.0
20  *
21 */
22
23 #include "TADC_Core.h"
24 #include "TADC_IF.h"
25
26 #include "TADC_ErrorCode.h"
27
28 #include "DrmTdcSvc.h"
29
30 #define DHINFO_MAX        100
31 #define DHINFO_REQIDLEN   20
32
33 #define TDC_DECRYPT_IOLEN 1024 * 1024 // 1024 Kbyte
34
35 //DH Session Info Structure
36 typedef struct {
37         BYTE hashReqID[DHINFO_MAX][DHINFO_REQIDLEN]; //LicenseRequest Request ID Hash 20byte
38         T_ROACQ_INFO t_ROAcqInfo[DHINFO_MAX];        //DH Info
39 } DrmTdcDHInfo;
40
41
42 static DrmTdcDHInfo g_DrmTdcDHInfo;
43 static BOOL g_DrmTdcDHFlag = FALSE;
44
45 static char g_sTimeStamp[21]; //2011.03.08, GMT ("CCCC-YY-MMThh:mm:ssZ")
46
47 bool DrmTdcGetFileHeader(const char *pTADCFilepath,
48                                                  DrmTdcFileHeader *pFileHeader)
49 {
50         T_FILE_HEADER t_FileHeader;
51         T_DRM_HEADER t_DRMHeader;
52
53         //null check
54         if (!pTADCFilepath || !pFileHeader) {
55                 DRM_TAPPS_EXCEPTION("DrmTdcGetFileHeader Error : Parameter Null");
56                 return FALSE;
57         }
58
59         //Init
60         memset(&t_FileHeader, 0x00, sizeof(T_FILE_HEADER));
61         memset(&t_DRMHeader, 0x00, sizeof(T_DRM_HEADER));
62         memset(pFileHeader, 0x00, sizeof(DrmTdcFileHeader));
63
64         //Get DRM Header Info
65         if (TADC_GetDRMHeaderFromFile(pTADCFilepath, &t_FileHeader, &t_DRMHeader) < 0) {
66                 DRM_TAPPS_EXCEPTION("TADC_GetDRMHeaderFromFile (%s)", pTADCFilepath);
67                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
68                 return FALSE;
69         }
70
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)",
75                                                         pTADCFilepath);
76                 TADC_MEMFree_FileHeader(&t_FileHeader);
77                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
78                 return FALSE;
79         }
80
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);
84
85         //Free
86         TADC_MEMFree_FileHeader(&t_FileHeader);
87         TADC_MEMFree_DRMHeader(&t_DRMHeader);
88
89         return TRUE;
90 }
91
92 bool DrmTdcDecryptPackage(const char *pTADCFilepath, const char *pLicenseBuf,
93                                                   unsigned int licenseBufLen, const char *pDecryptedFile)
94 {
95         T_FILE_HEADER t_FileHeader;
96         T_DRM_HEADER t_DRMHeader;
97         T_DEVICE_INFO t_DeviceInfo;
98         T_RO t_RO;
99
100         FILE *hFile1 = INVALID_HOBJ; //TDC drm file
101         FILE *hFile2 = INVALID_HOBJ; //Decrypted file
102
103         //2011.03.08, init
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));
108
109         //null check
110         if (!pTADCFilepath
111                         || !pLicenseBuf
112                         || !pDecryptedFile
113                         || licenseBufLen < 1) {
114                 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage Error : Parameter Null");
115                 return FALSE;
116         }
117
118         //Set DeviceInfo
119         if (TADC_SetDeviceInfo(&t_DeviceInfo) < 0) {
120                 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage Error : TADC_SetDeviceInfo");
121                 return FALSE;
122         }
123
124         auto pReadBuf = (TADC_U8 *)TADC_IF_Malloc(TDC_DECRYPT_IOLEN);
125
126         if (!pReadBuf) {
127                 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage Error : pReadBuf Malloc Fail");
128                 return FALSE;
129         }
130
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);
137                 return FALSE;
138         }
139
140         // RO XML Parser
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);
147
148                 return FALSE;
149         }
150
151         //Get CEK
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);
158                 return FALSE;
159         }
160
161         //Decrypt File
162         //File Open ( DRM File )
163         if ((hFile1 = fopen(pTADCFilepath, "rb")) == INVALID_HOBJ) {
164                 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage Error : DRM FmOpenFile (%s)",
165                                                         pTADCFilepath);
166                 TADC_MEMFree_FileHeader(&t_FileHeader);
167                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
168                 TADC_MEMFree_RO(&t_RO);
169                 TADC_IF_Free(pReadBuf);
170                 return FALSE;
171         }
172
173         //File Create ( Decrypted File )
174         if ((hFile2 = fopen(pDecryptedFile, "w+b")) == INVALID_HOBJ) {
175                 DRM_TAPPS_EXCEPTION("Decrypted File FmOpenFile (%s)", pDecryptedFile);
176                 fclose(hFile1);
177                 TADC_MEMFree_FileHeader(&t_FileHeader);
178                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
179                 TADC_MEMFree_RO(&t_RO);
180                 TADC_IF_Free(pReadBuf);
181                 return FALSE;
182         }
183
184         fseek(hFile1, 0, SEEK_END);
185         long size1 = ftell(hFile1);
186
187         long offset = static_cast<long>(t_FileHeader.Offset1 + 35 + t_DRMHeader.XmlSize);
188         fseek(hFile1, offset, SEEK_SET);
189
190         if (size1 < offset) {
191                 DRM_TAPPS_EXCEPTION("Invalid offset... offset is bigger than file size");
192                 fclose(hFile1);
193                 fclose(hFile2);
194                 TADC_MEMFree_FileHeader(&t_FileHeader);
195                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
196                 TADC_MEMFree_RO(&t_RO);
197                 TADC_IF_Free(pReadBuf);
198                 return FALSE;
199         }
200
201         long size2 = size1 - offset; //plain file size
202         long BlockCnt = (size2 / 512) + ((size2 % 512) ? 1 : 0);
203
204         long EncBlockCnt = BlockCnt;
205
206         if (t_DRMHeader.EncryptionRange != -1)
207                 EncBlockCnt = t_DRMHeader.EncryptionRange;
208
209         long int i = 0;
210
211         while (i < BlockCnt) {
212                 size_t ReadLen = fread(pReadBuf, 1, TDC_DECRYPT_IOLEN, hFile1);
213
214                 if (ReadLen < 1)
215                         break;
216
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;
221
222                                 if (TADC_DecryptBlock((char *)pReadBuf + k, DecLen, &t_DRMHeader) < 0) {
223                                         DRM_TAPPS_EXCEPTION("TADC_DecryptBlock");
224                                         fclose(hFile1);
225                                         fclose(hFile2);
226                                         TADC_MEMFree_FileHeader(&t_FileHeader);
227                                         TADC_MEMFree_DRMHeader(&t_DRMHeader);
228                                         TADC_MEMFree_RO(&t_RO);
229                                         TADC_IF_Free(pReadBuf);
230                                         return FALSE;
231                                 }
232                         }
233
234                         i += 1;
235                 }
236
237                 fwrite(pReadBuf, 1, ReadLen, hFile2);
238         }
239
240         fclose(hFile1); //sample drm file
241         fclose(hFile2); //plain file
242
243         TADC_MEMFree_FileHeader(&t_FileHeader);
244         TADC_MEMFree_DRMHeader(&t_DRMHeader);
245         TADC_MEMFree_RO(&t_RO);
246         TADC_IF_Free(pReadBuf);
247
248         return TRUE;
249 }
250
251 bool DrmTdcDecryptPackage2(const char *pTADCFilepath, T_RO t_RO,
252                                                    const char *pDecryptedFile)
253 {
254         T_FILE_HEADER t_FileHeader;
255         T_DRM_HEADER t_DRMHeader;
256         T_DEVICE_INFO t_DeviceInfo;
257
258         FILE *hFile1 = INVALID_HOBJ; //TDC drm file
259         FILE *hFile2 = INVALID_HOBJ; //Decrypted file
260
261         //2011.03.08, init
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));
265
266         if (!pTADCFilepath || !pDecryptedFile) {
267                 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage2 Error : Parameter Null");
268                 return FALSE;
269         }
270
271         //Set DeviceInfo
272         if (TADC_SetDeviceInfo(&t_DeviceInfo) == TADC_GETDUID_ERROR) {
273                 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage2 Error : TADC_SetDeviceInfo");
274                 return FALSE;
275         }
276
277         auto pReadBuf = (TADC_U8 *)TADC_IF_Malloc(TDC_DECRYPT_IOLEN);
278
279         if (!pReadBuf) {
280                 DRM_TAPPS_EXCEPTION("pReadBuf Malloc Fail");
281                 return FALSE;
282         }
283
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);
290                 return FALSE;
291         }
292
293         //Get CEK
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);
299                 return FALSE;
300         }
301
302         //Decrypt File
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);
309                 return FALSE;
310         }
311
312         //File Create ( Decrypted File )
313         if ((hFile2 = fopen(pDecryptedFile, "w+b")) == INVALID_HOBJ) {
314                 DRM_TAPPS_EXCEPTION("Decrypted File FmOpenFile (%s)", pDecryptedFile);
315                 fclose(hFile1);
316                 TADC_MEMFree_FileHeader(&t_FileHeader);
317                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
318                 TADC_IF_Free(pReadBuf);
319                 return FALSE;
320         }
321
322         fseek(hFile1, 0, SEEK_END);
323         long size1 = ftell(hFile1);
324
325         long offset = static_cast<long>(t_FileHeader.Offset1 + 35 + t_DRMHeader.XmlSize);
326         fseek(hFile1, offset, SEEK_SET);
327
328         if (size1 < offset) {
329                 DRM_TAPPS_EXCEPTION("Invalid offset... offset is bigger than file size");
330                 fclose(hFile1);
331                 fclose(hFile2);
332                 TADC_MEMFree_FileHeader(&t_FileHeader);
333                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
334                 TADC_IF_Free(pReadBuf);
335                 return FALSE;
336         }
337
338         long size2 = size1 - offset; //plain file size
339         long BlockCnt = (size2 / 512) + ((size2 % 512) ? 1 : 0);
340
341         long EncBlockCnt = BlockCnt;
342
343         if (t_DRMHeader.EncryptionRange != -1)
344                 EncBlockCnt = t_DRMHeader.EncryptionRange;
345
346         long int i = 0;
347
348         while (i < BlockCnt) {
349                 auto ReadLen = fread(pReadBuf, 1, TDC_DECRYPT_IOLEN, hFile1);
350
351                 if (ReadLen < 1)
352                         break;
353
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;
358
359                                 if (TADC_DecryptBlock((char *)pReadBuf + k, DecLen, &t_DRMHeader) < 0) {
360                                         DRM_TAPPS_EXCEPTION("TADC_DecryptBlock");
361                                         fclose(hFile1);
362                                         fclose(hFile2);
363                                         TADC_MEMFree_FileHeader(&t_FileHeader);
364                                         TADC_MEMFree_DRMHeader(&t_DRMHeader);
365                                         TADC_IF_Free(pReadBuf);
366                                         return FALSE;
367                                 }
368                         }
369
370                         i += 1;
371                 }
372
373                 fwrite(pReadBuf, 1, ReadLen, hFile2);
374         }
375
376         fclose(hFile1); //sample drm file
377         fclose(hFile2); //plain file
378
379         TADC_MEMFree_FileHeader(&t_FileHeader);
380         TADC_MEMFree_DRMHeader(&t_DRMHeader);
381         TADC_IF_Free(pReadBuf);
382
383         return TRUE;
384 }
385
386 bool DrmTdcGeneratePurchaseRequest(const char *pTADCFilepath, char *pReqBuf,
387                                                                    unsigned int *pReqBufLen, char *pLicenseUrl,
388                                                                    unsigned int *pLicenseUrlLen)
389 {
390         T_FILE_HEADER t_FileHeader;
391         T_DRM_HEADER t_DRMHeader;
392         T_DEVICE_INFO t_DeviceInfo;
393         char ReqLicBuf[REQU_MAXSIZE] = {0, };
394
395         //null check
396         if (!pTADCFilepath
397                         || !pReqBuf
398                         || !pLicenseUrl
399                         || *pReqBufLen < 512
400                         || *pLicenseUrlLen < 512) {
401                 DRM_TAPPS_EXCEPTION("Parameter Null");
402                 return FALSE;
403         }
404
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));
408
409         //Set DeviceInfo
410         if (TADC_SetDeviceInfo(&t_DeviceInfo) == TADC_GETDUID_ERROR) {
411                 DRM_TAPPS_EXCEPTION("TADC_SetDeviceInfo");
412                 return FALSE;
413         }
414
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);
419                 return FALSE;
420         }
421
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);
426                 return FALSE;
427         }
428
429         //Copy pReqBuf
430         size_t tmpLen = strlen((char *)ReqLicBuf);
431
432         if (*pReqBufLen <= tmpLen) {
433                 DRM_TAPPS_EXCEPTION("*pReqBufLen(%d) <= %d", *pReqBufLen, tmpLen);
434                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
435                 return FALSE;
436         }
437
438         memcpy(pReqBuf, ReqLicBuf, tmpLen + 1);
439
440         //Copy License URL
441         tmpLen = strlen((char *)t_DRMHeader.RIURL);
442
443         if (*pLicenseUrlLen <= tmpLen) {
444                 DRM_TAPPS_EXCEPTION("*pLicenseUrlLen(%d) <= %d", *pLicenseUrlLen, tmpLen);
445                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
446                 return FALSE;
447         }
448
449         memcpy(pLicenseUrl, t_DRMHeader.RIURL, tmpLen + 1);
450
451         //Free
452         TADC_MEMFree_FileHeader(&t_FileHeader);
453         TADC_MEMFree_DRMHeader(&t_DRMHeader);
454
455         return TRUE;
456 }
457
458 int DrmTdcGenerateLicenseRequest(const char *pRespBuf, unsigned int respBufLen,
459                                                                  char *pReqBuf, unsigned int *pReqBufLen, char *pLicenseUrl,
460                                                                  unsigned int *pLicenseUrlLen)
461 {
462         T_ROACQ_INFO *pt_ROAcqInfo = NULL;
463
464         char ReqROBuf[REQU_MAXSIZE] = {0}; //Request buff max size. (2011.03.08)
465         BYTE sha1_tmp[DHINFO_REQIDLEN] = {0};
466         int idx = 0;
467         unsigned char ROVer[2]; //2011.03.08
468
469         //null check
470         if (!pRespBuf
471                         || !pReqBuf
472                         || !pLicenseUrl
473                         || respBufLen < 1
474                         || *pReqBufLen < 512
475                         ||  *pLicenseUrlLen < 512) {
476                 DRM_TAPPS_EXCEPTION("Parameter Null");
477                 return TADC_PARAMETER_ERROR;
478         }
479
480         if (g_DrmTdcDHFlag == FALSE) {
481                 DrmTdcDHInfoInit();
482                 g_DrmTdcDHFlag = TRUE;
483         }
484
485         for (idx = 0; idx < DHINFO_MAX; idx++) {
486                 if (!TADC_IF_MemCmp(
487                                         g_DrmTdcDHInfo.hashReqID[idx], sha1_tmp, DHINFO_REQIDLEN)) {
488                         pt_ROAcqInfo = &g_DrmTdcDHInfo.t_ROAcqInfo[idx];
489                         break;
490                 }
491         }
492
493         // Debug
494         DRM_TAPPS_LOG("DrmTdcGenerateLicenseRequest ID Idx = %d", idx);
495
496         if (idx == DHINFO_MAX) {
497                 DRM_TAPPS_EXCEPTION("idx == DHINFO_MAX");
498                 return TADC_DHINFO_MAX_ERROR;
499         }
500
501         //Get ReqID
502         if (TADC_GetROAcqInfo((unsigned char *)pRespBuf, pt_ROAcqInfo) < 0) {
503                 DRM_TAPPS_EXCEPTION("TADC_GetROAcqInfo");
504                 return TADC_GET_ROACQ_INFO_ERROR;
505         }
506
507         ROVer[0] = 2;
508         ROVer[1] = 0;
509
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;
514         }
515
516         // Debug
517         DRM_TAPPS_LOG("Debug Log == Copy ReqID Hash Successfully Done!");
518
519         //Copy ReqID Hash
520         TADC_IF_SHA1(pt_ROAcqInfo -> ReqID,
521                                  TADC_IF_StrLen((char *)pt_ROAcqInfo -> ReqID),
522                                  g_DrmTdcDHInfo.hashReqID[idx]);
523
524         //Copy pReqBuf
525         size_t tmpLen = strlen((char *)ReqROBuf);
526
527         if (*pReqBufLen <= tmpLen) {
528                 DRM_TAPPS_EXCEPTION("*pReqBufLen(%d) <= %d", *pReqBufLen, tmpLen);
529                 return TADC_MEMAlOC_ERROR;
530         }
531
532         memcpy(pReqBuf, ReqROBuf, tmpLen + 1);
533
534         //Copy License URL
535         tmpLen = strlen((char *)pt_ROAcqInfo->ROAcqURL);
536
537         if (*pLicenseUrlLen <= tmpLen) {
538                 DRM_TAPPS_EXCEPTION("*pLicenseUrlLen(%d) <= %d", *pLicenseUrlLen, tmpLen);
539                 return TADC_MEMAlOC_ERROR;
540         }
541
542         memcpy(pLicenseUrl, (char *)pt_ROAcqInfo->ROAcqURL, tmpLen + 1);
543
544         // Debug
545         DRM_TAPPS_LOG("Debug Log == DrmTdcGenerateLicenseRequest Successfully Done!");
546
547         return TADC_SUCCESS;
548 }
549
550 int DrmTdcDecryptLicense(const char *pRespBuf, unsigned int respBufLen,
551                                                  char *pDecLicenseBuf, unsigned int *decLicenseBufLen)
552 {
553         T_ROACQ_INFO *pt_ROAcqInfo = NULL;
554         T_RO t_RO;
555         int ret = 0;
556         int idx = 0;
557         BYTE sha1_tmp[20] = {0};
558
559         //null check
560         if (!pRespBuf
561                         || !pDecLicenseBuf
562                         || respBufLen < 1
563                         || *decLicenseBufLen < 512) {
564                 DRM_TAPPS_EXCEPTION("Parameter Null");
565                 return TADC_PARAMETER_ERROR;
566         }
567
568         memset(&t_RO, 0x00, sizeof(T_RO));
569
570         if (TADC_GetHashReqID((unsigned char *)pRespBuf, sha1_tmp) < 0) {
571                 DRM_TAPPS_EXCEPTION("TADC_GetHashReqID");
572                 return TADC_GET_HASHREQID_ERROR;
573         }
574
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];
578                         break;
579                 }
580         }
581
582         if (idx == DHINFO_MAX) {
583                 DRM_TAPPS_EXCEPTION("idx == DHINFO_MAX!, Session-key is not same.");
584                 return TADC_DHINFO_MAX_ERROR;
585         }
586
587         if (pt_ROAcqInfo == NULL) {
588                 DRM_TAPPS_EXCEPTION("pt_ROAcqInfo is NULL.");
589                 return TADC_DHINFO_MAX_ERROR;
590         }
591
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;
598         }
599
600         *decLicenseBufLen = strlen(pDecLicenseBuf) + 1;
601
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;
606         }
607
608         //2011.03.08, return time stamp
609         memcpy(g_sTimeStamp, pt_ROAcqInfo->sTimeStamp,
610                    strlen((char *)pt_ROAcqInfo->sTimeStamp) + 1);
611
612         //Free
613         TADC_MEMFree_RO(&t_RO);
614         DrmTdcDHInfoFree(idx);
615
616         return TADC_SUCCESS;
617 }
618
619 void DrmTdcDHInfoInit(void)
620 {
621         memset(&g_DrmTdcDHInfo, 0x00, sizeof(DrmTdcDHInfo));
622 }
623
624 bool DrmTdcDHInfoFree(int idx)
625 {
626         memset(&g_DrmTdcDHInfo.hashReqID[idx], 0x00,
627                    sizeof(g_DrmTdcDHInfo.hashReqID[idx]));
628
629         if (TADC_MEMFree_ROAcqInfo(&g_DrmTdcDHInfo.t_ROAcqInfo[idx]) < 0)
630                 return FALSE;
631
632         return TRUE;
633 }