| /* | |
| * GPAC - Multimedia Framework C SDK | |
| * | |
| * Authors: Jean Le Feuvre | |
| * Copyright (c) Telecom ParisTech 2000-2020 | |
| * All rights reserved | |
| * | |
| * This file is part of GPAC / MPEG-4 ObjectDescriptor sub-project | |
| * | |
| * GPAC is free software; you can redistribute it and/or modify | |
| * it under the terms of the GNU Lesser General Public License as published by | |
| * the Free Software Foundation; either version 2, or (at your option) | |
| * any later version. | |
| * | |
| * GPAC is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; see the file COPYING. If not, write to | |
| * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | |
| * | |
| */ | |
| #include <gpac/internal/odf_dev.h> | |
| #ifndef GPAC_MINIMAL_ODF | |
| void GF_IPMPX_AUTH_Delete(GF_IPMPX_Authentication *auth); | |
| u8 gf_ipmpx_get_tag(char *dataName) | |
| { | |
| if (!stricmp(dataName, "IPMP_KeyData")) return GF_IPMPX_KEY_DATA_TAG; | |
| else if (!stricmp(dataName, "IPMP_RightsData")) return GF_IPMPX_RIGHTS_DATA_TAG; | |
| else if (!stricmp(dataName, "IPMP_OpaqueData")) return GF_IPMPX_OPAQUE_DATA_TAG; | |
| else if (!stricmp(dataName, "IPMP_SecureContainer")) return GF_IPMPX_SECURE_CONTAINER_TAG; | |
| else if (!stricmp(dataName, "IPMP_InitAuthentication")) return GF_IPMPX_INIT_AUTHENTICATION_TAG; | |
| else if (!stricmp(dataName, "IPMP_TrustSecurityMetadata")) return GF_IPMPX_TRUST_SECURITY_METADATA_TAG; | |
| else if (!stricmp(dataName, "IPMP_TrustedTool")) return GF_IPMPX_TRUSTED_TOOL_TAG; | |
| else if (!stricmp(dataName, "IPMP_TrustSpecification")) return GF_IPMPX_TRUST_SPECIFICATION_TAG; | |
| else if (!stricmp(dataName, "IPMP_MutualAuthentication")) return GF_IPMPX_MUTUAL_AUTHENTICATION_TAG; | |
| else if (!stricmp(dataName, "IPMP_AlgorithmDescriptor")) return GF_IPMPX_ALGORITHM_DESCRIPTOR_TAG; | |
| else if (!stricmp(dataName, "IPMP_KeyDescriptor")) return GF_IPMPX_KEY_DESCRIPTOR_TAG; | |
| else if (!stricmp(dataName, "IPMP_GetToolsResponse")) return GF_IPMPX_GET_TOOLS_RESPONSE_TAG; | |
| else if (!stricmp(dataName, "IPMP_ParametricDescription")) return GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG; | |
| else if (!stricmp(dataName, "IPMP_ParametricDescriptionItem")) return GF_IPMPX_PARAM_DESCRIPTOR_ITEM_TAG; | |
| else if (!stricmp(dataName, "IPMP_ToolParamCapabilitiesQuery")) return GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG; | |
| else if (!stricmp(dataName, "IPMP_ToolParamCapabilitiesResponse")) return GF_IPMPX_PARAMETRIC_CAPS_RESPONSE_TAG; | |
| else if (!stricmp(dataName, "IPMP_ConnectTool")) return GF_IPMPX_CONNECT_TOOL_TAG; | |
| else if (!stricmp(dataName, "IPMP_DisconnectTool")) return GF_IPMPX_DISCONNECT_TOOL_TAG; | |
| else if (!stricmp(dataName, "IPMP_GetToolContext")) return GF_IPMPX_GET_TOOL_CONTEXT_TAG; | |
| else if (!stricmp(dataName, "IPMP_GetToolContextResponse")) return GF_IPMPX_GET_TOOL_CONTEXT_RESPONSE_TAG; | |
| else if (!stricmp(dataName, "IPMP_AddToolNotificationListener")) return GF_IPMPX_ADD_TOOL_LISTENER_TAG; | |
| else if (!stricmp(dataName, "IPMP_RemoveToolNotificationListener")) return GF_IPMPX_REMOVE_TOOL_LISTENER_TAG; | |
| else if (!stricmp(dataName, "IPMP_NotifyToolEvent")) return GF_IPMPX_NOTIFY_TOOL_EVENT_TAG; | |
| else if (!stricmp(dataName, "IPMP_CanProcess")) return GF_IPMPX_CAN_PROCESS_TAG; | |
| else if (!stricmp(dataName, "IPMP_ToolAPI_Config")) return GF_IPMPX_TOOL_API_CONFIG_TAG; | |
| else if (!stricmp(dataName, "IPMP_AudioWatermarkingInit")) return GF_IPMPX_AUDIO_WM_INIT_TAG; | |
| else if (!stricmp(dataName, "IPMP_VideoWatermarkingInit")) return GF_IPMPX_VIDEO_WM_INIT_TAG; | |
| else if (!stricmp(dataName, "IPMP_SendAudioWatermark")) return GF_IPMPX_AUDIO_WM_SEND_TAG; | |
| else if (!stricmp(dataName, "IPMP_SendVideoWatermark")) return GF_IPMPX_VIDEO_WM_SEND_TAG; | |
| else if (!stricmp(dataName, "IPMP_SelectiveDecryptionInit")) return GF_IPMPX_SEL_DEC_INIT_TAG; | |
| else if (!stricmp(dataName, "IPMP_SelectiveBuffer")) return GF_IPMPX_SEL_ENC_BUFFER_TAG; | |
| else if (!stricmp(dataName, "IPMP_SelectiveField")) return GF_IPMPX_SEL_ENC_FIELD_TAG; | |
| else if (!stricmp(dataName, "ISMACryp_Data")) return GF_IPMPX_ISMACRYP_TAG; | |
| return 0; | |
| } | |
| u32 gf_ipmpx_get_field_type(GF_IPMPX_Data *p, char *fieldName) | |
| { | |
| switch (p->tag) { | |
| case GF_IPMPX_KEY_DATA_TAG: | |
| if (!stricmp(fieldName, "keyBody")|| !stricmp(fieldName, "opaqueData")) return GF_ODF_FT_IPMPX_BA; | |
| break; | |
| case GF_IPMPX_RIGHTS_DATA_TAG: | |
| if (!stricmp(fieldName, "rightsInfo")) return GF_ODF_FT_IPMPX_BA; | |
| break; | |
| case GF_IPMPX_OPAQUE_DATA_TAG: | |
| if (!stricmp(fieldName, "OpaqueData")) return GF_ODF_FT_IPMPX_BA; | |
| break; | |
| case GF_IPMPX_SECURE_CONTAINER_TAG: | |
| if (!stricmp(fieldName, "encryptedData") || !stricmp(fieldName, "MAC")) return GF_ODF_FT_IPMPX_BA; | |
| else if (!stricmp(fieldName, "protectedMsg")) return GF_ODF_FT_IPMPX; | |
| break; | |
| case GF_IPMPX_TRUST_SECURITY_METADATA_TAG: | |
| if (!stricmp(fieldName, "trustedTools")) return GF_ODF_FT_IPMPX_LIST; | |
| break; | |
| case GF_IPMPX_TRUSTED_TOOL_TAG: | |
| if (!stricmp(fieldName, "trustSpecifications")) return GF_ODF_FT_IPMPX_LIST; | |
| break; | |
| case GF_IPMPX_TRUST_SPECIFICATION_TAG: | |
| if (!stricmp(fieldName, "CCTrustMetadata")) return GF_ODF_FT_IPMPX_BA; | |
| break; | |
| case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG: | |
| if (!stricmp(fieldName, "candidateAlgorithms") || !stricmp(fieldName, "agreedAlgorithms")) return GF_ODF_FT_IPMPX_LIST; | |
| else if (!stricmp(fieldName, "certificates")) return GF_ODF_FT_IPMPX_BA_LIST; | |
| else if (!stricmp(fieldName, "publicKey") || !stricmp(fieldName, "trustData")) return GF_ODF_FT_IPMPX; | |
| else if (!stricmp(fieldName, "authCodes") || !stricmp(fieldName, "opaque") || !stricmp(fieldName, "AuthenticationData")) | |
| return GF_ODF_FT_IPMPX_BA; | |
| break; | |
| case GF_IPMPX_ALGORITHM_DESCRIPTOR_TAG: | |
| if (!stricmp(fieldName, "specAlgoID") || !stricmp(fieldName, "OpaqueData")) return GF_ODF_FT_IPMPX_BA; | |
| break; | |
| case GF_IPMPX_GET_TOOLS_RESPONSE_TAG: | |
| if (!stricmp(fieldName, "ipmp_tools")) return GF_ODF_FT_OD_LIST; | |
| break; | |
| case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG: | |
| if (!stricmp(fieldName, "descriptionComment")) return GF_ODF_FT_IPMPX_BA; | |
| else if (!stricmp(fieldName, "descriptions")) return GF_ODF_FT_IPMPX_LIST; | |
| break; | |
| case GF_IPMPX_PARAM_DESCRIPTOR_ITEM_TAG: | |
| /*all is IPMPX data*/ | |
| return GF_ODF_FT_IPMPX_BA; | |
| case GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG: | |
| if (!stricmp(fieldName, "description")) return GF_ODF_FT_IPMPX; | |
| break; | |
| case GF_IPMPX_CONNECT_TOOL_TAG: | |
| if (!stricmp(fieldName, "toolDescriptor")) return GF_ODF_FT_OD; | |
| break; | |
| case GF_IPMPX_TOOL_API_CONFIG_TAG: | |
| if (!stricmp(fieldName, "opaqueData")) return GF_ODF_FT_IPMPX_BA; | |
| break; | |
| case GF_IPMPX_AUDIO_WM_SEND_TAG: | |
| case GF_IPMPX_VIDEO_WM_SEND_TAG: | |
| if (!stricmp(fieldName, "payload") || !stricmp(fieldName, "opaqueData")) return GF_ODF_FT_IPMPX_BA; | |
| break; | |
| case GF_IPMPX_SEL_DEC_INIT_TAG: | |
| if (!stricmp(fieldName, "SelectiveBuffers") || !stricmp(fieldName, "SelectiveFields")) return GF_ODF_FT_IPMPX_LIST; | |
| break; | |
| case GF_IPMPX_SEL_ENC_BUFFER_TAG: | |
| if (!stricmp(fieldName, "StreamCipher")) return GF_ODF_FT_IPMPX_BA; | |
| break; | |
| case GF_IPMPX_SEL_ENC_FIELD_TAG: | |
| if (!stricmp(fieldName, "shuffleSpecificInfo")) return GF_ODF_FT_IPMPX_BA; | |
| break; | |
| default: | |
| break; | |
| } | |
| return 0; | |
| } | |
| #include <gpac/internal/odf_parse_common.h> | |
| void GF_IPMPX_ParseBinData(char *val, u8 **out_data, u32 *out_data_size) | |
| { | |
| u32 i, c, len; | |
| char s[3]; | |
| if (val[0] != '%') { | |
| len = *out_data_size = (u32) strlen(val); | |
| *out_data = (char*)gf_malloc(sizeof(char) * len); | |
| memcpy(*out_data, val, sizeof(char) * len); | |
| return; | |
| } | |
| len = (u32) strlen(val) / 3; | |
| if (*out_data) gf_free(*out_data); | |
| *out_data_size = len; | |
| *out_data = (char*)gf_malloc(sizeof(char) * len); | |
| s[2] = 0; | |
| for (i=0; i<len; i++) { | |
| s[0] = val[3*i+1]; | |
| s[1] = val[3*i+2]; | |
| sscanf(s, "%02X", &c); | |
| (*out_data)[i] = (unsigned char) c; | |
| } | |
| } | |
| void GF_IPMPX_ParseBin128(char *val, bin128 *data) | |
| { | |
| if (!strnicmp(val, "0x", 2)) val+=2; | |
| if (strlen(val)<16) { | |
| GF_BitStream *bs; | |
| u32 int_val = atoi(val); | |
| bs = gf_bs_new((char*) (*data), 16, GF_BITSTREAM_WRITE); | |
| gf_bs_write_int(bs, 0, 32); | |
| gf_bs_write_int(bs, 0, 32); | |
| gf_bs_write_int(bs, 0, 32); | |
| gf_bs_write_int(bs, int_val, 32); | |
| gf_bs_del(bs); | |
| } else { | |
| u32 i, b; | |
| char szB[3]; | |
| szB[2] = 0; | |
| for (i=0; i<16; i++) { | |
| szB[0] = val[2*i]; | |
| szB[1] = val[2*i+1]; | |
| sscanf(szB, "%x", &b); | |
| ((char *)data)[i] = (u8) b; | |
| } | |
| } | |
| } | |
| void GF_IPMPX_ParseDate(char *val, GF_IPMPX_Date *date) | |
| { | |
| if ((strlen(val)<7) || strnicmp(val, "0x", 2)) { | |
| GF_BitStream *bs; | |
| u32 int_val = atoi(val); | |
| bs = gf_bs_new((*date), 5, GF_BITSTREAM_WRITE); | |
| gf_bs_write_int(bs, 0, 8); | |
| gf_bs_write_int(bs, int_val, 32); | |
| gf_bs_del(bs); | |
| } else { | |
| val += 2; | |
| memcpy((char *) (*date), val, sizeof(char)*5); | |
| } | |
| } | |
| GF_Err GF_IPMPX_ParseEventType(char *val, GF_IPMPX_ListenType *eventType, u8 *eventTypeCount) | |
| { | |
| char szVal[50]; | |
| u32 i, j, len, v; | |
| *eventTypeCount = 0; | |
| len = (u32) strlen(val); | |
| j=0; | |
| for (i=0; i<len; i++) { | |
| switch (val[i]) { | |
| case '\'': | |
| case '\"': | |
| case ',': | |
| case ' ': | |
| break; | |
| default: | |
| szVal[j] = val[i]; | |
| j++; | |
| if (i+1==len) break; | |
| continue; | |
| } | |
| if (j) { | |
| szVal[j] = 0; | |
| if (!strnicmp(szVal, "0x", 2)) { | |
| sscanf(szVal, "%x", &v); | |
| eventType[*eventTypeCount] = v; | |
| } | |
| else { | |
| sscanf(szVal, "%u", &v); | |
| eventType[*eventTypeCount] = v; | |
| } | |
| j=0; | |
| (*eventTypeCount) += 1; | |
| if (*eventTypeCount == 9) return GF_OK; | |
| } | |
| } | |
| return GF_OK; | |
| } | |
| GF_Err gf_ipmpx_data_parse_16(char *val, u16 **outData, u16 *outDataSize) | |
| { | |
| char szVal[50]; | |
| u32 i, j, len, v, alloc, count; | |
| u16 *data = (u16*)gf_malloc(sizeof(u16) * 100); | |
| alloc = 100; | |
| len = (u32) strlen(val); | |
| count = j = 0; | |
| for (i=0; i<len; i++) { | |
| switch (val[i]) { | |
| case '\'': | |
| case '\"': | |
| case ',': | |
| case ' ': | |
| break; | |
| default: | |
| szVal[j] = val[i]; | |
| j++; | |
| if (i+1==len) break; | |
| continue; | |
| } | |
| if (j) { | |
| szVal[j] = 0; | |
| if (!strnicmp(szVal, "0x", 2)) { | |
| sscanf(szVal, "%x", &v); | |
| data[count] = v; | |
| } | |
| else { | |
| sscanf(szVal, "%u", &v); | |
| data[count] = v; | |
| } | |
| j=0; | |
| count += 1; | |
| if (count == alloc) { | |
| alloc += 100; | |
| data = (u16*)gf_realloc(data, sizeof(u16)*alloc); | |
| } | |
| } | |
| } | |
| (*outData) = (u16*)gf_realloc(data, sizeof(u16)*count); | |
| *outDataSize = count; | |
| return GF_OK; | |
| } | |
| GF_Err gf_ipmpx_set_field(GF_IPMPX_Data *_p, char *fieldName, char *val) | |
| { | |
| u32 ret = 0; | |
| if (!stricmp(val, "auto")) return GF_OK; | |
| else if (!stricmp(val, "unspecified")) return GF_OK; | |
| switch (_p->tag) { | |
| case GF_IPMPX_KEY_DATA_TAG: | |
| { | |
| GF_IPMPX_KeyData *p = (GF_IPMPX_KeyData*)_p; | |
| if (!stricmp(fieldName, "hasStartDTS")) { | |
| if (!stricmp(val, "false") || !stricmp(val, "0") ) p->flags &= ~1; | |
| else p->flags |= 1; | |
| ret = 1; | |
| } | |
| else if (!stricmp(fieldName, "hasStartPacketID")) { | |
| if (!stricmp(val, "false") || !stricmp(val, "0") ) p->flags &= ~2; | |
| else p->flags |= 2; | |
| ret = 1; | |
| } | |
| else if (!stricmp(fieldName, "hasExpireDTS")) { | |
| if (!stricmp(val, "false") || !stricmp(val, "0") ) p->flags &= ~4; | |
| else p->flags |= 4; | |
| ret = 1; | |
| } | |
| else if (!stricmp(fieldName, "hasExpirePacketID")) { | |
| if (!stricmp(val, "false") || !stricmp(val, "0") ) p->flags &= ~8; | |
| else p->flags |= 8; | |
| ret = 1; | |
| } | |
| else if (!stricmp(fieldName, "startPacketID")) { | |
| GET_U32(p->startPacketID) | |
| } | |
| else if (!stricmp(fieldName, "expirePacketID")) { | |
| GET_U32(p->expirePacketID) | |
| } | |
| else if (!stricmp(fieldName, "startDTS")) { | |
| GET_U64(p->startDTS) | |
| } | |
| else if (!stricmp(fieldName, "expireDTS")) { | |
| GET_U64(p->expireDTS) | |
| } | |
| } | |
| break; | |
| case GF_IPMPX_SECURE_CONTAINER_TAG: | |
| { | |
| GF_IPMPX_SecureContainer*p = (GF_IPMPX_SecureContainer*)_p; | |
| if (!stricmp(fieldName, "isMACEncrypted")) GET_BOOL(p->isMACEncrypted) | |
| } | |
| break; | |
| case GF_IPMPX_INIT_AUTHENTICATION_TAG: | |
| { | |
| GF_IPMPX_InitAuthentication *p = (GF_IPMPX_InitAuthentication*)_p; | |
| if (!stricmp(fieldName, "Context")) GET_U32(p->Context) | |
| else if (!stricmp(fieldName, "AuthType")) GET_U8(p->AuthType) | |
| } | |
| break; | |
| case GF_IPMPX_TRUSTED_TOOL_TAG: | |
| { | |
| GF_IPMPX_TrustedTool *p = (GF_IPMPX_TrustedTool*)_p; | |
| if (!stricmp(fieldName, "toolID")) { | |
| GF_IPMPX_ParseBin128(val, &p->toolID); | |
| ret = 1; | |
| } | |
| else if (!stricmp(fieldName, "AuditDate")) { | |
| GF_IPMPX_ParseDate(val, &p->AuditDate); | |
| ret = 1; | |
| } | |
| } | |
| break; | |
| case GF_IPMPX_TRUST_SPECIFICATION_TAG: | |
| { | |
| GF_IPMPX_TrustSpecification *p = (GF_IPMPX_TrustSpecification*)_p; | |
| if (!stricmp(fieldName, "startDate")) { | |
| GF_IPMPX_ParseDate(val, &p->startDate); | |
| ret = 1; | |
| } | |
| else if (!stricmp(fieldName, "attackerProfile")) GET_U8(p->attackerProfile) | |
| else if (!stricmp(fieldName, "trustedDuration")) GET_U32(p->trustedDuration) | |
| } | |
| break; | |
| case GF_IPMPX_ALGORITHM_DESCRIPTOR_TAG: | |
| { | |
| GF_IPMPX_AUTH_AlgorithmDescriptor *p = (GF_IPMPX_AUTH_AlgorithmDescriptor *)_p; | |
| if (!stricmp(fieldName, "regAlgoID")) GET_U16(p->regAlgoID) | |
| } | |
| break; | |
| case GF_IPMPX_KEY_DESCRIPTOR_TAG: | |
| { | |
| GF_IPMPX_AUTH_KeyDescriptor *p = (GF_IPMPX_AUTH_KeyDescriptor *)_p; | |
| if (!stricmp(fieldName, "keyBody")) { | |
| u32 s; | |
| GF_IPMPX_ParseBinData(val, &p->keyBody, &s); | |
| p->keyBodyLength = s; | |
| ret = 1; | |
| } | |
| } | |
| break; | |
| case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG: | |
| { | |
| GF_IPMPX_ParametricDescription*p = (GF_IPMPX_ParametricDescription*)_p; | |
| if (!stricmp(fieldName, "majorVersion")) GET_U8(p->majorVersion) | |
| else if (!stricmp(fieldName, "minorVersion")) GET_U8(p->minorVersion) | |
| } | |
| break; | |
| case GF_IPMPX_PARAMETRIC_CAPS_RESPONSE_TAG: | |
| { | |
| GF_IPMPX_ToolParamCapabilitiesResponse*p = (GF_IPMPX_ToolParamCapabilitiesResponse*)_p; | |
| if (!stricmp(fieldName, "capabilitiesSupported")) GET_BOOL(p->capabilitiesSupported) | |
| } | |
| break; | |
| case GF_IPMPX_DISCONNECT_TOOL_TAG: | |
| { | |
| GF_IPMPX_DisconnectTool*p = (GF_IPMPX_DisconnectTool*)_p; | |
| if (!stricmp(fieldName, "IPMP_ToolContextID")) GET_U16(p->IPMP_ToolContextID) | |
| } | |
| break; | |
| case GF_IPMPX_GET_TOOL_CONTEXT_TAG: | |
| { | |
| GF_IPMPX_GetToolContext*p = (GF_IPMPX_GetToolContext*)_p; | |
| if (!stricmp(fieldName, "scope")) GET_U8(p->scope) | |
| else if (!stricmp(fieldName, "IPMP_DescriptorIDEx")) GET_U16(p->IPMP_DescriptorIDEx) | |
| } | |
| break; | |
| case GF_IPMPX_GET_TOOL_CONTEXT_RESPONSE_TAG: | |
| { | |
| GF_IPMPX_GetToolContextResponse*p = (GF_IPMPX_GetToolContextResponse*)_p; | |
| if (!stricmp(fieldName, "OD_ID")) GET_U16(p->OD_ID) | |
| else if (!stricmp(fieldName, "ESD_ID")) GET_U16(p->ESD_ID) | |
| else if (!stricmp(fieldName, "IPMP_ToolContextID")) GET_U16(p->IPMP_ToolContextID) | |
| } | |
| break; | |
| case GF_IPMPX_ADD_TOOL_LISTENER_TAG: | |
| { | |
| GF_IPMPX_AddToolNotificationListener*p = (GF_IPMPX_AddToolNotificationListener*)_p; | |
| if (!stricmp(fieldName, "eventType")) return GF_IPMPX_ParseEventType(val, p->eventType, &p->eventTypeCount); | |
| else if (!stricmp(fieldName, "scope")) GET_U8(p->scope) | |
| } | |
| break; | |
| case GF_IPMPX_REMOVE_TOOL_LISTENER_TAG: | |
| { | |
| GF_IPMPX_RemoveToolNotificationListener*p = (GF_IPMPX_RemoveToolNotificationListener*)_p; | |
| if (!stricmp(fieldName, "eventType")) return GF_IPMPX_ParseEventType(val, p->eventType, &p->eventTypeCount); | |
| } | |
| break; | |
| case GF_IPMPX_NOTIFY_TOOL_EVENT_TAG: | |
| { | |
| GF_IPMPX_NotifyToolEvent*p = (GF_IPMPX_NotifyToolEvent*)_p; | |
| if (!stricmp(fieldName, "OD_ID")) GET_U16(p->OD_ID) | |
| else if (!stricmp(fieldName, "ESD_ID")) GET_U16(p->ESD_ID) | |
| else if (!stricmp(fieldName, "IPMP_ToolContextID")) GET_U16(p->IPMP_ToolContextID) | |
| else if (!stricmp(fieldName, "eventType")) GET_U8(p->eventType) | |
| } | |
| break; | |
| case GF_IPMPX_CAN_PROCESS_TAG: | |
| { | |
| GF_IPMPX_CanProcess*p = (GF_IPMPX_CanProcess*)_p; | |
| if (!stricmp(fieldName, "canProcess")) GET_BOOL(p->canProcess) | |
| } | |
| break; | |
| case GF_IPMPX_TOOL_API_CONFIG_TAG: | |
| { | |
| GF_IPMPX_ToolAPI_Config*p = (GF_IPMPX_ToolAPI_Config*)_p; | |
| if (!stricmp(fieldName, "Instantiation_API_ID")) GET_U32(p->Instantiation_API_ID) | |
| else if (!stricmp(fieldName, "Messaging_API_ID")) GET_U32(p->Messaging_API_ID) | |
| } | |
| break; | |
| case GF_IPMPX_AUDIO_WM_INIT_TAG: | |
| case GF_IPMPX_VIDEO_WM_INIT_TAG: | |
| { | |
| GF_IPMPX_WatermarkingInit *p = (GF_IPMPX_WatermarkingInit*)_p; | |
| if (!stricmp(fieldName, "inputFormat")) GET_U8(p->inputFormat) | |
| else if (!stricmp(fieldName, "requiredOp")) GET_U8(p->requiredOp) | |
| else if (!stricmp(fieldName, "nChannels")) GET_U8(p->nChannels) | |
| else if (!stricmp(fieldName, "bitPerSample")) GET_U8(p->bitPerSample) | |
| else if (!stricmp(fieldName, "frequency")) GET_U32(p->frequency) | |
| else if (!stricmp(fieldName, "frame_horizontal_size")) GET_U16(p->frame_horizontal_size) | |
| else if (!stricmp(fieldName, "frame_vertical_size")) GET_U16(p->frame_vertical_size) | |
| else if (!stricmp(fieldName, "chroma_format")) GET_U8(p->chroma_format) | |
| else if (!stricmp(fieldName, "wmPayload")) { | |
| ret=1; | |
| GF_IPMPX_ParseBinData(val, &p->wmPayload, &p->wmPayloadLen); | |
| } | |
| else if (!stricmp(fieldName, "opaqueData")) { | |
| ret=1; | |
| GF_IPMPX_ParseBinData(val, &p->opaqueData, &p->opaqueDataSize); | |
| } | |
| else if (!stricmp(fieldName, "wmRecipientId")) GET_U16(p->wmRecipientId) | |
| } | |
| break; | |
| case GF_IPMPX_AUDIO_WM_SEND_TAG: | |
| case GF_IPMPX_VIDEO_WM_SEND_TAG: | |
| { | |
| GF_IPMPX_SendWatermark *p = (GF_IPMPX_SendWatermark*)_p; | |
| if (!stricmp(fieldName, "wm_status")) GET_U8(p->wm_status) | |
| else if (!stricmp(fieldName, "compression_status")) GET_U8(p->compression_status) | |
| } | |
| break; | |
| case GF_IPMPX_SEL_DEC_INIT_TAG: | |
| { | |
| GF_IPMPX_SelectiveDecryptionInit*p = (GF_IPMPX_SelectiveDecryptionInit*)_p; | |
| if (!stricmp(fieldName, "mediaTypeExtension")) GET_U8(p->mediaTypeExtension) | |
| else if (!stricmp(fieldName, "mediaTypeExtension")) GET_U8(p->mediaTypeExtension) | |
| else if (!stricmp(fieldName, "mediaTypeIndication")) GET_U8(p->mediaTypeIndication) | |
| else if (!stricmp(fieldName, "profileLevelIndication")) GET_U8(p->profileLevelIndication) | |
| else if (!stricmp(fieldName, "compliance")) GET_U8(p->compliance) | |
| else if (!stricmp(fieldName, "RLE_Data")) { | |
| ret=1; | |
| gf_ipmpx_data_parse_16(val, &p->RLE_Data, &p->RLE_DataLength); | |
| } | |
| } | |
| break; | |
| case GF_IPMPX_SEL_ENC_BUFFER_TAG: | |
| { | |
| GF_IPMPX_SelEncBuffer*p = (GF_IPMPX_SelEncBuffer*)_p; | |
| if (!stricmp(fieldName, "cipher_Id")) { | |
| GF_IPMPX_ParseBin128(val, &p->cipher_Id); | |
| ret = 1; | |
| } | |
| else if (!stricmp(fieldName, "syncBoundary")) GET_U8(p->syncBoundary) | |
| else if (!stricmp(fieldName, "mode")) GET_U8(p->mode) | |
| else if (!stricmp(fieldName, "blockSize")) GET_U16(p->blockSize) | |
| else if (!stricmp(fieldName, "keySize")) GET_U16(p->keySize) | |
| } | |
| break; | |
| case GF_IPMPX_SEL_ENC_FIELD_TAG: | |
| { | |
| GF_IPMPX_SelEncField*p = (GF_IPMPX_SelEncField*)_p; | |
| if (!stricmp(fieldName, "field_Id")) GET_U8(p->field_Id) | |
| else if (!stricmp(fieldName, "field_Scope")) GET_U8(p->field_Scope) | |
| else if (!stricmp(fieldName, "buf")) GET_U8(p->buf) | |
| else if (!stricmp(fieldName, "mappingTable")) { | |
| ret=1; | |
| gf_ipmpx_data_parse_16(val, &p->mappingTable, &p->mappingTableSize); | |
| } | |
| } | |
| break; | |
| case GF_IPMPX_ISMACRYP_TAG: | |
| { | |
| GF_IPMPX_ISMACryp*p = (GF_IPMPX_ISMACryp*)_p; | |
| if (!stricmp(fieldName, "crypto_suite")) GET_U8(p->cryptoSuite) | |
| else if (!stricmp(fieldName, "IV_length")) GET_U8(p->IV_length) | |
| else if (!stricmp(fieldName, "selective_encryption")) GET_BOOL(p->use_selective_encryption) | |
| else if (!stricmp(fieldName, "key_indicator_length")) GET_U8(p->key_indicator_length) | |
| } | |
| break; | |
| } | |
| return ret ? GF_OK : GF_BAD_PARAM; | |
| } | |
| GF_Err gf_ipmpx_set_sub_data(GF_IPMPX_Data *_p, char *fieldName, GF_IPMPX_Data *sp) | |
| { | |
| switch (_p->tag) { | |
| case GF_IPMPX_SECURE_CONTAINER_TAG: | |
| { | |
| GF_IPMPX_SecureContainer*p = (GF_IPMPX_SecureContainer*)_p; | |
| if (p->protectedMsg) gf_ipmpx_data_del(p->protectedMsg); | |
| p->protectedMsg = sp; | |
| return GF_OK; | |
| } | |
| break; | |
| case GF_IPMPX_TRUST_SECURITY_METADATA_TAG: | |
| { | |
| GF_IPMPX_TrustSecurityMetadata *p = (GF_IPMPX_TrustSecurityMetadata*)_p; | |
| if (!sp || (sp->tag!=GF_IPMPX_TRUSTED_TOOL_TAG) ) return GF_BAD_PARAM; | |
| gf_list_add(p->TrustedTools, sp); | |
| return GF_OK; | |
| } | |
| break; | |
| case GF_IPMPX_TRUSTED_TOOL_TAG: | |
| { | |
| GF_IPMPX_TrustedTool *p = (GF_IPMPX_TrustedTool *)_p; | |
| if (!sp || (sp->tag!=GF_IPMPX_TRUST_SPECIFICATION_TAG) ) return GF_BAD_PARAM; | |
| gf_list_add(p->trustSpecifications, sp); | |
| return GF_OK; | |
| } | |
| break; | |
| case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG: | |
| { | |
| GF_IPMPX_MutualAuthentication *p = (GF_IPMPX_MutualAuthentication *)_p; | |
| if (!sp) return GF_BAD_PARAM; | |
| switch (sp->tag) { | |
| case GF_IPMPX_ALGORITHM_DESCRIPTOR_TAG: | |
| sp->tag = GF_IPMPX_AUTH_AlgorithmDescr_Tag; | |
| if (!stricmp(fieldName, "candidateAlgorithms")) return gf_list_add(p->agreedAlgorithms, sp); | |
| else if (!stricmp(fieldName, "agreedAlgorithms")) return gf_list_add(p->agreedAlgorithms, sp); | |
| else return GF_BAD_PARAM; | |
| case GF_IPMPX_KEY_DESCRIPTOR_TAG: | |
| sp->tag = GF_IPMPX_AUTH_KeyDescr_Tag; | |
| if (!stricmp(fieldName, "candidateAlgorithms")) return gf_list_add(p->agreedAlgorithms, sp); | |
| else if (!stricmp(fieldName, "agreedAlgorithms")) return gf_list_add(p->agreedAlgorithms, sp); | |
| else if (!stricmp(fieldName, "publicKey")) { | |
| if (p->publicKey) GF_IPMPX_AUTH_Delete((GF_IPMPX_Authentication *) p->publicKey); | |
| p->publicKey = (GF_IPMPX_AUTH_KeyDescriptor *) sp; | |
| return GF_OK; | |
| } | |
| else return GF_BAD_PARAM; | |
| case GF_IPMPX_TRUST_SECURITY_METADATA_TAG: | |
| if (p->trustData) gf_ipmpx_data_del((GF_IPMPX_Data *)p->trustData); | |
| p->trustData = (GF_IPMPX_TrustSecurityMetadata*)sp; | |
| return GF_OK; | |
| default: | |
| return GF_BAD_PARAM; | |
| } | |
| } | |
| break; | |
| case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG: | |
| { | |
| GF_IPMPX_ParametricDescription*p = (GF_IPMPX_ParametricDescription*)_p; | |
| if (!sp || (sp->tag!=GF_IPMPX_PARAM_DESCRIPTOR_ITEM_TAG) ) return GF_BAD_PARAM; | |
| if (!stricmp(fieldName, "descriptions")) return gf_list_add(p->descriptions, sp); | |
| else return GF_BAD_PARAM; | |
| } | |
| break; | |
| case GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG: | |
| { | |
| GF_IPMPX_ToolParamCapabilitiesQuery*p = (GF_IPMPX_ToolParamCapabilitiesQuery*)_p; | |
| if (!sp || (sp->tag!=GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG) ) return GF_BAD_PARAM; | |
| if (stricmp(fieldName, "description")) return GF_BAD_PARAM; | |
| if (p->description) gf_ipmpx_data_del((GF_IPMPX_Data *)p->description); | |
| p->description = (GF_IPMPX_ParametricDescription*)sp; | |
| return GF_OK; | |
| } | |
| break; | |
| case GF_IPMPX_SEL_DEC_INIT_TAG: | |
| { | |
| GF_IPMPX_SelectiveDecryptionInit*p = (GF_IPMPX_SelectiveDecryptionInit*)_p; | |
| if (!sp) return GF_BAD_PARAM; | |
| if (sp->tag==GF_IPMPX_SEL_ENC_BUFFER_TAG) return gf_list_add(p->SelEncBuffer, sp); | |
| else if (sp->tag==GF_IPMPX_SEL_ENC_FIELD_TAG) return gf_list_add(p->SelEncFields, sp); | |
| else return GF_BAD_PARAM; | |
| } | |
| break; | |
| } | |
| return GF_BAD_PARAM; | |
| } | |
| GF_Err gf_ipmpx_set_byte_array(GF_IPMPX_Data *p, char *field, char *str) | |
| { | |
| GF_IPMPX_ByteArray *d; | |
| GF_IPMPX_ByteArray **dest; | |
| d = (GF_IPMPX_ByteArray*)gf_malloc(sizeof(GF_IPMPX_ByteArray)); | |
| d->length = (u32) strlen(str); | |
| d->data = (char*)gf_malloc(sizeof(char)*d->length); | |
| memcpy(d->data, str, d->length); | |
| dest = NULL; | |
| switch (p->tag) { | |
| case GF_IPMPX_KEY_DATA_TAG: | |
| if (!stricmp(field, "keyBody")) dest = & ((GF_IPMPX_KeyData*)p)->keyBody; | |
| else if (!stricmp(field, "opaqueData")) dest = & ((GF_IPMPX_KeyData*)p)->OpaqueData; | |
| break; | |
| case GF_IPMPX_RIGHTS_DATA_TAG: | |
| if (!stricmp(field, "rightsInfo")) dest = & ((GF_IPMPX_RightsData*)p)->rightsInfo; | |
| break; | |
| case GF_IPMPX_OPAQUE_DATA_TAG: | |
| if (!stricmp(field, "opaqueData")) dest = & ((GF_IPMPX_OpaqueData*)p)->opaqueData; | |
| break; | |
| case GF_IPMPX_SECURE_CONTAINER_TAG: | |
| if (!stricmp(field, "encryptedData")) dest = & ((GF_IPMPX_SecureContainer*)p)->encryptedData; | |
| else if (!stricmp(field, "MAC")) dest = & ((GF_IPMPX_SecureContainer*)p)->MAC; | |
| break; | |
| case GF_IPMPX_TRUST_SPECIFICATION_TAG: | |
| if (!stricmp(field, "CCTrustMetadata")) dest = & ((GF_IPMPX_TrustSpecification*)p)->CCTrustMetadata; | |
| break; | |
| case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG: | |
| if (!stricmp(field, "AuthenticationData")) dest = & ((GF_IPMPX_MutualAuthentication*)p)->AuthenticationData; | |
| else if (!stricmp(field, "opaque")) dest = & ((GF_IPMPX_MutualAuthentication*)p)->opaque; | |
| else if (!stricmp(field, "authCodes")) dest = & ((GF_IPMPX_MutualAuthentication*)p)->authCodes; | |
| else if (!stricmp(field, "certificates")) { | |
| gf_list_add(((GF_IPMPX_MutualAuthentication*)p)->certificates, d); | |
| return GF_OK; | |
| } | |
| break; | |
| case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG: | |
| if (!stricmp(field, "descriptionComment")) dest = & ((GF_IPMPX_ParametricDescription*)p)->descriptionComment; | |
| break; | |
| case GF_IPMPX_PARAM_DESCRIPTOR_ITEM_TAG: | |
| if (!stricmp(field, "class")) dest = & ((GF_IPMPX_ParametricDescriptionItem*)p)->main_class; | |
| else if (!stricmp(field, "subClass")) dest = & ((GF_IPMPX_ParametricDescriptionItem*)p)->subClass; | |
| else if (!stricmp(field, "typeData")) dest = & ((GF_IPMPX_ParametricDescriptionItem*)p)->typeData; | |
| else if (!stricmp(field, "type")) dest = & ((GF_IPMPX_ParametricDescriptionItem*)p)->type; | |
| else if (!stricmp(field, "addedData")) dest = & ((GF_IPMPX_ParametricDescriptionItem*)p)->addedData; | |
| break; | |
| case GF_IPMPX_TOOL_API_CONFIG_TAG: | |
| if (!stricmp(field, "opaqueData")) dest = & ((GF_IPMPX_ToolAPI_Config*)p)->opaqueData; | |
| break; | |
| case GF_IPMPX_AUDIO_WM_SEND_TAG: | |
| case GF_IPMPX_VIDEO_WM_SEND_TAG: | |
| if (!stricmp(field, "payload")) dest = & ((GF_IPMPX_SendWatermark *)p)->payload; | |
| else if (!stricmp(field, "opaqueData")) dest = & ((GF_IPMPX_SendWatermark*)p)->opaqueData; | |
| break; | |
| case GF_IPMPX_SEL_ENC_BUFFER_TAG: | |
| if (!stricmp(field, "StreamCipher")) dest = & ((GF_IPMPX_SelEncBuffer*)p)->Stream_Cipher_Specific_Init_Info; | |
| break; | |
| case GF_IPMPX_SEL_ENC_FIELD_TAG: | |
| if (!stricmp(field, "shuffleSpecificInfo")) dest = & ((GF_IPMPX_SelEncField*)p)->shuffleSpecificInfo; | |
| break; | |
| } | |
| if (!dest) { | |
| gf_free(d->data); | |
| gf_free(d); | |
| return GF_BAD_PARAM; | |
| } | |
| if ( (*dest) ) { | |
| if ((*dest)->data) gf_free((*dest)->data); | |
| gf_free((*dest)); | |
| } | |
| (*dest) = d; | |
| return GF_OK; | |
| } | |
| #endif /*GPAC_MINIMAL_ODF*/ | |