193e678edSClement Faure // SPDX-License-Identifier: BSD-2-Clause
293e678edSClement Faure /*
393e678edSClement Faure * Copyright 2020 NXP
493e678edSClement Faure */
593e678edSClement Faure #include <dcp_utils.h>
693e678edSClement Faure #include <drivers/imx/dcp.h>
7*8e155baeSVesa Jääskeläinen #include <kernel/tee_misc.h>
893e678edSClement Faure #include <malloc.h>
993e678edSClement Faure #include <mm/core_memprot.h>
1093e678edSClement Faure #include <string.h>
1193e678edSClement Faure #include <trace.h>
1293e678edSClement Faure
dcp_calloc_align_buf(struct dcp_align_buf * buf,size_t size)1393e678edSClement Faure TEE_Result dcp_calloc_align_buf(struct dcp_align_buf *buf, size_t size)
1493e678edSClement Faure {
1593e678edSClement Faure if (!buf) {
1693e678edSClement Faure EMSG("Error, buf is null");
1793e678edSClement Faure return TEE_ERROR_BAD_PARAMETERS;
1893e678edSClement Faure }
1993e678edSClement Faure
20*8e155baeSVesa Jääskeläinen buf->data = alloc_cache_aligned(size);
2193e678edSClement Faure if (!buf->data)
2293e678edSClement Faure return TEE_ERROR_OUT_OF_MEMORY;
2393e678edSClement Faure
2493e678edSClement Faure buf->paddr = virt_to_phys(buf->data);
2593e678edSClement Faure
2693e678edSClement Faure if (!buf->paddr) {
2793e678edSClement Faure dcp_free(buf);
2893e678edSClement Faure return TEE_ERROR_OUT_OF_MEMORY;
2993e678edSClement Faure }
3093e678edSClement Faure
3193e678edSClement Faure buf->size = size;
3293e678edSClement Faure
3393e678edSClement Faure return TEE_SUCCESS;
3493e678edSClement Faure }
3593e678edSClement Faure
dcp_free(struct dcp_align_buf * buf)3693e678edSClement Faure void dcp_free(struct dcp_align_buf *buf)
3793e678edSClement Faure {
3893e678edSClement Faure free(buf->data);
3993e678edSClement Faure }
4093e678edSClement Faure
dcp_left_shift_buffer(uint8_t * input,uint8_t * result,size_t buffer_size)4193e678edSClement Faure void dcp_left_shift_buffer(uint8_t *input, uint8_t *result, size_t buffer_size)
4293e678edSClement Faure {
4393e678edSClement Faure unsigned int i = 0;
4493e678edSClement Faure uint8_t overflow = 0;
4593e678edSClement Faure
4693e678edSClement Faure /* For each byte */
4793e678edSClement Faure for (i = 0; i < buffer_size; i++) {
4893e678edSClement Faure /* Left shift a bytes by one */
4993e678edSClement Faure result[buffer_size - 1 - i] =
5093e678edSClement Faure input[buffer_size - 1 - i] << 1 | overflow;
5193e678edSClement Faure
5293e678edSClement Faure overflow = input[buffer_size - 1 - i] >> 7;
5393e678edSClement Faure }
5493e678edSClement Faure }
5593e678edSClement Faure
dcp_udelay(uint32_t time)5693e678edSClement Faure void dcp_udelay(uint32_t time)
5793e678edSClement Faure {
5893e678edSClement Faure uint32_t counter = time * 500;
5993e678edSClement Faure
6093e678edSClement Faure /* Implementation of a Software loop assuming CPU clock of 500MHz */
6193e678edSClement Faure while (counter--) {
6293e678edSClement Faure isb();
6393e678edSClement Faure dsb();
6493e678edSClement Faure };
6593e678edSClement Faure }
6693e678edSClement Faure
dcp_reverse(uint8_t * in,uint8_t * out,size_t size)6793e678edSClement Faure void dcp_reverse(uint8_t *in, uint8_t *out, size_t size)
6893e678edSClement Faure {
6993e678edSClement Faure unsigned int i = 0;
7093e678edSClement Faure
7193e678edSClement Faure for (i = 0; i < size; i++)
7293e678edSClement Faure out[i] = in[size - 1 - i];
7393e678edSClement Faure }
7493e678edSClement Faure
dcp_xor(uint8_t * a,uint8_t * b,uint8_t * out,size_t size)7593e678edSClement Faure void dcp_xor(uint8_t *a, uint8_t *b, uint8_t *out, size_t size)
7693e678edSClement Faure {
7793e678edSClement Faure unsigned int i = 0;
7893e678edSClement Faure
7993e678edSClement Faure for (i = 0; i < size; i++)
8093e678edSClement Faure out[i] = a[i] ^ b[i];
8193e678edSClement Faure }
8293e678edSClement Faure
dcp_cmac_padding(uint8_t * block,size_t len)8393e678edSClement Faure void dcp_cmac_padding(uint8_t *block, size_t len)
8493e678edSClement Faure {
8593e678edSClement Faure unsigned int i = 0;
8693e678edSClement Faure
8793e678edSClement Faure for (i = len; i < DCP_AES128_BLOCK_SIZE; i++) {
8893e678edSClement Faure if (i == len)
8993e678edSClement Faure block[i] = BIT(7);
9093e678edSClement Faure else
9193e678edSClement Faure block[i] = 0x0;
9293e678edSClement Faure }
9393e678edSClement Faure }
94