2 # Copyright 2018-2021 The OpenSSL Project Authors. All Rights Reserved.
4 # Licensed under the Apache License 2.0 (the "License"). You may not use
5 # this file except in compliance with the License. You can obtain a copy
6 # in the file LICENSE in the source distribution or at
7 # https://www.openssl.org/source/license.html
14 use OpenSSL
::Test
::Utils
;
15 use Storable
qw(dclone);
20 { cmd
=> [qw{openssl mac
-digest SHA1
-macopt hexkey
:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F
}],
22 input
=> unpack("H*", "Sample message for keylen=blocklen"),
23 expected
=> '5FD596EE78D5553C8FF4E72D266DFD192366DA29',
24 desc
=> 'HMAC SHA1' },
25 { cmd
=> [qw{openssl mac
-macopt digest
:SHA1
-macopt hexkey
:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F
}],
27 input
=> unpack("H*", "Sample message for keylen=blocklen"),
28 expected
=> '5FD596EE78D5553C8FF4E72D266DFD192366DA29',
29 desc
=> 'HMAC SHA1 via -macopt' },
30 { cmd
=> [qw{openssl mac
-cipher AES
-256-GCM
-macopt hexkey
:4C973DBC7364621674F8B5B89E5C15511FCED9216490FB1C1A2CAA0FFE0407E5
-macopt hexiv
:7AE8E2CA4EC500012E58495C
}],
32 input
=> '68F2E77696CE7AE8E2CA4EC588E541002E58495C08000F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D0007',
33 expected
=> '00BDA1B7E87608BCBF470F12157F4C07',
35 { cmd
=> [qw{openssl mac
-macopt cipher
:AES
-256-GCM
-macopt hexkey
:4C973DBC7364621674F8B5B89E5C15511FCED9216490FB1C1A2CAA0FFE0407E5
-macopt hexiv
:7AE8E2CA4EC500012E58495C
}],
37 input
=> '68F2E77696CE7AE8E2CA4EC588E541002E58495C08000F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D0007',
38 expected
=> '00BDA1B7E87608BCBF470F12157F4C07',
39 desc
=> 'GMAC via -macopt' },
40 { cmd
=> [qw{openssl mac
-macopt hexkey
:404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F
-macopt xof
:0}],
43 expected
=> 'E5780B0D3EA6F7D3A429C5706AA43A00FADBD7D49628839E3187243F456EE14E',
45 { cmd
=> [qw{openssl mac
-macopt hexkey
:404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F
-macopt
}, 'custom:My Tagged Application'],
48 expected
=> '20C570C31346F703C9AC36C61C03CB64C3970D0CFC787E9B79599D273A68D2F7F69D4CC3DE9D104A351689F27CF6F5951F0103F33F4F24871024D9C27773A8DD',
50 { cmd
=> [qw{openssl mac
-macopt hexkey
:404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F
-macopt xof
:1 -macopt
}, 'custom:My Tagged Application'],
52 input
=> '000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7',
53 expected
=> 'D5BE731C954ED7732846BB59DBE3A8E30F83E77A4BFF4459F2F1C2B4ECEBB8CE67BA01C62E8AB8578D2D499BD1BB276768781190020A306A97DE281DCC30305D',
54 desc
=> 'KMAC256 with xof len of 64' },
58 { cmd
=> [qw{openssl mac
-macopt hexkey
:000102030405060708090A0B0C0D0E0F
}],
61 expected
=> 'da87c1d86b99af44347659119b22fc45',
62 desc
=> 'SipHash No input' }
66 { cmd
=> [qw{openssl mac
-cipher AES
-256-CBC
-macopt hexkey
:0B122AC8F34ED1FE082A3625D157561454167AC145A10BBF77C6A70596D574F1
}],
68 input
=> '498B53FDEC87EDCBF07097DCCDE93A084BAD7501A224E388DF349CE18959FE8485F8AD1537F0D896EA73BEDC7214713F',
69 expected
=> 'F62C46329B41085625669BAF51DEA66A',
70 desc
=> 'CMAC AES-256-CBC' },
71 { cmd
=> [qw{openssl mac
-macopt cipher
:AES
-256-CBC
-macopt hexkey
:0B122AC8F34ED1FE082A3625D157561454167AC145A10BBF77C6A70596D574F1
}],
73 input
=> '498B53FDEC87EDCBF07097DCCDE93A084BAD7501A224E388DF349CE18959FE8485F8AD1537F0D896EA73BEDC7214713F',
74 expected
=> 'F62C46329B41085625669BAF51DEA66A',
75 desc
=> 'CMAC AES-256-CBC' },
78 my @poly1305_tests = (
79 { cmd
=> [qw{openssl mac
-macopt hexkey
:02000000000000000000000000000000ffffffffffffffffffffffffffffffff
}],
81 input
=> '02000000000000000000000000000000',
82 expected
=> '03000000000000000000000000000000',
83 desc
=> 'Poly1305 (wrap 2^128)' },
86 push @mac_tests, @siphash_tests unless disabled
("siphash");
87 push @mac_tests, @cmac_tests unless disabled
("cmac");
88 push @mac_tests, @poly1305_tests unless disabled
("poly1305");
90 my @mac_fail_tests = (
91 { cmd
=> [qw{openssl mac
}],
94 err
=> 'EVP_MAC_Init',
95 desc
=> 'KMAC128 Fail no key' },
96 { cmd
=> [qw{openssl mac
-propquery unknown
-macopt hexkey
:404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F
}],
99 err
=> 'Invalid MAC name KMAC128',
100 desc
=> 'KMAC128 Fail unknown property' },
101 { cmd
=> [qw{openssl mac
-cipher AES
-128-CBC
-macopt hexkey
:00}],
104 err
=> 'MAC parameter error',
105 desc
=> 'HMAC given a cipher' },
108 my @siphash_fail_tests = (
109 { cmd
=> [qw{openssl mac
}],
113 desc
=> 'SipHash Fail no key' },
116 push @mac_fail_tests, @siphash_fail_tests unless disabled
("siphash");
118 plan tests
=> (scalar @mac_tests * 2) + scalar @mac_fail_tests;
122 foreach (@mac_tests) {
124 ok
(compareline
($_->{cmd
}, $_->{type
}, $_->{input
}, $_->{expected
}, $_->{err
}), $_->{desc
});
126 foreach (@mac_tests) {
128 ok
(comparefile
($_->{cmd
}, $_->{type
}, $_->{input
}, $_->{expected
}), $_->{desc
});
131 foreach (@mac_fail_tests) {
133 ok
(compareline
($_->{cmd
}, $_->{type
}, $_->{input
}, $_->{expected
}, $_->{err
}), $_->{desc
});
136 # Create a temp input file and save the input data into it, and
137 # then compare the stdout output matches the expected value.
139 my $tmpfile = "input-$test_count.bin";
140 my ($cmdarray_orig, $type, $input, $expect, $err) = @_;
141 my $cmdarray = dclone
$cmdarray_orig;
142 if (defined($expect)) {
143 $expect = uc $expect;
145 # Open a temporary input file and write $input to it
146 open(my $in, '>', $tmpfile) or die "Could not open file";
148 my $bin = pack("H*", $input);
152 # The last cmd parameter is the temporary input file we just created.
153 my @other = ('-in', $tmpfile, $type);
154 push @
$cmdarray, @other;
156 my @lines = run
(app
($cmdarray), capture
=> 1);
157 # Not unlinking $tmpfile
159 if (defined($expect)) {
160 if ($lines[0] =~ m
|^\Q
${expect
}\E\R
$|) {
163 print "Got: $lines[0]";
164 print "Exp: $expect\n";
169 if (defined($lines[0])) {
170 $lines[0] =~ s/\s+$//;
171 if ($lines[0] eq $err) {
174 print "Got: $lines[0]";
186 # Create a temp input file and save the input data into it, and
187 # use the '-bin -out <file>' commandline options to save results out to a file.
188 # Read this file back in and check its output matches the expected value.
190 my $tmpfile = "input-$test_count.bin";
191 my $outfile = "output-$test_count.bin";
192 my ($cmdarray, $type, $input, $expect) = @_;
193 $expect = uc $expect;
195 # Open a temporary input file and write $input to it
196 open(my $in, '>', $tmpfile) or die "Could not open file";
198 my $bin = pack("H*", $input);
202 my @other = ("-binary", "-in", $tmpfile, "-out", $outfile, $type);
203 push @
$cmdarray, @other;
206 # Not unlinking $tmpfile
208 open(my $out, '<', $outfile) or die "Could not open file";
212 read($out, $buffer, $BUFSIZE) or die "unable to read";
213 my $line = uc unpack("H*", $buffer);
215 # Not unlinking $outfile
217 if ($line eq $expect) {
220 print "Got: $line\n";
221 print "Exp: $expect\n";