sec_test/
main.rs

1use colog::default_builder;
2use log::{info, LevelFilter};
3use twizzler::{
4    marker::BaseType,
5    object::{Object, ObjectBuilder, TypedObject},
6};
7use twizzler_abi::{
8    object::Protections,
9    syscall::{sys_sctx_attach, ObjectCreate},
10};
11use twizzler_rt_abi::object::MapFlags;
12use twizzler_security::{Cap, SecCtx, SecCtxFlags, SigningKey, SigningScheme};
13
14#[derive(Debug)]
15struct DumbBase {
16    _payload: u128,
17}
18
19impl BaseType for DumbBase {
20    fn fingerprint() -> u64 {
21        11234
22    }
23}
24
25fn main() {
26    let mut builder = default_builder();
27    builder.filter_level(LevelFilter::Trace);
28    builder.init();
29
30    let (s_key, v_key) = SigningKey::new_keypair(&SigningScheme::Ecdsa, Default::default())
31        .expect("should have worked");
32
33    let sec_ctx = SecCtx::new(
34        ObjectCreate::new(
35            Default::default(),
36            Default::default(),
37            None,
38            Default::default(),
39            Protections::all(),
40        ),
41        Protections::all(),
42        SecCtxFlags::empty(),
43    )
44    .unwrap();
45
46    sys_sctx_attach(sec_ctx.id()).unwrap();
47
48    // lets create an object and try to access it
49    let spec = ObjectCreate::new(
50        Default::default(),
51        Default::default(),
52        Some(v_key.id()),
53        Default::default(),
54        // Protections::all(),
55        // Protections::READ | Protections::WRITE,
56        Protections::READ,
57    );
58    info!("creating target object with spec: {:?}", spec);
59
60    let target_obj = ObjectBuilder::new(spec)
61        .build(DumbBase {
62            _payload: 123456789,
63        })
64        .unwrap();
65
66    let target_id = target_obj.id().clone();
67    drop(target_obj);
68
69    info!("target_id :{:?}", target_id);
70    info!("sec_ctx id:{:?}", sec_ctx.id());
71
72    let prots = Protections::empty();
73
74    let cap = Cap::new(
75        target_id,
76        sec_ctx.id(),
77        prots,
78        s_key.base(),
79        Default::default(),
80        Default::default(),
81        Default::default(),
82    )
83    .unwrap();
84
85    sec_ctx.insert_cap(cap).unwrap();
86    println!("Inserted Capability!");
87    // attach to this sec_ctx
88
89    // time to try accessing this object
90
91    let target = Object::<DumbBase>::map(target_id, MapFlags::READ | MapFlags::WRITE).unwrap();
92    let base = target.base();
93    println!("base: {:?}", base);
94
95    println!("")
96}