Blame t/05-TSIG.t

Packit Service f6e53a
# $Id: 05-TSIG.t 1561 2017-04-19 13:08:13Z willem $	-*-perl-*-
Packit Service f6e53a
#
Packit Service f6e53a
Packit Service f6e53a
use strict;
Packit Service f6e53a
use Test::More;
Packit Service f6e53a
use Net::DNS;
Packit Service f6e53a
Packit Service f6e53a
my @prerequisite = qw(
Packit Service f6e53a
		Digest::HMAC
Packit Service f6e53a
		Digest::MD5
Packit Service f6e53a
		Digest::SHA
Packit Service f6e53a
		MIME::Base64
Packit Service f6e53a
		);
Packit Service f6e53a
Packit Service f6e53a
foreach my $package (@prerequisite) {
Packit Service f6e53a
	next if eval "use $package; 1;";
Packit Service f6e53a
	plan skip_all => "$package not installed";
Packit Service f6e53a
	exit;
Packit Service f6e53a
}
Packit Service f6e53a
Packit Service f6e53a
plan tests => 68;
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
sub mysign {
Packit Service f6e53a
	my ( $key, $data ) = @_;
Packit Service f6e53a
	my $hmac = new Digest::HMAC( $key, 'Digest::MD5' );
Packit Service f6e53a
	$hmac->add($data);
Packit Service f6e53a
	return $hmac->digest;
Packit Service f6e53a
}
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
my $name = '123456789-test';
Packit Service f6e53a
my $type = 'TSIG';
Packit Service f6e53a
my $code = 250;
Packit Service f6e53a
my @attr = qw(	algorithm	time_signed	fudge	sig_function );
Packit Service f6e53a
my @data = ( qw( fake.alg	100001		600 ), \&mysign );
Packit Service f6e53a
my @also = qw( mac prior_mac request_mac error sign_func other_data _size );
Packit Service f6e53a
Packit Service f6e53a
my $wire = '0466616b6503616c67000000000186a102580010a5d31d3ce3b7122b4a598c225d9c3f2a04d200000000';
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
my $hash = {};
Packit Service f6e53a
@{$hash}{@attr} = @data;
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
{
Packit Service f6e53a
	my $typecode = unpack 'xn', new Net::DNS::RR(". $type")->encode;
Packit Service f6e53a
	is( $typecode, $code, "$type RR type code = $code" );
Packit Service f6e53a
Packit Service f6e53a
	my $rr = new Net::DNS::RR(
Packit Service f6e53a
		name => $name,
Packit Service f6e53a
		type => $type,
Packit Service f6e53a
		%$hash,
Packit Service f6e53a
		keybin => pack( 'H*', '66616b65206b6579' ),
Packit Service f6e53a
		);
Packit Service f6e53a
Packit Service f6e53a
	my $string = $rr->string;
Packit Service f6e53a
	like( $rr->string, "/$$hash{algorithm}/", 'got expected rr->string' );
Packit Service f6e53a
Packit Service f6e53a
	foreach (@attr) {
Packit Service f6e53a
		is( $rr->$_, $hash->{$_}, "expected result from rr->$_()" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	foreach (@also) {
Packit Service f6e53a
		ok( defined $rr->$_, "additional attribute rr->$_()" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
	my $null   = new Net::DNS::RR("$name NULL")->encode;
Packit Service f6e53a
	my $empty  = new Net::DNS::RR("$name $type")->encode;
Packit Service f6e53a
	my $buffer = $empty;		## Note: TSIG RR gets destroyed by decoder
Packit Service f6e53a
	my $rxbin  = decode Net::DNS::RR( \$buffer )->encode;
Packit Service f6e53a
	my $packet = Net::DNS::Packet->new( $name, 'TKEY', 'IN' );
Packit Service f6e53a
	$packet->header->id(1234);				# fix packet id
Packit Service f6e53a
	$packet->header->rd(1);
Packit Service f6e53a
	my $encoded = $buffer = $rr->encode( 0, {}, $packet );
Packit Service f6e53a
	my $decoded = decode Net::DNS::RR( \$buffer );
Packit Service f6e53a
	my $hex1 = unpack 'H*', $encoded;
Packit Service f6e53a
	my $hex2 = unpack 'H*', $decoded->encode;
Packit Service f6e53a
	my $hex3 = unpack 'H*', substr( $encoded, length $null );
Packit Service f6e53a
	is( $hex2,	    $hex1,	   'encode/decode transparent' );
Packit Service f6e53a
	is( $hex3,	    $wire,	   'encoded RDATA matches example' );
Packit Service f6e53a
	is( length($empty), length($null), 'encoded RDATA can be empty' );
Packit Service f6e53a
	is( length($rxbin), length($null), 'decoded RDATA can be empty' );
Packit Service f6e53a
Packit Service f6e53a
	my @wire = unpack 'C*', $encoded;
Packit Service f6e53a
	my $wireformat = pack 'C*', @wire, 0;
Packit Service f6e53a
	eval { decode Net::DNS::RR( \$wireformat ); };
Packit Service f6e53a
	my $exception = $1 if $@ =~ /^(.+)\n/;
Packit Service f6e53a
	ok( $exception ||= '', "misplaced SIG RR\t[$exception]" );
Packit Service f6e53a
}
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
{
Packit Service f6e53a
	my $rr = new Net::DNS::RR( type => 'TSIG', key => '' );
Packit Service f6e53a
	ok( !$rr->verify(),	'verify fails on empty TSIG' );
Packit Service f6e53a
	ok( $rr->vrfyerrstr(),	'vrfyerrstr() reports failure' );
Packit Service f6e53a
	ok( !$rr->other(),	'other undefined' );
Packit Service f6e53a
	ok( $rr->time_signed(), 'time_signed() defined' );
Packit Service f6e53a
	my $key = eval { $rr->key(); };
Packit Service f6e53a
	my $exception = $1 if $@ =~ /^(.+)\n/;
Packit Service f6e53a
	ok( $exception ||= '', "write-only key attribute\t[$exception]" );
Packit Service f6e53a
}
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
{
Packit Service f6e53a
	my $correct = '123456789ABCDEF';
Packit Service f6e53a
	my $corrupt = '123456789XBCDEF';
Packit Service f6e53a
	foreach my $method (qw(mac request_mac prior_mac)) {
Packit Service f6e53a
		my $rr = new Net::DNS::RR( type => 'TSIG', $method => $correct );
Packit Service f6e53a
		ok( $rr->$method($correct), "correct hex $method" );
Packit Service f6e53a
		eval { $rr->$method($corrupt); };
Packit Service f6e53a
		my $exception = $1 if $@ =~ /^(.+)\n/;
Packit Service f6e53a
		ok( $exception ||= '', "corrupt hex $method\t[$exception]" );
Packit Service f6e53a
	}
Packit Service f6e53a
}
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
{
Packit Service f6e53a
	# Check default signing function using test cases from RFC2202, section 2.
Packit Service f6e53a
Packit Service f6e53a
	my $tsig      = new Net::DNS::RR( type => 'TSIG', fudge => 300 );
Packit Service f6e53a
	my $function  = $tsig->sig_function;			# default signing function
Packit Service f6e53a
	my $algorithm = $tsig->algorithm;			# default algorithm
Packit Service f6e53a
Packit Service f6e53a
	is( $algorithm, 'HMAC-MD5.SIG-ALG.REG.INT', 'Check algorithm correctly identified' );
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = pack 'H*', '4869205468657265';
Packit Service f6e53a
		my $key	   = "\x0b" x 16;
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '9294727a3638bb1c13f48ef8158bfc9d';
Packit Service f6e53a
		is( $result, $expect, "Check signing function for $algorithm" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', '7768617420646f2079612077616e7420666f72206e6f7468696e673f';
Packit Service f6e53a
		my $key	 = pack 'H*', '4a656665';
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '750c783e6ab0b503eaa86e310a5db738';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key shorter than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xdd" x 50;
Packit Service f6e53a
		my $key	   = "\xaa" x 16;
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '56be34521d144c88dbb8c733f0e8b3f6';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with data longer than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xcd" x 50;
Packit Service f6e53a
		my $key	   = pack 'H*', '0102030405060708090a0b0c0d0e0f10111213141516171819';
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '697eaf0aca3a3aea3a75164746ffaa79';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key and data longer than hash" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54657374205573696e67204c61726765
Packit Service f6e53a
				72205468616e20426c6f636b2d53697a
Packit Service f6e53a
				65204b6579202d2048617368204b6579
Packit Service f6e53a
				204669727374 );
Packit Service f6e53a
		my $key	   = "\xaa" x 80;
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key longer than block size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54657374205573696e67204c61726765
Packit Service f6e53a
				72205468616e20426c6f636b2d53697a
Packit Service f6e53a
				65204b657920616e64204c6172676572
Packit Service f6e53a
				205468616e204f6e6520426c6f636b2d
Packit Service f6e53a
				53697a652044617461 );
Packit Service f6e53a
		my $key	   = "\xaa" x 80;
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '6f630fad67cda0ee1fb1f562db3aa53e';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with both long key and long data" );
Packit Service f6e53a
	}
Packit Service f6e53a
}
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
{
Packit Service f6e53a
	# Check HMAC-SHA1 signing function using test cases from RFC2202, section 3.
Packit Service f6e53a
Packit Service f6e53a
	my $tsig      = new Net::DNS::RR( type => 'TSIG', algorithm => 'HMAC-SHA' );	# alias HMAC-SHA1
Packit Service f6e53a
	my $algorithm = $tsig->algorithm;
Packit Service f6e53a
	my $function  = $tsig->sig_function;
Packit Service f6e53a
Packit Service f6e53a
	is( $algorithm, 'HMAC-SHA1', 'Check algorithm correctly identified' );
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = pack 'H*', '4869205468657265';
Packit Service f6e53a
		my $key	   = "\x0b" x 20;
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = 'b617318655057264e28bc0b6fb378c8ef146be00';
Packit Service f6e53a
		is( $result, $expect, "Check signing function for $algorithm" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', '7768617420646f2079612077616e7420666f72206e6f7468696e673f';
Packit Service f6e53a
		my $key	 = pack 'H*', '4a656665';
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = 'effcdf6ae5eb2fa2d27416d5f184df9c259a7c79';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key shorter than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xdd" x 50;
Packit Service f6e53a
		my $key	   = "\xaa" x 20;
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '125d7342b9ac11cd91a39af48aa17b4f63f175d3';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with data longer than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xcd" x 50;
Packit Service f6e53a
		my $key	   = pack 'H*', '0102030405060708090a0b0c0d0e0f10111213141516171819';
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '4c9007f4026250c6bc8414f9bf50c86c2d7235da';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key and data longer than hash" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54657374205573696e67204c61726765
Packit Service f6e53a
				72205468616e20426c6f636b2d53697a
Packit Service f6e53a
				65204b6579202d2048617368204b6579
Packit Service f6e53a
				204669727374 );
Packit Service f6e53a
		my $key	   = "\xaa" x 80;
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = 'aa4ae5e15272d00e95705637ce8a3b55ed402112';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key longer than block size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54657374205573696e67204c61726765
Packit Service f6e53a
				72205468616e20426c6f636b2d53697a
Packit Service f6e53a
				65204b657920616e64204c6172676572
Packit Service f6e53a
				205468616e204f6e6520426c6f636b2d
Packit Service f6e53a
				53697a652044617461 );
Packit Service f6e53a
		my $key	   = "\xaa" x 80;
Packit Service f6e53a
		my $result = lc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = 'e8e99d0f45237d786d6bbaa7965c7808bbff1a91';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with both long key and long data" );
Packit Service f6e53a
	}
Packit Service f6e53a
}
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
{
Packit Service f6e53a
	# Check HMAC-SHA224 signing function using test cases from RFC4634, section 8.4.
Packit Service f6e53a
Packit Service f6e53a
	my $tsig      = new Net::DNS::RR( type => 'TSIG', algorithm => 162 );	 # alias HMAC-SHA224
Packit Service f6e53a
	my $algorithm = $tsig->algorithm;
Packit Service f6e53a
	my $function  = $tsig->sig_function;
Packit Service f6e53a
Packit Service f6e53a
	is( $algorithm, 'HMAC-SHA224', 'Check algorithm correctly identified' );
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = pack 'H*', '4869205468657265';
Packit Service f6e53a
		my $key	   = "\x0b" x 20;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '896FB1128ABBDF196832107CD49DF33F47B4B1169912BA4F53684B22';
Packit Service f6e53a
		is( $result, $expect, "Check signing function for $algorithm" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', '7768617420646f2079612077616e7420666f72206e6f7468696e673f';
Packit Service f6e53a
		my $key	 = pack 'H*', '4a656665';
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = 'A30E01098BC6DBBF45690F3A7E9E6D0F8BBEA2A39E6148008FD05E44';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key shorter than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xdd" x 50;
Packit Service f6e53a
		my $key	   = "\xaa" x 20;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '7FB3CB3588C6C1F6FFA9694D7D6AD2649365B0C1F65D69D1EC8333EA';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with data longer than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xcd" x 50;
Packit Service f6e53a
		my $key	   = pack 'H*', '0102030405060708090a0b0c0d0e0f10111213141516171819';
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '6C11506874013CAC6A2ABC1BB382627CEC6A90D86EFC012DE7AFEC5A';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key and data longer than hash" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54657374205573696e67204c61726765
Packit Service f6e53a
				72205468616e20426c6f636b2d53697a
Packit Service f6e53a
				65204b6579202d2048617368204b6579
Packit Service f6e53a
				204669727374 );
Packit Service f6e53a
		my $key	   = "\xaa" x 131;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '95E9A0DB962095ADAEBE9B2D6F0DBCE2D499F112F2D2B7273FA6870E';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key longer than block size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54686973206973206120746573742075
Packit Service f6e53a
				73696e672061206c6172676572207468
Packit Service f6e53a
				616e20626c6f636b2d73697a65206b65
Packit Service f6e53a
				7920616e642061206c61726765722074
Packit Service f6e53a
				68616e20626c6f636b2d73697a652064
Packit Service f6e53a
				6174612e20546865206b6579206e6565
Packit Service f6e53a
				647320746f2062652068617368656420
Packit Service f6e53a
				6265666f7265206265696e6720757365
Packit Service f6e53a
				642062792074686520484d414320616c
Packit Service f6e53a
				676f726974686d2e );
