1 /*
2 * Copyright (C) 2022 Huawei Technologies Co., Ltd.
3 * Licensed under the Mulan PSL v2.
4 * You can use this software according to the terms and conditions of the Mulan PSL v2.
5 * You may obtain a copy of Mulan PSL v2 at:
6 * http://license.coscl.org.cn/MulanPSL2
7 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9 * PURPOSE.
10 * See the Mulan PSL v2 for more details.
11 */
12 #include "tee_obj_attr.h"
13 #include "tee_log.h"
14 #include "tee_obj.h"
15 #include "tee_object_api.h"
16
17 static const struct obj_attr_conf_s g_obj_attr_conf[] = {
18 { TEE_TYPE_AES, 1, 1, OBJ_MIN_SIZE_AES, {TEE_ATTR_SECRET_VALUE}},
19 { TEE_TYPE_DES, 1, 1, OBJ_SIZE_DES, {TEE_ATTR_SECRET_VALUE}},
20 { TEE_TYPE_DES3, 1, 1, OBJ_SIZE_DES3, {TEE_ATTR_SECRET_VALUE}},
21 { TEE_TYPE_SM4, 1, 1, OBJ_SIZE_SM4, {TEE_ATTR_SECRET_VALUE}},
22 { TEE_TYPE_HMAC_SM3, 1, 1, OBJ_MIN_SIZE_HMAC_SM3, {TEE_ATTR_SECRET_VALUE}},
23 { TEE_TYPE_HMAC_MD5, 1, 1, OBJ_MIN_SIZE_HMAC, {TEE_ATTR_SECRET_VALUE}},
24 { TEE_TYPE_HMAC_SHA1, 1, 1, OBJ_MIN_SIZE_HMAC, {TEE_ATTR_SECRET_VALUE}},
25 { TEE_TYPE_HMAC_SHA224, 1, 1, OBJ_MIN_SIZE_HMAC, {TEE_ATTR_SECRET_VALUE}},
26 { TEE_TYPE_HMAC_SHA256, 1, 1, OBJ_MIN_SIZE_HMAC, {TEE_ATTR_SECRET_VALUE}},
27 { TEE_TYPE_HMAC_SHA384, 1, 1, OBJ_MIN_SIZE_HMAC, {TEE_ATTR_SECRET_VALUE}},
28 { TEE_TYPE_HMAC_SHA512, 1, 1, OBJ_MIN_SIZE_HMAC, {TEE_ATTR_SECRET_VALUE}},
29 { TEE_TYPE_SIP_HASH, 1, 1, OBJ_MIN_SIZE_HMAC, {TEE_ATTR_SECRET_VALUE}},
30 { TEE_TYPE_GENERIC_SECRET, 1, 1, OBJ_MIN_SIZE_GENERIC_SECRET, {TEE_ATTR_SECRET_VALUE}},
31 { TEE_TYPE_PBKDF2_HMAC, 1, 1, OBJ_MIN_SIZE_PBKDF2, {TEE_ATTR_SECRET_VALUE}},
32 {
33 TEE_TYPE_RSA_PUBLIC_KEY, 2, 2, OBJ_MIN_SIZE_RSA_PUB_KEY, {
34 TEE_ATTR_RSA_MODULUS,
35 TEE_ATTR_RSA_PUBLIC_EXPONENT
36 }
37 },
38 {
39 TEE_TYPE_RSA_KEYPAIR, 3, 8, OBJ_MIN_SIZE_RSA_KEY_PAIR, {
40 TEE_ATTR_RSA_MODULUS,
41 TEE_ATTR_RSA_PUBLIC_EXPONENT,
42 TEE_ATTR_RSA_PRIVATE_EXPONENT
43 }
44 },
45 {
46 TEE_TYPE_DSA_PUBLIC_KEY, 4, 4, OBJ_MIN_SIZE_DSA_PUB_KEY, {
47 TEE_ATTR_DSA_PRIME,
48 TEE_ATTR_DSA_SUBPRIME,
49 TEE_ATTR_DSA_BASE,
50 TEE_ATTR_DSA_PUBLIC_VALUE
51 }
52 },
53 {
54 TEE_TYPE_DSA_KEYPAIR, 5, 5, OBJ_MIN_SIZE_DSA_KEY_PAIR, {
55 TEE_ATTR_DSA_PRIME,
56 TEE_ATTR_DSA_SUBPRIME,
57 TEE_ATTR_DSA_BASE,
58 TEE_ATTR_DSA_PUBLIC_VALUE,
59 TEE_ATTR_DSA_PRIVATE_VALUE
60 }
61 },
62 {
63 TEE_TYPE_DH_KEYPAIR, 4, 6, OBJ_MIN_SIZE_DH_KEY_PAIR, {
64 TEE_ATTR_DH_PRIME,
65 TEE_ATTR_DH_BASE,
66 TEE_ATTR_DH_PUBLIC_VALUE,
67 TEE_ATTR_DH_PRIVATE_VALUE
68 }
69 },
70 {
71 TEE_TYPE_ECDSA_PUBLIC_KEY, 3, 3, OBJ_MIN_SIZE_ECDSA_PUB_KEY, {
72 TEE_ATTR_ECC_PUBLIC_VALUE_X,
73 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
74 TEE_ATTR_ECC_CURVE
75 }
76 },
77 {
78 TEE_TYPE_ECDH_PUBLIC_KEY, 3, 3, OBJ_MIN_SIZE_ECDH_PUB_KEY, {
79 TEE_ATTR_ECC_PUBLIC_VALUE_X,
80 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
81 TEE_ATTR_ECC_CURVE
82 }
83 },
84 {
85 TEE_TYPE_ECDSA_KEYPAIR, 4, 4, OBJ_MIN_SIZE_ECDSA_KEY_PAIR, {
86 TEE_ATTR_ECC_PUBLIC_VALUE_X,
87 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
88 TEE_ATTR_ECC_CURVE,
89 TEE_ATTR_ECC_PRIVATE_VALUE
90 }
91 },
92 {
93 TEE_TYPE_ECDH_KEYPAIR, 4, 4, OBJ_MIN_SIZE_ECDH_KEY_PAIR, {
94 TEE_ATTR_ECC_PUBLIC_VALUE_X,
95 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
96 TEE_ATTR_ECC_CURVE,
97 TEE_ATTR_ECC_PRIVATE_VALUE
98 }
99 },
100 {
101 TEE_TYPE_SM2_DSA_PUBLIC_KEY, 2, 3, OBJ_SIZE_SM2, {
102 TEE_ATTR_ECC_PUBLIC_VALUE_X,
103 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
104 }
105 },
106 {
107 TEE_TYPE_SM2_KEP_PUBLIC_KEY, 2, 3, OBJ_SIZE_SM2, {
108 TEE_ATTR_ECC_PUBLIC_VALUE_X,
109 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
110 }
111 },
112 {
113 TEE_TYPE_SM2_PKE_PUBLIC_KEY, 2, 3, OBJ_SIZE_SM2, {
114 TEE_ATTR_ECC_PUBLIC_VALUE_X,
115 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
116 }
117 },
118 {
119 TEE_TYPE_SM2_DSA_KEYPAIR, 3, 4, OBJ_SIZE_SM2, {
120 TEE_ATTR_ECC_PUBLIC_VALUE_X,
121 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
122 TEE_ATTR_ECC_PRIVATE_VALUE
123 }
124 },
125 {
126 TEE_TYPE_SM2_KEP_KEYPAIR, 3, 4, OBJ_SIZE_SM2, {
127 TEE_ATTR_ECC_PUBLIC_VALUE_X,
128 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
129 TEE_ATTR_ECC_PRIVATE_VALUE
130 }
131 },
132 {
133 TEE_TYPE_SM2_PKE_KEYPAIR, 3, 4, OBJ_SIZE_SM2, {
134 TEE_ATTR_ECC_PUBLIC_VALUE_X,
135 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
136 TEE_ATTR_ECC_PRIVATE_VALUE
137 }
138 },
139 {
140 TEE_TYPE_ED25519_PUBLIC_KEY, 1, 1, OBJ_SIZE_ED25519_PUB_KEY, {
141 TEE_ATTR_ED25519_PUBLIC_VALUE
142 }
143 },
144 {
145 TEE_TYPE_ED25519_KEYPAIR, 2, 2, OBJ_SIZE_ED25519_KEY_PAIR, {
146 TEE_ATTR_ED25519_PUBLIC_VALUE,
147 TEE_ATTR_ED25519_PRIVATE_VALUE
148 }
149 },
150 {
151 TEE_TYPE_X25519_PUBLIC_KEY, 1, 1, OBJ_SIZE_X25519_PUB_KEY, {
152 TEE_ATTR_X25519_PUBLIC_VALUE
153 }
154 },
155 {
156 TEE_TYPE_X25519_KEYPAIR, 2, 2, OBJ_SIZE_X25519_PUB_KEY, {
157 TEE_ATTR_X25519_PUBLIC_VALUE,
158 TEE_ATTR_X25519_PRIVATE_VALUE
159 }
160 },
161 { TEE_TYPE_DATA, 0, 0, 0, {0}},
162 { TEE_TYPE_DATA_GP1_1, 0, 0, 0, {0}},
163 };
164
get_attr_count_for_object_type(uint32_t object_type)165 uint32_t get_attr_count_for_object_type(uint32_t object_type)
166 {
167 uint32_t index;
168
169 for (index = 0; index < ELEM_NUM(g_obj_attr_conf); index++) {
170 if (object_type == g_obj_attr_conf[index].type)
171 return g_obj_attr_conf[index].max_attr_count;
172 }
173
174 return 0;
175 }
176
get_object_size(uint32_t object_type)177 uint32_t get_object_size(uint32_t object_type)
178 {
179 uint32_t index;
180
181 for (index = 0; index < ELEM_NUM(g_obj_attr_conf); index++) {
182 if (object_type == g_obj_attr_conf[index].type)
183 return g_obj_attr_conf[index].min_obj_size;
184 }
185
186 return 0;
187 }
188
get_object_attr_conf(const TEE_ObjectHandle object)189 const struct obj_attr_conf_s *get_object_attr_conf(const TEE_ObjectHandle object)
190 {
191 const struct obj_attr_conf_s *config = NULL;
192 uint32_t index;
193
194 if (object == NULL || object->ObjectInfo == NULL) {
195 tloge("invalid input");
196 return NULL;
197 }
198
199 for (index = 0; index < ELEM_NUM(g_obj_attr_conf); index++) {
200 if (object->ObjectInfo->objectType == g_obj_attr_conf[index].type)
201 config = &g_obj_attr_conf[index];
202 }
203 return config;
204 }
205
check_object_valid(TEE_ObjectHandle object)206 TEE_Result check_object_valid(TEE_ObjectHandle object)
207 {
208 if (object == TEE_HANDLE_NULL) {
209 tloge("Bad Parameter:ObjectHandle is NULL!\n");
210 return TEE_ERROR_BAD_PARAMETERS;
211 }
212
213 if (check_object(object) != TEE_SUCCESS) {
214 tloge("Object is invalid\n");
215 return TEE_ERROR_BAD_PARAMETERS;
216 }
217
218 if (object->ObjectInfo == NULL) {
219 tloge("Object is invalid\n");
220 return TEE_ERROR_BAD_PARAMETERS;
221 }
222
223 return TEE_SUCCESS;
224 }
225