From a8594d02496b48d7b21561b30fa1a9b6ec5fef60 Mon Sep 17 00:00:00 2001 From: xyzroe Date: Sat, 30 Mar 2024 14:28:48 +0200 Subject: [PATCH] 20240330 Hardware: - MDNS changed to _xzg - MDNS add option "board" for HW indenfication - Default hostname changed to "XZG" Web UI: - Fix min-width for system settings tabs - Remove auto close side tab on mobile - Fix logiut button style - WG page to VPN - Add Hursanet options to VPN page - Add Hursenet card to root page - Wifi page to Network - Add Ethernet options to Network page - Made Ethernet and WiFi card to be hide if interface is disabled - Add sticky navbar on top of page with logo, page name - Add current DNS server on Ethernet and WiFi cards - Add status icons to navbar - Mobile: - rework side nav - open by any swip or tap on logo - close by any tap anywhere Build and develope: - Reworked Github Action to suppport multiline desctiption in release notes - Reworked commit.sh, add clean commit.md at finish Docs: Code: - Full rework configs srtucture - Change config storage from json files on LittleFS to NVS flash Preferences (support migrating) - Setup proccess reworked and faster now - Changed WG library - Add WG connection state - Add Ethernet and WiFi custom DNS, while no DHCP --- .github/workflows/workflow.yml | 79 +- .gitmodules | 4 + README.md | 8 +- bin/XZG_20240330.full.bin | Bin 0 -> 1103392 bytes bin/XZG_20240330.ota.bin | Bin 0 -> 1037856 bytes lib/CCTools/src/CCTools.cpp | 16 +- lib/README.md | 1 + lib/WireGuard | 1 + lib/WireGuard-ESP32/.gitignore | 1 - lib/WireGuard-ESP32/.piopm | 1 - lib/WireGuard-ESP32/LICENSE | 28 - lib/WireGuard-ESP32/README.md | 57 - .../examples/disconnect/disconnect.ino | 105 -- .../examples/uptime_post/uptime_post.ino | 85 -- .../examples/uptime_udp/uptime_udp.ino | 75 - lib/WireGuard-ESP32/library.properties | 10 - lib/WireGuard-ESP32/src/WireGuard-ESP32.h | 16 - lib/WireGuard-ESP32/src/WireGuard.cpp | 140 -- lib/WireGuard-ESP32/src/crypto.c | 23 - lib/WireGuard-ESP32/src/crypto.h | 102 -- lib/WireGuard-ESP32/src/crypto/refc/blake2s.c | 156 -- lib/WireGuard-ESP32/src/crypto/refc/blake2s.h | 39 - .../src/crypto/refc/chacha20.c | 202 --- .../src/crypto/refc/chacha20.h | 53 - .../src/crypto/refc/chacha20poly1305.c | 193 --- .../src/crypto/refc/chacha20poly1305.h | 50 - .../src/crypto/refc/poly1305-donna-32.h | 220 --- .../src/crypto/refc/poly1305-donna.c | 41 - .../src/crypto/refc/poly1305-donna.h | 16 - .../src/crypto/refc/x25519-license.txt | 21 - lib/WireGuard-ESP32/src/crypto/refc/x25519.c | 448 ------ lib/WireGuard-ESP32/src/crypto/refc/x25519.h | 129 -- lib/WireGuard-ESP32/src/wireguard-platform.c | 68 - lib/WireGuard-ESP32/src/wireguard-platform.h | 71 - lib/WireGuard-ESP32/src/wireguard.c | 1129 -------------- lib/WireGuard-ESP32/src/wireguard.h | 287 ---- lib/WireGuard-ESP32/src/wireguardif.c | 1034 ------------- lib/WireGuard-ESP32/src/wireguardif.h | 137 -- platformio.ini | 3 +- src/config.cpp | 1315 +++++++++++++++++ src/config.h | 302 +++- src/etc.cpp | 221 ++- src/etc.h | 17 +- src/hw.cpp | 29 + src/hw.h | 48 +- src/main.cpp | 1102 ++++---------- src/mqtt.cpp | 544 +++---- src/mqtt.h | 2 +- src/version.h | 12 +- src/web.cpp | 1044 +++++++------ src/web.h | 8 +- src/websrc/css/custom.css | 80 +- src/websrc/css/style.css | 2 +- src/websrc/html/PAGE_ABOUT.html | 141 +- src/websrc/html/PAGE_ETHERNET.html | 44 - src/websrc/html/PAGE_GENERAL.html | 194 +-- src/websrc/html/PAGE_LOADER.html | 134 +- src/websrc/html/PAGE_MQTT.html | 2 +- .../{PAGE_WIFI.html => PAGE_NETWORK.html} | 144 +- src/websrc/html/PAGE_ROOT.html | 91 +- src/websrc/html/PAGE_SERIAL.html | 80 - .../{PAGE_SYSTOOLS.html => PAGE_TOOLS.html} | 47 +- src/websrc/html/PAGE_VPN.html | 83 ++ src/websrc/html/PAGE_WG.html | 47 - src/websrc/html/PAGE_ZIGBEE.html | 83 ++ src/websrc/img/icons.svg | 6 +- src/websrc/js/functions.js | 560 ++++--- src/zb.cpp | 43 +- tools/build/build.py | 42 +- tools/build/version_update.py | 45 + tools/clean_file.sh | 36 + tools/commit.sh | 50 +- .../version_increment_post.py | 0 .../version_increment_pre.py | 0 tools/version | 2 +- 75 files changed, 4308 insertions(+), 7341 deletions(-) create mode 100644 .gitmodules create mode 100644 bin/XZG_20240330.full.bin create mode 100644 bin/XZG_20240330.ota.bin create mode 100644 lib/README.md create mode 160000 lib/WireGuard delete mode 100644 lib/WireGuard-ESP32/.gitignore delete mode 100644 lib/WireGuard-ESP32/.piopm delete mode 100644 lib/WireGuard-ESP32/LICENSE delete mode 100644 lib/WireGuard-ESP32/README.md delete mode 100644 lib/WireGuard-ESP32/examples/disconnect/disconnect.ino delete mode 100644 lib/WireGuard-ESP32/examples/uptime_post/uptime_post.ino delete mode 100644 lib/WireGuard-ESP32/examples/uptime_udp/uptime_udp.ino delete mode 100644 lib/WireGuard-ESP32/library.properties delete mode 100644 lib/WireGuard-ESP32/src/WireGuard-ESP32.h delete mode 100644 lib/WireGuard-ESP32/src/WireGuard.cpp delete mode 100644 lib/WireGuard-ESP32/src/crypto.c delete mode 100644 lib/WireGuard-ESP32/src/crypto.h delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/blake2s.c delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/blake2s.h delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/chacha20.c delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/chacha20.h delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/chacha20poly1305.c delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/chacha20poly1305.h delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna-32.h delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna.c delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna.h delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/x25519-license.txt delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/x25519.c delete mode 100644 lib/WireGuard-ESP32/src/crypto/refc/x25519.h delete mode 100644 lib/WireGuard-ESP32/src/wireguard-platform.c delete mode 100644 lib/WireGuard-ESP32/src/wireguard-platform.h delete mode 100644 lib/WireGuard-ESP32/src/wireguard.c delete mode 100644 lib/WireGuard-ESP32/src/wireguard.h delete mode 100644 lib/WireGuard-ESP32/src/wireguardif.c delete mode 100644 lib/WireGuard-ESP32/src/wireguardif.h create mode 100644 src/config.cpp create mode 100644 src/hw.cpp delete mode 100644 src/websrc/html/PAGE_ETHERNET.html rename src/websrc/html/{PAGE_WIFI.html => PAGE_NETWORK.html} (50%) delete mode 100644 src/websrc/html/PAGE_SERIAL.html rename src/websrc/html/{PAGE_SYSTOOLS.html => PAGE_TOOLS.html} (91%) create mode 100644 src/websrc/html/PAGE_VPN.html delete mode 100644 src/websrc/html/PAGE_WG.html create mode 100644 src/websrc/html/PAGE_ZIGBEE.html create mode 100644 tools/build/version_update.py create mode 100755 tools/clean_file.sh rename tools/{build => old_build}/version_increment_post.py (100%) rename tools/{build => old_build}/version_increment_pre.py (100%) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 9f8b164..b5c2d72 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -1,4 +1,4 @@ -name: Build, release, update +name: Build, release, push permissions: contents: write @@ -7,10 +7,10 @@ on: workflow_dispatch: push: tags: - - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 + - '*' # Push events to matching *, any jobs: - build_firmware: + build_release_push: runs-on: ubuntu-latest steps: - name: Clone repository @@ -20,58 +20,79 @@ jobs: uses: actions/setup-node@v3 with: node-version: 18 + - uses: actions/cache@v3 with: path: | ~/.cache/pip ~/.platformio/.cache key: ${{ runner.os }}-pio + - name: Install Python uses: actions/setup-python@v4 with: python-version: '3.9' + - name: Install PlatformIO Core run: pip install --upgrade platformio==6.1.11 - name: Build PlatformIO Project run: pio run + - name: Get Release Version id: get_version shell: bash run: | - value=`cat tools/version` + value=$(grep '#define VERSION' src/version.h | awk -F '"' '{print $2}') echo "version=$value" >> $GITHUB_OUTPUT - - name: Get current date - id: date - run: echo "date=$(date +'%d%m%y')" >> $GITHUB_OUTPUT + - name: Get last commit message id: get_commit_message run: | commitMessage=$(git log -1 --pretty=%B | tail -n +3) - echo "::set-output name=message::${commitMessage}" + echo "commitMessage<> $GITHUB_ENV + echo "$commitMessage" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Calculate SHA-256 hash of the firmware + id: sha256_hash + run: | + echo "sha256=$(sha256sum bin/XZG_${{ steps.get_version.outputs.version }}.full.bin | awk '{print $1}')" >> $GITHUB_OUTPUT + + - name: Get size of the firmware + id: firmware_size + run: | + echo "size=$(stat -c %s bin/XZG_${{ steps.get_version.outputs.version }}.full.bin)" >> $GITHUB_OUTPUT + + - name: Create manifest.json for ESP Web Tools + run: | + cat << EOF > manifest.json + { + "name": "XZG Firmware", + "version": "${{ steps.get_version.outputs.version }}", + "files": [ + { + "path": "XZG_${{ steps.get_version.outputs.version }}.full.bin", + "type": "app", + "lzma": false, + "address": "0x0", + "sha256": "${{ steps.sha256_hash.outputs.sha256 }}", + "size": ${{ steps.firmware_size.outputs.size }}, + "url": "https://github.com/${{ github.repository }}/releases/download/${{ steps.get_version.outputs.version }}/XZG_${{ steps.get_version.outputs.version }}.full.bin" + } + ], + "chipFamily": "ESP32" + } + EOF + echo "Manifest file created." + - name: Release uses: softprops/action-gh-release@v1 with: generate_release_notes: false - name: "v${{ steps.get_version.outputs.version }} (${{ steps.date.outputs.date }})" - body: ${{ steps.get_commit_message.outputs.message }} + name: "${{ steps.get_version.outputs.version }}" + body: ${{ env.commitMessage }} files: | - bin/XZG.bin - bin/XZG_v${{ steps.get_version.outputs.version }}.full.bin - - - name: Updare version in manifest.json - run: | - sed -r 's/v[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}/v${{ steps.get_version.outputs.version }}/g' manifest.json > new.manifest.json - - name: Move file - shell: bash - run: | - echo "old" - cat manifest.json - mv -f new.manifest.json manifest.json - echo "new" - cat manifest.json - - name: Commit & Push changes - uses: actions-js/push@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - message: 'Release v${{ steps.get_version.outputs.version }} (${{ steps.date.outputs.date }})' \ No newline at end of file + bin/XZG_${{ steps.get_version.outputs.version }}.ota.bin + bin/XZG_${{ steps.get_version.outputs.version }}.full.bin + manifest.json diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..60850d2 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "lib/WireGuard"] + path = lib/WireGuard + url = https://github.com/Tinkerforge/WireGuard-ESP32-Arduino + branch = main diff --git a/README.md b/README.md index 6c4d794..0695a9b 100644 --- a/README.md +++ b/README.md @@ -15,15 +15,15 @@ Firmware is opensource, so feel free to improve it
by making a commit to th ### Previous versions: -| [ZigStarGW-FW](https://github.com/xyzroe/ZigStarGW-FW/releases/latest) | [UZG-01](https://github.com/mercenaruss/uzg-firmware/releases/latest) | [SLZB-06](https://github.com/smlight-dev/slzb-06-firmware/releases/) | +| [ZigStarGW-FW](https://github.com/xyzroe/ZigStarGW-FW/releases/latest) | [XZG](https://github.com/mercenaruss/uzg-firmware/releases/latest) | [SLZB-06](https://github.com/smlight-dev/slzb-06-firmware/releases/) | | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [![ZigStarGW-FW's download](https://img.shields.io/github/downloads/xyzroe/ZigStarGW-FW/total.svg)](https://github.com/xyzroe/ZigStarGW-FW/releases/latest) | [![UZG-01 Firmware's download](https://img.shields.io/github/downloads/mercenaruss/uzg-firmware/total.svg)](https://github.com/mercenaruss/uzg-firmware/releases/latest) | [![UZG-01 Firmware's download](https://img.shields.io/github/downloads/smlight-dev/slzb-06-firmware/total.svg)](https://github.com/smlight-dev/slzb-06-firmware/releases/latest) | +| [![ZigStarGW-FW's download](https://img.shields.io/github/downloads/xyzroe/ZigStarGW-FW/total.svg)](https://github.com/xyzroe/ZigStarGW-FW/releases/latest) | [![XZG Firmware's download](https://img.shields.io/github/downloads/mercenaruss/uzg-firmware/total.svg)](https://github.com/mercenaruss/uzg-firmware/releases/latest) | [![XZG Firmware's download](https://img.shields.io/github/downloads/smlight-dev/slzb-06-firmware/total.svg)](https://github.com/smlight-dev/slzb-06-firmware/releases/latest) | ## KEY FIRMWARE FEATURES - Change Ethernet/USB adapter mode through firmware or by physical button short press (Red LED On = USB mode, RED LED Off = Ethernet mode); -- Adapter mode selector through web-interface: `Zigbee-to-Ethernet`, `Zigbee-to-USB` and `Zigbee-to-WiFI`; +- Adapter mode selector through web-interface: `Zigbee-to-Network` or `Zigbee-to-USB`; - Support mDNS autodiscovery in your network (go in the browser to `uzg-01.local`), in Zigbee2MQTT (set `port: mdns://uzg-01`), and in ZHA; - Secure login through username and password; - Zigbee2MQTT and ZHA config helper; @@ -75,7 +75,7 @@ You can contribute to XZG Firmware by People helping to keep the show on the road - **developers and contributors**: -- [@mercenaruss](https://github.com/mercenaruss/) for **Zig Star devices development**, for initial firmware release of UZG-01 version and giving me motivation and energy to implement new functions. +- [@mercenaruss](https://github.com/mercenaruss/) for **Zig Star devices development**, for initial firmware release of XZG version and giving me motivation and energy to implement new functions. - [@Tarik2142](https://github.com/Tarik2142) for refactoring, code optimizations done under [smlight-dev](https://github.com/smlight-dev/) diff --git a/bin/XZG_20240330.full.bin b/bin/XZG_20240330.full.bin new file mode 100644 index 0000000000000000000000000000000000000000..0ee3977132aeafc9c49b75986ca1ea527031b558 GIT binary patch literal 1103392 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

+BXwH+9N}I&S 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

Yr^ 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�ZsjqNA-PGg!_3ExqnZ0Hl+ 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 E8=r(!CjbBd literal 0 HcmV?d00001 diff --git a/lib/CCTools/src/CCTools.cpp b/lib/CCTools/src/CCTools.cpp index 4871bd4..07ff4c4 100644 --- a/lib/CCTools/src/CCTools.cpp +++ b/lib/CCTools/src/CCTools.cpp @@ -310,14 +310,14 @@ void CCTools::enterBSL() { digitalWrite(_CC_RST_PIN, LOW); digitalWrite(_CC_BSL_PIN, LOW); - DEBUG_PRINTLN(F("Zigbee RST pin ON")); - DEBUG_PRINTLN(F("Zigbee BSL pin ON")); + //DEBUG_PRINTLN(F("Zigbee RST pin ON")); + //DEBUG_PRINTLN(F("Zigbee BSL pin ON")); delay(250); digitalWrite(_CC_RST_PIN, HIGH); - DEBUG_PRINTLN(F("Zigbee RST pin OFF")); + //DEBUG_PRINTLN(F("Zigbee RST pin OFF")); delay(1000); digitalWrite(_CC_BSL_PIN, HIGH); - DEBUG_PRINTLN(F("Zigbee BSL pin OFF")); + //DEBUG_PRINTLN(F("Zigbee BSL pin OFF")); delay(1000); } // Other modes BSL_MODE can be added later @@ -326,20 +326,20 @@ void CCTools::enterBSL() void CCTools::restart() { digitalWrite(_CC_RST_PIN, LOW); - DEBUG_PRINTLN(F("Zigbee RST pin ON")); + //DEBUG_PRINTLN(F("Zigbee RST pin ON")); delay(250); digitalWrite(_CC_RST_PIN, HIGH); - DEBUG_PRINTLN(F("Zigbee RST pin OFF")); + //DEBUG_PRINTLN(F("Zigbee RST pin OFF")); delay(1000); } void CCTools::routerRejoin() { digitalWrite(_CC_BSL_PIN, LOW); - DEBUG_PRINTLN(F("ZB BSL pin ON")); + //DEBUG_PRINTLN(F("ZB BSL pin ON")); delay(250); digitalWrite(_CC_BSL_PIN, HIGH); - DEBUG_PRINTLN(F("ZB BSL pin OFF")); + //DEBUG_PRINTLN(F("ZB BSL pin OFF")); delay(500); } String CCTools::detectChipInfo() diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 0000000..9fe6205 --- /dev/null +++ b/lib/README.md @@ -0,0 +1 @@ +git submodule update --recursive --remote \ No newline at end of file diff --git a/lib/WireGuard b/lib/WireGuard new file mode 160000 index 0000000..58de5da --- /dev/null +++ b/lib/WireGuard @@ -0,0 +1 @@ +Subproject commit 58de5da725bf11720439306496d8962dcb26af61 diff --git a/lib/WireGuard-ESP32/.gitignore b/lib/WireGuard-ESP32/.gitignore deleted file mode 100644 index c07a74d..0000000 --- a/lib/WireGuard-ESP32/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build.sh \ No newline at end of file diff --git a/lib/WireGuard-ESP32/.piopm b/lib/WireGuard-ESP32/.piopm deleted file mode 100644 index 648150c..0000000 --- a/lib/WireGuard-ESP32/.piopm +++ /dev/null @@ -1 +0,0 @@ -{"type": "library", "name": "WireGuard-ESP32", "version": "0.1.5", "spec": {"owner": "ciniml", "id": 12571, "name": "WireGuard-ESP32", "requirements": null, "uri": null}} \ No newline at end of file diff --git a/lib/WireGuard-ESP32/LICENSE b/lib/WireGuard-ESP32/LICENSE deleted file mode 100644 index 3856ceb..0000000 --- a/lib/WireGuard-ESP32/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2021 Kenta Ida (fuga@fugafuga.org) -Copyright (c) 2021 Daniel Hope (www.floorsense.nz) -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. -* Neither the name of "Floorsense Ltd", "Agile Workspace Ltd" nor the names of - its contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Author: Daniel Hope - diff --git a/lib/WireGuard-ESP32/README.md b/lib/WireGuard-ESP32/README.md deleted file mode 100644 index 25424fa..0000000 --- a/lib/WireGuard-ESP32/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# WireGuard Implementation for ESP32 Arduino - -This is an implementation of the [WireGuard®](https://www.wireguard.com/) for ESP32 Arduino. - -Almost all of this code is based on the [WireGuard Implementation for lwIP](https://github.com/smartalock/wireguard-lwip), but some potion of the code is adjusted to build with ESP32 Arduino. - -## How to use - -1. Include `WireGuard-ESP32.h` at the early part of the sketch. - -```c++ -#include -``` - -2. Define the instance of the `WireGuard` class at module level. - -```c++ -static WireGuard wg; -``` - -3. Connect to WiFi AP by using `WiFi` class. - -```c++ -WiFi.begin(ssid, password); -while( !WiFi.isConnected() ) { - delay(1000); -} -``` - -4. Sync the system time via NTP. - -```c++ -configTime(9 * 60 * 60, 0, "ntp.jst.mfeed.ad.jp", "ntp.nict.jp", "time.google.com"); -``` - -5. Start the WireGuard interface. - -```c++ -wg.begin( - local_ip, // IP address of the local interface - private_key, // Private key of the local interface - endpoint_address, // Address of the endpoint peer. - public_key, // Public key of the endpoint peer. - endpoint_port); // Port pf the endpoint peer. -``` - -You can see an example sketch `uptime_post.ino`, which connects SORACOM Arc WireGuard endpoint and post uptime to SORACOM Harvest via WireGuard connection. - -## License - -The original WireGuard implementation for lwIP is licensed under BSD 3 clause license so the code in this repository also licensed under the same license. - -Original license is below: - -The code is copyrighted under BSD 3 clause Copyright (c) 2021 Daniel Hope (www.floorsense.nz) - -See LICENSE for details diff --git a/lib/WireGuard-ESP32/examples/disconnect/disconnect.ino b/lib/WireGuard-ESP32/examples/disconnect/disconnect.ino deleted file mode 100644 index b94ea06..0000000 --- a/lib/WireGuard-ESP32/examples/disconnect/disconnect.ino +++ /dev/null @@ -1,105 +0,0 @@ -#include -#include -#include - -// WiFi configuration --- UPDATE this configuration for your WiFi AP -char ssid[] = "ssid"; -char password[] = "password"; - -// WireGuard configuration --- UPDATE this configuration from JSON -char private_key[] = "(Private Key) "; // [Interface] PrivateKey -IPAddress local_ip(1,2,3,4); // [Interface] Address -char public_key[] = "(Public Key)"; // [Peer] PublicKey -char endpoint_address[] = "link.arc.soracom.io"; // [Peer] Endpoint -int endpoint_port = 11010; // [Peer] Endpoint - -const char host_inside_vpn[] = "10.0.0.1"; -const char host_outside_vpn[] = "192.168.2.1"; - -static constexpr const uint32_t UPDATE_INTERVAL_MS = 5000; - -static WireGuard wg; - -void setup() -{ - esp_log_level_set("*", ESP_LOG_DEBUG); - - Serial.begin(115200); - Serial.println("Connecting to the AP..."); - WiFi.begin(ssid, password); - while( !WiFi.isConnected() ) { - delay(1000); - } - - Serial.println("Adjusting system time..."); - configTime(9 * 60 * 60, 0, "ntp.jst.mfeed.ad.jp", "ntp.nict.jp", "time.google.com"); - - Serial.println("WiFi Connected."); -} - -void loop() -{ - static uint64_t send_count = 0; - static uint64_t loop_count = 0; - if( loop_count % 5 == 0) { - if( !wg.is_initialized() ) { - Serial.println("Initializing WG interface..."); - if( !wg.begin( - local_ip, - private_key, - endpoint_address, - public_key, - endpoint_port) ) { - Serial.println("Failed to initialize WG interface."); - } - } - else { - Serial.println("Shutting down WG interface..."); - wg.end(); - } - } - loop_count++; - - WiFiUDP client; - const char* host = wg.is_initialized() ? host_inside_vpn : host_outside_vpn; - if( !client.beginPacket(host, 23080) ) { - Serial.println("Failed to begin packet..."); - delay(5000); - return; - } - - uint64_t uptime_msec = millis(); - uint8_t buffer[16]; - buffer[ 0] = (uptime_msec >> 0) & 0xff; - buffer[ 1] = (uptime_msec >> 8) & 0xff; - buffer[ 2] = (uptime_msec >> 16) & 0xff; - buffer[ 3] = (uptime_msec >> 24) & 0xff; - buffer[ 4] = (uptime_msec >> 32) & 0xff; - buffer[ 5] = (uptime_msec >> 40) & 0xff; - buffer[ 6] = (uptime_msec >> 48) & 0xff; - buffer[ 7] = (uptime_msec >> 56) & 0xff; - buffer[ 8] = (send_count >> 0) & 0xff; - buffer[ 9] = (send_count >> 8) & 0xff; - buffer[10] = (send_count >> 16) & 0xff; - buffer[11] = (send_count >> 24) & 0xff; - buffer[12] = (send_count >> 32) & 0xff; - buffer[13] = (send_count >> 40) & 0xff; - buffer[14] = (send_count >> 48) & 0xff; - buffer[15] = (send_count >> 56) & 0xff; - - Serial.printf("Sending uptime %lu [ms], count=%d\r\n", uptime_msec, send_count); - client.write(buffer, sizeof(buffer)); - client.endPacket(); - - send_count++; - - IPAddress result; - if( WiFi.hostByName("www.google.com", result) ) { - Serial.printf("hostByName: %s\r\n", result.toString().c_str()); - } - else { - Serial.printf("hostByName failed\r\n"); - } - - delay(UPDATE_INTERVAL_MS); -} diff --git a/lib/WireGuard-ESP32/examples/uptime_post/uptime_post.ino b/lib/WireGuard-ESP32/examples/uptime_post/uptime_post.ino deleted file mode 100644 index f16c41d..0000000 --- a/lib/WireGuard-ESP32/examples/uptime_post/uptime_post.ino +++ /dev/null @@ -1,85 +0,0 @@ -#include -#include -#include - -// WiFi configuration --- UPDATE this configuration for your WiFi AP -char ssid[] = "ssid"; -char password[] = "password"; - -// WireGuard configuration --- UPDATE this configuration from JSON -char private_key[] = "(Private Key) "; // [Interface] PrivateKey -IPAddress local_ip(1,2,3,4); // [Interface] Address -char public_key[] = "(Public Key)"; // [Peer] PublicKey -char endpoint_address[] = "link.arc.soracom.io"; // [Peer] Endpoint -int endpoint_port = 11010; // [Peer] Endpoint - -static constexpr const uint32_t UPDATE_INTERVAL_MS = 5000; - -static WireGuard wg; -static HTTPClient httpClient; - -void setup() -{ - Serial.begin(115200); - Serial.println("Connecting to the AP..."); - WiFi.begin(ssid, password); - while( !WiFi.isConnected() ) { - delay(1000); - } - Serial.println("Adjusting system time..."); - configTime(9 * 60 * 60, 0, "ntp.jst.mfeed.ad.jp", "ntp.nict.jp", "time.google.com"); - - Serial.println("Connected. Initializing WireGuard..."); - wg.begin( - local_ip, - private_key, - endpoint_address, - public_key, - endpoint_port); -} - -void loop() -{ - WiFiClient client; - - if( !client.connect("uni.soracom.io", 80) ) { - Serial.println("Failed to connect..."); - delay(5000); - return; - } - - uint64_t uptime_msec = millis(); - Serial.printf("Sending uptime %lu [ms]\r\n", uptime_msec); - String json; - json += "{\"uptime_msec\":"; - json.concat(static_cast(uptime_msec)); - json += "}"; - Serial.printf("payload: %s\r\n", json.c_str()); - - client.write("POST / HTTP/1.1\r\n"); - client.write("Host: harvest.soracom.io\r\n"); - client.write("Connection: Keep-Alive\r\n"); - client.write("Keep-Alive: timeout=5, max=2\r\n"); - client.write("Content-Type: application/json\r\n"); - client.write("Content-Length: "); - client.write(String(json.length(), 10).c_str()); - client.write("\r\n\r\n"); - client.write(json.c_str()); - - while(client.connected()) { - auto line = client.readStringUntil('\n'); - Serial.write(line.c_str()); - Serial.write("\n"); - if( line == "\r" ) break; - } - if(client.connected()) { - uint8_t buffer[256]; - size_t bytesToRead = 0; - while((bytesToRead = client.available()) > 0) { - bytesToRead = bytesToRead > sizeof(buffer) ? sizeof(buffer) : bytesToRead; - auto bytesRead = client.readBytes(buffer, bytesToRead); - Serial.write(buffer, bytesRead); - } - } - delay(UPDATE_INTERVAL_MS); -} diff --git a/lib/WireGuard-ESP32/examples/uptime_udp/uptime_udp.ino b/lib/WireGuard-ESP32/examples/uptime_udp/uptime_udp.ino deleted file mode 100644 index a1acd28..0000000 --- a/lib/WireGuard-ESP32/examples/uptime_udp/uptime_udp.ino +++ /dev/null @@ -1,75 +0,0 @@ -#include -#include -#include - -// WiFi configuration --- UPDATE this configuration for your WiFi AP -char ssid[] = "ssid"; -char password[] = "password"; - -// WireGuard configuration --- UPDATE this configuration from JSON -char private_key[] = "(Private Key) "; // [Interface] PrivateKey -IPAddress local_ip(1,2,3,4); // [Interface] Address -char public_key[] = "(Public Key)"; // [Peer] PublicKey -char endpoint_address[] = "link.arc.soracom.io"; // [Peer] Endpoint -int endpoint_port = 11010; // [Peer] Endpoint - -static constexpr const uint32_t UPDATE_INTERVAL_MS = 5000; - -static WireGuard wg; - -void setup() -{ - Serial.begin(115200); - Serial.println("Connecting to the AP..."); - WiFi.begin(ssid, password); - while( !WiFi.isConnected() ) { - delay(1000); - } - Serial.println("Adjusting system time..."); - configTime(9 * 60 * 60, 0, "ntp.jst.mfeed.ad.jp", "ntp.nict.jp", "time.google.com"); - - Serial.println("Connected. Initializing WireGuard..."); - wg.begin( - local_ip, - private_key, - endpoint_address, - public_key, - endpoint_port); -} - -void loop() -{ - static uint64_t send_count = 0; - WiFiUDP client; - if( !client.beginPacket("uni.soracom.io", 23080) ) { - Serial.println("Failed to begin packet..."); - delay(5000); - return; - } - - uint64_t uptime_msec = millis(); - uint8_t buffer[16]; - buffer[ 0] = (uptime_msec >> 0) & 0xff; - buffer[ 1] = (uptime_msec >> 8) & 0xff; - buffer[ 2] = (uptime_msec >> 16) & 0xff; - buffer[ 3] = (uptime_msec >> 24) & 0xff; - buffer[ 4] = (uptime_msec >> 32) & 0xff; - buffer[ 5] = (uptime_msec >> 40) & 0xff; - buffer[ 6] = (uptime_msec >> 48) & 0xff; - buffer[ 7] = (uptime_msec >> 56) & 0xff; - buffer[ 8] = (send_count >> 0) & 0xff; - buffer[ 9] = (send_count >> 8) & 0xff; - buffer[10] = (send_count >> 16) & 0xff; - buffer[11] = (send_count >> 24) & 0xff; - buffer[12] = (send_count >> 32) & 0xff; - buffer[13] = (send_count >> 40) & 0xff; - buffer[14] = (send_count >> 48) & 0xff; - buffer[15] = (send_count >> 56) & 0xff; - - Serial.printf("Sending uptime %lu [ms], count=%d\r\n", uptime_msec, send_count); - client.write(buffer, sizeof(buffer)); - client.endPacket(); - - send_count++; - delay(UPDATE_INTERVAL_MS); -} diff --git a/lib/WireGuard-ESP32/library.properties b/lib/WireGuard-ESP32/library.properties deleted file mode 100644 index d51576d..0000000 --- a/lib/WireGuard-ESP32/library.properties +++ /dev/null @@ -1,10 +0,0 @@ -name=WireGuard-ESP32 -version=0.1.5 -author=Kenta Ida -maintainer=Kenta Ida -sentence=WireGuard implementation for Arduino ESP32 -paragraph= -category=Communication -url=https://github.com/ciniml/WireGuard-ESP32-Arduino -includes=WireGuard-ESP32.h -architectures=esp32,Inkplate diff --git a/lib/WireGuard-ESP32/src/WireGuard-ESP32.h b/lib/WireGuard-ESP32/src/WireGuard-ESP32.h deleted file mode 100644 index 29820a4..0000000 --- a/lib/WireGuard-ESP32/src/WireGuard-ESP32.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * WireGuard implementation for ESP32 Arduino by Kenta Ida (fuga@fugafuga.org) - * SPDX-License-Identifier: BSD-3-Clause - */ -#pragma once -#include - -class WireGuard -{ -private: - bool _is_initialized = false; -public: - bool begin(const IPAddress& localIP, const char* privateKey, const char* remotePeerAddress, const char* remotePeerPublicKey, uint16_t remotePeerPort); - void end(); - bool is_initialized() const { return this->_is_initialized; } -}; diff --git a/lib/WireGuard-ESP32/src/WireGuard.cpp b/lib/WireGuard-ESP32/src/WireGuard.cpp deleted file mode 100644 index 15d5c4e..0000000 --- a/lib/WireGuard-ESP32/src/WireGuard.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - * WireGuard implementation for ESP32 Arduino by Kenta Ida (fuga@fugafuga.org) - * SPDX-License-Identifier: BSD-3-Clause - */ -#include "WireGuard-ESP32.h" - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/event_groups.h" -#include "esp_system.h" - -#include "lwip/err.h" -#include "lwip/sys.h" -#include "lwip/ip.h" -#include "lwip/netdb.h" - -#include "esp32-hal-log.h" - -extern "C" { -#include "wireguardif.h" -#include "wireguard-platform.h" -} - -// Wireguard instance -static struct netif wg_netif_struct = {0}; -static struct netif *wg_netif = NULL; -static struct netif *previous_default_netif = NULL; -static uint8_t wireguard_peer_index = WIREGUARDIF_INVALID_INDEX; - -#define TAG "[WireGuard] " - -bool WireGuard::begin(const IPAddress& localIP, const char* privateKey, const char* remotePeerAddress, const char* remotePeerPublicKey, uint16_t remotePeerPort) { - struct wireguardif_init_data wg; - struct wireguardif_peer peer; - ip_addr_t ipaddr = IPADDR4_INIT(static_cast(localIP)); - ip_addr_t netmask = IPADDR4_INIT_BYTES(255, 255, 255, 255); - ip_addr_t gateway = IPADDR4_INIT_BYTES(0, 0, 0, 0); - - assert(privateKey != NULL); - assert(remotePeerAddress != NULL); - assert(remotePeerPublicKey != NULL); - assert(remotePeerPort != 0); - - // Setup the WireGuard device structure - wg.private_key = privateKey; - wg.listen_port = remotePeerPort; - - wg.bind_netif = NULL; - - // Initialise the first WireGuard peer structure - wireguardif_peer_init(&peer); - // If we know the endpoint's address can add here - bool success_get_endpoint_ip = false; - for(int retry = 0; retry < 5; retry++) { - ip_addr_t endpoint_ip = IPADDR4_INIT_BYTES(0, 0, 0, 0); - struct addrinfo *res = NULL; - struct addrinfo hint; - memset(&hint, 0, sizeof(hint)); - memset(&endpoint_ip, 0, sizeof(endpoint_ip)); - if( lwip_getaddrinfo(remotePeerAddress, NULL, &hint, &res) != 0 ) { - vTaskDelay(pdMS_TO_TICKS(2000)); - continue; - } - success_get_endpoint_ip = true; - struct in_addr addr4 = ((struct sockaddr_in *) (res->ai_addr))->sin_addr; - inet_addr_to_ip4addr(ip_2_ip4(&endpoint_ip), &addr4); - lwip_freeaddrinfo(res); - - peer.endpoint_ip = endpoint_ip; - log_i(TAG "%s is %3d.%3d.%3d.%3d" - , remotePeerAddress - , (endpoint_ip.u_addr.ip4.addr >> 0) & 0xff - , (endpoint_ip.u_addr.ip4.addr >> 8) & 0xff - , (endpoint_ip.u_addr.ip4.addr >> 16) & 0xff - , (endpoint_ip.u_addr.ip4.addr >> 24) & 0xff - ); - break; - } - if( !success_get_endpoint_ip ) { - log_e(TAG "failed to get endpoint ip."); - return false; - } - // Register the new WireGuard network interface with lwIP - wg_netif = netif_add(&wg_netif_struct, ip_2_ip4(&ipaddr), ip_2_ip4(&netmask), ip_2_ip4(&gateway), &wg, &wireguardif_init, &ip_input); - if( wg_netif == nullptr ) { - log_e(TAG "failed to initialize WG netif."); - return false; - } - // Mark the interface as administratively up, link up flag is set automatically when peer connects - netif_set_up(wg_netif); - - peer.public_key = remotePeerPublicKey; - peer.preshared_key = NULL; - // Allow all IPs through tunnel - { - ip_addr_t allowed_ip = IPADDR4_INIT_BYTES(0, 0, 0, 0); - peer.allowed_ip = allowed_ip; - ip_addr_t allowed_mask = IPADDR4_INIT_BYTES(0, 0, 0, 0); - peer.allowed_mask = allowed_mask; - } - - peer.endport_port = remotePeerPort; - - // Initialize the platform - wireguard_platform_init(); - // Register the new WireGuard peer with the netwok interface - wireguardif_add_peer(wg_netif, &peer, &wireguard_peer_index); - if ((wireguard_peer_index != WIREGUARDIF_INVALID_INDEX) && !ip_addr_isany(&peer.endpoint_ip)) { - // Start outbound connection to peer - log_i(TAG "connecting wireguard..."); - wireguardif_connect(wg_netif, wireguard_peer_index); - // Save the current default interface for restoring when shutting down the WG interface. - previous_default_netif = netif_default; - // Set default interface to WG device. - netif_set_default(wg_netif); - } - - this->_is_initialized = true; - return true; -} - -void WireGuard::end() { - if( !this->_is_initialized ) return; - - // Restore the default interface. - netif_set_default(previous_default_netif); - previous_default_netif = nullptr; - // Disconnect the WG interface. - wireguardif_disconnect(wg_netif, wireguard_peer_index); - // Remove peer from the WG interface - wireguardif_remove_peer(wg_netif, wireguard_peer_index); - wireguard_peer_index = WIREGUARDIF_INVALID_INDEX; - // Shutdown the wireguard interface. - wireguardif_shutdown(wg_netif); - // Remove the WG interface; - netif_remove(wg_netif); - wg_netif = nullptr; - - this->_is_initialized = false; -} \ No newline at end of file diff --git a/lib/WireGuard-ESP32/src/crypto.c b/lib/WireGuard-ESP32/src/crypto.c deleted file mode 100644 index 3597b86..0000000 --- a/lib/WireGuard-ESP32/src/crypto.c +++ /dev/null @@ -1,23 +0,0 @@ -#include "crypto.h" - -#include -#include -#include - -void crypto_zero(void *dest, size_t len) { - volatile uint8_t *p = (uint8_t *)dest; - while (len--) { - *p++ = 0; - } -} - -bool crypto_equal(const void *a, const void *b, size_t size) { - uint8_t neq = 0; - while (size > 0) { - neq |= *(uint8_t *)a ^ *(uint8_t *)b; - a += 1; - b += 1; - size -= 1; - } - return (neq) ? false : true; -} diff --git a/lib/WireGuard-ESP32/src/crypto.h b/lib/WireGuard-ESP32/src/crypto.h deleted file mode 100644 index c5d640d..0000000 --- a/lib/WireGuard-ESP32/src/crypto.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef _CRYPTO_H_ -#define _CRYPTO_H_ - -#include -#include -#include - -// BLAKE2S IMPLEMENTATION -#include "crypto/refc/blake2s.h" -#define wireguard_blake2s_ctx blake2s_ctx -#define wireguard_blake2s_init(ctx,outlen,key,keylen) blake2s_init(ctx,outlen,key,keylen) -#define wireguard_blake2s_update(ctx,in,inlen) blake2s_update(ctx,in,inlen) -#define wireguard_blake2s_final(ctx,out) blake2s_final(ctx,out) -#define wireguard_blake2s(out,outlen,key,keylen,in,inlen) blake2s(out,outlen,key,keylen,in,inlen) - -// X25519 IMPLEMENTATION -#include "crypto/refc/x25519.h" -#define wireguard_x25519(a,b,c) x25519(a,b,c,1) - -// CHACHA20POLY1305 IMPLEMENTATION -#include "crypto/refc/chacha20poly1305.h" -#define wireguard_aead_encrypt(dst,src,srclen,ad,adlen,nonce,key) chacha20poly1305_encrypt(dst,src,srclen,ad,adlen,nonce,key) -#define wireguard_aead_decrypt(dst,src,srclen,ad,adlen,nonce,key) chacha20poly1305_decrypt(dst,src,srclen,ad,adlen,nonce,key) -#define wireguard_xaead_encrypt(dst,src,srclen,ad,adlen,nonce,key) xchacha20poly1305_encrypt(dst,src,srclen,ad,adlen,nonce,key) -#define wireguard_xaead_decrypt(dst,src,srclen,ad,adlen,nonce,key) xchacha20poly1305_decrypt(dst,src,srclen,ad,adlen,nonce,key) - - -// Endian / unaligned helper macros -#define U8C(v) (v##U) -#define U32C(v) (v##U) - -#define U8V(v) ((uint8_t)(v) & U8C(0xFF)) -#define U32V(v) ((uint32_t)(v) & U32C(0xFFFFFFFF)) - -#define U8TO32_LITTLE(p) \ - (((uint32_t)((p)[0]) ) | \ - ((uint32_t)((p)[1]) << 8) | \ - ((uint32_t)((p)[2]) << 16) | \ - ((uint32_t)((p)[3]) << 24)) - -#define U8TO64_LITTLE(p) \ - (((uint64_t)((p)[0]) ) | \ - ((uint64_t)((p)[1]) << 8) | \ - ((uint64_t)((p)[2]) << 16) | \ - ((uint64_t)((p)[3]) << 24) | \ - ((uint64_t)((p)[4]) << 32) | \ - ((uint64_t)((p)[5]) << 40) | \ - ((uint64_t)((p)[6]) << 48) | \ - ((uint64_t)((p)[7]) << 56)) - -#define U16TO8_BIG(p, v) \ - do { \ - (p)[1] = U8V((v) ); \ - (p)[0] = U8V((v) >> 8); \ - } while (0) - -#define U32TO8_LITTLE(p, v) \ - do { \ - (p)[0] = U8V((v) ); \ - (p)[1] = U8V((v) >> 8); \ - (p)[2] = U8V((v) >> 16); \ - (p)[3] = U8V((v) >> 24); \ - } while (0) - -#define U32TO8_BIG(p, v) \ - do { \ - (p)[3] = U8V((v) ); \ - (p)[2] = U8V((v) >> 8); \ - (p)[1] = U8V((v) >> 16); \ - (p)[0] = U8V((v) >> 24); \ - } while (0) - -#define U64TO8_LITTLE(p, v) \ - do { \ - (p)[0] = U8V((v) ); \ - (p)[1] = U8V((v) >> 8); \ - (p)[2] = U8V((v) >> 16); \ - (p)[3] = U8V((v) >> 24); \ - (p)[4] = U8V((v) >> 32); \ - (p)[5] = U8V((v) >> 40); \ - (p)[6] = U8V((v) >> 48); \ - (p)[7] = U8V((v) >> 56); \ -} while (0) - -#define U64TO8_BIG(p, v) \ - do { \ - (p)[7] = U8V((v) ); \ - (p)[6] = U8V((v) >> 8); \ - (p)[5] = U8V((v) >> 16); \ - (p)[4] = U8V((v) >> 24); \ - (p)[3] = U8V((v) >> 32); \ - (p)[2] = U8V((v) >> 40); \ - (p)[1] = U8V((v) >> 48); \ - (p)[0] = U8V((v) >> 56); \ -} while (0) - - -void crypto_zero(void *dest, size_t len); -bool crypto_equal(const void *a, const void *b, size_t size); - -#endif /* _CRYPTO_H_ */ - diff --git a/lib/WireGuard-ESP32/src/crypto/refc/blake2s.c b/lib/WireGuard-ESP32/src/crypto/refc/blake2s.c deleted file mode 100644 index ae5e14c..0000000 --- a/lib/WireGuard-ESP32/src/crypto/refc/blake2s.c +++ /dev/null @@ -1,156 +0,0 @@ -// Taken from RFC7693 - https://tools.ietf.org/html/rfc7693 - -#include "blake2s.h" -#include "../../crypto.h" - -// Cyclic right rotation. - -#ifndef ROTR32 -#define ROTR32(x, y) (((x) >> (y)) ^ ((x) << (32 - (y)))) -#endif - -// Mixing function G. -#define B2S_G(a, b, c, d, x, y) { \ - v[a] = v[a] + v[b] + x; \ - v[d] = ROTR32(v[d] ^ v[a], 16); \ - v[c] = v[c] + v[d]; \ - v[b] = ROTR32(v[b] ^ v[c], 12); \ - v[a] = v[a] + v[b] + y; \ - v[d] = ROTR32(v[d] ^ v[a], 8); \ - v[c] = v[c] + v[d]; \ - v[b] = ROTR32(v[b] ^ v[c], 7); } - -// Initialization Vector. -static const uint32_t blake2s_iv[8] = -{ - 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, - 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 -}; - -// Compression function. "last" flag indicates last block. -static void blake2s_compress(blake2s_ctx *ctx, int last) -{ - const uint8_t sigma[10][16] = { - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, - { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, - { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, - { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, - { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, - { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, - { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, - { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, - { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, - { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 } - }; - int i; - uint32_t v[16], m[16]; - - for (i = 0; i < 8; i++) { // init work variables - v[i] = ctx->h[i]; - v[i + 8] = blake2s_iv[i]; - } - - v[12] ^= ctx->t[0]; // low 32 bits of offset - v[13] ^= ctx->t[1]; // high 32 bits - if (last) // last block flag set ? - v[14] = ~v[14]; - for (i = 0; i < 16; i++) // get little-endian words - m[i] = U8TO32_LITTLE(&ctx->b[4 * i]); - - for (i = 0; i < 10; i++) { // ten rounds - B2S_G( 0, 4, 8, 12, m[sigma[i][ 0]], m[sigma[i][ 1]]); - B2S_G( 1, 5, 9, 13, m[sigma[i][ 2]], m[sigma[i][ 3]]); - B2S_G( 2, 6, 10, 14, m[sigma[i][ 4]], m[sigma[i][ 5]]); - B2S_G( 3, 7, 11, 15, m[sigma[i][ 6]], m[sigma[i][ 7]]); - B2S_G( 0, 5, 10, 15, m[sigma[i][ 8]], m[sigma[i][ 9]]); - B2S_G( 1, 6, 11, 12, m[sigma[i][10]], m[sigma[i][11]]); - B2S_G( 2, 7, 8, 13, m[sigma[i][12]], m[sigma[i][13]]); - B2S_G( 3, 4, 9, 14, m[sigma[i][14]], m[sigma[i][15]]); - } - - for( i = 0; i < 8; ++i ) - ctx->h[i] ^= v[i] ^ v[i + 8]; -} - -// Initialize the hashing context "ctx" with optional key "key". -// 1 <= outlen <= 32 gives the digest size in bytes. -// Secret key (also <= 32 bytes) is optional (keylen = 0). -int blake2s_init(blake2s_ctx *ctx, size_t outlen, - const void *key, size_t keylen) // (keylen=0: no key) -{ - size_t i; - - if (outlen == 0 || outlen > 32 || keylen > 32) - return -1; // illegal parameters - - for (i = 0; i < 8; i++) // state, "param block" - ctx->h[i] = blake2s_iv[i]; - ctx->h[0] ^= 0x01010000 ^ (keylen << 8) ^ outlen; - - ctx->t[0] = 0; // input count low word - ctx->t[1] = 0; // input count high word - ctx->c = 0; // pointer within buffer - ctx->outlen = outlen; - - for (i = keylen; i < 64; i++) // zero input block - ctx->b[i] = 0; - if (keylen > 0) { - blake2s_update(ctx, key, keylen); - ctx->c = 64; // at the end - } - - return 0; -} - -// Add "inlen" bytes from "in" into the hash. -void blake2s_update(blake2s_ctx *ctx, - const void *in, size_t inlen) // data bytes -{ - size_t i; - - for (i = 0; i < inlen; i++) { - if (ctx->c == 64) { // buffer full ? - ctx->t[0] += ctx->c; // add counters - if (ctx->t[0] < ctx->c) // carry overflow ? - ctx->t[1]++; // high word - blake2s_compress(ctx, 0); // compress (not last) - ctx->c = 0; // counter to zero - } - ctx->b[ctx->c++] = ((const uint8_t *) in)[i]; - } -} - -// Generate the message digest (size given in init). -// Result placed in "out". -void blake2s_final(blake2s_ctx *ctx, void *out) -{ - size_t i; - - ctx->t[0] += ctx->c; // mark last block offset - if (ctx->t[0] < ctx->c) // carry overflow - ctx->t[1]++; // high word - - while (ctx->c < 64) // fill up with zeros - ctx->b[ctx->c++] = 0; - blake2s_compress(ctx, 1); // final block flag = 1 - - // little endian convert and store - for (i = 0; i < ctx->outlen; i++) { - ((uint8_t *) out)[i] = - (ctx->h[i >> 2] >> (8 * (i & 3))) & 0xFF; - } -} - -// Convenience function for all-in-one computation. -int blake2s(void *out, size_t outlen, - const void *key, size_t keylen, - const void *in, size_t inlen) -{ - blake2s_ctx ctx; - if (blake2s_init(&ctx, outlen, key, keylen)) - return -1; - blake2s_update(&ctx, in, inlen); - blake2s_final(&ctx, out); - - return 0; -} diff --git a/lib/WireGuard-ESP32/src/crypto/refc/blake2s.h b/lib/WireGuard-ESP32/src/crypto/refc/blake2s.h deleted file mode 100644 index 4b05646..0000000 --- a/lib/WireGuard-ESP32/src/crypto/refc/blake2s.h +++ /dev/null @@ -1,39 +0,0 @@ -// Taken from RFC7693 - https://tools.ietf.org/html/rfc7693 -// BLAKE2s Hashing Context and API Prototypes -#ifndef _BLAKE2S_H -#define _BLAKE2S_H - -#define BLAKE2S_BLOCK_SIZE 64 - -#include -#include - -// state context -typedef struct { - uint8_t b[64]; // input buffer - uint32_t h[8]; // chained state - uint32_t t[2]; // total number of bytes - size_t c; // pointer for b[] - size_t outlen; // digest size -} blake2s_ctx; - -// Initialize the hashing context "ctx" with optional key "key". -// 1 <= outlen <= 32 gives the digest size in bytes. -// Secret key (also <= 32 bytes) is optional (keylen = 0). -int blake2s_init(blake2s_ctx *ctx, size_t outlen, - const void *key, size_t keylen); // secret key - -// Add "inlen" bytes from "in" into the hash. -void blake2s_update(blake2s_ctx *ctx, // context - const void *in, size_t inlen); // data to be hashed - -// Generate the message digest (size given in init). -// Result placed in "out". -void blake2s_final(blake2s_ctx *ctx, void *out); - -// All-in-one convenience function. -int blake2s(void *out, size_t outlen, // return buffer for digest - const void *key, size_t keylen, // optional secret key - const void *in, size_t inlen); // data to be hashed - -#endif diff --git a/lib/WireGuard-ESP32/src/crypto/refc/chacha20.c b/lib/WireGuard-ESP32/src/crypto/refc/chacha20.c deleted file mode 100644 index 52c4dd6..0000000 --- a/lib/WireGuard-ESP32/src/crypto/refc/chacha20.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright (c) 2021 Daniel Hope (www.floorsense.nz) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of "Floorsense Ltd", "Agile Workspace Ltd" nor the names of - * its contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Author: Daniel Hope - */ - -// RFC7539 implementation of ChaCha20 with modified nonce size for WireGuard -// https://tools.ietf.org/html/rfc7539 -// Adapted from https://cr.yp.to/streamciphers/timings/estreambench/submissions/salsa20/chacha8/ref/chacha.c by D. J. Bernstein (Public Domain) -// HChaCha20 is described here: https://tools.ietf.org/id/draft-arciszewski-xchacha-02.html - -#include "chacha20.h" - -#include -#include -#include "../../crypto.h" - -// 2.3. The ChaCha20 Block Function -// The first four words (0-3) are constants: 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 -static const uint32_t CHACHA20_CONSTANT_1 = 0x61707865; -static const uint32_t CHACHA20_CONSTANT_2 = 0x3320646e; -static const uint32_t CHACHA20_CONSTANT_3 = 0x79622d32; -static const uint32_t CHACHA20_CONSTANT_4 = 0x6b206574; - -#define ROTL32(v, n) (U32V((v) << (n)) | ((v) >> (32 - (n)))) - -#define PLUS(v,w) (U32V((v) + (w))) -#define PLUSONE(v) (PLUS((v),1)) - -// 2.1. The ChaCha Quarter Round -// 1. a += b; d ^= a; d <<<= 16; -// 2. c += d; b ^= c; b <<<= 12; -// 3. a += b; d ^= a; d <<<= 8; -// 4. c += d; b ^= c; b <<<= 7; - -#define QUARTERROUND(a, b, c, d) \ - a += b; d ^= a; d = ROTL32(d, 16); \ - c += d; b ^= c; b = ROTL32(b, 12); \ - a += b; d ^= a; d = ROTL32(d, 8); \ - c += d; b ^= c; b = ROTL32(b, 7) - -static inline void INNER_BLOCK(uint32_t *block) { - QUARTERROUND(block[0], block[4], block[ 8], block[12]); // column 0 - QUARTERROUND(block[1], block[5], block[ 9], block[13]); // column 1 - QUARTERROUND(block[2], block[6], block[10], block[14]); // column 2 - QUARTERROUND(block[3], block[7], block[11], block[15]); // column 3 - QUARTERROUND(block[0], block[5], block[10], block[15]); // diagonal 1 - QUARTERROUND(block[1], block[6], block[11], block[12]); // diagonal 2 - QUARTERROUND(block[2], block[7], block[ 8], block[13]); // diagonal 3 - QUARTERROUND(block[3], block[4], block[ 9], block[14]); // diagonal 4 -} - -#define TWENTY_ROUNDS(x) ( \ - INNER_BLOCK(x), \ - INNER_BLOCK(x), \ - INNER_BLOCK(x), \ - INNER_BLOCK(x), \ - INNER_BLOCK(x), \ - INNER_BLOCK(x), \ - INNER_BLOCK(x), \ - INNER_BLOCK(x), \ - INNER_BLOCK(x), \ - INNER_BLOCK(x) \ -) - -// 2.3. The ChaCha20 Block Function -// chacha20_block(key, counter, nonce): -// state = constants | key | counter | nonce -// working_state = state -// for i=1 upto 10 -// inner_block(working_state) -// end -// state += working_state -// return serialize(state) -// end -static void chacha20_block(struct chacha20_ctx *ctx, uint8_t *stream) { - uint32_t working_state[16]; - int i; - - for (i = 0; i < 16; ++i) { - working_state[i] = ctx->state[i]; - } - - TWENTY_ROUNDS(working_state); - - for (i = 0; i < 16; ++i) { - U32TO8_LITTLE(stream + (4 * i), PLUS(working_state[i], ctx->state[i])); - } -} - -void chacha20(struct chacha20_ctx *ctx, uint8_t *out, const uint8_t *in, uint32_t len) { - uint8_t output[CHACHA20_BLOCK_SIZE]; - int i; - - if (len) { - for (;;) { - chacha20_block(ctx, output); - // Word 12 is a block counter - ctx->state[12] = PLUSONE(ctx->state[12]); - if (len <= 64) { - for (i = 0;i < len;++i) { - out[i] = in[i] ^ output[i]; - } - return; - } - for (i = 0;i < 64;++i) { - out[i] = in[i] ^ output[i]; - } - len -= 64; - out += 64; - in += 64; - } - } -} - - -// 2.3. The ChaCha20 Block Function -// The first four words (0-3) are constants: 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 -// The next eight words (4-11) are taken from the 256-bit key by reading the bytes in little-endian order, in 4-byte chunks. -// Word 12 is a block counter. Since each block is 64-byte, a 32-bit word is enough for 256 gigabytes of data. -// Words 13-15 are a nonce, which should not be repeated for the same key. -// For wireguard: "nonce being composed of 32 bits of zeros followed by the 64-bit little-endian value of counter." where counter comes from the Wireguard layer and is separate from the block counter in word 12 -void chacha20_init(struct chacha20_ctx *ctx, const uint8_t *key, const uint64_t nonce) { - ctx->state[0] = CHACHA20_CONSTANT_1; - ctx->state[1] = CHACHA20_CONSTANT_2; - ctx->state[2] = CHACHA20_CONSTANT_3; - ctx->state[3] = CHACHA20_CONSTANT_4; - ctx->state[4] = U8TO32_LITTLE(key + 0); - ctx->state[5] = U8TO32_LITTLE(key + 4); - ctx->state[6] = U8TO32_LITTLE(key + 8); - ctx->state[7] = U8TO32_LITTLE(key + 12); - ctx->state[8] = U8TO32_LITTLE(key + 16); - ctx->state[9] = U8TO32_LITTLE(key + 20); - ctx->state[10] = U8TO32_LITTLE(key + 24); - ctx->state[11] = U8TO32_LITTLE(key + 28); - ctx->state[12] = 0; - ctx->state[13] = 0; - ctx->state[14] = nonce & 0xFFFFFFFF; - ctx->state[15] = nonce >> 32; -} - -// 2.2. HChaCha20 -// HChaCha20 is initialized the same way as the ChaCha cipher, except that HChaCha20 uses a 128-bit nonce and has no counter. -// After initialization, proceed through the ChaCha rounds as usual. -// Once the 20 ChaCha rounds have been completed, the first 128 bits and last 128 bits of the ChaCha state (both little-endian) are concatenated, and this 256-bit subkey is returned. -void hchacha20(uint8_t *out, const uint8_t *nonce, const uint8_t *key) { - uint32_t state[16]; - state[0] = CHACHA20_CONSTANT_1; - state[1] = CHACHA20_CONSTANT_2; - state[2] = CHACHA20_CONSTANT_3; - state[3] = CHACHA20_CONSTANT_4; - state[4] = U8TO32_LITTLE(key + 0); - state[5] = U8TO32_LITTLE(key + 4); - state[6] = U8TO32_LITTLE(key + 8); - state[7] = U8TO32_LITTLE(key + 12); - state[8] = U8TO32_LITTLE(key + 16); - state[9] = U8TO32_LITTLE(key + 20); - state[10] = U8TO32_LITTLE(key + 24); - state[11] = U8TO32_LITTLE(key + 28); - state[12] = U8TO32_LITTLE(nonce + 0); - state[13] = U8TO32_LITTLE(nonce + 4); - state[14] = U8TO32_LITTLE(nonce + 8); - state[15] = U8TO32_LITTLE(nonce + 12); - - TWENTY_ROUNDS(state); - - // Concatenate first/last 128 bits into 256bit output (as little endian) - U32TO8_LITTLE(out + 0, state[0]); - U32TO8_LITTLE(out + 4, state[1]); - U32TO8_LITTLE(out + 8, state[2]); - U32TO8_LITTLE(out + 12, state[3]); - U32TO8_LITTLE(out + 16, state[12]); - U32TO8_LITTLE(out + 20, state[13]); - U32TO8_LITTLE(out + 24, state[14]); - U32TO8_LITTLE(out + 28, state[15]); -} diff --git a/lib/WireGuard-ESP32/src/crypto/refc/chacha20.h b/lib/WireGuard-ESP32/src/crypto/refc/chacha20.h deleted file mode 100644 index aaa8022..0000000 --- a/lib/WireGuard-ESP32/src/crypto/refc/chacha20.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2021 Daniel Hope (www.floorsense.nz) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of "Floorsense Ltd", "Agile Workspace Ltd" nor the names of - * its contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Author: Daniel Hope - */ - -// RFC7539 implementation of ChaCha20 with modified nonce size for WireGuard -// https://tools.ietf.org/html/rfc7539 -// Adapted from https://cr.yp.to/streamciphers/timings/estreambench/submissions/salsa20/chacha8/ref/chacha.c by D. J. Bernstein (Public Domain) -// HChaCha20 is described here: https://tools.ietf.org/id/draft-arciszewski-xchacha-02.html -#ifndef _CHACHA20_H_ -#define _CHACHA20_H_ - -#include - -#define CHACHA20_BLOCK_SIZE (64) -#define CHACHA20_KEY_SIZE (32) - -struct chacha20_ctx { - uint32_t state[16]; -}; - -void chacha20_init(struct chacha20_ctx *ctx, const uint8_t *key, const uint64_t nonce); -void chacha20(struct chacha20_ctx *ctx, uint8_t *out, const uint8_t *in, uint32_t len); -void hchacha20(uint8_t *out, const uint8_t *nonce, const uint8_t *key); - -#endif /* _CHACHA20_H_ */ diff --git a/lib/WireGuard-ESP32/src/crypto/refc/chacha20poly1305.c b/lib/WireGuard-ESP32/src/crypto/refc/chacha20poly1305.c deleted file mode 100644 index 972e8b1..0000000 --- a/lib/WireGuard-ESP32/src/crypto/refc/chacha20poly1305.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (c) 2021 Daniel Hope (www.floorsense.nz) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of "Floorsense Ltd", "Agile Workspace Ltd" nor the names of - * its contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Author: Daniel Hope - */ - -// AEAD_CHACHA20_POLY1305 as described in https://tools.ietf.org/html/rfc7539 -// AEAD_XChaCha20_Poly1305 as described in https://tools.ietf.org/id/draft-arciszewski-xchacha-02.html -#include "chacha20poly1305.h" -#include "chacha20.h" -#include "poly1305-donna.h" - -#include -#include -#include "../../crypto.h" - -#define POLY1305_KEY_SIZE 32 -#define POLY1305_MAC_SIZE 16 - -static const uint8_t zero[CHACHA20_BLOCK_SIZE] = { 0 }; - -// 2.6. Generating the Poly1305 Key Using ChaCha20 -static void generate_poly1305_key(struct poly1305_context *poly1305_state, struct chacha20_ctx *chacha20_state, const uint8_t *key, uint64_t nonce) { - uint8_t block[POLY1305_KEY_SIZE] = {0}; - - // The method is to call the block function with the following parameters: - // - The 256-bit session integrity key is used as the ChaCha20 key. - // - The block counter is set to zero. - // - The protocol will specify a 96-bit or 64-bit nonce - chacha20_init(chacha20_state, key, nonce); - - // We take the first 256 bits or the serialized state, and use those as the one-time Poly1305 key - chacha20(chacha20_state, block, block, sizeof(block)); - - poly1305_init(poly1305_state, block); - - crypto_zero(&block, sizeof(block)); -} - -// 2.8. AEAD Construction (Encryption) -void chacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src, size_t src_len, const uint8_t *ad, size_t ad_len, uint64_t nonce, const uint8_t *key) { - struct poly1305_context poly1305_state; - struct chacha20_ctx chacha20_state; - uint8_t block[8]; - size_t padded_len; - - // First, a Poly1305 one-time key is generated from the 256-bit key and nonce using the procedure described in Section 2.6. - generate_poly1305_key(&poly1305_state, &chacha20_state, key, nonce); - - // Next, the ChaCha20 encryption function is called to encrypt the plaintext, using the same key and nonce, and with the initial counter set to 1. - chacha20(&chacha20_state, dst, src, src_len); - - // Finally, the Poly1305 function is called with the Poly1305 key calculated above, and a message constructed as a concatenation of the following: - // - The AAD - poly1305_update(&poly1305_state, ad, ad_len); - // - padding1 -- the padding is up to 15 zero bytes, and it brings the total length so far to an integral multiple of 16 - padded_len = (ad_len + 15) & 0xFFFFFFF0; // Round up to next 16 bytes - poly1305_update(&poly1305_state, zero, padded_len - ad_len); - // - The ciphertext - poly1305_update(&poly1305_state, dst, src_len); - // - padding2 -- the padding is up to 15 zero bytes, and it brings the total length so far to an integral multiple of 16. - padded_len = (src_len + 15) & 0xFFFFFFF0; // Round up to next 16 bytes - poly1305_update(&poly1305_state, zero, padded_len - src_len); - // - The length of the additional data in octets (as a 64-bit little-endian integer) - U64TO8_LITTLE(block, (uint64_t)ad_len); - poly1305_update(&poly1305_state, block, sizeof(block)); - // - The length of the ciphertext in octets (as a 64-bit little-endian integer). - U64TO8_LITTLE(block, (uint64_t)src_len); - poly1305_update(&poly1305_state, block, sizeof(block)); - - // The output from the AEAD is twofold: - // - A ciphertext of the same length as the plaintext. (above, output of chacha20 into dst) - // - A 128-bit tag, which is the output of the Poly1305 function. (append to dst) - poly1305_finish(&poly1305_state, dst + src_len); - - // Make sure we leave nothing sensitive on the stack - crypto_zero(&chacha20_state, sizeof(chacha20_state)); - crypto_zero(&block, sizeof(block)); -} - -// 2.8. AEAD Construction (Decryption) -bool chacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src, size_t src_len, const uint8_t *ad, size_t ad_len, uint64_t nonce, const uint8_t *key) { - struct poly1305_context poly1305_state; - struct chacha20_ctx chacha20_state; - uint8_t block[8]; - uint8_t mac[POLY1305_MAC_SIZE]; - size_t padded_len; - int dst_len; - bool result = false; - - // Decryption is similar [to encryption] with the following differences: - // - The roles of ciphertext and plaintext are reversed, so the ChaCha20 encryption function is applied to the ciphertext, producing the plaintext. - // - The Poly1305 function is still run on the AAD and the ciphertext, not the plaintext. - // - The calculated tag is bitwise compared to the received tag. The message is authenticated if and only if the tags match. - - if (src_len >= POLY1305_MAC_SIZE) { - dst_len = src_len - POLY1305_MAC_SIZE; - - // First, a Poly1305 one-time key is generated from the 256-bit key and nonce using the procedure described in Section 2.6. - generate_poly1305_key(&poly1305_state, &chacha20_state, key, nonce); - - // Calculate the MAC before attempting decryption - - // the Poly1305 function is called with the Poly1305 key calculated above, and a message constructed as a concatenation of the following: - // - The AAD - poly1305_update(&poly1305_state, ad, ad_len); - // - padding1 -- the padding is up to 15 zero bytes, and it brings the total length so far to an integral multiple of 16 - padded_len = (ad_len + 15) & 0xFFFFFFF0; // Round up to next 16 bytes - poly1305_update(&poly1305_state, zero, padded_len - ad_len); - // - The ciphertext (note the Poly1305 function is still run on the AAD and the ciphertext, not the plaintext) - poly1305_update(&poly1305_state, src, dst_len); - // - padding2 -- the padding is up to 15 zero bytes, and it brings the total length so far to an integral multiple of 16. - padded_len = (dst_len + 15) & 0xFFFFFFF0; // Round up to next 16 bytes - poly1305_update(&poly1305_state, zero, padded_len - dst_len); - // - The length of the additional data in octets (as a 64-bit little-endian integer) - U64TO8_LITTLE(block, (uint64_t)ad_len); - poly1305_update(&poly1305_state, block, sizeof(block)); - // - The length of the ciphertext in octets (as a 64-bit little-endian integer). - U64TO8_LITTLE(block, (uint64_t)dst_len); - poly1305_update(&poly1305_state, block, sizeof(block)); - - // The output from the AEAD is twofold: - // - A plaintext of the same length as the ciphertext. (below, output of chacha20 into dst) - // - A 128-bit tag, which is the output of the Poly1305 function. (into mac for checking against passed mac) - poly1305_finish(&poly1305_state, mac); - - - if (crypto_equal(mac, src + dst_len, POLY1305_MAC_SIZE)) { - // mac is correct - do the decryption - // Next, the ChaCha20 encryption function is called to decrypt the ciphertext, using the same key and nonce, and with the initial counter set to 1. - chacha20(&chacha20_state, dst, src, dst_len); - result = true; - } - } - return result; -} - -// AEAD_XChaCha20_Poly1305 -// XChaCha20-Poly1305 is a variant of the ChaCha20-Poly1305 AEAD construction as defined in [RFC7539] that uses a 192-bit nonce instead of a 96-bit nonce. -// The algorithm for XChaCha20-Poly1305 is as follows: -// 1. Calculate a subkey from the first 16 bytes of the nonce and the key, using HChaCha20 (Section 2.2). -// 2. Use the subkey and remaining 8 bytes of the nonce (prefixed with 4 NUL bytes) with AEAD_CHACHA20_POLY1305 from [RFC7539] as normal. The definition for XChaCha20 is given in Section 2.3. -void xchacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src, size_t src_len, const uint8_t *ad, size_t ad_len, const uint8_t *nonce, const uint8_t *key) { - uint8_t subkey[CHACHA20_KEY_SIZE]; - uint64_t new_nonce; - - new_nonce = U8TO64_LITTLE(nonce + 16); - - hchacha20(subkey, nonce, key); - chacha20poly1305_encrypt(dst, src, src_len, ad, ad_len, new_nonce, subkey); - - crypto_zero(subkey, sizeof(subkey)); -} - -bool xchacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src, size_t src_len, const uint8_t *ad, size_t ad_len, const uint8_t *nonce, const uint8_t *key) { - uint8_t subkey[CHACHA20_KEY_SIZE]; - uint64_t new_nonce; - bool result; - - new_nonce = U8TO64_LITTLE(nonce + 16); - - hchacha20(subkey, nonce, key); - result = chacha20poly1305_decrypt(dst, src, src_len, ad, ad_len, new_nonce, subkey); - - crypto_zero(subkey, sizeof(subkey)); - return result; -} diff --git a/lib/WireGuard-ESP32/src/crypto/refc/chacha20poly1305.h b/lib/WireGuard-ESP32/src/crypto/refc/chacha20poly1305.h deleted file mode 100644 index 83fab07..0000000 --- a/lib/WireGuard-ESP32/src/crypto/refc/chacha20poly1305.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2021 Daniel Hope (www.floorsense.nz) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of "Floorsense Ltd", "Agile Workspace Ltd" nor the names of - * its contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Author: Daniel Hope - */ - -#ifndef _CHACHA20POLY1305_H_ -#define _CHACHA20POLY1305_H_ - -#include -#include -#include - -// Aead(key, counter, plain text, auth text) ChaCha20Poly1305 AEAD, as specified in RFC7539 [17], with its nonce being composed of 32 bits of zeros followed by the 64-bit little-endian value of counter. -// AEAD_CHACHA20_POLY1305 as described in https://tools.ietf.org/html/rfc7539 -void chacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src, size_t src_len, const uint8_t *ad, size_t ad_len, uint64_t nonce, const uint8_t *key); -bool chacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src, size_t src_len, const uint8_t *ad, size_t ad_len, uint64_t nonce, const uint8_t *key); - -// Xaead(key, nonce, plain text, auth text) XChaCha20Poly1305 AEAD, with a 24-byte random nonce, instantiated using HChaCha20 [6] and ChaCha20Poly1305. -// AEAD_XChaCha20_Poly1305 as described in https://tools.ietf.org/id/draft-arciszewski-xchacha-02.html -void xchacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src, size_t src_len, const uint8_t *ad, size_t ad_len, const uint8_t *nonce, const uint8_t *key); -bool xchacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src, size_t src_len, const uint8_t *ad, size_t ad_len, const uint8_t *nonce, const uint8_t *key); - -#endif /* _CHACHA20POLY1305_H_ */ diff --git a/lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna-32.h b/lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna-32.h deleted file mode 100644 index dbcec77..0000000 --- a/lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna-32.h +++ /dev/null @@ -1,220 +0,0 @@ -// Taken from https://github.com/floodyberry/poly1305-donna - public domain or MIT -/* - poly1305 implementation using 32 bit * 32 bit = 64 bit multiplication and 64 bit addition -*/ - -#if defined(_MSC_VER) - #define POLY1305_NOINLINE __declspec(noinline) -#elif defined(__GNUC__) - #define POLY1305_NOINLINE __attribute__((noinline)) -#else - #define POLY1305_NOINLINE -#endif - -#define poly1305_block_size 16 - -/* 17 + sizeof(size_t) + 14*sizeof(unsigned long) */ -typedef struct poly1305_state_internal_t { - unsigned long r[5]; - unsigned long h[5]; - unsigned long pad[4]; - size_t leftover; - unsigned char buffer[poly1305_block_size]; - unsigned char final; -} poly1305_state_internal_t; - -/* interpret four 8 bit unsigned integers as a 32 bit unsigned integer in little endian */ -static unsigned long -U8TO32(const unsigned char *p) { - return - (((unsigned long)(p[0] & 0xff) ) | - ((unsigned long)(p[1] & 0xff) << 8) | - ((unsigned long)(p[2] & 0xff) << 16) | - ((unsigned long)(p[3] & 0xff) << 24)); -} - -/* store a 32 bit unsigned integer as four 8 bit unsigned integers in little endian */ -static void -U32TO8(unsigned char *p, unsigned long v) { - p[0] = (v ) & 0xff; - p[1] = (v >> 8) & 0xff; - p[2] = (v >> 16) & 0xff; - p[3] = (v >> 24) & 0xff; -} - -void -poly1305_init(poly1305_context *ctx, const unsigned char key[32]) { - poly1305_state_internal_t *st = (poly1305_state_internal_t *)ctx; - - /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ - st->r[0] = (U8TO32(&key[ 0]) ) & 0x3ffffff; - st->r[1] = (U8TO32(&key[ 3]) >> 2) & 0x3ffff03; - st->r[2] = (U8TO32(&key[ 6]) >> 4) & 0x3ffc0ff; - st->r[3] = (U8TO32(&key[ 9]) >> 6) & 0x3f03fff; - st->r[4] = (U8TO32(&key[12]) >> 8) & 0x00fffff; - - /* h = 0 */ - st->h[0] = 0; - st->h[1] = 0; - st->h[2] = 0; - st->h[3] = 0; - st->h[4] = 0; - - /* save pad for later */ - st->pad[0] = U8TO32(&key[16]); - st->pad[1] = U8TO32(&key[20]); - st->pad[2] = U8TO32(&key[24]); - st->pad[3] = U8TO32(&key[28]); - - st->leftover = 0; - st->final = 0; -} - -static void -poly1305_blocks(poly1305_state_internal_t *st, const unsigned char *m, size_t bytes) { - const unsigned long hibit = (st->final) ? 0 : (1UL << 24); /* 1 << 128 */ - unsigned long r0,r1,r2,r3,r4; - unsigned long s1,s2,s3,s4; - unsigned long h0,h1,h2,h3,h4; - unsigned long long d0,d1,d2,d3,d4; - unsigned long c; - - r0 = st->r[0]; - r1 = st->r[1]; - r2 = st->r[2]; - r3 = st->r[3]; - r4 = st->r[4]; - - s1 = r1 * 5; - s2 = r2 * 5; - s3 = r3 * 5; - s4 = r4 * 5; - - h0 = st->h[0]; - h1 = st->h[1]; - h2 = st->h[2]; - h3 = st->h[3]; - h4 = st->h[4]; - - while (bytes >= poly1305_block_size) { - /* h += m[i] */ - h0 += (U8TO32(m+ 0) ) & 0x3ffffff; - h1 += (U8TO32(m+ 3) >> 2) & 0x3ffffff; - h2 += (U8TO32(m+ 6) >> 4) & 0x3ffffff; - h3 += (U8TO32(m+ 9) >> 6) & 0x3ffffff; - h4 += (U8TO32(m+12) >> 8) | hibit; - - /* h *= r */ - d0 = ((unsigned long long)h0 * r0) + ((unsigned long long)h1 * s4) + ((unsigned long long)h2 * s3) + ((unsigned long long)h3 * s2) + ((unsigned long long)h4 * s1); - d1 = ((unsigned long long)h0 * r1) + ((unsigned long long)h1 * r0) + ((unsigned long long)h2 * s4) + ((unsigned long long)h3 * s3) + ((unsigned long long)h4 * s2); - d2 = ((unsigned long long)h0 * r2) + ((unsigned long long)h1 * r1) + ((unsigned long long)h2 * r0) + ((unsigned long long)h3 * s4) + ((unsigned long long)h4 * s3); - d3 = ((unsigned long long)h0 * r3) + ((unsigned long long)h1 * r2) + ((unsigned long long)h2 * r1) + ((unsigned long long)h3 * r0) + ((unsigned long long)h4 * s4); - d4 = ((unsigned long long)h0 * r4) + ((unsigned long long)h1 * r3) + ((unsigned long long)h2 * r2) + ((unsigned long long)h3 * r1) + ((unsigned long long)h4 * r0); - - /* (partial) h %= p */ - c = (unsigned long)(d0 >> 26); h0 = (unsigned long)d0 & 0x3ffffff; - d1 += c; c = (unsigned long)(d1 >> 26); h1 = (unsigned long)d1 & 0x3ffffff; - d2 += c; c = (unsigned long)(d2 >> 26); h2 = (unsigned long)d2 & 0x3ffffff; - d3 += c; c = (unsigned long)(d3 >> 26); h3 = (unsigned long)d3 & 0x3ffffff; - d4 += c; c = (unsigned long)(d4 >> 26); h4 = (unsigned long)d4 & 0x3ffffff; - h0 += c * 5; c = (h0 >> 26); h0 = h0 & 0x3ffffff; - h1 += c; - - m += poly1305_block_size; - bytes -= poly1305_block_size; - } - - st->h[0] = h0; - st->h[1] = h1; - st->h[2] = h2; - st->h[3] = h3; - st->h[4] = h4; -} - -POLY1305_NOINLINE void -poly1305_finish(poly1305_context *ctx, unsigned char mac[16]) { - poly1305_state_internal_t *st = (poly1305_state_internal_t *)ctx; - unsigned long h0,h1,h2,h3,h4,c; - unsigned long g0,g1,g2,g3,g4; - unsigned long long f; - unsigned long mask; - - /* process the remaining block */ - if (st->leftover) { - size_t i = st->leftover; - st->buffer[i++] = 1; - for (; i < poly1305_block_size; i++) - st->buffer[i] = 0; - st->final = 1; - poly1305_blocks(st, st->buffer, poly1305_block_size); - } - - /* fully carry h */ - h0 = st->h[0]; - h1 = st->h[1]; - h2 = st->h[2]; - h3 = st->h[3]; - h4 = st->h[4]; - - c = h1 >> 26; h1 = h1 & 0x3ffffff; - h2 += c; c = h2 >> 26; h2 = h2 & 0x3ffffff; - h3 += c; c = h3 >> 26; h3 = h3 & 0x3ffffff; - h4 += c; c = h4 >> 26; h4 = h4 & 0x3ffffff; - h0 += c * 5; c = h0 >> 26; h0 = h0 & 0x3ffffff; - h1 += c; - - /* compute h + -p */ - g0 = h0 + 5; c = g0 >> 26; g0 &= 0x3ffffff; - g1 = h1 + c; c = g1 >> 26; g1 &= 0x3ffffff; - g2 = h2 + c; c = g2 >> 26; g2 &= 0x3ffffff; - g3 = h3 + c; c = g3 >> 26; g3 &= 0x3ffffff; - g4 = h4 + c - (1UL << 26); - - /* select h if h < p, or h + -p if h >= p */ - mask = (g4 >> ((sizeof(unsigned long) * 8) - 1)) - 1; - g0 &= mask; - g1 &= mask; - g2 &= mask; - g3 &= mask; - g4 &= mask; - mask = ~mask; - h0 = (h0 & mask) | g0; - h1 = (h1 & mask) | g1; - h2 = (h2 & mask) | g2; - h3 = (h3 & mask) | g3; - h4 = (h4 & mask) | g4; - - /* h = h % (2^128) */ - h0 = ((h0 ) | (h1 << 26)) & 0xffffffff; - h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff; - h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff; - h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff; - - /* mac = (h + pad) % (2^128) */ - f = (unsigned long long)h0 + st->pad[0] ; h0 = (unsigned long)f; - f = (unsigned long long)h1 + st->pad[1] + (f >> 32); h1 = (unsigned long)f; - f = (unsigned long long)h2 + st->pad[2] + (f >> 32); h2 = (unsigned long)f; - f = (unsigned long long)h3 + st->pad[3] + (f >> 32); h3 = (unsigned long)f; - - U32TO8(mac + 0, h0); - U32TO8(mac + 4, h1); - U32TO8(mac + 8, h2); - U32TO8(mac + 12, h3); - - /* zero out the state */ - st->h[0] = 0; - st->h[1] = 0; - st->h[2] = 0; - st->h[3] = 0; - st->h[4] = 0; - st->r[0] = 0; - st->r[1] = 0; - st->r[2] = 0; - st->r[3] = 0; - st->r[4] = 0; - st->pad[0] = 0; - st->pad[1] = 0; - st->pad[2] = 0; - st->pad[3] = 0; -} - diff --git a/lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna.c b/lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna.c deleted file mode 100644 index 31ad7c5..0000000 --- a/lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna.c +++ /dev/null @@ -1,41 +0,0 @@ -// Taken from https://github.com/floodyberry/poly1305-donna - public domain or MIT - -#include "poly1305-donna.h" -#include "poly1305-donna-32.h" - -void -poly1305_update(poly1305_context *ctx, const unsigned char *m, size_t bytes) { - poly1305_state_internal_t *st = (poly1305_state_internal_t *)ctx; - size_t i; - - /* handle leftover */ - if (st->leftover) { - size_t want = (poly1305_block_size - st->leftover); - if (want > bytes) - want = bytes; - for (i = 0; i < want; i++) - st->buffer[st->leftover + i] = m[i]; - bytes -= want; - m += want; - st->leftover += want; - if (st->leftover < poly1305_block_size) - return; - poly1305_blocks(st, st->buffer, poly1305_block_size); - st->leftover = 0; - } - - /* process full blocks */ - if (bytes >= poly1305_block_size) { - size_t want = (bytes & ~(poly1305_block_size - 1)); - poly1305_blocks(st, m, want); - m += want; - bytes -= want; - } - - /* store leftover */ - if (bytes) { - for (i = 0; i < bytes; i++) - st->buffer[st->leftover + i] = m[i]; - st->leftover += bytes; - } -} diff --git a/lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna.h b/lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna.h deleted file mode 100644 index 955bca9..0000000 --- a/lib/WireGuard-ESP32/src/crypto/refc/poly1305-donna.h +++ /dev/null @@ -1,16 +0,0 @@ -// Taken from https://github.com/floodyberry/poly1305-donna - public domain or MIT -#ifndef POLY1305_DONNA_H -#define POLY1305_DONNA_H - -#include - -typedef struct poly1305_context { - size_t aligner; - unsigned char opaque[136]; -} poly1305_context; - -void poly1305_init(poly1305_context *ctx, const unsigned char key[32]); -void poly1305_update(poly1305_context *ctx, const unsigned char *m, size_t bytes); -void poly1305_finish(poly1305_context *ctx, unsigned char mac[16]); - -#endif /* POLY1305_DONNA_H */ diff --git a/lib/WireGuard-ESP32/src/crypto/refc/x25519-license.txt b/lib/WireGuard-ESP32/src/crypto/refc/x25519-license.txt deleted file mode 100644 index 81e4862..0000000 --- a/lib/WireGuard-ESP32/src/crypto/refc/x25519-license.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-2016 Cryptography Research, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/lib/WireGuard-ESP32/src/crypto/refc/x25519.c b/lib/WireGuard-ESP32/src/crypto/refc/x25519.c deleted file mode 100644 index 3b5ebe3..0000000 --- a/lib/WireGuard-ESP32/src/crypto/refc/x25519.c +++ /dev/null @@ -1,448 +0,0 @@ -// Taken from https://sourceforge.net/p/strobe (MIT Licence) -/** - * @cond internal - * @file x25519.c - * @copyright - * Copyright (c) 2015-2016 Cryptography Research, Inc. \n - * Released under the MIT License. See LICENSE.txt for license information. - * @author Mike Hamburg - * @brief Key exchange and signatures based on X25519. - */ -#include -#include "x25519.h" -//#include "strobe.h" -//#include "strobe_config.h" -// STROBE header replacement -#include -#define X25519_WBITS 32 -#define X25519_SUPPORT_SIGN 0 -#define X25519_MEMCPY_PARAMS 1 -#define X25519_USE_POWER_CHAIN 1 -#if BYTE_ORDER == LITTLE_ENDIAN -static inline uint32_t eswap_letoh_32(uint32_t w) { return w; } -#else -#error "Fix eswap() on non-little-endian machine" -#endif - -#if X25519_WBITS == 64 - typedef uint64_t limb_t; - typedef __uint128_t dlimb_t; - typedef __int128_t sdlimb_t; - #define eswap_limb eswap_letoh_64 - #define LIMB(x) x##ull -#elif X25519_WBITS == 32 - typedef uint32_t limb_t; - typedef uint64_t dlimb_t; - typedef int64_t sdlimb_t; - #define eswap_limb eswap_letoh_32 - #define LIMB(x) (uint32_t)(x##ull),(uint32_t)((x##ull)>>32) -#else - #error "Need to know X25519_WBITS" -#endif - -#define NLIMBS (256/X25519_WBITS) -typedef limb_t fe[NLIMBS]; - -#if X25519_SUPPORT_SIGN -typedef limb_t scalar_t[NLIMBS]; -static const limb_t MONTGOMERY_FACTOR = (limb_t)0xd2b51da312547e1bull; -static const scalar_t sc_p = { - LIMB(0x5812631a5cf5d3ed), LIMB(0x14def9dea2f79cd6), - LIMB(0x0000000000000000), LIMB(0x1000000000000000) -}, sc_r2 = { - LIMB(0xa40611e3449c0f01), LIMB(0xd00e1ba768859347), - LIMB(0xceec73d217f5be65), LIMB(0x0399411b7c309a3d) -}; -#endif - -static inline limb_t umaal( - limb_t *carry, limb_t acc, limb_t mand, limb_t mier -) { - dlimb_t tmp = (dlimb_t) mand * mier + acc + *carry; - *carry = tmp >> X25519_WBITS; - return tmp; -} - -/* These functions are implemented in terms of umaal on ARM */ -static inline limb_t adc(limb_t *carry, limb_t acc, limb_t mand) { - dlimb_t total = (dlimb_t)*carry + acc + mand; - *carry = total>>X25519_WBITS; - return total; -} - -static inline limb_t adc0(limb_t *carry, limb_t acc) { - dlimb_t total = (dlimb_t)*carry + acc; - *carry = total>>X25519_WBITS; - return total; -} - -/* Precondition: carry is small. - * Invariant: result of propagate is < 2^255 + 1 word - * In particular, always less than 2p. - * Also, output x >= min(x,19) - */ -static void propagate(fe x, limb_t over) { - unsigned i; - over = x[NLIMBS-1]>>(X25519_WBITS-1) | over<<1; - x[NLIMBS-1] &= ~((limb_t)1<<(X25519_WBITS-1)); - - limb_t carry = over * 19; - for (i=0; i>= X25519_WBITS; - } - propagate(out,1+carry); -} - -static void __attribute__((unused)) -swapin(limb_t *x, const uint8_t *in) { - memcpy(x,in,sizeof(fe)); - unsigned i; - for (i=0; i>= X25519_WBITS; - } - return ((dlimb_t)res - 1) >> X25519_WBITS; -} - -static const limb_t a24[1]={121665}; - -static void ladder_part1(fe xs[5]) { - limb_t *x2 = xs[0], *z2=xs[1],*x3=xs[2],*z3=xs[3],*t1=xs[4]; - add(t1,x2,z2); // t1 = A - sub(z2,x2,z2); // z2 = B - add(x2,x3,z3); // x2 = C - sub(z3,x3,z3); // z3 = D - mul1(z3,t1); // z3 = DA - mul1(x2,z2); // x3 = BC - add(x3,z3,x2); // x3 = DA+CB - sub(z3,z3,x2); // z3 = DA-CB - sqr1(t1); // t1 = AA - sqr1(z2); // z2 = BB - sub(x2,t1,z2); // x2 = E = AA-BB - mul(z2,x2,a24,sizeof(a24)/sizeof(a24[0])); // z2 = E*a24 - add(z2,z2,t1); // z2 = E*a24 + AA -} -static void ladder_part2(fe xs[5], const fe x1) { - limb_t *x2 = xs[0], *z2=xs[1],*x3=xs[2],*z3=xs[3],*t1=xs[4]; - sqr1(z3); // z3 = (DA-CB)^2 - mul1(z3,x1); // z3 = x1 * (DA-CB)^2 - sqr1(x3); // x3 = (DA+CB)^2 - mul1(z2,x2); // z2 = AA*(E*a24+AA) - sub(x2,t1,x2); // x2 = BB again - mul1(x2,t1); // x2 = AA*BB -} - -static void x25519_core(fe xs[5], const uint8_t scalar[X25519_BYTES], const uint8_t *x1, int clamp) { - int i; -#if X25519_MEMCPY_PARAMS - fe x1i; - swapin(x1i,x1); - x1 = (const uint8_t *)x1; -#endif - limb_t swap = 0; - limb_t *x2 = xs[0],*x3=xs[2],*z3=xs[3]; - memset(xs,0,4*sizeof(fe)); - x2[0] = z3[0] = 1; - memcpy(x3,x1,sizeof(fe)); - - for (i=255; i>=0; i--) { - uint8_t bytei = scalar[i/8]; - if (clamp) { - if (i/8 == 0) { - bytei &= ~7; - } else if (i/8 == X25519_BYTES-1) { - bytei &= 0x7F; - bytei |= 0x40; - } - } - limb_t doswap = -(limb_t)((bytei>>(i%8)) & 1); - condswap(x2,x3,swap^doswap); - swap = doswap; - - ladder_part1(xs); - ladder_part2(xs,(const limb_t *)x1); - } - condswap(x2,x3,swap); -} - -int x25519(uint8_t out[X25519_BYTES], const uint8_t scalar[X25519_BYTES], const uint8_t x1[X25519_BYTES], int clamp) { - fe xs[5]; - x25519_core(xs,scalar,x1,clamp); - - /* Precomputed inversion chain */ - limb_t *x2 = xs[0], *z2=xs[1], *z3=xs[3]; - int i; - - limb_t *prev = z2; -#if X25519_USE_POWER_CHAIN - static const struct { uint8_t a,c,n; } steps[13] = { - {2,1,1 }, - {2,1,1 }, - {4,2,3 }, - {2,4,6 }, - {3,1,1 }, - {3,2,12 }, - {4,3,25 }, - {2,3,25 }, - {2,4,50 }, - {3,2,125}, - {3,1,2 }, - {3,1,2 }, - {3,1,1 } - }; - for (i=0; i<13; i++) { - int j; - limb_t *a = xs[steps[i].a]; - for (j=steps[i].n; j>0; j--) { - sqr(a, prev); - prev = a; - } - mul1(a,xs[steps[i].c]); - } -#else - /* Raise to the p-2 = 0x7f..ffeb */ - for (i=253; i>=0; i--) { - sqr(z3,prev); - prev = z3; - if (i>=8 || (0xeb>>i & 1)) { - mul1(z3,z2); - } - } -#endif - - /* Here prev = z3 */ - /* x2 /= z2 */ -#if X25519_MEMCPY_PARAMS - mul1(x2,z3); - int ret = canon(x2); - swapout(out,x2); -#else - mul((limb_t *)out, x2, z3, NLIMBS); - int ret = canon((limb_t*)out); -#endif - if (clamp) return ret; - else return 0; -} - -const uint8_t X25519_BASE_POINT[X25519_BYTES] = {9}; - -#if X25519_SUPPORT_VERIFY -static limb_t x25519_verify_core( - fe xs[5], - const limb_t *other1, - const uint8_t other2[X25519_BYTES] -) { - limb_t *z2=xs[1],*x3=xs[2],*z3=xs[3]; -#if X25519_MEMCPY_PARAMS - fe xo2; - swapin(xo2,other2); -#else - const limb_t *xo2 = (const limb_t *)other2; -#endif - - memcpy(x3, other1, 2*sizeof(fe)); - - ladder_part1(xs); - - /* Here z2 = t2^2 */ - mul1(z2,other1); - mul1(z2,other1+NLIMBS); - mul1(z2,xo2); - const limb_t sixteen = 16; - mul (z2,z2,&sixteen,1); - - mul1(z3,xo2); - sub(z3,z3,x3); - sqr1(z3); - - /* check equality */ - sub(z3,z3,z2); - - /* If canon(z2) then both sides are zero. - * If canon(z3) then the two sides are equal. - * - * Reject sigs where both sides are zero, because - * that can happen if an input causes the ladder to - * return 0/0. - */ - return canon(z2) | ~canon(z3); -} - -int x25519_verify_p2 ( - const uint8_t response[X25519_BYTES], - const uint8_t challenge[X25519_BYTES], - const uint8_t eph[X25519_BYTES], - const uint8_t pub[X25519_BYTES] -) { - fe xs[7]; - x25519_core(&xs[0],challenge,pub,0); - x25519_core(&xs[2],response,X25519_BASE_POINT,0); - return x25519_verify_core(&xs[2],xs[0],eph); -} -#endif // X25519_SUPPORT_VERIFY - -#if X25519_SUPPORT_SIGN -static void sc_montmul ( - scalar_t out, - const scalar_t a, - const scalar_t b -) { - /** - * OK, so carry bounding. We're using a high carry, so that the - * inputs don't have to be reduced. - * - * First montmul: output < (M^2 + Mp)/M = M+p, subtract p, < M. This gets rid of high carry. - * Second montmul, by r^2 mod p < p: output < (Mp + Mp)/M = 2p, subtract p, < p, done. - */ - unsigned i,j; - limb_t hic = 0; - for (i=0; i0) out[j-1] = acc; - } - - /* Add two carry registers and high carry */ - out[NLIMBS-1] = adc(&hic, carry, carry2); - } - - /* Reduce */ - sdlimb_t scarry = 0; - for (i=0; i>= X25519_WBITS; - } - limb_t need_add = -(scarry + hic); - - limb_t carry = 0; - for (i=0; i -#include "crypto.h" -#include "lwip/sys.h" -#include "mbedtls/entropy.h" -#include "mbedtls/ctr_drbg.h" -#include "esp_system.h" - -static struct mbedtls_ctr_drbg_context random_context; -static struct mbedtls_entropy_context entropy_context; -static bool is_platform_initialized = false; - -static int entropy_hw_random_source( void *data, unsigned char *output, size_t len, size_t *olen ) { - esp_fill_random(output, len); - *olen = len; - return 0; -} - -void wireguard_platform_init() { - if( is_platform_initialized ) return; - - mbedtls_entropy_init(&entropy_context); - mbedtls_ctr_drbg_init(&random_context); - mbedtls_entropy_add_source(&entropy_context, entropy_hw_random_source, NULL, 134, MBEDTLS_ENTROPY_SOURCE_STRONG); - mbedtls_ctr_drbg_seed(&random_context, mbedtls_entropy_func, &entropy_context, NULL, 0); - - is_platform_initialized = true; -} - -void wireguard_random_bytes(void *bytes, size_t size) { - uint8_t *out = (uint8_t *)bytes; - mbedtls_ctr_drbg_random(&random_context, bytes, size); -} - -uint32_t wireguard_sys_now() { - // Default to the LwIP system time - return sys_now(); -} - -void wireguard_tai64n_now(uint8_t *output) { - // See https://cr.yp.to/libtai/tai64.html - // 64 bit seconds from 1970 = 8 bytes - // 32 bit nano seconds from current second - - // Get timestamp. Note that the timestamp must be synced by NTP, - // or at least preserved in NVS, not to go back after reset. - // Otherwise, the WireGuard remote peer rejects handshake. - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t millis = (tv.tv_sec * 1000LL + (tv.tv_usec / 1000LL)); - - // Split into seconds offset + nanos - uint64_t seconds = 0x400000000000000aULL + (millis / 1000); - uint32_t nanos = (millis % 1000) * 1000; - U64TO8_BIG(output + 0, seconds); - U32TO8_BIG(output + 8, nanos); -} - -bool wireguard_is_under_load() { - return false; -} - diff --git a/lib/WireGuard-ESP32/src/wireguard-platform.h b/lib/WireGuard-ESP32/src/wireguard-platform.h deleted file mode 100644 index f54ec4a..0000000 --- a/lib/WireGuard-ESP32/src/wireguard-platform.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Ported to ESP32 Arduino by Kenta Ida (fuga@fugafuga.org) - * The original license is below: - * - * Copyright (c) 2021 Daniel Hope (www.floorsense.nz) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of "Floorsense Ltd", "Agile Workspace Ltd" nor the names of - * its contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Author: Daniel Hope - */ - -#ifndef _WIREGUARD_PLATFORM_H_ -#define _WIREGUARD_PLATFORM_H_ - -#include -#include -#include - -// Peers are allocated statically inside the device structure to avoid malloc -#define WIREGUARD_MAX_PEERS 1 -#define WIREGUARD_MAX_SRC_IPS 2 - -// Per device limit on accepting (valid) initiation requests - per peer -#define MAX_INITIATIONS_PER_SECOND (2) - -// -// Your platform integration needs to provide implementations of these functions -// - -void wireguard_platform_init(); - -// The number of milliseconds since system boot - for LwIP systems this could be sys_now() -uint32_t wireguard_sys_now(); - -// Fill the supplied buffer with random data - random data is used for generating new session keys periodically -void wireguard_random_bytes(void *bytes, size_t size); - -// Get the current time in tai64n format - 8 byte seconds, 4 byte nano sub-second - see https://cr.yp.to/libtai/tai64.html for details -// Output buffer passed is 12 bytes -// The Wireguard implementation doesn't strictly need this to be a time, but instead an increasing value -// The remote end of the Wireguard tunnel will use this value in handshake replay detection -void wireguard_tai64n_now(uint8_t *output); - -// Is the system under load - i.e. should we generate cookie reply message in response to initiation messages -bool wireguard_is_under_load(); - -#endif /* _WIREGUARD_PLATFORM_H_ */ diff --git a/lib/WireGuard-ESP32/src/wireguard.c b/lib/WireGuard-ESP32/src/wireguard.c deleted file mode 100644 index ca86e9b..0000000 --- a/lib/WireGuard-ESP32/src/wireguard.c +++ /dev/null @@ -1,1129 +0,0 @@ -/* - * Ported to ESP32 Arduino by Kenta Ida (fuga@fugafuga.org) - * The original license is below: - * - * Copyright (c) 2021 Daniel Hope (www.floorsense.nz) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of "Floorsense Ltd", "Agile Workspace Ltd" nor the names of - * its contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Author: Daniel Hope - */ - -#include "wireguard.h" - -#include -#include -#include - -#include "crypto.h" - -// For HMAC calculation -#define WIREGUARD_BLAKE2S_BLOCK_SIZE (64) - -// 5.4 Messages -// Constants -static const uint8_t CONSTRUCTION[37] = "Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s"; // The UTF-8 string literal "Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s", 37 bytes of output -static const uint8_t IDENTIFIER[34] = "WireGuard v1 zx2c4 Jason@zx2c4.com"; // The UTF-8 string literal "WireGuard v1 zx2c4 Jason@zx2c4.com", 34 bytes of output -static const uint8_t LABEL_MAC1[8] = "mac1----"; // Label-Mac1 The UTF-8 string literal "mac1----", 8 bytes of output. -static const uint8_t LABEL_COOKIE[8] = "cookie--"; // Label-Cookie The UTF-8 string literal "cookie--", 8 bytes of output - -static const char *base64_lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -static const uint8_t zero_key[WIREGUARD_PUBLIC_KEY_LEN] = { 0 }; - -// Calculated in wireguard_init -static uint8_t construction_hash[WIREGUARD_HASH_LEN]; -static uint8_t identifier_hash[WIREGUARD_HASH_LEN]; - - -void wireguard_init() { - wireguard_blake2s_ctx ctx; - // Pre-calculate chaining key hash - wireguard_blake2s_init(&ctx, WIREGUARD_HASH_LEN, NULL, 0); - wireguard_blake2s_update(&ctx, CONSTRUCTION, sizeof(CONSTRUCTION)); - wireguard_blake2s_final(&ctx, construction_hash); - // Pre-calculate initial handshake hash - uses construction_hash calculated above - wireguard_blake2s_init(&ctx, WIREGUARD_HASH_LEN, NULL, 0); - wireguard_blake2s_update(&ctx, construction_hash, sizeof(construction_hash)); - wireguard_blake2s_update(&ctx, IDENTIFIER, sizeof(IDENTIFIER)); - wireguard_blake2s_final(&ctx, identifier_hash); -} - -struct wireguard_peer *peer_alloc(struct wireguard_device *device) { - struct wireguard_peer *result = NULL; - struct wireguard_peer *tmp; - int x; - for (x=0; x < WIREGUARD_MAX_PEERS; x++) { - tmp = &device->peers[x]; - if (!tmp->valid) { - result = tmp; - break; - } - } - return result; -} - -struct wireguard_peer *peer_lookup_by_pubkey(struct wireguard_device *device, uint8_t *public_key) { - struct wireguard_peer *result = NULL; - struct wireguard_peer *tmp; - int x; - for (x=0; x < WIREGUARD_MAX_PEERS; x++) { - tmp = &device->peers[x]; - if (tmp->valid) { - if (memcmp(tmp->public_key, public_key, WIREGUARD_PUBLIC_KEY_LEN) == 0) { - result = tmp; - break; - } - } - } - return result; -} - -uint8_t wireguard_peer_index(struct wireguard_device *device, struct wireguard_peer *peer) { - uint8_t result = 0xFF; - uint8_t x; - for (x=0; x < WIREGUARD_MAX_PEERS; x++) { - if (peer == &device->peers[x]) { - result = x; - break; - } - } - return result; -} - -struct wireguard_peer *peer_lookup_by_peer_index(struct wireguard_device *device, uint8_t peer_index) { - struct wireguard_peer *result = NULL; - if (peer_index < WIREGUARD_MAX_PEERS) { - if (device->peers[peer_index].valid) { - result = &device->peers[peer_index]; - } - } - return result; -} - -struct wireguard_peer *peer_lookup_by_receiver(struct wireguard_device *device, uint32_t receiver) { - struct wireguard_peer *result = NULL; - struct wireguard_peer *tmp; - int x; - for (x=0; x < WIREGUARD_MAX_PEERS; x++) { - tmp = &device->peers[x]; - if (tmp->valid) { - if ((tmp->curr_keypair.valid && (tmp->curr_keypair.local_index == receiver)) || - (tmp->next_keypair.valid && (tmp->next_keypair.local_index == receiver)) || - (tmp->prev_keypair.valid && (tmp->prev_keypair.local_index == receiver)) - ) { - result = tmp; - break; - } - } - } - return result; -} - -struct wireguard_peer *peer_lookup_by_handshake(struct wireguard_device *device, uint32_t receiver) { - struct wireguard_peer *result = NULL; - struct wireguard_peer *tmp; - int x; - for (x=0; x < WIREGUARD_MAX_PEERS; x++) { - tmp = &device->peers[x]; - if (tmp->valid) { - if (tmp->handshake.valid && tmp->handshake.initiator && (tmp->handshake.local_index == receiver)) { - result = tmp; - break; - } - } - } - return result; -} - -bool wireguard_expired(uint32_t created_millis, uint32_t valid_seconds) { - uint32_t diff = wireguard_sys_now() - created_millis; - return (diff >= (valid_seconds * 1000)); -} - - -static void generate_cookie_secret(struct wireguard_device *device) { - wireguard_random_bytes(device->cookie_secret, WIREGUARD_HASH_LEN); - device->cookie_secret_millis = wireguard_sys_now(); -} - -static void generate_peer_cookie(struct wireguard_device *device, uint8_t *cookie, uint8_t *source_addr_port, size_t source_length) { - wireguard_blake2s_ctx ctx; - - if (wireguard_expired(device->cookie_secret_millis, COOKIE_SECRET_MAX_AGE)) { - // Generate new random bytes - generate_cookie_secret(device); - } - - // Mac(key, input) Keyed-Blake2s(key, input, 16), the keyed MAC variant of the BLAKE2s hash function, returning 16 bytes of output - wireguard_blake2s_init(&ctx, WIREGUARD_COOKIE_LEN, device->cookie_secret, WIREGUARD_HASH_LEN); - // 5.4.7 Under Load: Cookie Reply Message - // Mix in the IP address and port - have the IP layer pass this in as byte array to avoid using Lwip specific APIs in this module - if ((source_addr_port) && (source_length > 0)) { - wireguard_blake2s_update(&ctx, source_addr_port, source_length); - } - wireguard_blake2s_final(&ctx, cookie); -} - -static void wireguard_mac(uint8_t *dst, const void *message, size_t len, const uint8_t *key, size_t keylen) { - wireguard_blake2s(dst, WIREGUARD_COOKIE_LEN, key, keylen, message, len); -} - -static void wireguard_mac_key(uint8_t *key, const uint8_t *public_key, const uint8_t *label, size_t label_len) { - blake2s_ctx ctx; - blake2s_init(&ctx, WIREGUARD_SESSION_KEY_LEN, NULL, 0); - blake2s_update(&ctx, label, label_len); - blake2s_update(&ctx, public_key, WIREGUARD_PUBLIC_KEY_LEN); - blake2s_final(&ctx, key); -} - -static void wireguard_mix_hash(uint8_t *hash, const uint8_t *src, size_t src_len) { - wireguard_blake2s_ctx ctx; - wireguard_blake2s_init(&ctx, WIREGUARD_HASH_LEN, NULL, 0); - wireguard_blake2s_update(&ctx, hash, WIREGUARD_HASH_LEN); - wireguard_blake2s_update(&ctx, src, src_len); - wireguard_blake2s_final(&ctx, hash); -} - -static void wireguard_hmac(uint8_t *digest, const uint8_t *key, size_t key_len, const uint8_t *text, size_t text_len) { - // Adapted from appendix example in RFC2104 to use BLAKE2S instead of MD5 - https://tools.ietf.org/html/rfc2104 - wireguard_blake2s_ctx ctx; - uint8_t k_ipad[WIREGUARD_BLAKE2S_BLOCK_SIZE]; // inner padding - key XORd with ipad - uint8_t k_opad[WIREGUARD_BLAKE2S_BLOCK_SIZE]; // outer padding - key XORd with opad - - uint8_t tk[WIREGUARD_HASH_LEN]; - int i; - // if key is longer than BLAKE2S_BLOCK_SIZE bytes reset it to key=BLAKE2S(key) - if (key_len > WIREGUARD_BLAKE2S_BLOCK_SIZE) { - wireguard_blake2s_ctx tctx; - wireguard_blake2s_init(&tctx, WIREGUARD_HASH_LEN, NULL, 0); - wireguard_blake2s_update(&tctx, key, key_len); - wireguard_blake2s_final(&tctx, tk); - key = tk; - key_len = WIREGUARD_HASH_LEN; - } - - // the HMAC transform looks like: - // HASH(K XOR opad, HASH(K XOR ipad, text)) - // where K is an n byte key - // ipad is the byte 0x36 repeated BLAKE2S_BLOCK_SIZE times - // opad is the byte 0x5c repeated BLAKE2S_BLOCK_SIZE times - // and text is the data being protected - memset(k_ipad, 0, sizeof(k_ipad)); - memset(k_opad, 0, sizeof(k_opad)); - memcpy(k_ipad, key, key_len); - memcpy(k_opad, key, key_len); - - // XOR key with ipad and opad values - for (i=0; i < WIREGUARD_BLAKE2S_BLOCK_SIZE; i++) { - k_ipad[i] ^= 0x36; - k_opad[i] ^= 0x5c; - } - // perform inner HASH - wireguard_blake2s_init(&ctx, WIREGUARD_HASH_LEN, NULL, 0); // init context for 1st pass - wireguard_blake2s_update(&ctx, k_ipad, WIREGUARD_BLAKE2S_BLOCK_SIZE); // start with inner pad - wireguard_blake2s_update(&ctx, text, text_len); // then text of datagram - wireguard_blake2s_final(&ctx, digest); // finish up 1st pass - - // perform outer HASH - wireguard_blake2s_init(&ctx, WIREGUARD_HASH_LEN, NULL, 0); // init context for 2nd pass - wireguard_blake2s_update(&ctx, k_opad, WIREGUARD_BLAKE2S_BLOCK_SIZE); // start with outer pad - wireguard_blake2s_update(&ctx, digest, WIREGUARD_HASH_LEN); // then results of 1st hash - wireguard_blake2s_final(&ctx, digest); // finish up 2nd pass -} - -static void wireguard_kdf1(uint8_t *tau1, const uint8_t *chaining_key, const uint8_t *data, size_t data_len) { - uint8_t tau0[WIREGUARD_HASH_LEN]; - uint8_t output[WIREGUARD_HASH_LEN + 1]; - - // tau0 = Hmac(key, input) - wireguard_hmac(tau0, chaining_key, WIREGUARD_HASH_LEN, data, data_len); - // tau1 := Hmac(tau0, 0x1) - output[0] = 1; - wireguard_hmac(output, tau0, WIREGUARD_HASH_LEN, output, 1); - memcpy(tau1, output, WIREGUARD_HASH_LEN); - - // Wipe intermediates - crypto_zero(tau0, sizeof(tau0)); - crypto_zero(output, sizeof(output)); -} - -static void wireguard_kdf2(uint8_t *tau1, uint8_t *tau2, const uint8_t *chaining_key, const uint8_t *data, size_t data_len) { - uint8_t tau0[WIREGUARD_HASH_LEN]; - uint8_t output[WIREGUARD_HASH_LEN + 1]; - - // tau0 = Hmac(key, input) - wireguard_hmac(tau0, chaining_key, WIREGUARD_HASH_LEN, data, data_len); - // tau1 := Hmac(tau0, 0x1) - output[0] = 1; - wireguard_hmac(output, tau0, WIREGUARD_HASH_LEN, output, 1); - memcpy(tau1, output, WIREGUARD_HASH_LEN); - - // tau2 := Hmac(tau0,tau1 || 0x2) - output[WIREGUARD_HASH_LEN] = 2; - wireguard_hmac(output, tau0, WIREGUARD_HASH_LEN, output, WIREGUARD_HASH_LEN + 1); - memcpy(tau2, output, WIREGUARD_HASH_LEN); - - // Wipe intermediates - crypto_zero(tau0, sizeof(tau0)); - crypto_zero(output, sizeof(output)); -} - -static void wireguard_kdf3(uint8_t *tau1, uint8_t *tau2, uint8_t *tau3, const uint8_t *chaining_key, const uint8_t *data, size_t data_len) { - uint8_t tau0[WIREGUARD_HASH_LEN]; - uint8_t output[WIREGUARD_HASH_LEN + 1]; - - // tau0 = Hmac(key, input) - wireguard_hmac(tau0, chaining_key, WIREGUARD_HASH_LEN, data, data_len); - // tau1 := Hmac(tau0, 0x1) - output[0] = 1; - wireguard_hmac(output, tau0, WIREGUARD_HASH_LEN, output, 1); - memcpy(tau1, output, WIREGUARD_HASH_LEN); - - // tau2 := Hmac(tau0,tau1 || 0x2) - output[WIREGUARD_HASH_LEN] = 2; - wireguard_hmac(output, tau0, WIREGUARD_HASH_LEN, output, WIREGUARD_HASH_LEN + 1); - memcpy(tau2, output, WIREGUARD_HASH_LEN); - - // tau3 := Hmac(tau0,tau1,tau2 || 0x3) - output[WIREGUARD_HASH_LEN] = 3; - wireguard_hmac(output, tau0, WIREGUARD_HASH_LEN, output, WIREGUARD_HASH_LEN + 1); - memcpy(tau3, output, WIREGUARD_HASH_LEN); - - // Wipe intermediates - crypto_zero(tau0, sizeof(tau0)); - crypto_zero(output, sizeof(output)); -} - -bool wireguard_check_replay(struct wireguard_keypair *keypair, uint64_t seq) { - // Implementation of packet replay window - as per RFC2401 - // Adapted from code in Appendix C at https://tools.ietf.org/html/rfc2401 - uint32_t diff; - bool result = false; - size_t ReplayWindowSize = sizeof(keypair->replay_bitmap); // 32 bits - - if (seq != 0) { - if (seq > keypair->replay_counter) { - // new larger sequence number - diff = seq - keypair->replay_counter; - if (diff < ReplayWindowSize) { - // In window - keypair->replay_bitmap <<= diff; - // set bit for this packet - keypair->replay_bitmap |= 1; - } else { - // This packet has a "way larger" - keypair->replay_bitmap = 1; - } - keypair->replay_counter = seq; - // larger is good - result = true; - } else { - diff = keypair->replay_counter - seq; - if (diff < ReplayWindowSize) { - if (keypair->replay_bitmap & ((uint32_t)1 << diff)) { - // already seen - } else { - // mark as seen - keypair->replay_bitmap |= ((uint32_t)1 << diff); - // out of order but good - result = true; - } - } else { - // too old or wrapped - } - } - } else { - // first == 0 or wrapped - } - return result; -} - -struct wireguard_keypair *get_peer_keypair_for_idx(struct wireguard_peer *peer, uint32_t idx) { - if (peer->curr_keypair.valid && peer->curr_keypair.local_index == idx) { - return &peer->curr_keypair; - } else if (peer->next_keypair.valid && peer->next_keypair.local_index == idx) { - return &peer->next_keypair; - } else if (peer->prev_keypair.valid && peer->prev_keypair.local_index == idx) { - return &peer->prev_keypair; - } - return NULL; -} - -static uint32_t wireguard_generate_unique_index(struct wireguard_device *device) { - // We need a random 32-bit number but make sure it's not already been used in the context of this device - uint32_t result; - uint8_t buf[4]; - int x; - struct wireguard_peer *peer; - bool existing; - do { - do { - wireguard_random_bytes(buf, 4); - result = U8TO32_LITTLE(buf); - } while ((result == 0) || (result == 0xFFFFFFFF)); // Don't allow 0 or 0xFFFFFFFF as valid values - - existing = false; - for (x=0; x < WIREGUARD_MAX_PEERS; x++) { - peer = &device->peers[x]; - existing = (result == peer->curr_keypair.local_index) || - (result == peer->prev_keypair.local_index) || - (result == peer->next_keypair.local_index) || - (result == peer->handshake.local_index); - - } - } while (existing); - - return result; -} - -static void wireguard_clamp_private_key(uint8_t *key) { - key[0] &= 248; - key[31] = (key[31] & 127) | 64; -} - -static void wireguard_generate_private_key(uint8_t *key) { - wireguard_random_bytes(key, WIREGUARD_PRIVATE_KEY_LEN); - wireguard_clamp_private_key(key); -} - -static bool wireguard_generate_public_key(uint8_t *public_key, const uint8_t *private_key) { - static const uint8_t basepoint[WIREGUARD_PUBLIC_KEY_LEN] = { 9 }; - bool result = false; - if (memcmp(private_key, zero_key, WIREGUARD_PUBLIC_KEY_LEN) != 0) { - result = (wireguard_x25519(public_key, private_key, basepoint) == 0); - } - return result; -} - -bool wireguard_check_mac1(struct wireguard_device *device, const uint8_t *data, size_t len, const uint8_t *mac1) { - bool result = false; - uint8_t calculated[WIREGUARD_COOKIE_LEN]; - wireguard_mac(calculated, data, len, device->label_mac1_key, WIREGUARD_SESSION_KEY_LEN); - if (crypto_equal(calculated, mac1, WIREGUARD_COOKIE_LEN)) { - result = true; - } - return result; -} - -bool wireguard_check_mac2(struct wireguard_device *device, const uint8_t *data, size_t len, uint8_t *source_addr_port, size_t source_length, const uint8_t *mac2) { - bool result = false; - uint8_t cookie[WIREGUARD_COOKIE_LEN]; - uint8_t calculated[WIREGUARD_COOKIE_LEN]; - - generate_peer_cookie(device, cookie, source_addr_port, source_length); - - wireguard_mac(calculated, data, len, cookie, WIREGUARD_COOKIE_LEN); - if (crypto_equal(calculated, mac2, WIREGUARD_COOKIE_LEN)) { - result = true; - } - return result; -} - -void handshake_destroy(struct wireguard_handshake *handshake) { - crypto_zero(handshake->ephemeral_private, WIREGUARD_PUBLIC_KEY_LEN); - crypto_zero(handshake->remote_ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - crypto_zero(handshake->hash, WIREGUARD_HASH_LEN); - crypto_zero(handshake->chaining_key, WIREGUARD_HASH_LEN); - handshake->remote_index = 0; - handshake->local_index = 0; - handshake->valid = false; -} - -void keypair_destroy(struct wireguard_keypair *keypair) { - crypto_zero(keypair, sizeof(struct wireguard_keypair)); - keypair->valid = false; -} - -void keypair_update(struct wireguard_peer *peer, struct wireguard_keypair *received_keypair) { - bool key_is_next = (received_keypair == &peer->next_keypair); - if (key_is_next) { - peer->prev_keypair = peer->curr_keypair; - peer->curr_keypair = peer->next_keypair; - keypair_destroy(&peer->next_keypair); - } -} - -static void add_new_keypair(struct wireguard_peer *peer, struct wireguard_keypair new_keypair) { - if (new_keypair.initiator) { - if (peer->next_keypair.valid) { - peer->prev_keypair = peer->next_keypair; - keypair_destroy(&peer->next_keypair); - } else { - peer->prev_keypair = peer->curr_keypair; - } - peer->curr_keypair = new_keypair; - } else { - peer->next_keypair = new_keypair; - keypair_destroy(&peer->prev_keypair); - } -} - -void wireguard_start_session(struct wireguard_peer *peer, bool initiator) { - struct wireguard_handshake *handshake = &peer->handshake; - struct wireguard_keypair new_keypair; - - crypto_zero(&new_keypair, sizeof(struct wireguard_keypair)); - new_keypair.initiator = initiator; - new_keypair.local_index = handshake->local_index; - new_keypair.remote_index = handshake->remote_index; - - new_keypair.keypair_millis = wireguard_sys_now(); - new_keypair.sending_valid = true; - new_keypair.receiving_valid = true; - - // 5.4.5 Transport Data Key Derivation - // (Tsendi = Trecvr, Trecvi = Tsendr) := Kdf2(Ci = Cr,E) - if (new_keypair.initiator) { - wireguard_kdf2(new_keypair.sending_key, new_keypair.receiving_key, handshake->chaining_key, NULL, 0); - } else { - wireguard_kdf2(new_keypair.receiving_key, new_keypair.sending_key, handshake->chaining_key, NULL, 0); - } - - new_keypair.replay_bitmap = 0; - new_keypair.replay_counter = 0; - - new_keypair.last_tx = 0; - new_keypair.last_rx = 0; // No packets received yet - - new_keypair.valid = true; - - // Eprivi = Epubi = Eprivr = Epubr = Ci = Cr := E - crypto_zero(handshake->ephemeral_private, WIREGUARD_PUBLIC_KEY_LEN); - crypto_zero(handshake->remote_ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - crypto_zero(handshake->hash, WIREGUARD_HASH_LEN); - crypto_zero(handshake->chaining_key, WIREGUARD_HASH_LEN); - handshake->remote_index = 0; - handshake->local_index = 0; - handshake->valid = false; - - add_new_keypair(peer, new_keypair); -} - -uint8_t wireguard_get_message_type(const uint8_t *data, size_t len) { - uint8_t result = MESSAGE_INVALID; - if (len >= 4) { - if ((data[1] == 0) && (data[2] == 0) && (data[3] == 0)) { - switch (data[0]) { - case MESSAGE_HANDSHAKE_INITIATION: - if (len == sizeof(struct message_handshake_initiation)) { - result = MESSAGE_HANDSHAKE_INITIATION; - } - break; - case MESSAGE_HANDSHAKE_RESPONSE: - if (len == sizeof(struct message_handshake_response)) { - result = MESSAGE_HANDSHAKE_RESPONSE; - } - break; - case MESSAGE_COOKIE_REPLY: - if (len == sizeof(struct message_cookie_reply)) { - result = MESSAGE_COOKIE_REPLY; - } - break; - case MESSAGE_TRANSPORT_DATA: - if (len >= sizeof(struct message_transport_data) + WIREGUARD_AUTHTAG_LEN) { - result = MESSAGE_TRANSPORT_DATA; - } - break; - default: - break; - } - } - } - return result; -} - -struct wireguard_peer *wireguard_process_initiation_message(struct wireguard_device *device, struct message_handshake_initiation *msg) { - struct wireguard_peer *ret_peer = NULL; - struct wireguard_peer *peer = NULL; - struct wireguard_handshake *handshake; - uint8_t key[WIREGUARD_SESSION_KEY_LEN]; - uint8_t chaining_key[WIREGUARD_HASH_LEN]; - uint8_t hash[WIREGUARD_HASH_LEN]; - uint8_t s[WIREGUARD_PUBLIC_KEY_LEN]; - uint8_t e[WIREGUARD_PUBLIC_KEY_LEN]; - uint8_t t[WIREGUARD_TAI64N_LEN]; - uint8_t dh_calculation[WIREGUARD_PUBLIC_KEY_LEN]; - uint32_t now; - bool rate_limit; - bool replay; - - // We are the responder, other end is the initiator - - // Ci := Hash(Construction) (precalculated hash) - memcpy(chaining_key, construction_hash, WIREGUARD_HASH_LEN); - - // Hi := Hash(Ci || Identifier - memcpy(hash, identifier_hash, WIREGUARD_HASH_LEN); - - // Hi := Hash(Hi || Spubr) - wireguard_mix_hash(hash, device->public_key, WIREGUARD_PUBLIC_KEY_LEN); - - // Ci := Kdf1(Ci, Epubi) - wireguard_kdf1(chaining_key, chaining_key, msg->ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - - // msg.ephemeral := Epubi - memcpy(e, msg->ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - - // Hi := Hash(Hi || msg.ephemeral) - wireguard_mix_hash(hash, msg->ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - - // Calculate DH(Eprivi,Spubr) - wireguard_x25519(dh_calculation, device->private_key, e); - if (!crypto_equal(dh_calculation, zero_key, WIREGUARD_PUBLIC_KEY_LEN)) { - - // (Ci,k) := Kdf2(Ci,DH(Eprivi,Spubr)) - wireguard_kdf2(chaining_key, key, chaining_key, dh_calculation, WIREGUARD_PUBLIC_KEY_LEN); - - // msg.static := AEAD(k, 0, Spubi, Hi) - if (wireguard_aead_decrypt(s, msg->enc_static, sizeof(msg->enc_static), hash, WIREGUARD_HASH_LEN, 0, key)) { - // Hi := Hash(Hi || msg.static) - wireguard_mix_hash(hash, msg->enc_static, sizeof(msg->enc_static)); - - peer = peer_lookup_by_pubkey(device, s); - if (peer) { - handshake = &peer->handshake; - - // (Ci,k) := Kdf2(Ci,DH(Sprivi,Spubr)) - wireguard_kdf2(chaining_key, key, chaining_key, peer->public_key_dh, WIREGUARD_PUBLIC_KEY_LEN); - - // msg.timestamp := AEAD(k, 0, Timestamp(), Hi) - if (wireguard_aead_decrypt(t, msg->enc_timestamp, sizeof(msg->enc_timestamp), hash, WIREGUARD_HASH_LEN, 0, key)) { - // Hi := Hash(Hi || msg.timestamp) - wireguard_mix_hash(hash, msg->enc_timestamp, sizeof(msg->enc_timestamp)); - - now = wireguard_sys_now(); - - // Check that timestamp is increasing and we haven't had too many initiations (should only get one per peer every 5 seconds max?) - replay = (memcmp(t, peer->greatest_timestamp, WIREGUARD_TAI64N_LEN) <= 0); // tai64n is big endian so we can use memcmp to compare - rate_limit = (peer->last_initiation_rx - now) < (1000 / MAX_INITIATIONS_PER_SECOND); - - if (!replay && !rate_limit) { - // Success! Copy everything to peer - peer->last_initiation_rx = now; - if (memcmp(t, peer->greatest_timestamp, WIREGUARD_TAI64N_LEN) > 0) { - memcpy(peer->greatest_timestamp, t, WIREGUARD_TAI64N_LEN); - // TODO: Need to notify if the higher layers want to persist latest timestamp/nonce somewhere - } - memcpy(handshake->remote_ephemeral, e, WIREGUARD_PUBLIC_KEY_LEN); - memcpy(handshake->hash, hash, WIREGUARD_HASH_LEN); - memcpy(handshake->chaining_key, chaining_key, WIREGUARD_HASH_LEN); - handshake->remote_index = msg->sender; - handshake->valid = true; - handshake->initiator = false; - ret_peer = peer; - - } else { - // Ignore - } - } else { - // Failed to decrypt - } - } else { - // peer not found - } - } else { - // Failed to decrypt - } - } else { - // Bad X25519 - } - - crypto_zero(key, sizeof(key)); - crypto_zero(hash, sizeof(hash)); - crypto_zero(chaining_key, sizeof(chaining_key)); - crypto_zero(dh_calculation, sizeof(dh_calculation)); - - return ret_peer; -} - -bool wireguard_process_handshake_response(struct wireguard_device *device, struct wireguard_peer *peer, struct message_handshake_response *src) { - struct wireguard_handshake *handshake = &peer->handshake; - - bool result = false; - uint8_t key[WIREGUARD_SESSION_KEY_LEN]; - uint8_t hash[WIREGUARD_HASH_LEN]; - uint8_t chaining_key[WIREGUARD_HASH_LEN]; - uint8_t e[WIREGUARD_PUBLIC_KEY_LEN]; - uint8_t ephemeral_private[WIREGUARD_PUBLIC_KEY_LEN]; - uint8_t static_private[WIREGUARD_PUBLIC_KEY_LEN]; - uint8_t preshared_key[WIREGUARD_SESSION_KEY_LEN]; - uint8_t dh_calculation[WIREGUARD_PUBLIC_KEY_LEN]; - uint8_t tau[WIREGUARD_PUBLIC_KEY_LEN]; - - if (handshake->valid && handshake->initiator) { - - memcpy(hash, handshake->hash, WIREGUARD_HASH_LEN); - memcpy(chaining_key, handshake->chaining_key, WIREGUARD_HASH_LEN); - memcpy(ephemeral_private, handshake->ephemeral_private, WIREGUARD_PUBLIC_KEY_LEN); - memcpy(preshared_key, peer->preshared_key, WIREGUARD_SESSION_KEY_LEN); - - // (Eprivr, Epubr) := DH-Generate() - // Not required - - // Cr := Kdf1(Cr,Epubr) - wireguard_kdf1(chaining_key, chaining_key, src->ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - - // msg.ephemeral := Epubr - memcpy(e, src->ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - - // Hr := Hash(Hr || msg.ephemeral) - wireguard_mix_hash(hash, src->ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - - // Cr := Kdf1(Cr, DH(Eprivr, Epubi)) - // Calculate DH(Eprivr, Epubi) - wireguard_x25519(dh_calculation, ephemeral_private, e); - if (!crypto_equal(dh_calculation, zero_key, WIREGUARD_PUBLIC_KEY_LEN)) { - wireguard_kdf1(chaining_key, chaining_key, dh_calculation, WIREGUARD_PUBLIC_KEY_LEN); - - // Cr := Kdf1(Cr, DH(Eprivr, Spubi)) - // CalculateDH(Eprivr, Spubi) - wireguard_x25519(dh_calculation, device->private_key, e); - if (!crypto_equal(dh_calculation, zero_key, WIREGUARD_PUBLIC_KEY_LEN)) { - wireguard_kdf1(chaining_key, chaining_key, dh_calculation, WIREGUARD_PUBLIC_KEY_LEN); - - // (Cr, t, k) := Kdf3(Cr, Q) - wireguard_kdf3(chaining_key, tau, key, chaining_key, peer->preshared_key, WIREGUARD_SESSION_KEY_LEN); - - // Hr := Hash(Hr | t) - wireguard_mix_hash(hash, tau, WIREGUARD_HASH_LEN); - - // msg.empty := AEAD(k, 0, E, Hr) - if (wireguard_aead_decrypt(NULL, src->enc_empty, sizeof(src->enc_empty), hash, WIREGUARD_HASH_LEN, 0, key)) { - // Hr := Hash(Hr | msg.empty) - // Not required as discarded - - //Copy details to handshake - memcpy(handshake->remote_ephemeral, e, WIREGUARD_HASH_LEN); - memcpy(handshake->hash, hash, WIREGUARD_HASH_LEN); - memcpy(handshake->chaining_key, chaining_key, WIREGUARD_HASH_LEN); - handshake->remote_index = src->sender; - - result = true; - } else { - // Decrypt failed - } - - } else { - // X25519 fail - } - - } else { - // X25519 fail - } - - } - crypto_zero(key, sizeof(key)); - crypto_zero(hash, sizeof(hash)); - crypto_zero(chaining_key, sizeof(chaining_key)); - crypto_zero(ephemeral_private, sizeof(ephemeral_private)); - crypto_zero(static_private, sizeof(static_private)); - crypto_zero(preshared_key, sizeof(preshared_key)); - crypto_zero(tau, sizeof(tau)); - - return result; -} - -bool wireguard_process_cookie_message(struct wireguard_device *device, struct wireguard_peer *peer, struct message_cookie_reply *src) { - uint8_t cookie[WIREGUARD_COOKIE_LEN]; - bool result = false; - - if (peer->handshake_mac1_valid) { - - result = wireguard_xaead_decrypt(cookie, src->enc_cookie, sizeof(src->enc_cookie), peer->handshake_mac1, WIREGUARD_COOKIE_LEN, src->nonce, peer->label_cookie_key); - - if (result) { - // 5.4.7 Under Load: Cookie Reply Message - // Upon receiving this message, if it is valid, the only thing the recipient of this message should do is store the cookie along with the time at which it was received - memcpy(peer->cookie, cookie, WIREGUARD_COOKIE_LEN); - peer->cookie_millis = wireguard_sys_now(); - peer->handshake_mac1_valid = false; - } - } else { - // We didn't send any initiation packet so we shouldn't be getting a cookie reply! - } - return result; -} - -bool wireguard_create_handshake_initiation(struct wireguard_device *device, struct wireguard_peer *peer, struct message_handshake_initiation *dst) { - uint8_t timestamp[WIREGUARD_TAI64N_LEN]; - uint8_t key[WIREGUARD_SESSION_KEY_LEN]; - uint8_t dh_calculation[WIREGUARD_PUBLIC_KEY_LEN]; - bool result = false; - - struct wireguard_handshake *handshake = &peer->handshake; - - memset(dst, 0, sizeof(struct message_handshake_initiation)); - - // Ci := Hash(Construction) (precalculated hash) - memcpy(handshake->chaining_key, construction_hash, WIREGUARD_HASH_LEN); - - // Hi := Hash(Ci || Identifier) - memcpy(handshake->hash, identifier_hash, WIREGUARD_HASH_LEN); - - // Hi := Hash(Hi || Spubr) - wireguard_mix_hash(handshake->hash, peer->public_key, WIREGUARD_PUBLIC_KEY_LEN); - - // (Eprivi, Epubi) := DH-Generate() - wireguard_generate_private_key(handshake->ephemeral_private); - if (wireguard_generate_public_key(dst->ephemeral, handshake->ephemeral_private)) { - - // Ci := Kdf1(Ci, Epubi) - wireguard_kdf1(handshake->chaining_key, handshake->chaining_key, dst->ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - - // msg.ephemeral := Epubi - // Done above - public keys is calculated into dst->ephemeral - - // Hi := Hash(Hi || msg.ephemeral) - wireguard_mix_hash(handshake->hash, dst->ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - - // Calculate DH(Eprivi,Spubr) - wireguard_x25519(dh_calculation, handshake->ephemeral_private, peer->public_key); - if (!crypto_equal(dh_calculation, zero_key, WIREGUARD_PUBLIC_KEY_LEN)) { - - // (Ci,k) := Kdf2(Ci,DH(Eprivi,Spubr)) - wireguard_kdf2(handshake->chaining_key, key, handshake->chaining_key, dh_calculation, WIREGUARD_PUBLIC_KEY_LEN); - - // msg.static := AEAD(k,0,Spubi, Hi) - wireguard_aead_encrypt(dst->enc_static, device->public_key, WIREGUARD_PUBLIC_KEY_LEN, handshake->hash, WIREGUARD_HASH_LEN, 0, key); - - // Hi := Hash(Hi || msg.static) - wireguard_mix_hash(handshake->hash, dst->enc_static, sizeof(dst->enc_static)); - - // (Ci,k) := Kdf2(Ci,DH(Sprivi,Spubr)) - // note DH(Sprivi,Spubr) is precomputed per peer - wireguard_kdf2(handshake->chaining_key, key, handshake->chaining_key, peer->public_key_dh, WIREGUARD_PUBLIC_KEY_LEN); - - // msg.timestamp := AEAD(k, 0, Timestamp(), Hi) - wireguard_tai64n_now(timestamp); - wireguard_aead_encrypt(dst->enc_timestamp, timestamp, WIREGUARD_TAI64N_LEN, handshake->hash, WIREGUARD_HASH_LEN, 0, key); - - // Hi := Hash(Hi || msg.timestamp) - wireguard_mix_hash(handshake->hash, dst->enc_timestamp, sizeof(dst->enc_timestamp)); - - dst->type = MESSAGE_HANDSHAKE_INITIATION; - dst->sender = wireguard_generate_unique_index(device); - - handshake->valid = true; - handshake->initiator = true; - handshake->local_index = dst->sender; - - result = true; - } - } - - if (result) { - // 5.4.4 Cookie MACs - // msg.mac1 := Mac(Hash(Label-Mac1 || Spubm' ), msgA) - // The value Hash(Label-Mac1 || Spubm' ) above can be pre-computed - wireguard_mac(dst->mac1, dst, (sizeof(struct message_handshake_initiation)-(2*WIREGUARD_COOKIE_LEN)), peer->label_mac1_key, WIREGUARD_SESSION_KEY_LEN); - - // if Lm = E or Lm ≥ 120: - if ((peer->cookie_millis == 0) || wireguard_expired(peer->cookie_millis, COOKIE_SECRET_MAX_AGE)) { - // msg.mac2 := 0 - crypto_zero(dst->mac2, WIREGUARD_COOKIE_LEN); - } else { - // msg.mac2 := Mac(Lm, msgB) - wireguard_mac(dst->mac2, dst, (sizeof(struct message_handshake_initiation)-(WIREGUARD_COOKIE_LEN)), peer->cookie, WIREGUARD_COOKIE_LEN); - - } - } - - crypto_zero(key, sizeof(key)); - crypto_zero(dh_calculation, sizeof(dh_calculation)); - return result; -} - -bool wireguard_create_handshake_response(struct wireguard_device *device, struct wireguard_peer *peer, struct message_handshake_response *dst) { - struct wireguard_handshake *handshake = &peer->handshake; - uint8_t key[WIREGUARD_SESSION_KEY_LEN]; - uint8_t dh_calculation[WIREGUARD_PUBLIC_KEY_LEN]; - uint8_t tau[WIREGUARD_HASH_LEN]; - bool result = false; - - memset(dst, 0, sizeof(struct message_handshake_response)); - - if (handshake->valid && !handshake->initiator) { - - // (Eprivr, Epubr) := DH-Generate() - wireguard_generate_private_key(handshake->ephemeral_private); - if (wireguard_generate_public_key(dst->ephemeral, handshake->ephemeral_private)) { - - // Cr := Kdf1(Cr,Epubr) - wireguard_kdf1(handshake->chaining_key, handshake->chaining_key, dst->ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - - // msg.ephemeral := Epubr - // Copied above when generated - - // Hr := Hash(Hr || msg.ephemeral) - wireguard_mix_hash(handshake->hash, dst->ephemeral, WIREGUARD_PUBLIC_KEY_LEN); - - // Cr := Kdf1(Cr, DH(Eprivr, Epubi)) - // Calculate DH(Eprivi,Spubr) - wireguard_x25519(dh_calculation, handshake->ephemeral_private, handshake->remote_ephemeral); - if (!crypto_equal(dh_calculation, zero_key, WIREGUARD_PUBLIC_KEY_LEN)) { - wireguard_kdf1(handshake->chaining_key, handshake->chaining_key, dh_calculation, WIREGUARD_PUBLIC_KEY_LEN); - - // Cr := Kdf1(Cr, DH(Eprivr, Spubi)) - // Calculate DH(Eprivi,Spubr) - wireguard_x25519(dh_calculation, handshake->ephemeral_private, peer->public_key); - if (!crypto_equal(dh_calculation, zero_key, WIREGUARD_PUBLIC_KEY_LEN)) { - wireguard_kdf1(handshake->chaining_key, handshake->chaining_key, dh_calculation, WIREGUARD_PUBLIC_KEY_LEN); - - // (Cr, t, k) := Kdf3(Cr, Q) - wireguard_kdf3(handshake->chaining_key, tau, key, handshake->chaining_key, peer->preshared_key, WIREGUARD_SESSION_KEY_LEN); - - // Hr := Hash(Hr | t) - wireguard_mix_hash(handshake->hash, tau, WIREGUARD_HASH_LEN); - - // msg.empty := AEAD(k, 0, E, Hr) - wireguard_aead_encrypt(dst->enc_empty, NULL, 0, handshake->hash, WIREGUARD_HASH_LEN, 0, key); - - // Hr := Hash(Hr | msg.empty) - wireguard_mix_hash(handshake->hash, dst->enc_empty, sizeof(dst->enc_empty)); - - dst->type = MESSAGE_HANDSHAKE_RESPONSE; - dst->receiver = handshake->remote_index; - dst->sender = wireguard_generate_unique_index(device); - // Update handshake object too - handshake->local_index = dst->sender; - - result = true; - } else { - // Bad x25519 - } - } else { - // Bad x25519 - } - - } else { - // Failed to generate DH - } - } - - if (result) { - // 5.4.4 Cookie MACs - // msg.mac1 := Mac(Hash(Label-Mac1 || Spubm' ), msgA) - // The value Hash(Label-Mac1 || Spubm' ) above can be pre-computed - wireguard_mac(dst->mac1, dst, (sizeof(struct message_handshake_response)-(2*WIREGUARD_COOKIE_LEN)), peer->label_mac1_key, WIREGUARD_SESSION_KEY_LEN); - - // if Lm = E or Lm ≥ 120: - if ((peer->cookie_millis == 0) || wireguard_expired(peer->cookie_millis, COOKIE_SECRET_MAX_AGE)) { - // msg.mac2 := 0 - crypto_zero(dst->mac2, WIREGUARD_COOKIE_LEN); - } else { - // msg.mac2 := Mac(Lm, msgB) - wireguard_mac(dst->mac2, dst, (sizeof(struct message_handshake_response)-(WIREGUARD_COOKIE_LEN)), peer->cookie, WIREGUARD_COOKIE_LEN); - } - } - - crypto_zero(key, sizeof(key)); - crypto_zero(dh_calculation, sizeof(dh_calculation)); - crypto_zero(tau, sizeof(tau)); - return result; -} - -void wireguard_create_cookie_reply(struct wireguard_device *device, struct message_cookie_reply *dst, const uint8_t *mac1, uint32_t index, uint8_t *source_addr_port, size_t source_length) { - uint8_t cookie[WIREGUARD_COOKIE_LEN]; - crypto_zero(dst, sizeof(struct message_cookie_reply)); - dst->type = MESSAGE_COOKIE_REPLY; - dst->receiver = index; - wireguard_random_bytes(dst->nonce, COOKIE_NONCE_LEN); - generate_peer_cookie(device, cookie, source_addr_port, source_length); - wireguard_xaead_encrypt(dst->enc_cookie, cookie, WIREGUARD_COOKIE_LEN, mac1, WIREGUARD_COOKIE_LEN, dst->nonce, device->label_cookie_key); -} - -bool wireguard_peer_init(struct wireguard_device *device, struct wireguard_peer *peer, const uint8_t *public_key, const uint8_t *preshared_key) { - // Clear out structure - memset(peer, 0, sizeof(struct wireguard_peer)); - - if (device->valid) { - // Copy across the public key into our peer structure - memcpy(peer->public_key, public_key, WIREGUARD_PUBLIC_KEY_LEN); - if (preshared_key) { - memcpy(peer->preshared_key, preshared_key, WIREGUARD_SESSION_KEY_LEN); - } else { - crypto_zero(peer->preshared_key, WIREGUARD_SESSION_KEY_LEN); - } - - if (wireguard_x25519(peer->public_key_dh, device->private_key, peer->public_key) == 0) { - // Zero out handshake - memset(&peer->handshake, 0, sizeof(struct wireguard_handshake)); - peer->handshake.valid = false; - - // Zero out any cookie info - we haven't received one yet - peer->cookie_millis = 0; - memset(&peer->cookie, 0, WIREGUARD_COOKIE_LEN); - - // Precompute keys to deal with mac1/2 calculation - wireguard_mac_key(peer->label_mac1_key, peer->public_key, LABEL_MAC1, sizeof(LABEL_MAC1)); - wireguard_mac_key(peer->label_cookie_key, peer->public_key, LABEL_COOKIE, sizeof(LABEL_COOKIE)); - - peer->valid = true; - } else { - crypto_zero(peer->public_key_dh, WIREGUARD_PUBLIC_KEY_LEN); - } - } - return peer->valid; -} - -bool wireguard_device_init(struct wireguard_device *device, const uint8_t *private_key) { - // Set the private key and calculate public key from it - memcpy(device->private_key, private_key, WIREGUARD_PRIVATE_KEY_LEN); - // Ensure private key is correctly "clamped" - wireguard_clamp_private_key(device->private_key); - device->valid = wireguard_generate_public_key(device->public_key, private_key); - if (device->valid) { - generate_cookie_secret(device); - // 5.4.4 Cookie MACs - The value Hash(Label-Mac1 || Spubm' ) above can be pre-computed. - wireguard_mac_key(device->label_mac1_key, device->public_key, LABEL_MAC1, sizeof(LABEL_MAC1)); - // 5.4.7 Under Load: Cookie Reply Message - The value Hash(Label-Cookie || Spubm) above can be pre-computed. - wireguard_mac_key(device->label_cookie_key, device->public_key, LABEL_COOKIE, sizeof(LABEL_COOKIE)); - - } else { - crypto_zero(device->private_key, WIREGUARD_PRIVATE_KEY_LEN); - } - return device->valid; -} - -void wireguard_encrypt_packet(uint8_t *dst, const uint8_t *src, size_t src_len, struct wireguard_keypair *keypair) { - wireguard_aead_encrypt(dst, src, src_len, NULL, 0, keypair->sending_counter, keypair->sending_key); - keypair->sending_counter++; -} - -bool wireguard_decrypt_packet(uint8_t *dst, const uint8_t *src, size_t src_len, uint64_t counter, struct wireguard_keypair *keypair) { - return wireguard_aead_decrypt(dst, src, src_len, NULL, 0, counter, keypair->receiving_key); -} - -bool wireguard_base64_decode(const char *str, uint8_t *out, size_t *outlen) { - uint32_t accum = 0; // We accumulate upto four blocks of 6 bits into this to form 3 bytes output - uint8_t char_count = 0; // How many characters have we processed in this block - int byte_count = 3; // How many bytes are we expecting in current 4 char block - int len = 0; // result length in bytes - bool result = true; - uint8_t bits; - char c; - char *ptr; - int x; - size_t inlen; - - if (!str) { - return false; - } - - inlen = strlen(str); - - for (x = 0; x < inlen; x++) { - c = str[x]; - if (c == '=') { - // This is '=' padding at end of string - decrease the number of bytes to write - bits = 0; - byte_count--; - if (byte_count < 0) { - // Too much padding! - result = false; - break; - } - } else { - if (byte_count != 3) { - // Padding only allowed at end - this is a valid byte and we have already seen padding - result = false; - break; - } - ptr = strchr(base64_lookup, c); - if (ptr) { - bits = (uint8_t)((ptr - base64_lookup) & 0x3F); - } else { - // invalid character in input string - result = false; - break; - } - } - - accum = (accum << 6) | bits; - char_count++; - - if (char_count == 4) { - if (len + byte_count > *outlen) { - // Output buffer overflow - result = false; - break; - } - out[len++] = (uint8_t)((accum >> 16) & 0xFF); - if (byte_count > 1) { - out[len++] = (uint8_t)((accum >> 8) & 0xFF); - } - if (byte_count > 2) { - out[len++] = (uint8_t)(accum & 0xFF); - } - char_count = 0; - accum = 0; - } - } - if (char_count != 0) { - // We require padding to multiple of 3 input length - bytes are missing from output! - result = false; - } - *outlen = len; - return result; -} - -bool wireguard_base64_encode(const uint8_t *in, size_t inlen, char *out, size_t *outlen) { - bool result = false; - int read_offset = 0; - int write_offset = 0; - uint8_t byte1, byte2, byte3; - uint32_t tmp; - char c; - size_t len = 4 * ((inlen + 2) / 3); - int padding = (3 - (inlen % 3)); - if (padding > 2) padding = 0; - if (*outlen > len) { - - while (read_offset < inlen) { - // Read three bytes - byte1 = (read_offset < inlen) ? in[read_offset++] : 0; - byte2 = (read_offset < inlen) ? in[read_offset++] : 0; - byte3 = (read_offset < inlen) ? in[read_offset++] : 0; - // Turn into 24 bit intermediate - tmp = (byte1 << 16) | (byte2 << 8) | (byte3); - // Write out 4 characters each representing 6 bits of input - out[write_offset++] = base64_lookup[(tmp >> 18) & 0x3F]; - out[write_offset++] = base64_lookup[(tmp >> 12) & 0x3F]; - c = (write_offset < len - padding) ? base64_lookup[(tmp >> 6) & 0x3F] : '='; - out[write_offset++] = c; - c = (write_offset < len - padding) ? base64_lookup[(tmp) & 0x3F] : '='; - out[write_offset++] = c; - } - out[len] = '\0'; - *outlen = len; - result = true; - } else { - // Not enough data to put in base64 and null terminate - } - return result; -} diff --git a/lib/WireGuard-ESP32/src/wireguard.h b/lib/WireGuard-ESP32/src/wireguard.h deleted file mode 100644 index 961792a..0000000 --- a/lib/WireGuard-ESP32/src/wireguard.h +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Ported to ESP32 Arduino by Kenta Ida (fuga@fugafuga.org) - * The original license is below: - * Copyright (c) 2021 Daniel Hope (www.floorsense.nz) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of "Floorsense Ltd", "Agile Workspace Ltd" nor the names of - * its contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Author: Daniel Hope - */ - -#ifndef _WIREGUARD_H_ -#define _WIREGUARD_H_ - -#include -#include -#include - -// Note: these are only required for definitions in device/peer for netif, udp_pcb, ip_addr_t and u16_t -#include "lwip/netif.h" -#include "lwip/udp.h" -#include "lwip/ip_addr.h" -#include "lwip/arch.h" - -// Platform-specific functions that need to be implemented per-platform -#include "wireguard-platform.h" - -// tai64n contains 64-bit seconds and 32-bit nano offset (12 bytes) -#define WIREGUARD_TAI64N_LEN (12) -// Auth algorithm is chacha20pol1305 which is 128bit (16 byte) authenticator -#define WIREGUARD_AUTHTAG_LEN (16) -// Hash algorithm is blake2s which makes 32 byte hashes -#define WIREGUARD_HASH_LEN (32) -// Public key algo is curve22519 which uses 32 byte keys -#define WIREGUARD_PUBLIC_KEY_LEN (32) -// Public key algo is curve22519 which uses 32 byte keys -#define WIREGUARD_PRIVATE_KEY_LEN (32) -// Symmetric session keys are chacha20/poly1305 which uses 32 byte keys -#define WIREGUARD_SESSION_KEY_LEN (32) - -// Timers / Limits -#define WIREGUARD_COOKIE_LEN (16) -#define COOKIE_SECRET_MAX_AGE (2 * 60) -#define COOKIE_NONCE_LEN (24) - -#define REKEY_AFTER_MESSAGES (1ULL << 60) -#define REJECT_AFTER_MESSAGES (0xFFFFFFFFFFFFFFFFULL - (1ULL << 13)) -#define REKEY_AFTER_TIME (120) -#define REJECT_AFTER_TIME (180) -#define REKEY_TIMEOUT (5) -#define KEEPALIVE_TIMEOUT (10) - -struct wireguard_keypair { - bool valid; - bool initiator; // Did we initiate this session (send the initiation packet rather than sending the response packet) - uint32_t keypair_millis; - - uint8_t sending_key[WIREGUARD_SESSION_KEY_LEN]; - bool sending_valid; - uint64_t sending_counter; - - uint8_t receiving_key[WIREGUARD_SESSION_KEY_LEN]; - bool receiving_valid; - - uint32_t last_tx; - uint32_t last_rx; - - uint32_t replay_bitmap; - uint64_t replay_counter; - - uint32_t local_index; // This is the index we generated for our end - uint32_t remote_index; // This is the index on the other end -}; - -struct wireguard_handshake { - bool valid; - bool initiator; - uint32_t local_index; - uint32_t remote_index; - uint8_t ephemeral_private[WIREGUARD_PRIVATE_KEY_LEN]; - uint8_t remote_ephemeral[WIREGUARD_PUBLIC_KEY_LEN]; - uint8_t hash[WIREGUARD_HASH_LEN]; - uint8_t chaining_key[WIREGUARD_HASH_LEN]; -}; - -struct wireguard_allowed_ip { - bool valid; - ip_addr_t ip; - ip_addr_t mask; -}; - -struct wireguard_peer { - bool valid; // Is this peer initialised? - bool active; // Should we be actively trying to connect? - - // This is the configured IP of the peer (endpoint) - ip_addr_t connect_ip; - u16_t connect_port; - // This is the latest received IP/port - ip_addr_t ip; - u16_t port; - // keep-alive interval in seconds, 0 is disable - uint16_t keepalive_interval; - - struct wireguard_allowed_ip allowed_source_ips[WIREGUARD_MAX_SRC_IPS]; - - uint8_t public_key[WIREGUARD_PUBLIC_KEY_LEN]; - uint8_t preshared_key[WIREGUARD_SESSION_KEY_LEN]; - - // Precomputed DH(Sprivi,Spubr) with device private key, and peer public key - uint8_t public_key_dh[WIREGUARD_PUBLIC_KEY_LEN]; - - // Session keypairs - struct wireguard_keypair curr_keypair; - struct wireguard_keypair prev_keypair; - struct wireguard_keypair next_keypair; - - // 5.1 Silence is a Virtue: The responder keeps track of the greatest timestamp received per peer - uint8_t greatest_timestamp[WIREGUARD_TAI64N_LEN]; - - // The active handshake that is happening - struct wireguard_handshake handshake; - - // Decrypted cookie from the responder - uint32_t cookie_millis; - uint8_t cookie[WIREGUARD_COOKIE_LEN]; - - // The latest mac1 we sent with initiation - bool handshake_mac1_valid; - uint8_t handshake_mac1[WIREGUARD_COOKIE_LEN]; - - // Precomputed keys for use in mac validation - uint8_t label_cookie_key[WIREGUARD_SESSION_KEY_LEN]; - uint8_t label_mac1_key[WIREGUARD_SESSION_KEY_LEN]; - - // The last time we received a valid initiation message - uint32_t last_initiation_rx; - // The last time we sent an initiation message to this peer - uint32_t last_initiation_tx; - - // last_tx and last_rx of data packets - uint32_t last_tx; - uint32_t last_rx; - - // We set this flag on RX/TX of packets if we think that we should initiate a new handshake - bool send_handshake; -}; - -struct wireguard_device { - // Maybe have a "Device private" member to abstract these? - struct netif *netif; - struct udp_pcb *udp_pcb; - - struct netif *underlying_netif; - - uint8_t public_key[WIREGUARD_PUBLIC_KEY_LEN]; - uint8_t private_key[WIREGUARD_PRIVATE_KEY_LEN]; - - uint8_t cookie_secret[WIREGUARD_HASH_LEN]; - uint32_t cookie_secret_millis; - - // Precalculated - uint8_t label_cookie_key[WIREGUARD_SESSION_KEY_LEN]; - uint8_t label_mac1_key[WIREGUARD_SESSION_KEY_LEN]; - - // List of peers associated with this device - struct wireguard_peer peers[WIREGUARD_MAX_PEERS]; - - bool valid; -}; - -#define MESSAGE_INVALID 0 -#define MESSAGE_HANDSHAKE_INITIATION 1 -#define MESSAGE_HANDSHAKE_RESPONSE 2 -#define MESSAGE_COOKIE_REPLY 3 -#define MESSAGE_TRANSPORT_DATA 4 - - -// 5.4.2 First Message: Initiator to Responder -struct message_handshake_initiation { - uint8_t type; - uint8_t reserved[3]; - uint32_t sender; - uint8_t ephemeral[32]; - uint8_t enc_static[32 + WIREGUARD_AUTHTAG_LEN]; - uint8_t enc_timestamp[WIREGUARD_TAI64N_LEN + WIREGUARD_AUTHTAG_LEN]; - uint8_t mac1[WIREGUARD_COOKIE_LEN]; - uint8_t mac2[WIREGUARD_COOKIE_LEN]; -} __attribute__ ((__packed__)); - -// 5.4.3 Second Message: Responder to Initiator -struct message_handshake_response { - uint8_t type; - uint8_t reserved[3]; - uint32_t sender; - uint32_t receiver; - uint8_t ephemeral[32]; - uint8_t enc_empty[0 + WIREGUARD_AUTHTAG_LEN]; - uint8_t mac1[WIREGUARD_COOKIE_LEN]; - uint8_t mac2[WIREGUARD_COOKIE_LEN]; -} __attribute__ ((__packed__)); - -// 5.4.7 Under Load: Cookie Reply Message -struct message_cookie_reply { - uint8_t type; - uint8_t reserved[3]; - uint32_t receiver; - uint8_t nonce[COOKIE_NONCE_LEN]; - uint8_t enc_cookie[WIREGUARD_COOKIE_LEN + WIREGUARD_AUTHTAG_LEN]; -} __attribute__ ((__packed__)); - -// 5.4.6 Subsequent Messages: Transport Data Messages -struct message_transport_data { - uint8_t type; - uint8_t reserved[3]; - uint32_t receiver; - uint8_t counter[8]; - // Followed by encrypted data - uint8_t enc_packet[]; -} __attribute__ ((__packed__)); - -// Initialise the WireGuard system - need to call this before anything else -void wireguard_init(); -bool wireguard_device_init(struct wireguard_device *device, const uint8_t *private_key); -bool wireguard_peer_init(struct wireguard_device *device, struct wireguard_peer *peer, const uint8_t *public_key, const uint8_t *preshared_key); - -struct wireguard_peer *peer_alloc(struct wireguard_device *device); -uint8_t wireguard_peer_index(struct wireguard_device *device, struct wireguard_peer *peer); -struct wireguard_peer *peer_lookup_by_pubkey(struct wireguard_device *device, uint8_t *public_key); -struct wireguard_peer *peer_lookup_by_peer_index(struct wireguard_device *device, uint8_t peer_index); -struct wireguard_peer *peer_lookup_by_receiver(struct wireguard_device *device, uint32_t receiver); -struct wireguard_peer *peer_lookup_by_handshake(struct wireguard_device *device, uint32_t receiver); - -void wireguard_start_session(struct wireguard_peer *peer, bool initiator); - -void keypair_update(struct wireguard_peer *peer, struct wireguard_keypair *received_keypair); -void keypair_destroy(struct wireguard_keypair *keypair); - -struct wireguard_keypair *get_peer_keypair_for_idx(struct wireguard_peer *peer, uint32_t idx); -bool wireguard_check_replay(struct wireguard_keypair *keypair, uint64_t seq); - -uint8_t wireguard_get_message_type(const uint8_t *data, size_t len); - -struct wireguard_peer *wireguard_process_initiation_message(struct wireguard_device *device, struct message_handshake_initiation *msg); -bool wireguard_process_handshake_response(struct wireguard_device *device, struct wireguard_peer *peer, struct message_handshake_response *src); -bool wireguard_process_cookie_message(struct wireguard_device *device, struct wireguard_peer *peer, struct message_cookie_reply *src); - -bool wireguard_create_handshake_initiation(struct wireguard_device *device, struct wireguard_peer *peer, struct message_handshake_initiation *dst); -bool wireguard_create_handshake_response(struct wireguard_device *device, struct wireguard_peer *peer, struct message_handshake_response *dst); -void wireguard_create_cookie_reply(struct wireguard_device *device, struct message_cookie_reply *dst, const uint8_t *mac1, uint32_t index, uint8_t *source_addr_port, size_t source_length); - - -bool wireguard_check_mac1(struct wireguard_device *device, const uint8_t *data, size_t len, const uint8_t *mac1); -bool wireguard_check_mac2(struct wireguard_device *device, const uint8_t *data, size_t len, uint8_t *source_addr_port, size_t source_length, const uint8_t *mac2); - -bool wireguard_expired(uint32_t created_millis, uint32_t valid_seconds); - -void wireguard_encrypt_packet(uint8_t *dst, const uint8_t *src, size_t src_len, struct wireguard_keypair *keypair); -bool wireguard_decrypt_packet(uint8_t *dst, const uint8_t *src, size_t src_len, uint64_t counter, struct wireguard_keypair *keypair); - -bool wireguard_base64_decode(const char *str, uint8_t *out, size_t *outlen); -bool wireguard_base64_encode(const uint8_t *in, size_t inlen, char *out, size_t *outlen); - -#endif /* _WIREGUARD_H_ */ diff --git a/lib/WireGuard-ESP32/src/wireguardif.c b/lib/WireGuard-ESP32/src/wireguardif.c deleted file mode 100644 index 10ec89e..0000000 --- a/lib/WireGuard-ESP32/src/wireguardif.c +++ /dev/null @@ -1,1034 +0,0 @@ -/* - * Ported to ESP32 Arduino by Kenta Ida (fuga@fugafuga.org) - * The original license is below: - * - * Copyright (c) 2021 Daniel Hope (www.floorsense.nz) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of "Floorsense Ltd", "Agile Workspace Ltd" nor the names of - * its contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Author: Daniel Hope - */ - -#include "wireguardif.h" - -#include -#include - -#include "lwip/netif.h" -#include "lwip/ip.h" -#include "lwip/udp.h" -#include "lwip/mem.h" -#include "lwip/sys.h" -#include "lwip/timeouts.h" - -#include "wireguard.h" -#include "crypto.h" -#include "esp_log.h" -//#include "tcpip_adapter.h" -#include "esp_netif.h" - -#include "esp32-hal-log.h" - -#define WIREGUARDIF_TIMER_MSECS 400 - -#define TAG "[WireGuard] " - -static void update_peer_addr(struct wireguard_peer *peer, const ip_addr_t *addr, u16_t port) { - peer->ip = *addr; - peer->port = port; -} - -static struct wireguard_peer *peer_lookup_by_allowed_ip(struct wireguard_device *device, const ip_addr_t *ipaddr) { - struct wireguard_peer *result = NULL; - struct wireguard_peer *tmp; - int x; - int y; - for (x=0; (!result) && (x < WIREGUARD_MAX_PEERS); x++) { - tmp = &device->peers[x]; - if (tmp->valid) { - for (y=0; y < WIREGUARD_MAX_SRC_IPS; y++) { - if ((tmp->allowed_source_ips[y].valid) && ip_addr_netcmp(ipaddr, &tmp->allowed_source_ips[y].ip, ip_2_ip4(&tmp->allowed_source_ips[y].mask))) { - result = tmp; - break; - } - } - } - } - return result; -} - -static bool wireguardif_can_send_initiation(struct wireguard_peer *peer) { - return ((peer->last_initiation_tx == 0) || (wireguard_expired(peer->last_initiation_tx, REKEY_TIMEOUT))); -} - -static err_t wireguardif_peer_output(struct netif *netif, struct pbuf *q, struct wireguard_peer *peer) { - struct wireguard_device *device = (struct wireguard_device *)netif->state; - // Send to last know port, not the connect port - //TODO: Support DSCP and ECN - lwip requires this set on PCB globally, not per packet - return udp_sendto_if(device->udp_pcb, q, &peer->ip, peer->port, device->underlying_netif); -} - -static err_t wireguardif_device_output(struct wireguard_device *device, struct pbuf *q, const ip_addr_t *ipaddr, u16_t port) { - return udp_sendto_if(device->udp_pcb, q, ipaddr, port, device->underlying_netif); -} - -static err_t wireguardif_output_to_peer(struct netif *netif, struct pbuf *q, const ip_addr_t *ipaddr, struct wireguard_peer *peer) { - // The LWIP IP layer wants to send an IP packet out over the interface - we need to encrypt and send it to the peer - struct message_transport_data *hdr; - struct pbuf *pbuf; - err_t result; - size_t unpadded_len; - size_t padded_len; - size_t header_len = 16; - uint8_t *dst; - uint32_t now; - struct wireguard_keypair *keypair = &peer->curr_keypair; - - // Note: We may not be able to use the current keypair if we haven't received data, may need to resort to using previous keypair - if (keypair->valid && (!keypair->initiator) && (keypair->last_rx == 0)) { - keypair = &peer->prev_keypair; - } - - if (keypair->valid && (keypair->initiator || keypair->last_rx != 0)) { - - if ( - !wireguard_expired(keypair->keypair_millis, REJECT_AFTER_TIME) && - (keypair->sending_counter < REJECT_AFTER_MESSAGES) - ) { - - // Calculate the outgoing packet size - round up to next 16 bytes, add 16 bytes for header - if (q) { - // This is actual transport data - unpadded_len = q->tot_len; - } else { - // This is a keep-alive - unpadded_len = 0; - } - padded_len = (unpadded_len + 15) & 0xFFFFFFF0; // Round up to next 16 byte boundary - - // The buffer needs to be allocated from "transport" pool to leave room for LwIP generated IP headers - // The IP packet consists of 16 byte header (struct message_transport_data), data padded upto 16 byte boundary + encrypted auth tag (16 bytes) - pbuf = pbuf_alloc(PBUF_TRANSPORT, header_len + padded_len + WIREGUARD_AUTHTAG_LEN, PBUF_RAM); - if (pbuf) { - log_v(TAG "preparing transport data..."); - // Note: allocating pbuf from RAM above guarantees that the pbuf is in one section and not chained - // - i.e payload points to the contiguous memory region - memset(pbuf->payload, 0, pbuf->tot_len); - - hdr = (struct message_transport_data *)pbuf->payload; - - hdr->type = MESSAGE_TRANSPORT_DATA; - hdr->receiver = keypair->remote_index; - // Alignment required... pbuf_alloc has probably aligned data, but want to be sure - U64TO8_LITTLE(hdr->counter, keypair->sending_counter); - - // Copy the encrypted (padded) data to the output packet - chacha20poly1305_encrypt() can encrypt data in-place which avoids call to mem_malloc - dst = &hdr->enc_packet[0]; - if ((padded_len > 0) && q) { - // Note: before copying make sure we have inserted the IP header checksum - // The IP header checksum (and other checksums in the IP packet - e.g. ICMP) need to be calculated by LWIP before calling - // The Wireguard interface always needs checksums to be generated in software but the base netif may have some checksums generated by hardware - - // Copy pbuf to memory - handles case where pbuf is chained - pbuf_copy_partial(q, dst, unpadded_len, 0); - } - - // Then encrypt - wireguard_encrypt_packet(dst, dst, padded_len, keypair); - - result = wireguardif_peer_output(netif, pbuf, peer); - - if (result == ERR_OK) { - now = wireguard_sys_now(); - peer->last_tx = now; - keypair->last_tx = now; - } - - pbuf_free(pbuf); - - // Check to see if we should rekey - if (keypair->sending_counter >= REKEY_AFTER_MESSAGES) { - peer->send_handshake = true; - } else if (keypair->initiator && wireguard_expired(keypair->keypair_millis, REKEY_AFTER_TIME)) { - peer->send_handshake = true; - } - - } else { - // Failed to allocate memory - result = ERR_MEM; - } - } else { - // key has expired... - keypair_destroy(keypair); - result = ERR_CONN; - } - } else { - // No valid keys! - result = ERR_CONN; - } - return result; -} - -// This is used as the output function for the Wireguard netif -// The ipaddr here is the one inside the VPN which we use to lookup the correct peer/endpoint -static err_t wireguardif_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ip4addr) { - struct wireguard_device *device = (struct wireguard_device *)netif->state; - // Send to peer that matches dest IP - ip_addr_t ipaddr; - ip_addr_copy_from_ip4(ipaddr, *ip4addr); - struct wireguard_peer *peer = peer_lookup_by_allowed_ip(device, &ipaddr); - if (peer) { - return wireguardif_output_to_peer(netif, q, &ipaddr, peer); - } else { - return ERR_RTE; - } -} - -static void wireguardif_send_keepalive(struct wireguard_device *device, struct wireguard_peer *peer) { - // Send a NULL packet as a keep-alive - wireguardif_output_to_peer(device->netif, NULL, NULL, peer); -} - -static void wireguardif_process_response_message(struct wireguard_device *device, struct wireguard_peer *peer, struct message_handshake_response *response, const ip_addr_t *addr, u16_t port) { - if (wireguard_process_handshake_response(device, peer, response)) { - // Packet is good - // Update the peer location - log_i(TAG "good handshake from %08x:%d", addr->u_addr.ip4.addr, port); - update_peer_addr(peer, addr, port); - - wireguard_start_session(peer, true); - wireguardif_send_keepalive(device, peer); - - // Set the IF-UP flag on netif - netif_set_link_up(device->netif); - } else { - // Packet bad - log_i(TAG "bad handshake from %08x:%d", addr->u_addr.ip4.addr, port); - } -} - -static bool peer_add_ip(struct wireguard_peer *peer, ip_addr_t ip, ip_addr_t mask) { - bool result = false; - struct wireguard_allowed_ip *allowed; - int x; - // Look for existing match first - for (x=0; x < WIREGUARD_MAX_SRC_IPS; x++) { - allowed = &peer->allowed_source_ips[x]; - if ((allowed->valid) && ip_addr_cmp(&allowed->ip, &ip) && ip_addr_cmp(&allowed->mask, &mask)) { - result = true; - break; - } - } - if (!result) { - // Look for a free slot - for (x=0; x < WIREGUARD_MAX_SRC_IPS; x++) { - allowed = &peer->allowed_source_ips[x]; - if (!allowed->valid) { - allowed->valid = true; - allowed->ip = ip; - allowed->mask = mask; - result = true; - break; - } - } - } - return result; -} - -static void wireguardif_process_data_message(struct wireguard_device *device, struct wireguard_peer *peer, struct message_transport_data *data_hdr, size_t data_len, const ip_addr_t *addr, u16_t port) { - struct wireguard_keypair *keypair; - uint64_t nonce; - uint8_t *src; - size_t src_len; - struct pbuf *pbuf; - struct ip_hdr *iphdr; - ip_addr_t dest; - bool dest_ok = false; - int x; - uint32_t now; - uint16_t header_len = 0xFFFF; - uint32_t idx = data_hdr->receiver; - - keypair = get_peer_keypair_for_idx(peer, idx); - - if (keypair) { - if ( - (keypair->receiving_valid) && - !wireguard_expired(keypair->keypair_millis, REJECT_AFTER_TIME) && - (keypair->sending_counter < REJECT_AFTER_MESSAGES) - - ) { - - nonce = U8TO64_LITTLE(data_hdr->counter); - src = &data_hdr->enc_packet[0]; - src_len = data_len; - - // We don't know the unpadded size until we have decrypted the packet and validated/inspected the IP header - pbuf = pbuf_alloc(PBUF_TRANSPORT, src_len - WIREGUARD_AUTHTAG_LEN, PBUF_RAM); - if (pbuf) { - // Decrypt the packet - memset(pbuf->payload, 0, pbuf->tot_len); - if (wireguard_decrypt_packet(pbuf->payload, src, src_len, nonce, keypair)) { - - // 3. Since the packet has authenticated correctly, the source IP of the outer UDP/IP packet is used to update the endpoint for peer TrMv...WXX0. - // Update the peer location - update_peer_addr(peer, addr, port); - - now = wireguard_sys_now(); - keypair->last_rx = now; - peer->last_rx = now; - - // Might need to shuffle next key --> current keypair - keypair_update(peer, keypair); - - // Check to see if we should rekey - if (keypair->initiator && wireguard_expired(keypair->keypair_millis, REJECT_AFTER_TIME - peer->keepalive_interval - REKEY_TIMEOUT)) { - peer->send_handshake = true; - } - - // Make sure that link is reported as up - netif_set_link_up(device->netif); - - if (pbuf->tot_len > 0) { - //4a. Once the packet payload is decrypted, the interface has a plaintext packet. If this is not an IP packet, it is dropped. - iphdr = (struct ip_hdr *)pbuf->payload; - // Check for packet replay / dupes - if (wireguard_check_replay(keypair, nonce)) { - - // 4b. Otherwise, WireGuard checks to see if the source IP address of the plaintext inner-packet routes correspondingly in the cryptokey routing table - // Also check packet length! -#if LWIP_IPV4 - if (IPH_V(iphdr) == 4) { - ip_addr_copy_from_ip4(dest, iphdr->dest); - for (x=0; x < WIREGUARD_MAX_SRC_IPS; x++) { - if (peer->allowed_source_ips[x].valid) { - if (ip_addr_netcmp(&dest, &peer->allowed_source_ips[x].ip, ip_2_ip4(&peer->allowed_source_ips[x].mask))) { - dest_ok = true; - header_len = PP_NTOHS(IPH_LEN(iphdr)); - break; - } - } - } - } -#endif /* LWIP_IPV4 */ -#if LWIP_IPV6 - if (IPH_V(iphdr) == 6) { - // TODO: IPV6 support for route filtering - header_len = PP_NTOHS(IPH_LEN(iphdr)); - dest_ok = true; - } -#endif /* LWIP_IPV6 */ - if (header_len <= pbuf->tot_len) { - - // 5. If the plaintext packet has not been dropped, it is inserted into the receive queue of the wg0 interface. - if (dest_ok) { - // Send packet to be process by LWIP - ip_input(pbuf, device->netif); - // pbuf is owned by IP layer now - pbuf = NULL; - } - } else { - // IP header is corrupt or lied about packet size - } - } else { - // This is a duplicate packet / replayed / too far out of order - } - } else { - // This was a keep-alive packet - } - } - - if (pbuf) { - pbuf_free(pbuf); - } - } - - - } else { - //After Reject-After-Messages transport data messages or after the current secure session is Reject- After-Time seconds old, - // whichever comes first, WireGuard will refuse to send or receive any more transport data messages using the current secure session, - // until a new secure session is created through the 1-RTT handshake - keypair_destroy(keypair); - } - - } else { - // Could not locate valid keypair for remote index - } -} - -static struct pbuf *wireguardif_initiate_handshake(struct wireguard_device *device, struct wireguard_peer *peer, struct message_handshake_initiation *msg, err_t *error) { - struct pbuf *pbuf = NULL; - err_t err = ERR_OK; - if (wireguard_create_handshake_initiation(device, peer, msg)) { - // Send this packet out! - pbuf = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct message_handshake_initiation), PBUF_RAM); - if (pbuf) { - err = pbuf_take(pbuf, msg, sizeof(struct message_handshake_initiation)); - if (err == ERR_OK) { - // OK! - } else { - pbuf_free(pbuf); - pbuf = NULL; - } - } else { - err = ERR_MEM; - } - } else { - err = ERR_ARG; - } - if (error) { - *error = err; - } - return pbuf; -} - -static void wireguardif_send_handshake_response(struct wireguard_device *device, struct wireguard_peer *peer) { - struct message_handshake_response packet; - struct pbuf *pbuf = NULL; - err_t err = ERR_OK; - - if (wireguard_create_handshake_response(device, peer, &packet)) { - - wireguard_start_session(peer, false); - - // Send this packet out! - pbuf = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct message_handshake_response), PBUF_RAM); - if (pbuf) { - err = pbuf_take(pbuf, &packet, sizeof(struct message_handshake_response)); - if (err == ERR_OK) { - // OK! - wireguardif_peer_output(device->netif, pbuf, peer); - } - pbuf_free(pbuf); - } - } -} - -static size_t get_source_addr_port(const ip_addr_t *addr, u16_t port, uint8_t *buf, size_t buflen) { - size_t result = 0; - -#if LWIP_IPV4 - if (IP_IS_V4(addr) && (buflen >= 4)) { - U32TO8_BIG(buf + result, PP_NTOHL(ip4_addr_get_u32(ip_2_ip4(addr)))); - result += 4; - } -#endif -#if LWIP_IPV6 - if (IP_IS_V6(addr) && (buflen >= 16)) { - U16TO8_BIG(buf + result + 0, IP6_ADDR_BLOCK1(ip_2_ip6(addr))); - U16TO8_BIG(buf + result + 2, IP6_ADDR_BLOCK2(ip_2_ip6(addr))); - U16TO8_BIG(buf + result + 4, IP6_ADDR_BLOCK3(ip_2_ip6(addr))); - U16TO8_BIG(buf + result + 6, IP6_ADDR_BLOCK4(ip_2_ip6(addr))); - U16TO8_BIG(buf + result + 8, IP6_ADDR_BLOCK5(ip_2_ip6(addr))); - U16TO8_BIG(buf + result + 10, IP6_ADDR_BLOCK6(ip_2_ip6(addr))); - U16TO8_BIG(buf + result + 12, IP6_ADDR_BLOCK7(ip_2_ip6(addr))); - U16TO8_BIG(buf + result + 14, IP6_ADDR_BLOCK8(ip_2_ip6(addr))); - result += 16; - } -#endif - if (buflen >= result + 2) { - U16TO8_BIG(buf + result, port); - result += 2; - } - return result; -} - -static void wireguardif_send_handshake_cookie(struct wireguard_device *device, const uint8_t *mac1, uint32_t index, const ip_addr_t *addr, u16_t port) { - struct message_cookie_reply packet; - struct pbuf *pbuf = NULL; - err_t err = ERR_OK; - uint8_t source_buf[18]; - size_t source_len = get_source_addr_port(addr, port, source_buf, sizeof(source_buf)); - - wireguard_create_cookie_reply(device, &packet, mac1, index, source_buf, source_len); - - // Send this packet out! - pbuf = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct message_cookie_reply), PBUF_RAM); - if (pbuf) { - err = pbuf_take(pbuf, &packet, sizeof(struct message_cookie_reply)); - if (err == ERR_OK) { - wireguardif_device_output(device, pbuf, addr, port); - } - pbuf_free(pbuf); - } -} - -static bool wireguardif_check_initiation_message(struct wireguard_device *device, struct message_handshake_initiation *msg, const ip_addr_t *addr, u16_t port) { - bool result = false; - uint8_t *data = (uint8_t *)msg; - uint8_t source_buf[18]; - size_t source_len; - // We received an initiation packet check it is valid - - if (wireguard_check_mac1(device, data, sizeof(struct message_handshake_initiation) - (2 * WIREGUARD_COOKIE_LEN), msg->mac1)) { - // mac1 is valid! - if (!wireguard_is_under_load()) { - // If we aren't under load we only need mac1 to be correct - result = true; - } else { - // If we are under load then check mac2 - source_len = get_source_addr_port(addr, port, source_buf, sizeof(source_buf)); - - result = wireguard_check_mac2(device, data, sizeof(struct message_handshake_initiation) - (WIREGUARD_COOKIE_LEN), source_buf, source_len, msg->mac2); - - if (!result) { - // mac2 is invalid (cookie may have expired) or not present - // 5.3 Denial of Service Mitigation & Cookies - // If the responder receives a message with a valid msg.mac1 yet with an invalid msg.mac2, and is under load, it may respond with a cookie reply message - wireguardif_send_handshake_cookie(device, msg->mac1, msg->sender, addr, port); - } - } - - } else { - // mac1 is invalid - } - return result; -} - -static bool wireguardif_check_response_message(struct wireguard_device *device, struct message_handshake_response *msg, const ip_addr_t *addr, u16_t port) { - bool result = false; - uint8_t *data = (uint8_t *)msg; - uint8_t source_buf[18]; - size_t source_len; - // We received an initiation packet check it is valid - - if (wireguard_check_mac1(device, data, sizeof(struct message_handshake_response) - (2 * WIREGUARD_COOKIE_LEN), msg->mac1)) { - // mac1 is valid! - if (!wireguard_is_under_load()) { - // If we aren't under load we only need mac1 to be correct - result = true; - } else { - // If we are under load then check mac2 - source_len = get_source_addr_port(addr, port, source_buf, sizeof(source_buf)); - - result = wireguard_check_mac2(device, data, sizeof(struct message_handshake_response) - (WIREGUARD_COOKIE_LEN), source_buf, source_len, msg->mac2); - - if (!result) { - // mac2 is invalid (cookie may have expired) or not present - // 5.3 Denial of Service Mitigation & Cookies - // If the responder receives a message with a valid msg.mac1 yet with an invalid msg.mac2, and is under load, it may respond with a cookie reply message - wireguardif_send_handshake_cookie(device, msg->mac1, msg->sender, addr, port); - } - } - - } else { - // mac1 is invalid - } - return result; -} - - -void wireguardif_network_rx(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) { - LWIP_ASSERT("wireguardif_network_rx: invalid arg", arg != NULL); - LWIP_ASSERT("wireguardif_network_rx: invalid pbuf", p != NULL); - // We have received a packet from the base_netif to our UDP port - process this as a possible Wireguard packet - struct wireguard_device *device = (struct wireguard_device *)arg; - struct wireguard_peer *peer; - uint8_t *data = p->payload; - size_t len = p->len; // This buf, not chained ones - - struct message_handshake_initiation *msg_initiation; - struct message_handshake_response *msg_response; - struct message_cookie_reply *msg_cookie; - struct message_transport_data *msg_data; - - uint8_t type = wireguard_get_message_type(data, len); - ESP_LOGV(TAG, "network_rx: %08x:%d", addr->u_addr.ip4.addr, port); - - switch (type) { - case MESSAGE_HANDSHAKE_INITIATION: - msg_initiation = (struct message_handshake_initiation *)data; - log_i(TAG "HANDSHAKE_INITIATION: %08x:%d", addr->u_addr.ip4.addr, port); - // Check mac1 (and optionally mac2) are correct - note it may internally generate a cookie reply packet - if (wireguardif_check_initiation_message(device, msg_initiation, addr, port)) { - - peer = wireguard_process_initiation_message(device, msg_initiation); - if (peer) { - // Update the peer location - update_peer_addr(peer, addr, port); - - // Send back a handshake response - wireguardif_send_handshake_response(device, peer); - } - } - break; - - case MESSAGE_HANDSHAKE_RESPONSE: - log_i(TAG "HANDSHAKE_RESPONSE: %08x:%d", addr->u_addr.ip4.addr, port); - msg_response = (struct message_handshake_response *)data; - - // Check mac1 (and optionally mac2) are correct - note it may internally generate a cookie reply packet - if (wireguardif_check_response_message(device, msg_response, addr, port)) { - - peer = peer_lookup_by_handshake(device, msg_response->receiver); - if (peer) { - // Process the handshake response - wireguardif_process_response_message(device, peer, msg_response, addr, port); - } - } - break; - - case MESSAGE_COOKIE_REPLY: - log_i(TAG "COOKIE_REPLY: %08x:%d", addr->u_addr.ip4.addr, port); - msg_cookie = (struct message_cookie_reply *)data; - peer = peer_lookup_by_handshake(device, msg_cookie->receiver); - if (peer) { - if (wireguard_process_cookie_message(device, peer, msg_cookie)) { - // Update the peer location - update_peer_addr(peer, addr, port); - - // Don't send anything out - we stay quiet until the next initiation message - } - } - break; - - case MESSAGE_TRANSPORT_DATA: - ESP_LOGV(TAG, "TRANSPORT_DATA: %08x:%d", addr->u_addr.ip4.addr, port); - - msg_data = (struct message_transport_data *)data; - peer = peer_lookup_by_receiver(device, msg_data->receiver); - if (peer) { - // header is 16 bytes long so take that off the length - wireguardif_process_data_message(device, peer, msg_data, len - 16, addr, port); - } - break; - - default: - // Unknown or bad packet header - break; - } - // Release data! - pbuf_free(p); -} - -static err_t wireguard_start_handshake(struct netif *netif, struct wireguard_peer *peer) { - struct wireguard_device *device = (struct wireguard_device *)netif->state; - err_t result; - struct pbuf *pbuf; - struct message_handshake_initiation msg; - - pbuf = wireguardif_initiate_handshake(device, peer, &msg, &result); - if (pbuf) { - result = wireguardif_peer_output(netif, pbuf, peer); - log_i(TAG "start handshake %08x,%d - %d", peer->ip.u_addr.ip4.addr, peer->port, result); - pbuf_free(pbuf); - peer->send_handshake = false; - peer->last_initiation_tx = wireguard_sys_now(); - memcpy(peer->handshake_mac1, msg.mac1, WIREGUARD_COOKIE_LEN); - peer->handshake_mac1_valid = true; - } - return result; -} - -static err_t wireguardif_lookup_peer(struct netif *netif, u8_t peer_index, struct wireguard_peer **out) { - LWIP_ASSERT("netif != NULL", (netif != NULL)); - LWIP_ASSERT("state != NULL", (netif->state != NULL)); - struct wireguard_device *device = (struct wireguard_device *)netif->state; - struct wireguard_peer *peer = NULL; - err_t result; - - if (device->valid) { - peer = peer_lookup_by_peer_index(device, peer_index); - if (peer) { - result = ERR_OK; - } else { - result = ERR_ARG; - } - } else { - result = ERR_ARG; - } - *out = peer; - return result; -} - -err_t wireguardif_connect(struct netif *netif, u8_t peer_index) { - struct wireguard_peer *peer; - err_t result = wireguardif_lookup_peer(netif, peer_index, &peer); - if (result == ERR_OK) { - // Check that a valid connect ip and port have been set - if (!ip_addr_isany(&peer->connect_ip) && (peer->connect_port > 0)) { - // Set the flag that we want to try connecting - peer->active = true; - peer->ip = peer->connect_ip; - peer->port = peer->connect_port; - result = ERR_OK; - } else { - result = ERR_ARG; - } - } - return result; -} - -err_t wireguardif_disconnect(struct netif *netif, u8_t peer_index) { - struct wireguard_peer *peer; - err_t result = wireguardif_lookup_peer(netif, peer_index, &peer); - if (result == ERR_OK) { - // Set the flag that we want to try connecting - peer->active = false; - // Wipe out current keys - keypair_destroy(&peer->next_keypair); - keypair_destroy(&peer->curr_keypair); - keypair_destroy(&peer->prev_keypair); - result = ERR_OK; - } - return result; -} - -err_t wireguardif_peer_is_up(struct netif *netif, u8_t peer_index, ip_addr_t *current_ip, u16_t *current_port) { - struct wireguard_peer *peer; - err_t result = wireguardif_lookup_peer(netif, peer_index, &peer); - if (result == ERR_OK) { - if ((peer->curr_keypair.valid) || (peer->prev_keypair.valid)) { - result = ERR_OK; - } else { - result = ERR_CONN; - } - if (current_ip) { - *current_ip = peer->ip; - } - if (current_port) { - *current_port = peer->port; - } - } - return result; -} - -err_t wireguardif_remove_peer(struct netif *netif, u8_t peer_index) { - struct wireguard_peer *peer; - err_t result = wireguardif_lookup_peer(netif, peer_index, &peer); - if (result == ERR_OK) { - crypto_zero(peer, sizeof(struct wireguard_peer)); - peer->valid = false; - result = ERR_OK; - } - return result; -} - -err_t wireguardif_update_endpoint(struct netif *netif, u8_t peer_index, const ip_addr_t *ip, u16_t port) { - struct wireguard_peer *peer; - err_t result = wireguardif_lookup_peer(netif, peer_index, &peer); - if (result == ERR_OK) { - peer->connect_ip = *ip; - peer->connect_port = port; - result = ERR_OK; - } - return result; -} - - -err_t wireguardif_add_peer(struct netif *netif, struct wireguardif_peer *p, u8_t *peer_index) { - LWIP_ASSERT("netif != NULL", (netif != NULL)); - LWIP_ASSERT("state != NULL", (netif->state != NULL)); - LWIP_ASSERT("p != NULL", (p != NULL)); - struct wireguard_device *device = (struct wireguard_device *)netif->state; - err_t result; - uint8_t public_key[WIREGUARD_PUBLIC_KEY_LEN]; - size_t public_key_len = sizeof(public_key); - struct wireguard_peer *peer = NULL; - - uint32_t t1 = wireguard_sys_now(); - - if (wireguard_base64_decode(p->public_key, public_key, &public_key_len) - && (public_key_len == WIREGUARD_PUBLIC_KEY_LEN)) { - - // See if the peer is already registered - peer = peer_lookup_by_pubkey(device, public_key); - if (!peer) { - // Not active - see if we have room to allocate a new one - peer = peer_alloc(device); - if (peer) { - - if (wireguard_peer_init(device, peer, public_key, p->preshared_key)) { - - peer->connect_ip = p->endpoint_ip; - peer->connect_port = p->endport_port; - peer->ip = peer->connect_ip; - peer->port = peer->connect_port; - if (p->keep_alive == WIREGUARDIF_KEEPALIVE_DEFAULT) { - peer->keepalive_interval = KEEPALIVE_TIMEOUT; - } else { - peer->keepalive_interval = p->keep_alive; - } - peer_add_ip(peer, p->allowed_ip, p->allowed_mask); - memcpy(peer->greatest_timestamp, p->greatest_timestamp, sizeof(peer->greatest_timestamp)); - - result = ERR_OK; - } else { - result = ERR_ARG; - } - } else { - result = ERR_MEM; - } - } else { - result = ERR_OK; - } - } else { - result = ERR_ARG; - } - - uint32_t t2 = wireguard_sys_now(); - log_i(TAG "Adding peer took %ums\r\n", (t2-t1)); - - if (peer_index) { - if (peer) { - *peer_index = wireguard_peer_index(device, peer); - } else { - *peer_index = WIREGUARDIF_INVALID_INDEX; - } - } - return result; -} - -static bool should_send_initiation(struct wireguard_peer *peer) { - bool result = false; - if (wireguardif_can_send_initiation(peer)) { - if (peer->send_handshake) { - result = true; - } else if (peer->curr_keypair.valid && !peer->curr_keypair.initiator && wireguard_expired(peer->curr_keypair.keypair_millis, REJECT_AFTER_TIME - peer->keepalive_interval)) { - result = true; - } else if (!peer->curr_keypair.valid && peer->active) { - result = true; - } - } - return result; -} - -static bool should_send_keepalive(struct wireguard_peer *peer) { - bool result = false; - if (peer->keepalive_interval > 0) { - if ((peer->curr_keypair.valid) || (peer->prev_keypair.valid)) { - if (wireguard_expired(peer->last_tx, peer->keepalive_interval)) { - result = true; - } - } - } - return result; -} - -static bool should_destroy_current_keypair(struct wireguard_peer *peer) { - bool result = false; - if (peer->curr_keypair.valid && - (wireguard_expired(peer->curr_keypair.keypair_millis, REJECT_AFTER_TIME) || - (peer->curr_keypair.sending_counter >= REJECT_AFTER_MESSAGES)) - ) { - result = true; - } - return result; -} - -static bool should_reset_peer(struct wireguard_peer *peer) { - bool result = false; - if (peer->curr_keypair.valid && (wireguard_expired(peer->curr_keypair.keypair_millis, REJECT_AFTER_TIME * 3))) { - result = true; - } - return result; -} - -static void wireguardif_tmr(void *arg) { - struct wireguard_device *device = (struct wireguard_device *)arg; - struct wireguard_peer *peer; - int x; - // Reschedule this timer - sys_timeout(WIREGUARDIF_TIMER_MSECS, wireguardif_tmr, device); - - // Check periodic things - bool link_up = false; - for (x=0; x < WIREGUARD_MAX_PEERS; x++) { - peer = &device->peers[x]; - if (peer->valid) { - // Do we need to rekey / send a handshake? - if (should_reset_peer(peer)) { - // Nothing back for too long - we should wipe out all crypto state - keypair_destroy(&peer->next_keypair); - keypair_destroy(&peer->curr_keypair); - keypair_destroy(&peer->prev_keypair); - handshake_destroy(&peer->handshake); - - // Revert back to default IP/port if these were altered - peer->ip = peer->connect_ip; - peer->port = peer->connect_port; - } - if (should_destroy_current_keypair(peer)) { - // Destroy current keypair - keypair_destroy(&peer->curr_keypair); - } - if (should_send_keepalive(peer)) { - wireguardif_send_keepalive(device, peer); - } - if (should_send_initiation(peer)) { - wireguard_start_handshake(device->netif, peer); - } - - if ((peer->curr_keypair.valid) || (peer->prev_keypair.valid)) { - link_up = true; - } - } - } - - if (!link_up) { - // Clear the IF-UP flag on netif - netif_set_link_down(device->netif); - } -} - -void wireguardif_shutdown(struct netif *netif) { - LWIP_ASSERT("netif != NULL", (netif != NULL)); - LWIP_ASSERT("state != NULL", (netif->state != NULL)); - - struct wireguard_device * device = (struct wireguard_device *)netif->state; - // Disable timer. - sys_untimeout(wireguardif_tmr, device); - // remove UDP context. - if( device->udp_pcb ) { - udp_disconnect(device->udp_pcb); - udp_remove(device->udp_pcb); - device->udp_pcb = NULL; - } - // remove device context. - free(device); - netif->state = NULL; -} - -err_t wireguardif_init(struct netif *netif) { - err_t result; - struct wireguardif_init_data *init_data; - struct wireguard_device *device; - struct udp_pcb *udp; - uint8_t private_key[WIREGUARD_PRIVATE_KEY_LEN]; - size_t private_key_len = sizeof(private_key); - - struct netif* underlying_netif; - /* All eddits for FOR LAN8720 */ - //tcpip_adapter_get_netif(TCPIP_ADAPTER_IF_STA, &underlying_netif); //original - underlying_netif = netif_default; // Use current netif as the underlying netif of the WireGuard interface. - /* All eddits for FOR LAN8720 */ - - - log_i(TAG "underlying_netif = %p", underlying_netif); - - LWIP_ASSERT("netif != NULL", (netif != NULL)); - LWIP_ASSERT("state != NULL", (netif->state != NULL)); - - // We need to initialise the wireguard module - wireguard_init(); - log_i(TAG "wireguard module initialized."); - - if (netif && netif->state) { - - // The init data is passed into the netif_add call as the 'state' - we will replace this with our private state data - init_data = (struct wireguardif_init_data *)netif->state; - - // Clear out and set if function is successful - netif->state = NULL; - - if (wireguard_base64_decode(init_data->private_key, private_key, &private_key_len) - && (private_key_len == WIREGUARD_PRIVATE_KEY_LEN)) { - - udp = udp_new(); - - if (udp) { - result = udp_bind(udp, IP_ADDR_ANY, init_data->listen_port); // Note this listens on all interfaces! Really just want the passed netif - if (result == ERR_OK) { - device = (struct wireguard_device *)mem_calloc(1, sizeof(struct wireguard_device)); - if (device) { - device->netif = netif; - device->underlying_netif = underlying_netif; - //udp_bind_netif(udp, underlying_netif); - - device->udp_pcb = udp; - log_d(TAG "start device initialization"); - // Per-wireguard netif/device setup - uint32_t t1 = wireguard_sys_now(); - if (wireguard_device_init(device, private_key)) { - uint32_t t2 = wireguard_sys_now(); - log_d(TAG "Device init took %ums\r\n", (t2-t1)); - -#if LWIP_CHECKSUM_CTRL_PER_NETIF - NETIF_SET_CHECKSUM_CTRL(netif, NETIF_CHECKSUM_ENABLE_ALL); -#endif - netif->state = device; - netif->name[0] = 'w'; - netif->name[1] = 'g'; - netif->output = wireguardif_output; - netif->linkoutput = NULL; - netif->hwaddr_len = 0; - netif->mtu = WIREGUARDIF_MTU; - // We set up no state flags here - caller should set them - // NETIF_FLAG_LINK_UP is automatically set/cleared when at least one peer is connected - netif->flags = 0; - - udp_recv(udp, wireguardif_network_rx, device); - - // Start a periodic timer for this wireguard device - sys_timeout(WIREGUARDIF_TIMER_MSECS, wireguardif_tmr, device); - - result = ERR_OK; - } else { - log_e(TAG "failed to initialize WireGuard device."); - mem_free(device); - device = NULL; - udp_remove(udp); - result = ERR_ARG; - } - } else { - log_e(TAG "failed to allocate device context."); - udp_remove(udp); - result = ERR_MEM; - } - } else { - log_e(TAG "failed to bind UDP err=%d", result); - udp_remove(udp); - } - - } else { - log_e(TAG "failed to allocate UDP"); - result = ERR_MEM; - } - } else { - log_e(TAG "invalid init_data private key"); - result = ERR_ARG; - } - } else { - log_e(TAG "netif or state is NULL: netif=%p, netif.state:%p", netif, netif ? netif->state : NULL); - result = ERR_ARG; - } - return result; -} - -void wireguardif_peer_init(struct wireguardif_peer *peer) { - LWIP_ASSERT("peer != NULL", (peer != NULL)); - memset(peer, 0, sizeof(struct wireguardif_peer)); - // Caller must provide 'public_key' - peer->public_key = NULL; - ip_addr_set_any(false, &peer->endpoint_ip); - peer->endport_port = WIREGUARDIF_DEFAULT_PORT; - peer->keep_alive = WIREGUARDIF_KEEPALIVE_DEFAULT; - ip_addr_set_any(false, &peer->allowed_ip); - ip_addr_set_any(false, &peer->allowed_mask); - memset(peer->greatest_timestamp, 0, sizeof(peer->greatest_timestamp)); - peer->preshared_key = NULL; -} diff --git a/lib/WireGuard-ESP32/src/wireguardif.h b/lib/WireGuard-ESP32/src/wireguardif.h deleted file mode 100644 index ad9d4a1..0000000 --- a/lib/WireGuard-ESP32/src/wireguardif.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Ported to ESP32 Arduino by Kenta Ida (fuga@fugafuga.org) - * The original license is below: - * - * Copyright (c) 2021 Daniel Hope (www.floorsense.nz) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of "Floorsense Ltd", "Agile Workspace Ltd" nor the names of - * its contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Author: Daniel Hope - */ - - -#ifndef _WIREGUARDIF_H_ -#define _WIREGUARDIF_H_ - -#include "lwip/arch.h" -#include "lwip/netif.h" -#include "lwip/ip_addr.h" - -// Default MTU for WireGuard is 1420 bytes -#define WIREGUARDIF_MTU (1420) - -#define WIREGUARDIF_DEFAULT_PORT (51820) -#define WIREGUARDIF_KEEPALIVE_DEFAULT (0xFFFF) - -struct wireguardif_init_data { - // Required: the private key of this WireGuard network interface - const char *private_key; - // Required: What UDP port to listen on - u16_t listen_port; - // Optional: restrict send/receive of encapsulated WireGuard traffic to this network interface only (NULL to use routing table) - struct netif *bind_netif; -}; - -struct wireguardif_peer { - const char *public_key; - // Optional pre-shared key (32 bytes) - make sure this is NULL if not to be used - const uint8_t *preshared_key; - // tai64n of largest timestamp we have seen during handshake to avoid replays - uint8_t greatest_timestamp[12]; - - // Allowed ip/netmask (can add additional later but at least one is required) - ip_addr_t allowed_ip; - ip_addr_t allowed_mask; - - // End-point details (may be blank) - ip_addr_t endpoint_ip; - u16_t endport_port; - u16_t keep_alive; -}; - -#define WIREGUARDIF_INVALID_INDEX (0xFF) - -/* static struct netif wg_netif_struct = {0}; - * struct wireguard_interface wg; - * wg.private_key = "abcdefxxx..xxxxx="; - * wg.listen_port = 51820; - * wg.bind_netif = NULL; // Pass netif to listen on, NULL for all interfaces - * - * netif = netif_add(&netif_struct, &ipaddr, &netmask, &gateway, &wg, &wireguardif_init, &ip_input); - * - * netif_set_up(wg_net); - * - * struct wireguardif_peer peer; - * wireguardif_peer_init(&peer); - * peer.public_key = "apoehc...4322abcdfejg=; - * peer.preshared_key = NULL; - * peer.allowed_ip = allowed_ip; - * peer.allowed_mask = allowed_mask; - * - * // If you want to enable output connection - * peer.endpoint_ip = peer_ip; - * peer.endport_port = 12345; - * - * uint8_t wireguard_peer_index; - * wireguardif_add_peer(netif, &peer, &wireguard_peer_index); - * - * if ((wireguard_peer_index != WIREGUARDIF_INVALID_INDEX) && !ip_addr_isany(&peer.endpoint_ip)) { - * // Start outbound connection to peer - * wireguardif_connect(wg_net, wireguard_peer_index); - * } - * - */ - -// Initialise a new WireGuard network interface (netif) -err_t wireguardif_init(struct netif *netif); - -// Shutdown a WireGuard network interface (netif) -void wireguardif_shutdown(struct netif *netif); - -// Helper to initialise the peer struct with defaults -void wireguardif_peer_init(struct wireguardif_peer *peer); - -// Add a new peer to the specified interface - see wireguard.h for maximum number of peers allowed -// On success the peer_index can be used to reference this peer in future function calls -err_t wireguardif_add_peer(struct netif *netif, struct wireguardif_peer *peer, u8_t *peer_index); - -// Remove the given peer from the network interface -err_t wireguardif_remove_peer(struct netif *netif, u8_t peer_index); - -// Update the "connect" IP of the given peer -err_t wireguardif_update_endpoint(struct netif *netif, u8_t peer_index, const ip_addr_t *ip, u16_t port); - -// Try and connect to the given peer -err_t wireguardif_connect(struct netif *netif, u8_t peer_index); - -// Stop trying to connect to the given peer -err_t wireguardif_disconnect(struct netif *netif, u8_t peer_index); - -// Is the given peer "up"? A peer is up if it has a valid session key it can communicate with -err_t wireguardif_peer_is_up(struct netif *netif, u8_t peer_index, ip_addr_t *current_ip, u16_t *current_port); - -#endif /* _WIREGUARDIF_H_ */ diff --git a/platformio.ini b/platformio.ini index 5a59738..b4a9ac3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -38,7 +38,8 @@ monitor_filters = esp32_exception_decoder, default ;, log2file monitor_speed = 115200 upload_speed = 460800 extra_scripts = - pre:tools/build/version_increment_pre.py + ;pre:tools/build/version_increment_pre.py + pre:tools/build/version_update.py pre:tools/webfilesbuilder/build_html.py post:tools/build/build.py build_flags = diff --git a/src/config.cpp b/src/config.cpp new file mode 100644 index 0000000..a3ab302 --- /dev/null +++ b/src/config.cpp @@ -0,0 +1,1315 @@ +#include +#include +#include +#include +#include + +#include "config.h" +#include "etc.h" + +Preferences preferences; + +#include "nvs.h" +#include "nvs_flash.h" +#include "HTTPClient.h" + +extern struct SysVarsStruct vars; +extern struct BrdConfigStruct hwConfig; +extern BrdConfigStruct brdConfigs[BOARD_CFG_CNT]; + +extern struct SystemConfigStruct systemCfg; +extern struct NetworkConfigStruct networkCfg; +extern struct VpnConfigStruct vpnCfg; +extern struct MqttConfigStruct mqttCfg; + +const char *networkConfigKey = "network-config"; +const char *wifiEnableKey = "wifiEnable"; +const char *wifiSsidKey = "wifiSsid"; +const char *wifiPasswordKey = "wifiPassword"; +const char *wifiDhcpKey = "wifiDhcp"; +const char *wifiAddrKey = "wifiAddr"; +const char *wifiMaskKey = "wifiMask"; +const char *wifiGateKey = "wifiGate"; +const char *wifiDns1Key = "wifiDns1"; +const char *wifiDns2Key = "wifiDns2"; +const char *ethEnableKey = "ethEnable"; +const char *ethDhcpKey = "ethDhcp"; +const char *ethAddrKey = "ethAddr"; +const char *ethMaskKey = "ethMask"; +const char *ethGateKey = "ethGate"; +const char *ethDns1Key = "ethDns1"; +const char *ethDns2Key = "ethDns2"; + +const char *vpnConfigKey = "vpn-config"; +const char *wgEnableKey = "wgEnable"; +const char *wgLocalIPKey = "wgLocalIP"; +const char *wgLocalPrivKeyKey = "wgLocalPrivKey"; +const char *wgEndAddrKey = "wgEndAddr"; +const char *wgEndPubKeyKey = "wgEndPubKey"; +const char *wgEndPortKey = "wgEndPort"; +const char *hnEnableKey = "hnEnable"; +const char *hnJoinCodeKey = "hnJoinCode"; +const char *hnHostNameKey = "hnHostName"; +const char *hnDashUrlKey = "hnDashUrl"; + +const char *mqttConfigKey = "mqtt-config"; +const char *enableKey = "enable"; +const char *serverKey = "server"; +//const char *serverIPKey = "serverIP"; +const char *portKey = "port"; +const char *userKey = "user"; +const char *passKey = "pass"; +const char *topicKey = "topic"; +const char *intervalKey = "interval"; +const char *updateIntKey = "updateInt"; +const char *discoveryKey = "discovery"; +//const char *reconnectTimeKey = "reconnectTime"; +const char *reconnectIntKey = "reconnectIntKey"; +//const char *heartbeatTimeKey = "heartbeatTime"; + +const char *systemConfigKey = "system-config"; +const char *keepWebKey = "keepWeb"; +const char *disableWebKey = "disableWeb"; +const char *webAuthKey = "webAuth"; +const char *webUserKey = "webUser"; +const char *webPassKey = "webPass"; +const char *fwEnabledKey = "fwEnabled"; +const char *fwIpKey = "fwIp"; +const char *serialSpeedKey = "serialSpeed"; +const char *socketPortKey = "socketPort"; +const char *tempOffsetKey = "tempOffset"; +const char *disableLedUSBKey = "disableLedUSB"; +const char *disableLedPwrKey = "disableLedPwr"; +const char *disableLedsKey = "disableLeds"; +const char *refreshLogsKey = "refreshLogs"; +const char *hostnameKey = "hostname"; +const char *timeZoneKey = "timeZone"; +const char *ntpServ1Key = "ntpServ1"; +const char *ntpServ2Key = "ntpServ2"; +// const char *prevWorkModeKey = "prevWorkMode"; +// const char *workModeKey = "prevWorkMode"; + +const char *systemVarsKey = "system-vars"; +const char *hwBtnIsKey = "hwBtnIs"; +const char *hwLedUsbIsKey = "hwLedUsbIs"; +const char *hwLedPwrIsKey = "hwLedPwrIs"; +const char *hwUartSelIsKey = "hwUartSelIs"; +const char *hwZigbeeIsKey = "hwZigbeeIs"; +const char *workModeKey = "workMode"; +const char *connectedSocketKey = "connectedSocket"; +const char *connectedClientsKey = "connectedClients"; +const char *socketTimeKey = "socketTime"; +const char *connectedEtherKey = "connectedEther"; +const char *apStartedKey = "apStarted"; +const char *wifiWebSetupInProgressKey = "wifiWebSetupInProgress"; +const char *vpnWgInitKey = "vpnWgInit"; +const char *vpnWgConnectKey = "vpnWgConnect"; +const char *vpnWgPeerIpKey = "vpnWgPeerIp"; +const char *vpnWgCheckTimeKey = "vpnWgCheckTimeKey"; +const char *vpnHnInitKey = "vpnHnInit"; +const char *mqttConnKey = "mqttConn"; +const char *mqttReconnectTimeKey = "mqttReconnectTime"; +const char *mqttHeartbeatTimeKey = "mqttHeartbeatTime"; +const char *zbLedStateKey = "zbLedState"; +const char *zbFlashingKey = "zbFlashing"; + +String tag = "NVS"; + +void printNVSFreeSpace() +{ + nvs_stats_t nvsStats; + nvs_get_stats(NULL, &nvsStats); + + LOGI(tag, "Total Entries: %d, Used Entries: %d, Free Entries: %d", nvsStats.total_entries, nvsStats.used_entries, (nvsStats.total_entries - nvsStats.used_entries)); +} + +void eraseNVS() +{ + LOGI(tag, "Going to erase NVS. It will factory reset device."); + int timeDelay = 10; + for (int i = 0; i < timeDelay; i++) + { + LOGI(tag, "%d seconds left..", (timeDelay - i)); + delay(1000); + } + LOGI(tag, "Erasing NVS. It will factory reset device!"); + ESP_ERROR_CHECK(nvs_flash_erase()); + esp_err_t ret = nvs_flash_init(); + ESP_ERROR_CHECK(ret); + LOGI(tag, "Erase complete!"); +} + +void initNVS() +{ + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + LOGI(tag, "ESP_ERR_NVS_NO_FREE_PAGES || ESP_ERR_NVS_NEW_VERSION_FOUND . DOWNGRADE and BACKUP CONFIG"); + while (true) + { + delay(1); // stop any work + } + // eraseNVS(); + } + ESP_ERROR_CHECK(ret); +} + +String makeJsonConfig(const NetworkConfigStruct *networkCfg, + const VpnConfigStruct *vpnCfg, + const MqttConfigStruct *mqttCfg, + const SystemConfigStruct *systemCfg, + const SysVarsStruct *systemVars) +{ + StaticJsonDocument<2048> doc; + + if (networkCfg != nullptr) + { + JsonObject network = doc.createNestedObject(networkConfigKey); + serializeNetworkConfigToJson(*networkCfg, network); + } + + if (vpnCfg != nullptr) + { + JsonObject vpn = doc.createNestedObject(vpnConfigKey); + serializeVpnConfigToJson(*vpnCfg, vpn); + } + + if (mqttCfg != nullptr) + { + JsonObject mqtt = doc.createNestedObject(mqttConfigKey); + serializeMqttConfigToJson(*mqttCfg, mqtt); + } + + if (systemCfg != nullptr) + { + JsonObject system = doc.createNestedObject(systemConfigKey); + serializeSystemConfigToJson(*systemCfg, system); + } + + if (systemVars != nullptr) + { + JsonObject varsJson = doc.createNestedObject(systemVarsKey); + serializeSysVarsToJson(*systemVars, varsJson); + } + + String output; + serializeJsonPretty(doc, output); + return output; +} + +void saveNetworkConfig(const NetworkConfigStruct &config) +{ + preferences.begin(networkConfigKey, false); + + preferences.putBool(wifiEnableKey, config.wifiEnable); + preferences.putString(wifiSsidKey, config.wifiSsid); + preferences.putString(wifiPasswordKey, config.wifiPassword); + preferences.putBool(wifiDhcpKey, config.wifiDhcp); + preferences.putString(wifiAddrKey, config.wifiAddr.toString()); + preferences.putString(wifiMaskKey, config.wifiMask.toString()); + preferences.putString(wifiGateKey, config.wifiGate.toString()); + preferences.putString(wifiDns1Key, config.wifiDns1.toString()); + preferences.putString(wifiDns2Key, config.wifiDns2.toString()); + + preferences.putBool(ethEnableKey, config.ethEnable); + preferences.putBool(ethDhcpKey, config.ethDhcp); + preferences.putString(ethAddrKey, config.ethAddr.toString()); + preferences.putString(ethMaskKey, config.ethMask.toString()); + preferences.putString(ethGateKey, config.ethGate.toString()); + preferences.putString(ethDns1Key, config.ethDns1.toString()); + preferences.putString(ethDns2Key, config.ethDns2.toString()); + + preferences.end(); +} + +void loadNetworkConfig(NetworkConfigStruct &config) +{ + preferences.begin(networkConfigKey, true); + + config.wifiEnable = preferences.getBool(wifiEnableKey, false); + strlcpy(config.wifiSsid, preferences.getString(wifiSsidKey).c_str(), sizeof(config.wifiSsid)); + strlcpy(config.wifiPassword, preferences.getString(wifiPasswordKey).c_str(), sizeof(config.wifiPassword)); + config.wifiDhcp = preferences.getBool(wifiDhcpKey, true); + config.wifiAddr.fromString(preferences.getString(wifiAddrKey)); + config.wifiMask.fromString(preferences.getString(wifiMaskKey, NETWORK_MASK)); + config.wifiGate.fromString(preferences.getString(wifiGateKey)); + config.wifiDns1.fromString(preferences.getString(wifiDns1Key, DNS_SERV_1)); + config.wifiDns2.fromString(preferences.getString(wifiDns2Key, DNS_SERV_2)); + + config.ethEnable = preferences.getBool(ethEnableKey, true); + config.ethDhcp = preferences.getBool(ethDhcpKey, true); + config.ethAddr.fromString(preferences.getString(ethAddrKey)); + config.ethMask.fromString(preferences.getString(ethMaskKey, NETWORK_MASK)); + config.ethGate.fromString(preferences.getString(ethGateKey)); + config.ethDns1.fromString(preferences.getString(ethDns1Key, DNS_SERV_1)); + config.ethDns2.fromString(preferences.getString(ethDns2Key, DNS_SERV_2)); + + preferences.end(); +} + +void saveVpnConfig(const VpnConfigStruct &config) +{ + preferences.begin(vpnConfigKey, false); + + preferences.putBool(wgEnableKey, config.wgEnable); + preferences.putString(wgLocalIPKey, config.wgLocalIP.toString()); + preferences.putString(wgLocalPrivKeyKey, config.wgLocalPrivKey); + preferences.putString(wgEndAddrKey, config.wgEndAddr); + preferences.putString(wgEndPubKeyKey, config.wgEndPubKey); + preferences.putInt(wgEndPortKey, config.wgEndPort); + + preferences.putBool(hnEnableKey, config.hnEnable); + preferences.putString(hnJoinCodeKey, config.hnJoinCode); + preferences.putString(hnHostNameKey, config.hnHostName); + preferences.putString(hnDashUrlKey, config.hnDashUrl); + + preferences.end(); +} + +void loadVpnConfig(VpnConfigStruct &config) +{ + preferences.begin(vpnConfigKey, true); + + config.wgEnable = preferences.getBool(wgEnableKey, false); + config.wgLocalIP.fromString(preferences.getString(wgLocalIPKey)); + strlcpy(config.wgLocalPrivKey, preferences.getString(wgLocalPrivKeyKey).c_str(), sizeof(config.wgLocalPrivKey)); + strlcpy(config.wgEndAddr, preferences.getString(wgEndAddrKey).c_str(), sizeof(config.wgEndAddr)); + strlcpy(config.wgEndPubKey, preferences.getString(wgEndPubKeyKey).c_str(), sizeof(config.wgEndPubKey)); + config.wgEndPort = preferences.getInt(wgEndPortKey); + + config.hnEnable = preferences.getBool(hnEnableKey, false); + strlcpy(config.hnJoinCode, preferences.getString(hnJoinCodeKey).c_str(), sizeof(config.hnJoinCode)); + strlcpy(config.hnHostName, preferences.getString(hnHostNameKey).c_str(), sizeof(config.hnHostName)); + strlcpy(config.hnDashUrl, preferences.getString(hnDashUrlKey).c_str(), sizeof(config.hnDashUrl)); + + preferences.end(); +} + +void saveMqttConfig(const MqttConfigStruct &config) +{ + preferences.begin(mqttConfigKey, false); + + preferences.putBool(enableKey, config.enable); + // preferences.putBool(connectKey, config.connect); + preferences.putString(serverKey, config.server); + //preferences.putString(serverIPKey, config.serverIP.toString()); + preferences.putInt(portKey, config.port); + preferences.putString(userKey, config.user); + preferences.putString(passKey, config.pass); + preferences.putString(topicKey, config.topic); + // preferences.putBool(retainKey, config.retain); // If needed + preferences.putInt(updateIntKey, config.updateInt); + preferences.putBool(discoveryKey, config.discovery); + preferences.putULong(reconnectIntKey, config.reconnectInt); + //preferences.putULong(heartbeatTimeKey, config.heartbeatTime); + + preferences.end(); +} + +void loadMqttConfig(MqttConfigStruct &config) +{ + preferences.begin(mqttConfigKey, true); + + config.enable = preferences.getBool(enableKey, false); + // config.connect = preferences.getBool(connect, false); + strlcpy(config.server, preferences.getString(serverKey, "").c_str(), sizeof(config.server)); + //config.serverIP.fromString(preferences.getString(serverIPKey)); + config.port = preferences.getInt(portKey, 1883); + strlcpy(config.user, preferences.getString(userKey, "").c_str(), sizeof(config.user)); + strlcpy(config.pass, preferences.getString(passKey, "").c_str(), sizeof(config.pass)); + strlcpy(config.topic, preferences.getString(topicKey, "").c_str(), sizeof(config.topic)); + // config.retain = preferences.getBool(retain, false); // If needed + config.updateInt = preferences.getInt(updateIntKey, 60); + config.discovery = preferences.getBool(discoveryKey, true); + config.reconnectInt = preferences.getULong(reconnectIntKey, 15); + //config.heartbeatTime = preferences.getULong(heartbeatTimeKey, 60000); + + preferences.end(); +} + +void saveSystemConfig(const SystemConfigStruct &config) +{ + preferences.begin(systemConfigKey, false); + + preferences.putBool(keepWebKey, config.keepWeb); + preferences.putBool(disableWebKey, config.disableWeb); + preferences.putBool(webAuthKey, config.webAuth); + preferences.putString(webUserKey, config.webUser); + preferences.putString(webPassKey, config.webPass); + preferences.putBool(fwEnabledKey, config.fwEnabled); + preferences.putString(fwIpKey, config.fwIp.toString()); + preferences.putInt(serialSpeedKey, config.serialSpeed); + preferences.putInt(socketPortKey, config.socketPort); + preferences.putInt(tempOffsetKey, config.tempOffset); + preferences.putBool(disableLedUSBKey, config.disableLedUSB); + preferences.putBool(disableLedPwrKey, config.disableLedPwr); + preferences.putBool(disableLedsKey, config.disableLeds); + preferences.putInt(refreshLogsKey, config.refreshLogs); + preferences.putString(hostnameKey, config.hostname); + preferences.putString(timeZoneKey, config.timeZone); + preferences.putString(ntpServ1Key, config.ntpServ1); + preferences.putString(ntpServ2Key, config.ntpServ2); + // preferences.putInt(prevWorkModeKey, static_cast(config.prevWorkMode)); + preferences.putInt(workModeKey, static_cast(config.workMode)); + + preferences.end(); +} + +void loadSystemConfig(SystemConfigStruct &config) +{ + preferences.begin(systemConfigKey, true); + + config.keepWeb = preferences.getBool(keepWebKey, true); + config.disableWeb = preferences.getBool(disableWebKey, false); + config.webAuth = preferences.getBool(webAuthKey, false); + strlcpy(config.webUser, preferences.getString(webUserKey, "").c_str(), sizeof(config.webUser)); + strlcpy(config.webPass, preferences.getString(webPassKey, "").c_str(), sizeof(config.webPass)); + config.fwEnabled = preferences.getBool(fwEnabledKey, false); + config.fwIp.fromString(preferences.getString(fwIpKey, "0.0.0.0")); + config.serialSpeed = preferences.getInt(serialSpeedKey, ZB_SERIAL_SPEED); + config.socketPort = preferences.getInt(socketPortKey, ZB_TCP_PORT); + config.tempOffset = preferences.getInt(tempOffsetKey, 0); + config.disableLedUSB = preferences.getBool(disableLedUSBKey, false); + config.disableLedPwr = preferences.getBool(disableLedPwrKey, false); + config.disableLeds = preferences.getBool(disableLedsKey, false); + config.refreshLogs = preferences.getInt(refreshLogsKey, 1000); + strlcpy(config.hostname, preferences.getString(hostnameKey, "XZG").c_str(), sizeof(config.hostname)); /// to do add def host name!! + strlcpy(config.timeZone, preferences.getString(timeZoneKey, NTP_TIME_ZONE).c_str(), sizeof(config.timeZone)); + strlcpy(config.ntpServ1, preferences.getString(ntpServ1Key, NTP_SERV_1).c_str(), sizeof(config.ntpServ1)); + strlcpy(config.ntpServ2, preferences.getString(ntpServ2Key, NTP_SERV_2).c_str(), sizeof(config.ntpServ2)); + // config.prevWorkMode = static_cast(preferences.getInt(prevWorkMode, WORK_MODE_NETWORK)); + // config.prevWorkMode = static_cast(preferences.getInt(prevWorkModeKey, WORK_MODE_NETWORK)); + config.workMode = static_cast(preferences.getInt(workModeKey, WORK_MODE_NETWORK)); + + preferences.end(); +} + +enum API_PAGE_t : uint8_t +{ + API_PAGE_ROOT, + API_PAGE_GENERAL, + API_PAGE_ETHERNET, + API_PAGE_NETWORK, + API_PAGE_ZIGBEE, + API_PAGE_SECURITY, + API_PAGE_TOOLS, + API_PAGE_ABOUT, + API_PAGE_MQTT, + API_PAGE_VPN +}; + +void updateConfiguration(WebServer &serverWeb, SystemConfigStruct &configSys, NetworkConfigStruct &configNet, VpnConfigStruct &configVpn, MqttConfigStruct &configMqtt) +{ + const char *pageId = "pageId"; + const char *on = "on"; + const char *contTypeText = "text/plain"; + + if (serverWeb.hasArg(pageId)) + { + switch (serverWeb.arg(pageId).toInt()) + { + case API_PAGE_GENERAL: + { + if (serverWeb.hasArg(coordMode)) + { + const uint8_t mode = serverWeb.arg(coordMode).toInt(); + if (mode <= 2 && mode >= 0) + { + // vars.workMode = static_cast(mode); + // if (mode == 1) + // wifiWebSetupInProgress = true; //to do + configSys.workMode = static_cast(mode); + } + } + if (serverWeb.hasArg(keepWebKey)) + { + configSys.keepWeb = serverWeb.arg(keepWebKey) == on; + } + + + if (serverWeb.hasArg(disableLedPwrKey)) + { + configSys.disableLedPwr = serverWeb.arg(disableLedPwrKey) == on; + } + + + if (serverWeb.hasArg(disableLedUSBKey)) + { + configSys.disableLedUSB = serverWeb.arg(disableLedUSBKey) == on; + } + + + if (serverWeb.hasArg(refreshLogsKey)) + { + configSys.refreshLogs = serverWeb.arg(refreshLogsKey).toInt(); + } + + const char *hostname = "hostname"; + if (serverWeb.hasArg(hostname)) + { + // Ensure the string does not exceed 49 characters, leaving space for the null terminator + strncpy(configSys.hostname, serverWeb.arg(hostname).c_str(), sizeof(configSys.hostname) - 1); + configSys.hostname[sizeof(configSys.hostname) - 1] = '\0'; // Guarantee a null terminator at the end + } + + const char *timeZoneName = "timeZoneName"; + if (serverWeb.hasArg(timeZoneName)) + { + strncpy(configSys.timeZone, serverWeb.arg(timeZoneName).c_str(), sizeof(configSys.timeZone) - 1); + configSys.timeZone[sizeof(configSys.timeZone) - 1] = '\0'; // Guarantee a null terminator at the end + } + + const char *ntpServ1 = "ntpServ1"; + if (serverWeb.hasArg(ntpServ1)) + { + strncpy(configSys.ntpServ1, serverWeb.arg(ntpServ1).c_str(), sizeof(configSys.ntpServ1) - 1); + configSys.ntpServ1[sizeof(configSys.ntpServ1) - 1] = '\0'; // Guarantee a null terminator at the end + } + const char *ntpServ2 = "ntpServ2"; + if (serverWeb.hasArg(ntpServ2)) + { + strncpy(configSys.ntpServ2, serverWeb.arg(ntpServ2).c_str(), sizeof(configSys.ntpServ2) - 1); + configSys.ntpServ2[sizeof(configSys.ntpServ2) - 1] = '\0'; // Guarantee a null terminator at the end + } + + saveSystemConfig(configSys); + } + break; + case API_PAGE_NETWORK: + { + const char *ethEnableKey = "ethEnbl"; + configNet.ethEnable = serverWeb.hasArg(ethEnableKey) == true; + + const char *ethDhcpKey = "dhcp"; + configNet.ethDhcp = serverWeb.hasArg(ethDhcpKey) == true; + + const char *ethAddrKey = "ipAddress"; + if (serverWeb.hasArg(ethAddrKey)) + { + configNet.ethAddr.fromString(serverWeb.arg(ethAddrKey)); + } + const char *ethMaskKey = "ipMask"; + if (serverWeb.hasArg(ethMaskKey)) + { + configNet.ethMask.fromString(serverWeb.arg(ethMaskKey)); + } + const char *ethGateKey = "ipGW"; + if (serverWeb.hasArg(ethGateKey)) + { + configNet.ethGate.fromString(serverWeb.arg(ethGateKey)); + } + const char *ethDns1Key = "ethDns1"; + if (serverWeb.hasArg(ethDns1Key)) + { + configNet.ethDns1.fromString(serverWeb.arg(ethDns1Key)); + } + const char *ethDns2Key = "ethDns2"; + if (serverWeb.hasArg(ethDns2Key)) + { + configNet.ethDns2.fromString(serverWeb.arg(ethDns2Key)); + } + + const char *wifiEnableKey = "wifiEnbl"; + configNet.wifiEnable = serverWeb.hasArg(wifiEnableKey) == true; + + const char *wifiDhcpKey = "dhcpWiFi"; + configNet.wifiDhcp = serverWeb.hasArg(wifiDhcpKey) == true; + + const char *wifiSsidKey = "WIFISSID"; + if (serverWeb.arg(wifiSsidKey)) + { + strncpy(configNet.wifiSsid, serverWeb.arg(wifiSsidKey).c_str(), sizeof(configNet.wifiSsid) - 1); + configNet.wifiSsid[sizeof(configNet.wifiSsid) - 1] = '\0'; // Guarantee a null terminator at the end + } + const char *wifiPasswordKey = "WIFIpassword"; + if (serverWeb.arg("WIFIpassword")) + { + strncpy(configNet.wifiPassword, serverWeb.arg(wifiPasswordKey).c_str(), sizeof(configNet.wifiPassword) - 1); + configNet.wifiPassword[sizeof(configNet.wifiPassword) - 1] = '\0'; // Guarantee a null terminator at the end + } + const char *wifiAddrKey = "ipAddress"; + if (serverWeb.hasArg(wifiAddrKey)) + { + configNet.wifiAddr.fromString(serverWeb.arg(wifiAddrKey)); + } + const char *wifiMaskKey = "ipMask"; + if (serverWeb.hasArg(wifiMaskKey)) + { + configNet.wifiMask.fromString(serverWeb.arg(wifiMaskKey)); + } + const char *wifiGateKey = "ipGW"; + if (serverWeb.hasArg(wifiGateKey)) + { + configNet.wifiGate.fromString(serverWeb.arg(wifiGateKey)); + } + const char *wifiDns1Key = "wifiDns1"; + if (serverWeb.hasArg(wifiDns1Key)) + { + configNet.wifiDns1.fromString(serverWeb.arg(wifiDns1Key)); + } + const char *wifiDns2Key = "wifiDns2"; + if (serverWeb.hasArg(wifiDns2Key)) + { + configNet.wifiDns2.fromString(serverWeb.arg(wifiDns2Key)); + } + + saveNetworkConfig(configNet); + + if (configNet.wifiEnable) + { + WiFi.persistent(false); + if (vars.apStarted) + { + WiFi.mode(WIFI_AP_STA); + } + else + { + WiFi.mode(WIFI_STA); + } + WiFi.begin(configNet.wifiSsid, configNet.wifiPassword); + } + } + break; + case API_PAGE_ZIGBEE: + { + const char *baud = "baud"; + if (serverWeb.hasArg(baud)) + { + configSys.serialSpeed = serverWeb.arg(baud).toInt(); + } + + if (serverWeb.hasArg(baud)) + { + configSys.socketPort = serverWeb.arg(portKey).toInt(); + } + + saveSystemConfig(configSys); + } + break; + case API_PAGE_SECURITY: + { + configSys.disableWeb = serverWeb.hasArg(disableWebKey) == true; + + configSys.webAuth = serverWeb.hasArg(webAuthKey) == true; + + if (serverWeb.hasArg(webUserKey)) + { + strncpy(configSys.webUser, serverWeb.arg(webUserKey).c_str(), sizeof(configSys.webUser) - 1); + configSys.webUser[sizeof(configSys.webUser) - 1] = '\0'; // Guarantee a null terminator at the end + } + + if (serverWeb.hasArg(webPassKey)) + { + strncpy(configSys.webPass, serverWeb.arg(webPassKey).c_str(), sizeof(configSys.webPass) - 1); + configSys.webPass[sizeof(configSys.webPass) - 1] = '\0'; // Guarantee a null terminator at the end + } + + configSys.fwEnabled = serverWeb.hasArg(fwEnabledKey) == true; + + if (serverWeb.hasArg(fwIpKey)) + { + configSys.fwIp.fromString(serverWeb.arg(fwIpKey)); + } + + saveSystemConfig(configSys); + } + break; + case API_PAGE_MQTT: + { + const char *MqttEnableKey = "MqttEnable"; + configMqtt.enable = serverWeb.hasArg(MqttEnableKey) == true; + + const char *MqttServerKey = "MqttServer"; + if (serverWeb.hasArg(MqttServerKey)) + { + strncpy(configMqtt.server, serverWeb.arg(MqttServerKey).c_str(), sizeof(configMqtt.server) - 1); + configMqtt.server[sizeof(configMqtt.server) - 1] = '\0'; // Guarantee a null terminator at the end + } + + const char *MqttPortKey = "MqttPort"; + if (serverWeb.hasArg(MqttPortKey)) + { + configMqtt.port = serverWeb.arg(MqttPortKey).toInt(); + } + + const char *MqttUserKey = "MqttUser"; + if (serverWeb.hasArg(MqttUserKey)) + { + strncpy(configMqtt.user, serverWeb.arg(MqttUserKey).c_str(), sizeof(configMqtt.user) - 1); + configMqtt.user[sizeof(configMqtt.user) - 1] = '\0'; // Guarantee a null terminator at the end + } + + const char *MqttPassKey = "MqttPass"; + if (serverWeb.hasArg(MqttPassKey)) + { + strncpy(configMqtt.pass, serverWeb.arg(MqttPassKey).c_str(), sizeof(configMqtt.pass) - 1); + configMqtt.pass[sizeof(configMqtt.pass) - 1] = '\0'; // Guarantee a null terminator at the end + } + + const char *MqttTopicKey = "MqttTopic"; + if (serverWeb.hasArg(MqttTopicKey)) + { + strncpy(configMqtt.topic, serverWeb.arg(MqttTopicKey).c_str(), sizeof(configMqtt.topic) - 1); + configMqtt.topic[sizeof(configMqtt.topic) - 1] = '\0'; // Guarantee a null terminator at the end + } + + const char *MqttIntervalKey = "MqttInterval"; + if (serverWeb.hasArg(MqttIntervalKey)) + { + configMqtt.updateInt = serverWeb.arg(MqttIntervalKey).toInt(); + } + + const char *MqttDiscoveryKey = "MqttDiscovery"; + configMqtt.discovery = serverWeb.hasArg(MqttDiscoveryKey) == true; + + saveMqttConfig(configMqtt); + } + break; + case API_PAGE_VPN: + { + const char *WgEnableKey = "WgEnable"; + configVpn.wgEnable = serverWeb.hasArg(WgEnableKey) == true; + + const char *WgLocalAddrKey = "WgLocalAddr"; + if (serverWeb.hasArg(WgLocalAddrKey)) + { + configVpn.wgLocalIP.fromString(serverWeb.arg(WgLocalAddrKey)); + } + + const char *WgLocalPrivKeyKey = "WgLocalPrivKey"; + if (serverWeb.hasArg(WgLocalPrivKeyKey)) + { + strncpy(configVpn.wgLocalPrivKey, serverWeb.arg(WgLocalPrivKeyKey).c_str(), sizeof(configVpn.wgLocalPrivKey) - 1); + configVpn.wgLocalPrivKey[sizeof(configVpn.wgLocalPrivKey) - 1] = '\0'; // Guarantee a null terminator at the end + } + + const char *WgEndAddrKey = "WgEndAddr"; + if (serverWeb.hasArg(WgEndAddrKey)) + { + strncpy(configVpn.wgEndAddr, serverWeb.arg(WgEndAddrKey).c_str(), sizeof(configVpn.wgEndAddr) - 1); + configVpn.wgEndAddr[sizeof(configVpn.wgEndAddr) - 1] = '\0'; // Guarantee a null terminator at the end + } + + const char *WgEndPubKeyKey = "WgEndPubKey"; + if (serverWeb.hasArg(WgEndPubKeyKey)) + { + strncpy(configVpn.wgEndPubKey, serverWeb.arg(WgEndPubKeyKey).c_str(), sizeof(configVpn.wgEndPubKey) - 1); + configVpn.wgEndPubKey[sizeof(configVpn.wgEndPubKey) - 1] = '\0'; // Guarantee a null terminator at the end + } + + const char *WgEndPortKey = "WgEndPort"; + if (serverWeb.hasArg(WgEndPortKey)) + { + configVpn.wgEndPort = serverWeb.arg(WgEndPortKey).toInt(); + } + + const char *HnEnableKey = "HnEnable"; + configVpn.hnEnable = serverWeb.hasArg(HnEnableKey) == true; + + const char *HnJoinCodeKey = "HnJoinCode"; + if (serverWeb.hasArg(HnJoinCodeKey)) + { + strncpy(configVpn.hnJoinCode, serverWeb.arg(HnJoinCodeKey).c_str(), sizeof(configVpn.hnJoinCode) - 1); + configVpn.hnJoinCode[sizeof(configVpn.hnJoinCode) - 1] = '\0'; // Guarantee a null terminator at the end + } + + const char *HnHostNameKey = "HnHostName"; + if (serverWeb.hasArg(HnHostNameKey)) + { + strncpy(configVpn.hnHostName, serverWeb.arg(HnHostNameKey).c_str(), sizeof(configVpn.hnHostName) - 1); + configVpn.hnHostName[sizeof(configVpn.hnHostName) - 1] = '\0'; // Guarantee a null terminator at the end + } + + const char *HnDashUrlKey = "HnDashUrl"; + if (serverWeb.hasArg(HnDashUrlKey)) + { + strncpy(configVpn.hnDashUrl, serverWeb.arg(HnDashUrlKey).c_str(), sizeof(configVpn.hnDashUrl) - 1); + configVpn.hnDashUrl[sizeof(configVpn.hnDashUrl) - 1] = '\0'; // Guarantee a null terminator at the end + } + + saveVpnConfig(configVpn); + } + break; + } + // String cfg = makeJsonConfig(&configNet, &configVpn, &configMqtt, &configSys); + // DEBUG_PRINTLN(cfg); + serverWeb.send(HTTP_CODE_OK, contTypeText, "ok"); + } + else + { + serverWeb.send(500, contTypeText, "bad args"); + } +} + +// Serialization NetworkConfigStruct into JSON +void serializeNetworkConfigToJson(const NetworkConfigStruct &config, JsonObject obj) +{ + obj[wifiEnableKey] = config.wifiEnable; + obj[wifiSsidKey] = config.wifiSsid; + obj[wifiPasswordKey] = config.wifiPassword; + obj[wifiDhcpKey] = config.wifiDhcp; + obj[wifiAddrKey] = config.wifiAddr.toString(); + obj[wifiMaskKey] = config.wifiMask.toString(); + obj[wifiGateKey] = config.wifiGate.toString(); + obj[wifiDns1Key] = config.wifiDns1.toString(); + obj[wifiDns2Key] = config.wifiDns2.toString(); + obj[ethEnableKey] = config.ethEnable; + obj[ethDhcpKey] = config.ethDhcp; + obj[ethAddrKey] = config.ethAddr.toString(); + obj[ethMaskKey] = config.ethMask.toString(); + obj[ethGateKey] = config.ethGate.toString(); + obj[ethDns1Key] = config.ethDns1.toString(); + obj[ethDns2Key] = config.ethDns2.toString(); +} + +// Serialization VpnConfigStruct into JSON +void serializeVpnConfigToJson(const VpnConfigStruct &config, JsonObject obj) +{ + obj[wgEnableKey] = config.wgEnable; + obj[wgLocalIPKey] = config.wgLocalIP.toString(); + obj[wgLocalPrivKeyKey] = config.wgLocalPrivKey; + obj[wgEndAddrKey] = config.wgEndAddr; + obj[wgEndPubKeyKey] = config.wgEndPubKey; + obj[wgEndPortKey] = config.wgEndPort; + obj[hnEnableKey] = config.hnEnable; + obj[hnJoinCodeKey] = config.hnJoinCode; + obj[hnHostNameKey] = config.hnHostName; + obj[hnDashUrlKey] = config.hnDashUrl; +} + +// Serialization MqttConfigStruct into JSON +void serializeMqttConfigToJson(const MqttConfigStruct &config, JsonObject obj) +{ + obj[enableKey] = config.enable; + obj[serverKey] = config.server; + //obj[serverIPKey] = config.serverIP.toString(); + obj[portKey] = config.port; + obj[userKey] = config.user; + obj[passKey] = config.pass; + obj[topicKey] = config.topic; + obj[updateIntKey] = config.updateInt; + obj[discoveryKey] = config.discovery; + obj[reconnectIntKey] = config.reconnectInt; + //obj[heartbeatTimeKey] = config.heartbeatTime; +} + +// Serialization SystemConfigStruct into JSON +void serializeSystemConfigToJson(const SystemConfigStruct &config, JsonObject obj) +{ + obj[keepWebKey] = config.keepWeb; + obj[disableWebKey] = config.disableWeb; + obj[webAuthKey] = config.webAuth; + obj[webUserKey] = config.webUser; + obj[webPassKey] = config.webPass; + obj[fwEnabledKey] = config.fwEnabled; + obj[fwIpKey] = config.fwIp.toString(); + obj[serialSpeedKey] = config.serialSpeed; + obj[socketPortKey] = config.socketPort; + obj[tempOffsetKey] = config.tempOffset; + obj[disableLedUSBKey] = config.disableLedUSB; + obj[disableLedPwrKey] = config.disableLedPwr; + obj[disableLedsKey] = config.disableLeds; + obj[refreshLogsKey] = config.refreshLogs; + obj[hostnameKey] = config.hostname; + obj[timeZoneKey] = config.timeZone; + obj[ntpServ1Key] = config.ntpServ1; + obj[ntpServ2Key] = config.ntpServ2; + // obj[prevWorkModeKey] = static_cast(config.prevWorkMode); + obj[workModeKey] = static_cast(config.workMode); +} + +void serializeSysVarsToJson(const SysVarsStruct &vars, JsonObject obj) +{ + // Serializing system variables to JSON + obj[hwBtnIsKey] = vars.hwBtnIs; + obj[hwLedUsbIsKey] = vars.hwLedUsbIs; + obj[hwLedPwrIsKey] = vars.hwLedPwrIs; + obj[hwUartSelIsKey] = vars.hwUartSelIs; + obj[hwZigbeeIsKey] = vars.hwZigbeeIs; + + // Assuming WORK_MODE_t can be directly cast to int for serialization + obj[workModeKey] = static_cast(vars.workMode); + + // Serializing an array of connectedSocket + /*JsonArray connectedSocketArray = obj.createNestedArray(connectedSocket); + for (bool socket : vars.connectedSocket) { + connectedSocketArray.add(socket); + }*/ + + obj[connectedClientsKey] = vars.connectedClients; + obj[socketTimeKey] = vars.socketTime; + obj[connectedEtherKey] = vars.connectedEther; + obj[apStartedKey] = vars.apStarted; + obj[wifiWebSetupInProgressKey] = vars.wifiWebSetupInProgress; + + obj[vpnWgInitKey] = vars.vpnWgInit; + obj[vpnWgConnectKey] = vars.vpnWgConnect; + obj[vpnWgPeerIpKey] = vars.vpnWgPeerIp.toString(); // Assuming IPAddress can be converted to string + obj[vpnWgCheckTimeKey] = vars.vpnWgCheckTime; + obj[vpnHnInitKey] = vars.vpnHnInit; + + obj[mqttConnKey] = vars.mqttConn; + obj[mqttReconnectTimeKey] = vars.mqttReconnectTime; + obj[mqttHeartbeatTimeKey] = vars.mqttHeartbeatTime; + + obj[zbLedStateKey] = vars.zbLedState; + obj[zbFlashingKey] = vars.zbFlashing; +} + +bool loadFileConfigHW() +{ + const char *board = "board"; + const char *addr = "addr"; + const char *pwrPin = "pwrPin"; + const char *mdcPin = "mdcPin"; + const char *mdiPin = "mdiPin"; + const char *phyType = "phyType"; + const char *clkMode = "clkMode"; + const char *pwrAltPin = "pwrAltPin"; + const char *btnPin = "btnPin"; + const char *uartChPin = "uartChPin"; + const char *ledUsbPin = "ledUsbPin"; + const char *ledPwrPin = "ledPwrPin"; + const char *zbTxPin = "zbTxPin"; + const char *zbRxPin = "zbRxPin"; + const char *zbRstPin = "zbRstPin"; + const char *zbBslPin = "zbBslPin"; + + File configFile = LittleFS.open(configFileHw, FILE_READ); + + if (!configFile) + { + DynamicJsonDocument config(300); + config[board] = ""; + /* + config[addr] = -1; + config[pwrPin] = -1; + config[mdcPin] = -1; + config[mdiPin] = -1; + config[phyType] = -1; + config[clkMode] = -1; + config[pwrAltPin] = -1; + config[btnPin] = -1; + config[uartChPin] = -1; + config[ledUsbPin] = -1; + config[ledPwrPin] = -1; + config[zbTxPin] = -1; + config[zbRxPin] = -1; + config[zbRstPin] = -1; + config[zbBslPin] = -1; + */ + writeDefaultConfig(configFileHw, config); + configFile = LittleFS.open(configFileHw, FILE_READ); + } + + DynamicJsonDocument config(1024); + deserializeJson(config, configFile); + + DEBUG_PRINTLN(configFile.readString()); + configFile.close(); + + strlcpy(hwConfig.board, config[board] | "", sizeof(hwConfig.board)); + hwConfig.eth.addr = config[addr]; + hwConfig.eth.pwrPin = config[pwrPin]; + hwConfig.eth.mdcPin = config[mdcPin]; + hwConfig.eth.mdiPin = config[mdiPin]; + hwConfig.eth.phyType = config[phyType]; + hwConfig.eth.clkMode = config[clkMode]; + hwConfig.eth.pwrAltPin = config[pwrAltPin]; + hwConfig.mist.btnPin = config[btnPin]; + hwConfig.mist.uartSelPin = config[uartChPin]; + hwConfig.mist.ledUsbPin = config[ledUsbPin]; + hwConfig.mist.ledPwrPin = config[ledPwrPin]; + hwConfig.zb.txPin = config[zbTxPin]; + hwConfig.zb.rxPin = config[zbRxPin]; + hwConfig.zb.rstPin = config[zbRstPin]; + hwConfig.zb.bslPin = config[zbBslPin]; + + if (hwConfig.board[0] != '\0' && strlen(hwConfig.board) > 0) + { + DEBUG_PRINTLN("hwConfig LOAD - OK"); + + delay(1000); + return true; + } + else + { + DEBUG_PRINTLN("hwConfig LOAD - ERROR"); + delay(1000); + int searchId = 0; + if (config["searchId"]) + { + searchId = config["searchId"]; + } + BrdConfigStruct *newConfig = findBrdConfig(searchId); + if (newConfig) + { + DEBUG_PRINTLN(F("Saving HW config")); + + DynamicJsonDocument config(512); + config[board] = newConfig->board; + config[addr] = newConfig->eth.addr; + config[pwrPin] = newConfig->eth.pwrPin; + config[mdcPin] = newConfig->eth.mdcPin; + config[mdiPin] = newConfig->eth.mdiPin; + config[phyType] = newConfig->eth.phyType; + config[clkMode] = newConfig->eth.clkMode; + config[pwrAltPin] = newConfig->eth.pwrAltPin; + config[btnPin] = newConfig->mist.btnPin; + config[uartChPin] = newConfig->mist.uartSelPin; + config[ledUsbPin] = newConfig->mist.ledUsbPin; + config[ledPwrPin] = newConfig->mist.ledPwrPin; + config[zbTxPin] = newConfig->zb.txPin; + config[zbRxPin] = newConfig->zb.rxPin; + config[zbRstPin] = newConfig->zb.rstPin; + config[zbBslPin] = newConfig->zb.bslPin; + writeDefaultConfig(configFileHw, config); + // configFile = LittleFS.open(configFileHw, FILE_WRITE); + // serializeJson(config, configFile); + + // serializeJson(config, Serial); + // configFile.close(); + + // delay(500); + DEBUG_PRINTLN(F("Restarting...")); + ESP.restart(); + } + } + return false; +} + +/* Previous firmware read config support. start */ + +const char *msg_file_rm = "OK. Remove old format file"; +const char *msg_open_f = "open failed"; + +bool loadFileSystemVar() +{ + DEBUG_PRINT(F(configFileSystem)); + + File configFile = LittleFS.open(configFileSystem, FILE_READ); + if (!configFile) + { + DEBUG_PRINTLN(F(msg_open_f)); + return false; + } + + DynamicJsonDocument doc(200); + DeserializationError error = deserializeJson(doc, configFile); + + if (error) + { + DEBUG_PRINTLN(error.f_str()); + configFile.close(); + return false; + } + + systemCfg.tempOffset = (int)doc[tempOffsetKey]; + + configFile.close(); + DEBUG_PRINTLN(F(msg_file_rm)); + saveSystemConfig(systemCfg); + LittleFS.remove(configFileSystem); + return true; +} + +bool loadFileConfigWifi() +{ + DEBUG_PRINT(F(configFileWifi)); + + const char *enableWiFi = "enableWiFi"; + const char *ssid = "ssid"; + const char *dhcpWiFi = "dhcpWiFi"; + const char *ip = "ip"; + const char *mask = "mask"; + const char *gw = "gw"; + + File configFile = LittleFS.open(configFileWifi, FILE_READ); + if (!configFile) + { + DEBUG_PRINTLN(F(msg_open_f)); + return false; + } + + DynamicJsonDocument doc(512); + DeserializationError error = deserializeJson(doc, configFile); + + if (error) + { + DEBUG_PRINTLN(error.f_str()); + configFile.close(); + return false; + } + + networkCfg.wifiDhcp = (int)doc[dhcpWiFi]; + strlcpy(networkCfg.wifiSsid, doc[ssid] | "", sizeof(networkCfg.wifiSsid)); + strlcpy(networkCfg.wifiPassword, doc[passKey] | "", sizeof(networkCfg.wifiPassword)); + + networkCfg.wifiAddr.fromString(doc[ip] | ""); + networkCfg.wifiMask.fromString(doc[mask] | ""); + networkCfg.wifiGate.fromString(doc[gw] | ""); + + configFile.close(); + DEBUG_PRINTLN(F(msg_file_rm)); + saveNetworkConfig(networkCfg); + LittleFS.remove(configFileWifi); + return true; +} + +bool loadFileConfigEther() +{ + DEBUG_PRINT(F(configFileEther)); + + const char *dhcp = "dhcp"; + const char *ip = "ip"; + const char *mask = "mask"; + const char *gw = "gw"; + File configFile = LittleFS.open(configFileEther, FILE_READ); + if (!configFile) + { + DEBUG_PRINTLN(F(msg_open_f)); + return false; + } + + DynamicJsonDocument doc(512); + DeserializationError error = deserializeJson(doc, configFile); + + if (error) + { + DEBUG_PRINTLN(error.f_str()); + configFile.close(); + return false; + } + + networkCfg.ethDhcp = (int)doc[dhcp]; + networkCfg.ethAddr.fromString(doc[ip] | ""); + networkCfg.ethMask.fromString(doc[mask] | ""); + networkCfg.ethGate.fromString(doc[gw] | ""); + + configFile.close(); + DEBUG_PRINTLN(F(msg_file_rm)); + saveNetworkConfig(networkCfg); + LittleFS.remove(configFileEther); + return true; +} + +bool loadFileConfigGeneral() +{ + DEBUG_PRINT(F(configFileGeneral)); + const char *hostname = "hostname"; + + + File configFile = LittleFS.open(configFileGeneral, FILE_READ); + + if (!configFile) + { + DEBUG_PRINTLN(F(msg_open_f)); + return false; + } + + DynamicJsonDocument doc(512); + DeserializationError error = deserializeJson(doc, configFile); + + if (error) + { + DEBUG_PRINTLN(error.f_str()); + configFile.close(); + return false; + } + + if ((double)doc[refreshLogsKey] < 1000) + { + systemCfg.refreshLogs = 1000; + } + else + { + systemCfg.refreshLogs = (int)doc[refreshLogsKey]; + } + // DEBUG_PRINT(F("[loadFileConfigGeneral] 'doc[coordMode]' res is: ")); + // DEBUG_PRINTLN(String((uint8_t)doc[coordMode])); + + strlcpy(systemCfg.hostname, doc[hostname] | "", sizeof(systemCfg.hostname)); + + vars.workMode = static_cast((uint8_t)doc[coordMode]); + systemCfg.prevWorkMode = static_cast((uint8_t)doc[prevCoordMode]); + // DEBUG_PRINT(F("[loadFileConfigGeneral] 'vars.workMode' res is: ")); + // DEBUG_PRINTLN(String(vars.workMode)); + + systemCfg.disableLedPwr = (uint8_t)doc[disableLedPwrKey]; + // DEBUG_PRINTLN(F("[loadFileConfigGeneral] disableLedPwr")); + systemCfg.disableLedUSB = (uint8_t)doc[disableLedUSBKey]; + // DEBUG_PRINTLN(F("[loadFileConfigGeneral] disableLedUSB")); + systemCfg.disableLeds = (uint8_t)doc[disableLedsKey]; + // DEBUG_PRINTLN(F("[loadFileConfigGeneral] disableLeds")); + systemCfg.keepWeb = (uint8_t)doc[keepWebKey]; + // DEBUG_PRINTLN(F("[loadFileConfigGeneral] disableLeds")); + strlcpy(systemCfg.timeZone, doc[timeZoneKey] | "", sizeof(systemCfg.timeZone)); + + configFile.close(); + DEBUG_PRINTLN(F(msg_file_rm)); + saveSystemConfig(systemCfg); + LittleFS.remove(configFileGeneral); + return true; +} + +bool loadFileConfigSecurity() +{ + DEBUG_PRINT(F(configFileSecurity)); + File configFile = LittleFS.open(configFileSecurity, FILE_READ); + if (!configFile) + { + DEBUG_PRINTLN(F(msg_open_f)); + return false; + } + + DynamicJsonDocument doc(512); + DeserializationError error = deserializeJson(doc, configFile); + + if (error) + { + DEBUG_PRINTLN(error.f_str()); + configFile.close(); + return false; + } + + systemCfg.disableWeb = (uint8_t)doc[disableWebKey]; + systemCfg.webAuth = (uint8_t)doc[webAuthKey]; + strlcpy(systemCfg.webUser, doc[webUserKey] | "", sizeof(systemCfg.webUser)); + strlcpy(systemCfg.webPass, doc[webPassKey] | "", sizeof(systemCfg.webPass)); + systemCfg.fwEnabled = (uint8_t)doc[fwEnabledKey]; + systemCfg.fwIp.fromString(doc[fwIpKey] | "0.0.0.0"); + + configFile.close(); + DEBUG_PRINTLN(F(msg_file_rm)); + saveSystemConfig(systemCfg); + LittleFS.remove(configFileSecurity); + return true; +} + +bool loadFileConfigSerial() +{ + DEBUG_PRINT(F(configFileSerial)); + const char *baud = "baud"; + File configFile = LittleFS.open(configFileSerial, FILE_READ); + + if (!configFile) + { + DEBUG_PRINTLN(F(msg_open_f)); + return false; + } + + DynamicJsonDocument doc(512); + DeserializationError error = deserializeJson(doc, configFile); + + serializeJson(doc, Serial); + + if (error) + { + DEBUG_PRINTLN(error.f_str()); + configFile.close(); + return false; + } + + systemCfg.serialSpeed = (int)doc[baud]; + systemCfg.socketPort = (int)doc[portKey]; + + configFile.close(); + DEBUG_PRINTLN(F(msg_file_rm)); + saveSystemConfig(systemCfg); + LittleFS.remove(configFileSerial); + return true; +} + +bool loadFileConfigMqtt() +{ + DEBUG_PRINT(F(configFileMqtt)); + + + File configFile = LittleFS.open(configFileMqtt, FILE_READ); + if (!configFile) + { + DEBUG_PRINTLN(F(msg_open_f)); + return false; + } + + DynamicJsonDocument doc(512); + DeserializationError error = deserializeJson(doc, configFile); + + serializeJson(doc, Serial); + if (error) + { + DEBUG_PRINTLN(error.f_str()); + configFile.close(); + if (error == DeserializationError::EmptyInput) + { + DEBUG_PRINTLN(F(msg_file_rm)); + LittleFS.remove(configFileMqtt); + } + return false; + } + + mqttCfg.enable = (int)doc[enableKey]; + strlcpy(mqttCfg.server, doc[serverKey] | "", sizeof(mqttCfg.server)); + //mqttCfg.serverIP.fromString(mqttCfg.server); // parse_ip_address(mqttCfg.server); + mqttCfg.port = (int)doc[portKey]; + strlcpy(mqttCfg.user, doc[userKey] | "", sizeof(mqttCfg.user)); + strlcpy(mqttCfg.pass, doc[passKey] | "", sizeof(mqttCfg.pass)); + strlcpy(mqttCfg.topic, doc[topicKey] | "", sizeof(mqttCfg.topic)); + mqttCfg.updateInt = (int)doc[intervalKey]; + mqttCfg.discovery = (int)doc[discoveryKey]; + + configFile.close(); + saveMqttConfig(mqttCfg); + DEBUG_PRINTLN(F("OK")); + return true; +} + +bool loadFileConfigWg() +{ + DEBUG_PRINT(F(configFileWg)); + const char *localAddr = "localAddr"; + const char *localPrivKey = "localIP"; + const char *endAddr = "endAddr"; + const char *endPubKey = "endPubKey"; + const char *endPort = "endPort"; + + File configFile = LittleFS.open(configFileWg, FILE_READ); + if (!configFile) + { + DEBUG_PRINTLN(F(msg_open_f)); + return false; + } + + DynamicJsonDocument doc(512); + DeserializationError error = deserializeJson(doc, configFile); + + if (error) + { + DEBUG_PRINTLN(error.f_str()); + configFile.close(); + if (error == DeserializationError::EmptyInput) + { + DEBUG_PRINTLN(F(msg_file_rm)); + LittleFS.remove(configFileWg); + } + return false; + } + + vpnCfg.wgEnable = (int)doc[enableKey]; + + // strlcpy(WgSettings.localAddr, doc[localAddr] | "", sizeof(WgSettings.localAddr)); + + vpnCfg.wgLocalIP.fromString(doc[localAddr] | ""); // parse_ip_address(doc[localAddr]); + + strlcpy(vpnCfg.wgLocalPrivKey, doc[localPrivKey] | "", sizeof(vpnCfg.wgLocalPrivKey)); + strlcpy(vpnCfg.wgEndAddr, doc[endAddr] | "", sizeof(vpnCfg.wgEndAddr)); + strlcpy(vpnCfg.wgEndPubKey, doc[endPubKey] | "", sizeof(vpnCfg.wgEndPubKey)); + vpnCfg.wgEndPort = (int)doc[endPort]; + + configFile.close(); + saveVpnConfig(vpnCfg); + DEBUG_PRINTLN(F("OK")); + return true; +} + +/* Previous firmware read config support. end */ \ No newline at end of file diff --git a/src/config.h b/src/config.h index f4e4732..fdb87cc 100644 --- a/src/config.h +++ b/src/config.h @@ -2,31 +2,24 @@ #define CONFIG_H_ #include -#include +#include +#include #include "version.h" - -// #define DEBUG -// ESP32 PINS TO CONTROL LAN8720 -/* -#define ETH_CLK_MODE_1 ETH_CLOCK_GPIO17_OUT -#define ETH_POWER_PIN_ALTERNATIVE_1 5 -#define ETH_POWER_PIN_1 -1 -#define ETH_TYPE_1 ETH_PHY_LAN8720 -#define ETH_ADDR_1 0 -#define ETH_MDC_PIN_1 23 -#define ETH_MDIO_PIN_1 18 -*/ -// ESP32 PINS TO CONTROL CC2652P -// #define CC2652P_RST 16 -// #define CC2652P_FLASH 32 -// #define CC2652P_RXD 36 -// #define CC2652P_TXD 4 -// #define BTN 35 -// #define MODE_SWITCH 33 +#include +#include +#include #define DEBOUNCE_TIME 70 -#define TCP_LISTEN_PORT 9999 // any port ever. later setup from config file +#define ZB_TCP_PORT 9999 // any port ever. later setup from config file +#define ZB_SERIAL_SPEED 115200 +#define NTP_TIME_ZONE "Europe/Kiev" +#define NTP_SERV_1 "pool.ntp.org" +#define NTP_SERV_2 "time.google.com" +#define DNS_SERV_1 "1.1.1.1" +#define DNS_SERV_2 "8.8.8.8" +#define NETWORK_MASK "255.255.255.0" + #define MAX_SOCKET_CLIENTS 5 #define FORMAT_LITTLEFS_IF_FAILED true @@ -37,14 +30,12 @@ const int16_t overseerInterval = 5 * 1000; // check lan or wifi connection every 5sec const uint8_t overseerMaxRetry = 3; // 5x12 = 60sec delay for AP start -// const uint8_t LED_USB = 12; // RED -// const uint8_t LED_PWR = 14; // BLUE -enum COORDINATOR_MODE_t : uint8_t +enum WORK_MODE_t : uint8_t { - COORDINATOR_MODE_LAN, - COORDINATOR_MODE_WIFI, - COORDINATOR_MODE_USB + WORK_MODE_NETWORK, + // COORDINATOR_MODE_WIFI, + WORK_MODE_USB }; extern const char *coordMode; // coordMode node name @@ -60,48 +51,198 @@ extern const char *configFileWg; extern const char *configFileHw; // extern const char *deviceModel; -struct ConfigSettingsStruct + +struct SysVarsStruct { - char ssid[50]; - char password[50]; - char ipAddressWiFi[18]; - char ipMaskWiFi[16]; - char ipGWWiFi[18]; - bool dhcpWiFi; - bool dhcp; - bool connectedEther; - char ipAddress[18]; - char ipMask[16]; - char ipGW[18]; - int serialSpeed; - int socketPort; - bool disableWeb; - int refreshLogs; - char hostname[50]; - bool connectedSocket[10]; - int connectedClients; - unsigned long socketTime; - int tempOffset; + bool hwBtnIs = false; + bool hwLedUsbIs = false; + bool hwLedPwrIs = false; + bool hwUartSelIs = false; + bool hwZigbeeIs = false; + + WORK_MODE_t workMode; // for button // WORK_MODE_t + + bool connectedSocket[MAX_SOCKET_CLIENTS]; //[10] + int connectedClients; + unsigned long socketTime; + + bool connectedEther = false; + + bool apStarted = false; + bool wifiWebSetupInProgress = false; + + bool vpnWgInit = false; + bool vpnWgConnect = false; + IPAddress vpnWgPeerIp; + unsigned long vpnWgCheckTime; + + bool vpnHnInit = false; + bool mqttConn = true; + unsigned long mqttReconnectTime; + unsigned long mqttHeartbeatTime; + + bool zbLedState; + bool zbFlashing; +}; + +// Network configuration structure +struct NetworkConfigStruct +{ + // Wi-Fi + bool wifiEnable; + char wifiSsid[50]; + char wifiPassword[50]; + bool wifiDhcp; + IPAddress wifiAddr; + IPAddress wifiMask; + IPAddress wifiGate; + IPAddress wifiDns1; + IPAddress wifiDns2; + // LAN + bool ethEnable; + bool ethDhcp; + IPAddress ethAddr; + IPAddress ethMask; + IPAddress ethGate; + IPAddress ethDns1; + IPAddress ethDns2; +}; + +// Function prototypes for NetworkConfigStruct +void saveNetworkConfig(const NetworkConfigStruct &config); +void loadNetworkConfig(NetworkConfigStruct &config); + +// VPN configuration structure +struct VpnConfigStruct +{ + // Wireguard + bool wgEnable; + IPAddress wgLocalIP; + char wgLocalPrivKey[50]; + char wgEndAddr[50]; + char wgEndPubKey[50]; + int wgEndPort; + // Husarnet + bool hnEnable; + char hnJoinCode[80]; + char hnHostName[30]; + char hnDashUrl[30]; +}; + +// Function prototypes for VpnConfigStruct +void saveVpnConfig(const VpnConfigStruct &config); +void loadVpnConfig(VpnConfigStruct &config); + +// MQTT configuration structure +struct MqttConfigStruct +{ + bool enable; + // bool connect; + char server[50]; + //IPAddress serverIP; + int port; + char user[50]; + char pass[50]; + char topic[50]; + // bool retain; // commented as per the structure definition + int updateInt; + bool discovery; + int reconnectInt; + //unsigned long heartbeatTime; +}; + +// Function prototypes for MqttConfigStruct +void saveMqttConfig(const MqttConfigStruct &config); +void loadMqttConfig(MqttConfigStruct &config); + +struct SystemConfigStruct +{ + bool keepWeb; // when usb mode active + + bool disableWeb; // when socket connected bool webAuth; char webUser[50]; char webPass[50]; + + bool fwEnabled; // firewall for socket connection + IPAddress fwIp; // allowed IP + + int serialSpeed; + int socketPort; + + int tempOffset; + bool disableLedUSB; bool disableLedPwr; - // bool disablePingCtrl; bool disableLeds; - COORDINATOR_MODE_t coordinator_mode; - COORDINATOR_MODE_t prevCoordinator_mode; // for button - bool keepWeb; - bool apStarted; - bool wifiWebSetupInProgress; - bool fwEnabled; - IPAddress fwIp; - bool zbLedState; - bool zbFlashing; + int refreshLogs; + char hostname[50]; + char timeZone[50]; + char ntpServ1[50]; + char ntpServ2[50]; + + WORK_MODE_t prevWorkMode; // for button // WORK_MODE_t + WORK_MODE_t workMode; // for button // WORK_MODE_t }; +// Function prototypes for SystemConfigStruct +void saveSystemConfig(const SystemConfigStruct &config); +void loadSystemConfig(SystemConfigStruct &config); + +// Serialization function declarations +void serializeNetworkConfigToJson(const NetworkConfigStruct &config, JsonObject obj); +void serializeVpnConfigToJson(const VpnConfigStruct &config, JsonObject obj); +void serializeMqttConfigToJson(const MqttConfigStruct &config, JsonObject obj); +void serializeSystemConfigToJson(const SystemConfigStruct &config, JsonObject obj); +void serializeSysVarsToJson(const SysVarsStruct &vars, JsonObject obj); + +void updateConfiguration(WebServer &server, SystemConfigStruct &configSys, NetworkConfigStruct &configNet, VpnConfigStruct &configVpn, MqttConfigStruct &configMqtt); + +/* +struct ConfigSettingsStruct +{ + char ssid[50]; //+ + char password[50]; //+ + char ipAddressWiFi[18]; //+ + char ipMaskWiFi[16]; //+ + char ipGWWiFi[18]; //+ + bool dhcpWiFi; //+ + bool dhcp; //+ + *bool connectedEther; //+ + char ipAddress[18]; //+ + char ipMask[16]; //+ + char ipGW[18]; //+ + int serialSpeed; //+ + int socketPort; //+ + bool disableWeb; //+ + int refreshLogs; //+ + char hostname[50]; //+ + bool connectedSocket[10]; //+ + int connectedClients; //+ + unsigned long socketTime; //+ + int tempOffset; //+ + bool webAuth; //+ + char webUser[50]; //+ + char webPass[50]; //+ + bool disableLedUSB; //+ + bool disableLedPwr; //+ + // bool disablePingCtrl; + bool disableLeds; //+ + WORK_MODE_t coordinator_mode; //+ + WORK_MODE_t prevCoordinator_mode; // for button //+ + bool keepWeb; //+ + bool apStarted; //+ + bool wifiWebSetupInProgress; + bool fwEnabled; //+ + IPAddress fwIp; //+ + + bool zbLedState; //+ + bool zbFlashing; //+ + char timeZone[50]; //+ +};*/ +/* struct MqttSettingsStruct { bool enable; @@ -117,28 +258,19 @@ struct MqttSettingsStruct bool discovery; unsigned long reconnectTime; unsigned long heartbeatTime; -}; - +};*/ +/* struct WgSettingsStruct { bool enable; bool init = 0; - char localAddr[20]; + char localAddr[16]; IPAddress localIP; char localPrivKey[45]; char endAddr[45]; char endPubKey[45]; int endPort; -}; - -/* -struct InfosStruct -{ - char device[8]; - char mac[8]; - char flash[8]; -}; -*/ +};*/ struct zbVerStruct { @@ -155,11 +287,33 @@ typedef CircularBuffer LogConsoleType; // #define WL_MAC_ADDR_LENGTH 6 +void initNVS(); +void printNVSFreeSpace(); +void eraseNVS(); +String makeJsonConfig(const NetworkConfigStruct *networkCfg = nullptr, + const VpnConfigStruct *vpnCfg = nullptr, + const MqttConfigStruct *mqttCfg = nullptr, + const SystemConfigStruct *systemCfg = nullptr, + const SysVarsStruct *systemVars = nullptr); + +bool loadFileConfigHW(); + +/* Previous firmware read config support. start */ +bool loadFileSystemVar(); +bool loadFileConfigWifi(); +bool loadFileConfigEther(); +bool loadFileConfigGeneral(); +bool loadFileConfigSecurity(); +bool loadFileConfigSerial(); +bool loadFileConfigMqtt(); +bool loadFileConfigWg(); +// IPAddress parse_ip_address(const char *str); +/* Previous firmware read config support. end */ + #ifdef DEBUG #define DEBUG_PRINT(x) Serial.print(String(x)) #define DEBUG_PRINTLN(x) Serial.println(String(x)) - #define LOGE(tag, format, ...) Serial.printf("[%s] " format " (%s:%d)\n", tag, ##__VA_ARGS__, __FILE__, __LINE__) #define LOGI(tag, format, ...) Serial.printf("[%s] " format "\n", tag, ##__VA_ARGS__) @@ -179,7 +333,3 @@ typedef CircularBuffer LogConsoleType; #define LOGI(f_, ...) #endif #endif - - - - diff --git a/src/etc.cpp b/src/etc.cpp index 64826f7..c7cc1ef 100644 --- a/src/etc.cpp +++ b/src/etc.cpp @@ -12,18 +12,30 @@ #include "log.h" #include "etc.h" #include "zones.h" -#include "hw.h" +// #include "hw.h" #include "zb.h" -extern struct ConfigSettingsStruct ConfigSettings; +#include +static WireGuard wg; + +// extern struct ConfigSettingsStruct ConfigSettings; +extern BrdConfigStruct brdConfigs[BOARD_CFG_CNT]; extern struct BrdConfigStruct hwConfig; -extern struct CurrentModesStruct modes; +// extern struct CurrentModesStruct modes; + +extern struct SystemConfigStruct systemCfg; +extern struct NetworkConfigStruct networkCfg; +extern struct VpnConfigStruct vpnCfg; +extern struct MqttConfigStruct mqttCfg; + +extern struct SysVarsStruct vars; extern CCTools CCTool; -const char *coordMode = "coordMode"; // coordMode node name -const char *prevCoordMode = "prevCoordMode"; // prevCoordMode node name +const char *coordMode = "coordMode"; // coordMode node name ?? not name but text field with mode +const char *prevCoordMode = "prevCoordMode"; // prevCoordMode node name ?? not name but text field with mode + const char *configFileSystem = "/config/system.json"; const char *configFileWifi = "/config/configWifi.json"; const char *configFileEther = "/config/configEther.json"; @@ -33,7 +45,18 @@ const char *configFileSerial = "/config/configSerial.json"; const char *configFileMqtt = "/config/configMqtt.json"; const char *configFileWg = "/config/configWg.json"; const char *configFileHw = "/config/configHw.json"; -// const char *deviceModel = "UZG-01"; + +/* +const char *cfgFileHw = "/cfg/hardware.json"; +const char *cfgFileGen = "/cfg/general.json"; +const char *cfgFileNet = "/cfg/network.json"; +const char *cfgFileSec = "/cfg/security.json"; +const char *cfgFileSer = "/cfg/serial.json"; +const char *cfgFileVpn = "/cfg/vpn.json"; +const char *cfgFileMqtt = "/cfg/mqtt.json"; +*/ + +// const char *deviceModel = "XZG"; void getReadableTime(String &readableTime, unsigned long beginTime) { @@ -81,17 +104,17 @@ float readTemperature(bool clear) } else { - return (temprature_sens_read() - 32) / 1.8 - ConfigSettings.tempOffset; + return (temprature_sens_read() - 32) / 1.8 - systemCfg.tempOffset; } } float getCPUtemp(bool clear) { - DEBUG_PRINTLN(F("getCPUtemp")); + //DEBUG_PRINTLN(F("getCPUtemp")); float CPUtemp = 0.0; if (WiFi.getMode() == WIFI_MODE_NULL || WiFi.getMode() == WIFI_OFF) { - DEBUG_PRINTLN(F("enable wifi to enable temp sensor")); + //DEBUG_PRINTLN(F("enable wifi to enable temp sensor")); WiFi.mode(WIFI_STA); // enable wifi to enable temp sensor CPUtemp = readTemperature(clear); WiFi.disconnect(); @@ -133,71 +156,71 @@ void zigbeeRestart() void adapterModeUSB() { - if (modes.uartChIs) + if (vars.hwUartSelIs) { - printLogMsg("Switched UZG-01 to USB mode"); - DEBUG_PRINTLN(F("Switched UZG-01 to USB mode")); - if (modes.uartChIs) + printLogMsg("Switched XZG to USB mode"); + DEBUG_PRINTLN(F("Switched XZG to USB mode")); + if (vars.hwUartSelIs) { - digitalWrite(hwConfig.uartChPin, 1); - DEBUG_PRINTLN(F("digitalWrite(hwConfig.uartChPin, 1) - HIGH")); + digitalWrite(hwConfig.mist.uartSelPin, 1); + DEBUG_PRINTLN(F("digitalWrite(hwConfig.mist.uartSelPin, 1) - HIGH")); } - if (modes.ledUsbIs) + if (vars.hwLedUsbIs) { - digitalWrite(hwConfig.ledUsbPin, 1); + digitalWrite(hwConfig.mist.ledUsbPin, 1); } } else { - DEBUG_PRINTLN(F("NO modes.uartChIs. NO mode USB")); + DEBUG_PRINTLN(F("NO vars.hwUartSelIs. NO mode USB")); } } void adapterModeLAN() { - if (modes.uartChIs) + if (vars.hwUartSelIs) { - printLogMsg("Switched UZG-01 to LAN mode"); - DEBUG_PRINTLN(F("Switched UZG-01 to LAN mode")); - digitalWrite(hwConfig.uartChPin, 0); - DEBUG_PRINTLN(F("digitalWrite(hwConfig.uartChPin, 0) - LOW")); + printLogMsg("Switched XZG to LAN mode"); + DEBUG_PRINTLN(F("Switched XZG to LAN mode")); + digitalWrite(hwConfig.mist.uartSelPin, 0); + DEBUG_PRINTLN(F("digitalWrite(hwConfig.mist.uartSelPin, 0) - LOW")); - if (modes.ledUsbIs) - digitalWrite(hwConfig.ledUsbPin, 0); + if (vars.hwLedUsbIs) + digitalWrite(hwConfig.mist.ledUsbPin, 0); } else { - DEBUG_PRINTLN(F("NO modes.uartChIs. NO mode LAN")); + DEBUG_PRINTLN(F("NO vars.hwUartSelIs. NO mode LAN")); } } void ledPwrToggle() { - if (modes.ledPwrIs) + if (vars.hwLedPwrIs) { printLogMsg("BLUE LED has been toggled"); DEBUG_PRINTLN(F("BLUE LED has been toggled")); DEBUG_PRINT(F("pin - ")); - DEBUG_PRINTLN(hwConfig.ledPwrPin); - digitalWrite(hwConfig.ledPwrPin, !digitalRead(hwConfig.ledPwrPin)); + DEBUG_PRINTLN(hwConfig.mist.ledPwrPin); + digitalWrite(hwConfig.mist.ledPwrPin, !digitalRead(hwConfig.mist.ledPwrPin)); } else { - DEBUG_PRINTLN(F("NO modes.ledPwrIs. NO BLUE LED")); + DEBUG_PRINTLN(F("NO vars.hwLedPwrIs. NO BLUE LED")); } } void ledUsbToggle() { - if (modes.ledUsbIs) + if (vars.hwLedUsbIs) { printLogMsg("RED LED has been toggled"); DEBUG_PRINTLN(F("RED LED has been toggled")); - digitalWrite(hwConfig.ledUsbPin, !digitalRead(hwConfig.ledUsbPin)); + digitalWrite(hwConfig.mist.ledUsbPin, !digitalRead(hwConfig.mist.ledUsbPin)); } else { - DEBUG_PRINTLN(F("NO modes.ledUsbIs. NO RED LED")); + DEBUG_PRINTLN(F("NO vars.hwLedUsbIs. NO RED LED")); } } @@ -227,7 +250,9 @@ void getDeviceID(char *arr) } // Form the final string including the board name and the processed MAC address - sprintf(arr, "%s-%s", hwConfig.board, buf); + + //sprintf(arr, "%s-%s", hwConfig.board, buf); + snprintf(arr, MAX_DEV_ID_LONG, "%s-%s", hwConfig.board, buf); } /* @@ -301,7 +326,7 @@ void writeDefaultConfig(const char *path, DynamicJsonDocument &doc) { DEBUG_PRINT(F("Write defaults to ")); DEBUG_PRINTLN(path); - serializeJson(doc, Serial); + serializeJsonPretty(doc, Serial); File configFile = LittleFS.open(path, FILE_WRITE); if (!configFile) { @@ -310,12 +335,12 @@ void writeDefaultConfig(const char *path, DynamicJsonDocument &doc) } else { - serializeJson(doc, configFile); + serializeJsonPretty(doc, configFile); } configFile.close(); } -String hexToDec(String hexString) +/*String hexToDec(String hexString) { unsigned int decValue = 0; @@ -337,29 +362,29 @@ String hexToDec(String hexString) } return String(decValue); -} +}*/ -void resetSettings() +void resetSettings() // to do adapt to Preferences { DEBUG_PRINTLN(F("[resetSettings] Start")); - if (modes.ledPwrIs) + if (vars.hwLedPwrIs) { - digitalWrite(hwConfig.ledPwrPin, 1); + digitalWrite(hwConfig.mist.ledPwrPin, 1); } - if (modes.ledUsbIs) + if (vars.hwLedUsbIs) { - digitalWrite(hwConfig.ledUsbPin, 0); + digitalWrite(hwConfig.mist.ledUsbPin, 0); } for (uint8_t i = 0; i < 15; i++) { delay(200); - if (modes.ledUsbIs) + if (vars.hwLedUsbIs) { - digitalWrite(hwConfig.ledUsbPin, !digitalRead(hwConfig.ledUsbPin)); + digitalWrite(hwConfig.mist.ledUsbPin, !digitalRead(hwConfig.mist.ledUsbPin)); } - if (modes.ledPwrIs) + if (vars.hwLedPwrIs) { - digitalWrite(hwConfig.ledPwrPin, !digitalRead(hwConfig.ledPwrPin)); + digitalWrite(hwConfig.mist.ledPwrPin, !digitalRead(hwConfig.mist.ledPwrPin)); } } DEBUG_PRINTLN(F("[resetSettings] Led blinking done")); @@ -381,7 +406,7 @@ void resetSettings() void setClock() { - configTime(0, 0, "pool.ntp.org", "time.google.com"); + configTime(0, 0, systemCfg.ntpServ1, systemCfg.ntpServ2); DEBUG_PRINT(F("Waiting for NTP time sync: ")); int startTryingTime = millis(); @@ -404,9 +429,9 @@ void setClock() DEBUG_PRINT(asctime(&timeinfo)); char *zoneToFind = const_cast("Europe/Kiev"); - if (ConfigSettings.timeZone) + if (systemCfg.timeZone) { - zoneToFind = ConfigSettings.timeZone; + zoneToFind = systemCfg.timeZone; } const char *gmtOffset = getGmtOffsetForZone(zoneToFind); @@ -482,27 +507,27 @@ BrdConfigStruct *findBrdConfig(int searchId = 0) int i = searchId; - if (ETH.begin(brdConfigs[i].addr, brdConfigs[i].pwrPin, brdConfigs[i].mdcPin, brdConfigs[i].mdiPin, brdConfigs[i].phyType, brdConfigs[i].clkMode, brdConfigs[i].pwrAltPin)) + if (ETH.begin(brdConfigs[i].eth.addr, brdConfigs[i].eth.pwrPin, brdConfigs[i].eth.mdcPin, brdConfigs[i].eth.mdiPin, brdConfigs[i].eth.phyType, brdConfigs[i].eth.clkMode, brdConfigs[i].eth.pwrAltPin)) { Serial.print("BrdConfig found: "); Serial.println(brdConfigs[i].board); brdOk = true; // zigbee check - if (brdConfigs[i].zbRxPin > 0 && brdConfigs[i].zbTxPin > 0 && brdConfigs[i].zbRstPin > 0 && brdConfigs[i].zbBslPin > 0) + if (brdConfigs[i].zb.rxPin > 0 && brdConfigs[i].zb.txPin > 0 && brdConfigs[i].zb.rstPin > 0 && brdConfigs[i].zb.bslPin > 0) { DEBUG_PRINTLN(F("Zigbee pins OK. Try to connect...")); esp_task_wdt_reset(); - Serial2.begin(ConfigSettings.serialSpeed, SERIAL_8N1, brdConfigs[i].zbRxPin, brdConfigs[i].zbTxPin); // start zigbee serial + Serial2.begin(systemCfg.serialSpeed, SERIAL_8N1, brdConfigs[i].zb.rxPin, brdConfigs[i].zb.txPin); // start zigbee serial // CCTool.switchStream(Serial2); int BSL_MODE = 0; // delay(500); - - if (zbInit(brdConfigs[i].zbRstPin, brdConfigs[i].zbBslPin, BSL_MODE)) + + if (zbInit(brdConfigs[i].zb.rstPin, brdConfigs[i].zb.bslPin, BSL_MODE)) { DEBUG_PRINTLN(F("Zigbee find - OK")); brdOk = true; @@ -512,7 +537,6 @@ BrdConfigStruct *findBrdConfig(int searchId = 0) DEBUG_PRINTLN(F("Zigbee find - ERROR")); brdOk = false; } - } } if (brdOk == true) @@ -523,7 +547,7 @@ BrdConfigStruct *findBrdConfig(int searchId = 0) { Serial.print("BrdConfig error with: "); Serial.println(brdConfigs[i].board); - //delay(500); + // delay(500); DynamicJsonDocument config(300); config["searchId"] = i + 1; @@ -566,7 +590,7 @@ ZbConfig *findZbConfig(int ethPwrPin, int ethMdcPin, int ethMdiPin, int ethClkPi //Serial2.end(); //DEBUG_PRINTLN(F("Serial2.end")); - Serial2.begin(ConfigSettings.serialSpeed, SERIAL_8N1, zbConfigs[i].rxPin, zbConfigs[i].txPin); // start zigbee serial + Serial2.begin(systemCfg.serialSpeed, SERIAL_8N1, zbConfigs[i].rxPin, zbConfigs[i].txPin); // start zigbee serial DEBUG_PRINTLN(F("Serial2.begin")); CCTool.switchStream(Serial2); @@ -586,4 +610,83 @@ ZbConfig *findZbConfig(int ethPwrPin, int ethMdcPin, int ethMdiPin, int ethClkPi return nullptr; } -*/ \ No newline at end of file +*/ + +void wgBegin() +{ + if (!wg.is_initialized()) + { + // printLogMsg(String("Initializing WireGuard interface...")); + auto subnet = IPAddress(255, 255, 255, 255); + auto gateway = IPAddress(0, 0, 0, 0); + auto localport = 50000; + if (!wg.begin( + vpnCfg.wgLocalIP, + subnet, + localport, + gateway, + vpnCfg.wgLocalPrivKey, + vpnCfg.wgEndAddr, + vpnCfg.wgEndPubKey, + vpnCfg.wgEndPort)) + { + printLogMsg(String("Failed to initialize WG")); + vars.vpnWgInit = false; + } + else + { + printLogMsg(String("WG was initialized")); + vars.vpnWgInit = true; + } + } +} + +void wgLoop() +{ + String tag = "WG"; + uint16_t localport = 50000; + //IPAddress ip = ; + + int checkPeriod = 5; // to do vpnCfg.checkTime; + ip_addr_t lwip_ip; + + lwip_ip.u_addr.ip4.addr = static_cast(vpnCfg.wgLocalIP); + + if (wg.is_initialized()) + { + if (vars.vpnWgCheckTime == 0) + { + vars.vpnWgCheckTime = millis() + 1000 * checkPeriod; + } + else + { + if (vars.vpnWgCheckTime <= millis()) + { + //LOGI(tag, "check"); + vars.vpnWgCheckTime = millis() + 1000 * checkPeriod; + if (wg.is_peer_up(&lwip_ip, &localport)) + { + vars.vpnWgPeerIp = (lwip_ip.u_addr.ip4.addr); + if (!vars.vpnWgConnect) + { + LOGI(tag, "Peer with IP %s connect", vars.vpnWgPeerIp.toString().c_str()); + } + vars.vpnWgConnect = true; + } + else + { + if (vars.vpnWgConnect) + { + LOGI(tag, "Peer disconnect"); + } + vars.vpnWgPeerIp.clear(); + vars.vpnWgConnect = false; + } + } + } + } + else + { + vars.vpnWgInit = false; + } +} \ No newline at end of file diff --git a/src/etc.h b/src/etc.h index 0199fc8..08d7c64 100644 --- a/src/etc.h +++ b/src/etc.h @@ -1,4 +1,5 @@ #include +#include "hw.h" void getReadableTime(String &readableTime, unsigned long beginTime); @@ -15,6 +16,8 @@ uint8_t temprature_sens_read(); #define STRINGIFY(s) STRINGIFY1(s) // Don’t ask why. It has to do with the inner workings of the preprocessor. #define STRINGIFY1(s) #s // https://community.platformio.org/t/how-to-put-a-string-in-a-define-in-build-flag-into-a-libary-json-file/13480/6 +#define MAX_DEV_ID_LONG 50 +/* struct CurrentModesStruct { bool btnIs = false; @@ -22,8 +25,9 @@ struct CurrentModesStruct bool ledPwrIs = false; bool uartChIs = false; bool zigbeeIs = false; -}; +};*/ +/* struct BrdConfigStruct { char board[50]; @@ -42,9 +46,11 @@ struct BrdConfigStruct int zbRxPin; int zbRstPin; int zbBslPin; -}; +};*/ -BrdConfigStruct*findBrdConfig(int searchId); +extern BrdConfigStruct brdConfigs[BOARD_CFG_CNT]; + +BrdConfigStruct *findBrdConfig(int searchId); float getCPUtemp(bool clear = false); @@ -63,11 +69,14 @@ void writeDefaultConfig(const char *path, DynamicJsonDocument &doc); void resetSettings(); -String hexToDec(String hexString); +//String hexToDec(String hexString); void setClock(); void setTimezone(String timezone); const char *getGmtOffsetForZone(const char *zone); void ledsScheduler(); +void wgBegin(); +void wgLoop(); + // #define min(a, b) ((a) < (b) ? (a) : (b)) \ No newline at end of file diff --git a/src/hw.cpp b/src/hw.cpp new file mode 100644 index 0000000..7f2136e --- /dev/null +++ b/src/hw.cpp @@ -0,0 +1,29 @@ +#include "hw.h" + + +BrdConfigStruct brdConfigs[BOARD_CFG_CNT] = { + {"UZG-01", + {.addr = 0, .pwrPin = -1, .mdcPin = 23, .mdiPin = 18, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO17_OUT, .pwrAltPin = 5}, + {.btnPin = 35, .btnPlr = 1, .uartSelPin = 33, .uartSelPlr = 1, .ledUsbPin = 12, .ledUsbPlr = 1, .ledPwrPin = 14, .ledPwrPlr = 1}, + {.txPin = 4, .rxPin = 36, .rstPin = 16, .bslPin = 32}}, + {"SLZB-06", + {.addr = 1, .pwrPin = 16, .mdcPin = 23, .mdiPin = 18, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO0_IN, .pwrAltPin = -1}, + {.btnPin = 35, .btnPlr = 1, .uartSelPin = 4, .uartSelPlr = 1, .ledUsbPin = 12, .ledUsbPlr = 1, .ledPwrPin = 14, .ledPwrPlr = 1}, + {.txPin = 17, .rxPin = 5, .rstPin = 33, .bslPin = 32}}, + {"Omilex-ESP32-POE", + {.addr = 0, .pwrPin = 12, .mdcPin = 23, .mdiPin = 18, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO17_OUT, .pwrAltPin = -1}, + {.btnPin = -1, .btnPlr = 0, .uartSelPin = -1, .uartSelPlr = 0, .ledUsbPin = -1, .ledUsbPlr = 0, .ledPwrPin = -1, .ledPwrPlr = 0}, + {.txPin = 4, .rxPin = 36, .rstPin = 16, .bslPin = 32}}, + {"WT32-ETH01", + {.addr = 1, .pwrPin = 16, .mdcPin = 23, .mdiPin = 18, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO0_IN, .pwrAltPin = -1}, + {.btnPin = -1, .btnPlr = 0, .uartSelPin = -1, .uartSelPlr = 0, .ledUsbPin = -1, .ledUsbPlr = 0, .ledPwrPin = -1, .ledPwrPlr = 0}, + {.txPin = 17, .rxPin = 5, .rstPin = 33, .bslPin = 32}}, + {"T-Internet-POE", + {.addr = 0, .pwrPin = -1, .mdcPin = 23, .mdiPin = 18, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO17_OUT, .pwrAltPin = -1}, + {.btnPin = -1, .btnPlr = 0, .uartSelPin = -1, .uartSelPlr = 0, .ledUsbPin = -1, .ledUsbPlr = 0, .ledPwrPin = -1, .ledPwrPlr = 0}, + {.txPin = 4, .rxPin = 36, .rstPin = 16, .bslPin = 32}}, + {"China-GW", + {.addr = 0, .pwrPin = 12, .mdcPin = 23, .mdiPin = 18, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO17_OUT, .pwrAltPin = -1}, + {.btnPin = -1, .btnPlr = 0, .uartSelPin = -1, .uartSelPlr = 0, .ledUsbPin = -1, .ledUsbPlr = 0, .ledPwrPin = -1, .ledPwrPlr = 0}, + {.txPin = 33, .rxPin = 32, .rstPin = 12, .bslPin = 14}}, +}; \ No newline at end of file diff --git a/src/hw.h b/src/hw.h index ad967a6..491d601 100644 --- a/src/hw.h +++ b/src/hw.h @@ -1,5 +1,6 @@ #include +/* BrdConfigStruct brdConfigs[] = { //{"BRD_NAME", addr, pwrPin, mdcPin, mdiPin, eth_phy_type, eth_clock_mode, pwrAltPin, btnPin, uartChPin, ledUsbPin, ledPwrPin, zbTxPin, zbRxPin, zbRstPin, zbBslPin}, {"UZG-01", 0, -1, 23, 18, ETH_PHY_LAN8720, ETH_CLOCK_GPIO17_OUT, 5, 35, 33, 12, 14, 4, 36, 16, 32}, @@ -8,4 +9,49 @@ BrdConfigStruct brdConfigs[] = { {"WT32-ETH01", 1, 16, 23, 18, ETH_PHY_LAN8720, ETH_CLOCK_GPIO0_IN, -1, -1, -1, -1, -1, 17, 5, 33, 32}, {"T-Internet-POE", 0, -1, 23, 18, ETH_PHY_LAN8720, ETH_CLOCK_GPIO17_OUT, -1, -1, -1, -1, -1, 4, 36, 16, 32}, {"China-GW", 0, 12, 23, 18, ETH_PHY_LAN8720, ETH_CLOCK_GPIO17_OUT, -1, -1, -1, -1, -1, 33, 32, 12, 14}, -}; \ No newline at end of file +};*/ + + +// Ethernet settings structure +struct EthConfig +{ + int addr; + int pwrPin; + int mdcPin; + int mdiPin; + eth_phy_type_t phyType; + eth_clock_mode_t clkMode; + int pwrAltPin; +}; + +// Miscellaneous settings structure +struct MistConfig { + int btnPin; + int btnPlr; + int uartSelPin; + int uartSelPlr; + int ledUsbPin; + int ledUsbPlr; + int ledPwrPin; + int ledPwrPlr; +}; + +// ZigBee settings structure +struct ZbConfig +{ + int txPin; + int rxPin; + int rstPin; + int bslPin; +}; + +// Root configuration structure that includes all substructures +struct BrdConfigStruct +{ + char board[50]; + EthConfig eth; + MistConfig mist; + ZbConfig zb; +}; + +#define BOARD_CFG_CNT 6 \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index e0f8429..cf6a49a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,6 +22,10 @@ #include "mqtt.h" #include "zb.h" #include "version.h" +// #include "hw.h" + +#include "esp_system.h" +#include "esp_task_wdt.h" /* #ifdef ETH_CLK_MODE @@ -31,13 +35,23 @@ #define BUFFER_SIZE 256 -ConfigSettingsStruct ConfigSettings; -zbVerStruct zbVer; -// InfosStruct Infos; -MqttSettingsStruct MqttSettings; -WgSettingsStruct WgSettings; +// ConfigSettingsStruct ConfigSettings; +// MqttSettingsStruct MqttSettings; +// WgSettingsStruct WgSettings; +// CurrentModesStruct modes; + +extern BrdConfigStruct brdConfigs[BOARD_CFG_CNT]; + BrdConfigStruct hwConfig; -CurrentModesStruct modes; + +SystemConfigStruct systemCfg; +NetworkConfigStruct networkCfg; +VpnConfigStruct vpnCfg; +MqttConfigStruct mqttCfg; + +SysVarsStruct vars; + +zbVerStruct zbVer; // volatile bool btnFlag = false; int btnFlag = false; @@ -49,16 +63,15 @@ void handleLongBtn(); void handleTmrNetworkOverseer(); void setupCoordinatorMode(); void startAP(const bool start); -IPAddress parse_ip_address(const char *str); Ticker tmrBtnLongPress(handleLongBtn, 1000, 0, MILLIS); Ticker tmrNetworkOverseer(handleTmrNetworkOverseer, overseerInterval, 0, MILLIS); IPAddress apIP(192, 168, 1, 1); DNSServer dnsServer; -WiFiServer server(TCP_LISTEN_PORT, MAX_SOCKET_CLIENTS); +WiFiServer server(ZB_TCP_PORT, MAX_SOCKET_CLIENTS); + -static WireGuard wg; CCTools CCTool(Serial2); @@ -69,13 +82,13 @@ void initLan() DEBUG_PRINT(F("Some ETH config found. Try to use ")); DEBUG_PRINTLN(hwConfig.board); - if (ETH.begin(hwConfig.addr, hwConfig.pwrPin, hwConfig.mdcPin, hwConfig.mdiPin, hwConfig.phyType, hwConfig.clkMode, hwConfig.pwrAltPin)) + if (ETH.begin(hwConfig.eth.addr, hwConfig.eth.pwrPin, hwConfig.eth.mdcPin, hwConfig.eth.mdiPin, hwConfig.eth.phyType, hwConfig.eth.clkMode, hwConfig.eth.pwrAltPin)) { DEBUG_PRINTLN(F("LAN start ok")); - if (!ConfigSettings.dhcp) + if (!networkCfg.ethDhcp) { DEBUG_PRINTLN(F("ETH STATIC")); - ETH.config(parse_ip_address(ConfigSettings.ipAddress), parse_ip_address(ConfigSettings.ipGW), parse_ip_address(ConfigSettings.ipMask)); + ETH.config(networkCfg.ethAddr, networkCfg.ethGate, networkCfg.ethMask, networkCfg.ethDns1, networkCfg.ethDns2); // ConfigSettings.disconnectEthTime = millis(); } else @@ -115,7 +128,7 @@ void initZb() { DEBUG_PRINTLN(F("Some ZB config found. Try to use")); - Serial2.begin(ConfigSettings.serialSpeed, SERIAL_8N1, hwConfig.rxPin, hwConfig.txPin); // start zigbee serial + Serial2.begin(systemCfg.serialSpeed, SERIAL_8N1, hwConfig.rxPin, hwConfig.txPin); // start zigbee serial int BSL_MODE = 0; @@ -186,87 +199,89 @@ void initZb() void startSocketServer() { - server.begin(ConfigSettings.socketPort); + server.begin(systemCfg.socketPort); server.setNoDelay(true); } -void wgBegin() -{ - if (!wg.is_initialized()) - { - // printLogMsg(String("Initializing WireGuard interface...")); - if (!wg.begin( - WgSettings.localIP, - WgSettings.localPrivKey, - WgSettings.endAddr, - WgSettings.endPubKey, - WgSettings.endPort)) - { - printLogMsg(String("Failed to initialize WG")); - WgSettings.init = false; - } - else - { - printLogMsg(String("WG was initialized")); - WgSettings.init = true; - } - } -} void startServers(bool usb = false) { initWebServer(); + // DEBUG_PRINTLN("6"); if (!usb) + { startSocketServer(); + } + // DEBUG_PRINTLN("7"); startAP(false); + // DEBUG_PRINTLN("8"); mDNS_start(); + // DEBUG_PRINTLN("9"); getZbVer(); - if (WgSettings.enable) + // DEBUG_PRINTLN("10"); + if (vpnCfg.wgEnable) { wgBegin(); } + if (mqttCfg.enable) + { + mqttConnectSetup(); + } + // DEBUG_PRINTLN("11"); } void handleTmrNetworkOverseer() { - switch (ConfigSettings.coordinator_mode) + switch (vars.workMode) { - case COORDINATOR_MODE_WIFI: - DEBUG_PRINT(F("WiFi.status = ")); - DEBUG_PRINTLN(WiFi.status()); - if (WiFi.isConnected()) + case WORK_MODE_NETWORK: + if (!networkCfg.wifiEnable && !networkCfg.ethEnable) { - DEBUG_PRINTLN(F("WIFI CONNECTED")); - startServers(); - tmrNetworkOverseer.stop(); + DEBUG_PRINTLN(F("Both interfaces disabled. Start AP")); + startAP(true); + connectWifi(); } - else + if (networkCfg.wifiEnable) { - if (tmrNetworkOverseer.counter() > overseerMaxRetry) + DEBUG_PRINT(F("WiFi.status = ")); + DEBUG_PRINTLN(WiFi.status()); + if (WiFi.isConnected()) { - DEBUG_PRINTLN(F("WIFI counter overflow")); - startAP(true); - connectWifi(); + DEBUG_PRINTLN(F("WIFI CONNECTED")); + startServers(); + tmrNetworkOverseer.stop(); + } + else + { + if (tmrNetworkOverseer.counter() > overseerMaxRetry) + { + DEBUG_PRINTLN(F("WIFI counter overflow")); + startAP(true); + connectWifi(); + } } } - break; - case COORDINATOR_MODE_LAN: - if (ConfigSettings.connectedEther) - { - DEBUG_PRINTLN(F("LAN CONNECTED")); - startServers(); - tmrNetworkOverseer.stop(); - } - else + // break; + // case WORK_MODE_NETWORK: + if (networkCfg.ethEnable) { - if (tmrNetworkOverseer.counter() > overseerMaxRetry) + if (vars.connectedEther) { - DEBUG_PRINTLN(F("LAN counter overflow")); - startAP(true); + DEBUG_PRINTLN(F("LAN CONNECTED")); + startServers(); + tmrNetworkOverseer.stop(); + } + else + { + if (tmrNetworkOverseer.counter() > overseerMaxRetry) + { + DEBUG_PRINTLN(F("LAN counter overflow")); + startAP(true); + } } } break; - case COORDINATOR_MODE_USB: + case WORK_MODE_USB: if (tmrNetworkOverseer.counter() > 3) { // 10 seconds for wifi connect if (WiFi.isConnected()) @@ -279,7 +294,7 @@ void handleTmrNetworkOverseer() initLan(); if (tmrNetworkOverseer.counter() > 6) { // 3sec for lan - if (ConfigSettings.connectedEther) + if (vars.connectedEther) { tmrNetworkOverseer.stop(); startServers(true); @@ -294,21 +309,21 @@ void handleTmrNetworkOverseer() } break; - default: - break; + // default: + // break; } } void NetworkEvent(WiFiEvent_t event) { - DEBUG_PRINT(F("NetworkEvent ")); - DEBUG_PRINTLN(event); + // DEBUG_PRINT(F("NetworkEvent ")); + // DEBUG_PRINTLN(event); switch (event) { case ARDUINO_EVENT_ETH_START: // 18: // SYSTEM_EVENT_ETH_START: DEBUG_PRINTLN(F("ETH Started")); // ConfigSettings.disconnectEthTime = millis(); - ETH.setHostname(ConfigSettings.hostname); + ETH.setHostname(systemCfg.hostname); break; case ARDUINO_EVENT_ETH_CONNECTED: // 20: // SYSTEM_EVENT_ETH_CONNECTED: DEBUG_PRINTLN(F("ETH Connected")); @@ -329,16 +344,16 @@ void NetworkEvent(WiFiEvent_t event) DEBUG_PRINT(F(", ")); DEBUG_PRINT(ETH.linkSpeed()); DEBUG_PRINTLN(F("Mbps")); - ConfigSettings.connectedEther = true; + vars.connectedEther = true; // ConfigSettings.disconnectEthTime = 0; // mDNS_start(); - setClock(); + // setClock(); break; case ARDUINO_EVENT_ETH_DISCONNECTED: // 21: //SYSTEM_EVENT_ETH_DISCONNECTED: DEBUG_PRINTLN(F("ETH Disconnected")); - ConfigSettings.connectedEther = false; + vars.connectedEther = false; // ConfigSettings.disconnectEthTime = millis(); - if (tmrNetworkOverseer.state() == STOPPED && ConfigSettings.coordinator_mode == COORDINATOR_MODE_LAN) + if (tmrNetworkOverseer.state() == STOPPED && vars.workMode == WORK_MODE_NETWORK) { tmrNetworkOverseer.start(); } @@ -346,7 +361,7 @@ void NetworkEvent(WiFiEvent_t event) case SYSTEM_EVENT_ETH_STOP: // 27: case ARDUINO_EVENT_ETH_STOP: DEBUG_PRINTLN(F("ETH Stopped")); - ConfigSettings.connectedEther = false; + vars.connectedEther = false; // ConfigSettings.disconnectEthTime = millis(); if (tmrNetworkOverseer.state() == STOPPED) { @@ -362,7 +377,7 @@ void NetworkEvent(WiFiEvent_t event) DEBUG_PRINT(WiFi.subnetMask().toString()); DEBUG_PRINT(F(", ")); DEBUG_PRINTLN(WiFi.gatewayIP().toString()); - setClock(); + // setClock(); break; case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: // SYSTEM_EVENT_STA_DISCONNECTED: DEBUG_PRINTLN(F("WIFI STA DISCONNECTED")); @@ -376,585 +391,25 @@ void NetworkEvent(WiFiEvent_t event) } } -IPAddress parse_ip_address(const char *str) -{ - IPAddress result; - int index = 0; - - result[0] = 0; - while (*str) - { - if (isdigit((unsigned char)*str)) - { - result[index] *= 10; - result[index] += *str - '0'; - } - else - { - index++; - if (index < 4) - { - result[index] = 0; - } - } - str++; - } - - return result; -} - -bool loadSystemVar() -{ // todo remove - File configFile = LittleFS.open(configFileSystem, FILE_READ); - if (!configFile) - { - DEBUG_PRINTLN(F("failed open. try to write defaults")); - - float CPUtemp = getCPUtemp(true); - int correct = CPUtemp - 30; - String tempOffset = String(correct); - - String StringConfig = "{\"emergencyWifi\":0,\"tempOffset\":" + tempOffset + "}"; - DEBUG_PRINTLN(StringConfig); - DynamicJsonDocument doc(1024); - deserializeJson(doc, StringConfig); - - File configFile = LittleFS.open(configFileSystem, FILE_WRITE); - if (!configFile) - { - DEBUG_PRINTLN(F("failed write")); - return false; - } - else - { - serializeJson(doc, configFile); - } - return false; - } - - DynamicJsonDocument doc(1024); - deserializeJson(doc, configFile); - - ConfigSettings.tempOffset = (int)doc["tempOffset"]; - if (!ConfigSettings.tempOffset) - { - DEBUG_PRINTLN(F("no tempOffset in system.json")); - configFile.close(); - - float CPUtemp = getCPUtemp(true); - int correct = CPUtemp - 30; - String tempOffset = String(correct); - doc["tempOffset"] = int(tempOffset.toInt()); - - configFile = LittleFS.open(configFileSystem, FILE_WRITE); - serializeJson(doc, configFile); - configFile.close(); - DEBUG_PRINTLN(F("saved tempOffset in system.json")); - ConfigSettings.tempOffset = int(tempOffset.toInt()); - } - configFile.close(); - return true; -} - -bool loadConfigWifi() -{ - File configFile = LittleFS.open(configFileWifi, FILE_READ); - const char *enableWiFi = "enableWiFi"; - const char *ssid = "ssid"; - const char *pass = "pass"; - const char *dhcpWiFi = "dhcpWiFi"; - const char *ip = "ip"; - const char *mask = "mask"; - const char *gw = "gw"; - if (!configFile) - { - // String StringConfig = "{\"enableWiFi\":0,\"ssid\":\"\",\"pass\":\"\",\"dhcpWiFi\":1,\"ip\":\"\",\"mask\":\"\",\"gw\":\"\",\"disableEmerg\":1}"; - DynamicJsonDocument doc(1024); - doc[enableWiFi] = 0; - doc[ssid] = ""; - doc[pass] = ""; - doc[dhcpWiFi] = 1; - doc[ip] = ""; - doc[mask] = ""; - doc[gw] = ""; - writeDefaultConfig(configFileWifi, doc); - } - - configFile = LittleFS.open(configFileWifi, FILE_READ); - DynamicJsonDocument doc(1024); - DeserializationError error = deserializeJson(doc, configFile); - - if (error) - { - DEBUG_PRINTLN(F("deserializeJson() failed: ")); - DEBUG_PRINTLN(error.f_str()); - - configFile.close(); - LittleFS.remove(configFileWifi); - return false; - } - - ConfigSettings.dhcpWiFi = (int)doc[dhcpWiFi]; - strlcpy(ConfigSettings.ssid, doc[ssid] | "", sizeof(ConfigSettings.ssid)); - strlcpy(ConfigSettings.password, doc[pass] | "", sizeof(ConfigSettings.password)); - strlcpy(ConfigSettings.ipAddressWiFi, doc[ip] | "", sizeof(ConfigSettings.ipAddressWiFi)); - strlcpy(ConfigSettings.ipMaskWiFi, doc[mask] | "", sizeof(ConfigSettings.ipMaskWiFi)); - strlcpy(ConfigSettings.ipGWWiFi, doc[gw] | "", sizeof(ConfigSettings.ipGWWiFi)); - // ConfigSettings.enableWiFi = (int)doc["enableWiFi"]; - // ConfigSettings.disableEmerg = (int)doc["disableEmerg"]; - - configFile.close(); - return true; -} - -bool loadConfigEther() -{ - const char *dhcp = "dhcp"; - const char *ip = "ip"; - const char *mask = "mask"; - const char *gw = "gw"; - File configFile = LittleFS.open(configFileEther, FILE_READ); - if (!configFile) - { - DynamicJsonDocument doc(1024); - doc[dhcp] = 1; - doc[ip] = ""; - doc[mask] = ""; - doc[gw] = ""; - // doc["disablePingCtrl"] = 0; - // String StringConfig = "{\"dhcp\":1,\"ip\":\"\",\"mask\":\"\",\"gw\":\"\",\"disablePingCtrl\":0}"; - writeDefaultConfig(configFileEther, doc); - } - - configFile = LittleFS.open(configFileEther, FILE_READ); - DynamicJsonDocument doc(1024); - DeserializationError error = deserializeJson(doc, configFile); - - if (error) - { - DEBUG_PRINTLN(F("deserializeJson() failed: ")); - DEBUG_PRINTLN(error.f_str()); - - configFile.close(); - LittleFS.remove(configFileEther); - return false; - } - - ConfigSettings.dhcp = (int)doc[dhcp]; - strlcpy(ConfigSettings.ipAddress, doc[ip] | "", sizeof(ConfigSettings.ipAddress)); - strlcpy(ConfigSettings.ipMask, doc[mask] | "", sizeof(ConfigSettings.ipMask)); - strlcpy(ConfigSettings.ipGW, doc[gw] | "", sizeof(ConfigSettings.ipGW)); - // ConfigSettings.disablePingCtrl = (int)doc["disablePingCtrl"]; - - configFile.close(); - return true; -} - -bool loadConfigHW() -{ - const char *board = "board"; - const char *addr = "addr"; - const char *pwrPin = "pwrPin"; - const char *mdcPin = "mdcPin"; - const char *mdiPin = "mdiPin"; - const char *phyType = "phyType"; - const char *clkMode = "clkMode"; - const char *pwrAltPin = "pwrAltPin"; - const char *btnPin = "btnPin"; - const char *uartChPin = "uartChPin"; - const char *ledUsbPin = "ledUsbPin"; - const char *ledPwrPin = "ledPwrPin"; - const char *zbTxPin = "zbTxPin"; - const char *zbRxPin = "zbRxPin"; - const char *zbRstPin = "zbRstPin"; - const char *zbBslPin = "zbBslPin"; - - File configFile = LittleFS.open(configFileHw, FILE_READ); - - if (!configFile) - { - DynamicJsonDocument config(300); - config[board] = ""; - /* - config[addr] = -1; - config[pwrPin] = -1; - config[mdcPin] = -1; - config[mdiPin] = -1; - config[phyType] = -1; - config[clkMode] = -1; - config[pwrAltPin] = -1; - config[btnPin] = -1; - config[uartChPin] = -1; - config[ledUsbPin] = -1; - config[ledPwrPin] = -1; - config[zbTxPin] = -1; - config[zbRxPin] = -1; - config[zbRstPin] = -1; - config[zbBslPin] = -1; - */ - writeDefaultConfig(configFileHw, config); - configFile = LittleFS.open(configFileHw, FILE_READ); - } - - DynamicJsonDocument config(1024); - deserializeJson(config, configFile); - - DEBUG_PRINTLN(configFile.readString()); - configFile.close(); - - strlcpy(hwConfig.board, config[board] | "", sizeof(hwConfig.board)); - hwConfig.addr = config[addr]; - hwConfig.pwrPin = config[pwrPin]; - hwConfig.mdcPin = config[mdcPin]; - hwConfig.mdiPin = config[mdiPin]; - hwConfig.phyType = config[phyType]; - hwConfig.clkMode = config[clkMode]; - hwConfig.pwrAltPin = config[pwrAltPin]; - hwConfig.btnPin = config[btnPin]; - hwConfig.uartChPin = config[uartChPin]; - hwConfig.ledUsbPin = config[ledUsbPin]; - hwConfig.ledPwrPin = config[ledPwrPin]; - hwConfig.zbTxPin = config[zbTxPin]; - hwConfig.zbRxPin = config[zbRxPin]; - hwConfig.zbRstPin = config[zbRstPin]; - hwConfig.zbBslPin = config[zbBslPin]; - - if (hwConfig.board[0] != '\0' && strlen(hwConfig.board) > 0) - { - DEBUG_PRINTLN("hwConfig LOAD - OK"); - - delay(1000); - return true; - } - else - { - DEBUG_PRINTLN("hwConfig LOAD - ERROR"); - delay(1000); - int searchId = 0; - if (config["searchId"]) - { - searchId = config["searchId"]; - } - BrdConfigStruct *newConfig = findBrdConfig(searchId); - if (newConfig) - { - DEBUG_PRINTLN(F("Saving HW config")); - - DynamicJsonDocument config(512); - config[board] = newConfig->board; - config[addr] = newConfig->addr; - config[pwrPin] = newConfig->pwrPin; - config[mdcPin] = newConfig->mdcPin; - config[mdiPin] = newConfig->mdiPin; - config[phyType] = newConfig->phyType; - config[clkMode] = newConfig->clkMode; - config[pwrAltPin] = newConfig->pwrAltPin; - config[btnPin] = newConfig->btnPin; - config[uartChPin] = newConfig->uartChPin; - config[ledUsbPin] = newConfig->ledUsbPin; - config[ledPwrPin] = newConfig->ledPwrPin; - config[zbTxPin] = newConfig->zbTxPin; - config[zbRxPin] = newConfig->zbRxPin; - config[zbRstPin] = newConfig->zbRstPin; - config[zbBslPin] = newConfig->zbBslPin; - writeDefaultConfig(configFileHw, config); - // configFile = LittleFS.open(configFileHw, FILE_WRITE); - // serializeJson(config, configFile); - - // serializeJson(config, Serial); - // configFile.close(); - - // delay(500); - DEBUG_PRINTLN(F("Restarting...")); - ESP.restart(); - } - } - return false; -} - -bool loadConfigGeneral() -{ - const char *hostname = "hostname"; - const char *disableLeds = "disableLeds"; - const char *refreshLogs = "refreshLogs"; - const char *disableLedPwr = "disableLedPwr"; - const char *disableLedUSB = "disableLedUSB"; - const char *prevCoordMode = "prevCoordMode"; - const char *keepWeb = "keepWeb"; - const char *timeZoneName = "timeZoneName"; - File configFile = LittleFS.open(configFileGeneral, FILE_READ); - DEBUG_PRINTLN(configFile.readString()); - if (!configFile) - { - // String deviceID = deviceModel; - // getDeviceID(deviceID); - // DEBUG_PRINTLN("RESET ConfigGeneral"); - // String StringConfig = "{\"hostname\":\"" + deviceID + "\",\"disableLeds\": false,\"refreshLogs\":1000,\"usbMode\":0,\"disableLedPwr\":0,\"disableLedUSB\":0,\""+ coordMode +"\":0}\""+ prevCoordMode +"\":0, \"keepWeb\": 0}"; - DynamicJsonDocument doc(1024); - doc[hostname] = hwConfig.board; - doc[disableLeds] = 0; - doc[refreshLogs] = 1000; - doc[disableLedPwr] = 0; - doc[disableLedUSB] = 0; - doc[coordMode] = 0; - doc[prevCoordMode] = 0; - doc[keepWeb] = 0; - doc[timeZoneName] = "Europe/Kiev"; - writeDefaultConfig(configFileGeneral, doc); - } - - configFile = LittleFS.open(configFileGeneral, FILE_READ); - DynamicJsonDocument doc(1024); - DeserializationError error = deserializeJson(doc, configFile); - - if (error) - { - DEBUG_PRINTLN(F("deserializeJson() failed: ")); - DEBUG_PRINTLN(error.f_str()); - - configFile.close(); - LittleFS.remove(configFileGeneral); - return false; - } - - if ((double)doc[refreshLogs] < 1000) - { - ConfigSettings.refreshLogs = 1000; - } - else - { - ConfigSettings.refreshLogs = (int)doc[refreshLogs]; - } - DEBUG_PRINT(F("[loadConfigGeneral] 'doc[coordMode]' res is: ")); - DEBUG_PRINTLN(String((uint8_t)doc[coordMode])); - - strlcpy(ConfigSettings.hostname, doc[hostname] | "", sizeof(ConfigSettings.hostname)); - - ConfigSettings.coordinator_mode = static_cast((uint8_t)doc[coordMode]); - ConfigSettings.prevCoordinator_mode = static_cast((uint8_t)doc[prevCoordMode]); - DEBUG_PRINT(F("[loadConfigGeneral] 'ConfigSettings.coordinator_mode' res is: ")); - DEBUG_PRINTLN(String(ConfigSettings.coordinator_mode)); - - ConfigSettings.disableLedPwr = (uint8_t)doc[disableLedPwr]; - // DEBUG_PRINTLN(F("[loadConfigGeneral] disableLedPwr")); - ConfigSettings.disableLedUSB = (uint8_t)doc[disableLedUSB]; - // DEBUG_PRINTLN(F("[loadConfigGeneral] disableLedUSB")); - ConfigSettings.disableLeds = (uint8_t)doc[disableLeds]; - // DEBUG_PRINTLN(F("[loadConfigGeneral] disableLeds")); - ConfigSettings.keepWeb = (uint8_t)doc[keepWeb]; - // DEBUG_PRINTLN(F("[loadConfigGeneral] disableLeds")); - strlcpy(ConfigSettings.timeZone, doc[timeZoneName] | "", sizeof(ConfigSettings.timeZone)); - configFile.close(); - DEBUG_PRINTLN(F("[loadConfigGeneral] config load done")); - return true; -} - -bool loadConfigSecurity() -{ - const char *disableWeb = "disableWeb"; - const char *webAuth = "webAuth"; - const char *webUser = "webUser"; - const char *webPass = "webPass"; - const char *fwEnabled = "fwEnabled"; - const char *fwIp = "fwIp"; - File configFile = LittleFS.open(configFileSecurity, FILE_READ); - if (!configFile) - { - // String StringConfig = "{\"disableWeb\":0,\"webAuth\":0,\"webUser\":"",\"webPass\":""}"; - DynamicJsonDocument doc(1024); - doc[disableWeb] = 0; - doc[webAuth] = 0; - doc[webUser] = "admin"; - doc[webPass] = ""; - doc[fwEnabled] = 0; - doc[fwIp] = ""; - writeDefaultConfig(configFileSecurity, doc); - } - - configFile = LittleFS.open(configFileSecurity, FILE_READ); - DynamicJsonDocument doc(1024); - DeserializationError error = deserializeJson(doc, configFile); - - if (error) - { - DEBUG_PRINTLN(F("deserializeJson() failed: ")); - DEBUG_PRINTLN(error.f_str()); - - configFile.close(); - LittleFS.remove(configFileSecurity); - return false; - } - - ConfigSettings.disableWeb = (uint8_t)doc[disableWeb]; - ConfigSettings.webAuth = (uint8_t)doc[webAuth]; - strlcpy(ConfigSettings.webUser, doc[webUser] | "", sizeof(ConfigSettings.webUser)); - strlcpy(ConfigSettings.webPass, doc[webPass] | "", sizeof(ConfigSettings.webPass)); - ConfigSettings.fwEnabled = (uint8_t)doc[fwEnabled]; - ConfigSettings.fwIp = parse_ip_address(doc[fwIp] | "0.0.0.0"); - - configFile.close(); - return true; -} - -bool loadConfigSerial() -{ - const char *baud = "baud"; - const char *port = "port"; - File configFile = LittleFS.open(configFileSerial, FILE_READ); - if (!configFile) - { - // String StringConfig = "{\"baud\":115200,\"port\":6638}"; - DynamicJsonDocument doc(1024); - doc[baud] = 115200; - doc[port] = 6638; - writeDefaultConfig(configFileSerial, doc); - } - - configFile = LittleFS.open(configFileSerial, FILE_READ); - DynamicJsonDocument doc(1024); - DeserializationError error = deserializeJson(doc, configFile); - - if (error) - { - DEBUG_PRINTLN(F("deserializeJson() failed: ")); - DEBUG_PRINTLN(error.f_str()); - - configFile.close(); - LittleFS.remove(configFileSerial); - return false; - } - - ConfigSettings.serialSpeed = (int)doc[baud]; - ConfigSettings.socketPort = (int)doc[port]; - if (ConfigSettings.socketPort == 0) - { - ConfigSettings.socketPort = TCP_LISTEN_PORT; - } - configFile.close(); - return true; -} - -bool loadConfigMqtt() -{ - const char *enable = "enable"; - const char *server = "server"; - const char *port = "port"; - const char *user = "user"; - const char *pass = "pass"; - const char *topic = "topic"; - const char *interval = "interval"; - const char *discovery = "discovery"; - - File configFile = LittleFS.open(configFileMqtt, FILE_READ); - if (!configFile) - { - char deviceIdArr[20]; - getDeviceID(deviceIdArr); - - DynamicJsonDocument doc(1024); - doc[enable] = 0; - doc[server] = ""; - doc[port] = 1883; - doc[user] = "mqttuser"; - doc[pass] = ""; - doc[topic] = String(deviceIdArr); - doc[interval] = 60; - doc[discovery] = 0; - writeDefaultConfig(configFileMqtt, doc); - } - - configFile = LittleFS.open(configFileMqtt, FILE_READ); - DynamicJsonDocument doc(1024); - DeserializationError error = deserializeJson(doc, configFile); - - if (error) - { - DEBUG_PRINTLN(F("deserializeJson() failed: ")); - DEBUG_PRINTLN(error.f_str()); - configFile.close(); - LittleFS.remove(configFileMqtt); - return false; - } - - MqttSettings.enable = (int)doc[enable]; - strlcpy(MqttSettings.server, doc[server] | "", sizeof(MqttSettings.server)); - MqttSettings.serverIP = parse_ip_address(MqttSettings.server); - MqttSettings.port = (int)doc[port]; - strlcpy(MqttSettings.user, doc[user] | "", sizeof(MqttSettings.user)); - strlcpy(MqttSettings.pass, doc[pass] | "", sizeof(MqttSettings.pass)); - strlcpy(MqttSettings.topic, doc[topic] | "", sizeof(MqttSettings.topic)); - MqttSettings.interval = (int)doc[interval]; - MqttSettings.discovery = (int)doc[discovery]; - - configFile.close(); - return true; -} - -bool loadConfigWg() -{ - const char *enable = "enable"; - const char *localAddr = "localAddr"; - const char *localIP = "localIP"; - const char *endAddr = "endAddr"; - const char *endPubKey = "endPubKey"; - const char *endPort = "endPort"; - - File configFile = LittleFS.open(configFileWg, FILE_READ); - if (!configFile) - { - DynamicJsonDocument doc(1024); - doc[enable] = 0; - doc[localAddr] = ""; - doc[localIP] = ""; - doc[endAddr] = ""; - doc[endPubKey] = ""; - doc[endPort] = ""; - writeDefaultConfig(configFileWg, doc); - } - - configFile = LittleFS.open(configFileWg, FILE_READ); - DynamicJsonDocument doc(1024); - DeserializationError error = deserializeJson(doc, configFile); - - if (error) - { - DEBUG_PRINTLN(F("deserializeJson() failed: ")); - DEBUG_PRINTLN(error.f_str()); - configFile.close(); - LittleFS.remove(configFileWg); - return false; - } - - WgSettings.enable = (int)doc[enable]; - - strlcpy(WgSettings.localAddr, doc[localAddr] | "", sizeof(WgSettings.localAddr)); - WgSettings.localIP = parse_ip_address(WgSettings.localAddr); - - strlcpy(WgSettings.localPrivKey, doc[localIP] | "", sizeof(WgSettings.localPrivKey)); - strlcpy(WgSettings.endAddr, doc[endAddr] | "", sizeof(WgSettings.endAddr)); - strlcpy(WgSettings.endPubKey, doc[endPubKey] | "", sizeof(WgSettings.endPubKey)); - WgSettings.endPort = (int)doc[endPort]; - - configFile.close(); - return true; -} - void startAP(const bool start) { - if (ConfigSettings.apStarted) + if (vars.apStarted) { if (!start) { - if (ConfigSettings.coordinator_mode != COORDINATOR_MODE_WIFI) + if (!networkCfg.wifiEnable) // vars.workMode != COORDINATOR_MODE_WIFI) { + // DEBUG_PRINTLN("1"); WiFi.softAPdisconnect(true); // off wifi } else { + // DEBUG_PRINTLN("2"); WiFi.mode(WIFI_STA); } + // DEBUG_PRINTLN("3"); dnsServer.stop(); - ConfigSettings.apStarted = false; + vars.apStarted = false; } } else @@ -974,7 +429,7 @@ void startAP(const bool start) // } WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); - char apSsid[18]; + char apSsid[MAX_DEV_ID_LONG]; getDeviceID(apSsid); WiFi.softAP(apSsid); //, WIFIPASS); // if DNSServer is started with "*" for domain name, it will reply with @@ -983,8 +438,10 @@ void startAP(const bool start) dnsServer.start(53, "*", apIP); WiFi.setSleep(false); // ConfigSettings.wifiAPenblTime = millis(); + DEBUG_PRINTLN("4"); startServers(); - ConfigSettings.apStarted = true; + vars.apStarted = true; + DEBUG_PRINTLN("5"); } } @@ -1004,10 +461,10 @@ void connectWifi() } WiFi.persistent(false); esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_11B); - if ((strlen(ConfigSettings.ssid) >= 2) && (strlen(ConfigSettings.password) >= 8)) + if ((strlen(networkCfg.wifiSsid) >= 2) && (strlen(networkCfg.wifiPassword) >= 8)) { DEBUG_PRINTLN(F("[connectWifi] Ok SSID & PASS")); - if (ConfigSettings.apStarted) + if (vars.apStarted) { // DEBUG_PRINTLN(F("[connectWifi] WiFi.mode(WIFI_AP_STA)")); // WiFi.mode(WIFI_AP_STA); @@ -1019,16 +476,13 @@ void connectWifi() } delay(100); - WiFi.begin(ConfigSettings.ssid, ConfigSettings.password); + WiFi.begin(networkCfg.wifiSsid, networkCfg.wifiPassword); WiFi.setSleep(false); DEBUG_PRINTLN(F("[connectWifi] WiFi.begin")); - if (!ConfigSettings.dhcpWiFi) + if (!networkCfg.wifiDhcp) { - IPAddress ip_address = parse_ip_address(ConfigSettings.ipAddressWiFi); - IPAddress gateway_address = parse_ip_address(ConfigSettings.ipGWWiFi); - IPAddress netmask = parse_ip_address(ConfigSettings.ipMaskWiFi); - WiFi.config(ip_address, gateway_address, netmask); + WiFi.config(networkCfg.wifiAddr, networkCfg.wifiGate, networkCfg.wifiMask, networkCfg.wifiDns1, networkCfg.wifiDns2); DEBUG_PRINTLN(F("[connectWifi] WiFi.config")); } else @@ -1038,21 +492,29 @@ void connectWifi() } else { - if (!(ConfigSettings.coordinator_mode == COORDINATOR_MODE_USB && ConfigSettings.keepWeb)) + if (!(vars.workMode == WORK_MODE_USB && systemCfg.keepWeb)) { // dont start ap in keepWeb - DEBUG_PRINTLN(F("[connectWifi] NO SSID & PASS")); - startAP(true); - DEBUG_PRINTLN(F("[connectWifi] setupWifiAP")); + DEBUG_PRINT(F("[connectWifi] NO SSID & PASS ")); + if (!vars.connectedEther) + { + DEBUG_PRINTLN(F("and problem with LAN")); + startAP(true); + DEBUG_PRINTLN(F("So [connectWifi] setupWifiAP")); + } + else + { + DEBUG_PRINTLN(F("but LAN is OK")); + } } } } void mDNS_start() { - const char *host = "_uzg-01"; + const char *host = "_xzg"; const char *http = "_http"; const char *tcp = "_tcp"; - if (!MDNS.begin(ConfigSettings.hostname)) + if (!MDNS.begin(systemCfg.hostname)) { printLogMsg("Error setting up MDNS responder!"); } @@ -1061,11 +523,12 @@ void mDNS_start() printLogMsg("mDNS responder started"); MDNS.addService(http, tcp, 80); // web //--zeroconf zha-- - MDNS.addService(host, tcp, ConfigSettings.socketPort); + MDNS.addService(host, tcp, systemCfg.socketPort); MDNS.addServiceTxt(host, tcp, "version", "1.0"); MDNS.addServiceTxt(host, tcp, "radio_type", "znp"); - MDNS.addServiceTxt(host, tcp, "baud_rate", String(ConfigSettings.serialSpeed)); + MDNS.addServiceTxt(host, tcp, "baud_rate", String(systemCfg.serialSpeed)); MDNS.addServiceTxt(host, tcp, "data_flow_control", "software"); + MDNS.addServiceTxt(host, tcp, "board", String(hwConfig.board)); } } @@ -1090,7 +553,7 @@ IRAM_ATTR void btnInterrupt() void setLedsDisable(bool mode, bool setup) { - if (modes.ledPwrIs || modes.ledUsbIs) + if (vars.hwLedPwrIs || vars.hwLedUsbIs) { DEBUG_PRINTLN(F("[setLedsDisable] start")); if (!setup) @@ -1106,43 +569,43 @@ void setLedsDisable(bool mode, bool setup) configFile = LittleFS.open(path, FILE_WRITE); serializeJson(doc, configFile); configFile.close(); - ConfigSettings.disableLeds = mode; - ConfigSettings.disableLedPwr = mode; - ConfigSettings.disableLedUSB = mode; + systemCfg.disableLeds = mode; + systemCfg.disableLedPwr = mode; + systemCfg.disableLedUSB = mode; } if (mode) { - if (modes.ledUsbIs) + if (vars.hwLedUsbIs) { - digitalWrite(hwConfig.ledUsbPin, !mode); + digitalWrite(hwConfig.mist.ledUsbPin, !mode); } - if (modes.ledPwrIs) + if (vars.hwLedPwrIs) { - digitalWrite(hwConfig.ledPwrPin, !mode); + digitalWrite(hwConfig.mist.ledPwrPin, !mode); } } else { - if (modes.ledPwrIs) + if (vars.hwLedPwrIs) { - if (!ConfigSettings.disableLedPwr) + if (!systemCfg.disableLedPwr) { - digitalWrite(hwConfig.ledPwrPin, !mode); + digitalWrite(hwConfig.mist.ledPwrPin, !mode); } else { - digitalWrite(hwConfig.ledPwrPin, 0); + digitalWrite(hwConfig.mist.ledPwrPin, 0); } } - if (modes.ledUsbIs) + if (vars.hwLedUsbIs) { - if (ConfigSettings.coordinator_mode == COORDINATOR_MODE_USB && !ConfigSettings.disableLedUSB) + if (vars.workMode == WORK_MODE_USB && !systemCfg.disableLedUSB) { - digitalWrite(hwConfig.ledUsbPin, !mode); + digitalWrite(hwConfig.mist.ledUsbPin, !mode); } else { - digitalWrite(hwConfig.ledUsbPin, 0); + digitalWrite(hwConfig.mist.ledUsbPin, 0); } } } @@ -1152,7 +615,7 @@ void setLedsDisable(bool mode, bool setup) void handleLongBtn() { - if (!digitalRead(hwConfig.btnPin)) + if (!digitalRead(hwConfig.mist.btnPin)) { // long press DEBUG_PRINT(F("Long press ")); DEBUG_PRINT(btnFlag); @@ -1172,7 +635,7 @@ void handleLongBtn() if (btnFlag >= 2) { printLogMsg("Long press 2sec - setLedsDisable"); - setLedsDisable(!ConfigSettings.disableLeds, false); + setLedsDisable(!systemCfg.disableLeds, false); } tmrBtnLongPress.stop(); btnFlag = false; @@ -1187,47 +650,47 @@ void toggleUsbMode() DEBUG_PRINTLN(F("coordMode")); DEBUG_PRINTLN(coordMode); delay(500); - if (ConfigSettings.coordinator_mode != COORDINATOR_MODE_USB) + if (vars.workMode != WORK_MODE_USB) { - ConfigSettings.prevCoordinator_mode = ConfigSettings.coordinator_mode; // remember current state - ConfigSettings.coordinator_mode = COORDINATOR_MODE_USB; // toggle + systemCfg.prevWorkMode = vars.workMode; // remember current state + vars.workMode = WORK_MODE_USB; // toggle DEBUG_PRINTLN(F("Change usb mode to USB")); } else { - ConfigSettings.coordinator_mode = ConfigSettings.prevCoordinator_mode; + vars.workMode = systemCfg.prevWorkMode; DEBUG_PRINTLN(F("Change usb mode to:")); - DEBUG_PRINTLN(String(ConfigSettings.coordinator_mode)); + DEBUG_PRINTLN(String(vars.workMode)); } const char *path = configFileGeneral; DynamicJsonDocument doc(300); File configFile = LittleFS.open(path, FILE_READ); deserializeJson(doc, configFile); configFile.close(); - doc[prevCoordMode] = ConfigSettings.prevCoordinator_mode; - doc[coordMode] = ConfigSettings.coordinator_mode; + doc[prevCoordMode] = systemCfg.prevWorkMode; + doc[coordMode] = vars.workMode; configFile = LittleFS.open(path, FILE_WRITE); serializeJson(doc, configFile); configFile.close(); - if (modes.ledUsbIs) + if (vars.hwLedUsbIs) { - digitalWrite(hwConfig.ledUsbPin, ConfigSettings.coordinator_mode == COORDINATOR_MODE_USB ? 1 : 0); + digitalWrite(hwConfig.mist.ledUsbPin, vars.workMode == WORK_MODE_USB ? 1 : 0); } ESP.restart(); } void setupCoordinatorMode() { - if (ConfigSettings.coordinator_mode > 2 || ConfigSettings.coordinator_mode < 0) + if (vars.workMode > 2 || vars.workMode < 0) { DEBUG_PRINTLN(F("WRONG MODE DETECTED, set to LAN")); - ConfigSettings.coordinator_mode = COORDINATOR_MODE_LAN; + vars.workMode = WORK_MODE_NETWORK; } DEBUG_PRINTLN(F("setupCoordinatorMode")); DEBUG_PRINTLN(F("Mode is:")); - DEBUG_PRINTLN(ConfigSettings.coordinator_mode); + DEBUG_PRINTLN(vars.workMode); DEBUG_PRINTLN(F("--------------")); - if (ConfigSettings.coordinator_mode != COORDINATOR_MODE_USB || ConfigSettings.keepWeb) + if (vars.workMode != WORK_MODE_USB || systemCfg.keepWeb) { // start network overseer if (tmrNetworkOverseer.state() == STOPPED) { @@ -1235,35 +698,38 @@ void setupCoordinatorMode() } WiFi.onEvent(NetworkEvent); } - switch (ConfigSettings.coordinator_mode) + switch (vars.workMode) { - case COORDINATOR_MODE_USB: + case WORK_MODE_USB: DEBUG_PRINTLN(F("Coordinator USB mode")); delay(500); - if (modes.uartChIs) + if (vars.hwUartSelIs) { - digitalWrite(hwConfig.uartChPin, 1); - DEBUG_PRINTLN(F("digitalWrite(hwConfig.uartChPin, 1) - HIGH")); + digitalWrite(hwConfig.mist.uartSelPin, 1); + DEBUG_PRINTLN(F("digitalWrite(hwConfig.mist.uartSelPin, 1) - HIGH")); } break; - case COORDINATOR_MODE_WIFI: - DEBUG_PRINTLN(F("Coordinator WIFI mode")); - // initLan(); - connectWifi(); - break; - - case COORDINATOR_MODE_LAN: - DEBUG_PRINTLN(F("Coordinator LAN mode")); - initLan(); + // case COORDINATOR_MODE_WIFI: + // DEBUG_PRINTLN(F("Coordinator WIFI mode")); + // initLan(); + // connectWifi(); + // break; + + case WORK_MODE_NETWORK: + DEBUG_PRINTLN(F("Coordinator NETWORK mode")); + if (networkCfg.ethEnable) + initLan(); + if (networkCfg.wifiEnable) + connectWifi(); break; default: break; } - if (!ConfigSettings.disableWeb && (ConfigSettings.coordinator_mode != COORDINATOR_MODE_USB || ConfigSettings.keepWeb)) + if (!systemCfg.disableWeb && (vars.workMode != WORK_MODE_USB || systemCfg.keepWeb)) updWeb = true; // handle web server - if (ConfigSettings.coordinator_mode == COORDINATOR_MODE_USB && ConfigSettings.keepWeb) + if (vars.workMode == WORK_MODE_USB && systemCfg.keepWeb) connectWifi(); // try 2 connect wifi } @@ -1286,108 +752,117 @@ void setup() { Serial.begin(115200); // todo ifdef DEBUG + //delay(3000); + // esp_task_wdt_delete(xTaskGetIdleTaskHandleForCPU(0)); + + // Отключить WDT для IDLE (простоя) задачи на ядре 1 + // esp_task_wdt_delete(xTaskGetIdleTaskHandleForCPU(1)); + + // Отключение TWDT (Task Watchdog Timer) + // esp_task_wdt_deinit(); + + // Ваш код setup() здесь + + String tag = "SETUP"; + /* + LOGI(tag, "CLEAR config\n"); + delay(500); + printConfig(networkCfg, vpnCfg, mqttCfg, systemCfg); + */ + initNVS(); + // printNVSFreeSpace(); + + loadNetworkConfig(networkCfg); + loadVpnConfig(vpnCfg); + loadMqttConfig(mqttCfg); + loadSystemConfig(systemCfg); + /* + LOGI(tag, "After NVS load config\n"); + delay(500); + printConfig(networkCfg, vpnCfg, mqttCfg, systemCfg); + */ + // LOAD System vars and create FS / start if (!LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED, "/lfs2", 10)) { - DEBUG_PRINTLN(F("Error with LITTLEFS")); + LOGI(tag, "Error with LITTLEFS"); return; } - DEBUG_PRINTLN(F("LITTLEFS OK")); - if (!loadSystemVar()) - { - DEBUG_PRINTLN(F("Error load system vars")); - const char *path = "/config"; - - if (LittleFS.mkdir(path)) - { - DEBUG_PRINTLN(F("Config dir created")); - delay(500); - ESP.restart(); - } - else - { - DEBUG_PRINTLN(F("mkdir failed")); - } - } - else - { - DEBUG_PRINTLN(F("System vars load OK")); - } // LOAD System vars and create FS / end - ConfigSettings.serialSpeed = 115200; + // systemCfg.serialSpeed = 115200; - loadConfigHW(); + loadFileConfigHW(); - ConfigSettings.apStarted = false; + vars.apStarted = false; // DEBUG_PRINTLN(F("Start")); // AVOID USING PIN 0 - if (hwConfig.btnPin > 0) + if (hwConfig.mist.btnPin > 0) { - pinMode(hwConfig.btnPin, INPUT); - modes.btnIs = true; + pinMode(hwConfig.mist.btnPin, INPUT); + vars.hwBtnIs = true; } - if (hwConfig.ledUsbPin > 0) + if (hwConfig.mist.ledUsbPin > 0) { - pinMode(hwConfig.ledUsbPin, OUTPUT); - digitalWrite(hwConfig.ledUsbPin, 1); // enable ledUsbPin - modes.ledUsbIs = true; + pinMode(hwConfig.mist.ledUsbPin, OUTPUT); + digitalWrite(hwConfig.mist.ledUsbPin, 1); // enable ledUsbPin + vars.hwLedUsbIs = true; } - if (hwConfig.ledPwrPin > 0) + if (hwConfig.mist.ledPwrPin > 0) { - pinMode(hwConfig.ledPwrPin, OUTPUT); - digitalWrite(hwConfig.ledPwrPin, 1); // enable ledPwrPin - modes.ledPwrIs = true; + pinMode(hwConfig.mist.ledPwrPin, OUTPUT); + digitalWrite(hwConfig.mist.ledPwrPin, 1); // enable ledPwrPin + vars.hwLedPwrIs = true; } - if (hwConfig.uartChPin > 0) + if (hwConfig.mist.uartSelPin > 0) { - pinMode(hwConfig.uartChPin, OUTPUT); - DEBUG_PRINTLN(F("pinMode(hwConfig.uartChPin, OUTPUT)")); - digitalWrite(hwConfig.uartChPin, 0); // enable zigbee serial on LAN.so free USB + pinMode(hwConfig.mist.uartSelPin, OUTPUT); + DEBUG_PRINTLN(F("pinMode(hwConfig.mist.uartSelPin, OUTPUT)")); + digitalWrite(hwConfig.mist.uartSelPin, 0); // enable zigbee serial on LAN.so free USB DEBUG_PRINTLN(F("enable zigbee serial 1 - LOW")); - modes.uartChIs = true; + vars.hwUartSelIs = true; } - if ((hwConfig.zbTxPin > 0) && (hwConfig.zbRxPin > 0) && (hwConfig.zbRstPin > 0) && (hwConfig.zbBslPin > 0)) + if ((hwConfig.zb.txPin > 0) && (hwConfig.zb.rxPin > 0) && (hwConfig.zb.rstPin > 0) && (hwConfig.zb.bslPin > 0)) { - if (modes.uartChIs == true) + if (vars.hwUartSelIs == true) { - digitalWrite(hwConfig.uartChPin, 0); // enable zigbee serial + digitalWrite(hwConfig.mist.uartSelPin, 0); // enable zigbee serial DEBUG_PRINTLN(F("enable zigbee serial 2 - LOW")); } - Serial2.begin(ConfigSettings.serialSpeed, SERIAL_8N1, hwConfig.zbRxPin, hwConfig.zbTxPin); // start zigbee serial + Serial2.begin(systemCfg.serialSpeed, SERIAL_8N1, hwConfig.zb.rxPin, hwConfig.zb.txPin); // start zigbee serial int BSL_MODE = 0; - if (zbInit(hwConfig.zbRstPin, hwConfig.zbBslPin, BSL_MODE)) + if (zbInit(hwConfig.zb.rstPin, hwConfig.zb.bslPin, BSL_MODE)) { DEBUG_PRINTLN(F("Zigbee init - OK")); - modes.zigbeeIs = true; + vars.hwZigbeeIs = true; } else { DEBUG_PRINTLN(F("Zigbee init - ERROR")); - modes.zigbeeIs = false; + vars.hwZigbeeIs = false; } } - if (modes.btnIs) + if (vars.hwBtnIs) { // hard reset BTN -#if BUILD_ENV_NAME != debug - if (!digitalRead(hwConfig.btnPin)) +//#if BUILD_ENV_NAME != debug + if (!digitalRead(hwConfig.mist.btnPin)) { DEBUG_PRINTLN(F("[hard reset] Entering hard reset mode")); uint8_t counter = 0; - while (!digitalRead(hwConfig.btnPin)) + while (!digitalRead(hwConfig.mist.btnPin)) { if (counter >= 10) { @@ -1402,48 +877,55 @@ void setup() } DEBUG_PRINTLN(F("[hard reset] Btn up, exit")); } -#endif +//#endif - attachInterrupt(digitalPinToInterrupt(hwConfig.btnPin), btnInterrupt, FALLING); - } - if (!loadConfigSerial()) - { - DEBUG_PRINTLN(F("Error load config serial")); - ESP.restart(); - } - else - { - DEBUG_PRINTLN(F("Config serial load OK")); + attachInterrupt(digitalPinToInterrupt(hwConfig.mist.btnPin), btnInterrupt, FALLING); } - if ((!loadConfigWifi()) || (!loadConfigEther()) || (!loadConfigGeneral()) || (!loadConfigSecurity()) || (!loadConfigMqtt()) || (!loadConfigWg())) - { - DEBUG_PRINTLN(F("Error load config files")); - ESP.restart(); - } - else - { - DEBUG_PRINTLN(F("Config files load OK")); - } - DEBUG_PRINTLN("ConfigSettings.disableLeds: "); - DEBUG_PRINTLN(ConfigSettings.disableLeds); - setLedsDisable(ConfigSettings.disableLeds, true); // with setup ?? + // READ file to support migrate from old firmware + loadFileSystemVar(); + loadFileConfigSerial(); + loadFileConfigWifi(); + loadFileConfigEther(); + loadFileConfigGeneral(); + loadFileConfigSecurity(); + loadFileConfigMqtt(); + loadFileConfigWg(); + // READ file to support migrate from old firmware + + LOGI(tag, "After full load config\n"); + // printConfig(networkCfg, vpnCfg, mqttCfg, systemCfg); + String cfg = makeJsonConfig(&networkCfg, &vpnCfg, &mqttCfg, &systemCfg, &vars); + DEBUG_PRINTLN(cfg); + + DEBUG_PRINTLN(""); + + // DEBUG_PRINTLN("systemCfg.disableLeds: "); + // DEBUG_PRINTLN(systemCfg.disableLeds); + setLedsDisable(systemCfg.disableLeds, true); // with setup ?? setupCoordinatorMode(); - ConfigSettings.connectedClients = 0; + vars.connectedClients = 0; // initZb(); - if (MqttSettings.enable) - { - mqttConnectSetup(); - } - // DEBUG_PRINTLN(millis()); - // Serial2.updateBaudRate(ConfigSettings.serialSpeed); // set actual speed + // Serial2.updateBaudRate(systemCfg.serialSpeed); // set actual speed printLogMsg("Setup done"); + //delay(2000); + + printNVSFreeSpace(); - char deviceIdArr[100]; + /* + LOGI(tag, "Saving config to NVS"); + saveNetworkConfig(networkCfg); + saveVpnConfig(vpnCfg); + saveMqttConfig(mqttCfg); + saveSystemConfig(systemCfg); + printNVSFreeSpace(); + */ + + char deviceIdArr[MAX_DEV_ID_LONG]; getDeviceID(deviceIdArr); DEBUG_PRINTLN(String(deviceIdArr)); @@ -1464,35 +946,35 @@ WiFiClient client[10]; void socketClientConnected(int client) { - if (ConfigSettings.connectedSocket[client] != true) + if (vars.connectedSocket[client] != true) { DEBUG_PRINT(F("Connected client ")); DEBUG_PRINTLN(client); - if (ConfigSettings.connectedClients == 0) + if (vars.connectedClients == 0) { - ConfigSettings.socketTime = millis(); + vars.socketTime = millis(); DEBUG_PRINT(F("Socket time ")); - DEBUG_PRINTLN(ConfigSettings.socketTime); + DEBUG_PRINTLN(vars.socketTime); mqttPublishIo("socket", "ON"); } - ConfigSettings.connectedSocket[client] = true; - ConfigSettings.connectedClients++; + vars.connectedSocket[client] = true; + vars.connectedClients++; } } void socketClientDisconnected(int client) { - if (ConfigSettings.connectedSocket[client] != false) + if (vars.connectedSocket[client] != false) { DEBUG_PRINT(F("Disconnected client ")); DEBUG_PRINTLN(client); - ConfigSettings.connectedSocket[client] = false; - ConfigSettings.connectedClients--; - if (ConfigSettings.connectedClients == 0) + vars.connectedSocket[client] = false; + vars.connectedClients--; + if (vars.connectedClients == 0) { - ConfigSettings.socketTime = millis(); + vars.socketTime = millis(); DEBUG_PRINT(F("Socket time ")); - DEBUG_PRINTLN(ConfigSettings.socketTime); + DEBUG_PRINTLN(vars.socketTime); mqttPublishIo("socket", "OFF"); } } @@ -1563,9 +1045,9 @@ void printSendSocket(size_t bytes_read, uint8_t serial_buf[BUFFER_SIZE]) void loop(void) { - if (btnFlag && modes.btnIs) + if (btnFlag && vars.hwBtnIs) { - if (!digitalRead(hwConfig.btnPin)) + if (!digitalRead(hwConfig.mist.btnPin)) { // pressed if (tmrBtnLongPress.state() == STOPPED) { @@ -1591,13 +1073,13 @@ void loop(void) } else { - if (ConfigSettings.connectedClients == 0) + if (vars.connectedClients == 0) { webServerHandleClient(); } } - if (ConfigSettings.coordinator_mode != COORDINATOR_MODE_USB) + if (vars.workMode != WORK_MODE_USB) { uint16_t net_bytes_read = 0; uint8_t net_buf[BUFFER_SIZE]; @@ -1614,10 +1096,10 @@ void loop(void) { client[i].stop(); } - if (ConfigSettings.fwEnabled) + if (systemCfg.fwEnabled) { WiFiClient TempClient2 = server.available(); - if (TempClient2.remoteIP() == ConfigSettings.fwIp) + if (TempClient2.remoteIP() == systemCfg.fwIp) { printLogMsg(String("[SOCK IP WHITELIST] Accepted connection from IP: ") + TempClient2.remoteIP().toString()); client[i] = TempClient2; @@ -1680,11 +1162,15 @@ void loop(void) serial_bytes_read = 0; } - if (MqttSettings.enable) + if (mqttCfg.enable) { mqttLoop(); } } + if (vpnCfg.wgEnable && vars.vpnWgInit) { + wgLoop(); + } + if (WiFi.getMode() == WIFI_MODE_AP || WiFi.getMode() == WIFI_MODE_APSTA) { diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 8d01ec7..ce810bd 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "config.h" #include "web.h" @@ -13,77 +14,92 @@ #include "etc.h" #include "mqtt.h" -extern struct ConfigSettingsStruct ConfigSettings; +// extern struct ConfigSettingsStruct ConfigSettings; extern struct zbVerStruct zbVer; -extern struct MqttSettingsStruct MqttSettings; +// extern struct MqttSettingsStruct MqttSettings; + +extern struct SystemConfigStruct systemCfg; +extern struct NetworkConfigStruct networkCfg; +extern struct MqttConfigStruct mqttCfg; + +extern struct SysVarsStruct vars; WiFiClient clientMqtt; PubSubClient clientPubSub(clientMqtt); +String tagMQTT = "MQTT"; const char *homeAssistant = "homeassistant"; const char *haSensor = "sensor"; const char *haButton = "button"; const char *haBinarySensor = "binary_sensor"; +const char *willMessage = "offline"; void mqttConnectSetup() { - clientPubSub.setServer(MqttSettings.serverIP, MqttSettings.port); - clientPubSub.setCallback(mqttCallback); + LOGI(tagMQTT, "Try to connect %s:%d", mqttCfg.server, mqttCfg.port); + if (strlen(mqttCfg.server) > 0 && mqttCfg.port > 0) + { + clientPubSub.setServer(mqttCfg.server, mqttCfg.port); // + LOGI(tagMQTT, "Try to setCallback"); + clientPubSub.setCallback(mqttCallback); + } + else + { + LOGE(tagMQTT, "Error in config"); + } } -void mqttReconnect() +bool mqttReconnect() { - DEBUG_PRINT(F("Attempting MQTT connection...")); + LOGI(tagMQTT, "Attempting MQTT connection..."); byte willQoS = 0; - String willTopic = String(MqttSettings.topic) + "/avty"; - const char *willMessage = "offline"; + String willTopic = String(mqttCfg.topic) + "/avty"; + boolean willRetain = false; - char deviceIdArr[20]; + char deviceIdArr[MAX_DEV_ID_LONG]; getDeviceID(deviceIdArr); - if (clientPubSub.connect(String(deviceIdArr).c_str(), MqttSettings.user, MqttSettings.pass, willTopic.c_str(), willQoS, willRetain, willMessage)) + if (clientPubSub.connect(deviceIdArr, mqttCfg.user, mqttCfg.pass, willTopic.c_str(), willQoS, willRetain, willMessage)) { - MqttSettings.reconnectTime = 0; + vars.mqttReconnectTime = 0; mqttOnConnect(); + LOGI(tagMQTT, "OK, %d", clientPubSub.state()); + return true; } else { - DEBUG_PRINT(F("failed, rc=")); - DEBUG_PRINT(clientPubSub.state()); - DEBUG_PRINT(F(" try again in ")); - DEBUG_PRINT(MqttSettings.interval); - DEBUG_PRINTLN(F(" seconds")); + LOGI(tagMQTT, "failed, rc= %d try again in %d seconds", clientPubSub.state(), mqttCfg.reconnectInt); - MqttSettings.reconnectTime = millis() + MqttSettings.interval * 1000; + return false; } } void mqttOnConnect() { - DEBUG_PRINTLN(F("connected")); - MqttSettings.connect = true; + //LOGI(tagMQTT, "connected"); + vars.mqttConn = true; mqttSubscribe("cmd"); - DEBUG_PRINTLN(F("mqtt Subscribed")); - if (MqttSettings.discovery) + LOGI(tagMQTT, "mqtt Subscribed"); + if (mqttCfg.discovery) { mqttPublishDiscovery(); - DEBUG_PRINTLN(F("mqtt Published Discovery")); + LOGI(tagMQTT, "mqtt Published Discovery"); } mqttPublishIo("rst_esp", "OFF"); mqttPublishIo("rst_zig", "OFF"); mqttPublishIo("enbl_bsl", "OFF"); mqttPublishIo("socket", "OFF"); - DEBUG_PRINTLN(F("mqtt Published IOs")); + LOGI(tagMQTT, "mqtt Published IOs"); mqttPublishAvail(); - DEBUG_PRINTLN(F("mqtt Published Avty")); - if (MqttSettings.interval > 0) + LOGI(tagMQTT, "mqtt Published Avty"); + if (mqttCfg.updateInt > 0) { mqttPublishState(); - DEBUG_PRINTLN(F("mqtt Published State")); + LOGI(tagMQTT, "mqtt Published State"); } } @@ -96,7 +112,7 @@ void mqttPublishMsg(String topic, String msg, bool retain) void mqttPublishAvail() { - String topic(MqttSettings.topic); + String topic(mqttCfg.topic); topic = topic + "/avty"; String mqttBuffer = "online"; clientPubSub.publish(topic.c_str(), mqttBuffer.c_str(), true); @@ -104,7 +120,7 @@ void mqttPublishAvail() void mqttPublishState() { - String topic(MqttSettings.topic); + String topic(mqttCfg.topic); topic = topic + "/state"; DynamicJsonDocument root(1024); String readableTime; @@ -113,67 +129,68 @@ void mqttPublishState() float CPUtemp = getCPUtemp(); root["temperature"] = String(CPUtemp); - - root["connections"] = ConfigSettings.connectedClients; - - if (ConfigSettings.connectedEther) + + root["connections"] = vars.connectedClients; + + if (vars.connectedEther) { - if (ConfigSettings.dhcp) + if (networkCfg.ethDhcp) { root["ip"] = ETH.localIP().toString(); } else { - root["ip"] = ConfigSettings.ipAddress; + root["ip"] = networkCfg.ethAddr; } } else { - if (ConfigSettings.dhcpWiFi) + if (networkCfg.wifiDhcp) { root["ip"] = WiFi.localIP().toString(); } else { - root["ip"] = ConfigSettings.ipAddressWiFi; + root["ip"] = networkCfg.wifiAddr; } } - //if (ConfigSettings.emergencyWifi) + // if (ConfigSettings.emergencyWifi) //{ - // root["emergencyMode"] = "ON"; - //} - //else + // root["emergencyMode"] = "ON"; + // } + // else //{ - // root["emergencyMode"] = "OFF"; - //} + // root["emergencyMode"] = "OFF"; + // } - switch (ConfigSettings.coordinator_mode) { - case COORDINATOR_MODE_USB: - root["mode"] = "Zigbee-to-USB"; - break; - case COORDINATOR_MODE_WIFI: - root["mode"] = "Zigbee-to-WiFi"; - break; - case COORDINATOR_MODE_LAN: - root["mode"] = "Zigbee-to-Ethernet"; - break; - default: - break; + switch (vars.workMode) + { + case WORK_MODE_USB: + root["mode"] = "Zigbee-to-USB"; + break; + /*case COORDINATOR_MODE_WIFI: + root["mode"] = "Zigbee-to-WiFi"; + break;*/ + case WORK_MODE_NETWORK: + root["mode"] = "Zigbee-to-Network"; + break; + default: + break; } root["zbfw"] = String(zbVer.zbRev); - root["hostname"] = ConfigSettings.hostname; + root["hostname"] = systemCfg.hostname; String mqttBuffer; serializeJson(root, mqttBuffer); - DEBUG_PRINTLN(mqttBuffer); + // DEBUG_PRINTLN(mqttBuffer); clientPubSub.publish(topic.c_str(), mqttBuffer.c_str(), true); - MqttSettings.heartbeatTime = millis() + (MqttSettings.interval * 1000); + vars.mqttHeartbeatTime = millis() + (mqttCfg.updateInt * 1000); } void mqttPublishIo(String const &io, String const &state) { if (clientPubSub.connected()) { - String topic(MqttSettings.topic); + String topic(mqttCfg.topic); topic = topic + "/io/" + io; clientPubSub.publish(topic.c_str(), state.c_str(), true); } @@ -183,20 +200,20 @@ void mqttCallback(char *topic, byte *payload, unsigned int length) { char jjson[length + 1]; memcpy(jjson, payload, length); - jjson[length + 1] = '\0'; + //jjson[length + 1] = '\0'; + jjson[length] = '\0'; - DynamicJsonDocument jsonBuffer(1024); + DynamicJsonDocument jsonBuffer(512); deserializeJson(jsonBuffer, jjson); const char *command = jsonBuffer["cmd"]; - DEBUG_PRINT(F("mqtt Callback - ")); - DEBUG_PRINTLN(jjson); + LOGI(tagMQTT, "mqtt Callback - %s", String(jjson)); - if (command) { - DEBUG_PRINT(F("mqtt cmd - ")); - DEBUG_PRINTLN(command); + if (command) + { + LOGI(tagMQTT, "mqtt cmd - %s", String(command)); if (strcmp(command, "rst_esp") == 0) { printLogMsg("ESP restart MQTT"); @@ -220,7 +237,7 @@ void mqttCallback(char *topic, byte *payload, unsigned int length) void mqttSubscribe(String topic) { - String mtopic(MqttSettings.topic); + String mtopic(mqttCfg.topic); mtopic = mtopic + "/" + topic; clientPubSub.subscribe(mtopic.c_str()); } @@ -228,242 +245,249 @@ void mqttSubscribe(String topic) void mqttLoop() { if (!clientPubSub.connected()) - { - MqttSettings.connect = false; - if (MqttSettings.reconnectTime == 0) + { + vars.mqttConn = false; + if (vars.mqttReconnectTime == 0) { - //mqttReconnect(); - DEBUG_PRINTLN(F("mqttReconnect in 5 seconds")); - MqttSettings.reconnectTime = millis() + 5000; + // mqttReconnect(); + LOGI(tagMQTT, "Connect in %d seconds", mqttCfg.reconnectInt); + vars.mqttReconnectTime = millis() + mqttCfg.reconnectInt*1000; } else { - if (MqttSettings.reconnectTime <= millis()) + if (vars.mqttReconnectTime <= millis()) { - mqttReconnect(); + bool conn = mqttReconnect(); + //LOGI(tagMQTT, "mqttReconnect exit with %s", conn ? "true" : "false"); + vars.mqttReconnectTime = millis() + mqttCfg.reconnectInt*1000; } } } else { clientPubSub.loop(); - if (MqttSettings.interval > 0) + if (mqttCfg.updateInt > 0) { - if (MqttSettings.heartbeatTime <= millis()) + if (vars.mqttHeartbeatTime <= millis()) { mqttPublishState(); } } } + // LOGI(tagMQTT, "loop end"); } void mqttPublishDiscovery() { - String mtopic(MqttSettings.topic); - String deviceName = mtopic; //ConfigSettings.hostname; + String mtopic(mqttCfg.topic); + String deviceName = mtopic; // systemCfg.hostname; String topic; DynamicJsonDocument buffJson(2048); String mqttBuffer; - DynamicJsonDocument via(1024); - char deviceIdArr[20]; + DynamicJsonDocument via(150); + char deviceIdArr[MAX_DEV_ID_LONG]; getDeviceID(deviceIdArr); via["ids"] = String(deviceIdArr); String sensor_topic = String(homeAssistant) + "/" + String(haSensor) + "/"; String button_topic = String(homeAssistant) + "/" + String(haButton) + "/"; String binary_sensor_topic = String(homeAssistant) + "/" + String(haBinarySensor) + "/"; - //int lastAutoMsg = 9; - //if (ConfigSettings.board == 2) lastAutoMsg--; + // int lastAutoMsg = 9; + // if (ConfigSettings.board == 2) lastAutoMsg--; for (int i = 0; i <= 99; i++) { switch (i) { - case 0: - { - DynamicJsonDocument dev(1024); - char deviceIdArr[20]; - getDeviceID(deviceIdArr); - - dev["ids"] = String(deviceIdArr); - dev["name"] = ConfigSettings.hostname; - dev["mf"] = "Zig Star"; - //dev["mdl"] = ConfigSettings.boardName; - - char verArr[25]; - const char * env = STRINGIFY(BUILD_ENV_NAME); - sprintf(verArr, "%s (%s)", VERSION, env); - dev["sw"] = String(verArr); - - topic = button_topic + deviceName + "/rst_esp/config"; - buffJson["name"] = "Restart ESP"; - buffJson["uniq_id"] = deviceName + "/rst_esp"; - buffJson["stat_t"] = mtopic + "/io/rst_esp"; - buffJson["cmd_t"] = mtopic + "/cmd"; - buffJson["icon"] = "mdi:restore-alert"; - buffJson["payload_press"] = "{cmd:\"rst_esp\"}"; - buffJson["avty_t"] = mtopic + "/avty"; - buffJson["dev"] = dev; - break; - } - case 1: - { - topic = button_topic + deviceName + "/rst_zig/config"; - buffJson["name"] = "Restart Zigbee"; - buffJson["uniq_id"] = deviceName + "/rst_zig"; - buffJson["stat_t"] = mtopic + "/io/rst_zig"; - buffJson["cmd_t"] = mtopic + "/cmd"; - buffJson["icon"] = "mdi:restart"; - buffJson["payload_press"] = "{cmd:\"rst_zig\"}"; - buffJson["avty_t"] = mtopic + "/avty"; - buffJson["dev"] = via; - break; - } - case 2: - { - topic = button_topic + deviceName + "/enbl_bsl/config"; - buffJson["name"] = "Enable BSL"; - buffJson["uniq_id"] = deviceName + "/enbl_bsl"; - buffJson["stat_t"] = mtopic + "/io/enbl_bsl"; - buffJson["cmd_t"] = mtopic + "/cmd"; - buffJson["icon"] = "mdi:flash"; - buffJson["payload_press"] = "{cmd:\"enbl_bsl\"}"; - buffJson["avty_t"] = mtopic + "/avty"; - buffJson["dev"] = via; - break; - } - case 3: - { - topic = binary_sensor_topic + deviceName + "/socket/config"; - buffJson["name"] = "Socket"; - buffJson["uniq_id"] = deviceName + "/socket"; - buffJson["stat_t"] = mtopic + "/io/socket"; - buffJson["avty_t"] = mtopic + "/avty"; - buffJson["dev_cla"] = "connectivity"; - buffJson["dev"] = via; - break; - } - //case 4: - //{ - // topic = binary_sensor_topic + deviceName + "/emrgncMd/config"; - // buffJson["name"] = "Emergency mode"; - // buffJson["uniq_id"] = deviceName + "/emrgncMd"; - // buffJson["stat_t"] = mtopic + "/state"; - // buffJson["avty_t"] = mtopic + "/avty"; - // buffJson["val_tpl"] = "{{ value_json.emergencyMode }}"; - // buffJson["json_attr_t"] = mtopic + "/state"; - // buffJson["dev_cla"] = "power"; - // buffJson["icon"] = "mdi:access-point-network"; - // buffJson["dev"] = via; - // break; - //} - case 4: - { - topic = sensor_topic + deviceName + "/uptime/config"; - buffJson["name"] = "Uptime"; - buffJson["uniq_id"] = deviceName + "/uptime"; - buffJson["stat_t"] = mtopic + "/state"; - buffJson["avty_t"] = mtopic + "/avty"; - buffJson["val_tpl"] = "{{ value_json.uptime }}"; - buffJson["json_attr_t"] = mtopic + "/state"; - buffJson["icon"] = "mdi:clock"; - buffJson["dev"] = via; - break; - } - case 5: - { - topic = sensor_topic + deviceName + "/ip/config"; - buffJson["name"] = "IP"; - buffJson["uniq_id"] = deviceName + "/ip"; - buffJson["stat_t"] = mtopic + "/state"; - buffJson["avty_t"] = mtopic + "/avty"; - buffJson["val_tpl"] = "{{ value_json.ip }}"; - buffJson["json_attr_t"] = mtopic + "/state"; - buffJson["icon"] = "mdi:check-network"; - buffJson["dev"] = via; - break; - } - case 6: - { - topic = sensor_topic + deviceName + "/temperature/config"; - buffJson["name"] = "ESP temperature"; - buffJson["uniq_id"] = deviceName + "/temperature"; - buffJson["stat_t"] = mtopic + "/state"; - buffJson["avty_t"] = mtopic + "/avty"; - buffJson["val_tpl"] = "{{ value_json.temperature }}"; - buffJson["json_attr_t"] = mtopic + "/state"; - buffJson["icon"] = "mdi:coolant-temperature"; - buffJson["dev"] = via; - buffJson["dev_cla"] = "temperature"; - buffJson["stat_cla"] = "measurement"; - buffJson["unit_of_meas"] = "°C"; - break; - } - case 7: - { - topic = sensor_topic + deviceName + "/hostname/config"; - buffJson["name"] = "Hostname"; - buffJson["uniq_id"] = deviceName + "/hostname"; - buffJson["stat_t"] = mtopic + "/state"; - buffJson["avty_t"] = mtopic + "/avty"; - buffJson["val_tpl"] = "{{ value_json.hostname }}"; - buffJson["json_attr_t"] = mtopic + "/state"; - buffJson["icon"] = "mdi:account-network"; - buffJson["dev"] = via; - break; - } - case 8: - { - topic = sensor_topic + deviceName + "/connections/config"; - buffJson["name"] = "Socket connections"; - buffJson["uniq_id"] = deviceName + "/connections"; - buffJson["stat_t"] = mtopic + "/state"; - buffJson["avty_t"] = mtopic + "/avty"; - buffJson["val_tpl"] = "{{ value_json.connections }}"; - buffJson["json_attr_t"] = mtopic + "/state"; - buffJson["icon"] = "mdi:check-network-outline"; - buffJson["dev"] = via; - break; - } - case 9: - { - topic = sensor_topic + deviceName + "/mode/config"; - buffJson["name"] = "Mode"; - buffJson["uniq_id"] = deviceName + "/mode"; - buffJson["stat_t"] = mtopic + "/state"; - buffJson["avty_t"] = mtopic + "/avty"; - buffJson["val_tpl"] = "{{ value_json.mode }}"; - buffJson["json_attr_t"] = mtopic + "/state"; - buffJson["icon"] = "mdi:access-point-network"; - buffJson["dev"] = via; - break; - } - case 10: - { - topic = sensor_topic + deviceName + "/zbfw/config"; - buffJson["name"] = "Zigbee fw rev"; - buffJson["uniq_id"] = deviceName + "/zbfw"; - buffJson["stat_t"] = mtopic + "/state"; - buffJson["avty_t"] = mtopic + "/avty"; - buffJson["val_tpl"] = "{{ value_json.zbfw }}"; - buffJson["json_attr_t"] = mtopic + "/state"; - buffJson["icon"] = "mdi:access-point-network"; - buffJson["dev"] = via; - break; - } - default: - topic = "error"; - break; + case 0: + { + DynamicJsonDocument dev(256); + char deviceIdArr[MAX_DEV_ID_LONG]; + getDeviceID(deviceIdArr); + + dev["ids"] = String(deviceIdArr); + dev["name"] = systemCfg.hostname; + dev["mf"] = "Zig Star"; + // dev["mdl"] = ConfigSettings.boardName; + + char verArr[25]; + const char *env = STRINGIFY(BUILD_ENV_NAME); + sprintf(verArr, "%s (%s)", VERSION, env); + dev["sw"] = String(verArr); + + topic = button_topic + deviceName + "/rst_esp/config"; + buffJson["name"] = "Restart ESP"; + buffJson["uniq_id"] = deviceName + "/rst_esp"; + buffJson["stat_t"] = mtopic + "/io/rst_esp"; + buffJson["cmd_t"] = mtopic + "/cmd"; + buffJson["icon"] = "mdi:restore-alert"; + buffJson["payload_press"] = "{cmd:\"rst_esp\"}"; + buffJson["avty_t"] = mtopic + "/avty"; + buffJson["dev"] = dev; + break; + } + case 1: + { + topic = button_topic + deviceName + "/rst_zig/config"; + buffJson["name"] = "Restart Zigbee"; + buffJson["uniq_id"] = deviceName + "/rst_zig"; + buffJson["stat_t"] = mtopic + "/io/rst_zig"; + buffJson["cmd_t"] = mtopic + "/cmd"; + buffJson["icon"] = "mdi:restart"; + buffJson["payload_press"] = "{cmd:\"rst_zig\"}"; + buffJson["avty_t"] = mtopic + "/avty"; + buffJson["dev"] = via; + break; + } + case 2: + { + topic = button_topic + deviceName + "/enbl_bsl/config"; + buffJson["name"] = "Enable BSL"; + buffJson["uniq_id"] = deviceName + "/enbl_bsl"; + buffJson["stat_t"] = mtopic + "/io/enbl_bsl"; + buffJson["cmd_t"] = mtopic + "/cmd"; + buffJson["icon"] = "mdi:flash"; + buffJson["payload_press"] = "{cmd:\"enbl_bsl\"}"; + buffJson["avty_t"] = mtopic + "/avty"; + buffJson["dev"] = via; + break; + } + case 3: + { + topic = binary_sensor_topic + deviceName + "/socket/config"; + buffJson["name"] = "Socket"; + buffJson["uniq_id"] = deviceName + "/socket"; + buffJson["stat_t"] = mtopic + "/io/socket"; + buffJson["avty_t"] = mtopic + "/avty"; + buffJson["dev_cla"] = "connectivity"; + buffJson["dev"] = via; + break; + } + // case 4: + //{ + // topic = binary_sensor_topic + deviceName + "/emrgncMd/config"; + // buffJson["name"] = "Emergency mode"; + // buffJson["uniq_id"] = deviceName + "/emrgncMd"; + // buffJson["stat_t"] = mtopic + "/state"; + // buffJson["avty_t"] = mtopic + "/avty"; + // buffJson["val_tpl"] = "{{ value_json.emergencyMode }}"; + // buffJson["json_attr_t"] = mtopic + "/state"; + // buffJson["dev_cla"] = "power"; + // buffJson["icon"] = "mdi:access-point-network"; + // buffJson["dev"] = via; + // break; + // } + case 4: + { + topic = sensor_topic + deviceName + "/uptime/config"; + buffJson["name"] = "Uptime"; + buffJson["uniq_id"] = deviceName + "/uptime"; + buffJson["stat_t"] = mtopic + "/state"; + buffJson["avty_t"] = mtopic + "/avty"; + buffJson["val_tpl"] = "{{ value_json.uptime }}"; + buffJson["json_attr_t"] = mtopic + "/state"; + buffJson["icon"] = "mdi:clock"; + buffJson["dev"] = via; + break; + } + case 5: + { + topic = sensor_topic + deviceName + "/ip/config"; + buffJson["name"] = "IP"; + buffJson["uniq_id"] = deviceName + "/ip"; + buffJson["stat_t"] = mtopic + "/state"; + buffJson["avty_t"] = mtopic + "/avty"; + buffJson["val_tpl"] = "{{ value_json.ip }}"; + buffJson["json_attr_t"] = mtopic + "/state"; + buffJson["icon"] = "mdi:check-network"; + buffJson["dev"] = via; + break; + } + case 6: + { + topic = sensor_topic + deviceName + "/temperature/config"; + buffJson["name"] = "ESP temperature"; + buffJson["uniq_id"] = deviceName + "/temperature"; + buffJson["stat_t"] = mtopic + "/state"; + buffJson["avty_t"] = mtopic + "/avty"; + buffJson["val_tpl"] = "{{ value_json.temperature }}"; + buffJson["json_attr_t"] = mtopic + "/state"; + buffJson["icon"] = "mdi:coolant-temperature"; + buffJson["dev"] = via; + buffJson["dev_cla"] = "temperature"; + buffJson["stat_cla"] = "measurement"; + buffJson["unit_of_meas"] = "°C"; + break; } - if (topic != "error") { + case 7: + { + topic = sensor_topic + deviceName + "/hostname/config"; + buffJson["name"] = "Hostname"; + buffJson["uniq_id"] = deviceName + "/hostname"; + buffJson["stat_t"] = mtopic + "/state"; + buffJson["avty_t"] = mtopic + "/avty"; + buffJson["val_tpl"] = "{{ value_json.hostname }}"; + buffJson["json_attr_t"] = mtopic + "/state"; + buffJson["icon"] = "mdi:account-network"; + buffJson["dev"] = via; + break; + } + case 8: + { + topic = sensor_topic + deviceName + "/connections/config"; + buffJson["name"] = "Socket connections"; + buffJson["uniq_id"] = deviceName + "/connections"; + buffJson["stat_t"] = mtopic + "/state"; + buffJson["avty_t"] = mtopic + "/avty"; + buffJson["val_tpl"] = "{{ value_json.connections }}"; + buffJson["json_attr_t"] = mtopic + "/state"; + buffJson["icon"] = "mdi:check-network-outline"; + buffJson["dev"] = via; + break; + } + case 9: + { + topic = sensor_topic + deviceName + "/mode/config"; + buffJson["name"] = "Mode"; + buffJson["uniq_id"] = deviceName + "/mode"; + buffJson["stat_t"] = mtopic + "/state"; + buffJson["avty_t"] = mtopic + "/avty"; + buffJson["val_tpl"] = "{{ value_json.mode }}"; + buffJson["json_attr_t"] = mtopic + "/state"; + buffJson["icon"] = "mdi:access-point-network"; + buffJson["dev"] = via; + break; + } + case 10: + { + topic = sensor_topic + deviceName + "/zbfw/config"; + buffJson["name"] = "Zigbee fw rev"; + buffJson["uniq_id"] = deviceName + "/zbfw"; + buffJson["stat_t"] = mtopic + "/state"; + buffJson["avty_t"] = mtopic + "/avty"; + buffJson["val_tpl"] = "{{ value_json.zbfw }}"; + buffJson["json_attr_t"] = mtopic + "/state"; + buffJson["icon"] = "mdi:access-point-network"; + buffJson["dev"] = via; + break; + } + default: + topic = "error"; + break; + } + if (topic != "error") + { serializeJson(buffJson, mqttBuffer); - //DEBUG_PRINTLN(mqttBuffer); + // DEBUG_PRINTLN(mqttBuffer); mqttPublishMsg(topic, mqttBuffer, true); buffJson.clear(); mqttBuffer = ""; } - else { i = 100; } + else + { + i = 100; + } } } \ No newline at end of file diff --git a/src/mqtt.h b/src/mqtt.h index 113700d..c87a21c 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -1,6 +1,6 @@ void mqttConnectSetup(); -void mqttReconnect(); +bool mqttReconnect(); void mqttCallback(char *topic, byte *payload, unsigned int length); void mqttLoop(); void mqttPublishState(); diff --git a/src/version.h b/src/version.h index 44f1dbc..693b9f1 100644 --- a/src/version.h +++ b/src/version.h @@ -1,9 +1,5 @@ - // AUTO GENERATED FILE, DO NOT EDIT - #ifndef VERSION - #define VERSION "1.0.1" - #endif - #ifndef BUILD_TIMESTAMP - #define BUILD_TIMESTAMP "2024-03-25 00:16:26.247681" - #endif - \ No newline at end of file +// AUTO GENERATED FILE, DO NOT EDIT +#ifndef VERSION + #define VERSION "20240330" +#endif diff --git a/src/web.cpp b/src/web.cpp index 1b43158..c2f87e2 100644 --- a/src/web.cpp +++ b/src/web.cpp @@ -16,18 +16,18 @@ #include "etc.h" #include "zb.h" #include "zones.h" +// #include "hw.h" -#include "webh/PAGE_WG.html.gz.h" +#include "webh/PAGE_VPN.html.gz.h" #include "webh/PAGE_MQTT.html.gz.h" #include "webh/PAGE_ABOUT.html.gz.h" -#include "webh/PAGE_ETHERNET.html.gz.h" #include "webh/PAGE_GENERAL.html.gz.h" #include "webh/PAGE_LOADER.html.gz.h" #include "webh/PAGE_ROOT.html.gz.h" #include "webh/PAGE_SECURITY.html.gz.h" -#include "webh/PAGE_SERIAL.html.gz.h" -#include "webh/PAGE_SYSTOOLS.html.gz.h" -#include "webh/PAGE_WIFI.html.gz.h" +#include "webh/PAGE_ZIGBEE.html.gz.h" +#include "webh/PAGE_TOOLS.html.gz.h" +#include "webh/PAGE_NETWORK.html.gz.h" #include "webh/PAGE_LOGOUT.html.gz.h" #include "webh/bootstrap.min.js.gz.h" #include "webh/functions.js.gz.h" @@ -46,12 +46,21 @@ // #define HTTP_MAX_SEND_WAIT 10000 // ms to wait for data chunk to be ACKed // #define HTTP_MAX_CLOSE_WAIT 4000 // ms to wait for the client to close the connection -extern struct ConfigSettingsStruct ConfigSettings; +// extern struct ConfigSettingsStruct ConfigSettings; extern struct zbVerStruct zbVer; -extern struct MqttSettingsStruct MqttSettings; -extern struct WgSettingsStruct WgSettings; +// extern struct MqttSettingsStruct MqttSettings; +// extern struct WgSettingsStruct WgSettings; extern struct BrdConfigStruct hwConfig; -extern struct CurrentModesStruct modes; +extern BrdConfigStruct brdConfigs[BOARD_CFG_CNT]; + +// extern struct CurrentModesStruct modes; + +extern struct SystemConfigStruct systemCfg; +extern struct NetworkConfigStruct networkCfg; +extern struct VpnConfigStruct vpnCfg; +extern struct MqttConfigStruct mqttCfg; + +extern struct SysVarsStruct vars; bool wifiWebSetupInProgress = false; extern const char *coordMode; @@ -78,21 +87,21 @@ const char *tempFile = "/config/fw.hex"; bool opened = false; File fwFile; -extern bool loadConfigMqtt(); -extern bool loadConfigWg(); +extern bool loadFileConfigMqtt(); +extern bool loadFileConfigWg(); enum API_PAGE_t : uint8_t { API_PAGE_ROOT, API_PAGE_GENERAL, API_PAGE_ETHERNET, - API_PAGE_WIFI, - API_PAGE_ZHA_Z2M, + API_PAGE_NETWORK, + API_PAGE_ZIGBEE, API_PAGE_SECURITY, - API_PAGE_SYSTOOLS, + API_PAGE_TOOLS, API_PAGE_ABOUT, API_PAGE_MQTT, - API_PAGE_WG + API_PAGE_VPN }; WebServer serverWeb(80); @@ -138,19 +147,19 @@ void initWebServer() { sendGzip(contTypeTextHtml, PAGE_LOADER_html_gz, PAGE_LOADER_html_gz_len); }); serverWeb.on("/security", []() { sendGzip(contTypeTextHtml, PAGE_LOADER_html_gz, PAGE_LOADER_html_gz_len); }); - serverWeb.on("/wifi", []() + serverWeb.on("/network", []() { sendGzip(contTypeTextHtml, PAGE_LOADER_html_gz, PAGE_LOADER_html_gz_len); }); serverWeb.on("/ethernet", []() { sendGzip(contTypeTextHtml, PAGE_LOADER_html_gz, PAGE_LOADER_html_gz_len); }); - serverWeb.on("/zha-z2m", []() + serverWeb.on("/zigbee", []() { sendGzip(contTypeTextHtml, PAGE_LOADER_html_gz, PAGE_LOADER_html_gz_len); }); serverWeb.on("/about", []() { sendGzip(contTypeTextHtml, PAGE_LOADER_html_gz, PAGE_LOADER_html_gz_len); }); - serverWeb.on("/sys-tools", []() + serverWeb.on("/tools", []() { sendGzip(contTypeTextHtml, PAGE_LOADER_html_gz, PAGE_LOADER_html_gz_len); }); serverWeb.on("/mqtt", []() { sendGzip(contTypeTextHtml, PAGE_LOADER_html_gz, PAGE_LOADER_html_gz_len); }); - serverWeb.on("/wg", []() + serverWeb.on("/vpn", []() { sendGzip(contTypeTextHtml, PAGE_LOADER_html_gz, PAGE_LOADER_html_gz_len); }); serverWeb.on("/saveParams", HTTP_POST, handleSaveParams); serverWeb.on("/cmdZigRST", handleZigbeeRestart); @@ -395,7 +404,7 @@ void handleApi() const char *wrongArgs = "wrong args"; const char *ok = "ok"; - if (ConfigSettings.webAuth) + if (systemCfg.webAuth) { if (!checkAuth()) { // Authentication @@ -423,7 +432,7 @@ void handleApi() { case API_FLASH_ZB: { - ConfigSettings.zbFlashing = 1; + vars.zbFlashing = 1; const char *fwurlArg = "fwurl"; const uint8_t eventLen = 11; const char *tagZB_FW_info = "ZB_FW_info"; @@ -483,7 +492,7 @@ void handleApi() { serverWeb.send(HTTP_CODE_BAD_REQUEST, contTypeText, "missing arg 1"); } - ConfigSettings.zbFlashing = 0; + vars.zbFlashing = 0; } break; case API_GET_LOG: @@ -634,7 +643,7 @@ void handleApi() { if (serverWeb.arg(param) == "refreshLogs") { - resp = (String)ConfigSettings.refreshLogs; + resp = (String)systemCfg.refreshLogs; } else if (serverWeb.arg(param) == "coordMode") { @@ -644,7 +653,7 @@ void handleApi() } else { - resp = (String)ConfigSettings.coordinator_mode; + resp = (String)vars.workMode; } } else if (serverWeb.arg(param) == "zbRev") @@ -655,6 +664,25 @@ void handleApi() { resp = VERSION; } + else if (serverWeb.arg(param) == "wifiEnable") + { + resp = networkCfg.wifiEnable; + } + else if (serverWeb.arg(param) == "all") + { + resp = makeJsonConfig(&networkCfg, &vpnCfg, &mqttCfg, &systemCfg); + } + else if (serverWeb.arg(param) == "vars") + { + resp = makeJsonConfig(NULL, NULL, NULL, NULL, &vars); + } + else if (serverWeb.arg(param) == "root") + { + resp = ""; + DynamicJsonDocument doc(1024); + doc = getRootData(); + serializeJson(doc, resp); + } } serverWeb.send(HTTP_CODE_OK, contTypeText, resp); } @@ -695,7 +723,7 @@ void handleApi() wifi_0["secure"] = WiFi.encryptionType(i); } WiFi.scanDelete(); - // if (ConfigSettings.coordinator_mode == COORDINATOR_MODE_LAN) WiFi.mode(WIFI_OFF); no more wifi scan in lan mode + // if (vars.workMode == WORK_MODE_NETWORK) WiFi.mode(WIFI_OFF); no more wifi scan in lan mode } if (timeout < 10) { @@ -706,7 +734,7 @@ void handleApi() doc[scanDone] = true; WiFi.scanDelete(); timeout = 0; - // if (ConfigSettings.coordinator_mode == COORDINATOR_MODE_LAN) WiFi.mode(WIFI_OFF); + // if (vars.workMode == WORK_MODE_NETWORK) WiFi.mode(WIFI_OFF); } serializeJson(doc, result); @@ -731,25 +759,25 @@ void handleApi() handleGeneral(); sendGzip(contTypeTextHtml, PAGE_GENERAL_html_gz, PAGE_GENERAL_html_gz_len); break; - case API_PAGE_ETHERNET: + /*case API_PAGE_ETHERNET: handleEther(); sendGzip(contTypeTextHtml, PAGE_ETHERNET_html_gz, PAGE_ETHERNET_html_gz_len); + break;*/ + case API_PAGE_NETWORK: + handleNetwork(); + sendGzip(contTypeTextHtml, PAGE_NETWORK_html_gz, PAGE_NETWORK_html_gz_len); break; - case API_PAGE_WIFI: - handleWifi(); - sendGzip(contTypeTextHtml, PAGE_WIFI_html_gz, PAGE_WIFI_html_gz_len); - break; - case API_PAGE_ZHA_Z2M: + case API_PAGE_ZIGBEE: handleSerial(); - sendGzip(contTypeTextHtml, PAGE_SERIAL_html_gz, PAGE_SERIAL_html_gz_len); + sendGzip(contTypeTextHtml, PAGE_ZIGBEE_html_gz, PAGE_ZIGBEE_html_gz_len); break; case API_PAGE_SECURITY: handleSecurity(); sendGzip(contTypeTextHtml, PAGE_SECURITY_html_gz, PAGE_SECURITY_html_gz_len); break; - case API_PAGE_SYSTOOLS: + case API_PAGE_TOOLS: handleSysTools(); - sendGzip(contTypeTextHtml, PAGE_SYSTOOLS_html_gz, PAGE_SYSTOOLS_html_gz_len); + sendGzip(contTypeTextHtml, PAGE_TOOLS_html_gz, PAGE_TOOLS_html_gz_len); break; case API_PAGE_ABOUT: // handleAbout(); @@ -759,9 +787,9 @@ void handleApi() handleMqtt(); sendGzip(contTypeTextHtml, PAGE_MQTT_html_gz, PAGE_MQTT_html_gz_len); break; - case API_PAGE_WG: - handleWg(); - sendGzip(contTypeTextHtml, PAGE_WG_html_gz, PAGE_WG_html_gz_len); + case API_PAGE_VPN: + handleVpn(); + sendGzip(contTypeTextHtml, PAGE_VPN_html_gz, PAGE_VPN_html_gz_len); break; default: break; @@ -795,334 +823,338 @@ void handleApi() void handleSaveParams() { - String result; - DynamicJsonDocument doc(512); - const char *pageId = "pageId"; - const char *on = "on"; - File configFile; - const uint8_t one = 1; - const uint8_t zero = 0; - if (serverWeb.hasArg(pageId)) + updateConfiguration(serverWeb, systemCfg, networkCfg, vpnCfg, mqttCfg); +} +/* +String result; +DynamicJsonDocument doc(512); +const char *pageId = "pageId"; +const char *on = "on"; +File configFile; +const uint8_t one = 1; +const uint8_t zero = 0; +if (serverWeb.hasArg(pageId)) +{ + switch (serverWeb.arg(pageId).toInt()) + { + case API_PAGE_GENERAL: { - switch (serverWeb.arg(pageId).toInt()) - { - case API_PAGE_GENERAL: - { - configFile = LittleFS.open(configFileGeneral, FILE_READ); - deserializeJson(doc, configFile); - configFile.close(); - if (serverWeb.hasArg(coordMode)) - { - const uint8_t mode = serverWeb.arg(coordMode).toInt(); - if (mode <= 2 && mode >= zero) - { - // ConfigSettings.coordinator_mode = static_cast(mode); - if (mode == 1) - wifiWebSetupInProgress = true; - doc[coordMode] = static_cast(mode); - } - } - const char *keepWeb = "keepWeb"; - if (serverWeb.arg(keepWeb) == on) - { - doc[keepWeb] = one; - } - else - { - doc[keepWeb] = zero; - } - const char *disableLedPwr = "disableLedPwr"; - if (serverWeb.arg(disableLedPwr) == on) + configFile = LittleFS.open(configFileGeneral, FILE_READ); + deserializeJson(doc, configFile); + configFile.close(); + + if (serverWeb.hasArg(coordMode)) + { + const uint8_t mode = serverWeb.arg(coordMode).toInt(); + if (mode <= 2 && mode >= zero) { - doc[disableLedPwr] = one; + // vars.workMode = static_cast(mode); + if (mode == 1) + wifiWebSetupInProgress = true; + doc[coordMode] = static_cast(mode); } - else + } + const char *keepWeb = "keepWeb"; + if (serverWeb.arg(keepWeb) == on) + { + doc[keepWeb] = one; + } + else + { + doc[keepWeb] = zero; + } + const char *disableLedPwr = "disableLedPwr"; + if (serverWeb.arg(disableLedPwr) == on) + { + doc[disableLedPwr] = one; + } + else + { + doc[disableLedPwr] = zero; + } + const char *disableLedUSB = "disableLedUSB"; + if (serverWeb.arg(disableLedUSB) == on) + { + doc[disableLedUSB] = one; + } + else + { + doc[disableLedUSB] = zero; + } + configFile = LittleFS.open(configFileGeneral, FILE_WRITE); + serializeJson(doc, configFile); + configFile.close(); + } + break; + case API_PAGE_ETHERNET: + { + configFile = LittleFS.open(configFileEther, FILE_READ); + deserializeJson(doc, configFile); + configFile.close(); + doc["ip"] = serverWeb.arg("ipAddress"); + doc["mask"] = serverWeb.arg("ipMask"); + doc["gw"] = serverWeb.arg("ipGW"); + const char *dhcp = "dhcp"; + if (serverWeb.arg(dhcp) == "on") + { + doc[dhcp] = one; + } + else + { + doc[dhcp] = zero; + if (doc["mask"] == "") { - doc[disableLedPwr] = zero; + doc["mask"] = "255.255.255.0"; } - const char *disableLedUSB = "disableLedUSB"; - if (serverWeb.arg(disableLedUSB) == on) + if (doc["ip"] == "") { - doc[disableLedUSB] = one; + doc["ip"] = "192.168.0.1"; } - else + if (doc["gw"] == "") { - doc[disableLedUSB] = zero; + doc["gw"] = "192.168.0.1"; } - configFile = LittleFS.open(configFileGeneral, FILE_WRITE); - serializeJson(doc, configFile); - configFile.close(); } - break; - case API_PAGE_ETHERNET: - { - configFile = LittleFS.open(configFileEther, FILE_READ); - deserializeJson(doc, configFile); - configFile.close(); - doc["ip"] = serverWeb.arg("ipAddress"); - doc["mask"] = serverWeb.arg("ipMask"); - doc["gw"] = serverWeb.arg("ipGW"); - const char *dhcp = "dhcp"; - if (serverWeb.arg(dhcp) == "on") - { - doc[dhcp] = one; - } - else - { - doc[dhcp] = zero; - if (doc["mask"] == "") - { - doc["mask"] = "255.255.255.0"; - } - if (doc["ip"] == "") - { - doc["ip"] = "192.168.0.1"; - } - if (doc["gw"] == "") - { - doc["gw"] = "192.168.0.1"; - } - } - // const char* disablePingCtrl = "disablePingCtrl"; - // if (serverWeb.arg(disablePingCtrl) == on) { - // doc[disablePingCtrl] = one; - // } else { - // doc[disablePingCtrl] = zero; - // } - configFile = LittleFS.open(configFileEther, FILE_WRITE); - serializeJson(doc, configFile); - configFile.close(); + // const char* disablePingCtrl = "disablePingCtrl"; + // if (serverWeb.arg(disablePingCtrl) == on) { + // doc[disablePingCtrl] = one; + // } else { + // doc[disablePingCtrl] = zero; + // } + configFile = LittleFS.open(configFileEther, FILE_WRITE); + serializeJson(doc, configFile); + configFile.close(); + } + case API_PAGE_MQTT: + { + configFile = LittleFS.open(configFileMqtt, FILE_READ); + deserializeJson(doc, configFile); + configFile.close(); + doc["server"] = serverWeb.arg("MqttServer"); + doc["port"] = serverWeb.arg("MqttPort"); + doc["user"] = serverWeb.arg("MqttUser"); + doc["pass"] = serverWeb.arg("MqttPass"); + doc["topic"] = serverWeb.arg("MqttTopic"); + doc["interval"] = serverWeb.arg("MqttInterval"); + + const char *enable = "enable"; + if (serverWeb.arg("MqttEnable") == "on") + { + doc[enable] = one; + } + else + { + doc[enable] = zero; } - case API_PAGE_MQTT: - { - configFile = LittleFS.open(configFileMqtt, FILE_READ); - deserializeJson(doc, configFile); - configFile.close(); - doc["server"] = serverWeb.arg("MqttServer"); - doc["port"] = serverWeb.arg("MqttPort"); - doc["user"] = serverWeb.arg("MqttUser"); - doc["pass"] = serverWeb.arg("MqttPass"); - doc["topic"] = serverWeb.arg("MqttTopic"); - doc["interval"] = serverWeb.arg("MqttInterval"); - - const char *enable = "enable"; - if (serverWeb.arg("MqttEnable") == "on") - { - doc[enable] = one; - } - else - { - doc[enable] = zero; - } - const char *discovery = "discovery"; - if (serverWeb.arg("MqttDiscovery") == "on") - { - doc[discovery] = one; - } - else - { - doc[discovery] = zero; - } + const char *discovery = "discovery"; + if (serverWeb.arg("MqttDiscovery") == "on") + { + doc[discovery] = one; + } + else + { + doc[discovery] = zero; + } - // const char* disablePingCtrl = "disablePingCtrl"; - // if (serverWeb.arg(disablePingCtrl) == on) { - // doc[disablePingCtrl] = one; - // } else { - // doc[disablePingCtrl] = zero; - // } - configFile = LittleFS.open(configFileMqtt, FILE_WRITE); - serializeJson(doc, configFile); - configFile.close(); - loadConfigMqtt(); + // const char* disablePingCtrl = "disablePingCtrl"; + // if (serverWeb.arg(disablePingCtrl) == on) { + // doc[disablePingCtrl] = one; + // } else { + // doc[disablePingCtrl] = zero; + // } + configFile = LittleFS.open(configFileMqtt, FILE_WRITE); + serializeJson(doc, configFile); + configFile.close(); + loadFileConfigMqtt(); + } + break; + case API_PAGE_VPN: + { + configFile = LittleFS.open(configFileWg, FILE_READ); + deserializeJson(doc, configFile); + configFile.close(); + doc["localAddr"] = serverWeb.arg("WgLocalAddr"); + doc["localIP"] = serverWeb.arg("WgLocalPrivKey"); + doc["endAddr"] = serverWeb.arg("WgEndAddr"); + doc["endPubKey"] = serverWeb.arg("WgEndPubKey"); + doc["endPort"] = serverWeb.arg("WgEndPort"); + + const char *enable = "enable"; + if (serverWeb.arg("WgEnable") == "on") + { + doc[enable] = one; + } + else + { + doc[enable] = zero; } - break; - case API_PAGE_WG: - { - configFile = LittleFS.open(configFileWg, FILE_READ); - deserializeJson(doc, configFile); - configFile.close(); - doc["localAddr"] = serverWeb.arg("WgLocalAddr"); - doc["localIP"] = serverWeb.arg("WgLocalPrivKey"); - doc["endAddr"] = serverWeb.arg("WgEndAddr"); - doc["endPubKey"] = serverWeb.arg("WgEndPubKey"); - doc["endPort"] = serverWeb.arg("WgEndPort"); - - const char *enable = "enable"; - if (serverWeb.arg("WgEnable") == "on") - { - doc[enable] = one; - } - else - { - doc[enable] = zero; - } - configFile = LittleFS.open(configFileWg, FILE_WRITE); - serializeJson(doc, configFile); - configFile.close(); - loadConfigWg(); + configFile = LittleFS.open(configFileWg, FILE_WRITE); + serializeJson(doc, configFile); + configFile.close(); + loadFileConfigWg(); + } + break; + case API_PAGE_NETWORK: + { + configFile = LittleFS.open(configFileWifi, FILE_READ); + deserializeJson(doc, configFile); + configFile.close(); + doc["ssid"] = serverWeb.arg("WIFISSID"); + doc["pass"] = serverWeb.arg("WIFIpassword"); + const char *dhcpWiFi = "dhcpWiFi"; + if (serverWeb.arg(dhcpWiFi) == on) + { + doc[dhcpWiFi] = 1; } - break; - case API_PAGE_WIFI: - { - configFile = LittleFS.open(configFileWifi, FILE_READ); - deserializeJson(doc, configFile); - configFile.close(); - doc["ssid"] = serverWeb.arg("WIFISSID"); - doc["pass"] = serverWeb.arg("WIFIpassword"); - const char *dhcpWiFi = "dhcpWiFi"; - if (serverWeb.arg(dhcpWiFi) == on) - { - doc[dhcpWiFi] = 1; - } - else - { - doc[dhcpWiFi] = 0; - } - doc["ip"] = serverWeb.arg("ipAddress"); - doc["mask"] = serverWeb.arg("ipMask"); - doc["gw"] = serverWeb.arg("ipGW"); - configFile = LittleFS.open(configFileWifi, FILE_WRITE); - serializeJson(doc, configFile); - configFile.close(); - WiFi.persistent(false); - if (ConfigSettings.apStarted) - { - WiFi.mode(WIFI_AP_STA); - } - else - { - WiFi.mode(WIFI_STA); - } - WiFi.begin(serverWeb.arg("WIFISSID").c_str(), serverWeb.arg("WIFIpassword").c_str()); + else + { + doc[dhcpWiFi] = 0; } - break; - case API_PAGE_ZHA_Z2M: + doc["ip"] = serverWeb.arg("ipAddress"); + doc["mask"] = serverWeb.arg("ipMask"); + doc["gw"] = serverWeb.arg("ipGW"); + configFile = LittleFS.open(configFileWifi, FILE_WRITE); + serializeJson(doc, configFile); + configFile.close(); + WiFi.persistent(false); + if (vars.apStarted) { - configFile = LittleFS.open(configFileSerial, FILE_READ); - deserializeJson(doc, configFile); - configFile.close(); - const char *baud = "baud"; - if (serverWeb.hasArg(baud)) - { - doc[baud] = serverWeb.arg(baud); - } - else - { - doc[baud] = 115200; - } - const char *port = "port"; - if (serverWeb.hasArg(baud)) - { - doc[port] = serverWeb.arg(port); - } - else - { - doc[port] = 6638; - } - configFile = LittleFS.open(configFileSerial, FILE_WRITE); - serializeJson(doc, configFile); - configFile.close(); + WiFi.mode(WIFI_AP_STA); } - break; - case API_PAGE_SECURITY: + else { - configFile = LittleFS.open(configFileSecurity, FILE_READ); - deserializeJson(doc, configFile); - configFile.close(); - const char *disableWeb = "disableWeb"; - if (serverWeb.arg(disableWeb) == on) - { - doc[disableWeb] = 1; - } - else - { - doc[disableWeb] = 0; - } - const char *webAuth = "webAuth"; - if (serverWeb.arg(webAuth) == on) - { - doc[webAuth] = 1; - } - else - { - doc[webAuth] = 0; - } - const char *webUser = "webUser"; - if (serverWeb.arg(webUser) != "") - { - doc[webUser] = serverWeb.arg(webUser); - } - else - { - doc[webUser] = "admin"; - } - const char *fwEnabled = "fwEnabled"; - if (serverWeb.arg(fwEnabled) == on) - { - doc[fwEnabled] = 1; - } - else - { - doc[fwEnabled] = 0; - } - const char *fwIp = "fwIp"; - doc[fwIp] = serverWeb.arg(fwIp); - doc["webPass"] = serverWeb.arg("webPass"); - - configFile = LittleFS.open(configFileSecurity, FILE_WRITE); - serializeJson(doc, configFile); - configFile.close(); + WiFi.mode(WIFI_STA); } - break; - case API_PAGE_SYSTOOLS: - { - const char *refreshLogs = "refreshLogs"; - const char *hostname = "hostname"; - configFile = LittleFS.open(configFileGeneral, FILE_READ); - deserializeJson(doc, configFile); - configFile.close(); - if (serverWeb.hasArg(refreshLogs)) - { - ConfigSettings.refreshLogs = serverWeb.arg(refreshLogs).toInt(); - doc[refreshLogs] = ConfigSettings.refreshLogs; - } - if (serverWeb.hasArg(hostname)) - { - doc[hostname] = serverWeb.arg(hostname); - strlcpy(ConfigSettings.hostname, serverWeb.arg(hostname).c_str(), sizeof(ConfigSettings.hostname)); - } - const char *timeZoneName = "timeZoneName"; - if (serverWeb.hasArg(timeZoneName)) - { - doc[timeZoneName] = serverWeb.arg(timeZoneName); - } - configFile = LittleFS.open(configFileGeneral, FILE_WRITE); - configFile = LittleFS.open(configFileGeneral, FILE_WRITE); - serializeJson(doc, configFile); - configFile.close(); + WiFi.begin(serverWeb.arg("WIFISSID").c_str(), serverWeb.arg("WIFIpassword").c_str()); + } + break; + case API_PAGE_ZIGBEE: + { + configFile = LittleFS.open(configFileSerial, FILE_READ); + deserializeJson(doc, configFile); + configFile.close(); + const char *baud = "baud"; + if (serverWeb.hasArg(baud)) + { + doc[baud] = serverWeb.arg(baud); } - break; - - default: - break; + else + { + doc[baud] = 115200; + } + const char *port = "port"; + if (serverWeb.hasArg(baud)) + { + doc[port] = serverWeb.arg(port); + } + else + { + doc[port] = 6638; } - serverWeb.send(HTTP_CODE_OK, contTypeText, "ok"); + configFile = LittleFS.open(configFileSerial, FILE_WRITE); + serializeJson(doc, configFile); + configFile.close(); } - else + break; + case API_PAGE_SECURITY: + { + configFile = LittleFS.open(configFileSecurity, FILE_READ); + deserializeJson(doc, configFile); + configFile.close(); + const char *disableWeb = "disableWeb"; + if (serverWeb.arg(disableWeb) == on) + { + doc[disableWeb] = 1; + } + else + { + doc[disableWeb] = 0; + } + const char *webAuth = "webAuth"; + if (serverWeb.arg(webAuth) == on) + { + doc[webAuth] = 1; + } + else + { + doc[webAuth] = 0; + } + const char *webUser = "webUser"; + if (serverWeb.arg(webUser) != "") + { + doc[webUser] = serverWeb.arg(webUser); + } + else + { + doc[webUser] = "admin"; + } + const char *fwEnabled = "fwEnabled"; + if (serverWeb.arg(fwEnabled) == on) + { + doc[fwEnabled] = 1; + } + else + { + doc[fwEnabled] = 0; + } + const char *fwIp = "fwIp"; + doc[fwIp] = serverWeb.arg(fwIp); + doc["webPass"] = serverWeb.arg("webPass"); + + configFile = LittleFS.open(configFileSecurity, FILE_WRITE); + serializeJson(doc, configFile); + configFile.close(); + } + break; + case API_PAGE_TOOLS: { - serverWeb.send(500, contTypeText, "bad args"); + const char *refreshLogs = "refreshLogs"; + const char *hostname = "hostname"; + configFile = LittleFS.open(configFileGeneral, FILE_READ); + deserializeJson(doc, configFile); + configFile.close(); + if (serverWeb.hasArg(refreshLogs)) + { + systemCfg.refreshLogs = serverWeb.arg(refreshLogs).toInt(); + doc[refreshLogs] = systemCfg.refreshLogs; + } + if (serverWeb.hasArg(hostname)) + { + doc[hostname] = serverWeb.arg(hostname); + strlcpy(systemCfg.hostname, serverWeb.arg(hostname).c_str(), sizeof(systemCfg.hostname)); + } + const char *timeZoneName = "timeZoneName"; + if (serverWeb.hasArg(timeZoneName)) + { + doc[timeZoneName] = serverWeb.arg(timeZoneName); + } + configFile = LittleFS.open(configFileGeneral, FILE_WRITE); + //configFile = LittleFS.open(configFileGeneral, FILE_WRITE); + serializeJson(doc, configFile); + configFile.close(); + } + break; + + default: + break; } + serverWeb.send(HTTP_CODE_OK, contTypeText, "ok"); } +else +{ + serverWeb.send(500, contTypeText, "bad args"); +} +}*/ bool checkAuth() { - if (!ConfigSettings.webAuth) + if (!systemCfg.webAuth) return true; const char *www_realm = "Login Required"; - if (!serverWeb.authenticate(ConfigSettings.webUser, ConfigSettings.webPass)) + if (!serverWeb.authenticate(systemCfg.webUser, systemCfg.webPass)) { serverWeb.requestAuthentication(DIGEST_AUTH, www_realm, "Authentication failed"); return false; @@ -1140,79 +1172,128 @@ void handleGeneral() // doc["pageName"] = "General"; // DEBUG_PRINTLN(ConfigSettings.usbMode); - switch (ConfigSettings.coordinator_mode) + switch (vars.workMode) { - case COORDINATOR_MODE_USB: + case WORK_MODE_USB: doc["checkedUsbMode"] = checked; break; - case COORDINATOR_MODE_WIFI: + /*case COORDINATOR_MODE_WIFI: doc["checkedWifiMode"] = checked; - break; - case COORDINATOR_MODE_LAN: + break;*/ + case WORK_MODE_NETWORK: doc["checkedLanMode"] = checked; break; default: break; } - // DEBUG_PRINTLN(ConfigSettings.disableLedPwr); - if (ConfigSettings.keepWeb) + // DEBUG_PRINTLN(systemCfg.disableLedPwr); + if (systemCfg.keepWeb) { doc["keepWeb"] = checked; } - if (ConfigSettings.disableLedPwr) + if (systemCfg.disableLedPwr) { doc["checkedDisableLedPwr"] = checked; } - // DEBUG_PRINTLN(ConfigSettings.disableLedUSB); - if (ConfigSettings.disableLedUSB) + // DEBUG_PRINTLN(systemCfg.disableLedUSB); + if (systemCfg.disableLedUSB) { doc["checkedDisableLedUSB"] = checked; } + // serializeJson(doc, result); + // serverWeb.sendHeader(respHeaderName, result); + + // String result; + // DynamicJsonDocument doc(512); + + doc["hostname"] = systemCfg.hostname; + doc["refreshLogs"] = systemCfg.refreshLogs; + if (systemCfg.timeZone) + { + doc["timeZoneName"] = systemCfg.timeZone; + } + doc["ntpServ1"] = systemCfg.ntpServ1; //.toString(); + doc["ntpServ2"] = systemCfg.ntpServ2; //.toString(); + serializeJson(doc, result); serverWeb.sendHeader(respHeaderName, result); + + DynamicJsonDocument zones(10240); + String results; + + JsonArray zonesArray = zones.to(); + for (int i = 0; i < timeZoneCount; i++) + { + zonesArray.add(timeZones[i].zone); + } + + serializeJson(zones, results); + serverWeb.sendHeader(respTimeZonesName, results); } void handleSecurity() { String result; DynamicJsonDocument doc(1024); - if (ConfigSettings.disableWeb) + if (systemCfg.disableWeb) { doc["disableWeb"] = checked; } - if (ConfigSettings.webAuth) + if (systemCfg.webAuth) { doc["webAuth"] = checked; } - doc["webUser"] = (String)ConfigSettings.webUser; - doc["webPass"] = (String)ConfigSettings.webPass; - if (ConfigSettings.fwEnabled) + doc["webUser"] = (String)systemCfg.webUser; + doc["webPass"] = (String)systemCfg.webPass; + if (systemCfg.fwEnabled) { doc["fwEnabled"] = checked; } - doc["fwIp"] = ConfigSettings.fwIp.toString(); + doc["fwIp"] = systemCfg.fwIp; //.toString(); serializeJson(doc, result); serverWeb.sendHeader(respHeaderName, result); } -void handleWifi() +void handleNetwork() { String result; DynamicJsonDocument doc(1024); // doc["pageName"] = "Config WiFi"; - doc["ssid"] = String(ConfigSettings.ssid); - doc["passWifi"] = String(ConfigSettings.password); - if (ConfigSettings.dhcpWiFi) + + if (networkCfg.ethEnable) + { + doc["ethEnbl"] = checked; + } + if (networkCfg.ethDhcp) + { + doc["modeEther"] = checked; + } + doc["ipEther"] = networkCfg.ethAddr; + doc["maskEther"] = networkCfg.ethMask; + doc["GWEther"] = networkCfg.ethGate; + + doc["ethDns1"] = networkCfg.ethDns1; + doc["ethDns2"] = networkCfg.ethDns2; + + if (networkCfg.wifiEnable) + { + doc["wifiEnbl"] = checked; + } + doc["ssid"] = String(networkCfg.wifiSsid); + doc["passWifi"] = String(networkCfg.wifiPassword); + if (networkCfg.wifiDhcp) { doc["dchp"] = checked; } - doc["ip"] = ConfigSettings.ipAddressWiFi; - doc["mask"] = ConfigSettings.ipMaskWiFi; - doc["gw"] = ConfigSettings.ipGWWiFi; + doc["ip"] = networkCfg.wifiAddr; + doc["mask"] = networkCfg.wifiMask; + doc["gw"] = networkCfg.wifiGate; + doc["wifiDns1"] = networkCfg.wifiDns1; + doc["wifiDns2"] = networkCfg.wifiDns2; serializeJson(doc, result); serverWeb.sendHeader(respHeaderName, result); @@ -1223,23 +1304,23 @@ void handleSerial() String result; DynamicJsonDocument doc(1024); - if (ConfigSettings.serialSpeed == 9600) + if (systemCfg.serialSpeed == 9600) { doc["9600"] = checked; } - else if (ConfigSettings.serialSpeed == 19200) + else if (systemCfg.serialSpeed == 19200) { doc["19200"] = checked; } - else if (ConfigSettings.serialSpeed == 38400) + else if (systemCfg.serialSpeed == 38400) { doc["8400"] = checked; } - else if (ConfigSettings.serialSpeed == 57600) + else if (systemCfg.serialSpeed == 57600) { doc["57600"] = checked; } - else if (ConfigSettings.serialSpeed == 115200) + else if (systemCfg.serialSpeed == 115200) { doc["115200"] = checked; } @@ -1247,7 +1328,7 @@ void handleSerial() { doc["115200"] = checked; } - doc["socketPort"] = String(ConfigSettings.socketPort); + doc["socketPort"] = String(systemCfg.socketPort); serializeJson(doc, result); serverWeb.sendHeader(respHeaderName, result); @@ -1255,18 +1336,19 @@ void handleSerial() void handleEther() { + /* String result; DynamicJsonDocument doc(1024); // doc["pageName"] = "Config Ethernet"; - if (ConfigSettings.dhcp) + if (networkCfg.ethDhcp) { doc["modeEther"] = checked; } - doc["ipEther"] = ConfigSettings.ipAddress; - doc["maskEther"] = ConfigSettings.ipMask; - doc["GWEther"] = ConfigSettings.ipGW; + doc["ipEther"] = networkCfg.ethAddr; + doc["maskEther"] = networkCfg.ethMask; + doc["GWEther"] = networkCfg.ethGate; // if (ConfigSettings.disablePingCtrl) { // doc["disablePingCtrl"] = checked; @@ -1274,6 +1356,7 @@ void handleEther() serializeJson(doc, result); serverWeb.sendHeader(respHeaderName, result); + */ } void handleMqtt() @@ -1281,18 +1364,18 @@ void handleMqtt() String result; DynamicJsonDocument doc(1024); - if (MqttSettings.enable) + if (mqttCfg.enable) { doc["enableMqtt"] = checked; } - doc["serverMqtt"] = MqttSettings.server; - doc["portMqtt"] = MqttSettings.port; - doc["userMqtt"] = MqttSettings.user; - doc["passMqtt"] = MqttSettings.pass; - doc["topicMqtt"] = MqttSettings.topic; - doc["intervalMqtt"] = MqttSettings.interval; - - if (MqttSettings.discovery) + doc["serverMqtt"] = mqttCfg.server; + doc["portMqtt"] = mqttCfg.port; + doc["userMqtt"] = mqttCfg.user; + doc["passMqtt"] = mqttCfg.pass; + doc["topicMqtt"] = mqttCfg.topic; + doc["intervalMqtt"] = mqttCfg.updateInt; + + if (mqttCfg.discovery) { doc["discoveryMqtt"] = checked; } @@ -1301,20 +1384,28 @@ void handleMqtt() serverWeb.sendHeader(respHeaderName, result); } -void handleWg() +void handleVpn() { String result; DynamicJsonDocument doc(1024); - if (WgSettings.enable) + if (vpnCfg.wgEnable) { doc["enableWg"] = checked; } - doc["localAddrWg"] = WgSettings.localAddr; - doc["localPrivKeyWg"] = WgSettings.localPrivKey; - doc["endAddrWg"] = WgSettings.endAddr; - doc["endPubKeyWg"] = WgSettings.endPubKey; - doc["endPortWg"] = WgSettings.endPort; + doc["localAddrWg"] = vpnCfg.wgLocalIP.toString(); /// WgSettings.localAddr; + doc["localPrivKeyWg"] = vpnCfg.wgLocalPrivKey; + doc["endAddrWg"] = vpnCfg.wgEndAddr; + doc["endPubKeyWg"] = vpnCfg.wgEndPubKey; + doc["endPortWg"] = vpnCfg.wgEndPort; + + if (vpnCfg.hnEnable) + { + doc["enableHn"] = checked; + } + doc["joinCodeHn"] = vpnCfg.hnJoinCode; + doc["hostNameHn"] = vpnCfg.hnHostName; + doc["dashUrlHn"] = vpnCfg.hnDashUrl; serializeJson(doc, result); serverWeb.sendHeader(respHeaderName, result); @@ -1332,7 +1423,7 @@ DynamicJsonDocument getRootData() doc["VERSION"] = String(verArr); String readableTime; - getReadableTime(readableTime, ConfigSettings.socketTime); + getReadableTime(readableTime, vars.socketTime); const char *connectedSocketStatus = "connectedSocketStatus"; const char *connectedSocket = "connectedSocket"; const char *notConnected = "Not connected"; @@ -1341,16 +1432,16 @@ DynamicJsonDocument getRootData() const char *on = "On"; const char *off = "Off"; - if (ConfigSettings.connectedClients > 0) + if (vars.connectedClients > 0) { - if (ConfigSettings.connectedClients > 1) + if (vars.connectedClients > 1) { - doc[connectedSocketStatus] = "Yes, " + String(ConfigSettings.connectedClients) + "connection"; + doc[connectedSocketStatus] = "Yes, " + String(vars.connectedClients) + "connection"; doc[connectedSocket] = readableTime; } else { - doc[connectedSocketStatus] = "Yes, " + String(ConfigSettings.connectedClients) + " connections"; + doc[connectedSocketStatus] = "Yes, " + String(vars.connectedClients) + " connections"; doc[connectedSocket] = readableTime; } } @@ -1360,16 +1451,16 @@ DynamicJsonDocument getRootData() doc[connectedSocket] = notConnected; } const char *operationalMode = "operationalMode"; - switch (ConfigSettings.coordinator_mode) + switch (vars.workMode) { - case COORDINATOR_MODE_USB: + case WORK_MODE_USB: doc[operationalMode] = "Zigbee-to-USB"; break; - case COORDINATOR_MODE_WIFI: + /*case COORDINATOR_MODE_WIFI: doc[operationalMode] = "Zigbee-to-WiFi"; - break; - case COORDINATOR_MODE_LAN: - doc[operationalMode] = "Zigbee-to-Ethernet"; + break;*/ + case WORK_MODE_NETWORK: + doc[operationalMode] = "Zigbee-to-Network"; break; default: @@ -1378,14 +1469,8 @@ DynamicJsonDocument getRootData() // ETHERNET TAB const char *ethDhcp = "ethDhcp"; - if (ConfigSettings.dhcp) - { - doc[ethDhcp] = on; - } - else - { - doc[ethDhcp] = off; - } + + doc[ethDhcp] = networkCfg.ethDhcp ? on : off; const char *connectedEther = "connectedEther"; const char *ethConnection = "ethConnection"; @@ -1394,25 +1479,32 @@ DynamicJsonDocument getRootData() const char *ethIp = "ethIp"; const char *etchMask = "etchMask"; const char *ethGate = "ethGate"; - if (ConfigSettings.connectedEther) + const char *ethDns = "ethDns"; + // + if (networkCfg.ethEnable) { - doc[connectedEther] = yes; - doc[ethConnection] = "Connected"; - doc[ethMac] = ETH.macAddress(); - doc[ethSpd] = String(ETH.linkSpeed()) + String(" Mbps"); - doc[ethIp] = ETH.localIP().toString(); - doc[etchMask] = ETH.subnetMask().toString(); - doc[ethGate] = ETH.gatewayIP().toString(); - } - else - { - doc[connectedEther] = no; - doc[ethConnection] = notConnected; - doc[ethMac] = notConnected; - doc[ethSpd] = notConnected; - doc[ethIp] = notConnected; - doc[etchMask] = notConnected; - doc[ethGate] = notConnected; + if (vars.connectedEther) + { + + doc[connectedEther] = yes; + doc[ethConnection] = "Connected"; + doc[ethMac] = ETH.macAddress(); + doc[ethSpd] = String(ETH.linkSpeed()) + String(" Mbps"); + doc[ethIp] = ETH.localIP().toString(); + doc[etchMask] = ETH.subnetMask().toString(); + doc[ethGate] = ETH.gatewayIP().toString(); + doc[ethDns] = ETH.dnsIP().toString(); + } + else + { + doc[connectedEther] = no; + doc[ethConnection] = notConnected; + doc[ethMac] = notConnected; + doc[ethSpd] = notConnected; + doc[ethIp] = notConnected; + doc[etchMask] = notConnected; + doc[ethGate] = notConnected; + } } getReadableTime(readableTime, 0); @@ -1457,6 +1549,7 @@ DynamicJsonDocument getRootData() } doc["espFlashSize"] = String(ESP.getFlashChipSize() / (1024 * 1024)); + // wifi const char *wifiSsid = "wifiSsid"; const char *wifiRssi = "wifiRssi"; @@ -1469,10 +1562,13 @@ DynamicJsonDocument getRootData() const char *wifiModeAPStatus = "wifiModeAPStatus"; const char *wifiModeAP = "wifiModeAP"; const char *wifiDhcp = "wifiDhcp"; + const char *wifiDns = "wifiDns"; + doc["wifiMac"] = String(WiFi.macAddress().c_str()); - if (ConfigSettings.coordinator_mode == COORDINATOR_MODE_WIFI) + // if (vars.workMode == WORK_MODE_NETWORK) + if (networkCfg.wifiEnable) { - doc[wifiEnabled] = yes; + // doc[wifiEnabled] = yes; doc[wifiMode] = "Client"; if (WiFi.status() == WL_CONNECTED) { // STA connected @@ -1483,27 +1579,21 @@ DynamicJsonDocument getRootData() doc[wifiIp] = WiFi.localIP().toString(); doc[wifiMask] = WiFi.subnetMask().toString(); doc[wifiGate] = WiFi.gatewayIP().toString(); + doc[wifiDns] = WiFi.dnsIP().toString(); } else { const char *connecting = "Connecting..."; - doc["wifiSsid"] = ConfigSettings.ssid; + doc["wifiSsid"] = networkCfg.wifiSsid; doc[wifiRssi] = connecting; doc[wifiConnected] = connecting; - doc[wifiIp] = ConfigSettings.dhcpWiFi ? WiFi.localIP().toString() : connecting; - doc[wifiMask] = ConfigSettings.dhcpWiFi ? WiFi.subnetMask().toString() : connecting; - doc[wifiGate] = ConfigSettings.dhcpWiFi ? WiFi.gatewayIP().toString() : connecting; - } - if (ConfigSettings.dhcpWiFi) - { - doc[wifiDhcp] = on; - } - else - { - doc[wifiDhcp] = off; + doc[wifiIp] = networkCfg.wifiDhcp ? WiFi.localIP().toString() : connecting; + doc[wifiMask] = networkCfg.wifiDhcp ? WiFi.subnetMask().toString() : connecting; + doc[wifiGate] = networkCfg.wifiDhcp ? WiFi.gatewayIP().toString() : connecting; } + doc[wifiDhcp] = networkCfg.wifiDhcp ? on : off; } - else + /*else { doc[wifiEnabled] = no; doc[wifiConnected] = notConnected; @@ -1514,16 +1604,16 @@ DynamicJsonDocument getRootData() doc[wifiGate] = off; doc[wifiRssi] = off; doc[wifiDhcp] = off; - } - if (ConfigSettings.apStarted) + }*/ + if (vars.apStarted) { // AP active String AP_NameString; - char apSsid[18]; + char apSsid[MAX_DEV_ID_LONG]; getDeviceID(apSsid); - char wifiSsidBuf[35]; + char wifiSsidBuf[MAX_DEV_ID_LONG + 25]; sprintf(wifiSsidBuf, "%s (no password)", apSsid); doc[wifiSsid] = wifiSsidBuf; - doc[wifiIp] = "192.168.1.1 (UZG-01 web interface)"; + doc[wifiIp] = "192.168.1.1 (XZG web interface)"; doc[wifiMask] = "255.255.255.0 (Access point)"; doc[wifiGate] = "192.168.1.1 (this device)"; doc[wifiDhcp] = "On (Access point)"; @@ -1540,14 +1630,14 @@ DynamicJsonDocument getRootData() } // MQTT - if (MqttSettings.enable) + if (mqttCfg.enable) { const char *mqConnect = "mqConnect"; const char *mqBroker = "mqBroker"; - doc[mqBroker] = MqttSettings.server; + doc[mqBroker] = mqttCfg.server; - if (MqttSettings.connect) + if (vars.mqttConn) { doc[mqConnect] = yes; } @@ -1557,23 +1647,41 @@ DynamicJsonDocument getRootData() } } - // VPN - if (WgSettings.enable) + // VPN WireGuard + if (vpnCfg.wgEnable) { const char *wgInit = "wgInit"; const char *wgDeviceAddr = "wgDeviceAddr"; const char *wgRemoteAddr = "wgRemoteAddr"; + const char *wgConnect = "wgConnect"; + const char *wgRemoteIP = "wgRemoteIp"; + // const char *wgEndPort = "wgEndPort"; - doc[wgDeviceAddr] = WgSettings.localAddr; - doc[wgRemoteAddr] = WgSettings.endAddr; + doc[wgInit] = vars.vpnWgInit ? yes : no; + doc[wgDeviceAddr] = vpnCfg.wgLocalIP.toString(); + doc[wgRemoteAddr] = vpnCfg.wgEndAddr; + // doc[wgEndPort] = vpnCfg.wgEndPort; + + doc[wgConnect] = vars.vpnWgConnect ? yes : no; + + doc[wgRemoteIP] = vars.vpnWgPeerIp.toString(); + } + // VPN Husarnet + if (vpnCfg.hnEnable) + { + const char *hnInit = "hnInit"; + const char *hnHostName = "hnHostName"; - if (WgSettings.init) + // doc[wgDeviceAddr] = vpnCfg.wgLocalIP.toString();//WgSettings.localAddr; + doc[hnHostName] = vpnCfg.hnHostName; + + if (vars.vpnHnInit) { - doc[wgInit] = yes; + doc[hnInit] = yes; } else { - doc[wgInit] = no; + doc[hnInit] = no; } } @@ -1595,7 +1703,7 @@ void handleStatus() DynamicJsonDocument doc(1024); // Authentication is needed for status page as well (if enabled) - if (ConfigSettings.webAuth) + if (systemCfg.webAuth) { if (!checkAuth()) { @@ -1616,29 +1724,31 @@ void handleStatus() void handleSysTools() { + String result; DynamicJsonDocument doc(512); - doc["hostname"] = ConfigSettings.hostname; - doc["refreshLogs"] = ConfigSettings.refreshLogs; - if (ConfigSettings.timeZone) - { - doc["timeZoneName"] = ConfigSettings.timeZone; - } + // doc["hostname"] = systemCfg.hostname; + doc["refreshLogs"] = systemCfg.refreshLogs; + // if (systemCfg.timeZone) + //{ + // doc["timeZoneName"] = systemCfg.timeZone; + // } serializeJson(doc, result); serverWeb.sendHeader(respHeaderName, result); + /* + DynamicJsonDocument zones(10240); + String results; - DynamicJsonDocument zones(10240); - String results; - - JsonArray zonesArray = zones.to(); - for (int i = 0; i < timeZoneCount; i++) - { - zonesArray.add(timeZones[i].zone); - } + JsonArray zonesArray = zones.to(); + for (int i = 0; i < timeZoneCount; i++) + { + zonesArray.add(timeZones[i].zone); + } - serializeJson(zones, results); - serverWeb.sendHeader(respTimeZonesName, results); + serializeJson(zones, results); + serverWeb.sendHeader(respTimeZonesName, results); + */ } void handleSavefile() @@ -1673,7 +1783,7 @@ void handleSavefile() } file.close(); - serverWeb.sendHeader(F("Location"), F("/sys-tools")); + serverWeb.sendHeader(F("Location"), F("/tools")); serverWeb.send(303); } } diff --git a/src/web.h b/src/web.h index 9c81d46..d4cfb27 100644 --- a/src/web.h +++ b/src/web.h @@ -5,10 +5,10 @@ void webServerHandleClient(); void handleGeneral(); void handleSecurity(); void handleRoot(); -void handleWifi(); +void handleNetwork(); void handleEther(); void handleMqtt(); -void handleWg(); +void handleVpn(); void handleZigbeeBSL(); void handleZigbeeRestart(); void handleSerial(); @@ -21,6 +21,7 @@ void printLogTime(); void printLogMsg(String msg); void handleSaveParams(); bool checkAuth(); +DynamicJsonDocument getRootData(); void sendEvent(const char *event, const uint8_t evsz, const String data); void progressFunc(unsigned int progress, unsigned int total); @@ -28,4 +29,5 @@ void progressFunc(unsigned int progress, unsigned int total); void getEspUpdate(String esp_fw_url); void runEspUpdateFirmware(uint8_t *data, size_t len); -#define UPD_FILE "https://github.com/mercenaruss/uzg-firmware/releases/latest/download/UZG-01.bin" \ No newline at end of file + +#define UPD_FILE "https://github.com/mercenaruss/uzg-firmware/releases/latest/download/XZG.bin" \ No newline at end of file diff --git a/src/websrc/css/custom.css b/src/websrc/css/custom.css index 87be232..c35cf8b 100644 --- a/src/websrc/css/custom.css +++ b/src/websrc/css/custom.css @@ -12,7 +12,7 @@ label.swFx { } /* Preloader */ -.uzg-loader { +.xzg-loader { width: 100px; height: 100px; border-radius: 50%; @@ -27,7 +27,7 @@ label.swFx { } } -#uzPreloader { +#xzgPreloader { position: absolute; left: calc(50% - 50px); top: calc(50% - 50px); @@ -57,7 +57,12 @@ label.swFx { position: fixed; left: -250px; transition: all 0.3s ease-out; - top: -1px !important; + /*top: -1px !important;*/ + } + + .nav-link { + justify-content: center !important; + display: flex !important; } nav.navbar { @@ -65,11 +70,22 @@ label.swFx { z-index: 99; } - #pagenamePC { + /*#pagenamePC { display: none; + }*/ +} + +@media (min-width: 767px) { + .navbar-toggler-icon { + display: none !important; } } +.navbar>.container { + width: 100% !important; + max-width: 100% !important; +} + .sidenav-active { left: -1px !important; transition: all 0.6s ease-out; @@ -229,6 +245,16 @@ div#main { white-space: normal !important; } +.nav-link { + padding: 0.5rem 0.5rem !important; +} + +.nav-item { + padding-left: 0px !important; + padding-right: 0px !important; + /*min-width: 125px !important;*/ +} + .card { background-color: var(--card-background-color) !important; } @@ -240,6 +266,7 @@ div#main { body { color: var(--text-color) !important; background-color: var(--background-color) !important; + margin: -1 !important; } .table { @@ -250,6 +277,45 @@ body { background-color: var(--form-disabled-background-color) !important; } +.switches-container { + display: flex; + align-items: center; + justify-content: flex-start; + gap: 20px; +} + +.card_icon { + width: 16px; + height: 16px; + fill: currentColor; + margin-right: 6px; +} + +.status_icon { + width: 22px; + height: 22px; + fill: currentColor; + margin-right: 10px; + color: black; + border-radius: 5px; +} + +.card-header { + display: flex !important; + align-items: center !important; + justify-content: start !important; +} + +.fixed-bottom { + text-align: right; + margin-bottom: 0; + font-weight: 100; + font-size: 80%; + margin-right: 6px; + display: none; +} + + /*========== Variables Light theme (default) ==========*/ :root { --background-color: #ffffff; @@ -318,6 +384,12 @@ body { transform: translateX(24px); } +.bi { + width: 15px; + height: 15px; + fill: currentColor; +} + .bi-moon { color: #f1c40f; } diff --git a/src/websrc/css/style.css b/src/websrc/css/style.css index 6fa796d..a9eec65 100644 --- a/src/websrc/css/style.css +++ b/src/websrc/css/style.css @@ -1,4 +1,4 @@ -@charset "UTF-8";input.swFx{border:1px solid rgba(0,0,0,.25)!important}input.swFx:checked{background-color:#303fa1!important;border-color:#303fa1!important}label.swFx{color:#000!important}.uzg-loader{width:100px;height:100px;border-radius:50%;border:16px solid;border-color:#047cc3 #0000;animation:a .5s infinite}@keyframes a{to{transform:rotate(.5turn)}}#uzPreloader{position:absolute;left:calc(50% - 50px);top:calc(50% - 50px);z-index:8;width:100px;height:100px}.card-disabled{opacity:.5;cursor:not-allowed}.card-disabled>*{pointer-events:none}@media (min-width:576px){.nav{padding-left:8px}}@media (max-width:767px){.nav-container{position:fixed;left:-250px;transition:all .3s ease-out;top:-1px!important}nav.navbar{display:flex!important;z-index:6}#pagenamePC{display:none}}.sidenav-active{left:-1px!important;transition:all .6s ease-out}.toast{z-index:7;margin-right:20px}.nav-container{min-width:fit-content;z-index:7}.nav-shadow{box-shadow:5px 0 7px 0 rgba(0,0,0,.53)}.nav{width:100%;white-space:nowrap}.logo-wrapper{padding-left:8px;padding-right:8px;margin-bottom:10px}.logo-wrapper span{padding-left:6px;vertical-align:middle}.app-main-content{padding-top:0}.cardPadding{padding-bottom:20px}.nav-active{background-color:#0000003d}.nav-item span{vertical-align:inherit}.nav-item{width:100%;padding-left:8px;padding-right:8px}.nav-item a{border-bottom:1px solid #fff!important;border-radius:0!important}.nav-item:last-child a{border-bottom:none!important}#file-input,#file-input_zb{padding:0;border:1px solid #ddd;line-height:44px;text-align:center;display:block;cursor:pointer;width:100%;height:44px;border-radius:4px;margin:10px auto;font-size:15px}#bar,#bar_zb,#prgbar,#prgbar_zb{background-color:#f1f1f1;border-radius:10px}#bar,#bar_zb{background-color:#17a2b8;width:0;height:10px}form#upload_form,form#upload_form_zb{background:#fff;max-width:408px;border-radius:5px;text-align:center}h2{text-align:center}div#update_info{max-width:55%;margin:auto;margin-bottom:25px}div#main{margin-left:auto;margin-right:auto}.bg-top{background-color:var(--link-color)!important}.nav{--bs-nav-link-color:var(--link-color)!important;--bs-nav-link-hover-color:var(--link-hover-color)!important;white-space:normal!important}.card{background-color:var(--card-background-color)!important}.modal-content{background-color:var(--modal-background-color)!important}body{color:var(--text-color)!important;background-color:var(--background-color)!important}.table{color:var(--table-text-color)!important}.form-control:disabled{background-color:var(--form-disabled-background-color)!important}:root{--background-color:#fff;--text-color:#000;--card-background-color:#f0f0f0;--table-text-color:var(--bs-table-color);--modal-background-color:var(--bs-modal-bg);--form-disabled-background-color:#e9ecef;--link-color:#047cc3;--link-hover-color:#04d5ec}.dark-theme{--background-color:#121212;--text-color:#686868;--card-background-color:#1e1e1e;--table-text-color:#9c9c9c;--modal-background-color:#212529;--form-disabled-background-color:#303030;--link-color:#ff9200;--link-hover-color:#ffc33c}.checkbox{display:none}.switch-container{justify-content:center;height:50px;width:100%}.switch,.switch-container{display:flex;align-items:center}.switch{background-color:#111;border-radius:50px;cursor:pointer;justify-content:space-between;padding:5px;position:relative;height:26px;width:50px;transform:scale(1.2)}.switch .ball{background-color:#fff;border-radius:50%;position:absolute;top:2px;left:2px;height:22px;width:22px;transform:translateX(0);transition:transform .2s linear}.checkbox:checked+.switch .ball{transform:translateX(24px)}.bi-moon{color:#f1c40f}.bi-sun{color:#f39c12} +@charset "UTF-8";input.swFx{border:1px solid rgba(0,0,0,.25)!important}input.swFx:checked{background-color:#303fa1!important;border-color:#303fa1!important}label.swFx{color:#000!important}.xzg-loader{width:100px;height:100px;border-radius:50%;border:16px solid;border-color:#047cc3 #0000;animation:a .5s infinite}@keyframes a{to{transform:rotate(.5turn)}}#xzgPreloader{position:absolute;left:calc(50% - 50px);top:calc(50% - 50px);z-index:8;width:100px;height:100px}.card-disabled{opacity:.5;cursor:not-allowed}.card-disabled>*{pointer-events:none}@media (min-width:576px){.nav{padding-left:8px}}@media (max-width:767px){.nav-container{position:fixed;left:-250px;transition:all .3s ease-out}.nav-link{justify-content:center!important}.nav-link,nav.navbar{display:flex!important}nav.navbar{z-index:6}}@media (min-width:767px){.navbar-toggler-icon{display:none!important}}.navbar>.container{width:100%!important;max-width:100%!important}.sidenav-active{left:-1px!important;transition:all .6s ease-out}.toast{z-index:7;margin-right:20px}.nav-container{min-width:fit-content;z-index:7}.nav-shadow{box-shadow:5px 0 7px 0 rgba(0,0,0,.53)}.nav{width:100%;white-space:nowrap}.logo-wrapper{padding-left:8px;padding-right:8px;margin-bottom:10px}.logo-wrapper span{padding-left:6px;vertical-align:middle}.app-main-content{padding-top:0}.cardPadding{padding-bottom:20px}.nav-active{background-color:#0000003d}.nav-item span{vertical-align:inherit}.nav-item{width:100%;padding-left:8px;padding-right:8px}.nav-item a{border-bottom:1px solid #fff!important;border-radius:0!important}.nav-item:last-child a{border-bottom:none!important}#file-input,#file-input_zb{padding:0;border:1px solid #ddd;line-height:44px;text-align:center;display:block;cursor:pointer;width:100%;height:44px;border-radius:4px;margin:10px auto;font-size:15px}#bar,#bar_zb,#prgbar,#prgbar_zb{background-color:#f1f1f1;border-radius:10px}#bar,#bar_zb{background-color:#17a2b8;width:0;height:10px}form#upload_form,form#upload_form_zb{background:#fff;max-width:408px;border-radius:5px;text-align:center}h2{text-align:center}div#update_info{max-width:55%;margin:auto;margin-bottom:25px}div#main{margin-left:auto;margin-right:auto}.bg-top{background-color:var(--link-color)!important}.nav{--bs-nav-link-color:var(--link-color)!important;--bs-nav-link-hover-color:var(--link-hover-color)!important;white-space:normal!important}.nav-link{padding:.5rem!important}.nav-item{padding-left:0!important;padding-right:0!important}.card{background-color:var(--card-background-color)!important}.modal-content{background-color:var(--modal-background-color)!important}body{color:var(--text-color)!important;background-color:var(--background-color)!important;margin:-1!important}.table{color:var(--table-text-color)!important}.form-control:disabled{background-color:var(--form-disabled-background-color)!important}.switches-container{display:flex;align-items:center;justify-content:flex-start;gap:20px}.card_icon{width:16px;height:16px;fill:currentColor;margin-right:6px}.status_icon{width:22px;height:22px;fill:currentColor;margin-right:10px;color:#000;border-radius:5px}.card-header{display:flex!important;align-items:center!important;justify-content:start!important}.fixed-bottom{text-align:right;margin-bottom:0;font-weight:100;font-size:80%;margin-right:6px;display:none}:root{--background-color:#fff;--text-color:#000;--card-background-color:#f0f0f0;--table-text-color:var(--bs-table-color);--modal-background-color:var(--bs-modal-bg);--form-disabled-background-color:#e9ecef;--link-color:#047cc3;--link-hover-color:#04d5ec}.dark-theme{--background-color:#121212;--text-color:#686868;--card-background-color:#1e1e1e;--table-text-color:#9c9c9c;--modal-background-color:#212529;--form-disabled-background-color:#303030;--link-color:#ff9200;--link-hover-color:#ffc33c}.checkbox{display:none}.switch-container{justify-content:center;height:50px;width:100%}.switch,.switch-container{display:flex;align-items:center}.switch{background-color:#111;border-radius:50px;cursor:pointer;justify-content:space-between;padding:5px;position:relative;height:26px;width:50px;transform:scale(1.2)}.switch .ball{background-color:#fff;border-radius:50%;position:absolute;top:2px;left:2px;height:22px;width:22px;transform:translateX(0);transition:transform .2s linear}.checkbox:checked+.switch .ball{transform:translateX(24px)}.bi{width:15px;height:15px;fill:currentColor}.bi-moon{color:#f1c40f}.bi-sun{color:#f39c12} /*! * Bootstrap v5.2.3 (https://getbootstrap.com/) diff --git a/src/websrc/html/PAGE_ABOUT.html b/src/websrc/html/PAGE_ABOUT.html index acc7be7..1ef38ea 100644 --- a/src/websrc/html/PAGE_ABOUT.html +++ b/src/websrc/html/PAGE_ABOUT.html @@ -1,31 +1,118 @@ -

+
-
- - - Official website with documentation - - - Download the latest stable version of ZigStar UZG-01 firmware - - - Report bug or feature request - - - Open a ticket - - - About us +
+
+

XZG logo

+

XZG firmware unifies the best innovations from
+ previous Zigbee gateway projects into a single, comprehensive solution.

+

By channeling the community's efforts into improving + one product, XZG aims to streamline development, enhancing the capabilities and efficiency of smart + home and IoT integrations.

+
+ +
+ +
+
+

Get in Touch

+

To learn more about the XZG firmware project visit + + + official Wiki. +

Your insights, feedback, and collaboration are invaluable as we work together to advance the state of + smart home technology.

+

+ + + Join community +

+

+
+ + + + +
+ +
+ +
+
+

Contribute

+

We invite you to join our mission to continuously refine and expand the XZG firmware. +

Whether through coding, bug reporting, or enhancing documentation, your contributions are crucial. +

+

Engage with us on the + + repository to contribute to this collaborative effort. +

+

+ + + Report a bug or request a feature +

+

+
+
+ +
+ +
+
+

Developer

+

This project is the fruition of a dedicated developer's passion for maximizing the + potential of open-source technology and IoT solutions. +

Crafted during spare hours, XZG is a testament to the power of community-driven innovation, bringing + together the most effective and proven solutions.

+

+
+
+ +
+ +
+
+

Support

+

Your support is vital for the ongoing development and sustainability of XZG. +

Financial contributions can be made through + + Sponsors, + + PayPal, or + + Buy Me a Coffee. +

If you're interested in helping in other ways or have suggestions, + please don't hesitate to + + get in touch. Every form of support makes a significant + difference and is deeply appreciated.

+

+

+
+
+ +
+ +
\ No newline at end of file diff --git a/src/websrc/html/PAGE_ETHERNET.html b/src/websrc/html/PAGE_ETHERNET.html deleted file mode 100644 index 0f3b41e..0000000 --- a/src/websrc/html/PAGE_ETHERNET.html +++ /dev/null @@ -1,44 +0,0 @@ -
-
-
-
-
-
Ethernet options
-
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
- -
-
-
-
-
-
-
\ No newline at end of file diff --git a/src/websrc/html/PAGE_GENERAL.html b/src/websrc/html/PAGE_GENERAL.html index 097776e..1e81114 100644 --- a/src/websrc/html/PAGE_GENERAL.html +++ b/src/websrc/html/PAGE_GENERAL.html @@ -1,100 +1,120 @@
-
-
-
-
-
General settings
-
-
-
-
-
- Select the device operating mode: -
- - -
-
- - -
- -
- - -
-
- - -
-
- -
-
+ + +
+
+
+ General settings +
+
+
+
+
+ +
+ + +
+
+ +
+
-
-
-
- Using the Toggle buttons, you can control the state of the LEDs in the - current - session (not saved on reboot): +
+
+
+
+ Select the device operating mode: +
+ + +
+ +
+ +
-
- -
-
- Control the behavior of the LEDs (with saving on reboot) using the - switches - below: -
- -
-
- - -
+
+ + +
+
+ +
+
+
+
+ + Control the behavior of the LEDs (with saving on reboot) using the + switches + below: +
+ +
+
+ +
-
-
- -
-
- +
+
+
+
+
NTP options
+
+ +
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
-
+ +
\ No newline at end of file diff --git a/src/websrc/html/PAGE_LOADER.html b/src/websrc/html/PAGE_LOADER.html index 99ff41b..4d3fe06 100644 --- a/src/websrc/html/PAGE_LOADER.html +++ b/src/websrc/html/PAGE_LOADER.html @@ -9,8 +9,8 @@ -
-
+
+
-

TJm^3kP665hnFvcj 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 m<};Tw^JvZCLd?-=hC$y;?Tmp(mG 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 +EoqA_73uk}x12dxl(EB6h`&q6z2$0XfemmH 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›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