Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
The Utilities.cs file provides the utility methods used by the Cryptography Next Generation (CNG) secure communication example. It contains the following code.
using System; // IDisposable interface
using System.Diagnostics; // Process control
using System.Runtime.InteropServices; // MoveWindow, GetConsoleWindow Win32 APIs
public partial class CNG_SecureCommunicationExample
{
static string sep = "------------------------------------" +
"------------------------------------",
sep1 = sep + "\n", sep2 = "\n" + sep1;
static string MyName;
// Application control flags
static int Version = 0; // 1 - Plaintext, 2 - Encryption, 3 - Signing
// 4 - Private digital signature, 5 - Termination
static bool fVerbose; // Display encrypted output
static bool fMallory; // Disable Mallory
[DllImport("user32.dll")]
public static extern bool MoveWindow(IntPtr hwnd, int x, int y,
int nWidth, int nHeight, bool bRepaint);
[DllImport("kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
// Run the Bob and Mallory executable.
// If Alice.exe is a standalone process, it is not being run from
// the Visual Studio debugger; therefore, it must programatically
// run Bob and Mallory.
static bool Autoloader()
{
Process [] AliceProcess = Process.GetProcessesByName("Alice");
if (AliceProcess.Length > 0)
{
try {
Process.Start("bob.exe");
Process.Start("mallory.exe");
}
catch(Exception e)
{
Display("\nFailure loading Bob.exe or Mallory.exe:\n"
+ e.Message + "\n",1);
return false;
}
}
return true;
}
// Set console size, position, title
static void InitConsole(string name, int left, int top)
{
Console.Clear();
IntPtr hwnd = GetConsoleWindow();
MoveWindow(hwnd, left, top, 600, 500, true);
Console.SetBufferSize(72, 500);
MyName = name;
SplashScreen();
}
// Provide titling services
static void SplashScreen()
{
Console.Clear();
Display(" Cryptography Next Generation " +
"Secure Communication Example\n\n" + sep);
Console.Title = "Hi, I'm " + MyName + "!";
}
// Prompt user for input.
// fBlankOkay = true if blank lines are acceptable
static string ReadALine(bool fBlankOkay)
{
while (true)
{
Display(":> ", 1);
Display("", 3);
string s = Console.ReadLine();
if (fBlankOkay)
return s;
if ("" != s)
return s;
}
}
// Read until a character from list is entered.
// Do not accept a blank.
static string ReadAChar(string options)
{
while(true)
{
string s = ReadALine(false); // No blanks allowed.
if (options.Contains(s))
return s;
}
}
// Display session options, prompt for input
static string InitializeOptions()
{
string s;
if ("Alice Green" == MyName)
{
Display("Please select a security model:\n\n" +
"1 = Plaintext only\n" +
"2 = Encrypt messages\n" +
"3 = Encrypt messages, use public key to digitally sign messages.\n" +
"4 = Encrypt messages, use private key to digitally sign messages.\n" +
"5 = Encrypt messages, use private key to digitally sign messages\n" +
" and cryptographic keys. Terminate on all security failures.\n" +
"x = Exit\n\n", 1);
s = ReadAChar("12345x");
if ("x" == s) return "exit";
Version = Int32.Parse(s);
Display("Include Mallory? Y/N\n", 1);
fMallory = "y" == ReadAChar("ynYN") ? true : false;
if (Version != 1)
{
Display("Verbose output mode? Y/N\n", 1);
fVerbose = "y" == ReadAChar("ynYN") ? true : false;
}
}
Console.Clear();
Console.Title = "Hi, I'm " + MyName + "!";
Console.Title += " Security Version " + Version;
Display(" Cryptography Next Generation Secure Communication Example\n\n" +
"Security Version: " + Version +
" Mode: " + (fVerbose ? "Verbose" : "Regular") +
" Mallory: " + (fMallory ? "Yes":"No") +
" Signatures: " + (Version >= 3? "Yes":"No"));
Display(sep2, 1);
return (fVerbose ? "y" : "n") + (fMallory ? "y" : "n") + Version;
}
// Calls
static void Display(string s)
{
Display(s, MyColor);
}
/////////////////////////////////////////////////////////////////////////////////////////
// NAME Display: Ouput function that wraps Console.Write calls and
// colors the output message.
//
// PARAMETERS: string DisplayString: Output message.
// int color: Output message color. If no color, use yellow.
//
// COLOR USE DESCRIPTION
// ------------------------------------------------------------------------
// 0 Red Security failures Error message displayed to the user
// 1 Yellow Default color Options menu and application messages
// 2 White Bob's color Messages from Bob White
// 3 Cyan User's color User input
// 4 Green Alice's color Messages from Alice Green
// 5 Majenta Mallory's color Messages from Mallory Purple
// 6 Yellow Default color Application Restart prompt
// 7 Gray Encrypted data
//
// RETURN: string: "r": rerun the application
// "exit": close the application
//
// OPERATION: 1. Set ConsoleColor to color. If color is not specified,
// the default yellow color is set.
// 2. Write the DisplayString in the requested color.
// 3. Process Continue functionality if color = 6.
// Display("", 6) will generate a prompt, and query the user
// to continue the application.
//
/////////////////////////////////////////////////////////////////////////////////////////
static void Display(string DisplayString, int color)
{
ConsoleColor[] cc = { ConsoleColor.Red, ConsoleColor.Yellow,
ConsoleColor.White, ConsoleColor.Cyan,
ConsoleColor.Green, ConsoleColor.Magenta,
ConsoleColor.Yellow,ConsoleColor.Gray
};
Console.ForegroundColor = cc[color];
Console.Write(DisplayString);
if (6 == color)
{
Console.WriteLine(sep + sep +
"Press the enter key to continue\n\n");
Console.ReadLine();
}
}
} // End Utilities.cs: public partial class CNG_SecureCommunicationExample
See Also
Tasks
How to: Build and Run the CNG Example
Concepts
Source Code Overview (CNG Example)
Cryptography Next Generation (CNG) Secure Communication Example