1use std::num::NonZeroU32;
6use zerocopy::{Immutable, IntoBytes};
7
8#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, IntoBytes, Immutable)]
10pub struct SecurityId(pub NonZeroU32);
11
12#[repr(u64)]
16pub enum ReferenceInitialSid {
17 Kernel = 1,
18 Security = 2,
19 Unlabeled = 3,
20 _Fs = 4,
21 File = 5,
22 Init = 7,
23 _Port = 9,
24 _Netif = 10,
25 _Netmsg = 11,
26 _Node = 12,
27 _Sysctl = 17,
28 Devnull = 27,
29
30 FirstUnused,
33}
34
35#[macro_export]
36macro_rules! initial_sid_enum {
37 ($(#[$meta:meta])* $name:ident {
38 $($(#[$variant_meta:meta])* $variant:ident ($variant_name: literal)),*,
39 }) => {
40 $(#[$meta])*
41 pub enum $name {
42 $($(#[$variant_meta])* $variant = ReferenceInitialSid::$variant as isize),*
43 }
44
45 impl $name {
46 pub fn all_variants() -> &'static [Self] {
47 &[
48 $($name::$variant),*
49 ]
50 }
51
52 pub fn name(&self) -> &'static str {
53 match self {
54 $($name::$variant => $variant_name),*
55 }
56 }
57 }
58 }
59}
60
61initial_sid_enum! {
62#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
65 InitialSid {
66 Devnull("devnull"),
68 File("file"),
69 Init("init"),
70 Kernel("kernel"),
71 Security("security"),
72 Unlabeled("unlabeled"),
73 }
75}
76
77impl From<InitialSid> for SecurityId {
78 fn from(initial_sid: InitialSid) -> Self {
79 Self(NonZeroU32::new(initial_sid as u32).unwrap())
83 }
84}
85
86#[derive(Clone, Debug, PartialEq)]
88pub struct TaskAttrs {
89 pub current_sid: SecurityId,
91
92 pub exec_sid: Option<SecurityId>,
94
95 pub fscreate_sid: Option<SecurityId>,
97
98 pub keycreate_sid: Option<SecurityId>,
100
101 pub previous_sid: SecurityId,
103
104 pub sockcreate_sid: Option<SecurityId>,
106
107 pub internal_operation: bool,
110}
111
112impl TaskAttrs {
113 pub fn for_kernel() -> Self {
115 Self::for_transition(InitialSid::Kernel.into(), InitialSid::Kernel.into())
116 }
117
118 pub fn for_selinux_disabled() -> Self {
120 Self::for_transition(InitialSid::Unlabeled.into(), InitialSid::Unlabeled.into())
121 }
122
123 pub fn for_transition(new_sid: SecurityId, previous_sid: SecurityId) -> Self {
125 Self {
126 current_sid: new_sid,
127 previous_sid,
128 exec_sid: None,
129 fscreate_sid: None,
130 keycreate_sid: None,
131 sockcreate_sid: None,
132 internal_operation: false,
133 }
134 }
135}
136
137#[cfg(test)]
138mod tests {
139 use super::*;
140
141 #[test]
142 fn task_alloc_for_kernel() {
143 let for_kernel = TaskAttrs::for_kernel();
144 assert_eq!(for_kernel.current_sid, InitialSid::Kernel.into());
145 assert_eq!(for_kernel.previous_sid, for_kernel.current_sid);
146 assert_eq!(for_kernel.exec_sid, None);
147 assert_eq!(for_kernel.fscreate_sid, None);
148 assert_eq!(for_kernel.keycreate_sid, None);
149 assert_eq!(for_kernel.sockcreate_sid, None);
150 }
151}