From 86f11d08aa377ba9296abcf1b93fa3aeb18d3e64 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Thu, 16 Jan 2025 01:59:11 +1100 Subject: [PATCH] * LocalIdentity:: writeTo( array ) and readFrom (array ) --- examples/simple_repeater/main.cpp | 2 ++ examples/simple_secure_chat/main.cpp | 2 ++ lib/ed25519/ed_25519.h | 1 + lib/ed25519/keypair.c | 7 +++++++ src/Identity.cpp | 23 +++++++++++++++++++++++ src/Identity.h | 2 ++ 6 files changed, 37 insertions(+) diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index 58cf95a6..938985e0 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -330,6 +330,8 @@ void setup() { halt(); } + radio.setCRC(0); + #ifdef SX126X_CURRENT_LIMIT radio.setCurrentLimit(SX126X_CURRENT_LIMIT); #endif diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index 8250478f..4e0ea368 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -277,6 +277,8 @@ void setup() { halt(); } + radio.setCRC(0); + #ifdef SX126X_CURRENT_LIMIT radio.setCurrentLimit(SX126X_CURRENT_LIMIT); #endif diff --git a/lib/ed25519/ed_25519.h b/lib/ed25519/ed_25519.h index 84c2ece0..5ac015e3 100644 --- a/lib/ed25519/ed_25519.h +++ b/lib/ed25519/ed_25519.h @@ -27,6 +27,7 @@ int ED25519_DECLSPEC ed25519_create_seed(unsigned char *seed); #endif void ED25519_DECLSPEC ed25519_create_keypair(unsigned char *public_key, unsigned char *private_key, const unsigned char *seed); +void ED25519_DECLSPEC ed25519_derive_pub(unsigned char *public_key, const unsigned char *private_key); void ED25519_DECLSPEC ed25519_sign(unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key, const unsigned char *private_key); int ED25519_DECLSPEC ed25519_verify(const unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key); void ED25519_DECLSPEC ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, const unsigned char *scalar); diff --git a/lib/ed25519/keypair.c b/lib/ed25519/keypair.c index c7735801..da789f75 100644 --- a/lib/ed25519/keypair.c +++ b/lib/ed25519/keypair.c @@ -14,3 +14,10 @@ void ed25519_create_keypair(unsigned char *public_key, unsigned char *private_ke ge_scalarmult_base(&A, private_key); ge_p3_tobytes(public_key, &A); } + +void ed25519_derive_pub(unsigned char *public_key, const unsigned char *private_key) { + ge_p3 A; + + ge_scalarmult_base(&A, private_key); + ge_p3_tobytes(public_key, &A); +} diff --git a/src/Identity.cpp b/src/Identity.cpp index ea31cb36..e7c57d7e 100644 --- a/src/Identity.cpp +++ b/src/Identity.cpp @@ -59,6 +59,29 @@ void LocalIdentity::printTo(Stream& s) const { s.print("prv_key: "); Utils::printHex(s, prv_key, PRV_KEY_SIZE); s.println(); } +size_t LocalIdentity::writeTo(uint8_t* dest, size_t max_len) { + if (max_len < PRV_KEY_SIZE) return 0; // not big enough + + if (max_len < PRV_KEY_SIZE + PUB_KEY_SIZE) { // only room for prv_key + memcpy(dest, prv_key, PRV_KEY_SIZE); + return PRV_KEY_SIZE; + } + memcpy(dest, prv_key, PRV_KEY_SIZE); // otherwise can fit prv + pub keys + memcpy(&dest[PRV_KEY_SIZE], pub_key, PUB_KEY_SIZE); + return PRV_KEY_SIZE + PUB_KEY_SIZE; +} + +void LocalIdentity::readFrom(const uint8_t* src, size_t len) { + if (len == PRV_KEY_SIZE + PUB_KEY_SIZE) { // has prv + pub keys + memcpy(prv_key, src, PRV_KEY_SIZE); + memcpy(pub_key, &src[PRV_KEY_SIZE], PUB_KEY_SIZE); + } else if (len == PRV_KEY_SIZE) { + memcpy(prv_key, src, PRV_KEY_SIZE); + // now need to re-calculate the pub_key + ed25519_derive_pub(pub_key, prv_key); + } +} + void LocalIdentity::sign(uint8_t* sig, const uint8_t* message, int msg_len) const { ed25519_sign(sig, message, msg_len, pub_key, prv_key); } diff --git a/src/Identity.h b/src/Identity.h index 766e2985..e84c1934 100644 --- a/src/Identity.h +++ b/src/Identity.h @@ -76,6 +76,8 @@ public: bool readFrom(Stream& s); bool writeTo(Stream& s) const; void printTo(Stream& s) const; + size_t writeTo(uint8_t* dest, size_t max_len); + void readFrom(const uint8_t* src, size_t len); }; }