1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * An access vector table (avtab) is a hash table 4*4882a593Smuzhiyun * of access vectors and transition types indexed 5*4882a593Smuzhiyun * by a type pair and a class. An access vector 6*4882a593Smuzhiyun * table is used to represent the type enforcement 7*4882a593Smuzhiyun * tables. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Author : Stephen Smalley, <sds@tycho.nsa.gov> 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* Updated: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com> 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * Added conditional policy language extensions 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun * Copyright (C) 2003 Tresys Technology, LLC 17*4882a593Smuzhiyun * 18*4882a593Smuzhiyun * Updated: Yuichi Nakamura <ynakam@hitachisoft.jp> 19*4882a593Smuzhiyun * Tuned number of hash slots for avtab to reduce memory usage 20*4882a593Smuzhiyun */ 21*4882a593Smuzhiyun #ifndef _SS_AVTAB_H_ 22*4882a593Smuzhiyun #define _SS_AVTAB_H_ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #include "security.h" 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct avtab_key { 27*4882a593Smuzhiyun u16 source_type; /* source type */ 28*4882a593Smuzhiyun u16 target_type; /* target type */ 29*4882a593Smuzhiyun u16 target_class; /* target object class */ 30*4882a593Smuzhiyun #define AVTAB_ALLOWED 0x0001 31*4882a593Smuzhiyun #define AVTAB_AUDITALLOW 0x0002 32*4882a593Smuzhiyun #define AVTAB_AUDITDENY 0x0004 33*4882a593Smuzhiyun #define AVTAB_AV (AVTAB_ALLOWED | AVTAB_AUDITALLOW | AVTAB_AUDITDENY) 34*4882a593Smuzhiyun #define AVTAB_TRANSITION 0x0010 35*4882a593Smuzhiyun #define AVTAB_MEMBER 0x0020 36*4882a593Smuzhiyun #define AVTAB_CHANGE 0x0040 37*4882a593Smuzhiyun #define AVTAB_TYPE (AVTAB_TRANSITION | AVTAB_MEMBER | AVTAB_CHANGE) 38*4882a593Smuzhiyun /* extended permissions */ 39*4882a593Smuzhiyun #define AVTAB_XPERMS_ALLOWED 0x0100 40*4882a593Smuzhiyun #define AVTAB_XPERMS_AUDITALLOW 0x0200 41*4882a593Smuzhiyun #define AVTAB_XPERMS_DONTAUDIT 0x0400 42*4882a593Smuzhiyun #define AVTAB_XPERMS (AVTAB_XPERMS_ALLOWED | \ 43*4882a593Smuzhiyun AVTAB_XPERMS_AUDITALLOW | \ 44*4882a593Smuzhiyun AVTAB_XPERMS_DONTAUDIT) 45*4882a593Smuzhiyun #define AVTAB_ENABLED_OLD 0x80000000 /* reserved for used in cond_avtab */ 46*4882a593Smuzhiyun #define AVTAB_ENABLED 0x8000 /* reserved for used in cond_avtab */ 47*4882a593Smuzhiyun u16 specified; /* what field is specified */ 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* 51*4882a593Smuzhiyun * For operations that require more than the 32 permissions provided by the avc 52*4882a593Smuzhiyun * extended permissions may be used to provide 256 bits of permissions. 53*4882a593Smuzhiyun */ 54*4882a593Smuzhiyun struct avtab_extended_perms { 55*4882a593Smuzhiyun /* These are not flags. All 256 values may be used */ 56*4882a593Smuzhiyun #define AVTAB_XPERMS_IOCTLFUNCTION 0x01 57*4882a593Smuzhiyun #define AVTAB_XPERMS_IOCTLDRIVER 0x02 58*4882a593Smuzhiyun /* extension of the avtab_key specified */ 59*4882a593Smuzhiyun u8 specified; /* ioctl, netfilter, ... */ 60*4882a593Smuzhiyun /* 61*4882a593Smuzhiyun * if 256 bits is not adequate as is often the case with ioctls, then 62*4882a593Smuzhiyun * multiple extended perms may be used and the driver field 63*4882a593Smuzhiyun * specifies which permissions are included. 64*4882a593Smuzhiyun */ 65*4882a593Smuzhiyun u8 driver; 66*4882a593Smuzhiyun /* 256 bits of permissions */ 67*4882a593Smuzhiyun struct extended_perms_data perms; 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun struct avtab_datum { 71*4882a593Smuzhiyun union { 72*4882a593Smuzhiyun u32 data; /* access vector or type value */ 73*4882a593Smuzhiyun struct avtab_extended_perms *xperms; 74*4882a593Smuzhiyun } u; 75*4882a593Smuzhiyun }; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun struct avtab_node { 78*4882a593Smuzhiyun struct avtab_key key; 79*4882a593Smuzhiyun struct avtab_datum datum; 80*4882a593Smuzhiyun struct avtab_node *next; 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun struct avtab { 84*4882a593Smuzhiyun struct avtab_node **htable; 85*4882a593Smuzhiyun u32 nel; /* number of elements */ 86*4882a593Smuzhiyun u32 nslot; /* number of hash slots */ 87*4882a593Smuzhiyun u32 mask; /* mask to compute hash func */ 88*4882a593Smuzhiyun }; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun void avtab_init(struct avtab *h); 91*4882a593Smuzhiyun int avtab_alloc(struct avtab *, u32); 92*4882a593Smuzhiyun int avtab_alloc_dup(struct avtab *new, const struct avtab *orig); 93*4882a593Smuzhiyun struct avtab_datum *avtab_search(struct avtab *h, struct avtab_key *k); 94*4882a593Smuzhiyun void avtab_destroy(struct avtab *h); 95*4882a593Smuzhiyun void avtab_hash_eval(struct avtab *h, char *tag); 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun struct policydb; 98*4882a593Smuzhiyun int avtab_read_item(struct avtab *a, void *fp, struct policydb *pol, 99*4882a593Smuzhiyun int (*insert)(struct avtab *a, struct avtab_key *k, 100*4882a593Smuzhiyun struct avtab_datum *d, void *p), 101*4882a593Smuzhiyun void *p); 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun int avtab_read(struct avtab *a, void *fp, struct policydb *pol); 104*4882a593Smuzhiyun int avtab_write_item(struct policydb *p, struct avtab_node *cur, void *fp); 105*4882a593Smuzhiyun int avtab_write(struct policydb *p, struct avtab *a, void *fp); 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun struct avtab_node *avtab_insert_nonunique(struct avtab *h, struct avtab_key *key, 108*4882a593Smuzhiyun struct avtab_datum *datum); 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun struct avtab_node *avtab_search_node(struct avtab *h, struct avtab_key *key); 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun struct avtab_node *avtab_search_node_next(struct avtab_node *node, int specified); 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun #define MAX_AVTAB_HASH_BITS 16 115*4882a593Smuzhiyun #define MAX_AVTAB_HASH_BUCKETS (1 << MAX_AVTAB_HASH_BITS) 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun #endif /* _SS_AVTAB_H_ */ 118*4882a593Smuzhiyun 119