private void DecryptFrame(MBusFrame data) { DriverContext.Logger.LogTrace($"Check frame {data?.CiField}"); if (data != null && data.CiField == 0x5B) { var controlHigh = data.RawData.Span[18]; DriverContext.Logger.LogTrace($"Check frame if frame is supported {controlHigh}"); switch (controlHigh & 0x0F) { case 5: { if (!(OmsHelper.AesDecrypt(_aesKey, data, _logger) is VariableDataFrame variableDataFrame)) { DriverContext.Logger.LogError("Could not encrypt data frame"); return; } foreach (var child in Children) { if (child is OmsDriverAttribute att) { att.SetData(variableDataFrame); } } break; } } } }
public void Test_MBusFrame_Get_Iv() { var excpectedIv = Automatica.Core.Driver.Utility.Utils.StringToByteArray("2D4C00000000010E0D0D0D0D0D0D0D0D"); var frame = MBusFrame.FromByteArray(MBusFrameType.LongFrame, NullLogger.Instance, Automatica.Core.Driver.Utility.Utils.StringToByteArray( "685F5F6853F05B000000002D4C010E0D0050053FD0FEB726760CC7AAF0B52B41F0C541BD6306DCD8B91B3DA2311EF13D2514D0960082161EFEC4B6CB1E0B3328BE6177DCA594C1280024A835F1D655BA7182B256E94BD33AC0A6B08DA46781EB4E91E01216")); var iv = OmsHelper.GetIvFromMBusFrame(frame); Assert.Equal(excpectedIv, iv); }
public void Test_MBusFrame_Decrypt() { var expectedData = Automatica.Core.Driver.Utility.Utils.StringToByteArray( "2F2F066D42222C5024100403C9D58D0004833C2BCA4B008410FB827386291D008410FB82F33CE5555900042B0000000004AB3CCD05000004FB140000000004FB943CA30100000483FF04000000002F2F"); var frame = MBusFrame.FromByteArray(MBusFrameType.LongFrame, NullLogger.Instance, Automatica.Core.Driver.Utility.Utils.StringToByteArray( "685F5F6873F05B000000002D4C010E00005005F72A3BA99D9128AB6008BEEE5336CA296EA1FFD143471C72DEAE2F716AB169FF071CC08605BC4EE99FC9D36ADE999BC910605B159ECBA642961D47560EB9C1E18071A883A18E7D5D9C8D81B9989880D6B016")); var key = "57B7CBDF2154C01795C75CCCEAD572CF"; var aesKey = Automatica.Core.Driver.Utility.Utils.StringToByteArray(key); var decryptedFrame = OmsHelper.AesDecryptFrame(aesKey, frame); Assert.Equal(expectedData, decryptedFrame); }
private void DecryptFrame(MBusFrame data) { if (data != null && data.CiField == 0x5B) { var controlHigh = data.RawData.Span[OffsetUserData + 11]; var controlLow = data.RawData.Span[OffsetUserData + 10]; switch (controlHigh & 0x0F) { case 5: { int countEncBlocks = controlLow >> 4; System.Console.WriteLine( $"AES with dyn.init vector {countEncBlocks} d 16 byte blocks plus % d unencrypted data {data.RawData.Length - 12 - 16 * countEncBlocks}"); var encrypted = OmsHelper.AesDecrypt(_aesKey, data, NullLogger.Instance); break; } } } }