1#!/usr/bin/env perl 2# $Id: test.pl,v 1.2 2003/10/01 12:27:33 tans Exp $ 3 4# Copyright (c) 2002 Shufeng Tan. All rights reserved. 5# 6# This package is free software and is provided "as is" without express 7# or implied warranty. It may be used, redistributed and/or modified 8# under the terms of the Perl Artistic License (see 9# http://www.perl.com/perl/misc/Artistic.html) 10 11use strict; 12use Test; 13BEGIN { plan tests => 30 }; 14 15use Crypt::OICQ; 16 17sub test_encrypt_decrypt { 18 my ($key, $plain) = @_; 19 my $crypt = Crypt::OICQ::encrypt("", $plain, $key); 20 my $plain2 = Crypt::OICQ::decrypt("", $crypt, $key); 21 if ($plain ne $plain2) { 22 die "encrypt-decrypt test failed using key: ", unpack("H*", $key), 23 "\nplain:\n", $plain ? unpack("H*", $plain) : "empty", 24 "\nplain2:\n", $plain2 ? unpack("H*", $plain2) : "empty", "\n"; 25 } 26 return 1; 27} 28 29sub random_test { 30 my $max_k = 16; 31 my $max_len = 1024; 32 my $t0 = time; 33 print "Begin crypt tests on $max_k random keys and $max_len random texts \n"; 34 for (my $k = 0; $k < $max_k; $k++) { 35 my $key = Crypt::OICQ::rand_str(16); 36 for (my $len = 0; $len <= $max_len; $len++) { 37 test_encrypt_decrypt($key, $len ? Crypt::OICQ::rand_str($len) : ""); 38 } 39 } 40 my $t = time - $t0; 41 print $max_k * (1+$max_len), " runs of encrypt/decrypt: $t seconds\n"; 42 return 1; 43} 44 45sub test_decrypt_encrypt_decrypt { 46 my ($crypt, $key) = @_; 47 my $plain = Crypt::OICQ::decrypt("", $crypt, $key); 48 my $crypt2 = Crypt::OICQ::encrypt("", $plain, $key); 49 my $plain2 = Crypt::OICQ::decrypt("", $crypt2, $key); 50 return(1) if $plain2 eq $plain; 51 print "Error:\n"; 52 print "Crypt: ", unpack("H*", $crypt), "\n"; 53 print "Plain: ", unpack("H*", $plain), "\n"; 54 print "Crypt2: ", unpack("H*", $crypt2), "\n"; 55 print "Plain2: ", unpack("H*", $plain2), "\n"; 56 return(0); 57} 58 59my $key = "AbCdEfGh01234567"; 60 61# Test 1: empty string 62 63ok(test_encrypt_decrypt($key, "")); 64 65# Tests 2..17: null strings of length 1 to 16 66 67foreach my $len (1..16) { 68 ok(test_encrypt_decrypt($key, "\0" x $len)); 69} 70 71# Tests 18..29: decrypt strings encrypted by Tencent's code 72 73my @cs = qw( 740b18072ffabdf31f42826e4757c41f1a 7585c63deac3ee4dbb66f42ae2391ac096 76494b2308c0fd4894ce20e85f613545d8 77c785525460c6fa0cbf1b28d828945ab6 78a0984a62b76a21e2b40a323d514da6c7 795f69cbe12cade5facc5602092317b79a 80448a18cb83f06d04d57ae4ef7beff150 81a2599974353a71103b45d604e20eea35bc321881c5d28f18 820b18072ffabdf31fc30b4999ece8ff3489815a8f724cbab2 8385c63deac3ee4dbbe801a13fa33b85a0fa8b98103ad1031e 84 85a2599974353a7110453fb795b53a1ae15089c0dd008f442a1570b31fe53b24949a1982cd1777c2708d63b50ea31987e272ea0aceb557764e8860d9cde5567d5bbd798a7aad80f2444dc37cdb8164551d0072ab405a9880b4a401aa80cb8cf8bc70b38bdd5cfddbc49225245ff4c4dda86165521d355b9defd79978c31cce53ce7490038d8ff5edaed1788e2ccde2deaeddc818f45882919877bc88bed3a20012b4cf34f751a51c3748ca6310bfd8bebb6e4b4170a4ed65ee008d2b4aed42b4ee29d233912e4c1cda3c5ea101e7487a46714c2d5099e4205c834960e729d9a709007d70761b3edd3f 86 8782d64e87e5a48198572f7bc9b75e57b2d022ffbd1a767f021ea10b5a3433818199ac39e0f6193ddb1d02997983c308b476988cb7f0413d5ddd515f31f6d3dacad5da35218a92e48e1080ee11c80e15014dc6b42767d408f6bda401671229d6e51f81bfc4e93e3568f1664d4e2749ae4a61b7b382612768514d0ca048d247edd8eb7d9107033f53b399798d375996264578100ba73c0ce2262325452febb3e0ecc95ef3a74caf941694ef575e155f443e5a57db65075dfc35268212b272017f65c02dff80387272ee52f8c495b4d1e4cda72816443acf3b0c3eead12e593b33e3fd41acebb1d10eb463d76d15b3a913f20985768b9050afa98b3993d28d376c07044a4fe78b5a271455be9a206c9c80b9 88); 89 90foreach my $c (@cs) { 91 ok(test_decrypt_encrypt_decrypt(pack("H*", $c), $key)); 92} 93 94# Test 30: random string test 95 96ok(random_test()); 97 98__END__ 99