From 7c8ae04b44adbda1ab5d51e0c31bdef5db387aa6 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 18 Feb 2020 16:00:34 -0800 Subject: [PATCH] VxWorks Customizations Also includes some bug fixes. 1. Add a function that returns a pointer to a session's username string. 2. Add a function to set a "raw" username copied from an incoming packet. 3. Add tests for 1 and 2. 4. Server saves a copy of the username on successful authentication. 5. Fix bug with GetString() where it would choke on a 0 length string. 6. Clean up the termios macros and mode creation. 7. Add some options for when WOLFSSL_VXWORKS is set. --- examples/client/client.c | 1 + examples/sftpclient/sftpclient.c | 2 + src/internal.c | 229 ++++++++++++++++--------------- src/ssh.c | 65 ++++++--- tests/api.c | 15 +- wolfssh/certs_test.h | 2 +- wolfssh/port.h | 26 +++- wolfssh/ssh.h | 2 + wolfssh/test.h | 48 ++++++- 9 files changed, 248 insertions(+), 142 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index 02ec736..1f4bcda 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -161,6 +161,7 @@ static int wsUserAuth(byte authType, } else { printf("Password: "); + fflush(stdout); SetEcho(0); if (fgets((char*)userPassword, sizeof(userPassword), stdin) == NULL) { printf("Getting password failed.\n"); diff --git a/examples/sftpclient/sftpclient.c b/examples/sftpclient/sftpclient.c index 4e4a0b2..e1cb4bf 100644 --- a/examples/sftpclient/sftpclient.c +++ b/examples/sftpclient/sftpclient.c @@ -453,6 +453,7 @@ static int wsUserAuth(byte authType, } else { printf("Password: "); + fflush(stdout); SetEcho(0); if (WFGETS((char*)userPassword, sizeof(userPassword), stdin) == NULL) { @@ -568,6 +569,7 @@ static int doCmds(func_args* args) err_msg("fputs error"); return -1; } + fflush(stdout); WMEMSET(msg, 0, sizeof(msg)); if (SFTP_FGETS(args, msg, sizeof(msg) - 1) == NULL) { diff --git a/src/internal.c b/src/internal.c index ad6be33..6cc839d 100644 --- a/src/internal.c +++ b/src/internal.c @@ -1640,7 +1640,9 @@ static int GetString(char* s, word32* sSz, if (result == WS_SUCCESS) { result = WS_BUFFER_E; - if (*idx < len && strSz <= len - *idx) { + + /* This allows 0 length string to be decoded */ + if (*idx <= len && strSz <= len - *idx) { *sSz = (strSz >= *sSz) ? *sSz - 1 : strSz; /* -1 for null char */ WMEMCPY(s, buf + *idx, *sSz); *idx += strSz; @@ -3285,7 +3287,7 @@ static int DoUserAuthRequestPassword(WOLFSSH* ssh, WS_UserAuthData* authData, pw->newPassword = NULL; pw->newPasswordSz = 0; } - + if (ssh->ctx->userAuthCb != NULL) { WLOG(WS_LOG_DEBUG, "DUARPW: Calling the userauth callback"); ret = ssh->ctx->userAuthCb(WOLFSSH_USERAUTH_PASSWORD, @@ -3803,6 +3805,11 @@ static int DoUserAuthRequest(WOLFSSH* ssh, ret = SendUserAuthFailure(ssh, 0); } + if (ret == WS_SUCCESS) { + ret = wolfSSH_SetUsernameRaw(ssh, + authData.username, authData.usernameSz); + } + *idx = begin; } @@ -8328,20 +8335,23 @@ int SendChannelRequest(WOLFSSH* ssh, byte* name, word32 nameSz) #ifdef WOLFSSH_TERM -/* sets terminal mode in buffer and advances idx */ -static void TTYSet(word32 isSet, int type, byte* out, word32* idx) -{ - if (isSet) isSet = 1; - out[*idx] = type; *idx += 1; - c32toa(isSet, out + *idx); *idx += UINT32_SZ; -} +#if !defined(USE_WINDOWS_API) && !defined(MICROCHIP_PIC32) && \ + !defined(NO_TERMIOS) + /* sets terminal mode in buffer and advances idx */ + static void TTYSet(word32 isSet, int type, byte* out, word32* idx) + { + if (isSet) isSet = 1; + out[*idx] = type; *idx += 1; + c32toa(isSet, out + *idx); *idx += UINT32_SZ; + } -static void TTYCharSet(char flag, int type, byte* out, word32* idx) -{ - out[*idx] = type; *idx += 1; - c32toa(flag, out + *idx); *idx += UINT32_SZ; -} + static void TTYCharSet(char flag, int type, byte* out, word32* idx) + { + out[*idx] = type; *idx += 1; + c32toa(flag, out + *idx); *idx += UINT32_SZ; + } +#endif /* !USE_WINDOWS_API && !MICROCHIP_PIC32 && !NO_TERMIOS*/ /* create terminal mode string for pseudo-terminal request @@ -8349,110 +8359,107 @@ static void TTYCharSet(char flag, int type, byte* out, word32* idx) static int CreateMode(WOLFSSH* ssh, byte* mode) { word32 idx = 0; -#ifndef NO_TERMIOS - WOLFSSH_TERMIOS term; -#endif + int baud = 38400; /* default speed */ - int buad = 38400; /* default speed */ + #if !defined(USE_WINDOWS_API) && !defined(MICROCHIP_PIC32) && \ + !defined(NO_TERMIOS) + { + WOLFSSH_TERMIOS term; -#if !defined(USE_WINDOWS_API) && !defined(MICROCHIP_PIC32) && \ - !defined(NO_TERMIOS) - if (tcgetattr(STDIN_FILENO, &term) != 0) { - printf("Couldn't get the original terminal settings.\n"); - return -1; + if (tcgetattr(STDIN_FILENO, &term) != 0) { + printf("Couldn't get the original terminal settings.\n"); + return -1; + } + + /* set baud rate */ + baud = (int)cfgetospeed(&term); + + /* char type */ + TTYCharSet(term.c_cc[VINTR], WOLFSSH_VINTR, mode, &idx); + TTYCharSet(term.c_cc[VQUIT], WOLFSSH_VQUIT, mode, &idx); + TTYCharSet(term.c_cc[VERASE], WOLFSSH_VERASE, mode, &idx); + TTYCharSet(term.c_cc[VKILL], WOLFSSH_VKILL, mode, &idx); + TTYCharSet(term.c_cc[VEOF], WOLFSSH_VEOF, mode, &idx); + TTYCharSet(term.c_cc[VEOL], WOLFSSH_VEOL, mode, &idx); + TTYCharSet(term.c_cc[VEOL2], WOLFSSH_VEOL2, mode, &idx); + TTYCharSet(term.c_cc[VSTART], WOLFSSH_VSTART, mode, &idx); + TTYCharSet(term.c_cc[VSTOP], WOLFSSH_VSTOP, mode, &idx); + TTYCharSet(term.c_cc[VSUSP], WOLFSSH_VSUSP, mode, &idx); + #ifdef VDSUSP + TTYCharSet(term.c_cc[VDSUSP], WOLFSSH_VDSUSP, mode, &idx); + #endif + TTYCharSet(term.c_cc[VREPRINT], WOLFSSH_VREPRINT, mode, &idx); + TTYCharSet(term.c_cc[VWERASE], WOLFSSH_VWERASE, mode, &idx); + TTYCharSet(term.c_cc[VLNEXT], WOLFSSH_VLNEXT, mode, &idx); + #ifdef VFLUSH + TTYCharSet(term.c_cc[VFLUSH], WOLFSSH_VFLUSH, mode, &idx); + #endif + #ifdef VSWTCH + TTYCharSet(term.c_cc[VSWTCH], WOLFSSH_VSWTCH, mode, &idx); + #endif + #ifdef VSTATUS + TTYCharSet(term.c_cc[VSTATUS], WOLFSSH_VSTATUS, mode, &idx); + #endif + TTYCharSet(term.c_cc[VDISCARD], WOLFSSH_VDISCARD, mode, &idx); + + /* c_iflag for input modes */ + TTYSet((term.c_iflag & IGNPAR), WOLFSSH_IGNPAR, mode, &idx); + TTYSet((term.c_iflag & PARMRK), WOLFSSH_PARMRK, mode, &idx); + TTYSet((term.c_iflag & INPCK), WOLFSSH_INPCK, mode, &idx); + TTYSet((term.c_iflag & ISTRIP), WOLFSSH_ISTRIP, mode, &idx); + TTYSet((term.c_iflag & INLCR), WOLFSSH_INLCR, mode, &idx); + TTYSet((term.c_iflag & IGNCR), WOLFSSH_IGNCR, mode, &idx); + TTYSet((term.c_iflag & ICRNL), WOLFSSH_ICRNL, mode, &idx); + #ifdef IUCLC + TTYSet((term.c_iflag & IUCLC), WOLFSSH_IUCLC, mode, &idx); + #endif + TTYSet((term.c_iflag & IXON), WOLFSSH_IXON, mode, &idx); + TTYSet((term.c_iflag & IXANY), WOLFSSH_IXANY, mode, &idx); + TTYSet((term.c_iflag & IXOFF), WOLFSSH_IXOFF, mode, &idx); + TTYSet((term.c_iflag & IMAXBEL), WOLFSSH_IMAXBEL, mode, &idx); + + /* c_lflag */ + TTYSet((term.c_lflag & ISIG), WOLFSSH_ISIG, mode, &idx); + TTYSet((term.c_lflag & ICANON), WOLFSSH_ICANON, mode, &idx); + #ifdef XCASE + TTYSet((term.c_lflag & XCASE), WOLFSSH_XCASE, mode, &idx); + #endif + TTYSet((term.c_lflag & ECHO), WOLFSSH_ECHO, mode, &idx); + TTYSet((term.c_lflag & ECHOE), WOLFSSH_ECHOE, mode, &idx); + TTYSet((term.c_lflag & ECHOK), WOLFSSH_ECHOK, mode, &idx); + TTYSet((term.c_lflag & ECHONL), WOLFSSH_ECHONL, mode, &idx); + TTYSet((term.c_lflag & NOFLSH), WOLFSSH_NOFLSH, mode, &idx); + TTYSet((term.c_lflag & TOSTOP), WOLFSSH_TOSTOP, mode, &idx); + TTYSet((term.c_lflag & IEXTEN), WOLFSSH_IEXTEN, mode, &idx); + TTYSet((term.c_lflag & ECHOCTL), WOLFSSH_ECHOCTL, mode, &idx); + TTYSet((term.c_lflag & ECHOKE), WOLFSSH_ECHOKE, mode, &idx); + #ifdef PENDIN + TTYSet((term.c_lflag & PENDIN), WOLFSSH_PENDIN, mode, &idx); + #endif + + /* c_oflag */ + TTYSet((term.c_oflag & OPOST), WOLFSSH_OPOST, mode, &idx); + #ifdef OLCUC + TTYSet((term.c_oflag & OLCUC), WOLFSSH_OLCUC, mode, &idx); + #endif + TTYSet((term.c_oflag & ONLCR), WOLFSSH_ONLCR, mode, &idx); + TTYSet((term.c_oflag & OCRNL), WOLFSSH_OCRNL, mode, &idx); + TTYSet((term.c_oflag & ONOCR), WOLFSSH_ONOCR, mode, &idx); + TTYSet((term.c_oflag & ONLRET), WOLFSSH_ONLRET, mode, &idx); + + /* c_cflag */ + TTYSet((term.c_cflag & CS7), WOLFSSH_CS7, mode, &idx); + TTYSet((term.c_cflag & CS8), WOLFSSH_CS8, mode, &idx); + TTYSet((term.c_cflag & PARENB), WOLFSSH_PARENB, mode, &idx); + TTYSet((term.c_cflag & PARODD), WOLFSSH_PARODD, mode, &idx); } - - /* set baud rate */ - buad = (int)cfgetospeed(&term); - - /* char type */ - TTYCharSet(term.c_cc[VINTR], WOLFSSH_VINTR, mode, &idx); - TTYCharSet(term.c_cc[VQUIT], WOLFSSH_VQUIT, mode, &idx); - TTYCharSet(term.c_cc[VERASE], WOLFSSH_VERASE, mode, &idx); - TTYCharSet(term.c_cc[VKILL], WOLFSSH_VKILL, mode, &idx); - TTYCharSet(term.c_cc[VEOF], WOLFSSH_VEOF, mode, &idx); - TTYCharSet(term.c_cc[VEOL], WOLFSSH_VEOL, mode, &idx); - TTYCharSet(term.c_cc[VEOL2], WOLFSSH_VEOL2, mode, &idx); - TTYCharSet(term.c_cc[VSTART], WOLFSSH_VSTART, mode, &idx); - TTYCharSet(term.c_cc[VSTOP], WOLFSSH_VSTOP, mode, &idx); - TTYCharSet(term.c_cc[VSUSP], WOLFSSH_VSUSP, mode, &idx); -#ifdef VDSUSP - TTYCharSet(term.c_cc[VDSUSP], WOLFSSH_VDSUSP, mode, &idx); -#endif - TTYCharSet(term.c_cc[VREPRINT], WOLFSSH_VREPRINT, mode, &idx); - TTYCharSet(term.c_cc[VWERASE], WOLFSSH_VWERASE, mode, &idx); - TTYCharSet(term.c_cc[VLNEXT], WOLFSSH_VLNEXT, mode, &idx); -#ifdef VFLUSH - TTYCharSet(term.c_cc[VFLUSH], WOLFSSH_VFLUSH, mode, &idx); -#endif -#ifdef VSWTCH - TTYCharSet(term.c_cc[VSWTCH], WOLFSSH_VSWTCH, mode, &idx); -#endif -#ifdef VSTATUS - TTYCharSet(term.c_cc[VSTATUS], WOLFSSH_VSTATUS, mode, &idx); -#endif - TTYCharSet(term.c_cc[VDISCARD], WOLFSSH_VDISCARD, mode, &idx); - - - /* c_iflag for input modes */ - TTYSet((term.c_iflag & IGNPAR), WOLFSSH_IGNPAR, mode, &idx); - TTYSet((term.c_iflag & PARMRK), WOLFSSH_PARMRK, mode, &idx); - TTYSet((term.c_iflag & INPCK), WOLFSSH_INPCK, mode, &idx); - TTYSet((term.c_iflag & ISTRIP), WOLFSSH_ISTRIP, mode, &idx); - TTYSet((term.c_iflag & INLCR), WOLFSSH_INLCR, mode, &idx); - TTYSet((term.c_iflag & IGNCR), WOLFSSH_IGNCR, mode, &idx); - TTYSet((term.c_iflag & ICRNL), WOLFSSH_ICRNL, mode, &idx); -#ifdef IUCLC - TTYSet((term.c_iflag & IUCLC), WOLFSSH_IUCLC, mode, &idx); -#endif - TTYSet((term.c_iflag & IXON), WOLFSSH_IXON, mode, &idx); - TTYSet((term.c_iflag & IXANY), WOLFSSH_IXANY, mode, &idx); - TTYSet((term.c_iflag & IXOFF), WOLFSSH_IXOFF, mode, &idx); - TTYSet((term.c_iflag & IMAXBEL), WOLFSSH_IMAXBEL, mode, &idx); - - /* c_lflag */ - TTYSet((term.c_lflag & ISIG), WOLFSSH_ISIG, mode, &idx); - TTYSet((term.c_lflag & ICANON), WOLFSSH_ICANON, mode, &idx); -#ifdef XCASE - TTYSet((term.c_lflag & XCASE), WOLFSSH_XCASE, mode, &idx); -#endif - TTYSet((term.c_lflag & ECHO), WOLFSSH_ECHO, mode, &idx); - TTYSet((term.c_lflag & ECHOE), WOLFSSH_ECHOE, mode, &idx); - TTYSet((term.c_lflag & ECHOK), WOLFSSH_ECHOK, mode, &idx); - TTYSet((term.c_lflag & ECHONL), WOLFSSH_ECHONL, mode, &idx); - TTYSet((term.c_lflag & NOFLSH), WOLFSSH_NOFLSH, mode, &idx); - TTYSet((term.c_lflag & TOSTOP), WOLFSSH_TOSTOP, mode, &idx); - TTYSet((term.c_lflag & IEXTEN), WOLFSSH_IEXTEN, mode, &idx); - TTYSet((term.c_lflag & ECHOCTL), WOLFSSH_ECHOCTL, mode, &idx); - TTYSet((term.c_lflag & ECHOKE), WOLFSSH_ECHOKE, mode, &idx); -#ifdef PENDIN - TTYSet((term.c_lflag & PENDIN), WOLFSSH_PENDIN, mode, &idx); -#endif - - /* c_oflag */ - TTYSet((term.c_oflag & OPOST), WOLFSSH_OPOST, mode, &idx); -#ifdef OLCUC - TTYSet((term.c_oflag & OLCUC), WOLFSSH_OLCUC, mode, &idx); -#endif - TTYSet((term.c_oflag & ONLCR), WOLFSSH_ONLCR, mode, &idx); - TTYSet((term.c_oflag & OCRNL), WOLFSSH_OCRNL, mode, &idx); - TTYSet((term.c_oflag & ONOCR), WOLFSSH_ONOCR, mode, &idx); - TTYSet((term.c_oflag & ONLRET), WOLFSSH_ONLRET, mode, &idx); - - /* c_cflag */ - TTYSet((term.c_cflag & CS7), WOLFSSH_CS7, mode, &idx); - TTYSet((term.c_cflag & CS8), WOLFSSH_CS8, mode, &idx); - TTYSet((term.c_cflag & PARENB), WOLFSSH_PARENB, mode, &idx); - TTYSet((term.c_cflag & PARODD), WOLFSSH_PARODD, mode, &idx); -#endif /* !USE_WINDOWS_API && !MICROCHIP_PIC32 */ - + #endif /* !USE_WINDOWS_API && !MICROCHIP_PIC32 && !NO_TERMIOS */ mode[idx++] = WOLFSSH_TTY_OP_OSPEED; - c32toa(buad, mode + idx); idx += UINT32_SZ; + c32toa(baud, mode + idx); idx += UINT32_SZ; mode[idx++] = WOLFSSH_TTY_OP_ISPEED; - c32toa(buad, mode + idx); idx += UINT32_SZ; + c32toa(baud, mode + idx); idx += UINT32_SZ; - (void)term; (void)ssh; mode[idx++] = WOLFSSH_TTY_OP_END; return idx; diff --git a/src/ssh.c b/src/ssh.c index b5d52db..21bd32e 100644 --- a/src/ssh.c +++ b/src/ssh.c @@ -1191,41 +1191,64 @@ int wolfSSH_SetChannelType(WOLFSSH* ssh, byte type, byte* name, word32 nameSz) return WS_SUCCESS; } -int wolfSSH_SetUsername(WOLFSSH* ssh, const char* username) + +int wolfSSH_SetUsernameRaw(WOLFSSH* ssh, + const byte* username, word32 usernameSz) { - char* value = NULL; - word32 valueSz = 0; + char* newUsername = NULL; int ret = WS_SUCCESS; - if (ssh == NULL || ssh->handshake == NULL || - ssh->ctx->side == WOLFSSH_ENDPOINT_SERVER || - username == NULL) { - + if (ssh == NULL) + ret = WS_BAD_ARGUMENT; + if (username == NULL || usernameSz == 0) ret = WS_BAD_ARGUMENT; - } if (ret == WS_SUCCESS) { - valueSz = (word32)WSTRLEN(username); - if (valueSz > 0) - value = (char*)WMALLOC(valueSz + 1, ssh->ctx->heap, DYNTYPE_STRING); - if (value == NULL) + newUsername = (char*)WMALLOC(usernameSz + 1, + ssh->ctx->heap, DYNTYPE_STRING); + if (newUsername == NULL) ret = WS_MEMORY_E; - } - - if (ret == WS_SUCCESS) { - WSTRNCPY(value, username, valueSz + 1); - if (ssh->userName != NULL) { - WFREE(ssh->userName, ssh->ctx->heap, DYNTYPE_STRING); - ssh->userName = NULL; + else { + WMEMCPY(newUsername, username, usernameSz); + newUsername[usernameSz] = 0; + if (ssh->userName != NULL) + WFREE(ssh->userName, ssh->ctx->heap, DYNTYPE_STRING); + ssh->userName = newUsername; + ssh->userNameSz = usernameSz; } - ssh->userName = value; - ssh->userNameSz = valueSz; } return ret; } +int wolfSSH_SetUsername(WOLFSSH* ssh, const char* username) +{ + int ret = WS_SUCCESS; + + if (ssh == NULL || username == NULL) + ret = WS_BAD_ARGUMENT; + + if (ret == WS_SUCCESS) { + ret = wolfSSH_SetUsernameRaw(ssh, + (const byte*)username, (word32)WSTRLEN(username)); + } + + return ret; +} + + +char* wolfSSH_GetUsername(WOLFSSH* ssh) +{ + char* name = NULL; + + if (ssh != NULL) + name = ssh->userName; + + return name; +} + + int wolfSSH_CTX_SetBanner(WOLFSSH_CTX* ctx, const char* newBanner) { diff --git a/tests/api.c b/tests/api.c index 1ae93f8..39ed412 100644 --- a/tests/api.c +++ b/tests/api.c @@ -419,13 +419,14 @@ static void test_wolfSSH_SetUsername(void) WOLFSSH* ssh; const char username[] = "johnny"; const char empty[] = ""; - + const char* name = NULL; AssertIntNE(WS_SUCCESS, wolfSSH_SetUsername(NULL, NULL)); + AssertIntNE(WS_SUCCESS, wolfSSH_SetUsernameRaw(NULL, NULL, 0)); AssertNotNull(ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_SERVER, NULL)); AssertNotNull(ssh = wolfSSH_new(ctx)); - AssertIntNE(WS_SUCCESS, wolfSSH_SetUsername(ssh, username)); + AssertIntEQ(WS_SUCCESS, wolfSSH_SetUsername(ssh, username)); wolfSSH_free(ssh); wolfSSH_CTX_free(ctx); @@ -433,9 +434,19 @@ static void test_wolfSSH_SetUsername(void) AssertNotNull(ssh = wolfSSH_new(ctx)); AssertIntNE(WS_SUCCESS, wolfSSH_SetUsername(ssh, NULL)); AssertIntNE(WS_SUCCESS, wolfSSH_SetUsername(ssh, empty)); + AssertIntNE(WS_SUCCESS, wolfSSH_SetUsernameRaw(ssh, NULL, 0)); + AssertIntNE(WS_SUCCESS, wolfSSH_SetUsernameRaw(ssh, NULL, 23)); + AssertIntNE(WS_SUCCESS, wolfSSH_SetUsernameRaw(ssh, + (const byte*)empty, 0)); + AssertIntNE(WS_SUCCESS, wolfSSH_SetUsernameRaw(ssh, + (const byte*)username, 0)); wolfSSH_free(ssh); AssertNotNull(ssh = wolfSSH_new(ctx)); AssertIntEQ(WS_SUCCESS, wolfSSH_SetUsername(ssh, username)); + AssertIntEQ(WS_SUCCESS, wolfSSH_SetUsernameRaw(ssh, + (const byte*)username, (word32)strlen(username))); + AssertNotNull((name = wolfSSH_GetUsername(ssh))); + AssertIntEQ(0, strcmp(username, name)); wolfSSH_free(ssh); wolfSSH_CTX_free(ctx); #endif /* WOLFSSH_NO_CLIENT */ diff --git a/wolfssh/certs_test.h b/wolfssh/certs_test.h index 975a580..40228ee 100644 --- a/wolfssh/certs_test.h +++ b/wolfssh/certs_test.h @@ -21,7 +21,7 @@ #ifndef WOLFSSL_CERTS_TEST_H #define WOLFSSL_CERTS_TEST_H -#ifdef NO_FILESYSTEM +#if defined(NO_FILESYSTEM) /* ./keys/server-key-rsa.der, 2048-bit */ static const unsigned char rsa_key_der_2048[] = diff --git a/wolfssh/port.h b/wolfssh/port.h index e3ded84..cee4649 100644 --- a/wolfssh/port.h +++ b/wolfssh/port.h @@ -222,7 +222,11 @@ extern "C" { #define WFTELL(s) ftell((s)) #define WREWIND(s) rewind((s)) #define WSEEK_END SEEK_END - #define WUTIMES(f,t) utimes((f),(t)) + #ifdef WOLFSSL_VXWORKS + #define WUTIMES(f,t) (WS_SUCCESS) + #else + #define WUTIMES(f,t) utimes((f),(t)) + #endif #ifndef USE_WINDOWS_API #define WCHMOD(fs,f,m) chmod((f),(m)) @@ -262,8 +266,12 @@ extern "C" { #else #include #include - #define WCHDIR(p) chdir((p)) - #define WMKDIR(fs,p,m) mkdir((p),(m)) + #define WCHDIR(p) chdir((p)) + #ifdef WOLFSSL_VXWORKS + #define WMKDIR(fs,p,m) mkdir((p)) + #else + #define WMKDIR(fs,p,m) mkdir((p),(m)) + #endif #endif #endif #endif @@ -271,7 +279,11 @@ extern "C" { /* setup string handling */ #ifndef WSTRING_USER - #include + #ifdef WOLFSSL_VXWORKS + #include + #else + #include + #endif WOLFSSH_API char* wstrnstr(const char*, const char*, unsigned int); WOLFSSH_API char* wstrncat(char*, const char*, size_t); @@ -306,7 +318,7 @@ extern "C" { #define WSTRNCASECMP(s1,s2,n) strncasecmp((s1),(s2),(n)) #define WSNPRINTF(s,n,f,...) snprintf((s),(n),(f),__VA_ARGS__) #define WVSNPRINTF(s,n,f,...) vsnprintf((s),(n),(f),__VA_ARGS__) - #else + #else #ifndef FREESCALE_MQX #include #endif @@ -1093,6 +1105,10 @@ extern "C" { #elif defined(USE_WINDOWS_API) #define WFIONREAD FIONREAD #define WIOCTL ioctlsocket +#elif defined(WOLFSSL_VXWORKS) + #include "ioLib.h" + #include + #define WIOCTL ioctl #else #if defined(__CYGWIN__) && !defined(FIONREAD) /* Cygwin defines FIONREAD in socket.h instead of ioctl.h */ diff --git a/wolfssh/ssh.h b/wolfssh/ssh.h index fa6d9bd..d9db04b 100644 --- a/wolfssh/ssh.h +++ b/wolfssh/ssh.h @@ -175,7 +175,9 @@ WOLFSSH_API void wolfSSH_CTX_SetPublicKeyCheck(WOLFSSH_CTX*, WOLFSSH_API void wolfSSH_SetPublicKeyCheckCtx(WOLFSSH*, void*); WOLFSSH_API void* wolfSSH_GetPublicKeyCheckCtx(WOLFSSH*); +WOLFSSH_API int wolfSSH_SetUsernameRaw(WOLFSSH*, const byte*, word32); WOLFSSH_API int wolfSSH_SetUsername(WOLFSSH*, const char*); +WOLFSSH_API char* wolfSSH_GetUsername(WOLFSSH*); WOLFSSH_API int wolfSSH_CTX_SetBanner(WOLFSSH_CTX*, const char*); WOLFSSH_API int wolfSSH_CTX_UsePrivateKey_buffer(WOLFSSH_CTX*, diff --git a/wolfssh/test.h b/wolfssh/test.h index 0bdb3fe..6cbf0b3 100644 --- a/wolfssh/test.h +++ b/wolfssh/test.h @@ -40,6 +40,33 @@ #endif #define SOCKET_T SOCKET #define NUM_SOCKETS 5 +#elif defined(WOLFSSL_VXWORKS) + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define SOCKET_T int + + /*#define SINGLE_THREADED*/ + + #ifndef STDIN_FILENO + #define STDIN_FILENO 0 + #endif + #ifndef STDOUT_FILENO + #define STDOUT_FILENO 1 + #endif + #ifndef STDERR_FILENO + #define STDERR_FILENO 2 + #endif + #define NUM_SOCKETS 2 #elif defined(MICROCHIP_MPLAB_HARMONY) || defined(MICROCHIP_TCPIP) #include "tcpip/tcpip.h" #include @@ -173,6 +200,7 @@ #else /* TEST_IPV6 */ static const char* const wolfSshIp = "::1"; #endif /* TEST_IPV6 */ + #ifdef WOLFSSL_NUCLEUS /* port 8080 was open with QEMU */ static const word16 wolfSshPort = 8080; @@ -186,6 +214,13 @@ #define WS_NORETURN #endif +#ifdef WOLFSSL_VXWORKS +static INLINE void err_sys(const char* msg) +{ + printf("wolfSSH error: %s\n", msg); + return; +} +#else static INLINE WS_NORETURN void err_sys(const char* msg) { printf("wolfSSH error: %s\n", msg); @@ -203,7 +238,7 @@ static INLINE WS_NORETURN void err_sys(const char* msg) exit(EXIT_FAILURE); } } - +#endif #define MY_EX_USAGE 2 @@ -772,7 +807,16 @@ static INLINE void ThreadStart(THREAD_FUNC fun, void* args, THREAD_TYPE* thread) (void)args; (void)thread; #elif defined(_POSIX_THREADS) && !defined(__MINGW32__) - pthread_create(thread, 0, fun, args); + #ifdef WOLFSSL_VXWORKS + { + pthread_attr_t myattr; + pthread_attr_init(&myattr); + pthread_attr_setstacksize(&myattr, 0x10000); + pthread_create(thread, &myattr, fun, args); + } + #else + pthread_create(thread, 0, fun, args); + #endif return; #elif defined(WOLFSSL_TIRTOS) /* Initialize the defaults and set the parameters. */