networksecurity/ipsec/ipsec6/inc/pfkeymsg.h
changeset 0 af10295192d8
--- /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 <es_mbuf.h>
+#include "ipaddress.h"
+#include <networking/pfkeyv2.h>
+#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