11#include <noise/protocol.h>
19 if (this->
psk_ ==
nullptr) {
26#ifdef USE_NOISE_SPARE_EPHEMERAL
27static constexpr size_t PRIVATE_KEY_SIZE = SPARE_EPHEMERAL_KEY_SIZE;
28static constexpr size_t PUBLIC_KEY_SIZE = SPARE_EPHEMERAL_KEY_SIZE;
39 private_key[0] &= 0xF8;
40 private_key[PRIVATE_KEY_SIZE - 1] = (private_key[PRIVATE_KEY_SIZE - 1] & 0x7F) | 0x40;
41 if (crypto_scalarmult_curve25519_base(public_key, private_key) != 0) {
59 if (err == NOISE_ERROR_NO_MEMORY)
60 return LOG_STR(
"NO_MEMORY");
61 if (err == NOISE_ERROR_UNKNOWN_ID)
62 return LOG_STR(
"UNKNOWN_ID");
63 if (err == NOISE_ERROR_UNKNOWN_NAME)
64 return LOG_STR(
"UNKNOWN_NAME");
65 if (err == NOISE_ERROR_MAC_FAILURE)
66 return LOG_STR(
"MAC_FAILURE");
67 if (err == NOISE_ERROR_NOT_APPLICABLE)
68 return LOG_STR(
"NOT_APPLICABLE");
69 if (err == NOISE_ERROR_SYSTEM)
70 return LOG_STR(
"SYSTEM");
71 if (err == NOISE_ERROR_REMOTE_KEY_REQUIRED)
72 return LOG_STR(
"REMOTE_KEY_REQUIRED");
73 if (err == NOISE_ERROR_LOCAL_KEY_REQUIRED)
74 return LOG_STR(
"LOCAL_KEY_REQUIRED");
75 if (err == NOISE_ERROR_PSK_REQUIRED)
76 return LOG_STR(
"PSK_REQUIRED");
77 if (err == NOISE_ERROR_INVALID_LENGTH)
78 return LOG_STR(
"INVALID_LENGTH");
79 if (err == NOISE_ERROR_INVALID_PARAM)
80 return LOG_STR(
"INVALID_PARAM");
81 if (err == NOISE_ERROR_INVALID_STATE)
82 return LOG_STR(
"INVALID_STATE");
83 if (err == NOISE_ERROR_INVALID_NONCE)
84 return LOG_STR(
"INVALID_NONCE");
85 if (err == NOISE_ERROR_INVALID_PRIVATE_KEY)
86 return LOG_STR(
"INVALID_PRIVATE_KEY");
87 if (err == NOISE_ERROR_INVALID_PUBLIC_KEY)
88 return LOG_STR(
"INVALID_PUBLIC_KEY");
89 if (err == NOISE_ERROR_INVALID_FORMAT)
90 return LOG_STR(
"INVALID_FORMAT");
91 if (err == NOISE_ERROR_INVALID_SIGNATURE)
92 return LOG_STR(
"INVALID_SIGNATURE");
93 return LOG_STR(
"UNKNOWN");
97 return err == NOISE_ERROR_MAC_FAILURE ? LOG_STR(
"Handshake MAC failure") : LOG_STR(
"Handshake error");
104 ESP_LOGVV(TAG,
"Reject buffer has no capacity");
107 buf[0] = HANDSHAKE_STATUS_REJECT;
109 const char *reason_str = LOG_STR_ARG(reason);
110 size_t reason_len = std::min(ESPHOME_strlen_P(reason_str),
capacity - 1);
111 if (reason_len > 0) {
115 return reason_len + 1;
void load_psk(psk_t &out) const
Copy the key out (flash-aware on ESP8266); all zeros when none is set.
std::vector< uint8_t > & out
ESPHOME_LOG_TAG(TAG, "noise")
std::array< uint8_t, 32 > psk_t
uint8_t spare_ephemeral[SPARE_EPHEMERAL_SIZE]
const LogString * noise_err_to_logstr(int err)
Convert a noise error code to a readable error.
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...
int consume_spare_ephemeral(NoiseHandshakeState *state)
Move the key pair into a handshake that has not started and wipe the slot; 0 unless noise-c rejects i...
bool has_spare_ephemeral()
const LogString * reject_reason_for(int err)
Reject reason for a failed handshake read.
void prepare_spare_ephemeral()
Fill the slot; blocks for the base point multiply.
bool random_bytes(uint8_t *data, size_t len)
Generate len random bytes using the platform's secure RNG (hardware RNG or OS CSPRNG).
void progmem_memcpy(void *dst, const void *src, size_t len)
uint16_t uint16_t & capacity
struct NoiseHandshakeState_s NoiseHandshakeState