Linux Audio

Check our new training course

Loading...
v4.6
 
  1/*
  2 * Copyright (C) 2009-2010 IBM Corporation
  3 *
  4 * Authors:
  5 * Mimi Zohar <zohar@us.ibm.com>
  6 *
  7 * This program is free software; you can redistribute it and/or
  8 * modify it under the terms of the GNU General Public License as
  9 * published by the Free Software Foundation, version 2 of the
 10 * License.
 11 *
 12 */
 13
 
 
 
 
 
 
 14#include <linux/types.h>
 15#include <linux/integrity.h>
 16#include <crypto/sha.h>
 
 17#include <linux/key.h>
 
 18
 19/* iint action cache flags */
 20#define IMA_MEASURE		0x00000001
 21#define IMA_MEASURED		0x00000002
 22#define IMA_APPRAISE		0x00000004
 23#define IMA_APPRAISED		0x00000008
 24/*#define IMA_COLLECT		0x00000010  do not use this flag */
 25#define IMA_COLLECTED		0x00000020
 26#define IMA_AUDIT		0x00000040
 27#define IMA_AUDITED		0x00000080
 
 
 28
 29/* iint cache flags */
 30#define IMA_ACTION_FLAGS	0xff000000
 31#define IMA_DIGSIG		0x01000000
 32#define IMA_DIGSIG_REQUIRED	0x02000000
 33#define IMA_PERMIT_DIRECTIO	0x04000000
 34#define IMA_NEW_FILE		0x08000000
 
 
 
 
 35
 36#define IMA_DO_MASK		(IMA_MEASURE | IMA_APPRAISE | IMA_AUDIT | \
 37				 IMA_APPRAISE_SUBMASK)
 38#define IMA_DONE_MASK		(IMA_MEASURED | IMA_APPRAISED | IMA_AUDITED | \
 39				 IMA_COLLECTED | IMA_APPRAISED_SUBMASK)
 
 40
 41/* iint subaction appraise cache flags */
 42#define IMA_FILE_APPRAISE	0x00000100
 43#define IMA_FILE_APPRAISED	0x00000200
 44#define IMA_MMAP_APPRAISE	0x00000400
 45#define IMA_MMAP_APPRAISED	0x00000800
 46#define IMA_BPRM_APPRAISE	0x00001000
 47#define IMA_BPRM_APPRAISED	0x00002000
 48#define IMA_READ_APPRAISE	0x00004000
 49#define IMA_READ_APPRAISED	0x00008000
 
 
 50#define IMA_APPRAISE_SUBMASK	(IMA_FILE_APPRAISE | IMA_MMAP_APPRAISE | \
 51				 IMA_BPRM_APPRAISE | IMA_READ_APPRAISE)
 
 52#define IMA_APPRAISED_SUBMASK	(IMA_FILE_APPRAISED | IMA_MMAP_APPRAISED | \
 53				 IMA_BPRM_APPRAISED | IMA_READ_APPRAISED)
 
 
 
 
 
 
 
 
 54
 55enum evm_ima_xattr_type {
 56	IMA_XATTR_DIGEST = 0x01,
 57	EVM_XATTR_HMAC,
 58	EVM_IMA_XATTR_DIGSIG,
 59	IMA_XATTR_DIGEST_NG,
 
 
 60	IMA_XATTR_LAST
 61};
 62
 63struct evm_ima_xattr_data {
 64	u8 type;
 
 
 
 
 
 
 65	u8 digest[SHA1_DIGEST_SIZE];
 66} __packed;
 67
 68#define IMA_MAX_DIGEST_SIZE	64
 69
 70struct ima_digest_data {
 71	u8 algo;
 72	u8 length;
 73	union {
 74		struct {
 75			u8 unused;
 76			u8 type;
 77		} sha1;
 78		struct {
 79			u8 type;
 80			u8 algo;
 81		} ng;
 82		u8 data[2];
 83	} xattr;
 84	u8 digest[0];
 85} __packed;
 86
 87/*
 88 * signature format v2 - for using with asymmetric keys
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 89 */
 90struct signature_v2_hdr {
 91	uint8_t type;		/* xattr type */
 92	uint8_t version;	/* signature format version */
 93	uint8_t	hash_algo;	/* Digest algorithm [enum hash_algo] */
 94	uint32_t keyid;		/* IMA key identifier - not X509/PGP specific */
 95	uint16_t sig_size;	/* signature size */
 96	uint8_t sig[0];		/* signature payload */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 97} __packed;
 98
 99/* integrity data associated with an inode */
