Error processing SSI file
LEADTOOLS Medical (Leadtools.Dicom assembly)

Show in webframe

GetIsclPeerAuthenticationData() Method








Gets the authentication data the peer computer sent during mutual authentication.
Syntax
public byte[] GetIsclPeerAuthenticationData()
'Declaration
 
Public Overloads Function GetIsclPeerAuthenticationData() As Byte()
'Usage
 
Dim instance As DicomNet
Dim value() As Byte
 
value = instance.GetIsclPeerAuthenticationData()
public byte[] GetIsclPeerAuthenticationData()
 function Leadtools.Dicom.DicomNet.GetIsclPeerAuthenticationData()()
public:
array<byte>^ GetIsclPeerAuthenticationData(); 

Return Value

Buffer that contains the peer authentication data.
Remarks
This method can only be called by the receiver of a message, if the message is not successfully received.
Example

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

Copy Code  
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
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);
    }
}

[TestMethod]
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();
}
Requirements

Target Platforms

See Also

Reference

DicomNet Class
DicomNet Members
Overload List
GetIsclPeerAuthenticationData(IntPtr,Int32) Method
GetIsclPeerMac Method
GetIsclPeerEncryption Method
GetIsclPeerRequestedMessageLength Method

Error processing SSI file
Leadtools.Dicom requires a Medical toolkit server license and unlock key. For more information, refer to: Imaging Pro/Document/Medical Features