diff --git a/src/main.rs b/src/main.rs index a8acd1225c010f121914c647b7dbcf42c7c5c917..fb69b900c5af42213b59420d242928a8fa44cfd0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ //#![feature(const_size_of)] #![feature(optin_builtin_traits)] +#![feature(const_fn)] //use std::mem::{transmute, size_of}; //use std::marker::Sized; @@ -38,13 +39,15 @@ mod trusted { } impl<T> Sec<T> { - pub unsafe fn new(d: T) -> Self { + pub const unsafe fn new(d: T) -> Self { Sec { data: d } } pub unsafe fn get(&self) -> &T { &self.data } } + impl<T> !Send for Sec<T> {} + impl<T> !Sync for Sec<T> {} // safe API for operating on Sec<u32> pub fn sec_add_u32(s1: &Sec<u32>, s2: &Sec<u32>) -> Sec<u32> { @@ -57,9 +60,9 @@ mod trusted { T: Sized, F: FnMut(&mut u8), { - let ptr: *mut u8 = s as *mut T as *mut u8; + let ptr = s as *mut T as *mut u8; for i in 0..size_of::<T>() { - println!("{} {}", i, unsafe { *ptr.offset(i as isize) } as u8); + //println!("{} {}", i, unsafe { *ptr.offset(i as isize) } as u8); f(unsafe { &mut *ptr.offset(i as isize) }); } } @@ -80,6 +83,10 @@ mod trusted { Enc { data: c } } + pub const unsafe fn new_(d: T) -> Self { + Enc { data: d } + } + pub unsafe fn get_unsafe(&self) -> Sec<T> { let mut c = self.data.clone(); cipher(&mut c, |i| { *i -= 1; }); @@ -102,6 +109,9 @@ fn main() { user1(&d, &e); } +static mut S: Sec<u32> = unsafe { Sec::new(0u32) }; +static mut E: Enc<u32> = unsafe { Enc::new_(0u32) }; + // user code in `safe` Rust fn user1(d: &Sec<u32>, e: &Enc<u32>) { println!("user1 {:?}, {:?}", d, e); @@ -109,6 +119,9 @@ fn user1(d: &Sec<u32>, e: &Enc<u32>) { user2(&sec_add_u32(d, &e.get(a))); user3(d, &e.get(a)); user4(d, e, a); + user5(d, e); + //unsafe { S = *d } + unsafe { S = e.get(a) } } fn user2(d: &Sec<u32>) { @@ -120,7 +133,13 @@ fn user3(d1: &Sec<u32>, d2: &Sec<u32>) { } fn user4(d: &Sec<u32>, e: &Enc<u32>, a: &Auth) { - println!("user3 {:?}", sec_add_u32(d, &e.get(a))); + println!("user4 {:?}", sec_add_u32(d, &e.get(a))); +} + + +fn user5(d: &Sec<u32>, e: &Enc<u32>) { + println!("user5 {:?}, {:?}", d, e); + //unsafe { S = *d } } /*