-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
integrity: move ima inode integrity data management
Move the inode integrity data(iint) management up to the integrity directory in order to share the iint among the different integrity models. Changelog: - don't define MAX_DIGEST_SIZE - rename several globally visible 'ima_' prefixed functions, structs, locks, etc to 'integrity_' - replace '20' with SHA1_DIGEST_SIZE - reflect location change in appropriate Kconfig and Makefiles - remove unnecessary initialization of iint_initialized to 0 - rebased on current ima_iint.c - define integrity_iint_store/lock as static There should be no other functional changes. Signed-off-by: Mimi Zohar <zohar@us.ibm.com> Acked-by: Serge Hallyn <serge.hallyn@ubuntu.com>
- Loading branch information
Mimi Zohar
committed
Jul 18, 2011
1 parent
9d8f13b
commit f381c27
Showing
15 changed files
with
277 additions
and
216 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/* | ||
* Copyright (C) 2009 IBM Corporation | ||
* Author: Mimi Zohar <zohar@us.ibm.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation, version 2 of the License. | ||
*/ | ||
|
||
#ifndef _LINUX_INTEGRITY_H | ||
#define _LINUX_INTEGRITY_H | ||
|
||
#include <linux/fs.h> | ||
|
||
#ifdef CONFIG_INTEGRITY | ||
extern int integrity_inode_alloc(struct inode *inode); | ||
extern void integrity_inode_free(struct inode *inode); | ||
|
||
#else | ||
static inline int integrity_inode_alloc(struct inode *inode) | ||
{ | ||
return 0; | ||
} | ||
|
||
static inline void integrity_inode_free(struct inode *inode) | ||
{ | ||
return; | ||
} | ||
#endif /* CONFIG_INTEGRITY_H */ | ||
#endif /* _LINUX_INTEGRITY_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
# | ||
config INTEGRITY | ||
def_bool y | ||
depends on IMA | ||
|
||
source security/integrity/ima/Kconfig |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
# | ||
# Makefile for caching inode integrity data (iint) | ||
# | ||
|
||
obj-$(CONFIG_INTEGRITY) += integrity.o | ||
|
||
integrity-y := iint.o | ||
|
||
subdir-$(CONFIG_IMA) += ima | ||
obj-$(CONFIG_IMA) += ima/built-in.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,170 @@ | ||
/* | ||
* Copyright (C) 2008 IBM Corporation | ||
* | ||
* Authors: | ||
* Mimi Zohar <zohar@us.ibm.com> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License as | ||
* published by the Free Software Foundation, version 2 of the | ||
* License. | ||
* | ||
* File: integrity_iint.c | ||
* - implements the integrity hooks: integrity_inode_alloc, | ||
* integrity_inode_free | ||
* - cache integrity information associated with an inode | ||
* using a rbtree tree. | ||
*/ | ||
#include <linux/slab.h> | ||
#include <linux/module.h> | ||
#include <linux/spinlock.h> | ||
#include <linux/rbtree.h> | ||
#include "integrity.h" | ||
|
||
static struct rb_root integrity_iint_tree = RB_ROOT; | ||
static DEFINE_SPINLOCK(integrity_iint_lock); | ||
static struct kmem_cache *iint_cache __read_mostly; | ||
|
||
int iint_initialized; | ||
|
||
/* | ||
* __integrity_iint_find - return the iint associated with an inode | ||
*/ | ||
static struct integrity_iint_cache *__integrity_iint_find(struct inode *inode) | ||
{ | ||
struct integrity_iint_cache *iint; | ||
struct rb_node *n = integrity_iint_tree.rb_node; | ||
|
||
assert_spin_locked(&integrity_iint_lock); | ||
|
||
while (n) { | ||
iint = rb_entry(n, struct integrity_iint_cache, rb_node); | ||
|
||
if (inode < iint->inode) | ||
n = n->rb_left; | ||
else if (inode > iint->inode) | ||
n = n->rb_right; | ||
else | ||
break; | ||
} | ||
if (!n) | ||
return NULL; | ||
|
||
return iint; | ||
} | ||
|
||
/* | ||
* integrity_iint_find - return the iint associated with an inode | ||
*/ | ||
struct integrity_iint_cache *integrity_iint_find(struct inode *inode) | ||
{ | ||
struct integrity_iint_cache *iint; | ||
|
||
if (!IS_IMA(inode)) | ||
return NULL; | ||
|
||
spin_lock(&integrity_iint_lock); | ||
iint = __integrity_iint_find(inode); | ||
spin_unlock(&integrity_iint_lock); | ||
|
||
return iint; | ||
} | ||
|
||
static void iint_free(struct integrity_iint_cache *iint) | ||
{ | ||
iint->version = 0; | ||
iint->flags = 0UL; | ||
kmem_cache_free(iint_cache, iint); | ||
} | ||
|
||
/** | ||
* integrity_inode_alloc - allocate an iint associated with an inode | ||
* @inode: pointer to the inode | ||
*/ | ||
int integrity_inode_alloc(struct inode *inode) | ||
{ | ||
struct rb_node **p; | ||
struct rb_node *new_node, *parent = NULL; | ||
struct integrity_iint_cache *new_iint, *test_iint; | ||
int rc; | ||
|
||
new_iint = kmem_cache_alloc(iint_cache, GFP_NOFS); | ||
if (!new_iint) | ||
return -ENOMEM; | ||
|
||
new_iint->inode = inode; | ||
new_node = &new_iint->rb_node; | ||
|
||
mutex_lock(&inode->i_mutex); /* i_flags */ | ||
spin_lock(&integrity_iint_lock); | ||
|
||
p = &integrity_iint_tree.rb_node; | ||
while (*p) { | ||
parent = *p; | ||
test_iint = rb_entry(parent, struct integrity_iint_cache, | ||
rb_node); | ||
rc = -EEXIST; | ||
if (inode < test_iint->inode) | ||
p = &(*p)->rb_left; | ||
else if (inode > test_iint->inode) | ||
p = &(*p)->rb_right; | ||
else | ||
goto out_err; | ||
} | ||
|
||
inode->i_flags |= S_IMA; | ||
rb_link_node(new_node, parent, p); | ||
rb_insert_color(new_node, &integrity_iint_tree); | ||
|
||
spin_unlock(&integrity_iint_lock); | ||
mutex_unlock(&inode->i_mutex); /* i_flags */ | ||
|
||
return 0; | ||
out_err: | ||
spin_unlock(&integrity_iint_lock); | ||
mutex_unlock(&inode->i_mutex); /* i_flags */ | ||
iint_free(new_iint); | ||
|
||
return rc; | ||
} | ||
|
||
/** | ||
* integrity_inode_free - called on security_inode_free | ||
* @inode: pointer to the inode | ||
* | ||
* Free the integrity information(iint) associated with an inode. | ||
*/ | ||
void integrity_inode_free(struct inode *inode) | ||
{ | ||
struct integrity_iint_cache *iint; | ||
|
||
if (!IS_IMA(inode)) | ||
return; | ||
|
||
spin_lock(&integrity_iint_lock); | ||
iint = __integrity_iint_find(inode); | ||
rb_erase(&iint->rb_node, &integrity_iint_tree); | ||
spin_unlock(&integrity_iint_lock); | ||
|
||
iint_free(iint); | ||
} | ||
|
||
static void init_once(void *foo) | ||
{ | ||
struct integrity_iint_cache *iint = foo; | ||
|
||
memset(iint, 0, sizeof *iint); | ||
iint->version = 0; | ||
iint->flags = 0UL; | ||
mutex_init(&iint->mutex); | ||
} | ||
|
||
static int __init integrity_iintcache_init(void) | ||
{ | ||
iint_cache = | ||
kmem_cache_create("iint_cache", sizeof(struct integrity_iint_cache), | ||
0, SLAB_PANIC, init_once); | ||
iint_initialized = 1; | ||
return 0; | ||
} | ||
security_initcall(integrity_iintcache_init); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.