diff mbox

[RFC,1/2] security/ima: Rewrite tests into new API + fixes

Message ID 20180111202821.31639-2-pvorel@suse.cz (mailing list archive)
State New, archived
Headers show

Commit Message

Petr Vorel Jan. 11, 2018, 8:28 p.m. UTC
* simplify code, remove duplicity

* ima_measurements.sh:
  - add support for sha256sum
  - check for i_version only for ext[2-4] filesystems (other filesystems
    don't report it)
  - chown only UID (GID of nobody is different on some OS, so it's
    better not to set it as it's not necessary for the test)

* ima_policy.sh:
  - break tests instead of print TINFO when kernel is not configured to
    enable multiple writes to the IMA policy (IMA_WRITE_POLICY)
  - add warning when policy has been updated that reboot is needed

* ima_violations.sh:
  - change check to measure occurrence of messages in log (previous way
    to grep tail of the log was buggy) + add sleep when SUT uses
    /var/log/messages to prevent failure during

* remove duplicate whitespace from runtest file

Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
 runtest/ima                                        |   8 +-
 .../integrity/ima/tests/ima_measurements.sh        | 182 +++++++-----------
 .../security/integrity/ima/tests/ima_policy.sh     | 145 +++++++-------
 .../security/integrity/ima/tests/ima_setup.sh      | 109 +++++------
 .../kernel/security/integrity/ima/tests/ima_tpm.sh | 129 ++++++-------
 .../security/integrity/ima/tests/ima_violations.sh | 214 ++++++++++-----------
 6 files changed, 337 insertions(+), 450 deletions(-)
 mode change 100755 => 100644 testcases/kernel/security/integrity/ima/tests/ima_setup.sh

Comments

Cyril Hrubis Jan. 26, 2018, 1:09 p.m. UTC | #1
Hi!
> +# Verify that measurements are added to the measurement list based on policy.
> +
> +TST_TESTFUNC="test"
> +TST_CNT=3
> +. ima_setup.sh
> +
> +TEST_FILE="test.txt"
> +HASH_COMMAND="sha1sum"
> +POLICY="$IMA_DIR/policy"
>  
>  init()
>  {
> -	tst_check_cmds sha1sum
> -
> -	# verify using default policy
> -	if [ ! -f "$IMA_DIR/policy" ]; then
> -		tst_resm TINFO "not using default policy"
> -	fi
> +	grep -q '^CONFIG_IMA_DEFAULT_HASH_SHA256=y' /boot/config-$(uname -r) && \
> +		HASH_COMMAND="sha256sum"

Grepping /boot/config-$foo is really broken, isn't there some sysfs
or ioctl interface where we can figure out this info?

> +	tst_res TINFO "detected IMA algoritm: ${HASH_COMMAND%sum}"
> +	tst_check_cmds $HASH_COMMAND
> +	[ -f "$POLICY" ] || tst_res TINFO "not using default policy"
>  }
>  
> -# Function:     test01
> -# Description   - Verify reading a file causes a new measurement to
> -#		  be added to the IMA measurement list.
> -test01()
> +ima_check()
>  {
> -	# Create file test.txt
> -	cat > test.txt <<-EOF
> -	$(date) - this is a test file
> -	EOF
> -	if [ $? -ne 0 ]; then
> -		tst_brkm TBROK "Unable to create test file"
> -	fi
> -
> -	# Calculating the sha1sum of test.txt should add
> -	# the measurement to the measurement list.
> -	# (Assumes SHA1 IMA measurements.)
> -	hash=$(sha1sum "test.txt" | sed 's/  -//')
> -
> -	# Check if the file is measured
> -	# (i.e. contained in the ascii measurement list.)
> -	cat /sys/kernel/security/ima/ascii_runtime_measurements > measurements
> -	sleep 1
> -	$(grep $hash measurements > /dev/null)
> -	if [ $? -ne 0 ]; then
> -		tst_resm TFAIL "TPM ascii measurement list does not contain sha1sum"
> -	else
> -		tst_resm TPASS "TPM ascii measurement list contains sha1sum"
> -	fi
> +	EXPECT_PASS grep -q $($HASH_COMMAND $TEST_FILE) $ASCII_MEASUREMENTS
>  }
>  
> -# Function:     test02
> -# Description	- Verify modifying, then reading, a file causes a new
> -# 		  measurement to be added to the IMA measurement list.
> -test02()
> +test1()
>  {
> -	# Modify test.txt
> -	echo $(date) - file modified >> test.txt
> +	tst_res TINFO "verify adding record to the IMA measurement list"
> +	ROD echo "$(date) this is a test file" \> $TEST_FILE
> +	ima_check
> +}
>  
> -	# Calculating the sha1sum of test.txt should add
> -	# the new measurement to the measurement list
> -	hash=$(sha1sum test.txt | sed 's/  -//')
> +test2()
> +{
> +	local device
>  
> -	# Check if the new measurement exists
> -	cat /sys/kernel/security/ima/ascii_runtime_measurements > measurements
> -	$(grep $hash measurements > /dev/null)
> +	tst_res TINFO "verify updating record in the IMA measurement list"
>  
> -	if [ $? -ne 0 ]; then
> -		tst_resm TFAIL "Modified file not measured"
> -		tst_resm TINFO "iversion not supported; or not mounted with iversion"
> +	device="$(df . | sed -e 1d | cut -f1 -d ' ')"
> +	if grep -q $device /proc/mounts; then
> +		if grep -q "${device}.*ext[2-4]" /proc/mounts; then
> +			grep -q "${device}.*ext[2-4].*i_version" /proc/mounts || \
> +				tst_res TINFO "device '$device' is not mounted with iversion"
> +		fi
>  	else
> -		tst_resm TPASS "Modified file measured"
> +		tst_res TWARN "could not find mount info for device '$device'"
>  	fi
> +
> +	ROD echo "$(date) modified file" \> $TEST_FILE
> +	ima_check
>  }
>  
> -# Function:     test03
> -# Description 	- Verify files are measured based on policy
> -#		(Default policy does not measure user files.)
> -test03()
> +test3()
>  {
> -	# create file user-test.txt
> -	mkdir -m 0700 user
> -	chown nobody.nobody user
> -	cd user
> -	hash=0
> -
> -	# As user nobody, create and cat the new file
> -	# (The LTP tests assumes existence of 'nobody'.)
> -	sudo -n -u nobody sh -c "echo $(date) - create test.txt > ./test.txt;
> -				 cat ./test.txt > /dev/null"
> -
> -	# Calculating the hash will add the measurement to the measurement
> -	# list, so only calc the hash value after getting the measurement
> -	# list.
> -	cat /sys/kernel/security/ima/ascii_runtime_measurements > measurements
> -	hash=$(sha1sum test.txt | sed 's/  -//')
> -	cd - >/dev/null
> -
> -	# Check if the file is measured
> -	grep $hash measurements > /dev/null
> -	if [ $? -ne 0 ]; then
> -		tst_resm TPASS "user file test.txt not measured"
> -	else
> -		tst_resm TFAIL "user file test.txt measured"
> -	fi
> -}
> +	local dir="user"
> +	local user="nobody"
>  
> -. ima_setup.sh
> +	tst_res TINFO "verify measuring user files"
>  
> -setup
> -TST_CLEANUP=cleanup
> +	id $user >/dev/null 2>/dev/null || tst_brk TCONF "missing system user $user (wrong installation)"
> +	tst_check_cmds sudo
>  
> -init
> -test01
> -test02
> -test03
> +	mkdir -m 0700 $dir
> +	chown $user $dir
> +	cd $dir
> +
> +	sudo -n -u $user sh -c "echo $(date) user file > $TEST_FILE;
> +		cat $TEST_FILE > /dev/null"
>  
> -tst_exit
> +	ima_check
> +	cd ..
> +}
> +
> +init
   ^
   Any reason we don't pass this as TST_SETUP ?
> +tst_run
> diff --git a/testcases/kernel/security/integrity/ima/tests/ima_policy.sh b/testcases/kernel/security/integrity/ima/tests/ima_policy.sh
> index ad5900975..162d323a1 100755
> --- a/testcases/kernel/security/integrity/ima/tests/ima_policy.sh
> +++ b/testcases/kernel/security/integrity/ima/tests/ima_policy.sh
> @@ -1,127 +1,114 @@
>  #!/bin/sh
> -################################################################################
> -##                                                                            ##
> -## Copyright (C) 2009 IBM Corporation                                         ##
> -##                                                                            ##
> -## 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; either version 2 of the License, or          ##
> -## (at your option) any later version.                                        ##
> -##                                                                            ##
> -## This program is distributed in the hope that it will be useful, but        ##
> -## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
> -## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
> -## for more details.                                                          ##
> -##                                                                            ##
> -## You should have received a copy of the GNU General Public License          ##
> -## along with this program;  if not, write to the Free Software               ##
> -## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
> -##                                                                            ##
> -################################################################################
> +# Copyright (c) 2009 IBM Corporation
> +# Copyright (c) 2018 Petr Vorel <pvorel@suse.cz>
>  #
> -# File :        ima_policy.sh
> +# 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; either version 2 of
> +# the License, or (at your option) any later version.
>  #
> -# Description:  This file tests replacing the default integrity measurement
> -#		policy.
> +# This program is distributed in the hope that it would be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
>  #
> -# Author:       Mimi Zohar, zohar@ibm.vnet.ibm.com
> -################################################################################
> -export TST_TOTAL=3
> -export TCID="ima_policy"
> +# You should have received a copy of the GNU General Public License
> +# along with this program. If not, see <http://www.gnu.org/licenses/>.
> +#
> +# Author: Mimi Zohar, zohar@ibm.vnet.ibm.com
> +#
> +# Test replacing the default integrity measurement policy.
> +
> +TST_TESTFUNC="test"
> +TST_CNT=3
> +. ima_setup.sh
>  
>  init()
>  {
> -	# verify using default policy
> -	IMA_POLICY=$IMA_DIR/policy
> -	if [ ! -f $IMA_POLICY ]; then
> -		tst_resm TINFO "default policy already replaced"
> -	fi
> +	IMA_POLICY="$IMA_DIR/policy"
> +	[ -f $IMA_POLICY ] || \
> +		tst_brk TCONF "IMA policy already loaded and kernel not configured to enable multiple writes it"
>  
> -	VALID_POLICY=$LTPROOT/testcases/data/ima_policy/measure.policy
> -	if [ ! -f $VALID_POLICY ]; then
> -		tst_resm TINFO "missing $VALID_POLICY"
> -	fi
> +	VALID_POLICY="$LTPROOT/testcases/data/ima_policy/measure.policy"
                               ^
			       $TST_DATAROOT
> +	[ -f $VALID_POLICY ] || tst_brk TCONF "missing $VALID_POLICY"
>  
> -	INVALID_POLICY=$LTPROOT/testcases/data/ima_policy/measure.policy-invalid
> -	if [ ! -f $INVALID_POLICY ]; then
> -		tst_resm TINFO "missing $INVALID_POLICY"
> -	fi
> +	INVALID_POLICY="$LTPROOT/testcases/data/ima_policy/measure.policy-invalid"
> +	[ -f $INVALID_POLICY ] || tst_brk TCONF "missing $INVALID_POLICY"
>  }
>  
>  load_policy()
>  {
> +	local ret
> +
>  	exec 2>/dev/null 4>$IMA_POLICY
> -	if [ $? -ne 0 ]; then
> -		exit 1
> -	fi
> +	[ $? -eq 0 ] || exit 1
>  
>  	cat $1 |
> -	while read line ; do
> -	{
> -		if [ "${line#\#}" = "${line}" ] ; then
> -			echo $line >&4 2> /dev/null
> +	while read line; do
> +		if [ "${line#\#}" = "${line}" ]; then
> +			echo "$line" >&4 2> /dev/null
>  			if [ $? -ne 0 ]; then
>  				exec 4>&-
>  				return 1
>  			fi
>  		fi
> -	}
>  	done
> -}
> +	ret=$?
>  
> +	[ $ret -eq 0 ] && \
> +		tst_res TINFO "IMA policy updated, please reboot after testing to restore settings"
>  
> -# Function:     test01
> -# Description   - Verify invalid policy doesn't replace default policy.
> -test01()
> +	return $ret
> +}
> +
> +test1()
>  {
> +	tst_res TINFO "verify that invalid policy doesn't replace default policy"
> +
> +	local p1
> +
>  	load_policy $INVALID_POLICY & p1=$!
>  	wait "$p1"
>  	if [ $? -ne 0 ]; then
> -		tst_resm TPASS "didn't load invalid policy"
> +		tst_res TPASS "didn't load invalid policy"
>  	else
> -		tst_resm TFAIL "loaded invalid policy"
> +		tst_res TFAIL "loaded invalid policy"
>  	fi
>  }
>  
> -# Function:     test02
> -# Description	- Verify policy file is opened sequentially, not concurrently
> -#		  and install new policy
> -test02()
> +test2()
>  {
> +	tst_res TINFO "verify that policy file is opened sequentially and installs new policy"
> +
> +	local p1 p2 rc1 rc2
> +
>  	load_policy $VALID_POLICY & p1=$!  # forked process 1
>  	load_policy $VALID_POLICY & p2=$!  # forked process 2
> -	wait "$p1"; RC1=$?
> -	wait "$p2"; RC2=$?
> -	if [ $RC1 -eq 0 ] && [ $RC2 -eq 0 ]; then
> -		tst_resm TFAIL "measurement policy opened concurrently"
> -	elif [ $RC1 -eq 0 ] || [ $RC2 -eq 0 ]; then
> -		tst_resm TPASS "replaced default measurement policy"
> +	wait "$p1"; rc1=$?
> +	wait "$p2"; rc2=$?
> +	if [ $rc1 -eq 0 ] && [ $rc2 -eq 0 ]; then
> +		tst_res TFAIL "measurement policy opened concurrently"
> +	elif [ $rc1 -eq 0 ] || [ $rc2 -eq 0 ]; then
> +		tst_res TPASS "replaced default measurement policy"
>  	else
> -		tst_resm TFAIL "problems opening measurement policy"
> +		tst_res TFAIL "problems opening measurement policy"
>  	fi
>  }
>  
> -# Function:     test03
> -# Description 	- Verify can't load another measurement policy.
> -test03()
> +test3()
>  {
> +	tst_res TINFO "verify that valid policy isn't replaced"
> +
> +	local p1
> +
>  	load_policy $INVALID_POLICY & p1=$!
>  	wait "$p1"
>  	if [ $? -ne 0 ]; then
> -		tst_resm TPASS "didn't replace valid policy"
> +		tst_res TPASS "didn't replace valid policy"
>  	else
> -		tst_resm TFAIL "replaced valid policy"
> +		tst_res TFAIL "replaced valid policy"
>  	fi
>  }
>  
> -. ima_setup.sh
> -
> -setup
> -TST_CLEANUP=cleanup
> -
>  init
> -test01
> -test02
> -test03
> -
> -tst_exit
> +tst_run
> diff --git a/testcases/kernel/security/integrity/ima/tests/ima_setup.sh b/testcases/kernel/security/integrity/ima/tests/ima_setup.sh
> old mode 100755
> new mode 100644
> index 0ff38d23b..7e19e3959
> --- a/testcases/kernel/security/integrity/ima/tests/ima_setup.sh
> +++ b/testcases/kernel/security/integrity/ima/tests/ima_setup.sh
> @@ -1,86 +1,67 @@
>  #!/bin/sh
> -################################################################################
> -##                                                                            ##
> -## Copyright (C) 2009 IBM Corporation                                         ##
> -##                                                                            ##
> -## 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; either version 2 of the License, or          ##
> -## (at your option) any later version.                                        ##
> -##                                                                            ##
> -## This program is distributed in the hope that it will be useful, but        ##
> -## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
> -## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
> -## for more details.                                                          ##
> -##                                                                            ##
> -## You should have received a copy of the GNU General Public License          ##
> -## along with this program;  if not, write to the Free Software Foundation,   ##
> -## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           ##
> -##                                                                            ##
> -################################################################################
> +# Copyright (c) 2009 IBM Corporation
> +# Copyright (c) 2018 Petr Vorel <pvorel@suse.cz>
>  #
> -# File :        ima_setup.sh
> +# 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; either version 2 of
> +# the License, or (at your option) any later version.
>  #
> -# Description:  setup/cleanup routines for the integrity tests.
> +# This program is distributed in the hope that it would be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
>  #
> -# Author:       Mimi Zohar, zohar@ibm.vnet.ibm.com
> -################################################################################
> -. test.sh
> -mount_sysfs()
> -{
> -	SYSFS=$(mount 2>/dev/null | awk '$5 == "sysfs" { print $3 }')
> -	if [ "x$SYSFS" = x ] ; then
> +# You should have received a copy of the GNU General Public License
> +# along with this program. If not, see <http://www.gnu.org/licenses/>.
> +#
> +# Author: Mimi Zohar, zohar@ibm.vnet.ibm.com
>  
> -		SYSFS=/sys
> +TST_CLEANUP="cleanup"
> +TST_NEEDS_TMPDIR=1
> +TST_NEEDS_ROOT=1
> +. tst_test.sh
>  
> -		test -d $SYSFS || mkdir -p $SYSFS 2>/dev/null
> -		if [ $? -ne 0 ] ; then
> -			tst_brkm TBROK "Failed to mkdir $SYSFS"
> -		fi
> -		if ! mount -t sysfs sysfs $SYSFS 2>/dev/null ; then
> -			tst_brkm TBROK "Failed to mount $SYSFS"
> -		fi
> +export TCID="${TCID:-$(basename $0 | cut -d. -f1)}"
>  
> -	fi
> -}
> +UMOUNT=
>  
> -mount_securityfs()
> +mount_helper()
>  {
> -	SECURITYFS=$(mount 2>/dev/null | awk '$5 == "securityfs" { print $3 }')
> -	if [ "x$SECURITYFS" = x ] ; then
> -
> -		SECURITYFS="$SYSFS/kernel/security"
> +	local type="$1"
> +	local default_dir="$2"
> +	local dir
>  
> -		test -d $SECURITYFS || mkdir -p $SECURITYFS 2>/dev/null
> -		if [ $? -ne 0 ] ; then
> -			tst_brkm TBROK "Failed to mkdir $SECURITYFS"
> -		fi
> -		if ! mount -t securityfs securityfs $SECURITYFS 2>/dev/null ; then
> -			tst_brkm TBROK "Failed to mount $SECURITYFS"
> -		fi
> +	dir="$(grep ^$type /proc/mounts | cut -d ' ' -f2 | head -1)"
> +	[ -n "$dir" ] && { echo "$dir"; return; }
>  
> +	if ! mkdir -p $default_dir; then
> +		tst_brk TBROK "Failed to create $default_dir"
> +	fi
> +	if ! mount -t $type $type $default_dir; then
> +		tst_brk TBROK "Failed to mount $type"
>  	fi
> +	UMOUNT="$default_dir $UMOUNT"
> +	echo $default_dir
>  }
>  
>  setup()
>  {
> -	tst_require_root
> +	SYSFS="$(mount_helper sysfs /sys)"

Do we really still need to mount /sys as far as I can tell it's
mounted automatically for more than 10 years now.

> +	SECURITYFS="$(mount_helper securityfs $SYSFS/kernel/security)"
>  
> -	tst_tmpdir
> -
> -	mount_sysfs
> -
> -	# mount securityfs if it is not already mounted
> -	mount_securityfs
> -
> -	# IMA must be configured in the kernel
> -	IMA_DIR=$SECURITYFS/ima
> -	if [ ! -d "$IMA_DIR" ]; then
> -		tst_brkm TCONF "IMA not enabled in kernel"
> -	fi
> +	IMA_DIR="$SECURITYFS/ima"
> +	[ -d "$IMA_DIR" ] || tst_brk TCONF "IMA not enabled in kernel"
> +	ASCII_MEASUREMENTS="$IMA_DIR/ascii_runtime_measurements"
> +	BINARY_MEASUREMENTS="$IMA_DIR/binary_runtime_measurements"
>  }
>  
>  cleanup()
>  {
> -	tst_rmdir
> +	local dir
> +	for dir in $UMOUNT; do
> +		umount $dir
> +	done
>  }
> +
> +setup
> diff --git a/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh b/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh
> index 333bf5f8a..a3d1739cd 100755
> --- a/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh
> +++ b/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh
> @@ -1,70 +1,61 @@
>  #!/bin/sh
> -
> -################################################################################
> -##                                                                            ##
> -## Copyright (C) 2009 IBM Corporation                                         ##
> -##                                                                            ##
> -## 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; either version 2 of the License, or          ##
> -## (at your option) any later version.                                        ##
> -##                                                                            ##
> -## This program is distributed in the hope that it will be useful, but        ##
> -## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
> -## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
> -## for more details.                                                          ##
> -##                                                                            ##
> -## You should have received a copy of the GNU General Public License          ##
> -## along with this program;  if not, write to the Free Software               ##
> -## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
> -##                                                                            ##
> -################################################################################
> +# Copyright (c) 2009 IBM Corporation
> +# Copyright (c) 2018 Petr Vorel <pvorel@suse.cz>
> +#
> +# 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; either version 2 of
> +# the License, or (at your option) any later version.
>  #
> -# File :        ima_tpm.sh
> +# This program is distributed in the hope that it would be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
>  #
> -# Description:  This file verifies the boot and PCR aggregates
> +# You should have received a copy of the GNU General Public License
> +# along with this program. If not, see <http://www.gnu.org/licenses/>.
>  #
> -# Author:       Mimi Zohar, zohar@ibm.vnet.ibm.com
> +# Author: Mimi Zohar, zohar@ibm.vnet.ibm.com
>  #
> -# Return        - zero on success
> -#               - non zero on failure. return value from commands ($RC)
> -################################################################################
> -export TST_TOTAL=3
> -export TCID="ima_tpm"
> +# Verify the boot and PCR aggregates.
> +
> +TST_TESTFUNC="test"
> +TST_CNT=3
> +. ima_setup.sh
>  
>  init()
>  {
>  	tst_check_cmds ima_boot_aggregate ima_measure
>  }
>  
> -# Function:     test01
> -# Description   - Verify boot aggregate value is correct
> -test01()
> +test1()
>  {
> -	zero="0000000000000000000000000000000000000000"
> +	tst_res TINFO "verify boot aggregate"
> +
> +	local zero="0000000000000000000000000000000000000000"
> +	local tpm_bios="$SECURITYFS/tpm0/binary_bios_measurements"
> +	local ima_measurements="$ASCII_MEASUREMENTS"
> +	local ima_aggr line
>  
>  	# IMA boot aggregate
> -	ima_measurements=$SECURITYFS/ima/ascii_runtime_measurements
>  	read line < $ima_measurements
>  	ima_aggr=$(expr substr "${line}" 49 40)
>  
> -	# verify TPM is available and enabled.
> -	tpm_bios=$SECURITYFS/tpm0/binary_bios_measurements
>  	if [ ! -f "$tpm_bios" ]; then
> -		tst_brkm TCONF "TPM not builtin kernel, or TPM not enabled"
> +		tst_brk TCONF "TPM not builtin kernel, or TPM not enabled"
>  
>  		if [ "${ima_aggr}" = "${zero}" ]; then
> -			tst_resm TPASS "bios boot aggregate is 0."
> +			tst_res TPASS "bios boot aggregate is 0"
>  		else
> -			tst_resm TFAIL "bios boot aggregate is not 0."
> +			tst_res TFAIL "bios boot aggregate is not 0"
>  		fi
>  	else
>  		boot_aggregate=$(ima_boot_aggregate $tpm_bios)
>  		boot_aggr=$(expr substr $boot_aggregate 16 40)
>  		if [ "x${ima_aggr}" = "x${boot_aggr}" ]; then
> -			tst_resm TPASS "bios aggregate matches IMA boot aggregate."
> +			tst_res TPASS "bios aggregate matches IMA boot aggregate"
>  		else
> -			tst_resm TFAIL "bios aggregate does not match IMA boot aggregate."
> +			tst_res TFAIL "bios aggregate does not match IMA boot aggregate"
>  		fi
>  	fi
>  }
> @@ -74,64 +65,54 @@ test01()
>  # the PCR values from /sys/devices.
>  validate_pcr()
>  {
> -	ima_measurements=$SECURITYFS/ima/binary_runtime_measurements
> -	aggregate_pcr=$(ima_measure $ima_measurements --validate)
> -	dev_pcrs=$1
> -	RC=0
> +	tst_res TINFO "verify PCR (Process Control Register)"
>  
> -	while read line ; do
> +	local ima_measurements="$BINARY_MEASUREMENTS"
> +	local aggregate_pcr="$(ima_measure $ima_measurements --validate)"
> +	local dev_pcrs="$1"
> +	local ret=0
> +
> +	while read line; do
>  		pcr=$(expr substr "${line}" 1 6)
>  		if [ "${pcr}" = "PCR-10" ]; then
>  			aggr=$(expr substr "${aggregate_pcr}" 26 59)
>  			pcr=$(expr substr "${line}" 9 59)
> -			[ "${pcr}" = "${aggr}" ] || RC=$?
> +			[ "${pcr}" = "${aggr}" ] || ret=$?
>  		fi
>  	done < $dev_pcrs
> -	return $RC
> +	return $ret
>  }
>  
> -# Function:     test02
> -# Description	- Verify ima calculated aggregate PCR values matches
> -#		  actual PCR value.
> -test02()
> +test2()
>  {
> +	tst_res TINFO "verify PCR values"
>  
> -	# Would be nice to know where the PCRs are located.  Is this safe?
> -	PCRS_PATH=$(find /$SYSFS/devices/ | grep pcrs)
> +	# Would be nice to know where the PCRs are located. Is this safe?
> +	local pcrs_path="$(find $SYSFS/devices/ | grep pcrs)"
>  	if [ $? -eq 0 ]; then
> -		validate_pcr $PCRS_PATH
> +		validate_pcr $pcrs_path
>  		if [ $? -eq 0 ]; then
> -			tst_resm TPASS "aggregate PCR value matches real PCR value."
> +			tst_res TPASS "aggregate PCR value matches real PCR value"
>  		else
> -			tst_resm TFAIL "aggregate PCR value does not match real PCR value."
> +			tst_res TFAIL "aggregate PCR value does not match real PCR value"
>  		fi
>  	else
> -		tst_resm TFAIL "TPM not enabled, no PCR value to validate"
> +		tst_res TFAIL "TPM not enabled, no PCR value to validate"
>  	fi
>  }
>  
> -# Function:     test03
> -# Description 	- Verify template hash value for IMA entry is correct.
> -test03()
> +test3()
>  {
> +	tst_res TINFO "verify template hash value"
>  
> -	ima_measurements=$SECURITYFS/ima/binary_runtime_measurements
> -	aggregate_pcr=$(ima_measure $ima_measurements --verify --validate) > /dev/null
> +	local ima_measurements="$BINARY_MEASUREMENTS"
> +	ima_measure $ima_measurements --verify --validate
>  	if [ $? -eq 0 ]; then
> -		tst_resm TPASS "verified IMA template hash values."
> +		tst_res TPASS "verified IMA template hash values"
>  	else
> -		tst_resm TFAIL "error verifing IMA template hash values."
> +		tst_res TFAIL "error verifing IMA template hash values"
>  	fi
>  }
>  
> -. ima_setup.sh
> -
> -setup
> -TST_CLEANUP=cleanup
> -
>  init

