public ClientForm() { this.connected = false; this.initializing = false; this.lastServerToken = null; // --- UI --- InitializeComponent(); this.connectButton.Click += connectButton_Click; this.disconnectButton.Click += disconnectButton_Click; this.encryptButton.Click += encryptButton_Click; this.signButton.Click += signButton_Click; this.FormClosing += Form1_FormClosing; // --- SSPI --- this.cred = new ClientCredential( PackageNames.Negotiate ); this.context = new ClientContext( cred, "", ContextAttrib.InitIntegrity | ContextAttrib.ReplayDetect | ContextAttrib.SequenceDetect | ContextAttrib.MutualAuth | ContextAttrib.Delegate | ContextAttrib.Confidentiality ); this.connection = new CustomConnection(); this.connection.Received += connection_Received; this.connection.Disconnected += connection_Disconnected; // --- UI Fillout --- this.usernameTextbox.Text = this.cred.PrincipleName; UpdateButtons(); }
/// <summary> /// Initializes a new instance of the ClientContext class. The context is not fully initialized and usable /// until the authentication cycle has been completed. /// </summary> /// <param name="cred">The security credential to authenticate as.</param> /// <param name="serverPrinc">The principle name of the server to connect to, or null for any.</param> /// <param name="requestedAttribs">Requested attributes that describe the desired properties of the /// context once it is established. If a context cannot be established that satisfies the indicated /// properties, the context initialization is aborted.</param> public ClientContext( ClientCredential cred, string serverPrinc, ContextAttrib requestedAttribs ) : base(cred) { this.serverPrinc = serverPrinc; this.requestedAttribs = requestedAttribs; }
private static void CredTest( string packageName ) { ClientCredential clientCred = null; ClientContext client = null; ServerCredential serverCred = null; ServerContext server = null; byte[] clientToken; byte[] serverToken; SecurityStatus clientStatus; SecurityStatus serverStatus; try { clientCred = new ClientCredential( packageName ); serverCred = new ServerCredential( packageName ); Console.Out.WriteLine( clientCred.PrincipleName ); client = new ClientContext( clientCred, serverCred.PrincipleName, ContextAttrib.MutualAuth | ContextAttrib.InitIdentify | ContextAttrib.Confidentiality | ContextAttrib.ReplayDetect | ContextAttrib.SequenceDetect | ContextAttrib.Connection | ContextAttrib.Delegate ); server = new ServerContext( serverCred, ContextAttrib.MutualAuth | ContextAttrib.AcceptIdentify | ContextAttrib.Confidentiality | ContextAttrib.ReplayDetect | ContextAttrib.SequenceDetect | ContextAttrib.Connection | ContextAttrib.Delegate ); clientToken = null; serverToken = null; clientStatus = client.Init( serverToken, out clientToken ); while ( true ) { serverStatus = server.AcceptToken( clientToken, out serverToken ); if ( serverStatus != SecurityStatus.ContinueNeeded && clientStatus != SecurityStatus.ContinueNeeded ) { break; } clientStatus = client.Init( serverToken, out clientToken ); if ( serverStatus != SecurityStatus.ContinueNeeded && clientStatus != SecurityStatus.ContinueNeeded ) { break; } } Console.Out.WriteLine( "Server authority: " + server.AuthorityName ); Console.Out.WriteLine( "Server context user: "******"Client authority: " + client.AuthorityName ); Console.Out.WriteLine( "Client context user: "******"Hello, world. This is a long message that will be encrypted"; string rtMessage; byte[] plainText = new byte[Encoding.UTF8.GetByteCount( message )]; byte[] cipherText; byte[] roundTripPlaintext; Encoding.UTF8.GetBytes( message, 0, message.Length, plainText, 0 ); cipherText = client.Encrypt( plainText ); roundTripPlaintext = server.Decrypt( cipherText ); if( roundTripPlaintext.Length != plainText.Length ) { throw new Exception(); } for( int i= 0; i < plainText.Length; i++ ) { if( plainText[i] != roundTripPlaintext[i] ) { throw new Exception(); } } rtMessage = Encoding.UTF8.GetString( roundTripPlaintext, 0, roundTripPlaintext.Length ); if( rtMessage.Equals( message ) == false ) { throw new Exception(); } using( server.ImpersonateClient() ) { } cipherText = client.MakeSignature( plainText ); bool goodSig = server.VerifySignature( cipherText, out roundTripPlaintext ); if ( goodSig == false || roundTripPlaintext.Length != plainText.Length ) { throw new Exception(); } for ( int i = 0; i < plainText.Length; i++ ) { if ( plainText[i] != roundTripPlaintext[i] ) { throw new Exception(); } } Console.Out.Flush(); } finally { if ( server != null ) { server.Dispose(); } if ( client != null ) { client.Dispose(); } if( clientCred != null ) { clientCred.Dispose(); } if ( serverCred != null ) { serverCred.Dispose(); } } }