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 let spec = ObjectCreate::new(
50 Default::default(),
51 Default::default(),
52 Some(v_key.id()),
53 Default::default(),
54 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 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}