acvm 0.46.0

The virtual machine that processes ACIR given a backend/proof system.
Documentation
use crate::{
    pwg::{
        blackbox::utils::{to_u8_array, to_u8_vec},
        insert_value, witness_to_value, OpcodeResolutionError,
    },
    BlackBoxFunctionSolver,
};
use acir::{
    circuit::opcodes::FunctionInput,
    native_types::{Witness, WitnessMap},
    FieldElement,
};

#[allow(clippy::too_many_arguments)]
pub(crate) fn schnorr_verify(
    backend: &impl BlackBoxFunctionSolver,
    initial_witness: &mut WitnessMap,
    public_key_x: FunctionInput,
    public_key_y: FunctionInput,
    signature: &[FunctionInput; 64],
    message: &[FunctionInput],
    output: Witness,
) -> Result<(), OpcodeResolutionError> {
    let public_key_x: &FieldElement = witness_to_value(initial_witness, public_key_x.witness)?;
    let public_key_y: &FieldElement = witness_to_value(initial_witness, public_key_y.witness)?;

    let signature = to_u8_array(initial_witness, signature)?;
    let message = to_u8_vec(initial_witness, message)?;

    let valid_signature =
        backend.schnorr_verify(public_key_x, public_key_y, &signature, &message)?;

    insert_value(&output, FieldElement::from(valid_signature), initial_witness)?;

    Ok(())
}