=================================================================== RCS file: /cvs/palm/Palm-Keyring/lib/Palm/Keyring.pm,v retrieving revision 1.34 retrieving revision 1.36 diff -u -r1.34 -r1.36 --- palm/Palm-Keyring/lib/Palm/Keyring.pm 2007/02/21 05:24:14 1.34 +++ palm/Palm-Keyring/lib/Palm/Keyring.pm 2007/02/22 05:16:04 1.36 @@ -1,5 +1,5 @@ package Palm::Keyring; -# $RedRiver: Keyring.pm,v 1.33 2007/02/21 01:26:07 andrew Exp $ +# $RedRiver: Keyring.pm,v 1.35 2007/02/22 04:11:35 andrew Exp $ ######################################################################## # Keyring.pm *** Perl class for Keyring for Palm OS databases. # @@ -16,6 +16,7 @@ use warnings; use Carp; +$Carp::Verbose = 1; use base qw/ Palm::StdAppInfo /; @@ -262,7 +263,7 @@ my $unpackstr = ("C1" x 8) # 8 uint8s in an array for the salt - . ("S1" x 2) # the iter (uint16) and the cipher (uint16) + . ("n1" x 2) # the iter (uint16) and the cipher (uint16) . ("C1" x 8); # and finally 8 more uint8s for the hash my (@salt, $iter, $cipher, @hash); @@ -303,7 +304,7 @@ my $packstr = ("C1" x 8) # 8 uint8s in an array for the salt - . ("S1" x 2) # the iter (uint16) and the cipher (uint16) + . ("n1" x 2) # the iter (uint16) and the cipher (uint16) . ("C1" x 8); # and finally 8 more uint8s for the hash my @salt = map { hex $_ } $appinfo->{salt} =~ /../gxm; @@ -407,8 +408,6 @@ sub _encrypt_v4 { - require Crypt::CBC; - my $new = shift; my $old = shift; my $digest = shift; @@ -559,9 +558,10 @@ $encrypted = $decrypted; } elsif ($cipher_name eq 'DES_EDE3' or $cipher_name eq 'Rijndael') { + require Crypt::CBC; my $c = Crypt::CBC->new( - -literal_key => 1, -key => $key, + -literal_key => 1, -iv => $ivec, -cipher => $cipher_name, -keysize => $keylen, @@ -659,7 +659,6 @@ sub _decrypt_v5 { - require Crypt::CBC; my $encrypted = shift; my $key = shift; @@ -677,9 +676,10 @@ $decrypted = $encrypted; } elsif ($cipher_name eq 'DES_EDE3' or $cipher_name eq 'Rijndael') { + require Crypt::CBC; my $c = Crypt::CBC->new( - -literal_key => 1, -key => $key, + -literal_key => 1, -iv => $ivec, -cipher => $cipher_name, -keysize => $keylen, @@ -791,7 +791,7 @@ } } } elsif ($self->{version} == 5) { - return _password_verify_v5($pass, $self->{appinfo}); + return _password_verify_v5($self->{appinfo}, $pass); } else { # XXX unsupported version } @@ -830,8 +830,8 @@ sub _password_verify_v5 { - my $pass = shift; my $appinfo = shift; + my $pass = shift; my $salt = pack("H*", $appinfo->{salt}); @@ -841,7 +841,9 @@ $CRYPTS[ $appinfo->{cipher} ]{DES_odd_parity}, ); + #print "Iter: '" . $appinfo->{iter} . "'\n"; #print "Key: '". unpack("H*", $key) . "'\n"; + #print "Salt: '". unpack("H*", $salt) . "'\n"; #print "Hash: '". $hash . "'\n"; #print "Hash: '". $appinfo->{masterhash} . "'\n"; @@ -1060,7 +1062,7 @@ $labels[3] = 'lastchange'; $labels[255] = 'notes'; - my ($len) = unpack "S1", $field; + my ($len) = unpack "n1", $field; if ($len + 4 > length $field) { return undef, $field; } @@ -1107,7 +1109,7 @@ $data = _pack_keyring_date($data); } my $len = length $data; - my $packstr = "S1 C1 C1 A*"; + my $packstr = "n1 C1 C1 A*"; my $packed = pack $packstr, ($len, $label, $font, $data); @@ -1342,6 +1344,14 @@ =back +For v5 databases there are some additional appinfo fields set. + + $pdb->{appinfo} = { + # normal appinfo stuff described in L + cipher => The index number of the cipher being used + iter => Number of iterations for the cipher + }; + =head2 crypt Pass in the alias of the crypt to use, or the index. @@ -1360,7 +1370,6 @@ default_iter => , }; - =head2 Encrypt $pdb->Encrypt($rec, $acct[, $password[, $ivec]]); @@ -1455,6 +1464,28 @@ the password. If nothing is passed, it forgets the password that it was remembering. + +After a successful password verification the following fields are set + +For v4 + + $pdb->{digest} = the calculated digest used from the key; + $pdb->{password} = the password that was passed in; + +For v5 + + $pdb->{appinfo} = { + # As described under new() with these additional fields + cipher => The index number of the cipher being used + iter => Number of iterations for the cipher + key => The key that is calculated from the password + and salt and is used to decrypt the records. + masterhash => the hash of the key that is stored in the + database. Either set when Loading the database + or when setting a new password. + salt => the salt that is either read out of the database + or calculated when setting a new password. + }; =head1 DEPENDENCIES