ESPHome 2026.9.0
Loading...
Searching...
No Matches
noise.cpp
Go to the documentation of this file.
1#include "noise.h"
2#ifdef USE_NOISE
3#include "esphome/core/hal.h"
4#include "esphome/core/log.h"
5
6#include <algorithm>
7#include <cstring>
8
9#include <noise/protocol.h>
10
11#ifdef USE_ESP8266
12#include <pgmspace.h>
13#endif
14
15namespace esphome::noise {
16
17static const char *const TAG = "noise";
18
19void NoiseContext::load_psk(psk_t &out) const {
20 if (this->psk_ == nullptr) {
21 out.fill(0);
22 return;
23 }
24 progmem_memcpy(out.data(), this->psk_, out.size());
25}
26
27const LogString *noise_err_to_logstr(int err) {
28 if (err == NOISE_ERROR_NO_MEMORY)
29 return LOG_STR("NO_MEMORY");
30 if (err == NOISE_ERROR_UNKNOWN_ID)
31 return LOG_STR("UNKNOWN_ID");
32 if (err == NOISE_ERROR_UNKNOWN_NAME)
33 return LOG_STR("UNKNOWN_NAME");
34 if (err == NOISE_ERROR_MAC_FAILURE)
35 return LOG_STR("MAC_FAILURE");
36 if (err == NOISE_ERROR_NOT_APPLICABLE)
37 return LOG_STR("NOT_APPLICABLE");
38 if (err == NOISE_ERROR_SYSTEM)
39 return LOG_STR("SYSTEM");
40 if (err == NOISE_ERROR_REMOTE_KEY_REQUIRED)
41 return LOG_STR("REMOTE_KEY_REQUIRED");
42 if (err == NOISE_ERROR_LOCAL_KEY_REQUIRED)
43 return LOG_STR("LOCAL_KEY_REQUIRED");
44 if (err == NOISE_ERROR_PSK_REQUIRED)
45 return LOG_STR("PSK_REQUIRED");
46 if (err == NOISE_ERROR_INVALID_LENGTH)
47 return LOG_STR("INVALID_LENGTH");
48 if (err == NOISE_ERROR_INVALID_PARAM)
49 return LOG_STR("INVALID_PARAM");
50 if (err == NOISE_ERROR_INVALID_STATE)
51 return LOG_STR("INVALID_STATE");
52 if (err == NOISE_ERROR_INVALID_NONCE)
53 return LOG_STR("INVALID_NONCE");
54 if (err == NOISE_ERROR_INVALID_PRIVATE_KEY)
55 return LOG_STR("INVALID_PRIVATE_KEY");
56 if (err == NOISE_ERROR_INVALID_PUBLIC_KEY)
57 return LOG_STR("INVALID_PUBLIC_KEY");
58 if (err == NOISE_ERROR_INVALID_FORMAT)
59 return LOG_STR("INVALID_FORMAT");
60 if (err == NOISE_ERROR_INVALID_SIGNATURE)
61 return LOG_STR("INVALID_SIGNATURE");
62 return LOG_STR("UNKNOWN");
63}
64
65const LogString *reject_reason_for(int err) {
66 return err == NOISE_ERROR_MAC_FAILURE ? LOG_STR("Handshake MAC failure") : LOG_STR("Handshake error");
67}
68
69size_t format_reject_payload(uint8_t *buf, size_t capacity, const LogString *reason) {
70 if (capacity == 0) {
71 // A caller bug; the MAC_FAILURE_PAYLOAD_SIZE static_asserts at the call
72 // sites make this unreachable, kept as cheap memory safety
73 ESP_LOGVV(TAG, "Reject buffer has no capacity");
74 return 0;
75 }
76 buf[0] = HANDSHAKE_STATUS_REJECT;
77#ifdef USE_STORE_LOG_STR_IN_FLASH
78 // On ESP8266 with flash strings, we need to use PROGMEM-aware functions
79 size_t reason_len = strlen_P(reinterpret_cast<PGM_P>(reason));
80 reason_len = std::min(reason_len, capacity - 1);
81 if (reason_len > 0) {
82 memcpy_P(buf + 1, reinterpret_cast<PGM_P>(reason), reason_len);
83 }
84#else
85 const char *reason_str = LOG_STR_ARG(reason);
86 size_t reason_len = strlen(reason_str);
87 reason_len = std::min(reason_len, capacity - 1);
88 if (reason_len > 0) {
89 // NOLINTNEXTLINE(bugprone-not-null-terminated-result) - binary protocol, not a C string
90 std::memcpy(buf + 1, reason_str, reason_len);
91 }
92#endif
93 return reason_len + 1;
94}
95
96} // namespace esphome::noise
97#endif // USE_NOISE
void load_psk(psk_t &out) const
Copy the key out (flash-aware on ESP8266); all zeros when none is set.
Definition noise.cpp:19
const uint8_t * psk_
Definition noise.h:35
std::array< uint8_t, 32 > psk_t
Definition noise.h:11
const LogString * noise_err_to_logstr(int err)
Convert a noise error code to a readable error.
Definition noise.cpp:27
size_t format_reject_payload(uint8_t *buf, size_t capacity, const LogString *reason)
Fill buf with a handshake reject payload (status byte plus the reason text, PROGMEM aware); returns t...
Definition noise.cpp:69
const LogString * reject_reason_for(int err)
Reject reason for a failed handshake read.
Definition noise.cpp:65
void progmem_memcpy(void *dst, const void *src, size_t len)
Definition hal.h:48
uint16_t uint16_t & capacity
Definition helpers.cpp:25