예제 #1
0
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;
}
예제 #2
0
//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;
}