File Coverage

blib/lib/Net/DNS/RR/TLSA.pm
Criterion Covered Total %
statement 63 63 100.0
branch 4 4 100.0
path n/a
condition 8 8 100.0
subroutine 17 17 100.0
pod 7 7 100.0
total 99 99 100.0


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