diff -r 000000000000 -r af10295192d8 networksecurity/ipsec/ipsec6/inc/pfkeymsg.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networksecurity/ipsec/ipsec6/inc/pfkeymsg.h Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,312 @@ +// Copyright (c) 2004-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: +// pfkeymsg.h - IPv6/IPv4 IPSEC PFKEY message handling utilities +// PF_KEY v2 message transformation between the socket stream and +// internal representation. +// + + + +/** + @internalComponent +*/ +#ifndef __PFKEYMSG_H__ +#define __PFKEYMSG_H__ + +#include +#include "ipaddress.h" +#include +#include "pfkeyext.h" +#include "sa_spec.h" + +// Descriptor representing a single ZERO byte (octet) +const TLitC8<1> KZeroByte = {1, {0}}; + +// +// Map the basic PFKEY V2 structures into Classes with +// constructors for initialized content. +class T_sadb_msg : public sadb_msg + { +public: + T_sadb_msg(TUint8 aMsgType, TUint8 aSaType = 0, TUint32 aSeq = 0); + }; + +class T_sadb_sa : public sadb_sa + { +public: + T_sadb_sa(TUint32 aSPI = 0, TUint8 aWindow = 0, TUint8 aState = SADB_SASTATE_LARVAL, + TUint8 aAalg = 0, TUint8 aEalg = 0, TUint32 aFlags = 0); + }; + + +// T_sadb_lifetime +class T_sadb_lifetime : public sadb_lifetime + { +public: + T_sadb_lifetime(const TLifetime &aLt); + T_sadb_lifetime(TUint8 aType, const TLifetime &aLt, const TLifetime &aRef); + }; + + +class T_sadb_address : public sadb_address + { +public: + T_sadb_address(TUint8 aType, TUint8 aProto = 0, TUint8 aPrefix = 0); + }; + +class T_sadb_key : public sadb_key + { +public: + T_sadb_key(TUint8 aType, TInt aKeyBytes = 0, TInt aKeyBits = -1); + }; + +class T_sadb_supported : public sadb_supported + { +public: + T_sadb_supported(TUint8 aType, TInt aNum = 0); + }; + +class T_sadb_ident : public sadb_ident + { +public: + T_sadb_ident(TUint8 aType, TInt aLength = 0); + }; + +class T_sadb_sens : public sadb_sens + { +public: + // A dummy + T_sadb_sens(); + }; + +class T_sadb_prop : public sadb_prop + { +public: + T_sadb_prop(TUint8 aReplay, TInt aNum); + }; + +class T_sadb_selector : public sadb_x_selector + { +public: + TInetAddr iSrc; + TInetAddr iDst; + }; + +class T_sadb_ts : public sadb_x_ts + { +public: + T_sadb_ts(TInt aNum); + }; + +// +// Remapping of the bytestream PF_KEY into structures +// + +class TPfkeyBase + { +public: + const struct sadb_msg *iMsg; + TPfkeyBase() {iMsg = 0;} + TUint Length() const {return iMsg ? sizeof(*iMsg) : 0;} + TInt ByteStream(RMBufChain &aPacket, TInt aTotal) const; + void LogPrint(const TDesC &aLabel) const; // Only available in DEBUG mode + }; + +class TPfkeyAssociation + { +public: + const struct sadb_sa *iExt; + TPfkeyAssociation() {iExt = 0;} + TUint Length() const {return iExt ? sizeof(*iExt) : 0;} + TInt ByteStream(RMBufChain &aPacket, TInt aOffset) const; + void LogPrint(const TDesC &aLabel, const CAlgorithmList *aAlgorithms) const; // Only available in DEBUG mode + }; + +class TPfkeyLifetime + { +public: + const struct sadb_lifetime *iExt; + TPfkeyLifetime() {iExt = 0;} + TUint Length() const {return iExt ? sizeof(*iExt) : 0;} + TInt ByteStream(RMBufChain &aPacket, TInt aOffset) const; + void LogPrint(const TDesC &aLabel) const; // Only available in DEBUG mode + }; + +class TPfkeyIdentity + { +public: + const struct sadb_ident *iExt; + TPtrC8 iData; + TPfkeyIdentity() {iExt = 0;} + TUint Length() const + {return iExt ? ((sizeof(*iExt) + iData.Length() + 1 + 7) / 8) * 8 : 0; } + TInt LoadFromStream(const TInt aLength, const TUint8 *aPtr); + TInt ByteStream(RMBufChain &aPacket, TInt aOffset) const; + void LogPrint(const TDesC8 &aLabel) const; // Only available in DEBUG mode + }; + +class TPfkeyAddress + { +public: + const struct sadb_address *iExt; + RIpAddress iAddr; + TUint16 iPort; + TPfkeyAddress() {iExt = 0; } + TUint Length() const + {return iExt ? ((sizeof(*iExt) + sizeof(TInetAddr) + 7) / 8) * 8 : 0; } + TInt ByteStream(RMBufChain &aPacket, TInt aOffset) const; + TInt LoadFromStream(const TInt aLength, const TUint8 *aPtr, REndPoints &aEp); + TInt BindToEndPoint(TPfkeyIdentity &aIdentity, REndPoints &aEp); + void LogPrint(const TDesC &aLabel) const; // Only available in DEBUG mode + }; + +class TPfkeyKey + { +public: + const struct sadb_key *iExt; + TPtrC8 iData; + TPfkeyKey() {iExt = 0;} + TUint Length() const + {return iExt ? ((sizeof(*iExt) + iData.Length() + 7) / 8) * 8 : 0; } + TInt ByteStream(RMBufChain &aPacket, TInt aOffset) const; + void LogPrint(const TDesC &aLabel) const; // Only available in DEBUG mode + }; + + +class TPfkeySensitivity + { +public: + const struct sadb_sens *iExt; + TPtrC8 iSensBitmap; + TPtrC8 iIntegBitmap; + TPfkeySensitivity() {iExt = 0;} + TUint Length() const + {return iExt ? ((sizeof(*iExt) + iSensBitmap.Length() + iIntegBitmap.Length() + 7) / 8) * 8 : 0; } + TInt ByteStream(RMBufChain &aPacket, TInt aOffset) const; + void LogPrint(const TDesC &aLabel) const; // Only available in DEBUG mode + }; + +class TPfkeyProposal + { +public: + const struct sadb_prop *iExt; + const struct sadb_comb *iComb; + TInt iNumComb; + TPfkeyProposal() {iExt = 0; iComb = 0; iNumComb = 0;} + TUint Length() const + {return iExt ? ((sizeof(*iExt) + iNumComb * sizeof(*iComb) + 7) / 8) * 8 : 0;} + TInt ByteStream(RMBufChain &aPacket, TInt aOffset) const; + void LogPrint(const TDesC &aLabel, const CAlgorithmList *aAlgorithms) const; // Only available in DEBUG mode + }; + +class TPfkeySupported + { +public: + const struct sadb_supported *iExt; + const struct sadb_alg *iAlg; + TInt iNumAlg; + TPfkeySupported() {iExt = 0; iAlg = 0; iNumAlg = 0;} + TUint Length() const + {return iExt ? ((sizeof(*iExt) + iNumAlg * sizeof(*iAlg) + 7) / 8) * 8 : 0;} + TInt ByteStream(RMBufChain &aPacket, TInt aOffset) const; + void Init(struct sadb_supported *aExt, TInt aNumAlg, struct sadb_alg *aAlg); + void LogPrint(const TDesC &aLabel, const CAlgorithmList *aAlgorithms) const; // Only available in DEBUG mode + }; + +class TPfkeySpirange + { +public: + const struct sadb_spirange *iExt; + TPfkeySpirange() {iExt = 0;} + TUint Length() const + {return iExt ? sizeof(*iExt) : 0;} + TInt ByteStream(RMBufChain &aPacket, TInt aOffset) const; + void LogPrint(const TDesC &aLabel) const; // Only available in DEBUG mode + }; + +class RTrafficSelectorSet; +class TPfkeyTs + { +public: + const struct sadb_x_ts *iExt; + TPfkeyTs() {iExt = 0; iTS = NULL;} + const RTrafficSelectorSet *iTS; + TUint Length() const + { + return (iExt && iTS) ? ((sizeof(*iExt) + iExt->sadb_x_ts_numsel * sizeof(T_sadb_selector) + 7) / 8) * 8 : 0; + } + const T_sadb_selector &Selector(TInt aIndex) const + { + return ((T_sadb_selector *)((TUint8 *)iExt + sizeof(*iExt)))[aIndex]; + } + TInt ByteStream(RMBufChain &aPacket, TInt aOffset) const; + void LogPrint(const TDesC &aLabel) const; // Only available in DEBUG mode + }; + +class TPFkeyPrivExt + { +public: + const struct sadb_gen_ext *iExt; + TPtrC8 iData; + TPFkeyPrivExt() {iExt = 0;} + }; + +// +// Internal presentation of the PF_KEY message +// +class TPfkeyMessage + { +public: + // Length64() + // Returns the length of the stream representation + // of this message in 8 byte blocks (e.g. multiply + // this by 8 to get the length in octets. + TUint16 Length64() const; + + // ByteStream(aPacket) + // Append a byte stream presentation of this message into + // a RMBufChain (aPacket) + void ByteStreamL(RMBufChain &aPacket) const; + // + // + // Construct internal presentation from the PFKEY bytestream message + TPfkeyMessage(const TDesC8& aMsg, REndPoints &aEp); + TPfkeyMessage() {} + void LogPrint(const TDesC &aLabel, const CAlgorithmList *aAlgorithms) const; // Only available in DEBUG mode + + TInt iError; // == KErrNone, if message format valid. + TPfkeyBase iBase; + TPfkeyAssociation iSa; + TPfkeyLifetime iCurrent; + TPfkeyLifetime iHard; + TPfkeyLifetime iSoft; + TPfkeyAddress iSrcAddr; + TPfkeyAddress iDstAddr; + TPfkeyAddress iProxyAddr; + TPfkeyKey iAuthKey; + TPfkeyKey iEncryptKey; + TPfkeyIdentity iSrcIdent; + TPfkeyIdentity iDstIdent; + TPfkeyIdentity iSrcEndpoint; + TPfkeyIdentity iDstEndpoint; + TPfkeySensitivity iSensitivity; + TPfkeyProposal iProposal; + TPfkeySupported iAuthAlgs; + TPfkeySupported iEncryptAlgs; + TPfkeySpirange iSpirange; + TPfkeyTs iTs; + + TPFkeyPrivExt iPrivateExtension; // For ESP UDP encapsulation + }; +#endif