13323eec9SMimi Zohar /* 23323eec9SMimi Zohar * Copyright (C) 2005,2006,2007,2008 IBM Corporation 33323eec9SMimi Zohar * 43323eec9SMimi Zohar * Authors: 53323eec9SMimi Zohar * Reiner Sailer <sailer@watson.ibm.com> 63323eec9SMimi Zohar * Mimi Zohar <zohar@us.ibm.com> 73323eec9SMimi Zohar * 83323eec9SMimi Zohar * This program is free software; you can redistribute it and/or 93323eec9SMimi Zohar * modify it under the terms of the GNU General Public License as 103323eec9SMimi Zohar * published by the Free Software Foundation, version 2 of the 113323eec9SMimi Zohar * License. 123323eec9SMimi Zohar * 133323eec9SMimi Zohar * File: ima.h 143323eec9SMimi Zohar * internal Integrity Measurement Architecture (IMA) definitions 153323eec9SMimi Zohar */ 163323eec9SMimi Zohar 173323eec9SMimi Zohar #ifndef __LINUX_IMA_H 183323eec9SMimi Zohar #define __LINUX_IMA_H 193323eec9SMimi Zohar 203323eec9SMimi Zohar #include <linux/types.h> 213323eec9SMimi Zohar #include <linux/crypto.h> 223323eec9SMimi Zohar #include <linux/security.h> 233323eec9SMimi Zohar #include <linux/hash.h> 243323eec9SMimi Zohar #include <linux/tpm.h> 253323eec9SMimi Zohar #include <linux/audit.h> 263323eec9SMimi Zohar 273323eec9SMimi Zohar enum ima_show_type { IMA_SHOW_BINARY, IMA_SHOW_ASCII }; 283323eec9SMimi Zohar enum tpm_pcrs { TPM_PCR0 = 0, TPM_PCR8 = 8 }; 293323eec9SMimi Zohar 303323eec9SMimi Zohar /* digest size for IMA, fits SHA1 or MD5 */ 313323eec9SMimi Zohar #define IMA_DIGEST_SIZE 20 323323eec9SMimi Zohar #define IMA_EVENT_NAME_LEN_MAX 255 333323eec9SMimi Zohar 343323eec9SMimi Zohar #define IMA_HASH_BITS 9 353323eec9SMimi Zohar #define IMA_MEASURE_HTABLE_SIZE (1 << IMA_HASH_BITS) 363323eec9SMimi Zohar 373323eec9SMimi Zohar /* set during initialization */ 383323eec9SMimi Zohar extern int ima_initialized; 393323eec9SMimi Zohar extern int ima_used_chip; 403323eec9SMimi Zohar extern char *ima_hash; 413323eec9SMimi Zohar 423323eec9SMimi Zohar /* IMA inode template definition */ 433323eec9SMimi Zohar struct ima_template_data { 443323eec9SMimi Zohar u8 digest[IMA_DIGEST_SIZE]; /* sha1/md5 measurement hash */ 453323eec9SMimi Zohar char file_name[IMA_EVENT_NAME_LEN_MAX + 1]; /* name + \0 */ 463323eec9SMimi Zohar }; 473323eec9SMimi Zohar 483323eec9SMimi Zohar struct ima_template_entry { 493323eec9SMimi Zohar u8 digest[IMA_DIGEST_SIZE]; /* sha1 or md5 measurement hash */ 503323eec9SMimi Zohar char *template_name; 513323eec9SMimi Zohar int template_len; 523323eec9SMimi Zohar struct ima_template_data template; 533323eec9SMimi Zohar }; 543323eec9SMimi Zohar 553323eec9SMimi Zohar struct ima_queue_entry { 563323eec9SMimi Zohar struct hlist_node hnext; /* place in hash collision list */ 573323eec9SMimi Zohar struct list_head later; /* place in ima_measurements list */ 583323eec9SMimi Zohar struct ima_template_entry *entry; 593323eec9SMimi Zohar }; 603323eec9SMimi Zohar extern struct list_head ima_measurements; /* list of all measurements */ 613323eec9SMimi Zohar 623323eec9SMimi Zohar /* declarations */ 633323eec9SMimi Zohar void integrity_audit_msg(int audit_msgno, struct inode *inode, 643323eec9SMimi Zohar const unsigned char *fname, const char *op, 653323eec9SMimi Zohar const char *cause, int result, int info); 663323eec9SMimi Zohar 673323eec9SMimi Zohar /* Internal IMA function definitions */ 683323eec9SMimi Zohar void ima_iintcache_init(void); 693323eec9SMimi Zohar int ima_init(void); 70bab73937SMimi Zohar void ima_cleanup(void); 71bab73937SMimi Zohar int ima_fs_init(void); 72bab73937SMimi Zohar void ima_fs_cleanup(void); 733323eec9SMimi Zohar int ima_add_template_entry(struct ima_template_entry *entry, int violation, 743323eec9SMimi Zohar const char *op, struct inode *inode); 753323eec9SMimi Zohar int ima_calc_hash(struct file *file, char *digest); 763323eec9SMimi Zohar int ima_calc_template_hash(int template_len, void *template, char *digest); 773323eec9SMimi Zohar int ima_calc_boot_aggregate(char *digest); 783323eec9SMimi Zohar void ima_add_violation(struct inode *inode, const unsigned char *filename, 793323eec9SMimi Zohar const char *op, const char *cause); 803323eec9SMimi Zohar 813323eec9SMimi Zohar /* 823323eec9SMimi Zohar * used to protect h_table and sha_table 833323eec9SMimi Zohar */ 843323eec9SMimi Zohar extern spinlock_t ima_queue_lock; 853323eec9SMimi Zohar 863323eec9SMimi Zohar struct ima_h_table { 873323eec9SMimi Zohar atomic_long_t len; /* number of stored measurements in the list */ 883323eec9SMimi Zohar atomic_long_t violations; 893323eec9SMimi Zohar struct hlist_head queue[IMA_MEASURE_HTABLE_SIZE]; 903323eec9SMimi Zohar }; 913323eec9SMimi Zohar extern struct ima_h_table ima_htable; 923323eec9SMimi Zohar 933323eec9SMimi Zohar static inline unsigned long ima_hash_key(u8 *digest) 943323eec9SMimi Zohar { 953323eec9SMimi Zohar return hash_long(*digest, IMA_HASH_BITS); 963323eec9SMimi Zohar } 973323eec9SMimi Zohar 983323eec9SMimi Zohar /* iint cache flags */ 993323eec9SMimi Zohar #define IMA_MEASURED 1 1003323eec9SMimi Zohar 1013323eec9SMimi Zohar /* integrity data associated with an inode */ 1023323eec9SMimi Zohar struct ima_iint_cache { 1033323eec9SMimi Zohar u64 version; /* track inode changes */ 1043323eec9SMimi Zohar unsigned long flags; 1053323eec9SMimi Zohar u8 digest[IMA_DIGEST_SIZE]; 1063323eec9SMimi Zohar struct mutex mutex; /* protects: version, flags, digest */ 1073323eec9SMimi Zohar long readcount; /* measured files readcount */ 1083323eec9SMimi Zohar long writecount; /* measured files writecount */ 1093323eec9SMimi Zohar struct kref refcount; /* ima_iint_cache reference count */ 1103323eec9SMimi Zohar struct rcu_head rcu; 1113323eec9SMimi Zohar }; 1123323eec9SMimi Zohar 1133323eec9SMimi Zohar /* LIM API function definitions */ 1143323eec9SMimi Zohar int ima_must_measure(struct ima_iint_cache *iint, struct inode *inode, 1153323eec9SMimi Zohar int mask, int function); 1163323eec9SMimi Zohar int ima_collect_measurement(struct ima_iint_cache *iint, struct file *file); 1173323eec9SMimi Zohar void ima_store_measurement(struct ima_iint_cache *iint, struct file *file, 1183323eec9SMimi Zohar const unsigned char *filename); 1193323eec9SMimi Zohar int ima_store_template(struct ima_template_entry *entry, int violation, 1203323eec9SMimi Zohar struct inode *inode); 121bab73937SMimi Zohar void ima_template_show(struct seq_file *m, void *e, 122bab73937SMimi Zohar enum ima_show_type show); 1233323eec9SMimi Zohar 1243323eec9SMimi Zohar /* radix tree calls to lookup, insert, delete 1253323eec9SMimi Zohar * integrity data associated with an inode. 1263323eec9SMimi Zohar */ 1273323eec9SMimi Zohar struct ima_iint_cache *ima_iint_insert(struct inode *inode); 1283323eec9SMimi Zohar struct ima_iint_cache *ima_iint_find_get(struct inode *inode); 1293323eec9SMimi Zohar struct ima_iint_cache *ima_iint_find_insert_get(struct inode *inode); 1303323eec9SMimi Zohar void ima_iint_delete(struct inode *inode); 1313323eec9SMimi Zohar void iint_free(struct kref *kref); 1323323eec9SMimi Zohar void iint_rcu_free(struct rcu_head *rcu); 1333323eec9SMimi Zohar 1343323eec9SMimi Zohar /* IMA policy related functions */ 1353323eec9SMimi Zohar enum ima_hooks { PATH_CHECK = 1, FILE_MMAP, BPRM_CHECK }; 1363323eec9SMimi Zohar 1373323eec9SMimi Zohar int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask); 1383323eec9SMimi Zohar void ima_init_policy(void); 1393323eec9SMimi Zohar void ima_update_policy(void); 1403323eec9SMimi Zohar #endif 141