]>
Commit | Line | Data |
---|---|---|
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 | ||
56 | my $badttest = 0; | |
57 | my $verbose = 1; | |
58 | ||
5c4436c9 DSH |
59 | my $cmscmd = "../util/shlib_wrap.sh ../apps/openssl cms"; |
60 | my $convcmd = "../util/shlib_wrap.sh ../apps/openssl x509 -inform DER"; | |
88fce853 | 61 | my $pconvcmd = "../util/shlib_wrap.sh ../apps/openssl rsa -inform DER"; |
a329fdde DSH |
62 | my $exdir = "examples"; |
63 | ||
64 | my @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 |
86 | my $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 | |
99 | foreach (@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 |
129 | unlink "cms.out"; |
130 | unlink "cms.err"; | |
a329fdde DSH |
131 | unlink "tmp.der"; |
132 | unlink "tmp.txt"; | |
133 | ||
134 | if ($badtest) { | |
135 | print "\n$badtest TESTS FAILED!!\n"; | |
136 | } else { | |
137 | print "\n***All tests successful***\n"; | |
138 | } | |
139 | ||
140 | ||
141 | sub 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 | ||
165 | sub 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 | ||
189 | sub 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 |
224 | sub 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 |
256 | sub 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 |
283 | sub 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 |
309 | sub 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 |