Browse Source

* LocalIdentity:: writeTo( array ) and readFrom (array )

Scott Powell 1 year ago
parent
commit
86f11d08aa

+ 2 - 0
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

+ 2 - 0
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

+ 1 - 0
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);

+ 7 - 0
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);
+}

+ 23 - 0
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);
 }

+ 2 - 0
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);
 };
 
 }