blob: 56e79b1f756b7a90a8bb9a0f9df03c7f01a960d6 [file] [log] [blame]
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +03001// SPDX-License-Identifier: BSD-2-Clause
2/*
3 * Copyright (c) 2021, Open Mobile Platform LLC
4 */
5
6#include <stdio.h>
7#include <stdint.h>
8#include <stddef.h>
9#include <string.h>
10#include <stdlib.h>
11#include <limits.h>
12#include <tee_plugin_method.h>
13#include <test_supp_plugin.h>
14#include <unistd.h>
15
16static TEEC_Result pass_values(unsigned int sub_cmd, void *data,
17 size_t data_len, size_t *out_len)
18{
19 struct add_op {
20 uint32_t a;
21 uint32_t b;
22 } *values = NULL;
23
24 values = (struct add_op *)data;
25 *out_len = sizeof(uint32_t);
26
27 if (sub_cmd == '+')
28 values->a = values->a + values->b;
29 else
30 values->a = values->a - values->b;
31
32 return TEEC_SUCCESS;
33}
34
Aleksandr Anisimov80768392021-03-05 19:36:20 +030035static TEEC_Result proc_input_arr(unsigned int sub_cmd, void *data,
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +030036 size_t data_len, size_t *out_len)
37{
38 (void)sub_cmd;
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +030039
Aleksandr Anisimov80768392021-03-05 19:36:20 +030040 size_t i = 0;
41 uint8_t sum = 0;
42 uint8_t *d = data;
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +030043
Aleksandr Anisimov80768392021-03-05 19:36:20 +030044 for (; i < data_len; ++i)
45 sum += d[i];
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +030046
Aleksandr Anisimov80768392021-03-05 19:36:20 +030047 d[0] = sum;
48 *out_len = sizeof(sum);
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +030049
50 return TEEC_SUCCESS;
51}
52
53static TEEC_Result get_test_arr(unsigned int sub_cmd, void *data,
54 size_t data_len, size_t *out_len)
55{
56 (void)sub_cmd;
57 char test_arr[] = "Array from plugin";
58 size_t test_size = sizeof(test_arr);
59
60 if (data_len < test_size)
61 return TEEC_ERROR_GENERIC;
62
63 memcpy(data, test_arr, test_size);
64 *out_len = test_size;
65
66 return TEEC_SUCCESS;
67}
68
69static TEEC_Result test_plugin_invoke(unsigned int cmd, unsigned int sub_cmd,
70 void *data, size_t data_len,
71 size_t *out_len)
72{
73 switch (cmd) {
74 case TEST_PLUGIN_CMD_PING:
75 return TEEC_SUCCESS;
76 case TEST_PLUGIN_CMD_PASS_VALUES:
77 return pass_values(sub_cmd, data, data_len, out_len);
78 case TEST_PLUGIN_CMD_WRITE_ARR:
Aleksandr Anisimov80768392021-03-05 19:36:20 +030079 return proc_input_arr(sub_cmd, data, data_len, out_len);
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +030080 case TEST_PLUGIN_CMD_GET_ARR:
81 return get_test_arr(sub_cmd, data, data_len, out_len);
82 default:
83 break;
84 }
85
86 return TEEC_ERROR_NOT_SUPPORTED;
87}
88
89struct plugin_method plugin_method = {
90 .name = "test",
91 .uuid = TEST_PLUGIN_UUID,
92 .invoke = test_plugin_invoke,
93};