[BACK]Return to Keyring.pm CVS log [TXT][DIR] Up to [local] / palm / Palm-Keyring / lib / Palm

Diff for /palm/Palm-Keyring/lib/Palm/Keyring.pm between version 1.1 and 1.2

version 1.1, 2006/01/26 20:54:19 version 1.2, 2006/01/31 23:03:39
Line 9 
Line 9 
 #   This started as Memo.pm, I just made it work for Keyring.  #   This started as Memo.pm, I just made it work for Keyring.
 #  #
 # $Id$  # $Id$
 # $RedRiver$  # $RedRiver: Keyring.pm,v 1.1 2006/01/26 20:54:19 andrew Exp $
   
 use strict;  use strict;
 package Palm::Keyring;  package Palm::Keyring;
Line 18 
Line 18 
 use vars qw( $VERSION @ISA );  use vars qw( $VERSION @ISA );
   
 use Digest::MD5 qw(md5);  use Digest::MD5 qw(md5);
 use Crypt::TripleDES;  use Crypt::DES;
   
 use constant ENCRYPT    =>  1;  use constant ENCRYPT    =>  1;
 use constant DECRYPT    =>  0;  use constant DECRYPT    =>  0;
Line 142 
Line 142 
                 my $description = defined $record->{plaintext}->{description} ? $record->{plaintext}->{description} : '';                  my $description = defined $record->{plaintext}->{description} ? $record->{plaintext}->{description} : '';
                 my $extra       = '';                  my $extra       = '';
   
                 my $plaintext = join("\0", $account, $password, $description, $extra);                  my $plaintext = join("\000", $account, $password, $description, $extra);
   
                 my $encrypted = $self->_crypt($plaintext, ENCRYPT);                  my $encrypted = $self->_crypt3des($plaintext, ENCRYPT);
   
                 $record->{data} = join("\0", $name, $encrypted);                  $record->{data} = join("\000", $name, $encrypted);
         }          }
   
         return 1;          return 1;
Line 171 
Line 171 
   
                 next unless defined $record->{data};                  next unless defined $record->{data};
   
                 my ($name, $encrypted) = split /\0/, $record->{data};                  my ($name, $encrypted) = split /\000/, $record->{data}, 2;
                 $record->{plaintext}->{name} = $name;                  $record->{plaintext}->{name} = $name;
   
                 my $decrypted = $self->_crypt($encrypted, DECRYPT);                  my $decrypted = $self->_crypt3des($encrypted, DECRYPT);
                 my ($account, $password, $description, $extra)                  my ($account, $password, $description, $extra)
                       = split /\0/, $decrypted, 4;                        = split /\000/, $decrypted, 4;
   
                 $record->{plaintext}->{account}     = defined $account     ? $account     : '';                  $record->{plaintext}->{account}     = defined $account     ? $account     : '';
                 $record->{plaintext}->{password}    = defined $password    ? $password    : '';                  $record->{plaintext}->{password}    = defined $password    ? $password    : '';
                 $record->{plaintext}->{description} = defined $description ? $description : '';                  $record->{plaintext}->{description} = defined $description ? $description : '';
   
           print "Name:      '$name'\n";
           print "Encrypted: '$encrypted' - Length: " . length($encrypted) . "\n";
           #print "Hex:       '" . unpack("H*", $encrypted) . "'\n";
           #print "Binary:    '" . unpack("b*", $encrypted) . "'\n";
           print "Decrypted: '$decrypted' - Length: " . length($decrypted) . "\n";
           print "Hex:       '" . unpack("H*", $decrypted) . "'\n";
           print "Binary:    '" . unpack("b*", $decrypted) . "'\n";
           print "\n";
                 #print "Extra: $extra\n";                  #print "Extra: $extra\n";
                 #--------------------------------------------------                  #--------------------------------------------------
                 # print "Account:     $account\n";                  # print "Account:     $account\n";
Line 194 
Line 202 
         return 1;          return 1;
 }  }
   
 sub _crypt  
 {  
         my $self = shift;  
         my $original = shift;  
         my $flag = shift;  
   
         my $digest = $self->{digest} || $self->_calc_keys();  
         #print "DIGEST: $digest\n";  
   
         my $des = new Crypt::TripleDES;  
   
         if ($flag == ENCRYPT) {  
                 return $des->encrypt3($original, $digest);  
         } else {  
                 return $des->decrypt3($original, $digest);  
         }  
 }  
   
 sub _calc_keys  sub _calc_keys
 {  {
         my $self = shift;          my $self = shift;
Line 313 
Line 303 
         return 1;          return 1;
 }  }
   
   
   # XXX Have to make this encrypt as well as decrypting, but w00 h00!
   # do null padding on the end of a cleartext if we are going to encrypt it
   sub _crypt3des {
       my ( $self, $plaintext, $flag ) = @_;
   
           my $passphrase = $self->{digest} || $self->_calc_keys();
       $passphrase .= ' ' x (16*3);
       my $cyphertext = "";
   
   
       my $size = length ( $plaintext );
       print "STRING: '$plaintext' - Length: " . length($plaintext) . "\n";
   
       # This check should see if it is plaintext first, if it is,
       #   pad it with \000
       # if not, then die
       die "record not 8 byte padded" if (length($plaintext) % 8) && ! $flag;
   
       my %C;
       for ( 0..2 ) {
         $C{$_} = new Crypt::DES( pack( "H*", substr($passphrase, 16*$_, 16 )));
       }
   
       for ( 0 .. (($size)/8) - 1) {
        my $pt = substr( $plaintext, $_*8, 8 );
           print "PT: '$pt' - Length: " . length($pt) . "\n";
           if (length($pt) < 8) {
             my $len = 8 - length($pt);
             print "LENGTH: $len\n";
             print "Binary:    '" . unpack("b*", $pt) . "'\n";
             $pt .= (chr(0) x $len);# . $pt;
             print "Binary:    '" . unpack("b*", $pt) . "'\n";
             print "PT: '$pt' - Length: " . length($pt) . "\n";
           }
           $pt = $C{0}->decrypt( $pt );
           $pt = $C{1}->encrypt( $pt );
           $pt = $C{2}->decrypt( $pt );
           print "PT: '$pt' - Length: " . length($pt) . "\n";
           $cyphertext .= $pt;
       }
   
       return substr ( $cyphertext, 0, $size );
   }
   
 1;  1;
 __END__  __END__

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>