#/usr/local/bin/perl

use Term::ReadKey;
use PDA::Pilot::Secret;

usage() unless $#ARGV == 0;

die "stdout ist kein tty" unless check_stdout();

{
  local $/;

  undef $/;

  open (F, "<$ARGV[0]") || die "can't open $ARGV[0]: $!";
  
  $data = <F>;

  close F;
}

@categories = split (/ÿ\@D[\cC\cb]/,$data);
foreach (@categories) {
  /(^.{20})/;
  ($key = $1) =~ s/\x00.*$//;
  $categories{$key} = substr($_,21);
}

my $pass_string = "\x00" x 16;

ReadMode 'noecho';
print "Schlüssel: ";
my $secret_key = ReadLine 0;
chop($secret_key);
$secret_key = uc($secret_key);
ReadMode 'normal';

substr($pass_string,0,length($secret_key)-1) = $secret_key;
undef $secret_key;

$userkey = garble( $pass_string);
$cypher = crypt($pass_string,$userkey,8);
undef $pass_string;


foreach $key (keys %categories) {
  next if $key eq "Secret2";


  $val = $categories{$key};  
  $lockey = substr($val,0,8);
  $tanflag = substr($val,8,1);


  next if $lockey ne $cypher;


  $reclen = (ord(substr($val,9,1)) << 24) + (ord(substr($val,10,1)) << 16) + 
    (ord(substr($val,11,1)) << 8) + ord(substr($val,12,1));
  print "Kategorie $key\n";
#  print "Recordlength: $reclen\n";
  $val = substr($val,13);
  print decrypt($val,$userkey,$reclen+8), "\n\n";
}


sub usage {
  print <<EOUSAGE;

 Verwendung: $0 <Datei>
    Datei ist der vollständige Name einer lokalen Secret2-Datei.

 $0 schreibt die decodierte Secret2-Datei auf stdout. Eine Umlenkung 
 der Ausgabe ist nicht möglich, da dies zusätzliche Sicherheitsprobleme
 aufwerfen würde. 
EOUSAGE
  exit(0);
}