Here as well.

> -test01
> -test02
> -test03
> -
> -tst_exit
> +tst_run
> diff --git a/testcases/kernel/security/integrity/ima/tests/ima_violations.sh b/testcases/kernel/security/integrity/ima/tests/ima_violations.sh
> index 1b86b5f1a..80a01a546 100755
> --- a/testcases/kernel/security/integrity/ima/tests/ima_violations.sh
> +++ b/testcases/kernel/security/integrity/ima/tests/ima_violations.sh
> @@ -1,44 +1,45 @@
>  #!/bin/sh
> -################################################################################
> -##                                                                            ##
> -## Copyright (C) 2009 IBM Corporation                                         ##
> -##                                                                            ##
> -## 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; either version 2 of the License, or          ##
> -## (at your option) any later version.                                        ##
> -##                                                                            ##
> -## This program is distributed in the hope that it will be useful, but        ##
> -## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
> -## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
> -## for more details.                                                          ##
> -##                                                                            ##
> -## You should have received a copy of the GNU General Public License          ##
> -## along with this program;  if not, write to the Free Software               ##
> -## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
> -##                                                                            ##
> -################################################################################
> +# Copyright (c) 2009 IBM Corporation
> +# Copyright (c) 2018 Petr Vorel <pvorel@suse.cz>
>  #
> -# File :        ima_violations.sh
> +# 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; either version 2 of
> +# the License, or (at your option) any later version.
>  #
> -# Description:  This file tests ToMToU and open_writer violations invalidate
> -#		the PCR and are logged.
> +# This program is distributed in the hope that it would be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
>  #
> -# Author:       Mimi Zohar, zohar@ibm.vnet.ibm.com
> +# You should have received a copy of the GNU General Public License
> +# along with this program. If not, see <http://www.gnu.org/licenses/>.
>  #
> -# Return        - zero on success
> -#               - non zero on failure. return value from commands ($RC)
> -################################################################################
> +# Author: Mimi Zohar, zohar@ibm.vnet.ibm.com
> +#
> +# Test whether ToMToU and open_writer violations invalidatethe PCR and are logged.
>  
> -export TST_TOTAL=3
> -export TCID="ima_violations"
> +TST_TESTFUNC="test"
> +TST_CNT=3
> +. ima_setup.sh
>  
> -open_file_read()
> +FILE="test.txt"
> +IMA_VIOLATIONS="$SECURITYFS/ima/violations"
> +
> +init()
>  {
> -	exec 3< $1
> -	if [ $? -ne 0 ]; then
> -		exit 1
> +	LOG="/var/log/messages"
> +	SLEEP="500ms"
> +	if service auditd status > /dev/null 2>&1; then

Here we depend on service being installed, which unfortunately is not
the case for all currently supported distributions. Have a look at
testcases/lib/daemonlib.sh and status_daemon() function there.

> +		LOG="/var/log/audit/audit.log"
> +		tst_res TINFO "requires integrity auditd patch"
>  	fi
> +	tst_res TINFO "using log $LOG"
> +}
> +
> +open_file_read()
> +{
> +	exec 3< $FILE || exit 1
>  }
>  
>  close_file_read()
> @@ -48,11 +49,8 @@ close_file_read()
>  
>  open_file_write()
>  {
> -	exec 4> $1
> -	if [ $? -ne 0 ]; then
> -		exit 1
> -	echo 'testing, testing, ' >&4
> -	fi
> +	exec 4> $FILE || exit 1
> +	echo 'test writing' >&4
>  }
>  
>  close_file_write()
> @@ -60,103 +58,89 @@ close_file_write()
>  	exec 4>&-
>  }
>  
> -init()
> +get_count()
>  {
> -	service auditd status > /dev/null 2>&1
> -	if [ $? -ne 0 ]; then
> -		log=/var/log/messages
> -	else
> -		log=/var/log/audit/audit.log
> -		tst_resm TINFO "requires integrity auditd patch"
> -	fi
> -
> -	ima_violations=$SECURITYFS/ima/violations
> +	local search="$1"
> +	echo $(grep -c "${search}.*${FILE}" $LOG)
>  }
>  
> -# Function:     test01
> -# Description	- Verify open writers violation
> -test01()
> +validate()
>  {
> -	read num_violations < $ima_violations
> -
> -	TMPFN=test.txt
> -	open_file_write $TMPFN
> -	open_file_read $TMPFN
> -	close_file_read
> -	close_file_write
> -	read num_violations_new < $ima_violations
> -	num=$(($(expr $num_violations_new - $num_violations)))
> -	if [ $num -gt 0 ]; then
> -		tail $log | grep test.txt | grep -q 'open_writers'
> -		if [ $? -eq 0 ]; then
> -			tst_resm TPASS "open_writers violation added(test.txt)"
> +	local num_violations="$1"
> +	local count="$2"
> +	local search="$3"
> +	local count2="$(get_count $search)"
> +	local num_violations_new
> +
> +	[ -n "$SLEEP" ] && tst_sleep $SLEEP
> +
> +	read num_violations_new < $IMA_VIOLATIONS
> +	if [ $(($num_violations_new - $num_violations)) -gt 0 ]; then
> +		if [ $count2 -gt $count ]; then
> +			tst_res TPASS "$search violation added"
>  		else
> -			tst_resm TFAIL "(message ratelimiting?)"
> +			tst_res TFAIL "$search not found in $LOG"
>  		fi
>  	else
> -		tst_resm TFAIL "open_writers violation not added(test.txt)"
> +		tst_res TFAIL "$search violation not added"
>  	fi
>  }
>  
> -# Function:     test02
> -# Description   - Verify ToMToU violation
> -test02()
> +test1()
>  {
> -	read num_violations < $ima_violations
> +	tst_res TINFO "verify open writers violation"
>  
> -	TMPFN=test.txt
> -	open_file_read $TMPFN
> -	open_file_write $TMPFN
> -	close_file_write
> +	local search="open_writers"
> +	local count num_violations
> +
> +	read num_violations < $IMA_VIOLATIONS
> +	count="$(get_count $search)"
> +
> +	open_file_write
> +	open_file_read
>  	close_file_read
> -	read num_violations_new < $ima_violations
> -	num=$(($(expr $num_violations_new - $num_violations)))
> -	if [ $num -gt 0 ]; then
> -		tail $log | grep test.txt | grep -q 'ToMToU'
> -		if [ $? -eq 0 ]; then
> -			tst_resm TPASS "ToMToU violation added(test.txt)"
> -		else
> -			tst_resm TFAIL "(message ratelimiting?)"
> -		fi
> -	else
> -		tst_resm TFAIL "ToMToU violation not added(test.txt)"
> -	fi
> +	close_file_write
> +
> +	validate $num_violations $count $search
>  }
>  
> -# Function:     test03
> -# Description 	- verify open_writers using mmapped files
> -test03()
> +test2()
>  {
> -	read num_violations < $ima_violations
> -
> -	TMPFN=test.txtb
> -	echo 'testing testing ' > $TMPFN
> -	ima_mmap $TMPFN & p1=$!
> -	sleep 1		# got to wait for ima_mmap to mmap the file
> -	open_file_read $TMPFN
> -	read num_violations_new < $ima_violations
> -	num=$(($(expr $num_violations_new - $num_violations)))
> -	if [ $num -gt 0 ]; then
> -		tail $log | grep test.txtb | grep -q 'open_writers'
> -		if [ $? -eq 0 ]; then
> -			tst_resm TPASS "mmapped open_writers violation added(test.txtb)"
> -		else
> -			tst_resm TFAIL "(message ratelimiting?)"
> -		fi
> -	else
> -		tst_resm TFAIL "mmapped open_writers violation not added(test.txtb)"
> -	fi
> +	tst_res TINFO "verify ToMToU violation"
> +
> +	local search="ToMToU"
> +	local count num_violations
> +
> +	read num_violations < $IMA_VIOLATIONS
> +	count="$(get_count $search)"
> +
> +	open_file_read
> +	open_file_write
> +	close_file_write
>  	close_file_read
> +
> +	validate $num_violations $count $search
>  }
>  
> -. ima_setup.sh
> +test3()
> +{
> +	tst_res TINFO "verify open_writers using mmapped files"
>  
> -setup
> -TST_CLEANUP=cleanup
> +	local search="open_writers"
> +	local count num_violations
>  
> -init
> -test01
> -test02
> -test03
> +	read num_violations < $IMA_VIOLATIONS
> +	count="$(get_count $search)"
> +
> +	echo 'testing testing ' > $FILE
> +	ima_mmap $FILE &
> +	sleep 1

What do we sleep here for?

> +	open_file_read
> +	close_file_read
> +
> +	validate $num_violations $count $search
> +}
> +
> +init
> +tst_run
> -- 
> 2.15.1
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp
diff mbox

