Ejemplo n.º 1
0
        public void SendPacket(IReadOnlyCollection <byte> payload)
        {
            if (!bluetoothCommunicator.IsConnected())
            {
                throw new InvalidOperationException("Fox is not connected");
            }

            if (payload.Count < MinPayloadLength || payload.Count > MaxPayloadLength)
            {
                throw new ArgumentException("Wrong payload size", nameof(payload));
            }

            var fullPacket = new List <byte>();

            // Length
            fullPacket.Add((byte)(payload.Count + AddToPacketLenght));

            // Payload
            fullPacket.AddRange(payload);

            // CRC32
            var crc = CRCGenerator.CalculateSTMCRC32(fullPacket);

            fullPacket.AddRange(BitsHelper.ConvertUInt32ToBytes(crc));

            bluetoothCommunicator.SendMessage(fullPacket);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Called when new raw packet received
        /// </summary>
        public void NewRawPacketReceived(IReadOnlyCollection <byte> packet)
        {
            var packetAsList = new List <byte>(packet);

            // Checking CRC
            var crcBuffer = packetAsList
                            .GetRange(packet.Count - 4, 4);

            var expectedCRC   = BitsHelper.ConvertBytesToUint32(crcBuffer.ToArray());
            var calculatedCRC = CRCGenerator.CalculateSTMCRC32(packetAsList
                                                               .GetRange(0, packetAsList.Count - 4));

            if (expectedCRC != calculatedCRC)
            {
                return;
            }

            var payloadLength = packetAsList[0] - AddToPacketLenght;

            var payload = packetAsList
                          .GetRange(1, payloadLength)
                          .AsReadOnly();

            OnPacketReceived(payload);
        }
Ejemplo n.º 3
0
        //---------------------------------------------------------------------------------------//

        protected bool AddPacket(byte[] buffer, int startIndex)
        {
            LCDPacket packet        = CreatePacket(buffer, startIndex);
            ushort    calculatedCRC = CRCGenerator.GenerateCRC(buffer, startIndex, packet.DataLength + 2, CRCGenerator.CRC_SEED);

            Trace.WriteLine("AddPacket(): " + packet.PacketType.ToString());

            switch (packet.PacketType)
            {
            case LCDPacket.LCDPacketType.NORMAL_RESPONSE:
                AddResponsePacket(packet);
                break;

            case LCDPacket.LCDPacketType.NORMAL_REPORT:
                AddReportPacket(packet);
                break;

            case LCDPacket.LCDPacketType.ERROR_RESPONSE:
                AddResponsePacket(packet);
                break;
            }

            if (calculatedCRC != packet.CRC)
            {
                Trace.WriteLine("CRC ERROR!:" +
                                " Calculated CRC = 0x" + Convert.ToString(calculatedCRC, 16) +
                                " Packet CRC = 0x" + Convert.ToString(packet.CRC, 16)
                                );

                return(false);
            }

            return(true);
        }
Ejemplo n.º 4
0
        public static bool ReadAndDecryptPacket(BinaryReader srcStreamReader, MemoryStream destStream, SymmetricAlgorithm alg)
        {
            destStream.SetLength(0);

            //int tmout = srcStreamReader.BaseStream.ReadTimeout;
            if (srcStreamReader.ReadChar() != 'P')
            {
                return(false);
            }
            int len = srcStreamReader.ReadInt32();

            if (len > MaxInPacketLength)
            {
                return(false);
            }
            int iv = srcStreamReader.ReadInt32() - 200;

            byte[] buf = srcStreamReader.ReadBytes(len - 8);
            uint   crc = srcStreamReader.ReadUInt32() - 200;

            if (CRCGenerator.CRC32(buf, 0, buf.Length, CRCSeed) != crc)
            {
                return(false);
            }

            alg.IV = Encoding.ASCII.GetBytes(iv.ToString("X8"));
            MemoryStream tmpStream = new MemoryStream(buf);

            Crypto.Decrypt(tmpStream, destStream, alg, 64);

            destStream.Position = 0;
            return(true);
        }
Ejemplo n.º 5
0
        //-------------------------------------------------------------------------------------------------//

        private LCDPacket Send(byte packetType, byte[] data, int dataLength)
        {
            ushort crc;

            if ((data == null && dataLength != 0) ||
                (data != null && dataLength > data.Length))
            {
                throw new ArgumentException("bad data sent to Send");
            }

            //
            // Create packet buffer and enter header information
            //
            byte[] packetBuffer = new byte[dataLength + 4];
            packetBuffer[0] = packetType;
            packetBuffer[1] = (byte)dataLength;

            //
            // Enter data if there is any
            //
            if (dataLength != 0)
            {
                Array.Copy(data, 0, packetBuffer, 2, dataLength);
            }

            //
            // Calculate and enter the checksum into the last two bytes of the packet
            //
            crc = CRCGenerator.GenerateCRC(packetBuffer, dataLength + 2, CRCGenerator.CRC_SEED);
            packetBuffer[2 + dataLength + 1] = (byte)(crc >> 8);
            packetBuffer[2 + dataLength]     = (byte)crc;

            //
            // Send the request and return the response
            //
            lock (responseSignal)
            {
                responsePacket = null;

                // Write the packet to the serial LCD
                this.SendData(packetBuffer, packetBuffer.Length);

                // Wait for the response packet
                if (Monitor.Wait(responseSignal, MAX_RESPONSE_TIME))
                {
                    return(responsePacket);
                }
            }

            return(null);
        }
Ejemplo n.º 6
0
        public static bool EncryptAndWritePacket(BinaryWriter destStreamWriter, MemoryStream srcStream, SymmetricAlgorithm alg)
        {
            if (srcStream.Length == 0)
            {
                return(true);
            }

            int iv = GetRandom();

            alg.IV = Encoding.ASCII.GetBytes(iv.ToString("X8"));

            MemoryStream tmpStream = new MemoryStream();
            CryptoStream encStream = new CryptoStream(tmpStream, alg.CreateEncryptor(), CryptoStreamMode.Write);

            encStream.Write(srcStream.GetBuffer(), 0, (int)srcStream.Length);
            encStream.FlushFinalBlock();

            destStreamWriter.Write('P');
            destStreamWriter.Write((Int32)(tmpStream.Length + 8));
            destStreamWriter.Write(iv + 200);

            int offset = 0;

            while (offset < tmpStream.Length)
            {
                int l = (int)tmpStream.Length - offset;
                if (l > 4096)
                {
                    l = 4096;
                }
                destStreamWriter.Write(tmpStream.GetBuffer(), offset, l);
                destStreamWriter.BaseStream.Flush();
                offset += l;
            }

            destStreamWriter.Write(CRCGenerator.CRC32(tmpStream.GetBuffer(), 0, (int)tmpStream.Length, CRCSeed) + 200);

            encStream.Close();
            return(true);
        }