version 1.30, 2007/02/19 01:37:10 |
version 1.31, 2007/02/19 02:55:35 |
|
|
package Palm::Keyring; |
package Palm::Keyring; |
# $RedRiver: Keyring.pm,v 1.29 2007/02/19 00:22:42 andrew Exp $ |
# $RedRiver: Keyring.pm,v 1.30 2007/02/19 01:37:10 andrew Exp $ |
######################################################################## |
######################################################################## |
# Keyring.pm *** Perl class for Keyring for Palm OS databases. |
# Keyring.pm *** Perl class for Keyring for Palm OS databases. |
# |
# |
|
|
my $ivec = substr $extra, 0, $blocksize; |
my $ivec = substr $extra, 0, $blocksize; |
my $encrypted = substr $extra, $blocksize; |
my $encrypted = substr $extra, $blocksize; |
|
|
if ($self->{options}->{v4compatible}) { |
$rec->{name} = $field->{data}; |
$rec->{name} = $field->{data}; |
|
} else { |
|
$rec->{name} = $field; |
|
} |
|
$rec->{ivec} = $ivec; |
$rec->{ivec} = $ivec; |
$rec->{encrypted} = $encrypted; |
$rec->{encrypted} = $encrypted; |
|
|
|
|
} |
} |
|
|
} elsif ($self->{version} == 5) { |
} elsif ($self->{version} == 5) { |
my $field; |
my $field = { |
if ($rec->{name}) { |
'label_id' => 1, |
if ($self->{options}->{v4compatible}) { |
'data' => $rec->{name}, |
$field = { |
'font' => 0, |
label => 'name', |
}; |
font => 0, |
my $packed .= _pack_field($field); |
data => $rec->{'name'}, |
|
}; |
|
} else { |
|
$field = $rec->{name}; |
|
} |
|
} |
|
my $packed = ''; |
|
if ($field) { |
|
$packed = _pack_field($field); |
|
} |
|
my $len = length $packed; |
|
my $blocksize = $CRYPTS[ $self->{appinfo}->{cipher} ]{blocksize}; |
|
|
|
$rec->{data} = join '', $packed, $rec->{ivec}, $rec->{encrypted}; |
$rec->{data} = join '', $packed, $rec->{ivec}, $rec->{encrypted}; |
|
|
|
|
|
|
# Decrypt |
# Decrypt |
|
|
sub Decrypt |
sub Decrypt |
{ |
{ |
my $self = shift; |
my $self = shift; |
my $rec = shift; |
my $rec = shift; |
|
|
|
|
1; |
1; |
__END__ |
__END__ |
|
|
=head1 NAME |
=head1 NAME |
|
|
Palm::Keyring - Handler for Palm Keyring databases. |
Palm::Keyring - Handler for Palm Keyring databases. |
|
|
It has the standard Palm::PDB methods with 2 additional public methods. |
It has the standard Palm::PDB methods with 2 additional public methods. |
Decrypt and Encrypt. |
Decrypt and Encrypt. |
|
|
It currently supports the v4 Keyring databases. The v5 databases from |
It currently supports the v4 Keyring databases. |
the pre-release keyring-2.0 are not supported. |
The pre-release v5 databases are mostly supported. There are definitely some |
|
bugs, For example, t/keyring5.t sometimes fails. I am not sure why yet. |
|
|
This module doesn't store the decrypted content. It only keeps it until it |
This module doesn't store the decrypted content. It only keeps it until it |
returns it to you or encrypts it. |
returns it to you or encrypts it. |
|
|
$pdb->Load($file); |
$pdb->Load($file); |
|
|
foreach (0..$#{ $pdb->{records} }) { |
foreach (0..$#{ $pdb->{records} }) { |
next if $_ = 0; # skip the password record |
# skip the password record for version 4 databases |
|
next if $_ == 0 && $pdb->{version} == 4; |
my $rec = $pdb->{records}->[$_]; |
my $rec = $pdb->{records}->[$_]; |
my $acct = $pdb->Decrypt($rec, $pass); |
my $acct = $pdb->Decrypt($rec, $pass); |
print $rec->{name}, ' - ', $acct->{account}, "\n"; |
print $rec->{name}, ' - ', $acct->{account}, "\n"; |
|
|
|
|
=head2 new |
=head2 new |
|
|
$pdb = new Palm::Keyring([$password]); |
$pdb = new Palm::Keyring([$password[, $version]]); |
|
|
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. |
|
|
If you pass in a password, it will initalize the first record with the encrypted |
If you pass in a password, it will initalize the first record with the encrypted |
password. |
password. |
|
|
|
new() now also takes options in other formats |
|
|
|
$pdb = new Palm::Keyring({ key1 => value1, key2 => value2 }); |
|
$pdb = new Palm::Keyring( -key1 => value1, -key2 => value2); |
|
|
|
=head3 Supported options are: |
|
|
|
=over |
|
|
|
=item password |
|
|
|
The password used to initialize the database |
|
|
|
=item version |
|
|
|
The version of database to create. Accepts either 4 or 5. Currently defaults to 4. |
|
|
|
=item v4compatible |
|
|
|
The format of the fields passed to Encrypt and returned from Decrypt have changed. |
|
This allows programs to use the newer databases with few changes but with less features. |
|
|
|
=item cipher |
|
|
|
The cipher to use. 0, 1, 2 or 3. |
|
|
|
0 => None |
|
1 => DES_EDE3 |
|
2 => AES128 |
|
3 => AES256 |
|
|
|
=item iterations |
|
|
|
The number of iterations to encrypt with. |
|
|
|
=back |
|
|
=head2 Encrypt |
=head2 Encrypt |
|
|
$pdb->Encrypt($rec, $acct[, $password]); |
$pdb->Encrypt($rec, $acct[, $password]); |
|
|
used, or with a password that is passed. |
used, or with a password that is passed. |
|
|
$rec is a record from $pdb->{records} or a new_Record(). |
$rec is a record from $pdb->{records} or a new_Record(). |
$acct is a hashref in the format below. |
The v4 $acct is a hashref in the format below. |
|
|
my $acct = { |
my $v4acct = { |
name => $rec->{name}, |
name => $rec->{name}, |
account => $account, |
account => $account, |
password => $password, |
password => $password, |
|
|
}, |
}, |
}; |
}; |
|
|
|
The v5 $acct is an arrayref full of hashrefs that contain each encrypted field. |
|
|
|
my $v5acct = [ |
|
{ |
|
'label_id' => 2, |
|
'data' => 'abcd1234', |
|
'label' => 'password', |
|
'font' => 0 |
|
}, |
|
{ |
|
'label_id' => 3, |
|
'data' => { |
|
'month' => 1, |
|
'day' => 11, |
|
'year' => 107 |
|
}, |
|
'label' => 'lastchange', |
|
'font' => 0 |
|
}, |
|
{ |
|
'label_id' => 255, |
|
'data' => 'This is a short note.', |
|
'label' => 'notes', |
|
'font' => 0 |
|
} |
|
]; |
|
|
|
|
|
The account name is stored in $rec->{name} for both v4 and v5 databases. |
|
It is not returned in the decrypted information for v5. |
|
|
|
$rec->{name} = 'account name'; |
|
|
If you have changed anything other than the lastchange, or don't pass in a |
If you have changed anything other than the lastchange, or don't pass in a |
lastchange key, Encrypt() will generate a new lastchange date for you. |
lastchange key, Encrypt() will generate a new lastchange date for you. |
|
|
|
|
|
|
my $acct = $pdb->Decrypt($rec[, $password]); |
my $acct = $pdb->Decrypt($rec[, $password]); |
|
|
Decrypts the record and returns a hashref for the account as described |
Decrypts the record and returns a reference for the account as described |
under Encrypt(). |
under Encrypt(). |
|
|
foreach (0..$#{ $pdb->{records}) { |
foreach (0..$#{ $pdb->{records}) { |
next if $_ == 0; |
next if $_ == 0 && $pdb->{version} == 4; |
my $rec = $pdb->{records}->[$_]; |
my $rec = $pdb->{records}->[$_]; |
my $acct = $pdb->Decrypt($rec[, $password]); |
my $acct = $pdb->Decrypt($rec); |
# do something with $acct |
# do something with $acct |
} |
} |
|
|
|
|
=head2 Password |
=head2 Password |
|
|
$pdb->Password([$password[, $new_password]]); |
$pdb->Password([$password[, $new_password]]); |
|
|
|
|
The Keyring for Palm OS website: |
The Keyring for Palm OS website: |
L<http://gnukeyring.sourceforge.net/> |
L<http://gnukeyring.sourceforge.net/> |
|
|
|
The HACKING guide for palm keyring databases: |
|
L<http://gnukeyring.cvs.sourceforge.net/*checkout*/gnukeyring/keyring/HACKING> |
|
|
Johan Vromans also has a wxkeyring app that now uses this module, available |
Johan Vromans also has a wxkeyring app that now uses this module, available |
from his website at L<http://www.vromans.org/johan/software/sw_palmkeyring.html> |
from his website at L<http://www.vromans.org/johan/software/sw_palmkeyring.html> |