KviCryptEngine::DecryptResult KviRijndaelEngine::decrypt(const char * inBuffer, KviCString & plainText)
{
	if(!m_pDecryptCipher)
	{
		setLastError(__tr2qs("Oops! Decryption cipher not initialized"));
		return KviCryptEngine::DecryptError;
	}

	if(*inBuffer != KviControlCodes::CryptEscape)
	{
		plainText = inBuffer;
		return KviCryptEngine::DecryptOkWasPlainText;
	}

	inBuffer++;

	if(!*inBuffer)
	{
		plainText = inBuffer;
		return KviCryptEngine::DecryptOkWasPlainText; // empty buffer
	}

	int len;
	char * binary;

	if(!asciiToBinary(inBuffer, &len, &binary))
		return KviCryptEngine::DecryptError;

	char * buf = (char *)KviMemory::allocate(len + 1);
	unsigned char * iv = nullptr;
	if(m_bEncryptMode == CBC)
	{
		// extract the IV from the cyphered string
		len -= MAX_IV_SIZE;
		iv = (unsigned char *)KviMemory::allocate(MAX_IV_SIZE);
		KviMemory::move(iv, binary, MAX_IV_SIZE);
		KviMemory::move(binary, binary + MAX_IV_SIZE, len);
		binary = (char *)KviMemory::reallocate(binary, len);
	}

	int retVal = m_pDecryptCipher->padDecrypt((const unsigned char *)binary, len, (unsigned char *)buf, iv);
	KviMemory::free(binary);
	KviMemory::free(iv);

	if(retVal < 0)
	{
		KviMemory::free(buf);
		setLastErrorFromRijndaelErrorCode(retVal);
		return KviCryptEngine::DecryptError;
	}

	buf[retVal] = '\0';

	plainText = buf;

	KviMemory::free(buf);
	return KviCryptEngine::DecryptOkWasEncrypted;
}
/*-----MAIN------*/
int main (void)
{ 
   int optionStats[NUM_OPTION_STATS];
   int optionChoice = 0;
   char sel[ 1 + EXTRA_SPACES ];
   char* prompt = "Please enter a selection: ";
   char *p;

   while (optionChoice != EXIT_OPTION )
   {
      /*prints the main menu */
      printMenu();
      
      /*gets user input as a string */
      getString(sel, 1 + EXTRA_SPACES, prompt);
      optionChoice = strtol(sel, &p, 10);

      switch (optionChoice)
      {     
       case PERFECT_SQUARES_OPTION : printf("option 1 selected \n");
                 perfectSquares(optionStats); 
                  break;
      case ASCII_TO_BINARY_OPTION : printf("option 2 selected \n");
                  asciiToBinary(optionStats);
                  break;
      case MATCHING_BRACKETS_OPTION : printf("option 3 selected \n");
                  matchingBrackets(optionStats);
                  break;
      case TIC_TAC_OPTION : printf("option 4 selected \n");
                  ticTacToeGame(optionStats);
                  break;
      case FORMAT_OPTION : printf("Option 5 selected \n");
                  formattingText(optionStats);
                  break;
      case SUMMARY_OPTION : printf("Option 6 selected \n");
                  sessionSummary(optionStats);
                  break;
      }
   }
   return EXIT_SUCCESS;
}