return ret;
}
-
TEE_Result KM_ExecCmdSaveData(TEE_Param param[4])
{
TEE_Result ret = TEE_SUCCESS;
+ TEE_ObjectHandle key = TEE_HANDLE_NULL;
+ TEE_ObjectHandle oldKey = TEE_HANDLE_NULL;
KM_BinaryData dataToSave;
- KM_BinaryData encData;
- KM_BinaryData objId;
+ KM_BinaryData dataEncIV; // IV used to decrypt dataToSave with built-in key
+ KM_BinaryData encData; // Used during encyption with password
+ KM_BinaryData objId; // Random ID of object
KM_BinaryData tag;
KM_PwdData pwdData;
uint32_t with_pwd = 0;
+ uint32_t dataSizeBits_flag;
+ uint32_t dataTypeFlag; // representation of tz_data_type
+
void *in_buffer = param[1].memref.buffer;
void *out_buffer = param[2].memref.buffer;
uint32_t in_size_guard = param[1].memref.size;
encData.data = objId.data = tag.data = NULL;
+ if (KM_DeserializeFlag(&in_buffer, &in_size_guard, &dataTypeFlag)) {
+ LOG("Error in deserialization");
+ ret = TEE_ERROR_BAD_PARAMETERS;
+ goto clean;
+ }
+
if (KM_DeserializeBinaryData(&in_buffer, &in_size_guard, &dataToSave)) {
LOG("Error in deserialization");
ret = TEE_ERROR_BAD_PARAMETERS;
goto clean;
}
+
+ if (KM_DeserializeFlag(&in_buffer, &in_size_guard, &dataSizeBits_flag)) {
+ LOG("Error in deserialization");
+ ret = TEE_ERROR_BAD_PARAMETERS;
+ goto clean;
+ }
+
+ if (KM_DeserializeBinaryData(&in_buffer, &in_size_guard, &dataEncIV)) {
+ LOG("Error in deserialization");
+ ret = TEE_ERROR_BAD_PARAMETERS;
+ goto clean;
+ }
+
if (KM_DeserializeFlag(&in_buffer, &in_size_guard, &with_pwd)) {
LOG("Error in deserialization");
ret = TEE_ERROR_BAD_PARAMETERS;
ret = TEE_ERROR_BAD_PARAMETERS;
goto clean;
}
- tag.data_size = pwdData.tag_len_bits / 8;
- tag.data = malloc(tag.data_size);
- if (tag.data == NULL) {
- LOG("Failed to allocate memory for data encryption key's tag");
- ret = TEE_ERROR_OUT_OF_MEMORY;
- goto clean;
- }
- // Probing for needed buffer size
- encData.data = NULL;
- encData.data_size = 0;
- ret = KM_EncryptDataWithPwd(&pwdData, dataToSave.data, dataToSave.data_size,
- encData.data, &encData.data_size, tag.data, &tag.data_size);
-
- // We should get SHORT_BUFFER, but simulator tends to return TEE_SUCCESS
- if (ret != TEE_ERROR_SHORT_BUFFER && ret != TEE_SUCCESS) {
- LOG("Failed to probe for needed data size");
- ret = TEE_ERROR_GENERIC;
- goto clean;
- }
- encData.data = malloc(encData.data_size);
- if (encData.data == NULL) {
- LOG("Failed to allocate object buffer for encrypting data");
- ret = TEE_ERROR_OUT_OF_MEMORY;
- goto clean;
- }
- ret = KM_EncryptDataWithPwd(&pwdData, dataToSave.data, dataToSave.data_size,
- encData.data, &encData.data_size, tag.data, &tag.data_size);
- if (ret != TEE_SUCCESS) {
- LOG("Failed to encrypt data for storage");
- goto clean;
- }
- dataToSave = encData;
}
-
objId.data_size = TEE_OBJECT_ID_MAX_LEN;
objId.data = malloc(objId.data_size);
// ObjectID generation
TEE_GenerateRandom(objId.data, objId.data_size);
- ret = KM_SaveData(dataToSave.data, dataToSave.data_size, objId.data, objId.data_size);
- if (ret != TEE_SUCCESS) {
- LOG("Failed to save data to storage");
+ if (dataTypeFlag == TYPE_GENERIC_SECRET) {
+ // TODO support for decryption with dataEncIV
+ if (with_pwd) {
+ tag.data_size = pwdData.tag_len_bits / 8;
+ tag.data = malloc(tag.data_size);
+ if (tag.data == NULL) {
+ LOG("Failed to allocate memory for data encryption key's tag");
+ ret = TEE_ERROR_OUT_OF_MEMORY;
+ goto clean;
+ }
+ // Probing for needed buffer size
+ encData.data = NULL;
+ encData.data_size = 0;
+ ret = KM_EncryptDataWithPwd(&pwdData, dataToSave.data, dataToSave.data_size,
+ encData.data, &encData.data_size, tag.data, &tag.data_size);
+
+ // We should get SHORT_BUFFER, but simulator tends to return TEE_SUCCESS
+ if (ret != TEE_ERROR_SHORT_BUFFER && ret != TEE_SUCCESS) {
+ LOG("Failed to probe for needed data size");
+ ret = TEE_ERROR_GENERIC;
+ goto clean;
+ }
+ encData.data = malloc(encData.data_size);
+ if (encData.data == NULL) {
+ LOG("Failed to allocate object buffer for encrypting data");
+ ret = TEE_ERROR_OUT_OF_MEMORY;
+ goto clean;
+ }
+ ret = KM_EncryptDataWithPwd(&pwdData, dataToSave.data, dataToSave.data_size,
+ encData.data, &encData.data_size, tag.data, &tag.data_size);
+ if (ret != TEE_SUCCESS) {
+ LOG("Failed to encrypt data for storage");
+ goto clean;
+ }
+ dataToSave = encData;
+ }
+ ret = KM_SaveData(dataToSave.data, dataToSave.data_size, objId.data, objId.data_size);
+ if (ret != TEE_SUCCESS) {
+ LOG("Failed to save data to storage");
+ }
+ } else if (dataTypeFlag == TYPE_SKEY) {
+ // TODO support for decryption with dataEncIV
+ if (!KM_CheckAlgoKeySize(TEE_TYPE_AES, dataSizeBits_flag)) {
+ LOG("Unsupported key size provided: %u", dataSizeBits_flag);
+ ret = TEE_ERROR_BAD_PARAMETERS;
+ goto clean;
+ }
+
+ KM_CreateKey(TEE_TYPE_AES, dataSizeBits_flag, dataToSave.data, &key);
+ if (ret != TEE_SUCCESS) {
+ LOG("Failed to create key");
+ goto clean;
+ }
+
+ if (with_pwd) {
+ tag.data_size = pwdData.tag_len_bits / 8;
+ tag.data = malloc(tag.data_size);
+ if (tag.data == NULL) {
+ LOG("Failed to allocate memory for key's tag");
+ ret = TEE_ERROR_OUT_OF_MEMORY;
+ goto clean;
+ }
+
+ oldKey = key;
+
+ ret = KM_EncryptKey(key, &pwdData, &key, tag.data, &tag.data_size);
+ if (TEE_SUCCESS != ret) {
+ LOG("Failed to encrypt new key");
+ goto clean;
+ }
+ }
+
+ ret = KM_SaveKey(NULL, 0, key, objId.data, objId.data_size);
+ if (TEE_SUCCESS != ret) {
+ LOG("Failed to save generated key");
+ goto clean;
+ }
+ } else {
+ LOG("This data type(tz_algo_type=%u) is not supported by import methods.\n", dataTypeFlag);
+ ret = TEE_ERROR_BAD_PARAMETERS;
+ goto clean;
}
// Output data - ID of the object
ret = TEE_ERROR_BAD_PARAMETERS;
goto clean;
}
+
// If needed, also the tag ID
if (with_pwd) {
if (KM_Serialize(&out_buffer, &out_size_guard, tag.data, tag.data_size)) {
}
clean:
+ TEE_CloseObject(oldKey);
+ TEE_CloseObject(key);
free(objId.data);
free(encData.data);
free(tag.data);