Packit Service f6e53a
		my $key	   = "\xaa" x 131;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '3A854166AC5D9F023F54D517D0B39DBD946770DB9C2B95C9F6F565D1';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with both long key and long data" );
Packit Service f6e53a
	}
Packit Service f6e53a
}
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
{
Packit Service f6e53a
	# Check HMAC-SHA256 signing function using test cases from RFC4634, section 8.4.
Packit Service f6e53a
Packit Service f6e53a
	my $tsig      = new Net::DNS::RR( type => 'TSIG', algorithm => 'HMAC-SHA256' );
Packit Service f6e53a
	my $algorithm = $tsig->algorithm;
Packit Service f6e53a
	my $function  = $tsig->sig_function;
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = pack 'H*', '4869205468657265';
Packit Service f6e53a
		my $key	   = "\x0b" x 20;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = 'B0344C61D8DB38535CA8AFCEAF0BF12B881DC200C9833DA726E9376C2E32CFF7';
Packit Service f6e53a
		is( $result, $expect, "Check signing function for $algorithm" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', '7768617420646f2079612077616e7420666f72206e6f7468696e673f';
Packit Service f6e53a
		my $key	 = pack 'H*', '4a656665';
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '5BDCC146BF60754E6A042426089575C75A003F089D2739839DEC58B964EC3843';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key shorter than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xdd" x 50;
Packit Service f6e53a
		my $key	   = "\xaa" x 20;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '773EA91E36800E46854DB8EBD09181A72959098B3EF8C122D9635514CED565FE';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with data longer than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xcd" x 50;
Packit Service f6e53a
		my $key	   = pack 'H*', '0102030405060708090a0b0c0d0e0f10111213141516171819';
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '82558A389A443C0EA4CC819899F2083A85F0FAA3E578F8077A2E3FF46729665B';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key and data longer than hash" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54657374205573696e67204c61726765
Packit Service f6e53a
				72205468616e20426c6f636b2d53697a
Packit Service f6e53a
				65204b6579202d2048617368204b6579
Packit Service f6e53a
				204669727374 );
Packit Service f6e53a
		my $key	   = "\xaa" x 131;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '60E431591EE0B67F0D8A26AACBF5B77F8E0BC6213728C5140546040F0EE37F54';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key longer than block size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54686973206973206120746573742075
Packit Service f6e53a
				73696e672061206c6172676572207468
Packit Service f6e53a
				616e20626c6f636b2d73697a65206b65
Packit Service f6e53a
				7920616e642061206c61726765722074
Packit Service f6e53a
				68616e20626c6f636b2d73697a652064
Packit Service f6e53a
				6174612e20546865206b6579206e6565
Packit Service f6e53a
				647320746f2062652068617368656420
Packit Service f6e53a
				6265666f7265206265696e6720757365
Packit Service f6e53a
				642062792074686520484d414320616c
Packit Service f6e53a
				676f726974686d2e );
