Merge pull request #32 from liamcottle/main

add new commands to companion firmware to import and export identity
This commit is contained in:
ripplebiz 2025-02-21 13:29:39 +11:00 committed by GitHub
commit 0bb202327a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -46,6 +46,14 @@
#define OFFLINE_QUEUE_SIZE 16
#endif
#ifndef ENABLE_PRIVATE_KEY_EXPORT
#define ENABLE_PRIVATE_KEY_EXPORT 0
#endif
#ifndef ENABLE_PRIVATE_KEY_IMPORT
#define ENABLE_PRIVATE_KEY_IMPORT 0
#endif
#include <helpers/BaseChatMesh.h>
#define SEND_TIMEOUT_BASE_MILLIS 500
@ -121,6 +129,8 @@ static uint32_t _atoi(const char* sp) {
#define CMD_GET_BATTERY_VOLTAGE 20
#define CMD_SET_TUNING_PARAMS 21
#define CMD_DEVICE_QEURY 22
#define CMD_EXPORT_PRIVATE_KEY 23
#define CMD_IMPORT_PRIVATE_KEY 24
#define RESP_CODE_OK 0
#define RESP_CODE_ERR 1
@ -136,6 +146,8 @@ static uint32_t _atoi(const char* sp) {
#define RESP_CODE_EXPORT_CONTACT 11
#define RESP_CODE_BATTERY_VOLTAGE 12 // a reply to a CMD_GET_BATTERY_VOLTAGE
#define RESP_CODE_DEVICE_INFO 13 // a reply to CMD_DEVICE_QEURY
#define RESP_CODE_PRIVATE_KEY 14 // a reply to CMD_EXPORT_PRIVATE_KEY
#define RESP_CODE_DISABLED 15
// these are _pushed_ to client app at any time
#define PUSH_CODE_ADVERT 0x80
@ -163,6 +175,7 @@ struct NodePrefs { // persisted to file
class MyMesh : public BaseChatMesh {
FILESYSTEM* _fs;
RADIO_CLASS* _phy;
IdentityStore* _identity_store;
NodePrefs _prefs;
uint32_t expected_ack_crc; // TODO: keep table of expected ACKs
mesh::GroupChannel* _public;
@ -183,6 +196,26 @@ class MyMesh : public BaseChatMesh {
int offline_queue_len;
Frame offline_queue[OFFLINE_QUEUE_SIZE];
void initIdentityStore(FILESYSTEM& fs) {
#if defined(NRF52_PLATFORM)
_identity_store = new IdentityStore(fs, "");
#else
_identity_store = new IdentityStore(fs, "/identity");
#endif
}
void loadMainIdentity(mesh::RNG& trng) {
if(!_identity_store->load("_main", self_id)){
self_id = mesh::LocalIdentity(&trng); // create new random identity
saveMainIdentity(self_id);
}
}
bool saveMainIdentity(mesh::LocalIdentity identity) {
self_id = identity;
return _identity_store->save("_main", identity);
}
void loadContacts() {
if (_fs->exists("/contacts3")) {
File file = _fs->open("/contacts3");
@ -302,6 +335,12 @@ class MyMesh : public BaseChatMesh {
_serial->writeFrame(buf, 1);
}
void writeDisabledFrame() {
uint8_t buf[1];
buf[0] = RESP_CODE_DISABLED;
_serial->writeFrame(buf, 1);
}
void writeContactRespFrame(uint8_t code, const ContactInfo& contact) {
int i = 0;
out_frame[i++] = code;
@ -495,15 +534,8 @@ public:
BaseChatMesh::begin();
#if defined(NRF52_PLATFORM)
IdentityStore store(fs, "");
#else
IdentityStore store(fs, "/identity");
#endif
if (!store.load("_main", self_id)) {
self_id = mesh::LocalIdentity(&trng); // create new random identity
store.save("_main", self_id);
}
initIdentityStore(fs);
loadMainIdentity(trng);
// load persisted prefs
if (_fs->exists("/node_prefs")) {
@ -844,6 +876,29 @@ public:
uint16_t battery_millivolts = board.getBattMilliVolts();
memcpy(&reply[1], &battery_millivolts, 2);
_serial->writeFrame(reply, 3);
} else if (cmd_frame[0] == CMD_EXPORT_PRIVATE_KEY) {
if(ENABLE_PRIVATE_KEY_EXPORT == 1){
uint8_t reply[65];
reply[0] = RESP_CODE_PRIVATE_KEY;
uint8_t private_key[64];
self_id.writeTo(private_key, 64);
memcpy(&reply[1], &private_key, 64);
_serial->writeFrame(reply, 65);
} else {
writeDisabledFrame();
}
} else if (cmd_frame[0] == CMD_IMPORT_PRIVATE_KEY && len >= 65) {
if(ENABLE_PRIVATE_KEY_IMPORT == 1){
mesh::LocalIdentity identity = mesh::LocalIdentity();
identity.readFrom(&cmd_frame[1], 64);
if(saveMainIdentity(identity)){
writeOKFrame();
} else {
writeErrFrame();
}
} else {
writeDisabledFrame();
}
} else {
writeErrFrame();
MESH_DEBUG_PRINTLN("ERROR: unknown command: %02X", cmd_frame[0]);