Ejemplo n.º 1
0
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;);
	}
Ejemplo n.º 2
0
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,
				&params[2].memref.size);
}
Ejemplo n.º 3
0
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;
}