RFC4134 S/MIME examples test script.
[openssl.git] / test / runex.pl
diff --git a/test/runex.pl b/test/runex.pl
new file mode 100644 (file)
index 0000000..1d77c88
--- /dev/null
@@ -0,0 +1,281 @@
+# test/runex.pl
+# Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
+# project.
+#
+# ====================================================================
+# Copyright (c) 2008 The OpenSSL Project.  All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer. 
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+#
+# 3. All advertising materials mentioning features or use of this
+#    software must display the following acknowledgment:
+#    "This product includes software developed by the OpenSSL Project
+#    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
+#
+# 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission. For written permission, please contact
+#    licensing@OpenSSL.org.
+#
+# 5. Products derived from this software may not be called "OpenSSL"
+#    nor may "OpenSSL" appear in their names without prior written
+#    permission of the OpenSSL Project.
+#
+# 6. Redistributions of any form whatsoever must retain the following
+#    acknowledgment:
+#    "This product includes software developed by the OpenSSL Project
+#    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
+#
+# THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+# ====================================================================
+
+# Perl script to run tests against S/MIME examples in RFC4134
+# Assumes all files are extracted in an directory called "examples"
+
+my $badttest = 0;
+my $verbose = 1;
+
+my $cmscmd = "../apps/openssl cms";
+my $convcmd = "../apps/openssl x509 -inform DER";
+my $exdir = "examples";
+
+my @test_list = (
+["3.1.bin"     => "dataout"],
+["3.2.bin"     => "encode, dataout"],
+["4.1.bin"     => "encode, verifyder, content, dss"],
+["4.2.bin"     => "encode, verifyder, cont, rsa"],
+["4.3.bin"     => "encode, verifyder, cont_extern, dss"],
+["4.4.bin"     => "encode, verifyder, cont, dss"],
+["4.5.bin"     => "verifyder, content, rsa"],
+["4.6.bin"     => "encode, verifyder, cont, dss"],
+["4.7.bin"     => "encode, verifyder, cont, dss"],
+["4.8.eml"     => "verifymime, dss"],
+["4.9.eml"     => "verifymime, dss"],
+["4.10.bin"    => "encode, verifyder, cont, dss"],
+["4.11.bin"    => "encode"],
+["5.1.bin"     => "encode"],
+["5.2.bin"     => "encode"],
+["6.0.bin"     => "encode, digest, cont"],
+["7.1.bin"     => "encode"],
+["7.2.bin"     => "encode"]
+);
+
+       if (!-d $exdir)
+               {
+               print STDERR "FATAL ERROR: examples directory missing!!\n";
+               exit 1;
+               }
+
+       system ("$convcmd -in $exdir/CarlDSSSelf.cer -out $exdir/CarlDSSSelf.pem");
+       system ("$convcmd -in $exdir/CarlRSASelf.cer -out $exdir/CarlRSASelf.pem");
+
+       $cafile = "$cmsdir/CarlRSASelf.pem" if $tlist =~ /rsa/;
+
+foreach (@test_list) {
+       my ($file, $tlist) = @$_;
+       print "Example file $file:\n";
+       if ($tlist =~ /encode/)
+               {
+               run_reencode_test($exdir, $file);
+               }
+       if ($tlist =~ /dataout/)
+               {
+               run_dataout_test($exdir, $file);
+               }
+       if ($tlist =~ /verify/)
+               {
+               run_verify_test($exdir, $tlist, $file);
+               }
+       if ($tlist =~ /digest/)
+               {
+               run_digest_test($exdir, $tlist, $file);
+               }
+
+}
+
+unlink "cms.out";
+unlink "cms.err";
+unlink "tmp.der";
+unlink "tmp.txt";
+
+if ($badtest) {
+       print "\n$badtest TESTS FAILED!!\n";
+} else {
+       print "\n***All tests successful***\n";
+}
+
+
+sub run_reencode_test
+       {
+       my ($cmsdir, $tfile) = @_;
+       unlink "tmp.der";
+
+       system ("$cmscmd -cmsout -inform DER -outform DER" .
+               " -in $cmsdir/$tfile -out tmp.der");
+
+       if ($?)
+               {
+               print "\tReencode command FAILED!!\n";
+               $badtest++;
+               }
+       elsif (!cmp_files("$cmsdir/$tfile", "tmp.der"))
+               {
+               print "\tReencode FAILED!!\n";
+               $badtest++;
+               }
+       else
+               {
+               print "\tReencode passed\n" if $verbose;
+               }
+       }
+
+sub run_dataout_test
+       {
+       my ($cmsdir, $tfile) = @_;
+       unlink "tmp.txt";
+
+       system ("$cmscmd -data_out -inform DER" .
+               " -in $cmsdir/$tfile -out tmp.txt");
+
+       if ($?)
+               {
+               print "\tDataout command FAILED!!\n";
+               $badtest++;
+               }
+       elsif (!cmp_files("$cmsdir/ExContent.bin", "tmp.txt"))
+               {
+               print "\tDataout compare FAILED!!\n";
+               $badtest++;
+               }
+       else
+               {
+               print "\tDataout passed\n" if $verbose;
+               }
+       }
+
+sub run_verify_test
+       {
+       my ($cmsdir, $tlist, $tfile) = @_;
+       unlink "tmp.txt";
+
+       $form = "DER" if $tlist =~ /verifyder/;
+       $form = "SMIME" if $tlist =~ /verifymime/;
+       $cafile = "$cmsdir/CarlDSSSelf.pem" if $tlist =~ /dss/;
+       $cafile = "$cmsdir/CarlRSASelf.pem" if $tlist =~ /rsa/;
+
+       $cmd = "$cmscmd -verify -inform $form" .
+               " -CAfile $cafile" .
+               " -in $cmsdir/$tfile -out tmp.txt";
+
+       $cmd .= " -content $cmsdir/ExContent.bin" if $tlist =~ /cont_extern/;   
+
+       system ("$cmd 2>cms.err 1>cms.out");
+
+       if ($?)
+               {
+               print "\tVerify command FAILED!!\n";
+               $badtest++;
+               }
+       elsif ($tlist =~ /cont/ &&
+               !cmp_files("$cmsdir/ExContent.bin", "tmp.txt"))
+               {
+               print "\tVerify content compare FAILED!!\n";
+               $badtest++;
+               }
+       else
+               {
+               print "\tVerify passed\n" if $verbose;
+               }
+       }
+
+sub run_digest_test
+       {
+       my ($cmsdir, $tlist, $tfile) = @_;
+       unlink "tmp.txt";
+
+       system ("$cmscmd -digest_verify -inform DER" .
+               " -in $cmsdir/$tfile -out tmp.txt");
+
+       if ($?)
+               {
+               print "\tDigest verify command FAILED!!\n";
+               $badtest++;
+               }
+       elsif ($tlist =~ /cont/ &&
+               !cmp_files("$cmsdir/ExContent.bin", "tmp.txt"))
+               {
+               print "\tDigest verify content compare FAILED!!\n";
+               $badtest++;
+               }
+       else
+               {
+               print "\tDigest verify passed\n" if $verbose;
+               }
+       }
+
+sub cmp_files
+       {
+       my ($f1, $f2) = @_;
+       my ($fp1, $fp2);
+
+       my ($rd1, $rd2);
+
+       if (!open($fp1, "<$f1") ) {
+               print STDERR "Can't Open file $f1\n";
+               return 0;
+       }
+
+       if (!open($fp2, "<$f2") ) {
+               print STDERR "Can't Open file $f2\n";
+               return 0;
+       }
+
+       binmode $fp1;
+       binmode $fp2;
+
+       my $ret = 0;
+
+       for (;;)
+               {
+               $n1 = sysread $fp1, $rd1, 4096;
+               $n2 = sysread $fp2, $rd2, 4096;
+               last if ($n1 != $n2);
+               last if ($rd1 ne $rd2);
+
+               if ($n1 == 0)
+                       {
+                       $ret = 1;
+                       last;
+                       }
+
+               }
+
+       close $fp1;
+       close $fp2;
+
+       return $ret;
+
+       }
+
+