Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

616 lines
19 KiB

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
sspi.cxx
Abstract:
sspi
Author:
Larry Zhu (LZhu) January 1, 2002 Created
Environment:
User Mode
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
#include "sspi.hxx"
#include "sspicli.hxx"
#include "sspisrv.hxx"
HRESULT
DoSspiServerWork(
IN PCtxtHandle phSrvCtxt,
IN SOCKET ServerSocket,
IN SOCKET ClientSocket
)
{
THResult hRetval = E_FAIL;
SecBufferDesc MessageDesc = {0};
SecBuffer SecBuffers[3] = {0};
CHAR DataBuffer[20] = {0};
CHAR TokenBuffer[100] = {0};
CHAR PaddingBlock[512] = {0};
SecPkgContext_Sizes ContextSizes = {0};
ULONG fQOP = 0;
ULONG MessageSeqNo = 0;
hRetval DBGCHK = QueryContextAttributesA(
phSrvCtxt,
SECPKG_ATTR_SIZES,
&ContextSizes
);
if (SUCCEEDED(hRetval))
{
hRetval DBGCHK = ( (sizeof(TokenBuffer) >= ContextSizes.cbSecurityTrailer)
&& (sizeof(TokenBuffer) >= ContextSizes.cbMaxSignature)
&& (sizeof(PaddingBlock) >= ContextSizes.cbBlockSize) )
? S_OK : HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
}
if (SUCCEEDED(hRetval))
{
SecBuffers[0].pvBuffer = TokenBuffer;
SecBuffers[0].cbBuffer = ContextSizes.cbMaxSignature;
SecBuffers[0].BufferType = SECBUFFER_TOKEN;
SecBuffers[1].pvBuffer = DataBuffer;
SecBuffers[1].cbBuffer = sizeof(DataBuffer);
SecBuffers[1].BufferType = SECBUFFER_DATA;
#if 0
SecBuffers[2].pvBuffer = PaddingBlock;
SecBuffers[2].cbBuffer = ContextSizes.cbBlockSize > 1 ? ContextSizes.cbBlockSize : 0;
SecBuffers[2].BufferType = SECBUFFER_PADDING;
#endif
MessageDesc.pBuffers = SecBuffers;
MessageDesc.cBuffers = RTL_NUMBER_OF(SecBuffers) - 1;
MessageDesc.ulVersion = 0;
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts reading 1 (token)\n");
hRetval DBGCHK = ReadMessage(ServerSocket,
SecBuffers[0].cbBuffer,
SecBuffers[0].pvBuffer,
&SecBuffers[0].cbBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts reading 2 (data)\n");
hRetval DBGCHK = ReadMessage(ServerSocket,
SecBuffers[1].cbBuffer,
SecBuffers[1].pvBuffer,
&SecBuffers[1].cbBuffer);
}
#if 0
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts reading 3 (padding)\n");
hRetval DBGCHK = ReadMessage(ServerSocket,
SecBuffers[2].cbBuffer,
SecBuffers[2].pvBuffer,
&SecBuffers[2].cbBuffer);
}
#endif
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork VerifySignature %#x\n", MessageSeqNo);
hRetval DBGCHK = VerifySignature(
phSrvCtxt,
&MessageDesc,
MessageSeqNo,
&fQOP
);
}
if (SUCCEEDED(hRetval))
{
SecBuffers[0].pvBuffer = TokenBuffer;
SecBuffers[0].cbBuffer = ContextSizes.cbSecurityTrailer;
SecBuffers[0].BufferType = SECBUFFER_TOKEN;
SecBuffers[1].pvBuffer = DataBuffer;
SecBuffers[1].cbBuffer = sizeof(DataBuffer);
SecBuffers[1].BufferType = SECBUFFER_DATA;
SecBuffers[2].pvBuffer = PaddingBlock;
SecBuffers[2].cbBuffer = ContextSizes.cbBlockSize > 1 ? ContextSizes.cbBlockSize : 0;
SecBuffers[2].BufferType = SECBUFFER_PADDING;
MessageDesc.pBuffers = SecBuffers;
MessageDesc.cBuffers = RTL_NUMBER_OF(SecBuffers) - (ContextSizes.cbBlockSize > 1 ? 0 : 1);
MessageDesc.ulVersion = 0;
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts reading 3 (token)\n");
hRetval DBGCHK = ReadMessage(ServerSocket,
SecBuffers[0].cbBuffer,
SecBuffers[0].pvBuffer,
&SecBuffers[0].cbBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts reading 4 (data)\n");
hRetval DBGCHK = ReadMessage(ServerSocket,
SecBuffers[1].cbBuffer,
SecBuffers[1].pvBuffer,
&SecBuffers[1].cbBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts reading 5 (padding)\n");
hRetval DBGCHK = ReadMessage(ServerSocket,
SecBuffers[2].cbBuffer,
SecBuffers[2].pvBuffer,
&SecBuffers[2].cbBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork DecryptMessage %#x\n", MessageSeqNo + 1);
hRetval DBGCHK = DecryptMessage(
phSrvCtxt,
&MessageDesc,
++MessageSeqNo,
&fQOP
);
}
if (SUCCEEDED(hRetval))
{
SecBuffers[0].pvBuffer = TokenBuffer;
SecBuffers[0].cbBuffer = ContextSizes.cbSecurityTrailer;
SecBuffers[0].BufferType = SECBUFFER_TOKEN;
SecBuffers[1].pvBuffer = DataBuffer;
SecBuffers[1].cbBuffer = sizeof(DataBuffer);
SecBuffers[1].BufferType = SECBUFFER_DATA;
SecBuffers[2].pvBuffer = PaddingBlock;
SecBuffers[2].cbBuffer = ContextSizes.cbBlockSize > 1 ? ContextSizes.cbBlockSize : 0;
SecBuffers[2].BufferType = SECBUFFER_PADDING;
MessageDesc.pBuffers = SecBuffers;
MessageDesc.cBuffers = RTL_NUMBER_OF(SecBuffers);
MessageDesc.ulVersion = 0;
memset(
DataBuffer,
0xeb,
sizeof(DataBuffer)
);
MessageDesc.pBuffers = SecBuffers;
MessageDesc.cBuffers = RTL_NUMBER_OF(SecBuffers) - (ContextSizes.cbBlockSize > 1 ? 0 : 1);
MessageDesc.ulVersion = 0;
DebugPrintf(SSPI_LOG, "DoSspiServerWork EncryptMessage %#x\n", MessageSeqNo + 1);
hRetval DBGCHK = EncryptMessage(
phSrvCtxt,
fQOP,
&MessageDesc,
++MessageSeqNo
);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts writing 1 (token)\n");
hRetval DBGCHK = WriteMessage(ClientSocket,
SecBuffers[0].cbBuffer,
SecBuffers[0].pvBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts writing 2 (data)\n");
hRetval DBGCHK = WriteMessage(ClientSocket,
SecBuffers[1].cbBuffer,
SecBuffers[1].pvBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts reading 3 (padding)\n");
hRetval DBGCHK = WriteMessage(ClientSocket,
SecBuffers[2].cbBuffer,
SecBuffers[2].pvBuffer);
}
if (SUCCEEDED(hRetval))
{
SecBuffers[0].pvBuffer = TokenBuffer;
SecBuffers[0].cbBuffer = ContextSizes.cbMaxSignature;
SecBuffers[0].BufferType = SECBUFFER_TOKEN;
SecBuffers[1].pvBuffer = DataBuffer;
SecBuffers[1].cbBuffer = sizeof(DataBuffer);
SecBuffers[1].BufferType = SECBUFFER_DATA;
#if 0
SecBuffers[2].pvBuffer = PaddingBlock;
SecBuffers[2].cbBuffer = ContextSizes.cbBlockSize > 1 ? ContextSizes.cbBlockSize : 0;
SecBuffers[2].BufferType = SECBUFFER_PADDING;
#endif
MessageDesc.pBuffers = SecBuffers;
MessageDesc.cBuffers = RTL_NUMBER_OF(SecBuffers) - 1;
MessageDesc.ulVersion = 0;
memset(
DataBuffer,
0xeb,
sizeof(DataBuffer)
);
DebugPrintf(SSPI_LOG, "DoSspiServerWork MakeSignature %#x\n", MessageSeqNo + 1);
hRetval DBGCHK = MakeSignature(
phSrvCtxt,
fQOP,
&MessageDesc,
++MessageSeqNo
);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts writing 4 (token)\n");
hRetval DBGCHK = WriteMessage(ClientSocket,
SecBuffers[0].cbBuffer,
SecBuffers[0].pvBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts writing 5 (data)\n");
hRetval DBGCHK = WriteMessage(ClientSocket,
SecBuffers[1].cbBuffer,
SecBuffers[1].pvBuffer);
}
#if 0
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiServerWork starts writing 6 (padding)\n");
hRetval DBGCHK = WriteMessage(ClientSocket,
SecBuffers[2].cbBuffer,
SecBuffers[2].pvBuffer);
}
#endif
return hRetval;
}
HRESULT
DoSspiClientWork(
IN PCtxtHandle phCliCtxt,
IN SOCKET ServerSocket,
IN SOCKET ClientSocket
)
{
THResult hRetval = E_FAIL;
SecBufferDesc MessageDesc = {0};
SecBuffer SecBuffers[3] = {0};
CHAR DataBuffer[20] = {0};
CHAR TokenBuffer[100] = {0};
CHAR PaddingBlock[512] = {0};
SecPkgContext_Sizes ContextSizes = {0};
ULONG fQOP = 0;
ULONG MessageSeqNo = 0;
hRetval DBGCHK = QueryContextAttributesA(
phCliCtxt,
SECPKG_ATTR_SIZES,
&ContextSizes
);
if (SUCCEEDED(hRetval))
{
hRetval DBGCHK = ( (sizeof(TokenBuffer) >= ContextSizes.cbSecurityTrailer)
&& (sizeof(TokenBuffer) >= ContextSizes.cbMaxSignature)
&& (sizeof(PaddingBlock) >= ContextSizes.cbBlockSize) )
? S_OK : HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
}
if (SUCCEEDED(hRetval))
{
SecBuffers[0].pvBuffer = TokenBuffer;
SecBuffers[0].cbBuffer = ContextSizes.cbMaxSignature;
SecBuffers[0].BufferType = SECBUFFER_TOKEN;
SecBuffers[1].pvBuffer = DataBuffer;
SecBuffers[1].cbBuffer = sizeof(DataBuffer);
SecBuffers[1].BufferType = SECBUFFER_DATA;
#if 0
SecBuffers[2].pvBuffer = PaddingBlock;
SecBuffers[2].cbBuffer = ContextSizes.cbBlockSize > 1 ? ContextSizes.cbBlockSize : 0;
SecBuffers[2].BufferType = SECBUFFER_PADDING;
#endif
MessageDesc.pBuffers = SecBuffers;
MessageDesc.cBuffers = RTL_NUMBER_OF(SecBuffers) - 1;
MessageDesc.ulVersion = 0;
memset(
DataBuffer,
0xeb,
sizeof(DataBuffer)
);
DebugPrintf(SSPI_LOG, "DoSspiClientWork MakeSignature %#x\n", MessageSeqNo);
hRetval DBGCHK = MakeSignature(
phCliCtxt,
fQOP,
&MessageDesc,
MessageSeqNo
);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts writing 1 (token)\n");
hRetval DBGCHK = WriteMessage(ServerSocket,
SecBuffers[0].cbBuffer,
SecBuffers[0].pvBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts writing 2 (data)\n");
hRetval DBGCHK = WriteMessage(ServerSocket,
SecBuffers[1].cbBuffer,
SecBuffers[1].pvBuffer);
}
#if 0
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts writing 3 (padding)\n");
hRetval DBGCHK = WriteMessage(ServerSocket,
SecBuffers[2].cbBuffer,
SecBuffers[2].pvBuffer);
}
#endif
if (SUCCEEDED(hRetval))
{
SecBuffers[0].pvBuffer = TokenBuffer;
SecBuffers[0].cbBuffer = ContextSizes.cbSecurityTrailer;
SecBuffers[0].BufferType = SECBUFFER_TOKEN;
SecBuffers[1].pvBuffer = DataBuffer;
SecBuffers[1].cbBuffer = sizeof(DataBuffer);
SecBuffers[1].BufferType = SECBUFFER_DATA;
SecBuffers[2].pvBuffer = PaddingBlock;
SecBuffers[2].cbBuffer = ContextSizes.cbBlockSize > 1 ? ContextSizes.cbBlockSize : 0;
SecBuffers[2].BufferType = SECBUFFER_PADDING;
MessageDesc.pBuffers = SecBuffers;
MessageDesc.cBuffers = RTL_NUMBER_OF(SecBuffers) - (ContextSizes.cbBlockSize > 1 ? 0 : 1);
MessageDesc.ulVersion = 0;
memset(
DataBuffer,
0xeb,
sizeof(DataBuffer)
);
DebugPrintf(SSPI_LOG, "DoSspiClientWork EncryptMessage %#x\n", MessageSeqNo + 1);
hRetval DBGCHK = EncryptMessage(
phCliCtxt,
fQOP,
&MessageDesc,
++MessageSeqNo
);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts writing 3 (token)\n");
hRetval DBGCHK = WriteMessage(ServerSocket,
SecBuffers[0].cbBuffer,
SecBuffers[0].pvBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts writing 4 (data)\n");
hRetval DBGCHK = WriteMessage(ServerSocket,
SecBuffers[1].cbBuffer,
SecBuffers[1].pvBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts writing 5 (padding)\n");
hRetval DBGCHK = WriteMessage(ServerSocket,
SecBuffers[2].cbBuffer,
SecBuffers[2].pvBuffer);
}
if (SUCCEEDED(hRetval))
{
SecBuffers[0].pvBuffer = TokenBuffer;
SecBuffers[0].cbBuffer = ContextSizes.cbSecurityTrailer;
SecBuffers[0].BufferType = SECBUFFER_TOKEN;
SecBuffers[1].pvBuffer = DataBuffer;
SecBuffers[1].cbBuffer = sizeof(DataBuffer);
SecBuffers[1].BufferType = SECBUFFER_DATA;
SecBuffers[2].pvBuffer = PaddingBlock;
SecBuffers[2].cbBuffer = ContextSizes.cbBlockSize > 1 ? ContextSizes.cbBlockSize : 0;
SecBuffers[2].BufferType = SECBUFFER_PADDING;
MessageDesc.pBuffers = SecBuffers;
MessageDesc.cBuffers = RTL_NUMBER_OF(SecBuffers) - (ContextSizes.cbBlockSize > 1 ? 0 : 1);
MessageDesc.ulVersion = 0;
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts reading 1 (token)\n");
hRetval DBGCHK = ReadMessage(ClientSocket,
SecBuffers[0].cbBuffer,
SecBuffers[0].pvBuffer,
&SecBuffers[0].cbBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts reading 2 (data)\n");
hRetval DBGCHK = ReadMessage(ClientSocket,
SecBuffers[1].cbBuffer,
SecBuffers[1].pvBuffer,
&SecBuffers[1].cbBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts reading 3 (padding)\n");
hRetval DBGCHK = ReadMessage(ClientSocket,
SecBuffers[2].cbBuffer,
SecBuffers[2].pvBuffer,
&SecBuffers[2].cbBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork DecryptMessage %#x\n", MessageSeqNo + 1);
hRetval DBGCHK = DecryptMessage(
phCliCtxt,
&MessageDesc,
++MessageSeqNo,
&fQOP
);
}
if (SUCCEEDED(hRetval))
{
SecBuffers[0].pvBuffer = TokenBuffer;
SecBuffers[0].cbBuffer = ContextSizes.cbMaxSignature;
SecBuffers[0].BufferType = SECBUFFER_TOKEN;
SecBuffers[1].pvBuffer = DataBuffer;
SecBuffers[1].cbBuffer = sizeof(DataBuffer);
SecBuffers[1].BufferType = SECBUFFER_DATA;
#if 0
SecBuffers[2].pvBuffer = PaddingBlock;
SecBuffers[2].cbBuffer = ContextSizes.cbBlockSize > 1 ? ContextSizes.cbBlockSize : 0;
SecBuffers[2].BufferType = SECBUFFER_PADDING;
#endif
MessageDesc.pBuffers = SecBuffers;
MessageDesc.cBuffers = RTL_NUMBER_OF(SecBuffers) - 1;
MessageDesc.ulVersion = 0;
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts reading 4 (token)\n");
hRetval DBGCHK = ReadMessage(ClientSocket,
SecBuffers[0].cbBuffer,
SecBuffers[0].pvBuffer,
&SecBuffers[0].cbBuffer);
}
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts reading 5 (data)\n");
hRetval DBGCHK = ReadMessage(ClientSocket,
SecBuffers[1].cbBuffer,
SecBuffers[1].pvBuffer,
&SecBuffers[1].cbBuffer);
}
#if 0
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork starts reading 6 (padding)\n");
hRetval DBGCHK = ReadMessage(ClientSocket,
SecBuffers[2].cbBuffer,
SecBuffers[2].pvBuffer,
&SecBuffers[2].cbBuffer);
}
#endif
if (SUCCEEDED(hRetval))
{
DebugPrintf(SSPI_LOG, "DoSspiClientWork VerifySignature %#x\n", MessageSeqNo + 1);
hRetval DBGCHK = VerifySignature(
phCliCtxt,
&MessageDesc,
++MessageSeqNo,
&fQOP
);
}
return hRetval;
}