97 lines
3.3 KiB
Rust
97 lines
3.3 KiB
Rust
//! Simulation Attack - Red Team Live Fire Exercise
|
|
|
|
use membrane_agent::qvl_ffi::{QvlClient, QvlRiskEdge};
|
|
use membrane_agent::policy_enforcer::PolicyEnforcer;
|
|
use std::sync::Arc;
|
|
|
|
#[test]
|
|
fn test_live_fire_betrayal_simulation() {
|
|
println!(">>> INITIATING BETRAYAL SIMULATION <<<");
|
|
|
|
// 1. Init
|
|
let qvl = Arc::new(QvlClient::new().unwrap());
|
|
let enforcer = PolicyEnforcer::new(qvl.clone());
|
|
|
|
// 2. Register Actors
|
|
let traitor_did = [0xAAu8; 32];
|
|
let accomplice_did = [0xBBu8; 32];
|
|
|
|
// Node 0 is Local Root (created by init)
|
|
// Node 1 = Traitor
|
|
let traitor_id = qvl.register_node(&traitor_did).expect("Failed to register traitor");
|
|
println!("[+] Registered Traitor (ID: {})", traitor_id);
|
|
|
|
// Node 2 = Accomplice
|
|
let accomplice_id = qvl.register_node(&accomplice_did).expect("Failed to register accomplice");
|
|
println!("[+] Registered Accomplice (ID: {})", accomplice_id);
|
|
|
|
// 3. Seed Betrayal Cycle (Negative Risk to trigger Bellman-Ford)
|
|
// Traitor -> Accomplice (Risk -0.5)
|
|
qvl.add_trust_edge(QvlRiskEdge {
|
|
from: traitor_id,
|
|
to: accomplice_id,
|
|
risk: -0.5,
|
|
timestamp_ns: 1000,
|
|
nonce: 1,
|
|
level: 3,
|
|
expires_at_ns: 999999,
|
|
}).expect("Failed edge 1");
|
|
|
|
// Accomplice -> Traitor (Risk -0.5)
|
|
// Loop sum = -1.0
|
|
qvl.add_trust_edge(QvlRiskEdge {
|
|
from: accomplice_id,
|
|
to: traitor_id,
|
|
risk: -0.5,
|
|
timestamp_ns: 1000,
|
|
nonce: 2,
|
|
level: 3,
|
|
expires_at_ns: 999999,
|
|
}).expect("Failed edge 2");
|
|
|
|
println!("[+] Betrayal Cycle Seeded: {} <--> {} (Weight -1.0)", traitor_id, accomplice_id);
|
|
|
|
// 4. Trigger Defense
|
|
println!("[*] Scanning Traitor Node {}...", traitor_id);
|
|
|
|
// This calls detect -> get_did -> issue_slash
|
|
let punishment = enforcer.punish_if_guilty(traitor_id);
|
|
|
|
match punishment {
|
|
Some(signal) => {
|
|
println!("[!] BETRAYAL DETECTED! Slash Signal Generated.");
|
|
println!("[!] Payload Size: {} bytes", signal.len());
|
|
|
|
// Verify content
|
|
// Target DID should be Traitor DID (first 32 bytes)
|
|
assert_eq!(&signal[0..32], &traitor_did);
|
|
|
|
// Reason should be BetrayalCycle (1)
|
|
assert_eq!(signal[32], 1);
|
|
|
|
// Evidence Payload should be present (offset 33..65)
|
|
let evidence_start = 33;
|
|
// First byte of evidence hash should match mock (0xEE) or real
|
|
// Since we implemented Mock Hash 0xEE in PolicyEnforcer for now:
|
|
assert_eq!(signal[evidence_start], 0xEE);
|
|
|
|
println!("[+] SUCCESS: Traitor identified and sentenced.");
|
|
println!("[+] Target DID matches expectation: {:X?}", &signal[0..4]);
|
|
},
|
|
None => {
|
|
// Debugging
|
|
println!("[-] NO signal generated.");
|
|
println!("[-] Trust Graph DID lookup check:");
|
|
if let Some(did) = qvl.get_did(traitor_id) {
|
|
println!(" ID {} -> DID found", traitor_id);
|
|
assert_eq!(&did, &traitor_did);
|
|
} else {
|
|
println!(" ID {} -> DID NOT FOUND!", traitor_id);
|
|
}
|
|
|
|
// Force fail
|
|
panic!("[-] FAILURE: Traitor escaped detection!");
|
|
}
|
|
}
|
|
}
|