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