linklayerprotocols/pppnif/SPPP/mschap2.h
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/pppnif/SPPP/mschap2.h	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,211 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Extensions, Version 2 (MS-CHAP-V2) - RFC 2759, except the
+// authenticator-controlled authentication retry mechanisms and the
+// password changing mechanisms - this is in accordance with the
+// requirements.
+// 
+//
+
+/**
+ @file
+ @brief Header file for the implementation of Microsoft PPP CHAP
+ @internalComponent
+*/
+
+#ifndef __MSCHAP2_H__
+#define __MSCHAP2_H__
+
+#include "PPPCHAP.H"
+
+// protocol specific constants for MS-CHAP-V2
+
+/**
+   The size of the MS-CHAP-V2 Authenticator Challenge.
+   @internalComponent
+*/
+const TUint8 KPppMsChap2AuthenticatorChallengeSize 	= 16u;
+
+/**
+   The size of the MS-CHAP-V2 Response Peer-Challenge subfield.
+   @internalComponent
+*/
+const TUint8 KPppMsChap2PeerChallengeSize = 16u;
+
+/**
+   The size of the MS-CHAP-V2 Response Reserved subfield.
+   @internalComponent
+*/
+const TUint8 KPppMsChap2ResponseReservedSize = 8u;
+
+/**
+   The size of the MS-CHAP-V2 NT-Response subfield.
+   @internalComponent
+*/
+const TUint8 KPppMsChap2NTResponseSize = 24u;
+
+/**
+   The size of the MS-CHAP-V2 Response Flags subfield.
+   @internalComponent
+*/
+const TUint8 KPppMsChap2ResponseFlagsSize = 1u;
+
+/**
+   The size of the CHAP Response Value for MS-CHAP-V2.
+   @internalComponent
+*/
+const TUint8 KPppMsChap2ResponseValueSize =
+				KPppMsChap2PeerChallengeSize + 
+				KPppMsChap2ResponseReservedSize +
+				KPppMsChap2NTResponseSize + 
+				KPppMsChap2ResponseFlagsSize;
+
+
+/**
+   The size of the MS-CHAP-V2 password hash.
+   @internalComponent
+*/
+const TUint8 KPppMsChap2HashSize = 16u;
+
+/**
+   The size of the MS-CHAP padded password hash.
+   @internalComponent
+*/
+const TUint8 KPppMsChap2PaddedHashSize = 21u;
+
+/**
+   The size of the MS-CHAP-V2 challenge hash (the hash of the peer
+   challenge, authenticator challenge and username).
+   @internalComponent
+*/
+const TUint8 KPppMsChap2ChallengeHashSize = 8u;
+
+/**
+   The size of the MS-CHAP-V2 Authenticator Response Value encoded in
+   the format "S=<auth_string>" as specified in RFC 2759.
+   @internalComponent
+*/
+const TUint8 KPppMsChap2AuthenticatorResponseSize = 42u;
+
+
+/*final*/ NONSHARABLE_CLASS(CPppMsChap2) : public CPppChap
+/**
+   Class that implements the Microsoft PPP CHAP Extensions, Version 2
+   (MS-CHAP-V2) - RFC 2759, except the authenticator-controlled
+   authentication retry mechanisms and the password changing
+   mechanisms - this is in accordance with the requirements.
+   @internalComponent
+*/
+	{
+  public:
+	static CPppAuthentication* NewL();
+
+	virtual ~CPppMsChap2();
+
+	virtual void InitL(CPppLcp* aLcp);
+
+  protected:
+	virtual void CheckChallengePacketL(RMBufPacket& aPacket);
+
+	virtual void SuccessL(RMBufPacket& aPacket);
+
+	virtual void FailureL(RMBufPacket& aPacket);
+
+	virtual void MakeResponseL(TUint8 aChallengeId, 
+							   const TDesC8& aChallengeValue, 
+							   TPtrC8& aResponseValue, 
+							   TPtrC8& aResponseName);
+
+  private:
+
+	CPppMsChap2();
+
+	static void GeneratePeerChallengeL(TDes8& aChallenge);
+
+	static void GenerateNTResponseL(
+					const TDesC8& aAuthenticatorChallenge, 
+					const TDesC8& aPeerChallenge, 
+					const TDesC8& aUserName, 
+					const TDesC16& aPassword, 
+					TDes8& aResponse);
+
+	static void ChallengeHashL(const TDesC8& aPeerChallenge, 
+							   const TDesC8& aAuthenticatorChallenge, 
+							   const TDesC8& aUserName, 
+							   TDes8& aChallengeHash);
+
+	static void NtPasswordHashL(const TDesC16& aPassword, 
+								TDes8& aPasswordHash);
+
+	static void ChallengeResponseL(const TDesC8& aChallengeHash, 
+								   TDes8& aPaddablePasswordHash, 
+								   TDes8& aResponse);
+
+	static void HashNtPasswordHashL(const TDesC8& aPasswordHash, 
+									TDes8& aPasswordHashHash);
+
+	static void GenerateAuthenticatorResponseL(
+					const TDesC16& aPassword, 
+					const TDesC8& aNTResponse, 
+					const TDesC8& aPeerChallenge, 
+					const TDesC8& aAuthenticatorChallenge, 
+					const TDesC8& aUserName, 
+					TDes8& aAuthenticatorResponse);
+
+	static void DesEncryptL(const TDesC8& aClear, 
+							const TDesC8& aKey,
+							TDes8& aCypher);
+
+	static void ProcessFailureMessageL(const TDesC8& aFailureMessage,
+									   TUint& aErrorCode, 
+									   TUint8& aRetryFlag, 
+									   TDes8& aAuthChallenge,
+									   TUint8& passwordProtoVersion, 
+									   TPtrC8& aMessage);
+
+	static TInt TranslateMsChapError(TUint aMsChapError);
+
+	void RetryPasswordL();
+
+  private:
+/** Buffer containing the MS-CHAP-V2 Response Value */
+	TBuf8<KPppMsChap2ResponseValueSize> iResponseValue;
+
+/** Buffer containing the expected MS-CHAP-V2 Authenticator Response
+Value encoded in the format "S=<auth_string>" as specified in RFC 2759
+(42 octets). */
+	TBuf8<KPppMsChap2AuthenticatorResponseSize> 
+		iAuthenticatorResponse;
+
+#ifdef _UNICODE
+/* Buffer containing the username. */
+	HBufC8* iUserName;
+#endif
+	};
+
+
+inline CPppAuthentication* CPppMsChap2::NewL()
+/**
+   Object factory for CPppMsChap2.
+   @leave Standard Symbian OS error codes. e.g. KErrNoMemory.
+   @note This function will not initialize the created object.  The
+   InitL member function shall be called first in order to initialize
+   the created object before using it.  This behavior is in agreement
+   with the requirements for a migration to a plugin architecture.
+*/
+	{
+	return new(ELeave) CPppMsChap2;
+	}
+
+#endif //__MSCHAP2_H__