Beispiel #1
0
int key_manage_read(const char* keyname, void* keydata, const unsigned bufLen)
{
    int ret = 0;
    ssize_t keysize = 0;
    int srcKeyType = 0;
    char* decryptBuf = NULL;
    const int DecryptBufMaxLen = 64<<10;

    ret = key_manage_query_size(keyname, &keysize);
    if (ret) {
        KM_ERR ("Fail in query key size for key[%s]\n", keyname) ;
        return __LINE__;
    }
    if (keysize > bufLen) {
        KM_ERR ("keysize %zd > bufLen %d\n", keysize, bufLen) ;
        return __LINE__;
    }

    ret = km_get_user_key_format(keyname, &srcKeyType);
    if (ret) {
        KM_ERR ("Fail in get user key type\n") ;
        return __LINE__;
    }

    decryptBuf = (char*)malloc(DecryptBufMaxLen);
    switch (srcKeyType)
    {
        case KM_USER_KEY_TYPE_MAC:
            {
                ret = _read_key_in_type_mac(keyname, (char*)keydata, (unsigned)keysize, decryptBuf);
            }
            break;

        case KM_USER_KEY_TYPE_HDCP2:
            {
                ret = _read_key_in_type_hdcp2(keyname, keydata, (unsigned)keysize, decryptBuf);
            }
            break;

        case KM_USER_KEY_TYPE_SHA1:
        case KM_USER_KEY_TYPE_RAW:
        default:
            {
                ret = key_unify_read(keyname, keydata, (unsigned)keysize);
            }
            break;
    }

    free(decryptBuf);
    return ret;
}
Beispiel #2
0
//Return value: key size that user wanted, ok if > 0
static int _read_key_in_type_mac(const char* keyname, char* databuf, const unsigned bufLen, char* decryptBuf)
{
    int ret = 0;
    int index = 0;
    ssize_t keyDevSz = 0;

    if (_UsrMacKeyLen > bufLen) {
        KM_ERR("mac len %d is invalid, must be %d\n", bufLen, _UsrMacKeyLen);
        return -__LINE__;
    }

    ret = key_unify_query_size (keyname, &keyDevSz) ;
    if (ret) {
        KM_ERR("Fail in get key sz, ret=%d\n", ret);
        return -__LINE__;
    }

    ret = key_unify_read (keyname, decryptBuf, (unsigned)keyDevSz) ;
    if (ret) {
        KM_ERR("fail in read key[%s]\n", keyname);
        return -__LINE__;
    }

    if (_UsrMacKeyLen == keyDevSz) {
        memcpy(databuf, decryptBuf, keyDevSz);
        return 0;
    }

    databuf[0] = '\0';
    for (index = 0; index < keyDevSz; ++index)
    {
        const unsigned byteSum = decryptBuf[index];

        sprintf(databuf, "%s%02x:", databuf, byteSum);
    }

    return ret;
}
Beispiel #3
0
int do_keyunify(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
{
	int err;
	char *cmd,*name;
	unsigned int addr,len,reallen;
	unsigned int keystate,keypermit;

	if (argc < 2)
		goto usage;

	cmd = argv[1];
	if(!strcmp(cmd,"init")){
		if(argc > 3){
			addr = simple_strtoul(argv[2], NULL, 16);
			len  = simple_strtoul(argv[3], NULL, 16);
		}
		else{
			char initvalue[]={1,2,3,4};
			addr = (unsigned int)&initvalue[0];
			len  = sizeof(initvalue);
		}
		err = key_unify_init((char *)addr,len);
		return err;
	}
	if(!strcmp(cmd,"write")){
		if(argc < 5)
			goto usage;
		name = argv[2];
		addr = simple_strtoul(argv[3], NULL, 16);
		len  = simple_strtoul(argv[4], NULL, 16);
		err = key_unify_write(name,(unsigned char *)addr,len);
		if(err < 0){
			printf("%s:%d,%s key write fail\n",__func__,__LINE__,name);
		}
		return err;
	}
	if(!strcmp(cmd,"read")){
		if(argc < 6)
			goto usage;
		name = argv[2];
		addr = simple_strtoul(argv[3], NULL, 16);
		len  = simple_strtoul(argv[4], NULL, 16);
		reallen = simple_strtoul(argv[5], NULL, 16);
		err = key_unify_read(name,(unsigned char *)addr,len,(unsigned int*)reallen);
		if(err < 0){
			printf("%s:%d,%s key read fail\n",__func__,__LINE__,name);
		}
		return err;
	}
	if(!strcmp(cmd,"query")){
		if(argc < 5)
			goto usage;
		name = argv[2];
		keystate = simple_strtoul(argv[3], NULL, 16);
		keypermit  = simple_strtoul(argv[4], NULL, 16);
		err = key_unify_query(name,(unsigned int *)keystate,(unsigned int *)keypermit);
		if(err < 0){
			printf("%s:%d,%s key query fail\n",__func__,__LINE__,name);
		}
		if(err >=0){
			if(*(unsigned int*)keystate == KEY_BURNED){
				printf("%s key exist\n",name);
			}
			else{
				printf("%s key not exist\n",name);
			}
		}
		return err;
	}
    if(!strcmp(cmd,"secure")){
		addr = simple_strtoul(argv[3], NULL, 16);
		len  = simple_strtoul(argv[4], NULL, 16);
		err= key_unify_secure_boot_key(argv[2],(unsigned char *)addr,len);
		if(err < 0){
			printf("fail\n");
		}
		else if(err > 0){
			printf("exist\n");
		}
		else{
			printf("ok\n");
		}
		return err;
	}

	if(!strcmp(cmd,"uninit")){
		key_unify_uninit();
		return 0;
	}
	
usage:
	cmd_usage(cmdtp);
	return 1;
}