File Coverage

blib/lib/Net/DNS/SEC/Digest.pm
Criterion Covered Total %
statement 24 24 100.0
branch n/a
condition n/a
subroutine 8 8 100.0
pod 3 3 100.0
total 35 35 100.0


line stmt bran cond sub pod time code
1             package Net::DNS::SEC::Digest;
2              
3 10     10   8802 use strict;
  10         42  
  10         408  
4 10     10   66 use warnings;
  10         22  
  10         1145  
5              
6             our $VERSION = (qw$Id: Digest.pm 2002 2025-01-07 09:57:46Z willem $)[2];
7              
8              
9             =head1 NAME
10              
11             Net::DNS::SEC::Digest - Message Digest Algorithms
12              
13              
14             =head1 SYNOPSIS
15              
16             require Net::DNS::SEC::Digest;
17              
18             $object = Net::DNS::SEC::Digest::SHA->new(256);
19             $object->add($text);
20             $object->add($more);
21             $digest = $object->digest;
22              
23              
24             =head1 DESCRIPTION
25              
26             Interface package providing access to the message digest algorithm
27             implementations within the OpenSSL libcrypto library.
28              
29             =cut
30              
31              
32 10     10   86 use constant libcrypto_available => Net::DNS::SEC::libcrypto->can('EVP_MD_CTX_new');
  10         22  
  10         962  
33              
34 10     10   7177 BEGIN { die 'Net::DNS::SEC not available' unless libcrypto_available }
35              
36              
37             my %digest = (
38             MD5 => sub { Net::DNS::SEC::libcrypto::EVP_md5() },
39              
40             SHA_1 => sub { Net::DNS::SEC::libcrypto::EVP_sha1() },
41             SHA_224 => sub { Net::DNS::SEC::libcrypto::EVP_sha224() },
42             SHA_256 => sub { Net::DNS::SEC::libcrypto::EVP_sha256() },
43             SHA_384 => sub { Net::DNS::SEC::libcrypto::EVP_sha384() },
44             SHA_512 => sub { Net::DNS::SEC::libcrypto::EVP_sha512() },
45              
46             SHA3_224 => sub { Net::DNS::SEC::libcrypto::EVP_sha3_224() },
47             SHA3_256 => sub { Net::DNS::SEC::libcrypto::EVP_sha3_256() },
48             SHA3_384 => sub { Net::DNS::SEC::libcrypto::EVP_sha3_384() },
49             SHA3_512 => sub { Net::DNS::SEC::libcrypto::EVP_sha3_512() },
50              
51             SM3 => sub { Net::DNS::SEC::libcrypto::EVP_sm3() },
52             );
53              
54              
55             sub new {
56 7     7 1 4071 my ( $class, @param ) = @_;
57 7         43 my ($index) = reverse split '::', join '_', $class, @param;
58 7         40 my $evpmd = $digest{$index};
59 7         36 my $mdctx = Net::DNS::SEC::libcrypto::EVP_MD_CTX_new();
60 7         20 Net::DNS::SEC::libcrypto::EVP_DigestInit( $mdctx, &$evpmd );
61 7         31 return bless( {ctx => $mdctx, md => &$evpmd}, $class );
62             }
63              
64             sub add {
65 21     21 1 90 my $self = shift;
66 21         104 return Net::DNS::SEC::libcrypto::EVP_DigestUpdate( $self->{ctx}, shift );
67             }
68              
69             sub digest {
70 14     14 1 46 my $self = shift;
71 14         158 my $dgst = Net::DNS::SEC::libcrypto::EVP_DigestFinal( $self->{ctx} );
72              
73             # reinitialise; emulate API offered by Digest::SHA
74 14         161 Net::DNS::SEC::libcrypto::EVP_DigestInit( $self->{ctx}, $self->{md} );
75 14         114 return $dgst;
76             }
77              
78             DESTROY {
79 7     7   6541 my $self = shift;
80 7         71 return Net::DNS::SEC::libcrypto::EVP_MD_CTX_free( $self->{ctx} );
81             }
82              
83              
84             ## no critic ProhibitMultiplePackages
85             package Net::DNS::SEC::Digest::MD5;
86             our @ISA = qw(Net::DNS::SEC::Digest);
87              
88             package Net::DNS::SEC::Digest::SHA;
89             our @ISA = qw(Net::DNS::SEC::Digest);
90              
91             package Net::DNS::SEC::Digest::SHA3;
92             our @ISA = qw(Net::DNS::SEC::Digest);
93              
94             package Net::DNS::SEC::Digest::SM3;
95             our @ISA = qw(Net::DNS::SEC::Digest);
96              
97              
98             1;
99              
100             __END__