#ifndef NET_NTLM_NTLM_CONSTANTS_H_
#define NET_NTLM_NTLM_CONSTANTS_H_
#include <stddef.h>
#include <stdint.h>
#include <array>
#include <type_traits>
#include <vector>
#include "net/base/net_export.h"
namespace net::ntlm {
struct SecurityBuffer {
SecurityBuffer(uint32_t offset, uint16_t length)
: offset(offset), length(length) {}
SecurityBuffer() : SecurityBuffer(0, 0) {}
uint32_t offset;
uint16_t length;
};
struct NtlmFeatures {
explicit NtlmFeatures(bool enable_NTLMv2) : enable_NTLMv2(enable_NTLMv2) {}
bool enable_NTLMv2 = true;
bool enable_MIC = true;
bool enable_EPA = true;
};
enum class MessageType : uint32_t {
kNegotiate = 0x01,
kChallenge = 0x02,
kAuthenticate = 0x03,
};
enum class NegotiateFlags : uint32_t {
kNone = 0,
kUnicode = 0x01,
kOem = 0x02,
kRequestTarget = 0x04,
kNtlm = 0x200,
kAlwaysSign = 0x8000,
kExtendedSessionSecurity = 0x80000,
kTargetInfo = 0x800000,
};
constexpr NegotiateFlags operator|(NegotiateFlags lhs, NegotiateFlags rhs) {
using TFlagsInt = std::underlying_type<NegotiateFlags>::type;
return static_cast<NegotiateFlags>(static_cast<TFlagsInt>(lhs) |
static_cast<TFlagsInt>(rhs));
}
constexpr NegotiateFlags operator&(NegotiateFlags lhs, NegotiateFlags rhs) {
using TFlagsInt = std::underlying_type<NegotiateFlags>::type;
return static_cast<NegotiateFlags>(static_cast<TFlagsInt>(lhs) &
static_cast<TFlagsInt>(rhs));
}
enum class TargetInfoAvId : uint16_t {
kEol = 0x0000,
kServerName = 0x00001,
kDomainName = 0x00002,
kFlags = 0x0006,
kTimestamp = 0x0007,
kTargetName = 0x0009,
kChannelBindings = 0x000A,
};
enum class TargetInfoAvFlags : uint32_t {
kNone = 0,
kMicPresent = 0x00000002,
};
using TAvFlagsInt = std::underlying_type<TargetInfoAvFlags>::type;
constexpr TargetInfoAvFlags operator|(TargetInfoAvFlags lhs,
TargetInfoAvFlags rhs) {
return static_cast<TargetInfoAvFlags>(static_cast<TAvFlagsInt>(lhs) |
static_cast<TAvFlagsInt>(rhs));
}
constexpr TargetInfoAvFlags operator&(TargetInfoAvFlags lhs,
TargetInfoAvFlags rhs) {
return static_cast<TargetInfoAvFlags>(static_cast<TAvFlagsInt>(lhs) &
static_cast<TAvFlagsInt>(rhs));
}
struct NET_EXPORT_PRIVATE AvPair {
AvPair();
AvPair(TargetInfoAvId avid, uint16_t avlen);
AvPair(TargetInfoAvId avid, std::vector<uint8_t> buffer);
template <size_t N>
AvPair(TargetInfoAvId avid, std::array<uint8_t, N> buffer)
: buffer(buffer.begin(), buffer.end()), avid(avid), avlen(N) {}
AvPair(const AvPair& other);
AvPair(AvPair&& other);
~AvPair();
AvPair& operator=(const AvPair& other);
AvPair& operator=(AvPair&& other);
std::vector<uint8_t> buffer;
uint64_t timestamp = 0;
TargetInfoAvFlags flags = TargetInfoAvFlags::kNone;
TargetInfoAvId avid = TargetInfoAvId::kEol;
uint16_t avlen = 0;
};
static constexpr uint8_t kSignature[] = "NTLMSSP";
static constexpr size_t kSignatureLen = std::size(kSignature);
static constexpr uint16_t kProofInputVersionV2 = 0x0101;
static constexpr size_t kSecurityBufferLen =
(2 * sizeof(uint16_t)) + sizeof(uint32_t);
static constexpr size_t kNegotiateMessageLen = 32;
static constexpr size_t kMinChallengeHeaderLen = 32;
static constexpr size_t kChallengeHeaderLen = 48;
static constexpr size_t kResponseLenV1 = 24;
static constexpr size_t kChallengeLen = 8;
static constexpr size_t kVersionFieldLen = 8;
static constexpr size_t kNtlmHashLen = 16;
static constexpr size_t kNtlmProofLenV2 = kNtlmHashLen;
static constexpr size_t kSessionKeyLenV2 = kNtlmHashLen;
static constexpr size_t kMicLenV2 = kNtlmHashLen;
static constexpr size_t kChannelBindingsHashLen = kNtlmHashLen;
static constexpr size_t kEpaUnhashedStructHeaderLen = 20;
static constexpr size_t kProofInputLenV2 = 28;
static constexpr size_t kAvPairHeaderLen = 2 * sizeof(uint16_t);
static constexpr size_t kNtlmResponseHeaderLenV2 =
kNtlmProofLenV2 + kProofInputLenV2;
static constexpr size_t kAuthenticateHeaderLenV1 = 64;
static constexpr size_t kMicOffsetV2 = 72;
static constexpr size_t kAuthenticateHeaderLenV2 = 88;
static constexpr size_t kMaxFqdnLen = 255;
static constexpr size_t kMaxUsernameLen = 104;
static constexpr size_t kMaxPasswordLen = 256;
static constexpr NegotiateFlags kNegotiateMessageFlags =
NegotiateFlags::kUnicode | NegotiateFlags::kOem |
NegotiateFlags::kRequestTarget | NegotiateFlags::kNtlm |
NegotiateFlags::kAlwaysSign | NegotiateFlags::kExtendedSessionSecurity;
}
#endif