g10: Add TOFU support.
[gnupg.git] / tests / openpgp / tofu.test
1 #!/bin/sh
2
3 . $srcdir/defs.inc || exit 3
4
5 # set -x
6
7 KEYS="2183839A BC15C85A EE37CF96"
8
9 # Make sure $srcdir is set.
10 if test "x$srcdir" = x
11 then
12     echo srcdir environment variable not set!
13     exit 1
14 fi
15
16 # Make sure $GNUPGHOME is set.
17 if test "x$GNUPGHOME" = x
18 then
19     echo "GNUPGHOME not set."
20     exit 1
21 fi
22
23 # Import the test keys.
24 $GPG --import $srcdir/tofu-keys.asc
25
26 # Make sure the keys are imported.
27 for k in $KEYS
28 do
29     if ! $GPG --list-keys $k >/dev/null 2>&1
30     then
31         echo Missing key $k
32         exit 1
33     fi
34 done
35
36 format=auto
37
38 debug()
39 {
40     echo "$@" >&2
41 }
42
43 debug_exec()
44 {
45     debug "Running GNUPGHOME=$GNUPGHOME $@"
46     ${@:+"$@"}
47 }
48
49 # $1 is the keyid of the policy to lookup.  Any remaining arguments
50 # are simply passed to GPG.
51 #
52 # This function only supports keys with a single user id.
53 getpolicy()
54 {
55     keyid=$1
56     if test x$keyid = x
57     then
58         echo No keyid supplied!
59         exit 1
60     fi
61     shift
62
63     policy=$(debug_exec $GPG --tofu-db-format=$format --trust-model=tofu \
64                   --with-colons $@ --list-keys "$keyid" \
65                     | awk -F: '/^uid:/ { print $18 }')
66     if test $(echo "$policy" | wc -l) -ne 1
67     then
68         echo "Got: $policy" >&2
69         echo "error"
70     else
71         case $policy in
72             auto|good|unknown|bad|ask) echo $policy ;;
73             *) echo "error" ;;
74         esac
75     fi
76 }
77
78 # $1 is the key id
79 # $2 is the expected policy
80 # The rest are additional options to pass to gpg.
81 checkpolicy()
82 {
83     debug
84     debug "checkpolicy($@)"
85
86     keyid=$1
87     shift
88     expected_policy=$1
89     shift
90     policy=$(getpolicy "$keyid" ${@:+"$@"})
91     if test "x$policy" != "x$expected_policy"
92     then
93         echo "$keyid: Expected policy to be \`$expected_policy', but got \`$policy'."
94         exit 1
95     fi
96 }
97
98 # $1 is the keyid of the trust level to lookup.  Any remaining
99 # arguments are simply passed to GPG.
100 #
101 # This function only supports keys with a single user id.
102 gettrust()
103 {
104     keyid=$1
105     if test x$keyid = x
106     then
107         echo No keyid supplied!
108         exit 1
109     fi
110     shift
111
112     trust=$(debug_exec $GPG --tofu-db-format=$format --trust-model=tofu \
113                  --with-colons $@ --list-keys "$keyid" \
114                     | awk -F: '/^pub:/ { print $2 }')
115     if test $(echo "$trust" | wc -l) -ne 1
116     then
117         echo "error"
118     else
119         case $trust in
120             [oidreqnmfuws-]) echo $trust ;;
121             *) echo "Bad trust value: $trust" >&2; echo "error" ;;
122         esac
123     fi
124 }
125
126 # $1 is the key id
127 # $2 is the expected trust level
128 # The rest are additional options to pass to gpg.
129 checktrust()
130 {
131     debug
132     debug "checktrust($@)"
133
134     keyid=$1
135     shift
136     expected_trust=$1
137     shift
138     trust=$(gettrust "$keyid" ${@:+"$@"})
139     if test "x$trust" != "x$expected_trust"
140     then
141         echo "$keyid: Expected trust to be \`$expected_trust', but got \`$trust'."
142         exit 1
143     fi
144 }
145
146 # Set key $1's policy to $2.  Any remaining arguments are passed as
147 # options to gpg.
148 setpolicy()
149 {
150     debug
151     debug "setpolicy($@)"
152
153     keyid=$1
154     shift
155     policy=$1
156     shift
157
158     debug_exec $GPG --tofu-db-format=$format \
159          --trust-model=tofu ${@:+"$@"} --tofu-policy $policy $keyid
160 }
161
162 for format in split flat
163 do
164     debug
165     debug "Testing with db format $format"
166
167     # Carefully remove the TOFU db.
168     test -e $GNUPGHOME/tofu.db && rm $GNUPGHOME/tofu.db
169     test -e $GNUPGHOME/tofu.d/email && rm -r $GNUPGHOME/tofu.d/email
170     test -e $GNUPGHOME/tofu.d/key && rm -r $GNUPGHOME/tofu.d/key
171     # This will fail if the directory is not empty.
172     test -e $GNUPGHOME/tofu.d && rmdir $GNUPGHOME/tofu.d
173
174     # Verify a message.  There should be no conflict and the trust policy
175     # should be set to auto.
176     debug_exec $GPG --tofu-db-format=$format --trust-model=tofu \
177          --verify $srcdir/tofu-2183839A-1.txt
178
179     checkpolicy 2183839A auto
180
181     trust=$(gettrust 2183839A)
182     debug "default trust = $trust"
183     if test "x$trust" != xm
184     then
185         echo "Wrong default trust.  Got: \`$trust', expected \`m'"
186         exit 1
187     fi
188
189     # Trust should be derived lazily.  Thus, if the policy is set to auto
190     # and we change --tofu-default-policy, then the trust should change as
191     # well.  Try it.
192     checktrust 2183839A f --tofu-default-policy=good
193     checktrust 2183839A - --tofu-default-policy=unknown
194     checktrust 2183839A n --tofu-default-policy=bad
195
196     # Change the policy to something other than auto and make sure the
197     # policy and the trust are correct.
198     for policy in good unknown bad
199     do
200         if test $policy = good
201         then
202             expected_trust='f'
203         elif test $policy = unknown
204         then
205             expected_trust='-'
206         else
207             expected_trust='n'
208         fi
209
210         debug
211         debug "Setting TOFU policy to $policy"
212         setpolicy 2183839A $policy
213
214         # Since we have a fixed policy, the trust level shouldn't
215         # change if we change the default policy.
216         for default_policy in auto good unknown bad ask
217         do
218             checkpolicy 2183839A $policy --tofu-default-policy=$default_policy
219             checktrust 2183839A $expected_trust \
220                        --tofu-default-policy=$default_policy
221         done
222     done
223
224     # BC15C85A conflicts with 2183839A.  On conflict, this will set
225     # BC15C85A to ask.  If 2183839A is auto (it's not, it's bad), then
226     # it will be set to ask.
227     debug_exec $GPG --tofu-db-format=$format --trust-model=tofu \
228          --verify $srcdir/tofu-BC15C85A-1.txt
229     checkpolicy BC15C85A ask
230     checkpolicy 2183839A bad
231
232     # EE37CF96 conflicts with 2183839A and BC15C85A.  We change
233     # BC15C85A's policy to auto and leave 2183839A's policy at bad.
234     # This conflict should cause BC15C85A's policy to be changed to
235     # ask (since it is auto), but not affect 2183839A's policy.
236     setpolicy BC15C85A auto
237     checkpolicy BC15C85A auto
238     debug_exec $GPG --tofu-db-format=$format --trust-model=tofu \
239          --verify $srcdir/tofu-EE37CF96-1.txt
240     checkpolicy BC15C85A ask
241     checkpolicy 2183839A bad
242     checkpolicy EE37CF96 ask
243 done
244
245 exit 0