mpi/ec: fix when 'unsigned long' is 32-bit but limb size is 64-bit
[libgcrypt.git] / tests / cavs_driver.pl
index bb5d6fc..bc93feb 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/env perl
 #
-# $Id: cavs_driver.pl 1488 2009-01-16 14:29:00Z smueller $
+# $Id: cavs_driver.pl 1497 2009-01-22 14:01:29Z smueller $
 #
 # CAVS test driver (based on the OpenSSL driver)
 # Written by: Stephan Müller <sm@atsec.com>
@@ -11,7 +11,7 @@
 # in the Software without restriction, including without limitation the rights
 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 # copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions: 
+# furnished to do so, subject to the following conditions:
 #
 # The above copyright notice and this permission notice shall be included in
 # all copies or substantial portions of the Software.
@@ -65,6 +65,7 @@
 #      SigVer15
 #      (SigVerRSA is not applicable for OpenSSL as X9.31 padding
 #              is not done through openssl dgst)
+#      KeyGen RSA X9.31
 #
 # SHA
 #      SHA[1|224|256|384|512]ShortMsg
@@ -149,7 +150,7 @@ my $encdec;
 #        is separated from the previous with a \n in the following order:
 #         P\n
 #         Q\n
-#         N\
+#         N\n
 #         D\n
 my $rsa_derive;
 
@@ -254,7 +255,7 @@ my $dsa_verify;
 
 # generate a new DSA key with the following properties:
 #      PEM format
-# $1 keyfile name 
+# $1 keyfile name
 # return: file created, hash with keys of P, Q, G in hex format
 my $gen_dsakey;
 
