1 2 /* Author : Stephen Smalley, <sds (at) epoch.ncsc.mil> */ 3 4 /* FLASK */ 5 6 /* 7 * A security context is a set of security attributes 8 * associated with each subject and object controlled 9 * by the security policy. Security contexts are 10 * externally represented as variable-length strings 11 * that can be interpreted by a user or application 12 * with an understanding of the security policy. 13 * Internally, the security server uses a simple 14 * structure. This structure is private to the 15 * security server and can be changed without affecting 16 * clients of the security server. 17 */ 18 19 #ifndef _SEPOL_POLICYDB_CONTEXT_H_ 20 #define _SEPOL_POLICYDB_CONTEXT_H_ 21 22 #include <stddef.h> 23 #include <sepol/policydb/ebitmap.h> 24 #include <sepol/policydb/mls_types.h> 25 26 /* 27 * A security context consists of an authenticated user 28 * identity, a role, a type and a MLS range. 29 */ 30 typedef struct context_struct { 31 uint32_t user; 32 uint32_t role; 33 uint32_t type; 34 mls_range_t range; 35 } context_struct_t; 36 37 static inline void mls_context_init(context_struct_t * c) 38 { 39 mls_range_init(&c->range); 40 } 41 42 static inline int mls_context_cpy(context_struct_t * dst, 43 context_struct_t * src) 44 { 45 46 if (mls_range_cpy(&dst->range, &src->range) < 0) 47 return -1; 48 49 return 0; 50 } 51 52 static inline int mls_context_cmp(context_struct_t * c1, context_struct_t * c2) 53 { 54 return (mls_level_eq(&c1->range.level[0], &c2->range.level[0]) && 55 mls_level_eq(&c1->range.level[1], &c2->range.level[1])); 56 57 } 58 59 static inline void mls_context_destroy(context_struct_t * c) 60 { 61 if (c == NULL) 62 return; 63 64 mls_range_destroy(&c->range); 65 mls_context_init(c); 66 } 67 68 static inline void context_init(context_struct_t * c) 69 { 70 memset(c, 0, sizeof(*c)); 71 } 72 73 static inline int context_cpy(context_struct_t * dst, context_struct_t * src) 74 { 75 dst->user = src->user; 76 dst->role = src->role; 77 dst->type = src->type; 78 return mls_context_cpy(dst, src); 79 } 80 81 static inline void context_destroy(context_struct_t * c) 82 { 83 if (c == NULL) 84 return; 85 86 c->user = c->role = c->type = 0; 87 mls_context_destroy(c); 88 } 89 90 static inline int context_cmp(context_struct_t * c1, context_struct_t * c2) 91 { 92 return ((c1->user == c2->user) && 93 (c1->role == c2->role) && 94 (c1->type == c2->type) && mls_context_cmp(c1, c2)); 95 } 96 97 #endif 98