Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
0
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;
}
Ejemplo n.º 8
0
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;
}
Ejemplo n.º 9
0
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);
}
Ejemplo n.º 10
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;
}