void ntlm_read_version_info(PStream s, NTLM_VERSION_INFO* versionInfo) { StreamRead_UINT8(s, versionInfo->ProductMajorVersion); /* ProductMajorVersion (1 byte) */ StreamRead_UINT8(s, versionInfo->ProductMinorVersion); /* ProductMinorVersion (1 byte) */ StreamRead_UINT16(s, versionInfo->ProductBuild); /* ProductBuild (2 bytes) */ StreamRead(s, versionInfo->Reserved, sizeof(versionInfo->Reserved)); /* Reserved (3 bytes) */ StreamRead_UINT8(s, versionInfo->NTLMRevisionCurrent); /* NTLMRevisionCurrent (1 byte) */ }
void ntlm_read_ntlm_v2_client_challenge(PStream s, NTLMv2_CLIENT_CHALLENGE* challenge) { size_t size; StreamRead_UINT8(s, challenge->RespType); StreamRead_UINT8(s, challenge->HiRespType); StreamRead_UINT16(s, challenge->Reserved1); StreamRead_UINT32(s, challenge->Reserved2); StreamRead(s, challenge->Timestamp, 8); StreamRead(s, challenge->ClientChallenge, 8); StreamRead_UINT32(s, challenge->Reserved3); size = StreamRemainingSize(s); challenge->AvPairs = (NTLM_AV_PAIR*) malloc(size); StreamRead(s, challenge->AvPairs, size); }
void ntlm_input_av_pairs(NTLM_CONTEXT* context, PStream s) { AV_ID AvId; UINT16 AvLen; BYTE* value; AV_PAIRS* av_pairs = context->av_pairs; #ifdef WITH_DEBUG_NTLM printf("AV_PAIRS = {\n"); #endif do { value = NULL; StreamRead_UINT16(s, AvId); StreamRead_UINT16(s, AvLen); if (AvLen > 0) { if (AvId != MsvAvFlags) { value = malloc(AvLen); StreamRead(s, value, AvLen); } else { StreamRead_UINT32(s, av_pairs->Flags); } } switch (AvId) { case MsvAvNbComputerName: av_pairs->NbComputerName.length = AvLen; av_pairs->NbComputerName.value = value; break; case MsvAvNbDomainName: av_pairs->NbDomainName.length = AvLen; av_pairs->NbDomainName.value = value; break; case MsvAvDnsComputerName: av_pairs->DnsComputerName.length = AvLen; av_pairs->DnsComputerName.value = value; break; case MsvAvDnsDomainName: av_pairs->DnsDomainName.length = AvLen; av_pairs->DnsDomainName.value = value; break; case MsvAvDnsTreeName: av_pairs->DnsTreeName.length = AvLen; av_pairs->DnsTreeName.value = value; break; case MsvAvTimestamp: av_pairs->Timestamp.length = AvLen; av_pairs->Timestamp.value = value; break; case MsvAvRestrictions: av_pairs->Restrictions.length = AvLen; av_pairs->Restrictions.value = value; break; case MsvAvTargetName: av_pairs->TargetName.length = AvLen; av_pairs->TargetName.value = value; break; case MsvChannelBindings: av_pairs->ChannelBindings.length = AvLen; av_pairs->ChannelBindings.value = value; break; default: if (value != NULL) free(value); break; } #ifdef WITH_DEBUG_NTLM if (AvId < 10) printf("\tAvId: %s, AvLen: %d\n", AV_PAIRS_STRINGS[AvId], AvLen); else printf("\tAvId: %s, AvLen: %d\n", "Unknown", AvLen); winpr_HexDump(value, AvLen); #endif } while (AvId != MsvAvEOL); #ifdef WITH_DEBUG_NTLM printf("}\n"); #endif }