Beispiel #1
0
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;
}
Beispiel #2
0
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;
}