#!/usr/ug/bin/perl5 # vim:fo=croql:cin:com=\:# use strict; use Getopt::Std; use vars qw($opt_i $opt_v $opt_k); getopt(''); $/= 0x100; my $f; for $f (@ARGV) { open(F, $f) || die "can't open $f"; binmode(F); my $file= <>; my $magic= substr($file, 0, 4); $file= substr($file, 4); my($id, $idp); if ($magic eq "\x68\x13\x0\x1") { print "version 1 private key\n" if defined($opt_v); $file =~ /([^\0]*\0)(.*)/; $id= $1; $idp= $1; } else { print "version 2 private key\n" if defined($opt_v); my $chars= unpack("N", $file); $file= substr($file, 4); $id= substr($file, 0, 2 * $chars); $idp= $id; } $idp =~ s/\0//g; my $key= substr($file, length($id)); printf "%s\n", $idp if defined($opt_i); print "\n" if ((defined($opt_i) || defined($opt_v)) && !defined($opt_k)); if (!defined($opt_k)) { my($i, $j); $j= 0; for $i (unpack("C*", $key)) { printf "\n" if ($j % 16 == 0) && $j; printf "%07o ", $j if ($j % 16 == 0); printf("%02x ", $i); $j++; } } print "\n"; }