Leadtools.Dicom Requires Medical product license | Send comments on this topic. | Back to Introduction - All Topics | Help Version 16.5.9.25
DicomTlsCipherSuiteType Enumeration
See Also   Example
Leadtools.Dicom Namespace : DicomTlsCipherSuiteType Enumeration



Specifies the type of cipher suite used in the TLS security.

Syntax

Visual Basic (Declaration) 
Public Enum DicomTlsCipherSuiteType 
   Inherits Enum
Visual Basic (Usage)Copy Code
Dim instance As DicomTlsCipherSuiteType
C# 
public enum DicomTlsCipherSuiteType : Enum 
C++/CLI 
public enum class DicomTlsCipherSuiteType : public Enum 

Members

MemberDescription
None No cipher suite has been agreed upon yet.
DheRsaWith3DesEdeCbcSha Type 1.
DheRsaWithDesCbcSha Type 2.

Example

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

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 (TLS)
'
Private Class Client : Inherits DicomNet
    Private waitEvent As AutoResetEvent = New AutoResetEvent(False)
 Private clientPEM As String = LeadtoolsExamples.Common.ImagesPath.Path + "client.pem"

 Public Sub New()
    MyBase.New(Nothing, DicomNetSecurityeMode.Tls)
    SetTlsCipherSuiteByIndex(0, DicomTlsCipherSuiteType.DheRsaWithDesCbcSha)
    SetTlsClientCertificate(clientPEM, DicomTlsCertificateType.Pem, Nothing)

    'Over here we can get detailed information about the Cipher Suite
    ' Can also call GetTlsCipherSuiteByIndex
    Dim cipherSuite As DicomTlsCipherSuiteType
    cipherSuite = GetTlsCipherSuite()
    'Returns DicomTlsEncryptionMethodType
    Console.WriteLine("Encryption Algorithm is : {0}", GetTlsEncryptionAlgorithm(cipherSuite))
    'Returns DicomTlsAuthenticationMethodType
    Console.WriteLine("Authentication Algorithm is : {0}", GetTlsAuthenticationAlgorithm(cipherSuite))
    'Returns DicomTlsMacMethodType
    Console.WriteLine("Integrity Algorithm is : {0}", GetTlsIntegrityAlgorithm(cipherSuite))
    'Returns DicomTlsExchangeMethodType
    Console.WriteLine("Key Exchange Algorithm is : {0}", GetTlsKeyExchangeAlgorithm(cipherSuite))
    Console.WriteLine("Encryption Key Length is : {0}", GetTlsEncryptionKeyLength(cipherSuite))
    Console.WriteLine("Mutual Authentication Key Length is : {0}", GetTlsMutualAuthenticationKeyLength(cipherSuite))

 End Sub

 Public Function Wait() As Boolean
    Dim ret As WaitReturn

    ret = Utils.WaitForComplete((5 * 60) * 1000, waitEvent)

    Return (ret = WaitReturn.Complete)
 End Function

 Protected Overrides Sub OnConnect(ByVal [error] As DicomExceptionCode)
    waitEvent.Set()
 End Sub

 Protected Overrides Function OnPrivateKeyPassword(ByVal encryption As Boolean) As String
    Return "test"
 End Function

 Protected Overrides Sub OnSecureLinkReady(ByVal [error] As DicomExceptionCode)
    waitEvent.Set()
 End Sub
      End Class

      '
      ' Secure server (TLS)
      '
      Private Class ServerConnection : Inherits DicomNet

 Private serverPEM As String = LeadtoolsExamples.Common.ImagesPath.Path + "server.pem"

 Public Sub New()
    MyBase.New(Nothing, DicomNetSecurityeMode.Tls)
    SetTlsCipherSuiteByIndex(0, DicomTlsCipherSuiteType.DheRsaWith3DesEdeCbcSha)
    SetTlsClientCertificate(serverPEM, DicomTlsCertificateType.Pem, Nothing)
 End Sub

 Protected Overrides Function OnPrivateKeyPassword(ByVal encryption As Boolean) As String
    Return "test"
 End Function
      End Class

Private Class Server : Inherits DicomNet
    Private client As ServerConnection

    Public Sub New()
        MyBase.New(Nothing, DicomNetSecurityeMode.None)
    End Sub

    Protected Overrides Sub OnAccept(ByVal [error] As DicomExceptionCode)
        client = New ServerConnection()

        Accept(client)
    End Sub

    Protected Overloads Overrides Sub Dispose(ByVal __p1 As Boolean)
        client.Dispose()
        MyBase.Dispose(__p1)
    End Sub
