# Poco::Net

# class NTLMCredentials

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.