From a7f93de3ad62914d74bc172290934d60aa01dbe1 Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sat, 2 Jan 2021 18:20:51 +0800 Subject: [PATCH 1/7] add a software based cross platform AES-CTR implementation --- platformio.ini | 3 + src/portduino/CrossPlatformCryptoEngine.cpp | 82 +++++++++++++++++++++ src/portduino/PortduinoGlue.cpp | 3 - 3 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/portduino/CrossPlatformCryptoEngine.cpp diff --git a/platformio.ini b/platformio.ini index aa8e3eb8..977d2cd5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -314,6 +314,9 @@ src_filter = ${env.src_filter} - - - - build_flags = ${arduino_base.build_flags} -O0 framework = arduino board = linux_x86_64 +lib_deps = + ${arduino_base.lib_deps} + rweather/Crypto ; The GenieBlocks LORA prototype board [env:genieblocks_lora] diff --git a/src/portduino/CrossPlatformCryptoEngine.cpp b/src/portduino/CrossPlatformCryptoEngine.cpp new file mode 100644 index 00000000..b9e818c0 --- /dev/null +++ b/src/portduino/CrossPlatformCryptoEngine.cpp @@ -0,0 +1,82 @@ +#include "AES.h" +#include "CTR.h" +#include "CryptoEngine.h" +#include "configuration.h" + +/** A platform independent AES engine implemented using Tiny-AES + */ +class CrossPlatformCryptoEngine : public CryptoEngine +{ + + CTRCommon *ctr = NULL; + + /// How many bytes in our key + uint8_t keySize = 0; + + public: + CrossPlatformCryptoEngine() {} + + ~CrossPlatformCryptoEngine() {} + + /** + * Set the key used for encrypt, decrypt. + * + * As a special case: If all bytes are zero, we assume _no encryption_ and send all data in cleartext. + * + * @param numBytes must be 16 (AES128), 32 (AES256) or 0 (no crypt) + * @param bytes a _static_ buffer that will remain valid for the life of this crypto instance (i.e. this class will cache the + * provided pointer) + */ + virtual void setKey(size_t numBytes, uint8_t *bytes) + { + keySize = numBytes; + DEBUG_MSG("Installing AES%d key!\n", numBytes * 8); + if (ctr) { + delete ctr; + ctr = NULL; + } + if (numBytes != 0) { + if (numBytes == 16) + ctr = new CTR(); + else + ctr = new CTR(); + + ctr->setKey(bytes, numBytes); + } + } + + /** + * Encrypt a packet + * + * @param bytes is updated in place + */ + virtual void encrypt(uint32_t fromNode, uint64_t packetNum, size_t numBytes, uint8_t *bytes) + { + if (keySize != 0) { + uint8_t stream_block[16]; + static uint8_t scratch[MAX_BLOCKSIZE]; + size_t nc_off = 0; + + // DEBUG_MSG("ESP32 encrypt!\n"); + initNonce(fromNode, packetNum); + assert(numBytes <= MAX_BLOCKSIZE); + memcpy(scratch, bytes, numBytes); + memset(scratch + numBytes, 0, + sizeof(scratch) - numBytes); // Fill rest of buffer with zero (in case cypher looks at it) + + ctr->setIV(nonce, sizeof(nonce)); + ctr->setCounterSize(4); + ctr->encrypt(bytes, scratch, numBytes); + } + } + + virtual void decrypt(uint32_t fromNode, uint64_t packetNum, size_t numBytes, uint8_t *bytes) + { + // For CTR, the implementation is the same + encrypt(fromNode, packetNum, numBytes, bytes); + } + + private: +}; + +CryptoEngine *crypto = new CrossPlatformCryptoEngine(); diff --git a/src/portduino/PortduinoGlue.cpp b/src/portduino/PortduinoGlue.cpp index 6af00666..2d5f0a36 100644 --- a/src/portduino/PortduinoGlue.cpp +++ b/src/portduino/PortduinoGlue.cpp @@ -35,9 +35,6 @@ void cpuDeepSleep(uint64_t msecs) { notImplemented("cpuDeepSleep"); } -// FIXME - implement real crypto for linux -CryptoEngine *crypto = new CryptoEngine(); - void updateBatteryLevel(uint8_t level) NOT_IMPLEMENTED("updateBatteryLevel"); /** Dear pinetab hardware geeks! From ce4ccf3cc41ba0123ab8bbf8cb6e203c9b2bfeee Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sat, 2 Jan 2021 19:40:24 +0800 Subject: [PATCH 2/7] no need for lora CS control on linux, the spi controller handles it --- src/configuration.h | 2 +- src/portduino/PortduinoGlue.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/configuration.h b/src/configuration.h index cb88ed81..79d1009c 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -402,7 +402,7 @@ along with this program. If not, see . #define RF95_SCK 5 #define RF95_MISO 19 #define RF95_MOSI 27 -#define RF95_NSS 18 +#define RF95_NSS RADIOLIB_NC // the ch341f spi controller does CS for us #endif diff --git a/src/portduino/PortduinoGlue.cpp b/src/portduino/PortduinoGlue.cpp index 2d5f0a36..cffaf2e8 100644 --- a/src/portduino/PortduinoGlue.cpp +++ b/src/portduino/PortduinoGlue.cpp @@ -90,5 +90,5 @@ void portduinoSetup() { printf("Setting up Meshtastic on Porduino...\n"); gpioBind(new R595PolledIrqPin()); // gpioBind((new SimGPIOPin(LORA_RESET, "LORA_RESET"))); - gpioBind((new SimGPIOPin(RF95_NSS, "RF95_NSS"))->setSilent()); + // gpioBind((new SimGPIOPin(RF95_NSS, "RF95_NSS"))->setSilent()); } From edd1268f5fffaf60dd2cef179a5b8df936b595f0 Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 3 Jan 2021 10:11:20 +0800 Subject: [PATCH 3/7] portduino: begin adding wifi implementation --- src/{esp32 => mesh/wifi}/WiFiServerAPI.cpp | 2 +- src/{esp32 => mesh/wifi}/WiFiServerAPI.h | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/{esp32 => mesh/wifi}/WiFiServerAPI.cpp (96%) rename src/{esp32 => mesh/wifi}/WiFiServerAPI.h (100%) diff --git a/src/esp32/WiFiServerAPI.cpp b/src/mesh/wifi/WiFiServerAPI.cpp similarity index 96% rename from src/esp32/WiFiServerAPI.cpp rename to src/mesh/wifi/WiFiServerAPI.cpp index fac955cc..1f087cc1 100644 --- a/src/esp32/WiFiServerAPI.cpp +++ b/src/mesh/wifi/WiFiServerAPI.cpp @@ -5,7 +5,7 @@ WiFiServerAPI::WiFiServerAPI(WiFiClient &_client) : StreamAPI(&client), client(_client) { - DEBUG_MSG("Incoming connection from %s\n", client.remoteIP().toString().c_str()); + DEBUG_MSG("Incoming wifi connection\n"); } WiFiServerAPI::~WiFiServerAPI() diff --git a/src/esp32/WiFiServerAPI.h b/src/mesh/wifi/WiFiServerAPI.h similarity index 100% rename from src/esp32/WiFiServerAPI.h rename to src/mesh/wifi/WiFiServerAPI.h From 01848a9e5d3d13b8988df0d3f398237b8eba2478 Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 3 Jan 2021 20:11:03 +0800 Subject: [PATCH 4/7] moved wifi code --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 977d2cd5..34667d2c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -183,7 +183,7 @@ build_flags = -Isdk-nrfxlib/crypto/nrf_oberon/include -Lsdk-nrfxlib/crypto/nrf_oberon/lib/cortex-m4/hard-float/ -lliboberon_3.0.3 ;-DCFG_DEBUG=3 src_filter = - ${arduino_base.src_filter} - - - + ${arduino_base.src_filter} - - - - lib_ignore = BluetoothOTA monitor_port = /dev/ttyACM1 From 34faea610012fa2455680be8398d901f88f27158 Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 3 Jan 2021 20:11:26 +0800 Subject: [PATCH 5/7] fix #622 - we might not have a local position yet early in the boot --- src/plugins/PositionPlugin.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/plugins/PositionPlugin.cpp b/src/plugins/PositionPlugin.cpp index b0ce8e21..e0c77895 100644 --- a/src/plugins/PositionPlugin.cpp +++ b/src/plugins/PositionPlugin.cpp @@ -31,10 +31,16 @@ MeshPacket *PositionPlugin::allocReply() { NodeInfo *node = nodeDB.getNode(nodeDB.getNodeNum()); assert(node); - assert(node->has_position); + + // We might not have a position yet for our local node, in that case, at least try to send the time + if(!node->has_position) { + memset(&node->position, 0, sizeof(node->position)); + node->has_position = true; + } + + Position &position = node->position; // Update our local node info with our position (even if we don't decide to update anyone else) - auto position = node->position; position.time = getValidTime(RTCQualityGPS); // This nodedb timestamp might be stale, so update it if our clock is valid. return allocDataProtobuf(position); From 3ddae5faec27fb9e6b9c6ecd869c6e4b01e6bae2 Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 3 Jan 2021 20:12:31 +0800 Subject: [PATCH 6/7] fix build for esp32 --- src/meshwifi/meshwifi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meshwifi/meshwifi.cpp b/src/meshwifi/meshwifi.cpp index 54358077..5ae83f87 100644 --- a/src/meshwifi/meshwifi.cpp +++ b/src/meshwifi/meshwifi.cpp @@ -1,6 +1,6 @@ #include "meshwifi.h" #include "NodeDB.h" -#include "WiFiServerAPI.h" +#include "mesh/wifi/WiFiServerAPI.h" #include "configuration.h" #include "main.h" #include "meshwifi/meshhttp.h" From da8b1d41c7442612ce6fdd8721cd2cb96735869d Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 3 Jan 2021 20:57:59 +0800 Subject: [PATCH 7/7] 1.1.32 --- version.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.properties b/version.properties index 79a74c10..ac4a0363 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 1 minor = 1 -build = 31 +build = 32