←Select platform

GetIsclCommunicationBlockLength Method

Summary

Returns the communication block length agreed upon during mutual authentication.

Syntax

C#
VB
C++
public int GetIsclCommunicationBlockLength() 
Public Function GetIsclCommunicationBlockLength() As Integer 
public: 
int GetIsclCommunicationBlockLength();  

Return Value

The communication block length agreed upon during mutual authentication.

Remarks

Using a block size that is too small or too big could impact performance.

Example

This is a comprehensive sample that shows how to use DICOM Secure communication using ISCL.

C#
VB
using Leadtools; 
using Leadtools.Dicom; 
 
[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(); 
} 
Imports Leadtools 
Imports Leadtools.Dicom 
 
<StructLayout(LayoutKind.Sequential)> 
Public Structure MSG 
   Public hwnd As IntPtr 
   Public message As UInteger 
   Public wParam As IntPtr 
   Public lParam As IntPtr 
   Public time As UInteger 
   Public p As System.Drawing.Point 
End Structure 
 
Public Enum WaitReturn 
   Complete 
   Timeout 
End Enum 
 
Private Class Utils 
   <DllImport("user32.dll")> 
   Shared Function PeekMessage(<System.Runtime.InteropServices.Out()> ByRef lpMsg As MSG, ByVal hWnd As IntPtr, ByVal wMsgFilterMin As UInteger, 
                                  ByVal wMsgFilterMax As UInteger, ByVal wRemoveMsg As UInteger) As <MarshalAs(UnmanagedType.Bool)> Boolean 
   End Function 
 
   <DllImport("user32.dll")> 
   Shared Function TranslateMessage(ByRef lpMsg As MSG) As Boolean 
   End Function 
   <DllImport("user32.dll")> 
   Shared Function DispatchMessage(ByRef lpmsg As MSG) As IntPtr 
   End Function 
 
   Private Const PM_REMOVE As UInteger = 1 
 
   Public Shared Function WaitForComplete(ByVal mill As Double, ByVal wh As WaitHandle) As WaitReturn 
      Dim goal As TimeSpan = New TimeSpan(DateTime.Now.AddMilliseconds(mill).Ticks) 
 
      Do 
         Dim msg As MSG = New MSG() 
 
         If PeekMessage(msg, IntPtr.Zero, 0, 0, PM_REMOVE) Then 
            TranslateMessage(msg) 
            DispatchMessage(msg) 
         End If 
 
         If wh.WaitOne(New TimeSpan(0, 0, 0), False) Then 
            Return WaitReturn.Complete 
         End If 
 
         If goal.CompareTo(New TimeSpan(DateTime.Now.Ticks)) < 0 Then 
            Return WaitReturn.Timeout 
         End If 
 
      Loop While True 
   End Function 
End Class 
 
' 
' Secure client (ISCL) 
' 
Public Class Client : Inherits DicomNet 
   Private waitEvent As AutoResetEvent = New AutoResetEvent(False) 
 
   Public Sub New() 
      MyBase.New(Nothing, DicomNetSecurityeMode.Iscl) 
      Dim authData As String = "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) 
 
 
      Dim data As Byte() = New ASCIIEncoding().GetBytes(authData) 
 
      SetIsclAuthenticationData(data, data.GetLength(0)) 
   End Sub 
 
   Public Function Wait() As Boolean 
      Dim ret As WaitReturn 
 
      ret = Utils.WaitForComplete((2 * 60) * 1000, waitEvent) 
 
      Return (ret = WaitReturn.Complete) 
   End Function 
 
   Protected Overrides Sub OnConnect(ByVal [error] As DicomExceptionCode) 
      waitEvent.Set() 
   End Sub 
 
   Protected Overrides Sub OnSecureLinkReady(ByVal [error] As DicomExceptionCode) 
      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() 
   End Sub 
 
   Protected Overrides Function GetChallengeIscl(ByRef challenge As Long, ByVal parameter As Long) As Boolean 
      challenge = &H123456789ABCDE1 
      Return True 
   End Function 
 
   Protected Overrides Function InternalAuthenticateIscl(ByVal challenge As Long, ByRef response As Long, ByVal parameter As Long) As Boolean 
      response = challenge + 1 
      Return True 
   End Function 
 
   Protected Overrides Function ExternalAuthenticateIscl(ByVal challenge As Long, ByVal response As Long, ByVal parameter As Long) As Boolean 
      If response = (challenge + 1) Then 
         Return True 
      End If 
 
      Return False 
   End Function 
End Class 
 
' 
' Secure server client (ISCL) 
' 
Public Class ServerConnection : Inherits DicomNet 
   Public Sub New() 
      MyBase.New(Nothing, DicomNetSecurityeMode.Iscl) 
      Dim authData As String = "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) 
 
      Dim data As Byte() = New ASCIIEncoding().GetBytes(authData) 
      SetIsclAuthenticationData(data, data.GetLength(0)) 
 
   End Sub 
 
   Protected Overrides Function GetChallengeIscl(ByRef challenge As Long, ByVal parameter As Long) As Boolean 
      challenge = &H123456789ABCDE1 
      Return True 
   End Function 
 
   Protected Overrides Function InternalAuthenticateIscl(ByVal challenge As Long, ByRef response As Long, ByVal parameter As Long) As Boolean 
      response = challenge + 1 
      Return True 
   End Function 
 
   Protected Overrides Function ExternalAuthenticateIscl(ByVal challenge As Long, ByVal response As Long, ByVal parameter As Long) As Boolean 
      If response = challenge + 1 Then 
         Return True 
      End If 
 
      Return False 
   End Function 
End Class 
 
Public Class Server : Inherits DicomNet 
   Public Sub New() 
      MyBase.New(Nothing, DicomNetSecurityeMode.None) 
   End Sub 
 
   Protected Overrides Sub OnAccept(ByVal [error] As DicomExceptionCode) 
      Dim client As ServerConnection = New ServerConnection() 
 
      Accept(client) 
   End Sub 
End Class 
 
 
<TestMethod> 
Public Sub ISCLSecuritySample() 
   DicomEngine.Startup() 
   DicomNet.Startup() 
 
   Using server As New Server() 
      Using client As 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 Not client.Wait() Then 
            ' wait for connection to finish 
            Debug.Fail("Connection timed out") 
         End If 
         Debug.Assert(client.IsConnected(), "Client not connected") 
 
         ' 
         ' Wait for authenication 
         ' 
         If Not client.Wait() Then 
            Debug.Fail("Connection timed out waiting for authenication") 
         End If 
 
         ' If secure link is established you can now do your regular 
         ' dicom communications. 
 
         client.CloseForced(True) 
      End Using 
      server.CloseForced(True) 
   End Using 
 
   DicomEngine.Shutdown() 
   DicomNet.Shutdown() 
End Sub 

Requirements

Target Platforms

Products | Support | Contact Us | Copyright Notices
© 1991-2017 LEAD Technologies, Inc. All Rights Reserved.
Leadtools.Dicom Assembly
Click or drag to resize