Patch

diff --git a/runtest/ima b/runtest/ima
index 251458af4..20d2e0810 100644
--- a/runtest/ima
+++ b/runtest/ima
@@ -1,5 +1,5 @@ 
 #DESCRIPTION:Integrity Measurement Architecture (IMA)
-ima01   ima_measurements.sh
-ima02   ima_policy.sh
-ima03   ima_tpm.sh
-ima04   ima_violations.sh
+ima01 ima_measurements.sh
+ima02 ima_policy.sh
+ima03 ima_tpm.sh
+ima04 ima_violations.sh
diff --git a/testcases/kernel/security/integrity/ima/tests/ima_measurements.sh b/testcases/kernel/security/integrity/ima/tests/ima_measurements.sh
index a3c357c8b..3993a575d 100755
--- a/testcases/kernel/security/integrity/ima/tests/ima_measurements.sh
+++ b/testcases/kernel/security/integrity/ima/tests/ima_measurements.sh
@@ -1,139 +1,93 @@ 
 #!/bin/sh
-
-################################################################################
-##                                                                            ##
-## Copyright (C) 2009 IBM Corporation                                         ##
-##                                                                            ##
-## 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; either version 2 of the License, or          ##
-## (at your option) any later version.                                        ##
-##                                                                            ##
-## This program is distributed in the hope that it will be useful, but        ##
-## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
-## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
-## for more details.                                                          ##
-##                                                                            ##
-## You should have received a copy of the GNU General Public License          ##
-## along with this program;  if not, write to the Free Software Foundation,   ##
-## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           ##
-##                                                                            ##
-################################################################################
+# Copyright (c) 2009 IBM Corporation
+# Copyright (c) 2018 Petr Vorel <pvorel@suse.cz>
+#
+# 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; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
 #
