hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// SPDX-License-Identifier: BSD-2-Clause
/*
 * Copyright (c) 2015, Linaro Limited
 * All rights reserved.
 */
 
#include <tee_internal_api.h>
#include <tee_ta_api.h>
#include <string.h>
#include <trace.h>
 
#include "ta_sha_perf.h"
#include "ta_sha_perf_priv.h"
 
#define CHECK(res, name, action) do {            \
       if ((res) != TEE_SUCCESS) {        \
           DMSG(name ": 0x%08x", (res));    \
           action                \
       }                    \
   } while(0)
 
static TEE_OperationHandle digest_op = NULL;
 
TEE_Result cmd_process(uint32_t param_types, TEE_Param params[4])
{
   TEE_Result res = TEE_ERROR_GENERIC;
   int n = 0;
   void *in = NULL;
   void *out = NULL;
   uint32_t insz = 0;
   uint32_t outsz = 0;
   uint32_t offset = 0;
   uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
                          TEE_PARAM_TYPE_MEMREF_OUTPUT,
                          TEE_PARAM_TYPE_VALUE_INPUT,
                          TEE_PARAM_TYPE_NONE);
 
   if (param_types != exp_param_types)
       return TEE_ERROR_BAD_PARAMETERS;
 
   offset = params[2].value.b;
   in = (uint8_t *)params[0].memref.buffer + offset;
   insz = params[0].memref.size - offset;
   out = params[1].memref.buffer;
   outsz = params[1].memref.size;
   n = params[2].value.a;
 
   while (n--) {
       res = TEE_DigestDoFinal(digest_op, in, insz, out, &outsz);
       CHECK(res, "TEE_DigestDoFinal", return res;);
   }
   return TEE_SUCCESS;
}
 
TEE_Result cmd_prepare_op(uint32_t param_types, TEE_Param params[4])
{
   TEE_Result res = TEE_ERROR_GENERIC;
   uint32_t algo = 0;
   uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
                          TEE_PARAM_TYPE_NONE,
                          TEE_PARAM_TYPE_NONE,
                          TEE_PARAM_TYPE_NONE);
 
   if (param_types != exp_param_types)
       return TEE_ERROR_BAD_PARAMETERS;
 
   switch (params[0].value.a) {
   case TA_SHA_SHA1:
       algo = TEE_ALG_SHA1;
       break;
   case TA_SHA_SHA224:
       algo = TEE_ALG_SHA224;
       break;
   case TA_SHA_SHA256:
       algo = TEE_ALG_SHA256;
       break;
   case TA_SHA_SHA384:
       algo = TEE_ALG_SHA384;
       break;
   case TA_SHA_SHA512:
       algo = TEE_ALG_SHA512;
       break;
   default:
       return TEE_ERROR_BAD_PARAMETERS;
   }
 
   if (digest_op)
       TEE_FreeOperation(digest_op);
 
   res = TEE_AllocateOperation(&digest_op, algo, TEE_MODE_DIGEST, 0);
   CHECK(res, "TEE_AllocateOperation", return res;);
 
   return TEE_SUCCESS;
}
 
 
void cmd_clean_res(void)
{
   if (digest_op)
       TEE_FreeOperation(digest_op);    
}