#!/bin/sh # Copyright (c) 2009 IBM Corporation # Copyright (c) 2018 Petr Vorel # # 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. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Author: Mimi Zohar, zohar@ibm.vnet.ibm.com TST_TESTFUNC="test" TST_SETUP_CALLER="$TST_SETUP" TST_SETUP="ima_setup" TST_CLEANUP="ima_cleanup" TST_NEEDS_TMPDIR=1 TST_NEEDS_ROOT=1 . tst_test.sh SYSFS="/sys" UMOUNT= FS_TYPE="ext3" mount_helper() { local type="$1" local default_dir="$2" local dir 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 } mount_loop_device() { local ret tst_test_cmds mkfs.$FS_TYPE tst_mkfs $FS_TYPE $TST_DEVICE ROD_SILENT mkdir -p mntpoint mount ${TST_DEVICE} mntpoint ret=$? if [ $ret -ne 0 ]; then tst_brk TBROK "failed to mount device (mount exit = $ret)" fi cd mntpoint } print_ima_config() { local config="/boot/config-$(uname -r)" local i tst_res TINFO "/proc/cmdline: $(cat /proc/cmdline)" if [ -r "$config" ]; then tst_res TINFO "IMA kernel config:" for i in $(grep ^CONFIG_IMA $config); do tst_res TINFO "$i" done fi } ima_setup() { SECURITYFS="$(mount_helper securityfs $SYSFS/kernel/security)" 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" print_ima_config if [ "$TST_NEEDS_DEVICE" = 1 ]; then tst_res TINFO "\$TMPDIR is on tmpfs => run on loop device" mount_loop_device fi [ -n "$TST_SETUP_CALLER" ] && $TST_SETUP_CALLER } ima_cleanup() { local dir for dir in $UMOUNT; do umount $dir done if [ "$TST_NEEDS_DEVICE" = 1 ]; then cd $TST_TMPDIR tst_umount $TST_DEVICE fi } # loop device is needed to use only for tmpfs TMPDIR="${TMPDIR:-/tmp}" if [ "$(df -T $TMPDIR | tail -1 | awk '{print $2}')" != "tmpfs" -a -n "$TST_NEEDS_DEVICE" ]; then unset TST_NEEDS_DEVICE fi