/// <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); }
//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; } } }
public void DownloadData(SerialPort serialPort, int baudRate, BootloaderFile bootloaderFile, Form1 parentForm) { TransmittedData.TransmissionOfData(serialPort, baudRate, bootloaderFile, ClientCodes.DOWNLOAD_DATA, parentForm); }
/// <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); }
public static void Disconnect(SerialPort serialPort, int baudRate, BootloaderFile bootloaderFile, Form1 parentForm) { TransmittedData.TransmissionOfData(serialPort, baudRate, bootloaderFile, ClientCodes.DISCONNECT, parentForm); serialPort.DiscardInBuffer(); serialPort.Close(); }
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; * } */ } }