byte[] IGXDLMSBase.Invoke(GXDLMSSettings settings, ValueEventArgs e)
{
//Check reply_to_HLS_authentication
if (e.Index == 8)
{
UInt32 ic = 0;
byte[] secret;
if (settings.Authentication == Authentication.HighGMAC)
{
secret = settings.SourceSystemTitle;
GXByteBuffer bb = new GXByteBuffer(e.Parameters as byte[]);
bb.GetUInt8();
ic = bb.GetUInt32();
}
else
{
secret = HlsSecret;
}
byte[] serverChallenge = GXSecure.Secure(settings, settings.Cipher, ic, settings.StoCChallenge, secret);
byte[] clientChallenge = (byte[])e.Parameters;
if (GXCommon.Compare(serverChallenge, clientChallenge))
{
if (settings.Authentication == Authentication.HighGMAC)
{
secret = settings.Cipher.SystemTitle;
ic = settings.Cipher.FrameCounter;
}
else
{
secret = HlsSecret;
}
settings.Connected = true;
return GXSecure.Secure(settings, settings.Cipher, ic, settings.CtoSChallenge, secret);
}
else
{
// If the password does not match.
settings.Connected = false;
return null;
}
}
else
{
e.Error = ErrorCode.ReadWriteDenied;
return null;
}
}