Fix coding style according to tizen rule
[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         auto size1 = ftell(hFile1);
186
187         auto offset = t_FileHeader.Offset1 + 35 + t_DRMHeader.XmlSize;
188         fseek(hFile1, offset, SEEK_SET);
189
190         auto size2 = size1 - offset; //plain file size
191         auto BlockCnt = (size2 / 512) + ((size2 % 512) ? 1 : 0);
192
193         auto EncBlockCnt = BlockCnt;
194
195         if (t_DRMHeader.EncryptionRange != -1)
196                 EncBlockCnt = t_DRMHeader.EncryptionRange;
197
198         long int i = 0;
199
200         while (i < BlockCnt) {
201                 size_t ReadLen = fread(pReadBuf, 1, TDC_DECRYPT_IOLEN, hFile1);
202
203                 if (ReadLen < 1)
204                         break;
205
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;
210
211                                 if (TADC_DecryptBlock((char *)pReadBuf + k, DecLen, &t_DRMHeader) < 0) {
212                                         DRM_TAPPS_EXCEPTION("TADC_DecryptBlock");
213                                         fclose(hFile1);
214                                         fclose(hFile2);
215                                         TADC_MEMFree_FileHeader(&t_FileHeader);
216                                         TADC_MEMFree_DRMHeader(&t_DRMHeader);
217                                         TADC_MEMFree_RO(&t_RO);
218                                         TADC_IF_Free(pReadBuf);
219                                         return FALSE;
220                                 }
221                         }
222
223                         i += 1;
224                 }
225
226                 fwrite(pReadBuf, 1, ReadLen, hFile2);
227         }
228
229         fclose(hFile1); //sample drm file
230         fclose(hFile2); //plain file
231
232         TADC_MEMFree_FileHeader(&t_FileHeader);
233         TADC_MEMFree_DRMHeader(&t_DRMHeader);
234         TADC_MEMFree_RO(&t_RO);
235         TADC_IF_Free(pReadBuf);
236
237         return TRUE;
238 }
239
240 bool DrmTdcDecryptPackage2(const char *pTADCFilepath, T_RO t_RO,
241                                                    const char *pDecryptedFile)
242 {
243         T_FILE_HEADER t_FileHeader;
244         T_DRM_HEADER t_DRMHeader;
245         T_DEVICE_INFO t_DeviceInfo;
246
247         FILE *hFile1 = INVALID_HOBJ; //TDC drm file
248         FILE *hFile2 = INVALID_HOBJ; //Decrypted file
249
250         //2011.03.08, init
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));
254
255         if (!pTADCFilepath || !pDecryptedFile) {
256                 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage2 Error : Parameter Null");
257                 return FALSE;
258         }
259
260         //Set DeviceInfo
261         if (TADC_SetDeviceInfo(&t_DeviceInfo) == TADC_GETDUID_ERROR) {
262                 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage2 Error : TADC_SetDeviceInfo");
263                 return FALSE;
264         }
265
266         auto pReadBuf = (TADC_U8 *)TADC_IF_Malloc(TDC_DECRYPT_IOLEN);
267
268         if (!pReadBuf) {
269                 DRM_TAPPS_EXCEPTION("pReadBuf Malloc Fail");
270                 return FALSE;
271         }
272
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);
279                 return FALSE;
280         }
281
282         //Get CEK
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);
288                 return FALSE;
289         }
290
291         //Decrypt File
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);
298                 return FALSE;
299         }
300
301         //File Create ( Decrypted File )
302         if ((hFile2 = fopen(pDecryptedFile, "w+b")) == INVALID_HOBJ) {
303                 DRM_TAPPS_EXCEPTION("Decrypted File FmOpenFile (%s)", pDecryptedFile);
304                 fclose(hFile1);
305                 TADC_MEMFree_FileHeader(&t_FileHeader);
306                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
307                 TADC_IF_Free(pReadBuf);
308                 return FALSE;
309         }
310
311         fseek(hFile1, 0, SEEK_END);
312         auto size1 = ftell(hFile1);
313
314         auto offset = t_FileHeader.Offset1 + 35 + t_DRMHeader.XmlSize;
315         fseek(hFile1, offset, SEEK_SET);
316
317         auto size2 = size1 - offset; //plain file size
318         auto BlockCnt = (size2 / 512) + ((size2 % 512) ? 1 : 0);
319
320         auto EncBlockCnt = BlockCnt;
321
322         if (t_DRMHeader.EncryptionRange != -1)
323                 EncBlockCnt = t_DRMHeader.EncryptionRange;
324
325         long int i = 0;
326
327         while (i < BlockCnt) {
328                 auto ReadLen = fread(pReadBuf, 1, TDC_DECRYPT_IOLEN, hFile1);
329
330                 if (ReadLen < 1)
331                         break;
332
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;
337
338                                 if (TADC_DecryptBlock((char *)pReadBuf + k, DecLen, &t_DRMHeader) < 0) {
339                                         DRM_TAPPS_EXCEPTION("TADC_DecryptBlock");
340                                         fclose(hFile1);
341                                         fclose(hFile2);
342                                         TADC_MEMFree_FileHeader(&t_FileHeader);
343                                         TADC_MEMFree_DRMHeader(&t_DRMHeader);
344                                         TADC_IF_Free(pReadBuf);
345                                         return FALSE;
346                                 }
347                         }
348
349                         i += 1;
350                 }
351
352                 fwrite(pReadBuf, 1, ReadLen, hFile2);
353         }
354
355         fclose(hFile1); //sample drm file
356         fclose(hFile2); //plain file
357
358         TADC_MEMFree_FileHeader(&t_FileHeader);
359         TADC_MEMFree_DRMHeader(&t_DRMHeader);
360         TADC_IF_Free(pReadBuf);
361
362         return TRUE;
363 }
364
365 bool DrmTdcGeneratePurchaseRequest(const char *pTADCFilepath, char *pReqBuf,
366                                                                    unsigned int *pReqBufLen, char *pLicenseUrl,
367                                                                    unsigned int *pLicenseUrlLen)
368 {
369         T_FILE_HEADER t_FileHeader;
370         T_DRM_HEADER t_DRMHeader;
371         T_DEVICE_INFO t_DeviceInfo;
372         char ReqLicBuf[REQU_MAXSIZE] = {0, };
373
374         //null check
375         if (!pTADCFilepath
376                         || !pReqBuf
377                         || !pLicenseUrl
378                         || *pReqBufLen < 512
379                         || *pLicenseUrlLen < 512) {
380                 DRM_TAPPS_EXCEPTION("Parameter Null");
381                 return FALSE;
382         }
383
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));
387
388         //Set DeviceInfo
389         if (TADC_SetDeviceInfo(&t_DeviceInfo) == TADC_GETDUID_ERROR) {
390                 DRM_TAPPS_EXCEPTION("TADC_SetDeviceInfo");
391                 return FALSE;
392         }
393
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);
398                 return FALSE;
399         }
400
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);
405                 return FALSE;
406         }
407
408         //Copy pReqBuf
409         size_t tmpLen = strlen((char *)ReqLicBuf);
410
411         if (*pReqBufLen <= tmpLen) {
412                 DRM_TAPPS_EXCEPTION("*pReqBufLen(%d) <= %d", *pReqBufLen, tmpLen);
413                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
414                 return FALSE;
415         }
416
417         memcpy(pReqBuf, ReqLicBuf, tmpLen + 1);
418
419         //Copy License URL
420         tmpLen = strlen((char *)t_DRMHeader.RIURL);
421
422         if (*pLicenseUrlLen <= tmpLen) {
423                 DRM_TAPPS_EXCEPTION("*pLicenseUrlLen(%d) <= %d", *pLicenseUrlLen, tmpLen);
424                 TADC_MEMFree_DRMHeader(&t_DRMHeader);
425                 return FALSE;
426         }
427
428         memcpy(pLicenseUrl, t_DRMHeader.RIURL, tmpLen + 1);
429
430         //Free
431         TADC_MEMFree_FileHeader(&t_FileHeader);
432         TADC_MEMFree_DRMHeader(&t_DRMHeader);
433
434         return TRUE;
435 }
436
437 int DrmTdcGenerateLicenseRequest(const char *pRespBuf, unsigned int respBufLen,
438                                                                  char *pReqBuf, unsigned int *pReqBufLen, char *pLicenseUrl,
439                                                                  unsigned int *pLicenseUrlLen)
440 {
441         T_ROACQ_INFO *pt_ROAcqInfo = NULL;
442
443         char ReqROBuf[REQU_MAXSIZE] = {0}; //Request buff max size. (2011.03.08)
444         BYTE sha1_tmp[DHINFO_REQIDLEN] = {0};
445         int idx = 0;
446         unsigned char ROVer[2]; //2011.03.08
447
448         //null check
449         if (!pRespBuf
450                         || !pReqBuf
451                         || !pLicenseUrl
452                         || respBufLen < 1
453                         || *pReqBufLen < 512
454                         ||  *pLicenseUrlLen < 512) {
455                 DRM_TAPPS_EXCEPTION("Parameter Null");
456                 return TADC_PARAMETER_ERROR;
457         }
458
459         if (g_DrmTdcDHFlag == FALSE) {
460                 DrmTdcDHInfoInit();
461                 g_DrmTdcDHFlag = TRUE;
462         }
463
464         for (idx = 0; idx < DHINFO_MAX; idx++) {
465                 if (!TADC_IF_MemCmp(
466                                         g_DrmTdcDHInfo.hashReqID[idx], sha1_tmp, DHINFO_REQIDLEN)) {
467                         pt_ROAcqInfo = &g_DrmTdcDHInfo.t_ROAcqInfo[idx];
468                         break;
469                 }
470         }
471
472         // Debug
473         DRM_TAPPS_LOG("DrmTdcGenerateLicenseRequest ID Idx = %d", idx);
474
475         if (idx == DHINFO_MAX) {
476                 DRM_TAPPS_EXCEPTION("idx == DHINFO_MAX");
477                 return TADC_DHINFO_MAX_ERROR;
478         }
479
480         //Get ReqID
481         if (TADC_GetROAcqInfo((unsigned char *)pRespBuf, pt_ROAcqInfo) < 0) {
482                 DRM_TAPPS_EXCEPTION("TADC_GetROAcqInfo");
483                 return TADC_GET_ROACQ_INFO_ERROR;
484         }
485
486         ROVer[0] = 2;
487         ROVer[1] = 0;
488
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;
493         }
494
495         // Debug
496         DRM_TAPPS_LOG("Debug Log == Copy ReqID Hash Successfully Done!");
497
498         //Copy ReqID Hash
499         TADC_IF_SHA1(pt_ROAcqInfo -> ReqID,
500                                  TADC_IF_StrLen((char *)pt_ROAcqInfo -> ReqID),
501                                  g_DrmTdcDHInfo.hashReqID[idx]);
502
503         //Copy pReqBuf
504         size_t tmpLen = strlen((char *)ReqROBuf);
505
506         if (*pReqBufLen <= tmpLen) {
507                 DRM_TAPPS_EXCEPTION("*pReqBufLen(%d) <= %d", *pReqBufLen, tmpLen);
508                 return TADC_MEMAlOC_ERROR;
509         }
510
511         memcpy(pReqBuf, ReqROBuf, tmpLen + 1);
512
513         //Copy License URL
514         tmpLen = strlen((char *)pt_ROAcqInfo->ROAcqURL);
515
516         if (*pLicenseUrlLen <= tmpLen) {
517                 DRM_TAPPS_EXCEPTION("*pLicenseUrlLen(%d) <= %d", *pLicenseUrlLen, tmpLen);
518                 return TADC_MEMAlOC_ERROR;
519         }
520
521         memcpy(pLicenseUrl, (char *)pt_ROAcqInfo->ROAcqURL, tmpLen + 1);
522
523         // Debug
524         DRM_TAPPS_LOG("Debug Log == DrmTdcGenerateLicenseRequest Successfully Done!");
525
526         return TADC_SUCCESS;
527 }
528
529 int DrmTdcDecryptLicense(const char *pRespBuf, unsigned int respBufLen,
530                                                  char *pDecLicenseBuf, unsigned int *decLicenseBufLen)
531 {
532         T_ROACQ_INFO *pt_ROAcqInfo = NULL;
533         T_RO t_RO;
534         int ret = 0;
535         int idx = 0;
536         BYTE sha1_tmp[20] = {0};
537
538         //null check
539         if (!pRespBuf
540                         || !pDecLicenseBuf
541                         || respBufLen < 1
542                         || *decLicenseBufLen < 512) {
543                 DRM_TAPPS_EXCEPTION("Parameter Null");
544                 return TADC_PARAMETER_ERROR;
545         }
546
547         memset(&t_RO, 0x00, sizeof(T_RO));
548
549         if (TADC_GetHashReqID((unsigned char *)pRespBuf, sha1_tmp) < 0) {
550                 DRM_TAPPS_EXCEPTION("TADC_GetHashReqID");
551                 return TADC_GET_HASHREQID_ERROR;
552         }
553
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];
557                         break;
558                 }
559         }
560
561         if (idx == DHINFO_MAX) {
562                 DRM_TAPPS_EXCEPTION("idx == DHINFO_MAX!, Session-key is not same.");
563                 return TADC_DHINFO_MAX_ERROR;
564         }
565
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;
572         }
573
574         *decLicenseBufLen = strlen(pDecLicenseBuf) + 1;
575
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;
580         }
581
582         //2011.03.08, return time stamp
583         memcpy(g_sTimeStamp, pt_ROAcqInfo->sTimeStamp,
584                    strlen((char *)pt_ROAcqInfo->sTimeStamp) + 1);
585
586         //Free
587         TADC_MEMFree_RO(&t_RO);
588         DrmTdcDHInfoFree(idx);
589
590         return TADC_SUCCESS;
591 }
592
593 void DrmTdcDHInfoInit(void)
594 {
595         memset(&g_DrmTdcDHInfo, 0x00, sizeof(DrmTdcDHInfo));
596 }
597
598 bool DrmTdcDHInfoFree(int idx)
599 {
600         memset(&g_DrmTdcDHInfo.hashReqID[idx], 0x00,
601                    sizeof(g_DrmTdcDHInfo.hashReqID[idx]));
602
603         if (TADC_MEMFree_ROAcqInfo(&g_DrmTdcDHInfo.t_ROAcqInfo[idx]) < 0)
604                 return FALSE;
605
606         return TRUE;
607 }