ta trieu (done)

 avatar
Huongnm
c_cpp
24 days ago
4.3 kB
6
Indexable
#include <tee_internal_api.h>
#include <string.h>
#include <stdio.h>
#include "TA.h"

TEE_Result TA_CreateEntryPoint(void)
{
    return TEE_SUCCESS;
}

void TA_DestroyEntryPoint(void)
{
}

TEE_Result TA_OpenSessionEntryPoint(uint32_t paramTypes,
    TEE_Param params[4], void **sessionContext)
{
    (void) paramTypes;
    (void) params;
    (void) sessionContext;

    return TEE_SUCCESS;
}

void TA_CloseSessionEntryPoint(void *sessionContext)
{
    (void) sessionContext;
}

static void create_obj_id(PasswordEntry *e, char *obj_id, size_t *len){
	// Ensure buffer is null-terminated
	obj_id[0] = '\0';
	
	// Ensure we don't overflow the buffer
	size_t package_len = strlen(e->package_name);
	size_t user_len = strlen(e->user_id);
	size_t max_len = MAX_SIZE * 2 - 1; // Leave room for null terminator
	
	// Truncate if strings are too long to fit with separator
	if (package_len + user_len + 2 > max_len) { // +2 for '|' and '\0'
		if (package_len > MAX_SIZE - 1) package_len = MAX_SIZE - 1;
		if (user_len > MAX_SIZE - 1) user_len = MAX_SIZE - 1;
		// Ensure total fits
		if (package_len + user_len + 2 > max_len) {
			// Reduce the longer one
			if (package_len > user_len) {
				package_len = max_len - user_len - 2;
			} else {
				user_len = max_len - package_len - 2;
			}
		}
	}
	
	snprintf(obj_id, MAX_SIZE * 2, "%.*s|%.*s", 
	         (int)package_len, e->package_name,
	         (int)user_len, e->user_id);
	obj_id[MAX_SIZE * 2 - 1] = '\0'; // Ensure null termination
	*len = strlen(obj_id); 
}

TEE_Result TA_InvokeCommandEntryPoint(void *sessionContext,
    uint32_t commandID, uint32_t paramTypes, TEE_Param params[4])
{
    (void) sessionContext;
    (void) commandID;

    if (paramTypes != TEE_PARAM_TYPES(
            TEE_PARAM_TYPE_MEMREF_INOUT,
            TEE_PARAM_TYPE_NONE,
            TEE_PARAM_TYPE_NONE,
            TEE_PARAM_TYPE_NONE)) {
        /* Bad parameter types */
        return TEE_ERROR_BAD_PARAMETERS;
    }

	PasswordEntry *entry = (PasswordEntry *)params[0].memref.buffer;
	uint32_t entry_size = params[0].memref.size;
	TEE_ObjectHandle object;
	TEE_Result res;
	char obj_id[MAX_SIZE * 2];
	size_t obj_id_len;

	switch (commandID)
	{
	case CMD_SAVE_PASSWORD:
		create_obj_id(entry, obj_id, &obj_id_len);
		/**
		TEE_Result TEE_CreatePersistentObject(
			 uint32_t storageID,
			 [in(objectIDLength] void* objectID, size_t objectIDLen,
			 uint32_t flags,
			 TEE_ObjectHandle attributes,
			 [inbuf] void* initialData, size_t initialDataLen,
			 [out] TEE_ObjectHandle* object);
		**/
		res = TEE_CreatePersistentObject(
				TEE_STORAGE_PRIVATE, 
				obj_id, obj_id_len, 
				TEE_DATA_FLAG_ACCESS_WRITE | TEE_DATA_FLAG_OVERWRITE,
				TEE_HANDLE_NULL,
				entry, entry_size,
				&object
			);
		if (res == TEE_SUCCESS) {
       printf("%s\n", obj_id);
			TEE_CloseObject(object);
		}
		return res;

	case CMD_CALL_PASSWORD:
		create_obj_id(entry, obj_id, &obj_id_len);
		/**
		TEE_Result TEE_OpenPersistentObject(
			 uint32_t storageID,
			[in(objectIDLength)] void* objectID, size_t objectIDLen,
			 uint32_t flags,
			[out] TEE_ObjectHandle* object);
		**/
		res = TEE_OpenPersistentObject(
				TEE_STORAGE_PRIVATE,
				obj_id, obj_id_len,
				TEE_DATA_FLAG_ACCESS_READ,
				&object
			);
		if(res != TEE_SUCCESS){
			printf("open persistent object fail\n");
			return res;
		} else {
			printf("open persistent object success\n");
		}

		// Use stack buffer instead of struct to avoid memory access issues
		char buffer[MAX_SIZE * 3]; // Enough space for the PasswordEntry struct
		if (entry_size > sizeof(buffer)) {
			TEE_CloseObject(object);
			return TEE_ERROR_OVERFLOW;
		}

		size_t count;
		/**
		TEE_Result TEE_ReadObjectData(
			 TEE_ObjectHandle object,
			 [out] void* buffer,
			 size_t size,
			 [out] size_t* count 
		**/
		res = TEE_ReadObjectData(object, buffer, entry_size, &count);
		if(res != TEE_SUCCESS) {
			printf("read object data fail: 0x%x\n", res);
		} else {
			printf("read object data success\n");
			// Copy data back to entry struct
			memcpy(entry, buffer, count);
		}
		TEE_CloseObject(object);
		return res;

	default:
		return TEE_ERROR_NOT_SUPPORTED;
	}
}
Editor is loading...
Leave a Comment