1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2017, Linaro Limited 4 */ 5 6 #include <assert.h> 7 #include <crypto/crypto.h> 8 #include <crypto/internal_aes-gcm.h> 9 #include <string.h> 10 #include <tee_api_types.h> 11 #include <types_ext.h> 12 13 #include "aes-gcm-private.h" 14 15 void __weak internal_aes_gcm_set_key(struct internal_aes_gcm_state *state, 16 const struct internal_aes_gcm_key *ek) 17 { 18 #ifdef CFG_AES_GCM_TABLE_BASED 19 internal_aes_gcm_ghash_gen_tbl(state, ek); 20 #else 21 internal_aes_gcm_encrypt_block(ek, state->ctr, state->hash_subkey); 22 #endif 23 } 24 25 void __weak internal_aes_gcm_ghash_update(struct internal_aes_gcm_state *state, 26 const void *head, const void *data, 27 size_t num_blocks) 28 { 29 size_t n; 30 31 if (head) 32 internal_aes_gcm_ghash_update_block(state, head); 33 34 for (n = 0; n < num_blocks; n++) 35 internal_aes_gcm_ghash_update_block(state, (uint8_t *)data + 36 n * TEE_AES_BLOCK_SIZE); 37 } 38 39 void __weak 40 internal_aes_gcm_update_payload_block_aligned( 41 struct internal_aes_gcm_state *state, 42 const struct internal_aes_gcm_key *ek, 43 TEE_OperationMode m, const void *src, 44 size_t num_blocks, void *dst) 45 { 46 size_t n; 47 const uint8_t *s = src; 48 uint8_t *d = dst; 49 void *ctr = state->ctr; 50 void *buf_cryp = state->buf_cryp; 51 52 assert(!state->buf_pos && num_blocks && 53 internal_aes_gcm_ptr_is_block_aligned(s) && 54 internal_aes_gcm_ptr_is_block_aligned(d)); 55 56 for (n = 0; n < num_blocks; n++) { 57 if (m == TEE_MODE_ENCRYPT) { 58 internal_aes_gcm_xor_block(buf_cryp, s); 59 internal_aes_gcm_ghash_update(state, buf_cryp, NULL, 0); 60 memcpy(d, buf_cryp, sizeof(state->buf_cryp)); 61 62 internal_aes_gcm_encrypt_block(ek, ctr, buf_cryp); 63 internal_aes_gcm_inc_ctr(state); 64 } else { 65 internal_aes_gcm_encrypt_block(ek, ctr, buf_cryp); 66 67 internal_aes_gcm_xor_block(buf_cryp, s); 68 internal_aes_gcm_ghash_update(state, s, NULL, 0); 69 memcpy(d, buf_cryp, sizeof(state->buf_cryp)); 70 71 internal_aes_gcm_inc_ctr(state); 72 } 73 s += TEE_AES_BLOCK_SIZE; 74 d += TEE_AES_BLOCK_SIZE; 75 } 76 } 77 78 void __weak 79 internal_aes_gcm_encrypt_block(const struct internal_aes_gcm_key *ek, 80 const void *src, void *dst) 81 { 82 size_t ek_len = sizeof(ek->data); 83 84 crypto_aes_enc_block(ek->data, ek_len, ek->rounds, src, dst); 85 } 86 87 TEE_Result __weak 88 internal_aes_gcm_expand_enc_key(const void *key, size_t key_len, 89 struct internal_aes_gcm_key *ek) 90 { 91 size_t ek_len = sizeof(ek->data); 92 93 return crypto_aes_expand_enc_key(key, key_len, ek->data, ek_len, 94 &ek->rounds); 95 } 96