Alice.cs Source Code (CNG Example)
The Cryptography Next Generation (CNG) secure communication example consists of three console applications: Alice, Bob, and Mallory. The Alice application (Alice.cs file) contains the following code.
using System; // Required for the IDisposable interface
using System.Text; // Required for the Encoding class
using System.Security.Cryptography; // Required for the CNG APIs
public partial class CNG_SecureCommunicationExample
{
// Global variables
static int MyColor = 4; // Alice Green displays green text
static int OtherColor = 2; // Bob White displays white text
static void Main()
{
if (!Autoloader()) // Load Bob and Mallory
return; // An error was encountered during load.
string s = "";
InitConsole("Alice Green", 5, 5);
while (true)
{
SplashScreen(); // Set and display titles
s = InitializeOptions(); // Get session options
AppControl("send", s); // Synchronize Bob and Mallory
if ("exit" == s) // Quit if user entered "x"
break;
Run(); // Run the desired session
}
} // End Main
//---------------------------------------------------------------------------------------
static void Run()
{
string NewChannelName = "AliceAndBobChannel";
SendChannelName(NewChannelName); // Bad corporate security policy
Display("Hi, I'm Alice Green. My sales associate is Bob White.\n" +
"I need to send him a customer order right now!\n\n");
using (Communicator Alice = new Communicator("server", NewChannelName))
{
string s;
CngKeyCreationParameters keyCreateParms = new CngKeyCreationParameters();
keyCreateParms.ExportPolicy = CngExportPolicies.AllowPlaintextExport;
if (3 <= Version) // Send public digital signature key
{
using (CngKey DSKey = CngKey.Create(CngAlgorithm.ECDsaP521, null, keyCreateParms))
{
byte[] dsKeyBlob = DSKey.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);
Alice.StoreDSKey(dsKeyBlob);
s = Encoding.ASCII.GetString(dsKeyBlob);
Display("\nFirst, I will send Bob a digital signature key "
+"over a public channel.\n" +
(fVerbose ? "Here it is:\n\n" + s + "\n\n" : ""));
Alice.ChMgr.SendMessage(dsKeyBlob);
}
}
if (4 <= Version) // Send private digital signature key
{
using (CngKey DSKey = CngKey.Create(CngAlgorithm.ECDsaP521, null, keyCreateParms))
using(ChannelManager ChMgr2 = new ChannelManager("server", "PrivateChannel"))
{
byte[] dsKeyBlob = DSKey.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);
Alice.StoreDSKey(dsKeyBlob);
s = Encoding.ASCII.GetString(dsKeyBlob);
Display("\nNow I will send Bob a secret digital signature key " +
"over a private channel.\n" +
(fVerbose ? "Here it is:\n\n" + s + "\n\n" : ""));
ChMgr2.SendMessage(dsKeyBlob);
}
}
if (2 <= Version) // Send and receive public cryptographic keys
{
Display(sep2, 1);
Display("Now we will exchange our public cryptographic\n" +
"keys through a public channel\n" +
"First, I'll send Bob my key.\n\nSending...\n");
Alice.Send_or_Receive_PublicCryptoKey("send", MyColor);
Display(sep2, 1);
Display("Now Bob will publically send me his " +
"public crypto key:\n\nListening...\n");
if (!Alice.Send_or_Receive_PublicCryptoKey("receive", OtherColor))
{
Display("", 6);
return;
}
}
//-----------------------------------------------------------------------------------
// Now that all the keys have been transmitted, have a conversation.
if (1 < Version)
{
Display(sep2, 1);
Display("Now that our keys have been exchanged,\n" +
"we can have an encrypted conversation:\n\n", 4);
Display(sep1, 1);
}
Alice.SendMessage("Hi Bob. I have a new customer contact.",true);
Alice.ReceiveMessage();
Alice.SendMessage("Coho Winery, 111 AnyStreet, Chicago",true);
Alice.ReceiveMessage();
if (Version <= 2)
Display(sep1, 1);
if (!fVerbose && Version >= 3)
Display(sep1, 1);
//-----------------------------------------------------------------------------------
Display("Would you like to talk to Bob?\n" +
"If so, type a message, and press Enter.\n" +
"Otherwise, just press Enter.\n\n", 1);
Display(sep + sep1,1);
s = " ";
while (true)
{
s = ReadALine(true);
if (!Alice.SendMessage(s,false)) // If Bob entered CTRL-C, or SYS_CLOSE
break;
if ("" == s) // If user entered ""
break;
s = Alice.ReceiveMessage(); // Read a message
if ("" == s)
break;
}
//-----------------------------------------------------------------------------------
} // End using ChannelManager, End using Communicator
} // End Run
} // End Alice.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