TEE_Result KM_GetData(void *data, uint32_t expected_data_size, KM_BinaryData *obj_id,
uint32_t with_pwd, KM_PwdData *pwdData, uint32_t obj_type);
-TEE_Result KM_GetDataSize(uint32_t *data_size, void *objId, uint32_t objId_size,
- uint32_t obj_type);
+TEE_Result KM_GetDataSize(uint32_t *data_size, KM_BinaryData *obj_id,
+ uint32_t with_pwd, KM_PwdData *pwdData, uint32_t obj_type);
void KM_DestroyData(void *objId, uint32_t objId_size);
{
TEE_Result ret = TEE_SUCCESS;
KM_BinaryData objId;
+ KM_PwdData pwdData;
uint32_t type;
void *buffer = param[1].memref.buffer;
uint32_t in_size_guard = param[1].memref.size;
uint32_t data_size = 0;
+ uint32_t with_pwd = 0;
if (KM_DeserializeBinaryData(&buffer, &in_size_guard, &objId)) {
LOG("Error in deserialization");
return TEE_ERROR_BAD_PARAMETERS;
}
+ if(KM_DeserializeFlagAndPw(&buffer, &in_size_guard, &with_pwd, &pwdData)) {
+ LOG("Error in deserialization");
+ return TEE_ERROR_BAD_PARAMETERS;
+ }
+
if (KM_DeserializeFlag(&buffer, &in_size_guard, &type)) {
LOG("Error in deserialization");
return TEE_ERROR_BAD_PARAMETERS;
}
- ret = KM_GetDataSize(&data_size, objId.data, objId.data_size, type);
+ ret = KM_GetDataSize(&data_size, &objId, with_pwd, &pwdData, type);
param[0].value.b = data_size;
return ret;
return ret;
}
-TEE_Result KM_GetDataSize(uint32_t *data_size, void *objId, uint32_t objId_size,
- uint32_t obj_type)
+TEE_Result KM_GetDataSize(uint32_t *data_size, KM_BinaryData *obj_id,
+ uint32_t with_pwd, KM_PwdData *pwdData, uint32_t obj_type)
{
TEE_Result ret = TEE_SUCCESS;
uint32_t flags = TEE_DATA_FLAG_ACCESS_READ;
TEE_ObjectInfo info;
KM_BinaryData der = {0, NULL};
- ret = TEE_OpenPersistentObject(TEE_STORAGE_PRIVATE, objId, objId_size, flags, &hndl);
- if (TEE_SUCCESS != ret) {
- LOG("TEE_OpenPersistentObject has failed with=%x.", ret);
- return ret;
- }
+ if (obj_type == TYPE_GENERIC_SECRET || obj_type == TYPE_SKEY) {
+ ret = TEE_OpenPersistentObject(TEE_STORAGE_PRIVATE, obj_id->data, obj_id->data_size, flags, &hndl);
+ if (TEE_SUCCESS != ret) {
+ LOG("TEE_OpenPersistentObject has failed with=%x.", ret);
+ return ret;
+ }
- TEE_GetObjectInfo(hndl, &info);
+ TEE_GetObjectInfo(hndl, &info);
- if(info.dataSize != 0) {
- *data_size = info.dataSize;
- } else if(obj_type == TYPE_SKEY) {
- // in case of key without encryption
- // to support export of a key with wrapping
- *data_size = info.objectSize / 8;
- } else if(obj_type == TYPE_AKEY_PUBLIC_EC) {
- // to suppoort export of EC public key
+ if(obj_type == TYPE_SKEY) {
+ // in case of key without encryption to support export of a key with wrapping
+ *data_size = info.objectSize / 8;
+ } else {
+ *data_size = info.dataSize;
+ }
+ } else if (obj_type == TYPE_AKEY_PUBLIC_EC) {
+ if (with_pwd) {
+ ret = KM_DecryptAsymKey(obj_id, pwdData, &hndl);
+ } else {
+ ret = KM_OpenKey(obj_id->data, obj_id->data_size, &hndl);
+ }
+ if (ret != TEE_SUCCESS) {
+ LOG("Fail to open ec public key.");
+ goto clean;
+ }
ret = KM_EcpublickeyToDer(hndl, &der);
if (ret != TEE_SUCCESS) {
LOG("Fail to convert ec public key to der format");