diff options
author | Rich Salz <rsalz@openssl.org> | 2016-11-28 12:26:05 -0500 |
---|---|---|
committer | Rich Salz <rsalz@openssl.org> | 2016-11-28 12:26:05 -0500 |
commit | 8d1ebff41c75e4eebc7d5cc5a561a1bab6b50e70 (patch) | |
tree | 7b8ce132ea9c1cf999e72bd67cfe1b4a1a30fbcb /test/recipes | |
parent | b3618f44a7b8504bfb0a64e8a33e6b8e56d4d516 (diff) |
Make bntest be (mostly) file-based.
Test suite used from boring, written by David Benjamin.
Test driver converted from C++ to C.
Added a Perl program to check the testsuite file.
Extensive review feedback incorporated (thanks folks).
Reviewed-by: Emilia Käsper <emilia@openssl.org>
Reviewed-by: Richard Levitte <levitte@openssl.org>
Diffstat (limited to 'test/recipes')
-rw-r--r-- | test/recipes/10-test_bn.t | 68 | ||||
-rw-r--r-- | test/recipes/bc.pl | 113 |
2 files changed, 3 insertions, 178 deletions
diff --git a/test/recipes/10-test_bn.t b/test/recipes/10-test_bn.t index 13f278e703..628512afd3 100644 --- a/test/recipes/10-test_bn.t +++ b/test/recipes/10-test_bn.t @@ -16,69 +16,7 @@ use OpenSSL::Test qw/:DEFAULT srctop_file/; setup("test_bn"); -plan tests => 3; +plan tests => 1; -require_ok(srctop_file("test","recipes","bc.pl")); - -my $testresults = "tmp.bntest"; -my $init = ok(run(test(["bntest"], stdout => $testresults)), 'initialize'); - - SKIP: { - skip "Initializing failed, skipping", 1 if !$init; - - subtest 'Checking the bn results' => sub { - my @lines = (); - if (open DATA, $testresults) { - @lines = <DATA>; - close DATA; - } - map { s/\R//; } @lines; # chomp(@lines); - - plan tests => scalar grep(/^print /, @lines); - - my $l = ""; - - while (scalar @lines) { - $l = shift @lines; - - last if $l =~ /^print /; - } - - while (1) { - $l =~ s/^print "//; - $l =~ s/\\n"//; - my $t = $l; - my @operations = (); - - $l = undef; - while (scalar @lines) { - $l = shift @lines; - - last if $l =~ /^print /; - push @operations, $l; - $l = undef; - } - - ok(check_operations(@operations), "verify $t"); - - last unless $l; - } - }; - } - -unlink $testresults; - -sub check_operations { - my $failcount = 0; - - foreach my $line (@_) { - my $result = calc(split /\s+/, $line); - - if ($result ne "0" && $result ne "0x0") { - $failcount++; - print STDERR "Failed! $line => $result\n"; - } - } - - return $failcount == 0; -} +ok(run(test(["bntest", srctop_file("test", "bntests.txt")])), + "running bntest bntests.txt"); diff --git a/test/recipes/bc.pl b/test/recipes/bc.pl deleted file mode 100644 index dbb5842bda..0000000000 --- a/test/recipes/bc.pl +++ /dev/null @@ -1,113 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -use strict; -use warnings; - -use Math::BigInt; - -sub calc { - @_ = __adder(@_); - if (scalar @_ != 1) { return "NaN"; } - return shift; -} - -sub __canonhex { - my ($sign, $hex) = (shift =~ /^([+\-]?)(.*)$/); - $hex = "0x".$hex if $hex !~ /^0x/; - return $sign.$hex; -} - -sub __adder { - @_ = __multiplier(@_); - while (scalar @_ > 1 && $_[1] =~ /^[\+\-]$/) { - my $operand1 = Math::BigInt->from_hex(__canonhex(shift)); - my $operator = shift; - @_ = __multiplier(@_); - my $operand2 = Math::BigInt->from_hex(__canonhex(shift)); - if ($operator eq "+") { - $operand1->badd($operand2); - } elsif ($operator eq "-") { - $operand1->bsub($operand2); - } else { - die "SOMETHING WENT AWFULLY WRONG"; - } - unshift @_, $operand1->as_hex(); - } - return @_; -} - -sub __multiplier { - @_ = __power(@_); - while (scalar @_ > 1 && $_[1] =~ /^[\*\/%]$/) { - my $operand1 = Math::BigInt->from_hex(__canonhex(shift)); - my $operator = shift; - @_ = __power(@_); - my $operand2 = Math::BigInt->from_hex(__canonhex(shift)); - if ($operator eq "*") { - $operand1->bmul($operand2); - } elsif ($operator eq "/") { - # Math::BigInt->bdiv() is documented to do floored division, - # i.e. 1 / -4 = -1, while bc and OpenSSL BN_div do truncated - # division, i.e. 1 / -4 = 0. We need to make the operation - # work like OpenSSL's BN_div to be able to verify. - my $neg = ($operand1->is_neg() - ? !$operand2->is_neg() : $operand2->is_neg()); - $operand1->babs(); - $operand2->babs(); - $operand1->bdiv($operand2); - if ($neg) { $operand1->bneg(); } - } elsif ($operator eq "%") { - # Here's a bit of a quirk... - # With OpenSSL's BN, as well as bc, the result of -10 % 3 is -1 - # while Math::BigInt, the result is 2. - # The latter is mathematically more correct, but... - my $o1isneg = $operand1->is_neg(); - $operand1->babs(); - # Math::BigInt does something different with a negative modulus, - # while OpenSSL's BN and bc treat it like a positive number... - $operand2->babs(); - $operand1->bmod($operand2); - if ($o1isneg) { $operand1->bneg(); } - } else { - die "SOMETHING WENT AWFULLY WRONG"; - } - unshift @_, $operand1->as_hex(); - } - return @_; -} - -sub __power { - @_ = __paren(@_); - while (scalar @_ > 1 && $_[1] eq "^") { - my $operand1 = Math::BigInt->from_hex(__canonhex(shift)); - shift; - @_ = __paren(@_); - my $operand2 = Math::BigInt->from_hex(__canonhex(shift)); - $operand1->bpow($operand2); - unshift @_, $operand1->as_hex(); - } - return @_; -} - -# returns array ( $result, @remaining ) -sub __paren { - if (scalar @_ > 0 && $_[0] eq "(") { - shift; - my @result = __adder(@_); - if (scalar @_ == 0 || $_[0] ne ")") { - return ("NaN"); - } - shift; - return @result; - } - return @_; -} - -1; |