1 /* Author : Stephen Smalley, <sds@epoch.ncsc.mil> */
2 
3 /*
4  * Updated: Joshua Brindle <jbrindle@tresys.com>
5  *	    Karl MacMillan <kmacmillan@tresys.com>
6  *	    Jason Tang <jtang@tresys.com>
7  *
8  *	Module support
9  *
10  * Updated: Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com>
11  *
12  *	Support for enhanced MLS infrastructure.
13  *
14  * Updated: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com>
15  *
16  * 	Added conditional policy language extensions
17  *
18  * Updated: Red Hat, Inc.  James Morris <jmorris@redhat.com>
19  *
20  *      Fine-grained netlink support
21  *      IPv6 support
22  *      Code cleanup
23  *
24  * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
25  * Copyright (C) 2003 - 2004 Tresys Technology, LLC
26  * Copyright (C) 2003 - 2004 Red Hat, Inc.
27  *
28  *  This library is free software; you can redistribute it and/or
29  *  modify it under the terms of the GNU Lesser General Public
30  *  License as published by the Free Software Foundation; either
31  *  version 2.1 of the License, or (at your option) any later version.
32  *
33  *  This library is distributed in the hope that it will be useful,
34  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
35  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
36  *  Lesser General Public License for more details.
37  *
38  *  You should have received a copy of the GNU Lesser General Public
39  *  License along with this library; if not, write to the Free Software
40  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
41  */
42 
43 /* FLASK */
44 
45 /*
46  * A policy database (policydb) specifies the
47  * configuration data for the security policy.
48  */
49 
50 #ifndef _SEPOL_POLICYDB_POLICYDB_H_
51 #define _SEPOL_POLICYDB_POLICYDB_H_
52 
53 #include <stdio.h>
54 #include <stddef.h>
55 
56 #include <sepol/policydb.h>
57 
58 #include <sepol/policydb/flask_types.h>
59 #include <sepol/policydb/symtab.h>
60 #include <sepol/policydb/avtab.h>
61 #include <sepol/policydb/context.h>
62 #include <sepol/policydb/constraint.h>
63 #include <sepol/policydb/sidtab.h>
64 #include <sys/cdefs.h>
65 
66 #define ERRMSG_LEN 1024
67 
68 #define POLICYDB_SUCCESS      0
69 #define POLICYDB_ERROR       -1
70 #define POLICYDB_UNSUPPORTED -2
71 
72 __BEGIN_DECLS
73 
74 /*
75  * A datum type is defined for each kind of symbol
76  * in the configuration data:  individual permissions,
77  * common prefixes for access vectors, classes,
78  * users, roles, types, sensitivities, categories, etc.
79  */
80 
81 /* type set preserves data needed by modules such as *, ~ and attributes */
82 typedef struct type_set {
83 	ebitmap_t types;
84 	ebitmap_t negset;
85 #define TYPE_STAR 1
86 #define TYPE_COMP 2
87 	uint32_t flags;
88 } type_set_t;
89 
90 typedef struct role_set {
91 	ebitmap_t roles;
92 #define ROLE_STAR 1
93 #define ROLE_COMP 2
94 	uint32_t flags;
95 } role_set_t;
96 
97 /* Permission attributes */
98 typedef struct perm_datum {
99 	symtab_datum_t s;
100 } perm_datum_t;
101 
102 /* Attributes of a common prefix for access vectors */
103 typedef struct common_datum {
104 	symtab_datum_t s;
105 	symtab_t permissions;	/* common permissions */
106 } common_datum_t;
107 
108 /* Class attributes */
109 typedef struct class_datum {
110 	symtab_datum_t s;
111 	char *comkey;		/* common name */
112 	common_datum_t *comdatum;	/* common datum */
113 	symtab_t permissions;	/* class-specific permission symbol table */
114 	constraint_node_t *constraints;	/* constraints on class permissions */
115 	constraint_node_t *validatetrans;	/* special transition rules */
116 /* Options how a new object user and role should be decided */
117 #define DEFAULT_SOURCE		1
118 #define DEFAULT_TARGET		2
119 	char default_user;
120 	char default_role;
121 	char default_type;
122 /* Options how a new object range should be decided */
123 #define DEFAULT_SOURCE_LOW	1
124 #define DEFAULT_SOURCE_HIGH	2
125 #define DEFAULT_SOURCE_LOW_HIGH	3
126 #define DEFAULT_TARGET_LOW	4
127 #define DEFAULT_TARGET_HIGH	5
128 #define DEFAULT_TARGET_LOW_HIGH	6
129 	char default_range;
130 } class_datum_t;
131 
132 /* Role attributes */
133 typedef struct role_datum {
134 	symtab_datum_t s;
135 	ebitmap_t dominates;	/* set of roles dominated by this role */
136 	type_set_t types;	/* set of authorized types for role */
137 	ebitmap_t cache;	/* This is an expanded set used for context validation during parsing */
138 	uint32_t bounds;	/* bounds role, if exist */
139 #define ROLE_ROLE 0		/* regular role in kernel policies */
140 #define ROLE_ATTRIB 1		/* attribute */
141 	uint32_t flavor;
142 	ebitmap_t roles;	/* roles with this attribute */
143 } role_datum_t;
144 
145 typedef struct role_trans {
146 	uint32_t role;		/* current role */
147 	uint32_t type;		/* program executable type, or new object type */
148 	uint32_t tclass;	/* process class, or new object class */
149 	uint32_t new_role;	/* new role */
150 	struct role_trans *next;
151 } role_trans_t;
152 
153 typedef struct role_allow {
154 	uint32_t role;		/* current role */
155 	uint32_t new_role;	/* new role */
156 	struct role_allow *next;
157 } role_allow_t;
158 
159 /* filename_trans rules */
160 typedef struct filename_trans {
161 	uint32_t stype;
162 	uint32_t ttype;
163 	uint32_t tclass;
164 	char *name;
165 	uint32_t otype;
166 	struct filename_trans *next;
167 } filename_trans_t;
168 
169 /* Type attributes */
170 typedef struct type_datum {
171 	symtab_datum_t s;
172 	uint32_t primary;	/* primary name? can be set to primary value if below is TYPE_ */
173 #define TYPE_TYPE 0		/* regular type or alias in kernel policies */
174 #define TYPE_ATTRIB 1		/* attribute */
175 #define TYPE_ALIAS 2		/* alias in modular policy */
176 	uint32_t flavor;
177 	ebitmap_t types;	/* types with this attribute */
178 #define TYPE_FLAGS_PERMISSIVE	0x01
179 	uint32_t flags;
180 	uint32_t bounds;	/* bounds type, if exist */
181 } type_datum_t;
182 
183 /*
184  * Properties of type_datum
185  * available on the policy version >= (MOD_)POLICYDB_VERSION_BOUNDARY
186  */
187 #define TYPEDATUM_PROPERTY_PRIMARY	0x0001
188 #define TYPEDATUM_PROPERTY_ATTRIBUTE	0x0002
189 #define TYPEDATUM_PROPERTY_ALIAS	0x0004	/* userspace only */
190 #define TYPEDATUM_PROPERTY_PERMISSIVE	0x0008	/* userspace only */
191 
192 /* User attributes */
193 typedef struct user_datum {
194 	symtab_datum_t s;
195 	role_set_t roles;	/* set of authorized roles for user */
196 	mls_semantic_range_t range;	/* MLS range (min. - max.) for user */
197 	mls_semantic_level_t dfltlevel;	/* default login MLS level for user */
198 	ebitmap_t cache;	/* This is an expanded set used for context validation during parsing */
199 	mls_range_t exp_range;     /* expanded range used for validation */
200 	mls_level_t exp_dfltlevel; /* expanded range used for validation */
201 	uint32_t bounds;	/* bounds user, if exist */
202 } user_datum_t;
203 
204 /* Sensitivity attributes */
205 typedef struct level_datum {
206 	mls_level_t *level;	/* sensitivity and associated categories */
207 	unsigned char isalias;	/* is this sensitivity an alias for another? */
208 	unsigned char defined;
209 } level_datum_t;
210 
211 /* Category attributes */
212 typedef struct cat_datum {
213 	symtab_datum_t s;
214 	unsigned char isalias;	/* is this category an alias for another? */
215 } cat_datum_t;
216 
217 typedef struct range_trans {
218 	uint32_t source_type;
219 	uint32_t target_type;
220 	uint32_t target_class;
221 	mls_range_t target_range;
222 	struct range_trans *next;
223 } range_trans_t;
224 
225 /* Boolean data type */
226 typedef struct cond_bool_datum {
227 	symtab_datum_t s;
228 	int state;
229 #define COND_BOOL_FLAGS_TUNABLE	0x01	/* is this a tunable? */
230 	uint32_t flags;
231 } cond_bool_datum_t;
232 
233 struct cond_node;
234 
235 typedef struct cond_node cond_list_t;
236 struct cond_av_list;
237 
238 typedef struct class_perm_node {
239 	uint32_t tclass;
240 	uint32_t data;		/* permissions or new type */
241 	struct class_perm_node *next;
242 } class_perm_node_t;
243 
244 #define xperm_test(x, p) (1 & (p[x >> 5] >> (x & 0x1f)))
245 #define xperm_set(x, p) (p[x >> 5] |= (1 << (x & 0x1f)))
246 #define xperm_clear(x, p) (p[x >> 5] &= ~(1 << (x & 0x1f)))
247 #define EXTENDED_PERMS_LEN 8
248 
249 typedef struct av_extended_perms {
250 #define AVRULE_XPERMS_IOCTLFUNCTION	0x01
251 #define AVRULE_XPERMS_IOCTLDRIVER	0x02
252 	uint8_t specified;
253 	uint8_t driver;
254 	/* 256 bits of permissions */
255 	uint32_t perms[EXTENDED_PERMS_LEN];
256 } av_extended_perms_t;
257 
258 typedef struct avrule {
259 /* these typedefs are almost exactly the same as those in avtab.h - they are
260  * here because of the need to include neverallow and dontaudit messages */
261 #define AVRULE_ALLOWED			0x0001
262 #define AVRULE_AUDITALLOW		0x0002
263 #define AVRULE_AUDITDENY		0x0004
264 #define AVRULE_DONTAUDIT		0x0008
265 #define AVRULE_NEVERALLOW		0x0080
266 #define AVRULE_AV         (AVRULE_ALLOWED | AVRULE_AUDITALLOW | AVRULE_AUDITDENY | AVRULE_DONTAUDIT | AVRULE_NEVERALLOW)
267 #define AVRULE_TRANSITION		0x0010
268 #define AVRULE_MEMBER			0x0020
269 #define AVRULE_CHANGE			0x0040
270 #define AVRULE_TYPE       (AVRULE_TRANSITION | AVRULE_MEMBER | AVRULE_CHANGE)
271 #define AVRULE_XPERMS_ALLOWED 		0x0100
272 #define AVRULE_XPERMS_AUDITALLOW	0x0200
273 #define AVRULE_XPERMS_DONTAUDIT		0x0400
274 #define AVRULE_XPERMS_NEVERALLOW	0x0800
275 #define AVRULE_XPERMS	(AVRULE_XPERMS_ALLOWED | AVRULE_XPERMS_AUDITALLOW | \
276 				AVRULE_XPERMS_DONTAUDIT | AVRULE_XPERMS_NEVERALLOW)
277 	uint32_t specified;
278 #define RULE_SELF 1
279 	uint32_t flags;
280 	type_set_t stypes;
281 	type_set_t ttypes;
282 	class_perm_node_t *perms;
283 	av_extended_perms_t *xperms;
284 	unsigned long line;	/* line number from policy.conf where
285 				 * this rule originated  */
286 	/* source file name and line number (e.g. .te file) */
287 	char *source_filename;
288 	unsigned long source_line;
289 	struct avrule *next;
290 } avrule_t;
291 
292 typedef struct role_trans_rule {
293 	role_set_t roles;	/* current role */
294 	type_set_t types;	/* program executable type, or new object type */
295 	ebitmap_t classes;	/* process class, or new object class */
296 	uint32_t new_role;	/* new role */
297 	struct role_trans_rule *next;
298 } role_trans_rule_t;
299 
300 typedef struct role_allow_rule {
301 	role_set_t roles;	/* current role */
302 	role_set_t new_roles;	/* new roles */
303 	struct role_allow_rule *next;
304 } role_allow_rule_t;
305 
306 typedef struct filename_trans_rule {
307 	type_set_t stypes;
308 	type_set_t ttypes;
309 	uint32_t tclass;
310 	char *name;
311 	uint32_t otype;	/* new type */
312 	struct filename_trans_rule *next;
313 } filename_trans_rule_t;
314 
315 typedef struct range_trans_rule {
316 	type_set_t stypes;
317 	type_set_t ttypes;
318 	ebitmap_t tclasses;
319 	mls_semantic_range_t trange;
320 	struct range_trans_rule *next;
321 } range_trans_rule_t;
322 
323 /*
324  * The configuration data includes security contexts for
325  * initial SIDs, unlabeled file systems, TCP and UDP port numbers,
326  * network interfaces, and nodes.  This structure stores the
327  * relevant data for one such entry.  Entries of the same kind
328  * (e.g. all initial SIDs) are linked together into a list.
329  */
330 typedef struct ocontext {
331 	union {
332 		char *name;	/* name of initial SID, fs, netif, fstype, path */
333 		struct {
334 			uint8_t protocol;
335 			uint16_t low_port;
336 			uint16_t high_port;
337 		} port;		/* TCP or UDP port information */
338 		struct {
339 			uint32_t addr; /* network order */
340 			uint32_t mask; /* network order */
341 		} node;		/* node information */
342 		struct {
343 			uint32_t addr[4]; /* network order */
344 			uint32_t mask[4]; /* network order */
345 		} node6;	/* IPv6 node information */
346 		uint32_t device;
347 		uint16_t pirq;
348 		struct {
349 			uint64_t low_iomem;
350 			uint64_t high_iomem;
351 		} iomem;
352 		struct {
353 			uint32_t low_ioport;
354 			uint32_t high_ioport;
355 		} ioport;
356 	} u;
357 	union {
358 		uint32_t sclass;	/* security class for genfs */
359 		uint32_t behavior;	/* labeling behavior for fs_use */
360 	} v;
361 	context_struct_t context[2];	/* security context(s) */
362 	sepol_security_id_t sid[2];	/* SID(s) */
363 	struct ocontext *next;
364 } ocontext_t;
365 
366 typedef struct genfs {
367 	char *fstype;
368 	struct ocontext *head;
369 	struct genfs *next;
370 } genfs_t;
371 
372 /* symbol table array indices */
373 #define SYM_COMMONS 0
374 #define SYM_CLASSES 1
375 #define SYM_ROLES   2
376 #define SYM_TYPES   3
377 #define SYM_USERS   4
378 #define SYM_BOOLS   5
379 #define SYM_LEVELS  6
380 #define SYM_CATS    7
381 #define SYM_NUM     8
382 
383 /* object context array indices */
384 #define OCON_ISID  0		/* initial SIDs */
385 #define OCON_FS    1		/* unlabeled file systems */
386 #define OCON_PORT  2		/* TCP and UDP port numbers */
387 #define OCON_NETIF 3		/* network interfaces */
388 #define OCON_NODE  4		/* nodes */
389 #define OCON_FSUSE 5		/* fs_use */
390 #define OCON_NODE6 6		/* IPv6 nodes */
391 #define OCON_GENFS 7            /* needed for ocontext_supported */
392 
393 /* object context array indices for Xen */
394 #define OCON_XEN_ISID  	    0    /* initial SIDs */
395 #define OCON_XEN_PIRQ       1    /* physical irqs */
396 #define OCON_XEN_IOPORT     2    /* io ports */
397 #define OCON_XEN_IOMEM	    3    /* io memory */
398 #define OCON_XEN_PCIDEVICE  4    /* pci devices */
399 #define OCON_XEN_DEVICETREE 5    /* device tree node */
400 
401 /* OCON_NUM needs to be the largest index in any platform's ocontext array */
402 #define OCON_NUM   7
403 
404 /* section: module information */
405 
406 /* scope_index_t holds all of the symbols that are in scope in a
407  * particular situation.  The bitmaps are indices (and thus must
408  * subtract one) into the global policydb->scope array. */
409 typedef struct scope_index {
410 	ebitmap_t scope[SYM_NUM];
411 #define p_classes_scope scope[SYM_CLASSES]
412 #define p_roles_scope scope[SYM_ROLES]
413 #define p_types_scope scope[SYM_TYPES]
414 #define p_users_scope scope[SYM_USERS]
415 #define p_bools_scope scope[SYM_BOOLS]
416 #define p_sens_scope scope[SYM_LEVELS]
417 #define p_cat_scope scope[SYM_CATS]
418 
419 	/* this array maps from class->value to the permissions within
420 	 * scope.  if bit (perm->value - 1) is set in map
421 	 * class_perms_map[class->value - 1] then that permission is
422 	 * enabled for this class within this decl.  */
423 	ebitmap_t *class_perms_map;
424 	/* total number of classes in class_perms_map array */
425 	uint32_t class_perms_len;
426 } scope_index_t;
427 
428 /* a list of declarations for a particular avrule_decl */
429 
430 /* These two structs declare a block of policy that has TE and RBAC
431  * statements and declarations.  The root block (the global policy)
432  * can never have an ELSE branch. */
433 typedef struct avrule_decl {
434 	uint32_t decl_id;
435 	uint32_t enabled;	/* whether this block is enabled */
436 
437 	cond_list_t *cond_list;
438 	avrule_t *avrules;
439 	role_trans_rule_t *role_tr_rules;
440 	role_allow_rule_t *role_allow_rules;
441 	range_trans_rule_t *range_tr_rules;
442 	scope_index_t required;	/* symbols needed to activate this block */
443 	scope_index_t declared;	/* symbols declared within this block */
444 
445 	/* type transition rules with a 'name' component */
446 	filename_trans_rule_t *filename_trans_rules;
447 
448 	/* for additive statements (type attribute, roles, and users) */
449 	symtab_t symtab[SYM_NUM];
450 
451 	/* In a linked module this will contain the name of the module
452 	 * from which this avrule_decl originated. */
453 	char *module_name;
454 
455 	struct avrule_decl *next;
456 } avrule_decl_t;
457 
458 typedef struct avrule_block {
459 	avrule_decl_t *branch_list;
460 	avrule_decl_t *enabled;	/* pointer to which branch is enabled.  this is
461 				   used in linking and never written to disk */
462 #define AVRULE_OPTIONAL 1
463 	uint32_t flags;		/* any flags for this block, currently just optional */
464 	struct avrule_block *next;
465 } avrule_block_t;
466 
467 /* Every identifier has its own scope datum.  The datum describes if
468  * the item is to be included into the final policy during
469  * expansion. */
470 typedef struct scope_datum {
471 /* Required for this decl */
472 #define SCOPE_REQ  1
473 /* Declared in this decl */
474 #define SCOPE_DECL 2
475 	uint32_t scope;
476 	uint32_t *decl_ids;
477 	uint32_t decl_ids_len;
478 	/* decl_ids is a list of avrule_decl's that declare/require
479 	 * this symbol.  If scope==SCOPE_DECL then this is a list of
480 	 * declarations.  If the symbol may only be declared once
481 	 * (types, bools) then decl_ids_len will be exactly 1.  For
482 	 * implicitly declared things (roles, users) then decl_ids_len
483 	 * will be at least 1. */
484 } scope_datum_t;
485 
486 /* The policy database */
487 typedef struct policydb {
488 #define POLICY_KERN SEPOL_POLICY_KERN
489 #define POLICY_BASE SEPOL_POLICY_BASE
490 #define POLICY_MOD SEPOL_POLICY_MOD
491 	uint32_t policy_type;
492 	char *name;
493 	char *version;
494 	int  target_platform;
495 
496 	/* Set when the policydb is modified such that writing is unsupported */
497 	int unsupported_format;
498 
499 	/* Whether this policydb is mls, should always be set */
500 	int mls;
501 
502 	/* symbol tables */
503 	symtab_t symtab[SYM_NUM];
504 #define p_commons symtab[SYM_COMMONS]
505 #define p_classes symtab[SYM_CLASSES]
506 #define p_roles symtab[SYM_ROLES]
507 #define p_types symtab[SYM_TYPES]
508 #define p_users symtab[SYM_USERS]
509 #define p_bools symtab[SYM_BOOLS]
510 #define p_levels symtab[SYM_LEVELS]
511 #define p_cats symtab[SYM_CATS]
512 
513 	/* symbol names indexed by (value - 1) */
514 	char **sym_val_to_name[SYM_NUM];
515 #define p_common_val_to_name sym_val_to_name[SYM_COMMONS]
516 #define p_class_val_to_name sym_val_to_name[SYM_CLASSES]
517 #define p_role_val_to_name sym_val_to_name[SYM_ROLES]
518 #define p_type_val_to_name sym_val_to_name[SYM_TYPES]
519 #define p_user_val_to_name sym_val_to_name[SYM_USERS]
520 #define p_bool_val_to_name sym_val_to_name[SYM_BOOLS]
521 #define p_sens_val_to_name sym_val_to_name[SYM_LEVELS]
522 #define p_cat_val_to_name sym_val_to_name[SYM_CATS]
523 
524 	/* class, role, and user attributes indexed by (value - 1) */
525 	class_datum_t **class_val_to_struct;
526 	role_datum_t **role_val_to_struct;
527 	user_datum_t **user_val_to_struct;
528 	type_datum_t **type_val_to_struct;
529 
530 	/* module stuff section -- used in parsing and for modules */
531 
532 	/* keep track of the scope for every identifier.  these are
533 	 * hash tables, where the key is the identifier name and value
534 	 * a scope_datum_t.  as a convenience, one may use the
535 	 * p_*_macros (cf. struct scope_index_t declaration). */
536 	symtab_t scope[SYM_NUM];
537 
538 	/* module rule storage */
539 	avrule_block_t *global;
540 	/* avrule_decl index used for link/expand */
541 	avrule_decl_t **decl_val_to_struct;
542 
543 	/* compiled storage of rules - use for the kernel policy */
544 
545 	/* type enforcement access vectors and transitions */
546 	avtab_t te_avtab;
547 
548 	/* bools indexed by (value - 1) */
549 	cond_bool_datum_t **bool_val_to_struct;
550 	/* type enforcement conditional access vectors and transitions */
551 	avtab_t te_cond_avtab;
552 	/* linked list indexing te_cond_avtab by conditional */
553 	cond_list_t *cond_list;
554 
555 	/* role transitions */
556 	role_trans_t *role_tr;
557 
558 	/* type transition rules with a 'name' component */
559 	filename_trans_t *filename_trans;
560 
561 	/* role allows */
562 	role_allow_t *role_allow;
563 
564 	/* security contexts of initial SIDs, unlabeled file systems,
565 	   TCP or UDP port numbers, network interfaces and nodes */
566 	ocontext_t *ocontexts[OCON_NUM];
567 
568 	/* security contexts for files in filesystems that cannot support
569 	   a persistent label mapping or use another
570 	   fixed labeling behavior. */
571 	genfs_t *genfs;
572 
573 	/* range transitions */
574 	range_trans_t *range_tr;
575 
576 	ebitmap_t *type_attr_map;
577 
578 	ebitmap_t *attr_type_map;	/* not saved in the binary policy */
579 
580 	ebitmap_t policycaps;
581 
582 	/* this bitmap is referenced by type NOT the typical type-1 used in other
583 	   bitmaps.  Someday the 0 bit may be used for global permissive */
584 	ebitmap_t permissive_map;
585 
586 	unsigned policyvers;
587 
588 	unsigned handle_unknown;
589 } policydb_t;
590 
591 struct sepol_policydb {
592 	struct policydb p;
593 };
594 
595 extern int policydb_init(policydb_t * p);
596 
597 extern int policydb_from_image(sepol_handle_t * handle,
598 			       void *data, size_t len, policydb_t * policydb);
599 
600 extern int policydb_to_image(sepol_handle_t * handle,
601 			     policydb_t * policydb, void **newdata,
602 			     size_t * newlen);
603 
604 extern int policydb_index_classes(policydb_t * p);
605 
606 extern int policydb_index_bools(policydb_t * p);
607 
608 extern int policydb_index_others(sepol_handle_t * handle, policydb_t * p,
609 				 unsigned int verbose);
610 
611 extern int policydb_reindex_users(policydb_t * p);
612 
613 extern void policydb_destroy(policydb_t * p);
614 
615 extern int policydb_load_isids(policydb_t * p, sidtab_t * s);
616 
617 /* Deprecated */
618 extern int policydb_context_isvalid(const policydb_t * p,
619 				    const context_struct_t * c);
620 
621 extern void symtabs_destroy(symtab_t * symtab);
622 extern int scope_destroy(hashtab_key_t key, hashtab_datum_t datum, void *p);
623 typedef void (*hashtab_destroy_func_t) (hashtab_key_t k, hashtab_datum_t d,
624 					void *args);
625 extern hashtab_destroy_func_t get_symtab_destroy_func(int sym_num);
626 
627 extern void class_perm_node_init(class_perm_node_t * x);
628 extern void type_set_init(type_set_t * x);
629 extern void type_set_destroy(type_set_t * x);
630 extern int type_set_cpy(type_set_t * dst, type_set_t * src);
631 extern int type_set_or_eq(type_set_t * dst, type_set_t * other);
632 extern void role_set_init(role_set_t * x);
633 extern void role_set_destroy(role_set_t * x);
634 extern void avrule_init(avrule_t * x);
635 extern void avrule_destroy(avrule_t * x);
636 extern void avrule_list_destroy(avrule_t * x);
637 extern void role_trans_rule_init(role_trans_rule_t * x);
638 extern void role_trans_rule_list_destroy(role_trans_rule_t * x);
639 extern void filename_trans_rule_init(filename_trans_rule_t * x);
640 extern void filename_trans_rule_list_destroy(filename_trans_rule_t * x);
641 
642 extern void role_datum_init(role_datum_t * x);
643 extern void role_datum_destroy(role_datum_t * x);
644 extern void role_allow_rule_init(role_allow_rule_t * x);
645 extern void role_allow_rule_destroy(role_allow_rule_t * x);
646 extern void role_allow_rule_list_destroy(role_allow_rule_t * x);
647 extern void range_trans_rule_init(range_trans_rule_t *x);
648 extern void range_trans_rule_destroy(range_trans_rule_t *x);
649 extern void range_trans_rule_list_destroy(range_trans_rule_t *x);
650 extern void type_datum_init(type_datum_t * x);
651 extern void type_datum_destroy(type_datum_t * x);
652 extern void user_datum_init(user_datum_t * x);
653 extern void user_datum_destroy(user_datum_t * x);
654 extern void level_datum_init(level_datum_t * x);
655 extern void level_datum_destroy(level_datum_t * x);
656 extern void cat_datum_init(cat_datum_t * x);
657 extern void cat_datum_destroy(cat_datum_t * x);
658 extern int check_assertion(policydb_t *p, avrule_t *avrule);
659 extern int check_assertions(sepol_handle_t * handle,
660 			    policydb_t * p, avrule_t * avrules);
661 
662 extern int symtab_insert(policydb_t * x, uint32_t sym,
663 			 hashtab_key_t key, hashtab_datum_t datum,
664 			 uint32_t scope, uint32_t avrule_decl_id,
665 			 uint32_t * value);
666 
667 /* A policy "file" may be a memory region referenced by a (data, len) pair
668    or a file referenced by a FILE pointer. */
669 typedef struct policy_file {
670 #define PF_USE_MEMORY  0
671 #define PF_USE_STDIO   1
672 #define PF_LEN         2	/* total up length in len field */
673 	unsigned type;
674 	char *data;
675 	size_t len;
676 	size_t size;
677 	FILE *fp;
678 	struct sepol_handle *handle;
679 } policy_file_t;
680 
681 struct sepol_policy_file {
682 	struct policy_file pf;
683 };
684 
685 extern void policy_file_init(policy_file_t * x);
686 
687 extern int policydb_read(policydb_t * p, struct policy_file *fp,
688 			 unsigned int verbose);
689 extern int avrule_read_list(policydb_t * p, avrule_t ** avrules,
690 			    struct policy_file *fp);
691 
692 extern int policydb_write(struct policydb *p, struct policy_file *pf);
693 extern int policydb_set_target_platform(policydb_t *p, int platform);
694 
695 #define PERM_SYMTAB_SIZE 32
696 
697 /* Identify specific policy version changes */
698 #define POLICYDB_VERSION_BASE		15
699 #define POLICYDB_VERSION_BOOL		16
700 #define POLICYDB_VERSION_IPV6		17
701 #define POLICYDB_VERSION_NLCLASS	18
702 #define POLICYDB_VERSION_VALIDATETRANS	19
703 #define POLICYDB_VERSION_MLS		19
704 #define POLICYDB_VERSION_AVTAB		20
705 #define POLICYDB_VERSION_RANGETRANS	21
706 #define POLICYDB_VERSION_POLCAP		22
707 #define POLICYDB_VERSION_PERMISSIVE	23
708 #define POLICYDB_VERSION_BOUNDARY	24
709 #define POLICYDB_VERSION_FILENAME_TRANS	25
710 #define POLICYDB_VERSION_ROLETRANS	26
711 #define POLICYDB_VERSION_NEW_OBJECT_DEFAULTS	27
712 #define POLICYDB_VERSION_DEFAULT_TYPE	28
713 #define POLICYDB_VERSION_CONSTRAINT_NAMES	29
714 #define POLICYDB_VERSION_XEN_DEVICETREE		30 /* Xen-specific */
715 #define POLICYDB_VERSION_XPERMS_IOCTL	30 /* Linux-specific */
716 
717 /* Range of policy versions we understand*/
718 #define POLICYDB_VERSION_MIN	POLICYDB_VERSION_BASE
719 #define POLICYDB_VERSION_MAX	POLICYDB_VERSION_XPERMS_IOCTL
720 
721 /* Module versions and specific changes*/
722 #define MOD_POLICYDB_VERSION_BASE		4
723 #define MOD_POLICYDB_VERSION_VALIDATETRANS	5
724 #define MOD_POLICYDB_VERSION_MLS		5
725 #define MOD_POLICYDB_VERSION_RANGETRANS 	6
726 #define MOD_POLICYDB_VERSION_MLS_USERS		6
727 #define MOD_POLICYDB_VERSION_POLCAP		7
728 #define MOD_POLICYDB_VERSION_PERMISSIVE		8
729 #define MOD_POLICYDB_VERSION_BOUNDARY		9
730 #define MOD_POLICYDB_VERSION_BOUNDARY_ALIAS	10
731 #define MOD_POLICYDB_VERSION_FILENAME_TRANS	11
732 #define MOD_POLICYDB_VERSION_ROLETRANS		12
733 #define MOD_POLICYDB_VERSION_ROLEATTRIB		13
734 #define MOD_POLICYDB_VERSION_TUNABLE_SEP	14
735 #define MOD_POLICYDB_VERSION_NEW_OBJECT_DEFAULTS	15
736 #define MOD_POLICYDB_VERSION_DEFAULT_TYPE	16
737 #define MOD_POLICYDB_VERSION_CONSTRAINT_NAMES  17
738 
739 #define MOD_POLICYDB_VERSION_MIN MOD_POLICYDB_VERSION_BASE
740 #define MOD_POLICYDB_VERSION_MAX MOD_POLICYDB_VERSION_CONSTRAINT_NAMES
741 
742 #define POLICYDB_CONFIG_MLS    1
743 
744 /* macros to check policy feature */
745 
746 /* TODO: add other features here */
747 
748 #define policydb_has_boundary_feature(p)			\
749 	(((p)->policy_type == POLICY_KERN			\
750 	  && p->policyvers >= POLICYDB_VERSION_BOUNDARY) ||	\
751 	 ((p)->policy_type != POLICY_KERN			\
752 	  && p->policyvers >= MOD_POLICYDB_VERSION_BOUNDARY))
753 
754 /* the config flags related to unknown classes/perms are bits 2 and 3 */
755 #define DENY_UNKNOWN	SEPOL_DENY_UNKNOWN
756 #define REJECT_UNKNOWN	SEPOL_REJECT_UNKNOWN
757 #define ALLOW_UNKNOWN 	SEPOL_ALLOW_UNKNOWN
758 
759 #define POLICYDB_CONFIG_UNKNOWN_MASK	(DENY_UNKNOWN | REJECT_UNKNOWN | ALLOW_UNKNOWN)
760 
761 #define OBJECT_R "object_r"
762 #define OBJECT_R_VAL 1
763 
764 #define POLICYDB_MAGIC SELINUX_MAGIC
765 #define POLICYDB_STRING "SE Linux"
766 #define POLICYDB_XEN_STRING "XenFlask"
767 #define POLICYDB_STRING_MAX_LENGTH 32
768 #define POLICYDB_MOD_MAGIC SELINUX_MOD_MAGIC
769 #define POLICYDB_MOD_STRING "SE Linux Module"
770 
771 __END_DECLS
772 #endif				/* _POLICYDB_H_ */
773 
774 /* FLASK */
775