solana-ecvrf 0.0.1

ECVRF-EDWARDS25519-SHA512-TAI (RFC 9381) verification for Solana programs using curve25519 and sha512 syscalls
Documentation
//! Raw syscall bindings. Only compiled for `target_os = "solana"`.

#[cfg(not(any(target_feature = "static-syscalls", feature = "static-syscalls")))]
unsafe extern "C" {
    pub fn sol_sha512(vals: *const u8, val_len: u64, hash_result: *mut u8) -> u64;
    pub fn sol_curve_validate_point(curve_id: u64, point_addr: *const u8, result: *mut u8) -> u64;
    pub fn sol_curve_group_op(
        curve_id: u64,
        group_op: u64,
        left_input_addr: *const u8,
        right_input_addr: *const u8,
        result_point_addr: *mut u8,
    ) -> u64;
    pub fn sol_curve_multiscalar_mul(
        curve_id: u64,
        scalars_addr: *const u8,
        points_addr: *const u8,
        points_len: u64,
        result_point_addr: *mut u8,
    ) -> u64;
}

// murmur3_32(name, 0) — precomputed; the static-syscall ABI dispatches on it.
// SBPF v3 toolchains set `target_feature = "static-syscalls"` themselves; the
// crate feature forces it for toolchains that support it but don't advertise it.
#[cfg(any(target_feature = "static-syscalls", feature = "static-syscalls"))]
mod r#static {
    #[inline(always)]
    pub unsafe fn sol_sha512(vals: *const u8, val_len: u64, out: *mut u8) -> u64 {
        const ID: usize = 0x9229cdcc;
        let f: extern "C" fn(*const u8, u64, *mut u8) -> u64 = unsafe { core::mem::transmute(ID) };
        f(vals, val_len, out)
    }
    #[inline(always)]
    pub unsafe fn sol_curve_validate_point(
        curve_id: u64,
        point_addr: *const u8,
        result: *mut u8,
    ) -> u64 {
        const ID: usize = 0xaa2607ca;
        let f: extern "C" fn(u64, *const u8, *mut u8) -> u64 = unsafe { core::mem::transmute(ID) };
        f(curve_id, point_addr, result)
    }
    #[inline(always)]
    pub unsafe fn sol_curve_group_op(
        curve_id: u64,
        group_op: u64,
        left: *const u8,
        right: *const u8,
        out: *mut u8,
    ) -> u64 {
        const ID: usize = 0xdd1c41a6;
        let f: extern "C" fn(u64, u64, *const u8, *const u8, *mut u8) -> u64 =
            unsafe { core::mem::transmute(ID) };
        f(curve_id, group_op, left, right, out)
    }
    #[inline(always)]
    pub unsafe fn sol_curve_multiscalar_mul(
        curve_id: u64,
        scalars: *const u8,
        points: *const u8,
        len: u64,
        out: *mut u8,
    ) -> u64 {
        const ID: usize = 0x60a40880;
        let f: extern "C" fn(u64, *const u8, *const u8, u64, *mut u8) -> u64 =
            unsafe { core::mem::transmute(ID) };
        f(curve_id, scalars, points, len, out)
    }
}
#[cfg(any(target_feature = "static-syscalls", feature = "static-syscalls"))]
pub use r#static::*;