Packit Service f6e53a
		my $key	   = "\xaa" x 131;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = '9B09FFA71B942FCB27635FBCD5B0E944BFDC63644F0713938A7F51535C3A35E2';
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with both long key and long data" );
Packit Service f6e53a
	}
Packit Service f6e53a
}
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
{
Packit Service f6e53a
	# Check HMAC-SHA384 signing function using test cases from RFC4634, section 8.4.
Packit Service f6e53a
Packit Service f6e53a
	my $tsig      = new Net::DNS::RR( type => 'TSIG', algorithm => 'HMAC-SHA384' );
Packit Service f6e53a
	my $algorithm = $tsig->algorithm;
Packit Service f6e53a
	my $function  = $tsig->sig_function;
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = pack 'H*', '4869205468657265';
Packit Service f6e53a
		my $key	   = "\x0b" x 20;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				AFD03944D84895626B0825F4AB46907F
Packit Service f6e53a
				15F9DADBE4101EC682AA034C7CEBC59C
Packit Service f6e53a
				FAEA9EA9076EDE7F4AF152E8B2FA9CB6 );
Packit Service f6e53a
		is( $result, $expect, "Check signing function for $algorithm" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', '7768617420646f2079612077616e7420666f72206e6f7468696e673f';
Packit Service f6e53a
		my $key	 = pack 'H*', '4a656665';
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				AF45D2E376484031617F78D2B58A6B1B
Packit Service f6e53a
				9C7EF464F5A01B47E42EC3736322445E
Packit Service f6e53a
				8E2240CA5E69E2C78B3239ECFAB21649 );
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key shorter than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xdd" x 50;
Packit Service f6e53a
		my $key	   = "\xaa" x 20;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				88062608D3E6AD8A0AA2ACE014C8A86F
