Packet.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "Packet.h"
  2. #include <string.h>
  3. #include <SHA256.h>
  4. namespace mesh {
  5. Packet::Packet() {
  6. header = 0;
  7. path_len = 0;
  8. payload_len = 0;
  9. }
  10. int Packet::getRawLength() const {
  11. return 2 + path_len + payload_len + (hasTransportCodes() ? 4 : 0);
  12. }
  13. void Packet::calculatePacketHash(uint8_t* hash) const {
  14. SHA256 sha;
  15. uint8_t t = getPayloadType();
  16. sha.update(&t, 1);
  17. if (t == PAYLOAD_TYPE_TRACE) {
  18. sha.update(&path_len, sizeof(path_len)); // CAVEAT: TRACE packets can revisit same node on return path
  19. }
  20. sha.update(payload, payload_len);
  21. sha.finalize(hash, MAX_HASH_SIZE);
  22. }
  23. uint8_t Packet::writeTo(uint8_t dest[]) const {
  24. uint8_t i = 0;
  25. dest[i++] = header;
  26. if (hasTransportCodes()) {
  27. memcpy(&dest[i], &transport_codes[0], 2); i += 2;
  28. memcpy(&dest[i], &transport_codes[1], 2); i += 2;
  29. }
  30. dest[i++] = path_len;
  31. memcpy(&dest[i], path, path_len); i += path_len;
  32. memcpy(&dest[i], payload, payload_len); i += payload_len;
  33. return i;
  34. }
  35. bool Packet::readFrom(const uint8_t src[], uint8_t len) {
  36. uint8_t i = 0;
  37. header = src[i++];
  38. if (hasTransportCodes()) {
  39. memcpy(&transport_codes[0], &src[i], 2); i += 2;
  40. memcpy(&transport_codes[1], &src[i], 2); i += 2;
  41. } else {
  42. transport_codes[0] = transport_codes[1] = 0;
  43. }
  44. path_len = src[i++];
  45. if (path_len > sizeof(path)) return false; // bad encoding
  46. memcpy(path, &src[i], path_len); i += path_len;
  47. if (i >= len) return false; // bad encoding
  48. payload_len = len - i;
  49. if (payload_len > sizeof(payload)) return false; // bad encoding
  50. memcpy(payload, &src[i], payload_len); //i += payload_len;
  51. return true; // success
  52. }
  53. }