diff --git a/platformio.ini b/platformio.ini index aa8e3eb8..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 @@ -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/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/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 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" 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); 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..cffaf2e8 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! @@ -93,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()); } 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