From 53f6828872737cd4d7b29af51204d2ab70174efc Mon Sep 17 00:00:00 2001 From: Nanosonde <2073569+nanosonde@users.noreply.github.com> Date: Sun, 5 Jul 2020 15:15:47 +0200 Subject: [PATCH] SecIfObject: save/restore required for persisting STATE. Bugfix: use correct PID for group key table --- src/knx/security_interface_object.cpp | 25 +++++++++++++++++++++++-- src/knx/security_interface_object.h | 5 +++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/knx/security_interface_object.cpp b/src/knx/security_interface_object.cpp index e1c7c33..2377693 100644 --- a/src/knx/security_interface_object.cpp +++ b/src/knx/security_interface_object.cpp @@ -168,6 +168,27 @@ void SecurityInterfaceObject::secureApplicationLayer(SecureApplicationLayer& sec _secAppLayer = &secAppLayer; } +uint8_t* SecurityInterfaceObject::save(uint8_t* buffer) +{ + buffer = pushByte(_state, buffer); + + return InterfaceObject::save(buffer); +} + +const uint8_t* SecurityInterfaceObject::restore(const uint8_t* buffer) +{ + uint8_t state = 0; + buffer = popByte(state, buffer); + _state = (LoadState)state; + + return InterfaceObject::restore(buffer); +} + +uint16_t SecurityInterfaceObject::saveSize() +{ + return 1 + InterfaceObject::saveSize(); +} + bool SecurityInterfaceObject::isLoaded() { return _state == LS_LOADED; @@ -354,8 +375,8 @@ const uint8_t* SecurityInterfaceObject::groupKey(uint16_t addressIndex) uint8_t entry[elementSize]; // 2 bytes index + keysize (16 bytes) = 18 bytes for (int i = 1; i <= numElements; i++) { - property(PID_P2P_KEY_TABLE)->read(i, 1, entry); - uint16_t index = (entry[0] << 8) | entry[1]; + property(PID_GRP_KEY_TABLE)->read(i, 1, entry); + uint16_t index = ((entry[0] << 8) | entry[1]); if (index > addressIndex) { return nullptr; diff --git a/src/knx/security_interface_object.h b/src/knx/security_interface_object.h index cc27b45..ea7e3cf 100644 --- a/src/knx/security_interface_object.h +++ b/src/knx/security_interface_object.h @@ -31,6 +31,11 @@ public: DataSecurity getGroupObjectSecurity(uint16_t index, bool isWrite); + LoadState loadState(); + uint8_t* save(uint8_t* buffer) override; + const uint8_t* restore(const uint8_t* buffer) override; + uint16_t saveSize() override; + private: SecureApplicationLayer* _secAppLayer = nullptr;