mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-10 05:09:22 +00:00
* Partial move to ff 0.13 It turns out the newly released k256 0.12 isn't on ff 0.13, preventing further work at this time. * Update all crates to work on ff 0.13 The provided curves still need to be expanded to fit the new API. * Finish adding dalek-ff-group ff 0.13 constants * Correct FieldElement::product definition Also stops exporting macros. * Test most new parts of ff 0.13 * Additionally test ff-group-tests with BLS12-381 and the pasta curves We only tested curves from RustCrypto. Now we test a curve offered by zk-crypto, the group behind ff/group, and the pasta curves, which is by Zcash (though Zcash developers are also behind zk-crypto). * Finish Ed448 Fully specifies all constants, passes all tests in ff-group-tests, and finishes moving to ff-0.13. * Add RustCrypto/elliptic-curves to allowed git repos Needed due to k256/p256 incorrectly defining product. * Finish writing ff 0.13 tests * Add additional comments to dalek * Further comments * Update ethereum-serai to ff 0.13
94 lines
2.7 KiB
Rust
94 lines
2.7 KiB
Rust
use rand_core::OsRng;
|
|
|
|
use zeroize::Zeroize;
|
|
|
|
use rand_core::RngCore;
|
|
|
|
use ff::{Field, PrimeFieldBits};
|
|
use group::Group;
|
|
|
|
use crate::BatchVerifier;
|
|
|
|
pub(crate) fn test_batch<G: Group + Zeroize>()
|
|
where
|
|
G::Scalar: PrimeFieldBits + Zeroize,
|
|
{
|
|
let valid = |batch: BatchVerifier<_, G>| {
|
|
assert!(batch.verify());
|
|
assert!(batch.verify_vartime());
|
|
assert_eq!(batch.blame_vartime(), None);
|
|
assert_eq!(batch.verify_with_vartime_blame(), Ok(()));
|
|
assert_eq!(batch.verify_vartime_with_vartime_blame(), Ok(()));
|
|
};
|
|
|
|
let invalid = |batch: BatchVerifier<_, G>, id| {
|
|
assert!(!batch.verify());
|
|
assert!(!batch.verify_vartime());
|
|
assert_eq!(batch.blame_vartime(), Some(id));
|
|
assert_eq!(batch.verify_with_vartime_blame(), Err(id));
|
|
assert_eq!(batch.verify_vartime_with_vartime_blame(), Err(id));
|
|
};
|
|
|
|
// Test an empty batch
|
|
let batch = BatchVerifier::new(0);
|
|
valid(batch);
|
|
|
|
// Test a batch with one set of statements
|
|
let valid_statements = vec![(-G::Scalar::ONE, G::generator()), (G::Scalar::ONE, G::generator())];
|
|
let mut batch = BatchVerifier::new(1);
|
|
batch.queue(&mut OsRng, 0, valid_statements.clone());
|
|
valid(batch);
|
|
|
|
// Test a batch with an invalid set of statements fails properly
|
|
let invalid_statements = vec![(-G::Scalar::ONE, G::generator())];
|
|
let mut batch = BatchVerifier::new(1);
|
|
batch.queue(&mut OsRng, 0, invalid_statements.clone());
|
|
invalid(batch, 0);
|
|
|
|
// Test blame can properly identify faulty participants
|
|
// Run with 17 statements, rotating which one is faulty
|
|
for i in 0 .. 17 {
|
|
let mut batch = BatchVerifier::new(17);
|
|
for j in 0 .. 17 {
|
|
batch.queue(
|
|
&mut OsRng,
|
|
j,
|
|
if i == j { invalid_statements.clone() } else { valid_statements.clone() },
|
|
);
|
|
}
|
|
invalid(batch, i);
|
|
}
|
|
|
|
// Test blame always identifies the left-most invalid statement
|
|
for i in 1 .. 32 {
|
|
for j in 1 .. i {
|
|
let mut batch = BatchVerifier::new(j);
|
|
let mut leftmost = None;
|
|
|
|
// Create j statements
|
|
for k in 0 .. j {
|
|
batch.queue(
|
|
&mut OsRng,
|
|
k,
|
|
// The usage of i / 10 makes this less likely to add invalid elements, and increases
|
|
// the space between them
|
|
// For high i values, yet low j values, this will make it likely that random elements
|
|
// are at/near the end
|
|
if ((OsRng.next_u64() % u64::try_from(1 + (i / 4)).unwrap()) == 0) ||
|
|
(leftmost.is_none() && (k == (j - 1)))
|
|
{
|
|
if leftmost.is_none() {
|
|
leftmost = Some(k);
|
|
}
|
|
invalid_statements.clone()
|
|
} else {
|
|
valid_statements.clone()
|
|
},
|
|
);
|
|
}
|
|
|
|
invalid(batch, leftmost.unwrap());
|
|
}
|
|
}
|
|
}
|