Library: Net
Package: NTLM
Header: Poco/Net/NTLMCredentials.h
Description
This is a utility class for working with NTLMv2 Authentication.
Note: This implementation is based on the "The NTLM Authentication Protocol and Security Support Provider" document written by Eric Glass and avilable from http://davenport.sourceforge.net/ntlm.html and the NT LAN Manager (NTLM) Authentication Protocol [MS-NLMP] document by Microsoft.
Member Summary
Member Functions: createLMv2Response, createNTLMv2Hash, createNTLMv2Response, createNonce, createPasswordHash, createTimestamp, formatAuthenticateMessage, formatNegotiateMessage, fromBase64, parseChallengeMessage, readBufferDesc, splitUsername, toBase64, writeBufferDesc
Nested Classes
struct AuthenticateMessage
This message is sent from the client to authenticate itself by providing a response to the server challenge.
struct BufferDesc
struct ChallengeMessage
This message is sent back by the server and contains the NTLM challenge.
struct NegotiateMessage
This message is sent from the client to initiate NTLM authentication.
Enumerations
Anonymous
NTLM_MESSAGE_TYPE_NEGOTIATE = 0x01
NTLM_MESSAGE_TYPE_CHALLENGE = 0x02
NTLM_MESSAGE_TYPE_AUTHENTICATE = 0x03
Anonymous
NTLM_FLAG_NEGOTIATE_UNICODE = 0x00000001
NTLM_FLAG_NEGOTIATE_OEM = 0x00000002
NTLM_FLAG_REQUEST_TARGET = 0x00000004
NTLM_FLAG_NEGOTIATE_NTLM = 0x00000200
NTLM_FLAG_DOMAIN_SUPPLIED = 0x00001000
NTLM_FLAG_WORKST_SUPPLIED = 0x00002000
NTLM_FLAG_NEGOTIATE_LOCAL = 0x00004000
NTLM_FLAG_NEGOTIATE_ALWAYS_SIGN = 0x00008000
NTLM_FLAG_NEGOTIATE_NTLM2_KEY = 0x00080000
NTLM_FLAG_TARGET_DOMAIN = 0x00010000
NTLM_FLAG_TARGET_SERVER = 0x00020000
NTLM_FLAG_TARGET_SHARE = 0x00040000
NTLM_FLAG_NEGOTIATE_TARGET = 0x00800000
NTLM_FLAG_NEGOTIATE_128 = 0x20000000
NTLM_FLAG_NEGOTIATE_56 = 0x80000000
Member Functions
createLMv2Response
static std::vector < unsigned char > createLMv2Response(
const std::vector < unsigned char > & ntlm2Hash,
const std::vector < unsigned char > & challenge,
const std::vector < unsigned char > & nonce
);
Creates the LMv2 response by computing the HMAC-MD5 of the challenge and nonce, using the ntlm2Hash (see createNTLMv2Hash()) as HMAC passphrase.
createNTLMv2Hash
static std::vector < unsigned char > createNTLMv2Hash(
const std::string & username,
const std::string & target,
const std::string & password
);
Creates the NTLMv2 hash, which is the HMAC-MD5 of the concatenated UTF-16 uppercase username and target, using the password hash as HMAC passphrase.
createNTLMv2Response
static std::vector < unsigned char > createNTLMv2Response(
const std::vector < unsigned char > & ntlm2Hash,
const std::vector < unsigned char > & challenge,
const std::vector < unsigned char > & nonce,
const std::vector < unsigned char > & targetInfo,
Poco::UInt64 timestamp
);
Creates the NTLMv2 response by creating the "blob" and prepending its HMAC-MD5, using the ntlm2Hash as HMAC passphrase.
createNonce
static std::vector < unsigned char > createNonce();
Creates an 8-byte client nonce for NTLM authentication.
createPasswordHash
static std::vector < unsigned char > createPasswordHash(
const std::string & password
);
Creates the NTLM password hash (MD4 of UTF-16-converted password).
createTimestamp
static Poco::UInt64 createTimestamp();
Creates the NTLM timestamp in tenths of a microsecond since January 1, 1601, using the current system time.
formatAuthenticateMessage
static std::vector < unsigned char > formatAuthenticateMessage(
const AuthenticateMessage & message
);
Creates the NTLM Type 3 Authenticate message used for sending the response to the challenge.
formatNegotiateMessage
static std::vector < unsigned char > formatNegotiateMessage(
const NegotiateMessage & message
);
Creates the NTLM Type 1 Negotiate message used for initiating NTLM authentication from the client.
fromBase64
static std::vector < unsigned char > fromBase64(
const std::string & base64
);
Decodes the given base64-encoded string.
parseChallengeMessage
static bool parseChallengeMessage(
const unsigned char * buffer,
std::size_t size,
ChallengeMessage & message
);
Parses a NTLM Type 2 Challenge message.
Returns true if the message was parsed successfully, otherwise false.
readBufferDesc
static void readBufferDesc(
Poco::BinaryReader & reader,
BufferDesc & desc
);
Reads a buffer descriptor.
splitUsername
static void splitUsername(
const std::string & usernameAndDomain,
std::string & username,
std::string & domain
);
Splits a username containing a domain into plain username and domain. Supported formats are <DOMAIN>\<username> and <username>@<DOMAIN>.
toBase64
static std::string toBase64(
const std::vector < unsigned char > & buffer
);
Converts the buffer to a base64-encoded string.
writeBufferDesc
static void writeBufferDesc(
Poco::BinaryWriter & writer,
const BufferDesc & desc
);
Writes a buffer descriptor.
Variables
NTLMSSP
static const std::string NTLMSSP;
Message signature string.