File Coverage

blib/lib/Data/Radius/Util.pm
Criterion Covered Total %
statement 38 38 100.0
branch 3 4 75.0
condition 3 6 50.0
subroutine 8 8 100.0
pod 0 3 0.0
total 52 59 88.1


line stmt bran cond sub pod time code
1             package Data::Radius::Util;
2              
3 5     5   143290 use v5.10;
  5         35  
4 5     5   43 use strict;
  5         10  
  5         138  
5 5     5   25 use warnings;
  5         9  
  5         137  
6 5     5   27 use Digest::MD5 ();
  5         11  
  5         101  
7              
8 5     5   33 use Exporter qw(import);
  5         9  
  5         1982  
9             our @EXPORT_OK = qw(encrypt_pwd decrypt_pwd is_enum_type);
10              
11             my %ENUM_TYPES = map { $_ => 1 } (qw(integer byte short signed));
12              
13 27 100   27 0 5963 sub is_enum_type { $ENUM_TYPES{ $_[0] } ? 1 : 0 }
14              
15             my $md5;
16              
17             # encode User-Password attribute
18             sub encrypt_pwd {
19 4     4 0 728 my ($value, $secret, $authenticator) = @_;
20              
21 4   66     76 $md5 //= Digest::MD5->new;
22              
23             # padding
24 4         11 my $len = length($value);
25 4         12 my $pad16 = $len % 16;
26 4 50       20 $value .= "\x0" x (16 - $pad16) if($pad16);
27 4         44 my @v = unpack('a16' x ( (16 + $len - $pad16) / 16), $value);
28              
29 4         8 my $ep = $authenticator;
30 4         9 my @list = ();
31 4         10 foreach my $p (@v) {
32 4         22 $md5->add($secret, $ep);
33 4         32 $ep = $p ^ $md5->digest();
34 4         15 push @list, $ep;
35             }
36              
37 4         26 return join('', @list);
38             }
39              
40             # decrypt value of User-Password attribute
41             sub decrypt_pwd {
42 2     2 0 898 my ($value, $secret, $authenticator) = @_;
43              
44 2   33     9 $md5 //= Digest::MD5->new;
45              
46 2         5 my $p = $authenticator;
47 2         13 my $result;
48 2         18 for (my $i = 0; $i < length($value); $i += 16) {
49 2         13 $md5->add($secret, $p);
50 2         7 $p = substr($value, $i, 16);
51 2         17 $result .= $p ^ $md5->digest();
52             }
53              
54             # clear padding
55 2         16 $result =~ s/\000*$//;
56 2         8 return $result;
57             }
58              
59             1;