| // 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 proc_input_arr(unsigned int sub_cmd, void *data, |
| size_t data_len, size_t *out_len) |
| { |
| (void)sub_cmd; |
| |
| size_t i = 0; |
| uint8_t sum = 0; |
| uint8_t *d = data; |
| |
| for (; i < data_len; ++i) |
| sum += d[i]; |
| |
| d[0] = sum; |
| *out_len = sizeof(sum); |
| |
| 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 proc_input_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, |
| }; |