diff --git a/perl/FKO/t/02_functions.t b/perl/FKO/t/02_functions.t index 68ae384c..51599119 100644 --- a/perl/FKO/t/02_functions.t +++ b/perl/FKO/t/02_functions.t @@ -85,13 +85,13 @@ ok($tsd_encryption_mode == $def_encryption_mode, 'Encryption mode'); # 10-11 - set and verify username # $err = $f1->username($tuser); -ok($err == 0, 'set username'); +ok($err == FKO::FKO_SUCCESS, 'set username'); ok($f1->username() eq $tuser, 'set username value'); # 12-13 - set and verify spa message string # $err = $f1->spa_message($def_tsd_msg); -ok($err == 0, 'set spa message'); +ok($err == FKO::FKO_SUCCESS, 'set spa message'); ok($f1->spa_message() eq $def_tsd_msg, 'set spa message value'); # Set the hmac digest stuff (none here) @@ -101,7 +101,7 @@ $thmac_key = ''; # and encode all) # $err = $f1->spa_data_final($tuser_pw, $thmac_key); -ok($err == 0, 'f1 spa data final'); +ok($err == FKO::FKO_SUCCESS, 'f1 spa data final'); # 15-16 - Get some of the current spa data for later tests. # @@ -124,12 +124,12 @@ compare_fko($f1, $f2, 'f1-f2'); # make a new fko object based on f1's spa_data. # $err = $f1->digest_type(FKO::FKO_DIGEST_SHA1); -ok($err == 0, 'f1 set digest to sha1'); +ok($err == FKO::FKO_SUCCESS, 'f1 set digest to sha1'); is($f1->digest_type(), FKO::FKO_DIGEST_SHA1, 'verify set digest sha1'); -ok($f1->timestamp(5) == 0, 'reset timestamp 1'); +ok($f1->timestamp(5) == FKO::FKO_SUCCESS, 'reset timestamp 1'); isnt($f1->timestamp(), $f2->timestamp(), 'verify new timestamp 1'); -ok($f1->spa_data_final($tuser_pw, $thmac_key) == 0, +ok($f1->spa_data_final($tuser_pw, $thmac_key) == FKO::FKO_SUCCESS, 'f1 recompute spa data 1'); my $f3 = FKO->new($f1->spa_data(), $tuser_pw, $f1->encryption_mode(), @@ -148,18 +148,18 @@ $thmac_key = 'This is a bogus hmac key - 1234567890'; $tsd_hmac_digest_type = FKO::FKO_HMAC_SHA512; $err = $f1->digest_type(FKO::FKO_DIGEST_MD5); -ok($err == 0, 'f1 set digest to md5'); +ok($err == FKO::FKO_SUCCESS, 'f1 set digest to md5'); is($f1->digest_type(), FKO::FKO_DIGEST_MD5, 'verify set digest md5'); $err = $f1->hmac_type($tsd_hmac_digest_type); -ok($err == 0, 'f1 set set HMAC digest to sha512'); +ok($err == FKO::FKO_SUCCESS, 'f1 set set HMAC digest to sha512'); is($f1->hmac_type(), $tsd_hmac_digest_type, 'verify set HMAC digest sha512'); my $tts = $f1->timestamp(); -ok($f1->timestamp(10) == 0, 'reset timestamp 2'); +ok($f1->timestamp(10) == FKO::FKO_SUCCESS, 'reset timestamp 2'); isnt($f1->timestamp(), $tts, 'verify new timestamp 2'); -ok($f1->spa_data_final($tuser_pw, $thmac_key) == 0, +ok($f1->spa_data_final($tuser_pw, $thmac_key) == FKO::FKO_SUCCESS, 'f2 recompute spa data 1'); my $f4 = FKO->new($f1->spa_data(), $tuser_pw, $f1->encryption_mode(), @@ -186,7 +186,7 @@ ok($f1, 'Create f1 #2'); # Force rand value. # -ok($f1->rand_value('0123456789012345') == 0, 'force rand value'); +ok($f1->rand_value('0123456789012345') == FKO::FKO_SUCCESS, 'force rand value'); is($f1->rand_value(), '0123456789012345', 'verify force rand_value'); # Iterate over setting message type @@ -202,28 +202,28 @@ my @msg_types = ( ); foreach my $mt ( @msg_types ) { - ok($f1->spa_message_type($mt) == 0, "set msg_type to $mt"); + ok($f1->spa_message_type($mt) == FKO::FKO_SUCCESS, "set msg_type to $mt"); is($f1->spa_message_type(), $mt, "verify msg_type is $mt"); } # SPA message # -ok($f1->spa_message('1.1.1.1,udp/111') == 0, 'set spa message'); +ok($f1->spa_message('1.1.1.1,udp/111') == FKO::FKO_SUCCESS, 'set spa message'); is($f1->spa_message(), '1.1.1.1,udp/111', 'verify spa message'); # Nat Access # -ok($f1->spa_nat_access('1.2.1.1,211') == 0, 'set nat_access message'); +ok($f1->spa_nat_access('1.2.1.1,211') == FKO::FKO_SUCCESS, 'set nat_access message'); is($f1->spa_nat_access(), '1.2.1.1,211', 'verify nat_access message'); # Server Auth # -ok($f1->spa_server_auth('crypt,bubba') == 0, 'set server_auth message'); +ok($f1->spa_server_auth('crypt,bubba') == FKO::FKO_SUCCESS, 'set server_auth message'); is($f1->spa_server_auth(), 'crypt,bubba', 'verify server_auth message'); # Client Timeout # -ok($f1->spa_client_timeout(666) == 0, 'set client_timeout'); +ok($f1->spa_client_timeout(666) == FKO::FKO_SUCCESS, 'set client_timeout'); is($f1->spa_client_timeout(), 666, 'verify client_timeout'); # Now iterate over the various digest types and hmac digest types and @@ -235,14 +235,14 @@ is($f1->spa_client_timeout(), 666, 'verify client_timeout'); # @ENCRYPTION_MODES, (1-8) foreach my $hmac_type (1..5) { next if($hmac_type < 1); - ok($f1->hmac_type($hmac_type) == 0, "set HMAC type: $hmac_type"); + ok($f1->hmac_type($hmac_type) == FKO::FKO_SUCCESS, "set HMAC type: $hmac_type"); foreach my $digest_type (1..5) { next if($digest_type < 1); - ok($f1->digest_type($digest_type) == 0, "set digest type: $digest_type"); + ok($f1->digest_type($digest_type) == FKO::FKO_SUCCESS, "set digest type: $digest_type"); foreach my $enc_mode (1..8) { - ok($f1->encryption_mode($enc_mode) == 0, "set encryption mode: $enc_mode"); - ok($f1->spa_data_final($tuser_pw, $test_hmac_key) == 0, - "spad_data_final (HAMC:$hmac_type, DIGEST:$digest_type), ENC_MODE: $enc_mode"); + ok($f1->encryption_mode($enc_mode) == FKO::FKO_SUCCESS, "set encryption mode: $enc_mode"); + ok($f1->spa_data_final($tuser_pw, $test_hmac_key) == FKO::FKO_SUCCESS, + "spa_data_final (HMAC:$hmac_type, DIGEST:$digest_type), ENC_MODE: $enc_mode"); } } } diff --git a/perl/FKO/t/03_errors.t b/perl/FKO/t/03_errors.t index 78011260..098b95ec 100644 --- a/perl/FKO/t/03_errors.t +++ b/perl/FKO/t/03_errors.t @@ -1,6 +1,6 @@ ############################################################################## # -# File: 01_functions.t +# File: 03_errors.t # # Author: Damien S. Stuart # diff --git a/perl/FKO/t/04_fuzzing.t b/perl/FKO/t/04_fuzzing.t new file mode 100644 index 00000000..f9341a69 --- /dev/null +++ b/perl/FKO/t/04_fuzzing.t @@ -0,0 +1,295 @@ +############################################################################## +# +# File: 04_fuzzing.t +# +# Author: Damien S. Stuart , Michael Rash +# +# Purpose: Test suite file for FKO perl module fuzzing. These tests are +# useful not only to verify proper FKO operations under maliciously +# contructed data, but also to do so running under Test::Valgrind +# for proper memory usage testing. +# +############################################################################## +# +use FKO; + +use Test::More tests => 391; + +my $err; + +############################################################################## + +# Fuzzing data +my @fuzz_msg_types = ( + -1, + -2, + 255, +); + +my @fuzz_digest_types = ( + -1, + -2, + 255, +); + +my @fuzzing_client_timeouts = ( + -1, + -10, + -10000, +); + +my @fuzzing_usernames = ( + 'A'x1000, + "-1", + -1, + '123%123', + '123$123', + '-user', + '_user', + '-User', + ',User', + 'part1 part2', + 'a:b', +); + +my @fuzzing_nat_access_msgs = ( + '', + '1.2.3.4', + '-1.2.3.4', + '1.2.3.4.', + '123.123.123.123', + '923.123.123.123', + '123.123.123.123.', + '999.999.999.999', + '1.2.3.4,tcp/2a2', + '1.2.3.4,tcp/22,', + '1.2.3.4,tcp/123456', + '1.2.3.4,tcp/123456' . '9'x100, + '1.2.3.4,tcp//22', + '1.2.3.4,tcp/22/', + 'a23.123.123.123,tcp/12345', + '999.999.999.999,tcp/22', + '999.1.1.1,tcp/22', + -1, + 1, + 'A', + 0x0, + 'A'x1000, + '/'x1000, + '%'x1000, + ':'x1000, + pack('a', ""), + '1.1.1.p/12345', + '1.1.1.2,,,,12345', + '1.1.1.2,icmp/123', + ',,,', + '----', + '1.3.4.5.5', + '1.3.4.5,' . '/'x100, + '1.3.4.5,' . '/'x100 . '22', + '1.2.3.4,rcp/22', + '1.2.3.4,udp/-1', + '1.2.3.4,tcp/-1', + '1.2.3.4,icmp/-1', + '1.2.3' . pack('a', "") . '.4,tcp/22', + '1.2.3.' . pack('a', "") . '4,tcp/22', + '1.2.3.4' . pack('a', "") . ',tcp/22', + '1.2.3.4,' . pack('a', "") . 'tcp/22', + '1.2.3.4,t' . pack('a', "") . 'cp/22', + '1.2.3.4,tc' . pack('a', "") . 'p/22', + '1.2.3.4,tcp' . pack('a', "") . '/22', + '1.2.3.4,tcp/' . pack('a', "") . '22', + '123.123.123' . pack('a', "") . '.123,tcp/22', + '123.123.123.' . pack('a', "") . '123,tcp/22', + '123.123.123.1' . pack('a', "") . '23,tcp/22', + '123.123.123.12' . pack('a', "") . '3,tcp/22', + '123.123.123.123' . pack('a', "") . ',tcp/22', + '123.123.123.123,' . pack('a', "") . 'tcp/22', + '123.123.123.123,t' . pack('a', "") . 'cp/22', + '123.123.123.123,tc' . pack('a', "") . 'p/22', + '123.123.123.123,tcp' . pack('a', "") . '/22', + '123.123.123.123,tcp/' . pack('a', "") . '22', + '1.2.3.4,t' . pack('a', "") . 'cp/22', + '1.1.1.1,udp/1,tap/1,tcp/2,udp/3,tcp/4,tcp/12345', + '1.1.1.1,udp/1,tcp/-11,tcp/2,udp/3,tcp/4,tcp/12345', + '1.1.1.1,udp/1,tcp/1,tcp/2udp/3,tcp/4,tcp/12345', + '1.1.1.1,udp/1,tcp/1,tcp/2,udp/3,tcp/4,tcp////12345', + '1.1.1.1,udp/1,tcp/1,tcp/2udp/3,tcp/4,tcp////12345', + '1.1.1.1,udp/1,tcp/1,tcp/2udp/3,tcp/4,tcp////12345', + '1.1.1.1,udp/1,tcp/1,tcp/2udp/3*tcp/4,tcp////12345', + '1.1.1.1,udp/1,tcp/1,tcp/2udp/3,tcb/4,tcp////12345', + '1.1.1.1,udp/1,tcp/1tcp/2udp/3,tcp/4,tcp////12345', + '123.123.123.123udp/1,tcp/1,tcp/2udp/3,tcp/4,tcp////12345////////////', +); + +my @fuzzing_cmd_msgs = ( + ### must start with a valid IP, so test this + -1, + 1, + 'A', + 0x0, + 'A'x1000, + '/'x1000, + '%'x1000, + ':'x1000, + pack('a', ""), + ',,,', + '----', + '1.3.4.5.5', + '999.3.4.5', + '1.,', + '1.2.,', + '1.2.3.,', + '1.2.3.4', + '123.123.123.123', + '1.2.3.4,', + '1.2.3.4.', + '123.123.123.123,' . 'A'x1000, +); + +my @fuzzing_server_auth = ( + '', + 'A'x1000 +); + +my @fuzzing_enc_keys = ( + 'A'x33, + 'A'x34, + 'A'x128, + 'A'x1000, + 'A'x2000, + 'asdfasdfsafsdafasdfasdfsafsdaffdjskalfjdsklafjsldkafjdsajdkajsklfdafsklfjjdkljdsafjdjd' . + 'sklfjsfdsafjdslfdkjdljsajdskjdskafjdldsljdkafdsljdslafdslaldldajdskajlddslajsl', +); + +my @fuzzing_hmac_keys = ( + 'A'x129, + 'A'x1000, + 'A'x2000, +); + +# 1 - Create +# +$f1 = FKO->new(); +ok($f1, 'Create f1'); + +# Iterate over setting invalid message types +# +foreach my $mt ( @fuzz_msg_types ) { + ok($f1->spa_message_type($mt) == FKO::FKO_ERROR_INVALID_DATA_MESSAGE_TYPE_VALIDFAIL, + "set invalid msg_type to $mt"); + isnt($f1->spa_message_type(), $mt, "verify msg_type is not $mt"); +} + +foreach my $dt ( @fuzz_digest_types ) { + ok($f1->digest_type($dt) == FKO::FKO_ERROR_INVALID_DATA_ENCODE_DIGEST_VALIDFAIL, + "set invalid digest type to $dt"); + isnt($f1->digest_type(), $dt, "verify digest type is not $dt"); +} + +foreach my $dt ( @fuzz_digest_types ) { + ok($f1->hmac_type($dt) == FKO::FKO_ERROR_INVALID_DATA_HMAC_TYPE_VALIDFAIL, + "set invalid hmac type to $dt"); + isnt($f1->hmac_type(), $dt, "verify hmac type is not $dt"); +} + +# Iterate over setting invalid client timeouts +# +foreach my $tout ( @fuzzing_client_timeouts ) { + ok($f1->spa_client_timeout($tout) == FKO::FKO_ERROR_INVALID_DATA_CLIENT_TIMEOUT_NEGATIVE, + "set invalid client timeout to $tout"); + isnt($f1->spa_client_timeout(), $tout, "verify client timeout is not $tout"); +} + +# Iterate over setting invalid usernames +# +foreach my $user ( @fuzzing_usernames ) { + $err = $f1->username($user); + ok((length($user) > 100 ### long users get truncated + or $err == FKO::FKO_ERROR_INVALID_DATA_USER_MISSING + or $err == FKO::FKO_ERROR_INVALID_DATA_USER_FIRSTCHAR_VALIDFAIL + or $err == FKO::FKO_ERROR_INVALID_DATA_USER_REMCHAR_VALIDFAIL), + "set invalid username to $user"); + isnt($f1->username(), $user, "verify username is not $user"); +} + +# SPA message fuzzing +# +foreach my $msg ( @fuzzing_nat_access_msgs ) { ### use the NAT fuzzing messages + $err = $f1->spa_message($msg); + ok(($err == FKO::FKO_ERROR_INVALID_DATA_MESSAGE_ACCESS_MISSING + or $err == FKO::FKO_ERROR_INVALID_SPA_ACCESS_MSG + or $err == FKO::FKO_ERROR_INVALID_ALLOW_IP + or $err == FKO::FKO_ERROR_DATA_TOO_LARGE + or $err == FKO::FKO_ERROR_INVALID_DATA_MESSAGE_EMPTY + or $err == FKO::FKO_ERROR_INVALID_DATA_MESSAGE_PORTPROTO_MISSING + or $err == FKO::FKO_ERROR_INVALID_DATA_MESSAGE_PORT_MISSING), + "set invalid access message to $msg"); + isnt($f1->spa_message(), $msg, "verify access message is not $msg"); +} + +# Nat Access message fuzzing +# +foreach my $msg ( @fuzzing_nat_access_msgs ) { + $err = $f1->spa_nat_access($msg); + ok(($err == FKO::FKO_ERROR_INVALID_DATA_NAT_EMPTY + or $err == FKO::FKO_ERROR_DATA_TOO_LARGE + or $err == FKO::FKO_ERROR_INVALID_DATA_MESSAGE_NAT_MISSING + or $err == FKO::FKO_ERROR_INVALID_SPA_NAT_ACCESS_MSG + or $err == FKO::FKO_ERROR_MEMORY_ALLOCATION), + "set invalid nat access message to $msg"); + isnt($f1->spa_nat_access(), $msg, "verify nat access message is not $msg"); +} + +# Command message fuzzing, must set message type first +# +$f1->spa_message_type(FKO::FKO_COMMAND_MSG); +foreach my $msg ( @fuzzing_cmd_msgs ) { + $err = $f1->spa_message($msg); + ok(($err == FKO::FKO_ERROR_INVALID_DATA_MESSAGE_CMD_MISSING + or $err == FKO::FKO_ERROR_INVALID_SPA_COMMAND_MSG + or $err == FKO::FKO_ERROR_INVALID_DATA_MESSAGE_EMPTY + or $err == FKO::FKO_ERROR_DATA_TOO_LARGE + or $err == FKO::FKO_ERROR_MEMORY_ALLOCATION), + "set invalid command message to $msg"); + isnt($f1->spa_message(), $msg, "verify command message is not $msg"); +} + +# Server Auth fuzzing +# +$f1->spa_message_type(FKO::FKO_ACCESS_MSG); +foreach my $msg ( @fuzzing_server_auth ) { + $err = $f1->spa_server_auth($msg); + ok(($err == FKO::FKO_ERROR_INVALID_DATA_SRVAUTH_MISSING + or $err == FKO::FKO_ERROR_DATA_TOO_LARGE), + "set invalid server auth message to $msg"); + isnt($f1->spa_server_auth(), $msg, "verify server auth message is not $msg"); +} + +# Clean up +# +$f1->destroy(); + +# Test encryption and hmac keys +# +foreach my $key ( @fuzzing_enc_keys ) { + $f1 = FKO->new(); + ok($f1, 'f1 encryption key fuzzing'); + ok($f1->spa_message('1.2.3.4,tcp/22') == FKO::FKO_SUCCESS, 'set spa_message'); + ok($f1->spa_data_final($key, '') != FKO::FKO_SUCCESS, "encrypt under invalid key: $key"); + $f1->destroy(); +} + +foreach my $hmac_key ( @fuzzing_hmac_keys ) { + $f1 = FKO->new(); + ok($f1, 'f1 HMAC key fuzzing'); + ok($f1->spa_message('1.2.3.4,tcp/22') == FKO::FKO_SUCCESS, 'set spa_message'); + ok($f1->hmac_type(FKO::FKO_HMAC_SHA256) == FKO::FKO_SUCCESS, 'set HMAC algorithm'); + ok($f1->spa_data_final('testenckey', $hmac_key) != FKO::FKO_SUCCESS, "HMAC under invalid key: $hmac_key"); + $f1->destroy(); +} + +############################################################################## + +sub create +###EOF###