2018-03-22 15:51:09 +01:00
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
|
|
|
|
use Test::More tests => 42;
|
|
|
|
|
|
|
|
use Crypt::AuthEnc::GCM qw( gcm_encrypt_authenticate gcm_decrypt_verify );
|
|
|
|
|
|
|
|
sub do_test {
|
|
|
|
my %a = @_;
|
2018-03-22 15:54:03 +01:00
|
|
|
|
|
|
|
my $key = pack("H*", $a{key});
|
2018-03-22 15:51:09 +01:00
|
|
|
my $adata = pack("H*", $a{adata});
|
|
|
|
my $iv = pack("H*", $a{iv});
|
|
|
|
my $plaintext = pack("H*", $a{plaintext});
|
|
|
|
my $ciphertext = pack("H*", $a{ciphertext});
|
|
|
|
my $tag = pack("H*", $a{tag});
|
2018-03-22 15:54:03 +01:00
|
|
|
|
2018-03-22 15:51:09 +01:00
|
|
|
# encrypt
|
|
|
|
my $m1 = Crypt::AuthEnc::GCM->new("AES", $key);
|
|
|
|
$m1->iv_add($iv);
|
|
|
|
$m1->adata_add($adata);
|
|
|
|
my $ct = $m1->encrypt_add($plaintext);
|
|
|
|
my $tag1 = $m1->encrypt_done;
|
|
|
|
|
|
|
|
is(unpack('H*', $ct), $a{ciphertext}, "enc: ciphertext");
|
|
|
|
is(unpack('H*', $tag1), $a{tag}, "enc: tag");
|
|
|
|
|
|
|
|
# decrypt
|
|
|
|
my $d1 = Crypt::AuthEnc::GCM->new("AES", $key);
|
|
|
|
$d1->iv_add($iv);
|
|
|
|
$d1->adata_add($adata);
|
|
|
|
my $pt = $d1->decrypt_add($ciphertext);
|
|
|
|
my $tag2 = $d1->decrypt_done();
|
|
|
|
|
|
|
|
is(unpack('H*', $pt), $a{plaintext}, "dec: plaintext");
|
|
|
|
is(unpack('H*', $tag2), $a{tag}, "dec: tag");
|
|
|
|
|
|
|
|
# all-in-one
|
|
|
|
my ($ct3, $tag3) = gcm_encrypt_authenticate('AES', $key, $iv, $adata, $plaintext);
|
|
|
|
is(unpack('H*', $ct3), $a{ciphertext}, "enc: ciphertext");
|
|
|
|
is(unpack('H*', $tag3), $a{tag}, "enc: tag");
|
|
|
|
my $pt3 = gcm_decrypt_verify('AES', $key, $iv, $adata, $ciphertext, $tag);
|
|
|
|
is(unpack('H*', $pt3), $a{plaintext}, "dec: plaintext");
|
2018-03-22 15:54:03 +01:00
|
|
|
|
2018-03-22 15:51:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
do_test(%$_) for (
|
|
|
|
#/* test case #1 */
|
|
|
|
# XXX-FIXME this test fails!!!!
|
|
|
|
# {
|
|
|
|
# key => '00000000000000000000000000000000',
|
|
|
|
# plaintext => '',
|
|
|
|
# adata => '',
|
|
|
|
# iv => '000000000000000000000000',
|
|
|
|
# ciphertext => '',
|
|
|
|
# tag => '58e2fccefa7e3061367f1d57a4e7455a',
|
|
|
|
# },
|
2018-03-22 15:54:03 +01:00
|
|
|
|
2018-03-22 15:51:09 +01:00
|
|
|
#/* test case #2 */
|
|
|
|
{
|
|
|
|
key => '00000000000000000000000000000000',
|
|
|
|
plaintext => '00000000000000000000000000000000',
|
|
|
|
adata => '',
|
|
|
|
iv => '000000000000000000000000',
|
|
|
|
ciphertext => '0388dace60b6a392f328c2b971b2fe78',
|
|
|
|
tag => 'ab6e47d42cec13bdf53a67b21257bddf',
|
|
|
|
},
|
2018-03-22 15:54:03 +01:00
|
|
|
|
2018-03-22 15:51:09 +01:00
|
|
|
#/* test case #3 */
|
|
|
|
{
|
|
|
|
key => 'feffe9928665731c6d6a8f9467308308',
|
|
|
|
plaintext => 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255',
|
|
|
|
adata => '',
|
|
|
|
iv => 'cafebabefacedbaddecaf888',
|
|
|
|
ciphertext => '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985',
|
|
|
|
tag => '4d5c2af327cd64a62cf35abd2ba6fab4',
|
|
|
|
},
|
2018-03-22 15:54:03 +01:00
|
|
|
|
2018-03-22 15:51:09 +01:00
|
|
|
#/* test case #4 */
|
|
|
|
{
|
|
|
|
key => 'feffe9928665731c6d6a8f9467308308',
|
|
|
|
plaintext => 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39',
|
|
|
|
adata => 'feedfacedeadbeeffeedfacedeadbeefabaddad2',
|
|
|
|
iv => 'cafebabefacedbaddecaf888',
|
|
|
|
ciphertext => '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091',
|
|
|
|
tag => '5bc94fbc3221a5db94fae95ae7121a47',
|
|
|
|
},
|
2018-03-22 15:54:03 +01:00
|
|
|
|
2018-03-22 15:51:09 +01:00
|
|
|
#/* test case #5 */
|
|
|
|
{
|
|
|
|
key => 'feffe9928665731c6d6a8f9467308308',
|
|
|
|
plaintext => 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39',
|
|
|
|
adata => 'feedfacedeadbeeffeedfacedeadbeefabaddad2',
|
|
|
|
iv => 'cafebabefacedbad',
|
|
|
|
ciphertext => '61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598',
|
|
|
|
tag => '3612d2e79e3b0785561be14aaca2fccb',
|
|
|
|
},
|
2018-03-22 15:54:03 +01:00
|
|
|
|
2018-03-22 15:51:09 +01:00
|
|
|
#/* test case #6 */
|
|
|
|
{
|
|
|
|
key => 'feffe9928665731c6d6a8f9467308308',
|
|
|
|
plaintext => 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39',
|
|
|
|
adata => 'feedfacedeadbeeffeedfacedeadbeefabaddad2',
|
|
|
|
iv => '9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b',
|
|
|
|
ciphertext => '8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5',
|
|
|
|
tag => '619cc5aefffe0bfa462af43c1699d050',
|
|
|
|
},
|
2018-03-22 15:54:03 +01:00
|
|
|
|
2018-03-22 15:51:09 +01:00
|
|
|
#/* test case #46 from BG (catches the LTC bug of v1.15) */
|
|
|
|
{
|
|
|
|
key => '00000000000000000000000000000000',
|
|
|
|
plaintext => 'a2aab3ad8b17acdda288426cd7c429b7ca86b7aca05809c70ce82db25711cb5302eb2743b036f3d750d6cf0dc0acb92950d546db308f93b4ff244afa9dc72bcd758d2c',
|
|
|
|
adata => '688e1aa984de926dc7b4c47f44',
|
|
|
|
iv => 'b72138b5a05ff5070e8cd94183f761d8',
|
|
|
|
ciphertext => 'cbc8d2f15481a4cc7dd1e19aaa83de5678483ec359ae7dec2ab8d534e0906f4b4663faff58a8b2d733b845eef7c9b331e9e10eb2612c995feb1ac15a6286cce8b297a8',
|
|
|
|
tag => '8d2d2a9372626f6bee8580276a6366bf',
|
|
|
|
}
|
2018-03-22 15:54:03 +01:00
|
|
|
);
|