Packit Service f6e53a
				0AA635D947AC9FEBE83EF4E55966144B
Packit Service f6e53a
				2A5AB39DC13814B94E3AB6E101A34F27 );
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with data longer than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xcd" x 50;
Packit Service f6e53a
		my $key	   = pack 'H*', '0102030405060708090a0b0c0d0e0f10111213141516171819';
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				3E8A69B7783C25851933AB6290AF6CA7
Packit Service f6e53a
				7A9981480850009CC5577C6E1F573B4E
Packit Service f6e53a
				6801DD23C4A7D679CCF8A386C674CFFB );
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key and data longer than hash" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54657374205573696e67204c61726765
Packit Service f6e53a
				72205468616e20426c6f636b2d53697a
Packit Service f6e53a
				65204b6579202d2048617368204b6579
Packit Service f6e53a
				204669727374 );
Packit Service f6e53a
		my $key	   = "\xaa" x 131;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				4ECE084485813E9088D2C63A041BC5B4
Packit Service f6e53a
				4F9EF1012A2B588F3CD11F05033AC4C6
Packit Service f6e53a
				0C2EF6AB4030FE8296248DF163F44952 );
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key longer than block size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54686973206973206120746573742075
Packit Service f6e53a
				73696e672061206c6172676572207468
Packit Service f6e53a
				616e20626c6f636b2d73697a65206b65