100struct integrity_iint_cache {
101	struct rb_node rb_node;	/* rooted in integrity_iint_tree */
 
102	struct inode *inode;	/* back pointer to inode in question */
103	u64 version;		/* track inode changes */
104	unsigned long flags;
 
 
 
 
105	enum integrity_status ima_file_status:4;
106	enum integrity_status ima_mmap_status:4;
107	enum integrity_status ima_bprm_status:4;
108	enum integrity_status ima_read_status:4;
 
109	enum integrity_status evm_status:4;
110	struct ima_digest_data *ima_hash;
111};
112
113/* rbtree tree calls to lookup, insert, delete
114 * integrity data associated with an inode.
115 */
116struct integrity_iint_cache *integrity_iint_find(struct inode *inode);
117
118int integrity_kernel_read(struct file *file, loff_t offset,
119			  char *addr, unsigned long count);
120int __init integrity_read_file(const char *path, char **data);
121
122#define INTEGRITY_KEYRING_EVM		0
123#define INTEGRITY_KEYRING_IMA		1
124#define INTEGRITY_KEYRING_MODULE	2
125#define INTEGRITY_KEYRING_MAX		3
 
 
 
 
 
126
127#ifdef CONFIG_INTEGRITY_SIGNATURE
128
129int integrity_digsig_verify(const unsigned int id, const char *sig, int siglen,
130			    const char *digest, int digestlen);
 
