Chinaunix首页 | 论坛 | 博客
  • 博客访问: 486734
  • 博文数量: 279
  • 博客积分: 4467
  • 博客等级: 上校
  • 技术积分: 2830
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-03 14:43
文章分类

全部博文(279)

文章存档

2013年(1)

2012年(39)

2011年(35)

2009年(29)

2008年(131)

2007年(44)

分类:

2008-07-02 11:55:32

# Before `make install' is performed this script should be runnable with

# `make test'. After `make install' it should work as `perl test.pl'


#use Test;


use strict;

use constant USERID    => "GnuPG Test";
use constant PASSWD    => "test";
use constant UNTRUSTED    => "Francis";

use Symbol;

BEGIN {
    $| = 1;
}

use GnuPG;
use GnuPG::Tie::Encrypt;
use GnuPG::Tie::Decrypt;

my $gpg = new GnuPG( homedir => "test", trace => $ENV{TRACING} );

sub gen_key_test {
    printf "%-40s", "Key generation";
    $gpg->gen_key(
         passphrase => PASSWD,
         name     => USERID,
         );
}

sub import_test {
    printf "%-40s", "Import new public key";
    $gpg->import_keys( keys => "test/key1.pub" );
}

sub import2_test {
    printf "%-40s", "Import existing public key";
    $gpg->import_keys( keys => "test/key1.pub" );
}

sub import3_test {
    printf "%-40s", "Import many public keys";
    $gpg->import_keys( keys => [ qw( test/key1.pub test/key2.pub ) ] );
}
sub export_test {
    printf "%-40s", "Public key export";
    $gpg->export_keys( keys    => USERID,
         armor    => 1,
         output    => "test/key.pub",
         );
}

sub export2_test {
    printf "%-40s", "Exporting public key ring";
    $gpg->export_keys( armor    => 1,
         output    => "test/keyring.pub",
         );
}

sub export_secret_test {
    printf "%-40s", "Exporting secret key";
    $gpg->export_keys( secret    => 1,
         armor    => 1,
         output    => "test/key.sec",
         );
}

sub encrypt_test {
    printf "%-40s", "Encrypt";
    $gpg->encrypt(
         recipient => USERID,
         output => "test/file.txt.gpg",
         armor     => 1,
         plaintext => "test/file.txt",
         );
}

sub pipe_encrypt_test {
    printf "%-40s", "Pipe Encrypt";
    open CAT, "| cat > test/pipe-file.txt.gpg"
      or die "can't fork: $!\n";
    $gpg->encrypt(
         recipient => USERID,
         output => \*CAT,
         armor     => 1,
         plaintext => "test/file.txt",
         );
    close CAT;
}

sub encrypt_sign_test {
    printf "%-40s", "Encrypt and Sign";
    $gpg->encrypt(
         recipient    => USERID,
         output    => "test/file.txt.sgpg",
         armor        => 1,
         sign        => 1,
         plaintext    => "test/file.txt",
         passphrase    => PASSWD,
         );
}

sub encrypt_sym_test {
    printf "%-40s", "Symmetric encryption";
    $gpg->encrypt(
         output    => "test/file.txt.cipher",
         armor        => 1,
         plaintext    => "test/file.txt",
         symmetric    => 1,
         passphrase    => PASSWD,
         );
}

sub encrypt_notrust_test {
    printf "%-40s", "Encrypt to undefined trust";
    $gpg->encrypt(
         recipient    => UNTRUSTED,
         output    => "test/file.txt.dist.gpg",
         armor        => 1,
         sign        => 1,
         plaintext    => "test/file.txt",
         passphrase    => PASSWD,
         );
}

sub sign_test {
    printf "%-40s", "Sign a file";
    $gpg->sign(
         recipient    => USERID,
         output    => "test/file.txt.sig",
         armor        => 1,
         plaintext    => "test/file.txt",
         passphrase    => PASSWD,
         );
}

sub detachsign_test {
    printf "%-40s", "Detach signature of a file";
    $gpg->sign(
         recipient    => USERID,
         output    => "test/file.txt.asc",
         "detach-sign" => 1,
         armor        => 1,
         plaintext    => "test/file.txt",
         passphrase    => PASSWD,
         );
}

sub clearsign_test {
    printf "%-40s", "Clear Sign a File";
    $gpg->clearsign(
         output    => "test/file.txt.clear",
         armor    => 1,
         plaintext    => "test/file.txt",
         passphrase => PASSWD,
         );
}

sub decrypt_test {
    printf "%-40s", "Decrypt a file";
    $gpg->decrypt(
         output    => "test/file.txt.plain",
         ciphertext    => "test/file.txt.gpg",
         passphrase => PASSWD,
         );
}
sub pipe_decrypt_test {
    printf "%-40s", "Pipe Decrypt";
    open CAT, "cat test/file.txt.gpg|"
      or die "can't fork: $!\n";
    $gpg->decrypt(
         output    => "test/file.txt.plain",
         ciphertext    => \*CAT,
         passphrase => PASSWD,
         );
    close CAT;
}

sub decrypt_sign_test {
    printf "%-40s", "Decrypt a Signed File";
    $gpg->decrypt(
         output    => "test/file.txt.plain2",
         ciphertext    => "test/file.txt.sgpg",
         passphrase => PASSWD,
         );
}

