The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More qw(no_plan);
use strict;
use warnings;

use Crypt::GCM;
use Crypt::Rijndael;

my @TESTS = (
    [ '00000000000000000000000000000000', # key
      '00000000000000000000000000000000', # plain
      '',                                 # aad
      '000000000000000000000000',         # iv
      '0388dace60b6a392f328c2b971b2fe78', # cipher
      'ab6e47d42cec13bdf53a67b21257bddf', # tag
    ],
    [ 'feffe9928665731c6d6a8f9467308308',
      'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255',
      '',
      'cafebabefacedbaddecaf888',
      '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985',
      '4d5c2af327cd64a62cf35abd2ba6fab4',
    ],
    ['feffe9928665731c6d6a8f9467308308',
     'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39',
     'feedfacedeadbeeffeedfacedeadbeefabaddad2',
     'cafebabefacedbaddecaf888',
     '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091',
     '5bc94fbc3221a5db94fae95ae7121a47',
    ],
    [ 'feffe9928665731c6d6a8f9467308308',
      'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39',
      'feedfacedeadbeeffeedfacedeadbeefabaddad2',
      'cafebabefacedbad',
      '61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598',
      '3612d2e79e3b0785561be14aaca2fccb',
    ],
    [ 'feffe9928665731c6d6a8f9467308308',
      'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39',
      'feedfacedeadbeeffeedfacedeadbeefabaddad2',
      '9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b',
      '8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5',
      '619cc5aefffe0bfa462af43c1699d050',
    ],
);


for my $t (@TESTS) {
    my $gcm = Crypt::GCM->new(
        -key => pack('H*', $t->[0]),
        -cipher => 'Crypt::Rijndael',
    );
    ok($gcm);
    $gcm->set_iv(pack 'H*', $t->[3]);
    $gcm->aad(pack 'H*', $t->[2]);
    my $ct = $gcm->encrypt(pack 'H*', $t->[1]);
    ok($ct eq pack('H*', $t->[4]));
    ok($gcm->tag() eq pack 'H*', $t->[5]);
}