| // SPDX-License-Identifier: BSD-2-Clause |
| /* |
| * Copyright (c) 2014, STMicroelectronics International N.V. |
| * All rights reserved. |
| */ |
| |
| #include "aes_taf.h" |
| #include "aes_impl.h" |
| |
| /* Encryption/decryption key */ |
| const unsigned char key[KEYLENGTH(AES_256)] = { |
| 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, |
| 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, |
| 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, |
| 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f |
| }; |
| |
| /* Encryption/decryption buffer */ |
| unsigned long rk[RKLENGTH(AES_256)]; |
| |
| TEE_Result ta_entry_aes256ecb_encrypt(uint32_t param_types, TEE_Param params[4]) |
| { |
| size_t n_input_blocks = 0; |
| size_t i = 0; |
| |
| /* |
| * It is expected that memRef[0] is input buffer and memRef[1] is |
| * output buffer. |
| */ |
| if (param_types != |
| TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT, |
| TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE, |
| TEE_PARAM_TYPE_NONE)) { |
| return TEE_ERROR_BAD_PARAMETERS; |
| } |
| |
| /* Check that input buffer is whole mult. of block size, in bits */ |
| if ((params[0].memref.size << 8) % AES_BLOCK_SIZE != 0) |
| return TEE_ERROR_BAD_PARAMETERS; |
| |
| /* Check that output buffer is whole mult. of block size, in bits */ |
| if ((params[1].memref.size << 8) % AES_BLOCK_SIZE != 0) |
| return TEE_ERROR_BAD_PARAMETERS; |
| |
| /* Set up for encryption */ |
| (void)rijndaelSetupEncrypt(rk, key, AES_256); |
| |
| n_input_blocks = params[0].memref.size / (AES_BLOCK_SIZE / 8); |
| |
| for (i = 0; i < n_input_blocks; i++) { |
| const unsigned char *ciphertext = params[0].memref.buffer; |
| unsigned char *plaintext = params[1].memref.buffer; |
| |
| rijndaelEncrypt(rk, NROUNDS(AES_256), |
| &ciphertext[i * (AES_BLOCK_SIZE / 8)], |
| &plaintext[i * (AES_BLOCK_SIZE / 8)]); |
| } |
| |
| return TEE_SUCCESS; |
| } |
| |
| TEE_Result ta_entry_aes256ecb_decrypt(uint32_t param_types, TEE_Param params[4]) |
| { |
| size_t n_input_blocks = 0; |
| size_t i = 0; |
| |
| /* |
| * It is expected that memRef[0] is input buffer and memRef[1] is |
| * output buffer. |
| */ |
| if (param_types != |
| TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT, |
| TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE, |
| TEE_PARAM_TYPE_NONE)) { |
| return TEE_ERROR_BAD_PARAMETERS; |
| } |
| |
| /* Check that input buffer is whole mult. of block size, in bits */ |
| if ((params[0].memref.size << 8) % AES_BLOCK_SIZE != 0) |
| return TEE_ERROR_BAD_PARAMETERS; |
| |
| /* Check that output buffer is whole mult. of block size, in bits */ |
| if ((params[1].memref.size << 8) % AES_BLOCK_SIZE != 0) |
| return TEE_ERROR_BAD_PARAMETERS; |
| |
| /* Set up for decryption */ |
| (void)rijndaelSetupDecrypt(rk, key, AES_256); |
| |
| n_input_blocks = params[0].memref.size / (AES_BLOCK_SIZE / 8); |
| |
| for (i = 0; i < n_input_blocks; i++) { |
| const unsigned char *ciphertext = params[0].memref.buffer; |
| unsigned char *plaintext = params[1].memref.buffer; |
| |
| rijndaelDecrypt(rk, NROUNDS(AES_256), |
| &ciphertext[i * (AES_BLOCK_SIZE / 8)], |
| &plaintext[i * (AES_BLOCK_SIZE / 8)]); |
| } |
| |
| return TEE_SUCCESS; |
| } |