00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef KNTLM_H
00021 #define KNTLM_H
00022
00023 #include <QtCore/QBool>
00024 #include <QtCore/QByteRef>
00025 #include <QtCore/QString>
00026
00027 #include "kntlm_export.h"
00028
00041 class KNTLM_EXPORT KNTLM {
00042 public:
00043
00044 enum Flags {
00045 Negotiate_Unicode = 0x00000001,
00046 Negotiate_OEM = 0x00000002,
00047 Request_Target = 0x00000004,
00048 Negotiate_Sign = 0x00000010,
00049 Negotiate_Seal = 0x00000020,
00050 Negotiate_Datagram_Style = 0x00000040,
00051 Negotiate_LM_Key = 0x00000080,
00052 Negotiate_Netware = 0x00000100,
00053 Negotiate_NTLM = 0x00000200,
00054 Negotiate_Domain_Supplied = 0x00001000,
00055 Negotiate_WS_Supplied = 0x00002000,
00056 Negotiate_Local_Call = 0x00004000,
00057 Negotiate_Always_Sign = 0x00008000,
00058 Target_Type_Domain = 0x00010000,
00059 Target_Type_Server = 0x00020000,
00060 Target_Type_Share = 0x00040000,
00061 Negotiate_NTLM2_Key = 0x00080000,
00062 Request_Init_Response = 0x00100000,
00063 Request_Accept_Response = 0x00200000,
00064 Request_NonNT_Key = 0x00400000,
00065 Negotiate_Target_Info = 0x00800000,
00066 Negotiate_128 = 0x20000000,
00067 Negotiate_Key_Exchange = 0x40000000,
00068 Negotiate_56 = 0x80000000
00069 };
00070
00071 enum AuthFlag {
00072 Force_V1 = 0x1,
00073 Force_V2 = 0x2,
00074 Add_LM = 0x4
00075 };
00076
00077 Q_DECLARE_FLAGS( AuthFlags, AuthFlag )
00078
00079 typedef struct
00080 {
00081 quint16 len;
00082 quint16 maxlen;
00083 quint32 offset;
00084 } SecBuf;
00085
00089 typedef struct
00090 {
00091 char signature[8];
00092 quint32 msgType;
00093 quint32 flags;
00094 SecBuf domain;
00095 SecBuf workstation;
00096 } Negotiate;
00097
00101 typedef struct
00102 {
00103 char signature[8];
00104 quint32 msgType;
00105 SecBuf targetName;
00106 quint32 flags;
00107 quint8 challengeData[8];
00108 quint32 context[2];
00109 SecBuf targetInfo;
00110 } Challenge;
00111
00115 typedef struct
00116 {
00117 char signature[8];
00118 quint32 msgType;
00119 SecBuf lmResponse;
00120 SecBuf ntResponse;
00121 SecBuf domain;
00122 SecBuf user;
00123 SecBuf workstation;
00124 SecBuf sessionKey;
00125 quint32 flags;
00126 } Auth;
00127
00128 typedef struct
00129 {
00130 quint32 signature;
00131 quint32 reserved;
00132 quint64 timestamp;
00133 quint8 challenge[8];
00134 quint8 unknown[4];
00135
00136 } Blob;
00137
00148 static bool getNegotiate( QByteArray &negotiate, const QString &domain = QString(),
00149 const QString &workstation = QString(),
00150 quint32 flags = Negotiate_Unicode | Request_Target | Negotiate_NTLM );
00171 static bool getAuth( QByteArray &auth, const QByteArray &challenge, const QString &user,
00172 const QString &password, const QString &domain = QString(),
00173 const QString &workstation = QString(), AuthFlags authflags = Add_LM );
00174
00178 static QByteArray getLMResponse( const QString &password, const unsigned char *challenge );
00182 static QByteArray lmHash( const QString &password );
00186 static QByteArray lmResponse( const QByteArray &hash, const unsigned char *challenge );
00187
00191 static QByteArray getNTLMResponse( const QString &password, const unsigned char *challenge );
00195 static QByteArray ntlmHash( const QString &password );
00196
00200 static QByteArray getNTLMv2Response( const QString &target, const QString &user,
00201 const QString &password, const QByteArray &targetInformation,
00202 const unsigned char *challenge );
00203
00207 static QByteArray getLMv2Response( const QString &target, const QString &user,
00208 const QString &password, const unsigned char *challenge );
00209
00213 static QByteArray ntlmv2Hash( const QString &target, const QString &user, const QString &password );
00214
00218 static QByteArray lmv2Response( const QByteArray &hash,
00219 const QByteArray &clientData, const unsigned char *challenge );
00220 };
00221
00222 Q_DECLARE_OPERATORS_FOR_FLAGS( KNTLM::AuthFlags )
00223
00224 #endif