mirror of https://github.com/FreeRDP/FreeRDP
libfreerdp-core: implemented parsing of TSG_PACKET_TYPE_QUARENC_RESPONSE
This commit is contained in:
parent
63e922295e
commit
58b3aa4d39
|
@ -211,12 +211,12 @@ BOOL tsg_proxy_create_tunnel_write_request(rdpTsg* tsg)
|
|||
TSG_MESSAGING_CAP_REAUTH;
|
||||
|
||||
/*
|
||||
* FIXME: temporary hack
|
||||
* FIXME: Alternate Code Path
|
||||
*
|
||||
* Using reduced capabilities appear to trigger
|
||||
* Using reduced capabilities appears to trigger
|
||||
* TSG_PACKET_TYPE_QUARENC_RESPONSE instead of TSG_PACKET_TYPE_CAPS_RESPONSE
|
||||
*/
|
||||
//NapCapabilities = TSG_NAP_CAPABILITY_IDLE_TIMEOUT;
|
||||
NapCapabilities = TSG_NAP_CAPABILITY_IDLE_TIMEOUT;
|
||||
|
||||
*((UINT32*) &buffer[44]) = NapCapabilities; /* capabilities */
|
||||
|
||||
|
@ -246,6 +246,7 @@ BOOL tsg_proxy_create_tunnel_read_response(rdpTsg* tsg)
|
|||
PTSG_PACKET_CAPABILITIES tsgCaps;
|
||||
PTSG_PACKET_VERSIONCAPS versionCaps;
|
||||
PTSG_PACKET_CAPS_RESPONSE packetCapsResponse;
|
||||
PTSG_PACKET_QUARENC_RESPONSE packetQuarEncResponse;
|
||||
|
||||
status = rpc_recv_pdu(rpc);
|
||||
|
||||
|
@ -261,112 +262,184 @@ BOOL tsg_proxy_create_tunnel_read_response(rdpTsg* tsg)
|
|||
packet->packetId = *((UINT32*) &buffer[28]); /* PacketId */
|
||||
SwitchValue = *((UINT32*) &buffer[32]); /* SwitchValue */
|
||||
|
||||
if ((packet->packetId != TSG_PACKET_TYPE_CAPS_RESPONSE) ||
|
||||
(SwitchValue != TSG_PACKET_TYPE_CAPS_RESPONSE))
|
||||
if ((packet->packetId == TSG_PACKET_TYPE_CAPS_RESPONSE) && (SwitchValue == TSG_PACKET_TYPE_CAPS_RESPONSE))
|
||||
{
|
||||
printf("Unexpected PacketId: 0x%08X, Expected TSG_PACKET_TYPE_CAPS_RESPONSE\n", packet->packetId);
|
||||
return FALSE;
|
||||
packetCapsResponse = (PTSG_PACKET_CAPS_RESPONSE) malloc(sizeof(TSG_PACKET_CAPS_RESPONSE));
|
||||
ZeroMemory(packetCapsResponse, sizeof(TSG_PACKET_CAPS_RESPONSE));
|
||||
packet->tsgPacket.packetCapsResponse = packetCapsResponse;
|
||||
|
||||
/* PacketQuarResponsePtr (4 bytes) */
|
||||
packetCapsResponse->pktQuarEncResponse.flags = *((UINT32*) &buffer[40]); /* Flags */
|
||||
packetCapsResponse->pktQuarEncResponse.certChainLen = *((UINT32*) &buffer[44]); /* CertChainLength */
|
||||
/* CertChainDataPtr (4 bytes) */
|
||||
CopyMemory(&packetCapsResponse->pktQuarEncResponse.nonce, &buffer[52], 16); /* Nonce */
|
||||
offset = 68;
|
||||
|
||||
Pointer = *((UINT32*) &buffer[offset]); /* Ptr */
|
||||
offset += 4;
|
||||
|
||||
if (Pointer == 0x0002000C)
|
||||
{
|
||||
/* Not sure exactly what this is */
|
||||
offset += 4; /* 0x00000001 (4 bytes) */
|
||||
offset += 4; /* 0x00000001 (4 bytes) */
|
||||
offset += 4; /* 0x00000000 (4 bytes) */
|
||||
offset += 4; /* 0x00000001 (4 bytes) */
|
||||
}
|
||||
|
||||
Pointer = *((UINT32*) &buffer[offset]); /* Ptr (4 bytes): 0x00020014 */
|
||||
offset += 4;
|
||||
|
||||
offset += 4; /* MaxCount (4 bytes) */
|
||||
offset += 4; /* Offset (4 bytes) */
|
||||
count = *((UINT32*) &buffer[offset]); /* ActualCount (4 bytes) */
|
||||
offset += 4;
|
||||
|
||||
/*
|
||||
* CertChainData is a wide character string, and the count is
|
||||
* given in characters excluding the null terminator, therefore:
|
||||
* size = ((count + 1) * 2)
|
||||
*/
|
||||
offset += ((count + 1) * 2); /* CertChainData */
|
||||
|
||||
versionCaps = (PTSG_PACKET_VERSIONCAPS) malloc(sizeof(TSG_PACKET_VERSIONCAPS));
|
||||
ZeroMemory(versionCaps, sizeof(TSG_PACKET_VERSIONCAPS));
|
||||
packetCapsResponse->pktQuarEncResponse.versionCaps = versionCaps;
|
||||
|
||||
versionCaps->tsgHeader.ComponentId = *((UINT16*) &buffer[offset]); /* ComponentId */
|
||||
versionCaps->tsgHeader.PacketId = *((UINT16*) &buffer[offset + 2]); /* PacketId */
|
||||
offset += 4;
|
||||
|
||||
if (versionCaps->tsgHeader.ComponentId != TS_GATEWAY_TRANSPORT)
|
||||
{
|
||||
printf("Unexpected ComponentId: 0x%04X\n", versionCaps->tsgHeader.ComponentId);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Pointer = *((UINT32*) &buffer[offset]); /* TsgCapsPtr */
|
||||
versionCaps->numCapabilities = *((UINT32*) &buffer[offset + 4]); /* NumCapabilities */
|
||||
versionCaps->majorVersion = *((UINT16*) &buffer[offset + 8]); /* MajorVersion */
|
||||
versionCaps->majorVersion = *((UINT16*) &buffer[offset + 10]); /* MinorVersion */
|
||||
versionCaps->quarantineCapabilities = *((UINT16*) &buffer[offset + 12]); /* QuarantineCapabilities */
|
||||
offset += 14;
|
||||
|
||||
/* 4-byte alignment */
|
||||
rpc_offset_align(&offset, 4);
|
||||
|
||||
tsgCaps = (PTSG_PACKET_CAPABILITIES) malloc(sizeof(TSG_PACKET_CAPABILITIES));
|
||||
ZeroMemory(tsgCaps, sizeof(TSG_PACKET_CAPABILITIES));
|
||||
versionCaps->tsgCaps = tsgCaps;
|
||||
|
||||
offset += 4; /* MaxCount (4 bytes) */
|
||||
tsgCaps->capabilityType = *((UINT32*) &buffer[offset]); /* CapabilityType */
|
||||
SwitchValue = *((UINT32*) &buffer[offset + 4]); /* SwitchValue */
|
||||
offset += 8;
|
||||
|
||||
if ((SwitchValue != TSG_CAPABILITY_TYPE_NAP) ||
|
||||
(tsgCaps->capabilityType != TSG_CAPABILITY_TYPE_NAP))
|
||||
{
|
||||
printf("Unexpected CapabilityType: 0x%08X, Expected TSG_CAPABILITY_TYPE_NAP\n",
|
||||
tsgCaps->capabilityType);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
tsgCaps->tsgPacket.tsgCapNap.capabilities = *((UINT32*) &buffer[offset]); /* Capabilities */
|
||||
offset += 4;
|
||||
|
||||
/* ??? (16 bytes): all zeros */
|
||||
offset += 16;
|
||||
|
||||
offset += 4; /* ContextType (4 bytes) */
|
||||
CopyMemory(tsg->TunnelContext, &buffer[offset], 16); /* ContextUuid */
|
||||
|
||||
/* TODO: trailing bytes */
|
||||
|
||||
#ifdef WITH_DEBUG_TSG
|
||||
printf("TSG TunnelContext:\n");
|
||||
freerdp_hexdump(tsg->TunnelContext, 16);
|
||||
printf("\n");
|
||||
#endif
|
||||
|
||||
free(tsgCaps);
|
||||
free(versionCaps);
|
||||
free(packetCapsResponse);
|
||||
}
|
||||
|
||||
packetCapsResponse = (PTSG_PACKET_CAPS_RESPONSE) malloc(sizeof(TSG_PACKET_CAPS_RESPONSE));
|
||||
ZeroMemory(packetCapsResponse, sizeof(TSG_PACKET_CAPS_RESPONSE));
|
||||
packet->tsgPacket.packetCapsResponse = packetCapsResponse;
|
||||
|
||||
/* PacketQuarResponsePtr (4 bytes) */
|
||||
packetCapsResponse->pktQuarEncResponse.flags = *((UINT32*) &buffer[40]); /* Flags */
|
||||
packetCapsResponse->pktQuarEncResponse.certChainLen = *((UINT32*) &buffer[44]); /* CertChainLength */
|
||||
/* CertChainDataPtr (4 bytes) */
|
||||
CopyMemory(&packetCapsResponse->pktQuarEncResponse.nonce, &buffer[52], 16); /* Nonce */
|
||||
offset = 68;
|
||||
|
||||
Pointer = *((UINT32*) &buffer[offset]); /* Ptr */
|
||||
offset += 4;
|
||||
|
||||
if (Pointer == 0x0002000C)
|
||||
else if ((packet->packetId == TSG_PACKET_TYPE_QUARENC_RESPONSE) && (SwitchValue == TSG_PACKET_TYPE_QUARENC_RESPONSE))
|
||||
{
|
||||
packetQuarEncResponse = (PTSG_PACKET_QUARENC_RESPONSE) malloc(sizeof(TSG_PACKET_QUARENC_RESPONSE));
|
||||
ZeroMemory(packetCapsResponse, sizeof(TSG_PACKET_QUARENC_RESPONSE));
|
||||
packet->tsgPacket.packetQuarEncResponse = packetQuarEncResponse;
|
||||
|
||||
/* PacketQuarResponsePtr (4 bytes) */
|
||||
packetQuarEncResponse->flags = *((UINT32*) &buffer[40]); /* Flags */
|
||||
packetQuarEncResponse->certChainLen = *((UINT32*) &buffer[44]); /* CertChainLength */
|
||||
/* CertChainDataPtr (4 bytes) */
|
||||
CopyMemory(&packetQuarEncResponse->nonce, &buffer[52], 16); /* Nonce */
|
||||
offset = 68;
|
||||
|
||||
Pointer = *((UINT32*) &buffer[offset]); /* Ptr (4 bytes): 0x0002000C */
|
||||
offset += 4;
|
||||
|
||||
offset += 4; /* MaxCount (4 bytes) */
|
||||
offset += 4; /* Offset (4 bytes) */
|
||||
count = *((UINT32*) &buffer[offset]); /* ActualCount (4 bytes) */
|
||||
offset += 4;
|
||||
|
||||
/*
|
||||
* CertChainData is a wide character string, and the count is
|
||||
* given in characters excluding the null terminator, therefore:
|
||||
* size = ((count + 1) * 2)
|
||||
*/
|
||||
offset += ((count + 1) * 2); /* CertChainData */
|
||||
|
||||
versionCaps = (PTSG_PACKET_VERSIONCAPS) malloc(sizeof(TSG_PACKET_VERSIONCAPS));
|
||||
ZeroMemory(versionCaps, sizeof(TSG_PACKET_VERSIONCAPS));
|
||||
packetQuarEncResponse->versionCaps = versionCaps;
|
||||
|
||||
versionCaps->tsgHeader.ComponentId = *((UINT16*) &buffer[offset]); /* ComponentId */
|
||||
versionCaps->tsgHeader.PacketId = *((UINT16*) &buffer[offset + 2]); /* PacketId */
|
||||
offset += 4;
|
||||
|
||||
if (versionCaps->tsgHeader.ComponentId != TS_GATEWAY_TRANSPORT)
|
||||
{
|
||||
printf("Unexpected ComponentId: 0x%04X\n", versionCaps->tsgHeader.ComponentId);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Pointer = *((UINT32*) &buffer[offset]); /* TsgCapsPtr */
|
||||
versionCaps->numCapabilities = *((UINT32*) &buffer[offset + 4]); /* NumCapabilities */
|
||||
versionCaps->majorVersion = *((UINT16*) &buffer[offset + 8]); /* MajorVersion */
|
||||
versionCaps->majorVersion = *((UINT16*) &buffer[offset + 10]); /* MinorVersion */
|
||||
versionCaps->quarantineCapabilities = *((UINT16*) &buffer[offset + 12]); /* QuarantineCapabilities */
|
||||
offset += 14;
|
||||
|
||||
/* 4-byte alignment */
|
||||
rpc_offset_align(&offset, 4);
|
||||
|
||||
/* Not sure exactly what this is */
|
||||
offset += 4; /* 0x00000001 (4 bytes) */
|
||||
offset += 4; /* 0x00000001 (4 bytes) */
|
||||
offset += 4; /* 0x00000000 (4 bytes) */
|
||||
offset += 4; /* 0x00000001 (4 bytes) */
|
||||
}
|
||||
offset += 4; /* 0x00000002 (4 bytes) */
|
||||
|
||||
Pointer = *((UINT32*) &buffer[offset]); /* Ptr (4 bytes): 0x00020014 */
|
||||
offset += 4;
|
||||
offset += 4; /* ContextType (4 bytes) */
|
||||
CopyMemory(tsg->TunnelContext, &buffer[offset], 16); /* ContextUuid */
|
||||
|
||||
offset += 4; /* MaxCount (4 bytes) */
|
||||
offset += 4; /* Offset (4 bytes) */
|
||||
count = *((UINT32*) &buffer[offset]); /* ActualCount (4 bytes) */
|
||||
offset += 4;
|
||||
|
||||
/*
|
||||
* CertChainData is a wide character string, and the count is
|
||||
* given in characters excluding the null terminator, therefore:
|
||||
* size = ((count + 1) * 2)
|
||||
*/
|
||||
offset += ((count + 1) * 2); /* CertChainData */
|
||||
|
||||
versionCaps = (PTSG_PACKET_VERSIONCAPS) malloc(sizeof(TSG_PACKET_VERSIONCAPS));
|
||||
ZeroMemory(versionCaps, sizeof(TSG_PACKET_VERSIONCAPS));
|
||||
packetCapsResponse->pktQuarEncResponse.versionCaps = versionCaps;
|
||||
|
||||
versionCaps->tsgHeader.ComponentId = *((UINT16*) &buffer[offset]); /* ComponentId */
|
||||
versionCaps->tsgHeader.PacketId = *((UINT16*) &buffer[offset + 2]); /* PacketId */
|
||||
offset += 4;
|
||||
|
||||
if (versionCaps->tsgHeader.ComponentId != TS_GATEWAY_TRANSPORT)
|
||||
{
|
||||
printf("Unexpected ComponentId: 0x%04X\n", versionCaps->tsgHeader.ComponentId);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Pointer = *((UINT32*) &buffer[offset]); /* TsgCapsPtr */
|
||||
versionCaps->numCapabilities = *((UINT32*) &buffer[offset + 4]); /* NumCapabilities */
|
||||
versionCaps->majorVersion = *((UINT16*) &buffer[offset + 8]); /* MajorVersion */
|
||||
versionCaps->majorVersion = *((UINT16*) &buffer[offset + 10]); /* MinorVersion */
|
||||
versionCaps->quarantineCapabilities = *((UINT16*) &buffer[offset + 12]); /* QuarantineCapabilities */
|
||||
offset += 14;
|
||||
|
||||
/* 4-byte alignment */
|
||||
rpc_offset_align(&offset, 4);
|
||||
|
||||
tsgCaps = (PTSG_PACKET_CAPABILITIES) malloc(sizeof(TSG_PACKET_CAPABILITIES));
|
||||
ZeroMemory(tsgCaps, sizeof(TSG_PACKET_CAPABILITIES));
|
||||
versionCaps->tsgCaps = tsgCaps;
|
||||
|
||||
offset += 4; /* MaxCount (4 bytes) */
|
||||
tsgCaps->capabilityType = *((UINT32*) &buffer[offset]); /* CapabilityType */
|
||||
SwitchValue = *((UINT32*) &buffer[offset + 4]); /* SwitchValue */
|
||||
offset += 8;
|
||||
|
||||
if ((SwitchValue != TSG_CAPABILITY_TYPE_NAP) ||
|
||||
(tsgCaps->capabilityType != TSG_CAPABILITY_TYPE_NAP))
|
||||
{
|
||||
printf("Unexpected CapabilityType: 0x%08X, Expected TSG_CAPABILITY_TYPE_NAP\n",
|
||||
tsgCaps->capabilityType);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
tsgCaps->tsgPacket.tsgCapNap.capabilities = *((UINT32*) &buffer[offset]); /* Capabilities */
|
||||
offset += 4;
|
||||
|
||||
/* ??? (16 bytes): all zeros */
|
||||
offset += 16;
|
||||
|
||||
offset += 4; /* ContextType (4 bytes) */
|
||||
CopyMemory(tsg->TunnelContext, &buffer[offset], 16); /* ContextUuid */
|
||||
|
||||
/* TODO: trailing bytes */
|
||||
/* TODO: trailing bytes */
|
||||
|
||||
#ifdef WITH_DEBUG_TSG
|
||||
printf("TSG TunnelContext:\n");
|
||||
freerdp_hexdump(tsg->TunnelContext, 16);
|
||||
printf("\n");
|
||||
printf("TSG TunnelContext:\n");
|
||||
freerdp_hexdump(tsg->TunnelContext, 16);
|
||||
printf("\n");
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Unexpected PacketId: 0x%08X, Expected TSG_PACKET_TYPE_CAPS_RESPONSE "
|
||||
"or TSG_PACKET_TYPE_QUARENC_RESPONSE\n", packet->packetId);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
free(tsgCaps);
|
||||
free(versionCaps);
|
||||
free(packetCapsResponse);
|
||||
free(packet);
|
||||
|
||||
return TRUE;
|
||||
|
|
Loading…
Reference in New Issue