xref: /optee_os/ta/pkcs11/src/processing_aes.c (revision 512cbf1d30ddce3513abf2b08d4063d5c8415a40)
1*512cbf1dSJens Wiklander // SPDX-License-Identifier: BSD-2-Clause
2*512cbf1dSJens Wiklander /*
3*512cbf1dSJens Wiklander  * Copyright (c) 2018-2020, Linaro Limited
4*512cbf1dSJens Wiklander  */
5*512cbf1dSJens Wiklander 
6*512cbf1dSJens Wiklander #include <assert.h>
7*512cbf1dSJens Wiklander #include <compiler.h>
8*512cbf1dSJens Wiklander #include <tee_internal_api.h>
9*512cbf1dSJens Wiklander #include <trace.h>
10*512cbf1dSJens Wiklander #include <util.h>
11*512cbf1dSJens Wiklander 
12*512cbf1dSJens Wiklander #include "pkcs11_helpers.h"
13*512cbf1dSJens Wiklander #include "pkcs11_token.h"
14*512cbf1dSJens Wiklander #include "processing.h"
15*512cbf1dSJens Wiklander #include "serializer.h"
16*512cbf1dSJens Wiklander 
17*512cbf1dSJens Wiklander enum pkcs11_rc tee_init_ctr_operation(struct active_processing *processing,
18*512cbf1dSJens Wiklander 				      void *proc_params, size_t params_size)
19*512cbf1dSJens Wiklander {
20*512cbf1dSJens Wiklander 	struct serialargs args = { };
21*512cbf1dSJens Wiklander 	enum pkcs11_rc rc = PKCS11_CKR_OK;
22*512cbf1dSJens Wiklander 	/* CTR parameters */
23*512cbf1dSJens Wiklander 	uint32_t incr_counter = 0;
24*512cbf1dSJens Wiklander 	void *counter_bits = NULL;
25*512cbf1dSJens Wiklander 
26*512cbf1dSJens Wiklander 	if (!proc_params)
27*512cbf1dSJens Wiklander 		return PKCS11_CKR_ARGUMENTS_BAD;
28*512cbf1dSJens Wiklander 
29*512cbf1dSJens Wiklander 	serialargs_init(&args, proc_params, params_size);
30*512cbf1dSJens Wiklander 
31*512cbf1dSJens Wiklander 	rc = serialargs_get(&args, &incr_counter, sizeof(uint32_t));
32*512cbf1dSJens Wiklander 	if (rc)
33*512cbf1dSJens Wiklander 		return rc;
34*512cbf1dSJens Wiklander 
35*512cbf1dSJens Wiklander 	rc = serialargs_get_ptr(&args, &counter_bits, 16);
36*512cbf1dSJens Wiklander 	if (rc)
37*512cbf1dSJens Wiklander 		return rc;
38*512cbf1dSJens Wiklander 
39*512cbf1dSJens Wiklander 	if (serialargs_remaining_bytes(&args))
40*512cbf1dSJens Wiklander 		return PKCS11_CKR_ARGUMENTS_BAD;
41*512cbf1dSJens Wiklander 
42*512cbf1dSJens Wiklander 	if (incr_counter != 1) {
43*512cbf1dSJens Wiklander 		DMSG("Supports only 1 bit increment counter: %"PRIu32,
44*512cbf1dSJens Wiklander 		     incr_counter);
45*512cbf1dSJens Wiklander 
46*512cbf1dSJens Wiklander 		return PKCS11_CKR_MECHANISM_PARAM_INVALID;
47*512cbf1dSJens Wiklander 	}
48*512cbf1dSJens Wiklander 
49*512cbf1dSJens Wiklander 	TEE_CipherInit(processing->tee_op_handle, counter_bits, 16);
50*512cbf1dSJens Wiklander 
51*512cbf1dSJens Wiklander 	return PKCS11_CKR_OK;
52*512cbf1dSJens Wiklander }
53*512cbf1dSJens Wiklander 
54*512cbf1dSJens Wiklander void tee_release_ctr_operation(struct active_processing *processing __unused)
55*512cbf1dSJens Wiklander {
56*512cbf1dSJens Wiklander }
57