70#ifndef DETERMINISTICESPASYNCWEBSERVER_SSH_PACKET_H
71#define DETERMINISTICESPASYNCWEBSERVER_SSH_PACKET_H
90#define SSH_SEQ_CLOSE_THRESHOLD 0xFFFFFFF0u
96#define SSH_MSG_DISCONNECT 1
97#define SSH_MSG_IGNORE 2
98#define SSH_MSG_UNIMPLEMENTED 3
99#define SSH_MSG_SERVICE_REQUEST 5
100#define SSH_MSG_SERVICE_ACCEPT 6
101#define SSH_MSG_EXT_INFO 7
102#define SSH_MSG_KEXINIT 20
103#define SSH_MSG_NEWKEYS 21
104#define SSH_MSG_KEXDH_INIT 30
105#define SSH_MSG_KEXDH_REPLY 31
106#define SSH_MSG_USERAUTH_REQUEST 50
107#define SSH_MSG_USERAUTH_FAILURE 51
108#define SSH_MSG_USERAUTH_SUCCESS 52
109#define SSH_MSG_USERAUTH_PK_OK 60
110#define SSH_MSG_GLOBAL_REQUEST 80
111#define SSH_MSG_REQUEST_SUCCESS 81
112#define SSH_MSG_REQUEST_FAILURE 82
113#define SSH_MSG_CHANNEL_OPEN 90
114#define SSH_MSG_CHANNEL_OPEN_CONFIRM 91
115#define SSH_MSG_CHANNEL_OPEN_FAILURE 92
116#define SSH_MSG_CHANNEL_WINDOW_ADJUST 93
117#define SSH_MSG_CHANNEL_DATA 94
118#define SSH_MSG_CHANNEL_EOF 96
119#define SSH_MSG_CHANNEL_CLOSE 97
120#define SSH_MSG_CHANNEL_REQUEST 98
121#define SSH_MSG_CHANNEL_SUCCESS 99
122#define SSH_MSG_CHANNEL_FAILURE 100
128#define SSH_DISCONNECT_PROTOCOL_ERROR 2
129#define SSH_DISCONNECT_MAC_ERROR 5
130#define SSH_DISCONNECT_TOO_MANY_CONNECTIONS 11
131#define SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14
174#if DETWS_ENABLE_SSH_ZLIB
175#define SSH_MAX_EFFECTIVE_PAYLOAD (2 + SSH_PKT_BUF_SIZE + (SSH_PKT_BUF_SIZE >> 3) + 32)
177#define SSH_MAX_EFFECTIVE_PAYLOAD (SSH_PKT_BUF_SIZE)
179#define SSH_MAX_PAD 32
180#define SSH_MAX_MAC 64
181#define SSH_WIRE_CAP ((size_t)(4 + 1 + SSH_MAX_EFFECTIVE_PAYLOAD + SSH_MAX_PAD + SSH_MAX_MAC))
216int ssh_pkt_send(uint8_t i,
const uint8_t *payload,
size_t payload_len, uint8_t *out,
size_t *out_len,
size_t out_cap);
226typedef void (*
ssh_msg_handler_t)(uint8_t slot, uint8_t msg_type,
const uint8_t *payload,
size_t payload_len);
259int ssh_pkt_disconnect(uint8_t i, uint32_t reason_code, uint8_t *out,
size_t *out_len,
size_t out_cap);
User-facing configuration for DeterministicESPAsyncWebServer.
#define MAX_SSH_CONNS
Maximum simultaneous SSH connections.
#define SSH_PKT_BUF_SIZE
Packet assembly buffer per SSH connection (bytes).
HMAC-SHA2-256 (RFC 2104 + FIPS 198-1).
SSH session key material - types, pools, and security model.
int ssh_pkt_disconnect(uint8_t i, uint32_t reason_code, uint8_t *out, size_t *out_len, size_t out_cap)
Send SSH_MSG_DISCONNECT with reason reason_code.
SshPacketState ssh_pkt[MAX_SSH_CONNS]
Static packet state pool (BSS). One entry per SSH slot.
int ssh_pkt_send(uint8_t i, const uint8_t *payload, size_t payload_len, uint8_t *out, size_t *out_len, size_t out_cap)
Build and send one SSH binary packet.
void ssh_pkt_init(uint8_t i)
Initialize the packet state for SSH connection slot i.
int ssh_pkt_recv(uint8_t i, const uint8_t *data, size_t len, ssh_msg_handler_t handler)
Receive and process one or more SSH binary packets from data.
void(* ssh_msg_handler_t)(uint8_t slot, uint8_t msg_type, const uint8_t *payload, size_t payload_len)
Callback invoked once per complete, verified inbound SSH message.
Per-connection SSH binary packet state.
size_t rx_len
Bytes currently in rx_buf.
bool enc_out
True once we have sent our NEWKEYS (outbound cipher/MAC active).
uint32_t seq_no_recv
Incoming sequence number (incremented per packet).
uint8_t rx_buf[SSH_PKT_BUF_SIZE]
Raw receive buffer (from transport).
bool enc_in
True once we have received the peer's NEWKEYS (inbound cipher/MAC active).
bool kex_active
True while KEX is in progress (no user data).
uint32_t seq_no_send
Outgoing sequence number (incremented per packet).