sub decrypt_sym_test {
    printf "%-40s", "Symmetric decryption";
    $gpg->decrypt(
         output    => "test/file.txt.plain3",
         ciphertext    => "test/file.txt.cipher",
         symmetric    => 1,
         passphrase => PASSWD,
         );
}

sub verify_sign_test {
    printf "%-40s", "Verify a signed file";
    $gpg->verify( signature    => "test/file.txt.sig" );
}

sub verify_detachsign_test {
    printf "%-40s", "Verify a detach signature";
    $gpg->verify( signature    => "test/file.txt.asc",
         file        => "test/file.txt",
        );
}

sub verify_clearsign_test {
    printf "%-40s", "Verify a clearsigned file";
    $gpg->verify( signature => "test/file.txt.clear" );
}

sub encrypt_from_fh_test {
    printf "%-40s", "Encrypt from file handle";
    open ( FH, "test/file.txt" )
      or die "error opening file: $!\n";
    $gpg->encrypt(
         recipient => UNTRUSTED,
         output => "test/file-fh.txt.gpg",
         armor     => 1,
         plaintext => \*FH,
         );
    close ( FH )
      or die "error closing file: $!\n";
}

sub encrypt_to_fh_test {
    printf "%-40s", "Encrypt to file handle";
    open ( FH, ">test/file-fho.txt.gpg" )
      or die "error opening file: $!\n";
    $gpg->encrypt(
         recipient => UNTRUSTED,
         output => \*FH,
         armor     => 1,
         plaintext => "test/file.txt",
         );
    close ( FH )
      or die "error closing file: $!\n";
}

sub tie_encrypt_test {
    printf "%-40s", "Tied encrypt interface";
    open( PLAINTEXT, "test/file.txt" )
      or die "error opening file: $!\n";
    open( CIPHER_OUT, ">test/file-tie.txt.asc" )
      or die "error writing encrypting file\n";
    tie *CIPHER, 'GnuPG::Tie::Encrypt', homedir => "test",
      recipient => 'GnuPG', armor => 1, trace => $ENV{TRACING};
    while (<PLAINTEXT>) {
    print CIPHER $_;
    }
    close PLAINTEXT;

    while (<CIPHER>) {
    print CIPHER_OUT $_;
    }
    close CIPHER;
    untie *CIPHER;
    close CIPHER_OUT;
}

sub tie_decrypt_test {
    printf "%-40s", "Tied decrypt interface";
    open( PLAINTEXT, "test/file.txt" )
      or die "error opening plaintext file: $!\n";
    my $plaintext_orig = "";
    $plaintext_orig .= $_ while ( <PLAINTEXT>);
    close PLAINTEXT;

    open( CIPHER, "test/file-tie.txt.asc" )
      or die "error opening encrypted file\n";
    tie *GNUPG, 'GnuPG::Tie::Decrypt', homedir => "test",
      passphrase => PASSWD, trace => $ENV{TRACING};

    while ( <CIPHER> ) {
    print GNUPG $_;
    }
    my $plaintext = "";
    while ( <GNUPG> ) {
    $plaintext .= $_;
    }
    close GNUPG;
    untie *GNUPG;
    close CIPHER;

    die "plaintext doesn't match\n" unless $plaintext_orig eq $plaintext;
}

sub tie_decrypt_para_mode_test {
    printf "%-40s", "Tied decrypt in paragraph mode";
    my $plaintext = <<EOF;
This is a paragraph.

This is another paragraph
which continue on another line.



This is the final paragraph.
EOF
    tie *CIPHER, 'GnuPG::Tie::Encrypt', homedir => "test",
      recipient => 'GnuPG', armor => 1, trace => $ENV{TRACING};

    print CIPHER $plaintext;
    local $/ = undef;
    my $cipher = <CIPHER>;
    close CIPHER;
    untie *CIPHER;

    local $/ = "";
    tie *TEST, 'GnuPG::Tie::Decrypt', homedir => "test", passphrase => PASSWD;
    print TEST $cipher;

    my @para = <TEST>;
    close TEST;
    untie *TEST;

    my $count = @para;
    die "paragraph count should be 3: $count\n" unless $count == 3;
    die "plaintext doesn't match input\n" unless join( "", @para) eq $plaintext;
}

my @tests = qw(
                gen_key_test
            import_test     import2_test        import3_test
            export_test     export2_test        export_secret_test
            encrypt_test     pipe_encrypt_test    pipe_decrypt_test
        encrypt_sign_test encrypt_sym_test
            encrypt_notrust_test
            decrypt_test     decrypt_sign_test    decrypt_sym_test
            sign_test     detachsign_test    clearsign_test
            verify_sign_test verify_detachsign_test verify_clearsign_test
        tie_encrypt_test tie_decrypt_test tie_decrypt_para_mode_test
         );

if ( defined $ENV{TESTS} ) {
    @tests = split /\s+/, $ENV{TESTS};
}

print "1..", scalar @tests, "\n";
my $i = 1;
for ( @tests ) {
    eval {
    no strict 'refs'; # We are using symbolic references

    &$_();
    };
    if ( $@ ) {
    print "not ok $i: $@";
    } else {
    print "ok $i\n";
    }
    $i++;
}



阅读(630) | 评论(0) | 转发(0) |
0

上一篇:decrypt.pl

下一篇:ws1各脚本功能说明

给主人留下些什么吧!~~