public override byte[] GetByteMessage() { List <byte> messageArray = new List <byte>(); messageArray.AddRange(Mhdr.ToArray()); messageArray.AddRange(AppEUI.ToArray()); messageArray.AddRange(DevEUI.ToArray()); messageArray.AddRange(DevNonce.ToArray()); if (!Mic.Span.IsEmpty) { messageArray.AddRange(Mic.ToArray()); } return(messageArray.ToArray()); }
/// <summary> /// A Method to calculate the Mic of the message /// </summary> /// <param name="nwskey">The Network Secret Key</param> /// <returns> the Mic bytes</returns> public byte[] CalculateMic(string appKey, byte[] algoinput) { IMac mac = MacUtilities.GetMac("AESCMAC"); KeyParameter key = new KeyParameter(ConversionHelper.StringToByteArray(appKey)); mac.Init(key); byte[] rfu = new byte[1]; rfu[0] = 0x0; byte[] msgLength = BitConverter.GetBytes(algoinput.Length); byte[] result = new byte[16]; mac.BlockUpdate(algoinput, 0, algoinput.Length); result = MacUtilities.DoFinal(mac); Mic = result.Take(4).ToArray(); return(Mic.ToArray()); }
/// <summary> /// Method to check if the mic is valid /// </summary> /// <param name="nwskey">the network security key</param> /// <returns>if the Mic is valid or not</returns> public override bool CheckMic(string nwskey) { IMac mac = MacUtilities.GetMac("AESCMAC"); KeyParameter key = new KeyParameter(ConversionHelper.StringToByteArray(nwskey)); mac.Init(key); byte[] block = { 0x49, 0x00, 0x00, 0x00, 0x00, (byte)Direction, (byte)DevAddr.Span[3], (byte)DevAddr.Span[2], (byte)DevAddr.Span[1], (byte)DevAddr.Span[0], Fcnt.Span[0], Fcnt.Span[1], 0x00, 0x00, 0x00, (byte)(RawMessage.Length - 4) }; var algoinput = block.Concat(RawMessage.Take(RawMessage.Length - 4)).ToArray(); byte[] result = new byte[16]; mac.BlockUpdate(algoinput, 0, algoinput.Length); result = MacUtilities.DoFinal(mac); return(Mic.ToArray().SequenceEqual(result.Take(4).ToArray())); }
public override bool CheckMic(string appKey) { return(Mic.ToArray().SequenceEqual(PerformMic(appKey))); }
public override byte[] PerformEncryption(string appSkey) { byte[] pt; if (!CfList.Span.IsEmpty) { pt = AppNonce.ToArray().Concat(NetID.ToArray()).Concat(DevAddr.ToArray()).Concat(DlSettings.ToArray()).Concat(RxDelay.ToArray()).Concat(CfList.ToArray()).Concat(Mic.ToArray()).ToArray(); } else { pt = AppNonce.ToArray().Concat(NetID.ToArray()).Concat(DevAddr.ToArray()).Concat(DlSettings.ToArray()).Concat(RxDelay.ToArray()).Concat(Mic.ToArray()).ToArray(); } Aes aes = new AesManaged(); aes.Key = ConversionHelper.StringToByteArray(appSkey); aes.IV = new byte[16]; aes.Mode = CipherMode.ECB; aes.Padding = PaddingMode.None; ICryptoTransform cipher; cipher = aes.CreateDecryptor(); var encryptedPayload = cipher.TransformFinalBlock(pt, 0, pt.Length); RawMessage = new byte[encryptedPayload.Length]; Array.Copy(encryptedPayload, 0, RawMessage, 0, encryptedPayload.Length); return(encryptedPayload); }