rust-libutee 0.1.0

Rust library for UTEE-related functionality.
Documentation
use crate::{
    tee_api_defines::{
        TEE_NUM_PARAMS, TEE_PARAM_TYPE_GET, TEE_PARAM_TYPE_MEMREF_INOUT,
        TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_VALUE_INOUT,
        TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_VALUE_OUTPUT,
    },
    tee_api_types::{Memref, TEE_Param},
    utee_types::utee_params,
};

pub(crate) fn copy_param(
    up: &mut utee_params,
    paramTypes: u32,
    params: *mut [TEE_Param; TEE_NUM_PARAMS as usize],
) {
    up.types = paramTypes as u64;
    let params = unsafe { &mut *params };
    for i in 0..TEE_NUM_PARAMS as usize {
        let (a, b) = match TEE_PARAM_TYPE_GET(paramTypes, i as u32) {
            TEE_PARAM_TYPE_VALUE_INPUT | TEE_PARAM_TYPE_VALUE_INOUT => unsafe {
                (params[i].value.a as u64, params[i].value.b as u64)
            },
            TEE_PARAM_TYPE_MEMREF_OUTPUT
            | TEE_PARAM_TYPE_MEMREF_INOUT
            | TEE_PARAM_TYPE_MEMREF_INPUT => unsafe {
                let memref = params[i].memref;
                let buffer_ptr = memref.buffer as u64;
                (buffer_ptr, memref.size as u64)
            },
            _ => (0, 0),
        };

        up.vals[i * 2] = a;
        up.vals[i * 2 + 1] = b;
    }
}

pub(crate) fn update_out_param(
    params: *mut [TEE_Param; TEE_NUM_PARAMS as usize],
    up: &utee_params,
) {
    let params = unsafe { &mut *params };
    for i in 0..TEE_NUM_PARAMS as usize {
        let a = up.vals[i * 2];
        let b = up.vals[i * 2 + 1];
        match TEE_PARAM_TYPE_GET(up.types as u32, i as u32) {
            TEE_PARAM_TYPE_VALUE_OUTPUT | TEE_PARAM_TYPE_VALUE_INOUT => {
                params[i].value.a = a as u32;
                params[i].value.b = b as u32;
            }
            TEE_PARAM_TYPE_MEMREF_OUTPUT | TEE_PARAM_TYPE_MEMREF_INOUT => {
                params[i].memref = Memref {
                    buffer: a as _,
                    size: b as usize,
                }
            }
            _ => {}
        };
    }
}