TEE_Result cmd_process(uint32_t param_types, TEE_Param params[4]) { TEE_Result res; int n; void *in, *out; uint32_t insz; uint32_t outsz; uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INOUT, TEE_PARAM_TYPE_MEMREF_INOUT, TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE); if (param_types != exp_param_types) return TEE_ERROR_BAD_PARAMETERS; in = params[0].memref.buffer; insz = params[0].memref.size; out = params[1].memref.buffer; outsz = params[1].memref.size; n = params[2].value.a; while (n--) { res = TEE_CipherUpdate(crypto_op, in, insz, out, &outsz); CHECK(res, "TEE_CipherUpdate", return res;); }
TEE_Result ta_entry_cipher_update(uint32_t param_type, TEE_Param params[4]) { ASSERT_PARAM_TYPE(TEE_PARAM_TYPES (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE)); return TEE_CipherUpdate((TEE_OperationHandle) params[0].value.a, params[1].memref.buffer, params[1].memref.size, params[2].memref.buffer, ¶ms[2].memref.size); }
TEE_Result crypt_cipher_interface(TEE_OperationHandle operation, const void *message, size_t message_len, void *cipher, size_t *cipher_len, const void *IV, size_t IVLen) { TEE_Result res = TEE_ERROR_GENERIC; void * src = (void *)message; void * dst = (void *)cipher; size_t process_len = message_len; size_t block_size = operation->block_size; TEE_Printf("[info] operation->block_size = 0x%x\n", block_size); TEE_CipherInit(operation, IV, IVLen); if( process_len < block_size) { return res; } switch(0) { case 0: res = TEE_CipherDoFinal(operation, src, process_len, dst, &process_len); // dst_len >= sum(src_len) if (res != TEE_SUCCESS) { TEE_Printf("[err] TEE_CipherDoFinal\n"); return res; } *cipher_len = process_len; break; case 1: // using TEE_CipherUpdate default: process_len -= block_size; res = TEE_CipherUpdate(operation, src, process_len, dst, &process_len); if (res != TEE_SUCCESS) { TEE_Printf("[err] TEE_CipherDoFinal\n"); return res; } // last block res = TEE_CipherDoFinal(operation, src+process_len, block_size, dst+process_len, &block_size); // dst_len >= sum(src_len) if (res != TEE_SUCCESS) { TEE_Printf("[err] TEE_CipherDoFinal\n"); return res; } *cipher_len = process_len + block_size; } return res; }