131
132int __init integrity_init_keyring(const unsigned int id);
133int __init integrity_load_x509(const unsigned int id, const char *path);
 
 
134#else
135
136static inline int integrity_digsig_verify(const unsigned int id,
137					  const char *sig, int siglen,
138					  const char *digest, int digestlen)
139{
140	return -EOPNOTSUPP;
141}
142
 
 
 
 
 
 
143static inline int integrity_init_keyring(const unsigned int id)
144{
145	return 0;
146}
 
 
 
 
 
 
 
 
147#endif /* CONFIG_INTEGRITY_SIGNATURE */
148
149#ifdef CONFIG_INTEGRITY_ASYMMETRIC_KEYS
150int asymmetric_verify(struct key *keyring, const char *sig,
151		      int siglen, const char *data, int datalen);
152#else
153static inline int asymmetric_verify(struct key *keyring, const char *sig,
154				    int siglen, const char *data, int datalen)
155{
156	return -EOPNOTSUPP;
157}
158#endif
159
 
 
 
 
 
 
 
 
 
 
160#ifdef CONFIG_IMA_LOAD_X509
161void __init ima_load_x509(void);
162#else
163static inline void ima_load_x509(void)
164{
165}
166#endif
167
168#ifdef CONFIG_EVM_LOAD_X509
169void __init evm_load_x509(void);
170#else
171static inline void evm_load_x509(void)
172{
173}
174#endif
175
176#ifdef CONFIG_INTEGRITY_AUDIT
177/* declarations */
178void integrity_audit_msg(int audit_msgno, struct inode *inode,
179			 const unsigned char *fname, const char *op,
180			 const char *cause, int result, int info);
 
 
 
 
 
 
 
 
 
 
 
 
181#else
182static inline void integrity_audit_msg(int audit_msgno, struct inode *inode,
183				       const unsigned char *fname,
184				       const char *op, const char *cause,
185				       int result, int info)
186{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187}
188#endif
v6.8
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright (C) 2009-2010 IBM Corporation
  4 *
  5 * Authors:
  6 * Mimi Zohar <zohar@us.ibm.com>
 
 
 
 
 
 
  7 */
  8
  9#ifdef pr_fmt
 10#undef pr_fmt
 11#endif
 12
 13#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 14
 15#include <linux/types.h>
 16#include <linux/integrity.h>
 17#include <crypto/sha1.h>
 18#include <crypto/hash.h>
 19#include <linux/key.h>
 20#include <linux/audit.h>
 21
 22/* iint action cache flags */
 23#define IMA_MEASURE		0x00000001
 24#define IMA_MEASURED		0x00000002
 25#define IMA_APPRAISE		0x00000004
 26#define IMA_APPRAISED		0x00000008
 27/*#define IMA_COLLECT		0x00000010  do not use this flag */
 28#define IMA_COLLECTED		0x00000020
 29#define IMA_AUDIT		0x00000040
 30#define IMA_AUDITED		0x00000080
 31#define IMA_HASH		0x00000100
 32#define IMA_HASHED		0x00000200
 33
 34/* iint policy rule cache flags */
 35#define IMA_NONACTION_FLAGS	0xff000000
 36#define IMA_DIGSIG_REQUIRED	0x01000000
 37#define IMA_PERMIT_DIRECTIO	0x02000000
 38#define IMA_NEW_FILE		0x04000000
 39#define EVM_IMMUTABLE_DIGSIG	0x08000000
 40#define IMA_FAIL_UNVERIFIABLE_SIGS	0x10000000
 41#define IMA_MODSIG_ALLOWED	0x20000000
 42#define IMA_CHECK_BLACKLIST	0x40000000
 43#define IMA_VERITY_REQUIRED	0x80000000
 44
 45#define IMA_DO_MASK		(IMA_MEASURE | IMA_APPRAISE | IMA_AUDIT | \
 46				 IMA_HASH | IMA_APPRAISE_SUBMASK)
 47#define IMA_DONE_MASK		(IMA_MEASURED | IMA_APPRAISED | IMA_AUDITED | \
 48				 IMA_HASHED | IMA_COLLECTED | \
 49				 IMA_APPRAISED_SUBMASK)
 50
 51/* iint subaction appraise cache flags */
 52#define IMA_FILE_APPRAISE	0x00001000
 53#define IMA_FILE_APPRAISED	0x00002000
 54#define IMA_MMAP_APPRAISE	0x00004000
 55#define IMA_MMAP_APPRAISED	0x00008000
 56#define IMA_BPRM_APPRAISE	0x00010000
 57#define IMA_BPRM_APPRAISED	0x00020000
 58#define IMA_READ_APPRAISE	0x00040000
 59#define IMA_READ_APPRAISED	0x00080000
 60#define IMA_CREDS_APPRAISE	0x00100000
 61#define IMA_CREDS_APPRAISED	0x00200000
 62#define IMA_APPRAISE_SUBMASK	(IMA_FILE_APPRAISE | IMA_MMAP_APPRAISE | \
 63				 IMA_BPRM_APPRAISE | IMA_READ_APPRAISE | \
 64				 IMA_CREDS_APPRAISE)
 65#define IMA_APPRAISED_SUBMASK	(IMA_FILE_APPRAISED | IMA_MMAP_APPRAISED | \
 66				 IMA_BPRM_APPRAISED | IMA_READ_APPRAISED | \
 67				 IMA_CREDS_APPRAISED)
 68
 69/* iint cache atomic_flags */
 70#define IMA_CHANGE_XATTR	0
 71#define IMA_UPDATE_XATTR	1
 72#define IMA_CHANGE_ATTR		2
 73#define IMA_DIGSIG		3
 74#define IMA_MUST_MEASURE	4
 75
 76enum evm_ima_xattr_type {
 77	IMA_XATTR_DIGEST = 0x01,
 78	EVM_XATTR_HMAC,
 79	EVM_IMA_XATTR_DIGSIG,
 80	IMA_XATTR_DIGEST_NG,
 81	EVM_XATTR_PORTABLE_DIGSIG,
 82	IMA_VERITY_DIGSIG,
 83	IMA_XATTR_LAST
 84};
 85
 86struct evm_ima_xattr_data {
 87	u8 type;
 88	u8 data[];
 89} __packed;
 90
 91/* Only used in the EVM HMAC code. */
 92struct evm_xattr {
 93	struct evm_ima_xattr_data data;
 94	u8 digest[SHA1_DIGEST_SIZE];
 95} __packed;
 96
 97#define IMA_MAX_DIGEST_SIZE	HASH_MAX_DIGESTSIZE
 98
 99struct ima_digest_data {
100	u8 algo;
101	u8 length;
102	union {
103		struct {
104			u8 unused;
105			u8 type;
106		} sha1;
107		struct {
108			u8 type;
109			u8 algo;
110		} ng;
111		u8 data[2];
112	} xattr;
113	u8 digest[];
114} __packed;
115
116/*
117 * Instead of wrapping the ima_digest_data struct inside a local structure
118 * with the maximum hash size, define ima_max_digest_data struct.
119 */
120struct ima_max_digest_data {
121	struct ima_digest_data hdr;
122	u8 digest[HASH_MAX_DIGESTSIZE];
123} __packed;
124
125/*
126 * signature header format v2 - for using with asymmetric keys
127 *
128 * The signature_v2_hdr struct includes a signature format version
129 * to simplify defining new signature formats.
130 *
131 * signature format:
132 * version 2: regular file data hash based signature
133 * version 3: struct ima_file_id data based signature
134 */
135struct signature_v2_hdr {
136	uint8_t type;		/* xattr type */
137	uint8_t version;	/* signature format version */
138	uint8_t	hash_algo;	/* Digest algorithm [enum hash_algo] */
139	__be32 keyid;		/* IMA key identifier - not X509/PGP specific */
140	__be16 sig_size;	/* signature size */
141	uint8_t sig[];		/* signature payload */
142} __packed;
143
144/*
145 * IMA signature version 3 disambiguates the data that is signed, by
146 * indirectly signing the hash of the ima_file_id structure data,
147 * containing either the fsverity_descriptor struct digest or, in the
148 * future, the regular IMA file hash.
149 *
150 * (The hash of the ima_file_id structure is only of the portion used.)
151 */
152struct ima_file_id {
153	__u8 hash_type;		/* xattr type [enum evm_ima_xattr_type] */
154	__u8 hash_algorithm;	/* Digest algorithm [enum hash_algo] */
155	__u8 hash[HASH_MAX_DIGESTSIZE];
156} __packed;
157
158/* integrity data associated with an inode */
159struct integrity_iint_cache {
160	struct rb_node rb_node;	/* rooted in integrity_iint_tree */
161	struct mutex mutex;	/* protects: version, flags, digest */
162	struct inode *inode;	/* back pointer to inode in question */
163	u64 version;		/* track inode changes */
164	unsigned long flags;
165	unsigned long measured_pcrs;
166	unsigned long atomic_flags;
167	unsigned long real_ino;
168	dev_t real_dev;
169	enum integrity_status ima_file_status:4;
170	enum integrity_status ima_mmap_status:4;
171	enum integrity_status ima_bprm_status:4;
172	enum integrity_status ima_read_status:4;
173	enum integrity_status ima_creds_status:4;
174	enum integrity_status evm_status:4;
175	struct ima_digest_data *ima_hash;
176};
177
178/* rbtree tree calls to lookup, insert, delete
179 * integrity data associated with an inode.
180 */
181struct integrity_iint_cache *integrity_iint_find(struct inode *inode);
182
183int integrity_kernel_read(struct file *file, loff_t offset,
184			  void *addr, unsigned long count);
 
