singe/thirdparty/openssl/gost-engine/test/02-mac.t
2023-11-16 22:15:24 -06:00

212 lines
7.6 KiB
Perl

#!/usr/bin/perl
use Test2::V0;
my $engine_name = $ENV{ENGINE_NAME} || 'gost';
my $provider_name = $ENV{PROVIDER_NAME} || 'gostprov';
# Supported test types:
#
# conf Only if there's a command line argument.
# For this test type, we rely entirely on the
# caller to define the environment variable
# OPENSSL_CONF appropriately.
# standalone-engine-conf Tests the engine through a generated config
# file.
# This is done when there are no command line
# arguments or when the environment variable
# ENGINE_NAME is defined.
# standalone-engine-args Tests the engine through openssl command args.
# This is done when there are no command line
# arguments or when the environment variable
# ENGINE_NAME is defined.
# standalone-provider-conf Tests the provider through a generated config
# file.
# This is done when there are no command line
# arguments or when the environment variable
# PROVIDER_NAME is defined.
# standalone-provider-args Tests the provider through openssl command args.
# This is done when there are no command line
# arguments or when the environment variable
# PROVIDER_NAME is defined.
my @test_types = ( $ARGV[0] ? 'conf' : (),
( !$ARGV[0] || $ENV{ENGINE_NAME}
? ( 'standalone-engine-conf', 'standalone-engine-args' )
: () ),
( !$ARGV[0] || $ENV{PROVIDER_NAME}
? ( 'standalone-provider-conf', 'standalone-provider-args' )
: () ) );
plan(19 * scalar @test_types);
# prepare data for
my $F;
open $F,">","testdata.dat";
print $F "12345670" x 128;
close $F;
open $F,">","testbig.dat";
print $F ("12345670" x 8 . "\n") x 4096;
close $F;
my $key='0123456789abcdef' x 2;
note("\@ARGV = (", join(', ', @ARGV), ")");
my %configurations = (
'conf' => {
'module-type' => $ARGV[0],
},
'standalone-engine-args' => {
'module-type' => 'engine',
'openssl-args' => "-engine $engine_name",
},
'standalone-provider-args' => {
'module-type' => 'provider',
'openssl-args' => "-provider $provider_name -provider default",
},
'standalone-engine-conf' => {
'module-type' => 'engine',
'openssl-conf' => <<EOCFG,
openssl_conf = openssl_def
[openssl_def]
engines = engines
[engines]
${engine_name}=${engine_name}_conf
[${engine_name}_conf]
default_algorithms = ALL
EOCFG
},
'standalone-provider-conf' => {
'module-type' => 'provider',
'openssl-conf' => <<EOCFG,
openssl_conf = openssl_def
[openssl_def]
providers = providers
[providers]
${provider_name}=${provider_name}_conf
[${provider_name}_conf]
EOCFG
},
);
my %executors = (
engine => {
mac_cmd => sub {
my %opts = @_;
my $cmd = "openssl dgst $opts{-args}"
. " -mac $opts{-mac} -macopt key:$opts{-key}"
. (defined $opts{-size} ? " -sigopt size:$opts{-size}" : "")
. " $opts{-infile}";
return $cmd;
},
check_expected => sub {
my %opts = @_;
return "$opts{-mac}($opts{-infile})= $opts{-result}\n";
},
},
provider => {
mac_cmd => sub {
my %opts = @_;
my $cmd = "openssl mac $opts{-args} -macopt key:$opts{-key}"
. (defined $opts{-size} ? " -macopt size:$opts{-size}" : "")
. " -in $opts{-infile} $opts{-mac}";
return $cmd;
},
check_expected => sub {
my %opts = @_;
return uc($opts{-result})."\n";
},
},
);
foreach my $test_type (@test_types) {
my $configuration = $configurations{$test_type};
my $module_type = $configuration->{'module-type'};
my $module_args = $configuration->{'openssl-args'} // '';
my $module_conf = $configuration->{'openssl-conf'};
# This is a trick to make a locally modifiable environment variable and
# retain it's current value as a default.
local $ENV{OPENSSL_CONF} = $ENV{OPENSSL_CONF};
SKIP: {
skip "No module type detected for test type '$test_type'", 19
unless $module_type;
note("Running tests for test type $test_type");
if ($module_args) {
$module_args = ' ' . $module_args;
}
if (defined $module_conf) {
my $confname = "$test_type.cnf";
open my $F, '>', $confname;
print $F $module_conf;
close $F;
$ENV{OPENSSL_CONF} = abs_path($confname);
}
# Reopen STDERR to eliminate extra output
#open STDERR, ">>","tests.err";
my $mac_cmd = $executors{$module_type}->{mac_cmd};
my $mac_expected = $executors{$module_type}->{check_expected};
my $cmd;
my $expected;
$cmd = $mac_cmd->(-mac => 'gost-mac', -key => $key,
-args => $module_args, -infile => 'testdata.dat');
$expected = $mac_expected->(-mac => 'GOST-MAC-gost-mac',
-infile => 'testdata.dat',
-result => '2ee8d13d');
unless (is(`$cmd`, $expected, "GOST MAC - default size")) {
diag("Command was: $cmd");
}
my $i;
for ($i=1;$i<=8; $i++) {
$cmd = $mac_cmd->(-mac => 'gost-mac', -key => $key, -size => $i,
-args => $module_args, -infile => 'testdata.dat');
$expected = $mac_expected->(-mac => 'GOST-MAC-gost-mac',
-infile => 'testdata.dat',
-result => substr("2ee8d13dff7f037d",0,$i*2));
unless (is(`$cmd`, $expected, "GOST MAC - size $i bytes")) {
diag("Command was: $cmd");
}
}
$cmd = $mac_cmd->(-mac => 'gost-mac', -key => $key,
-args => $module_args, -infile => 'testbig.dat');
$expected = $mac_expected->(-mac => 'GOST-MAC-gost-mac',
-infile => 'testbig.dat',
-result => '5efab81f');
unless (is(`$cmd`, $expected, "GOST MAC - big data")) {
diag("Command was: $cmd");
}
$cmd = $mac_cmd->(-mac => 'gost-mac-12', -key => $key,
-args => $module_args, -infile => 'testdata.dat');
$expected = $mac_expected->(-mac => 'GOST-MAC-12-gost-mac-12',
-infile => 'testdata.dat',
-result => 'be4453ec');
unless (is(`$cmd`, $expected, "GOST MAC parameters 2012 - default size")) {
diag("Command was: $cmd");
}
for ($i=1;$i<=8; $i++) {
$cmd = $mac_cmd->(-mac => 'gost-mac-12', -key => $key, -size => $i,
-args => $module_args, -infile => 'testdata.dat');
$expected = $mac_expected->(-mac => 'GOST-MAC-12-gost-mac-12',
-infile => 'testdata.dat',
-result => substr("be4453ec1ec327be",0,$i*2));
unless (is(`$cmd`, $expected, "GOST MAC parameters 2012 - size $i bytes")) {
diag("Command was: $cmd");
}
}
}
}
unlink('testdata.dat');
unlink('testbig.dat');