[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 (ISCL)  //  public class Client : DicomNet  {      AutoResetEvent waitEvent = new AutoResetEvent(false);        public Client()          : base(null, DicomNetSecurityeMode.Iscl)      {          string authData = "LEAD client ISCL";            SetIsclMutualAuthenticationAlgorithm(DicomIsclMutualAuthenticationMode.ThreePFourW);          SetIsclMutualAuthenticationKey(1, 11619789628100321);          SetIsclMutualAuthenticationKey(2, 34217865672122111);          SetIsclMutualAuthenticationKey(3, 1605935625518899689);          SetIsclMutualAuthenticationKey(4, 138217077775855676);          SetIsclMutualAuthenticationKey(5, 9117318694593010212);          SetIsclMutualAuthenticationKey(6, 3485297985488245687);          SetIsclMutualAuthenticationKey(7, 1533287511573403981);          SetIsclMutualAuthenticationKey(8, 5604839976916070822);            SetIsclDefaultEncryptionMode(DicomIsclEncryptionMethodType.DesCbc);          SetIsclDefaultSigningMode(DicomIsclSigningMethodType.Md5);          SetIsclEncryptionKey(1, 8079278526052745737);          SetIsclEncryptionKey(2, 1312864321990916052);          SetIsclEncryptionKey(3, 7190959962252002117);          SetIsclEncryptionKey(4, 3619524191167482890);          SetIsclEncryptionKey(5, 3466658849848898336);          SetIsclEncryptionKey(6, 8474124475946342520);          SetIsclEncryptionKey(7, 7725464453540259890);          SetIsclEncryptionKey(8, 4320705344832296668);            SetIsclIndexForMutualAuthentication(1);          SetIsclEncryptionKeyIndex(1);            SetIsclMaxMessageLength(1024000);          SetIsclMaxCommunicationBlockLength(8129);            byte[] data = new ASCIIEncoding().GetBytes(authData);            SetIsclAuthenticationData(data, data.GetLength(0));      }        public bool Wait()      {          WaitReturn ret;            ret = Utils.WaitForComplete((2 * 60) * 1000, waitEvent);            return (ret == WaitReturn.Complete);      }        protected override void OnConnect(DicomExceptionCode error)      {          waitEvent.Set();      }        protected override void OnSecureLinkReady(DicomExceptionCode error)      {         Console.WriteLine("Iscl Peer Encryption is               : {0}", GetIsclPeerEncryption());         Console.WriteLine("Iscl Peer Mac                         : {0}", GetIsclPeerMac());         Console.WriteLine("Iscl Communication Block Length is    : {0}", GetIsclCommunicationBlockLength());         Console.WriteLine("Iscl Index For Encryption             : {0}", GetIsclIndexForEncryption());         Console.WriteLine("Is Iscl Queue Empty                   : {0}", IsIsclQueueEmpty());         Console.WriteLine("Iscl Index For Mutual Authentication  : {0}", GetIsclIndexForMutualAuthentication());         Console.WriteLine("Iscl Status is                        : {0}", GetIsclStatus());         //We can also call  GetIsclPeerAuthenticationData() to Get the Peer Authentication Data          waitEvent.Set();      }        protected override bool GetChallengeIscl(ref long challenge, long parameter)      {          challenge = 0x0123456789ABCDE1;          return true;      }       protected override bool InternalAuthenticateIscl(long challenge, ref long response, long parameter)      {          response = challenge + 1;          return true;      }        protected override bool ExternalAuthenticateIscl(long challenge, long response, long parameter)      {          if (response == (challenge + 1))              return true;            return false;      }  };    //  // Secure server client (ISCL)  //  public class ServerConnection : DicomNet  {      public ServerConnection()          : base(null, DicomNetSecurityeMode.Iscl)      {          string authData = "LEAD server ISCL";            SetIsclMutualAuthenticationAlgorithm(DicomIsclMutualAuthenticationMode.ThreePFourW);          SetIsclMutualAuthenticationKey(1, 11619789628100321);          SetIsclMutualAuthenticationKey(2, 34217865672122111);          SetIsclMutualAuthenticationKey(3, 1605935625518899689);          SetIsclMutualAuthenticationKey(4, 138217077775855676);          SetIsclMutualAuthenticationKey(5, 9117318694593010212);          SetIsclMutualAuthenticationKey(6, 3485297985488245687);          SetIsclMutualAuthenticationKey(7, 1533287511573403981);          SetIsclMutualAuthenticationKey(8, 5604839976916070822);          SetIsclIndexForMutualAuthentication(1);            SetIsclDefaultEncryptionMode(DicomIsclEncryptionMethodType.DesCbc);          SetIsclDefaultSigningMode(DicomIsclSigningMethodType.Md5);          SetIsclEncryptionKey(1, 8079278526052745737);          SetIsclEncryptionKey(2, 1312864321990916052);          SetIsclEncryptionKey(3, 7190959962252002117);          SetIsclEncryptionKey(4, 3619524191167482890);          SetIsclEncryptionKey(5, 3466658849848898336);          SetIsclEncryptionKey(6, 8474124475946342520);          SetIsclEncryptionKey(7, 7725464453540259890);          SetIsclEncryptionKey(8, 4320705344832296668);          SetIsclEncryptionKeyIndex(1);            SetIsclMaxMessageLength(1024000);          SetIsclMaxCommunicationBlockLength(8129);            byte[] data = new ASCIIEncoding().GetBytes(authData);            SetIsclAuthenticationData(data, data.GetLength(0));      }        protected override bool GetChallengeIscl(ref long challenge, long parameter)      {          challenge = 0x0123456789ABCDE1;          return true;      }       protected override bool InternalAuthenticateIscl(long challenge, ref long response, long parameter)      {          response = challenge + 1;          return true;      }        protected override bool ExternalAuthenticateIscl(long challenge, long response, long parameter)      {          if (response == challenge + 1)              return true;            return false;      }  };    public class Server : DicomNet  {      public Server()          : base(null, DicomNetSecurityeMode.None)      {      }        protected override void OnAccept(DicomExceptionCode error)      {          ServerConnection client = new ServerConnection();            Accept(client);      }  }      public void ISCLSecuritySample()  {      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("", 1000, "127.0.0.1", 104); // connect to secure 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");              }                // If secure link is established you can now do your regular              // dicom communications.                client.CloseForced(true);          }          server.CloseForced(true);      }        DicomEngine.Shutdown();      DicomNet.Shutdown();  } |