Skip to content

Commit ba91cc9

Browse files
committed
Fix SSH server for STM32H563 bare-metal operation
Commit Body: Fix wolfSSH integration and optimize memory for embedded deployment. wolfSSH API updates: - Add wolfSSH_CTX_SetIO_wolfIP() for context-level I/O callbacks - Update field names: usernameLen->usernameSz, passwordLen->passwordSz - Wrap debug logging callback in #ifdef DEBUG_WOLFSSH Memory optimization for STM32H563 (640KB SRAM): - Reduce wolfSSH window size from 16KB to 4KB - Reduce wolfIP RX/TX buffers from 16x to 8x MTU - Reduce MAX_TCPSOCKETS to 6, MAX_ICMPSOCKETS to 1 wolfSSL/wolfSSH configuration: - Add WOLFSSL_WOLFSSH for wc_SSH_KDF support - Add WOLFSSL_KEY_GEN for host key generation - Add WOLFSSH_NO_TERM for bare-metal operation Build system: - Add signature.c for SSH signature verification - Fix pattern rules for wolfSSH compilation Tested: SSH login (admin/wolfip), shell commands working
1 parent 7f9e8c1 commit ba91cc9

5 files changed

Lines changed: 61 additions & 21 deletions

File tree

src/port/stm32h563/Makefile

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ WOLFSSL_SRCS += \
105105
WOLFSSL_SRCS += \
106106
$(WOLFSSL_ROOT)/wolfcrypt/src/rsa.c
107107

108+
# Signature verification (required for wolfSSH)
109+
ifeq ($(ENABLE_SSH),1)
110+
WOLFSSL_SRCS += \
111+
$(WOLFSSL_ROOT)/wolfcrypt/src/signature.c
112+
endif
113+
108114
SRCS += $(WOLFSSL_SRCS)
109115

110116
endif # ENABLE_TLS
@@ -143,9 +149,9 @@ WOLFSSH_SRCS := \
143149

144150
SRCS += $(WOLFSSH_SRCS)
145151

146-
# wolfSSH objects use relaxed warnings
152+
# wolfSSH objects use relaxed warnings + SSH/SSL include paths + user_settings.h
147153
$(WOLFSSH_ROOT)/%.o: $(WOLFSSH_ROOT)/%.c
148-
$(CC) $(CFLAGS_WOLFSSL) -c $< -o $@
154+
$(CC) $(CFLAGS_WOLFSSL) -DENABLE_SSH -DWOLFSSL_USER_SETTINGS -DWOLFSSH_USER_SETTINGS -I$(WOLFSSH_ROOT) -I$(WOLFSSL_ROOT) -c $< -o $@
149155

150156
endif # ENABLE_SSH
151157

@@ -172,9 +178,9 @@ app.bin: app.elf
172178
%.o: %.c
173179
$(CC) $(CFLAGS) -c $< -o $@
174180

175-
# wolfSSL objects use relaxed warnings
181+
# wolfSSL objects use relaxed warnings + user_settings.h + include paths
176182
$(WOLFSSL_ROOT)/%.o: $(WOLFSSL_ROOT)/%.c
177-
$(CC) $(CFLAGS_WOLFSSL) -c $< -o $@
183+
$(CC) $(CFLAGS_WOLFSSL) -DWOLFSSL_USER_SETTINGS $(if $(filter 1,$(ENABLE_SSH)),-DENABLE_SSH) -I$(WOLFSSL_ROOT) -c $< -o $@
178184

179185
clean:
180186
rm -f *.o app.elf app.bin

src/port/stm32h563/config.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@
2828
#define ETHERNET
2929
#define LINK_MTU 1536
3030

31-
#define MAX_TCPSOCKETS 8
31+
#define MAX_TCPSOCKETS 6 /* Need enough for listen + accepted sockets */
3232
#define MAX_UDPSOCKETS 2
33-
#define MAX_ICMPSOCKETS 2
34-
#define RXBUF_SIZE (LINK_MTU * 16)
35-
#define TXBUF_SIZE (LINK_MTU * 16)
33+
#define MAX_ICMPSOCKETS 1 /* Reduced from 2 */
34+
#define RXBUF_SIZE (LINK_MTU * 8) /* Reduced from 16 */
35+
#define TXBUF_SIZE (LINK_MTU * 8) /* Reduced from 16 */
3636

3737
#define MAX_NEIGHBORS 16
3838

src/port/stm32h563/ssh_server.c

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,21 @@ static struct {
6262
} server;
6363

6464
/* External functions from wolfssh_io.c */
65+
extern void wolfSSH_CTX_SetIO_wolfIP(WOLFSSH_CTX *ctx);
6566
extern int wolfSSH_SetIO_wolfIP(WOLFSSH *ssh, struct wolfIP *stack, int fd);
6667

68+
#ifdef DEBUG_WOLFSSH
69+
/* wolfSSH logging callback */
70+
static void ssh_log_cb(enum wolfSSH_LogLevel level, const char *msg)
71+
{
72+
(void)level;
73+
if (server.debug_cb && msg) {
74+
server.debug_cb(msg);
75+
server.debug_cb("\n");
76+
}
77+
}
78+
#endif
79+
6780
/* Debug output helper */
6881
static void debug_print(const char *msg)
6982
{
@@ -82,16 +95,16 @@ static int ssh_userauth_cb(byte authType, WS_UserAuthData *authData, void *ctx)
8295
}
8396

