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 8     8   224670 use v5.10;
  8         25  
4 8     8   50 use strict;
  8         16  
  8         236  
5 8     8   33 use warnings;
  8         12  
  8         433  
6 8     8   39 use Digest::MD5 ();
  8         13  
  8         168  
7              
8 8     8   28 use Exporter qw(import);
  8         13  
  8         3105  
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 46 100   46 0 238810 sub is_enum_type { $ENUM_TYPES{ $_[0] } ? 1 : 0 }
14              
15             my $md5;
16              
17             # encode User-Password attribute
18             sub encrypt_pwd {
19 5     5 0 231169 my ($value, $secret, $authenticator) = @_;
20              
21 5   66     56 $md5 //= Digest::MD5->new;
22              
23             # padding
24 5         11 my $len = length($value);
25 5         17 my $pad16 = $len % 16;
26 5 50       28 $value .= "\x0" x (16 - $pad16) if($pad16);
27 5         37 my @v = unpack('a16' x ( (16 + $len - $pad16) / 16), $value);
28              
29 5         12 my $ep = $authenticator;
30 5         10 my @list = ();
31 5         15 foreach my $p (@v) {
32 5         65 $md5->add($secret, $ep);
33 5         67 $ep = $p ^ $md5->digest();
34 5         19 push @list, $ep;
35             }
36              
37 5         27 return join('', @list);
38             }
39              
40             # decrypt value of User-Password attribute
41             sub decrypt_pwd {
42 3     3 0 1225 my ($value, $secret, $authenticator) = @_;
43              
44 3   33     20 $md5 //= Digest::MD5->new;
45              
46 3         10 my $p = $authenticator;
47 3         6 my $result;
48 3         14 for (my $i = 0; $i < length($value); $i += 16) {
49 3         21 $md5->add($secret, $p);
50 3         9 $p = substr($value, $i, 16);
51 3         50 $result .= $p ^ $md5->digest();
52             }
53              
54             # clear padding
55 3         32 $result =~ s/\000*$//;
56 3         15 return $result;
57             }
58              
59             1;