xref: /openbmc/linux/security/integrity/ima/ima.h (revision bab73937)
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