8497
/* Check username */
85-
if (authData->usernameLen != strlen(SSH_USERNAME) ||
86-
memcmp(authData->username, SSH_USERNAME, authData->usernameLen) != 0) {
98+
if (authData->usernameSz != strlen(SSH_USERNAME) ||
99+
memcmp(authData->username, SSH_USERNAME, authData->usernameSz) != 0) {
87100
debug_print("SSH: Invalid username\n");
88101
return WOLFSSH_USERAUTH_INVALID_USER;
89102
}
90103

91104
/* Check password */
92-
if (authData->sf.password.passwordLen != strlen(SSH_PASSWORD) ||
105+
if (authData->sf.password.passwordSz != strlen(SSH_PASSWORD) ||
93106
memcmp(authData->sf.password.password, SSH_PASSWORD,
94-
authData->sf.password.passwordLen) != 0) {
107+
authData->sf.password.passwordSz) != 0) {
95108
debug_print("SSH: Invalid password\n");
96109
return WOLFSSH_USERAUTH_INVALID_PASSWORD;
97110
}
@@ -212,13 +225,22 @@ int ssh_server_init(struct wolfIP *stack, uint16_t port, ssh_debug_cb debug)
212225
return -1;
213226
}
214227

228+
#ifdef DEBUG_WOLFSSH
229+
/* Enable wolfSSH debug logging */
230+
wolfSSH_Debugging_ON();
231+
wolfSSH_SetLoggingCb(ssh_log_cb);
232+
#endif
233+
215234
/* Create SSH server context */
216235
server.ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_SERVER, NULL);
217236
if (server.ctx == NULL) {
218237
debug_print("SSH: CTX_new failed\n");
219238
return -1;
220239
}
221240

241+
/* Set I/O callbacks on context */
242+
wolfSSH_CTX_SetIO_wolfIP(server.ctx);
243+
222244
/* Set user authentication callback */
223245
wolfSSH_SetUserAuth(server.ctx, ssh_userauth_cb);
224246

@@ -235,7 +257,6 @@ int ssh_server_init(struct wolfIP *stack, uint16_t port, ssh_debug_cb debug)
235257
}
236258

237259
/* Create listen socket */
238-
debug_print("SSH: Creating listen socket\n");
239260
server.listen_fd = wolfIP_sock_socket(stack, AF_INET, IPSTACK_SOCK_STREAM, 0);
240261
if (server.listen_fd < 0) {
241262
debug_print("SSH: socket() failed\n");

src/port/stm32h563/user_settings.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,24 +153,30 @@ int custom_rand_gen_block(unsigned char* output, unsigned int sz);
153153
/* ------------------------------------------------------------------------- */
154154
/* #define DEBUG_WOLFSSL */
155155
/* #define WOLFSSL_DEBUG_TLS */
156+
/* #define DEBUG_WOLFSSH */ /* Enable wolfSSH debug output */
156157

157158
/* ------------------------------------------------------------------------- */
158159
/* wolfSSH Settings (when ENABLE_SSH=1) */
159160
/* ------------------------------------------------------------------------- */
160161
#ifdef ENABLE_SSH
162+
/* Enable wolfSSL features needed for wolfSSH */
163+
#define WOLFSSL_WOLFSSH /* Enable wc_SSH_KDF function */
164+
#define WOLFSSL_KEY_GEN /* Key generation for wolfSSH keygen */
165+
161166
/* Disable features not needed for basic shell */
162167
#define WOLFSSH_NO_TIMESTAMP
163168
#define WOLFSSH_NO_AGENT
164169
#define WOLFSSH_NO_SFTP
165170
#define WOLFSSH_NO_SCP
166171

167-
/* Memory optimization */
172+
/* Bare-metal: no termios/pty support */
173+
#define WOLFSSH_NO_TERM
174+
175+
/* Memory optimization - reduced for embedded */
168176
#define WOLFSSH_SMALL_STACK
169-
#define DEFAULT_WINDOW_SZ (16 * 1024)
177+
#define DEFAULT_WINDOW_SZ (4 * 1024) /* Reduced from 16KB to 4KB */
170178
#define DEFAULT_HIGHWATER_MARK ((DEFAULT_WINDOW_SZ * 3) / 4)
171-
172-
/* Terminal support for shell */
173-
#define WOLFSSH_TERM
179+
#define MAX_PACKET_SZ (DEFAULT_WINDOW_SZ + 256)
174180

175181
/* Custom I/O - we use wolfIP sockets */
176182
#define WOLFSSH_USER_IO

src/port/wolfssh_io.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,16 @@ static int wolfssh_io_send(WOLFSSH *ssh, void *buf, word32 sz, void *ctx)
106106
return ret;
107107
}
108108

109-
/* Set up wolfSSH I/O callbacks for a wolfIP socket */
109+
/* Set up wolfSSH I/O callbacks on the context (call once during init) */
110+
void wolfSSH_CTX_SetIO_wolfIP(WOLFSSH_CTX *ctx)
111+
{
112+
if (ctx) {
113+
wolfSSH_SetIORecv(ctx, wolfssh_io_recv);
114+
wolfSSH_SetIOSend(ctx, wolfssh_io_send);
115+
}
116+
}
117+
118+
/* Set up wolfSSH I/O context for a wolfIP socket (call per-session) */
110119
int wolfSSH_SetIO_wolfIP(WOLFSSH *ssh, struct wolfIP *stack, int fd)
111120
{
112121
struct wolfssh_io_desc *desc;
@@ -123,8 +132,6 @@ int wolfSSH_SetIO_wolfIP(WOLFSSH *ssh, struct wolfIP *stack, int fd)
123132
desc->stack = stack;
124133
desc->fd = fd;
125134

126-
wolfSSH_SetIORecv(ssh, wolfssh_io_recv);
127-
wolfSSH_SetIOSend(ssh, wolfssh_io_send);
128135
wolfSSH_SetIOReadCtx(ssh, desc);
129136
wolfSSH_SetIOWriteCtx(ssh, desc);
130137

0 commit comments

Comments
 (0)