[StructLayout(LayoutKind.Sequential)] public struct MSG { public IntPtr hwnd; public uint message; public IntPtr wParam; public IntPtr lParam; public uint time; public System.Drawing.Point p; } public enum WaitReturn { Complete, Timeout, } class Utils { [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool PeekMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg); [DllImport("user32.dll")] static extern bool TranslateMessage([In] ref MSG lpMsg); [DllImport("user32.dll")] static extern IntPtr DispatchMessage([In] ref MSG lpmsg); const uint PM_REMOVE = 1; public static WaitReturn WaitForComplete(double mill, WaitHandle wh) { TimeSpan goal = new TimeSpan(DateTime.Now.AddMilliseconds(mill).Ticks); do { MSG msg = new MSG(); if (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE)) { TranslateMessage(ref msg); DispatchMessage(ref msg); } if (wh.WaitOne(new TimeSpan(0, 0, 0), false)) { return WaitReturn.Complete; } if (goal.CompareTo(new TimeSpan(DateTime.Now.Ticks)) < 0) { return WaitReturn.Timeout; } } while (true); } } // // Secure client (TLS) // class Client : DicomNet { AutoResetEvent waitEvent = new AutoResetEvent(false); string clientPEM = @"C:\Program Files\LEAD Technologies, Inc\LEADTOOLS 15\Images\client.pem"; public Client() : base(null, DicomNetSecurityeMode.Tls) { SetTlsCipherSuiteByIndex(0, DicomTlsCipherSuiteType.DheRsaWithDesCbcSha); SetTlsClientCertificate(clientPEM,DicomTlsCertificateType.Pem, null); //Over here we can get detailed information about the Cipher Suite DicomTlsCipherSuiteType cipherSuite = GetTlsCipherSuite();// Can also call GetTlsCipherSuiteByIndex //Returns DicomTlsEncryptionMethodType Console.WriteLine("Encryption Algorithm is : {0}", GetTlsEncryptionAlgorithm(cipherSuite)); //Returns DicomTlsAuthenticationMethodType Console.WriteLine("Authentication Algorithm is : {0}", GetTlsAuthenticationAlgorithm(cipherSuite)); //Returns DicomTlsMacMethodType Console.WriteLine("Integrity Algorithm is : {0}", GetTlsIntegrityAlgorithm(cipherSuite)); //Returns DicomTlsExchangeMethodType Console.WriteLine("Key Exchange Algorithm is : {0}", GetTlsKeyExchangeAlgorithm(cipherSuite)); Console.WriteLine("Encryption Key Length is : {0}", GetTlsEncryptionKeyLength(cipherSuite)); Console.WriteLine("Mutual Authentication Key Length is : {0}", GetTlsMutualAuthenticationKeyLength(cipherSuite)); } public bool Wait() { WaitReturn ret; ret = Utils.WaitForComplete((5 * 60) * 1000, waitEvent); return (ret == WaitReturn.Complete); } protected override void OnConnect(DicomExceptionCode error) { waitEvent.Set(); } protected override string OnPrivateKeyPassword(bool encryption) { return "test"; } protected override void OnSecureLinkReady(DicomExceptionCode error) { waitEvent.Set(); } } // // Secure server (TLS) // class ServerConnection : DicomNet { string serverPEM = @"C:\Program Files\LEAD Technologies, Inc\LEADTOOLS 15\Images\server.pem"; public ServerConnection() : base(null, DicomNetSecurityeMode.Tls) { SetTlsCipherSuiteByIndex(0, DicomTlsCipherSuiteType.DheRsaWith3DesEdeCbcSha); SetTlsClientCertificate(serverPEM, DicomTlsCertificateType.Pem, null); } protected override string OnPrivateKeyPassword(bool encryption) { return "test"; } } class Server : DicomNet { ServerConnection client; public Server() : base(null, DicomNetSecurityeMode.None) { } protected override void OnAccept(DicomExceptionCode error) { client = new ServerConnection(); Accept(client); } protected override void Dispose(bool __p1) { client.Dispose(); base.Dispose(__p1); } } public void TLSSecuritySample() { DicomEngine.Startup(); DicomNet.Startup(); using (Server server = new Server()) { using (Client client = new Client()) { server.Listen("127.0.0.1", 104, 1); // start server client.Connect(null, 1000, "127.0.0.1", 104); // connect to server if (!client.Wait()) // wait for connection to finish { Debug.Fail("Connection timed out"); } Debug.Assert(client.IsConnected(), "Client not connected"); // // Wait for authenication // if (!client.Wait()) { Debug.Fail("Connection timed out waiting for authenication"); } // Once two computers have negotiated the ciphersuite, and have // authenticated each other, they can begin transferring // messages and data between them. // Continue with normal dicom communication client.CloseForced(true); } server.CloseForced(true); } DicomEngine.Shutdown(); DicomNet.Shutdown(); } |