Convert-X509
view release on metacpan or search on metacpan
lib/Convert/X509/Parser.pm view on Meta::CPAN
(++$mm<10 ? '0' : '') . $mm . '-' .
($dd<10 ? '0' : '') . $dd,
($hh<10 ? '0' : '') . $hh . ':' .
($min<10 ? '0' : '') . $min . ':' .
($sec<10 ? '0' : '') . $sec
);
return(wantarray ? ($d,$t) : "$d $t");
}
sub _prepare {
my ($pdata, $debug) = @_;
warn ('Parameter must be a scalar ref') and return undef unless ref($pdata) eq 'SCALAR';
unless (unpack('H3',$$pdata) eq '308'){ # first 2 bytes for ASN.1 SEQUENCE
$$pdata = join("\n",
$$pdata =~ m!^([A-Za-z01-9+/]{1,}[-=]*)$!gm );
warn $$pdata if $debug;
$$pdata = decode_base64($$pdata);
}
}
sub _oid2txt {
my @res = map { ref($_) ? $_->{'desc'} || $_->{'asn'} : $_ }
map { $oid_db{$_} || $_ } @_;
return (wantarray() ? @res : $res[0] || '');
}
sub _int2hexstr {
my $res='';
my $m=$_[0];
while ($m){
$res = unpack('H2',pack('C', $m & 255 )) . $res;
$m >>= 8;
}
return $res;
}
sub _iconv {
# decoding hash pair like {'anyString'=>'Localized value'}
my ($data,$fmt,$from,$to) = @_;
$from = $cp_from unless $from;
$to = $cp_to unless $to;
# belt-and-suspenders approach...
return Encode::str2bytes($to,$data) if Encode::is_utf8($data);
$data=Encode::bytes2str($iconv->{$fmt},$data) if $iconv->{$fmt};
return Encode::str2bytes($to,$data) if Encode::is_utf8($data);
Encode::from_to($data, $from, $to);
return $data;
}
sub _localize {
my ($k,$v) = %{ shift @_};
return _iconv($v,$k,@_);
}
sub _decode {
die ("Error\n",$asn->error,"\nin ASN.1 code ") if $asn->error;
my $type = shift;
my $node= $asn->find( $oid_db{uc($type)}->{'asn'} || 'Any' );
die ('Error finding ',$type,'-', $oid_db{uc($type)}->{'asn'}, ' in module') unless $node;
my @decoded = map {$node->decode($_)} @_;
return ( @_ > 1 ? [@decoded] : $decoded[0] )
}
sub _decode_rdn {
my $res = {};
return $res unless ref($_[0]) eq 'ARRAY';
for my $rdn ( @{ $_[0] } ){
for my $attr (@$rdn){ # = { 'type'=>OID, 'value'=>{dsType=>DirectoryString} }
push @{ $res->{$attr->{'type'}} },
$attr->{'value'};
}
}
return $res;
}
sub _decode_ext {
my $res = {};
for (@_){
next unless ref($_) eq 'ARRAY';
for my $ext (@$_){
# RFC 3280 :
# "A certificate MUST NOT include more than one instance of a particular extension"
warn 'Duplicated extension ', $ext->{'extnID'} && next
if exists $res->{$ext->{'extnID'}};
$res->{$ext->{'extnID'}}{'value'} = _decode( $ext->{'extnID'}, $ext->{'extnValue'} );
$res->{$ext->{'extnID'}}{'critical'} = 1 if $ext->{'critical'};
}
}
return $res;
}
sub _rdn2hash {
my $rdn = shift;
return undef unless ref($rdn) eq 'HASH';
my %h;
while(my ($k,$v) = each %$rdn){
$h{_oid2txt($k)} = [map {_localize($_, @_)} @$v];
}
return %h;
}
sub _eku {
my ($self) = @_;
my $oids = $self->{'extensions'}{'2.5.29.37'}{'value'};
return ($oids ? _oid2txt(@$oids) : () );
}
sub _bits2str {
my ($oid,$b) = @_;
return '' unless ref($b) eq 'ARRAY';
my $mask = [split(//, unpack('B*',$b->[0]) )];
return
@{$oid_db{$oid}{'bits'} }
[ grep {$mask->[$_]} (0 .. $b->[1]-1) ];
}
sub _keyusage {
return _bits2str('2.5.29.15', $_[0]->{'extensions'}{'2.5.29.15'}{'value'});
}
sub _crlreason {
( run in 0.668 second using v1.01-cache-2.11-cpan-2398b32b56e )