parasol_cpu 0.10.0

This crate contains the Parasol CPU, which runs programs over a mix of encrypted and plaintext data.
Documentation
use std::sync::Arc;

use crate::{
    ArgsBuilder, Memory,
    proc::IsaOp,
    register_names::*,
    test_utils::{MaybeEncryptedUInt, make_computer_128},
};

use parasol_runtime::test_utils::get_secret_keys_128;

#[test]
fn can_mov() {
    let test = |src_val, src_enc, dst_val, dst_enc| {
        let (mut proc, enc) = make_computer_128();
        let sk = get_secret_keys_128();

        let memory = Memory::new_default_stack();

        let program = memory.allocate_program(&[
            IsaOp::Load(T0, SP, 32, 4),
            IsaOp::Move(T1, T0),
            IsaOp::Store(RP, T1, 32, 0),
            IsaOp::Ret(),
        ]);

        let args = ArgsBuilder::new()
            .arg(MaybeEncryptedUInt::<32>::new(
                dst_val as u128,
                &enc,
                &sk,
                dst_enc,
            ))
            .arg(MaybeEncryptedUInt::<32>::new(
                src_val as u128,
                &enc,
                &sk,
                src_enc,
            ))
            .return_value::<MaybeEncryptedUInt<32>>();

        let result = proc.run_program(program, &Arc::new(memory), args).unwrap();

        let ret_val = result.get(&enc, &sk);

        assert_eq!(
            src_val, ret_val,
            "src_val: {src_val:#02x}, ans_sum: {ret_val:#02x}, [unimportant from here] src_enc: {src_enc}, dst_val: {dst_val:#02x}, dst_enc; {dst_enc}"
        );
    };

    for src_enc in [true, false] {
        for dst_enc in [true, false] {
            test(0xF00Du32, src_enc, 0xFEEDu32, dst_enc);
        }
    }
}