Audit of the XEdDSA packet-signing implementation (#10478) surfaced several issues in when unsigned packets are accepted on receive or emitted on send. This fixes them and adds regression coverage. - Unicast NodeInfo exchange no longer breaks against signer nodes: the NodeInfoModule downgrade drop is gated to broadcasts, since senders never sign unicast (want_response replies, directed exchanges). - Replace the payload-size sign heuristic with an exact encoded-size gate (signedDataFits) and mirror it on the receive side, removing a dead band where 167-168 B broadcasts were signed then failed TOO_LARGE. - Extract the receive policy into checkXeddsaReceivePolicy() and apply it to plaintext-MQTT decoded downlink, which previously skipped signature verification and downgrade protection entirely. - Reject signatures whose length is neither 0 nor 64 as malformed, so a crafted partial signature can't inflate the size estimate and dodge the unsigned-downgrade drop. - Hold cryptLock on the MQTT verify path (shared Ed25519 key cache). - Clear any client-preset signature on packets we originate, on all builds. - Randomized (hedged) signing per the Signal XEdDSA spec: bump the meshtastic/Crypto pin to the build where XEdDSA::sign mixes 32 bytes of caller randomness into the nonce as Z (meshtastic/Crypto#3), and seed those bytes in xeddsa_sign from HardwareRNG (checked, with a seeded-CSPRNG fallback). test_crypto pins that repeated signs differ and both verify. Adds test coverage: test_packet_signing groups A-E (receive matrix, send policy, NodeInfo backstop, encoding invariants, decoded-ingress policy), test_mqtt end-to-end downlink cases, and a test_crypto randomization check.
64 lines
2.6 KiB
INI
64 lines
2.6 KiB
INI
[stm32_base]
|
|
extends = arduino_base
|
|
platform =
|
|
# renovate: datasource=custom.pio depName=platformio/ststm32 packageName=platformio/platform/ststm32
|
|
platformio/ststm32@19.7.0
|
|
platform_packages =
|
|
# renovate: datasource=github-tags depName=Arduino_Core_STM32 packageName=stm32duino/Arduino_Core_STM32
|
|
platformio/framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/2.10.1.zip
|
|
extra_scripts =
|
|
${env.extra_scripts}
|
|
extra_scripts/stm32_extra.py
|
|
|
|
build_type = release
|
|
|
|
build_flags =
|
|
${arduino_base.build_flags}
|
|
-flto
|
|
-Isrc/platform/stm32wl -g
|
|
-DMESHTASTIC_EXCLUDE_AUDIO=1
|
|
-DMESHTASTIC_EXCLUDE_ATAK=1 ; ATAK is quite big, disable it for big flash savings.
|
|
-DMESHTASTIC_EXCLUDE_INPUTBROKER=1
|
|
-DMESHTASTIC_EXCLUDE_POWERMON=1
|
|
-DMESHTASTIC_EXCLUDE_SCREEN=1
|
|
-DMESHTASTIC_EXCLUDE_MQTT=1
|
|
-DMESHTASTIC_EXCLUDE_BLUETOOTH=1
|
|
-DMESHTASTIC_EXCLUDE_WIFI=1
|
|
-DMESHTASTIC_EXCLUDE_TZ=1 ; Exclude TZ to save some flash space.
|
|
-DMESHTASTIC_EXCLUDE_XEDDSA=1 ; The Ed25519 signing code does not fit in the 256KB flash. Packets are sent unsigned, like pre-XEdDSA firmware.
|
|
-DSERIAL_RX_BUFFER_SIZE=256 ; For GPS - the default of 64 is too small.
|
|
-DHAS_SCREEN=0 ; Always disable screen for STM32, it is not supported.
|
|
;-DPIO_FRAMEWORK_ARDUINO_NANOLIB_FLOAT_PRINTF ; Enable this if enabling debugg logging. It is REQUIRED for at least traceroute debug prints - without it the length returned by printf ends up uninitialized.
|
|
-DDEBUG_MUTE ; You can #undef DEBUG_MUTE in certain source files if you need the logs.
|
|
-fmerge-all-constants
|
|
-ffunction-sections
|
|
-fdata-sections
|
|
-DRADIOLIB_EXCLUDE_SX128X=1
|
|
-DRADIOLIB_EXCLUDE_SX127X=1
|
|
-DRADIOLIB_EXCLUDE_LR11X0=1
|
|
-DRADIOLIB_EXCLUDE_LR2021=1
|
|
-DMESHTASTIC_DYNAMIC_SBRK_HEAP
|
|
-DHAL_DAC_MODULE_ONLY
|
|
-DHAL_RNG_MODULE_ENABLED
|
|
-Wl,--wrap=__assert_func
|
|
-Wl,--wrap=strerror
|
|
-Wl,--wrap=_tzset_unlocked_r
|
|
|
|
build_src_filter =
|
|
${arduino_base.build_src_filter} +<platform/stm32wl/> -<nimble/> -<mesh/api/> -<mesh/wifi/> -<mesh/http/> -<modules/esp32> -<mesh/eth/> -<input> -<buzz> -<modules/RemoteHardwareModule.cpp> -<mesh/raspihttp>
|
|
|
|
board_upload.offset_address = 0x08000000
|
|
upload_protocol = stlink
|
|
debug_tool = stlink
|
|
|
|
lib_deps =
|
|
${env.lib_deps}
|
|
${radiolib_base.lib_deps}
|
|
# renovate: datasource=git-refs depName=meshtastic/Crypto packageName=https://github.com/meshtastic/Crypto gitBranch=main
|
|
https://github.com/meshtastic/Crypto/archive/591ff9a690e8168ccb7a36abde8d7783e448d395.zip
|
|
|
|
lib_ignore =
|
|
OneButton
|
|
|
|
; Set a custom linker script with a higher MinStackSize value, to match NRF52.
|
|
board_build.ldscript = $PROJECT_DIR/variants/stm32/stm32wle5xx.ld |