Restore reorder attack test
This commit is contained in:
24
src/entry.rs
24
src/entry.rs
@ -87,9 +87,14 @@ pub fn next_tick(start_hash: &Hash, num_hashes: u64) -> Entry {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use hash::hash;
|
||||||
|
use signature::{KeyPair, KeyPairUtil};
|
||||||
|
use transaction::Transaction;
|
||||||
|
use event::Event;
|
||||||
|
use entry::create_entry;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_event_verify() {
|
fn test_entry_verify() {
|
||||||
let zero = Hash::default();
|
let zero = Hash::default();
|
||||||
let one = hash(&zero);
|
let one = hash(&zero);
|
||||||
assert!(Entry::new_tick(0, &zero).verify(&zero)); // base case
|
assert!(Entry::new_tick(0, &zero).verify(&zero)); // base case
|
||||||
@ -98,6 +103,23 @@ mod tests {
|
|||||||
assert!(!next_tick(&zero, 1).verify(&one)); // inductive step, bad
|
assert!(!next_tick(&zero, 1).verify(&one)); // inductive step, bad
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_event_reorder_attack() {
|
||||||
|
let zero = Hash::default();
|
||||||
|
|
||||||
|
// First, verify entries
|
||||||
|
let keypair = KeyPair::new();
|
||||||
|
let tr0 = Event::Transaction(Transaction::new(&keypair, keypair.pubkey(), 0, zero));
|
||||||
|
let tr1 = Event::Transaction(Transaction::new(&keypair, keypair.pubkey(), 1, zero));
|
||||||
|
let mut e0 = create_entry(&zero, 0, vec![tr0.clone(), tr1.clone()]);
|
||||||
|
assert!(e0.verify(&zero));
|
||||||
|
|
||||||
|
// Next, swap two events and ensure verification fails.
|
||||||
|
e0.events[0] = tr1; // <-- attack
|
||||||
|
e0.events[1] = tr0;
|
||||||
|
assert!(!e0.verify(&zero));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_next_tick() {
|
fn test_next_tick() {
|
||||||
let zero = Hash::default();
|
let zero = Hash::default();
|
||||||
|
28
src/log.rs
28
src/log.rs
@ -14,8 +14,7 @@
|
|||||||
/// was generated by the fastest processor at the time the entry was logged.
|
/// was generated by the fastest processor at the time the entry was logged.
|
||||||
|
|
||||||
use hash::Hash;
|
use hash::Hash;
|
||||||
use entry::{create_entry, next_tick, Entry};
|
use entry::{next_tick, Entry};
|
||||||
use event::Event;
|
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
|
|
||||||
/// Verifies the hashes and counts of a slice of events are all consistent.
|
/// Verifies the hashes and counts of a slice of events are all consistent.
|
||||||
@ -25,10 +24,6 @@ pub fn verify_slice(entries: &[Entry], start_hash: &Hash) -> bool {
|
|||||||
event_pairs.all(|(x0, x1)| x1.verify(&x0.id))
|
event_pairs.all(|(x0, x1)| x1.verify(&x0.id))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_entries(start_hash: &Hash, events: Vec<Event>) -> Vec<Entry> {
|
|
||||||
vec![create_entry(start_hash, 0, events)]
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a vector of Ticks of length 'len' from 'start_hash' hash and 'num_hashes'.
|
/// Create a vector of Ticks of length 'len' from 'start_hash' hash and 'num_hashes'.
|
||||||
pub fn next_ticks(start_hash: &Hash, num_hashes: u64, len: usize) -> Vec<Entry> {
|
pub fn next_ticks(start_hash: &Hash, num_hashes: u64, len: usize) -> Vec<Entry> {
|
||||||
let mut id = *start_hash;
|
let mut id = *start_hash;
|
||||||
@ -59,27 +54,6 @@ mod tests {
|
|||||||
bad_ticks[1].id = one;
|
bad_ticks[1].id = one;
|
||||||
assert!(!verify_slice(&bad_ticks, &zero)); // inductive step, bad
|
assert!(!verify_slice(&bad_ticks, &zero)); // inductive step, bad
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: This is no longer relevant. Instead, test for reordered ticks.
|
|
||||||
//#[test]
|
|
||||||
//fn test_reorder_attack() {
|
|
||||||
// let zero = Hash::default();
|
|
||||||
|
|
||||||
// // First, verify entries
|
|
||||||
// let keypair = KeyPair::new();
|
|
||||||
// let tr0 = Transaction::new(&keypair, keypair.pubkey(), 0, zero);
|
|
||||||
// let tr1 = Transaction::new(&keypair, keypair.pubkey(), 1, zero);
|
|
||||||
// let events = vec![Event::Transaction(tr0), Event::Transaction(tr1)];
|
|
||||||
// let mut entries = create_entries(&zero, events);
|
|
||||||
// assert!(verify_slice(&entries, &zero));
|
|
||||||
|
|
||||||
// // Next, swap two events and ensure verification fails.
|
|
||||||
// let event0 = entries[0].event.clone();
|
|
||||||
// let event1 = entries[1].event.clone();
|
|
||||||
// entries[0].event = event1;
|
|
||||||
// entries[1].event = event0;
|
|
||||||
// assert!(!verify_slice(&entries, &zero));
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "unstable", test))]
|
#[cfg(all(feature = "unstable", test))]
|
||||||
|
Reference in New Issue
Block a user