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