Refactor uneeded dependcy on covert_channel_evaluation
(cherry picked from commit e92dac5c6a57c437a63f24f0efed28e81fd3ce7c)
This commit is contained in:
parent
9fae343c44
commit
960d7d942c
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -55,7 +55,6 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"cache_side_channel",
|
"cache_side_channel",
|
||||||
"cache_utils",
|
"cache_utils",
|
||||||
"covert_channels_evaluation",
|
|
||||||
"nix",
|
"nix",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -102,6 +101,7 @@ dependencies = [
|
|||||||
name = "cache_side_channel"
|
name = "cache_side_channel"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"bit_field 0.10.1",
|
||||||
"nix",
|
"nix",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -195,7 +195,6 @@ dependencies = [
|
|||||||
"basic_timing_cache_channel",
|
"basic_timing_cache_channel",
|
||||||
"cache_side_channel",
|
"cache_side_channel",
|
||||||
"cache_utils",
|
"cache_utils",
|
||||||
"covert_channels_evaluation",
|
|
||||||
"nix",
|
"nix",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -206,7 +205,6 @@ dependencies = [
|
|||||||
"basic_timing_cache_channel",
|
"basic_timing_cache_channel",
|
||||||
"cache_side_channel",
|
"cache_side_channel",
|
||||||
"cache_utils",
|
"cache_utils",
|
||||||
"covert_channels_evaluation",
|
|
||||||
"nix",
|
"nix",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -10,4 +10,3 @@ edition = "2018"
|
|||||||
cache_utils = { path = "../cache_utils" }
|
cache_utils = { path = "../cache_utils" }
|
||||||
cache_side_channel = { path = "../cache_side_channel" }
|
cache_side_channel = { path = "../cache_side_channel" }
|
||||||
nix = "0.20.0"
|
nix = "0.20.0"
|
||||||
covert_channels_evaluation = {path = "../covert_channels_evaluation"}
|
|
||||||
|
@ -15,8 +15,8 @@ use cache_side_channel::table_side_channel::{
|
|||||||
};
|
};
|
||||||
use cache_side_channel::SideChannelError::AddressNotReady;
|
use cache_side_channel::SideChannelError::AddressNotReady;
|
||||||
use cache_side_channel::{
|
use cache_side_channel::{
|
||||||
CacheStatus, ChannelFatalError, ChannelHandle, CoreSpec, MultipleAddrCacheSideChannel,
|
BitIterator, CacheStatus, ChannelFatalError, ChannelHandle, CoreSpec, CovertChannel,
|
||||||
SideChannelError, SingleAddrCacheSideChannel,
|
MultipleAddrCacheSideChannel, SideChannelError, SingleAddrCacheSideChannel,
|
||||||
};
|
};
|
||||||
use cache_utils::calibration::{
|
use cache_utils::calibration::{
|
||||||
accumulate, calibrate_fixed_freq_2_thread, calibration_result_to_ASVP,
|
accumulate, calibrate_fixed_freq_2_thread, calibration_result_to_ASVP,
|
||||||
@ -29,7 +29,6 @@ use cache_utils::calibration::{
|
|||||||
use cache_utils::complex_addressing::{CacheAttackSlicing, CacheSlicing};
|
use cache_utils::complex_addressing::{CacheAttackSlicing, CacheSlicing};
|
||||||
use cache_utils::mmap::MMappedMemory;
|
use cache_utils::mmap::MMappedMemory;
|
||||||
use cache_utils::{find_core_per_socket, flush, maccess, noop};
|
use cache_utils::{find_core_per_socket, flush, maccess, noop};
|
||||||
use covert_channels_evaluation::{BitIterator, CovertChannel};
|
|
||||||
use nix::sched::sched_getaffinity;
|
use nix::sched::sched_getaffinity;
|
||||||
use nix::sched::CpuSet;
|
use nix::sched::CpuSet;
|
||||||
use nix::unistd::Pid;
|
use nix::unistd::Pid;
|
||||||
|
@ -3,12 +3,11 @@ use cache_side_channel::table_side_channel::{
|
|||||||
SingleTableCacheSideChannel, TableAttackResult, TableCacheSideChannel,
|
SingleTableCacheSideChannel, TableAttackResult, TableCacheSideChannel,
|
||||||
};
|
};
|
||||||
use cache_side_channel::{
|
use cache_side_channel::{
|
||||||
CacheStatus, ChannelFatalError, ChannelHandle, CoreSpec, MultipleAddrCacheSideChannel,
|
BitIterator, CacheStatus, ChannelFatalError, ChannelHandle, CoreSpec, CovertChannel,
|
||||||
SideChannelError, SingleAddrCacheSideChannel,
|
MultipleAddrCacheSideChannel, SideChannelError, SingleAddrCacheSideChannel,
|
||||||
};
|
};
|
||||||
use cache_utils::calibration::{get_vpn, only_flush, only_reload, HashMap, Threshold, VPN};
|
use cache_utils::calibration::{get_vpn, only_flush, only_reload, HashMap, Threshold, VPN};
|
||||||
use cache_utils::flush;
|
use cache_utils::flush;
|
||||||
use covert_channels_evaluation::{BitIterator, CovertChannel};
|
|
||||||
use nix::sched::sched_getaffinity;
|
use nix::sched::sched_getaffinity;
|
||||||
use nix::sched::CpuSet;
|
use nix::sched::CpuSet;
|
||||||
use nix::unistd::Pid;
|
use nix::unistd::Pid;
|
||||||
|
@ -8,3 +8,4 @@ edition = "2018"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
nix = "0.20.0"
|
nix = "0.20.0"
|
||||||
|
bit_field = "0.10.1"
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#![feature(unsafe_block_in_unsafe_fn)]
|
#![feature(unsafe_block_in_unsafe_fn)]
|
||||||
#![deny(unsafe_op_in_unsafe_fn)]
|
#![deny(unsafe_op_in_unsafe_fn)]
|
||||||
|
|
||||||
|
use bit_field::BitField;
|
||||||
use nix::sched::{sched_getaffinity, sched_setaffinity, CpuSet};
|
use nix::sched::{sched_getaffinity, sched_setaffinity, CpuSet};
|
||||||
use nix::unistd::Pid;
|
use nix::unistd::Pid;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
@ -136,6 +137,50 @@ impl<T: MultipleAddrCacheSideChannel> SingleAddrCacheSideChannel for T {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
// From covert_channel_evaluation
|
||||||
|
pub trait CovertChannel: Send + Sync + CoreSpec + Debug {
|
||||||
|
type CovertChannelHandle;
|
||||||
|
const BIT_PER_PAGE: usize;
|
||||||
|
unsafe fn transmit(&self, handle: &mut Self::CovertChannelHandle, bits: &mut BitIterator);
|
||||||
|
unsafe fn receive(&self, handle: &mut Self::CovertChannelHandle) -> Vec<bool>;
|
||||||
|
unsafe fn ready_page(&mut self, page: *const u8) -> Result<Self::CovertChannelHandle, ()>; // TODO Error Type
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct BitIterator<'a> {
|
||||||
|
bytes: &'a Vec<u8>,
|
||||||
|
byte_index: usize,
|
||||||
|
bit_index: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> BitIterator<'a> {
|
||||||
|
pub fn new(bytes: &'a Vec<u8>) -> BitIterator<'a> {
|
||||||
|
BitIterator {
|
||||||
|
bytes,
|
||||||
|
byte_index: 0,
|
||||||
|
bit_index: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn atEnd(&self) -> bool {
|
||||||
|
self.byte_index >= self.bytes.len()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Iterator for BitIterator<'_> {
|
||||||
|
type Item = bool;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
if let Some(b) = self.bytes.get(self.byte_index) {
|
||||||
|
let r = (b >> (u8::BIT_LENGTH - 1 - self.bit_index as usize)) & 1 != 0;
|
||||||
|
self.bit_index += 1;
|
||||||
|
self.byte_index += self.bit_index as usize / u8::BIT_LENGTH;
|
||||||
|
self.bit_index = self.bit_index % u8::BIT_LENGTH as u8;
|
||||||
|
Some(r)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
use cache_utils::frequency::get_freq_cpufreq_kernel;
|
use cache_utils::frequency::get_freq_cpufreq_kernel;
|
||||||
use cache_utils::rdtsc_fence;
|
use cache_utils::rdtsc_fence;
|
||||||
|
use core::time::Duration;
|
||||||
use libc::sched_getcpu;
|
use libc::sched_getcpu;
|
||||||
use nix::sched::{sched_setaffinity, CpuSet};
|
use nix::sched::{sched_setaffinity, CpuSet};
|
||||||
use nix::unistd::Pid;
|
use nix::unistd::Pid;
|
||||||
use static_assertions::_core::time::Duration;
|
|
||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@ use alloc::vec;
|
|||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use core::cmp::min;
|
use core::cmp::min;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
|
||||||
use core::hash::Hash;
|
use core::hash::Hash;
|
||||||
use core::ops::{Add, AddAssign};
|
use core::ops::{Add, AddAssign};
|
||||||
#[cfg(feature = "no_std")]
|
#[cfg(feature = "no_std")]
|
||||||
|
@ -19,6 +19,7 @@ assert_cfg!(
|
|||||||
);
|
);
|
||||||
|
|
||||||
pub mod cache_info;
|
pub mod cache_info;
|
||||||
|
mod calibrate_2t;
|
||||||
pub mod calibration;
|
pub mod calibration;
|
||||||
pub mod complex_addressing;
|
pub mod complex_addressing;
|
||||||
#[cfg(feature = "use_std")]
|
#[cfg(feature = "use_std")]
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#![feature(unsafe_block_in_unsafe_fn)]
|
|
||||||
#![deny(unsafe_op_in_unsafe_fn)]
|
#![deny(unsafe_op_in_unsafe_fn)]
|
||||||
use turn_lock::TurnHandle;
|
use turn_lock::TurnHandle;
|
||||||
|
|
||||||
@ -13,20 +12,18 @@ const PAGE_SIZE: usize = 1 << 12; // FIXME Magic
|
|||||||
// Each page has 1<<12 bytes / 1<<6 bytes per line, hence 64 lines (or 6 bits of info).
|
// Each page has 1<<12 bytes / 1<<6 bytes per line, hence 64 lines (or 6 bits of info).
|
||||||
|
|
||||||
// General structure : two threads, a transmitter and a reciever. Transmitter generates bytes, Reciever reads bytes, then on join compare results for accuracy.
|
// General structure : two threads, a transmitter and a reciever. Transmitter generates bytes, Reciever reads bytes, then on join compare results for accuracy.
|
||||||
// Alos time in order to determine duration, in rdtsc and seconds.
|
// Also time in order to determine duration, in rdtsc and seconds.
|
||||||
|
|
||||||
use bit_field::BitField;
|
use bit_field::BitField;
|
||||||
use cache_side_channel::{restore_affinity, set_affinity, CoreSpec};
|
use cache_side_channel::{restore_affinity, set_affinity, BitIterator};
|
||||||
use cache_utils::mmap::MMappedMemory;
|
use cache_utils::mmap::MMappedMemory;
|
||||||
use cache_utils::rdtsc_fence;
|
use cache_utils::rdtsc_fence;
|
||||||
use nix::sched::sched_getaffinity;
|
|
||||||
use nix::unistd::Pid;
|
|
||||||
use std::any::Any;
|
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
|
||||||
|
pub use cache_side_channel::CovertChannel;
|
||||||
/* TODO : replace page with a handle type,
|
/* TODO : replace page with a handle type,
|
||||||
require exclusive handle access,
|
require exclusive handle access,
|
||||||
Handle protected by the turn lock
|
Handle protected by the turn lock
|
||||||
@ -34,13 +31,6 @@ use std::thread;
|
|||||||
/**
|
/**
|
||||||
* Safety considerations : Not ensure thread safety, need proper locking as needed.
|
* Safety considerations : Not ensure thread safety, need proper locking as needed.
|
||||||
*/
|
*/
|
||||||
pub trait CovertChannel: Send + Sync + CoreSpec + Debug {
|
|
||||||
type CovertChannelHandle;
|
|
||||||
const BIT_PER_PAGE: usize;
|
|
||||||
unsafe fn transmit(&self, handle: &mut Self::CovertChannelHandle, bits: &mut BitIterator);
|
|
||||||
unsafe fn receive(&self, handle: &mut Self::CovertChannelHandle) -> Vec<bool>;
|
|
||||||
unsafe fn ready_page(&mut self, page: *const u8) -> Result<Self::CovertChannelHandle, ()>; // TODO Error Type
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct CovertChannelBenchmarkResult {
|
pub struct CovertChannelBenchmarkResult {
|
||||||
@ -81,42 +71,6 @@ impl CovertChannelBenchmarkResult {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct BitIterator<'a> {
|
|
||||||
bytes: &'a Vec<u8>,
|
|
||||||
byte_index: usize,
|
|
||||||
bit_index: u8,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> BitIterator<'a> {
|
|
||||||
pub fn new(bytes: &'a Vec<u8>) -> BitIterator<'a> {
|
|
||||||
BitIterator {
|
|
||||||
bytes,
|
|
||||||
byte_index: 0,
|
|
||||||
bit_index: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn atEnd(&self) -> bool {
|
|
||||||
self.byte_index >= self.bytes.len()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Iterator for BitIterator<'_> {
|
|
||||||
type Item = bool;
|
|
||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
|
||||||
if let Some(b) = self.bytes.get(self.byte_index) {
|
|
||||||
let r = (b >> (u8::BIT_LENGTH - 1 - self.bit_index as usize)) & 1 != 0;
|
|
||||||
self.bit_index += 1;
|
|
||||||
self.byte_index += self.bit_index as usize / u8::BIT_LENGTH;
|
|
||||||
self.bit_index = self.bit_index % u8::BIT_LENGTH as u8;
|
|
||||||
Some(r)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct CovertChannelParams<T: CovertChannel + Send> {
|
struct CovertChannelParams<T: CovertChannel + Send> {
|
||||||
handles: Vec<TurnHandle<T::CovertChannelHandle>>,
|
handles: Vec<TurnHandle<T::CovertChannelHandle>>,
|
||||||
covert_channel: Arc<T>,
|
covert_channel: Arc<T>,
|
||||||
@ -165,7 +119,7 @@ pub fn benchmark_channel<T: 'static + Send + CovertChannel>(
|
|||||||
let old_affinity = set_affinity(&channel.main_core()).unwrap();
|
let old_affinity = set_affinity(&channel.main_core()).unwrap();
|
||||||
|
|
||||||
let size = num_pages * PAGE_SIZE;
|
let size = num_pages * PAGE_SIZE;
|
||||||
let mut m = MMappedMemory::new(size, false, false, |i| (i / PAGE_SIZE) as u8);
|
let m = MMappedMemory::new(size, false, false, |i| (i / PAGE_SIZE) as u8);
|
||||||
let mut receiver_turn_handles = Vec::new();
|
let mut receiver_turn_handles = Vec::new();
|
||||||
let mut transmit_turn_handles = Vec::new();
|
let mut transmit_turn_handles = Vec::new();
|
||||||
|
|
||||||
@ -197,7 +151,7 @@ pub fn benchmark_channel<T: 'static + Send + CovertChannel>(
|
|||||||
while received_bytes.len() < num_bytes {
|
while received_bytes.len() < num_bytes {
|
||||||
for handle in receiver_turn_handles.iter_mut() {
|
for handle in receiver_turn_handles.iter_mut() {
|
||||||
let mut page = handle.wait();
|
let mut page = handle.wait();
|
||||||
let mut bits = unsafe { covert_channel_arc.receive(&mut *page) };
|
let bits = unsafe { covert_channel_arc.receive(&mut *page) };
|
||||||
handle.next();
|
handle.next();
|
||||||
received_bits.extend(&mut bits.iter());
|
received_bits.extend(&mut bits.iter());
|
||||||
while received_bits.len() >= u8::BIT_LENGTH {
|
while received_bits.len() >= u8::BIT_LENGTH {
|
||||||
@ -222,7 +176,7 @@ pub fn benchmark_channel<T: 'static + Send + CovertChannel>(
|
|||||||
let r = helper.join();
|
let r = helper.join();
|
||||||
let (start, start_time, sent_bytes) = match r {
|
let (start, start_time, sent_bytes) = match r {
|
||||||
Ok(r) => r,
|
Ok(r) => r,
|
||||||
Err(e) => panic!("Join Error: {:?#}"),
|
Err(e) => panic!("Join Error: {:#?}", e),
|
||||||
};
|
};
|
||||||
assert_eq!(sent_bytes.len(), received_bytes.len());
|
assert_eq!(sent_bytes.len(), received_bytes.len());
|
||||||
assert_eq!(num_bytes, received_bytes.len());
|
assert_eq!(num_bytes, received_bytes.len());
|
||||||
|
@ -10,5 +10,4 @@ edition = "2018"
|
|||||||
cache_utils = { path = "../cache_utils" }
|
cache_utils = { path = "../cache_utils" }
|
||||||
cache_side_channel = { path = "../cache_side_channel" }
|
cache_side_channel = { path = "../cache_side_channel" }
|
||||||
nix = "0.20.0"
|
nix = "0.20.0"
|
||||||
covert_channels_evaluation = {path = "../covert_channels_evaluation"}
|
|
||||||
basic_timing_cache_channel = { path = "../basic_timing_cache_channel" }
|
basic_timing_cache_channel = { path = "../basic_timing_cache_channel" }
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#![feature(unsafe_block_in_unsafe_fn)]
|
|
||||||
#![deny(unsafe_op_in_unsafe_fn)]
|
#![deny(unsafe_op_in_unsafe_fn)]
|
||||||
|
|
||||||
pub mod naive;
|
pub mod naive;
|
||||||
|
@ -9,6 +9,5 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
cache_utils = { path = "../cache_utils" }
|
cache_utils = { path = "../cache_utils" }
|
||||||
cache_side_channel = { path = "../cache_side_channel" }
|
cache_side_channel = { path = "../cache_side_channel" }
|
||||||
covert_channels_evaluation = {path = "../covert_channels_evaluation"}
|
|
||||||
nix = "0.20.0"
|
nix = "0.20.0"
|
||||||
basic_timing_cache_channel = { path = "../basic_timing_cache_channel" }
|
basic_timing_cache_channel = { path = "../basic_timing_cache_channel" }
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#![feature(unsafe_block_in_unsafe_fn)]
|
|
||||||
#![deny(unsafe_op_in_unsafe_fn)]
|
#![deny(unsafe_op_in_unsafe_fn)]
|
||||||
|
|
||||||
pub mod naive;
|
pub mod naive;
|
||||||
|
Loading…
Reference in New Issue
Block a user