/// <summary>
        /// Encrypts a byte array in context of a BootloaderFile.
        /// </summary>
        /// <param name="arr">Array to be encrypted</param>
        /// <param name="key">Key to encrypt the array with</param>
        /// <param name="file">A BootloaderFile (so that the generated IV can be stored in it)</param>
        /// <returns>Encrypted byte array</returns>
        public static byte[] Encrypt(IReadOnlyList <byte> arr, byte[] key, ref BootloaderFile file)
        {
            var padArr = new byte[arr.Count];
            var temp   = new byte[padArr.Length];

            for (var i = 0; i < arr.Count; i++)
            {
                padArr[i] = arr[i];
            }
            var myCrypt = Aes.Create();

            myCrypt.KeySize   = 256;
            myCrypt.BlockSize = 128;
            myCrypt.Key       = key;
            myCrypt.Padding   = PaddingMode.None;
            myCrypt.GenerateIV();
            file.IV = myCrypt.IV;

            var encryptor = myCrypt.CreateEncryptor();

            for (var i = 0; i < padArr.Length; i += 16)
            {
                encryptor.TransformBlock(padArr, i, 16, temp, i);
            }
            return(temp);
        }
Пример #2
0
        //Open file and store it path...
        private void Button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = ofd.SafeFileName;
                fileName      = ofd.FileName;
                Debug.WriteLine($"FilePath: {filepath} ");
                try
                {
                    bff = new BootloaderFile(fileName);
                    string result = BitConverter.ToString(bff.IV);
                    Debug.WriteLine($"{ bff.ToFancyString()} IV: {result} ");
                    richTextBox1.Text = bff.ToFancyString();
                    isClickedButton2  = true;
                    if (isClickedButton3 == true)
                    {
                        button1.Enabled = true;
                    }
                }
                catch (Exception ex)
                {
                    Restart_Params(RESTART_FILE_PARAMS);
                    UpdateStatus(true, ex.Message);
                    button1.Enabled = false;
                }
            }
        }
Пример #3
0
 public void DownloadData(SerialPort serialPort, int baudRate, BootloaderFile bootloaderFile, Form1 parentForm)
 {
     TransmittedData.TransmissionOfData(serialPort, baudRate, bootloaderFile, ClientCodes.DOWNLOAD_DATA, parentForm);
 }
Пример #4
0
 /// <summary>
 /// Client's point of entry
 /// </summary>
 /// <param name="portName"> Name of SerialPort</param>
 /// <param name="baudRate"> Baud rate for the serial port </param>
 /// <param name="dataBits"> Standard number of data bits per byte</param>
 /// <param name="stopBits">Stop Bits for SerialPort </param>
 /// <param name="bootloaderFile">binary data to transmit</param>
 public void Upload(SerialPort serialPort, int baudRate, BootloaderFile bootloaderFile, Form1 parentForm)
 {
     TransmittedData.TransmissionOfData(serialPort, baudRate, bootloaderFile, ClientCodes.UPLOAD, parentForm);
 }
Пример #5
0
 public static void Disconnect(SerialPort serialPort, int baudRate, BootloaderFile bootloaderFile, Form1 parentForm)
 {
     TransmittedData.TransmissionOfData(serialPort, baudRate, bootloaderFile, ClientCodes.DISCONNECT, parentForm);
     serialPort.DiscardInBuffer();
     serialPort.Close();
 }
