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 )