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 if (fseek(hFile1, 0, SEEK_END) != 0) {
185 DRM_TAPPS_EXCEPTION("fseek failed");
188 TADC_MEMFree_FileHeader(&t_FileHeader);
189 TADC_MEMFree_DRMHeader(&t_DRMHeader);
190 TADC_MEMFree_RO(&t_RO);
191 TADC_IF_Free(pReadBuf);
194 long size1 = ftell(hFile1);
196 long offset = static_cast<long>(t_FileHeader.Offset1 + 35 + t_DRMHeader.XmlSize);
197 if (fseek(hFile1, offset, SEEK_SET) != 0) {
198 DRM_TAPPS_EXCEPTION("fseek failed");
201 TADC_MEMFree_FileHeader(&t_FileHeader);
202 TADC_MEMFree_DRMHeader(&t_DRMHeader);
203 TADC_MEMFree_RO(&t_RO);
204 TADC_IF_Free(pReadBuf);
208 if (size1 < offset) {
209 DRM_TAPPS_EXCEPTION("Invalid offset... offset is bigger than file size");
212 TADC_MEMFree_FileHeader(&t_FileHeader);
213 TADC_MEMFree_DRMHeader(&t_DRMHeader);
214 TADC_MEMFree_RO(&t_RO);
215 TADC_IF_Free(pReadBuf);
219 long size2 = size1 - offset; //plain file size
220 long BlockCnt = (size2 / 512) + ((size2 % 512) ? 1 : 0);
222 long EncBlockCnt = BlockCnt;
224 if (t_DRMHeader.EncryptionRange != -1)
225 EncBlockCnt = t_DRMHeader.EncryptionRange;
229 while (i < BlockCnt) {
230 size_t ReadLen = fread(pReadBuf, 1, TDC_DECRYPT_IOLEN, hFile1);
235 for (size_t k = 0; k < ReadLen; k += 512) {
236 if (i < EncBlockCnt) {
237 size_t DecLen = ReadLen - k;
238 DecLen = (DecLen > 512) ? 512 : DecLen;
240 if (TADC_DecryptBlock((char *)pReadBuf + k, DecLen, &t_DRMHeader) < 0) {
241 DRM_TAPPS_EXCEPTION("TADC_DecryptBlock");
244 TADC_MEMFree_FileHeader(&t_FileHeader);
245 TADC_MEMFree_DRMHeader(&t_DRMHeader);
246 TADC_MEMFree_RO(&t_RO);
247 TADC_IF_Free(pReadBuf);
255 fwrite(pReadBuf, 1, ReadLen, hFile2);
258 fclose(hFile1); //sample drm file
259 fclose(hFile2); //plain file
261 TADC_MEMFree_FileHeader(&t_FileHeader);
262 TADC_MEMFree_DRMHeader(&t_DRMHeader);
263 TADC_MEMFree_RO(&t_RO);
264 TADC_IF_Free(pReadBuf);
269 bool DrmTdcDecryptPackage2(const char *pTADCFilepath, T_RO t_RO,
270 const char *pDecryptedFile)
272 T_FILE_HEADER t_FileHeader;
273 T_DRM_HEADER t_DRMHeader;
274 T_DEVICE_INFO t_DeviceInfo;
276 FILE *hFile1 = INVALID_HOBJ; //TDC drm file
277 FILE *hFile2 = INVALID_HOBJ; //Decrypted file
280 memset(&t_FileHeader, 0x00, sizeof(T_FILE_HEADER));
281 memset(&t_DRMHeader, 0x00, sizeof(T_DRM_HEADER));
282 memset(&t_DeviceInfo, 0x00, sizeof(T_DEVICE_INFO));
284 if (!pTADCFilepath || !pDecryptedFile) {
285 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage2 Error : Parameter Null");
290 if (TADC_SetDeviceInfo(&t_DeviceInfo) == TADC_GETDUID_ERROR) {
291 DRM_TAPPS_EXCEPTION("DrmTdcDecryptPackage2 Error : TADC_SetDeviceInfo");
295 auto pReadBuf = (TADC_U8 *)TADC_IF_Malloc(TDC_DECRYPT_IOLEN);
298 DRM_TAPPS_EXCEPTION("pReadBuf Malloc Fail");
302 //Get DRM Header Info
303 if (TADC_GetDRMHeaderFromFile(pTADCFilepath, &t_FileHeader, &t_DRMHeader) < 0) {
304 DRM_TAPPS_EXCEPTION("TADC_GetDRMHeaderFromFile");
305 TADC_MEMFree_FileHeader(&t_FileHeader);
306 TADC_MEMFree_DRMHeader(&t_DRMHeader);
307 TADC_IF_Free(pReadBuf);
312 if (TADC_GetCEK(&t_DeviceInfo, &t_RO, &t_DRMHeader) < 0) {
313 DRM_TAPPS_EXCEPTION("TADC_GetCEK");
314 TADC_MEMFree_FileHeader(&t_FileHeader);
315 TADC_MEMFree_DRMHeader(&t_DRMHeader);
316 TADC_IF_Free(pReadBuf);
321 //File Open ( DRM File )
322 if ((hFile1 = fopen(pTADCFilepath, "rb")) == INVALID_HOBJ) {
323 DRM_TAPPS_EXCEPTION("DRM FmOpenFile (%s)", pTADCFilepath);
324 TADC_MEMFree_FileHeader(&t_FileHeader);
325 TADC_MEMFree_DRMHeader(&t_DRMHeader);
326 TADC_IF_Free(pReadBuf);
330 //File Create ( Decrypted File )
331 if ((hFile2 = fopen(pDecryptedFile, "w+b")) == INVALID_HOBJ) {
332 DRM_TAPPS_EXCEPTION("Decrypted File FmOpenFile (%s)", pDecryptedFile);
334 TADC_MEMFree_FileHeader(&t_FileHeader);
335 TADC_MEMFree_DRMHeader(&t_DRMHeader);
336 TADC_IF_Free(pReadBuf);
340 if (fseek(hFile1, 0, SEEK_END) != 0) {
341 DRM_TAPPS_EXCEPTION("fseek failed");
344 TADC_MEMFree_FileHeader(&t_FileHeader);
345 TADC_MEMFree_DRMHeader(&t_DRMHeader);
346 TADC_IF_Free(pReadBuf);
349 long size1 = ftell(hFile1);
351 long offset = static_cast<long>(t_FileHeader.Offset1 + 35 + t_DRMHeader.XmlSize);
352 if (fseek(hFile1, offset, SEEK_SET) != 0) {
353 DRM_TAPPS_EXCEPTION("fseek failed");
356 TADC_MEMFree_FileHeader(&t_FileHeader);
357 TADC_MEMFree_DRMHeader(&t_DRMHeader);
358 TADC_IF_Free(pReadBuf);
362 if (size1 < offset) {
363 DRM_TAPPS_EXCEPTION("Invalid offset... offset is bigger than file size");
366 TADC_MEMFree_FileHeader(&t_FileHeader);
367 TADC_MEMFree_DRMHeader(&t_DRMHeader);
368 TADC_IF_Free(pReadBuf);
372 long size2 = size1 - offset; //plain file size
373 long BlockCnt = (size2 / 512) + ((size2 % 512) ? 1 : 0);
375 long EncBlockCnt = BlockCnt;
377 if (t_DRMHeader.EncryptionRange != -1)
378 EncBlockCnt = t_DRMHeader.EncryptionRange;
382 while (i < BlockCnt) {
383 auto ReadLen = fread(pReadBuf, 1, TDC_DECRYPT_IOLEN, hFile1);
388 for (size_t k = 0; k < ReadLen; k += 512) {
389 if (i < EncBlockCnt) {
390 auto DecLen = ReadLen - k;
391 DecLen = (DecLen > 512) ? 512 : DecLen;
393 if (TADC_DecryptBlock((char *)pReadBuf + k, DecLen, &t_DRMHeader) < 0) {
394 DRM_TAPPS_EXCEPTION("TADC_DecryptBlock");
397 TADC_MEMFree_FileHeader(&t_FileHeader);
398 TADC_MEMFree_DRMHeader(&t_DRMHeader);
399 TADC_IF_Free(pReadBuf);
407 fwrite(pReadBuf, 1, ReadLen, hFile2);
410 fclose(hFile1); //sample drm file
411 fclose(hFile2); //plain file
413 TADC_MEMFree_FileHeader(&t_FileHeader);
414 TADC_MEMFree_DRMHeader(&t_DRMHeader);
415 TADC_IF_Free(pReadBuf);
420 bool DrmTdcGeneratePurchaseRequest(const char *pTADCFilepath, char *pReqBuf,
421 unsigned int *pReqBufLen, char *pLicenseUrl,
422 unsigned int *pLicenseUrlLen)
424 T_FILE_HEADER t_FileHeader;
425 T_DRM_HEADER t_DRMHeader;
426 T_DEVICE_INFO t_DeviceInfo;
427 char ReqLicBuf[REQU_MAXSIZE] = {0, };
434 || *pLicenseUrlLen < 512) {
435 DRM_TAPPS_EXCEPTION("Parameter Null");
439 memset(&t_FileHeader, 0x00, sizeof(T_FILE_HEADER));
440 memset(&t_DRMHeader, 0x00, sizeof(T_DRM_HEADER));
441 memset(&t_DeviceInfo, 0x00, sizeof(T_DEVICE_INFO));
444 if (TADC_SetDeviceInfo(&t_DeviceInfo) == TADC_GETDUID_ERROR) {
445 DRM_TAPPS_EXCEPTION("TADC_SetDeviceInfo");
449 //Get DRM Header Info
450 if (TADC_GetDRMHeaderFromFile(pTADCFilepath, &t_FileHeader, &t_DRMHeader) < 0) {
451 DRM_TAPPS_EXCEPTION("TADC_GetDRMHeaderFromFile");
452 TADC_MEMFree_DRMHeader(&t_DRMHeader);
456 if (TADC_MakeRequestLicense(&t_DeviceInfo, &t_FileHeader, &t_DRMHeader,
457 (unsigned char *)ReqLicBuf, sizeof(ReqLicBuf)) < 0) {
458 DRM_TAPPS_EXCEPTION("TADC_MakeRequestLicense");
459 TADC_MEMFree_DRMHeader(&t_DRMHeader);
464 size_t tmpLen = strlen((char *)ReqLicBuf);
466 if (*pReqBufLen <= tmpLen) {
467 DRM_TAPPS_EXCEPTION("*pReqBufLen(%d) <= %d", *pReqBufLen, tmpLen);
468 TADC_MEMFree_DRMHeader(&t_DRMHeader);
472 memcpy(pReqBuf, ReqLicBuf, tmpLen + 1);
475 tmpLen = strlen((char *)t_DRMHeader.RIURL);
477 if (*pLicenseUrlLen <= tmpLen) {
478 DRM_TAPPS_EXCEPTION("*pLicenseUrlLen(%d) <= %d", *pLicenseUrlLen, tmpLen);
479 TADC_MEMFree_DRMHeader(&t_DRMHeader);
483 memcpy(pLicenseUrl, t_DRMHeader.RIURL, tmpLen + 1);
486 TADC_MEMFree_FileHeader(&t_FileHeader);
487 TADC_MEMFree_DRMHeader(&t_DRMHeader);
492 int DrmTdcGenerateLicenseRequest(const char *pRespBuf, unsigned int respBufLen,
493 char *pReqBuf, unsigned int *pReqBufLen, char *pLicenseUrl,
494 unsigned int *pLicenseUrlLen)
496 T_ROACQ_INFO *pt_ROAcqInfo = NULL;
498 char ReqROBuf[REQU_MAXSIZE] = {0}; //Request buff max size. (2011.03.08)
499 BYTE sha1_tmp[DHINFO_REQIDLEN] = {0};
501 unsigned char ROVer[2]; //2011.03.08
509 || *pLicenseUrlLen < 512) {
510 DRM_TAPPS_EXCEPTION("Parameter Null");
511 return TADC_PARAMETER_ERROR;
514 if (g_DrmTdcDHFlag == FALSE) {
516 g_DrmTdcDHFlag = TRUE;
519 for (idx = 0; idx < DHINFO_MAX; idx++) {
521 g_DrmTdcDHInfo.hashReqID[idx], sha1_tmp, DHINFO_REQIDLEN)) {
522 pt_ROAcqInfo = &g_DrmTdcDHInfo.t_ROAcqInfo[idx];
528 DRM_TAPPS_LOG("DrmTdcGenerateLicenseRequest ID Idx = %d", idx);
530 if (idx == DHINFO_MAX) {
531 DRM_TAPPS_EXCEPTION("idx == DHINFO_MAX");
532 return TADC_DHINFO_MAX_ERROR;
536 if (TADC_GetROAcqInfo((unsigned char *)pRespBuf, pt_ROAcqInfo) < 0) {
537 DRM_TAPPS_EXCEPTION("TADC_GetROAcqInfo");
538 return TADC_GET_ROACQ_INFO_ERROR;
544 if (TADC_MakeRequestRO(pt_ROAcqInfo, (unsigned char *)ReqROBuf,
545 sizeof(ReqROBuf), ROVer) < 0) {
546 DRM_TAPPS_EXCEPTION("TADC_MakeRequestRO");
547 return TADC_MAKE_LICENSEREQ_ERROR;
551 DRM_TAPPS_LOG("Debug Log == Copy ReqID Hash Successfully Done!");
554 TADC_IF_SHA1(pt_ROAcqInfo -> ReqID,
555 TADC_IF_StrLen((char *)pt_ROAcqInfo -> ReqID),
556 g_DrmTdcDHInfo.hashReqID[idx]);
559 size_t tmpLen = strlen((char *)ReqROBuf);
561 if (*pReqBufLen <= tmpLen) {
562 DRM_TAPPS_EXCEPTION("*pReqBufLen(%d) <= %d", *pReqBufLen, tmpLen);
563 return TADC_MEMAlOC_ERROR;
566 memcpy(pReqBuf, ReqROBuf, tmpLen + 1);
569 tmpLen = strlen((char *)pt_ROAcqInfo->ROAcqURL);
571 if (*pLicenseUrlLen <= tmpLen) {
572 DRM_TAPPS_EXCEPTION("*pLicenseUrlLen(%d) <= %d", *pLicenseUrlLen, tmpLen);
573 return TADC_MEMAlOC_ERROR;
576 memcpy(pLicenseUrl, (char *)pt_ROAcqInfo->ROAcqURL, tmpLen + 1);
579 DRM_TAPPS_LOG("Debug Log == DrmTdcGenerateLicenseRequest Successfully Done!");
584 int DrmTdcDecryptLicense(const char *pRespBuf, unsigned int respBufLen,
585 char *pDecLicenseBuf, unsigned int *decLicenseBufLen)
587 T_ROACQ_INFO *pt_ROAcqInfo = NULL;
591 BYTE sha1_tmp[20] = {0};
597 || *decLicenseBufLen < 512) {
598 DRM_TAPPS_EXCEPTION("Parameter Null");
599 return TADC_PARAMETER_ERROR;
602 memset(&t_RO, 0x00, sizeof(T_RO));
604 if (TADC_GetHashReqID((unsigned char *)pRespBuf, sha1_tmp) < 0) {
605 DRM_TAPPS_EXCEPTION("TADC_GetHashReqID");
606 return TADC_GET_HASHREQID_ERROR;
609 for (idx = 0; idx < DHINFO_MAX; idx++) {
610 if (!TADC_IF_MemCmp(g_DrmTdcDHInfo.hashReqID[idx], sha1_tmp, 20)) {
611 pt_ROAcqInfo = &g_DrmTdcDHInfo.t_ROAcqInfo[idx];
616 if (idx == DHINFO_MAX) {
617 DRM_TAPPS_EXCEPTION("idx == DHINFO_MAX!, Session-key is not same.");
618 return TADC_DHINFO_MAX_ERROR;
621 if (pt_ROAcqInfo == NULL) {
622 DRM_TAPPS_EXCEPTION("pt_ROAcqInfo is NULL.");
623 return TADC_DHINFO_MAX_ERROR;
626 //Get Decrypted License
627 if ((ret = TADC_GetResponseRO((unsigned char *)pRespBuf, pt_ROAcqInfo, &t_RO,
628 (unsigned char *)pDecLicenseBuf)) < 0) {
629 DrmTdcDHInfoFree(idx); //2010.02.26
630 DRM_TAPPS_EXCEPTION("TADC_GetResponseRO! Ret[%x]", ret);
631 return TADC_GET_RORES_INFO_ERROR;
634 *decLicenseBufLen = strlen(pDecLicenseBuf) + 1;
636 // Check Signature and Certificate Chain
637 if ((ret = TADC_VerifyROSignature((unsigned char *)pDecLicenseBuf))) {
638 DRM_TAPPS_EXCEPTION("TADC_VerifyROSignature Error Code = %x", ret);
639 return TADC_RO_SIGNATURE_ERROR;
642 //2011.03.08, return time stamp
643 memcpy(g_sTimeStamp, pt_ROAcqInfo->sTimeStamp,
644 strlen((char *)pt_ROAcqInfo->sTimeStamp) + 1);
647 TADC_MEMFree_RO(&t_RO);
648 DrmTdcDHInfoFree(idx);
653 void DrmTdcDHInfoInit(void)
655 memset(&g_DrmTdcDHInfo, 0x00, sizeof(DrmTdcDHInfo));
658 bool DrmTdcDHInfoFree(int idx)
660 memset(&g_DrmTdcDHInfo.hashReqID[idx], 0x00,
661 sizeof(g_DrmTdcDHInfo.hashReqID[idx]));
663 if (TADC_MEMFree_ROAcqInfo(&g_DrmTdcDHInfo.t_ROAcqInfo[idx]) < 0)