[BACK]Return to keyring.t CVS log [TXT][DIR] Up to [local] / palm / Palm-Keyring / t

Diff for /palm/Palm-Keyring/t/keyring.t between version 1.5 and 1.27

version 1.5, 2007/02/03 00:53:22 version 1.27, 2011/09/19 04:05:11
Line 1 
Line 1 
 # Before `make install' is performed this script should be runnable with  #!/usr/bin/perl -T
 # `make test'. After `make install' it should work as `perl test.pl'  # $RedRiver: keyring.t,v 1.24 2008/09/19 05:53:08 andrew Exp $
   use strict;
   use warnings;
   
 ######################### We start with some black magic to print on failure.  use Test::More tests => 333;
   use Data::Dumper;
   
 # Change 1..1 below to 1..last_test_to_print .  BEGIN {
 # (It may become useful if the test is moved to ./t subdirectory.)      use_ok('Palm::PDB');
       use_ok('Palm::Keyring');
   }
   
 my $test = 1;  my $file         = 'Keys-test.pdb';
 BEGIN { $| = 1; print "1..20\n"; }  my $password     = '12345';
 END {print "not ok $test\n" unless $loaded;}  my $new_password = '54321';
 use Palm::PDB;  
 use Palm::Keyring;  
 $loaded = 1;  
 print "ok $test\n";  
 $test++;  
   
 ######################### End of black magic.  my @o = (
       {   version  => 4,
           password => $password,
       },
       {   version  => 5,
           password => $password,
           cipher   => 1,
       },
   );
   
 # Insert your test code below (better if it prints "ok 13"  
 # (correspondingly "not ok 13") depending on the success of chunk 13  
 # of the test code):  
   
 my $file = 'Keys-GTKR-test.pdb';  
 my $password = '12345';  
 my $new_password = '54321';  
 my $acct = {  my $acct = {
     name        => 'test3',      0 => {
         account     => 'atestaccount',          label    => 'name',
         password    => $password,          label_id => 0,
         notes       => 'now that really roxorZ!',          data     => 'test3',
     lastchange  => {          font     => 0,
         day   =>  2,  
         month =>  2,  
         year  => 99,  
     },      },
       1 => {
           label    => 'account',
           label_id => 1,
           data     => 'atestaccount',
           font     => 0,
       },
       2 => {
           label    => 'password',
           label_id => 2,
           data     => $password,
           font     => 0,
       },
       3 => {
           label    => 'lastchange',
           label_id => 3,
           data     => {
               day   => 2,
               month => 2,
               year  => 99,
           },
           font => 0,
       },
       255 => {
           label    => 'notes',
           label_id => 255,
           data     => 'now that really roxorZ!',
           font     => 0,
       },
 };  };
   
   my %unchanging_date = %{ $acct->{3}->{data} };
   
   my $bad_version     = 999;
   
   my $bad_cipher      = 999;
   my %crypt_1_details = (
       'default_iter'   => 1000,
       'keylen'         => 24,
       'blocksize'      => 8,
       'name'           => 'DES_EDE3',
       'alias'          => 'DES-EDE3',
       'DES_odd_parity' => 1
   );
   
   my $bad_label       = 999;
   my $bad_label_name  = 'not_a_label_name';
   my %label_1_details = (
       id   => 1,
       name => 'account',
   );
   my %label_not_found_details = (
       id   => $bad_label,
       name => undef,
   );
   
   # Crypts
   is_deeply( Palm::Keyring::crypts(1), \%crypt_1_details, 'Got crypt 1' );
   is_deeply( Palm::Keyring::crypts('DES-EDE3'),
       \%crypt_1_details, 'Got crypt DES-EDE3' );
   is( Palm::Keyring::crypts(), undef, "Didn't get crypt empty cipher" );
   is( Palm::Keyring::crypts($bad_cipher),
       undef, "Didn't get crypt $bad_cipher" );
   
   # Bad Cipher
   eval { Palm::Keyring->new( { version => 5, cipher => $bad_cipher } ) };
   like(
       $@,
       qr/^Unknown \s cipher \s $bad_cipher/xms,
       "Failed to create keyring with cipher $bad_cipher"
   );
   
   # Labels
   is_deeply( Palm::Keyring::labels(1), \%label_1_details, 'Got label 1' );
   is_deeply( Palm::Keyring::labels('account'),
       \%label_1_details, 'Got label account' );
   is( Palm::Keyring::labels(), undef, "Didn't get label empty label" );
   is_deeply( Palm::Keyring::labels($bad_label),
       \%label_not_found_details, "Got default label for $bad_label" );
   is( Palm::Keyring::labels($bad_label_name), undef, "Didn't get label for $bad_label_name"
   );
   
   # encrypt/decrypt (v4)
   my %acctv4 = (
       account  => 'account name',
       password => $password,
       notes    => 'these are notes',
       lastchange => undef,
   );
   
   my $digestv4;
   ok( $digestv4 = Palm::Keyring::_calc_keys( $password ), '_calc_keys' );
   
   my $encryptedv4;
   ok( $encryptedv4 = Palm::Keyring::_encrypt_v4( \%acctv4, {}, $digestv4 ),
       '_encrypt_v4');
   
   my $plaintextv4;
   ok( $plaintextv4 = Palm::Keyring::_decrypt_v4( $encryptedv4, $digestv4 ),
       '_decrypt_v4');
   
   $plaintextv4->{lastchange} = undef;
   is_deeply( $plaintextv4, \%acctv4, 'Is what we got back, what we sent in?' );
   
   my $NULL = chr(0);
   $plaintextv4 = join $NULL, $acctv4{account}, $acctv4{password}, $acctv4{notes};
   
   ok( $encryptedv4 = Palm::Keyring::_crypt3des( $plaintextv4, $digestv4, 1 ),
       'encrypt without date' ); # 1 is encrypt
   
   ok( $plaintextv4 = Palm::Keyring::_decrypt_v4( $encryptedv4, $digestv4 ),
       '_decrypt_v4');
   
   $plaintextv4->{'lastchange'} = undef;
   is_deeply( $plaintextv4, \%acctv4, 'Is what we got back, what we sent in?' );
   
   # Password
   
   eval{ Palm::Keyring::_password_verify_v4() };
   like(
       $@,
       qr/^No \s password \s specified!/xms,
       '_password_verify_v4 with no password'
   );
   
   eval{ Palm::Keyring::_password_verify_v4($password) };
   like(
       $@,
       qr/^No \s encrypted \s password \s in \s file!/xms,
       '_password_verify_v4 with no password'
   );
   
 my $pdb;  my $pdb;
   
   eval { $pdb = new Palm::Keyring( -file => 't/Keys-invalid_version.pdb' ) };
   like(
       $@,
       qr/^Unsupported \s Version \s $bad_version/xms,
       'Couldn\'t load pdb with invalid version'
   );
   
   eval { $pdb = new Palm::Keyring( -file => 't/Keys-invalid_cipher.pdb' ) };
   like(
       $@,
       qr/^Unknown \s cipher \s $bad_version/xms,
       'Couldn\'t load pdb with Unknown Cipher'
   );
   
   eval { $pdb = new Palm::Keyring( -file => 't/Keys-invalid_appinfo.pdb' ) };
   like(
       $@,
       qr/^Corrupt \s appinfo\? \s no \s {other}/xms,
       'Couldn\'t load pdb with invalid appinfo'
   );
   
   eval{ $pdb = new Palm::Keyring( -file => 't/Keys-no_data.pdb', -password =>
           $new_password ) };
   like(
       $@,
       qr/^Incorrect \s Password/xms,
       'Couldn\'t load Palm::Keyring file with no data and wrong password'
   );
   
   ok( $pdb = new Palm::Keyring( -file => 't/Keys-no_data.pdb' ),
       'Loaded Palm::Keyring file with no data' );
   
 my $record;  my $record;
   ok( $record = $pdb->append_Record(), 'Append Record' );
   my $ivec = pack("C*", 1..8);
   ok( $pdb->Encrypt( $record, $password, $acct, $ivec),
       'Encrypt account into record (with custom ivec)' );
   
 eval { $pdb = new Palm::Keyring($password) };  $acct->{254} = {
 unless( $@ ) {          label    => 'misc',
         print "ok $test\n";          label_id => 254,
 } else {          data     => 'This doesn\'t even really existx',
         print "not ok $test\n";          font     => 0,
 }  };
 $test++;  ok( $pdb->Encrypt( $record, $password, $acct ),
       'Encrypt account into record (with custom field)' );
   
 eval { $record = $pdb->append_Record() };  delete $acct->{254};
 unless( $@ ) {  
         print "ok $test\n";  
 } else {  
         print "not ok $test\n";  
 }  
 $test++;  
   
 eval { $pdb->Encrypt($record, $acct, $password) || die };  
 unless( $@ ) {  
         print "ok $test\n";  
 } else {  
         print "not ok $test\n";  
 }  
 $test++;  
   
   delete $record->{plaintext};
   
   ok( $pdb->PackRecord($record), 'Pack Proper Record');
   ok( $record = $pdb->ParseRecord(%{ $record }), 'Parse Proper Packed');
   
   my $record2;
   ok( $record2 = $pdb->append_Record(), 'Append Record' );
   eval{ $pdb->PackRecord($record2) };
   like(
       $@,
       qr/^No \s encrypted \s data \s in \s record/xms,
       'Pack Empty Record'
   );
   
   $pdb->{appinfo}->{cipher} = 'TESTING';
   
   eval{ $pdb->Decrypt( $record ) };
   like(
       $@,
       qr/^Unsupported \s Crypt \s Testing/xms,
       'Couldn\'t Decrypt with unsupported Crypt'
   );
   
   my $encrypted = delete $record->{encrypted};
   eval{ $pdb->Encrypt( $record ) };
   like(
       $@,
       qr/^Unsupported \s Crypt \s Testing/xms,
       'Couldn\'t Encrypt with unsupported Crypt'
   );
   $record->{encrypted} = $encrypted;
   
   $pdb->{appinfo}->{cipher} = $bad_cipher;
   eval{ $pdb->Decrypt( $record ) };
   like(
       $@,
       qr/^Unknown \s cipher \s $bad_cipher/xms,
       'Couldn\'t Decrypt with unsupported cipher'
   );
   
   $encrypted = delete $record->{encrypted};
   eval{ $pdb->Encrypt( $record ) };
   like(
       $@,
       qr/^Unknown \s cipher \s $bad_cipher/xms,
       'Couldn\'t Encrypt with unsupported cipher'
   );
   $record->{encrypted} = $encrypted;
   
   
   $record2->{encrypted} = {};
   delete $record2->{ivec};
   eval{ $pdb->PackRecord($record2) };
   like(
       $@,
       qr/^No \s ivec/xms,
       'Pack Empty Record with encrypted, but no ivec'
   );
   
   
   
   $pdb->{version} = 4;
   delete $record2->{encrypted};
   delete $record2->{data};
   eval{ $pdb->PackRecord($record2) };
   like(
       $@,
       qr/^No \s data \s in \s record \s to \s pack/xms,
       'Pack Empty Record with no data'
   );
   
   
   $pdb->{version} = $bad_version;
   eval{ $pdb->Decrypt( $record ) };
   like(
       $@,
       qr/^Unsupported \s Version \s $bad_version/xms,
       'Couldn\'t Decrypt with unsupported version'
   );
   
   delete $record->{encrypted};
   eval{ $pdb->Encrypt( $record, undef, $acct ) };
   like(
       $@,
       qr/^Unsupported \s Version \s $bad_version/xms,
       'Couldn\'t Encrypt with unsupported version'
   );
   
   
 eval { $pdb->Write($file) };  eval { $pdb->Write($file) };
 unless( $@ ) {  like(
         print "ok $test\n";      $@,
 } else {      qr/^Unsupported \s Version \s $bad_version/xms,
         print "not ok $test\n";      'Couldn\'t Write file with unsupported version'
 }  );
 $test++;  
   
 $pdb = new Palm::PDB;  eval{ $pdb->PackRecord($record) };
 $acct = {};  like( $@,
       qr/^Unsupported \s Version \s $bad_version/xms,
       'Couldn\'t PackRecord with Invalid Version'
   );
   
 eval { $pdb->Load($file) };  $record2->{data} = q{nothing};
 unless( $@ ) {  eval{ $pdb->ParseRecord(%{ $record2 }) };
         print "ok $test\n";  like( $@,
 } else {      qr/^Unsupported \s Version \s $bad_version/xms,
         print "not ok $test\n";      'Couldn\'t ParseRecord with Invalid Version'
 }  );
 $test++;  
   
 eval { $pdb->Password($password) || die };  eval{ $pdb->Password( $new_password ) };
 unless( $@ ) {  like( $@,
         print "ok $test\n";      qr/^Unsupported \s Version \s $bad_version/xms,
 } else {      'Couldn\'t Password with Invalid Version'
         print "not ok $test\n";  );
 }  
 $test++;  
   
 eval { $acct = $pdb->Decrypt($pdb->{'records'}->[1]) || die };  $pdb     = undef;
 unless( $@ ) {  $record  = undef;
         print "ok $test\n";  $record2 = undef;
 } else {  
         print "not ok $test\n";  
 }  
 $test++;  
   
 if ($acct->{'password'} eq $password) {  unlink $file;
         print "ok $test\n";  
 } else {  
         print "not ok $test\n";  
 }  
 $test++;  
   
 my $old_date = $acct->{'lastchange'};  foreach my $options (@o) {
       foreach my $config_type ( 'hashref', 'cgi-style', 'list' ) {
   
 eval { $pdb->Password($password, $new_password) || die };          my $pdb;
 unless( $@ ) {          my $record;
         print "ok $test\n";          my $decrypted;
 } else {          %{ $acct->{3}->{data} } = %unchanging_date;
         print "not ok $test\n";          my $rec_num = 0;
 }  
 $test++;  
   
 $acct = {};  
 eval { $acct = $pdb->Decrypt($pdb->{'records'}->[1]) || die };  
 unless( $@ ) {  
         print "ok $test\n";  
 } else {  
         print "not ok $test\n";  
 }  
 $test++;  
   
 if ($acct->{'password'} eq $password) {          my $Num_Tests_Left = 25;
         print "ok $test\n";      SKIP: {
 } else {              if ( defined $options->{cipher} && $options->{cipher} > 0 ) {
         print "not ok $test\n";                  my $crypt = Palm::Keyring::crypts( $options->{cipher} );
 }                  skip 'Crypt::CBC not installed', $Num_Tests_Left
 $test++;                      unless eval "require Crypt::CBC";
                   if ($crypt) {
                       skip 'Crypt::' . $crypt->{name} . ' not installed',
                           $Num_Tests_Left
                           unless eval "require Crypt::$crypt->{name}";
                   }
                   else {
                       skip 'Unknown Crypt: ' . $options->{cipher},
                           $Num_Tests_Left;
                   }
               }
   
 my $new_date = $acct->{'lastchange'};              if ( $options->{version} == 4 ) {
                   skip 'Crypt::DES not installed', $Num_Tests_Left
                       unless eval "require Crypt::DES ";
                   skip 'Digest::MD5 not installed', $Num_Tests_Left
                       unless eval "require Digest::MD5 ";
               }
               elsif ( $options->{version} == 5 ) {
                   skip 'Digest::HMAC_SHA1 not installed', $Num_Tests_Left
                       unless eval "require Digest::HMAC_SHA1 ";
               }
   
 if (              my @options = ($options);
     $old_date->{'day'}   == $new_date->{'day'}   &&              if ( $config_type eq 'cgi-style' ) {
     $old_date->{'month'} == $new_date->{'month'} &&                  @options = (
     $old_date->{'year'}  == $new_date->{'year'}                      '-version'  => $options->{version},
 ) {                      '-password' => $options->{password},
     print "ok $test\n";                  );
 } else {                  if ( $options->{cipher} ) {
     print "not ok $test\n";                      push @options, '-cipher', $options->{cipher};
 }                  }
 $test++;              }
               elsif ( $config_type eq 'list' ) {
                   @options = ( $options->{password}, $options->{version} );
                   if ( $options->{cipher} ) {
                       push @options, $options->{cipher};
                   }
               }
   
 $acct->{'password'} = $new_password;              ok( $pdb = new Palm::Keyring(@options),
                   'new Palm::Keyring v' . $options->{version}
               );
   
 eval { $acct = $pdb->Encrypt($pdb->{'records'}->[1], $acct) || die };              ok( $pdb->Write($file), 'Write "empty" file' );
 unless( $@ ) {              #exit if $pdb->{version} == 5;
         print "ok $test\n";  
 } else {  
         print "not ok $test\n";  
 }  
 $test++;  
   
 $old_date = $new_date;              ok( $record = $pdb->append_Record(), 'Append Record' );
 $new_date = $acct->{'lastchange'};  
               ok( $pdb->Password(), 'Clear Password' );
               eval{ $pdb->Encrypt() };
                   like(
                   $@,
                   qr/^Needed \s parameter \s \[record\] \s not \s passed!/xms,
                   'Encrypt account into record without record'
               );
               eval{ $pdb->Encrypt( $record ) };
               like(
                   $@,
                   qr/^Password \s not \s set!/xms,
                   'Encrypt account into record without password'
               );
               eval{ $pdb->Encrypt( $record, $password ) };
               like(
                   $@,
                   qr/^Needed \s parameter \s \[plaintext\] \s not \s passed!/xms,
                   'Encrypt account into record without account'
               );
               eval{ $pdb->Encrypt( $record, $new_password, $acct ) };
               like(
                   $@,
                   qr/^Incorrect \s Password/xms,
                   'Encrypt account into record with wrong password'
               );
   
 eval { $acct = $pdb->Decrypt($pdb->{'records'}->[1]) || die };              ok( $pdb->Encrypt( $record, $password, $acct ),
 unless( $@ ) {                  'Encrypt account into record' );
         print "ok $test\n";  
 } else {  
         print "not ok $test\n";  
 }  
 $test++;  
   
 if (              ok( $pdb->Encrypt( $record, $password, $acct ),
     $old_date->{'day'}   != $new_date->{'day'}   ||                  'Encrypt account into record (with no changes)');
     $old_date->{'month'} != $new_date->{'month'} ||  
     $old_date->{'year'}  != $new_date->{'year'}  
 ) {  
     print "ok $test\n";  
 } else {  
     print "not ok $test\n";  
 }  
 $test++;  
   
 if ($acct->{'password'} eq $new_password) {              ok( $decrypted = $pdb->Decrypt( $pdb->{records}->[$rec_num] ),
         print "ok $test\n";                  'Decrypt record' );
 } else {  
         print "not ok $test\n";  
 }  
 $test++;  
   
 eval { $pdb->Password() || die };  
 unless( $@ ) {  
         print "ok $test\n";  
 } else {  
         print "not ok $test\n";  
 }  
 $test++;  
   
 eval { $acct = $pdb->Decrypt($pdb->{'records'}->[1]) || die };              is( $decrypted->{2}->{data}, $password, 'Got password' );
 if ( $@ ) {  
         print "ok $test\n";  
 } else {  
         print "not ok $test\n";  
 }  
 $test++;  
   
 unless ($acct->{'password'} eq $password) {              ok( $pdb->Write($file), 'Write file' );
         print "ok $test\n";  
 } else {  
         print "not ok $test\n";  
 }  
 $test++;  
   
               $pdb = undef;
   
 unlink($file);              ok( $pdb = new Palm::Keyring(), 'new Palm::Keyring' );
   
 1;              ok( $pdb->Load($file), 'Load File' );
   
               eval{ $pdb->Decrypt( ) };
               like(
                   $@,
                   qr/^Needed \s parameter \s \[record\] \s not \s passed!/xms,
                   'Decrypt with no record'
               );
   
               eval{ $pdb->Decrypt( $pdb->{records}->[$rec_num] ) };
               like(
                   $@,
                   qr/^Password \s not \s set!/xms,
                   'Decrypt with no password set'
               );
   
               eval{ $pdb->Decrypt( $pdb->{records}->[$rec_num], $new_password ) };
               like(
                   $@,
                   qr/^Incorrect \s Password/xms,
                   'Decypt with invalid password'
               );
   
               eval{  $pdb->Password($new_password) };
               like(
                   $@,
                   qr/^Incorrect \s Password/xms,
                   'Verify Incorrect Password'
               );
   
               eval{ $pdb->Decrypt( {} ) };
               like(
                   $@,
                   qr/^No \s encrypted \s content!/xms,
                   'Decrypt with empty record'
               );
   
               ok( $pdb->Password($password), 'Verify Password' );
   
               ok( $decrypted = $pdb->Decrypt( $pdb->{records}->[$rec_num] ),
                   'Decrypt record' );
   
               is( $decrypted->{2}->{data}, $password, 'Got password' );
   
               is_deeply( $decrypted, $acct, 'Account Matches' );
   
               my $old_date = $decrypted->{3}->{data};
   
               ok( $pdb->Password( $password, $new_password ),
                   'Change PDB Password' );
   
               ok( $decrypted = $pdb->Decrypt( $pdb->{'records'}->[$rec_num] ),
                   'Decrypt with new password' );
   
               my $new_date = $decrypted->{3}->{data};
   
               is_deeply( $old_date, $new_date, 'Date didn\'t change' );
   
               $decrypted->{2}->{data} = $new_password;
   
               $pdb->{records}->[$rec_num]->{plaintext} = $decrypted;
   
               ok( $pdb->Encrypt( $pdb->{'records'}->[$rec_num] ),
                   'Encrypt record (new password)' );
   
               ok( $decrypted = $pdb->Decrypt( $pdb->{'records'}->[$rec_num] ),
                   'Decrypt new record' );
   
               is( $decrypted->{2}->{data}, $new_password, 'Got new password' );
   
               $new_date = $decrypted->{3}->{data};
   
               my $od = join '/', map { $old_date->{$_} } sort keys %{$old_date};
               my $nd = join '/', map { $new_date->{$_} } sort keys %{$new_date};
   
               isnt( $od, $nd, 'Date changed' );
   
               %{ $new_date } = %unchanging_date;
               $new_date->{year} = 1999;
               $decrypted->{3}->{data} = $new_date;
   
               ok( $pdb->Encrypt( $pdb->{'records'}->[$rec_num], undef, $decrypted ),
                   'Encrypt record (new date)' );
   
               ok( $decrypted = $pdb->Decrypt( $pdb->{'records'}->[$rec_num] ),
                   'Decrypt new record' );
   
               $new_date = $decrypted->{3}->{data};
   
               $od = $nd;
               $nd = join '/', map { $new_date->{$_} } sort keys %{$new_date};
               my $ud = join '/', map { $unchanging_date{$_} } sort keys %unchanging_date;
   
               isnt( $od, $nd, 'Date changed (from what it used to be)' );
               is(   $ud, $nd, 'Date changed (to what we set)' );
   
               delete $decrypted->{3};
               ok( $pdb->Encrypt( $pdb->{'records'}->[$rec_num], undef, $decrypted ),
                   'Encrypt record (no date)' );
   
               ok( $decrypted = $pdb->Decrypt( $pdb->{'records'}->[$rec_num] ),
                   'Decrypt new record' );
   
               $new_date = $decrypted->{3}->{data};
   
               is( ref $new_date, 'HASH', 'Got a hashref date' );
   
               my $last_decrypted = $decrypted;
   
               $decrypted = {};
               ok( $pdb->Password(), 'Forget password' );
   
               eval {
                   $decrypted = $pdb->Decrypt( $pdb->{'records'}->[$rec_num] );
               };
               ok( $@, 'Don\'t decrypt' );
   
               isnt( $decrypted->{password},
                   $new_password, 'Didn\'t get new password' );
   
               ok( $pdb->Unlock($new_password), 'Unlock' );
   
               my @plaintext = map { $_->{plaintext} } @{ $pdb->{records} };
   
               is_deeply( $plaintext[0], $last_decrypted, 'Account Matches' );
   
               ok( $pdb->Lock(), 'Lock' );
   
               my $cleared_decrypted = {};
               $cleared_decrypted->{0} = $last_decrypted->{0};
               @plaintext = map { $_->{plaintext} } @{ $pdb->{records} };
   
               is_deeply( $plaintext[0], $cleared_decrypted, 'Cleared records' );
   
               $pdb->{records}->[0]->{data} = undef;
               ok( $pdb->Write($file), 'Write file without data' );
               ok( $pdb->Load($file),  'Load File without data' );
   
               ok( unlink($file), 'Remove test pdb v' . $options->{version} );
   
           }
       }
   }
   
   1;

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.27

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>