File Coverage

lib/Crypt/Perl/X509/Extension/cRLDistributionPoints.pm
Criterion Covered Total %
statement 49 51 96.0
branch 8 10 80.0
condition n/a
subroutine 10 10 100.0
pod 0 1 0.0
total 67 72 93.0


line stmt bran cond sub pod time code
1             package Crypt::Perl::X509::Extension::cRLDistributionPoints;
2              
3 1     1   524 use strict;
  1         2  
  1         34  
4 1     1   6 use warnings;
  1         2  
  1         32  
5              
6             =encoding utf-8
7              
8             =head1 NAME
9              
10             Crypt::Perl::X509::Extension::cRLDistributionPoints
11              
12             =head1 SEE ALSO
13              
14             L
15              
16             =cut
17              
18 1     1   5 use parent qw( Crypt::Perl::X509::Extension );
  1         3  
  1         7  
19              
20 1     1   75 use Crypt::Perl::ASN1::BitString ();
  1         2  
  1         17  
21 1     1   5 use Crypt::Perl::X509::GeneralNames ();
  1         2  
  1         25  
22 1     1   18 use Crypt::Perl::X509::RelativeDistinguishedName ();
  1         3  
  1         34  
23              
24             use constant {
25 1         127 OID => '2.5.29.31',
26             CRITICAL => 0,
27 1     1   6 };
  1         3  
28              
29 1     1   9 use constant ASN1 => Crypt::Perl::X509::GeneralNames::ASN1() . <
  1         1  
  1         491  
30              
31             DistributionPointName ::= CHOICE {
32             fullName ANY, -- [0] GeneralNames
33             nameRelativeToCRLIssuer ANY -- [1] RelativeDistinguishedName
34             }
35              
36             DistributionPoint ::= SEQUENCE {
37             distributionPoint [0] DistributionPointName OPTIONAL,
38             reasons [1] BIT STRING OPTIONAL,
39             cRLIssuer ANY OPTIONAL -- [2] GeneralNames OPTIONAL
40             }
41              
42             cRLDistributionPoints ::= SEQUENCE OF DistributionPoint
43             END
44              
45             my @_ReasonFlags = qw(
46             unused
47             keyCompromise
48             cACompromise
49             affiliationChanged
50             superseded
51             cessationOfOperation
52             certificateHold
53             privilegeWithdrawn
54             aACompromise
55             );
56              
57             sub new {
58 12     12 0 82 my ($class, @points) = @_;
59              
60 12         35 my @self;
61              
62 12         75 for my $p (@points) {
63 24         131 my %pp = %$p;
64 24         73 push @self, \%pp;
65              
66 24 50       89 if ( $pp{'distributionPoint'} ) {
67 24         49 my $dp = $pp{'distributionPoint'};
68              
69 24 100       89 if ($dp->{'fullName'}) {
    50          
70 12         34 my $gns = Crypt::Perl::X509::GeneralNames->new( @{ $pp{'distributionPoint'}{'fullName'} } );
  12         86  
71              
72 12         44 $pp{'distributionPoint'} = {
73             fullName => $gns->encode(),
74             };
75              
76 12         1243 substr( $pp{'distributionPoint'}{'fullName'}, 0, 1, "\xa0" );
77             }
78             elsif ($dp->{'nameRelativeToCRLIssuer'}) {
79 12         26 my $rdn = Crypt::Perl::X509::RelativeDistinguishedName->new( @{ $dp->{'nameRelativeToCRLIssuer'} } );
  12         92  
80              
81 12         52 $pp{'distributionPoint'} = {
82             nameRelativeToCRLIssuer => $rdn->encode(),
83             };
84              
85 12         3646 substr( $pp{'distributionPoint'}{'nameRelativeToCRLIssuer'}, 0, 1, "\xa1" );
86             }
87             else {
88 0         0 my @keys = keys %$dp;
89 0         0 die Crypt::Perl::X::create('Generic', "Unrecognized “distributionPoint” hash! (@keys)");
90             }
91             }
92              
93 24 100       79 if ( $pp{'reasons'} ) {
94             $pp{'reasons'} = Crypt::Perl::ASN1::BitString::encode(
95             \@_ReasonFlags,
96 12         70 $pp{'reasons'},
97             );
98             }
99              
100 24 100       96 if ( $pp{'cRLIssuer'} ) {
101 12         46 $pp{'cRLIssuer'} = Crypt::Perl::X509::GeneralNames->new( @{ $pp{'cRLIssuer'} } )->encode();
  12         73  
102 12         1063 substr( $pp{'cRLIssuer'}, 0, 1, "\xa2" );
103             }
104             }
105              
106 12         86 return bless \@self, $class;
107             }
108              
109             sub _encode_params {
110 12     12   35 my ($self) = @_;
111              
112 12         72 return [ @$self ];
113             }
114              
115             1;