@@ -496,7 +497,7 @@ sub libgcrypt_hmac($$$$) {
        my $hashtype = shift;
 
        my $program = "fipsdrv --key $key --algo $hashtype hmac-sha";
-       return pipe_through_program($msg, $program);    
+       return pipe_through_program($msg, $program);
 }
 
 sub libgcrypt_dsa_pqggen($) {
@@ -567,7 +568,7 @@ sub libgcrypt_dsa_verify($$$$) {
        close FH;
 
        $ret = pipe_through_program($data,
-               "fipsdrv --verbose --key $keyfile --signature $sigfile dsa-verify");
+               "fipsdrv --key $keyfile --signature $sigfile dsa-verify");
        unlink ($sigfile);
        # Parse through the output information
        return ($ret =~ /GOOD signature/);
@@ -622,7 +623,7 @@ sub pipe_through_program($@) {
 
        my ($CO, $CI);
        my $pid = open2($CO, $CI, @args);
-       
+
        my $out = "";
        my $len = length($in);
        my $first = 1;
@@ -658,7 +659,7 @@ sub pipe_through_program($@) {
        }
        close $CO or die "broken pipe: $!";
        waitpid $pid, 0;
-       
+
        return $out;
 }
 
@@ -880,7 +881,7 @@ sub der_pos_bigint($) {
 # returns number as signed DER integer encoding
 sub der_int($) {
        my $n = shift;
-       
+
        return der_bigint(int_base256_signed($n));
 }
 
@@ -957,11 +958,11 @@ sub der_unit_test {
 # OpenSSL missing functionality workarounds
 
 ## Format of an RSA public key:
-#    0:d=0  hl=3 l= 159 cons: SEQUENCE          
-#    3:d=1  hl=2 l=  13 cons:  SEQUENCE          
+#    0:d=0  hl=3 l= 159 cons: SEQUENCE
+#    3:d=1  hl=2 l=  13 cons:  SEQUENCE
 #    5:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption
-#   16:d=2  hl=2 l=   0 prim:   NULL              
-#   18:d=1  hl=3 l= 141 prim:  BIT STRING        
+#   16:d=2  hl=2 l=   0 prim:   NULL
+#   18:d=1  hl=3 l= 141 prim:  BIT STRING
 #                              [ sequence: INTEGER (n), INTEGER (e) ]
 
 # generate RSA pub key in PEM format
@@ -1072,7 +1073,7 @@ sub kat($$$$$$$$) {
                $out .= "KEY3 = $key3\n";
                $key1= $key1 . $key3;
        }
-       
+
        $out .= "IV = $iv\n" if (defined($iv) && $iv ne "");
        if ($enc) {
                $out .= "PLAINTEXT = $pt\n";
@@ -1138,7 +1139,7 @@ sub hmac_kat($$$$) {
        $out .= "Tlen = $tlen\n";
        $out .= "Key = $key\n";
        $out .= "Msg = $msg\n";
-       $out .= "Mac = " . &$hmac($key, $tlen, $msg, $hashtype{$tlen}) . "\n\n";
+       $out .= "Mac = " . &$hmac($key, $tlen, $msg, $hashtype{$tlen}) . "\n";
 
        return $out;
 }
@@ -1249,7 +1250,7 @@ sub crypto_mct($$$$$$$$) {
                                #print STDERR "calc_data=", bin2hex($calc_data), "\n";
 
                                if ( (!$enc && $ciph =~ /des/) ||
-                                    $ciph =~ /rc4/ || 
+                                    $ciph =~ /rc4/ ||
                                     $cipher =~ /ecb/ ) {
                                        #TDES in decryption mode, RC4 and ECB mode
                                        #have a special rule
@@ -1268,7 +1269,7 @@ sub crypto_mct($$$$$$$$) {
                 } else {
                         $out .= "PLAINTEXT = ". bin2hex($calc_data). "\n\n";
                 }
-               
+
                if ( $ciph =~ /aes/ ) {
                        $key1 ^= substr($old_calc_data . $calc_data, -$keylen);
                        #print STDERR bin2hex($key1)."\n";
@@ -1380,7 +1381,7 @@ sub rsa_siggen($$$) {
 
 # RSA SigVer test
 # $1: Message to be verified in hex form
-# $2: Hash algoritm
+# $2: Hash algorithm
 # $3: Signature of message in hex form
 # $4: n of the RSA key in hex in hex form
 # $5: e of the RSA key in hex in hex form
@@ -1418,6 +1419,48 @@ sub rsa_sigver($$$$$) {
        return $out;
 }
 
+# RSA X9.31 key generation test
+# $1 modulus size
+# $2 e
+# $3 xp1
+# $4 xp2
+# $5 Xp
+# $6 xq1
+# $7 xq2
+# $8 Xq
+# return: string formatted as expected by CAVS
+sub rsa_keygen($$$$$$$$) {
+       my $modulus = shift;
+       my $e = shift;
+       my $xp1 = shift;
+       my $xp2 = shift;
+       my $Xp = shift;
+       my $xq1 = shift;
+       my $xq2 = shift;
+       my $Xq = shift;
+
+       my $out = "";
+
+       my $ret = &$rsa_derive($modulus, $e, $xp1, $xp2, $Xp, $xq1, $xq2, $Xq);
+
+       my ($P, $Q, $N, $D) = split(/\n/, $ret);
+
+       $out .= "e = $e\n";
+       $out .= "xp1 = $xp1\n";
+       $out .= "xp2 = $xp2\n";
+       $out .= "Xp = $Xp\n";
+       $out .= "p = $P\n";
+       $out .= "xq1 = $xq1\n";
+       $out .= "xq2 = $xq2\n";
+       $out .= "Xq = $Xq\n";
+       $out .= "q = $Q\n";
+       $out .= "n = $N\n";
+       $out .= "d = $D\n\n";
+
+       return $out;
+
+}
+
 # X9.31 RNG test
 # $1 key for the AES cipher
 # $2 DT value
@@ -1475,6 +1518,11 @@ sub dsa_pqggen_driver($$) {
                die "Return value does not contain all expected values of P, Q, G, Seed, c, H for dsa_pqggen"
                        if (!defined($P) || !defined($Q) || !defined($G) ||
                            !defined($Seed) || !defined($c) || !defined($H));
+
+               # now change the counter to decimal as CAVS wants decimal
+               # counter value although all other is HEX
+               $c = hex($c);
+
                $out .= "P = $P\n";
                $out .= "Q = $Q\n";
                $out .= "G = $G\n";
@@ -1616,6 +1664,12 @@ sub parse($$) {
        my $capital_g = "";
        my $capital_y = "";
        my $capital_r = "";
+       my $xp1 = "";
+       my $xp2 = "";
+       my $Xp = "";
+       my $xq1 = "";
+       my $xq2 = "";
+       my $Xq = "";
 
        my $mode = "";
 
@@ -1639,14 +1693,14 @@ sub parse($$) {
                # '# "SigVer PKCS#1 Ver 1.5" information for "IBMRHEL5"'
                # '# "SigGen PKCS#1 Ver 1.5" information for "IBMRHEL5"'
                # '#RC4VS MCT test data'
-               
+
                # avoid false positives from user specified 'for "PRODUCT"' strings
                my $tmpline = $line;
                $tmpline =~ s/ for ".*"//;
 
                ##### Extract cipher
                # XXX there may be more - to be added
-               if ($tmpline =~ /^#.*(CBC|ECB|OFB|CFB|SHA-|SigGen|SigVer|RC4VS|ANSI X9\.31|Hash sizes tested|PQGGen)/) {
+               if ($tmpline =~ /^#.*(CBC|ECB|OFB|CFB|SHA-|SigGen|SigVer|RC4VS|ANSI X9\.31|Hash sizes tested|PQGGen|KeyGen RSA)/) {
                        if ($tmpline    =~ /CBC/)   { $mode="cbc"; }
                        elsif ($tmpline =~ /ECB/)   { $mode="ecb"; }
                        elsif ($tmpline =~ /OFB/)   { $mode="ofb"; }
@@ -1695,7 +1749,11 @@ sub parse($$) {
 
                        if ($tt == 0) {
                        ##### Identify the test type
-                               if ($tmpline =~ /SigVer/ && $opt{'D'} ) {
+                               if ($tmpline =~ /KeyGen RSA \(X9\.31\)/) {
+                                       $tt = 13;
+                                       die "Interface function rsa_derive for RSA key generation not defined for tested library"
+                                               if (!defined($rsa_derive));
+                               } elsif ($tmpline =~ /SigVer/ && $opt{'D'} ) {
                                        $tt = 12;
                                        die "Interface function dsa_verify or dsa_genpubkey for DSA verification not defined for tested library"
                                                if (!defined($dsa_verify) || !defined($dsa_genpubkey));
@@ -1907,6 +1965,36 @@ sub parse($$) {
                                if ($capital_r);
                        $capital_r = $1;
                }
+               elsif ($line =~ /^xp1\s*=\s*(.*)/) { #RSA key gen
+                       die "xp1 seen twice - check input file"
+                               if ($xp1);
+                       $xp1 = $1;
+               }
+               elsif ($line =~ /^xp2\s*=\s*(.*)/) { #RSA key gen
+                       die "xp2 seen twice - check input file"
+                               if ($xp2);
+                       $xp2 = $1;
+               }
+               elsif ($line =~ /^Xp\s*=\s*(.*)/) { #RSA key gen
+                       die "Xp seen twice - check input file"
+                               if ($Xp);
+                       $Xp = $1;
+               }
+               elsif ($line =~ /^xq1\s*=\s*(.*)/) { #RSA key gen
+                       die "xq1 seen twice - check input file"
+                               if ($xq1);
+                       $xq1 = $1;
+               }
+               elsif ($line =~ /^xq2\s*=\s*(.*)/) { #RSA key gen
+                       die "xq2 seen twice - check input file"
+                               if ($xq2);
+                       $xq2 = $1;
+               }
+               elsif ($line =~ /^Xq\s*=\s*(.*)/) { #RSA key gen
+                       die "Xq seen twice - check input file"
+                               if ($Xq);
+                       $Xq = $1;
+               }
                else {
                        $out .= $line . "\n";
                }
@@ -2027,6 +2115,32 @@ sub parse($$) {
                                $pt = "";
                        }
                }
+               elsif ($tt == 13) {
+                       if($modulus ne "" &&
+                          $e ne "" &&
+                          $xp1 ne "" &&
+                          $xp2 ne "" &&
+                          $Xp ne "" &&
+                          $xq1 ne "" &&
+                          $xq2 ne "" &&
+                          $Xq ne "") {
+                               $out .= rsa_keygen($modulus,
+                                                  $e,
+                                                  $xp1,
+                                                  $xp2,
+                                                  $Xp,
+                                                  $xq1,
+                                                  $xq2,
+                                                  $Xq);
+                               $e = "";
+                               $xp1 = "";
+                               $xp2 = "";
+                               $Xp = "";
+                               $xq1 = "";
+                               $xq2 = "";
+                               $Xq = "";
+                       }
+               }
                elsif ($tt > 0) {
                        die "Test case $tt not defined";
                }
@@ -2078,6 +2192,7 @@ sub main() {
                $rsa_sign =     \&libgcrypt_rsa_sign;
                $rsa_verify =   \&libgcrypt_rsa_verify;
                $gen_rsakey =   \&libgcrypt_gen_rsakey;
+               $rsa_derive =   \&libgcrypt_rsa_derive;
                $hash =         \&libgcrypt_hash;
                $state_cipher = \&libgcrypt_state_cipher;
                $state_cipher_des =     \&libgcrypt_state_cipher_des;
@@ -2118,6 +2233,8 @@ sub main() {
        # Do the job
        parse($infile, $outfile);
 
+       cleanup();
+
 }
 
 ###########################################