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.
19 * @brief This file includes implementations of the Tizen Apps DRM Core APIs.
22 #include "drm-tizen-error.h"
23 #include "TADC_Util.h"
26 #include "TADC_ErrorCode.h"
28 static BYTE g_baSignatureKey[32] = {
29 0x29, 0x2b, 0xf2, 0x29, 0x1f, 0x8b, 0x47, 0x81, 0x95, 0x0a, 0x84, 0xf8, 0x91, 0xda, 0x07, 0xd0,
30 0x9c, 0xde, 0x32, 0x3e, 0x9e, 0x46, 0x4a, 0xfc, 0xa4, 0xcc, 0x55, 0x6e, 0xf2, 0x81, 0x61, 0xdb
33 static BYTE g_baAESKey[32] = {
34 0xf8, 0x87, 0x0a, 0xc5, 0xd3, 0x6d, 0x44, 0x49, 0x03, 0x9f, 0xbd, 0x1e, 0xa8, 0x2f, 0xf6, 0xc3,
35 0xdf, 0x3b, 0x02, 0x13, 0x58, 0x1b, 0x12, 0x30, 0x1c, 0xd7, 0xad, 0xa5, 0x1f, 0x5d, 0x01, 0x33
39 static DWORD g_TADCErrorCode = 0;
41 int TADC_SetDeviceInfo(T_DEVICE_INFO *t_DeviceInfo)
45 TADC_IF_MemSet(t_DeviceInfo, 0, sizeof(T_DEVICE_INFO));
48 nResult = TADC_IF_GetDUID((CHAR*)t_DeviceInfo->DUID);
49 IF_ERROR_RETURN(nResult, TADC_GETDUID_ERROR);
54 int TADC_MakeRequestLicense(T_DEVICE_INFO *t_DeviceInfo,
55 T_FILE_HEADER *t_FileHeader,
56 T_DRM_HEADER *t_DRMHeader,
57 unsigned char * outBuffer,
64 IF_TRUE_RETURN(outBuffer == NULL, TADC_PARAMETER_ERROR);
69 "<?xml version='1.0'?>\n<request>\n<DeviceInfo>\n<duid>%s</duid>\n</DeviceInfo>\n",
71 length = TADC_IF_StrLen((char*)outBuffer);
72 IF_TRUE_RETURN(length <= 0, TADC_XMLPARSER_ERROR);
75 IF_TRUE_RETURN(t_DRMHeader->SID == NULL, TADC_SID_NULL_ERROR);
76 IF_TRUE_RETURN(t_DRMHeader->CID == NULL, TADC_CID_NULL_ERROR);
79 (char*)outBuffer + length,
80 outBufferSize - length,
81 "<ContentInfo>\n<DRMType>%d</DRMType>\n<sid>%s</sid>\n<cid>%s</cid>\n</ContentInfo>\n</request>",
82 t_FileHeader->DRMType,
85 length = TADC_IF_StrLen((char*)outBuffer);
86 IF_TRUE_RETURN(length <= 0, TADC_XMLPARSER_ERROR);
88 DRM_TAPPS_LOG("TADC_MakeRequestLicense Success!\n");
93 int TADC_GetROAcqInfo(unsigned char * inBuffer, T_ROACQ_INFO *t_ROAcqInfo)
101 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
102 nSize = TADC_IF_StrLen((char*) inBuffer);
103 IF_TRUE_RETURN( nSize<=40 || nSize>RESP_MAXSIZE, TADC_PARAMETER_ERROR);
105 //Check XML Result Code ( Success result='0' )
107 for (i = 0 ; i < nSize ; i++)
109 if (!TADC_IF_MemCmp((char*)(inBuffer+i), "<response result=", 17))
112 if ((!memcmp((char*)(inBuffer+i), "'0'", 3)) || (!memcmp((char*)(inBuffer+i), "\"0\"", 3)))
123 IF_TRUE_RETURN(((i == nSize) || (nResult < 0)), TADC_RESPONSEMESSAGE_ERROR);
127 TADC_IF_MemSet(t_ROAcqInfo, 0, sizeof(T_ROACQ_INFO));
132 for (i = 0 ; i < nSize ; i++)
134 if (!TADC_IF_MemCmp((char*)(inBuffer + i), "<riurl>", 7))
137 for (j = i ; j < nSize ; j++)
139 if (!TADC_IF_MemCmp((char*)(inBuffer + j), "</riurl>", 8))
142 IF_TRUE_RETURN(length <= 0, TADC_PARAMETER_ERROR);
143 t_ROAcqInfo->ROAcqURL = (TADC_U8*)TADC_IF_Malloc(length + 1);
144 IF_TRUE_RETURN(t_ROAcqInfo->ROAcqURL == NULL, TADC_MEMAlOC_ERROR);
145 TADC_IF_MemSet(t_ROAcqInfo->ROAcqURL, 0, length + 1);
146 TADC_IF_MemCpy(t_ROAcqInfo->ROAcqURL, inBuffer + i, length);
153 IF_TRUE_RETURN(length <= 0, TADC_RESPONSEMESSAGE_ERROR);
158 for (i = 0 ; i < nSize ; i++)
160 if (!TADC_IF_MemCmp((char*)(inBuffer + i), "<reqid>", 7))
163 for (j = i ; j < nSize ; j++)
165 if (!TADC_IF_MemCmp((char*)(inBuffer + j), "</reqid>", 8))
168 IF_TRUE_RETURN(length <= 0, TADC_PARAMETER_ERROR);
169 t_ROAcqInfo->ReqID = (TADC_U8*)TADC_IF_Malloc(length + 1);
170 IF_TRUE_RETURN(t_ROAcqInfo->ReqID == NULL, TADC_MEMAlOC_ERROR);
171 TADC_IF_MemSet(t_ROAcqInfo->ReqID, 0, length + 1);
172 TADC_IF_MemCpy(t_ROAcqInfo->ReqID, inBuffer+i, length);
179 IF_TRUE_RETURN(length <= 0, TADC_RESPONSEMESSAGE_ERROR);
180 DRM_TAPPS_LOG("TADC_GetROAcqInfo Success!\n");
185 int TADC_MakeRequestRO(T_ROACQ_INFO *t_ROAcqInfo, unsigned char * outBuffer, size_t outBufferSize, unsigned char * ROVer)
189 LPSTR psz64Parameter = NULL;
201 size_t reqdataset_size = 0;
204 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : Start \n");
207 IF_TRUE_RETURN(outBuffer == NULL, TADC_PARAMETER_ERROR);
208 IF_TRUE_RETURN(t_ROAcqInfo->ReqID == NULL, TADC_PARAMETER_ERROR);
211 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After Check Param Buffer \n");
212 len = TADC_IF_StrLen((char*)t_ROAcqInfo->ReqID);
213 IF_TRUE_RETURN( (len <= 0 || len > 512), TADC_PARAMETER_ERROR);
216 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After Check t_ROAcqInfo->ReqID Len \n");
217 nResult = TADC_IF_GetDHKey(&t_ROAcqInfo->t_DHInfo);
218 IF_ERROR_RETURN(nResult, TADC_GETDHKEY_ERROR);
221 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After TADC_IF_GetDHKey \n");
222 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.pSize <= 0 || t_ROAcqInfo->t_DHInfo.pSize > DHKey_SIZE, TADC_PARAMETER_ERROR);
223 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.ASize <= 0 || t_ROAcqInfo->t_DHInfo.ASize > DHKey_SIZE, TADC_PARAMETER_ERROR);
225 //If ROVer 2.0 then add <reqversion> element. 2011.03.08
226 if (ROVer != NULL && ROVer[0] >= 2)
231 "<?xml version='1.0'?>\n<request>\n<reqversion>%d.%d</reqversion>\n<reqid>%s</reqid>\n<reqdataset>",
241 "<?xml version='1.0'?>\n<request>\n<reqid>%s</reqid>\n<reqdataset>",
245 len = TADC_IF_StrLen((char*)outBuffer);
250 TADC_IF_StrNCpy((char*)outBuffer+i, "p=", 2);
253 for (k = 0 ; k < t_ROAcqInfo->t_DHInfo.pSize ; k++)
256 (char*)outBuffer + i + (k * 2),
257 outBufferSize - i - (k * 2),
259 t_ROAcqInfo->t_DHInfo.p[k]);
264 (char*)outBuffer + i,
267 t_ROAcqInfo->t_DHInfo.g);
270 TADC_IF_StrNCpy((char*)outBuffer + i, ";A=", 3);
273 for (k = 0 ; k < t_ROAcqInfo->t_DHInfo.ASize ; k++)
276 (char*)outBuffer + i + (k * 2),
277 outBufferSize - i - (k * 2),
279 t_ROAcqInfo->t_DHInfo.A[k]);
285 StrSize = i - reqdataset_size;
288 ReqTemp = (TADC_U8*)TADC_IF_Malloc(StrSize);
289 IF_TRUE_RETURN(ReqTemp == NULL, TADC_MEMAlOC_ERROR);
291 TADC_IF_MemSet(ReqTemp, 0, StrSize);
292 TADC_IF_MemCpy(ReqTemp, outBuffer+reqdataset_size, StrSize);
293 TADC_IF_SHA1(ReqTemp, StrSize, sha1_tmp);
295 TADC_IF_MemCpy(key, &g_baAESKey[0], 16);
296 TADC_IF_MemCpy(iv, &g_baAESKey[16], 16);
297 TADC_IF_AES_CTR(key, 16, iv, 20, (unsigned char*)sha1_tmp, &outlen, (unsigned char*)sha1_tmp);
300 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After TADC_IF_AES_CTR \n");
302 psz64Parameter = Base64Encode(sha1_tmp, sizeof(sha1_tmp)); //MemAlloc
303 if (psz64Parameter == NULL)
305 TADC_IF_Free(ReqTemp);
306 return TADC_MEMAlOC_ERROR;
310 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After Base64Encode \n");
312 TADC_IF_StrNCpy((char*)(outBuffer + i), ";hmac=", 6);
313 len = TADC_IF_StrLen((char*)psz64Parameter);
314 TADC_IF_MemCpy(outBuffer + i + 6, psz64Parameter, len);
315 TADC_IF_StrNCpy((char*)outBuffer + i + 6 + len, "</reqdataset>\n</request>", 24);
320 TADC_IF_Free(ReqTemp);
323 if (psz64Parameter != NULL)
325 TADC_IF_Free(psz64Parameter);
326 psz64Parameter = NULL;
329 len = TADC_IF_StrLen((char*)outBuffer);
330 IF_TRUE_RETURN(len <= 0, TADC_REQMAKEHMAC_ERROR);
332 DRM_TAPPS_LOG("TADC_MakeRequestRO Success!\n");
337 int TADC_GetHashReqID(unsigned char * inBuffer, unsigned char *hashReqID)
339 int i = 0, j = 0, nSize = 0;
345 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
346 IF_TRUE_RETURN(hashReqID == NULL, TADC_PARAMETER_ERROR);
347 nSize = TADC_IF_StrLen((char*)inBuffer);
348 IF_TRUE_RETURN(nSize <= 40 || nSize>RESP_MAXSIZE, TADC_PARAMETER_ERROR);
350 //Check XML Result Code ( Success result='0' )
353 for (i = 0 ; i < nSize ; i++)
355 if (!TADC_IF_MemCmp((char*)(inBuffer + i), "<response result=", 17))
358 if ((!memcmp((char*)(inBuffer + i), "'0'", 3)) || (!memcmp((char*)(inBuffer + i), "\"0\"", 3)))
369 IF_TRUE_RETURN(((i == nSize) || (nResult < 0)), TADC_RESPONSEMESSAGE_ERROR);
372 TADC_IF_MemSet(tmpbuf, 0, sizeof(tmpbuf));
377 for (i = 0 ; i < nSize ; i++)
379 if (!TADC_IF_MemCmp(inBuffer + i, "reqid=", 6))
382 for (j = i ; j < nSize ; j++)
384 if (!TADC_IF_MemCmp(inBuffer + j, ";", 1))
387 TADC_IF_StrNCpy((char*)tmpbuf, (char*)(inBuffer + i), length);
395 IF_TRUE_RETURN(length <= 0, TADC_RESPONSEMESSAGE_ERROR);
397 if ((length = TADC_IF_StrLen(tmpbuf)) != 40)
402 if ((nResult = HEX2BIN((char*)tmpbuf, hashReqID, &length)) < 0)
415 int TADC_GetResponseRO(unsigned char * inBuffer, T_ROACQ_INFO *t_ROAcqInfo, T_RO *t_RO, unsigned char *outBuffer)
417 int nHMacSize = 28; // Base64 Enc length of SHA1 20byte
418 TADC_U8 sha1_tmp[20] = {0, };
419 char hmacBuf[512] = {0, };
420 BYTE *ReqTemp = NULL;
421 LPBYTE pbBuffer = NULL;
423 TADC_U8 key[16] = {0, };
424 TADC_U8 iv[16] = {0, };
428 char *License = NULL;
429 TCHAR tmpDH_B[DHKey_SIZE * 2 + 1] = {0, };
433 CPointerArray paChilds;
436 char *timeStamp = NULL;
444 char pRoHeader[36] = {'<', '?', 'x', 'm', 'l', ' ', 'v', 'e', 'r', 's', 'i', 'o', 'n', '=', '"', '1', '.', '0', '"', '?', '>', 0x0A,
445 '<', 'T', 'i', 'z', 'e', 'n', 'L', 'i', 'c', 'e', 'n', 's', 'e', '>'};
448 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
449 IF_TRUE_RETURN(t_ROAcqInfo== NULL, TADC_PARAMETER_ERROR);
450 IF_TRUE_RETURN(t_RO == NULL, TADC_PARAMETER_ERROR);
452 nSize = TADC_IF_StrLen((char*)inBuffer);
453 IF_TRUE_RETURN( nSize <= 40 || nSize>RESP_MAXSIZE, TADC_PARAMETER_ERROR);
455 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.pSize<=0 || t_ROAcqInfo->t_DHInfo.pSize>DHKey_SIZE, TADC_PARAMETER_ERROR);
456 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.ASize<=0 || t_ROAcqInfo->t_DHInfo.ASize>DHKey_SIZE, TADC_PARAMETER_ERROR);
458 //Check XML Result Code ( Success result='0' )
460 for (i = 0 ; i < nSize ; i++)
462 if (!TADC_IF_MemCmp((char*)(inBuffer + i), "<response result=", 17))
465 if ((!memcmp((char*)(inBuffer + i), "'0'", 3)) || (!memcmp((char*)(inBuffer + i), "\"0\"", 3)))
476 IF_TRUE_RETURN(((i == nSize) || (nResult < 0)), TADC_RESPONSEMESSAGE_ERROR);
479 TADC_IF_MemSet(t_RO, 0, sizeof(T_RO));
480 TADC_IF_MemSet(tmpDH_B, 0, sizeof(tmpDH_B));
481 TADC_IF_MemSet(sha1_tmp, 0, sizeof(sha1_tmp));
482 TADC_IF_MemSet(hmacBuf, 0, sizeof(hmacBuf));
487 for (i = 0 ; i < nSize ; i++)
489 if (!TADC_IF_MemCmp((char*)(inBuffer + i), "<responsedata>", 14))
492 for (j = i ; j < nSize ; j++)
494 if (!TADC_IF_MemCmp((char*)(inBuffer+j), ";hmac=", 6))
497 IF_TRUE_RETURN(req_length <= 0 || req_length >= RESP_MAXSIZE, TADC_PARAMETER_ERROR);
499 ReqTemp = (TADC_U8*)TADC_IF_Malloc(req_length);
500 IF_TRUE_RETURN(ReqTemp == NULL, TADC_MEMAlOC_ERROR);
502 TADC_IF_MemSet(ReqTemp, 0, req_length);
503 TADC_IF_MemCpy(ReqTemp, inBuffer+i, req_length);
507 TADC_IF_StrNCpy(hmacBuf, (char*)(inBuffer + i + 6), nHMacSize);
514 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
516 pbBuffer = Base64Decode( (LPCSTR)hmacBuf, &length );
517 if (pbBuffer == NULL)
519 TADC_IF_Free(ReqTemp);
524 TADC_IF_MemCpy(key, &g_baAESKey[0], 16 );
525 TADC_IF_MemCpy(iv, &g_baAESKey[16], 16 );
526 TADC_IF_AES_CTR(key, 16, iv, 20, (unsigned char*)pbBuffer, &outlen, (unsigned char*)pbBuffer);
528 TADC_IF_SHA1(ReqTemp, req_length, sha1_tmp);
531 TADC_IF_Free(ReqTemp);
535 if (TADC_IF_MemCmp(sha1_tmp, pbBuffer, sizeof(sha1_tmp)))
537 TADC_IF_Free(pbBuffer);
539 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_RESPONSESIGNATURE_ERROR);
540 return TADC_RESPONSESIGNATURE_ERROR;
543 TADC_IF_Free(pbBuffer);
548 for (i = 0 ; i < nSize ; i++)
550 if (!TADC_IF_MemCmp(inBuffer + i, "B=", 2))
553 for (j = i ; j < nSize ; j++)
555 if (!TADC_IF_MemCmp(inBuffer + j, ";", 1))
558 IF_TRUE_RETURN(req_length <= 0 || req_length >= (int)sizeof(tmpDH_B), TADC_PARAMETER_ERROR);
559 TADC_IF_StrNCpy((char*)tmpDH_B, (char*)(inBuffer + i), req_length);
560 tmpDH_B[req_length] = 0;
567 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
569 TADC_IF_MemSet(t_ROAcqInfo->t_DHInfo.B, 0, sizeof(t_ROAcqInfo->t_DHInfo.B));
570 TADC_IF_MemCpy(t_ROAcqInfo->t_DHInfo.B, tmpDH_B, sizeof(t_ROAcqInfo->t_DHInfo.B));
572 if (HEX2BIN((char*)tmpDH_B, t_ROAcqInfo->t_DHInfo.B, (int*)&t_ROAcqInfo->t_DHInfo.BSize) < 0)
574 return TADC_GETDHKEY_ERROR;
577 if(t_ROAcqInfo->t_DHInfo.BSize != 16 && t_ROAcqInfo->t_DHInfo.BSize != 64)
579 return TADC_GETDHKEY_ERROR;
582 TADC_IF_MemSet(t_ROAcqInfo->t_DHInfo.K, 0, sizeof(t_ROAcqInfo->t_DHInfo.K));
584 nResult = TADC_IF_GetDHKey_K(&t_ROAcqInfo->t_DHInfo);
585 IF_ERROR_RETURN(nResult, TADC_GETDHKEY_ERROR);
589 for (i = 0 ; i < nSize ; i++)
591 if (!TADC_IF_MemCmp((char*)(inBuffer + i), "license=", 8))
594 for (j = i ; j < nSize ; j++)
596 if (!TADC_IF_MemCmp((char*)(inBuffer + j), ";hmac=", 6))
599 IF_TRUE_RETURN(req_length <= 0 || req_length >= RESP_MAXSIZE, TADC_PARAMETER_ERROR);
601 License = (char*)TADC_IF_Malloc(req_length + 1);
602 IF_TRUE_RETURN(License == NULL, TADC_MEMAlOC_ERROR);
604 TADC_IF_MemSet(License, 0, req_length + 1);
605 TADC_IF_StrNCpy(License, (char*)(inBuffer + i), req_length);
612 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
614 // Get RO License Info
615 pbBuffer = Base64Decode((LPCSTR)License, &length);
618 TADC_IF_Free(License);
623 pbBuffer[length] = 0;
624 TADC_IF_Free(License);
628 TADC_IF_MemCpy(key, &t_ROAcqInfo->t_DHInfo.K[0], 16);
629 TADC_IF_MemCpy(iv, &t_ROAcqInfo->t_DHInfo.K[16], 16);
630 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char*)pbBuffer, &outlen, (unsigned char*)pbBuffer);
632 // Test Code for get the plaintext ro
634 strcat(tmpPath, (char*)t_RO->t_Content.CID);
635 strcat(tmpPath, ".ro");
636 fd = fopen(tmpPath, "w+b");
639 DRM_TAPPS_LOG("fopen started.");
640 fd = fopen("/tmp/1.ro", "w+b");
643 DRM_TAPPS_EXCEPTION("fopen() failed.");
646 DRM_TAPPS_LOG("fopen done.");
647 fwrite(pbBuffer, 1, strlen((char*)pbBuffer), fd);
648 DRM_TAPPS_LOG("fwrite done.");
650 DRM_TAPPS_LOG("fclose done.");
651 DRM_TAPPS_LOG("Save decrypted RO success!, path = %s", tmpPath);
655 if(TADC_IF_MemCmp((char*)pbBuffer, pRoHeader, 36))
657 TADC_IF_Free(pbBuffer);
659 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_LICENSEXMLPARSING_ERROR);
660 return TADC_LICENSEXMLPARSING_ERROR;
662 TADC_IF_MemCpy(outBuffer, pbBuffer, length);
663 TADC_IF_Free(pbBuffer);
666 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
669 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
674 DRM_TAPPS_LOG("timeStamp parsing start");
676 i = FindString(inBuffer, nSize, (unsigned char *)"<timeStamp>", 11);
678 DRM_TAPPS_LOG("No timeStamp. TADC_GetResponseRO Success!");
683 j = FindString(inBuffer, nSize, (unsigned char *)"</timeStamp>", 12);
684 IF_TRUE_RETURN(j < i, TADC_LICENSEXMLPARSING_ERROR);
686 IF_TRUE_RETURN(req_length > ROXML_MAXSIZE, TADC_PARAMETER_ERROR);
691 timeStamp = (char*)TADC_IF_Malloc(req_length + 1);
692 IF_TRUE_RETURN(timeStamp == NULL, TADC_MEMAlOC_ERROR);
694 TADC_IF_MemSet(timeStamp, 0, req_length + 1);
695 TADC_IF_StrNCpy(timeStamp, (char*)(inBuffer + i), req_length);
697 DRM_TAPPS_LOG("timeStamp parsing end.. req_length[%d]", req_length);
699 // Get RO License Info
700 pbBuffer = Base64Decode((LPCSTR)timeStamp, &length);
703 TADC_IF_Free(timeStamp);
705 DRM_TAPPS_EXCEPTION("Base64Decode Failed");
709 pbBuffer[length] = 0;
710 TADC_IF_Free(timeStamp);
713 DRM_TAPPS_LOG("Decrypt timeStamp starts");
716 TADC_IF_MemCpy(key, &t_ROAcqInfo->t_DHInfo.K[0], 16);
717 TADC_IF_MemCpy(iv, &t_ROAcqInfo->t_DHInfo.K[16], 16);
718 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char*)pbBuffer, &outlen, (unsigned char*)pbBuffer);
720 if (length >= (int)sizeof(t_ROAcqInfo->sTimeStamp))
722 TADC_IF_Free(pbBuffer);
724 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_RESPONSEMESSAGE_ERROR);
725 return TADC_RESPONSEMESSAGE_ERROR;
728 TADC_IF_MemCpy(t_ROAcqInfo->sTimeStamp, pbBuffer, length);
729 t_ROAcqInfo->sTimeStamp[length] = 0;
731 TADC_IF_Free(pbBuffer);
734 DRM_TAPPS_LOG("timeStamp found. TADC_GetResponseRO Success!");
738 int TADC_VerifyROSignature(IN LPBYTE pszXML)
741 int length = 0, i = 0, i2 = 0;
743 unsigned char* pSigData = NULL;
744 unsigned char* pRICert = NULL;
745 unsigned char* pRICACert = NULL;
747 int inLen = 0, sigLen = 0, certLen = 0, certLen2 = 0;
750 char TempBuf[CERT_MAXSIZE] = {0, };
753 IF_TRUE_RETURN(pszXML == NULL, TADC_PARAMETER_ERROR);
756 i = FindString(pszXML, TADC_IF_StrLen((char*)pszXML), (LPBYTE)"<version>2.0</version>", 22);
759 DRM_TAPPS_EXCEPTION("TADC_IF_VerifyROSignature Debug : It is not the TAD-RO2.0 format. \n");
763 DRM_TAPPS_LOG("TADC_IF_VerifyROSignature Debug : It is the TAD-RO2.0 format.\n");
765 //Get Certificates ( RI Cert )
766 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
768 i = FindString(pszXML, TADC_IF_StrLen((char*)pszXML), (LPBYTE)"<CertificateChain>", 18);
769 IF_TRUE_RETURN(i < 0, TADC_RO_CERTIFICATE_ERROR);
771 p = pszXML + i; // <certificateChain>
772 length = TADC_IF_StrLen((char*)pszXML) - i;
774 i = FindString(p, length, (LPBYTE)"<Certificate>", 13);
775 IF_TRUE_RETURN(i < 0, TADC_RO_CERTIFICATE_ERROR);
776 i += 13; // start position of RI Cert
778 i2 = FindString(p, length, (LPBYTE)"</Certificate>", 14);
779 IF_TRUE_RETURN(i2 < (i + 13), TADC_RO_CERTIFICATE_ERROR);
780 certLen = i2 - i; // size of RI Cert
782 TADC_IF_StrNCpy(TempBuf, (char*)p+i, certLen);
784 pRICert = Base64Decode( (LPCSTR)TempBuf, &certLen );
785 IF_TRUE_RETURN(pRICert == NULL, TADC_RO_CERTIFICATE_ERROR);
786 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
788 //Get Certificates ( RICA Cert )
789 p = p + (i2 + 14); // first </certificate>
790 length = length - (i2 + 14);
792 i = FindString(p, length, (LPBYTE)"<Certificate>", 13);
793 IF_TRUE_RETURN2(i < 0, TADC_IF_Free(pRICert),,,TADC_RO_CERTIFICATE_ERROR);
794 i += 13; // start position of RICA Cert
796 i2 = FindString(p, length, (LPBYTE)"</Certificate>", 14);
797 IF_TRUE_RETURN2(i2 < (i + 13), TADC_IF_Free(pRICert),,,TADC_RO_CERTIFICATE_ERROR);
798 certLen2 = i2 - i; // size of RICA Cert
800 TADC_IF_StrNCpy(TempBuf, (char*)p + i, certLen2);
802 pRICACert = Base64Decode((LPCSTR)TempBuf, &certLen2);
803 IF_TRUE_RETURN2(pRICACert == NULL, TADC_IF_Free(pRICert),,,TADC_RO_CERTIFICATE_ERROR);
804 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
806 //Get position of indata
807 inLen = FindString(pszXML, TADC_IF_StrLen((char*)pszXML), (LPBYTE)"</CertificateChain>", 19);
808 IF_TRUE_RETURN2(inLen < 0, TADC_IF_Free(pRICert),TADC_IF_Free(pRICACert),,TADC_RO_CERTIFICATE_ERROR);
811 //Get signature value </certificateChain>
813 length = TADC_IF_StrLen((char*)pszXML)-inLen;
815 i = FindString(p, length, (LPBYTE)"<SignatureValue>", 16);
816 IF_TRUE_RETURN2(i < 0, TADC_IF_Free(pRICert),TADC_IF_Free(pRICACert),,TADC_RO_SIGNATURE_ERROR);
817 i += 16; // start position of signature value
819 i2 = FindString(p, length, (LPBYTE)"</SignatureValue>", 17);
820 IF_TRUE_RETURN2(i2 < (i + 16), TADC_IF_Free(pRICert),TADC_IF_Free(pRICACert),,TADC_RO_SIGNATURE_ERROR);
821 sigLen = i2 - i; // size of signature value
823 TADC_IF_StrNCpy(TempBuf, (char*)p + i, sigLen);
825 pSigData = Base64Decode( (LPCSTR)TempBuf, &sigLen );
826 IF_TRUE_RETURN2(pSigData == NULL, TADC_IF_Free(pRICert),TADC_IF_Free(pRICACert),,TADC_RO_SIGNATURE_ERROR);
827 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
829 //Verify the certificate chain
830 nResult = TADC_IF_VerifyCertChain(pRICACert, certLen2, pRICert, certLen);
833 nResult = TADC_IF_VerifySignature(pszXML, inLen, pSigData, sigLen, pRICert, certLen);
836 TADC_IF_Free(pRICert);
837 TADC_IF_Free(pRICACert);
838 TADC_IF_Free(pSigData);
843 int TADC_GetResponseROInfo(IN LPBYTE pszXML, T_RO *t_RO)
847 CXMLElement* pRoot, *pElement;
848 CPointerArray paChilds;
850 LPBYTE pbBuffer = NULL;
852 TADC_U8 TempVersion[3] = {0, };
854 char pRoHeader[36] = {'<', '?', 'x', 'm', 'l', ' ', 'v', 'e', 'r', 's', 'i', 'o', 'n', '=', '"', '1', '.', '0', '"', '?', '>', 0x0A,
855 '<', 'T', 'i', 'z', 'e', 'n', 'L', 'i', 'c', 'e', 'n', 's', 'e', '>'};
858 IF_TRUE_RETURN(pszXML == NULL, TADC_PARAMETER_ERROR);
859 IF_TRUE_RETURN(t_RO == NULL, TADC_PARAMETER_ERROR);
862 TADC_IF_MemSet(t_RO, 0, sizeof(T_RO));
863 TADC_IF_MemSet(TempVersion, 0, sizeof(TempVersion));
865 if (TADC_IF_MemCmp((char*)pszXML, pRoHeader, 36))
867 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
871 // Verify the signature ( 2011.03.08, Joseph Ahn )
872 nResult = TADC_VerifyROSignature(pszXML);
875 DRM_TAPPS_EXCEPTION("TADC_VerifyROSignature Error Code = %x", nResult);
879 nResult = oXMLFile.LoadFromStream((LPCTSTR)pszXML);
882 DRM_TAPPS_EXCEPTION("oXMLFile.LoadFromStream is failed\n");
888 pRoot = oXMLFile.GetRoot();
891 DRM_TAPPS_EXCEPTION("oXMLFile.GetRoot is failed\n");
896 paChilds.RemoveAll();
897 nResult = pRoot->Find( &paChilds, _T("ContentInfo"), _T("cid"), NULL);
900 DRM_TAPPS_EXCEPTION("pRoot->Find is failed\n");
905 if (paChilds.GetCount() != 1)
907 DRM_TAPPS_EXCEPTION("paChilds.GetCount() is failed\n");
912 pElement = (CXMLElement*)paChilds.Get(0);
913 pszValue = pElement->GetValue();
914 if (pszValue == NULL)
916 DRM_TAPPS_EXCEPTION("pElement->GetValue() is failed\n");
921 length = TADC_IF_StrLen((char*)pszValue);
922 if (length <= 0 || length > CID_SIZE)
924 DRM_TAPPS_EXCEPTION("TADC_IF_StrLen is failed(%d) - %s\n", length, pszValue);
929 t_RO->t_Content.CID = (TADC_U8*)TADC_IF_Malloc(length + 1); //2011.03.08 ( CID_SIZE -> length )
930 IF_TRUE_GOTO(t_RO->t_Content.CID == NULL, -2);
931 TADC_IF_MemSet(t_RO->t_Content.CID, 0, length + 1); //2011.03.08 ( CID_SIZE -> length )
932 TADC_IF_StrNCpy((CHAR*)t_RO->t_Content.CID, pszValue, length);
934 // Get KeyValue (CEK)
935 pRoot = oXMLFile.GetRoot();
936 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
938 paChilds.RemoveAll();
939 nResult = pRoot->Find( &paChilds, _T("KeyInfo"), _T("CipherValue"), NULL);
941 IF_TRUE_GOTO(nResult != 0, ERROR_INVALID_DATA);
942 IF_TRUE_GOTO(paChilds.GetCount() != 1, ERROR_INVALID_DATA);
944 pElement = (CXMLElement*)paChilds.Get(0);
945 pszValue = pElement->GetValue();
946 IF_TRUE_GOTO(pszValue == NULL, -2);
948 pbBuffer = Base64Decode(pszValue, &length);
949 if (pbBuffer == NULL)
951 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
955 if (length <= 0 || length > CEK_SIZE)
957 TADC_IF_Free(pbBuffer);
963 t_RO->t_Content.CEK = (TADC_U8*)TADC_IF_Malloc(length + 1); //2011.03.08 ( CEK_SIZE -> length )
964 IF_TRUE_GOTO(t_RO->t_Content.CEK == NULL, -2);
965 TADC_IF_MemSet(t_RO->t_Content.CEK, 0, length + 1); //2011.03.08 ( CEK_SIZE -> length )
966 TADC_IF_MemCpy(t_RO->t_Content.CEK, pbBuffer, length);
968 TADC_IF_Free(pbBuffer);
972 pRoot = oXMLFile.GetRoot();
973 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
975 paChilds.RemoveAll();
976 nResult = pRoot->Find( &paChilds, _T("DeviceInfo"), _T("DUID"), NULL);
978 IF_TRUE_GOTO(nResult != 0, ERROR_INVALID_DATA);
979 IF_TRUE_GOTO(paChilds.GetCount() != 1, ERROR_INVALID_DATA);
981 pElement = (CXMLElement*)paChilds.Get(0);
982 pszValue = pElement->GetValue();
983 IF_TRUE_GOTO(pszValue == NULL, -1);
984 length = TADC_IF_StrLen((char*)pszValue);
991 t_RO->PerFlag |= DUID_RULE;
992 t_RO->t_Permission.t_Individual.BindingType |= DUID_RULE;
993 t_RO->t_Permission.t_Individual.DUID = (TADC_U8*)TADC_IF_Malloc(length + 1);
995 if (t_RO->t_Permission.t_Individual.DUID == NULL)
997 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_MEMAlOC_ERROR);
1002 TADC_IF_MemSet(t_RO->t_Permission.t_Individual.DUID, 0, length + 1);
1003 TADC_IF_MemCpy((CHAR*)t_RO->t_Permission.t_Individual.DUID, pszValue, length);
1012 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
1017 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_MEMAlOC_ERROR);
1020 TADC_IF_Free(pbBuffer);
1025 int TADC_GetFileHeader(unsigned char * inBuffer, T_FILE_HEADER *t_FileHeader)
1028 BYTE FixedFileType[8] = {0x00,0x00,0x00,0x14,0x66,0x74,0x79,0x70};
1031 //Check Param Bufffer
1032 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
1033 IF_TRUE_RETURN(t_FileHeader == NULL, TADC_PARAMETER_ERROR);
1036 TADC_IF_MemSet(t_FileHeader, 0, sizeof(T_FILE_HEADER));
1037 TADC_IF_MemSet(tmp, 0, sizeof(tmp));
1039 if (TADC_IF_MemCmp(inBuffer, FixedFileType, sizeof(FixedFileType)))
1041 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSSTRUCT_ERROR);
1046 if (TADC_IF_MemCmp(inBuffer+i, "TADF", 4))
1048 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSSTRUCT_ERROR);
1053 t_FileHeader->Version[0] = '1';
1054 t_FileHeader->Version[1] = '0';
1057 if (TADC_IF_MemCmp(inBuffer+i, "TADF", 4))
1059 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSSTRUCT_ERROR);
1064 t_FileHeader->DRMType = inBuffer[i];
1067 TADC_IF_MemCpy(t_FileHeader->ContentsType, inBuffer+i, 128);
1070 TADC_IF_MemCpy(&t_FileHeader->TotalSize, inBuffer+i, 8);
1072 t_FileHeader->TotalSize = _hton64(t_FileHeader->TotalSize);
1074 TADC_IF_MemCpy(&t_FileHeader->Offset1, inBuffer+i, 8);
1076 t_FileHeader->Offset1 = _hton64(t_FileHeader->Offset1);
1078 TADC_IF_MemCpy(&t_FileHeader->Offset2, inBuffer+i, 8);
1080 t_FileHeader->Offset2 = _hton64(t_FileHeader->Offset2);
1082 TADC_IF_MemCpy(&t_FileHeader->Offset3, inBuffer+i, 8);
1084 t_FileHeader->Offset3 = _hton64(t_FileHeader->Offset3);
1086 TADC_IF_MemCpy(&t_FileHeader->Offset4, inBuffer+i, 8);
1088 t_FileHeader->Offset4 = _hton64(t_FileHeader->Offset4);
1090 TADC_IF_MemCpy(&t_FileHeader->Offset5, inBuffer+i, 8);
1092 t_FileHeader->Offset5 = _hton64(t_FileHeader->Offset5);
1094 TADC_IF_MemCpy(&t_FileHeader->Offset6, inBuffer+i, 8);
1096 t_FileHeader->Offset6 = _hton64(t_FileHeader->Offset6);
1098 TADC_IF_MemCpy(&t_FileHeader->Offset7, inBuffer+i, 8);
1100 t_FileHeader->Offset7 = _hton64(t_FileHeader->Offset7);
1102 TADC_IF_MemCpy(&t_FileHeader->Offset8, inBuffer+i, 8);
1104 t_FileHeader->Offset8 = _hton64(t_FileHeader->Offset8);
1106 DRM_TAPPS_LOG("TADC_GetFileHeader Success!\n");
1110 int TADC_GetDRMHeader(unsigned char * inBuffer, T_DRM_HEADER *t_DRMHeader)
1114 //Check Param Bufffer
1115 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
1116 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1119 TADC_IF_MemSet(t_DRMHeader, 0, sizeof(T_DRM_HEADER));
1121 if (TADC_IF_MemCmp(inBuffer, "TIZEN_DRM", 9))
1123 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_NOTTADCFILE_ERROR);
1128 TADC_IF_MemCpy(t_DRMHeader->Version, inBuffer+i, 2);
1131 TADC_IF_MemCpy(&t_DRMHeader->XmlSize, inBuffer+i, 4);
1134 t_DRMHeader->XmlSize = htonl_(t_DRMHeader->XmlSize);
1135 DRM_TAPPS_LOG("TADC_GetDRMHeader Success!\n");
1140 int TADC_GetDRMHeaderInfo(unsigned char * inBuffer, T_DRM_HEADER *t_DRMHeader)
1144 CXMLElement* pRoot, *pNode;
1145 CPointerArray paChilds;
1149 unsigned char *ReqTemp=NULL;
1158 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
1159 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1161 IF_TRUE_RETURN(t_DRMHeader->XmlSize <= 0 || t_DRMHeader->XmlSize > ROXML_MAXSIZE, TADC_PARAMETER_ERROR);
1163 ReqTemp = (TADC_U8*)TADC_IF_Malloc(t_DRMHeader->XmlSize);
1164 IF_TRUE_RETURN(ReqTemp == NULL, TADC_MEMAlOC_ERROR);
1166 TADC_IF_MemSet(ReqTemp, 0, t_DRMHeader->XmlSize);
1167 TADC_IF_MemSet(sha1_tmp, 0, sizeof(sha1_tmp) );
1170 TADC_IF_MemCpy(ReqTemp, inBuffer + 20, t_DRMHeader->XmlSize);
1171 TADC_IF_SHA1(ReqTemp, t_DRMHeader->XmlSize, sha1_tmp);
1173 if (ReqTemp != NULL)
1175 TADC_IF_Free(ReqTemp);
1179 TADC_IF_MemCpy(key, &g_baSignatureKey[0], 16);
1180 TADC_IF_MemCpy(iv, &g_baSignatureKey[16], 16);
1181 TADC_IF_AES_CTR(key, 16, iv, 20, (unsigned char*)sha1_tmp, &outlen, (unsigned char*)sha1_tmp);
1183 if (TADC_IF_MemCmp(sha1_tmp, inBuffer, sizeof(sha1_tmp)))
1185 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSHMAC_ERROR);
1190 nResult = oXMLFile.LoadFromStream((LPCTSTR)(inBuffer + 20));
1194 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSXML_ERROR);
1198 pRoot = oXMLFile.GetRoot();
1199 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1201 paChilds.RemoveAll();
1202 nResult = pRoot->Find( &paChilds, _T("SID"), NULL );
1206 if (paChilds.GetCount() == 1)
1208 pNode = (CXMLElement*)paChilds.Get(0);
1209 pszValue = pNode->GetValue();
1210 Length = TADC_IF_StrLen((char*)pszValue);
1214 t_DRMHeader->SID = (TADC_U8*)TADC_IF_Malloc(Length + 1);
1215 IF_TRUE_RETURN(t_DRMHeader->SID == NULL, TADC_MEMAlOC_ERROR);
1216 TADC_IF_MemSet(t_DRMHeader->SID, 0, Length + 1);
1217 TADC_IF_StrNCpy((CHAR*)t_DRMHeader->SID, pszValue, Length);
1222 pRoot = oXMLFile.GetRoot();
1223 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1225 paChilds.RemoveAll();
1226 nResult = pRoot->Find( &paChilds, _T("CID"), NULL );
1230 if (paChilds.GetCount() == 1)
1232 pNode = (CXMLElement*)paChilds.Get(0);
1233 pszValue = pNode->GetValue();
1234 Length = TADC_IF_StrLen((char*)pszValue); //2011.03.08
1238 t_DRMHeader->CID = (TADC_U8*)TADC_IF_Malloc(Length + 1); //2011.03.08 ( CID_SIZE -> Length )
1239 IF_TRUE_RETURN(t_DRMHeader->CID == NULL, TADC_MEMAlOC_ERROR);
1240 TADC_IF_MemSet(t_DRMHeader->CID, 0, Length + 1); //2011.03.08 ( CID_SIZE -> Length )
1241 TADC_IF_StrNCpy((CHAR*)t_DRMHeader->CID, pszValue, Length); //2011.03.08 ( CID_SIZE -> Length )
1246 pRoot = oXMLFile.GetRoot();
1247 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1248 paChilds.RemoveAll();
1249 nResult = pRoot->Find(&paChilds, _T("ContentType"), NULL);
1253 if (paChilds.GetCount() == 1)
1255 pNode = (CXMLElement*)paChilds.Get(0);
1256 pszValue = pNode->GetValue();
1257 Length = TADC_IF_StrLen((char*)pszValue);
1258 TADC_IF_MemSet(t_DRMHeader->ContentsType, 0, 128);
1259 TADC_IF_StrNCpy((CHAR*)t_DRMHeader->ContentsType, pszValue, Length);
1263 pRoot = oXMLFile.GetRoot();
1264 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1265 paChilds.RemoveAll();
1266 nResult = pRoot->Find( &paChilds, _T("EncryptionMethod"), NULL );
1270 if (paChilds.GetCount() == 1)
1272 pNode = (CXMLElement*)paChilds.Get(0);
1273 pszValue = pNode->GetValue();
1274 t_DRMHeader->EncryptionMethod = TADC_IF_AtoI((char*)pszValue);
1278 pRoot = oXMLFile.GetRoot();
1279 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1280 paChilds.RemoveAll();
1281 nResult = pRoot->Find( &paChilds, _T("EncryptionLevel"), NULL );
1285 if (paChilds.GetCount() == 1)
1287 pNode = (CXMLElement*)paChilds.Get(0);
1288 pszValue = pNode->GetValue();
1289 t_DRMHeader->EncryptionLevel = TADC_IF_AtoI((char*)pszValue);
1293 pRoot = oXMLFile.GetRoot();
1294 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1295 paChilds.RemoveAll();
1296 nResult = pRoot->Find( &paChilds, _T("EncryptionRange"), NULL );
1300 if (paChilds.GetCount() == 1)
1302 pNode = (CXMLElement*)paChilds.Get(0);
1303 pszValue = pNode->GetValue();
1304 t_DRMHeader->EncryptionRange = TADC_IF_AtoI((char*)pszValue);
1308 pRoot = oXMLFile.GetRoot();
1309 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1310 paChilds.RemoveAll();
1311 nResult = pRoot->Find( &paChilds, _T("RIURL"), NULL );
1315 if (paChilds.GetCount() == 1)
1317 pNode = (CXMLElement*)paChilds.Get(0);
1318 pszValue = pNode->GetValue();
1319 Length = TADC_IF_StrLen((char*)pszValue);
1323 t_DRMHeader->RIURL = (TADC_U8*)TADC_IF_Malloc(Length+1);
1324 IF_TRUE_RETURN(t_DRMHeader->RIURL == NULL, TADC_MEMAlOC_ERROR);
1325 TADC_IF_MemSet(t_DRMHeader->RIURL, 0, Length+1);
1326 TADC_IF_StrNCpy((CHAR*)t_DRMHeader->RIURL, pszValue, Length);
1331 // dummy RIURL(DRM Server spec changed)
1332 if (t_DRMHeader->RIURL == NULL)
1334 pszValue = "dummy_riurl";
1335 Length = TADC_IF_StrLen(pszValue);
1336 t_DRMHeader->RIURL = (TADC_U8*)TADC_IF_Malloc(Length+1);
1337 IF_TRUE_RETURN(t_DRMHeader->RIURL == NULL, TADC_MEMAlOC_ERROR);
1338 TADC_IF_MemSet(t_DRMHeader->RIURL, 0, Length+1);
1339 TADC_IF_StrNCpy((CHAR*)t_DRMHeader->RIURL, pszValue, Length);
1342 DRM_TAPPS_LOG("t_DRMHeader->RIURL = %s\n", (char*)t_DRMHeader->RIURL);
1344 pRoot = oXMLFile.GetRoot();
1345 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1346 paChilds.RemoveAll();
1347 nResult = pRoot->Find( &paChilds, _T("PlaintextSize"), NULL );
1351 if (paChilds.GetCount() == 1)
1353 pNode = (CXMLElement*)paChilds.Get(0);
1354 pszValue = pNode->GetValue();
1355 t_DRMHeader->PlaintextSize = TADC_IF_AtoI((char*)pszValue);
1359 pRoot = oXMLFile.GetRoot();
1360 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1361 paChilds.RemoveAll();
1362 nResult = pRoot->Find( &paChilds, _T("Packdate"), NULL );
1366 if (paChilds.GetCount() == 1)
1368 pNode = (CXMLElement*)paChilds.Get(0);
1369 pszValue = pNode->GetValue();
1370 Length = TADC_IF_StrLen((char*)pszValue);
1374 t_DRMHeader->Packdate = (TADC_U8*)TADC_IF_Malloc(Length+1);
1375 IF_TRUE_RETURN(t_DRMHeader->Packdate == NULL, TADC_MEMAlOC_ERROR);
1376 TADC_IF_MemSet(t_DRMHeader->Packdate, 0, Length+1);
1377 TADC_IF_StrNCpy((char*)t_DRMHeader->Packdate, pszValue, Length);
1385 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSXML_ERROR);
1386 STACKTRACE( _T( "CNCG20File::_ParseHeader()" ) );
1388 DRM_TAPPS_LOG("TADC_GetDRMHeaderInfo Success! \n");
1392 int TADC_GetCEK(T_DEVICE_INFO *t_DeviceInfo, T_RO *t_RODB, T_DRM_HEADER *t_DRMHeader)
1396 //Check Parameter Buffer
1397 IF_TRUE_RETURN(t_DeviceInfo == NULL, TADC_PARAMETER_ERROR);
1398 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1399 IF_TRUE_RETURN(t_DRMHeader->CID == NULL, TADC_PARAMETER_ERROR);
1400 IF_TRUE_RETURN(t_RODB == NULL, TADC_PARAMETER_ERROR);
1401 IF_TRUE_RETURN(t_RODB->t_Content.CID == NULL, TADC_PARAMETER_ERROR);
1403 if(!TADC_IF_StrCmp((char*)t_DRMHeader->CID, (char*)t_RODB->t_Content.CID)) //2011.03.08 ( TADC_IF_MemCmp -> TADC_IF_StrCmp )
1405 if((t_RODB->PerFlag & DUID_RULE) && (t_RODB->t_Permission.t_Individual.BindingType & DUID_RULE))
1407 IF_TRUE_RETURN(t_RODB->t_Permission.t_Individual.DUID == NULL, TADC_PARAMETER_ERROR);
1408 length1 = TADC_IF_StrLen((char*)t_DeviceInfo->DUID);
1409 DRM_TAPPS_LOG("t_DeviceInfo->DUID = %s, t_RODB->t_Permission.t_Individual.DUID is %s, length1 is %d\n", t_DeviceInfo->DUID, t_RODB->t_Permission.t_Individual.DUID, length1);
1410 /*if(TADC_IF_MemCmp(t_DeviceInfo->DUID, t_RODB->t_Permission.t_Individual.DUID, length1))
1412 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_RULE_DUID_ERROR);
1416 IF_TRUE_RETURN(t_RODB->t_Content.CEK == NULL, TADC_PARAMETER_ERROR);
1417 t_DRMHeader->CEK = (TADC_U8*)TADC_IF_Malloc(CEK_SIZE + 1);
1418 IF_TRUE_RETURN(t_DRMHeader->CEK == NULL, TADC_MEMAlOC_ERROR);
1419 TADC_IF_MemSet(t_DRMHeader->CEK, 0, CEK_SIZE + 1);
1420 TADC_IF_MemCpy(t_DRMHeader->CEK, t_RODB->t_Content.CEK, CEK_SIZE);
1422 DRM_TAPPS_LOG("TADC_GetCEK Success!\n");
1426 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_RULE_NOINFOMATION);
1431 int TADC_DecryptBlock(char *pbBuffer, int nSize, const T_DRM_HEADER *t_DRMHeader)
1433 TADC_U8 key[16] = {0, };
1434 TADC_U8 iv[16] = {0, };
1435 int i = 0, nBlocks = 0, nIndex = 0;
1436 char baToBeEncrypted[32] = {0, };
1437 int nRemainBytes = 0, nBlockBytes = 0;
1439 int nEncryptionLevel = 0;
1440 int nEncryptionMethod = 0;
1442 char temp[512] = {0, };
1446 TADC_IF_MemSet(temp, 0, sizeof(temp));
1448 IF_TRUE_RETURN(pbBuffer == NULL, TADC_PARAMETER_ERROR);
1449 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1451 IF_TRUE_RETURN(nSize > 512, TADC_PARAMETER_ERROR);
1452 IF_TRUE_RETURN(t_DRMHeader->CEK == NULL, TADC_PARAMETER_ERROR);
1454 nEncryptionLevel = t_DRMHeader->EncryptionLevel;
1455 nEncryptionMethod = t_DRMHeader->EncryptionMethod;
1457 IF_TRUE_RETURN(nEncryptionMethod != 1, TADC_PARAMETER_ERROR);
1458 IF_TRUE_RETURN(nEncryptionLevel < 0 || nEncryptionLevel > 32, TADC_PARAMETER_ERROR);
1460 TADC_IF_MemSet( baToBeEncrypted, 1, 32 );
1462 if (nEncryptionLevel > 16)
1468 nBlocks = nEncryptionLevel;
1471 for (i = 0 ; i < nBlocks ; i++)
1473 nIndex = 31 - (i * 2);
1474 baToBeEncrypted[nIndex] = 0;
1477 for (i = 16 ; i < nEncryptionLevel ; i++)
1479 nIndex = 30 - ((i - 16) * 2);
1480 baToBeEncrypted[nIndex] = 0;
1483 nRemainBytes = nSize;
1489 for (i = 0 ; i < 32 ; i++)
1491 if (nRemainBytes < 16)
1493 nBlockBytes = nRemainBytes;
1496 if (baToBeEncrypted[i] == 1)
1498 TADC_IF_MemCpy(temp + length, pbBuffer + totlength, nBlockBytes);
1499 length += nBlockBytes;
1502 nRemainBytes -= nBlockBytes;
1503 totlength += nBlockBytes;
1505 if (nRemainBytes < 1)
1511 TADC_IF_MemCpy(key, &t_DRMHeader->CEK[0], 16);
1512 TADC_IF_MemCpy(iv, &t_DRMHeader->CEK[16], 16);
1513 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char*)temp, &length, (unsigned char*)temp);
1515 nRemainBytes = nSize;
1521 for (i = 0 ; i < 32 ; i++)
1523 if (nRemainBytes < 16)
1525 nBlockBytes = nRemainBytes;
1528 if (baToBeEncrypted[i] == 1)
1530 TADC_IF_MemCpy(pbBuffer + totlength, temp + length, nBlockBytes);
1531 length += nBlockBytes;
1534 nRemainBytes -= nBlockBytes;
1535 totlength += nBlockBytes;
1537 if (nRemainBytes < 1)
1545 int TADC_GetDRMHeaderFromFile(const char *pTADCFilepath, T_FILE_HEADER *t_FileHeader, T_DRM_HEADER *t_DRMHeader )
1548 unsigned char tempbuf[512];
1549 unsigned char *pbuf = NULL;
1552 ULONG readsize=0, ReadLen=0;
1554 FILE *hFile = 0; //Apps drm file
1557 if (pTADCFilepath == NULL || t_FileHeader == NULL || t_DRMHeader == NULL)
1559 DRM_TAPPS_EXCEPTION("Error : Parameter Null.");
1564 TADC_IF_MemSet(tempbuf, 0, sizeof(tempbuf));
1567 if ((hFile = fopen(pTADCFilepath, "rb")) == NULL)
1569 DRM_TAPPS_EXCEPTION("Error : fopen() error.");
1575 //FmReadFile(hFile, tempbuf, readsize, &ReadLen);
1576 ReadLen = fread(tempbuf, 1, readsize, hFile);
1577 if ((readsize != ReadLen) || (ret=TADC_GetFileHeader(tempbuf, t_FileHeader)) < 0)
1579 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1583 TADC_IF_MemSet(tempbuf, 0, sizeof(tempbuf));
1585 //Tizen Apps DRM Type Check
1586 if (t_FileHeader->DRMType & TIZEN_DRM)
1588 DRM_TAPPS_LOG("It's a TAPPS DCF = %s", pTADCFilepath);
1590 ReadLen = fread(tempbuf, 1, readsize, hFile);
1591 if ((readsize != ReadLen) || (ret=TADC_GetDRMHeader(tempbuf, t_DRMHeader)) < 0)
1593 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1598 readsize = 20 + t_DRMHeader->XmlSize;
1599 if ((pbuf = (unsigned char*)TADC_IF_Malloc( readsize * sizeof(char))) == NULL)
1601 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1606 ReadLen = fread(pbuf, 1, readsize, hFile);
1607 if (readsize != ReadLen)
1609 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1615 if (TADC_GetDRMHeaderInfo(pbuf, t_DRMHeader) < 0)
1617 DRM_TAPPS_EXCEPTION("Error : TADC_GetDRMHeaderInfo error.");
1626 DRM_TAPPS_EXCEPTION("Error : It's not a TApps DCF file.");
1635 DWORD TADC_GetLastError(void)
1637 DWORD dwError = g_TADCErrorCode;
1638 g_TADCErrorCode = 0;
1643 int TADC_MEMFree_RO(T_RO *t_ro)
1645 IF_TRUE_RETURN(t_ro == NULL, TADC_PARAMETER_ERROR);
1648 if (t_ro->t_Content.CID != NULL)
1650 TADC_IF_Free(t_ro->t_Content.CID);
1651 t_ro->t_Content.CID = NULL;
1654 if (t_ro->t_Content.CEK!= NULL)
1656 TADC_IF_Free(t_ro->t_Content.CEK);
1657 t_ro->t_Content.CEK = NULL;
1660 if (t_ro->t_Permission.t_Individual.DUID != NULL)
1662 TADC_IF_Free(t_ro->t_Permission.t_Individual.DUID);
1663 t_ro->t_Permission.t_Individual.DUID = NULL;
1669 int TADC_MEMFree_FileHeader(T_FILE_HEADER *t_FileHeader)
1671 IF_TRUE_RETURN(t_FileHeader == NULL, TADC_PARAMETER_ERROR);
1672 TADC_IF_MemSet(t_FileHeader, 0, sizeof(T_FILE_HEADER));
1677 int TADC_MEMFree_DRMHeader(T_DRM_HEADER *t_DrmHeader)
1679 IF_TRUE_RETURN(t_DrmHeader == NULL, TADC_PARAMETER_ERROR);
1680 t_DrmHeader->XmlSize = 0;
1681 TADC_IF_MemSet(t_DrmHeader->Version, 0, sizeof(t_DrmHeader->Version));
1683 if (t_DrmHeader->SID != NULL)
1685 TADC_IF_Free(t_DrmHeader->SID);
1686 t_DrmHeader->SID = NULL;
1689 if (t_DrmHeader->CID != NULL)
1691 TADC_IF_Free(t_DrmHeader->CID);
1692 t_DrmHeader->CID = NULL;
1695 TADC_IF_MemSet(t_DrmHeader->ContentsType, 0, sizeof(t_DrmHeader->ContentsType));
1696 t_DrmHeader->EncryptionRange = 0;
1698 if (t_DrmHeader->RIURL != NULL)
1700 TADC_IF_Free(t_DrmHeader->RIURL);
1701 t_DrmHeader->RIURL = NULL;
1704 t_DrmHeader->PlaintextSize = 0;
1705 if (t_DrmHeader->Packdate != NULL)
1707 TADC_IF_Free(t_DrmHeader->Packdate);
1708 t_DrmHeader->Packdate = NULL;
1711 if (t_DrmHeader->CEK != NULL)
1713 TADC_IF_Free(t_DrmHeader->CEK);
1714 t_DrmHeader->CEK = NULL;
1719 int TADC_MEMFree_ROAcqInfo(T_ROACQ_INFO *t_ROAcqInfo)
1721 IF_TRUE_RETURN(t_ROAcqInfo == NULL, TADC_PARAMETER_ERROR);
1723 if (t_ROAcqInfo->ROAcqURL != NULL)
1725 TADC_IF_Free(t_ROAcqInfo->ROAcqURL);
1726 t_ROAcqInfo->ROAcqURL = NULL;
1729 if (t_ROAcqInfo->ReqID != NULL)
1731 TADC_IF_Free(t_ROAcqInfo->ReqID);
1732 t_ROAcqInfo->ReqID = NULL;
1735 TADC_IF_MemSet(&t_ROAcqInfo->t_DHInfo, 0, sizeof(T_DH_INFO));