xref: /optee_os/ta/pkcs11/src/pkcs11_attributes.h (revision 9e91a619a03fd01c1744986a56843f4da105a060)
163f89caaSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
263f89caaSJens Wiklander /*
363f89caaSJens Wiklander  * Copyright (c) 2017-2020, Linaro Limited
463f89caaSJens Wiklander  */
563f89caaSJens Wiklander 
663f89caaSJens Wiklander #ifndef PKCS11_TA_PKCS11_ATTRIBUTES_H
763f89caaSJens Wiklander #define PKCS11_TA_PKCS11_ATTRIBUTES_H
863f89caaSJens Wiklander 
963f89caaSJens Wiklander #include <inttypes.h>
1063f89caaSJens Wiklander 
1163f89caaSJens Wiklander #include "serializer.h"
1263f89caaSJens Wiklander 
1363f89caaSJens Wiklander struct obj_attrs;
1463f89caaSJens Wiklander struct pkcs11_object;
1563f89caaSJens Wiklander struct pkcs11_session;
1663f89caaSJens Wiklander 
1763f89caaSJens Wiklander /*
1863f89caaSJens Wiklander  * PKCS#11 directives on object attributes.
1963f89caaSJens Wiklander  * Those with a '*' are optional, other must be defined, either by caller
2063f89caaSJens Wiklander  * or by some known default value.
2163f89caaSJens Wiklander  *
2263f89caaSJens Wiklander  * [all] objects:	class
2363f89caaSJens Wiklander  *
2463f89caaSJens Wiklander  * [stored] objects:	persistent, need_authen, modifiable, copyable,
2563f89caaSJens Wiklander  *			destroyable, label*.
2663f89caaSJens Wiklander  *
2763f89caaSJens Wiklander  * [data] objects:	[all], [stored], application_id*, object_id*, value.
2863f89caaSJens Wiklander  *
2963f89caaSJens Wiklander  * [key] objects:	[all], [stored], type, id*, start_date/end_date*,
3063f89caaSJens Wiklander  *			derive, local, allowed_mechanisms*.
3163f89caaSJens Wiklander  *
3263f89caaSJens Wiklander  * [symm-key]:		[key], sensitive, encrypt, decrypt, sign, verify, wrap,
3363f89caaSJens Wiklander  *			unwrap, extractable, wrap_with_trusted, trusted,
3463f89caaSJens Wiklander  *			wrap_template, unwrap_template, derive_template.
3563f89caaSJens Wiklander  */
3663f89caaSJens Wiklander 
3763f89caaSJens Wiklander /*
3863f89caaSJens Wiklander  * Utils to check compliance of attributes at various processing steps.
3963f89caaSJens Wiklander  * Any processing operation is exclusively one of the following.
4063f89caaSJens Wiklander  *
4163f89caaSJens Wiklander  * Case 1: Create a secret from some local random value (C_CreateKey & friends)
4263f89caaSJens Wiklander  * - client provides an attributes list template, PKCS11 TA completes with
4363f89caaSJens Wiklander  *   default attribute values. Object is created if attributes are
4463f89caaSJens Wiklander  *   consistent and comply token/session state.
4563f89caaSJens Wiklander  * - PKCS11 sequence:
4663f89caaSJens Wiklander  *   - check/set token/session state
4763f89caaSJens Wiklander  *   - create an attribute list from client template and default values.
4863f89caaSJens Wiklander  *   - check new secret attributes complies requested mechanism.
4963f89caaSJens Wiklander  *   - check new secret attributes complies token/session state.
5063f89caaSJens Wiklander  *   - Generate the value for the secret.
5163f89caaSJens Wiklander  *   - Set some runtime attributes in the new secret.
5263f89caaSJens Wiklander  *   - Register the new secret and return a handle for it.
5363f89caaSJens Wiklander  *
5463f89caaSJens Wiklander  * Case 2: Create a secret from a client clear data (C_CreateObject)
5563f89caaSJens Wiklander  * - client provides an attributes list template, PKCS11 TA completes with
5663f89caaSJens Wiklander  *   default attribute values. Object is created if attributes are
5763f89caaSJens Wiklander  *   consistent and comply token/session state.
5863f89caaSJens Wiklander  *   - check/set token/session state
5963f89caaSJens Wiklander  *   - create an attribute list from client template and default values.
6063f89caaSJens Wiklander  *   - check new secret attributes complies requested mechanism (raw-import).
6163f89caaSJens Wiklander  *   - check new secret attributes complies token/session state.
6263f89caaSJens Wiklander  *   - Set some runtime attributes in the new secret.
6363f89caaSJens Wiklander  *   - Register the new secret and return a handle for it.
6463f89caaSJens Wiklander 
6563f89caaSJens Wiklander  * Case 3: Use a secret for data processing
6663f89caaSJens Wiklander  * - client provides a mechanism ID and the secret handle.
6763f89caaSJens Wiklander  * - PKCS11 checks mechanism and secret comply, if mechanism and token/session
6863f89caaSJens Wiklander  *   state comply and last if secret and token/session state comply.
6963f89caaSJens Wiklander  *   - check/set token/session state
7063f89caaSJens Wiklander  *   - check secret's parent attributes complies requested processing.
7163f89caaSJens Wiklander  *   - check secret's parent attributes complies token/session state.
7263f89caaSJens Wiklander  *   - check new secret attributes complies secret's parent attributes.
7363f89caaSJens Wiklander  *   - check new secret attributes complies requested mechanism.
7463f89caaSJens Wiklander  *   - check new secret attributes complies token/session state.
7563f89caaSJens Wiklander  *
7663f89caaSJens Wiklander  * Case 4: Create a secret from a client template and a secret's parent
7763f89caaSJens Wiklander  * (i.e derive a symmetric key)
7863f89caaSJens Wiklander  * - client args: new-key template, mechanism ID, parent-key handle.
7963f89caaSJens Wiklander  * - PKCS11 create a new-key attribute list based on template + default values +
8063f89caaSJens Wiklander  *   inheritance from the parent key attributes.
8163f89caaSJens Wiklander  * - PKCS11 checks:
8263f89caaSJens Wiklander  *   - token/session state
8363f89caaSJens Wiklander  *   - parent-key vs mechanism
8463f89caaSJens Wiklander  *   - parent-key vs token/session state
8563f89caaSJens Wiklander  *   - parent-key vs new-key
8663f89caaSJens Wiklander  *   - new-key vs mechanism
8763f89caaSJens Wiklander  *   - new-key vs token/session state
8863f89caaSJens Wiklander  * - then do processing
8963f89caaSJens Wiklander  * - then finalize object creation
9063f89caaSJens Wiklander  */
9163f89caaSJens Wiklander 
9263f89caaSJens Wiklander enum processing_func {
9363f89caaSJens Wiklander 	PKCS11_FUNCTION_DIGEST,
9463f89caaSJens Wiklander 	PKCS11_FUNCTION_GENERATE,
9563f89caaSJens Wiklander 	PKCS11_FUNCTION_GENERATE_PAIR,
9663f89caaSJens Wiklander 	PKCS11_FUNCTION_DERIVE,
9763f89caaSJens Wiklander 	PKCS11_FUNCTION_WRAP,
9863f89caaSJens Wiklander 	PKCS11_FUNCTION_UNWRAP,
9963f89caaSJens Wiklander 	PKCS11_FUNCTION_ENCRYPT,
10063f89caaSJens Wiklander 	PKCS11_FUNCTION_DECRYPT,
10163f89caaSJens Wiklander 	PKCS11_FUNCTION_SIGN,
10263f89caaSJens Wiklander 	PKCS11_FUNCTION_VERIFY,
10363f89caaSJens Wiklander 	PKCS11_FUNCTION_SIGN_RECOVER,
10463f89caaSJens Wiklander 	PKCS11_FUNCTION_VERIFY_RECOVER,
10563f89caaSJens Wiklander 	PKCS11_FUNCTION_IMPORT,
10663f89caaSJens Wiklander 	PKCS11_FUNCTION_COPY,
10763f89caaSJens Wiklander 	PKCS11_FUNCTION_MODIFY,
10863f89caaSJens Wiklander 	PKCS11_FUNCTION_DESTROY,
109eb6141b6SVesa Jääskeläinen 	PKCS11_FUNCTION_UNKNOWN,
11063f89caaSJens Wiklander };
11163f89caaSJens Wiklander 
11263f89caaSJens Wiklander enum processing_step {
11363f89caaSJens Wiklander 	PKCS11_FUNC_STEP_INIT,
11463f89caaSJens Wiklander 	PKCS11_FUNC_STEP_ONESHOT,
11563f89caaSJens Wiklander 	PKCS11_FUNC_STEP_UPDATE,
116*9e91a619SVesa Jääskeläinen 	PKCS11_FUNC_STEP_UPDATE_KEY,
11763f89caaSJens Wiklander 	PKCS11_FUNC_STEP_FINAL,
11863f89caaSJens Wiklander };
11963f89caaSJens Wiklander 
12063f89caaSJens Wiklander /* Create an attribute list for a new object */
12163f89caaSJens Wiklander enum pkcs11_rc
12263f89caaSJens Wiklander create_attributes_from_template(struct obj_attrs **out, void *template,
12363f89caaSJens Wiklander 				size_t template_size, struct obj_attrs *parent,
12463f89caaSJens Wiklander 				enum processing_func func,
1254cfce748SRuchika Gupta 				enum pkcs11_mechanism_id proc_mecha,
1264cfce748SRuchika Gupta 				enum pkcs11_class_id template_class);
12763f89caaSJens Wiklander 
12863f89caaSJens Wiklander /*
12963f89caaSJens Wiklander  * The various checks to be performed before a processing:
13063f89caaSJens Wiklander  * - create a new object in the current token state
13163f89caaSJens Wiklander  * - use a parent object in the processing
13263f89caaSJens Wiklander  * - use a mechanism with provided configuration
13363f89caaSJens Wiklander  */
13463f89caaSJens Wiklander enum pkcs11_rc check_created_attrs_against_token(struct pkcs11_session *session,
13563f89caaSJens Wiklander 						 struct obj_attrs *head);
13663f89caaSJens Wiklander 
13763f89caaSJens Wiklander enum pkcs11_rc check_created_attrs_against_processing(uint32_t proc_id,
13863f89caaSJens Wiklander 						      struct obj_attrs *head);
13963f89caaSJens Wiklander 
140512cbf1dSJens Wiklander enum pkcs11_rc check_created_attrs(struct obj_attrs *key1,
141512cbf1dSJens Wiklander 				   struct obj_attrs *key2);
142512cbf1dSJens Wiklander 
143512cbf1dSJens Wiklander /*
144512cbf1dSJens Wiklander  * Check the attributes of the parent secret (key) used in the processing
145512cbf1dSJens Wiklander  * do match the target processing.
146512cbf1dSJens Wiklander  *
147512cbf1dSJens Wiklander  * @proc_id - PKCS11_CKM_xxx
148512cbf1dSJens Wiklander  * @func - identifier of the processing function operated with @proc_id.
149512cbf1dSJens Wiklander  * @head - head of the attributes of parent object.
150512cbf1dSJens Wiklander  */
151512cbf1dSJens Wiklander enum pkcs11_rc
152512cbf1dSJens Wiklander check_parent_attrs_against_processing(enum pkcs11_mechanism_id proc_id,
153512cbf1dSJens Wiklander 				      enum processing_func func,
154512cbf1dSJens Wiklander 				      struct obj_attrs *head);
155512cbf1dSJens Wiklander 
156512cbf1dSJens Wiklander enum pkcs11_rc check_access_attrs_against_token(struct pkcs11_session *session,
157512cbf1dSJens Wiklander 						struct obj_attrs *head);
158512cbf1dSJens Wiklander 
159512cbf1dSJens Wiklander enum pkcs11_rc
160512cbf1dSJens Wiklander check_mechanism_against_processing(struct pkcs11_session *session,
161512cbf1dSJens Wiklander 				   enum pkcs11_mechanism_id mechanism_type,
162512cbf1dSJens Wiklander 				   enum processing_func function,
163512cbf1dSJens Wiklander 				   enum processing_step step);
164512cbf1dSJens Wiklander 
165783c1515SRuchika Gupta bool attribute_is_exportable(struct pkcs11_attribute_head *req_attr,
166783c1515SRuchika Gupta 			     struct pkcs11_object *obj);
167783c1515SRuchika Gupta 
16889735787SRuchika Gupta bool object_is_private(struct obj_attrs *head);
16989735787SRuchika Gupta 
1702d25a9bcSRuchika Gupta bool object_is_token(struct obj_attrs *head);
1712d25a9bcSRuchika Gupta 
1722d25a9bcSRuchika Gupta bool object_is_modifiable(struct obj_attrs *head);
1732d25a9bcSRuchika Gupta 
1742d25a9bcSRuchika Gupta bool object_is_copyable(struct obj_attrs *head);
1752d25a9bcSRuchika Gupta 
1762d25a9bcSRuchika Gupta /*
1772d25a9bcSRuchika Gupta  * Check the attributes passed in template against the attributes which can be
1782d25a9bcSRuchika Gupta  * modified. These are the attributes marked with * 8,10,11 or 12 in Table 10
1792d25a9bcSRuchika Gupta  * in PKCS #11 Cryptographic Token InterfaceBase Specification Version 2.40.
1802d25a9bcSRuchika Gupta  * Few attributes not with this marking but explicitly specified as modifiable
1812d25a9bcSRuchika Gupta  * in footnote of their tables are also considered to be modifiable
1822d25a9bcSRuchika Gupta  */
1832d25a9bcSRuchika Gupta enum pkcs11_rc check_attrs_against_modification(struct pkcs11_session *session,
1842d25a9bcSRuchika Gupta 						struct obj_attrs *head,
1852d25a9bcSRuchika Gupta 						struct pkcs11_object *obj,
1862d25a9bcSRuchika Gupta 						enum processing_func function);
1872d25a9bcSRuchika Gupta 
1888c499324SRuchika Gupta enum pkcs11_rc set_key_data(struct obj_attrs **head, void *data,
1898c499324SRuchika Gupta 			    size_t key_size);
1908c499324SRuchika Gupta 
19163f89caaSJens Wiklander #endif /*PKCS11_TA_PKCS11_ATTRIBUTES_H*/
192