blob: 6b90b171a1959c43f6a5cae9ce1ec4feec3aaffc [file] [log] [blame]
// SPDX-License-Identifier: BSD-2-Clause
/*
* Copyright (c) 2021, Open Mobile Platform LLC
*/
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <tee_plugin_method.h>
#include <test_supp_plugin.h>
#include <unistd.h>
static TEEC_Result pass_values(unsigned int sub_cmd, void *data,
size_t data_len, size_t *out_len)
{
struct add_op {
uint32_t a;
uint32_t b;
} *values = NULL;
values = (struct add_op *)data;
*out_len = sizeof(uint32_t);
if (sub_cmd == '+')
values->a = values->a + values->b;
else
values->a = values->a - values->b;
return TEEC_SUCCESS;
}
static TEEC_Result write_test_arr(unsigned int sub_cmd, void *data,
size_t data_len, size_t *out_len)
{
(void)sub_cmd;
(void)out_len;
int fd = -1;
int n = -1;
char template[] = "/tmp/testplugin-XXXXXX";
char fname[PATH_MAX] = { 0 };
strcpy(fname, template);
fd = mkstemp(fname);
if (fd < 0)
return TEEC_ERROR_GENERIC;
n = write(fd, (const void *)data, data_len);
if (n < 0) {
close(fd);
return TEEC_ERROR_GENERIC;
}
*out_len = sizeof(template);
memcpy(data, (const void *)fname, *out_len);
close(fd);
return TEEC_SUCCESS;
}
static TEEC_Result get_test_arr(unsigned int sub_cmd, void *data,
size_t data_len, size_t *out_len)
{
(void)sub_cmd;
char test_arr[] = "Array from plugin";
size_t test_size = sizeof(test_arr);
if (data_len < test_size)
return TEEC_ERROR_GENERIC;
memcpy(data, test_arr, test_size);
*out_len = test_size;
return TEEC_SUCCESS;
}
static TEEC_Result test_plugin_invoke(unsigned int cmd, unsigned int sub_cmd,
void *data, size_t data_len,
size_t *out_len)
{
switch (cmd) {
case TEST_PLUGIN_CMD_PING:
return TEEC_SUCCESS;
case TEST_PLUGIN_CMD_PASS_VALUES:
return pass_values(sub_cmd, data, data_len, out_len);
case TEST_PLUGIN_CMD_WRITE_ARR:
return write_test_arr(sub_cmd, data, data_len, out_len);
case TEST_PLUGIN_CMD_GET_ARR:
return get_test_arr(sub_cmd, data, data_len, out_len);
default:
break;
}
return TEEC_ERROR_NOT_SUPPORTED;
}
struct plugin_method plugin_method = {
.name = "test",
.uuid = TEST_PLUGIN_UUID,
.invoke = test_plugin_invoke,
};