version 1.2, 2006/01/31 23:03:39 |
version 1.4, 2006/11/10 04:21:17 |
|
|
# This started as Memo.pm, I just made it work for Keyring. |
# This started as Memo.pm, I just made it work for Keyring. |
# |
# |
# $Id$ |
# $Id$ |
# $RedRiver: Keyring.pm,v 1.1 2006/01/26 20:54:19 andrew Exp $ |
# $RedRiver: Keyring.pm,v 1.3 2006/02/02 00:59:08 andrew Exp $ |
|
|
use strict; |
use strict; |
package Palm::Keyring; |
package Palm::Keyring; |
|
|
); |
); |
} |
} |
|
|
|
sub Load |
|
{ |
|
my $self = shift; |
|
$self->SUPER::Load(@_); |
|
|
|
# Skip the first 2 records because they are special |
|
# and don't have any plaintext |
|
my $skip = 0; |
|
foreach my $record (@{ $self->{records} }) { |
|
if ($skip < 2) { |
|
$skip++; |
|
next; |
|
} |
|
my ($name, $encrypted) = split /\000/, $record->{data}, 2; |
|
$record->{plaintext}->{name} = $name; |
|
$record->{encrypted} = $encrypted; |
|
} |
|
1; |
|
} |
|
|
sub Encrypt |
sub Encrypt |
{ |
{ |
my $self = shift; |
my $self = shift; |
|
|
$record->{plaintext}->{password} = defined $password ? $password : ''; |
$record->{plaintext}->{password} = defined $password ? $password : ''; |
$record->{plaintext}->{description} = defined $description ? $description : ''; |
$record->{plaintext}->{description} = defined $description ? $description : ''; |
|
|
print "Name: '$name'\n"; |
#print "Name: '$name'\n"; |
print "Encrypted: '$encrypted' - Length: " . length($encrypted) . "\n"; |
#print "Encrypted: '$encrypted' - Length: " . length($encrypted) . "\n"; |
#print "Hex: '" . unpack("H*", $encrypted) . "'\n"; |
#print "Hex: '" . unpack("H*", $encrypted) . "'\n"; |
#print "Binary: '" . unpack("b*", $encrypted) . "'\n"; |
#print "Binary: '" . unpack("b*", $encrypted) . "'\n"; |
print "Decrypted: '$decrypted' - Length: " . length($decrypted) . "\n"; |
#print "Decrypted: '$decrypted' - Length: " . length($decrypted) . "\n"; |
print "Hex: '" . unpack("H*", $decrypted) . "'\n"; |
#print "Hex: '" . unpack("H*", $decrypted) . "'\n"; |
print "Binary: '" . unpack("b*", $decrypted) . "'\n"; |
#print "Binary: '" . unpack("b*", $decrypted) . "'\n"; |
print "\n"; |
#print "\n"; |
#print "Extra: $extra\n"; |
#print "Extra: $extra\n"; |
#-------------------------------------------------- |
#-------------------------------------------------- |
# print "Account: $account\n"; |
# print "Account: $account\n"; |
|
|
my $self = shift; |
my $self = shift; |
my $pass = shift; |
my $pass = shift; |
|
|
die "No password specified!" unless defined $pass; |
die "No password specified!" unless $pass; |
$self->{password} = $pass; |
$self->{password} = $pass; |
|
|
# AFAIK the thing we use to test the password is |
# AFAIK the thing we use to test the password is |
|
|
my $self = shift; |
my $self = shift; |
my $pass = shift; |
my $pass = shift; |
|
|
die "No password specified!" unless defined $pass; |
die "No password specified!" unless $pass; |
|
|
# if the database already has a password in it |
# if the database already has a password in it |
if ($self->{records}->[0]->{data}) { |
if ($self->{records}->[0]->{data}) { |
|
|
# XXX Have to make this encrypt as well as decrypting, but w00 h00! |
# XXX Have to make this encrypt as well as decrypting, but w00 h00! |
# do null padding on the end of a cleartext if we are going to encrypt it |
# do null padding on the end of a cleartext if we are going to encrypt it |
sub _crypt3des { |
sub _crypt3des { |
my ( $self, $plaintext, $flag ) = @_; |
my ( $self, $plaintext, $flag ) = @_; |
|
|
my $passphrase = $self->{digest} || $self->_calc_keys(); |
my $passphrase = $self->{digest} || $self->_calc_keys(); |
$passphrase .= ' ' x (16*3); |
$passphrase .= ' ' x (16*3); |
my $cyphertext = ""; |
my $cyphertext = ""; |
|
|
|
|
my $size = length ( $plaintext ); |
my $size = length ( $plaintext ); |
print "STRING: '$plaintext' - Length: " . length($plaintext) . "\n"; |
#print "STRING: '$plaintext' - Length: " . length($plaintext) . "\n"; |
|
|
# This check should see if it is plaintext first, if it is, |
# This check should see if it is plaintext first, if it is, |
# pad it with \000 |
# pad it with \000 |
# if not, then die |
# if not, then die |
die "record not 8 byte padded" if (length($plaintext) % 8) && ! $flag; |
die "record not 8 byte padded" if (length($plaintext) % 8) && ! $flag; |
|
|
my %C; |
my %C; |
for ( 0..2 ) { |
for ( 0..2 ) { |
$C{$_} = new Crypt::DES( pack( "H*", substr($passphrase, 16*$_, 16 ))); |
$C{$_} = new Crypt::DES( pack( "H*", substr($passphrase, 16*$_, 16 ))); |
} |
} |
|
|
for ( 0 .. (($size)/8) - 1) { |
for ( 0 .. (($size)/8) - 1) { |
my $pt = substr( $plaintext, $_*8, 8 ); |
my $pt = substr( $plaintext, $_*8, 8 ); |
print "PT: '$pt' - Length: " . length($pt) . "\n"; |
#print "PT: '$pt' - Length: " . length($pt) . "\n"; |
if (length($pt) < 8) { |
if (length($pt) < 8) { |
my $len = 8 - length($pt); |
my $len = 8 - length($pt); |
print "LENGTH: $len\n"; |
print "LENGTH: $len\n"; |
print "Binary: '" . unpack("b*", $pt) . "'\n"; |
print "Binary: '" . unpack("b*", $pt) . "'\n"; |
$pt .= (chr(0) x $len);# . $pt; |
$pt .= (chr(0) x $len);# . $pt; |
print "Binary: '" . unpack("b*", $pt) . "'\n"; |
print "Binary: '" . unpack("b*", $pt) . "'\n"; |
print "PT: '$pt' - Length: " . length($pt) . "\n"; |
#print "PT: '$pt' - Length: " . length($pt) . "\n"; |
} |
} |
$pt = $C{0}->decrypt( $pt ); |
$pt = $C{0}->decrypt( $pt ); |
$pt = $C{1}->encrypt( $pt ); |
$pt = $C{1}->encrypt( $pt ); |
$pt = $C{2}->decrypt( $pt ); |
$pt = $C{2}->decrypt( $pt ); |
print "PT: '$pt' - Length: " . length($pt) . "\n"; |
#print "PT: '$pt' - Length: " . length($pt) . "\n"; |
$cyphertext .= $pt; |
$cyphertext .= $pt; |
} |
} |
|
|
return substr ( $cyphertext, 0, $size ); |
return substr ( $cyphertext, 0, $size ); |
} |
} |
|
|
1; |
1; |