1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#ifndef _SS_POLICYDB_H_
23#define _SS_POLICYDB_H_
24
25#include "symtab.h"
26#include "avtab.h"
27#include "sidtab.h"
28#include "ebitmap.h"
29#include "mls_types.h"
30#include "context.h"
31#include "constraint.h"
32
33
34
35
36
37
38
39
40
41struct perm_datum {
42 u32 value;
43};
44
45
46struct common_datum {
47 u32 value;
48 struct symtab permissions;
49};
50
51
52struct class_datum {
53 u32 value;
54 char *comkey;
55 struct common_datum *comdatum;
56 struct symtab permissions;
57 struct constraint_node *constraints;
58 struct constraint_node *validatetrans;
59
60#define DEFAULT_SOURCE 1
61#define DEFAULT_TARGET 2
62 char default_user;
63 char default_role;
64 char default_type;
65
66#define DEFAULT_SOURCE_LOW 1
67#define DEFAULT_SOURCE_HIGH 2
68#define DEFAULT_SOURCE_LOW_HIGH 3
69#define DEFAULT_TARGET_LOW 4
70#define DEFAULT_TARGET_HIGH 5
71#define DEFAULT_TARGET_LOW_HIGH 6
72#define DEFAULT_GLBLUB 7
73 char default_range;
74};
75
76
77struct role_datum {
78 u32 value;
79 u32 bounds;
80 struct ebitmap dominates;
81 struct ebitmap types;
82};
83
84struct role_trans_key {
85 u32 role;
86 u32 type;
87 u32 tclass;
88};
89
90struct role_trans_datum {
91 u32 new_role;
92};
93
94struct filename_trans_key {
95 u32 ttype;
96 u16 tclass;
97 const char *name;
98};
99
100struct filename_trans_datum {
101 struct ebitmap stypes;
102 u32 otype;
103 struct filename_trans_datum *next;
104};
105
106struct role_allow {
107 u32 role;
108 u32 new_role;
109 struct role_allow *next;
110};
111
112
113struct type_datum {
114 u32 value;
115 u32 bounds;
116 unsigned char primary;
117 unsigned char attribute;
118};
119
120
121struct user_datum {
122 u32 value;
123 u32 bounds;
124 struct ebitmap roles;
125 struct mls_range range;
126 struct mls_level dfltlevel;
127};
128
129
130
131struct level_datum {
132 struct mls_level *level;
133 unsigned char isalias;
134};
135
136
137struct cat_datum {
138 u32 value;
139 unsigned char isalias;
140};
141
142struct range_trans {
143 u32 source_type;
144 u32 target_type;
145 u32 target_class;
146};
147
148
149struct cond_bool_datum {
150 __u32 value;
151 int state;
152};
153
154struct cond_node;
155
156
157
158
159
160
161struct type_set {
162 struct ebitmap types;
163 struct ebitmap negset;
164 u32 flags;
165};
166
167
168
169
170
171
172
173
174struct ocontext {
175 union {
176 char *name;
177 struct {
178 u8 protocol;
179 u16 low_port;
180 u16 high_port;
181 } port;
182 struct {
183 u32 addr;
184 u32 mask;
185 } node;
186 struct {
187 u32 addr[4];
188 u32 mask[4];
189 } node6;
190 struct {
191 u64 subnet_prefix;
192 u16 low_pkey;
193 u16 high_pkey;
194 } ibpkey;
195 struct {
196 char *dev_name;
197 u8 port;
198 } ibendport;
199 } u;
200 union {
201 u32 sclass;
202 u32 behavior;
203 } v;
204 struct context context[2];
205 u32 sid[2];
206 struct ocontext *next;
207};
208
209struct genfs {
210 char *fstype;
211 struct ocontext *head;
212 struct genfs *next;
213};
214
215
216#define SYM_COMMONS 0
217#define SYM_CLASSES 1
218#define SYM_ROLES 2
219#define SYM_TYPES 3
220#define SYM_USERS 4
221#define SYM_BOOLS 5
222#define SYM_LEVELS 6
223#define SYM_CATS 7
224#define SYM_NUM 8
225
226
227#define OCON_ISID 0
228#define OCON_FS 1
229#define OCON_PORT 2
230#define OCON_NETIF 3
231#define OCON_NODE 4
232#define OCON_FSUSE 5
233#define OCON_NODE6 6
234#define OCON_IBPKEY 7
235#define OCON_IBENDPORT 8
236#define OCON_NUM 9
237
238
239struct policydb {
240 int mls_enabled;
241
242
243 struct symtab symtab[SYM_NUM];
244#define p_commons symtab[SYM_COMMONS]
245#define p_classes symtab[SYM_CLASSES]
246#define p_roles symtab[SYM_ROLES]
247#define p_types symtab[SYM_TYPES]
248#define p_users symtab[SYM_USERS]
249#define p_bools symtab[SYM_BOOLS]
250#define p_levels symtab[SYM_LEVELS]
251#define p_cats symtab[SYM_CATS]
252
253
254 char **sym_val_to_name[SYM_NUM];
255
256
257 struct class_datum **class_val_to_struct;
258 struct role_datum **role_val_to_struct;
259 struct user_datum **user_val_to_struct;
260 struct type_datum **type_val_to_struct;
261
262
263 struct avtab te_avtab;
264
265
266 struct hashtab role_tr;
267
268
269
270 struct ebitmap filename_trans_ttypes;
271
272 struct hashtab filename_trans;
273
274 u32 compat_filename_trans_count;
275
276
277 struct cond_bool_datum **bool_val_to_struct;
278
279 struct avtab te_cond_avtab;
280
281 struct cond_node *cond_list;
282 u32 cond_list_len;
283
284
285 struct role_allow *role_allow;
286
287
288
289 struct ocontext *ocontexts[OCON_NUM];
290
291
292
293
294 struct genfs *genfs;
295
296
297 struct hashtab range_tr;
298
299
300 struct ebitmap *type_attr_map_array;
301
302 struct ebitmap policycaps;
303
304 struct ebitmap permissive_map;
305
306
307 size_t len;
308
309 unsigned int policyvers;
310
311 unsigned int reject_unknown : 1;
312 unsigned int allow_unknown : 1;
313
314 u16 process_class;
315 u32 process_trans_perms;
316} __randomize_layout;
317
318extern void policydb_destroy(struct policydb *p);
319extern int policydb_load_isids(struct policydb *p, struct sidtab *s);
320extern int policydb_context_isvalid(struct policydb *p, struct context *c);
321extern int policydb_class_isvalid(struct policydb *p, unsigned int class);
322extern int policydb_type_isvalid(struct policydb *p, unsigned int type);
323extern int policydb_role_isvalid(struct policydb *p, unsigned int role);
324extern int policydb_read(struct policydb *p, void *fp);
325extern int policydb_write(struct policydb *p, void *fp);
326
327extern struct filename_trans_datum *policydb_filenametr_search(
328 struct policydb *p, struct filename_trans_key *key);
329
330extern struct mls_range *policydb_rangetr_search(
331 struct policydb *p, struct range_trans *key);
332
333extern struct role_trans_datum *policydb_roletr_search(
334 struct policydb *p, struct role_trans_key *key);
335
336#define POLICYDB_CONFIG_MLS 1
337
338
339#define REJECT_UNKNOWN 0x00000002
340#define ALLOW_UNKNOWN 0x00000004
341
342#define OBJECT_R "object_r"
343#define OBJECT_R_VAL 1
344
345#define POLICYDB_MAGIC SELINUX_MAGIC
346#define POLICYDB_STRING "SE Linux"
347
348struct policy_file {
349 char *data;
350 size_t len;
351};
352
353struct policy_data {
354 struct policydb *p;
355 void *fp;
356};
357
358static inline int next_entry(void *buf, struct policy_file *fp, size_t bytes)
359{
360 if (bytes > fp->len)
361 return -EINVAL;
362
363 memcpy(buf, fp->data, bytes);
364 fp->data += bytes;
365 fp->len -= bytes;
366 return 0;
367}
368
369static inline int put_entry(const void *buf, size_t bytes, int num, struct policy_file *fp)
370{
371 size_t len = bytes * num;
372
373 memcpy(fp->data, buf, len);
374 fp->data += len;
375 fp->len -= len;
376
377 return 0;
378}
379
380static inline char *sym_name(struct policydb *p, unsigned int sym_num, unsigned int element_nr)
381{
382 return p->sym_val_to_name[sym_num][element_nr];
383}
384
385extern u16 string_to_security_class(struct policydb *p, const char *name);
386extern u32 string_to_av_perm(struct policydb *p, u16 tclass, const char *name);
387
388#endif
389
390