File Coverage

lib/Crypt/Perl/PKCS10/Attributes.pm
Criterion Covered Total %
statement 32 33 96.9
branch 2 4 50.0
condition n/a
subroutine 9 9 100.0
pod 0 1 0.0
total 43 47 91.4


line stmt bran cond sub pod time code
1             package Crypt::Perl::PKCS10::Attributes;
2              
3 1     1   5 use strict;
  1         1  
  1         21  
4 1     1   3 use warnings;
  1         2  
  1         22  
5              
6             =encoding utf-8
7              
8             =head1 NAME
9              
10             Crypt::Perl::PKCS10::Attributes - CSR “attributes” collection
11              
12             =head1 SYNOPSIS
13              
14             #Each object passed should be an instance of a subclass of
15             #Crypt::Perl::PKCS10::Attribute (NB: not this class!)
16             my $attrs = Crypt::Perl::PKCS10::Attributes->new( @ATTR_OBJS );
17              
18             #...or:
19              
20             my $attrs = Crypt::Perl::PKCS10::Attributes->new(
21             [ $attr_type1 => \@args1 ],
22             [ $attr_type2 => \@args2 ],
23             );
24              
25             #...for example:
26              
27             my $attrs = Crypt::Perl::PKCS10::Attributes->new(
28             [ challengePassword => 'iNsEcUrE' ],
29             );
30              
31             =head1 DESCRIPTION
32              
33             Instances of this class represent the “attributes” collection in a
34             PKCS #10 Certificate Signing Request.
35              
36             You probably don’t need to
37             instantiate this class directly; instead, you can instantiate it
38             implicitly by listing out arguments to
39             L’s constructor. See that module’s
40             L for an example.
41              
42             The following X.509 extensions are supported:
43              
44             =over 4
45              
46             =item * L
47              
48             =item * L
49             (Note that this attribute does B encrypt anything; don’t encode any
50             values that are sensitive data!)
51              
52             =back
53              
54             =cut
55              
56 1     1   3 use Try::Tiny;
  1         2  
  1         34  
57              
58 1     1   4 use Crypt::Perl::X ();
  1         1  
  1         13  
59              
60 1         3 use parent qw(
61             Crypt::Perl::ASN1::Encodee
62 1     1   3 );
  1         2  
63              
64 1     1   58 use constant ASN1 => <
  1         1  
  1         263  
65             Attributes ::= SET OF Attribute
66             Attribute ::= SEQUENCE {
67             type OBJECT IDENTIFIER,
68             values SET OF ANY
69             }
70             END
71              
72             my $ATTR_BASE = 'Crypt::Perl::PCKS10::Attribute';
73              
74             sub new {
75 9     9 0 41 my ($class, @attrs) = @_;
76              
77 9         57 for my $attr (@attrs) {
78 18 50   18   189 if (!try { $attr->isa($ATTR_BASE) }) {
  18         800  
79 18 50       236 if ( 'ARRAY' eq ref $attr ) {
80 18         43 my $module = $attr->[0];
81 18         71 my $class = "Crypt::Perl::PKCS10::Attribute::$module";
82 18         113 Module::Load::load($class);
83 18         1778 $attr = $class->new( @{$attr}[ 1 .. $#$attr ] );
  18         333  
84             }
85             else {
86 0         0 die Crypt::Perl::X::create('Generic', "Attribute must be ARRAY reference or instance of $ATTR_BASE, not “$attr”!");
87             }
88             }
89             }
90              
91 9         33 return bless \@attrs, $class;
92             }
93              
94             *structure = \&_encode_params;
95              
96             sub _encode_params {
97 9     9   34 my ($self) = @_;
98              
99             return [
100             map {
101 9         40 {
102 18         909 type => $_->OID(),
103             values => [ $_->encode() ],
104             },
105             } @$self
106             ];
107             }
108              
109             1;