linklayerprotocols/pppnif/SPPP/PPPCHAP.H
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/pppnif/SPPP/PPPCHAP.H	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,232 @@
+// 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:
+// Authentication Protocol (CHAP) - RFC 1994, containing source code
+// common to all PPP authentication protocols derived from CHAP.
+// 
+//
+
+/**
+ @file
+ @brief Header file for the implementation of PPP Challenge Handshake
+ @internalComponent 
+*/
+
+#ifndef __PPPCHAP_H__
+#define __PPPCHAP_H__
+
+// use RMBufChain, RMBufPacket
+#include <nifmbuf.h>
+#include "PPPAUTH.H"
+
+
+// protocol specific constants for CHAP
+
+/**
+   The value of the CHAP Challenge Code.
+   @internalComponent
+*/
+const TUint8 KPppChapChallengeCode = 1u;
+
+/**
+   The value of the CHAP Response Code.
+   @internalComponent
+*/
+const TUint8 KPppChapResponseCode = 2u;
+
+/**
+   The value of the CHAP Success Code.
+   @internalComponent
+*/
+const TUint8 KPppChapSuccessCode = 3u;
+
+/**
+   The value of the CHAP Failure Code.
+   @internalComponent
+*/
+const TUint8 KPppChapFailureCode = 4u;
+
+
+/**
+   The size of the CHAP Code field.
+   @internalComponent
+*/
+const TUint8 KPppChapCodeFieldSize = 1u;
+
+/**
+   The size of the CHAP Identifier field.
+   @internalComponent
+*/
+const TUint8 KPppChapIdFieldSize = 1u;
+
+/**
+   The size of the CHAP Length field.
+   @internalComponent
+*/
+const TUint8 KPppChapLengthFieldSize = 2u;
+
+/**
+   The size of the CHAP Value-Size field.
+   @internalComponent
+*/
+const TUint8 KPppChapValueSizeFieldSize = 1u;
+
+/**
+   The minimum size of the CHAP Value field of Challenge & Response
+   packets.
+   @internalComponent
+*/
+const TUint8 KPppChapMinValueSize = 1u;
+
+/**
+   The minimum size of the CHAP Name field of Challenge & Response
+   packets.
+   @note While RFC 1994 states that: "The Name field is one or more
+   octets [...]", in the case of MS-CHAP-V1 and MS-CHAP-V2 the Name
+   field of the Challenge packet may be empty.  RFC2433 and RFC2759
+   state that: "Microsoft authenticators do not currently provide
+   information in the Name field.  This may change in the future."
+   @internalComponent
+*/
+const TUint8 KPppChapMinNameSize = 1u;
+
+
+/**
+   Default period of the timer used for CHAP response retries.
+   @internalComponent
+*/
+const TInt KPppChapResponseRetryTimerPeriod = 3000;
+
+/**
+   Default number of CHAP response retries.
+   @internalComponent
+*/
+const TInt KPppChapMaxResponseRetryCount = 4;
+
+NONSHARABLE_CLASS(CPppChap) : public CPppAuthentication, protected MTimer
+/**
+   Abstract base class for classes that implement the PPP Challenge
+   Handshake Authentication Protocol (CHAP) or other PPP
+   authentication protocols derived from CHAP - RFC 1994.
+   @internalComponent
+*/
+	{
+  public:
+	virtual ~CPppChap();
+
+	virtual void InitL(CPppLcp* aLcp);
+
+	virtual void AuthenticateComplete(TInt aStatus);
+
+	virtual TBool RecvFrame(RMBufChain& aPacket);
+
+	virtual void LowerLayerUp();
+
+	virtual void LowerLayerDown(TInt aStatus=KErrNone);
+
+
+  protected:
+
+	virtual void TimerComplete(TInt aStatus);
+
+	/*final*/ virtual TUint PppId() const;
+
+	virtual void ChallengeL(RMBufPacket& aPacket);
+
+	virtual void SuccessL(RMBufPacket& aPacket);
+
+	virtual void FailureL(RMBufPacket& aPacket);
+
+	virtual void CheckChallengePacketL(RMBufPacket& aPacket);
+
+
+/**
+   Computes the CHAP Response Value and the CHAP Response Name.
+   @param aChallengeId [in] The CHAP Challenge Identifier.
+   @param aChallengeValue [in] The CHAP Challenge Value.
+   @param aResponseValue [out] The CHAP Response Value.
+   @param aResponseName [out] The CHAP Response Name.
+*/
+	virtual void MakeResponseL(TUint8 aChallengeId,
+							   const TDesC8& aChallengeValue,
+							   TPtrC8& aResponseValue,
+							   TPtrC8& aResponseName)=0;
+
+	void ProcessChallengePacketL(RMBufPacket& aPacket);
+
+	void RespondL();
+
+	void RetryResponseL();
+
+	void SendResponseL(TUint8 aResponseId, 
+					   const TDesC8& aResponseValue, 
+					   const TDesC8& aResponseName);
+
+	TBool CheckIdentifier(RMBufPacket& aPacket) const;
+
+	static void MakeResponsePacketLC(TUint8 aIdentifier, 
+									 const TDesC8& aValue, 
+									 const TDesC8& aName, 
+									 RMBufPacket& aPacket);
+
+  protected:
+	CPppChap();
+	
+/** Pointer to the latest CHAP Challenge received. */
+	TPtr8 iChallengeRef;
+
+/** The response retry count. */
+	TInt iResponseRetryCount;
+
+/** The latest CHAP Challenge Identifier received. */
+	TUint8	iCurrentId;
+
+  private:
+
+/** Pointer to the CHAP Response Value. */
+	TPtrC8 iResponseValueRef;
+
+/** Pointer to the CHAP Response Name. */
+	TPtrC8 iResponseNameRef;
+
+/** The latest CHAP Challenge packet received. */
+	RMBufChain iChallengePacket;
+	};
+
+
+inline TBool CPppChap::CheckIdentifier(RMBufPacket& aPacket) const
+/**
+   Verifies that the identifier contained in the packet matches the
+   latest Challenge Identifier received.
+   @param aPacket [in] A CHAP Success or Failure packet.
+*/
+	{
+	return *(aPacket.First()->Ptr() + KPppChapCodeFieldSize) ==
+				iCurrentId;
+	}
+
+inline TUint CPppChap::PppId() const
+/**
+   @copydoc CPppAuthentication::PppId()
+   @see CPppAuthentication::PppId()
+*/
+	{
+	return KPppIdChap;
+	}
+
+inline CPppChap::CPppChap()
+	: iChallengeRef(NULL, 0)
+	{
+	}
+
+#endif // ___PPPCHAP_H__