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 Tizen Apps DRM Core APIs.
20 #include "drm-tizen-error.h"
21 #include "TADC_Util.h"
24 #include "TADC_ErrorCode.h"
26 static BYTE g_baSignatureKey[32] = {
27 0x29, 0x2b, 0xf2, 0x29, 0x1f, 0x8b, 0x47, 0x81,
28 0x95, 0x0a, 0x84, 0xf8, 0x91, 0xda, 0x07, 0xd0,
29 0x9c, 0xde, 0x32, 0x3e, 0x9e, 0x46, 0x4a, 0xfc,
30 0xa4, 0xcc, 0x55, 0x6e, 0xf2, 0x81, 0x61, 0xdb
33 static BYTE g_baAESKey[32] = {
34 0xf8, 0x87, 0x0a, 0xc5, 0xd3, 0x6d, 0x44, 0x49,
35 0x03, 0x9f, 0xbd, 0x1e, 0xa8, 0x2f, 0xf6, 0xc3,
36 0xdf, 0x3b, 0x02, 0x13, 0x58, 0x1b, 0x12, 0x30,
37 0x1c, 0xd7, 0xad, 0xa5, 0x1f, 0x5d, 0x01, 0x33
40 static DWORD g_TADCErrorCode = 0;
42 int TADC_SetDeviceInfo(T_DEVICE_INFO *t_DeviceInfo)
46 TADC_IF_MemSet(t_DeviceInfo, 0, sizeof(T_DEVICE_INFO));
49 nResult = TADC_IF_GetDUID((CHAR *)t_DeviceInfo->DUID);
50 IF_ERROR_RETURN(nResult, TADC_GETDUID_ERROR);
55 int TADC_MakeRequestLicense(T_DEVICE_INFO *t_DeviceInfo,
56 T_FILE_HEADER *t_FileHeader,
57 T_DRM_HEADER *t_DRMHeader,
58 unsigned char *outBuffer,
65 IF_TRUE_RETURN(outBuffer == NULL, TADC_PARAMETER_ERROR);
67 snprintf((char *)outBuffer, outBufferSize,
68 "<?xml version='1.0'?>\n<request>\n<DeviceInfo>\n"
69 "<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);
78 snprintf((char *)outBuffer + length, outBufferSize - length,
79 "<ContentInfo>\n<DRMType>%d</DRMType>\n<sid>%s</sid>\n"
80 "<cid>%s</cid>\n</ContentInfo>\n</request>",
81 t_FileHeader->DRMType, t_DRMHeader->SID, t_DRMHeader->CID);
82 length = TADC_IF_StrLen((char *)outBuffer);
83 IF_TRUE_RETURN(length <= 0, TADC_XMLPARSER_ERROR);
85 DRM_TAPPS_LOG("TADC_MakeRequestLicense Success!\n");
90 int TADC_GetROAcqInfo(unsigned char *inBuffer, T_ROACQ_INFO *t_ROAcqInfo)
98 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
99 nSize = TADC_IF_StrLen((char *) inBuffer);
100 IF_TRUE_RETURN(nSize <= 40 || nSize > RESP_MAXSIZE, TADC_PARAMETER_ERROR);
102 //Check XML Result Code ( Success result='0' )
105 for (i = 0; i < nSize; i++) {
106 if (!TADC_IF_MemCmp((char *)(inBuffer + i), "<response result=", 17)) {
109 if ((!memcmp((char *)(inBuffer + i), "'0'", 3)) ||
110 (!memcmp((char *)(inBuffer + i), "\"0\"", 3))) {
119 IF_TRUE_RETURN(((i == nSize) || (nResult < 0)), TADC_RESPONSEMESSAGE_ERROR);
123 TADC_IF_MemSet(t_ROAcqInfo, 0, sizeof(T_ROACQ_INFO));
128 for (i = 0; i < nSize; i++) {
129 if (!TADC_IF_MemCmp((char *)(inBuffer + i), "<riurl>", 7)) {
132 for (j = i; j < nSize; j++) {
133 if (!TADC_IF_MemCmp((char *)(inBuffer + j), "</riurl>", 8)) {
135 IF_TRUE_RETURN(length <= 0, TADC_PARAMETER_ERROR);
136 t_ROAcqInfo->ROAcqURL = (TADC_U8 *)TADC_IF_Malloc(length + 1);
137 IF_TRUE_RETURN(t_ROAcqInfo->ROAcqURL == NULL, TADC_MEMAlOC_ERROR);
138 TADC_IF_MemSet(t_ROAcqInfo->ROAcqURL, 0, length + 1);
139 TADC_IF_MemCpy(t_ROAcqInfo->ROAcqURL, inBuffer + i, length);
148 IF_TRUE_RETURN(length <= 0, TADC_RESPONSEMESSAGE_ERROR);
153 for (i = 0; i < nSize; i++) {
154 if (!TADC_IF_MemCmp((char *)(inBuffer + i), "<reqid>", 7)) {
157 for (j = i; j < nSize; j++) {
158 if (!TADC_IF_MemCmp((char *)(inBuffer + j), "</reqid>", 8)) {
160 IF_TRUE_RETURN(length <= 0, TADC_PARAMETER_ERROR);
161 t_ROAcqInfo->ReqID = (TADC_U8 *)TADC_IF_Malloc(length + 1);
162 IF_TRUE_RETURN(t_ROAcqInfo->ReqID == NULL, TADC_MEMAlOC_ERROR);
163 TADC_IF_MemSet(t_ROAcqInfo->ReqID, 0, length + 1);
164 TADC_IF_MemCpy(t_ROAcqInfo->ReqID, inBuffer + i, length);
173 IF_TRUE_RETURN(length <= 0, TADC_RESPONSEMESSAGE_ERROR);
174 DRM_TAPPS_LOG("TADC_GetROAcqInfo Success!\n");
179 int TADC_MakeRequestRO(T_ROACQ_INFO *t_ROAcqInfo, unsigned char *outBuffer,
180 size_t outBufferSize, unsigned char *ROVer)
184 LPSTR psz64Parameter = NULL;
196 size_t reqdataset_size = 0;
199 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : Start \n");
202 IF_TRUE_RETURN(outBuffer == NULL, TADC_PARAMETER_ERROR);
203 IF_TRUE_RETURN(t_ROAcqInfo->ReqID == NULL, TADC_PARAMETER_ERROR);
206 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After Check Param Buffer \n");
207 len = TADC_IF_StrLen((char *)t_ROAcqInfo->ReqID);
208 IF_TRUE_RETURN((len <= 0 || len > 512), TADC_PARAMETER_ERROR);
211 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After Check t_ROAcqInfo->ReqID Len \n");
212 nResult = TADC_IF_GetDHKey(&t_ROAcqInfo->t_DHInfo);
213 IF_ERROR_RETURN(nResult, TADC_GETDHKEY_ERROR);
216 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After TADC_IF_GetDHKey \n");
217 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.pSize <= 0 ||
218 t_ROAcqInfo->t_DHInfo.pSize > DHKey_SIZE, TADC_PARAMETER_ERROR);
219 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.ASize <= 0 ||
220 t_ROAcqInfo->t_DHInfo.ASize > DHKey_SIZE, TADC_PARAMETER_ERROR);
222 //If ROVer 2.0 then add <reqversion> element. 2011.03.08
223 if (ROVer != NULL && ROVer[0] >= 2) {
224 snprintf((char *)outBuffer, outBufferSize,
225 "<?xml version='1.0'?>\n<request>\n"
226 "<reqversion>%d.%d</reqversion>\n"
227 "<reqid>%s</reqid>\n<reqdataset>",
228 ROVer[0], ROVer[1], t_ROAcqInfo->ReqID);
230 snprintf((char *)outBuffer, outBufferSize,
231 "<?xml version='1.0'?>\n<request>\n"
232 "<reqid>%s</reqid>\n<reqdataset>",
236 len = TADC_IF_StrLen((char *)outBuffer);
241 TADC_IF_StrNCpy((char *)outBuffer + i, "p=", 2);
244 for (k = 0; k < t_ROAcqInfo->t_DHInfo.pSize; k++) {
245 snprintf((char *)outBuffer + i + (k * 2), outBufferSize - i - (k * 2),
246 "%02X", t_ROAcqInfo->t_DHInfo.p[k]);
252 (char *)outBuffer + i,
255 t_ROAcqInfo->t_DHInfo.g);
258 TADC_IF_StrNCpy((char *)outBuffer + i, ";A=", 3);
261 for (k = 0; k < t_ROAcqInfo->t_DHInfo.ASize; k++) {
262 snprintf((char *)outBuffer + i + (k * 2), outBufferSize - i - (k * 2),
263 "%02X", t_ROAcqInfo->t_DHInfo.A[k]);
268 IF_TRUE_RETURN((i >= outBufferSize), TADC_PARAMETER_ERROR);
272 StrSize = i - reqdataset_size;
275 ReqTemp = (TADC_U8 *)TADC_IF_Malloc(StrSize);
276 IF_TRUE_RETURN(ReqTemp == NULL, TADC_MEMAlOC_ERROR);
278 TADC_IF_MemSet(ReqTemp, 0, StrSize);
279 TADC_IF_MemCpy(ReqTemp, outBuffer + reqdataset_size, StrSize);
280 TADC_IF_SHA1(ReqTemp, StrSize, sha1_tmp);
282 TADC_IF_MemCpy(key, &g_baAESKey[0], 16);
283 TADC_IF_MemCpy(iv, &g_baAESKey[16], 16);
284 TADC_IF_AES_CTR(key, 16, iv, 20, (unsigned char *)sha1_tmp, &outlen,
285 (unsigned char *)sha1_tmp);
288 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After TADC_IF_AES_CTR \n");
290 psz64Parameter = Base64Encode(sha1_tmp, sizeof(sha1_tmp)); //MemAlloc
292 if (psz64Parameter == NULL) {
293 TADC_IF_Free(ReqTemp);
294 return TADC_MEMAlOC_ERROR;
298 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After Base64Encode \n");
300 TADC_IF_StrNCpy((char *)(outBuffer + i), ";hmac=", 6);
301 len = TADC_IF_StrLen((char *)psz64Parameter);
302 TADC_IF_MemCpy(outBuffer + i + 6, psz64Parameter, len + 1);
303 TADC_IF_StrNCpy((char *)outBuffer + i + 6 + len, "</reqdataset>\n</request>",
307 if (ReqTemp != NULL) {
308 TADC_IF_Free(ReqTemp);
312 if (psz64Parameter != NULL) {
313 TADC_IF_Free(psz64Parameter);
314 psz64Parameter = NULL;
317 len = TADC_IF_StrLen((char *)outBuffer);
318 IF_TRUE_RETURN(len <= 0, TADC_REQMAKEHMAC_ERROR);
320 DRM_TAPPS_LOG("TADC_MakeRequestRO Success!\n");
325 int TADC_GetHashReqID(unsigned char *inBuffer, unsigned char *hashReqID)
328 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
329 IF_TRUE_RETURN(hashReqID == NULL, TADC_PARAMETER_ERROR);
330 int nSize = TADC_IF_StrLen((char *)inBuffer);
331 IF_TRUE_RETURN(nSize <= 40 || nSize > RESP_MAXSIZE, TADC_PARAMETER_ERROR);
333 //Check XML Result Code ( Success result='0' )
337 for (i = 0; i < nSize; i++) {
338 if (!TADC_IF_MemCmp((char *)(inBuffer + i), "<response result=", 17)) {
341 if ((!memcmp((char *)(inBuffer + i), "'0'", 3)) ||
342 (!memcmp((char *)(inBuffer + i), "\"0\"", 3))) {
351 IF_TRUE_RETURN(((i == nSize) || (nResult < 0)), TADC_RESPONSEMESSAGE_ERROR);
355 char tmpbuf[512] = {0, };
357 for (i = 0; i < nSize; i++) {
358 if (!TADC_IF_MemCmp(inBuffer + i, "reqid=", 6)) {
361 IF_TRUE_RETURN(i + length > nSize || inBuffer[i + length] != ';',
362 TADC_RESPONSEMESSAGE_ERROR);
364 TADC_IF_StrNCpy(tmpbuf, (char *)(inBuffer + i), length);
365 tmpbuf[length] = '\0';
372 IF_TRUE_RETURN(length == 0, TADC_RESPONSEMESSAGE_ERROR);
374 if ((nResult = HEX2BIN((char *)tmpbuf, hashReqID, &length)) < 0) {
385 int TADC_GetResponseRO(unsigned char *inBuffer, T_ROACQ_INFO *t_ROAcqInfo,
386 T_RO *t_RO, unsigned char *outBuffer, unsigned int outBufferLen)
388 int nHMacSize = 28; // Base64 Enc length of SHA1 20byte
389 TADC_U8 sha1_tmp[20] = {0, };
390 char hmacBuf[512] = {0, };
391 BYTE *ReqTemp = NULL;
392 LPBYTE pbBuffer = NULL;
394 TADC_U8 key[16] = {0, };
395 TADC_U8 iv[16] = {0, };
399 char *License = NULL;
400 TCHAR tmpDH_B[DHKey_SIZE * 2 + 1] = {0, };
404 CPointerArray paChilds;
407 char *timeStamp = NULL;
415 char pRoHeader[36] = {
416 '<', '?', 'x', 'm', 'l', ' ', 'v', 'e',
417 'r', 's', 'i', 'o', 'n', '=', '"', '1',
418 '.', '0', '"', '?', '>', 0x0A, '<', 'T',
419 'i', 'z', 'e', 'n', 'L', 'i', 'c', 'e',
424 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
425 IF_TRUE_RETURN(t_ROAcqInfo == NULL, TADC_PARAMETER_ERROR);
426 IF_TRUE_RETURN(t_RO == NULL, TADC_PARAMETER_ERROR);
428 nSize = TADC_IF_StrLen((char *)inBuffer);
429 IF_TRUE_RETURN(nSize <= 40 || nSize > RESP_MAXSIZE || nSize >= (int)outBufferLen, TADC_PARAMETER_ERROR);
431 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.pSize <= 0 ||
432 t_ROAcqInfo->t_DHInfo.pSize > DHKey_SIZE, TADC_PARAMETER_ERROR);
433 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.ASize <= 0 ||
434 t_ROAcqInfo->t_DHInfo.ASize > DHKey_SIZE, TADC_PARAMETER_ERROR);
436 //Check XML Result Code ( Success result='0' )
439 for (i = 0; i < nSize; i++) {
440 if (!TADC_IF_MemCmp((char *)(inBuffer + i), "<response result=", 17)) {
443 if ((!memcmp((char *)(inBuffer + i), "'0'", 3)) ||
444 (!memcmp((char *)(inBuffer + i), "\"0\"", 3))) {
453 IF_TRUE_RETURN(((i == nSize) || (nResult < 0)), TADC_RESPONSEMESSAGE_ERROR);
456 TADC_IF_MemSet(t_RO, 0, sizeof(T_RO));
457 TADC_IF_MemSet(tmpDH_B, 0, sizeof(tmpDH_B));
458 TADC_IF_MemSet(sha1_tmp, 0, sizeof(sha1_tmp));
459 TADC_IF_MemSet(hmacBuf, 0, sizeof(hmacBuf));
464 for (i = 0; i < nSize; i++) {
465 if (!TADC_IF_MemCmp((char *)(inBuffer + i), "<responsedata>", 14)) {
468 for (j = i; j < nSize; j++) {
469 if (!TADC_IF_MemCmp((char *)(inBuffer + j), ";hmac=", 6)) {
471 IF_TRUE_RETURN(req_length <= 0 ||
472 req_length >= RESP_MAXSIZE, TADC_PARAMETER_ERROR);
474 ReqTemp = (TADC_U8 *)TADC_IF_Malloc(req_length);
475 IF_TRUE_RETURN(ReqTemp == NULL, TADC_MEMAlOC_ERROR);
477 TADC_IF_MemSet(ReqTemp, 0, req_length);
478 TADC_IF_MemCpy(ReqTemp, inBuffer + i, req_length);
482 TADC_IF_StrNCpy(hmacBuf, (char *)(inBuffer + i + 6), nHMacSize);
491 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
493 pbBuffer = Base64Decode((LPCSTR)hmacBuf, &length);
495 if (pbBuffer == NULL) {
496 TADC_IF_Free(ReqTemp);
501 TADC_IF_MemCpy(key, &g_baAESKey[0], 16);
502 TADC_IF_MemCpy(iv, &g_baAESKey[16], 16);
503 TADC_IF_AES_CTR(key, 16, iv, 20, (unsigned char *)pbBuffer, &outlen,
504 (unsigned char *)pbBuffer);
506 TADC_IF_SHA1(ReqTemp, req_length, sha1_tmp);
508 if (ReqTemp != NULL) {
509 TADC_IF_Free(ReqTemp);
513 if (TADC_IF_MemCmp(sha1_tmp, pbBuffer, sizeof(sha1_tmp))) {
514 TADC_IF_Free(pbBuffer);
516 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
517 TADC_RESPONSESIGNATURE_ERROR);
518 return TADC_RESPONSESIGNATURE_ERROR;
521 TADC_IF_Free(pbBuffer);
526 for (i = 0; i < nSize; i++) {
527 if (!TADC_IF_MemCmp(inBuffer + i, "B=", 2)) {
530 for (j = i; j < nSize; j++) {
531 if (!TADC_IF_MemCmp(inBuffer + j, ";", 1)) {
533 IF_TRUE_RETURN(req_length <= 0 ||
534 req_length >= (int)sizeof(tmpDH_B), TADC_PARAMETER_ERROR);
535 TADC_IF_StrNCpy((char *)tmpDH_B, (char *)(inBuffer + i), req_length);
536 tmpDH_B[req_length] = 0;
545 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
547 TADC_IF_MemSet(t_ROAcqInfo->t_DHInfo.B, 0, sizeof(t_ROAcqInfo->t_DHInfo.B));
548 TADC_IF_MemCpy(t_ROAcqInfo->t_DHInfo.B, tmpDH_B,
549 sizeof(t_ROAcqInfo->t_DHInfo.B));
551 if (HEX2BIN((char *)tmpDH_B, t_ROAcqInfo->t_DHInfo.B,
552 (int *)&t_ROAcqInfo->t_DHInfo.BSize) < 0) {
553 return TADC_GETDHKEY_ERROR;
556 if (t_ROAcqInfo->t_DHInfo.BSize != 16 && t_ROAcqInfo->t_DHInfo.BSize != 64)
557 return TADC_GETDHKEY_ERROR;
559 TADC_IF_MemSet(t_ROAcqInfo->t_DHInfo.K, 0, sizeof(t_ROAcqInfo->t_DHInfo.K));
561 nResult = TADC_IF_GetDHKey_K(&t_ROAcqInfo->t_DHInfo);
562 IF_ERROR_RETURN(nResult, TADC_GETDHKEY_ERROR);
566 for (i = 0; i < nSize; i++) {
567 if (!TADC_IF_MemCmp((char *)(inBuffer + i), "license=", 8)) {
570 for (j = i; j < nSize; j++) {
571 if (!TADC_IF_MemCmp((char *)(inBuffer + j), ";hmac=", 6)) {
573 IF_TRUE_RETURN(req_length <= 0 ||
574 req_length >= RESP_MAXSIZE, TADC_PARAMETER_ERROR);
576 License = (char *)TADC_IF_Malloc(req_length + 1);
577 IF_TRUE_RETURN(License == NULL, TADC_MEMAlOC_ERROR);
579 TADC_IF_MemSet(License, 0, req_length + 1);
580 TADC_IF_StrNCpy(License, (char *)(inBuffer + i), req_length);
589 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
591 // Get RO License Info
592 pbBuffer = Base64Decode((LPCSTR)License, &length);
595 TADC_IF_Free(License);
600 pbBuffer[length] = 0;
601 TADC_IF_Free(License);
605 TADC_IF_MemCpy(key, &t_ROAcqInfo->t_DHInfo.K[0], 16);
606 TADC_IF_MemCpy(iv, &t_ROAcqInfo->t_DHInfo.K[16], 16);
607 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char *)pbBuffer, &outlen,
608 (unsigned char *)pbBuffer);
610 // Test Code for get the plaintext ro
612 strcat(tmpPath, (char*)t_RO->t_Content.CID);
613 strcat(tmpPath, ".ro");
614 fd = fopen(tmpPath, "w+b");
617 DRM_TAPPS_LOG("fopen started.");
618 fd = fopen("/tmp/1.ro", "w+b");
621 DRM_TAPPS_EXCEPTION("fopen() failed.");
625 DRM_TAPPS_LOG("fopen done.");
626 fwrite(pbBuffer, 1, strlen((char *)pbBuffer), fd);
627 DRM_TAPPS_LOG("fwrite done.");
629 DRM_TAPPS_LOG("fclose done.");
630 DRM_TAPPS_LOG("Save decrypted RO success!, path = %s", tmpPath);
634 if (TADC_IF_MemCmp((char *)pbBuffer, pRoHeader, 36)) {
635 TADC_IF_Free(pbBuffer);
637 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
638 TADC_LICENSEXMLPARSING_ERROR);
639 return TADC_LICENSEXMLPARSING_ERROR;
642 TADC_IF_MemCpy(outBuffer, pbBuffer, length);
643 TADC_IF_Free(pbBuffer);
646 ///////////////////////////////////////////////////////////////
649 ///////////////////////////////////////////////////////////////
654 DRM_TAPPS_LOG("timeStamp parsing start");
656 i = FindString(inBuffer, nSize, (unsigned char *)"<timeStamp>", 11);
659 DRM_TAPPS_LOG("No timeStamp. TADC_GetResponseRO Success!");
664 j = FindString(inBuffer, nSize, (unsigned char *)"</timeStamp>", 12);
665 IF_TRUE_RETURN(j < i, TADC_LICENSEXMLPARSING_ERROR);
667 IF_TRUE_RETURN(req_length > ROXML_MAXSIZE, TADC_PARAMETER_ERROR);
672 timeStamp = (char *)TADC_IF_Malloc(req_length + 1);
673 IF_TRUE_RETURN(timeStamp == NULL, TADC_MEMAlOC_ERROR);
675 TADC_IF_MemSet(timeStamp, 0, req_length + 1);
676 TADC_IF_StrNCpy(timeStamp, (char *)(inBuffer + i), req_length);
678 DRM_TAPPS_LOG("timeStamp parsing end.. req_length[%d]", req_length);
680 // Get RO License Info
681 pbBuffer = Base64Decode((LPCSTR)timeStamp, &length);
684 TADC_IF_Free(timeStamp);
686 DRM_TAPPS_EXCEPTION("Base64Decode Failed");
690 pbBuffer[length] = 0;
691 TADC_IF_Free(timeStamp);
694 DRM_TAPPS_LOG("Decrypt timeStamp starts");
697 TADC_IF_MemCpy(key, &t_ROAcqInfo->t_DHInfo.K[0], 16);
698 TADC_IF_MemCpy(iv, &t_ROAcqInfo->t_DHInfo.K[16], 16);
699 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char *)pbBuffer, &outlen,
700 (unsigned char *)pbBuffer);
702 if (length >= (int)sizeof(t_ROAcqInfo->sTimeStamp)) {
703 TADC_IF_Free(pbBuffer);
705 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
706 TADC_RESPONSEMESSAGE_ERROR);
707 return TADC_RESPONSEMESSAGE_ERROR;
710 TADC_IF_MemCpy(t_ROAcqInfo->sTimeStamp, pbBuffer, length);
711 t_ROAcqInfo->sTimeStamp[length] = 0;
713 TADC_IF_Free(pbBuffer);
716 DRM_TAPPS_LOG("timeStamp found. TADC_GetResponseRO Success!");
720 int TADC_VerifyROSignature(LPBYTE pszXML)
723 int length = 0, i = 0, i2 = 0;
725 unsigned char *pSigData = NULL;
726 unsigned char *pRICert = NULL;
727 unsigned char *pRICACert = NULL;
729 int inLen = 0, sigLen = 0, certLen = 0, certLen2 = 0;
732 char TempBuf[CERT_MAXSIZE] = {0, };
735 IF_TRUE_RETURN(pszXML == NULL, TADC_PARAMETER_ERROR);
738 i = FindString(pszXML, TADC_IF_StrLen((char *)pszXML),
739 (LPBYTE)"<version>2.0</version>", 22);
742 DRM_TAPPS_EXCEPTION("It is not the TAD-RO2.0 format.");
746 DRM_TAPPS_LOG("It is the TAD-RO2.0 format.");
748 //Get Certificates ( RI Cert )
749 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
751 i = FindString(pszXML, TADC_IF_StrLen((char *)pszXML),
752 (LPBYTE)"<CertificateChain>", 18);
753 IF_TRUE_RETURN(i < 0, TADC_RO_CERTIFICATE_ERROR);
755 p = pszXML + i; // <certificateChain>
756 length = TADC_IF_StrLen((char *)pszXML) - i;
758 i = FindString(p, length, (LPBYTE)"<Certificate>", 13);
759 IF_TRUE_RETURN(i < 0, TADC_RO_CERTIFICATE_ERROR);
760 i += 13; // start position of RI Cert
762 i2 = FindString(p, length, (LPBYTE)"</Certificate>", 14);
763 IF_TRUE_RETURN(i2 < (i + 13), TADC_RO_CERTIFICATE_ERROR);
764 certLen = i2 - i; // size of RI Cert
766 TADC_IF_StrNCpy(TempBuf, (char *)p + i, certLen);
768 pRICert = Base64Decode((LPCSTR)TempBuf, &certLen);
769 IF_TRUE_RETURN(pRICert == NULL, TADC_RO_CERTIFICATE_ERROR);
770 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
772 //Get Certificates ( RICA Cert )
773 p = p + (i2 + 14); // first </certificate>
774 length = length - (i2 + 14);
776 i = FindString(p, length, (LPBYTE)"<Certificate>", 13);
777 IF_TRUE_RETURN2(i < 0, TADC_IF_Free(pRICert), , , TADC_RO_CERTIFICATE_ERROR);
778 i += 13; // start position of RICA Cert
780 i2 = FindString(p, length, (LPBYTE)"</Certificate>", 14);
781 IF_TRUE_RETURN2(i2 < (i + 13), TADC_IF_Free(pRICert), , ,
782 TADC_RO_CERTIFICATE_ERROR);
783 certLen2 = i2 - i; // size of RICA Cert
785 TADC_IF_StrNCpy(TempBuf, (char *)p + i, certLen2);
787 pRICACert = Base64Decode((LPCSTR)TempBuf, &certLen2);
788 IF_TRUE_RETURN2(pRICACert == NULL, TADC_IF_Free(pRICert), , ,
789 TADC_RO_CERTIFICATE_ERROR);
790 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
792 //Get position of indata
793 inLen = FindString(pszXML, TADC_IF_StrLen((char *)pszXML),
794 (LPBYTE)"</CertificateChain>", 19);
795 IF_TRUE_RETURN2(inLen < 0, TADC_IF_Free(pRICert), TADC_IF_Free(pRICACert), ,
796 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), ,
805 TADC_RO_SIGNATURE_ERROR);
806 i += 16; // start position of signature value
808 i2 = FindString(p, length, (LPBYTE)"</SignatureValue>", 17);
809 IF_TRUE_RETURN2(i2 < (i + 16), TADC_IF_Free(pRICert), TADC_IF_Free(pRICACert), ,
810 TADC_RO_SIGNATURE_ERROR);
811 sigLen = i2 - i; // size of signature value
813 TADC_IF_StrNCpy(TempBuf, (char *)p + i, sigLen);
815 pSigData = Base64Decode((LPCSTR)TempBuf, &sigLen);
816 IF_TRUE_RETURN2(pSigData == NULL, TADC_IF_Free(pRICert),
817 TADC_IF_Free(pRICACert), , TADC_RO_SIGNATURE_ERROR);
818 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
820 //Verify the certificate chain
821 nResult = TADC_IF_VerifyCertChain(pRICACert, certLen2, pRICert, certLen);
824 nResult = TADC_IF_VerifySignature(pszXML, inLen, pSigData, sigLen, pRICert,
827 TADC_IF_Free(pRICert);
828 TADC_IF_Free(pRICACert);
829 TADC_IF_Free(pSigData);
834 int TADC_GetResponseROInfo(LPBYTE pszXML, T_RO *t_RO)
838 CXMLElement *pRoot, *pElement;
839 CPointerArray paChilds;
841 LPBYTE pbBuffer = NULL;
843 TADC_U8 TempVersion[3] = {0, };
845 char pRoHeader[36] = {
846 '<', '?', 'x', 'm', 'l', ' ', 'v', 'e',
847 'r', 's', 'i', 'o', 'n', '=', '"', '1',
848 '.', '0', '"', '?', '>', 0x0A, '<', 'T',
849 'i', 'z', 'e', 'n', 'L', 'i', 'c', 'e',
854 IF_TRUE_RETURN(pszXML == NULL, TADC_PARAMETER_ERROR);
855 IF_TRUE_RETURN(t_RO == NULL, TADC_PARAMETER_ERROR);
858 TADC_IF_MemSet(t_RO, 0, sizeof(T_RO));
859 TADC_IF_MemSet(TempVersion, 0, sizeof(TempVersion));
861 if (TADC_IF_MemCmp((char *)pszXML, pRoHeader, 36)) {
862 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
866 // Verify the signature ( 2011.03.08, Joseph Ahn )
867 nResult = TADC_VerifyROSignature(pszXML);
870 DRM_TAPPS_EXCEPTION("TADC_VerifyROSignature Error Code = %x", nResult);
874 nResult = oXMLFile.LoadFromStream((LPCTSTR)pszXML);
877 DRM_TAPPS_EXCEPTION("oXMLFile.LoadFromStream is failed\n");
883 pRoot = oXMLFile.GetRoot();
886 DRM_TAPPS_EXCEPTION("oXMLFile.GetRoot is failed\n");
891 paChilds.RemoveAll();
892 nResult = pRoot->Find(&paChilds, _T("ContentInfo"), _T("cid"), NULL);
895 DRM_TAPPS_EXCEPTION("pRoot->Find is failed\n");
900 if (paChilds.GetCount() != 1) {
901 DRM_TAPPS_EXCEPTION("paChilds.GetCount() is failed\n");
906 pElement = (CXMLElement *)paChilds.Get(0);
907 pszValue = pElement->GetValue();
909 if (pszValue == NULL) {
910 DRM_TAPPS_EXCEPTION("pElement->GetValue() is failed\n");
915 length = TADC_IF_StrLen((char *)pszValue);
917 if (length <= 0 || length > CID_SIZE) {
918 DRM_TAPPS_EXCEPTION("TADC_IF_StrLen is failed(%d) - %s\n", length, pszValue);
923 t_RO->t_Content.CID = (TADC_U8 *)TADC_IF_Malloc(length + 1);
924 IF_TRUE_GOTO(t_RO->t_Content.CID == NULL, -2);
925 TADC_IF_MemSet(t_RO->t_Content.CID, 0, length + 1);
926 TADC_IF_StrNCpy((CHAR *)t_RO->t_Content.CID, pszValue, length + 1);
928 // Get KeyValue (CEK)
929 pRoot = oXMLFile.GetRoot();
930 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
932 paChilds.RemoveAll();
933 nResult = pRoot->Find(&paChilds, _T("KeyInfo"), _T("CipherValue"), NULL);
935 IF_TRUE_GOTO(nResult != 0, ERROR_INVALID_DATA);
936 IF_TRUE_GOTO(paChilds.GetCount() != 1, ERROR_INVALID_DATA);
938 pElement = (CXMLElement *)paChilds.Get(0);
939 pszValue = pElement->GetValue();
940 IF_TRUE_GOTO(pszValue == NULL, -2);
942 pbBuffer = Base64Decode(pszValue, &length);
944 if (pbBuffer == NULL) {
945 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
949 if (length <= 0 || length > CEK_SIZE) {
950 TADC_IF_Free(pbBuffer);
956 t_RO->t_Content.CEK = (TADC_U8 *)TADC_IF_Malloc(length + 1);
957 IF_TRUE_GOTO(t_RO->t_Content.CEK == NULL, -2);
958 TADC_IF_MemSet(t_RO->t_Content.CEK, 0, length + 1);
959 TADC_IF_MemCpy(t_RO->t_Content.CEK, pbBuffer, length);
961 TADC_IF_Free(pbBuffer);
965 pRoot = oXMLFile.GetRoot();
966 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
968 paChilds.RemoveAll();
969 nResult = pRoot->Find(&paChilds, _T("DeviceInfo"), _T("DUID"), NULL);
971 IF_TRUE_GOTO(nResult != 0, ERROR_INVALID_DATA);
972 IF_TRUE_GOTO(paChilds.GetCount() != 1, ERROR_INVALID_DATA);
974 pElement = (CXMLElement *)paChilds.Get(0);
975 pszValue = pElement->GetValue();
976 IF_TRUE_GOTO(pszValue == NULL, -1);
977 length = TADC_IF_StrLen((char *)pszValue);
984 t_RO->PerFlag |= DUID_RULE;
985 t_RO->t_Permission.t_Individual.BindingType |= DUID_RULE;
986 t_RO->t_Permission.t_Individual.DUID = (TADC_U8 *)TADC_IF_Malloc(length + 1);
988 if (t_RO->t_Permission.t_Individual.DUID == NULL) {
989 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_MEMAlOC_ERROR);
994 TADC_IF_MemSet(t_RO->t_Permission.t_Individual.DUID, 0, length + 1);
995 TADC_IF_MemCpy((CHAR *)t_RO->t_Permission.t_Individual.DUID, pszValue, length + 1);
1003 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
1006 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))) {
1028 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
1029 TADC_CONTENTSSTRUCT_ERROR);
1035 if (TADC_IF_MemCmp(inBuffer + i, "TADF", 4)) {
1036 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
1037 TADC_CONTENTSSTRUCT_ERROR);
1043 t_FileHeader->Version[0] = '1';
1044 t_FileHeader->Version[1] = '0';
1047 if (TADC_IF_MemCmp(inBuffer + i, "TADF", 4)) {
1048 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
1049 TADC_CONTENTSSTRUCT_ERROR);
1055 t_FileHeader->DRMType = inBuffer[i];
1058 TADC_IF_MemCpy(t_FileHeader->ContentsType, inBuffer + i, 128);
1061 TADC_IF_MemCpy(&t_FileHeader->TotalSize, inBuffer + i, 8);
1063 t_FileHeader->TotalSize = _hton64(t_FileHeader->TotalSize);
1065 TADC_IF_MemCpy(&t_FileHeader->Offset1, inBuffer + i, 8);
1067 t_FileHeader->Offset1 = _hton64(t_FileHeader->Offset1);
1069 TADC_IF_MemCpy(&t_FileHeader->Offset2, inBuffer + i, 8);
1071 t_FileHeader->Offset2 = _hton64(t_FileHeader->Offset2);
1073 TADC_IF_MemCpy(&t_FileHeader->Offset3, inBuffer + i, 8);
1075 t_FileHeader->Offset3 = _hton64(t_FileHeader->Offset3);
1077 TADC_IF_MemCpy(&t_FileHeader->Offset4, inBuffer + i, 8);
1079 t_FileHeader->Offset4 = _hton64(t_FileHeader->Offset4);
1081 TADC_IF_MemCpy(&t_FileHeader->Offset5, inBuffer + i, 8);
1083 t_FileHeader->Offset5 = _hton64(t_FileHeader->Offset5);
1085 TADC_IF_MemCpy(&t_FileHeader->Offset6, inBuffer + i, 8);
1087 t_FileHeader->Offset6 = _hton64(t_FileHeader->Offset6);
1089 TADC_IF_MemCpy(&t_FileHeader->Offset7, inBuffer + i, 8);
1091 t_FileHeader->Offset7 = _hton64(t_FileHeader->Offset7);
1093 TADC_IF_MemCpy(&t_FileHeader->Offset8, inBuffer + i, 8);
1095 t_FileHeader->Offset8 = _hton64(t_FileHeader->Offset8);
1097 DRM_TAPPS_LOG("TADC_GetFileHeader Success!\n");
1101 int TADC_GetDRMHeader(unsigned char *inBuffer, T_DRM_HEADER *t_DRMHeader)
1105 //Check Param Bufffer
1106 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
1107 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1110 TADC_IF_MemSet(t_DRMHeader, 0, sizeof(T_DRM_HEADER));
1112 if (TADC_IF_MemCmp(inBuffer, "TIZEN_DRM", 9)) {
1113 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_NOTTADCFILE_ERROR);
1119 TADC_IF_MemCpy(t_DRMHeader->Version, inBuffer + i, 2);
1122 TADC_IF_MemCpy(&t_DRMHeader->XmlSize, inBuffer + i, 4);
1125 t_DRMHeader->XmlSize = htonl_(t_DRMHeader->XmlSize);
1126 DRM_TAPPS_LOG("TADC_GetDRMHeader Success!\n");
1131 int TADC_GetDRMHeaderInfo(unsigned char *inBuffer, T_DRM_HEADER *t_DRMHeader)
1135 CXMLElement *pRoot, *pNode;
1136 CPointerArray paChilds;
1140 unsigned char *ReqTemp = NULL;
1149 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
1150 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1152 IF_TRUE_RETURN(t_DRMHeader->XmlSize <= 0 ||
1153 t_DRMHeader->XmlSize > ROXML_MAXSIZE, TADC_PARAMETER_ERROR);
1155 ReqTemp = (TADC_U8 *)TADC_IF_Malloc(t_DRMHeader->XmlSize);
1156 IF_TRUE_RETURN(ReqTemp == NULL, TADC_MEMAlOC_ERROR);
1158 TADC_IF_MemSet(ReqTemp, 0, t_DRMHeader->XmlSize);
1159 TADC_IF_MemSet(sha1_tmp, 0, sizeof(sha1_tmp));
1162 TADC_IF_MemCpy(ReqTemp, inBuffer + 20, t_DRMHeader->XmlSize);
1163 TADC_IF_SHA1(ReqTemp, t_DRMHeader->XmlSize, sha1_tmp);
1165 if (ReqTemp != NULL) {
1166 TADC_IF_Free(ReqTemp);
1170 TADC_IF_MemCpy(key, &g_baSignatureKey[0], 16);
1171 TADC_IF_MemCpy(iv, &g_baSignatureKey[16], 16);
1172 TADC_IF_AES_CTR(key, 16, iv, 20, (unsigned char *)sha1_tmp, &outlen,
1173 (unsigned char *)sha1_tmp);
1175 if (TADC_IF_MemCmp(sha1_tmp, inBuffer, sizeof(sha1_tmp))) {
1176 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSHMAC_ERROR);
1181 nResult = oXMLFile.LoadFromStream((LPCTSTR)(inBuffer + 20));
1184 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSXML_ERROR);
1188 pRoot = oXMLFile.GetRoot();
1189 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1191 paChilds.RemoveAll();
1192 nResult = pRoot->Find(&paChilds, _T("SID"), NULL);
1195 if (paChilds.GetCount() == 1) {
1196 pNode = (CXMLElement *)paChilds.Get(0);
1197 pszValue = pNode->GetValue();
1198 Length = TADC_IF_StrLen((char *)pszValue);
1201 t_DRMHeader->SID = (TADC_U8 *)TADC_IF_Malloc(Length + 1);
1202 IF_TRUE_RETURN(t_DRMHeader->SID == NULL, TADC_MEMAlOC_ERROR);
1203 TADC_IF_MemSet(t_DRMHeader->SID, 0, Length + 1);
1204 TADC_IF_StrNCpy((CHAR *)t_DRMHeader->SID, pszValue, Length + 1);
1209 pRoot = oXMLFile.GetRoot();
1210 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1212 paChilds.RemoveAll();
1213 nResult = pRoot->Find(&paChilds, _T("CID"), NULL);
1216 if (paChilds.GetCount() == 1) {
1217 pNode = (CXMLElement *)paChilds.Get(0);
1218 pszValue = pNode->GetValue();
1219 Length = TADC_IF_StrLen((char *)pszValue);
1222 t_DRMHeader->CID = (TADC_U8 *)TADC_IF_Malloc(Length + 1);
1223 IF_TRUE_RETURN(t_DRMHeader->CID == NULL, TADC_MEMAlOC_ERROR);
1224 TADC_IF_MemSet(t_DRMHeader->CID, 0, Length + 1);
1225 TADC_IF_StrNCpy((CHAR *)t_DRMHeader->CID, pszValue, Length + 1);
1230 pRoot = oXMLFile.GetRoot();
1231 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1232 paChilds.RemoveAll();
1233 nResult = pRoot->Find(&paChilds, _T("ContentType"), NULL);
1236 if (paChilds.GetCount() == 1) {
1237 pNode = (CXMLElement *)paChilds.Get(0);
1238 pszValue = pNode->GetValue();
1239 Length = TADC_IF_StrLen((char *)pszValue);
1241 TADC_IF_MemSet(t_DRMHeader->ContentsType, 0, 128);
1242 TADC_IF_StrNCpy((CHAR *)t_DRMHeader->ContentsType, pszValue, Length + 1);
1247 pRoot = oXMLFile.GetRoot();
1248 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1249 paChilds.RemoveAll();
1250 nResult = pRoot->Find(&paChilds, _T("EncryptionMethod"), NULL);
1253 if (paChilds.GetCount() == 1) {
1254 pNode = (CXMLElement *)paChilds.Get(0);
1255 pszValue = pNode->GetValue();
1256 t_DRMHeader->EncryptionMethod = TADC_IF_AtoI((char *)pszValue);
1260 pRoot = oXMLFile.GetRoot();
1261 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1262 paChilds.RemoveAll();
1263 nResult = pRoot->Find(&paChilds, _T("EncryptionLevel"), NULL);
1266 if (paChilds.GetCount() == 1) {
1267 pNode = (CXMLElement *)paChilds.Get(0);
1268 pszValue = pNode->GetValue();
1269 t_DRMHeader->EncryptionLevel = TADC_IF_AtoI((char *)pszValue);
1273 pRoot = oXMLFile.GetRoot();
1274 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1275 paChilds.RemoveAll();
1276 nResult = pRoot->Find(&paChilds, _T("EncryptionRange"), NULL);
1279 if (paChilds.GetCount() == 1) {
1280 pNode = (CXMLElement *)paChilds.Get(0);
1281 pszValue = pNode->GetValue();
1282 t_DRMHeader->EncryptionRange = TADC_IF_AtoI((char *)pszValue);
1286 pRoot = oXMLFile.GetRoot();
1287 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1288 paChilds.RemoveAll();
1289 nResult = pRoot->Find(&paChilds, _T("RIURL"), NULL);
1292 if (paChilds.GetCount() == 1) {
1293 pNode = (CXMLElement *)paChilds.Get(0);
1294 pszValue = pNode->GetValue();
1295 Length = TADC_IF_StrLen((char *)pszValue);
1298 t_DRMHeader->RIURL = (TADC_U8 *)TADC_IF_Malloc(Length + 1);
1299 IF_TRUE_RETURN(t_DRMHeader->RIURL == NULL, TADC_MEMAlOC_ERROR);
1300 TADC_IF_MemSet(t_DRMHeader->RIURL, 0, Length + 1);
1301 TADC_IF_StrNCpy((CHAR *)t_DRMHeader->RIURL, pszValue, Length + 1);
1306 // dummy RIURL(DRM Server spec changed)
1307 if (t_DRMHeader->RIURL == NULL) {
1308 pszValue = "dummy_riurl";
1309 Length = TADC_IF_StrLen(pszValue);
1310 t_DRMHeader->RIURL = (TADC_U8 *)TADC_IF_Malloc(Length + 1);
1311 IF_TRUE_RETURN(t_DRMHeader->RIURL == NULL, TADC_MEMAlOC_ERROR);
1312 TADC_IF_MemSet(t_DRMHeader->RIURL, 0, Length + 1);
1313 TADC_IF_StrNCpy((CHAR *)t_DRMHeader->RIURL, pszValue, Length + 1);
1316 DRM_TAPPS_LOG("t_DRMHeader->RIURL = %s\n", (char *)t_DRMHeader->RIURL);
1318 pRoot = oXMLFile.GetRoot();
1319 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1320 paChilds.RemoveAll();
1321 nResult = pRoot->Find(&paChilds, _T("PlaintextSize"), NULL);
1324 if (paChilds.GetCount() == 1) {
1325 pNode = (CXMLElement *)paChilds.Get(0);
1326 pszValue = pNode->GetValue();
1327 t_DRMHeader->PlaintextSize = TADC_IF_AtoI((char *)pszValue);
1331 pRoot = oXMLFile.GetRoot();
1332 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1333 paChilds.RemoveAll();
1334 nResult = pRoot->Find(&paChilds, _T("Packdate"), NULL);
1337 if (paChilds.GetCount() == 1) {
1338 pNode = (CXMLElement *)paChilds.Get(0);
1339 pszValue = pNode->GetValue();
1340 Length = TADC_IF_StrLen((char *)pszValue);
1343 t_DRMHeader->Packdate = (TADC_U8 *)TADC_IF_Malloc(Length + 1);
1344 IF_TRUE_RETURN(t_DRMHeader->Packdate == NULL, TADC_MEMAlOC_ERROR);
1345 TADC_IF_MemSet(t_DRMHeader->Packdate, 0, Length + 1);
1346 TADC_IF_StrNCpy((char *)t_DRMHeader->Packdate, pszValue, Length + 1);
1354 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSXML_ERROR);
1355 STACKTRACE(_T("CNCG20File::_ParseHeader()"));
1358 DRM_TAPPS_LOG("TADC_GetDRMHeaderInfo Success! \n");
1362 int TADC_GetCEK(T_DEVICE_INFO *t_DeviceInfo, T_RO *t_RODB,
1363 T_DRM_HEADER *t_DRMHeader)
1367 //Check Parameter Buffer
1368 IF_TRUE_RETURN(t_DeviceInfo == NULL, TADC_PARAMETER_ERROR);
1369 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1370 IF_TRUE_RETURN(t_DRMHeader->CID == NULL, TADC_PARAMETER_ERROR);
1371 IF_TRUE_RETURN(t_RODB == NULL, TADC_PARAMETER_ERROR);
1372 IF_TRUE_RETURN(t_RODB->t_Content.CID == NULL, TADC_PARAMETER_ERROR);
1374 if (!TADC_IF_StrCmp((char *)t_DRMHeader->CID, (char *)t_RODB->t_Content.CID)) {
1375 if ((t_RODB->PerFlag & DUID_RULE) &&
1376 (t_RODB->t_Permission.t_Individual.BindingType & DUID_RULE)) {
1377 IF_TRUE_RETURN(t_RODB->t_Permission.t_Individual.DUID == NULL,
1378 TADC_PARAMETER_ERROR);
1379 length1 = TADC_IF_StrLen((char *)t_DeviceInfo->DUID);
1381 "t_DeviceInfo->DUID = %s, "
1382 "t_RODB->t_Permission.t_Individual.DUID is %s, "
1384 t_DeviceInfo->DUID, t_RODB->t_Permission.t_Individual.DUID, length1);
1385 /*if (TADC_IF_MemCmp(t_DeviceInfo->DUID,
1386 * t_RODB->t_Permission.t_Individual.DUID, length1)) {
1387 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
1388 TADC_RULE_DUID_ERROR);
1393 IF_TRUE_RETURN(t_RODB->t_Content.CEK == NULL, TADC_PARAMETER_ERROR);
1394 t_DRMHeader->CEK = (TADC_U8 *)TADC_IF_Malloc(CEK_SIZE + 1);
1395 IF_TRUE_RETURN(t_DRMHeader->CEK == NULL, TADC_MEMAlOC_ERROR);
1396 TADC_IF_MemSet(t_DRMHeader->CEK, 0, CEK_SIZE + 1);
1397 TADC_IF_MemCpy(t_DRMHeader->CEK, t_RODB->t_Content.CEK, CEK_SIZE);
1399 DRM_TAPPS_LOG("TADC_GetCEK Success!\n");
1403 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_RULE_NOINFOMATION);
1408 int TADC_DecryptBlock(char *pbBuffer, int nSize,
1409 const T_DRM_HEADER *t_DRMHeader)
1411 TADC_U8 key[16] = {0, };
1412 TADC_U8 iv[16] = {0, };
1413 int i = 0, nBlocks = 0, nIndex = 0;
1414 char baToBeEncrypted[32] = {0, };
1415 int nRemainBytes = 0, nBlockBytes = 0;
1417 int nEncryptionLevel = 0;
1418 int nEncryptionMethod = 0;
1420 char temp[512] = {0, };
1424 TADC_IF_MemSet(temp, 0, sizeof(temp));
1426 IF_TRUE_RETURN(pbBuffer == NULL, TADC_PARAMETER_ERROR);
1427 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1429 IF_TRUE_RETURN(nSize > 512, TADC_PARAMETER_ERROR);
1430 IF_TRUE_RETURN(t_DRMHeader->CEK == NULL, TADC_PARAMETER_ERROR);
1432 nEncryptionLevel = t_DRMHeader->EncryptionLevel;
1433 nEncryptionMethod = t_DRMHeader->EncryptionMethod;
1435 IF_TRUE_RETURN(nEncryptionMethod != 1, TADC_PARAMETER_ERROR);
1436 IF_TRUE_RETURN(nEncryptionLevel < 0 ||
1437 nEncryptionLevel > 32, TADC_PARAMETER_ERROR);
1439 TADC_IF_MemSet(baToBeEncrypted, 1, 32);
1441 if (nEncryptionLevel > 16)
1444 nBlocks = nEncryptionLevel;
1446 for (i = 0; i < nBlocks; i++) {
1447 nIndex = 31 - (i * 2);
1448 baToBeEncrypted[nIndex] = 0;
1451 for (i = 16; i < nEncryptionLevel; i++) {
1452 nIndex = 30 - ((i - 16) * 2);
1453 baToBeEncrypted[nIndex] = 0;
1456 nRemainBytes = nSize;
1462 for (i = 0; i < 32; i++) {
1463 if (nRemainBytes < 16)
1464 nBlockBytes = nRemainBytes;
1466 if (baToBeEncrypted[i] == 1) {
1467 TADC_IF_MemCpy(temp + length, pbBuffer + totlength, nBlockBytes);
1468 length += nBlockBytes;
1471 nRemainBytes -= nBlockBytes;
1472 totlength += nBlockBytes;
1474 if (nRemainBytes < 1)
1478 TADC_IF_MemCpy(key, &t_DRMHeader->CEK[0], 16);
1479 TADC_IF_MemCpy(iv, &t_DRMHeader->CEK[16], 16);
1480 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char *)temp, &length,
1481 (unsigned char *)temp);
1483 nRemainBytes = nSize;
1489 for (i = 0; i < 32; i++) {
1490 if (nRemainBytes < 16)
1491 nBlockBytes = nRemainBytes;
1493 if (baToBeEncrypted[i] == 1) {
1494 TADC_IF_MemCpy(pbBuffer + totlength, temp + length, nBlockBytes);
1495 length += nBlockBytes;
1498 nRemainBytes -= nBlockBytes;
1499 totlength += nBlockBytes;
1501 if (nRemainBytes < 1) {
1509 int TADC_GetDRMHeaderFromFile(const char *pTADCFilepath,
1510 T_FILE_HEADER *t_FileHeader, T_DRM_HEADER *t_DRMHeader)
1512 unsigned char tempbuf[512];
1513 unsigned char *pbuf = NULL;
1516 ULONG readsize = 0, ReadLen = 0;
1518 FILE *hFile = 0; //Apps drm file
1521 if (pTADCFilepath == NULL || t_FileHeader == NULL || t_DRMHeader == NULL) {
1522 DRM_TAPPS_EXCEPTION("Error : Parameter Null.");
1527 TADC_IF_MemSet(tempbuf, 0, sizeof(tempbuf));
1530 if ((hFile = fopen(pTADCFilepath, "rb")) == NULL) {
1531 DRM_TAPPS_EXCEPTION("Error : fopen() error.");
1537 //FmReadFile(hFile, tempbuf, readsize, &ReadLen);
1538 ReadLen = fread(tempbuf, 1, readsize, hFile);
1540 if ((readsize != ReadLen) ||
1541 (ret = TADC_GetFileHeader(tempbuf, t_FileHeader)) < 0) {
1542 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1547 TADC_IF_MemSet(tempbuf, 0, sizeof(tempbuf));
1549 //Tizen Apps DRM Type Check
1550 if (t_FileHeader->DRMType & TIZEN_DRM) {
1551 DRM_TAPPS_LOG("It's a TAPPS DCF = %s", pTADCFilepath);
1553 ReadLen = fread(tempbuf, 1, readsize, hFile);
1555 if ((readsize != ReadLen) ||
1556 (ret = TADC_GetDRMHeader(tempbuf, t_DRMHeader)) < 0) {
1557 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1562 readsize = 20 + t_DRMHeader->XmlSize;
1564 pbuf = (unsigned char *)TADC_IF_Malloc(readsize * sizeof(char));
1567 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1572 ReadLen = fread(pbuf, 1, readsize, hFile);
1574 if (readsize != ReadLen) {
1575 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1581 if (TADC_GetDRMHeaderInfo(pbuf, t_DRMHeader) < 0) {
1582 DRM_TAPPS_EXCEPTION("Error : TADC_GetDRMHeaderInfo error.");
1590 DRM_TAPPS_EXCEPTION("Error : It's not a TApps DCF file.");
1599 DWORD TADC_GetLastError(void)
1601 DWORD dwError = g_TADCErrorCode;
1602 g_TADCErrorCode = 0;
1607 int TADC_MEMFree_RO(T_RO *t_ro)
1609 IF_TRUE_RETURN(t_ro == NULL, TADC_PARAMETER_ERROR);
1612 if (t_ro->t_Content.CID != NULL) {
1613 TADC_IF_Free(t_ro->t_Content.CID);
1614 t_ro->t_Content.CID = NULL;
1617 if (t_ro->t_Content.CEK != NULL) {
1618 TADC_IF_Free(t_ro->t_Content.CEK);
1619 t_ro->t_Content.CEK = NULL;
1622 if (t_ro->t_Permission.t_Individual.DUID != NULL) {
1623 TADC_IF_Free(t_ro->t_Permission.t_Individual.DUID);
1624 t_ro->t_Permission.t_Individual.DUID = NULL;
1630 int TADC_MEMFree_FileHeader(T_FILE_HEADER *t_FileHeader)
1632 IF_TRUE_RETURN(t_FileHeader == NULL, TADC_PARAMETER_ERROR);
1633 TADC_IF_MemSet(t_FileHeader, 0, sizeof(T_FILE_HEADER));
1638 int TADC_MEMFree_DRMHeader(T_DRM_HEADER *t_DrmHeader)
1640 IF_TRUE_RETURN(t_DrmHeader == NULL, TADC_PARAMETER_ERROR);
1641 t_DrmHeader->XmlSize = 0;
1642 TADC_IF_MemSet(t_DrmHeader->Version, 0, sizeof(t_DrmHeader->Version));
1644 if (t_DrmHeader->SID != NULL) {
1645 TADC_IF_Free(t_DrmHeader->SID);
1646 t_DrmHeader->SID = NULL;
1649 if (t_DrmHeader->CID != NULL) {
1650 TADC_IF_Free(t_DrmHeader->CID);
1651 t_DrmHeader->CID = NULL;
1654 TADC_IF_MemSet(t_DrmHeader->ContentsType, 0, sizeof(t_DrmHeader->ContentsType));
1655 t_DrmHeader->EncryptionRange = 0;
1657 if (t_DrmHeader->RIURL != NULL) {
1658 TADC_IF_Free(t_DrmHeader->RIURL);
1659 t_DrmHeader->RIURL = NULL;
1662 t_DrmHeader->PlaintextSize = 0;
1664 if (t_DrmHeader->Packdate != NULL) {
1665 TADC_IF_Free(t_DrmHeader->Packdate);
1666 t_DrmHeader->Packdate = NULL;
1669 if (t_DrmHeader->CEK != NULL) {
1670 TADC_IF_Free(t_DrmHeader->CEK);
1671 t_DrmHeader->CEK = NULL;
1677 int TADC_MEMFree_ROAcqInfo(T_ROACQ_INFO *t_ROAcqInfo)
1679 IF_TRUE_RETURN(t_ROAcqInfo == NULL, TADC_PARAMETER_ERROR);
1681 if (t_ROAcqInfo->ROAcqURL != NULL) {
1682 TADC_IF_Free(t_ROAcqInfo->ROAcqURL);
1683 t_ROAcqInfo->ROAcqURL = NULL;
1686 if (t_ROAcqInfo->ReqID != NULL) {
1687 TADC_IF_Free(t_ROAcqInfo->ReqID);
1688 t_ROAcqInfo->ReqID = NULL;
1691 TADC_IF_MemSet(&t_ROAcqInfo->t_DHInfo, 0, sizeof(T_DH_INFO));