End Class



Public Sub TLSSecuritySample()
    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(Nothing, 1000, "127.0.0.1", 104) ' connect to 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

            ' Once two computers have negotiated the ciphersuite, and have
            ' authenticated each other, they can begin transferring
            ' messages and data between them.

            ' Continue with normal dicom communication

            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 (TLS) 
// 
class Client : DicomNet 

    AutoResetEvent waitEvent = new AutoResetEvent(false); 
    string clientPEM = LeadtoolsExamples.Common.ImagesPath.Path + "client.pem"; 
 
    public Client() 
        : base(null, DicomNetSecurityeMode.Tls) 
    { 
       SetTlsCipherSuiteByIndex(0, DicomTlsCipherSuiteType.DheRsaWithDesCbcSha); 
       SetTlsClientCertificate(clientPEM,DicomTlsCertificateType.Pem, null); 
 
       //Over here we can get detailed information about the Cipher Suite 
       DicomTlsCipherSuiteType cipherSuite = GetTlsCipherSuite();// Can also call GetTlsCipherSuiteByIndex 
       //Returns DicomTlsEncryptionMethodType 
       Console.WriteLine("Encryption Algorithm is : {0}", GetTlsEncryptionAlgorithm(cipherSuite)); 
       //Returns DicomTlsAuthenticationMethodType 
       Console.WriteLine("Authentication Algorithm is : {0}", GetTlsAuthenticationAlgorithm(cipherSuite)); 
       //Returns DicomTlsMacMethodType 
       Console.WriteLine("Integrity Algorithm is : {0}", GetTlsIntegrityAlgorithm(cipherSuite)); 
       //Returns DicomTlsExchangeMethodType 
       Console.WriteLine("Key Exchange Algorithm is : {0}", GetTlsKeyExchangeAlgorithm(cipherSuite)); 
       Console.WriteLine("Encryption Key Length is : {0}", GetTlsEncryptionKeyLength(cipherSuite)); 
       Console.WriteLine("Mutual Authentication Key Length is : {0}", GetTlsMutualAuthenticationKeyLength(cipherSuite)); 
    } 
 
    public bool Wait() 
    { 
        WaitReturn ret; 
 
        ret = Utils.WaitForComplete((5 * 60) * 1000, waitEvent); 
 
        return (ret == WaitReturn.Complete); 
    } 
 
    protected override void OnConnect(DicomExceptionCode error) 
    { 
        waitEvent.Set(); 
    } 
 
    protected override string OnPrivateKeyPassword(bool encryption) 
    { 
        return "test"; 
    } 
 
    protected override void OnSecureLinkReady(DicomExceptionCode error) 
    { 
        waitEvent.Set(); 
    } 

 
// 
// Secure server (TLS) 
// 
class ServerConnection : DicomNet 

 
    string serverPEM = LeadtoolsExamples.Common.ImagesPath.Path + "server.pem"; 
 
    public ServerConnection() 
        : base(null, DicomNetSecurityeMode.Tls) 
    { 
       SetTlsCipherSuiteByIndex(0, DicomTlsCipherSuiteType.DheRsaWith3DesEdeCbcSha); 
       SetTlsClientCertificate(serverPEM, DicomTlsCertificateType.Pem, null); 
    } 
 
    protected override string OnPrivateKeyPassword(bool encryption) 
    { 
        return "test"; 
    } 

 
class Server : DicomNet 

    ServerConnection client; 
 
    public Server() 
        : base(null, DicomNetSecurityeMode.None) 
    { 
    } 
 
    protected override void OnAccept(DicomExceptionCode error) 
    { 
        client = new ServerConnection(); 
 
        Accept(client); 
    } 
 
    protected override void Dispose(bool __p1) 
    { 
        client.Dispose(); 
        base.Dispose(__p1); 
    } 

 
 
public void TLSSecuritySample() 

    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(null, 1000, "127.0.0.1", 104); // connect to 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"); 
            } 
 
            // Once two computers have negotiated the ciphersuite, and have  
            // authenticated each other, they can begin transferring  
            // messages and data between them. 
 
            // Continue with normal dicom communication 
 
            client.CloseForced(true); 
        } 
        server.CloseForced(true); 
    } 
 
    DicomEngine.Shutdown(); 
    DicomNet.Shutdown(); 
}

Remarks

Currently, only the cipher suites listed below are supported by LEADTOOLS.

Inheritance Hierarchy

System.Object
   System.ValueType
      System.Enum
         Leadtools.Dicom.DicomTlsCipherSuiteType

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