xref: /openbmc/linux/security/selinux/ss/sidtab.h (revision b24413180f5600bcb3bb70fbed5cf186b60864bd)
1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * A security identifier table (sidtab) is a hash table
41da177e4SLinus Torvalds  * of security context structures indexed by SID value.
51da177e4SLinus Torvalds  *
67efbb60bSStephen Smalley  * Author : Stephen Smalley, <sds@tycho.nsa.gov>
71da177e4SLinus Torvalds  */
81da177e4SLinus Torvalds #ifndef _SS_SIDTAB_H_
91da177e4SLinus Torvalds #define _SS_SIDTAB_H_
101da177e4SLinus Torvalds 
111da177e4SLinus Torvalds #include "context.h"
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds struct sidtab_node {
141da177e4SLinus Torvalds 	u32 sid;		/* security identifier */
151da177e4SLinus Torvalds 	struct context context;	/* security context structure */
161da177e4SLinus Torvalds 	struct sidtab_node *next;
171da177e4SLinus Torvalds };
181da177e4SLinus Torvalds 
191da177e4SLinus Torvalds #define SIDTAB_HASH_BITS 7
201da177e4SLinus Torvalds #define SIDTAB_HASH_BUCKETS (1 << SIDTAB_HASH_BITS)
211da177e4SLinus Torvalds #define SIDTAB_HASH_MASK (SIDTAB_HASH_BUCKETS-1)
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds #define SIDTAB_SIZE SIDTAB_HASH_BUCKETS
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds struct sidtab {
261da177e4SLinus Torvalds 	struct sidtab_node **htable;
271da177e4SLinus Torvalds 	unsigned int nel;	/* number of elements */
281da177e4SLinus Torvalds 	unsigned int next_sid;	/* next SID to allocate */
291da177e4SLinus Torvalds 	unsigned char shutdown;
3073ff5fc0SEric Paris #define SIDTAB_CACHE_LEN	3
3173ff5fc0SEric Paris 	struct sidtab_node *cache[SIDTAB_CACHE_LEN];
321da177e4SLinus Torvalds 	spinlock_t lock;
331da177e4SLinus Torvalds };
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds int sidtab_init(struct sidtab *s);
361da177e4SLinus Torvalds int sidtab_insert(struct sidtab *s, u32 sid, struct context *context);
371da177e4SLinus Torvalds struct context *sidtab_search(struct sidtab *s, u32 sid);
3812b29f34SStephen Smalley struct context *sidtab_search_force(struct sidtab *s, u32 sid);
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds int sidtab_map(struct sidtab *s,
411da177e4SLinus Torvalds 	       int (*apply) (u32 sid,
421da177e4SLinus Torvalds 			     struct context *context,
431da177e4SLinus Torvalds 			     void *args),
441da177e4SLinus Torvalds 	       void *args);
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds int sidtab_context_to_sid(struct sidtab *s,
471da177e4SLinus Torvalds 			  struct context *context,
481da177e4SLinus Torvalds 			  u32 *sid);
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds void sidtab_hash_eval(struct sidtab *h, char *tag);
511da177e4SLinus Torvalds void sidtab_destroy(struct sidtab *s);
521da177e4SLinus Torvalds void sidtab_set(struct sidtab *dst, struct sidtab *src);
531da177e4SLinus Torvalds void sidtab_shutdown(struct sidtab *s);
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds #endif	/* _SS_SIDTAB_H_ */
561da177e4SLinus Torvalds 
571da177e4SLinus Torvalds 
58