LEADTOOLS Medical (Leadtools.Dicom assembly) Send comments on this topic. | Back to Introduction - All Topics | Help Version 17.0.3.29
SetIsclMutualAuthenticationAlgorithm Method
See Also 
Leadtools.Dicom Namespace > DicomNet Class : SetIsclMutualAuthenticationAlgorithm Method



mutualAuthenticationMode
The mutual authentication mode to use.
mutualAuthenticationMode
The mutual authentication mode to use.
Sets the mutual authentication mode.

Syntax

Visual Basic (Declaration) 
Public Sub SetIsclMutualAuthenticationAlgorithm( _
   ByVal mutualAuthenticationMode As DicomIsclMutualAuthenticationMode _
) 
Visual Basic (Usage)Copy Code
Dim instance As DicomNet
Dim mutualAuthenticationMode As DicomIsclMutualAuthenticationMode
 
instance.SetIsclMutualAuthenticationAlgorithm(mutualAuthenticationMode)
C# 
public void SetIsclMutualAuthenticationAlgorithm( 
   DicomIsclMutualAuthenticationMode mutualAuthenticationMode
)
C++/CLI 
public:
void SetIsclMutualAuthenticationAlgorithm( 
   DicomIsclMutualAuthenticationMode mutualAuthenticationMode
) 

Parameters

mutualAuthenticationMode
The mutual authentication mode to use.

Example

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

Visual BasicCopy Code
<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


<Test> _
Public Sub ISCLSecuritySample()
    DicomEngine.Startup()
    DicomNet.Startup()

    Using server As Server = New Server()
        Using client As 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 (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
C#Copy Code
[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();
}
SilverlightCSharpCopy Code
SilverlightVBCopy Code

Remarks

Currently, only DicomIsclMutualAuthenticationMode.ThreePFourW, the three-pass-four-way mutual authentication, is described in the standard.

The implicit value for the mutual authentication protocol is set at creation to DicomIsclMutualAuthenticationMode.ThreePFourW.

Requirements

Target Platforms: Silverlight 3.0, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7, MAC OS/X (Intel Only)

See Also

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