1*5da36a24SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause 2*5da36a24SJens Wiklander /* 3*5da36a24SJens Wiklander * Copyright (c) 2014-2019, Linaro Limited 4*5da36a24SJens Wiklander */ 5*5da36a24SJens Wiklander 6*5da36a24SJens Wiklander #include <assert.h> 7*5da36a24SJens Wiklander #include <crypto/crypto.h> 8*5da36a24SJens Wiklander #include <crypto/crypto_impl.h> 9*5da36a24SJens Wiklander #include <stdlib.h> 10*5da36a24SJens Wiklander #include <string.h> 11*5da36a24SJens Wiklander #include <tee_api_types.h> 12*5da36a24SJens Wiklander #include <tomcrypt.h> 13*5da36a24SJens Wiklander #include <utee_defines.h> 14*5da36a24SJens Wiklander #include <util.h> 15*5da36a24SJens Wiklander 16*5da36a24SJens Wiklander struct ltc_omac_ctx { 17*5da36a24SJens Wiklander struct crypto_mac_ctx ctx; 18*5da36a24SJens Wiklander int cipher_idx; 19*5da36a24SJens Wiklander omac_state state; 20*5da36a24SJens Wiklander }; 21*5da36a24SJens Wiklander 22*5da36a24SJens Wiklander static const struct crypto_mac_ops ltc_omac_ops; 23*5da36a24SJens Wiklander 24*5da36a24SJens Wiklander static struct ltc_omac_ctx *to_omac_ctx(struct crypto_mac_ctx *ctx) 25*5da36a24SJens Wiklander { 26*5da36a24SJens Wiklander assert(ctx && ctx->ops == <c_omac_ops); 27*5da36a24SJens Wiklander 28*5da36a24SJens Wiklander return container_of(ctx, struct ltc_omac_ctx, ctx); 29*5da36a24SJens Wiklander } 30*5da36a24SJens Wiklander 31*5da36a24SJens Wiklander static TEE_Result ltc_omac_init(struct crypto_mac_ctx *ctx, const uint8_t *key, 32*5da36a24SJens Wiklander size_t len) 33*5da36a24SJens Wiklander { 34*5da36a24SJens Wiklander struct ltc_omac_ctx *hc = to_omac_ctx(ctx); 35*5da36a24SJens Wiklander 36*5da36a24SJens Wiklander if (omac_init(&hc->state, hc->cipher_idx, key, len) == CRYPT_OK) 37*5da36a24SJens Wiklander return TEE_SUCCESS; 38*5da36a24SJens Wiklander else 39*5da36a24SJens Wiklander return TEE_ERROR_BAD_STATE; 40*5da36a24SJens Wiklander } 41*5da36a24SJens Wiklander 42*5da36a24SJens Wiklander static TEE_Result ltc_omac_update(struct crypto_mac_ctx *ctx, 43*5da36a24SJens Wiklander const uint8_t *data, size_t len) 44*5da36a24SJens Wiklander { 45*5da36a24SJens Wiklander if (omac_process(&to_omac_ctx(ctx)->state, data, len) == CRYPT_OK) 46*5da36a24SJens Wiklander return TEE_SUCCESS; 47*5da36a24SJens Wiklander else 48*5da36a24SJens Wiklander return TEE_ERROR_BAD_STATE; 49*5da36a24SJens Wiklander } 50*5da36a24SJens Wiklander 51*5da36a24SJens Wiklander static TEE_Result ltc_omac_final(struct crypto_mac_ctx *ctx, uint8_t *digest, 52*5da36a24SJens Wiklander size_t len) 53*5da36a24SJens Wiklander { 54*5da36a24SJens Wiklander unsigned long l = len; 55*5da36a24SJens Wiklander 56*5da36a24SJens Wiklander if (omac_done(&to_omac_ctx(ctx)->state, digest, &l) == CRYPT_OK) 57*5da36a24SJens Wiklander return TEE_SUCCESS; 58*5da36a24SJens Wiklander else 59*5da36a24SJens Wiklander return TEE_ERROR_BAD_STATE; 60*5da36a24SJens Wiklander } 61*5da36a24SJens Wiklander 62*5da36a24SJens Wiklander static void ltc_omac_free_ctx(struct crypto_mac_ctx *ctx) 63*5da36a24SJens Wiklander { 64*5da36a24SJens Wiklander free(to_omac_ctx(ctx)); 65*5da36a24SJens Wiklander } 66*5da36a24SJens Wiklander 67*5da36a24SJens Wiklander static void ltc_omac_copy_state(struct crypto_mac_ctx *dst_ctx, 68*5da36a24SJens Wiklander struct crypto_mac_ctx *src_ctx) 69*5da36a24SJens Wiklander { 70*5da36a24SJens Wiklander struct ltc_omac_ctx *src = to_omac_ctx(src_ctx); 71*5da36a24SJens Wiklander struct ltc_omac_ctx *dst = to_omac_ctx(dst_ctx); 72*5da36a24SJens Wiklander 73*5da36a24SJens Wiklander assert(src->cipher_idx == dst->cipher_idx); 74*5da36a24SJens Wiklander dst->state = src->state; 75*5da36a24SJens Wiklander } 76*5da36a24SJens Wiklander 77*5da36a24SJens Wiklander static const struct crypto_mac_ops ltc_omac_ops = { 78*5da36a24SJens Wiklander .init = ltc_omac_init, 79*5da36a24SJens Wiklander .update = ltc_omac_update, 80*5da36a24SJens Wiklander .final = ltc_omac_final, 81*5da36a24SJens Wiklander .free_ctx = ltc_omac_free_ctx, 82*5da36a24SJens Wiklander .copy_state = ltc_omac_copy_state, 83*5da36a24SJens Wiklander }; 84*5da36a24SJens Wiklander 85*5da36a24SJens Wiklander TEE_Result crypto_aes_cmac_alloc_ctx(struct crypto_mac_ctx **ctx_ret) 86*5da36a24SJens Wiklander { 87*5da36a24SJens Wiklander struct ltc_omac_ctx *ctx = NULL; 88*5da36a24SJens Wiklander int cipher_idx = find_cipher("aes"); 89*5da36a24SJens Wiklander 90*5da36a24SJens Wiklander if (cipher_idx < 0) 91*5da36a24SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 92*5da36a24SJens Wiklander 93*5da36a24SJens Wiklander ctx = calloc(1, sizeof(*ctx)); 94*5da36a24SJens Wiklander if (!ctx) 95*5da36a24SJens Wiklander return TEE_ERROR_OUT_OF_MEMORY; 96*5da36a24SJens Wiklander 97*5da36a24SJens Wiklander ctx->ctx.ops = <c_omac_ops; 98*5da36a24SJens Wiklander ctx->cipher_idx = cipher_idx; 99*5da36a24SJens Wiklander *ctx_ret = &ctx->ctx; 100*5da36a24SJens Wiklander 101*5da36a24SJens Wiklander return TEE_SUCCESS; 102*5da36a24SJens Wiklander } 103