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]);
270 StrSize = i - reqdataset_size;
273 ReqTemp = (TADC_U8 *)TADC_IF_Malloc(StrSize);
274 IF_TRUE_RETURN(ReqTemp == NULL, TADC_MEMAlOC_ERROR);
276 TADC_IF_MemSet(ReqTemp, 0, StrSize);
277 TADC_IF_MemCpy(ReqTemp, outBuffer + reqdataset_size, StrSize);
278 TADC_IF_SHA1(ReqTemp, StrSize, sha1_tmp);
280 TADC_IF_MemCpy(key, &g_baAESKey[0], 16);
281 TADC_IF_MemCpy(iv, &g_baAESKey[16], 16);
282 TADC_IF_AES_CTR(key, 16, iv, 20, (unsigned char *)sha1_tmp, &outlen,
283 (unsigned char *)sha1_tmp);
286 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After TADC_IF_AES_CTR \n");
288 psz64Parameter = Base64Encode(sha1_tmp, sizeof(sha1_tmp)); //MemAlloc
290 if (psz64Parameter == NULL) {
291 TADC_IF_Free(ReqTemp);
292 return TADC_MEMAlOC_ERROR;
296 DRM_TAPPS_LOG("Debug Log == TADC_MakeRequestRO : After Base64Encode \n");
298 TADC_IF_StrNCpy((char *)(outBuffer + i), ";hmac=", 6);
299 len = TADC_IF_StrLen((char *)psz64Parameter);
300 TADC_IF_MemCpy(outBuffer + i + 6, psz64Parameter, len + 1);
301 TADC_IF_StrNCpy((char *)outBuffer + i + 6 + len, "</reqdataset>\n</request>",
305 if (ReqTemp != NULL) {
306 TADC_IF_Free(ReqTemp);
310 if (psz64Parameter != NULL) {
311 TADC_IF_Free(psz64Parameter);
312 psz64Parameter = NULL;
315 len = TADC_IF_StrLen((char *)outBuffer);
316 IF_TRUE_RETURN(len <= 0, TADC_REQMAKEHMAC_ERROR);
318 DRM_TAPPS_LOG("TADC_MakeRequestRO Success!\n");
323 int TADC_GetHashReqID(unsigned char *inBuffer, unsigned char *hashReqID)
326 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
327 IF_TRUE_RETURN(hashReqID == NULL, TADC_PARAMETER_ERROR);
328 int nSize = TADC_IF_StrLen((char *)inBuffer);
329 IF_TRUE_RETURN(nSize <= 40 || nSize > RESP_MAXSIZE, TADC_PARAMETER_ERROR);
331 //Check XML Result Code ( Success result='0' )
335 for (i = 0; i < nSize; i++) {
336 if (!TADC_IF_MemCmp((char *)(inBuffer + i), "<response result=", 17)) {
339 if ((!memcmp((char *)(inBuffer + i), "'0'", 3)) ||
340 (!memcmp((char *)(inBuffer + i), "\"0\"", 3))) {
349 IF_TRUE_RETURN(((i == nSize) || (nResult < 0)), TADC_RESPONSEMESSAGE_ERROR);
353 char tmpbuf[512] = {0, };
355 for (i = 0; i < nSize; i++) {
356 if (!TADC_IF_MemCmp(inBuffer + i, "reqid=", 6)) {
359 IF_TRUE_RETURN(i + length > nSize || inBuffer[i + length] != ';',
360 TADC_RESPONSEMESSAGE_ERROR);
362 TADC_IF_StrNCpy(tmpbuf, (char *)(inBuffer + i), length);
363 tmpbuf[length] = '\0';
370 IF_TRUE_RETURN(length == 0, TADC_RESPONSEMESSAGE_ERROR);
372 if ((nResult = HEX2BIN((char *)tmpbuf, hashReqID, &length)) < 0) {
383 int TADC_GetResponseRO(unsigned char *inBuffer, T_ROACQ_INFO *t_ROAcqInfo,
384 T_RO *t_RO, unsigned char *outBuffer)
386 int nHMacSize = 28; // Base64 Enc length of SHA1 20byte
387 TADC_U8 sha1_tmp[20] = {0, };
388 char hmacBuf[512] = {0, };
389 BYTE *ReqTemp = NULL;
390 LPBYTE pbBuffer = NULL;
392 TADC_U8 key[16] = {0, };
393 TADC_U8 iv[16] = {0, };
397 char *License = NULL;
398 TCHAR tmpDH_B[DHKey_SIZE * 2 + 1] = {0, };
402 CPointerArray paChilds;
405 char *timeStamp = NULL;
413 char pRoHeader[36] = {
414 '<', '?', 'x', 'm', 'l', ' ', 'v', 'e',
415 'r', 's', 'i', 'o', 'n', '=', '"', '1',
416 '.', '0', '"', '?', '>', 0x0A, '<', 'T',
417 'i', 'z', 'e', 'n', 'L', 'i', 'c', 'e',
422 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
423 IF_TRUE_RETURN(t_ROAcqInfo == NULL, TADC_PARAMETER_ERROR);
424 IF_TRUE_RETURN(t_RO == NULL, TADC_PARAMETER_ERROR);
426 nSize = TADC_IF_StrLen((char *)inBuffer);
427 IF_TRUE_RETURN(nSize <= 40 || nSize > RESP_MAXSIZE, TADC_PARAMETER_ERROR);
429 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.pSize <= 0 ||
430 t_ROAcqInfo->t_DHInfo.pSize > DHKey_SIZE, TADC_PARAMETER_ERROR);
431 IF_TRUE_RETURN(t_ROAcqInfo->t_DHInfo.ASize <= 0 ||
432 t_ROAcqInfo->t_DHInfo.ASize > DHKey_SIZE, TADC_PARAMETER_ERROR);
434 //Check XML Result Code ( Success result='0' )
437 for (i = 0; i < nSize; i++) {
438 if (!TADC_IF_MemCmp((char *)(inBuffer + i), "<response result=", 17)) {
441 if ((!memcmp((char *)(inBuffer + i), "'0'", 3)) ||
442 (!memcmp((char *)(inBuffer + i), "\"0\"", 3))) {
451 IF_TRUE_RETURN(((i == nSize) || (nResult < 0)), TADC_RESPONSEMESSAGE_ERROR);
454 TADC_IF_MemSet(t_RO, 0, sizeof(T_RO));
455 TADC_IF_MemSet(tmpDH_B, 0, sizeof(tmpDH_B));
456 TADC_IF_MemSet(sha1_tmp, 0, sizeof(sha1_tmp));
457 TADC_IF_MemSet(hmacBuf, 0, sizeof(hmacBuf));
462 for (i = 0; i < nSize; i++) {
463 if (!TADC_IF_MemCmp((char *)(inBuffer + i), "<responsedata>", 14)) {
466 for (j = i; j < nSize; j++) {
467 if (!TADC_IF_MemCmp((char *)(inBuffer + j), ";hmac=", 6)) {
469 IF_TRUE_RETURN(req_length <= 0 ||
470 req_length >= RESP_MAXSIZE, TADC_PARAMETER_ERROR);
472 ReqTemp = (TADC_U8 *)TADC_IF_Malloc(req_length);
473 IF_TRUE_RETURN(ReqTemp == NULL, TADC_MEMAlOC_ERROR);
475 TADC_IF_MemSet(ReqTemp, 0, req_length);
476 TADC_IF_MemCpy(ReqTemp, inBuffer + i, req_length);
480 TADC_IF_StrNCpy(hmacBuf, (char *)(inBuffer + i + 6), nHMacSize);
489 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
491 pbBuffer = Base64Decode((LPCSTR)hmacBuf, &length);
493 if (pbBuffer == NULL) {
494 TADC_IF_Free(ReqTemp);
499 TADC_IF_MemCpy(key, &g_baAESKey[0], 16);
500 TADC_IF_MemCpy(iv, &g_baAESKey[16], 16);
501 TADC_IF_AES_CTR(key, 16, iv, 20, (unsigned char *)pbBuffer, &outlen,
502 (unsigned char *)pbBuffer);
504 TADC_IF_SHA1(ReqTemp, req_length, sha1_tmp);
506 if (ReqTemp != NULL) {
507 TADC_IF_Free(ReqTemp);
511 if (TADC_IF_MemCmp(sha1_tmp, pbBuffer, sizeof(sha1_tmp))) {
512 TADC_IF_Free(pbBuffer);
514 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
515 TADC_RESPONSESIGNATURE_ERROR);
516 return TADC_RESPONSESIGNATURE_ERROR;
519 TADC_IF_Free(pbBuffer);
524 for (i = 0; i < nSize; i++) {
525 if (!TADC_IF_MemCmp(inBuffer + i, "B=", 2)) {
528 for (j = i; j < nSize; j++) {
529 if (!TADC_IF_MemCmp(inBuffer + j, ";", 1)) {
531 IF_TRUE_RETURN(req_length <= 0 ||
532 req_length >= (int)sizeof(tmpDH_B), TADC_PARAMETER_ERROR);
533 TADC_IF_StrNCpy((char *)tmpDH_B, (char *)(inBuffer + i), req_length);
534 tmpDH_B[req_length] = 0;
543 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
545 TADC_IF_MemSet(t_ROAcqInfo->t_DHInfo.B, 0, sizeof(t_ROAcqInfo->t_DHInfo.B));
546 TADC_IF_MemCpy(t_ROAcqInfo->t_DHInfo.B, tmpDH_B,
547 sizeof(t_ROAcqInfo->t_DHInfo.B));
549 if (HEX2BIN((char *)tmpDH_B, t_ROAcqInfo->t_DHInfo.B,
550 (int *)&t_ROAcqInfo->t_DHInfo.BSize) < 0) {
551 return TADC_GETDHKEY_ERROR;
554 if (t_ROAcqInfo->t_DHInfo.BSize != 16 && t_ROAcqInfo->t_DHInfo.BSize != 64)
555 return TADC_GETDHKEY_ERROR;
557 TADC_IF_MemSet(t_ROAcqInfo->t_DHInfo.K, 0, sizeof(t_ROAcqInfo->t_DHInfo.K));
559 nResult = TADC_IF_GetDHKey_K(&t_ROAcqInfo->t_DHInfo);
560 IF_ERROR_RETURN(nResult, TADC_GETDHKEY_ERROR);
564 for (i = 0; i < nSize; i++) {
565 if (!TADC_IF_MemCmp((char *)(inBuffer + i), "license=", 8)) {
568 for (j = i; j < nSize; j++) {
569 if (!TADC_IF_MemCmp((char *)(inBuffer + j), ";hmac=", 6)) {
571 IF_TRUE_RETURN(req_length <= 0 ||
572 req_length >= RESP_MAXSIZE, TADC_PARAMETER_ERROR);
574 License = (char *)TADC_IF_Malloc(req_length + 1);
575 IF_TRUE_RETURN(License == NULL, TADC_MEMAlOC_ERROR);
577 TADC_IF_MemSet(License, 0, req_length + 1);
578 TADC_IF_StrNCpy(License, (char *)(inBuffer + i), req_length);
587 IF_TRUE_RETURN(req_length <= 0, TADC_RESPONSEMESSAGE_ERROR);
589 // Get RO License Info
590 pbBuffer = Base64Decode((LPCSTR)License, &length);
593 TADC_IF_Free(License);
598 pbBuffer[length] = 0;
599 TADC_IF_Free(License);
603 TADC_IF_MemCpy(key, &t_ROAcqInfo->t_DHInfo.K[0], 16);
604 TADC_IF_MemCpy(iv, &t_ROAcqInfo->t_DHInfo.K[16], 16);
605 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char *)pbBuffer, &outlen,
606 (unsigned char *)pbBuffer);
608 // Test Code for get the plaintext ro
610 strcat(tmpPath, (char*)t_RO->t_Content.CID);
611 strcat(tmpPath, ".ro");
612 fd = fopen(tmpPath, "w+b");
615 DRM_TAPPS_LOG("fopen started.");
616 fd = fopen("/tmp/1.ro", "w+b");
619 DRM_TAPPS_EXCEPTION("fopen() failed.");
623 DRM_TAPPS_LOG("fopen done.");
624 fwrite(pbBuffer, 1, strlen((char *)pbBuffer), fd);
625 DRM_TAPPS_LOG("fwrite done.");
627 DRM_TAPPS_LOG("fclose done.");
628 DRM_TAPPS_LOG("Save decrypted RO success!, path = %s", tmpPath);
632 if (TADC_IF_MemCmp((char *)pbBuffer, pRoHeader, 36)) {
633 TADC_IF_Free(pbBuffer);
635 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
636 TADC_LICENSEXMLPARSING_ERROR);
637 return TADC_LICENSEXMLPARSING_ERROR;
640 TADC_IF_MemCpy(outBuffer, pbBuffer, length);
641 TADC_IF_Free(pbBuffer);
644 ///////////////////////////////////////////////////////////////
647 ///////////////////////////////////////////////////////////////
652 DRM_TAPPS_LOG("timeStamp parsing start");
654 i = FindString(inBuffer, nSize, (unsigned char *)"<timeStamp>", 11);
657 DRM_TAPPS_LOG("No timeStamp. TADC_GetResponseRO Success!");
662 j = FindString(inBuffer, nSize, (unsigned char *)"</timeStamp>", 12);
663 IF_TRUE_RETURN(j < i, TADC_LICENSEXMLPARSING_ERROR);
665 IF_TRUE_RETURN(req_length > ROXML_MAXSIZE, TADC_PARAMETER_ERROR);
670 timeStamp = (char *)TADC_IF_Malloc(req_length + 1);
671 IF_TRUE_RETURN(timeStamp == NULL, TADC_MEMAlOC_ERROR);
673 TADC_IF_MemSet(timeStamp, 0, req_length + 1);
674 TADC_IF_StrNCpy(timeStamp, (char *)(inBuffer + i), req_length);
676 DRM_TAPPS_LOG("timeStamp parsing end.. req_length[%d]", req_length);
678 // Get RO License Info
679 pbBuffer = Base64Decode((LPCSTR)timeStamp, &length);
682 TADC_IF_Free(timeStamp);
684 DRM_TAPPS_EXCEPTION("Base64Decode Failed");
688 pbBuffer[length] = 0;
689 TADC_IF_Free(timeStamp);
692 DRM_TAPPS_LOG("Decrypt timeStamp starts");
695 TADC_IF_MemCpy(key, &t_ROAcqInfo->t_DHInfo.K[0], 16);
696 TADC_IF_MemCpy(iv, &t_ROAcqInfo->t_DHInfo.K[16], 16);
697 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char *)pbBuffer, &outlen,
698 (unsigned char *)pbBuffer);
700 if (length >= (int)sizeof(t_ROAcqInfo->sTimeStamp)) {
701 TADC_IF_Free(pbBuffer);
703 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
704 TADC_RESPONSEMESSAGE_ERROR);
705 return TADC_RESPONSEMESSAGE_ERROR;
708 TADC_IF_MemCpy(t_ROAcqInfo->sTimeStamp, pbBuffer, length);
709 t_ROAcqInfo->sTimeStamp[length] = 0;
711 TADC_IF_Free(pbBuffer);
714 DRM_TAPPS_LOG("timeStamp found. TADC_GetResponseRO Success!");
718 int TADC_VerifyROSignature(LPBYTE pszXML)
721 int length = 0, i = 0, i2 = 0;
723 unsigned char *pSigData = NULL;
724 unsigned char *pRICert = NULL;
725 unsigned char *pRICACert = NULL;
727 int inLen = 0, sigLen = 0, certLen = 0, certLen2 = 0;
730 char TempBuf[CERT_MAXSIZE] = {0, };
733 IF_TRUE_RETURN(pszXML == NULL, TADC_PARAMETER_ERROR);
736 i = FindString(pszXML, TADC_IF_StrLen((char *)pszXML),
737 (LPBYTE)"<version>2.0</version>", 22);
740 DRM_TAPPS_EXCEPTION("It is not the TAD-RO2.0 format.");
744 DRM_TAPPS_LOG("It is the TAD-RO2.0 format.");
746 //Get Certificates ( RI Cert )
747 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
749 i = FindString(pszXML, TADC_IF_StrLen((char *)pszXML),
750 (LPBYTE)"<CertificateChain>", 18);
751 IF_TRUE_RETURN(i < 0, TADC_RO_CERTIFICATE_ERROR);
753 p = pszXML + i; // <certificateChain>
754 length = TADC_IF_StrLen((char *)pszXML) - i;
756 i = FindString(p, length, (LPBYTE)"<Certificate>", 13);
757 IF_TRUE_RETURN(i < 0, TADC_RO_CERTIFICATE_ERROR);
758 i += 13; // start position of RI Cert
760 i2 = FindString(p, length, (LPBYTE)"</Certificate>", 14);
761 IF_TRUE_RETURN(i2 < (i + 13), TADC_RO_CERTIFICATE_ERROR);
762 certLen = i2 - i; // size of RI Cert
764 TADC_IF_StrNCpy(TempBuf, (char *)p + i, certLen);
766 pRICert = Base64Decode((LPCSTR)TempBuf, &certLen);
767 IF_TRUE_RETURN(pRICert == NULL, TADC_RO_CERTIFICATE_ERROR);
768 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
770 //Get Certificates ( RICA Cert )
771 p = p + (i2 + 14); // first </certificate>
772 length = length - (i2 + 14);
774 i = FindString(p, length, (LPBYTE)"<Certificate>", 13);
775 IF_TRUE_RETURN2(i < 0, TADC_IF_Free(pRICert), , , TADC_RO_CERTIFICATE_ERROR);
776 i += 13; // start position of RICA Cert
778 i2 = FindString(p, length, (LPBYTE)"</Certificate>", 14);
779 IF_TRUE_RETURN2(i2 < (i + 13), TADC_IF_Free(pRICert), , ,
780 TADC_RO_CERTIFICATE_ERROR);
781 certLen2 = i2 - i; // size of RICA Cert
783 TADC_IF_StrNCpy(TempBuf, (char *)p + i, certLen2);
785 pRICACert = Base64Decode((LPCSTR)TempBuf, &certLen2);
786 IF_TRUE_RETURN2(pRICACert == NULL, TADC_IF_Free(pRICert), , ,
787 TADC_RO_CERTIFICATE_ERROR);
788 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
790 //Get position of indata
791 inLen = FindString(pszXML, TADC_IF_StrLen((char *)pszXML),
792 (LPBYTE)"</CertificateChain>", 19);
793 IF_TRUE_RETURN2(inLen < 0, TADC_IF_Free(pRICert), TADC_IF_Free(pRICACert), ,
794 TADC_RO_CERTIFICATE_ERROR);
797 //Get signature value </certificateChain>
799 length = TADC_IF_StrLen((char *)pszXML) - inLen;
801 i = FindString(p, length, (LPBYTE)"<SignatureValue>", 16);
802 IF_TRUE_RETURN2(i < 0, TADC_IF_Free(pRICert), TADC_IF_Free(pRICACert), ,
803 TADC_RO_SIGNATURE_ERROR);
804 i += 16; // start position of signature value
806 i2 = FindString(p, length, (LPBYTE)"</SignatureValue>", 17);
807 IF_TRUE_RETURN2(i2 < (i + 16), TADC_IF_Free(pRICert), TADC_IF_Free(pRICACert), ,
808 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),
815 TADC_IF_Free(pRICACert), , TADC_RO_SIGNATURE_ERROR);
816 TADC_IF_MemSet(TempBuf, 0x00, CERT_MAXSIZE);
818 //Verify the certificate chain
819 nResult = TADC_IF_VerifyCertChain(pRICACert, certLen2, pRICert, certLen);
822 nResult = TADC_IF_VerifySignature(pszXML, inLen, pSigData, sigLen, pRICert,
825 TADC_IF_Free(pRICert);
826 TADC_IF_Free(pRICACert);
827 TADC_IF_Free(pSigData);
832 int TADC_GetResponseROInfo(LPBYTE pszXML, T_RO *t_RO)
836 CXMLElement *pRoot, *pElement;
837 CPointerArray paChilds;
839 LPBYTE pbBuffer = NULL;
841 TADC_U8 TempVersion[3] = {0, };
843 char pRoHeader[36] = {
844 '<', '?', 'x', 'm', 'l', ' ', 'v', 'e',
845 'r', 's', 'i', 'o', 'n', '=', '"', '1',
846 '.', '0', '"', '?', '>', 0x0A, '<', 'T',
847 'i', 'z', 'e', 'n', 'L', 'i', 'c', 'e',
852 IF_TRUE_RETURN(pszXML == NULL, TADC_PARAMETER_ERROR);
853 IF_TRUE_RETURN(t_RO == NULL, TADC_PARAMETER_ERROR);
856 TADC_IF_MemSet(t_RO, 0, sizeof(T_RO));
857 TADC_IF_MemSet(TempVersion, 0, sizeof(TempVersion));
859 if (TADC_IF_MemCmp((char *)pszXML, pRoHeader, 36)) {
860 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
864 // Verify the signature ( 2011.03.08, Joseph Ahn )
865 nResult = TADC_VerifyROSignature(pszXML);
868 DRM_TAPPS_EXCEPTION("TADC_VerifyROSignature Error Code = %x", nResult);
872 nResult = oXMLFile.LoadFromStream((LPCTSTR)pszXML);
875 DRM_TAPPS_EXCEPTION("oXMLFile.LoadFromStream is failed\n");
881 pRoot = oXMLFile.GetRoot();
884 DRM_TAPPS_EXCEPTION("oXMLFile.GetRoot is failed\n");
889 paChilds.RemoveAll();
890 nResult = pRoot->Find(&paChilds, _T("ContentInfo"), _T("cid"), NULL);
893 DRM_TAPPS_EXCEPTION("pRoot->Find is failed\n");
898 if (paChilds.GetCount() != 1) {
899 DRM_TAPPS_EXCEPTION("paChilds.GetCount() is failed\n");
904 pElement = (CXMLElement *)paChilds.Get(0);
905 pszValue = pElement->GetValue();
907 if (pszValue == NULL) {
908 DRM_TAPPS_EXCEPTION("pElement->GetValue() is failed\n");
913 length = TADC_IF_StrLen((char *)pszValue);
915 if (length <= 0 || length > CID_SIZE) {
916 DRM_TAPPS_EXCEPTION("TADC_IF_StrLen is failed(%d) - %s\n", length, pszValue);
921 t_RO->t_Content.CID = (TADC_U8 *)TADC_IF_Malloc(length + 1);
922 IF_TRUE_GOTO(t_RO->t_Content.CID == NULL, -2);
923 TADC_IF_MemSet(t_RO->t_Content.CID, 0, length + 1);
924 TADC_IF_StrNCpy((CHAR *)t_RO->t_Content.CID, pszValue, length + 1);
926 // Get KeyValue (CEK)
927 pRoot = oXMLFile.GetRoot();
928 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
930 paChilds.RemoveAll();
931 nResult = pRoot->Find(&paChilds, _T("KeyInfo"), _T("CipherValue"), NULL);
933 IF_TRUE_GOTO(nResult != 0, ERROR_INVALID_DATA);
934 IF_TRUE_GOTO(paChilds.GetCount() != 1, ERROR_INVALID_DATA);
936 pElement = (CXMLElement *)paChilds.Get(0);
937 pszValue = pElement->GetValue();
938 IF_TRUE_GOTO(pszValue == NULL, -2);
940 pbBuffer = Base64Decode(pszValue, &length);
942 if (pbBuffer == NULL) {
943 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
947 if (length <= 0 || length > CEK_SIZE) {
948 TADC_IF_Free(pbBuffer);
954 t_RO->t_Content.CEK = (TADC_U8 *)TADC_IF_Malloc(length + 1);
955 IF_TRUE_GOTO(t_RO->t_Content.CEK == NULL, -2);
956 TADC_IF_MemSet(t_RO->t_Content.CEK, 0, length + 1);
957 TADC_IF_MemCpy(t_RO->t_Content.CEK, pbBuffer, length);
959 TADC_IF_Free(pbBuffer);
963 pRoot = oXMLFile.GetRoot();
964 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
966 paChilds.RemoveAll();
967 nResult = pRoot->Find(&paChilds, _T("DeviceInfo"), _T("DUID"), NULL);
969 IF_TRUE_GOTO(nResult != 0, ERROR_INVALID_DATA);
970 IF_TRUE_GOTO(paChilds.GetCount() != 1, ERROR_INVALID_DATA);
972 pElement = (CXMLElement *)paChilds.Get(0);
973 pszValue = pElement->GetValue();
974 IF_TRUE_GOTO(pszValue == NULL, -1);
975 length = TADC_IF_StrLen((char *)pszValue);
982 t_RO->PerFlag |= DUID_RULE;
983 t_RO->t_Permission.t_Individual.BindingType |= DUID_RULE;
984 t_RO->t_Permission.t_Individual.DUID = (TADC_U8 *)TADC_IF_Malloc(length + 1);
986 if (t_RO->t_Permission.t_Individual.DUID == NULL) {
987 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_MEMAlOC_ERROR);
992 TADC_IF_MemSet(t_RO->t_Permission.t_Individual.DUID, 0, length + 1);
993 TADC_IF_MemCpy((CHAR *)t_RO->t_Permission.t_Individual.DUID, pszValue, length + 1);
1001 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_XMLPARSER_ERROR);
1004 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_MEMAlOC_ERROR);
1006 TADC_IF_Free(pbBuffer);
1011 int TADC_GetFileHeader(unsigned char *inBuffer, T_FILE_HEADER *t_FileHeader)
1014 BYTE FixedFileType[8] = {0x00, 0x00, 0x00, 0x14, 0x66, 0x74, 0x79, 0x70};
1017 //Check Param Bufffer
1018 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
1019 IF_TRUE_RETURN(t_FileHeader == NULL, TADC_PARAMETER_ERROR);
1022 TADC_IF_MemSet(t_FileHeader, 0, sizeof(T_FILE_HEADER));
1023 TADC_IF_MemSet(tmp, 0, sizeof(tmp));
1025 if (TADC_IF_MemCmp(inBuffer, FixedFileType, sizeof(FixedFileType))) {
1026 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
1027 TADC_CONTENTSSTRUCT_ERROR);
1033 if (TADC_IF_MemCmp(inBuffer + i, "TADF", 4)) {
1034 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
1035 TADC_CONTENTSSTRUCT_ERROR);
1041 t_FileHeader->Version[0] = '1';
1042 t_FileHeader->Version[1] = '0';
1045 if (TADC_IF_MemCmp(inBuffer + i, "TADF", 4)) {
1046 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
1047 TADC_CONTENTSSTRUCT_ERROR);
1053 t_FileHeader->DRMType = inBuffer[i];
1056 TADC_IF_MemCpy(t_FileHeader->ContentsType, inBuffer + i, 128);
1059 TADC_IF_MemCpy(&t_FileHeader->TotalSize, inBuffer + i, 8);
1061 t_FileHeader->TotalSize = _hton64(t_FileHeader->TotalSize);
1063 TADC_IF_MemCpy(&t_FileHeader->Offset1, inBuffer + i, 8);
1065 t_FileHeader->Offset1 = _hton64(t_FileHeader->Offset1);
1067 TADC_IF_MemCpy(&t_FileHeader->Offset2, inBuffer + i, 8);
1069 t_FileHeader->Offset2 = _hton64(t_FileHeader->Offset2);
1071 TADC_IF_MemCpy(&t_FileHeader->Offset3, inBuffer + i, 8);
1073 t_FileHeader->Offset3 = _hton64(t_FileHeader->Offset3);
1075 TADC_IF_MemCpy(&t_FileHeader->Offset4, inBuffer + i, 8);
1077 t_FileHeader->Offset4 = _hton64(t_FileHeader->Offset4);
1079 TADC_IF_MemCpy(&t_FileHeader->Offset5, inBuffer + i, 8);
1081 t_FileHeader->Offset5 = _hton64(t_FileHeader->Offset5);
1083 TADC_IF_MemCpy(&t_FileHeader->Offset6, inBuffer + i, 8);
1085 t_FileHeader->Offset6 = _hton64(t_FileHeader->Offset6);
1087 TADC_IF_MemCpy(&t_FileHeader->Offset7, inBuffer + i, 8);
1089 t_FileHeader->Offset7 = _hton64(t_FileHeader->Offset7);
1091 TADC_IF_MemCpy(&t_FileHeader->Offset8, inBuffer + i, 8);
1093 t_FileHeader->Offset8 = _hton64(t_FileHeader->Offset8);
1095 DRM_TAPPS_LOG("TADC_GetFileHeader Success!\n");
1099 int TADC_GetDRMHeader(unsigned char *inBuffer, T_DRM_HEADER *t_DRMHeader)
1103 //Check Param Bufffer
1104 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
1105 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1108 TADC_IF_MemSet(t_DRMHeader, 0, sizeof(T_DRM_HEADER));
1110 if (TADC_IF_MemCmp(inBuffer, "TIZEN_DRM", 9)) {
1111 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_NOTTADCFILE_ERROR);
1117 TADC_IF_MemCpy(t_DRMHeader->Version, inBuffer + i, 2);
1120 TADC_IF_MemCpy(&t_DRMHeader->XmlSize, inBuffer + i, 4);
1123 t_DRMHeader->XmlSize = htonl_(t_DRMHeader->XmlSize);
1124 DRM_TAPPS_LOG("TADC_GetDRMHeader Success!\n");
1129 int TADC_GetDRMHeaderInfo(unsigned char *inBuffer, T_DRM_HEADER *t_DRMHeader)
1133 CXMLElement *pRoot, *pNode;
1134 CPointerArray paChilds;
1138 unsigned char *ReqTemp = NULL;
1147 IF_TRUE_RETURN(inBuffer == NULL, TADC_PARAMETER_ERROR);
1148 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1150 IF_TRUE_RETURN(t_DRMHeader->XmlSize <= 0 ||
1151 t_DRMHeader->XmlSize > ROXML_MAXSIZE, TADC_PARAMETER_ERROR);
1153 ReqTemp = (TADC_U8 *)TADC_IF_Malloc(t_DRMHeader->XmlSize);
1154 IF_TRUE_RETURN(ReqTemp == NULL, TADC_MEMAlOC_ERROR);
1156 TADC_IF_MemSet(ReqTemp, 0, t_DRMHeader->XmlSize);
1157 TADC_IF_MemSet(sha1_tmp, 0, sizeof(sha1_tmp));
1160 TADC_IF_MemCpy(ReqTemp, inBuffer + 20, t_DRMHeader->XmlSize);
1161 TADC_IF_SHA1(ReqTemp, t_DRMHeader->XmlSize, sha1_tmp);
1163 if (ReqTemp != NULL) {
1164 TADC_IF_Free(ReqTemp);
1168 TADC_IF_MemCpy(key, &g_baSignatureKey[0], 16);
1169 TADC_IF_MemCpy(iv, &g_baSignatureKey[16], 16);
1170 TADC_IF_AES_CTR(key, 16, iv, 20, (unsigned char *)sha1_tmp, &outlen,
1171 (unsigned char *)sha1_tmp);
1173 if (TADC_IF_MemCmp(sha1_tmp, inBuffer, sizeof(sha1_tmp))) {
1174 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSHMAC_ERROR);
1179 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);
1193 if (paChilds.GetCount() == 1) {
1194 pNode = (CXMLElement *)paChilds.Get(0);
1195 pszValue = pNode->GetValue();
1196 Length = TADC_IF_StrLen((char *)pszValue);
1199 t_DRMHeader->SID = (TADC_U8 *)TADC_IF_Malloc(Length + 1);
1200 IF_TRUE_RETURN(t_DRMHeader->SID == NULL, TADC_MEMAlOC_ERROR);
1201 TADC_IF_MemSet(t_DRMHeader->SID, 0, Length + 1);
1202 TADC_IF_StrNCpy((CHAR *)t_DRMHeader->SID, pszValue, Length + 1);
1207 pRoot = oXMLFile.GetRoot();
1208 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1210 paChilds.RemoveAll();
1211 nResult = pRoot->Find(&paChilds, _T("CID"), NULL);
1214 if (paChilds.GetCount() == 1) {
1215 pNode = (CXMLElement *)paChilds.Get(0);
1216 pszValue = pNode->GetValue();
1217 Length = TADC_IF_StrLen((char *)pszValue);
1220 t_DRMHeader->CID = (TADC_U8 *)TADC_IF_Malloc(Length + 1);
1221 IF_TRUE_RETURN(t_DRMHeader->CID == NULL, TADC_MEMAlOC_ERROR);
1222 TADC_IF_MemSet(t_DRMHeader->CID, 0, Length + 1);
1223 TADC_IF_StrNCpy((CHAR *)t_DRMHeader->CID, pszValue, Length + 1);
1228 pRoot = oXMLFile.GetRoot();
1229 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1230 paChilds.RemoveAll();
1231 nResult = pRoot->Find(&paChilds, _T("ContentType"), NULL);
1234 if (paChilds.GetCount() == 1) {
1235 pNode = (CXMLElement *)paChilds.Get(0);
1236 pszValue = pNode->GetValue();
1237 Length = TADC_IF_StrLen((char *)pszValue);
1238 TADC_IF_MemSet(t_DRMHeader->ContentsType, 0, 128);
1239 TADC_IF_StrNCpy((CHAR *)t_DRMHeader->ContentsType, pszValue, Length + 1);
1243 pRoot = oXMLFile.GetRoot();
1244 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1245 paChilds.RemoveAll();
1246 nResult = pRoot->Find(&paChilds, _T("EncryptionMethod"), NULL);
1249 if (paChilds.GetCount() == 1) {
1250 pNode = (CXMLElement *)paChilds.Get(0);
1251 pszValue = pNode->GetValue();
1252 t_DRMHeader->EncryptionMethod = TADC_IF_AtoI((char *)pszValue);
1256 pRoot = oXMLFile.GetRoot();
1257 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1258 paChilds.RemoveAll();
1259 nResult = pRoot->Find(&paChilds, _T("EncryptionLevel"), NULL);
1262 if (paChilds.GetCount() == 1) {
1263 pNode = (CXMLElement *)paChilds.Get(0);
1264 pszValue = pNode->GetValue();
1265 t_DRMHeader->EncryptionLevel = TADC_IF_AtoI((char *)pszValue);
1269 pRoot = oXMLFile.GetRoot();
1270 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1271 paChilds.RemoveAll();
1272 nResult = pRoot->Find(&paChilds, _T("EncryptionRange"), NULL);
1275 if (paChilds.GetCount() == 1) {
1276 pNode = (CXMLElement *)paChilds.Get(0);
1277 pszValue = pNode->GetValue();
1278 t_DRMHeader->EncryptionRange = TADC_IF_AtoI((char *)pszValue);
1282 pRoot = oXMLFile.GetRoot();
1283 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1284 paChilds.RemoveAll();
1285 nResult = pRoot->Find(&paChilds, _T("RIURL"), NULL);
1288 if (paChilds.GetCount() == 1) {
1289 pNode = (CXMLElement *)paChilds.Get(0);
1290 pszValue = pNode->GetValue();
1291 Length = TADC_IF_StrLen((char *)pszValue);
1294 t_DRMHeader->RIURL = (TADC_U8 *)TADC_IF_Malloc(Length + 1);
1295 IF_TRUE_RETURN(t_DRMHeader->RIURL == NULL, TADC_MEMAlOC_ERROR);
1296 TADC_IF_MemSet(t_DRMHeader->RIURL, 0, Length + 1);
1297 TADC_IF_StrNCpy((CHAR *)t_DRMHeader->RIURL, pszValue, Length + 1);
1302 // dummy RIURL(DRM Server spec changed)
1303 if (t_DRMHeader->RIURL == NULL) {
1304 pszValue = "dummy_riurl";
1305 Length = TADC_IF_StrLen(pszValue);
1306 t_DRMHeader->RIURL = (TADC_U8 *)TADC_IF_Malloc(Length + 1);
1307 IF_TRUE_RETURN(t_DRMHeader->RIURL == NULL, TADC_MEMAlOC_ERROR);
1308 TADC_IF_MemSet(t_DRMHeader->RIURL, 0, Length + 1);
1309 TADC_IF_StrNCpy((CHAR *)t_DRMHeader->RIURL, pszValue, Length + 1);
1312 DRM_TAPPS_LOG("t_DRMHeader->RIURL = %s\n", (char *)t_DRMHeader->RIURL);
1314 pRoot = oXMLFile.GetRoot();
1315 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1316 paChilds.RemoveAll();
1317 nResult = pRoot->Find(&paChilds, _T("PlaintextSize"), NULL);
1320 if (paChilds.GetCount() == 1) {
1321 pNode = (CXMLElement *)paChilds.Get(0);
1322 pszValue = pNode->GetValue();
1323 t_DRMHeader->PlaintextSize = TADC_IF_AtoI((char *)pszValue);
1327 pRoot = oXMLFile.GetRoot();
1328 IF_TRUE_GOTO(pRoot == NULL, ERROR_INVALID_DATA);
1329 paChilds.RemoveAll();
1330 nResult = pRoot->Find(&paChilds, _T("Packdate"), NULL);
1333 if (paChilds.GetCount() == 1) {
1334 pNode = (CXMLElement *)paChilds.Get(0);
1335 pszValue = pNode->GetValue();
1336 Length = TADC_IF_StrLen((char *)pszValue);
1339 t_DRMHeader->Packdate = (TADC_U8 *)TADC_IF_Malloc(Length + 1);
1340 IF_TRUE_RETURN(t_DRMHeader->Packdate == NULL, TADC_MEMAlOC_ERROR);
1341 TADC_IF_MemSet(t_DRMHeader->Packdate, 0, Length + 1);
1342 TADC_IF_StrNCpy((char *)t_DRMHeader->Packdate, pszValue, Length + 1);
1350 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_CONTENTSXML_ERROR);
1351 STACKTRACE(_T("CNCG20File::_ParseHeader()"));
1354 DRM_TAPPS_LOG("TADC_GetDRMHeaderInfo Success! \n");
1358 int TADC_GetCEK(T_DEVICE_INFO *t_DeviceInfo, T_RO *t_RODB,
1359 T_DRM_HEADER *t_DRMHeader)
1363 //Check Parameter Buffer
1364 IF_TRUE_RETURN(t_DeviceInfo == NULL, TADC_PARAMETER_ERROR);
1365 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1366 IF_TRUE_RETURN(t_DRMHeader->CID == NULL, TADC_PARAMETER_ERROR);
1367 IF_TRUE_RETURN(t_RODB == NULL, TADC_PARAMETER_ERROR);
1368 IF_TRUE_RETURN(t_RODB->t_Content.CID == NULL, TADC_PARAMETER_ERROR);
1370 if (!TADC_IF_StrCmp((char *)t_DRMHeader->CID, (char *)t_RODB->t_Content.CID)) {
1371 if ((t_RODB->PerFlag & DUID_RULE) &&
1372 (t_RODB->t_Permission.t_Individual.BindingType & DUID_RULE)) {
1373 IF_TRUE_RETURN(t_RODB->t_Permission.t_Individual.DUID == NULL,
1374 TADC_PARAMETER_ERROR);
1375 length1 = TADC_IF_StrLen((char *)t_DeviceInfo->DUID);
1377 "t_DeviceInfo->DUID = %s, "
1378 "t_RODB->t_Permission.t_Individual.DUID is %s, "
1380 t_DeviceInfo->DUID, t_RODB->t_Permission.t_Individual.DUID, length1);
1381 /*if (TADC_IF_MemCmp(t_DeviceInfo->DUID,
1382 * t_RODB->t_Permission.t_Individual.DUID, length1)) {
1383 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x",
1384 TADC_RULE_DUID_ERROR);
1389 IF_TRUE_RETURN(t_RODB->t_Content.CEK == NULL, TADC_PARAMETER_ERROR);
1390 t_DRMHeader->CEK = (TADC_U8 *)TADC_IF_Malloc(CEK_SIZE + 1);
1391 IF_TRUE_RETURN(t_DRMHeader->CEK == NULL, TADC_MEMAlOC_ERROR);
1392 TADC_IF_MemSet(t_DRMHeader->CEK, 0, CEK_SIZE + 1);
1393 TADC_IF_MemCpy(t_DRMHeader->CEK, t_RODB->t_Content.CEK, CEK_SIZE);
1395 DRM_TAPPS_LOG("TADC_GetCEK Success!\n");
1399 DRM_TAPPS_EXCEPTION("TADC_IF_MemCmp Error Code = %x", TADC_RULE_NOINFOMATION);
1404 int TADC_DecryptBlock(char *pbBuffer, int nSize,
1405 const T_DRM_HEADER *t_DRMHeader)
1407 TADC_U8 key[16] = {0, };
1408 TADC_U8 iv[16] = {0, };
1409 int i = 0, nBlocks = 0, nIndex = 0;
1410 char baToBeEncrypted[32] = {0, };
1411 int nRemainBytes = 0, nBlockBytes = 0;
1413 int nEncryptionLevel = 0;
1414 int nEncryptionMethod = 0;
1416 char temp[512] = {0, };
1420 TADC_IF_MemSet(temp, 0, sizeof(temp));
1422 IF_TRUE_RETURN(pbBuffer == NULL, TADC_PARAMETER_ERROR);
1423 IF_TRUE_RETURN(t_DRMHeader == NULL, TADC_PARAMETER_ERROR);
1425 IF_TRUE_RETURN(nSize > 512, TADC_PARAMETER_ERROR);
1426 IF_TRUE_RETURN(t_DRMHeader->CEK == NULL, TADC_PARAMETER_ERROR);
1428 nEncryptionLevel = t_DRMHeader->EncryptionLevel;
1429 nEncryptionMethod = t_DRMHeader->EncryptionMethod;
1431 IF_TRUE_RETURN(nEncryptionMethod != 1, TADC_PARAMETER_ERROR);
1432 IF_TRUE_RETURN(nEncryptionLevel < 0 ||
1433 nEncryptionLevel > 32, TADC_PARAMETER_ERROR);
1435 TADC_IF_MemSet(baToBeEncrypted, 1, 32);
1437 if (nEncryptionLevel > 16)
1440 nBlocks = nEncryptionLevel;
1442 for (i = 0; i < nBlocks; i++) {
1443 nIndex = 31 - (i * 2);
1444 baToBeEncrypted[nIndex] = 0;
1447 for (i = 16; i < nEncryptionLevel; i++) {
1448 nIndex = 30 - ((i - 16) * 2);
1449 baToBeEncrypted[nIndex] = 0;
1452 nRemainBytes = nSize;
1458 for (i = 0; i < 32; i++) {
1459 if (nRemainBytes < 16)
1460 nBlockBytes = nRemainBytes;
1462 if (baToBeEncrypted[i] == 1) {
1463 TADC_IF_MemCpy(temp + length, pbBuffer + totlength, nBlockBytes);
1464 length += nBlockBytes;
1467 nRemainBytes -= nBlockBytes;
1468 totlength += nBlockBytes;
1470 if (nRemainBytes < 1)
1474 TADC_IF_MemCpy(key, &t_DRMHeader->CEK[0], 16);
1475 TADC_IF_MemCpy(iv, &t_DRMHeader->CEK[16], 16);
1476 TADC_IF_AES_CTR(key, 16, iv, length, (unsigned char *)temp, &length,
1477 (unsigned char *)temp);
1479 nRemainBytes = nSize;
1485 for (i = 0; i < 32; i++) {
1486 if (nRemainBytes < 16)
1487 nBlockBytes = nRemainBytes;
1489 if (baToBeEncrypted[i] == 1) {
1490 TADC_IF_MemCpy(pbBuffer + totlength, temp + length, nBlockBytes);
1491 length += nBlockBytes;
1494 nRemainBytes -= nBlockBytes;
1495 totlength += nBlockBytes;
1497 if (nRemainBytes < 1) {
1505 int TADC_GetDRMHeaderFromFile(const char *pTADCFilepath,
1506 T_FILE_HEADER *t_FileHeader, T_DRM_HEADER *t_DRMHeader)
1508 unsigned char tempbuf[512];
1509 unsigned char *pbuf = NULL;
1512 ULONG readsize = 0, ReadLen = 0;
1514 FILE *hFile = 0; //Apps drm file
1517 if (pTADCFilepath == NULL || t_FileHeader == NULL || t_DRMHeader == NULL) {
1518 DRM_TAPPS_EXCEPTION("Error : Parameter Null.");
1523 TADC_IF_MemSet(tempbuf, 0, sizeof(tempbuf));
1526 if ((hFile = fopen(pTADCFilepath, "rb")) == NULL) {
1527 DRM_TAPPS_EXCEPTION("Error : fopen() error.");
1533 //FmReadFile(hFile, tempbuf, readsize, &ReadLen);
1534 ReadLen = fread(tempbuf, 1, readsize, hFile);
1536 if ((readsize != ReadLen) ||
1537 (ret = TADC_GetFileHeader(tempbuf, t_FileHeader)) < 0) {
1538 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1543 TADC_IF_MemSet(tempbuf, 0, sizeof(tempbuf));
1545 //Tizen Apps DRM Type Check
1546 if (t_FileHeader->DRMType & TIZEN_DRM) {
1547 DRM_TAPPS_LOG("It's a TAPPS DCF = %s", pTADCFilepath);
1549 ReadLen = fread(tempbuf, 1, readsize, hFile);
1551 if ((readsize != ReadLen) ||
1552 (ret = TADC_GetDRMHeader(tempbuf, t_DRMHeader)) < 0) {
1553 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1558 readsize = 20 + t_DRMHeader->XmlSize;
1560 pbuf = (unsigned char *)TADC_IF_Malloc(readsize * sizeof(char));
1563 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1568 ReadLen = fread(pbuf, 1, readsize, hFile);
1570 if (readsize != ReadLen) {
1571 DRM_TAPPS_EXCEPTION("Error : fread() error.");
1577 if (TADC_GetDRMHeaderInfo(pbuf, t_DRMHeader) < 0) {
1578 DRM_TAPPS_EXCEPTION("Error : TADC_GetDRMHeaderInfo error.");
1586 DRM_TAPPS_EXCEPTION("Error : It's not a TApps DCF file.");
1595 DWORD TADC_GetLastError(void)
1597 DWORD dwError = g_TADCErrorCode;
1598 g_TADCErrorCode = 0;
1603 int TADC_MEMFree_RO(T_RO *t_ro)
1605 IF_TRUE_RETURN(t_ro == NULL, TADC_PARAMETER_ERROR);
1608 if (t_ro->t_Content.CID != NULL) {
1609 TADC_IF_Free(t_ro->t_Content.CID);
1610 t_ro->t_Content.CID = NULL;
1613 if (t_ro->t_Content.CEK != NULL) {
1614 TADC_IF_Free(t_ro->t_Content.CEK);
1615 t_ro->t_Content.CEK = NULL;
1618 if (t_ro->t_Permission.t_Individual.DUID != NULL) {
1619 TADC_IF_Free(t_ro->t_Permission.t_Individual.DUID);
1620 t_ro->t_Permission.t_Individual.DUID = NULL;
1626 int TADC_MEMFree_FileHeader(T_FILE_HEADER *t_FileHeader)
1628 IF_TRUE_RETURN(t_FileHeader == NULL, TADC_PARAMETER_ERROR);
1629 TADC_IF_MemSet(t_FileHeader, 0, sizeof(T_FILE_HEADER));
1634 int TADC_MEMFree_DRMHeader(T_DRM_HEADER *t_DrmHeader)
1636 IF_TRUE_RETURN(t_DrmHeader == NULL, TADC_PARAMETER_ERROR);
1637 t_DrmHeader->XmlSize = 0;
1638 TADC_IF_MemSet(t_DrmHeader->Version, 0, sizeof(t_DrmHeader->Version));
1640 if (t_DrmHeader->SID != NULL) {
1641 TADC_IF_Free(t_DrmHeader->SID);
1642 t_DrmHeader->SID = NULL;
1645 if (t_DrmHeader->CID != NULL) {
1646 TADC_IF_Free(t_DrmHeader->CID);
1647 t_DrmHeader->CID = NULL;
1650 TADC_IF_MemSet(t_DrmHeader->ContentsType, 0, sizeof(t_DrmHeader->ContentsType));
1651 t_DrmHeader->EncryptionRange = 0;
1653 if (t_DrmHeader->RIURL != NULL) {
1654 TADC_IF_Free(t_DrmHeader->RIURL);
1655 t_DrmHeader->RIURL = NULL;
1658 t_DrmHeader->PlaintextSize = 0;
1660 if (t_DrmHeader->Packdate != NULL) {
1661 TADC_IF_Free(t_DrmHeader->Packdate);
1662 t_DrmHeader->Packdate = NULL;
1665 if (t_DrmHeader->CEK != NULL) {
1666 TADC_IF_Free(t_DrmHeader->CEK);
1667 t_DrmHeader->CEK = NULL;
1673 int TADC_MEMFree_ROAcqInfo(T_ROACQ_INFO *t_ROAcqInfo)
1675 IF_TRUE_RETURN(t_ROAcqInfo == NULL, TADC_PARAMETER_ERROR);
1677 if (t_ROAcqInfo->ROAcqURL != NULL) {
1678 TADC_IF_Free(t_ROAcqInfo->ROAcqURL);
1679 t_ROAcqInfo->ROAcqURL = NULL;
1682 if (t_ROAcqInfo->ReqID != NULL) {
1683 TADC_IF_Free(t_ROAcqInfo->ReqID);
1684 t_ROAcqInfo->ReqID = NULL;
1687 TADC_IF_MemSet(&t_ROAcqInfo->t_DHInfo, 0, sizeof(T_DH_INFO));