generic: add basic test for fscrypt API additions
[xfstests-dev.git] / tests / generic / 580
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright 2019 Google LLC
4 #
5 # FS QA Test generic/580
6 #
7 # Basic test of the fscrypt filesystem-level encryption keyring
8 # and v2 encryption policies.
9 #
10
11 seq=`basename $0`
12 seqres=$RESULT_DIR/$seq
13 echo "QA output created by $seq"
14 echo
15
16 here=`pwd`
17 tmp=/tmp/$$
18 status=1        # failure is the default!
19 trap "_cleanup; exit \$status" 0 1 2 3 15
20
21 _cleanup()
22 {
23         cd /
24         rm -f $tmp.*
25 }
26
27 # get standard environment, filters and checks
28 . ./common/rc
29 . ./common/filter
30 . ./common/encrypt
31
32 # remove previous $seqres.full before test
33 rm -f $seqres.full
34
35 # real QA test starts here
36 _supported_fs generic
37 _supported_os Linux
38 _require_scratch_encryption -v 2
39
40 _scratch_mkfs_encrypted &>> $seqres.full
41 _scratch_mount
42
43 test_with_policy_version()
44 {
45         local vers=$1
46         local raw_key=""
47         local i
48
49         for i in {1..64}; do
50                 raw_key+="\\x$(printf "%02x" $i)"
51         done
52
53         if (( vers == 1 )); then
54                 # Key descriptor: arbitrary value
55                 local keyspec="0000111122223333"
56                 local add_enckey_args="-d $keyspec"
57         else
58                 # Key identifier:
59                 # HKDF-SHA512(key=raw_key, salt="", info="fscrypt\0\x01")
60                 local keyspec="69b2f6edeee720cce0577937eb8a6751"
61                 local add_enckey_args=""
62         fi
63
64         mkdir $dir
65         echo "# Setting v$vers encryption policy"
66         _set_encpolicy $dir $keyspec
67         echo "# Getting v$vers encryption policy"
68         _get_encpolicy $dir | _filter_scratch
69         if (( vers == 1 )); then
70                 echo "# Getting v1 encryption policy using old ioctl"
71                 _get_encpolicy $dir -1 | _filter_scratch
72         fi
73         echo "# Trying to create file without key added yet"
74         $XFS_IO_PROG -f $dir/file |& _filter_scratch
75         echo "# Getting encryption key status"
76         _enckey_status $SCRATCH_MNT $keyspec
77         echo "# Adding encryption key"
78         _add_enckey $SCRATCH_MNT "$raw_key" $add_enckey_args
79         echo "# Creating encrypted file"
80         echo contents > $dir/file
81         echo "# Getting encryption key status"
82         _enckey_status $SCRATCH_MNT $keyspec
83         echo "# Removing encryption key"
84         _rm_enckey $SCRATCH_MNT $keyspec
85         echo "# Getting encryption key status"
86         _enckey_status $SCRATCH_MNT $keyspec
87         echo "# Verifying that the encrypted directory was \"locked\""
88         cat $dir/file |& _filter_scratch
89         cat "$(find $dir -type f)" |& _filter_scratch | cut -d ' ' -f3-
90
91         # Test removing key with a file open.
92         echo "# Re-adding encryption key"
93         _add_enckey $SCRATCH_MNT "$raw_key" $add_enckey_args
94         echo "# Creating another encrypted file"
95         echo foo > $dir/file2
96         echo "# Removing key while an encrypted file is open"
97         exec 3< $dir/file
98         _rm_enckey $SCRATCH_MNT $keyspec
99         echo "# Non-open file should have been evicted"
100         cat $dir/file2 |& _filter_scratch
101         echo "# Open file shouldn't have been evicted"
102         cat $dir/file
103         echo "# Key should be in \"incompletely removed\" state"
104         _enckey_status $SCRATCH_MNT $keyspec
105         echo "# Closing file and removing key for real now"
106         exec 3<&-
107         _rm_enckey $SCRATCH_MNT $keyspec
108         cat $dir/file |& _filter_scratch
109
110         echo "# Cleaning up"
111         rm -rf $dir
112         _scratch_cycle_mount    # Clear all keys
113         echo
114 }
115
116 dir=$SCRATCH_MNT/dir
117
118 test_with_policy_version 1
119
120 test_with_policy_version 2
121
122 echo "# Trying to remove absent key"
123 _rm_enckey $SCRATCH_MNT abcdabcdabcdabcd
124
125 # success, all done
126 status=0
127 exit