//! The hiding commitment opens any functional it was asked for and nothing
//! a cheating prover substitutes.
use super::*;
use crate::execution::veil::coins::{Coins, label};
use lens::Transcript;
use nebu::Goldilocks;

fn setup(n: usize, seed: u8) -> (Vec<Goldilocks>, Functional, Fp3) {
    let seeded = Coins::seeded([seed; 32]);
    let mut coins = seeded.stream(label::TEST);
    let entries = coins.bases(n);
    let tensor = (n / 2).next_power_of_two().min(n).trailing_zeros() as usize;
    let point: Vec<Fp3> = (0..tensor).map(|_| coins.ext()).collect();
    let explicit: Vec<(usize, Fp3)> = ((1 << tensor)..n)
        .step_by(3)
        .map(|e| (e, coins.ext()))
        .collect();
    let f = Functional {
        scale: coins.ext(),
        point,
        explicit,
    };
    let eq = prove::eq_msb(&f.point);
    let mut value = Fp3::ZERO;
    for (e, &w) in eq.iter().enumerate() {
        value += f.scale * w * Fp3::from_base(entries[e]);
    }
    for &(e, w) in &f.explicit {
        value += w * Fp3::from_base(entries[e]);
    }
    (entries, f, value)
}

fn run(n: usize, tamper: &dyn Fn(&mut HidingProof, &mut Fp3)) -> Result<(), String> {
    let params = HidingParams::default();
    let (entries, f, mut value) = setup(n, n as u8);
    let (root, committed) = commit(&params, &entries, &Coins::seeded([1; 32])).unwrap();
    let mut proof = open(&committed, &f, value, &mut Transcript::new(b"t"));
    tamper(&mut proof, &mut value);
    verify(
        &params,
        &root,
        n,
        &f,
        value,
        &proof,
        &mut Transcript::new(b"t"),
    )
}

#[test]
fn openings_verify_at_several_shapes() {
    for n in [100, 1 << 10, 3000, 1 << 13] {
        run(n, &|_, _| {}).unwrap_or_else(|e| panic!("{n}: {e}"));
    }
}

#[test]
fn forged_values_and_messages_are_rejected() {
    let n = 1 << 10;
    let one = Fp3::ONE;
    type Tamper = Box<dyn Fn(&mut HidingProof, &mut Fp3)>;
    let cases: Vec<(&str, Tamper)> = vec![
        ("value", Box::new(move |_, v| *v += one)),
        ("mu", Box::new(move |p, _| p.mu += one)),
        ("row test", Box::new(move |p, _| p.row_test[3] += one)),
        ("linear", Box::new(move |p, _| p.linear[200] += one)),
        (
            "linear coefficient and value",
            Box::new(move |p, v| {
                *v += one;
                let mid = p.linear.len() / 2;
                p.linear[mid] += one;
            }),
        ),
        ("column", Box::new(|p, _| p.columns[5] += Goldilocks::ONE)),
        ("salt", Box::new(|p, _| p.salts[0] += Goldilocks::ONE)),
        (
            "sibling",
            Box::new(|p, _| p.siblings[0] = hemera::Hash::from_bytes([7; 32])),
        ),
        (
            "nonce",
            Box::new(|p, _| p.pow_nonce = p.pow_nonce.map(|n| n + 1)),
        ),
    ];
    for (name, tamper) in cases {
        assert!(run(n, tamper.as_ref()).is_err(), "{name}");
    }
}

#[test]
fn security_is_proven_above_128_bits() {
    let cfg = Config::derive(&HidingParams::default(), 1 << 12).unwrap();
    assert!(cfg.security_bits() >= 128.0, "{}", cfg.security_bits());
    assert!(cfg.k > cfg.queries, "padding covers every opened column");
}

Homonyms

