tests: Run each test in a clean environment.
[gnupg.git] / tests / openpgp / ecc.test
1 #!/bin/sh
2 # Copyright 2011 Free Software Foundation, Inc.
3 # This file is free software; as a special exception the author gives
4 # unlimited permission to copy and/or distribute it, with or without
5 # modifications, as long as this notice is preserved.  This file is
6 # distributed in the hope that it will be useful, but WITHOUT ANY
7 # WARRANTY, to the extent permitted by law; without even the implied
8 # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
10 . $srcdir/defs.inc || exit 3
11
12 keygrips='8E06A180EFFE4C65B812150CAF19BF30C0689A4C
13           E4403F3FD7A443FAC29FEF288FA0D20AC212851E
14           0B7554421FFB14A06CB9F63FB49A85A58E97ABAC
15           303ACC892C2D786C8A789677C0BE54DA8538F903
16           9FE5C36985351524B6AFA19FDCBC1A3A750B6F5F
17           145A52CC7ED3FD41C5B0A26BE220FEED36AF24DE'
18 mainkeyids='BAA59D9C
19             0F54719F
20             45AF2FFE'
21
22
23 if have_pubkey_algo "ECDH"; then
24   :
25 else
26   info "No ECC support due to an old Libgcrypt"
27   exit 77
28 fi
29
30
31 #
32 # Setup for ECC testing
33 #
34 info "Preparing for ECC test."
35 for i in $keygrips ; do
36   rm private-keys-v1.d/$i.key 2>/dev/null || true
37   $GPG_PRESET_PASSPHRASE --preset -P ecc $i
38 done
39
40
41 #
42 # Import the sample keys
43 #
44 info "Importing ECC public keys."
45 for k in $mainkeyids ; do
46   $GPG --delete-key --batch --yes $k 2>/dev/null || true
47 done
48 for i in 1 2 3; do
49   k="ecc-sample-$i-pub.asc"
50   if $GPG --import $srcdir/samplekeys/$k; then
51     :
52   else
53     error "$k: import failed"
54   fi
55 done
56
57
58 #
59 # Check a few sample signature
60 #
61 info "Checking ECC signatures."
62 tests=""
63
64 # The following is an opaque ECDSA signature on a message "This is one
65 # line\n" (17 byte long) by the primary 256 bit key:
66 tests="$tests msg_opaque_signed_256"
67 msg_opaque_signed_256='-----BEGIN PGP MESSAGE-----
68 Version: GnuPG v2.1.0-ecc (GNU/Linux)
69
70 owGbwMvMwCHMvVT3w66lc+cwrlFK4k5N1k3KT6nUK6ko8Zl8MSEkI7NYAYjy81IV
71 cjLzUrk64lgYhDkY2FiZQNIMXJwCMO31rxgZ+tW/zesUPxWzdKWrtLGW/LkP5rXL
72 V/Yvnr/EKjBbQuvZSYa/klsum6XFmTze+maVgclT6Rc6hzqqxNy6o6qdTTmLJuvp
73 AQA=
74 =GDv4
75 -----END PGP MESSAGE----'
76
77 # The following is an opaque ECDSA signature on a message "This is one
78 # line\n" (17 byte long) by the primary 384 bit key:
79 tests="$tests msg_opaque_signed_384"
80 msg_opaque_signed_384='-----BEGIN PGP MESSAGE-----
81 Version: PGP Command Line v10.0.0 (Linux)
82
83 qANQR1DIqwE7wsvMwCnM2WDcwR9SOJ/xtFISd25qcXFieqpeSUUJAxCEZGQWKwBR
84 fl6qQk5mXirXoXJmVgbfYC5xmC5hzsDPjHXqbDLzpXpTBXSZV3L6bAgP3Kq7Ykmo
85 7Ds1v4UfBS+3CSSon7Pzq79WLjzXXEH54MkjPxnrw+8cfMVnY7Bi18J702Nnsa7a
86 9lMv/PM0/ao9CZ3KX7Q+Tv1rllTZ5Hj4V1frw431QnHfAA==
87 =elKT
88 -----END PGP MESSAGE-----'
89
90 # The following is an opaque ECDSA signature on a message "This is one
91 # line\n" (17 byte long) by the primary 521 bit key:
92 tests="$tests msg_opaque_signed_521"
93 msg_opaque_signed_521='-----BEGIN PGP MESSAGE-----
94 Version: PGP Command Line v10.0.0 (Linux)
95
96 qANQR1DIwA8BO8LLzMAlnO3Y8tB1vf4/xtNKSdy5qcXFiempeiUVJQxAEJKRWawA
97 RPl5qQo5mXmpXIdmMLMy+AaLnoLpEubatpeJY2Lystd7Qt32q2UcvRS5kNPWtDB7
98 ryufvcrWtFM7Jx8qXKDxZuqr7b9PGv1Ssk+I8TzB2O9dZC+n/jv+PAdbuu7mLe33
99 Gf9pLd3weV3Qno6FOqxGa5ZszQx+uer2xH3/El9x/2pVeO4l15ScsL7qWMTmffmG
100 Ic1RdzgeCfosMF+l/zVRchcLKzenEQA=
101 =ATtX
102 -----END PGP MESSAGE-----'
103
104 echo 'This is one line' >z
105 for msg in $tests; do
106    info "checking: $msg"
107    eval "(IFS=; echo \"\$$msg\")" >x
108    $GPG --verify x || error "verify(1) of $msg failed"
109    $GPG -o y --yes x || error "verify(2) of $msg failed"
110    cmp y z || error "$msg: mismatch"
111 done
112
113
114 #
115 # Import the secret keys so that we now can sign and decrypt.
116 #
117 # Note that the PGP generated secret keys are not self-signed, thus we
118 # need to pass an appropriate option.
119 #
120 info "Importing ECC secret keys."
121 for i in 1 2 3; do
122   k="ecc-sample-$i-sec.asc"
123   if [ "$i" -gt "1" ]; then
124     extraopts="--allow-non-selfsigned-uid"
125   else
126     extraopts=""
127   fi
128   if PINENTRY_USER_DATA=ecc $GPG $extraopts --import $srcdir/samplekeys/$k; then
129     :
130   else
131     error "$k: import failed"
132   fi
133 done
134
135
136 #
137 # Check a few sample encrtpted messages.
138 #
139 info "Checking ECC encryption."
140 tests=""
141
142 # The following block encrypts the text "This is one line\n", 17 bytes,
143 # with the subkey 4089AB73.
144 tests="$tests msg_encrypted_256"
145 msg_encrypted_256='-----BEGIN PGP MESSAGE-----
146 Version: GnuPG v2.1.0-ecc (GNU/Linux)
147
148 hH4Dd863o0CJq3MSAgMEHdIYZQx+rV1cjy7qitIOEICFFzp4cjsRX4r+rDdMcQUs
149 h7VZmbP1c9C0s9sgCKwubWfkcYUl2ZOju4gy+s4MYTBb4/j8JjnJ9Bqn6LWutTXJ
150 zwsdP13VIJLnhiNqISdR3/6xWQ0ICRYzwb95nUZ1c1DSVgFpjPgUvi4pgYbTpcDB
151 jzILKWBfBDT/jck169XE8vgtbcqVQYZ7lZpaY9CzEbC+4dXZmV1gm5MafpTyFWgH
152 VnyrZB4gad9Lp9e0RKHHcOOE7s/NeLuu
153 =odUZ
154 -----END PGP MESSAGE-----'
155
156 # The following block encrypts the text "This is one line\n", 17 bytes,
157 # with the subkey 9A201946:
158 tests="$tests msg_encrypted_384"
159 msg_encrypted_384='-----BEGIN PGP MESSAGE-----
160 Version: PGP Command Line v10.0.0 (Linux)
161
162 qANQR1DBngOqi5OPmiAZRhIDAwQqIr/00cJyf+QP+VA4QKVkk77KMHdz9OVaR2XK
163 0VYu0F/HPm89vL2orfm2hrAZxY9G2R0PG4Wk5Lg04UjKca/O72uWtjdPYulFidmo
164 uB0QpzXFz22ZZinxeVPLPEr19Pow0EwCc95cg4HAgrD0nV9vRcTJ/+juVfvsJhAO
165 isMKqrFNMvwnK5A1ECeyVXe7oLZl0lUBRhLr59QTtvf85QJjg/m5kaGy8XCJvLv3
166 61pZa6KUmw89PjtPak7ebcjnINL01vwmyeg1PAyW/xjeGGvcO+R4P1b4ewyFnJyR
167 svzIJcP7d4DqYOw7
168 =oiTJ
169 -----END PGP MESSAGE-----'
170
171 # The following block encrypts the text "This is one line\n", 17 bytes,
172 # with the subkey A81C4838:
173 tests="$tests msg_encrypted_521"
174 msg_encrypted_521='-----BEGIN PGP MESSAGE-----
175 Version: PGP Command Line v10.0.0 (Linux)
176
177 qANQR1DBwAIDB+qqSKgcSDgSBCMEAKpzTUxB4c56C7g09ekD9I+ttC5ER/xzDmXU
178 OJmFqU5w3FllhFj4TgGxxdH+8fv4W2Ag0IKoJvIY9V1V7oUCClfqAR01QbN7jGH/
179 I9GFFnH19AYEgMKgFmh14ZwN1BS6/VHh+H4apaYqapbx8/09EL+DV9zWLX4GRLXQ
180 VqCR1N2rXE29MJFzGmDOCueQNkUjcbuenoCSKcNT+6xhO27U9IYVCg4BhRUDGfD6
181 dhfRzBLxL+bKR9JVAe46+K8NLjRVu/bd4Iounx4UF5dBk8ERy+/8k9XantDoQgo6
182 RPqCad4Dg/QqkpbK3y574ds3VFNJmc4dVpsXm7lGV5w0FBxhVNPoWNhhECMlTroX
183 Rg==
184 =5GqW
185 -----END PGP MESSAGE-----'
186
187 echo 'This is one line' >z
188 for msg in $tests; do
189    info "checking: $msg"
190    eval "(IFS=; echo \"\$$msg\")" >x
191    PINENTRY_USER_DATA=ecc $GPG -o y --yes x || error "decryption of $msg failed"
192    cmp y z || error "$msg: mismatch"
193 done
194
195
196 #
197 # Now check that we can encrypt and decrypt our own messages.
198 #
199 # Note that we don't need to provide a passppharse because we already
200 # preset the passphrase into the gpg-agent.
201 #
202 info "Checking ECC encryption and decryption."
203 for i in $plain_files $data_files ; do
204   for k in $mainkeyids ; do
205     info "file: $i key: $k"
206     $GPG ${opt_always} -e -o x --yes -r $k $i
207     PINENTRY_USER_DATA=ecc $GPG -o y --yes x
208     cmp $i y || error "$i,$k: mismatch"
209   done
210 done
211
212
213 #
214 # Now check that we can sign and verify our own messages.
215 #
216 info "Checking ECC signing and verifiction."
217 for i in $plain_files $data_files ; do
218   for k in $mainkeyids ; do
219     info "file: $i key: $k"
220     PINENTRY_USER_DATA=ecc $GPG -s -o x --yes -u $k $i
221     $GPG -o y --yes x || error "verify of $i,$k failed"
222     cmp $i y || error "$i,$k: mismatch"
223   done
224 done
225
226
227 #
228 # Let us also try to import the keys only from a secret keyblock.
229 #
230 # Because PGP does not sign the UID, it is not very useful to work
231 # with this key unless we go into the trouble of adding the
232 # self-signature.
233 #
234 info "Importing ECC secret keys directly."
235 for i in $keygrips ; do
236   rm private-keys-v1.d/$i.key 2>/dev/null || true
237 done
238 for k in $mainkeyids ; do
239   $GPG --delete-key --batch --yes $k 2>/dev/null || true
240 done
241 for i in 1 2 3; do
242   k="ecc-sample-$i-sec.asc"
243   if [ "$i" -gt "1" ]; then
244     extraopts="--allow-non-selfsigned-uid"
245   else
246     extraopts=""
247   fi
248   if PINENTRY_USER_DATA=ecc $GPG $extraopts --import $srcdir/samplekeys/$k; then
249     :
250   else
251     error "$k: import failed"
252   fi
253 done