예제 #1
0
파일: ClientForm.cs 프로젝트: jfiuza/nsspi
        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();
        }
예제 #2
0
 /// <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;
 }
예제 #3
0
파일: Program.cs 프로젝트: jfiuza/nsspi
        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();
                }
            }
        }