#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright 2018 Google LLC # # FS QA Test generic/576 # # Test using fs-verity and fscrypt simultaneously. This primarily verifies # correct ordering of the hooks for each feature: fscrypt needs to be first. # seq=`basename $0` seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` tmp=/tmp/$$ status=1 # failure is the default! trap "_cleanup; exit \$status" 0 1 2 3 15 _cleanup() { cd / _restore_fsverity_signatures rm -f $tmp.* } # get standard environment, filters and checks . ./common/rc . ./common/filter . ./common/verity . ./common/encrypt # remove previous $seqres.full before test rm -f $seqres.full # real QA test starts here _supported_fs generic _supported_os Linux _require_scratch_verity _require_scratch_encryption _require_command "$KEYCTL_PROG" keyctl _disable_fsverity_signatures _scratch_mkfs_encrypted_verity &>> $seqres.full _scratch_mount fsv_orig_file=$tmp.file edir=$SCRATCH_MNT/edir fsv_file=$edir/file.fsv # Set up an encrypted directory. _new_session_keyring keydesc=$(_generate_session_encryption_key) mkdir $edir _set_encpolicy $edir $keydesc # Create a file within the encrypted directory and enable verity on it. # Then check that it has an encryption policy as well. head -c 100000 /dev/zero > $fsv_orig_file cp $fsv_orig_file $fsv_file _fsv_enable $fsv_file echo $XFS_IO_PROG -r -c "get_encpolicy" $fsv_file | _filter_scratch \ | sed 's/Master key descriptor:.*/Master key descriptor: 0000000000000000/' echo # Verify that the file contents are as expected. This should be going through # both the decryption and verity I/O paths. cmp $fsv_orig_file $fsv_file && echo "Files matched" # Just in case, try again after a mount cycle to empty the page cache. _scratch_cycle_mount cmp $fsv_orig_file $fsv_file && echo "Files matched" # Corrupt some bytes as a sanity check that fs-verity is really working. # This also verifies that the data on-disk is really encrypted, since otherwise # the data being written here would be identical to the old data. head -c 1000 /dev/zero | _fsv_scratch_corrupt_bytes $fsv_file 50000 md5sum $fsv_file |& _filter_scratch # success, all done status=0 exit