byte[] IGXDLMSBase.Invoke(GXDLMSSettings settings, ValueEventArgs e)
{
if (e.Index == 2)
{
foreach (object tmp in e.Parameters as object[])
{
object[] item = tmp as object[];
GlobalKeyType type = (GlobalKeyType)Convert.ToInt32(item[0]);
byte[] data = (byte[])item[1];
switch (type)
{
case GlobalKeyType.UnicastEncryption:
case GlobalKeyType.BroadcastEncryption:
//Invalid type
e.Error = ErrorCode.ReadWriteDenied;
break;
case GlobalKeyType.Authentication:
//if settings.Cipher is null non secure server is used.
settings.Cipher.AuthenticationKey = GXDLMSSecureClient.Decrypt(settings.Kek, data);
break;
case GlobalKeyType.Kek:
settings.Kek = GXDLMSSecureClient.Decrypt(settings.Kek, data);
break;
default:
//Invalid type
e.Error = ErrorCode.ReadWriteDenied;
break;
}
}
//Return standard reply.
return null;
}
else
{
e.Error = ErrorCode.ReadWriteDenied;
return null;
}
}