Blame lib/Net/DNS/RR/TKEY.pm

Packit e6c8bb
package Net::DNS::RR::TKEY;
Packit e6c8bb
Packit e6c8bb
#
Packit e6c8bb
# $Id: TKEY.pm 1528 2017-01-18 21:44:58Z willem $
Packit e6c8bb
#
Packit e6c8bb
our $VERSION = (qw$LastChangedRevision: 1528 $)[1];
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
use strict;
Packit e6c8bb
use warnings;
Packit e6c8bb
use base qw(Net::DNS::RR);
Packit e6c8bb
Packit e6c8bb
=head1 NAME
Packit e6c8bb
Packit e6c8bb
Net::DNS::RR::TKEY - DNS TKEY resource record
Packit e6c8bb
Packit e6c8bb
=cut
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
use integer;
Packit e6c8bb
Packit e6c8bb
use Carp;
Packit e6c8bb
Packit e6c8bb
use Net::DNS::Parameters;
Packit e6c8bb
use Net::DNS::DomainName;
Packit e6c8bb
Packit e6c8bb
use constant ANY  => classbyname qw(ANY);
Packit e6c8bb
use constant TKEY => typebyname qw(TKEY);
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub _decode_rdata {			## decode rdata from wire-format octet string
Packit e6c8bb
	my $self = shift;
Packit e6c8bb
	my ( $data, $offset ) = @_;
Packit e6c8bb
Packit e6c8bb
	my $limit = $offset + $self->{rdlength};
Packit e6c8bb
Packit e6c8bb
	( $self->{algorithm}, $offset ) = decode Net::DNS::DomainName(@_);
Packit e6c8bb
Packit e6c8bb
	@{$self}{qw(inception expiration mode error)} = unpack "\@$offset N2n2", $$data;
Packit e6c8bb
	$offset += 12;
Packit e6c8bb
Packit e6c8bb
	my $key_size = unpack "\@$offset n", $$data;
Packit e6c8bb
	$self->{key} = substr $$data, $offset + 2, $key_size;
Packit e6c8bb
	$offset += $key_size + 2;
Packit e6c8bb
Packit e6c8bb
	my $other_size = unpack "\@$offset n", $$data;
Packit e6c8bb
	$self->{other} = substr $$data, $offset + 2, $other_size;
Packit e6c8bb
	$offset += $other_size + 2;
Packit e6c8bb
Packit e6c8bb
	croak('corrupt TKEY data') unless $offset == $limit;	# more or less FUBAR
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub _encode_rdata {			## encode rdata as wire-format octet string
Packit e6c8bb
	my $self = shift;
Packit e6c8bb
Packit e6c8bb
	return '' unless defined $self->{algorithm};
Packit e6c8bb
	my $rdata = $self->{algorithm}->encode;
Packit e6c8bb
Packit e6c8bb
	$rdata .= pack 'N2n2', $self->inception, $self->expiration, $self->mode, $self->error;
Packit e6c8bb
Packit e6c8bb
	my $key = $self->key;					# RFC2930(2.7)
Packit e6c8bb
	$rdata .= pack 'na*', length $key, $key;
Packit e6c8bb
Packit e6c8bb
	my $other = $self->other;				# RFC2930(2.8)
Packit e6c8bb
	$rdata .= pack 'na*', length $other, $other;
Packit e6c8bb
	return $rdata;
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub class {				## overide RR method
Packit e6c8bb
	return 'ANY';
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
sub encode {				## overide RR method
Packit e6c8bb
	my $self = shift;
Packit e6c8bb
Packit e6c8bb
	my $owner = $self->{owner}->encode();
Packit e6c8bb
	my $rdata = eval { $self->_encode_rdata() } || '';
Packit e6c8bb
	return pack 'a* n2 N n a*', $owner, TKEY, ANY, 0, length $rdata, $rdata;
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub algorithm {
Packit e6c8bb
	my $self = shift;
Packit e6c8bb
Packit e6c8bb
	$self->{algorithm} = new Net::DNS::DomainName(shift) if scalar @_;
Packit e6c8bb
	$self->{algorithm}->name if $self->{algorithm};
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub inception {
Packit e6c8bb
	my $self = shift;
Packit e6c8bb
Packit e6c8bb
	$self->{inception} = 0 + shift if scalar @_;
Packit e6c8bb
	$self->{inception} || 0;
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub expiration {
Packit e6c8bb
	my $self = shift;
Packit e6c8bb
Packit e6c8bb
	$self->{expiration} = 0 + shift if scalar @_;
Packit e6c8bb
	$self->{expiration} || 0;
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub mode {
Packit e6c8bb
	my $self = shift;
Packit e6c8bb
Packit e6c8bb
	$self->{mode} = 0 + shift if scalar @_;
Packit e6c8bb
	$self->{mode} || 0;
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub error {
Packit e6c8bb
	my $self = shift;
Packit e6c8bb
Packit e6c8bb
	$self->{error} = 0 + shift if scalar @_;
Packit e6c8bb
	$self->{error} || 0;
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub key {
Packit e6c8bb
	my $self = shift;
Packit e6c8bb
Packit e6c8bb
	$self->{key} = shift if scalar @_;
Packit e6c8bb
	$self->{key} || "";
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub other {
Packit e6c8bb
	my $self = shift;
Packit e6c8bb
Packit e6c8bb
	$self->{other} = shift if scalar @_;
Packit e6c8bb
	$self->{other} || "";
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub other_data { &other; }					# uncoverable pod
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
1;
Packit e6c8bb
__END__
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
=head1 SYNOPSIS
Packit e6c8bb
Packit e6c8bb
    use Net::DNS;
Packit e6c8bb
Packit e6c8bb
=head1 DESCRIPTION
Packit e6c8bb
Packit e6c8bb
Class for DNS TSIG Key (TKEY) resource records.
Packit e6c8bb
Packit e6c8bb
=head1 METHODS
Packit e6c8bb
Packit e6c8bb
The available methods are those inherited from the base class augmented
Packit e6c8bb
by the type-specific methods defined in this package.
Packit e6c8bb
Packit e6c8bb
Use of undocumented package features or direct access to internal data
Packit e6c8bb
structures is discouraged and could result in program termination or
Packit e6c8bb
other unpredictable behaviour.
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
=head2 algorithm
Packit e6c8bb
Packit e6c8bb
    $algorithm = $rr->algorithm;
Packit e6c8bb
    $rr->algorithm( $algorithm );
Packit e6c8bb
Packit e6c8bb
The algorithm name is in the form of a domain name with the same
Packit e6c8bb
meaning as in [RFC 2845].  The algorithm determines how the secret
Packit e6c8bb
keying material agreed to using the TKEY RR is actually used to derive
Packit e6c8bb
the algorithm specific key.
Packit e6c8bb
Packit e6c8bb
=head2 inception
Packit e6c8bb
Packit e6c8bb
    $inception = $rr->inception;
Packit e6c8bb
    $rr->inception( $inception );
Packit e6c8bb
Packit e6c8bb
Time expressed as the number of non-leap seconds modulo 2**32 since the
Packit e6c8bb
beginning of January 1970 GMT.
Packit e6c8bb
Packit e6c8bb
=head2 expiration
Packit e6c8bb
Packit e6c8bb
    $expiration = $rr->expiration;
Packit e6c8bb
    $rr->expiration( $expiration );
Packit e6c8bb
Packit e6c8bb
Time expressed as the number of non-leap seconds modulo 2**32 since the
Packit e6c8bb
beginning of January 1970 GMT.
Packit e6c8bb
Packit e6c8bb
=head2 mode
Packit e6c8bb
Packit e6c8bb
    $mode = $rr->mode;
Packit e6c8bb
    $rr->mode( $mode );
Packit e6c8bb
Packit e6c8bb
The mode field specifies the general scheme for key agreement or the
Packit e6c8bb
purpose of the TKEY DNS message, as defined in [RFC2930(2.5)].
Packit e6c8bb
Packit e6c8bb
=head2 error
Packit e6c8bb
Packit e6c8bb
    $error = $rr->error;
Packit e6c8bb
    $rr->error( $error );
Packit e6c8bb
Packit e6c8bb
The error code field is an extended RCODE.
Packit e6c8bb
Packit e6c8bb
=head2 key
Packit e6c8bb
Packit e6c8bb
    $key = $rr->key;
Packit e6c8bb
    $rr->key( $key );
Packit e6c8bb
Packit e6c8bb
Sequence of octets representing the key exchange data.
Packit e6c8bb
The meaning of this data depends on the mode.
Packit e6c8bb
Packit e6c8bb
=head2 other
Packit e6c8bb
Packit e6c8bb
    $other = $rr->other;
Packit e6c8bb
    $rr->other( $other );
Packit e6c8bb
Packit e6c8bb
Content not defined in the [RFC2930] specification but may be used
Packit e6c8bb
in future extensions.
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
=head1 COPYRIGHT
Packit e6c8bb
Packit e6c8bb
Copyright (c)2000 Andrew Tridgell. 
Packit e6c8bb
Packit e6c8bb
All rights reserved.
Packit e6c8bb
Packit e6c8bb
Package template (c)2009,2012 O.M.Kolkman and R.W.Franks.
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
=head1 LICENSE
Packit e6c8bb
Packit e6c8bb
Permission to use, copy, modify, and distribute this software and its
Packit e6c8bb
documentation for any purpose and without fee is hereby granted, provided
Packit e6c8bb
that the above copyright notice appear in all copies and that both that
Packit e6c8bb
copyright notice and this permission notice appear in supporting
Packit e6c8bb
documentation, and that the name of the author not be used in advertising
Packit e6c8bb
or publicity pertaining to distribution of the software without specific
Packit e6c8bb
prior written permission.
Packit e6c8bb
Packit e6c8bb
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit e6c8bb
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit e6c8bb
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
Packit e6c8bb
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Packit e6c8bb
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
Packit e6c8bb
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
Packit e6c8bb
DEALINGS IN THE SOFTWARE.
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
=head1 SEE ALSO
Packit e6c8bb
Packit e6c8bb
L<perl>, L<Net::DNS>, L<Net::DNS::RR>, RFC2930
Packit e6c8bb
Packit e6c8bb
=cut