-# File :        ima_measurements.sh
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
 #
-# Description:  This file verifies measurements are added to the measurement
-# 		list based on policy.
+# Author: Mimi Zohar, zohar@ibm.vnet.ibm.com
 #
-# Author:       Mimi Zohar, zohar@ibm.vnet.ibm.com
-################################################################################
-export TST_TOTAL=3
-export TCID="ima_measurements"
+# Verify that measurements are added to the measurement list based on policy.
+
+TST_TESTFUNC="test"
+TST_CNT=3
+. ima_setup.sh
+
+TEST_FILE="test.txt"
+HASH_COMMAND="sha1sum"
+POLICY="$IMA_DIR/policy"
 
 init()
 {
-	tst_check_cmds sha1sum
-
-	# verify using default policy
-	if [ ! -f "$IMA_DIR/policy" ]; then
-		tst_resm TINFO "not using default policy"
-	fi
+	grep -q '^CONFIG_IMA_DEFAULT_HASH_SHA256=y' /boot/config-$(uname -r) && \
+		HASH_COMMAND="sha256sum"
+	tst_res TINFO "detected IMA algoritm: ${HASH_COMMAND%sum}"
+	tst_check_cmds $HASH_COMMAND
+	[ -f "$POLICY" ] || tst_res TINFO "not using default policy"
 }
 