neural/trident/src/neural/tests.rs
cyb/honeycrisp/aruminium/src/tests.rs
soft3/radio/iroh-blobs/src/tests.rs
warriors/trisha/rs/lower/tests.rs
neural/trident/src/deploy/tests.rs
soft3/crate/src/wallet/tests.rs
soft3/lens/cli/src/tests.rs
soft3/crate/src/genesis/tests.rs
neural/trident/src/verify/solve/tests.rs
neural/trident/src/package/hash/tests.rs
cyb/wysm/crates/wasmi/src/tests.rs
soft3/zheng/rs/src/accumulate/tests.rs
soft3/zheng/rs/src/air/tests.rs
neural/trident/src/package/registry/tests.rs
neural/trident/src/verify/sym/tests.rs
cyb/honeycrisp/aruminium/src/render/tests.rs
neural/trident/src/syntax/format/tests.rs
neural/trident/src/verify/smt/tests.rs
neural/trident/src/syntax/grammar/tests.rs
neural/trident/src/config/scaffold/tests.rs
warriors/trisha/rs/cost/stack_verifier/tests.rs
soft3/radio/quinn/quinn-udp/tests/tests.rs
soft3/radio/cyber-bao/src/tree/tests.rs
cyb/honeycrisp/unimem/src/block/tests.rs
neural/trident/src/lsp/semantic/tests.rs
neural/trident/src/package/manifest/tests.rs
soft3/radio/cyber-bao/src/group/tests.rs
cyb/wysm/crates/cli/src/tests.rs
soft3/crate/src/chain/pool/tests.rs
soft3/cybernode/rs/src/genesis/tests.rs
soft3/zheng/rs/src/envelope/tests.rs
soft3/zheng/rs/src/machine/tests.rs
soft3/cybernode/rs/src/wallet/tests.rs
neural/trident/src/verify/synthesize/tests.rs
warriors/trisha/rs/lower/legalize/tests.rs
neural/trident/src/syntax/lexer/tests.rs
cyb/wysm/crates/collections/src/tests.rs
neural/trident/src/verify/equiv/tests.rs
neural/trident/src/lsp/util/tests.rs
neural/trident/src/verify/report/tests.rs
soft3/crate/src/chain/economy/tests.rs
soft3/radio/quinn/quinn/src/tests.rs
neural/trident/src/config/resolve/tests.rs
neural/trident/src/package/store/tests.rs
soft3/zheng/rs/src/execution/veil/tests.rs
soft3/zheng/rs/src/execution/zk/tests.rs
warriors/erga/rs/mine-bench/src/texture_ffi/tests.rs
neural/trident/src/ir/tir/stack/tests.rs
cyb/wysm/crates/core/src/memory/tests.rs
cyb/evy/forks/bevy_ecs/src/bundle/tests.rs
warriors/erga/rs/rtable-bench/src/probe/tests.rs
soft3/radio/quinn/quinn-proto/src/range_set/tests.rs
cyb/wysm/crates/core/src/table/tests.rs
warriors/erga/rs/blake-bench/src/batch/tests.rs
soft3/crate/src/chain/net/kernel/tests.rs
soft3/zheng/rs/src/recursion/circuit/tests.rs
soft3/zheng/rs/src/recursion/whir/tests.rs
soft3/zheng/rs/src/recursion/wrap/tests.rs
soft3/cybernode/rs/src/chain/economy/tests.rs
neural/trident/src/neural/data/tir_graph/tests.rs
neural/trident/src/ir/tir/optimize/tests.rs
soft3/zheng/rs/src/execution/tagged/tests.rs
warriors/erga/rs/rtable-bench/src/table/tests.rs
warriors/erga/rs/mine-bench/src/owner/tests.rs
soft3/cybernode/rs/src/chain/pool/tests.rs
soft3/zheng/rs/src/ccs/universal/tests.rs
cyb/wysm/crates/wasmi/src/instance/tests.rs
soft3/zheng/rs/src/execution/disclosed/stream/tests.rs
cyb/evy/forks/naga/src/front/wgsl/tests.rs
cyb/wysm/crates/wasmi/src/module/instantiate/tests.rs
soft3/bbg/rs/src/storage/application/transfer/tests.rs
soft3/zheng/rs/src/execution/disclosed/evaluation/tests.rs
warriors/erga/rs/mine-bench/src/cli/timed/tests.rs
cyb/wysm/crates/wasmi/src/engine/limits/tests.rs
soft3/cybernode/rs/src/chain/net/kernel/tests.rs
soft3/zheng/rs/src/execution/disclosed/memory/tests.rs

Graph