#!/usr/bin/perl -w # moon_phase_test.pl - Don Yang (uguu.org) # # 06/11/12 use strict; my $PROG = "./hazuki"; my $OUTPUT_DIR = "test_output"; my $KEYFILE = "$OUTPUT_DIR/moon_phase.key"; my $INPUT = "$OUTPUT_DIR/moon_phase.in"; my $OUTPUT_CIPHERTEXT = "$OUTPUT_DIR/moon_phase.enc"; my $OUTPUT_PLAINTEXT = "$OUTPUT_DIR/moon_phase.dec"; # Test dates my %date = (); $date{"2012-05-01"} = "waxing gibbous"; $date{"2012-05-02"} = "waxing gibbous"; $date{"2012-05-03"} = "waxing gibbous"; $date{"2012-05-04"} = "waxing gibbous"; $date{"2012-05-05"} = "full moon"; $date{"2012-05-06"} = "full moon"; $date{"2012-05-07"} = "full moon"; $date{"2012-05-08"} = "waning gibbous"; $date{"2012-05-09"} = "waning gibbous"; $date{"2012-05-10"} = "waning gibbous"; $date{"2012-05-11"} = "waning gibbous"; $date{"2012-05-12"} = "last quarter"; $date{"2012-05-13"} = "last quarter"; $date{"2012-05-14"} = "last quarter"; $date{"2012-05-15"} = "last quarter"; $date{"2012-05-16"} = "waning crescent"; $date{"2012-05-17"} = "waning crescent"; $date{"2012-05-18"} = "waning crescent"; $date{"2012-05-19"} = "new moon"; $date{"2012-05-20"} = "new moon"; $date{"2012-05-21"} = "new moon"; $date{"2012-05-22"} = "new moon"; $date{"2012-05-23"} = "waxing crescent"; $date{"2012-05-24"} = "waxing crescent"; $date{"2012-05-25"} = "waxing crescent"; $date{"2012-05-26"} = "waxing crescent"; $date{"2012-05-27"} = "first quarter"; $date{"2012-05-28"} = "first quarter"; $date{"2012-05-29"} = "first quarter"; $date{"2012-05-30"} = "waxing gibbous"; $date{"2012-05-31"} = "waxing gibbous"; # Initialize key mkdir $OUTPUT_DIR; # Ignore errors here if directory already exists my $file; open $file, ">$KEYFILE" or die $!; print $file rand(); close $file; # Initialize input data my $original = ""; for(my $i = 0; $i < 64; $i++) { $original .= rand(); $original .= "\n"; } open $file, ">$INPUT" or die $!; print $file $original; close $file; # Encrypt and decrypt the file 31 times, once for each date foreach my $i (sort keys %date) { my $cmd = "$PROG $i $KEYFILE $INPUT $OUTPUT_CIPHERTEXT.$i"; if( system($cmd) != 0 ) { die "Encryption failed:\n$cmd\n"; } $cmd = "$PROG $KEYFILE $OUTPUT_CIPHERTEXT.$i $OUTPUT_PLAINTEXT.$i"; if( system($cmd) != 0 ) { die "Decryption failed:\n$cmd\n"; } } # Check that all encrypted output files are different my %unique = (); foreach my $i (sort keys %date) { open $file, "<$OUTPUT_CIPHERTEXT.$i" or die $!; my $data = join '', <$file>; close $file; if( exists $unique{$data} ) { die "$unique{$data} and $i encrypted to same contents\n"; } $unique{$data} = $i; } # Check the output files. Since only one set of files has the same # moon phase as today, only one set of files should match the original # text, the rest must be all different. my $matched_moon_phase = undef; my $matched_count = 0; foreach my $i (sort keys %date) { open $file, "<$OUTPUT_PLAINTEXT.$i" or die $!; my $decrypted_data = join '', <$file>; close $file; my $current_moon_phase = $date{$i}; if( $decrypted_data eq $original ) { if( defined($matched_moon_phase) ) { if( $matched_moon_phase ne $current_moon_phase ) { die "Unexpected success for $i\n"; } } else { $matched_moon_phase = $current_moon_phase; } $matched_count++; } } unless( defined($matched_moon_phase) ) { die "Decryption did not succeed for any moon phase\n"; } my $expected_matched_count = 0; foreach my $i (keys %date) { if( $date{$i} eq $matched_moon_phase ) { $expected_matched_count++; } } if( $expected_matched_count != $matched_count ) { die "Not all dates with the same moon phase can be decrypted\n"; }