185
186#define INTEGRITY_KEYRING_EVM		0
187#define INTEGRITY_KEYRING_IMA		1
188#define INTEGRITY_KEYRING_PLATFORM	2
189#define INTEGRITY_KEYRING_MACHINE	3
190#define INTEGRITY_KEYRING_MAX		4
191
192extern struct dentry *integrity_dir;
193
194struct modsig;
195
196#ifdef CONFIG_INTEGRITY_SIGNATURE
197
198int integrity_digsig_verify(const unsigned int id, const char *sig, int siglen,
199			    const char *digest, int digestlen);
200int integrity_modsig_verify(unsigned int id, const struct modsig *modsig);
201
202int __init integrity_init_keyring(const unsigned int id);
203int __init integrity_load_x509(const unsigned int id, const char *path);
204int __init integrity_load_cert(const unsigned int id, const char *source,
205			       const void *data, size_t len, key_perm_t perm);
206#else
207
208static inline int integrity_digsig_verify(const unsigned int id,
209					  const char *sig, int siglen,
210					  const char *digest, int digestlen)
211{
212	return -EOPNOTSUPP;
213}
214
215static inline int integrity_modsig_verify(unsigned int id,
216					  const struct modsig *modsig)
217{
218	return -EOPNOTSUPP;
219}
220
221static inline int integrity_init_keyring(const unsigned int id)
222{
223	return 0;
224}
225
226static inline int __init integrity_load_cert(const unsigned int id,
227					     const char *source,
228					     const void *data, size_t len,
229					     key_perm_t perm)
230{
231	return 0;
232}
233#endif /* CONFIG_INTEGRITY_SIGNATURE */
234
235#ifdef CONFIG_INTEGRITY_ASYMMETRIC_KEYS
236int asymmetric_verify(struct key *keyring, const char *sig,
237		      int siglen, const char *data, int datalen);
238#else
239static inline int asymmetric_verify(struct key *keyring, const char *sig,
240				    int siglen, const char *data, int datalen)
241{
242	return -EOPNOTSUPP;
243}
244#endif
245
246#ifdef CONFIG_IMA_APPRAISE_MODSIG
247int ima_modsig_verify(struct key *keyring, const struct modsig *modsig);
248#else
249static inline int ima_modsig_verify(struct key *keyring,
250				    const struct modsig *modsig)
251{
252	return -EOPNOTSUPP;
253}
254#endif
255
256#ifdef CONFIG_IMA_LOAD_X509
257void __init ima_load_x509(void);
258#else
259static inline void ima_load_x509(void)
260{
261}
262#endif
263
264#ifdef CONFIG_EVM_LOAD_X509
265void __init evm_load_x509(void);
266#else
267static inline void evm_load_x509(void)
268{
269}
270#endif
271
272#ifdef CONFIG_INTEGRITY_AUDIT
273/* declarations */
274void integrity_audit_msg(int audit_msgno, struct inode *inode,
275			 const unsigned char *fname, const char *op,
276			 const char *cause, int result, int info);
277
278void integrity_audit_message(int audit_msgno, struct inode *inode,
279			     const unsigned char *fname, const char *op,
280			     const char *cause, int result, int info,
281			     int errno);
282
283static inline struct audit_buffer *
284integrity_audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type)
285{
286	return audit_log_start(ctx, gfp_mask, type);
287}
288
289#else
290static inline void integrity_audit_msg(int audit_msgno, struct inode *inode,
291				       const unsigned char *fname,
292				       const char *op, const char *cause,
293				       int result, int info)
294{
295}
296
297static inline void integrity_audit_message(int audit_msgno,
298					   struct inode *inode,
299					   const unsigned char *fname,
300					   const char *op, const char *cause,
301					   int result, int info, int errno)
302{
303}
304
305static inline struct audit_buffer *
306integrity_audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type)
307{
308	return NULL;
309}
310
311#endif
312
313#ifdef CONFIG_INTEGRITY_PLATFORM_KEYRING
314void __init add_to_platform_keyring(const char *source, const void *data,
315				    size_t len);
316#else
317static inline void __init add_to_platform_keyring(const char *source,
318						  const void *data, size_t len)
319{
320}
321#endif
322
323#ifdef CONFIG_INTEGRITY_MACHINE_KEYRING
324void __init add_to_machine_keyring(const char *source, const void *data, size_t len);
325bool __init imputed_trust_enabled(void);
326#else
327static inline void __init add_to_machine_keyring(const char *source,
328						  const void *data, size_t len)
329{
330}
331
332static inline bool __init imputed_trust_enabled(void)
333{
334	return false;
335}
336#endif