generic: add test for non-root use of fscrypt API additions
[xfstests-dev.git] / tests / generic / 581
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright 2019 Google LLC
4 #
5 # FS QA Test No. generic/581
6 #
7 # Test non-root use 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 orig_maxkeys=
21
22 _cleanup()
23 {
24         cd /
25         rm -f $tmp.*
26         if [ -n "$orig_maxkeys" ]; then
27                 echo "$orig_maxkeys" > /proc/sys/kernel/keys/maxkeys
28         fi
29 }
30
31 # get standard environment, filters and checks
32 . ./common/rc
33 . ./common/filter
34 . ./common/encrypt
35
36 # remove previous $seqres.full before test
37 rm -f $seqres.full
38
39 # real QA test starts here
40 _supported_fs generic
41 _supported_os Linux
42 _require_user
43 _require_scratch_encryption -v 2
44
45 _scratch_mkfs_encrypted &>> $seqres.full
46 _scratch_mount
47
48 # Set the fsgqa user's key quota to their current number of keys plus 5.
49 orig_keys=$(_user_do "awk '/^[[:space:]]*$(id -u fsgqa):/{print \$4}' /proc/key-users | cut -d/ -f1")
50 : ${orig_keys:=0}
51 echo "orig_keys=$orig_keys" >> $seqres.full
52 orig_maxkeys=$(</proc/sys/kernel/keys/maxkeys)
53 keys_to_add=5
54 echo $((orig_keys + keys_to_add)) > /proc/sys/kernel/keys/maxkeys
55
56 dir=$SCRATCH_MNT/dir
57
58 raw_key=""
59 for i in `seq 64`; do
60         raw_key+="\\x$(printf "%02x" $i)"
61 done
62 keydesc="0000111122223333"
63 keyid="69b2f6edeee720cce0577937eb8a6751"
64 chmod 777 $SCRATCH_MNT
65
66 _user_do "mkdir $dir"
67
68 echo "# Setting v1 policy as regular user (should succeed)"
69 _user_do_set_encpolicy $dir $keydesc
70
71 echo "# Getting v1 policy as regular user (should succeed)"
72 _user_do_get_encpolicy $dir | _filter_scratch
73
74 echo "# Adding v1 policy key as regular user (should fail with EACCES)"
75 _user_do_add_enckey $SCRATCH_MNT "$raw_key" -d $keydesc
76
77 rm -rf $dir
78 echo
79 _user_do "mkdir $dir"
80
81 echo "# Setting v2 policy as regular user without key already added (should fail with ENOKEY)"
82 _user_do_set_encpolicy $dir $keyid |& _filter_scratch
83
84 echo "# Adding v2 policy key as regular user (should succeed)"
85 _user_do_add_enckey $SCRATCH_MNT "$raw_key"
86
87 echo "# Setting v2 policy as regular user with key added (should succeed)"
88 _user_do_set_encpolicy $dir $keyid
89
90 echo "# Getting v2 policy as regular user (should succeed)"
91 _user_do_get_encpolicy $dir | _filter_scratch
92
93 echo "# Creating encrypted file as regular user (should succeed)"
94 _user_do "echo contents > $dir/file"
95
96 echo "# Removing v2 policy key as regular user (should succeed)"
97 _user_do_rm_enckey $SCRATCH_MNT $keyid
98
99 _scratch_cycle_mount    # Clear all keys
100
101 echo
102 echo "# Testing user key quota"
103 for i in `seq $((keys_to_add + 1))`; do
104         rand_raw_key=$(_generate_raw_encryption_key)
105         _user_do_add_enckey $SCRATCH_MNT "$rand_raw_key" \
106             | sed 's/ with identifier .*$//'
107 done
108
109 rm -rf $dir
110 echo
111 _user_do "mkdir $dir"
112 _scratch_cycle_mount    # Clear all keys
113
114 # Test multiple users adding the same key.
115 echo "# Adding key as root"
116 _add_enckey $SCRATCH_MNT "$raw_key"
117 echo "# Getting key status as regular user"
118 _user_do_enckey_status $SCRATCH_MNT $keyid
119 echo "# Removing key only added by another user (should fail with ENOKEY)"
120 _user_do_rm_enckey $SCRATCH_MNT $keyid
121 echo "# Setting v2 encryption policy with key only added by another user (should fail with ENOKEY)"
122 _user_do_set_encpolicy $dir $keyid |& _filter_scratch
123 echo "# Adding second user of key"
124 _user_do_add_enckey $SCRATCH_MNT "$raw_key"
125 echo "# Getting key status as regular user"
126 _user_do_enckey_status $SCRATCH_MNT $keyid
127 echo "# Setting v2 encryption policy as regular user"
128 _user_do_set_encpolicy $dir $keyid
129 echo "# Removing this user's claim to the key"
130 _user_do_rm_enckey $SCRATCH_MNT $keyid
131 echo "# Getting key status as regular user"
132 _user_do_enckey_status $SCRATCH_MNT $keyid
133 echo "# Adding back second user of key"
134 _user_do_add_enckey $SCRATCH_MNT "$raw_key"
135 echo "# Remove key for \"all users\", as regular user (should fail with EACCES)"
136 _user_do_rm_enckey $SCRATCH_MNT $keyid -a |& _filter_scratch
137 _enckey_status $SCRATCH_MNT $keyid
138 echo "# Remove key for \"all users\", as root"
139 _rm_enckey $SCRATCH_MNT $keyid -a
140 _enckey_status $SCRATCH_MNT $keyid
141
142 # success, all done
143 status=0
144 exit