DataSecurityRequest.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using PlcSiemens.Core.Extension;
  2. using PlcSiemens.O;
  3. using PlcSiemens.Protocol.Common;
  4. namespace PlcSiemens.Protocol.Security
  5. {
  6. public class DataSecurityRequest
  7. {
  8. public byte Ret; // 0xFF for request
  9. public byte Ts; // 0x09 Transport size
  10. public ushort DLen; // Data len : 8 bytes
  11. public char[] Pwd; // Password encoded into "AG" format 8
  12. public ushort PacketLength
  13. { get { return 0x0C; } }
  14. public void Build(params char[] value)
  15. {
  16. if (value.IsNotEmpty())
  17. {
  18. Ts = (byte)TsType.TsResOctet;
  19. Ret = 0xFF;
  20. Pwd = value;
  21. DLen = 0x0008;
  22. }
  23. else
  24. {
  25. Ts = 0x00;
  26. Ret = 0x0A;
  27. DLen = 0x0000;
  28. }
  29. }
  30. public void GetByteBuffer(ByteBuffer buffer)
  31. {
  32. buffer.Push(Ret);
  33. buffer.Push(Ts);
  34. buffer.Push(DLen);
  35. if (DLen == 0) return;
  36. Pwd[0] = (char)(Pwd[0] ^ 0x55);
  37. Pwd[1] = (char)(Pwd[1] ^ 0x55);
  38. for (var i = 2; i < 8; i++)
  39. {
  40. Pwd[i] = (char)(Pwd[i] ^ 0x55 ^ Pwd[i - 2]);
  41. }
  42. ;
  43. Pwd.ForEach(t => buffer.Push((byte)t));
  44. }
  45. }
  46. }