-# Function:     test01
-# Description   - Verify reading a file causes a new measurement to
-#		  be added to the IMA measurement list.
-test01()
+ima_check()
 {
-	# Create file test.txt
-	cat > test.txt <<-EOF
-	$(date) - this is a test file
-	EOF
-	if [ $? -ne 0 ]; then
-		tst_brkm TBROK "Unable to create test file"
-	fi
-
-	# Calculating the sha1sum of test.txt should add
-	# the measurement to the measurement list.
-	# (Assumes SHA1 IMA measurements.)
-	hash=$(sha1sum "test.txt" | sed 's/  -//')
-
-	# Check if the file is measured
-	# (i.e. contained in the ascii measurement list.)
-	cat /sys/kernel/security/ima/ascii_runtime_measurements > measurements
-	sleep 1
-	$(grep $hash measurements > /dev/null)
-	if [ $? -ne 0 ]; then
-		tst_resm TFAIL "TPM ascii measurement list does not contain sha1sum"
-	else
-		tst_resm TPASS "TPM ascii measurement list contains sha1sum"
-	fi
+	EXPECT_PASS grep -q $($HASH_COMMAND $TEST_FILE) $ASCII_MEASUREMENTS
 }
 
-# Function:     test02
-# Description	- Verify modifying, then reading, a file causes a new
-# 		  measurement to be added to the IMA measurement list.
-test02()
+test1()
 {
-	# Modify test.txt
-	echo $(date) - file modified >> test.txt
+	tst_res TINFO "verify adding record to the IMA measurement list"
+	ROD echo "$(date) this is a test file" \> $TEST_FILE
+	ima_check
+}
 
-	# Calculating the sha1sum of test.txt should add
-	# the new measurement to the measurement list
-	hash=$(sha1sum test.txt | sed 's/  -//')
+test2()
+{
+	local device
 
-	# Check if the new measurement exists
-	cat /sys/kernel/security/ima/ascii_runtime_measurements > measurements
-	$(grep $hash measurements > /dev/null)
+	tst_res TINFO "verify updating record in the IMA measurement list"
 
-	if [ $? -ne 0 ]; then
-		tst_resm TFAIL "Modified file not measured"
-		tst_resm TINFO "iversion not supported; or not mounted with iversion"
+	device="$(df . | sed -e 1d | cut -f1 -d ' ')"
+	if grep -q $device /proc/mounts; then
+		if grep -q "${device}.*ext[2-4]" /proc/mounts; then
+			grep -q "${device}.*ext[2-4].*i_version" /proc/mounts || \
+				tst_res TINFO "device '$device' is not mounted with iversion"
+		fi
 	else
-		tst_resm TPASS "Modified file measured"
+		tst_res TWARN "could not find mount info for device '$device'"
 	fi
+
+	ROD echo "$(date) modified file" \> $TEST_FILE
+	ima_check
 }
 
-# Function:     test03
-# Description 	- Verify files are measured based on policy
-#		(Default policy does not measure user files.)
-test03()
+test3()
 {
-	# create file user-test.txt
-	mkdir -m 0700 user
-	chown nobody.nobody user
-	cd user
-	hash=0
-
-	# As user nobody, create and cat the new file
-	# (The LTP tests assumes existence of 'nobody'.)
-	sudo -n -u nobody sh -c "echo $(date) - create test.txt > ./test.txt;
-				 cat ./test.txt > /dev/null"
-
-	# Calculating the hash will add the measurement to the measurement
-	# list, so only calc the hash value after getting the measurement
-	# list.
-	cat /sys/kernel/security/ima/ascii_runtime_measurements > measurements
-	hash=$(sha1sum test.txt | sed 's/  -//')
-	cd - >/dev/null
-
-	# Check if the file is measured
-	grep $hash measurements > /dev/null
-	if [ $? -ne 0 ]; then
-		tst_resm TPASS "user file test.txt not measured"
-	else
-		tst_resm TFAIL "user file test.txt measured"
-	fi
-}
+	local dir="user"
+	local user="nobody"
 
-. ima_setup.sh
+	tst_res TINFO "verify measuring user files"
 
-setup
-TST_CLEANUP=cleanup
+	id $user >/dev/null 2>/dev/null || tst_brk TCONF "missing system user $user (wrong installation)"
+	tst_check_cmds sudo
 
