File Coverage

blib/lib/Net/DNS/RR/SSHFP.pm
Criterion Covered Total %
statement 57 57 100.0
branch 4 4 100.0
condition 6 6 100.0
subroutine 16 16 100.0
pod 6 6 100.0
total 89 89 100.0


line stmt bran cond sub pod time code
1             package Net::DNS::RR::SSHFP;
2              
3 1     1   7 use strict;
  1         3  
  1         45  
4 1     1   6 use warnings;
  1         2  
  1         106  
5             our $VERSION = (qw$Id: SSHFP.pm 2003 2025-01-21 12:06:06Z willem $)[2];
6              
7 1     1   6 use base qw(Net::DNS::RR);
  1         2  
  1         123  
8              
9              
10             =head1 NAME
11              
12             Net::DNS::RR::SSHFP - DNS SSHFP resource record
13              
14             =cut
15              
16 1     1   7 use integer;
  1         3  
  1         8  
17              
18 1     1   39 use Carp;
  1         2  
  1         137  
19              
20 1     1   7 use constant BABBLE => defined eval { require Digest::BubbleBabble };
  1         2  
  1         2  
  1         567  
21              
22              
23             sub _decode_rdata { ## decode rdata from wire-format octet string
24 1     1   3 my ( $self, $data, $offset ) = @_;
25              
26 1         3 my $size = $self->{rdlength} - 2;
27 1         5 @{$self}{qw(algorithm fptype fpbin)} = unpack "\@$offset C2 a$size", $$data;
  1         4  
28 1         3 return;
29             }
30              
31              
32             sub _encode_rdata { ## encode rdata as wire-format octet string
33 5     5   9 my $self = shift;
34              
35 5         10 return pack 'C2 a*', @{$self}{qw(algorithm fptype fpbin)};
  5         23  
36             }
37              
38              
39             sub _format_rdata { ## format rdata portion of RR string.
40 3     3   4 my $self = shift;
41              
42 3         20 $self->_annotation( $self->babble ) if BABBLE;
43 3         10 my @fprint = split /(\S{64})/, $self->fp;
44 3         9 my @rdata = ( $self->algorithm, $self->fptype, @fprint );
45 3         13 return @rdata;
46             }
47              
48              
49             sub _parse_rdata { ## populate RR from rdata in argument list
50 2     2   7 my ( $self, @argument ) = @_;
51              
52 2         4 for (qw(algorithm fptype)) { $self->$_( shift @argument ) }
  4         12  
53 2         7 $self->fp(@argument);
54 2         5 return;
55             }
56              
57              
58             sub algorithm {
59 8     8 1 24 my ( $self, @value ) = @_;
60 8         15 for (@value) { $self->{algorithm} = 0 + $_ }
  3         10  
61 8   100     40 return $self->{algorithm} || 0;
62             }
63              
64              
65             sub fptype {
66 8     8 1 1380 my ( $self, @value ) = @_;
67 8         18 for (@value) { $self->{fptype} = 0 + $_ }
  3         9  
68 8   100     49 return $self->{fptype} || 0;
69             }
70              
71              
72             sub fp {
73 11     11 1 1905 my ( $self, @value ) = @_;
74 11 100       38 return unpack "H*", $self->fpbin() unless scalar @value;
75 4 100       9 my @hex = map { /^"*([\dA-Fa-f]*)"*$/ || croak("corrupt hex"); $1 } @value;
  4         389  
  3         16  
76 3         19 return $self->fpbin( pack "H*", join "", @hex );
77             }
78              
79              
80             sub fpbin {
81 17     17 1 1308 my ( $self, @value ) = @_;
82 17         33 for (@value) { $self->{fpbin} = $_ }
  3         8  
83 17   100     102 return $self->{fpbin} || "";
84             }
85              
86              
87             sub babble {
88 5     5 1 1498 return BABBLE ? Digest::BubbleBabble::bubblebabble( Digest => shift->fpbin ) : '';
89             }
90              
91              
92 2     2 1 2423 sub fingerprint { return &fp; } ## historical
93              
94              
95             1;
96             __END__