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
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
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();
}