-init
-test01
-test02
-test03
+	mkdir -m 0700 $dir
+	chown $user $dir
+	cd $dir
+
+	sudo -n -u $user sh -c "echo $(date) user file > $TEST_FILE;
+		cat $TEST_FILE > /dev/null"
 
-tst_exit
+	ima_check
+	cd ..
+}
+
+init
+tst_run
diff --git a/testcases/kernel/security/integrity/ima/tests/ima_policy.sh b/testcases/kernel/security/integrity/ima/tests/ima_policy.sh
index ad5900975..162d323a1 100755
--- a/testcases/kernel/security/integrity/ima/tests/ima_policy.sh
+++ b/testcases/kernel/security/integrity/ima/tests/ima_policy.sh
@@ -1,127 +1,114 @@ 
 #!/bin/sh
-################################################################################
-##                                                                            ##
-## Copyright (C) 2009 IBM Corporation                                         ##
-##                                                                            ##
-## 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; either version 2 of the License, or          ##
-## (at your option) any later version.                                        ##
-##                                                                            ##
-## This program is distributed in the hope that it will be useful, but        ##
-## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
-## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
-## for more details.                                                          ##
-##                                                                            ##
-## You should have received a copy of the GNU General Public License          ##
-## along with this program;  if not, write to the Free Software               ##
-## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
-##                                                                            ##
-################################################################################
+# Copyright (c) 2009 IBM Corporation
+# Copyright (c) 2018 Petr Vorel <pvorel@suse.cz>
 #
-# File :        ima_policy.sh
+# 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; either version 2 of
+# the License, or (at your option) any later version.
 #
-# Description:  This file tests replacing the default integrity measurement
-#		policy.
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
 #
-# Author:       Mimi Zohar, zohar@ibm.vnet.ibm.com
-################################################################################
-export TST_TOTAL=3
-export TCID="ima_policy"
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Author: Mimi Zohar, zohar@ibm.vnet.ibm.com
+#
+# Test replacing the default integrity measurement policy.
+
+TST_TESTFUNC="test"
+TST_CNT=3
+. ima_setup.sh
 
 init()
 {
-	# verify using default policy
-	IMA_POLICY=$IMA_DIR/policy
-	if [ ! -f $IMA_POLICY ]; then
-		tst_resm TINFO "default policy already replaced"
-	fi
+	IMA_POLICY="$IMA_DIR/policy"
+	[ -f $IMA_POLICY ] || \
+		tst_brk TCONF "IMA policy already loaded and kernel not configured to enable multiple writes it"
 
-	VALID_POLICY=$LTPROOT/testcases/data/ima_policy/measure.policy
-	if [ ! -f $VALID_POLICY ]; then
-		tst_resm TINFO "missing $VALID_POLICY"
-	fi
+	VALID_POLICY="$LTPROOT/testcases/data/ima_policy/measure.policy"
+	[ -f $VALID_POLICY ] || tst_brk TCONF "missing $VALID_POLICY"
 
-	INVALID_POLICY=$LTPROOT/testcases/data/ima_policy/measure.policy-invalid
-	if [ ! -f $INVALID_POLICY ]; then
-		tst_resm TINFO "missing $INVALID_POLICY"
-	fi
+	INVALID_POLICY="$LTPROOT/testcases/data/ima_policy/measure.policy-invalid"
+	[ -f $INVALID_POLICY ] || tst_brk TCONF "missing $INVALID_POLICY"
 }
 
 load_policy()
 {
+	local ret
+
 	exec 2>/dev/null 4>$IMA_POLICY
-	if [ $? -ne 0 ]; then
-		exit 1
-	fi
+	[ $? -eq 0 ] || exit 1
 
 	cat $1 |
-	while read line ; do
-	{
-		if [ "${line#\#}" = "${line}" ] ; then
-			echo $line >&4 2> /dev/null
+	while read line; do
+		if [ "${line#\#}" = "${line}" ]; then
+			echo "$line" >&4 2> /dev/null
 			if [ $? -ne 0 ]; then
 				exec 4>&-
 				return 1
 			fi
 		fi
-	}
 	done
-}
+	ret=$?
 
+	[ $ret -eq 0 ] && \
+		tst_res TINFO "IMA policy updated, please reboot after testing to restore settings"
 
-# Function:     test01
-# Description   - Verify invalid policy doesn't replace default policy.
-test01()
+	return $ret
+}
+
+test1()
 {
+	tst_res TINFO "verify that invalid policy doesn't replace default policy"
+
+	local p1
+
 	load_policy $INVALID_POLICY & p1=$!
 	wait "$p1"
 	if [ $? -ne 0 ]; then
-		tst_resm TPASS "didn't load invalid policy"
+		tst_res TPASS "didn't load invalid policy"
 	else
-		tst_resm TFAIL "loaded invalid policy"
+		tst_res TFAIL "loaded invalid policy"
 	fi
 }
 
-# Function:     test02
-# Description	- Verify policy file is opened sequentially, not concurrently
-#		  and install new policy
-test02()
+test2()
 {
+	tst_res TINFO "verify that policy file is opened sequentially and installs new policy"
+
+	local p1 p2 rc1 rc2
+
 	load_policy $VALID_POLICY & p1=$!  # forked process 1
 	load_policy $VALID_POLICY & p2=$!  # forked process 2
-	wait "$p1"; RC1=$?
-	wait "$p2"; RC2=$?
-	if [ $RC1 -eq 0 ] && [ $RC2 -eq 0 ]; then
-		tst_resm TFAIL "measurement policy opened concurrently"
-	elif [ $RC1 -eq 0 ] || [ $RC2 -eq 0 ]; then
-		tst_resm TPASS "replaced default measurement policy"
+	wait "$p1"; rc1=$?
+	wait "$p2"; rc2=$?
+	if [ $rc1 -eq 0 ] && [ $rc2 -eq 0 ]; then
+		tst_res TFAIL "measurement policy opened concurrently"
+	elif [ $rc1 -eq 0 ] || [ $rc2 -eq 0 ]; then
+		tst_res TPASS "replaced default measurement policy"
 	else
-		tst_resm TFAIL "problems opening measurement policy"
+		tst_res TFAIL "problems opening measurement policy"
 	fi
 }
 
-# Function:     test03
-# Description 	- Verify can't load another measurement policy.
-test03()
+test3()
 {
+	tst_res TINFO "verify that valid policy isn't replaced"
+
+	local p1
+
 	load_policy $INVALID_POLICY & p1=$!
 	wait "$p1"
 	if [ $? -ne 0 ]; then
-		tst_resm TPASS "didn't replace valid policy"
+		tst_res TPASS "didn't replace valid policy"
 	else
-		tst_resm TFAIL "replaced valid policy"
+		tst_res TFAIL "replaced valid policy"
 	fi
 }
 
-. ima_setup.sh
-
-setup
-TST_CLEANUP=cleanup
-
 init
-test01
-test02
-test03
-
-tst_exit
+tst_run
diff --git a/testcases/kernel/security/integrity/ima/tests/ima_setup.sh b/testcases/kernel/security/integrity/ima/tests/ima_setup.sh
old mode 100755
new mode 100644
index 0ff38d23b..7e19e3959
--- a/testcases/kernel/security/integrity/ima/tests/ima_setup.sh
+++ b/testcases/kernel/security/integrity/ima/tests/ima_setup.sh
@@ -1,86 +1,67 @@ 
 #!/bin/sh
-################################################################################
-##                                                                            ##
-## Copyright (C) 2009 IBM Corporation                                         ##
-##                                                                            ##
-## 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; either version 2 of the License, or          ##
-## (at your option) any later version.                                        ##
-##                                                                            ##
-## This program is distributed in the hope that it will be useful, but        ##
-## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
-## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
-## for more details.                                                          ##
-##                                                                            ##
-## You should have received a copy of the GNU General Public License          ##
-## along with this program;  if not, write to the Free Software Foundation,   ##
-## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           ##
-##                                                                            ##
-################################################################################
+# Copyright (c) 2009 IBM Corporation
+# Copyright (c) 2018 Petr Vorel <pvorel@suse.cz>
 #
-# File :        ima_setup.sh
+# 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; either version 2 of
+# the License, or (at your option) any later version.
 #
-# Description:  setup/cleanup routines for the integrity tests.
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
 #
