private bool DecryptData(ref ServerAsyncEventArgs e, Server <C> .Connection <C> connection)
{
SspiContext sspiContext = connection.SspiContext;
SecBufferDescEx secBufferDesc = sspiContext.SecBufferDesc5;
if (sspiContext.Buffer.IsValid && e != null && !sspiContext.Buffer.CopyTransferredFrom(e, 0))
{
return(false);
}
SecurityStatus securityStatus2;
while (true)
{
secBufferDesc.Buffers[0].BufferType = BufferType.SECBUFFER_DATA;
if (sspiContext.Buffer.IsValid)
{
this.SetSecBuffer(ref secBufferDesc.Buffers[0], sspiContext);
}
else
{
this.SetSecBuffer(ref secBufferDesc.Buffers[0], e);
}
secBufferDesc.Buffers[1].SetBufferEmpty();
secBufferDesc.Buffers[2].SetBufferEmpty();
secBufferDesc.Buffers[3].SetBufferEmpty();
secBufferDesc.Buffers[4].SetBufferEmpty();
SecurityStatus securityStatus = Sspi.SafeDecryptMessage(ref sspiContext.Handle, ref secBufferDesc, 0u, null);
int bufferIndex = secBufferDesc.GetBufferIndex(BufferType.SECBUFFER_EXTRA, 0);
int bufferIndex2 = secBufferDesc.GetBufferIndex(BufferType.SECBUFFER_DATA, 0);
securityStatus2 = securityStatus;
if (securityStatus2 != SecurityStatus.SEC_E_OK)
{
break;
}
if (bufferIndex2 < 0)
{
return(false);
}
if (sspiContext.Buffer.IsInvalid)
{
if (bufferIndex >= 0 && !sspiContext.Buffer.CopyFrom(secBufferDesc.Buffers[bufferIndex]))
{
return(false);
}
e.Offset = secBufferDesc.Buffers[bufferIndex2].Offset;
e.BytesTransferred = secBufferDesc.Buffers[bufferIndex2].Size;
e.SetMaxCount();
if (!this.OnReceived(connection, ref e))
{
return(false);
}
}
else
{
ArraySegment <byte> buffer = sspiContext.Buffer.Detach();
if (bufferIndex >= 0 && !sspiContext.Buffer.CopyFrom(secBufferDesc.Buffers[bufferIndex]))
{
return(false);
}
ServerAsyncEventArgs serverAsyncEventArgs = EventArgsManager.Get();
base.PrepareEventArgs(connection, serverAsyncEventArgs);
serverAsyncEventArgs.AttachBuffer(buffer);
serverAsyncEventArgs.Offset = secBufferDesc.Buffers[bufferIndex2].Offset;
serverAsyncEventArgs.BytesTransferred = secBufferDesc.Buffers[bufferIndex2].Size;
serverAsyncEventArgs.SetMaxCount();
bool flag = this.OnReceived(connection, ref serverAsyncEventArgs);
if (serverAsyncEventArgs != null)
{
EventArgsManager.Put(serverAsyncEventArgs);
}
if (!flag)
{
return(false);
}
}
if (bufferIndex < 0)
{
return(true);
}
}
return(securityStatus2 != SecurityStatus.SEC_I_RENEGOTIATE && securityStatus2 == (SecurityStatus)2148074264u && (!sspiContext.Buffer.IsInvalid || sspiContext.Buffer.CopyTransferredFrom(e, 0)));
}