Exemple #1
0
        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);
        }
Exemple #4
0
        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;
                }
                }
            }
        }