diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index f328c752ea..4879ec8d8b 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -807,6 +807,18 @@ void MyMesh::clearStats() { ((SimpleMeshTables *)getTables())->resetStats(); } +void MyMesh::regenerateKeys(uint8_t byte) { + if (byte >0 && byte < 0xff){ + MESH_DEBUG_PRINTLN("Generating new keypair"); + mesh::LocalIdentity new_id = radio_new_identity(); + + while (new_id.pub_key[0] != byte) { + new_id = radio_new_identity(); + } + saveIdentity(new_id); + } +} + void MyMesh::handleCommand(uint32_t sender_timestamp, char *command, char *reply) { while (*command == ' ') command++; // skip leading spaces diff --git a/examples/simple_repeater/MyMesh.h b/examples/simple_repeater/MyMesh.h index a9ab251ee5..a1291b9149 100644 --- a/examples/simple_repeater/MyMesh.h +++ b/examples/simple_repeater/MyMesh.h @@ -188,6 +188,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { void saveIdentity(const mesh::LocalIdentity& new_id) override; void clearStats() override; + void regenerateKeys(uint8_t byte); void handleCommand(uint32_t sender_timestamp, char* command, char* reply); void loop(); diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index b8bb698a5c..6ee29b1960 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -245,6 +245,29 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch } else if (memcmp(command, "clear stats", 11) == 0) { _callbacks->clearStats(); strcpy(reply, "(OK - stats reset)"); + } else if (memcmp(command, "regeneratekeys ", 15) == 0) { + // Parse first hex digit + int value = 0; + if (command[15] >= '0' && command[15] <= '9') + value = (command[15] - '0') << 4; + else if (command[15] >= 'a' && command[15] <= 'f') + value = (command[15] - 'a' + 10) << 4; + else if (command[15] >= 'A' && command[15] <= 'F') + value = (command[15] - 'A' + 10) << 4; + // Parse second hex digit + if (command[16] >= '0' && command[16] <= '9') + value |= (command[16] - '0'); + else if (command[16] >= 'a' && command[16] <= 'f') + value |= (command[16] - 'a' + 10); + else if (command[16] >= 'A' && command[16] <= 'F') + value |= (command[16] - 'A' + 10); + // regenerate key pair + MESH_DEBUG_PRINTLN("Generating new keypair"); + if ((value > 0) && (value < 0xff)){ + _callbacks->regenerateKeys(value); + _board->reboot(); // doesn't return + } + sprintf(reply, "> ERROR"); /* * GET commands */ diff --git a/src/helpers/CommonCLI.h b/src/helpers/CommonCLI.h index ea59aa92dd..be14382069 100644 --- a/src/helpers/CommonCLI.h +++ b/src/helpers/CommonCLI.h @@ -69,6 +69,7 @@ class CommonCLICallbacks { virtual mesh::LocalIdentity& getSelfId() = 0; virtual void saveIdentity(const mesh::LocalIdentity& new_id) = 0; virtual void clearStats() = 0; + virtual void regenerateKeys(uint8_t byte) = 0; virtual void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) = 0; virtual void setBridgeState(bool enable) {