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)
340 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
341 IF_TRUE_RETURN(hashReqID == NULL, TADC_PARAMETER_ERROR);
342 int nSize = TADC_IF_StrLen((char*)inBuffer);
343 IF_TRUE_RETURN(nSize <= 40 || nSize>RESP_MAXSIZE, TADC_PARAMETER_ERROR);
345 //Check XML Result Code ( Success result='0' )
349 for (i = 0 ; i < nSize ; i++)
351 if (!TADC_IF_MemCmp((char*)(inBuffer + i), "<response result=", 17))
354 if ((!memcmp((char*)(inBuffer + i), "'0'", 3)) || (!memcmp((char*)(inBuffer + i), "\"0\"", 3)))
365 IF_TRUE_RETURN(((i == nSize) || (nResult < 0)), TADC_RESPONSEMESSAGE_ERROR);
369 char tmpbuf[512] = {0, };
371 for (i = 0 ; i < nSize ; i++)
373 if (!TADC_IF_MemCmp(inBuffer + i, "reqid=", 6))
377 IF_TRUE_RETURN(i + length > nSize || inBuffer[i + length] != ';',
378 TADC_RESPONSEMESSAGE_ERROR);
380 TADC_IF_StrNCpy(tmpbuf, (char*)(inBuffer + i), length);
381 tmpbuf[length] = '\0';
388 IF_TRUE_RETURN(length == 0, TADC_RESPONSEMESSAGE_ERROR);
390 if ((nResult = HEX2BIN((char*)tmpbuf, hashReqID, &length)) < 0)
403 int TADC_GetResponseRO(unsigned char * inBuffer, T_ROACQ_INFO *t_ROAcqInfo, T_RO *t_RO, unsigned char *outBuffer)
405 int nHMacSize = 28; // Base64 Enc length of SHA1 20byte
406 TADC_U8 sha1_tmp[20] = {0, };
407 char hmacBuf[512] = {0, };
408 BYTE *ReqTemp = NULL;
409 LPBYTE pbBuffer = NULL;
411 TADC_U8 key[16] = {0, };
412 TADC_U8 iv[16] = {0, };
416 char *License = NULL;
417 TCHAR tmpDH_B[DHKey_SIZE * 2 + 1] = {0, };
421 CPointerArray paChilds;
424 char *timeStamp = NULL;
432 char pRoHeader[36] = {'<', '?', 'x', 'm', 'l', ' ', 'v', 'e', 'r', 's', 'i', 'o', 'n', '=', '"', '1', '.', '0', '"', '?', '>', 0x0A,
433 '<', 'T', 'i', 'z', 'e', 'n', 'L', 'i', 'c', 'e', 'n', 's', 'e', '>'};
436 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
437 IF_TRUE_RETURN(t_ROAcqInfo== NULL, TADC_PARAMETER_ERROR);
438 IF_TRUE_RETURN(t_RO == NULL, TADC_PARAMETER_ERROR);
440 nSize = TADC_IF_StrLen((char*)inBuffer);
441 IF_TRUE_RETURN( nSize <= 40 || nSize>RESP_MAXSIZE, TADC_PARAMETER_ERROR);
443 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.pSize<=0 || t_ROAcqInfo->t_DHInfo.pSize>DHKey_SIZE, TADC_PARAMETER_ERROR);
444 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.ASize<=0 || t_ROAcqInfo->t_DHInfo.ASize>DHKey_SIZE, TADC_PARAMETER_ERROR);
446 //Check XML Result Code ( Success result='0' )
448 for (i = 0 ; i < nSize ; i++)
450 if (!TADC_IF_MemCmp((char*)(inBuffer + i), "<response result=", 17))
453 if ((!memcmp((char*)(inBuffer + i), "'0'", 3)) || (!memcmp((char*)(inBuffer + i), "\"0\"", 3)))
464 IF_TRUE_RETURN(((i == nSize) || (nResult < 0)), TADC_RESPONSEMESSAGE_ERROR);
467 TADC_IF_MemSet(t_RO, 0, sizeof(T_RO));
468 TADC_IF_MemSet(tmpDH_B, 0, sizeof(tmpDH_B));
469 TADC_IF_MemSet(sha1_tmp, 0, sizeof(sha1_tmp));
470 TADC_IF_MemSet(hmacBuf, 0, sizeof(hmacBuf));
475 for (i = 0 ; i < nSize ; i++)
477 if (!TADC_IF_MemCmp((char*)(inBuffer + i), "<responsedata>", 14))
480 for (j = i ; j < nSize ; j++)
482 if (!TADC_IF_MemCmp((char*)(inBuffer+j), ";hmac=", 6))
485 IF_TRUE_RETURN(req_length <= 0 || req_length >= RESP_MAXSIZE, TADC_PARAMETER_ERROR);
487 ReqTemp = (TADC_U8*)TADC_IF_Malloc(req_length);
488 IF_TRUE_RETURN(ReqTemp == NULL, TADC_MEMAlOC_ERROR);
490 TADC_IF_MemSet(ReqTemp, 0, req_length);
491 TADC_IF_MemCpy(ReqTemp, inBuffer+i, req_length);
495 TADC_IF_StrNCpy(hmacBuf, (char*)(inBuffer + i + 6), nHMacSize);
502 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
504 pbBuffer = Base64Decode( (LPCSTR)hmacBuf, &length );
505 if (pbBuffer == NULL)
507 TADC_IF_Free(ReqTemp);
512 TADC_IF_MemCpy(key, &g_baAESKey[0], 16 );
513 TADC_IF_MemCpy(iv, &g_baAESKey[16], 16 );
514 TADC_IF_AES_CTR(key, 16, iv, 20, (unsigned char*)pbBuffer, &outlen, (unsigned char*)pbBuffer);
516 TADC_IF_SHA1(ReqTemp, req_length, sha1_tmp);
519 TADC_IF_Free(ReqTemp);
523 if (TADC_IF_MemCmp(sha1_tmp, pbBuffer, sizeof(sha1_tmp)))
525 TADC_IF_Free(pbBuffer);
527 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_RESPONSESIGNATURE_ERROR);
528 return TADC_RESPONSESIGNATURE_ERROR;
531 TADC_IF_Free(pbBuffer);
536 for (i = 0 ; i < nSize ; i++)
538 if (!TADC_IF_MemCmp(inBuffer + i, "B=", 2))
541 for (j = i ; j < nSize ; j++)
543 if (!TADC_IF_MemCmp(inBuffer + j, ";", 1))
546 IF_TRUE_RETURN(req_length <= 0 || req_length >= (int)sizeof(tmpDH_B), TADC_PARAMETER_ERROR);
547 TADC_IF_StrNCpy((char*)tmpDH_B, (char*)(inBuffer + i), req_length);
548 tmpDH_B[req_length] = 0;
555 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
557 TADC_IF_MemSet(t_ROAcqInfo->t_DHInfo.B, 0, sizeof(t_ROAcqInfo->t_DHInfo.B));
558 TADC_IF_MemCpy(t_ROAcqInfo->t_DHInfo.B, tmpDH_B, sizeof(t_ROAcqInfo->t_DHInfo.B));
560 if (HEX2BIN((char*)tmpDH_B, t_ROAcqInfo->t_DHInfo.B, (int*)&t_ROAcqInfo->t_DHInfo.BSize) < 0)
562 return TADC_GETDHKEY_ERROR;
565 if(t_ROAcqInfo->t_DHInfo.BSize != 16 && t_ROAcqInfo->t_DHInfo.BSize != 64)
567 return TADC_GETDHKEY_ERROR;
570 TADC_IF_MemSet(t_ROAcqInfo->t_DHInfo.K, 0, sizeof(t_ROAcqInfo->t_DHInfo.K));
572 nResult = TADC_IF_GetDHKey_K(&t_ROAcqInfo->t_DHInfo);
573 IF_ERROR_RETURN(nResult, TADC_GETDHKEY_ERROR);
577 for (i = 0 ; i < nSize ; i++)
579 if (!TADC_IF_MemCmp((char*)(inBuffer + i), "license=", 8))
582 for (j = i ; j < nSize ; j++)
584 if (!TADC_IF_MemCmp((char*)(inBuffer + j), ";hmac=", 6))
587 IF_TRUE_RETURN(req_length <= 0 || req_length >= RESP_MAXSIZE, TADC_PARAMETER_ERROR);
589 License = (char*)TADC_IF_Malloc(req_length + 1);
590 IF_TRUE_RETURN(License == NULL, TADC_MEMAlOC_ERROR);
592 TADC_IF_MemSet(License, 0, req_length + 1);
593 TADC_IF_StrNCpy(License, (char*)(inBuffer + i), req_length);
600 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
602 // Get RO License Info
603 pbBuffer = Base64Decode((LPCSTR)License, &length);
606 TADC_IF_Free(License);
611 pbBuffer[length] = 0;
612 TADC_IF_Free(License);
616 TADC_IF_MemCpy(key, &t_ROAcqInfo->t_DHInfo.K[0], 16);
617 TADC_IF_MemCpy(iv, &t_ROAcqInfo->t_DHInfo.K[16], 16);
618 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char*)pbBuffer, &outlen, (unsigned char*)pbBuffer);
620 // Test Code for get the plaintext ro
622 strcat(tmpPath, (char*)t_RO->t_Content.CID);
623 strcat(tmpPath, ".ro");
624 fd = fopen(tmpPath, "w+b");
627 DRM_TAPPS_LOG("fopen started.");
628 fd = fopen("/tmp/1.ro", "w+b");
631 DRM_TAPPS_EXCEPTION("fopen() failed.");
634 DRM_TAPPS_LOG("fopen done.");
635 fwrite(pbBuffer, 1, strlen((char*)pbBuffer), fd);
636 DRM_TAPPS_LOG("fwrite done.");
638 DRM_TAPPS_LOG("fclose done.");
639 DRM_TAPPS_LOG("Save decrypted RO success!, path = %s", tmpPath);
643 if(TADC_IF_MemCmp((char*)pbBuffer, pRoHeader, 36))
645 TADC_IF_Free(pbBuffer);
647 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_LICENSEXMLPARSING_ERROR);
648 return TADC_LICENSEXMLPARSING_ERROR;
650 TADC_IF_MemCpy(outBuffer, pbBuffer, length);
651 TADC_IF_Free(pbBuffer);
654 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
657 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
662 DRM_TAPPS_LOG("timeStamp parsing start");
664 i = FindString(inBuffer, nSize, (unsigned char *)"<timeStamp>", 11);
666 DRM_TAPPS_LOG("No timeStamp. TADC_GetResponseRO Success!");
671 j = FindString(inBuffer, nSize, (unsigned char *)"</timeStamp>", 12);
672 IF_TRUE_RETURN(j < i, TADC_LICENSEXMLPARSING_ERROR);
674 IF_TRUE_RETURN(req_length > ROXML_MAXSIZE, TADC_PARAMETER_ERROR);
679 timeStamp = (char*)TADC_IF_Malloc(req_length + 1);
680 IF_TRUE_RETURN(timeStamp == NULL, TADC_MEMAlOC_ERROR);
682 TADC_IF_MemSet(timeStamp, 0, req_length + 1);
683 TADC_IF_StrNCpy(timeStamp, (char*)(inBuffer + i), req_length);
685 DRM_TAPPS_LOG("timeStamp parsing end.. req_length[%d]", req_length);
687 // Get RO License Info
688 pbBuffer = Base64Decode((LPCSTR)timeStamp, &length);
691 TADC_IF_Free(timeStamp);
693 DRM_TAPPS_EXCEPTION("Base64Decode Failed");
697 pbBuffer[length] = 0;
698 TADC_IF_Free(timeStamp);
701 DRM_TAPPS_LOG("Decrypt timeStamp starts");
704 TADC_IF_MemCpy(key, &t_ROAcqInfo->t_DHInfo.K[0], 16);
705 TADC_IF_MemCpy(iv, &t_ROAcqInfo->t_DHInfo.K[16], 16);
706 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char*)pbBuffer, &outlen, (unsigned char*)pbBuffer);
708 if (length >= (int)sizeof(t_ROAcqInfo->sTimeStamp))
710 TADC_IF_Free(pbBuffer);
712 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_RESPONSEMESSAGE_ERROR);
713 return TADC_RESPONSEMESSAGE_ERROR;
716 TADC_IF_MemCpy(t_ROAcqInfo->sTimeStamp, pbBuffer, length);
717 t_ROAcqInfo->sTimeStamp[length] = 0;
719 TADC_IF_Free(pbBuffer);
722 DRM_TAPPS_LOG("timeStamp found. TADC_GetResponseRO Success!");
726 int TADC_VerifyROSignature(IN LPBYTE pszXML)
729 int length = 0, i = 0, i2 = 0;
731 unsigned char* pSigData = NULL;
732 unsigned char* pRICert = NULL;
733 unsigned char* pRICACert = NULL;
735 int inLen = 0, sigLen = 0, certLen = 0, certLen2 = 0;
738 char TempBuf[CERT_MAXSIZE] = {0, };
741 IF_TRUE_RETURN(pszXML == NULL, TADC_PARAMETER_ERROR);
744 i = FindString(pszXML, TADC_IF_StrLen((char*)pszXML), (LPBYTE)"<version>2.0</version>", 22);
747 DRM_TAPPS_EXCEPTION("TADC_IF_VerifyROSignature Debug : It is not the TAD-RO2.0 format. \n");
751 DRM_TAPPS_LOG("TADC_IF_VerifyROSignature Debug : It is the TAD-RO2.0 format.\n");
753 //Get Certificates ( RI Cert )
754 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
756 i = FindString(pszXML, TADC_IF_StrLen((char*)pszXML), (LPBYTE)"<CertificateChain>", 18);
757 IF_TRUE_RETURN(i < 0, TADC_RO_CERTIFICATE_ERROR);
759 p = pszXML + i; // <certificateChain>
760 length = TADC_IF_StrLen((char*)pszXML) - i;
762 i = FindString(p, length, (LPBYTE)"<Certificate>", 13);
763 IF_TRUE_RETURN(i < 0, TADC_RO_CERTIFICATE_ERROR);
764 i += 13; // start position of RI Cert
766 i2 = FindString(p, length, (LPBYTE)"</Certificate>", 14);
767 IF_TRUE_RETURN(i2 < (i + 13), TADC_RO_CERTIFICATE_ERROR);
768 certLen = i2 - i; // size of RI Cert
770 TADC_IF_StrNCpy(TempBuf, (char*)p+i, certLen);
772 pRICert = Base64Decode( (LPCSTR)TempBuf, &certLen );
773 IF_TRUE_RETURN(pRICert == NULL, TADC_RO_CERTIFICATE_ERROR);
774 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
776 //Get Certificates ( RICA Cert )
777 p = p + (i2 + 14); // first </certificate>
778 length = length - (i2 + 14);
780 i = FindString(p, length, (LPBYTE)"<Certificate>", 13);
781 IF_TRUE_RETURN2(i < 0, TADC_IF_Free(pRICert),,,TADC_RO_CERTIFICATE_ERROR);
782 i += 13; // start position of RICA Cert
784 i2 = FindString(p, length, (LPBYTE)"</Certificate>", 14);
785 IF_TRUE_RETURN2(i2 < (i + 13), TADC_IF_Free(pRICert),,,TADC_RO_CERTIFICATE_ERROR);
786 certLen2 = i2 - i; // size of RICA Cert
788 TADC_IF_StrNCpy(TempBuf, (char*)p + i, certLen2);
790 pRICACert = Base64Decode((LPCSTR)TempBuf, &certLen2);
791 IF_TRUE_RETURN2(pRICACert == NULL, TADC_IF_Free(pRICert),,,TADC_RO_CERTIFICATE_ERROR);
792 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
794 //Get position of indata
795 inLen = FindString(pszXML, TADC_IF_StrLen((char*)pszXML), (LPBYTE)"</CertificateChain>", 19);
796 IF_TRUE_RETURN2(inLen < 0, TADC_IF_Free(pRICert),TADC_IF_Free(pRICACert),,TADC_RO_CERTIFICATE_ERROR);
799 //Get signature value </certificateChain>
801 length = TADC_IF_StrLen((char*)pszXML)-inLen;
803 i = FindString(p, length, (LPBYTE)"<SignatureValue>", 16);
804 IF_TRUE_RETURN2(i < 0, TADC_IF_Free(pRICert),TADC_IF_Free(pRICACert),,TADC_RO_SIGNATURE_ERROR);
805 i += 16; // start position of signature value
807 i2 = FindString(p, length, (LPBYTE)"</SignatureValue>", 17);
808 IF_TRUE_RETURN2(i2 < (i + 16), TADC_IF_Free(pRICert),TADC_IF_Free(pRICACert),,TADC_RO_SIGNATURE_ERROR);
809 sigLen = i2 - i; // size of signature value
811 TADC_IF_StrNCpy(TempBuf, (char*)p + i, sigLen);
813 pSigData = Base64Decode( (LPCSTR)TempBuf, &sigLen );
814 IF_TRUE_RETURN2(pSigData == NULL, TADC_IF_Free(pRICert),TADC_IF_Free(pRICACert),,TADC_RO_SIGNATURE_ERROR);
815 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
817 //Verify the certificate chain
818 nResult = TADC_IF_VerifyCertChain(pRICACert, certLen2, pRICert, certLen);
821 nResult = TADC_IF_VerifySignature(pszXML, inLen, pSigData, sigLen, pRICert, certLen);
824 TADC_IF_Free(pRICert);
825 TADC_IF_Free(pRICACert);
826 TADC_IF_Free(pSigData);
831 int TADC_GetResponseROInfo(IN LPBYTE pszXML, T_RO *t_RO)
835 CXMLElement* pRoot, *pElement;
836 CPointerArray paChilds;
838 LPBYTE pbBuffer = NULL;
840 TADC_U8 TempVersion[3] = {0, };
842 char pRoHeader[36] = {'<', '?', 'x', 'm', 'l', ' ', 'v', 'e', 'r', 's', 'i', 'o', 'n', '=', '"', '1', '.', '0', '"', '?', '>', 0x0A,
843 '<', 'T', 'i', 'z', 'e', 'n', 'L', 'i', 'c', 'e', 'n', 's', 'e', '>'};
846 IF_TRUE_RETURN(pszXML == NULL, TADC_PARAMETER_ERROR);
847 IF_TRUE_RETURN(t_RO == NULL, TADC_PARAMETER_ERROR);
850 TADC_IF_MemSet(t_RO, 0, sizeof(T_RO));
851 TADC_IF_MemSet(TempVersion, 0, sizeof(TempVersion));
853 if (TADC_IF_MemCmp((char*)pszXML, pRoHeader, 36))
855 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
859 // Verify the signature ( 2011.03.08, Joseph Ahn )
860 nResult = TADC_VerifyROSignature(pszXML);
863 DRM_TAPPS_EXCEPTION("TADC_VerifyROSignature Error Code = %x", nResult);
867 nResult = oXMLFile.LoadFromStream((LPCTSTR)pszXML);
870 DRM_TAPPS_EXCEPTION("oXMLFile.LoadFromStream is failed\n");
876 pRoot = oXMLFile.GetRoot();
879 DRM_TAPPS_EXCEPTION("oXMLFile.GetRoot is failed\n");
884 paChilds.RemoveAll();
885 nResult = pRoot->Find( &paChilds, _T("ContentInfo"), _T("cid"), NULL);
888 DRM_TAPPS_EXCEPTION("pRoot->Find is failed\n");
893 if (paChilds.GetCount() != 1)
895 DRM_TAPPS_EXCEPTION("paChilds.GetCount() is failed\n");
900 pElement = (CXMLElement*)paChilds.Get(0);
901 pszValue = pElement->GetValue();
902 if (pszValue == NULL)
904 DRM_TAPPS_EXCEPTION("pElement->GetValue() is failed\n");
909 length = TADC_IF_StrLen((char*)pszValue);
910 if (length <= 0 || length > CID_SIZE)
912 DRM_TAPPS_EXCEPTION("TADC_IF_StrLen is failed(%d) - %s\n", length, pszValue);
917 t_RO->t_Content.CID = (TADC_U8*)TADC_IF_Malloc(length + 1); //2011.03.08 ( CID_SIZE -> length )
918 IF_TRUE_GOTO(t_RO->t_Content.CID == NULL, -2);
919 TADC_IF_MemSet(t_RO->t_Content.CID, 0, length + 1); //2011.03.08 ( CID_SIZE -> length )
920 TADC_IF_StrNCpy((CHAR*)t_RO->t_Content.CID, pszValue, length);
922 // Get KeyValue (CEK)
923 pRoot = oXMLFile.GetRoot();
924 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
926 paChilds.RemoveAll();
927 nResult = pRoot->Find( &paChilds, _T("KeyInfo"), _T("CipherValue"), NULL);
929 IF_TRUE_GOTO(nResult != 0, ERROR_INVALID_DATA);
930 IF_TRUE_GOTO(paChilds.GetCount() != 1, ERROR_INVALID_DATA);
932 pElement = (CXMLElement*)paChilds.Get(0);
933 pszValue = pElement->GetValue();
934 IF_TRUE_GOTO(pszValue == NULL, -2);
936 pbBuffer = Base64Decode(pszValue, &length);
937 if (pbBuffer == NULL)
939 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
943 if (length <= 0 || length > CEK_SIZE)
945 TADC_IF_Free(pbBuffer);
951 t_RO->t_Content.CEK = (TADC_U8*)TADC_IF_Malloc(length + 1); //2011.03.08 ( CEK_SIZE -> length )
952 IF_TRUE_GOTO(t_RO->t_Content.CEK == NULL, -2);
953 TADC_IF_MemSet(t_RO->t_Content.CEK, 0, length + 1); //2011.03.08 ( CEK_SIZE -> length )
954 TADC_IF_MemCpy(t_RO->t_Content.CEK, pbBuffer, length);
956 TADC_IF_Free(pbBuffer);
960 pRoot = oXMLFile.GetRoot();
961 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
963 paChilds.RemoveAll();
964 nResult = pRoot->Find( &paChilds, _T("DeviceInfo"), _T("DUID"), NULL);
966 IF_TRUE_GOTO(nResult != 0, ERROR_INVALID_DATA);
967 IF_TRUE_GOTO(paChilds.GetCount() != 1, ERROR_INVALID_DATA);
969 pElement = (CXMLElement*)paChilds.Get(0);
970 pszValue = pElement->GetValue();
971 IF_TRUE_GOTO(pszValue == NULL, -1);
972 length = TADC_IF_StrLen((char*)pszValue);
979 t_RO->PerFlag |= DUID_RULE;
980 t_RO->t_Permission.t_Individual.BindingType |= DUID_RULE;
981 t_RO->t_Permission.t_Individual.DUID = (TADC_U8*)TADC_IF_Malloc(length + 1);
983 if (t_RO->t_Permission.t_Individual.DUID == NULL)
985 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_MEMAlOC_ERROR);
990 TADC_IF_MemSet(t_RO->t_Permission.t_Individual.DUID, 0, length + 1);
991 TADC_IF_MemCpy((CHAR*)t_RO->t_Permission.t_Individual.DUID, pszValue, length);
1000 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
1005 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_MEMAlOC_ERROR);
1008 TADC_IF_Free(pbBuffer);
1013 int TADC_GetFileHeader(unsigned char * inBuffer, T_FILE_HEADER *t_FileHeader)
1016 BYTE FixedFileType[8] = {0x00,0x00,0x00,0x14,0x66,0x74,0x79,0x70};
1019 //Check Param Bufffer
1020 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
1021 IF_TRUE_RETURN(t_FileHeader == NULL, TADC_PARAMETER_ERROR);
1024 TADC_IF_MemSet(t_FileHeader, 0, sizeof(T_FILE_HEADER));
1025 TADC_IF_MemSet(tmp, 0, sizeof(tmp));
1027 if (TADC_IF_MemCmp(inBuffer, FixedFileType, sizeof(FixedFileType)))
1029 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSSTRUCT_ERROR);
1034 if (TADC_IF_MemCmp(inBuffer+i, "TADF", 4))
1036 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSSTRUCT_ERROR);
1041 t_FileHeader->Version[0] = '1';
1042 t_FileHeader->Version[1] = '0';
1045 if (TADC_IF_MemCmp(inBuffer+i, "TADF", 4))
1047 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSSTRUCT_ERROR);
1052 t_FileHeader->DRMType = inBuffer[i];
1055 TADC_IF_MemCpy(t_FileHeader->ContentsType, inBuffer+i, 128);
1058 TADC_IF_MemCpy(&t_FileHeader->TotalSize, inBuffer+i, 8);
1060 t_FileHeader->TotalSize = _hton64(t_FileHeader->TotalSize);
1062 TADC_IF_MemCpy(&t_FileHeader->Offset1, inBuffer+i, 8);
1064 t_FileHeader->Offset1 = _hton64(t_FileHeader->Offset1);
1066 TADC_IF_MemCpy(&t_FileHeader->Offset2, inBuffer+i, 8);
1068 t_FileHeader->Offset2 = _hton64(t_FileHeader->Offset2);
1070 TADC_IF_MemCpy(&t_FileHeader->Offset3, inBuffer+i, 8);
1072 t_FileHeader->Offset3 = _hton64(t_FileHeader->Offset3);
1074 TADC_IF_MemCpy(&t_FileHeader->Offset4, inBuffer+i, 8);
1076 t_FileHeader->Offset4 = _hton64(t_FileHeader->Offset4);
1078 TADC_IF_MemCpy(&t_FileHeader->Offset5, inBuffer+i, 8);
1080 t_FileHeader->Offset5 = _hton64(t_FileHeader->Offset5);
1082 TADC_IF_MemCpy(&t_FileHeader->Offset6, inBuffer+i, 8);
1084 t_FileHeader->Offset6 = _hton64(t_FileHeader->Offset6);
1086 TADC_IF_MemCpy(&t_FileHeader->Offset7, inBuffer+i, 8);
1088 t_FileHeader->Offset7 = _hton64(t_FileHeader->Offset7);
1090 TADC_IF_MemCpy(&t_FileHeader->Offset8, inBuffer+i, 8);
1092 t_FileHeader->Offset8 = _hton64(t_FileHeader->Offset8);
1094 DRM_TAPPS_LOG("TADC_GetFileHeader Success!\n");
1098 int TADC_GetDRMHeader(unsigned char * inBuffer, T_DRM_HEADER *t_DRMHeader)
1102 //Check Param Bufffer
1103 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
1104 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1107 TADC_IF_MemSet(t_DRMHeader, 0, sizeof(T_DRM_HEADER));
1109 if (TADC_IF_MemCmp(inBuffer, "TIZEN_DRM", 9))
1111 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_NOTTADCFILE_ERROR);
1116 TADC_IF_MemCpy(t_DRMHeader->Version, inBuffer+i, 2);
1119 TADC_IF_MemCpy(&t_DRMHeader->XmlSize, inBuffer+i, 4);
1122 t_DRMHeader->XmlSize = htonl_(t_DRMHeader->XmlSize);
1123 DRM_TAPPS_LOG("TADC_GetDRMHeader Success!\n");
1128 int TADC_GetDRMHeaderInfo(unsigned char * inBuffer, T_DRM_HEADER *t_DRMHeader)
1132 CXMLElement* pRoot, *pNode;
1133 CPointerArray paChilds;
1137 unsigned char *ReqTemp=NULL;
1146 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
1147 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1149 IF_TRUE_RETURN(t_DRMHeader->XmlSize <= 0 || t_DRMHeader->XmlSize > ROXML_MAXSIZE, TADC_PARAMETER_ERROR);
1151 ReqTemp = (TADC_U8*)TADC_IF_Malloc(t_DRMHeader->XmlSize);
1152 IF_TRUE_RETURN(ReqTemp == NULL, TADC_MEMAlOC_ERROR);
1154 TADC_IF_MemSet(ReqTemp, 0, t_DRMHeader->XmlSize);
1155 TADC_IF_MemSet(sha1_tmp, 0, sizeof(sha1_tmp) );
1158 TADC_IF_MemCpy(ReqTemp, inBuffer + 20, t_DRMHeader->XmlSize);
1159 TADC_IF_SHA1(ReqTemp, t_DRMHeader->XmlSize, sha1_tmp);
1161 if (ReqTemp != NULL)
1163 TADC_IF_Free(ReqTemp);
1167 TADC_IF_MemCpy(key, &g_baSignatureKey[0], 16);
1168 TADC_IF_MemCpy(iv, &g_baSignatureKey[16], 16);
1169 TADC_IF_AES_CTR(key, 16, iv, 20, (unsigned char*)sha1_tmp, &outlen, (unsigned char*)sha1_tmp);
1171 if (TADC_IF_MemCmp(sha1_tmp, inBuffer, sizeof(sha1_tmp)))
1173 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSHMAC_ERROR);
1178 nResult = oXMLFile.LoadFromStream((LPCTSTR)(inBuffer + 20));
1182 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSXML_ERROR);
1186 pRoot = oXMLFile.GetRoot();
1187 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1189 paChilds.RemoveAll();
1190 nResult = pRoot->Find( &paChilds, _T("SID"), NULL );
1194 if (paChilds.GetCount() == 1)
1196 pNode = (CXMLElement*)paChilds.Get(0);
1197 pszValue = pNode->GetValue();
1198 Length = TADC_IF_StrLen((char*)pszValue);
1202 t_DRMHeader->SID = (TADC_U8*)TADC_IF_Malloc(Length + 1);
1203 IF_TRUE_RETURN(t_DRMHeader->SID == NULL, TADC_MEMAlOC_ERROR);
1204 TADC_IF_MemSet(t_DRMHeader->SID, 0, Length + 1);
1205 TADC_IF_StrNCpy((CHAR*)t_DRMHeader->SID, pszValue, Length);
1210 pRoot = oXMLFile.GetRoot();
1211 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1213 paChilds.RemoveAll();
1214 nResult = pRoot->Find( &paChilds, _T("CID"), NULL );
1218 if (paChilds.GetCount() == 1)
1220 pNode = (CXMLElement*)paChilds.Get(0);
1221 pszValue = pNode->GetValue();
1222 Length = TADC_IF_StrLen((char*)pszValue); //2011.03.08
1226 t_DRMHeader->CID = (TADC_U8*)TADC_IF_Malloc(Length + 1); //2011.03.08 ( CID_SIZE -> Length )
1227 IF_TRUE_RETURN(t_DRMHeader->CID == NULL, TADC_MEMAlOC_ERROR);
1228 TADC_IF_MemSet(t_DRMHeader->CID, 0, Length + 1); //2011.03.08 ( CID_SIZE -> Length )
1229 TADC_IF_StrNCpy((CHAR*)t_DRMHeader->CID, pszValue, Length); //2011.03.08 ( CID_SIZE -> Length )
1234 pRoot = oXMLFile.GetRoot();
1235 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1236 paChilds.RemoveAll();
1237 nResult = pRoot->Find(&paChilds, _T("ContentType"), NULL);
1241 if (paChilds.GetCount() == 1)
1243 pNode = (CXMLElement*)paChilds.Get(0);
1244 pszValue = pNode->GetValue();
1245 Length = TADC_IF_StrLen((char*)pszValue);
1246 TADC_IF_MemSet(t_DRMHeader->ContentsType, 0, 128);
1247 TADC_IF_StrNCpy((CHAR*)t_DRMHeader->ContentsType, pszValue, Length);
1251 pRoot = oXMLFile.GetRoot();
1252 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1253 paChilds.RemoveAll();
1254 nResult = pRoot->Find( &paChilds, _T("EncryptionMethod"), NULL );
1258 if (paChilds.GetCount() == 1)
1260 pNode = (CXMLElement*)paChilds.Get(0);
1261 pszValue = pNode->GetValue();
1262 t_DRMHeader->EncryptionMethod = TADC_IF_AtoI((char*)pszValue);
1266 pRoot = oXMLFile.GetRoot();
1267 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1268 paChilds.RemoveAll();
1269 nResult = pRoot->Find( &paChilds, _T("EncryptionLevel"), NULL );
1273 if (paChilds.GetCount() == 1)
1275 pNode = (CXMLElement*)paChilds.Get(0);
1276 pszValue = pNode->GetValue();
1277 t_DRMHeader->EncryptionLevel = TADC_IF_AtoI((char*)pszValue);
1281 pRoot = oXMLFile.GetRoot();
1282 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1283 paChilds.RemoveAll();
1284 nResult = pRoot->Find( &paChilds, _T("EncryptionRange"), NULL );
1288 if (paChilds.GetCount() == 1)
1290 pNode = (CXMLElement*)paChilds.Get(0);
1291 pszValue = pNode->GetValue();
1292 t_DRMHeader->EncryptionRange = TADC_IF_AtoI((char*)pszValue);
1296 pRoot = oXMLFile.GetRoot();
1297 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1298 paChilds.RemoveAll();
1299 nResult = pRoot->Find( &paChilds, _T("RIURL"), NULL );
1303 if (paChilds.GetCount() == 1)
1305 pNode = (CXMLElement*)paChilds.Get(0);
1306 pszValue = pNode->GetValue();
1307 Length = TADC_IF_StrLen((char*)pszValue);
1311 t_DRMHeader->RIURL = (TADC_U8*)TADC_IF_Malloc(Length+1);
1312 IF_TRUE_RETURN(t_DRMHeader->RIURL == NULL, TADC_MEMAlOC_ERROR);
1313 TADC_IF_MemSet(t_DRMHeader->RIURL, 0, Length+1);
1314 TADC_IF_StrNCpy((CHAR*)t_DRMHeader->RIURL, pszValue, Length);
1319 // dummy RIURL(DRM Server spec changed)
1320 if (t_DRMHeader->RIURL == NULL)
1322 pszValue = "dummy_riurl";
1323 Length = TADC_IF_StrLen(pszValue);
1324 t_DRMHeader->RIURL = (TADC_U8*)TADC_IF_Malloc(Length+1);
1325 IF_TRUE_RETURN(t_DRMHeader->RIURL == NULL, TADC_MEMAlOC_ERROR);
1326 TADC_IF_MemSet(t_DRMHeader->RIURL, 0, Length+1);
1327 TADC_IF_StrNCpy((CHAR*)t_DRMHeader->RIURL, pszValue, Length);
1330 DRM_TAPPS_LOG("t_DRMHeader->RIURL = %s\n", (char*)t_DRMHeader->RIURL);
1332 pRoot = oXMLFile.GetRoot();
1333 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1334 paChilds.RemoveAll();
1335 nResult = pRoot->Find( &paChilds, _T("PlaintextSize"), NULL );
1339 if (paChilds.GetCount() == 1)
1341 pNode = (CXMLElement*)paChilds.Get(0);
1342 pszValue = pNode->GetValue();
1343 t_DRMHeader->PlaintextSize = TADC_IF_AtoI((char*)pszValue);
1347 pRoot = oXMLFile.GetRoot();
1348 IF_TRUE_GOTO( pRoot == NULL, ERROR_INVALID_DATA );
1349 paChilds.RemoveAll();
1350 nResult = pRoot->Find( &paChilds, _T("Packdate"), NULL );
1354 if (paChilds.GetCount() == 1)
1356 pNode = (CXMLElement*)paChilds.Get(0);
1357 pszValue = pNode->GetValue();
1358 Length = TADC_IF_StrLen((char*)pszValue);
1362 t_DRMHeader->Packdate = (TADC_U8*)TADC_IF_Malloc(Length+1);
1363 IF_TRUE_RETURN(t_DRMHeader->Packdate == NULL, TADC_MEMAlOC_ERROR);
1364 TADC_IF_MemSet(t_DRMHeader->Packdate, 0, Length+1);
1365 TADC_IF_StrNCpy((char*)t_DRMHeader->Packdate, pszValue, Length);
1373 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSXML_ERROR);
1374 STACKTRACE( _T( "CNCG20File::_ParseHeader()" ) );
1376 DRM_TAPPS_LOG("TADC_GetDRMHeaderInfo Success! \n");
1380 int TADC_GetCEK(T_DEVICE_INFO *t_DeviceInfo, T_RO *t_RODB, T_DRM_HEADER *t_DRMHeader)
1384 //Check Parameter Buffer
1385 IF_TRUE_RETURN(t_DeviceInfo == NULL, TADC_PARAMETER_ERROR);
1386 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1387 IF_TRUE_RETURN(t_DRMHeader->CID == NULL, TADC_PARAMETER_ERROR);
1388 IF_TRUE_RETURN(t_RODB == NULL, TADC_PARAMETER_ERROR);
1389 IF_TRUE_RETURN(t_RODB->t_Content.CID == NULL, TADC_PARAMETER_ERROR);
1391 if(!TADC_IF_StrCmp((char*)t_DRMHeader->CID, (char*)t_RODB->t_Content.CID)) //2011.03.08 ( TADC_IF_MemCmp -> TADC_IF_StrCmp )
1393 if((t_RODB->PerFlag & DUID_RULE) && (t_RODB->t_Permission.t_Individual.BindingType & DUID_RULE))
1395 IF_TRUE_RETURN(t_RODB->t_Permission.t_Individual.DUID == NULL, TADC_PARAMETER_ERROR);
1396 length1 = TADC_IF_StrLen((char*)t_DeviceInfo->DUID);
1397 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);
1398 /*if(TADC_IF_MemCmp(t_DeviceInfo->DUID, t_RODB->t_Permission.t_Individual.DUID, length1))
1400 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_RULE_DUID_ERROR);
1404 IF_TRUE_RETURN(t_RODB->t_Content.CEK == NULL, TADC_PARAMETER_ERROR);
1405 t_DRMHeader->CEK = (TADC_U8*)TADC_IF_Malloc(CEK_SIZE + 1);
1406 IF_TRUE_RETURN(t_DRMHeader->CEK == NULL, TADC_MEMAlOC_ERROR);
1407 TADC_IF_MemSet(t_DRMHeader->CEK, 0, CEK_SIZE + 1);
1408 TADC_IF_MemCpy(t_DRMHeader->CEK, t_RODB->t_Content.CEK, CEK_SIZE);
1410 DRM_TAPPS_LOG("TADC_GetCEK Success!\n");
1414 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_RULE_NOINFOMATION);
1419 int TADC_DecryptBlock(char *pbBuffer, int nSize, const T_DRM_HEADER *t_DRMHeader)
1421 TADC_U8 key[16] = {0, };
1422 TADC_U8 iv[16] = {0, };
1423 int i = 0, nBlocks = 0, nIndex = 0;
1424 char baToBeEncrypted[32] = {0, };
1425 int nRemainBytes = 0, nBlockBytes = 0;
1427 int nEncryptionLevel = 0;
1428 int nEncryptionMethod = 0;
1430 char temp[512] = {0, };
1434 TADC_IF_MemSet(temp, 0, sizeof(temp));
1436 IF_TRUE_RETURN(pbBuffer == NULL, TADC_PARAMETER_ERROR);
1437 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1439 IF_TRUE_RETURN(nSize > 512, TADC_PARAMETER_ERROR);
1440 IF_TRUE_RETURN(t_DRMHeader->CEK == NULL, TADC_PARAMETER_ERROR);
1442 nEncryptionLevel = t_DRMHeader->EncryptionLevel;
1443 nEncryptionMethod = t_DRMHeader->EncryptionMethod;
1445 IF_TRUE_RETURN(nEncryptionMethod != 1, TADC_PARAMETER_ERROR);
1446 IF_TRUE_RETURN(nEncryptionLevel < 0 || nEncryptionLevel > 32, TADC_PARAMETER_ERROR);
1448 TADC_IF_MemSet( baToBeEncrypted, 1, 32 );
1450 if (nEncryptionLevel > 16)
1456 nBlocks = nEncryptionLevel;
1459 for (i = 0 ; i < nBlocks ; i++)
1461 nIndex = 31 - (i * 2);
1462 baToBeEncrypted[nIndex] = 0;
1465 for (i = 16 ; i < nEncryptionLevel ; i++)
1467 nIndex = 30 - ((i - 16) * 2);
1468 baToBeEncrypted[nIndex] = 0;
1471 nRemainBytes = nSize;
1477 for (i = 0 ; i < 32 ; i++)
1479 if (nRemainBytes < 16)
1481 nBlockBytes = nRemainBytes;
1484 if (baToBeEncrypted[i] == 1)
1486 TADC_IF_MemCpy(temp + length, pbBuffer + totlength, nBlockBytes);
1487 length += nBlockBytes;
1490 nRemainBytes -= nBlockBytes;
1491 totlength += nBlockBytes;
1493 if (nRemainBytes < 1)
1499 TADC_IF_MemCpy(key, &t_DRMHeader->CEK[0], 16);
1500 TADC_IF_MemCpy(iv, &t_DRMHeader->CEK[16], 16);
1501 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char*)temp, &length, (unsigned char*)temp);
1503 nRemainBytes = nSize;
1509 for (i = 0 ; i < 32 ; i++)
1511 if (nRemainBytes < 16)
1513 nBlockBytes = nRemainBytes;
1516 if (baToBeEncrypted[i] == 1)
1518 TADC_IF_MemCpy(pbBuffer + totlength, temp + length, nBlockBytes);
1519 length += nBlockBytes;
1522 nRemainBytes -= nBlockBytes;
1523 totlength += nBlockBytes;
1525 if (nRemainBytes < 1)
1533 int TADC_GetDRMHeaderFromFile(const char *pTADCFilepath, T_FILE_HEADER *t_FileHeader, T_DRM_HEADER *t_DRMHeader )
1536 unsigned char tempbuf[512];
1537 unsigned char *pbuf = NULL;
1540 ULONG readsize=0, ReadLen=0;
1542 FILE *hFile = 0; //Apps drm file
1545 if (pTADCFilepath == NULL || t_FileHeader == NULL || t_DRMHeader == NULL)
1547 DRM_TAPPS_EXCEPTION("Error : Parameter Null.");
1552 TADC_IF_MemSet(tempbuf, 0, sizeof(tempbuf));
1555 if ((hFile = fopen(pTADCFilepath, "rb")) == NULL)
1557 DRM_TAPPS_EXCEPTION("Error : fopen() error.");
1563 //FmReadFile(hFile, tempbuf, readsize, &ReadLen);
1564 ReadLen = fread(tempbuf, 1, readsize, hFile);
1565 if ((readsize != ReadLen) || (ret=TADC_GetFileHeader(tempbuf, t_FileHeader)) < 0)
1567 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1571 TADC_IF_MemSet(tempbuf, 0, sizeof(tempbuf));
1573 //Tizen Apps DRM Type Check
1574 if (t_FileHeader->DRMType & TIZEN_DRM)
1576 DRM_TAPPS_LOG("It's a TAPPS DCF = %s", pTADCFilepath);
1578 ReadLen = fread(tempbuf, 1, readsize, hFile);
1579 if ((readsize != ReadLen) || (ret=TADC_GetDRMHeader(tempbuf, t_DRMHeader)) < 0)
1581 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1586 readsize = 20 + t_DRMHeader->XmlSize;
1587 if ((pbuf = (unsigned char*)TADC_IF_Malloc( readsize * sizeof(char))) == NULL)
1589 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1594 ReadLen = fread(pbuf, 1, readsize, hFile);
1595 if (readsize != ReadLen)
1597 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1603 if (TADC_GetDRMHeaderInfo(pbuf, t_DRMHeader) < 0)
1605 DRM_TAPPS_EXCEPTION("Error : TADC_GetDRMHeaderInfo error.");
1614 DRM_TAPPS_EXCEPTION("Error : It's not a TApps DCF file.");
1623 DWORD TADC_GetLastError(void)
1625 DWORD dwError = g_TADCErrorCode;
1626 g_TADCErrorCode = 0;
1631 int TADC_MEMFree_RO(T_RO *t_ro)
1633 IF_TRUE_RETURN(t_ro == NULL, TADC_PARAMETER_ERROR);
1636 if (t_ro->t_Content.CID != NULL)
1638 TADC_IF_Free(t_ro->t_Content.CID);
1639 t_ro->t_Content.CID = NULL;
1642 if (t_ro->t_Content.CEK!= NULL)
1644 TADC_IF_Free(t_ro->t_Content.CEK);
1645 t_ro->t_Content.CEK = NULL;
1648 if (t_ro->t_Permission.t_Individual.DUID != NULL)
1650 TADC_IF_Free(t_ro->t_Permission.t_Individual.DUID);
1651 t_ro->t_Permission.t_Individual.DUID = NULL;
1657 int TADC_MEMFree_FileHeader(T_FILE_HEADER *t_FileHeader)
1659 IF_TRUE_RETURN(t_FileHeader == NULL, TADC_PARAMETER_ERROR);
1660 TADC_IF_MemSet(t_FileHeader, 0, sizeof(T_FILE_HEADER));
1665 int TADC_MEMFree_DRMHeader(T_DRM_HEADER *t_DrmHeader)
1667 IF_TRUE_RETURN(t_DrmHeader == NULL, TADC_PARAMETER_ERROR);
1668 t_DrmHeader->XmlSize = 0;
1669 TADC_IF_MemSet(t_DrmHeader->Version, 0, sizeof(t_DrmHeader->Version));
1671 if (t_DrmHeader->SID != NULL)
1673 TADC_IF_Free(t_DrmHeader->SID);
1674 t_DrmHeader->SID = NULL;
1677 if (t_DrmHeader->CID != NULL)
1679 TADC_IF_Free(t_DrmHeader->CID);
1680 t_DrmHeader->CID = NULL;
1683 TADC_IF_MemSet(t_DrmHeader->ContentsType, 0, sizeof(t_DrmHeader->ContentsType));
1684 t_DrmHeader->EncryptionRange = 0;
1686 if (t_DrmHeader->RIURL != NULL)
1688 TADC_IF_Free(t_DrmHeader->RIURL);
1689 t_DrmHeader->RIURL = NULL;
1692 t_DrmHeader->PlaintextSize = 0;
1693 if (t_DrmHeader->Packdate != NULL)
1695 TADC_IF_Free(t_DrmHeader->Packdate);
1696 t_DrmHeader->Packdate = NULL;
1699 if (t_DrmHeader->CEK != NULL)
1701 TADC_IF_Free(t_DrmHeader->CEK);
1702 t_DrmHeader->CEK = NULL;
1707 int TADC_MEMFree_ROAcqInfo(T_ROACQ_INFO *t_ROAcqInfo)
1709 IF_TRUE_RETURN(t_ROAcqInfo == NULL, TADC_PARAMETER_ERROR);
1711 if (t_ROAcqInfo->ROAcqURL != NULL)
1713 TADC_IF_Free(t_ROAcqInfo->ROAcqURL);
1714 t_ROAcqInfo->ROAcqURL = NULL;
1717 if (t_ROAcqInfo->ReqID != NULL)
1719 TADC_IF_Free(t_ROAcqInfo->ReqID);
1720 t_ROAcqInfo->ReqID = NULL;
1723 TADC_IF_MemSet(&t_ROAcqInfo->t_DHInfo, 0, sizeof(T_DH_INFO));