]> git.ipfire.org Git - thirdparty/openssl.git/blame - test/runex.pl
Add support for random key generation: this will be needed by enveloped data.
[thirdparty/openssl.git] / test / runex.pl
CommitLineData
a329fdde
DSH
1# test/runex.pl
2# Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3# project.
4#
5# ====================================================================
6# Copyright (c) 2008 The OpenSSL Project. All rights reserved.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following conditions
10# are met:
11#
12# 1. Redistributions of source code must retain the above copyright
13# notice, this list of conditions and the following disclaimer.
14#
15# 2. Redistributions in binary form must reproduce the above copyright
16# notice, this list of conditions and the following disclaimer in
17# the documentation and/or other materials provided with the
18# distribution.
19#
20# 3. All advertising materials mentioning features or use of this
21# software must display the following acknowledgment:
22# "This product includes software developed by the OpenSSL Project
23# for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24#
25# 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26# endorse or promote products derived from this software without
27# prior written permission. For written permission, please contact
28# licensing@OpenSSL.org.
29#
30# 5. Products derived from this software may not be called "OpenSSL"
31# nor may "OpenSSL" appear in their names without prior written
32# permission of the OpenSSL Project.
33#
34# 6. Redistributions of any form whatsoever must retain the following
35# acknowledgment:
36# "This product includes software developed by the OpenSSL Project
37# for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38#
39# THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50# OF THE POSSIBILITY OF SUCH DAMAGE.
51# ====================================================================
52
53# Perl script to run tests against S/MIME examples in RFC4134
54# Assumes all files are extracted in an directory called "examples"
55
56my $badttest = 0;
57my $verbose = 1;
58
5c4436c9
DSH
59my $cmscmd = "../util/shlib_wrap.sh ../apps/openssl cms";
60my $convcmd = "../util/shlib_wrap.sh ../apps/openssl x509 -inform DER";
88fce853 61my $pconvcmd = "../util/shlib_wrap.sh ../apps/openssl rsa -inform DER";
a329fdde
DSH
62my $exdir = "examples";
63
64my @test_list = (
65["3.1.bin" => "dataout"],
66["3.2.bin" => "encode, dataout"],
67["4.1.bin" => "encode, verifyder, content, dss"],
68["4.2.bin" => "encode, verifyder, cont, rsa"],
69["4.3.bin" => "encode, verifyder, cont_extern, dss"],
70["4.4.bin" => "encode, verifyder, cont, dss"],
71["4.5.bin" => "verifyder, content, rsa"],
72["4.6.bin" => "encode, verifyder, cont, dss"],
73["4.7.bin" => "encode, verifyder, cont, dss"],
74["4.8.eml" => "verifymime, dss"],
75["4.9.eml" => "verifymime, dss"],
76["4.10.bin" => "encode, verifyder, cont, dss"],
77["4.11.bin" => "encode"],
88fce853
DSH
78["5.1.bin" => "encode, envelopeder, cont"],
79["5.2.bin" => "encode, envelopeder, cont"],
80["5.3.eml" => "envelopemime, cont"],
a329fdde 81["6.0.bin" => "encode, digest, cont"],
b820455c
DSH
82["7.1.bin" => "encode, encrypted, cont"],
83["7.2.bin" => "encode, encrypted, cont"]
a329fdde
DSH
84);
85
b820455c
DSH
86my $secretkey = "73:7c:79:1f:25:ea:d0:e0:46:29:25:43:52:f7:dc:62:91:e5:cb:26:91:7a:da:32";
87
a329fdde
DSH
88 if (!-d $exdir)
89 {
90 print STDERR "FATAL ERROR: examples directory missing!!\n";
91 exit 1;
92 }
93
94 system ("$convcmd -in $exdir/CarlDSSSelf.cer -out $exdir/CarlDSSSelf.pem");
95 system ("$convcmd -in $exdir/CarlRSASelf.cer -out $exdir/CarlRSASelf.pem");
88fce853
DSH
96 system ("$convcmd -in $exdir/BobRSASignByCarl.cer -out $exdir/BobRSASignByCarl.pem");
97 system ("$pconvcmd -in $exdir/BobPrivRSAEncrypt.pri -out $exdir/BobPrivRSAEncrypt.pem");
a329fdde
DSH
98
99foreach (@test_list) {
100 my ($file, $tlist) = @$_;
101 print "Example file $file:\n";
102 if ($tlist =~ /encode/)
103 {
104 run_reencode_test($exdir, $file);
105 }
106 if ($tlist =~ /dataout/)
107 {
108 run_dataout_test($exdir, $file);
109 }
110 if ($tlist =~ /verify/)
111 {
112 run_verify_test($exdir, $tlist, $file);
113 }
114 if ($tlist =~ /digest/)
115 {
116 run_digest_test($exdir, $tlist, $file);
117 }
b820455c
DSH
118 if ($tlist =~ /encrypted/)
119 {
120 run_encrypted_test($exdir, $tlist, $file, $secretkey);
121 }
88fce853
DSH
122 if ($tlist =~ /envelope/)
123 {
124 run_envelope_test($exdir, $tlist, $file);
125 }
a329fdde
DSH
126
127}
128
b31db9ee
DSH
129unlink "cms.out";
130unlink "cms.err";
a329fdde
DSH
131unlink "tmp.der";
132unlink "tmp.txt";
133
134if ($badtest) {
135 print "\n$badtest TESTS FAILED!!\n";
136} else {
137 print "\n***All tests successful***\n";
138}
139
140
141sub run_reencode_test
142 {
143 my ($cmsdir, $tfile) = @_;
144 unlink "tmp.der";
145
146 system ("$cmscmd -cmsout -inform DER -outform DER" .
147 " -in $cmsdir/$tfile -out tmp.der");
148
149 if ($?)
150 {
151 print "\tReencode command FAILED!!\n";
152 $badtest++;
153 }
154 elsif (!cmp_files("$cmsdir/$tfile", "tmp.der"))
155 {
156 print "\tReencode FAILED!!\n";
157 $badtest++;
158 }
159 else
160 {
161 print "\tReencode passed\n" if $verbose;
162 }
163 }
164
165sub run_dataout_test
166 {
167 my ($cmsdir, $tfile) = @_;
168 unlink "tmp.txt";
169
170 system ("$cmscmd -data_out -inform DER" .
171 " -in $cmsdir/$tfile -out tmp.txt");
172
173 if ($?)
174 {
175 print "\tDataout command FAILED!!\n";
176 $badtest++;
177 }
178 elsif (!cmp_files("$cmsdir/ExContent.bin", "tmp.txt"))
179 {
180 print "\tDataout compare FAILED!!\n";
181 $badtest++;
182 }
183 else
184 {
185 print "\tDataout passed\n" if $verbose;
186 }
187 }
188
189sub run_verify_test
190 {
191 my ($cmsdir, $tlist, $tfile) = @_;
192 unlink "tmp.txt";
193
194 $form = "DER" if $tlist =~ /verifyder/;
195 $form = "SMIME" if $tlist =~ /verifymime/;
196 $cafile = "$cmsdir/CarlDSSSelf.pem" if $tlist =~ /dss/;
197 $cafile = "$cmsdir/CarlRSASelf.pem" if $tlist =~ /rsa/;
198
199 $cmd = "$cmscmd -verify -inform $form" .
200 " -CAfile $cafile" .
201 " -in $cmsdir/$tfile -out tmp.txt";
202
88fce853 203 $cmd .= " -content $cmsdir/ExContent.bin" if $tlist =~ /cont_extern/;
a329fdde
DSH
204
205 system ("$cmd 2>cms.err 1>cms.out");
206
207 if ($?)
208 {
209 print "\tVerify command FAILED!!\n";
210 $badtest++;
211 }
212 elsif ($tlist =~ /cont/ &&
213 !cmp_files("$cmsdir/ExContent.bin", "tmp.txt"))
214 {
215 print "\tVerify content compare FAILED!!\n";
216 $badtest++;
217 }
218 else
219 {
220 print "\tVerify passed\n" if $verbose;
221 }
222 }
223
88fce853
DSH
224sub run_envelope_test
225 {
226 my ($cmsdir, $tlist, $tfile) = @_;
227 unlink "tmp.txt";
228
229 $form = "DER" if $tlist =~ /envelopeder/;
230 $form = "SMIME" if $tlist =~ /envelopemime/;
231
232 $cmd = "$cmscmd -decrypt -inform $form" .
233 " -recip $cmsdir/BobRSASignByCarl.pem" .
234 " -inkey $cmsdir/BobPrivRSAEncrypt.pem" .
235 " -in $cmsdir/$tfile -out tmp.txt";
236
237 system ("$cmd 2>cms.err 1>cms.out");
238
239 if ($?)
240 {
241 print "\tDecrypt command FAILED!!\n";
242 $badtest++;
243 }
244 elsif ($tlist =~ /cont/ &&
245 !cmp_files("$cmsdir/ExContent.bin", "tmp.txt"))
246 {
247 print "\tDecrypt content compare FAILED!!\n";
248 $badtest++;
249 }
250 else
251 {
252 print "\tDecrypt passed\n" if $verbose;
253 }
254 }
255
a329fdde
DSH
256sub run_digest_test
257 {
258 my ($cmsdir, $tlist, $tfile) = @_;
259 unlink "tmp.txt";
260
88fce853
DSH
261 my $cmd = "$cmscmd -digest_verify -inform DER" .
262 " -in $cmsdir/$tfile -out tmp.txt";
263
264 system ("$cmd 2>cms.err 1>cms.out");
a329fdde
DSH
265
266 if ($?)
267 {
268 print "\tDigest verify command FAILED!!\n";
269 $badtest++;
270 }
271 elsif ($tlist =~ /cont/ &&
272 !cmp_files("$cmsdir/ExContent.bin", "tmp.txt"))
273 {
274 print "\tDigest verify content compare FAILED!!\n";
275 $badtest++;
276 }
277 else
278 {
279 print "\tDigest verify passed\n" if $verbose;
280 }
281 }
282
b820455c
DSH
283sub run_encrypted_test
284 {
285 my ($cmsdir, $tlist, $tfile, $key) = @_;
286 unlink "tmp.txt";
287
1021f9aa 288 system ("$cmscmd -EncryptedData_decrypt -inform DER" .
b820455c
DSH
289 " -secretkey $key" .
290 " -in $cmsdir/$tfile -out tmp.txt");
291
292 if ($?)
293 {
294 print "\tEncrypted Data command FAILED!!\n";
295 $badtest++;
296 }
297 elsif ($tlist =~ /cont/ &&
298 !cmp_files("$cmsdir/ExContent.bin", "tmp.txt"))
299 {
300 print "\tEncrypted Data content compare FAILED!!\n";
301 $badtest++;
302 }
303 else
304 {
305 print "\tEncryptedData verify passed\n" if $verbose;
306 }
307 }
308
a329fdde
DSH
309sub cmp_files
310 {
311 my ($f1, $f2) = @_;
312 my ($fp1, $fp2);
313
314 my ($rd1, $rd2);
315
316 if (!open($fp1, "<$f1") ) {
317 print STDERR "Can't Open file $f1\n";
318 return 0;
319 }
320
321 if (!open($fp2, "<$f2") ) {
322 print STDERR "Can't Open file $f2\n";
323 return 0;
324 }
325
326 binmode $fp1;
327 binmode $fp2;
328
329 my $ret = 0;
330
331 for (;;)
332 {
333 $n1 = sysread $fp1, $rd1, 4096;
334 $n2 = sysread $fp2, $rd2, 4096;
335 last if ($n1 != $n2);
336 last if ($rd1 ne $rd2);
337
338 if ($n1 == 0)
339 {
340 $ret = 1;
341 last;
342 }
343
344 }
345
346 close $fp1;
347 close $fp2;
348
349 return $ret;
350
351 }
352
353