Codebase list libcryptx-perl / fresh-snapshots/main t / auth_enc_gcm_test_vector_ltc.t
fresh-snapshots/main

Tree @fresh-snapshots/main (Download .tar.gz)

auth_enc_gcm_test_vector_ltc.t @fresh-snapshots/mainraw · history · blame

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 = @_;

  my $key = pack("H*", $a{key});
  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});

  # 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");

}

do_test(%$_) for (
  #/* test case #1 */
  # XXX-FIXME this test fails!!!!
  # {
     # key => '00000000000000000000000000000000',
     # plaintext => '',
     # adata => '',
     # iv => '000000000000000000000000',
     # ciphertext => '',
     # tag => '58e2fccefa7e3061367f1d57a4e7455a',
  # },

  #/* test case #2 */
  {
     key => '00000000000000000000000000000000',
     plaintext => '00000000000000000000000000000000',
     adata => '',
     iv => '000000000000000000000000',
     ciphertext => '0388dace60b6a392f328c2b971b2fe78',
     tag => 'ab6e47d42cec13bdf53a67b21257bddf',
  },

  #/* test case #3 */
  {
     key => 'feffe9928665731c6d6a8f9467308308',
     plaintext => 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255',
     adata => '',
     iv => 'cafebabefacedbaddecaf888',
     ciphertext => '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985',
     tag => '4d5c2af327cd64a62cf35abd2ba6fab4',
  },

  #/* test case #4 */
  {
     key => 'feffe9928665731c6d6a8f9467308308',
     plaintext => 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39',
     adata => 'feedfacedeadbeeffeedfacedeadbeefabaddad2',
     iv => 'cafebabefacedbaddecaf888',
     ciphertext => '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091',
     tag => '5bc94fbc3221a5db94fae95ae7121a47',
  },

  #/* test case #5 */
  {
     key => 'feffe9928665731c6d6a8f9467308308',
     plaintext => 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39',
     adata => 'feedfacedeadbeeffeedfacedeadbeefabaddad2',
     iv => 'cafebabefacedbad',
     ciphertext => '61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598',
     tag => '3612d2e79e3b0785561be14aaca2fccb',
  },

  #/* test case #6 */
  {
     key => 'feffe9928665731c6d6a8f9467308308',
     plaintext => 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39',
     adata => 'feedfacedeadbeeffeedfacedeadbeefabaddad2',
     iv => '9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b',
     ciphertext => '8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5',
     tag => '619cc5aefffe0bfa462af43c1699d050',
  },

  #/* test case #46 from BG (catches the LTC bug of v1.15) */
  {
     key => '00000000000000000000000000000000',
     plaintext => 'a2aab3ad8b17acdda288426cd7c429b7ca86b7aca05809c70ce82db25711cb5302eb2743b036f3d750d6cf0dc0acb92950d546db308f93b4ff244afa9dc72bcd758d2c',
     adata => '688e1aa984de926dc7b4c47f44',
     iv => 'b72138b5a05ff5070e8cd94183f761d8',
     ciphertext => 'cbc8d2f15481a4cc7dd1e19aaa83de5678483ec359ae7dec2ab8d534e0906f4b4663faff58a8b2d733b845eef7c9b331e9e10eb2612c995feb1ac15a6286cce8b297a8',
     tag => '8d2d2a9372626f6bee8580276a6366bf',
  }
);