-# Author:       Mimi Zohar, zohar@ibm.vnet.ibm.com
-################################################################################
-. test.sh
-mount_sysfs()
-{
-	SYSFS=$(mount 2>/dev/null | awk '$5 == "sysfs" { print $3 }')
-	if [ "x$SYSFS" = x ] ; then
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Author: Mimi Zohar, zohar@ibm.vnet.ibm.com
 
-		SYSFS=/sys
+TST_CLEANUP="cleanup"
+TST_NEEDS_TMPDIR=1
+TST_NEEDS_ROOT=1
+. tst_test.sh
 
-		test -d $SYSFS || mkdir -p $SYSFS 2>/dev/null
-		if [ $? -ne 0 ] ; then
-			tst_brkm TBROK "Failed to mkdir $SYSFS"
-		fi
-		if ! mount -t sysfs sysfs $SYSFS 2>/dev/null ; then
-			tst_brkm TBROK "Failed to mount $SYSFS"
-		fi
+export TCID="${TCID:-$(basename $0 | cut -d. -f1)}"
 
-	fi
-}
+UMOUNT=
 
-mount_securityfs()
+mount_helper()
 {
-	SECURITYFS=$(mount 2>/dev/null | awk '$5 == "securityfs" { print $3 }')
-	if [ "x$SECURITYFS" = x ] ; then
-
-		SECURITYFS="$SYSFS/kernel/security"
+	local type="$1"
+	local default_dir="$2"
+	local dir
 
-		test -d $SECURITYFS || mkdir -p $SECURITYFS 2>/dev/null
-		if [ $? -ne 0 ] ; then
-			tst_brkm TBROK "Failed to mkdir $SECURITYFS"
-		fi
-		if ! mount -t securityfs securityfs $SECURITYFS 2>/dev/null ; then
-			tst_brkm TBROK "Failed to mount $SECURITYFS"
-		fi
+	dir="$(grep ^$type /proc/mounts | cut -d ' ' -f2 | head -1)"
+	[ -n "$dir" ] && { echo "$dir"; return; }
 
+	if ! mkdir -p $default_dir; then
+		tst_brk TBROK "Failed to create $default_dir"
+	fi
+	if ! mount -t $type $type $default_dir; then
+		tst_brk TBROK "Failed to mount $type"
 	fi
+	UMOUNT="$default_dir $UMOUNT"
+	echo $default_dir
 }
 
 setup()
 {
-	tst_require_root
+	SYSFS="$(mount_helper sysfs /sys)"
+	SECURITYFS="$(mount_helper securityfs $SYSFS/kernel/security)"
 
-	tst_tmpdir
-
-	mount_sysfs
-
-	# mount securityfs if it is not already mounted
-	mount_securityfs
-
-	# IMA must be configured in the kernel
-	IMA_DIR=$SECURITYFS/ima
-	if [ ! -d "$IMA_DIR" ]; then
-		tst_brkm TCONF "IMA not enabled in kernel"
-	fi
+	IMA_DIR="$SECURITYFS/ima"
+	[ -d "$IMA_DIR" ] || tst_brk TCONF "IMA not enabled in kernel"
+	ASCII_MEASUREMENTS="$IMA_DIR/ascii_runtime_measurements"
+	BINARY_MEASUREMENTS="$IMA_DIR/binary_runtime_measurements"
 }
 
 cleanup()
 {
-	tst_rmdir
+	local dir
+	for dir in $UMOUNT; do
+		umount $dir
+	done
 }
+
+setup
diff --git a/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh b/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh
index 333bf5f8a..a3d1739cd 100755
--- a/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh
+++ b/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh
@@ -1,70 +1,61 @@ 
 #!/bin/sh
-
-################################################################################
-##                                                                            ##
-## Copyright (C) 2009 IBM Corporation                                         ##
-##                                                                            ##
-## 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; either version 2 of the License, or          ##
-## (at your option) any later version.                                        ##
-##                                                                            ##
-## This program is distributed in the hope that it will be useful, but        ##
-## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
-## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
-## for more details.                                                          ##
-##                                                                            ##
-## You should have received a copy of the GNU General Public License          ##
-## along with this program;  if not, write to the Free Software               ##
-## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
-##                                                                            ##
-################################################################################
+# Copyright (c) 2009 IBM Corporation
+# Copyright (c) 2018 Petr Vorel <pvorel@suse.cz>
+#
+# 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; either version 2 of
+# the License, or (at your option) any later version.
 #
-# File :        ima_tpm.sh
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
 #
-# Description:  This file verifies the boot and PCR aggregates
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
 #
-# Author:       Mimi Zohar, zohar@ibm.vnet.ibm.com
+# Author: Mimi Zohar, zohar@ibm.vnet.ibm.com
 #
-# Return        - zero on success
-#               - non zero on failure. return value from commands ($RC)
-################################################################################
-export TST_TOTAL=3
-export TCID="ima_tpm"
+# Verify the boot and PCR aggregates.
+
+TST_TESTFUNC="test"
+TST_CNT=3
+. ima_setup.sh
 
 init()
 {
 	tst_check_cmds ima_boot_aggregate ima_measure
 }
 
-# Function:     test01
-# Description   - Verify boot aggregate value is correct
-test01()
+test1()
 {
-	zero="0000000000000000000000000000000000000000"
+	tst_res TINFO "verify boot aggregate"
+
+	local zero="0000000000000000000000000000000000000000"
+	local tpm_bios="$SECURITYFS/tpm0/binary_bios_measurements"
+	local ima_measurements="$ASCII_MEASUREMENTS"
+	local ima_aggr line
 
 	# IMA boot aggregate
-	ima_measurements=$SECURITYFS/ima/ascii_runtime_measurements
 	read line < $ima_measurements
 	ima_aggr=$(expr substr "${line}" 49 40)
 
-	# verify TPM is available and enabled.
-	tpm_bios=$SECURITYFS/tpm0/binary_bios_measurements
 	if [ ! -f "$tpm_bios" ]; then
-		tst_brkm TCONF "TPM not builtin kernel, or TPM not enabled"
+		tst_brk TCONF "TPM not builtin kernel, or TPM not enabled"
 
 		if [ "${ima_aggr}" = "${zero}" ]; then
-			tst_resm TPASS "bios boot aggregate is 0."
+			tst_res TPASS "bios boot aggregate is 0"
 		else
-			tst_resm TFAIL "bios boot aggregate is not 0."
+			tst_res TFAIL "bios boot aggregate is not 0"
 		fi
 	else
 		boot_aggregate=$(ima_boot_aggregate $tpm_bios)
 		boot_aggr=$(expr substr $boot_aggregate 16 40)
 		if [ "x${ima_aggr}" = "x${boot_aggr}" ]; then
-			tst_resm TPASS "bios aggregate matches IMA boot aggregate."
+			tst_res TPASS "bios aggregate matches IMA boot aggregate"
 		else
-			tst_resm TFAIL "bios aggregate does not match IMA boot aggregate."
+			tst_res TFAIL "bios aggregate does not match IMA boot aggregate"
 		fi
 	fi
 }
@@ -74,64 +65,54 @@  test01()
 # the PCR values from /sys/devices.
 validate_pcr()
 {
-	ima_measurements=$SECURITYFS/ima/binary_runtime_measurements
-	aggregate_pcr=$(ima_measure $ima_measurements --validate)
-	dev_pcrs=$1
-	RC=0
+	tst_res TINFO "verify PCR (Process Control Register)"
 
-	while read line ; do
+	local ima_measurements="$BINARY_MEASUREMENTS"
+	local aggregate_pcr="$(ima_measure $ima_measurements --validate)"
+	local dev_pcrs="$1"
+	local ret=0
+
+	while read line; do
 		pcr=$(expr substr "${line}" 1 6)
 		if [ "${pcr}" = "PCR-10" ]; then
 			aggr=$(expr substr "${aggregate_pcr}" 26 59)
 			pcr=$(expr substr "${line}" 9 59)
-			[ "${pcr}" = "${aggr}" ] || RC=$?
+			[ "${pcr}" = "${aggr}" ] || ret=$?
 		fi
 	done < $dev_pcrs
-	return $RC
+	return $ret
 }
 
-# Function:     test02
-# Description	- Verify ima calculated aggregate PCR values matches
-#		  actual PCR value.
-test02()
+test2()
 {
+	tst_res TINFO "verify PCR values"
 
-	# Would be nice to know where the PCRs are located.  Is this safe?
-	PCRS_PATH=$(find /$SYSFS/devices/ | grep pcrs)
+	# Would be nice to know where the PCRs are located. Is this safe?
+	local pcrs_path="$(find $SYSFS/devices/ | grep pcrs)"
 	if [ $? -eq 0 ]; then
-		validate_pcr $PCRS_PATH
+		validate_pcr $pcrs_path
 		if [ $? -eq 0 ]; then
-			tst_resm TPASS "aggregate PCR value matches real PCR value."
+			tst_res TPASS "aggregate PCR value matches real PCR value"
 		else
-			tst_resm TFAIL "aggregate PCR value does not match real PCR value."
+			tst_res TFAIL "aggregate PCR value does not match real PCR value"
 		fi
 	else
-		tst_resm TFAIL "TPM not enabled, no PCR value to validate"
+		tst_res TFAIL "TPM not enabled, no PCR value to validate"
 	fi
 }
 
