diff -r 000000000000 -r af10295192d8 linklayerprotocols/pppnif/SPPP/PPPCHAP.H --- /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 +#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__