xref: /optee_os/ta/pkcs11/src/attributes.h (revision 63f89caa9022ecf51d1b82dc78af35ba9e38466d)
1*63f89caaSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
2*63f89caaSJens Wiklander /*
3*63f89caaSJens Wiklander  * Copyright (c) 2017-2020, Linaro Limited
4*63f89caaSJens Wiklander  */
5*63f89caaSJens Wiklander 
6*63f89caaSJens Wiklander #ifndef PKCS11_TA_ATTRIBUTES_H
7*63f89caaSJens Wiklander #define PKCS11_TA_ATTRIBUTES_H
8*63f89caaSJens Wiklander 
9*63f89caaSJens Wiklander #include <stdbool.h>
10*63f89caaSJens Wiklander #include <stddef.h>
11*63f89caaSJens Wiklander #include <stdint.h>
12*63f89caaSJens Wiklander #include <util.h>
13*63f89caaSJens Wiklander 
14*63f89caaSJens Wiklander #include "pkcs11_helpers.h"
15*63f89caaSJens Wiklander 
16*63f89caaSJens Wiklander /*
17*63f89caaSJens Wiklander  * Boolean property attributes (BPA): bit position in a 64 bit mask
18*63f89caaSJens Wiklander  * for boolean properties object can mandate as attribute, depending
19*63f89caaSJens Wiklander  * on the object. These attributes are often accessed and it is
20*63f89caaSJens Wiklander  * quicker to get them from a 64 bit field in the object instance
21*63f89caaSJens Wiklander  * rather than searching into the object attributes.
22*63f89caaSJens Wiklander  */
23*63f89caaSJens Wiklander #define PKCS11_BOOLPROPS_BASE		0
24*63f89caaSJens Wiklander #define PKCS11_BOOLPROPS_MAX_COUNT	64
25*63f89caaSJens Wiklander 
26*63f89caaSJens Wiklander enum boolprop_attr {
27*63f89caaSJens Wiklander 	BPA_TOKEN = 0,
28*63f89caaSJens Wiklander 	BPA_PRIVATE,
29*63f89caaSJens Wiklander 	BPA_TRUSTED,
30*63f89caaSJens Wiklander 	BPA_SENSITIVE,
31*63f89caaSJens Wiklander 	BPA_ENCRYPT,
32*63f89caaSJens Wiklander 	BPA_DECRYPT,
33*63f89caaSJens Wiklander 	BPA_WRAP,
34*63f89caaSJens Wiklander 	BPA_UNWRAP,
35*63f89caaSJens Wiklander 	BPA_SIGN,
36*63f89caaSJens Wiklander 	BPA_SIGN_RECOVER,
37*63f89caaSJens Wiklander 	BPA_VERIFY,
38*63f89caaSJens Wiklander 	BPA_VERIFY_RECOVER,
39*63f89caaSJens Wiklander 	BPA_DERIVE,
40*63f89caaSJens Wiklander 	BPA_EXTRACTABLE,
41*63f89caaSJens Wiklander 	BPA_LOCAL,
42*63f89caaSJens Wiklander 	BPA_NEVER_EXTRACTABLE,
43*63f89caaSJens Wiklander 	BPA_ALWAYS_SENSITIVE,
44*63f89caaSJens Wiklander 	BPA_MODIFIABLE,
45*63f89caaSJens Wiklander 	BPA_COPYABLE,
46*63f89caaSJens Wiklander 	BPA_DESTROYABLE,
47*63f89caaSJens Wiklander 	BPA_ALWAYS_AUTHENTICATE,
48*63f89caaSJens Wiklander 	BPA_WRAP_WITH_TRUSTED,
49*63f89caaSJens Wiklander };
50*63f89caaSJens Wiklander 
51*63f89caaSJens Wiklander /*
52*63f89caaSJens Wiklander  * Header of a serialized memory object inside PKCS11 TA.
53*63f89caaSJens Wiklander  *
54*63f89caaSJens Wiklander  * @attrs_size:	 byte size of the serialized data
55*63f89caaSJens Wiklander  * @attrs_count: number of items in the blob
56*63f89caaSJens Wiklander  * @attrs:	 then starts the blob binary data
57*63f89caaSJens Wiklander  */
58*63f89caaSJens Wiklander struct obj_attrs {
59*63f89caaSJens Wiklander 	uint32_t attrs_size;
60*63f89caaSJens Wiklander 	uint32_t attrs_count;
61*63f89caaSJens Wiklander 	uint8_t attrs[];
62*63f89caaSJens Wiklander };
63*63f89caaSJens Wiklander 
64*63f89caaSJens Wiklander /*
65*63f89caaSJens Wiklander  * init_attributes_head() - Allocate a reference for serialized attributes
66*63f89caaSJens Wiklander  * @head:	*@head holds the retrieved pointer
67*63f89caaSJens Wiklander  *
68*63f89caaSJens Wiklander  * Retrieved pointer can be freed from a simple TEE_Free(reference).
69*63f89caaSJens Wiklander  *
70*63f89caaSJens Wiklander  * Return a PKCS11_OK on success or a PKCS11 return code.
71*63f89caaSJens Wiklander  */
72*63f89caaSJens Wiklander enum pkcs11_rc init_attributes_head(struct obj_attrs **head);
73*63f89caaSJens Wiklander 
74*63f89caaSJens Wiklander /*
75*63f89caaSJens Wiklander  * add_attribute() - Update serialized attributes to add an entry.
76*63f89caaSJens Wiklander  *
77*63f89caaSJens Wiklander  * @head:	*@head points to serialized attributes,
78*63f89caaSJens Wiklander  *		can be reallocated as attributes are added
79*63f89caaSJens Wiklander  * @attribute:	Attribute ID to add
80*63f89caaSJens Wiklander  * @data:	Opaque data of attribute
81*63f89caaSJens Wiklander  * @size:	Size of data
82*63f89caaSJens Wiklander  *
83*63f89caaSJens Wiklander  * Return a PKCS11_OK on success or a PKCS11 return code.
84*63f89caaSJens Wiklander  */
85*63f89caaSJens Wiklander enum pkcs11_rc add_attribute(struct obj_attrs **head, uint32_t attribute,
86*63f89caaSJens Wiklander 			     void *data, size_t size);
87*63f89caaSJens Wiklander 
88*63f89caaSJens Wiklander /*
89*63f89caaSJens Wiklander  * get_attribute_ptrs() - Get pointers to attributes with a given ID
90*63f89caaSJens Wiklander  * @head:	Pointer to serialized attributes
91*63f89caaSJens Wiklander  * @attribute:	Attribute ID to look for
92*63f89caaSJens Wiklander  * @attr:	Array of pointers to the data inside @head
93*63f89caaSJens Wiklander  * @attr_size:	Array of uint32_t holding the sizes of each value pointed to
94*63f89caaSJens Wiklander  *		by @attr
95*63f89caaSJens Wiklander  * @count:	Number of elements in the arrays above
96*63f89caaSJens Wiklander  *
97*63f89caaSJens Wiklander  * If *count == 0, count and return in *count the number of attributes matching
98*63f89caaSJens Wiklander  * the input attribute ID.
99*63f89caaSJens Wiklander  *
100*63f89caaSJens Wiklander  * If *count != 0, return the address and size of the attributes found, up to
101*63f89caaSJens Wiklander  * the occurrence number *count. attr and attr_size are expected large
102*63f89caaSJens Wiklander  * enough. attr is the output array of the values found. attr_size is the
103*63f89caaSJens Wiklander  * output array of the size of each value found.
104*63f89caaSJens Wiklander  *
105*63f89caaSJens Wiklander  * If attr_size != NULL, return in *attr_size attribute value size.
106*63f89caaSJens Wiklander  * If attr != NULL return in *attr the address of the attribute value.
107*63f89caaSJens Wiklander  */
108*63f89caaSJens Wiklander void get_attribute_ptrs(struct obj_attrs *head, uint32_t attribute,
109*63f89caaSJens Wiklander 			void **attr, uint32_t *attr_size, size_t *count);
110*63f89caaSJens Wiklander 
111*63f89caaSJens Wiklander /*
112*63f89caaSJens Wiklander  * get_attribute_ptrs() - Get pointer to the attribute of a given ID
113*63f89caaSJens Wiklander  * @head:	Pointer to serialized attributes
114*63f89caaSJens Wiklander  * @attribute:	Attribute ID
115*63f89caaSJens Wiklander  * @attr:	*@attr holds the retrieved pointer to the attribute value
116*63f89caaSJens Wiklander  * @attr_size:	Size of the attribute value
117*63f89caaSJens Wiklander  *
118*63f89caaSJens Wiklander  * If no matching attributes is found return PKCS11_RV_NOT_FOUND.
119*63f89caaSJens Wiklander  * If attr_size != NULL, return in *attr_size attribute value size.
120*63f89caaSJens Wiklander  * If attr != NULL, return in *attr the address of the attribute value.
121*63f89caaSJens Wiklander  *
122*63f89caaSJens Wiklander  * Return a PKCS11_OK or PKCS11_RV_NOT_FOUND on success, or a PKCS11 return
123*63f89caaSJens Wiklander  * code.
124*63f89caaSJens Wiklander  */
125*63f89caaSJens Wiklander enum pkcs11_rc get_attribute_ptr(struct obj_attrs *head, uint32_t attribute,
126*63f89caaSJens Wiklander 				 void **attr_ptr, uint32_t *attr_size);
127*63f89caaSJens Wiklander /*
128*63f89caaSJens Wiklander  * get_attribute() - Copy out the attribute of a given ID
129*63f89caaSJens Wiklander  * @head:	Pointer to serialized attributes
130*63f89caaSJens Wiklander  * @attribute:	Attribute ID to look for
131*63f89caaSJens Wiklander  * @attr:	holds the retrieved attribute value
132*63f89caaSJens Wiklander  * @attr_size:	Size of the attribute value
133*63f89caaSJens Wiklander  *
134*63f89caaSJens Wiklander  * If attribute is not found, return PKCS11_RV_NOT_FOUND.
135*63f89caaSJens Wiklander  * If attr_size != NULL, check *attr_size matches attributes size and return
136*63f89caaSJens Wiklander  * PKCS11_CKR_BUFFER_TOO_SMALL with expected size in *attr_size.
137*63f89caaSJens Wiklander  * If attr != NULL and attr_size is NULL or gives expected buffer size,
138*63f89caaSJens Wiklander  * copy attribute value into attr.
139*63f89caaSJens Wiklander  *
140*63f89caaSJens Wiklander  * Return a PKCS11_OK or PKCS11_RV_NOT_FOUND on success, or a PKCS11 return
141*63f89caaSJens Wiklander  * code.
142*63f89caaSJens Wiklander  */
143*63f89caaSJens Wiklander enum pkcs11_rc get_attribute(struct obj_attrs *head, uint32_t attribute,
144*63f89caaSJens Wiklander 			     void *attr, uint32_t *attr_size);
145*63f89caaSJens Wiklander 
146*63f89caaSJens Wiklander /*
147*63f89caaSJens Wiklander  * get_u32_attribute() - Copy out the 32-bit attribute value of a given ID
148*63f89caaSJens Wiklander  * @head:	Pointer to serialized attributes
149*63f89caaSJens Wiklander  * @attribute:	Attribute ID
150*63f89caaSJens Wiklander  * @attr:	holds the retrieved 32-bit attribute value
151*63f89caaSJens Wiklander  *
152*63f89caaSJens Wiklander  * If attribute is not found, return PKCS11_RV_NOT_FOUND.
153*63f89caaSJens Wiklander  * If the retreived attribute doesn't have a 4 byte sized value
154*63f89caaSJens Wiklander  * PKCS11_CKR_GENERAL_ERROR is returned.
155*63f89caaSJens Wiklander  *
156*63f89caaSJens Wiklander  * Return a PKCS11_OK or PKCS11_RV_NOT_FOUND on success, or a PKCS11 return
157*63f89caaSJens Wiklander  * code.
158*63f89caaSJens Wiklander  */
159*63f89caaSJens Wiklander 
160*63f89caaSJens Wiklander static inline enum pkcs11_rc get_u32_attribute(struct obj_attrs *head,
161*63f89caaSJens Wiklander 					       uint32_t attribute,
162*63f89caaSJens Wiklander 					       uint32_t *attr)
163*63f89caaSJens Wiklander {
164*63f89caaSJens Wiklander 	uint32_t size = sizeof(uint32_t);
165*63f89caaSJens Wiklander 	enum pkcs11_rc rc = get_attribute(head, attribute, attr, &size);
166*63f89caaSJens Wiklander 
167*63f89caaSJens Wiklander 	if (!rc && size != sizeof(uint32_t))
168*63f89caaSJens Wiklander 		return PKCS11_CKR_GENERAL_ERROR;
169*63f89caaSJens Wiklander 
170*63f89caaSJens Wiklander 	return rc;
171*63f89caaSJens Wiklander }
172*63f89caaSJens Wiklander 
173*63f89caaSJens Wiklander /*
174*63f89caaSJens Wiklander  * get_class() - Get class ID of an object
175*63f89caaSJens Wiklander  * @head:	Pointer to serialized attributes
176*63f89caaSJens Wiklander  *
177*63f89caaSJens Wiklander  * Returns the class ID of an object on succes or returns
178*63f89caaSJens Wiklander  * PKCS11_CKO_UNDEFINED_ID on error.
179*63f89caaSJens Wiklander  */
180*63f89caaSJens Wiklander static inline enum pkcs11_class_id get_class(struct obj_attrs *head)
181*63f89caaSJens Wiklander {
182*63f89caaSJens Wiklander 	uint32_t class = 0;
183*63f89caaSJens Wiklander 	uint32_t size = sizeof(class);
184*63f89caaSJens Wiklander 
185*63f89caaSJens Wiklander 	if (get_attribute(head, PKCS11_CKA_CLASS, &class, &size))
186*63f89caaSJens Wiklander 		return PKCS11_CKO_UNDEFINED_ID;
187*63f89caaSJens Wiklander 
188*63f89caaSJens Wiklander 	return class;
189*63f89caaSJens Wiklander }
190*63f89caaSJens Wiklander 
191*63f89caaSJens Wiklander /*
192*63f89caaSJens Wiklander  * get_key_type() - Get the key type of an object
193*63f89caaSJens Wiklander  * @head:	Pointer to serialized attributes
194*63f89caaSJens Wiklander  *
195*63f89caaSJens Wiklander  * Returns the key type of an object on success or returns
196*63f89caaSJens Wiklander  * PKCS11_CKK_UNDEFINED_ID on error.
197*63f89caaSJens Wiklander  */
198*63f89caaSJens Wiklander static inline enum pkcs11_key_type get_key_type(struct obj_attrs *head)
199*63f89caaSJens Wiklander {
200*63f89caaSJens Wiklander 	uint32_t type = 0;
201*63f89caaSJens Wiklander 	uint32_t size = sizeof(type);
202*63f89caaSJens Wiklander 
203*63f89caaSJens Wiklander 	if (get_attribute(head, PKCS11_CKA_KEY_TYPE, &type, &size))
204*63f89caaSJens Wiklander 		return PKCS11_CKK_UNDEFINED_ID;
205*63f89caaSJens Wiklander 
206*63f89caaSJens Wiklander 	return type;
207*63f89caaSJens Wiklander }
208*63f89caaSJens Wiklander 
209*63f89caaSJens Wiklander /*
210*63f89caaSJens Wiklander  * get_mechanism_type() - Get the mechanism type of an object
211*63f89caaSJens Wiklander  * @head:	Pointer to serialized attributes
212*63f89caaSJens Wiklander  *
213*63f89caaSJens Wiklander  * Returns the mechanism type of an object on success or returns
214*63f89caaSJens Wiklander  * PKCS11_CKM_UNDEFINED_ID on error.
215*63f89caaSJens Wiklander  */
216*63f89caaSJens Wiklander static inline enum pkcs11_mechanism_id get_mechanism_type(struct obj_attrs *head)
217*63f89caaSJens Wiklander {
218*63f89caaSJens Wiklander 	uint32_t type = 0;
219*63f89caaSJens Wiklander 	uint32_t size = sizeof(type);
220*63f89caaSJens Wiklander 
221*63f89caaSJens Wiklander 	if (get_attribute(head, PKCS11_CKA_MECHANISM_TYPE, &type, &size))
222*63f89caaSJens Wiklander 		return PKCS11_CKM_UNDEFINED_ID;
223*63f89caaSJens Wiklander 
224*63f89caaSJens Wiklander 	return type;
225*63f89caaSJens Wiklander }
226*63f89caaSJens Wiklander 
227*63f89caaSJens Wiklander /*
228*63f89caaSJens Wiklander  * get_bool() - Get the bool value of an attribute
229*63f89caaSJens Wiklander  * @head:	Pointer to serialized attributes
230*63f89caaSJens Wiklander  * @attribute:	Attribute ID to look for
231*63f89caaSJens Wiklander  *
232*63f89caaSJens Wiklander  * May assert if attribute ID isn't of the boolean type.
233*63f89caaSJens Wiklander  *
234*63f89caaSJens Wiklander  * Returns the bool value of the supplied attribute ID on success if found
235*63f89caaSJens Wiklander  * else false.
236*63f89caaSJens Wiklander  */
237*63f89caaSJens Wiklander bool get_bool(struct obj_attrs *head, uint32_t attribute);
238*63f89caaSJens Wiklander 
239*63f89caaSJens Wiklander #if CFG_TEE_TA_LOG_LEVEL > 0
240*63f89caaSJens Wiklander /* Debug: dump object attributes to IMSG() trace console */
241*63f89caaSJens Wiklander void trace_attributes(const char *prefix, void *ref);
242*63f89caaSJens Wiklander #else
243*63f89caaSJens Wiklander static inline void trace_attributes(const char *prefix __unused,
244*63f89caaSJens Wiklander 				    void *ref __unused)
245*63f89caaSJens Wiklander {
246*63f89caaSJens Wiklander }
247*63f89caaSJens Wiklander #endif /*CFG_TEE_TA_LOG_LEVEL*/
248*63f89caaSJens Wiklander #endif /*PKCS11_TA_ATTRIBUTES_H*/
249