-# Function:     test03
-# Description 	- Verify template hash value for IMA entry is correct.
-test03()
+test3()
 {
+	tst_res TINFO "verify template hash value"
 
-	ima_measurements=$SECURITYFS/ima/binary_runtime_measurements
-	aggregate_pcr=$(ima_measure $ima_measurements --verify --validate) > /dev/null
+	local ima_measurements="$BINARY_MEASUREMENTS"
+	ima_measure $ima_measurements --verify --validate
 	if [ $? -eq 0 ]; then
-		tst_resm TPASS "verified IMA template hash values."
+		tst_res TPASS "verified IMA template hash values"
 	else
-		tst_resm TFAIL "error verifing IMA template hash values."
+		tst_res TFAIL "error verifing IMA template hash values"
 	fi
 }
 
-. ima_setup.sh
-
-setup
-TST_CLEANUP=cleanup
-
 init
-test01
-test02
-test03
-
-tst_exit
+tst_run
diff --git a/testcases/kernel/security/integrity/ima/tests/ima_violations.sh b/testcases/kernel/security/integrity/ima/tests/ima_violations.sh
index 1b86b5f1a..80a01a546 100755
--- a/testcases/kernel/security/integrity/ima/tests/ima_violations.sh
+++ b/testcases/kernel/security/integrity/ima/tests/ima_violations.sh
@@ -1,44 +1,45 @@ 
 #!/bin/sh
-################################################################################
-##                                                                            ##
-## Copyright (C) 2009 IBM Corporation                                         ##
-##                                                                            ##
-## 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; either version 2 of the License, or          ##
-## (at your option) any later version.                                        ##
-##                                                                            ##
-## This program is distributed in the hope that it will be useful, but        ##
-## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
-## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
-## for more details.                                                          ##
-##                                                                            ##
-## You should have received a copy of the GNU General Public License          ##
-## along with this program;  if not, write to the Free Software               ##
-## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
-##                                                                            ##
-################################################################################
+# Copyright (c) 2009 IBM Corporation
+# Copyright (c) 2018 Petr Vorel <pvorel@suse.cz>
 #
-# File :        ima_violations.sh
+# 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; either version 2 of
+# the License, or (at your option) any later version.
 #
-# Description:  This file tests ToMToU and open_writer violations invalidate
-#		the PCR and are logged.
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
 #
-# Author:       Mimi Zohar, zohar@ibm.vnet.ibm.com
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
 #
-# Return        - zero on success
-#               - non zero on failure. return value from commands ($RC)
-################################################################################
+# Author: Mimi Zohar, zohar@ibm.vnet.ibm.com
+#
+# Test whether ToMToU and open_writer violations invalidatethe PCR and are logged.
 
-export TST_TOTAL=3
-export TCID="ima_violations"
+TST_TESTFUNC="test"
+TST_CNT=3
+. ima_setup.sh
 
-open_file_read()
+FILE="test.txt"
+IMA_VIOLATIONS="$SECURITYFS/ima/violations"
+
+init()
 {
-	exec 3< $1
-	if [ $? -ne 0 ]; then
-		exit 1
+	LOG="/var/log/messages"
+	SLEEP="500ms"
+	if service auditd status > /dev/null 2>&1; then
+		LOG="/var/log/audit/audit.log"
+		tst_res TINFO "requires integrity auditd patch"
 	fi
+	tst_res TINFO "using log $LOG"
+}
+
+open_file_read()
+{
+	exec 3< $FILE || exit 1
 }
 
 close_file_read()
@@ -48,11 +49,8 @@  close_file_read()
 
 open_file_write()
 {
-	exec 4> $1
-	if [ $? -ne 0 ]; then
-		exit 1
-	echo 'testing, testing, ' >&4
-	fi
+	exec 4> $FILE || exit 1
+	echo 'test writing' >&4
 }
 
 close_file_write()
@@ -60,103 +58,89 @@  close_file_write()
 	exec 4>&-
 }
 
-init()
+get_count()
 {
-	service auditd status > /dev/null 2>&1
-	if [ $? -ne 0 ]; then
-		log=/var/log/messages
-	else
-		log=/var/log/audit/audit.log
-		tst_resm TINFO "requires integrity auditd patch"
-	fi
-
-	ima_violations=$SECURITYFS/ima/violations
+	local search="$1"
+	echo $(grep -c "${search}.*${FILE}" $LOG)
 }
 
-# Function:     test01
-# Description	- Verify open writers violation
-test01()
+validate()
 {
-	read num_violations < $ima_violations
-
-	TMPFN=test.txt
-	open_file_write $TMPFN
-	open_file_read $TMPFN
-	close_file_read
-	close_file_write
-	read num_violations_new < $ima_violations
-	num=$(($(expr $num_violations_new - $num_violations)))
-	if [ $num -gt 0 ]; then
-		tail $log | grep test.txt | grep -q 'open_writers'
-		if [ $? -eq 0 ]; then
-			tst_resm TPASS "open_writers violation added(test.txt)"
+	local num_violations="$1"
+	local count="$2"
+	local search="$3"
+	local count2="$(get_count $search)"
+	local num_violations_new
+
+	[ -n "$SLEEP" ] && tst_sleep $SLEEP
+
+	read num_violations_new < $IMA_VIOLATIONS
+	if [ $(($num_violations_new - $num_violations)) -gt 0 ]; then
+		if [ $count2 -gt $count ]; then
+			tst_res TPASS "$search violation added"
 		else
-			tst_resm TFAIL "(message ratelimiting?)"
+			tst_res TFAIL "$search not found in $LOG"
 		fi
 	else
-		tst_resm TFAIL "open_writers violation not added(test.txt)"
+		tst_res TFAIL "$search violation not added"
 	fi
 }
 
-# Function:     test02
-# Description   - Verify ToMToU violation
-test02()
+test1()
 {
-	read num_violations < $ima_violations
+	tst_res TINFO "verify open writers violation"
 
-	TMPFN=test.txt
-	open_file_read $TMPFN
-	open_file_write $TMPFN
-	close_file_write
+	local search="open_writers"
+	local count num_violations
+
+	read num_violations < $IMA_VIOLATIONS
+	count="$(get_count $search)"
+
+	open_file_write
+	open_file_read
 	close_file_read
-	read num_violations_new < $ima_violations
-	num=$(($(expr $num_violations_new - $num_violations)))
-	if [ $num -gt 0 ]; then
-		tail $log | grep test.txt | grep -q 'ToMToU'
-		if [ $? -eq 0 ]; then
-			tst_resm TPASS "ToMToU violation added(test.txt)"
-		else
-			tst_resm TFAIL "(message ratelimiting?)"
-		fi
-	else
-		tst_resm TFAIL "ToMToU violation not added(test.txt)"
-	fi
+	close_file_write
+
+	validate $num_violations $count $search
 }
 
-# Function:     test03
-# Description 	- verify open_writers using mmapped files
-test03()
+test2()
 {
-	read num_violations < $ima_violations
-
-	TMPFN=test.txtb
-	echo 'testing testing ' > $TMPFN
-	ima_mmap $TMPFN & p1=$!
-	sleep 1		# got to wait for ima_mmap to mmap the file
-	open_file_read $TMPFN
-	read num_violations_new < $ima_violations
-	num=$(($(expr $num_violations_new - $num_violations)))
-	if [ $num -gt 0 ]; then
-		tail $log | grep test.txtb | grep -q 'open_writers'
-		if [ $? -eq 0 ]; then
-			tst_resm TPASS "mmapped open_writers violation added(test.txtb)"
-		else
-			tst_resm TFAIL "(message ratelimiting?)"
-		fi
-	else
-		tst_resm TFAIL "mmapped open_writers violation not added(test.txtb)"
-	fi
+	tst_res TINFO "verify ToMToU violation"
+
+	local search="ToMToU"
+	local count num_violations
+
+	read num_violations < $IMA_VIOLATIONS
+	count="$(get_count $search)"
+
+	open_file_read
+	open_file_write
+	close_file_write
 	close_file_read
+
+	validate $num_violations $count $search
 }
 
-. ima_setup.sh
+test3()
+{
+	tst_res TINFO "verify open_writers using mmapped files"
 
-setup
-TST_CLEANUP=cleanup
+	local search="open_writers"
+	local count num_violations
 
-init
-test01
-test02
-test03
+	read num_violations < $IMA_VIOLATIONS
+	count="$(get_count $search)"
+
+	echo 'testing testing ' > $FILE
+	ima_mmap $FILE &
+	sleep 1
 
-tst_exit
+	open_file_read
+	close_file_read
+
+	validate $num_violations $count $search
+}
+
+init
+tst_run