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