Packit Service f6e53a
				7920616e642061206c61726765722074
Packit Service f6e53a
				68616e20626c6f636b2d73697a652064
Packit Service f6e53a
				6174612e20546865206b6579206e6565
Packit Service f6e53a
				647320746f2062652068617368656420
Packit Service f6e53a
				6265666f7265206265696e6720757365
Packit Service f6e53a
				642062792074686520484d414320616c
Packit Service f6e53a
				676f726974686d2e );
Packit Service f6e53a
		my $key	   = "\xaa" x 131;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				6617178E941F020D351E2F254E8FD32C
Packit Service f6e53a
				602420FEB0B8FB9ADCCEBB82461E99C5
Packit Service f6e53a
				A678CC31E799176D3860E6110C46523E );
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with both long key and long data" );
Packit Service f6e53a
	}
Packit Service f6e53a
}
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
{
Packit Service f6e53a
	# Check HMAC-SHA512 signing function using test cases from RFC4634, section 8.4.
Packit Service f6e53a
Packit Service f6e53a
	my $tsig      = new Net::DNS::RR( type => 'TSIG', algorithm => 'HMAC-SHA512' );
Packit Service f6e53a
	my $algorithm = $tsig->algorithm;
Packit Service f6e53a
	my $function  = $tsig->sig_function;
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = pack 'H*', '4869205468657265';
Packit Service f6e53a
		my $key	   = "\x0b" x 20;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				87AA7CDEA5EF619D4FF0B4241A1D6CB0
Packit Service f6e53a
				2379F4E2CE4EC2787AD0B30545E17CDE
Packit Service f6e53a
				DAA833B7D6B8A702038B274EAEA3F4E4
Packit Service f6e53a
				BE9D914EEB61F1702E696C203A126854 );
