static int do_opt_keysburn_burn(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int rc = 0; const char* keyName = argv[2]; u8* keyVal = (u8*)OPTIMUS_DOWNLOAD_TRANSFER_BUF_ADDR; unsigned keyValLen = 0; if(4 > argc){ _AML_KEY_ERR("argc=%d < 4\n", argc); return __LINE__; } if(argc > 4) { keyVal = (u8*)simple_strtoul(argv[3], NULL, 16); keyValLen = simple_strtoul(argv[4], NULL, 0); } else//The key is file in the specified device { const char* filePath = argv[3]; rc = optimus_read_keyfile_2_mem(filePath, keyVal, &keyValLen); if(rc){ _AML_KEY_ERR("Fail to read file[%s]\n", filePath); return __LINE__; } } rc = optimus_keysburn_onekey(keyName, keyVal, keyValLen); return rc; }
//burn the amlogic keys like USB_Burning_Tool static int sdc_burn_aml_keys(HIMAGE hImg, const int keyOverWrite) { int rc = 0; const char* *keysName = NULL; unsigned keysNum = 0; const char** pCurKeysName = NULL; unsigned index = 0; rc = run_command("aml_key_burn probe vfat sdc", 0); if (rc) { DWN_ERR("Fail in probe for aml_key_burn\n"); return __LINE__; } { unsigned random32 = 0; unsigned seed = 0; char cmd[96]; random32 = seed = get_timer(0) + 12345;//FIXME:make it random /*random32 = random_u32(seed);*/ DWN_MSG("random value is 0x%x\n", random32); sprintf(cmd, "aml_key_burn init 0x%x", random32); rc = run_command(cmd, 0); if (rc) { DWN_ERR("Fail in cmd[%s]\n", cmd); return __LINE__; } } rc = sdc_burn_get_user_key_names(hImg, &keysName, &keysNum); if (ITEM_NOT_EXIST != rc && rc) { DWN_ERR("Fail to parse keys.conf, rc =%d\n", rc); return __LINE__; } DWN_MSG("keys.conf:\n"); for (index = 0; index < keysNum; ++index)printf("\tkey[%d]\t%s\n", index, keysName[index]) ; rc = optimus_sdc_keysprovider_init(); if (rc) { DWN_ERR("Fail in optimus_sdc_keysprovider_init\n"); return __LINE__; } pCurKeysName = keysName; for (index = 0; index < keysNum; ++index) { const char* const keyName = *pCurKeysName++; if (!keyName) continue; DWN_MSG("\n"); DWN_MSG("Now to burn key <---- [%s] ----> %d \n", keyName, index); rc = sdc_check_key_need_to_burn(keyName, keyOverWrite); if (rc < 0) { DWN_ERR("Fail when when check stauts for key(%s)\n", keyName); /*return __LINE__;*/ } if (!rc) continue;//not need to burn this key //0, init the key license parser const void* pHdle = NULL; rc = optimus_sdc_keysprovider_open(keyName, &pHdle); if (rc) { DWN_ERR("Fail in init license for key[%s]\n", keyName); return __LINE__; } //1,using cmd_keysprovider to read a key to memory u8* keyValue = (u8*)OPTIMUS_DOWNLOAD_TRANSFER_BUF_ADDR; unsigned keySz = OPTIMUS_DOWNLOAD_SLOT_SZ;//buffer size rc = optimus_sdc_keysprovider_get_keyval(pHdle, keyValue, &keySz); if (rc) { DWN_ERR("Fail to get value for key[%s]\n", keyName); return __LINE__; } //3, burn the key rc = optimus_keysburn_onekey(keyName, (u8*)keyValue, keySz); if (rc) { DWN_ERR("Fail in burn the key[%s] at addr=%p, sz=%d\n", keyName, keyValue, keySz); return __LINE__; } //3,report burn result to cmd_keysprovider rc = optimus_sdc_keysprovider_update_license(pHdle); if (rc) { DWN_ERR("Fail in update license for key[%s]\n", keyName); return __LINE__; } } rc = optimus_sdc_keysprovider_exit(); if (rc) { DWN_ERR("Fail in optimus_sdc_keysprovider_exit\n"); return __LINE__; } rc = run_command("aml_key_burn uninit", 0); if (rc) { DWN_ERR("Fail in uninit for aml_key_burn\n"); return __LINE__; } return 0; }