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