package Crypt::Perl::X509::Extension::certificatePolicies; use strict; use warnings; =encoding utf-8 =head1 NAME Crypt::Perl::X509::Extension::certificatePolicies =head1 SYNOPSIS Crypt::Perl::X509::Extension::certificatePolicies->new( [ 'domain-validated' ], [ '1.3.6.1.4.1.6449.1.2.2.52', [ cps => 'http://cps.url' ], [ cps => 'http://cps.url2' ], ], [ '1.2.3.4.5.6.7.8', [ unotice => { #NB: “Conforming CAs SHOULD NOT use the noticeRef option.” noticeRef => { organization => 'FooFoo', noticeNumbers => [ 12, 23, 34 ], }, explicitText => 'apple', } ], ], ); =cut use parent qw( Crypt::Perl::X509::Extension ); use Crypt::Perl::X (); use constant OID => '2.5.29.32'; use constant ASN1 => < '1.3.6.1.5.5.7.2.1', unotice => '1.3.6.1.5.5.7.2.2', ); my %policy_oid = ( 'domain-validated' => '2.23.140.1.2.1', 'organization-validated' => '2.23.140.1.2.2', ); sub new { my ($class, @policies) = @_; if (!@policies) { die Crypt::Perl::X::create('Generic', 'Need policies!'); } return bless \@policies, $class; } sub _encode_params { my ($self) = @_; my @data; for my $p (@$self) { my ( $p_oid, @quals ) = @$p; my $item = { policyIdentifier => $policy_oid{$p_oid} || $p_oid, }; push @data, $item; if (@quals) { my @iquals; $item->{'policyQualifiers'} = \@iquals; for my $q (@quals) { my $q_oid = $q->[0]; my $asn1 = Crypt::Perl::ASN1->new()->prepare($self->ASN1()); $asn1 = $asn1->find( "${q_oid}Value" ); my $val; if ( $q_oid eq 'unotice' ) { $val = { %{ $q->[1] } }; if ($val->{'noticeRef'}) { $val->{'noticeRef'} = { %{ $val->{'noticeRef'} } }; $val->{'noticeRef'}{'organization'} = { utf8String => $val->{'noticeRef'}{'organization'}, }; } if ($val->{'explicitText'}) { $val->{'explicitText'} = { utf8String => $val->{'explicitText'}, }; } } else { $val = $q->[1]; } $val = $asn1->encode( $val ); push @iquals, { policyQualifierId => $qual_oid{$q_oid}, qualifier => $val, }; } } } return \@data; } 1;