[perl FKO module] added t/04_fuzzing tests
authorMichael Rash <mbr@cipherdyne.org>
Fri, 25 Oct 2013 03:17:51 +0000 (23:17 -0400)
committerMichael Rash <mbr@cipherdyne.org>
Fri, 25 Oct 2013 03:17:51 +0000 (23:17 -0400)
perl/FKO/t/02_functions.t
perl/FKO/t/03_errors.t
perl/FKO/t/04_fuzzing.t [new file with mode: 0644]

index 68ae384..5159911 100644 (file)
@@ -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");
         }
     }
 }
index 7801126..098b95e 100644 (file)
@@ -1,6 +1,6 @@
 ##############################################################################
 #
-# File:    01_functions.t
+# File:    03_errors.t
 #
 # Author:  Damien S. Stuart <dstuart@dstuart.org>
 #
diff --git a/perl/FKO/t/04_fuzzing.t b/perl/FKO/t/04_fuzzing.t
new file mode 100644 (file)
index 0000000..f9341a6
--- /dev/null
@@ -0,0 +1,295 @@
+##############################################################################
+#
+# File:    04_fuzzing.t
+#
+# Author:  Damien S. Stuart <dstuart@dstuart.org>, Michael Rash <mbr@cipherdyne.org>
+#
+# 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###