Visual Basic (Declaration) | |
---|---|
Public Function GetIsclPeerMac() As DicomIsclSigningMethodType |
Visual Basic (Usage) | Copy Code |
---|---|
Dim instance As DicomNet Dim value As DicomIsclSigningMethodType value = instance.GetIsclPeerMac() |
C# | |
---|---|
public DicomIsclSigningMethodType GetIsclPeerMac() |
C++/CLI | |
---|---|
public: DicomIsclSigningMethodType GetIsclPeerMac(); |
Return Value
The current MAC type used by the sender.This is a comprehensive sample that shows how to use DICOM Secure communication using ISCL.
Visual Basic | Copy 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(); } |
SilverlightCSharp | Copy Code |
---|---|
SilverlightVB | Copy Code |
---|---|
This method can only be called by the receiver, once the sender has attempted to send a message.
To set the MAC type, use the Leadtools.Dicom.DicomNet.SetIsclDefaultSigningMode method.
To set the encryption mode, use the Leadtools.Dicom.DicomNet.SetIsclDefaultEncryptionMode method.
The encryption mode and the MAC are specified for every message, not for each connection. Every message can have a different encryption mode and MAC, keeping the connection parameters unchanged.
Target Platforms: Silverlight 3.0, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7, MAC OS/X (Intel Only)