Пример #6
0
        public static SerialPort Connect(string portName, int baudRate, int dataBits, StopBits stopBits, BootloaderFile bootloaderFile, Form1 parentForm)
        {
            SerialPort serialPort = new SerialPort(portName, DEFAULT_BAUDRATE, Parity.None, dataBits, stopBits);

            try
            {
                if (!serialPort.IsOpen)
                {
                    serialPort.Open();
                }
            }
            catch (UnauthorizedAccessException Ex)
            {
                Debug.WriteLine(Ex.ToString());
                Debug.WriteLine("Access is denied to the port.");
                serialPort.Close();
            }
            catch (ArgumentOutOfRangeException Ex)
            {
                Debug.WriteLine(Ex.ToString());
                Debug.WriteLine("One of the properties is invalid");
                serialPort.Close();
            }
            catch (IOException Ex)
            {
                Debug.WriteLine(Ex.ToString());
                Debug.WriteLine("The port is in an invalid state");
                serialPort.Close();
            }
            catch (InvalidOperationException Ex)
            {
                Debug.WriteLine(Ex.ToString());
                Debug.WriteLine("SerialPort is already open");
                serialPort.Close();
            }

            Debug.WriteLine("SerialPort is open");
            TransmittedData.StartCommunication(serialPort);
            TransmittedData.TransmissionOfData(serialPort, baudRate, bootloaderFile, ClientCodes.CONNECT, parentForm);
            return(serialPort);
        }
        private static void RunOptions(Options opts)
        {
            var  inputFilePath    = opts.InputFilePath;
            var  keyFilePath      = opts.KeyFilePath;
            var  manufacturerName = opts.ManufacturerName;
            var  version          = opts.Version;
            var  outputFilePath   = opts.OutputFilePath;
            uint startAddr        = 0;
            uint endAddr          = 0;

            // check ManufacturerName length
            if (manufacturerName.Length > 31)
            {
                throw new ConstraintException("Manufacturer name is too long (max: 31)");
            }

            // parse startAddr and endAddr
            try
            {
                startAddr = Convert.ToUInt32(opts.StartAddr, 16);
            }
            catch (FormatException)
            {
                startAddr = Convert.ToUInt32(opts.StartAddr);
            }
            try
            {
                endAddr = Convert.ToUInt32(opts.EndAddr, 16);
            }
            catch (FormatException)
            {
                endAddr = Convert.ToUInt32(opts.EndAddr);
            }

            // read firmware binary
            var rawFirmwareBinaryList = new List <byte>();

            using (var binaryReader =
                       new BinaryReader(new FileStream(inputFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)))
            {
                while (true)
                {
                    byte tempByte;
                    try
                    {
                        tempByte = binaryReader.ReadByte();
                    }
                    catch (EndOfStreamException)
                    {
                        break;
                    }
                    rawFirmwareBinaryList.Add(tempByte);
                }
            }

            while (rawFirmwareBinaryList.Count % 16 != 0)
            {
                rawFirmwareBinaryList.Add(0);
            }

            // calculate CRC32
            var addrCrc = Crc32Algorithm.Compute(BitConverter.GetBytes(startAddr).Concat(BitConverter.GetBytes(endAddr)).ToArray());
            var dataCrc = Crc32Algorithm.Compute(rawFirmwareBinaryList.ToArray());

            var firstBlock =
                BitConverter.GetBytes(addrCrc)
                .Concat(BitConverter.GetBytes(startAddr))
                .Concat(BitConverter.GetBytes(endAddr))
                .Concat(BitConverter.GetBytes(dataCrc));

            // read key
            byte[] key;
            using (var binaryReader = new BinaryReader(new FileStream(keyFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)))
            {
                key = binaryReader.ReadBytes(32);
            }
            // create BootloaderFile
            var file = new BootloaderFile();
            // encrypt
            var encryptedBinary = Utilities.Encrypt(
                firstBlock.Concat(rawFirmwareBinaryList).ToArray(),
                key,
                ref file
                );

            file.Data             = encryptedBinary.Skip(16).ToArray();
            file.ManufacturerName = manufacturerName;
            file.FirstBlock       = encryptedBinary.Take(16).ToArray();
            // parse version
            var splitVersion = version.Split(".");

            for (var i = 0; i < 4; i++)
            {
                file.FirmwareVersion[i] = ushort.Parse(splitVersion[i]);
            }

            file.WriteBootloaderFile(outputFilePath);
            Console.WriteLine(file.ToFancyString());
            Console.Write("IV: ");
        }
        public static void TransmissionOfData(SerialPort serialPort, int baudRate, BootloaderFile bootloaderFile, int clientCode, Form1 parentForm)
        {
            int    currentBytesSended = 0;
            String decodedData;

            state = 0;

            while (true)
            {
                ChangeCode(clientCode);
                if (transmissionCode == Transmission.BAUDRATE)
                {
                    if (serialPort.BaudRate != baudRate)
                    {
                        Send.SendData(serialPort, Transmission.BAUDRATE, sizeof(int), BitConverter.GetBytes(baudRate));
                        serialPort.BaudRate = baudRate;
                    }
                    else if (breakFlag == 1)
                    {
                        breakFlag = 0;
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
                if (transmissionCode == Transmission.FIRMWARE_INFO_FROM_BOOTLOADER)
                {
                    byte[] firmware = new byte[1];
                    Send.SendData(serialPort, Transmission.FIRMWARE_INFO_FROM_BOOTLOADER, 0, firmware);
                }
                if (transmissionCode == Transmission.FIRMWARE_INFO)
                {
                    Send.SendData(serialPort, Transmission.FIRMWARE_INFO, bootloaderFile.GetMetadataAsByteArray().Length, bootloaderFile.GetMetadataAsByteArray());
                    Debug.WriteLine(BitConverter.ToString(bootloaderFile.GetMetadataAsByteArray()));
                    Debug.WriteLine("Firmware Info is sended");
                }
                if (transmissionCode == Transmission.ADDRESSES_INFO)
                {
                    Send.SendData(serialPort, Transmission.ADDRESSES_INFO, bootloaderFile.FirstBlock.Length, bootloaderFile.FirstBlock);
                    Debug.WriteLine(BitConverter.ToString(bootloaderFile.FirstBlock));
                    Debug.WriteLine("Addresses Info is sended");
                }
                if (transmissionCode == Transmission.DOWNLOAD_CODE)
                {
                    byte[] downloadCodeUselessArray = new byte[1];
                    Send.SendData(serialPort, Transmission.DOWNLOAD_CODE, 0, downloadCodeUselessArray);
                    Debug.WriteLine("Code Downloading statred");
                }
                if (transmissionCode == Transmission.DOWNLOAD_DATA)
                {
                    byte[] downloadDataUselessArray = new byte[1];
                    Send.SendData(serialPort, Transmission.DOWNLOAD_DATA, 0, downloadDataUselessArray);
                    Debug.WriteLine("Data Downloading statred");
                }
                if (transmissionCode == Transmission.PROGRAM)
                {
                    byte[] program = BitConverter.GetBytes(bootloaderFile.Data.Length);
                    Debug.WriteLine($"Data len is {bootloaderFile.Data.Length}");
                    Send.SendData(serialPort, Transmission.PROGRAM, program.Length, program);
                }
                //перенести
                if (transmissionCode == Transmission.RELEASE)
                {
                    byte[] release = new byte[1];
                    Send.SendData(serialPort, Transmission.RELEASE, 0, release);
                    Debug.WriteLine("Bye-Bye");
                    break;
                }
                if (breakFlag == 1)
                {
                    breakFlag = 0;
                    break;
                }

                while (true)
                {
                    //Utils.Wait_for_data(serialPort);
                    TransmittedData recievedData = Receive.ReceiveData(serialPort);

                    if (recievedData.MessageCode == Transmission.NEXT)
                    {
                        Debug.WriteLine("Request for next block received");
                        break;
                    }
                    else if (recievedData.MessageCode == Transmission.END_OF_DOWNLOAD)
                    {
                        //добавить флаг только для кода
                        Debug.WriteLine("Code/Data Downloaded");
                        //downloadedSmth = recievedMetaInfo.GetMetadataAsByteArray();
                        recievedMetaInfo.FirstBlock = downloadedCode.Take(16).ToArray();
                        recievedMetaInfo.Data       = downloadedCode.Skip(16).ToArray();
                        //downloadedSmth = recievedMetaInfo.GetMetadataAsByteArray().Concat(downloadedCode).ToArray();
                        //вынести в форму
                        //var fileStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write);
                        //using var binaryWriter = new BinaryWriter(fileStream, Encoding.ASCII);
                        //binaryWriter.Write(downloadedSmth);
                    }
                    else if (recievedData.MessageCode == Transmission.REQUEST)
                    {
                        Debug.WriteLine($"{recievedData.Data}");
                        uint f = BitConverter.ToUInt32(recievedData.Data, 0);
                        uint t = BitConverter.ToUInt32(recievedData.Data, 4);
                        Debug.WriteLine($"{f} {t} and len of sended data is {bootloaderFile.Data.Skip((int)f).Take((int)(t - f)).ToArray().Length}");
                        Send.SendData(serialPort, Transmission.PROGRAM, bootloaderFile.Data.Skip((int)f).Take((int)(t - f)).ToArray().Length, bootloaderFile.Data.Skip((int)f).Take((int)(t - f)).ToArray());
                        currentBytesSended += ((int)(t - f));
                        parentForm.ProgressChanged((int)(100 * currentBytesSended / bootloaderFile.Data.Length));
                        continue;
                    }
                    else if (recievedData.MessageCode == Transmission.FIRMWARE_INFO_FROM_BOOTLOADER)
                    {
                        recievedMetaInfo.GetMetadataFromByteArray(recievedData.Data);
                        Debug.WriteLine("MetaInfo was recieved");
                        continue;
                    }
                    else if (recievedData.MessageCode == Transmission.PROGRAM)
                    {
                        downloadedCode = downloadedCode.Concat(recievedData.Data).ToArray();
                    }
                    else if (recievedData.MessageCode == Transmission.DATA)
                    {
                        downloadedData = downloadedData.Concat(recievedData.Data).ToArray();
                    }
                    else
                    {
                        decodedData = Utils.Decode_data(recievedData);
                        Debug.WriteLine($"Data: {decodedData}");
                        continue;
                    }
                }

                /*
                 * switch (flag) {
                 *  //Que
                 *  case Transmission.BAUDRATE:
                 *      if (serialPort.BaudRate != baudRate)
                 *      {
                 *          Send.SendData(serialPort, Transmission.BAUDRATE, sizeof(int), BitConverter.GetBytes(baudRate));
                 *          serialPort.BaudRate = baudRate;
                 *          continue;
                 *      }
                 *      break;
                 *  case Transmission.FIRMWARE_INFO_FROM_BOOTLOADER:
                 *      byte[] firmware = new byte[1];
                 *      Send.SendData(serialPort, Transmission.FIRMWARE_INFO_FROM_BOOTLOADER, 0, firmware);
                 *      continue;
                 *
                 *  case Transmission.FIRMWARE_INFO:
                 *      Send.SendData(serialPort, Transmission.FIRMWARE_INFO, bootloaderFile.GetMetadataAsByteArray().Length, bootloaderFile.GetMetadataAsByteArray());
                 *      Debug.WriteLine("Firmware Info is sended");
                 *      continue;
                 *  case Transmission.ADDRESSES_INFO:
                 *      Send.SendData(serialPort, Transmission.FIRMWARE_INFO, bootloaderFile.FirstBlock.Length, bootloaderFile.FirstBlock);
                 *      Debug.WriteLine("Addresses Info is sended");
                 *      continue;
                 *  case Transmission.PROGRAM:
                 *      byte[] program = BitConverter.GetBytes(bootloaderFile.Data.Length);
                 *      Debug.WriteLine($"Data len is {bootloaderFile.Data.Length}");
                 *      Send.SendData(serialPort, Transmission.PROGRAM, program.Length, program);
                 *      continue;
                 *  case Transmission.RELEASE:
                 *      byte[] release = new byte[1];
                 *      Send.SendData(serialPort, Transmission.RELEASE, 0, release);
                 *      Debug.WriteLine("Bye-Bye");
                 *      break;
                 * }
                 */
            }
        }