[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.38 and 1.39

version 1.38, 2007/02/23 02:54:49 version 1.39, 2007/02/23 03:24:09
Line 1 
Line 1 
 package Palm::Keyring;  package Palm::Keyring;
 # $RedRiver: Keyring.pm,v 1.37 2007/02/23 02:34:01 andrew Exp $  # $RedRiver: Keyring.pm,v 1.38 2007/02/23 02:54:49 andrew Exp $
 ########################################################################  ########################################################################
 # Keyring.pm *** Perl class for Keyring for Palm OS databases.  # Keyring.pm *** Perl class for Keyring for Palm OS databases.
 #  #
Line 107 
Line 107 
     # Set defaults      # Set defaults
     if ($self->{version} == 5) {      if ($self->{version} == 5) {
         $self->{options}->{cipher} ||= 0; # 'None'          $self->{options}->{cipher} ||= 0; # 'None'
         $self->{options}->{iterations} ||=          my $c = crypts($self->{options}->{cipher})
             $CRYPTS[ $self->{options}->{cipher} ]{default_iter};              or croak('Unknown cipher ' . $self->{options}->{cipher});
           $self->{options}->{iterations} ||= $c->{default_iter};
        $self->{appinfo}->{cipher} ||= $self->{options}->{cipher};          $self->{appinfo}->{cipher} ||= $self->{options}->{cipher};
        $self->{appinfo}->{iter}   ||= $self->{options}->{iterations};          $self->{appinfo}->{iter}   ||= $self->{options}->{iterations};
     };      };
   
     if ( defined $options->{password} ) {      if ( defined $options->{password} ) {
Line 132 
Line 132 
 sub crypts  sub crypts
 {  {
     my $crypt = shift;      my $crypt = shift;
     if ($crypt =~ /\D/) {      if (! defined $crypt || ! length $crypt) {
           return;
       } elsif ($crypt =~ /\D/) {
         foreach my $c (@CRYPTS) {          foreach my $c (@CRYPTS) {
             if ($c->{alias} eq $crypt) {              if ($c->{alias} eq $crypt) {
                 return $c;                  return $c;
Line 166 
Line 168 
         delete $rec->{data};          delete $rec->{data};
   
     } elsif ($self->{version} == 5) {      } elsif ($self->{version} == 5) {
         my $blocksize = $CRYPTS[ $self->{appinfo}->{cipher} ]{blocksize};          my $c = crypts( $self->{appinfo}->{cipher} )
               or croak('Unknown cipher ' . $self->{appinfo}->{cipher});
           my $blocksize = $c->{blocksize};
         my ($field, $extra) = _parse_field($rec->{data});          my ($field, $extra) = _parse_field($rec->{data});
         delete $rec->{data};          delete $rec->{data};
   
Line 488 
Line 492 
     my $key    = shift;      my $key    = shift;
     my $cipher = shift;      my $cipher = shift;
     my $ivec   = shift;      my $ivec   = shift;
     my $blocksize   = $CRYPTS[ $cipher ]{blocksize};      my $c = crypts($cipher) or croak('Unknown cipher ' . $cipher);
     my $keylen      = $CRYPTS[ $cipher ]{keylen};  
     my $cipher_name = $CRYPTS[ $cipher ]{name};  
   
     if (! defined $ivec) {      if (! defined $ivec) {
         $ivec = pack("C*",map {rand(256)} 1..$blocksize);          $ivec = pack("C*",map {rand(256)} 1..$c->{blocksize});
     }      }
   
     my $changed = 0;      my $changed = 0;
Line 558 
Line 560 
         $decrypted .= _pack_field($field);          $decrypted .= _pack_field($field);
     }      }
     my $encrypted;      my $encrypted;
     if ($cipher_name eq 'None') {      if ($c->{name} eq 'None') {
         # do nothing          # do nothing
         $encrypted = $decrypted;          $encrypted = $decrypted;
   
     } elsif ($cipher_name eq 'DES_EDE3' or $cipher_name eq 'Rijndael') {      } elsif ($c->{name} eq 'DES_EDE3' or $c->{name} eq 'Rijndael') {
         require Crypt::CBC;          require Crypt::CBC;
         my $c = Crypt::CBC->new(          my $cbc = Crypt::CBC->new(
             -key         => $key,              -key         => $key,
             -literal_key => 1,              -literal_key => 1,
             -iv          => $ivec,              -iv          => $ivec,
             -cipher      => $cipher_name,              -cipher      => $c->{name},
             -keysize     => $keylen,              -keysize     => $c->{keylen},
             -blocksize   => $blocksize,              -blocksize   => $c->{blocksize},
             -header      => 'none',              -header      => 'none',
             -padding     => 'oneandzeroes',              -padding     => 'oneandzeroes',
         );          );
Line 579 
Line 581 
             croak("Unable to set up encryption!");              croak("Unable to set up encryption!");
         }          }
   
         $encrypted = $c->encrypt($decrypted);          $encrypted = $cbc->encrypt($decrypted);
   
     } else {      } else {
         die "Unsupported Version";          die "Unsupported Version";
Line 670 
Line 672 
     my $cipher    = shift;      my $cipher    = shift;
     my $ivec      = shift;      my $ivec      = shift;
   
     my $keylen       = $CRYPTS[ $cipher ]{keylen};      my $c = crypts($cipher) or croak('Unknown cipher ' . $cipher);
     my $cipher_name  = $CRYPTS[ $cipher ]{name};  
     my $blocksize    = $CRYPTS[ $cipher ]{blocksize};  
   
     my $decrypted;      my $decrypted;
   
     if ($cipher_name eq 'None') {      if ($c->{name} eq 'None') {
         # do nothing          # do nothing
         $decrypted = $encrypted;          $decrypted = $encrypted;
   
     } elsif ($cipher_name eq 'DES_EDE3' or $cipher_name eq 'Rijndael') {      } elsif ($c->{name} eq 'DES_EDE3' or $c->{name} eq 'Rijndael') {
         require Crypt::CBC;          require Crypt::CBC;
         my $c = Crypt::CBC->new(          my $cbc = Crypt::CBC->new(
             -key         => $key,              -key         => $key,
             -literal_key => 1,              -literal_key => 1,
             -iv          => $ivec,              -iv          => $ivec,
             -cipher      => $cipher_name,              -cipher      => $c->{name},
             -keysize     => $keylen,              -keysize     => $c->{keylen},
             -blocksize   => $blocksize,              -blocksize   => $c->{blocksize},
             -header      => 'none',              -header      => 'none',
             -padding     => 'oneandzeroes',              -padding     => 'oneandzeroes',
         );          );
Line 696 
Line 696 
         if (! $c) {          if (! $c) {
             croak("Unable to set up encryption!");              croak("Unable to set up encryption!");
         }          }
         my $len = $blocksize - length($encrypted) % $blocksize;          my $len = $c->{blocksize} - length($encrypted) % $c->{blocksize};
         $encrypted .= $NULL x $len;          $encrypted .= $NULL x $len;
         $decrypted  = $c->decrypt($encrypted);          $decrypted  = $cbc->decrypt($encrypted);
   
     } else {      } else {
         die "Unsupported Version";          die "Unsupported Version";
Line 840 
Line 840 
   
     my $salt = pack("H*", $appinfo->{salt});      my $salt = pack("H*", $appinfo->{salt});
   
       my $c = crypts($appinfo->{cipher})
           or croak('Unknown cipher ' . $appinfo->{cipher});
     my ($key, $hash) = _calc_key_v5(      my ($key, $hash) = _calc_key_v5(
         $pass, $salt, $appinfo->{iter},          $pass, $salt, $appinfo->{iter},
         $CRYPTS[ $appinfo->{cipher} ]{keylen},          $c->{keylen},
         $CRYPTS[ $appinfo->{cipher} ]{DES_odd_parity},          $c->{DES_odd_parity},
     );      );
   
     #print "Iter: '" . $appinfo->{iter} . "'\n";      #print "Iter: '" . $appinfo->{iter} . "'\n";
Line 946 
Line 948 
     my $length  = 8;      my $length  = 8;
     my $salt    = shift || pack("C*",map {rand(256)} 1..$length);      my $salt    = shift || pack("C*",map {rand(256)} 1..$length);
   
       my $c = crypts($cipher) or croak('Unknown cipher ' . $cipher);
     my ($key, $hash) = _calc_key_v5(      my ($key, $hash) = _calc_key_v5(
         $pass, $salt, $iter,          $pass, $salt, $iter,
         $CRYPTS[ $cipher ]->{keylen},          $c->{keylen},
         $CRYPTS[ $cipher ]->{DES_odd_parity},          $c->{DES_odd_parity},
     );      );
   
     $appinfo->{salt}           = unpack "H*", $salt;      $appinfo->{salt}           = unpack "H*", $salt;
     $appinfo->{iter}           = $iter;      $appinfo->{iter}           = $iter;
     $appinfo->{cipher}         = $cipher;      $appinfo->{cipher}         = $cipher;
   
     $appinfo->{key}            = $key;  
     $appinfo->{masterhash}     = $hash;      $appinfo->{masterhash}     = $hash;
       $appinfo->{key}            = $key;
   
     return $key;      return $key;
 }  }
Line 1359 
Line 1361 
   
 =item cipher  =item cipher
   
 The cipher to use.  0, 1, 2 or 3.  The cipher to use.  Either the number or the name.
   
     0 => None      0 => None
     1 => DES_EDE3      1 => DES_EDE3

Legend:
Removed from v.1.38  
changed lines
  Added in v.1.39

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