//Does all the algorithmy stuff described in the header int next_keystream_value (Card *deck) { joker_shift(deck); triple_cut(deck); bottom_value_cut(deck); int return_index = deck[0]; if (return_index >= DECK_SIZE) { return_index = DECK_SIZE - 1; } return deck[return_index]; }
/* * Description: The main driver function for this program. * Input: Command line arguments * Result: EXIT_SUCCESS or EXIT_FAILURE * PRE: None. * POST: The appropriate encryption/decryption function will be called. */ int main( int argc, char** argv ) { if( argc == 1 ) // Program was executed with no arguments, so show usage. { show_usage( argv[ 0 ] ); } else if( strcasecmp( argv[ 1 ], "-e" ) == 0 ) // Encrypt { if( argv[ 2 ] == NULL ) { show_usage( argv[ 0 ] ); return EXIT_FAILURE; } //pontifex -e deck.txt plaintext.txt ciphertext.txt printf( "Reading in deck...\n" ); card_ptr deck = read_deck_from_file( argv[ 2 ] ); printf( "Reading in plaintext...\n" ); char* plaintext = read_filetext( argv[ 3 ] ); printf( "Encrypting...\n" ); char* ciphertext = encode_message( plaintext, deck ); write_filetext( ciphertext, argv[ 4 ] ); } else if( strcasecmp( argv[ 1 ], "-d" ) == 0 ) // Decrypt { if( argv[ 2 ] == NULL ) { show_usage( argv[ 0 ] ); return EXIT_FAILURE; } //pontifex -d deck.txt ciphertext.txt decrypted.txt printf( "Reading in deck...\n" ); card_ptr deck = read_deck_from_file( argv[ 2 ] ); printf( "Reading in ciphertext...\n" ); char* ciphertext = read_filetext( argv[ 3 ] ); printf( "Decrypting...\n" ); char* plaintext = decode_message( ciphertext, deck ); write_filetext( plaintext, argv[ 4 ] ); } else if( strcasecmp( argv[ 1 ], "-a" ) == 0 ) // Create a new deck with all cards in ascending order { if( argv[ 2 ] == NULL ) { show_usage( argv[ 0 ] ); return EXIT_FAILURE; } printf( "Creating a new deck with cards in ascending order...\n" ); fflush( stdout ); //pontifex -a deck.txt card_ptr deck = new_deck(); write_deck_to_file( deck, argv[ 2 ] ); } else if( strcasecmp( argv[ 1 ], "-r" ) == 0 ) // Create a new, randomly shuffled deck { if( argv[ 2 ] == NULL ) { show_usage( argv[ 0 ] ); return EXIT_FAILURE; } printf( "Creating a new, randomly shuffled deck...\n" ); //pontifex -r deck.txt card_ptr deck = new_deck(); deck = shuffle_deck( deck ); write_deck_to_file( deck, argv[ 2 ] ); } else if( strcasecmp( argv[ 1 ], "-k" ) == 0 ) // Show key sequence { if( argv[ 2 ] == NULL ) { show_usage( argv[ 0 ] ); return EXIT_FAILURE; } printf( "Showing key sequence generated by deck in given file...\n" ); //pontifex -k deck.txt printf( "Reading in deck...\n" ); card_ptr deck = read_deck_from_file( argv[ 2 ] ); char* keystream = generate_keystream( deck, 8 ); int i; for( i = 0; i < 8; i++ ) { int key = keystream[ i ] - 64; printf( "%d ", key ); } printf( "\n" ); } else if( strcasecmp( argv[ 1 ], "-f" ) == 0 ) // Test reading a deck from a file { if( argv[ 2 ] == NULL ) { show_usage( argv[ 0 ] ); return EXIT_FAILURE; } printf( "Testing reading deck from a file...\n" ); //pontifex -f deck.txt printf( "Reading in deck...\n" ); card_ptr deck = read_deck_from_file( argv[ 2 ] ); show_deck( deck ); } else if( strcasecmp( argv[ 1 ], "-m" ) == 0 ) // Test move joker steps { if( argv[ 2 ] == NULL ) { show_usage( argv[ 0 ] ); return EXIT_FAILURE; } printf( "Testing move joker steps with deck in given file...\n" ); //pontifex -m deck.txt printf( "Reading in deck...\n" ); card_ptr deck = read_deck_from_file( argv[ 2 ] ); card_ptr currentCard = deck; while( currentCard->number != JOKER_A ) { currentCard = currentCard->next; } deck = swap_joker1( deck, currentCard ); currentCard = deck; while( currentCard->number != JOKER_B ) { currentCard = currentCard->next; } deck = swap_joker2( deck, currentCard ); show_deck( deck ); } else if( strcasecmp( argv[ 1 ], "-t" ) == 0 ) // Test triple cut step { if( argv[ 2 ] == NULL ) { show_usage( argv[ 0 ] ); return EXIT_FAILURE; } printf( "Testing triple cut step with deck in given file...\n" ); //pontifex -t deck.txt printf( "Reading in deck...\n" ); card_ptr deck = read_deck_from_file( argv[ 2 ] ); deck = triple_cut( deck ); show_deck( deck ); } else if( strcasecmp( argv[ 1 ], "-c" ) == 0 ) // Test count cut step { if( argv[ 2 ] == NULL ) { show_usage( argv[ 0 ] ); return EXIT_FAILURE; } printf( "Testing count cut step with deck in given file...\n" ); //pontifex -c deck.txt printf( "Reading in deck...\n" ); card_ptr deck = read_deck_from_file( argv[ 2 ] ); deck = count_cut( deck ); show_deck( deck ); } else if( strcasecmp( argv[ 1 ], "-p" ) == 0 ) // Test entire pontifex algorithm { if( argv[ 2 ] == NULL ) { show_usage( argv[ 0 ] ); return EXIT_FAILURE; } printf( "Testing all pontifex steps with deck in given file...\n" ); //pontifex -p deck.txt printf( "Reading in deck...\n" ); card_ptr deck = read_deck_from_file( argv[ 2 ] ); // Step 1, find joker A card_ptr currentCard = deck; while( currentCard->number != JOKER_A ) { currentCard = currentCard->next; } deck = swap_joker1( deck, currentCard ); printf( "Step 1:\n" ); show_deck( deck ); // Step 2, find joker B currentCard = deck; while( currentCard->number != JOKER_B ) { currentCard = currentCard->next; } deck = swap_joker2( deck, currentCard ); printf( "Step 2:\n" ); show_deck( deck ); // Step 3, do triple cut deck = triple_cut( deck ); printf( "Step 3:\n" ); show_deck( deck ); // Step 4, do count cut deck = count_cut( deck ); printf( "Step 4:\n" ); show_deck( deck ); // Step 5, find output card int streamval = get_output_card( deck ); printf( "Step 5:\n" ); printf( "%i\n", streamval ); } else if( strcasecmp( argv[ 1 ], "-o" ) == 0 ) // Test output card step { if( argv[ 2 ] == NULL ) { show_usage( argv[ 0 ] ); return EXIT_FAILURE; } printf( "Testing find output card step with deck in given file...\n" ); //pontifex -o deck.txt printf( "Reading in deck...\n" ); card_ptr deck = read_deck_from_file( argv[ 2 ] ); printf( "Output card: %i\n", get_output_card( deck ) ); } else { printf( "Invalid flag: %s\n", argv[ 1 ] ); show_usage( argv[ 0 ] ); return EXIT_FAILURE; } printf( "Done\n" ); return EXIT_SUCCESS; }