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