/* ************************************************************************************************************ * * 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; }
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; }