Packit Service f6e53a
		is( $result, $expect, "Check signing function for $algorithm" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', '7768617420646f2079612077616e7420666f72206e6f7468696e673f';
Packit Service f6e53a
		my $key	 = pack 'H*', '4a656665';
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				164B7A7BFCF819E2E395FBE73B56E0A3
Packit Service f6e53a
				87BD64222E831FD610270CD7EA250554
Packit Service f6e53a
				9758BF75C05A994A6D034F65F8F0E6FD
Packit Service f6e53a
				CAEAB1A34D4A6B4B636E070A38BCE737 );
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key shorter than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xdd" x 50;
Packit Service f6e53a
		my $key	   = "\xaa" x 20;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				FA73B0089D56A284EFB0F0756C890BE9
Packit Service f6e53a
				B1B5DBDD8EE81A3655F83E33B2279D39
Packit Service f6e53a
				BF3E848279A722C806B485A47E67C807
Packit Service f6e53a
				B946A337BEE8942674278859E13292FB );
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with data longer than hash size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data   = "\xcd" x 50;
Packit Service f6e53a
		my $key	   = pack 'H*', '0102030405060708090a0b0c0d0e0f10111213141516171819';
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				B0BA465637458C6990E5A8C5F61D4AF7
Packit Service f6e53a
				E576D97FF94B872DE76F8050361EE3DB
Packit Service f6e53a
				A91CA5C11AA25EB4D679275CC5788063
Packit Service f6e53a
				A5F19741120C4F2DE2ADEBEB10A298DD );
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key and data longer than hash" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54657374205573696e67204c61726765
Packit Service f6e53a
				72205468616e20426c6f636b2d53697a
Packit Service f6e53a
				65204b6579202d2048617368204b6579
Packit Service f6e53a
				204669727374 );
Packit Service f6e53a
		my $key	   = "\xaa" x 131;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				80B24263C7C1A3EBB71493C1DD7BE8B4
Packit Service f6e53a
				9B46D1F41B4AEEC1121B013783F8F352
Packit Service f6e53a
				6B56D037E05F2598BD0FD2215D6A1E52
Packit Service f6e53a
				95E64F73F63F0AEC8B915A985D786598 );
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with key longer than block size" );
Packit Service f6e53a
	}
Packit Service f6e53a
Packit Service f6e53a
	{
Packit Service f6e53a
		my $data = pack 'H*', join '', qw(
Packit Service f6e53a
				54686973206973206120746573742075
Packit Service f6e53a
				73696e672061206c6172676572207468
Packit Service f6e53a
				616e20626c6f636b2d73697a65206b65
Packit Service f6e53a
				7920616e642061206c61726765722074
Packit Service f6e53a
				68616e20626c6f636b2d73697a652064
Packit Service f6e53a
				6174612e20546865206b6579206e6565
Packit Service f6e53a
				647320746f2062652068617368656420
Packit Service f6e53a
				6265666f7265206265696e6720757365
Packit Service f6e53a
				642062792074686520484d414320616c
Packit Service f6e53a
				676f726974686d2e );
Packit Service f6e53a
		my $key	   = "\xaa" x 131;
Packit Service f6e53a
		my $result = uc unpack( 'H*', &$function( $key, $data ) );
Packit Service f6e53a
		my $expect = join '', qw(
Packit Service f6e53a
				E37B6A775DC87DBAA4DFA9F96E5E3FFD
Packit Service f6e53a
				DEBD71F8867289865DF5A32D20CDC944
Packit Service f6e53a
				B6022CAC3C4982B10D5EEB55C3E4DE15
Packit Service f6e53a
				134676FB6DE0446065C97440FA8C6A58 );
Packit Service f6e53a
		is( $result, $expect, "Check $algorithm with both long key and long data" );
Packit Service f6e53a
	}
Packit Service f6e53a
}
Packit Service f6e53a
Packit Service f6e53a
Packit Service f6e53a
exit;
Packit Service f6e53a
Packit Service f6e53a