scp modifications from embedded port

pull/56/head
Chris Conlon 2018-05-23 16:54:17 -06:00
parent 5a8642673b
commit a6e8c59b97
4 changed files with 80 additions and 29 deletions

View File

@ -215,6 +215,9 @@ const char* GetErrorString(int err)
case WS_SCP_COMPLETE: case WS_SCP_COMPLETE:
return "scp operation complete"; return "scp operation complete";
case WS_SCP_INIT:
return "scp operation verified";
default: default:
return "Unknown error code"; return "Unknown error code";
} }
@ -330,10 +333,11 @@ WOLFSSH_CTX* CtxInit(WOLFSSH_CTX* ctx, byte side, void* heap)
#endif /* WOLFSSH_USER_IO */ #endif /* WOLFSSH_USER_IO */
ctx->highwaterMark = DEFAULT_HIGHWATER_MARK; ctx->highwaterMark = DEFAULT_HIGHWATER_MARK;
ctx->highwaterCb = wsHighwater; ctx->highwaterCb = wsHighwater;
#ifdef WOLFSSH_SCP #if defined(WOLFSSH_SCP) && !defined(WOLFSSH_SCP_USER_CALLBACKS) && \
!defined(NO_FILESYSTEM)
ctx->scpRecvCb = wsScpRecvCallback; ctx->scpRecvCb = wsScpRecvCallback;
ctx->scpSendCb = wsScpSendCallback; ctx->scpSendCb = wsScpSendCallback;
#endif #endif /* WOLFSSH_SCP */
#ifdef DEBUG_WOLFSSH #ifdef DEBUG_WOLFSSH
ctx->banner = cannedBanner; ctx->banner = cannedBanner;
ctx->bannerSz = cannedBannerSz; ctx->bannerSz = cannedBannerSz;
@ -356,6 +360,11 @@ void CtxResourceFree(WOLFSSH_CTX* ctx)
WOLFSSH* SshInit(WOLFSSH* ssh, WOLFSSH_CTX* ctx) WOLFSSH* SshInit(WOLFSSH* ssh, WOLFSSH_CTX* ctx)
{ {
#if defined(STM32F2) || defined(STM32F4)
/* avoid name conflict in "stm32fnnnxx.h" */
#undef RNG
#define RNG WC_RNG
#endif
HandshakeInfo* handshake; HandshakeInfo* handshake;
RNG* rng; RNG* rng;
void* heap; void* heap;
@ -2134,7 +2143,7 @@ static int DoKexDhReply(WOLFSSH* ssh, byte* buf, word32 len, word32* idx)
{ {
byte* pubKey = NULL; byte* pubKey = NULL;
word32 pubKeySz; word32 pubKeySz;
byte* f; byte* f = NULL;
word32 fSz; word32 fSz;
byte* sig; byte* sig;
word32 sigSz; word32 sigSz;
@ -2920,7 +2929,7 @@ static int DoUserAuthRequestRsa(WOLFSSH* ssh, WS_UserAuthData_PublicKey* pk,
word32 publicKeyTypeSz = 0; word32 publicKeyTypeSz = 0;
byte* n; byte* n;
word32 nSz = 0; word32 nSz = 0;
byte* e; byte* e = NULL;
word32 eSz = 0; word32 eSz = 0;
word32 i = 0; word32 i = 0;
int ret = WS_SUCCESS; int ret = WS_SUCCESS;
@ -3039,7 +3048,7 @@ static int DoUserAuthRequestEcc(WOLFSSH* ssh, WS_UserAuthData_PublicKey* pk,
byte* curveName; byte* curveName;
word32 curveNameSz = 0; word32 curveNameSz = 0;
mp_int r, s; mp_int r, s;
byte* q; byte* q = NULL;
word32 sz, qSz; word32 sz, qSz;
word32 i = 0; word32 i = 0;
int ret = WS_SUCCESS; int ret = WS_SUCCESS;
@ -4784,13 +4793,13 @@ static const word32 cannedNoneNamesSz = sizeof(cannedNoneNames) - 1;
int SendKexInit(WOLFSSH* ssh) int SendKexInit(WOLFSSH* ssh)
{ {
byte* output; byte* output = NULL;
byte* payload; byte* payload = NULL;
word32 idx = 0; word32 idx = 0;
word32 payloadSz; word32 payloadSz = 0;
int ret = WS_SUCCESS; int ret = WS_SUCCESS;
const char* cannedKeyAlgoNames; const char* cannedKeyAlgoNames = NULL;
word32 cannedKeyAlgoNamesSz; word32 cannedKeyAlgoNamesSz = 0;
WLOG(WS_LOG_DEBUG, "Entering SendKexInit()"); WLOG(WS_LOG_DEBUG, "Entering SendKexInit()");

View File

@ -597,14 +597,14 @@ int wolfSSH_shutdown(WOLFSSH* ssh)
WLOG(WS_LOG_DEBUG, "Entering wolfSSH_shutdown()"); WLOG(WS_LOG_DEBUG, "Entering wolfSSH_shutdown()");
if (ssh == NULL) if (ssh == NULL || ssh->channelList == NULL)
ret = WS_BAD_ARGUMENT; ret = WS_BAD_ARGUMENT;
if (ret == WS_SUCCESS) if (ret == WS_SUCCESS)
ret = SendChannelEof(ssh, 0); ret = SendChannelEof(ssh, ssh->channelList->peerChannel);
if (ret == WS_SUCCESS) if (ret == WS_SUCCESS)
ret = SendChannelClose(ssh, 0); ret = SendChannelClose(ssh, ssh->channelList->peerChannel);
if (ret == WS_SUCCESS) if (ret == WS_SUCCESS)
ret = SendDisconnect(ssh, WOLFSSH_DISCONNECT_BY_APPLICATION); ret = SendDisconnect(ssh, WOLFSSH_DISCONNECT_BY_APPLICATION);

View File

@ -466,7 +466,7 @@ int DoScpSource(WOLFSSH* ssh)
ssh->scpNextState = SCP_DONE; ssh->scpNextState = SCP_DONE;
continue; continue;
} else if (ssh->scpConfirm > 0) { } else if (ssh->scpConfirm >= 0) {
/* transfer buffered file data */ /* transfer buffered file data */
ssh->scpBufferedSz = ssh->scpConfirm; ssh->scpBufferedSz = ssh->scpConfirm;
@ -654,13 +654,19 @@ int DoScpRequest(WOLFSSH* ssh)
case SCP_SINK: case SCP_SINK:
WLOG(WS_LOG_DEBUG, scpState, "SCP_SINK"); WLOG(WS_LOG_DEBUG, scpState, "SCP_SINK");
ret = DoScpSink(ssh); if ( (ssh->error = DoScpSink(ssh)) < WS_SUCCESS) {
break; WLOG(WS_LOG_ERROR, scpError, "SCP_SINK", ssh->error);
ret = WS_FATAL_ERROR;
break;
}
case SCP_SOURCE: case SCP_SOURCE:
WLOG(WS_LOG_DEBUG, scpState, "SCP_SOURCE"); WLOG(WS_LOG_DEBUG, scpState, "SCP_SOURCE");
ret = DoScpSource(ssh); if ( (ssh->error = DoScpSource(ssh)) < WS_SUCCESS) {
break; WLOG(WS_LOG_ERROR, scpError, "SCP_SOURCE", ssh->error);
ret = WS_FATAL_ERROR;
break;
}
} }
} }
@ -745,10 +751,16 @@ static int GetScpFileMode(WOLFSSH* ssh, byte* buf, word32 bufSz,
word32* inOutIdx) word32* inOutIdx)
{ {
int ret; int ret;
mp_int tmp;
word32 idx; word32 idx;
byte modeOctet[SCP_MODE_OCTET_LEN]; byte modeOctet[SCP_MODE_OCTET_LEN];
#if defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) || \
defined(WOLFSSL_DEBUG_MATH) || defined(DEBUG_WOLFSSL) || \
defined(WOLFSSL_PUBLIC_MP)
mp_int tmp;
char decimalString[SCP_MODE_OCTET_LEN + 1]; char decimalString[SCP_MODE_OCTET_LEN + 1];
#else
int mode, i;
#endif
if (ssh == NULL || buf == NULL || inOutIdx == NULL || if (ssh == NULL || buf == NULL || inOutIdx == NULL ||
bufSz < (SCP_MODE_OCTET_LEN + 1)) bufSz < (SCP_MODE_OCTET_LEN + 1))
@ -764,6 +776,9 @@ static int GetScpFileMode(WOLFSSH* ssh, byte* buf, word32 bufSz,
WMEMCPY(modeOctet, buf + idx, sizeof(modeOctet)); WMEMCPY(modeOctet, buf + idx, sizeof(modeOctet));
idx += SCP_MODE_OCTET_LEN; idx += SCP_MODE_OCTET_LEN;
#if defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) || \
defined(WOLFSSL_DEBUG_MATH) || defined(DEBUG_WOLFSSL) || \
defined(WOLFSSL_PUBLIC_MP)
ret = mp_init(&tmp); ret = mp_init(&tmp);
if (ret == MP_OKAY) { if (ret == MP_OKAY) {
ret = mp_read_radix(&tmp, (const char*)modeOctet, 8); ret = mp_read_radix(&tmp, (const char*)modeOctet, 8);
@ -789,6 +804,31 @@ static int GetScpFileMode(WOLFSSH* ssh, byte* buf, word32 bufSz,
} }
mp_clear(&tmp); mp_clear(&tmp);
#else
ret = WS_SUCCESS;
/* convert octal string to int without mp_read_radix() */
mode = 0;
for (i = 0; i < SCP_MODE_OCTET_LEN; i++)
{
if (modeOctet[i] < '0' || modeOctet[0] > '7') {
ret = WS_BAD_ARGUMENT;
break;
}
mode <<= 3;
mode |= (modeOctet[i] - '0');
}
if (ret == WS_SUCCESS) {
/* store file mode */
ssh->scpFileMode = mode;
/* eat trailing space */
if (bufSz >= (word32)(idx +1))
idx++;
ret = WS_SUCCESS;
*inOutIdx = idx;
}
#endif
return ret; return ret;
} }
@ -1491,13 +1531,14 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
WFCLOSE(fp); WFCLOSE(fp);
/* set timestamp info */ /* set timestamp info */
if (mTime != 0 || aTime != 0) if (mTime != 0 || aTime != 0) {
ret = SetTimestampInfo(fileName, mTime, aTime); ret = SetTimestampInfo(fileName, mTime, aTime);
if (ret == WS_SUCCESS) { if (ret == WS_SUCCESS) {
ret = WS_SCP_CONTINUE; ret = WS_SCP_CONTINUE;
} else { } else {
ret = WS_SCP_ABORT; ret = WS_SCP_ABORT;
}
} }
break; break;
@ -1523,7 +1564,7 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
case WOLFSSH_SCP_END_DIR: case WOLFSSH_SCP_END_DIR:
/* cd out of directory */ /* cd out of directory */
if (WCHDIR("../") != 0) { if (WCHDIR("..") != 0) {
wolfSSH_SetScpErrorMsg(ssh, "unable to cd out of directory"); wolfSSH_SetScpErrorMsg(ssh, "unable to cd out of directory");
ret = WS_SCP_ABORT; ret = WS_SCP_ABORT;
} }
@ -1545,8 +1586,8 @@ static int ExtractFileName(const char* filePath, char* fileName,
word32 fileNameSz) word32 fileNameSz)
{ {
int ret = WS_SUCCESS; int ret = WS_SUCCESS;
word32 pathLen, fileLen; word32 fileLen;
word32 idx = 0, separator = 0; int idx = 0, pathLen, separator = -1;
if (filePath == NULL || fileName == NULL) if (filePath == NULL || fileName == NULL)
return WS_BAD_ARGUMENT; return WS_BAD_ARGUMENT;
@ -1560,7 +1601,7 @@ static int ExtractFileName(const char* filePath, char* fileName,
idx++; idx++;
} }
if (separator == 0) if (separator < 0)
return WS_BAD_ARGUMENT; return WS_BAD_ARGUMENT;
fileLen = pathLen - separator - 1; fileLen = pathLen - separator - 1;

View File

@ -86,8 +86,9 @@ enum WS_ErrorCodes {
WS_SCP_EXIT_DIR = -46, WS_SCP_EXIT_DIR = -46,
WS_SCP_EXIT_DIR_FINAL = -47, WS_SCP_EXIT_DIR_FINAL = -47,
WS_SCP_COMPLETE = -48, /* SCP transfer complete */ WS_SCP_COMPLETE = -48, /* SCP transfer complete */
WS_SCP_INIT = -49, /* SCP transfer verified */
WS_LAST_E = -48 /* Update this to indicate last error */ WS_LAST_E = -49 /* Update this to indicate last error */
}; };