Unify coding style
@sjaeckel integrated clang-format with formal coding style. Run his script and commit changes. There are pros and cons of this commit. Mixed coding style is a "broken window". A good single style simplifies reading and writing code. On the other hand, this is a big change which will lead to conflicts.
This commit is contained in:
@@ -84,13 +84,13 @@ tls_t *tls_new(xmpp_conn_t *conn)
|
||||
|
||||
/* no TLS support on win9x/me, despite what anyone says */
|
||||
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tls = xmpp_alloc(ctx, sizeof(*tls));
|
||||
|
||||
if (!tls) {
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(tls, 0, sizeof(*tls));
|
||||
@@ -98,30 +98,29 @@ tls_t *tls_new(xmpp_conn_t *conn)
|
||||
tls->conn = conn;
|
||||
tls->sock = sock;
|
||||
|
||||
if (!(tls->hsec32 = LoadLibrary ("secur32.dll"))) {
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
if (!(tls->hsec32 = LoadLibrary("secur32.dll"))) {
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(pInitSecurityInterface =
|
||||
(void *)GetProcAddress(tls->hsec32, "InitSecurityInterfaceA"))) {
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
(void *)GetProcAddress(tls->hsec32, "InitSecurityInterfaceA"))) {
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tls->sft = pInitSecurityInterface();
|
||||
|
||||
if (!tls->sft) {
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = tls->sft->QuerySecurityPackageInfo(UNISP_NAME, &(tls->spi));
|
||||
|
||||
if (ret != SEC_E_OK)
|
||||
{
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
if (ret != SEC_E_OK) {
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
xmpp_debug(ctx, "TLSS", "QuerySecurityPackageInfo() success");
|
||||
@@ -140,13 +139,13 @@ tls_t *tls_new(xmpp_conn_t *conn)
|
||||
(void)algs;
|
||||
#endif
|
||||
|
||||
ret = tls->sft->AcquireCredentialsHandleA(NULL, UNISP_NAME,
|
||||
SECPKG_CRED_OUTBOUND, NULL, &scred, NULL, NULL, &(tls->hcred), NULL);
|
||||
ret = tls->sft->AcquireCredentialsHandleA(
|
||||
NULL, UNISP_NAME, SECPKG_CRED_OUTBOUND, NULL, &scred, NULL, NULL,
|
||||
&(tls->hcred), NULL);
|
||||
|
||||
if (ret != SEC_E_OK)
|
||||
{
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
if (ret != SEC_E_OK) {
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
xmpp_debug(ctx, "TLSS", "AcquireCredentialsHandle() success");
|
||||
@@ -155,25 +154,25 @@ tls_t *tls_new(xmpp_conn_t *conn)
|
||||
|
||||
/* This bunch of queries should trip up wine until someone fixes
|
||||
* schannel support there */
|
||||
ret = tls->sft->QueryCredentialsAttributes(&(tls->hcred), SECPKG_ATTR_SUPPORTED_ALGS, &spc_sa);
|
||||
if (ret != SEC_E_OK)
|
||||
{
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
ret = tls->sft->QueryCredentialsAttributes(
|
||||
&(tls->hcred), SECPKG_ATTR_SUPPORTED_ALGS, &spc_sa);
|
||||
if (ret != SEC_E_OK) {
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = tls->sft->QueryCredentialsAttributes(&(tls->hcred), SECPKG_ATTR_CIPHER_STRENGTHS, &spc_cs);
|
||||
if (ret != SEC_E_OK)
|
||||
{
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
ret = tls->sft->QueryCredentialsAttributes(
|
||||
&(tls->hcred), SECPKG_ATTR_CIPHER_STRENGTHS, &spc_cs);
|
||||
if (ret != SEC_E_OK) {
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = tls->sft->QueryCredentialsAttributes(&(tls->hcred), SECPKG_ATTR_SUPPORTED_PROTOCOLS, &spc_sp);
|
||||
if (ret != SEC_E_OK)
|
||||
{
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
ret = tls->sft->QueryCredentialsAttributes(
|
||||
&(tls->hcred), SECPKG_ATTR_SUPPORTED_PROTOCOLS, &spc_sp);
|
||||
if (ret != SEC_E_OK) {
|
||||
tls_free(tls);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return tls;
|
||||
@@ -182,26 +181,26 @@ tls_t *tls_new(xmpp_conn_t *conn)
|
||||
void tls_free(tls_t *tls)
|
||||
{
|
||||
if (tls->recvbuffer) {
|
||||
xmpp_free(tls->ctx, tls->recvbuffer);
|
||||
xmpp_free(tls->ctx, tls->recvbuffer);
|
||||
}
|
||||
|
||||
if (tls->readybuffer) {
|
||||
xmpp_free(tls->ctx, tls->readybuffer);
|
||||
xmpp_free(tls->ctx, tls->readybuffer);
|
||||
}
|
||||
|
||||
if (tls->sendbuffer) {
|
||||
xmpp_free(tls->ctx, tls->sendbuffer);
|
||||
xmpp_free(tls->ctx, tls->sendbuffer);
|
||||
}
|
||||
|
||||
if (tls->init) {
|
||||
tls->sft->FreeCredentialsHandle(&(tls->hcred));
|
||||
tls->sft->FreeCredentialsHandle(&(tls->hcred));
|
||||
}
|
||||
|
||||
tls->sft = NULL;
|
||||
|
||||
if (tls->hsec32) {
|
||||
FreeLibrary(tls->hsec32);
|
||||
tls->hsec32 = NULL;
|
||||
FreeLibrary(tls->hsec32);
|
||||
tls->hsec32 = NULL;
|
||||
}
|
||||
|
||||
xmpp_free(tls->ctx, tls);
|
||||
@@ -225,10 +224,10 @@ int tls_start(tls_t *tls)
|
||||
/* use the domain there as our name */
|
||||
name = tls->conn->domain;
|
||||
|
||||
ctxtreq = ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT
|
||||
| ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR
|
||||
| ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM
|
||||
| ISC_REQ_MANUAL_CRED_VALIDATION | ISC_REQ_INTEGRITY;
|
||||
ctxtreq = ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT |
|
||||
ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR |
|
||||
ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM |
|
||||
ISC_REQ_MANUAL_CRED_VALIDATION | ISC_REQ_INTEGRITY;
|
||||
|
||||
memset(&(sbout[0]), 0, sizeof(sbout[0]));
|
||||
sbout[0].BufferType = SECBUFFER_TOKEN;
|
||||
@@ -251,134 +250,127 @@ int tls_start(tls_t *tls)
|
||||
sbdin.cBuffers = 2;
|
||||
sbdin.pBuffers = sbin;
|
||||
|
||||
ret = tls->sft->InitializeSecurityContextA(&(tls->hcred), NULL, name, ctxtreq, 0, 0,
|
||||
NULL, 0, &(tls->hctxt), &sbdout,
|
||||
&ctxtattr, NULL);
|
||||
ret = tls->sft->InitializeSecurityContextA(
|
||||
&(tls->hcred), NULL, name, ctxtreq, 0, 0, NULL, 0, &(tls->hctxt),
|
||||
&sbdout, &ctxtattr, NULL);
|
||||
|
||||
unsigned char *p = sbin[0].pvBuffer;
|
||||
int len = 0;
|
||||
|
||||
while (ret == SEC_I_CONTINUE_NEEDED
|
||||
|| ret == SEC_I_INCOMPLETE_CREDENTIALS
|
||||
|| ret == SEC_E_INCOMPLETE_MESSAGE) {
|
||||
int inbytes = 0;
|
||||
while (ret == SEC_I_CONTINUE_NEEDED ||
|
||||
ret == SEC_I_INCOMPLETE_CREDENTIALS ||
|
||||
ret == SEC_E_INCOMPLETE_MESSAGE) {
|
||||
int inbytes = 0;
|
||||
|
||||
if (ret != SEC_E_INCOMPLETE_MESSAGE) {
|
||||
len = 0;
|
||||
p = sbin[0].pvBuffer;
|
||||
}
|
||||
if (ret != SEC_E_INCOMPLETE_MESSAGE) {
|
||||
len = 0;
|
||||
p = sbin[0].pvBuffer;
|
||||
}
|
||||
|
||||
if (sbdout.pBuffers[0].cbBuffer) {
|
||||
unsigned char *writebuff = sbdout.pBuffers[0].pvBuffer;
|
||||
unsigned int writelen = sbdout.pBuffers[0].cbBuffer;
|
||||
if (sbdout.pBuffers[0].cbBuffer) {
|
||||
unsigned char *writebuff = sbdout.pBuffers[0].pvBuffer;
|
||||
unsigned int writelen = sbdout.pBuffers[0].cbBuffer;
|
||||
|
||||
sent = sock_write(tls->sock, writebuff, writelen);
|
||||
if (sent == -1) {
|
||||
tls->lasterror = sock_error();
|
||||
}
|
||||
else
|
||||
{
|
||||
writebuff += sent;
|
||||
writelen -= sent;
|
||||
}
|
||||
tls->sft->FreeContextBuffer(sbdout.pBuffers[0].pvBuffer);
|
||||
sbdout.pBuffers[0].pvBuffer = NULL;
|
||||
sbdout.pBuffers[0].cbBuffer = 0;
|
||||
}
|
||||
sent = sock_write(tls->sock, writebuff, writelen);
|
||||
if (sent == -1) {
|
||||
tls->lasterror = sock_error();
|
||||
} else {
|
||||
writebuff += sent;
|
||||
writelen -= sent;
|
||||
}
|
||||
tls->sft->FreeContextBuffer(sbdout.pBuffers[0].pvBuffer);
|
||||
sbdout.pBuffers[0].pvBuffer = NULL;
|
||||
sbdout.pBuffers[0].cbBuffer = 0;
|
||||
}
|
||||
|
||||
/* poll for a bit until the remote server stops sending data, ie it
|
||||
* finishes sending the token */
|
||||
inbytes = 1;
|
||||
{
|
||||
fd_set fds;
|
||||
struct timeval tv;
|
||||
/* poll for a bit until the remote server stops sending data, ie it
|
||||
* finishes sending the token */
|
||||
inbytes = 1;
|
||||
{
|
||||
fd_set fds;
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = 2;
|
||||
tv.tv_usec = 0;
|
||||
tv.tv_sec = 2;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(tls->sock, &fds);
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(tls->sock, &fds);
|
||||
|
||||
select(tls->sock, &fds, NULL, NULL, &tv);
|
||||
}
|
||||
select(tls->sock, &fds, NULL, NULL, &tv);
|
||||
}
|
||||
|
||||
while (inbytes > 0) {
|
||||
fd_set fds;
|
||||
struct timeval tv;
|
||||
while (inbytes > 0) {
|
||||
fd_set fds;
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 1000;
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 1000;
|
||||
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(tls->sock, &fds);
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(tls->sock, &fds);
|
||||
|
||||
select(tls->sock, &fds, NULL, NULL, &tv);
|
||||
select(tls->sock, &fds, NULL, NULL, &tv);
|
||||
|
||||
inbytes = sock_read(tls->sock, p, tls->spi->cbMaxToken - len);
|
||||
inbytes = sock_read(tls->sock, p, tls->spi->cbMaxToken - len);
|
||||
|
||||
if (inbytes > 0) {
|
||||
len += inbytes;
|
||||
p += inbytes;
|
||||
}
|
||||
else
|
||||
{
|
||||
tls->lasterror = sock_error();
|
||||
}
|
||||
if (inbytes > 0) {
|
||||
len += inbytes;
|
||||
p += inbytes;
|
||||
} else {
|
||||
tls->lasterror = sock_error();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
sbin[0].cbBuffer = len;
|
||||
|
||||
sbin[0].cbBuffer = len;
|
||||
|
||||
ret = tls->sft->InitializeSecurityContextA(&(tls->hcred), &(tls->hctxt), name,
|
||||
ctxtreq, 0, 0, &sbdin, 0,
|
||||
&(tls->hctxt), &sbdout,
|
||||
&ctxtattr, NULL);
|
||||
ret = tls->sft->InitializeSecurityContextA(
|
||||
&(tls->hcred), &(tls->hctxt), name, ctxtreq, 0, 0, &sbdin, 0,
|
||||
&(tls->hctxt), &sbdout, &ctxtattr, NULL);
|
||||
}
|
||||
|
||||
if (ret == SEC_E_OK) {
|
||||
if (sbdout.pBuffers[0].cbBuffer) {
|
||||
unsigned char *writebuff = sbdout.pBuffers[0].pvBuffer;
|
||||
unsigned int writelen = sbdout.pBuffers[0].cbBuffer;
|
||||
sent = sock_write(tls->sock, writebuff, writelen);
|
||||
if (sent == -1) {
|
||||
tls->lasterror = sock_error();
|
||||
}
|
||||
else
|
||||
{
|
||||
writebuff += sent;
|
||||
writelen -= sent;
|
||||
}
|
||||
tls->sft->FreeContextBuffer(sbdout.pBuffers[0].pvBuffer);
|
||||
sbdout.pBuffers[0].pvBuffer = NULL;
|
||||
sbdout.pBuffers[0].cbBuffer = 0;
|
||||
}
|
||||
if (sbdout.pBuffers[0].cbBuffer) {
|
||||
unsigned char *writebuff = sbdout.pBuffers[0].pvBuffer;
|
||||
unsigned int writelen = sbdout.pBuffers[0].cbBuffer;
|
||||
sent = sock_write(tls->sock, writebuff, writelen);
|
||||
if (sent == -1) {
|
||||
tls->lasterror = sock_error();
|
||||
} else {
|
||||
writebuff += sent;
|
||||
writelen -= sent;
|
||||
}
|
||||
tls->sft->FreeContextBuffer(sbdout.pBuffers[0].pvBuffer);
|
||||
sbdout.pBuffers[0].pvBuffer = NULL;
|
||||
sbdout.pBuffers[0].cbBuffer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
xmpp_free(tls->ctx, sbin[0].pvBuffer);
|
||||
|
||||
if (ret != SEC_E_OK) {
|
||||
tls->lasterror = ret;
|
||||
xmpp_error(tls->ctx, "TLSS", "Schannel error 0x%lx", (unsigned long)ret);
|
||||
return 0;
|
||||
tls->lasterror = ret;
|
||||
xmpp_error(tls->ctx, "TLSS", "Schannel error 0x%lx",
|
||||
(unsigned long)ret);
|
||||
return 0;
|
||||
}
|
||||
|
||||
tls->sft->QueryContextAttributes(&(tls->hctxt), SECPKG_ATTR_STREAM_SIZES,
|
||||
&(tls->spcss));
|
||||
&(tls->spcss));
|
||||
|
||||
tls->recvbuffermaxlen = tls->spcss.cbHeader + tls->spcss.cbMaximumMessage
|
||||
+ tls->spcss.cbTrailer;
|
||||
tls->recvbuffer = xmpp_alloc(tls->ctx, tls->recvbuffermaxlen);
|
||||
tls->recvbufferpos = 0;
|
||||
tls->recvbuffermaxlen = tls->spcss.cbHeader + tls->spcss.cbMaximumMessage +
|
||||
tls->spcss.cbTrailer;
|
||||
tls->recvbuffer = xmpp_alloc(tls->ctx, tls->recvbuffermaxlen);
|
||||
tls->recvbufferpos = 0;
|
||||
|
||||
tls->sendbuffermaxlen = tls->spcss.cbHeader + tls->spcss.cbMaximumMessage
|
||||
+ tls->spcss.cbTrailer;
|
||||
tls->sendbuffer = xmpp_alloc(tls->ctx, tls->sendbuffermaxlen);
|
||||
tls->sendbufferpos = 0;
|
||||
tls->sendbufferlen = 0;
|
||||
tls->sendbuffermaxlen = tls->spcss.cbHeader + tls->spcss.cbMaximumMessage +
|
||||
tls->spcss.cbTrailer;
|
||||
tls->sendbuffer = xmpp_alloc(tls->ctx, tls->sendbuffermaxlen);
|
||||
tls->sendbufferpos = 0;
|
||||
tls->sendbufferlen = 0;
|
||||
|
||||
tls->readybuffer = xmpp_alloc(tls->ctx, tls->spcss.cbMaximumMessage);
|
||||
tls->readybufferpos = 0;
|
||||
tls->readybufferlen = 0;
|
||||
tls->readybuffer = xmpp_alloc(tls->ctx, tls->spcss.cbMaximumMessage);
|
||||
tls->readybufferpos = 0;
|
||||
tls->readybufferlen = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -395,67 +387,67 @@ int tls_error(tls_t *tls)
|
||||
|
||||
int tls_is_recoverable(int error)
|
||||
{
|
||||
return (error == SEC_E_OK || error == SEC_E_INCOMPLETE_MESSAGE
|
||||
|| error == WSAEWOULDBLOCK || error == WSAEMSGSIZE
|
||||
|| error == WSAEINPROGRESS);
|
||||
return (error == SEC_E_OK || error == SEC_E_INCOMPLETE_MESSAGE ||
|
||||
error == WSAEWOULDBLOCK || error == WSAEMSGSIZE ||
|
||||
error == WSAEINPROGRESS);
|
||||
}
|
||||
|
||||
int tls_pending(tls_t *tls) {
|
||||
// There are 3 cases:
|
||||
// - there is data in ready buffer, so it is by default pending
|
||||
// - there is data in recv buffer. If it is not decrypted yet, means it
|
||||
// was incomplete. This should be processed again only if there is data
|
||||
// on the physical connection
|
||||
// - there is data on the physical connection. This case is treated
|
||||
// outside the tls (in event.c)
|
||||
int tls_pending(tls_t *tls)
|
||||
{
|
||||
// There are 3 cases:
|
||||
// - there is data in ready buffer, so it is by default pending
|
||||
// - there is data in recv buffer. If it is not decrypted yet, means it
|
||||
// was incomplete. This should be processed again only if there is data
|
||||
// on the physical connection
|
||||
// - there is data on the physical connection. This case is treated
|
||||
// outside the tls (in event.c)
|
||||
|
||||
if (tls->readybufferpos < tls->readybufferlen) {
|
||||
return tls->readybufferlen - tls->readybufferpos;
|
||||
}
|
||||
return tls->readybufferlen - tls->readybufferpos;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int tls_read(tls_t *tls, void * const buff, const size_t len)
|
||||
int tls_read(tls_t *tls, void *const buff, const size_t len)
|
||||
{
|
||||
int bytes;
|
||||
|
||||
/* first, if we've got some ready data, put that in the buffer */
|
||||
if (tls->readybufferpos < tls->readybufferlen)
|
||||
{
|
||||
if (len < tls->readybufferlen - tls->readybufferpos) {
|
||||
bytes = len;
|
||||
} else {
|
||||
bytes = tls->readybufferlen - tls->readybufferpos;
|
||||
}
|
||||
if (tls->readybufferpos < tls->readybufferlen) {
|
||||
if (len < tls->readybufferlen - tls->readybufferpos) {
|
||||
bytes = len;
|
||||
} else {
|
||||
bytes = tls->readybufferlen - tls->readybufferpos;
|
||||
}
|
||||
|
||||
memcpy(buff, tls->readybuffer + tls->readybufferpos, bytes);
|
||||
memcpy(buff, tls->readybuffer + tls->readybufferpos, bytes);
|
||||
|
||||
if (len < tls->readybufferlen - tls->readybufferpos) {
|
||||
tls->readybufferpos += bytes;
|
||||
return bytes;
|
||||
} else {
|
||||
unsigned char *newbuff = buff;
|
||||
int read;
|
||||
tls->readybufferpos += bytes;
|
||||
newbuff += bytes;
|
||||
read = tls_read(tls, newbuff, len - bytes);
|
||||
if (len < tls->readybufferlen - tls->readybufferpos) {
|
||||
tls->readybufferpos += bytes;
|
||||
return bytes;
|
||||
} else {
|
||||
unsigned char *newbuff = buff;
|
||||
int read;
|
||||
tls->readybufferpos += bytes;
|
||||
newbuff += bytes;
|
||||
read = tls_read(tls, newbuff, len - bytes);
|
||||
|
||||
if (read == -1) {
|
||||
if (tls_is_recoverable(tls->lasterror)) {
|
||||
return bytes;
|
||||
}
|
||||
if (read == -1) {
|
||||
if (tls_is_recoverable(tls->lasterror)) {
|
||||
return bytes;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
return bytes + read;
|
||||
}
|
||||
return bytes + read;
|
||||
}
|
||||
}
|
||||
|
||||
/* next, top up our recv buffer */
|
||||
bytes = sock_read(tls->sock, tls->recvbuffer + tls->recvbufferpos,
|
||||
tls->recvbuffermaxlen - tls->recvbufferpos);
|
||||
tls->recvbuffermaxlen - tls->recvbufferpos);
|
||||
|
||||
if (bytes == 0) {
|
||||
tls->lasterror = WSAECONNRESET;
|
||||
@@ -463,76 +455,75 @@ int tls_read(tls_t *tls, void * const buff, const size_t len)
|
||||
}
|
||||
|
||||
if (bytes == -1) {
|
||||
if (!tls_is_recoverable(sock_error())) {
|
||||
tls->lasterror = sock_error();
|
||||
return -1;
|
||||
}
|
||||
if (!tls_is_recoverable(sock_error())) {
|
||||
tls->lasterror = sock_error();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (bytes > 0) {
|
||||
tls->recvbufferpos += bytes;
|
||||
tls->recvbufferpos += bytes;
|
||||
}
|
||||
|
||||
/* next, try to decrypt the recv buffer */
|
||||
if (tls->recvbufferpos > 0) {
|
||||
SecBufferDesc sbddec;
|
||||
SecBuffer sbdec[4];
|
||||
int ret;
|
||||
SecBufferDesc sbddec;
|
||||
SecBuffer sbdec[4];
|
||||
int ret;
|
||||
|
||||
memset(&sbddec, 0, sizeof(sbddec));
|
||||
sbddec.ulVersion = SECBUFFER_VERSION;
|
||||
sbddec.cBuffers = 4;
|
||||
sbddec.pBuffers = sbdec;
|
||||
memset(&sbddec, 0, sizeof(sbddec));
|
||||
sbddec.ulVersion = SECBUFFER_VERSION;
|
||||
sbddec.cBuffers = 4;
|
||||
sbddec.pBuffers = sbdec;
|
||||
|
||||
memset(&(sbdec[0]), 0, sizeof(sbdec[0]));
|
||||
sbdec[0].BufferType = SECBUFFER_DATA;
|
||||
sbdec[0].pvBuffer = tls->recvbuffer;
|
||||
sbdec[0].cbBuffer = tls->recvbufferpos;
|
||||
memset(&(sbdec[0]), 0, sizeof(sbdec[0]));
|
||||
sbdec[0].BufferType = SECBUFFER_DATA;
|
||||
sbdec[0].pvBuffer = tls->recvbuffer;
|
||||
sbdec[0].cbBuffer = tls->recvbufferpos;
|
||||
|
||||
memset(&(sbdec[1]), 0, sizeof(sbdec[1]));
|
||||
sbdec[1].BufferType = SECBUFFER_EMPTY;
|
||||
memset(&(sbdec[1]), 0, sizeof(sbdec[1]));
|
||||
sbdec[1].BufferType = SECBUFFER_EMPTY;
|
||||
|
||||
memset(&(sbdec[2]), 0, sizeof(sbdec[2]));
|
||||
sbdec[2].BufferType = SECBUFFER_EMPTY;
|
||||
memset(&(sbdec[2]), 0, sizeof(sbdec[2]));
|
||||
sbdec[2].BufferType = SECBUFFER_EMPTY;
|
||||
|
||||
memset(&(sbdec[3]), 0, sizeof(sbdec[3]));
|
||||
sbdec[3].BufferType = SECBUFFER_EMPTY;
|
||||
memset(&(sbdec[3]), 0, sizeof(sbdec[3]));
|
||||
sbdec[3].BufferType = SECBUFFER_EMPTY;
|
||||
|
||||
ret = tls->sft->DecryptMessage(&(tls->hctxt), &sbddec, 0, NULL);
|
||||
ret = tls->sft->DecryptMessage(&(tls->hctxt), &sbddec, 0, NULL);
|
||||
|
||||
if (ret == SEC_E_OK) {
|
||||
memcpy(tls->readybuffer, sbdec[1].pvBuffer, sbdec[1].cbBuffer);
|
||||
tls->readybufferpos = 0;
|
||||
tls->readybufferlen = sbdec[1].cbBuffer;
|
||||
/* have we got some data left over? If so, copy it to the start
|
||||
* of the recv buffer */
|
||||
if (sbdec[3].BufferType == SECBUFFER_EXTRA) {
|
||||
memcpy(tls->recvbuffer, sbdec[3].pvBuffer, sbdec[3].cbBuffer);
|
||||
tls->recvbufferpos = sbdec[3].cbBuffer;
|
||||
} else {
|
||||
tls->recvbufferpos = 0;
|
||||
}
|
||||
if (ret == SEC_E_OK) {
|
||||
memcpy(tls->readybuffer, sbdec[1].pvBuffer, sbdec[1].cbBuffer);
|
||||
tls->readybufferpos = 0;
|
||||
tls->readybufferlen = sbdec[1].cbBuffer;
|
||||
/* have we got some data left over? If so, copy it to the start
|
||||
* of the recv buffer */
|
||||
if (sbdec[3].BufferType == SECBUFFER_EXTRA) {
|
||||
memcpy(tls->recvbuffer, sbdec[3].pvBuffer, sbdec[3].cbBuffer);
|
||||
tls->recvbufferpos = sbdec[3].cbBuffer;
|
||||
} else {
|
||||
tls->recvbufferpos = 0;
|
||||
}
|
||||
|
||||
return tls_read(tls, buff, len);
|
||||
} else if (ret == SEC_E_INCOMPLETE_MESSAGE) {
|
||||
tls->lasterror = SEC_E_INCOMPLETE_MESSAGE;
|
||||
return -1;
|
||||
} else if (ret == SEC_I_RENEGOTIATE) {
|
||||
ret = tls_start(tls);
|
||||
if (!ret)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return tls_read(tls, buff, len);
|
||||
} else if (ret == SEC_E_INCOMPLETE_MESSAGE) {
|
||||
tls->lasterror = SEC_E_INCOMPLETE_MESSAGE;
|
||||
return -1;
|
||||
} else if (ret == SEC_I_RENEGOTIATE) {
|
||||
ret = tls_start(tls);
|
||||
if (!ret) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* fake an incomplete message so we're called again */
|
||||
tls->lasterror = SEC_E_INCOMPLETE_MESSAGE;
|
||||
return -1;
|
||||
}
|
||||
/* fake an incomplete message so we're called again */
|
||||
tls->lasterror = SEC_E_INCOMPLETE_MESSAGE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* something bad happened, so we bail */
|
||||
tls->lasterror = ret;
|
||||
/* something bad happened, so we bail */
|
||||
tls->lasterror = ret;
|
||||
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
tls->lasterror = SEC_E_INCOMPLETE_MESSAGE;
|
||||
@@ -542,29 +533,28 @@ int tls_read(tls_t *tls, void * const buff, const size_t len)
|
||||
|
||||
int tls_clear_pending_write(tls_t *tls)
|
||||
{
|
||||
if (tls->sendbufferpos < tls->sendbufferlen)
|
||||
{
|
||||
int bytes;
|
||||
if (tls->sendbufferpos < tls->sendbufferlen) {
|
||||
int bytes;
|
||||
|
||||
bytes = sock_write(tls->sock, tls->sendbuffer + tls->sendbufferpos,
|
||||
tls->sendbufferlen - tls->sendbufferpos);
|
||||
bytes = sock_write(tls->sock, tls->sendbuffer + tls->sendbufferpos,
|
||||
tls->sendbufferlen - tls->sendbufferpos);
|
||||
|
||||
if (bytes == -1) {
|
||||
tls->lasterror = sock_error();
|
||||
return -1;
|
||||
} else if (bytes > 0) {
|
||||
tls->sendbufferpos += bytes;
|
||||
}
|
||||
if (bytes == -1) {
|
||||
tls->lasterror = sock_error();
|
||||
return -1;
|
||||
} else if (bytes > 0) {
|
||||
tls->sendbufferpos += bytes;
|
||||
}
|
||||
|
||||
if (tls->sendbufferpos < tls->sendbufferlen) {
|
||||
return 0;
|
||||
}
|
||||
if (tls->sendbufferpos < tls->sendbufferlen) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int tls_write(tls_t *tls, const void * const buff, const size_t len)
|
||||
int tls_write(tls_t *tls, const void *const buff, const size_t len)
|
||||
{
|
||||
SecBufferDesc sbdenc;
|
||||
SecBuffer sbenc[4];
|
||||
@@ -573,7 +563,7 @@ int tls_write(tls_t *tls, const void * const buff, const size_t len)
|
||||
|
||||
ret = tls_clear_pending_write(tls);
|
||||
if (ret <= 0) {
|
||||
return ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
tls->sendbufferpos = 0;
|
||||
@@ -601,51 +591,49 @@ int tls_write(tls_t *tls, const void * const buff, const size_t len)
|
||||
|
||||
sbenc[1].pvBuffer = tls->sendbuffer + tls->spcss.cbHeader;
|
||||
|
||||
while (remain > 0)
|
||||
{
|
||||
if (remain > tls->spcss.cbMaximumMessage) {
|
||||
sbenc[1].cbBuffer = tls->spcss.cbMaximumMessage;
|
||||
} else {
|
||||
sbenc[1].cbBuffer = remain;
|
||||
}
|
||||
while (remain > 0) {
|
||||
if (remain > tls->spcss.cbMaximumMessage) {
|
||||
sbenc[1].cbBuffer = tls->spcss.cbMaximumMessage;
|
||||
} else {
|
||||
sbenc[1].cbBuffer = remain;
|
||||
}
|
||||
|
||||
sbenc[2].pvBuffer = (unsigned char *)sbenc[1].pvBuffer
|
||||
+ sbenc[1].cbBuffer;
|
||||
sbenc[2].pvBuffer =
|
||||
(unsigned char *)sbenc[1].pvBuffer + sbenc[1].cbBuffer;
|
||||
sbenc[2].cbBuffer = tls->spcss.cbTrailer;
|
||||
|
||||
memcpy(sbenc[1].pvBuffer, p, sbenc[1].cbBuffer);
|
||||
p += tls->spcss.cbMaximumMessage;
|
||||
memcpy(sbenc[1].pvBuffer, p, sbenc[1].cbBuffer);
|
||||
p += tls->spcss.cbMaximumMessage;
|
||||
|
||||
tls->sendbufferlen = sbenc[0].cbBuffer + sbenc[1].cbBuffer
|
||||
+ sbenc[2].cbBuffer;
|
||||
tls->sendbufferlen =
|
||||
sbenc[0].cbBuffer + sbenc[1].cbBuffer + sbenc[2].cbBuffer;
|
||||
|
||||
ret = tls->sft->EncryptMessage(&(tls->hctxt), 0, &sbdenc, 0);
|
||||
ret = tls->sft->EncryptMessage(&(tls->hctxt), 0, &sbdenc, 0);
|
||||
|
||||
if (ret != SEC_E_OK) {
|
||||
tls->lasterror = ret;
|
||||
return -1;
|
||||
}
|
||||
if (ret != SEC_E_OK) {
|
||||
tls->lasterror = ret;
|
||||
return -1;
|
||||
}
|
||||
|
||||
tls->sendbufferpos = 0;
|
||||
tls->sendbufferpos = 0;
|
||||
|
||||
ret = tls_clear_pending_write(tls);
|
||||
ret = tls_clear_pending_write(tls);
|
||||
|
||||
if (ret == -1 && !tls_is_recoverable(tls_error(tls))) {
|
||||
return -1;
|
||||
}
|
||||
if (ret == -1 && !tls_is_recoverable(tls_error(tls))) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (remain > tls->spcss.cbMaximumMessage) {
|
||||
sent += tls->spcss.cbMaximumMessage;
|
||||
remain -= tls->spcss.cbMaximumMessage;
|
||||
} else {
|
||||
sent += remain;
|
||||
remain = 0;
|
||||
}
|
||||
|
||||
if (ret == 0 || (ret == -1 && tls_is_recoverable(tls_error(tls)))) {
|
||||
return sent;
|
||||
}
|
||||
if (remain > tls->spcss.cbMaximumMessage) {
|
||||
sent += tls->spcss.cbMaximumMessage;
|
||||
remain -= tls->spcss.cbMaximumMessage;
|
||||
} else {
|
||||
sent += remain;
|
||||
remain = 0;
|
||||
}
|
||||
|
||||
if (ret == 0 || (ret == -1 && tls_is_recoverable(tls_error(tls)))) {
|
||||
return sent;
|
||||
}
|
||||
}
|
||||
|
||||
return sent;
|
||||
|
||||
Reference in New Issue
Block a user