xref: /aosp_15_r20/external/selinux/libselinux/src/label_internal.h (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker /*
2*2d543d20SAndroid Build Coastguard Worker  * This file describes the internal interface used by the labeler
3*2d543d20SAndroid Build Coastguard Worker  * for calling the user-supplied memory allocation, validation,
4*2d543d20SAndroid Build Coastguard Worker  * and locking routine.
5*2d543d20SAndroid Build Coastguard Worker  *
6*2d543d20SAndroid Build Coastguard Worker  * Author : Eamon Walsh <[email protected]>
7*2d543d20SAndroid Build Coastguard Worker  */
8*2d543d20SAndroid Build Coastguard Worker #ifndef _SELABEL_INTERNAL_H_
9*2d543d20SAndroid Build Coastguard Worker #define _SELABEL_INTERNAL_H_
10*2d543d20SAndroid Build Coastguard Worker 
11*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
12*2d543d20SAndroid Build Coastguard Worker #include <stdarg.h>
13*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
14*2d543d20SAndroid Build Coastguard Worker #include <selinux/selinux.h>
15*2d543d20SAndroid Build Coastguard Worker #include <selinux/label.h>
16*2d543d20SAndroid Build Coastguard Worker #include "sha1.h"
17*2d543d20SAndroid Build Coastguard Worker 
18*2d543d20SAndroid Build Coastguard Worker #if defined(ANDROID) || defined(__APPLE__)
19*2d543d20SAndroid Build Coastguard Worker // Android and Mac do not have fgets_unlocked()
20*2d543d20SAndroid Build Coastguard Worker #define fgets_unlocked(buf, size, fp) fgets(buf, size, fp)
21*2d543d20SAndroid Build Coastguard Worker #endif
22*2d543d20SAndroid Build Coastguard Worker 
23*2d543d20SAndroid Build Coastguard Worker /*
24*2d543d20SAndroid Build Coastguard Worker  * Installed backends
25*2d543d20SAndroid Build Coastguard Worker  */
26*2d543d20SAndroid Build Coastguard Worker int selabel_file_init(struct selabel_handle *rec,
27*2d543d20SAndroid Build Coastguard Worker 			    const struct selinux_opt *opts,
28*2d543d20SAndroid Build Coastguard Worker 			    unsigned nopts) ;
29*2d543d20SAndroid Build Coastguard Worker int selabel_media_init(struct selabel_handle *rec,
30*2d543d20SAndroid Build Coastguard Worker 			    const struct selinux_opt *opts,
31*2d543d20SAndroid Build Coastguard Worker 			    unsigned nopts) ;
32*2d543d20SAndroid Build Coastguard Worker int selabel_x_init(struct selabel_handle *rec,
33*2d543d20SAndroid Build Coastguard Worker 			    const struct selinux_opt *opts,
34*2d543d20SAndroid Build Coastguard Worker 			    unsigned nopts) ;
35*2d543d20SAndroid Build Coastguard Worker int selabel_db_init(struct selabel_handle *rec,
36*2d543d20SAndroid Build Coastguard Worker 			    const struct selinux_opt *opts,
37*2d543d20SAndroid Build Coastguard Worker 			    unsigned nopts) ;
38*2d543d20SAndroid Build Coastguard Worker int selabel_property_init(struct selabel_handle *rec,
39*2d543d20SAndroid Build Coastguard Worker 			    const struct selinux_opt *opts,
40*2d543d20SAndroid Build Coastguard Worker 			    unsigned nopts) ;
41*2d543d20SAndroid Build Coastguard Worker int selabel_exact_match_init(struct selabel_handle *rec,
42*2d543d20SAndroid Build Coastguard Worker 			    const struct selinux_opt *opts,
43*2d543d20SAndroid Build Coastguard Worker 			    unsigned nopts) ;
44*2d543d20SAndroid Build Coastguard Worker 
45*2d543d20SAndroid Build Coastguard Worker /*
46*2d543d20SAndroid Build Coastguard Worker  * Labeling internal structures
47*2d543d20SAndroid Build Coastguard Worker  */
48*2d543d20SAndroid Build Coastguard Worker 
49*2d543d20SAndroid Build Coastguard Worker /*
50*2d543d20SAndroid Build Coastguard Worker  * Calculate an SHA1 hash of all the files used to build the specs.
51*2d543d20SAndroid Build Coastguard Worker  * The hash value is held in rec->digest if SELABEL_OPT_DIGEST set. To
52*2d543d20SAndroid Build Coastguard Worker  * calculate the hash the hashbuf will hold a concatenation of all the files
53*2d543d20SAndroid Build Coastguard Worker  * used. This is released once the value has been calculated.
54*2d543d20SAndroid Build Coastguard Worker  */
55*2d543d20SAndroid Build Coastguard Worker #define DIGEST_SPECFILE_SIZE SHA1_HASH_SIZE
56*2d543d20SAndroid Build Coastguard Worker #define DIGEST_FILES_MAX 8
57*2d543d20SAndroid Build Coastguard Worker struct selabel_digest {
58*2d543d20SAndroid Build Coastguard Worker 	unsigned char *digest;	/* SHA1 digest of specfiles */
59*2d543d20SAndroid Build Coastguard Worker 	unsigned char *hashbuf;	/* buffer to hold specfiles */
60*2d543d20SAndroid Build Coastguard Worker 	size_t hashbuf_size;	/* buffer size */
61*2d543d20SAndroid Build Coastguard Worker 	size_t specfile_cnt;	/* how many specfiles processed */
62*2d543d20SAndroid Build Coastguard Worker 	char **specfile_list;	/* and their names */
63*2d543d20SAndroid Build Coastguard Worker };
64*2d543d20SAndroid Build Coastguard Worker 
65*2d543d20SAndroid Build Coastguard Worker extern int digest_add_specfile(struct selabel_digest *digest, FILE *fp,
66*2d543d20SAndroid Build Coastguard Worker 						    const char *from_addr,
67*2d543d20SAndroid Build Coastguard Worker 						    size_t buf_len,
68*2d543d20SAndroid Build Coastguard Worker 						    const char *path);
69*2d543d20SAndroid Build Coastguard Worker extern void digest_gen_hash(struct selabel_digest *digest);
70*2d543d20SAndroid Build Coastguard Worker 
71*2d543d20SAndroid Build Coastguard Worker struct selabel_lookup_rec {
72*2d543d20SAndroid Build Coastguard Worker 	char * ctx_raw;
73*2d543d20SAndroid Build Coastguard Worker 	char * ctx_trans;
74*2d543d20SAndroid Build Coastguard Worker 	int validated;
75*2d543d20SAndroid Build Coastguard Worker 	unsigned lineno;
76*2d543d20SAndroid Build Coastguard Worker };
77*2d543d20SAndroid Build Coastguard Worker 
78*2d543d20SAndroid Build Coastguard Worker struct selabel_handle {
79*2d543d20SAndroid Build Coastguard Worker 	/* arguments that were passed to selabel_open */
80*2d543d20SAndroid Build Coastguard Worker 	unsigned int backend;
81*2d543d20SAndroid Build Coastguard Worker 	int validating;
82*2d543d20SAndroid Build Coastguard Worker 
83*2d543d20SAndroid Build Coastguard Worker 	/* labeling operations */
84*2d543d20SAndroid Build Coastguard Worker 	struct selabel_lookup_rec *(*func_lookup) (struct selabel_handle *h,
85*2d543d20SAndroid Build Coastguard Worker 						   const char *key, int type);
86*2d543d20SAndroid Build Coastguard Worker 	void (*func_close) (struct selabel_handle *h);
87*2d543d20SAndroid Build Coastguard Worker 	void (*func_stats) (struct selabel_handle *h);
88*2d543d20SAndroid Build Coastguard Worker 	bool (*func_partial_match) (struct selabel_handle *h, const char *key);
89*2d543d20SAndroid Build Coastguard Worker 	bool (*func_get_digests_all_partial_matches) (struct selabel_handle *h,
90*2d543d20SAndroid Build Coastguard Worker 						      const char *key,
91*2d543d20SAndroid Build Coastguard Worker 						      uint8_t **calculated_digest,
92*2d543d20SAndroid Build Coastguard Worker 						      uint8_t **xattr_digest,
93*2d543d20SAndroid Build Coastguard Worker 						      size_t *digest_len);
94*2d543d20SAndroid Build Coastguard Worker 	bool (*func_hash_all_partial_matches) (struct selabel_handle *h,
95*2d543d20SAndroid Build Coastguard Worker 	                                       const char *key, uint8_t *digest);
96*2d543d20SAndroid Build Coastguard Worker 	struct selabel_lookup_rec *(*func_lookup_best_match)
97*2d543d20SAndroid Build Coastguard Worker 						    (struct selabel_handle *h,
98*2d543d20SAndroid Build Coastguard Worker 						    const char *key,
99*2d543d20SAndroid Build Coastguard Worker 						    const char **aliases,
100*2d543d20SAndroid Build Coastguard Worker 						    int type);
101*2d543d20SAndroid Build Coastguard Worker 	enum selabel_cmp_result (*func_cmp)(const struct selabel_handle *h1,
102*2d543d20SAndroid Build Coastguard Worker 					    const struct selabel_handle *h2);
103*2d543d20SAndroid Build Coastguard Worker 
104*2d543d20SAndroid Build Coastguard Worker 	/* supports backend-specific state information */
105*2d543d20SAndroid Build Coastguard Worker 	void *data;
106*2d543d20SAndroid Build Coastguard Worker 
107*2d543d20SAndroid Build Coastguard Worker 	/*
108*2d543d20SAndroid Build Coastguard Worker 	 * The main spec file(s) used. Note for file contexts the local and/or
109*2d543d20SAndroid Build Coastguard Worker 	 * homedirs could also have been used to resolve a context.
110*2d543d20SAndroid Build Coastguard Worker 	 */
111*2d543d20SAndroid Build Coastguard Worker 	size_t spec_files_len;
112*2d543d20SAndroid Build Coastguard Worker 	char **spec_files;
113*2d543d20SAndroid Build Coastguard Worker 
114*2d543d20SAndroid Build Coastguard Worker 
115*2d543d20SAndroid Build Coastguard Worker 	/* ptr to SHA1 hash information if SELABEL_OPT_DIGEST set */
116*2d543d20SAndroid Build Coastguard Worker 	struct selabel_digest *digest;
117*2d543d20SAndroid Build Coastguard Worker };
118*2d543d20SAndroid Build Coastguard Worker 
119*2d543d20SAndroid Build Coastguard Worker /*
120*2d543d20SAndroid Build Coastguard Worker  * Validation function
121*2d543d20SAndroid Build Coastguard Worker  */
122*2d543d20SAndroid Build Coastguard Worker extern int
123*2d543d20SAndroid Build Coastguard Worker selabel_validate(struct selabel_lookup_rec *contexts);
124*2d543d20SAndroid Build Coastguard Worker 
125*2d543d20SAndroid Build Coastguard Worker /*
126*2d543d20SAndroid Build Coastguard Worker  * Compatibility support
127*2d543d20SAndroid Build Coastguard Worker  */
128*2d543d20SAndroid Build Coastguard Worker extern int myprintf_compat;
129*2d543d20SAndroid Build Coastguard Worker extern void __attribute__ ((format(printf, 1, 2)))
130*2d543d20SAndroid Build Coastguard Worker (*myprintf) (const char *fmt, ...) ;
131*2d543d20SAndroid Build Coastguard Worker 
132*2d543d20SAndroid Build Coastguard Worker #define COMPAT_LOG(type, fmt...) do {			\
133*2d543d20SAndroid Build Coastguard Worker 	if (myprintf_compat)				\
134*2d543d20SAndroid Build Coastguard Worker 		myprintf(fmt);				\
135*2d543d20SAndroid Build Coastguard Worker 	else						\
136*2d543d20SAndroid Build Coastguard Worker 		selinux_log(type, fmt);			\
137*2d543d20SAndroid Build Coastguard Worker 	} while (0)
138*2d543d20SAndroid Build Coastguard Worker 
139*2d543d20SAndroid Build Coastguard Worker extern int
140*2d543d20SAndroid Build Coastguard Worker compat_validate(const struct selabel_handle *rec,
141*2d543d20SAndroid Build Coastguard Worker 		struct selabel_lookup_rec *contexts,
142*2d543d20SAndroid Build Coastguard Worker 		const char *path, unsigned lineno) ;
143*2d543d20SAndroid Build Coastguard Worker 
144*2d543d20SAndroid Build Coastguard Worker /*
145*2d543d20SAndroid Build Coastguard Worker  * The read_spec_entries function may be used to
146*2d543d20SAndroid Build Coastguard Worker  * replace sscanf to read entries from spec files.
147*2d543d20SAndroid Build Coastguard Worker  */
148*2d543d20SAndroid Build Coastguard Worker extern int read_spec_entries(char *line_buf, const char **errbuf, int num_args, ...);
149*2d543d20SAndroid Build Coastguard Worker 
150*2d543d20SAndroid Build Coastguard Worker #endif				/* _SELABEL_INTERNAL_H_ */
151