static GF_Err CENC_Access(ISMAEAPriv *priv, GF_IPMPEvent *evt) { if (evt->event_type==GF_IPMP_TOOL_GRANT_ACCESS) { if (priv->state != ISMAEA_STATE_SETUP) return GF_SERVICE_ERROR; assert(!priv->crypt); //if (!priv->nb_allow_play) return GF_AUTHENTICATION_FAILURE; //priv->nb_allow_play--; /*open decrypter - we do NOT initialize decrypter; it wil be done when we decrypt the first crypted sample*/ if (priv->is_cenc) priv->crypt = gf_crypt_open("AES-128", "CTR"); else priv->crypt = gf_crypt_open("AES-128", "CBC"); if (!priv->crypt) return GF_IO_ERR; priv->first_crypted_samp = GF_TRUE; priv->state = ISMAEA_STATE_PLAY; return GF_OK; } if (evt->event_type==GF_IPMP_TOOL_RELEASE_ACCESS) { if (priv->state != ISMAEA_STATE_PLAY) return GF_SERVICE_ERROR; if (priv->crypt) gf_crypt_close(priv->crypt); priv->crypt = NULL; priv->state = ISMAEA_STATE_SETUP; return GF_OK; } return GF_BAD_PARAM; }
static GF_Err ISMA_Access(ISMAEAPriv *priv, GF_IPMPEvent *evt) { GF_Err e; char IV[16]; if (evt->event_type==GF_IPMP_TOOL_GRANT_ACCESS) { if (priv->state != ISMAEA_STATE_SETUP) return GF_SERVICE_ERROR; assert(!priv->crypt); //if (!priv->nb_allow_play) return GF_AUTHENTICATION_FAILURE; //priv->nb_allow_play--; /*init decrypter*/ priv->crypt = gf_crypt_open("AES-128", "CTR"); if (!priv->crypt) return GF_IO_ERR; memset(IV, 0, sizeof(char)*16); memcpy(IV, priv->salt, sizeof(char)*8); e = gf_crypt_init(priv->crypt, priv->key, 16, IV); if (e) return e; priv->state = ISMAEA_STATE_PLAY; return GF_OK; } if (evt->event_type==GF_IPMP_TOOL_RELEASE_ACCESS) { if (priv->state != ISMAEA_STATE_PLAY) return GF_SERVICE_ERROR; if (priv->crypt) gf_crypt_close(priv->crypt); priv->crypt = NULL; priv->state = ISMAEA_STATE_SETUP; return GF_OK; } return GF_BAD_PARAM; }
u32 gf_crypt_str_module_get_algo_key_size(const char *algorithm) { u32 ret; GF_Crypt *td = gf_crypt_open_intern(algorithm, NULL, 1); ret = td ? td->key_size : 0; gf_crypt_close(td); return ret; }
u32 gf_crypt_str_get_algo_supported_key_sizes(const char *algorithm, int *keys) { u32 ret; GF_Crypt *td = gf_crypt_open_intern(algorithm, NULL, 1); ret = gf_crypt_get_supported_key_sizes(td, (u32 *)keys); gf_crypt_close(td); return ret; }
Bool gf_crypt_str_is_block_mode(const char *mode) { Bool ret; GF_Crypt *td = gf_crypt_open_intern(NULL, mode, 1); ret = td ? td->is_block_mode : 0; gf_crypt_close(td); return ret; }
Bool gf_crypt_str_is_block_algorithm_mode(const char *algorithm) { Bool ret; GF_Crypt *td = gf_crypt_open_intern(algorithm, NULL, 1); ret = td ? td->is_block_algo_mode : 0; gf_crypt_close(td); return ret; }
u32 gf_crypt_str_get_mode_version(const char *mode) { u32 ret; GF_Crypt *td = gf_crypt_open_intern(NULL, mode, 1); ret = td ? td->mode_version : 0; gf_crypt_close(td); return ret; }
u32 gf_crypt_str_get_algorithm_version(const char *algorithm) { u32 ret; GF_Crypt *td = gf_crypt_open_intern(algorithm, NULL, 1); ret = td ? td->algo_version : 0; gf_crypt_close(td); return ret; }
void DeleteISMACrypTool(GF_IPMPTool *plug) { ISMAEAPriv *priv = (ISMAEAPriv *)plug->udta; /*in case something went wrong*/ if (priv->crypt) gf_crypt_close(priv->crypt); gf_free(priv); gf_free(plug); }
static GF_Err CENC_Setup(ISMAEAPriv *priv, GF_IPMPEvent *evt) { GF_CENCConfig *cfg = (GF_CENCConfig*)evt->config_data; u32 i; priv->state = ISMAEA_STATE_ERROR; if ((cfg->scheme_type != GF_4CC('c', 'e', 'n', 'c')) && (cfg->scheme_type != GF_4CC('c','b','c','1'))) return GF_NOT_SUPPORTED; if (cfg->scheme_version != 0x00010000) return GF_NOT_SUPPORTED; for (i = 0; i < cfg->PSSH_count; i++) { GF_NetComDRMConfigPSSH *pssh = &cfg->PSSHs[i]; char szSystemID[33]; u32 j; memset(szSystemID, 0, 33); for (j=0; j<16; j++) { sprintf(szSystemID+j*2, "%02X", (unsigned char) pssh->SystemID[j]); } /*SystemID for GPAC Player: 67706163-6365-6E63-6472-6D746F6F6C31*/ if (strcmp(szSystemID, "6770616363656E6364726D746F6F6C31")) { GF_LOG(GF_LOG_WARNING, GF_LOG_AUTHOR, ("[CENC/ISMA] System ID %s not supported\n", szSystemID)); continue; } else { u8 cypherOffset; bin128 cypherKey, cypherIV; GF_Crypt *mc; /*GPAC DRM TEST system info, used to validate cypher offset in CENC packager keyIDs as usual (before private data) URL len on 8 bits URL keys, cyphered with oyur magic key :) */ cypherOffset = pssh->private_data[0] + 1; gf_bin128_parse("0x6770616363656E6364726D746F6F6C31", cypherKey); gf_bin128_parse("0x00000000000000000000000000000001", cypherIV); mc = gf_crypt_open("AES-128", "CTR"); if (!mc) { GF_LOG(GF_LOG_ERROR, GF_LOG_AUTHOR, ("[CENC/ISMA] Cannot open AES-128 CTR\n")); return GF_IO_ERR; } gf_crypt_init(mc, cypherKey, 16, cypherIV); gf_crypt_decrypt(mc, pssh->private_data+cypherOffset, pssh->private_data_size-cypherOffset); gf_crypt_close(mc); /*now we search a key*/ priv->KID_count = pssh->KID_count; if (priv->KIDs) { gf_free(priv->KIDs); priv->KIDs = NULL; } priv->KIDs = (bin128 *)gf_malloc(pssh->KID_count*sizeof(bin128)); if (priv->keys) { gf_free(priv->keys); priv->keys = NULL; } priv->keys = (bin128 *)gf_malloc(pssh->KID_count*sizeof(bin128)); memmove(priv->KIDs, pssh->KIDs, pssh->KID_count*sizeof(bin128)); memmove(priv->keys, pssh->private_data + cypherOffset, pssh->KID_count*sizeof(bin128)); } } if (cfg->scheme_type == GF_4CC('c', 'e', 'n', 'c')) priv->is_cenc = GF_TRUE; else priv->is_cbc = GF_TRUE; priv->state = ISMAEA_STATE_SETUP; //priv->nb_allow_play = 1; return GF_OK; }