Example #1
0
/*
************************************************************************************************************
*
*                                             function
*
*    name          :
*
*    parmeters     :
*
*    return        :
*
*    note          :
*
*
************************************************************************************************************
*/
int sunxi_deal_hdcp_key(char *keydata, int keylen)
{
	int  ret, real_len;
	char buffer[4096];
	char buffer_convert[4096];

	hdcp_key_convert((unsigned char *)keydata, (unsigned char *)buffer_convert);

	ret = smc_aes_bssk_encrypt_to_dram(buffer_convert, 288, buffer, &real_len);
	if(ret<0)
	{
		printf("smc aes bssk encrypt failed\n");

		return -1;
	}

	ret = sunxi_secure_object_write("hdcpkey", buffer, real_len);
	if(ret<0)
	{
		printf("sunxi secure storage write failed\n");

		return -1;
	}

	return 0;
}
Example #2
0
int __sunxi_burn_key(u8 *buff, uint buff_len)
{
	sunxi_usb_burn_main_info_t *key_main = (sunxi_usb_burn_main_info_t *)buff;
	sunxi_usb_burn_key_info_t  *key_list;
#ifdef CONFIG_SUNXI_SECURE_SYSTEM
	sunxi_efuse_key_info_t      efuse_key_info;
#endif
	int key_count;
	int offset;
	u8  *p_buff = (u8 *)&key_main->key_info;
	//比较key主体的信息
	if(strcmp((const char *)key_main->magic, "key-group-db"))
	{
		printf("key data magic unmatch, err\n");

		return -1;
	}
	key_count = key_main->count;
	printf("key_count=%d\n", key_count);
	if(sunxi_secure_storage_init())
	{
		printf("%s secure storage init failed\n", __func__);

		return -1;
	}
	for(;key_count>0;key_count--, key_list++)
	{
		key_list = (sunxi_usb_burn_key_info_t *)p_buff;
		printf("^^^^^^^^^^^^^^^^^^^\n");
		printf("key index=%d\n", key_main->count - key_count);
		printf("key name=%s\n", key_list->name);
		printf("key type=%d\n", key_list->type);
		printf("key len=%d\n", key_list->len);
		printf("key if_burn=%d\n", key_list->if_burn);
		printf("key if_replace=%d\n", key_list->if_replace);
		printf("key if_crypt=%d\n", key_list->if_crypt);
		printf("key data:\n");
		sunxi_dump(key_list->key_data, key_list->len);
		printf("###################\n");
		offset = (sizeof(sunxi_usb_burn_key_info_t)) + ((key_list->len + 15) & (~15));
		printf("offset=%d\n", offset);
		p_buff += offset;
#ifdef CONFIG_SUNXI_SECURE_SYSTEM
		if(!key_list->type)
		{
			memset(&efuse_key_info, 0, sizeof(efuse_key_info));
			strcpy(efuse_key_info.name, (const char *)key_list->name);
			efuse_key_info.len = key_list->len;
			efuse_key_info.key_data = (u8 *)key_list->key_data;

			if(smc_efuse_writel(&efuse_key_info))
			{
				return -1;
			}
		}
		else
#endif
		{
#ifdef CONFIG_SUNXI_HDCP_IN_SECURESTORAGE
			int ret;

			if(!strcmp("hdcpkey", key_list->name))
			{
				ret = sunxi_deal_hdcp_key((char *)key_list->key_data, key_list->len);
				if(ret)
				{
					printf("sunxi deal with hdcp key failed\n");

					return -1;
				}
			}
			else
#endif
			{
			if(key_list->if_crypt)
				smc_set_sst_crypt_name(key_list->name);

				if(sunxi_secure_object_write(key_list->name, (char *)key_list->key_data, key_list->len))
				{
					return -1;
				}
			}
		}
	}
	if(sunxi_secure_storage_exit())
	{
		printf("sunxi_secure_storage_exit err\n");

		return -1;
	}

	return 0;
}