=================================================================== RCS file: /cvs/palm/Palm-Keyring/lib/Palm/Keyring.pm,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- palm/Palm-Keyring/lib/Palm/Keyring.pm 2007/02/19 00:22:42 1.29 +++ palm/Palm-Keyring/lib/Palm/Keyring.pm 2007/02/19 01:37:10 1.30 @@ -1,5 +1,5 @@ package Palm::Keyring; -# $RedRiver: Keyring.pm,v 1.28 2007/02/18 05:50:25 andrew Exp $ +# $RedRiver: Keyring.pm,v 1.29 2007/02/19 00:22:42 andrew Exp $ ######################################################################## # Keyring.pm *** Perl class for Keyring for Palm OS databases. # @@ -154,7 +154,8 @@ } elsif ($self->{version} == 5) { my $blocksize = $CRYPTS[ $self->{appinfo}->{cipher} ]{blocksize}; my ($field, $extra) = _parse_field($rec->{data}); - my ($ivec, $encrypted) = unpack "A$blocksize A*", $extra; + my $ivec = substr $extra, 0, $blocksize; + my $encrypted = substr $extra, $blocksize; if ($self->{options}->{v4compatible}) { $rec->{name} = $field->{data}; @@ -209,8 +210,7 @@ my $len = length $packed; my $blocksize = $CRYPTS[ $self->{appinfo}->{cipher} ]{blocksize}; - $rec->{data} = pack "A$len A$blocksize A*", - $packed, $rec->{ivec}, $rec->{encrypted}; + $rec->{data} = join '', $packed, $rec->{ivec}, $rec->{encrypted}; } else { die 'Unsupported Version'; @@ -481,7 +481,8 @@ my $old = shift; my $key = shift; my $cipher = shift; - my $ivec = shift || pack("C*",map {rand(256)} 1..8); + my $length = $CRYPTS[ $cipher ]{blocksize}; + my $ivec = shift || pack("C*",map {rand(256)} 1..$length); my $keylen = $CRYPTS[ $cipher ]{keylen}; my $cipher_name = $CRYPTS[ $cipher ]{name}; @@ -594,7 +595,7 @@ croak("Needed parameter 'record' not passed!\n"); } - if ( ! $self->Password($pass)) { + if ( $pass && ! $self->Password($pass)) { croak("Invalid Password!\n"); } @@ -713,7 +714,7 @@ if (! $pass) { delete $self->{password}; - delete $self->{key}; + delete $self->{appinfo}->{key}; return 1; } @@ -1041,7 +1042,7 @@ return undef, $field; } my $unpackstr = "S1 C1 C1 A$len"; - if ($len % 2) { + if ($len % 2 && $len + 4 < length $field) { # trim the 0/1 byte padding for next even address. $unpackstr .= ' x' }