version 1.55, 2008/09/17 15:47:47 |
version 1.56, 2008/09/18 07:04:55 |
|
|
package Palm::Keyring; |
package Palm::Keyring; |
# $RedRiver: Keyring.pm,v 1.54 2007/12/05 05:42:29 andrew Exp $ |
# $RedRiver: Keyring.pm,v 1.55 2008/09/17 14:47:47 andrew Exp $ |
######################################################################## |
######################################################################## |
# Keyring.pm *** Perl class for Keyring for Palm OS databases. |
# Keyring.pm *** Perl class for Keyring for Palm OS databases. |
# |
# |
|
|
else { |
else { |
$options->{password} = shift; |
$options->{password} = shift; |
$options->{version} = shift; |
$options->{version} = shift; |
|
$options->{cipher} = shift; |
} |
} |
} |
} |
|
|
|
|
$self->{appinfo}->{iter} ||= $self->{options}->{iterations}; |
$self->{appinfo}->{iter} ||= $self->{options}->{iterations}; |
}; |
}; |
|
|
|
if ( defined $options->{file} ) { |
|
$self->Load($options->{file}); |
|
} |
|
|
if ( defined $options->{password} ) { |
if ( defined $options->{password} ) { |
$self->Password($options->{password}); |
$self->Password($options->{password}); |
} |
} |
|
|
} |
} |
} |
} |
|
|
my $rc = $self->SUPER::Write(@_); |
my @rc = $self->SUPER::Write(@_); |
|
|
if ($self->{version} == 4) { |
if ($self->{version} == 4) { |
shift @{ $self->{records} }; |
shift @{ $self->{records} }; |
} |
} |
|
|
return $rc; |
return @rc; |
} |
} |
|
|
# ParseRecord |
# ParseRecord |
|
|
my $self = shift; |
my $self = shift; |
|
|
my $rec = $self->SUPER::ParseRecord(@_); |
my $rec = $self->SUPER::ParseRecord(@_); |
return $rec if ! exists $rec->{data}; |
return $rec if !(defined $rec->{data} && length $rec->{data} ); |
|
|
if ($self->{version} == 4) { |
if ($self->{version} == 4) { |
# skip the first record because it contains the password. |
# skip the first record because it contains the password. |
|
|
$self->{encpassword} = $rec->{data}; |
$self->{encpassword} = $rec->{data}; |
return '__DELETE_ME__'; |
return '__DELETE_ME__'; |
} |
} |
|
|
if ($self->{records}->[0] eq '__DELETE_ME__') { |
if ($self->{records}->[0] eq '__DELETE_ME__') { |
shift @{ $self->{records} }; |
shift @{ $self->{records} }; |
} |
} |
|
|
$rec->{encrypted} = substr $extra, $blocksize; |
$rec->{encrypted} = substr $extra, $blocksize; |
|
|
} else { |
} else { |
|
# XXX Can never get here to test, ParseAppInfoBlock is always run |
|
# XXX first by Load(). |
croak "Unsupported Version $self->{version}"; |
croak "Unsupported Version $self->{version}"; |
return; |
|
} |
} |
|
|
return $rec; |
return $rec; |
|
|
my $self = shift; |
my $self = shift; |
my $rec = shift; |
my $rec = shift; |
|
|
|
# XXX This probably shouldn't croak, just make something up |
|
croak "No encrypted content to pack" if !defined $rec->{encrypted}; |
|
|
if ($self->{version} == 4) { |
if ($self->{version} == 4) { |
if ($rec->{encrypted}) { |
if ($rec->{encrypted}) { |
my $name = $rec->{plaintext}->{0}->{data} || $EMPTY; |
my $name = $rec->{plaintext}->{0}->{data} || $EMPTY; |
$rec->{data} = join $NULL, $name, $rec->{encrypted}; |
$rec->{data} = join $NULL, $name, $rec->{encrypted}; |
delete $rec->{plaintext}; |
|
delete $rec->{encrypted}; |
|
} |
} |
|
|
} elsif ($self->{version} == 5) { |
} elsif ($self->{version} == 5) { |
|
# XXX This probably shouldn't croak, just make something up |
|
croak "No ivec" if !$rec->{ivec}; |
|
|
my $field; |
my $field; |
if ($rec->{plaintext}->{0}) { |
if ($rec->{plaintext}->{0}) { |
$field = $rec->{plaintext}->{0}; |
$field = $rec->{plaintext}->{0}; |
|
|
} else { |
} else { |
croak "Unsupported Version $self->{version}"; |
croak "Unsupported Version $self->{version}"; |
} |
} |
|
# XXX Should I? |
|
delete $rec->{plaintext}; |
|
delete $rec->{encrypted}; |
|
|
return $self->SUPER::PackRecord($rec, @_); |
return $self->SUPER::PackRecord($rec, @_); |
} |
} |
|
|
|
|
=head2 new |
=head2 new |
|
|
$pdb = new Palm::Keyring([$password[, $version]]); |
$pdb = new Palm::Keyring([$password[, $version[, $cipher]]]); |
|
|
Create a new PDB, initialized with the various Palm::Keyring fields |
Create a new PDB, initialized with the various Palm::Keyring fields |
and an empty record list. |
and an empty record list. |
|
|
=item iterations |
=item iterations |
|
|
The number of iterations to encrypt with. Only used by somy crypts in v5 databases. |
The number of iterations to encrypt with. Only used by somy crypts in v5 databases. |
|
|
|
=item file |
|
|
|
The name of a file to Load(). This will override many of the other options. |
|
|
=back |
=back |
|
|