Leadtools.Dicom Requires Medical product license | Send comments on this topic. | Back to Introduction - All Topics | Help Version 16.5.9.25
SetIsclMutualAuthenticationAlgorithm Method
See Also  Example
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(); 
}

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: Microsoft .NET Framework 3.0, Windows XP, Windows Server 2003 family, Windows Server 2008 family

See Also

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