void ntlm_write_version_info(PStream s, NTLM_VERSION_INFO* versionInfo) { StreamWrite_UINT8(s, versionInfo->ProductMajorVersion); /* ProductMajorVersion (1 byte) */ StreamWrite_UINT8(s, versionInfo->ProductMinorVersion); /* ProductMinorVersion (1 byte) */ StreamWrite_UINT16(s, versionInfo->ProductBuild); /* ProductBuild (2 bytes) */ StreamWrite(s, versionInfo->Reserved, sizeof(versionInfo->Reserved)); /* Reserved (3 bytes) */ StreamWrite_UINT8(s, versionInfo->NTLMRevisionCurrent); /* NTLMRevisionCurrent (1 byte) */ }
void ntlm_write_ntlm_v2_client_challenge(PStream s, NTLMv2_CLIENT_CHALLENGE* challenge) { ULONG length; StreamWrite_UINT8(s, challenge->RespType); StreamWrite_UINT8(s, challenge->HiRespType); StreamWrite_UINT16(s, challenge->Reserved1); StreamWrite_UINT32(s, challenge->Reserved2); StreamWrite(s, challenge->Timestamp, 8); StreamWrite(s, challenge->ClientChallenge, 8); StreamWrite_UINT32(s, challenge->Reserved3); length = ntlm_av_pair_list_length(challenge->AvPairs); StreamWrite(s, challenge->AvPairs, length); }
void ntlm_output_av_pairs(NTLM_CONTEXT* context, PSecBuffer buffer) { PStream s; AV_PAIRS* av_pairs = context->av_pairs; s = PStreamAllocAttach(buffer->pvBuffer, buffer->cbBuffer); if (av_pairs->NbDomainName.length > 0) { StreamWrite_UINT16(s, MsvAvNbDomainName); /* AvId */ StreamWrite_UINT16(s, av_pairs->NbDomainName.length); /* AvLen */ StreamWrite(s, av_pairs->NbDomainName.value, av_pairs->NbDomainName.length); /* Value */ } if (av_pairs->NbComputerName.length > 0) { StreamWrite_UINT16(s, MsvAvNbComputerName); /* AvId */ StreamWrite_UINT16(s, av_pairs->NbComputerName.length); /* AvLen */ StreamWrite(s, av_pairs->NbComputerName.value, av_pairs->NbComputerName.length); /* Value */ } if (av_pairs->DnsDomainName.length > 0) { StreamWrite_UINT16(s, MsvAvDnsDomainName); /* AvId */ StreamWrite_UINT16(s, av_pairs->DnsDomainName.length); /* AvLen */ StreamWrite(s, av_pairs->DnsDomainName.value, av_pairs->DnsDomainName.length); /* Value */ } if (av_pairs->DnsComputerName.length > 0) { StreamWrite_UINT16(s, MsvAvDnsComputerName); /* AvId */ StreamWrite_UINT16(s, av_pairs->DnsComputerName.length); /* AvLen */ StreamWrite(s, av_pairs->DnsComputerName.value, av_pairs->DnsComputerName.length); /* Value */ } if (av_pairs->DnsTreeName.length > 0) { StreamWrite_UINT16(s, MsvAvDnsTreeName); /* AvId */ StreamWrite_UINT16(s, av_pairs->DnsTreeName.length); /* AvLen */ StreamWrite(s, av_pairs->DnsTreeName.value, av_pairs->DnsTreeName.length); /* Value */ } if (av_pairs->Timestamp.length > 0) { StreamWrite_UINT16(s, MsvAvTimestamp); /* AvId */ StreamWrite_UINT16(s, av_pairs->Timestamp.length); /* AvLen */ StreamWrite(s, av_pairs->Timestamp.value, av_pairs->Timestamp.length); /* Value */ } if (av_pairs->Flags > 0) { StreamWrite_UINT16(s, MsvAvFlags); /* AvId */ StreamWrite_UINT16(s, 4); /* AvLen */ StreamWrite_UINT32(s, av_pairs->Flags); /* Value */ } if (av_pairs->Restrictions.length > 0) { StreamWrite_UINT16(s, MsvAvRestrictions); /* AvId */ StreamWrite_UINT16(s, av_pairs->Restrictions.length); /* AvLen */ StreamWrite(s, av_pairs->Restrictions.value, av_pairs->Restrictions.length); /* Value */ } if (av_pairs->ChannelBindings.length > 0) { StreamWrite_UINT16(s, MsvChannelBindings); /* AvId */ StreamWrite_UINT16(s, av_pairs->ChannelBindings.length); /* AvLen */ StreamWrite(s, av_pairs->ChannelBindings.value, av_pairs->ChannelBindings.length); /* Value */ } if (av_pairs->TargetName.length > 0) { StreamWrite_UINT16(s, MsvAvTargetName); /* AvId */ StreamWrite_UINT16(s, av_pairs->TargetName.length); /* AvLen */ StreamWrite(s, av_pairs->TargetName.value, av_pairs->TargetName.length); /* Value */ } /* This indicates the end of the AV_PAIR array */ StreamWrite_UINT16(s, MsvAvEOL); /* AvId */ StreamWrite_UINT16(s, 0); /* AvLen */ if (context->ntlm_v2) { StreamZero(s, 8); } free(s); }