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