vpnengine/vpnipsecpolparser/inc/ipsecpolparser.h
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/vpnipsecpolparser/inc/ipsecpolparser.h	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,332 @@
+/*
+* Copyright (c) 2002-2006 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: IPSec policy parser main module.
+* A parser for IPsec policies. Converts textual IPsec policies into 
+* in-memory data structures and vice versa. 
+*
+*/
+
+
+
+#ifndef __IPSECPOLPARSER_H
+#define __IPSECPOLPARSER_H
+
+//////////////////////////////////////////////////////////////////////////////
+// INCLUDE FILES
+//////////////////////////////////////////////////////////////////////////////
+
+#include <f32file.h>
+#include <in_sock.h>
+
+#include "spdb.h"
+
+//////////////////////////////////////////////////////////////////////////////
+// CONSTANTS
+//////////////////////////////////////////////////////////////////////////////
+
+#define FIRST_SEC_PARSER_VERSION    1
+#define SEC_PARSER_VERSION          3
+
+#define MAX_EALG_VALUE              255
+#define MAX_INFO_SIZE               1024
+#define PIECE_AVG_LENGTH            2048
+
+#define PFKEY_INI_OUTBOUND          8
+#define PFKEY_INI_INBOUND           4
+#define KErrKeyParser               50
+
+const TInt KPolicyBufferSizeIncrement = 6000;
+
+//////////////////////////////////////////////////////////////////////////////
+// ENUMERATIONS
+//////////////////////////////////////////////////////////////////////////////
+
+typedef enum
+{
+    token_string,
+    token_equal,
+    token_comma,
+    token_brace_left,
+    token_brace_right,
+    token_par_left,
+    token_par_right,
+    token_error,
+    token_eof
+}
+token_type;
+
+//////////////////////////////////////////////////////////////////////////////
+// FORWARD DECLARATIONS
+//////////////////////////////////////////////////////////////////////////////
+
+class CIpSecurityPiece;
+
+//////////////////////////////////////////////////////////////////////////////
+// CLASS DECLARATIONS
+//////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////////
+// class TPolicyParser
+//  This parser is utilized by IPsec Policy Manager to convert a given policy
+//  from string format into binary object format and vice versa.
+//////////////////////////////////////////////////////////////////////////////
+//
+class TPolicyParser : public TLex
+    {
+public:
+    IMPORT_C TPolicyParser(const TDesC& aPolicy);
+
+    IMPORT_C TInt ParseL(CIpSecurityPiece* aPieceData);
+
+    IMPORT_C static TInt Write(CSecurityPolicy* aSp,
+                               HBufC8*& aPolBfr,
+                               TBool aSortingOrder = EFalse);
+
+    IMPORT_C static TInt BufferAppend(HBufC8*& aPolBfr,
+                                      const TDesC8& aText);
+
+private:
+    static TInt WriteSAs(CSAList* aSAList,
+                         HBufC8*& aPolBfr);
+
+    static void TextSA(CPolicySpec* aSA, TDes8& aBuf);
+
+    static TInt WriteSelectors(CSelectorList* aSelList,
+                               HBufC8*& aPolBfr,
+                               TBool aSortingOrder = EFalse);
+
+    static TInt WriteSelectorsInSortingOrder(CSelectorList* aSelList,
+            HBufC8*& aPolBfr,
+            TBool aSortingOrder = ETrue);
+
+    static void TextSel(CPolicySelector* aSel,
+                        TDes8& aBuf,
+                        TBool aSortingOrder = EFalse);
+
+    TInt parse_ip_addr_and_maskL(TInetAddr& addr,
+                                 TInetAddr& mask,
+                                 HBufC8*& aSelEpName,
+                                 HBufC8*& aMaskEpName,
+                                 CSecurityPolicy* aSecPol = NULL);
+
+    TInt parse_sa_spec_listL(TSecpolBundle& aBundle,
+                             CSecurityPolicy* aSp, TInt& aFQDNCount);
+
+    TInt parse_sa_spec_paramsL(CPolicySpec& aSpec);
+
+    TInt parse_conn2saL(CSecurityPolicy* aSp);
+
+    TInt parse_sa_specL(CSecurityPolicy* aSp);
+
+    TInt parse_ep_specL(CSecurityPolicy* aSp);
+
+    TInt parse_ep_spec_paramsL(CPolicySpec& aSpec);
+
+    token_type NextToken();
+
+    void SkipSpaceAndMark();
+
+    void Error(TRefByValue <const TDesC> aFmt, ...);
+
+public:
+
+    int iLine;
+
+    TBuf<200> iMsg;
+
+    TPtrC iToken;
+    };
+
+//////////////////////////////////////////////////////////////////////////////
+// class CKeysData
+//  This object contains IPsec key information.
+//////////////////////////////////////////////////////////////////////////////
+//
+class CKeysData : public CBase
+    {
+public:
+    IMPORT_C CKeysData();
+    IMPORT_C CKeysData(CKeysData* aKey);
+
+public:
+    TUint8 sa_type;
+    TInt spi;
+    TUint8 encr_alg;
+    TUint8 auth_alg;
+    TInt direction;
+    TInt lifetime_bytes;
+    TInt lifetime_sec;
+    TInetAddr src_addr;
+    TInetAddr dst_addr;
+    TUint8 protocol;
+    TBuf8<256> auth_key;
+    TBuf8<256> encr_key;
+    };
+
+//////////////////////////////////////////////////////////////////////////////
+// class CKeysDataArray
+//  Container for storing IPsec keys.
+//////////////////////////////////////////////////////////////////////////////
+//
+class CKeysDataArray : public CArrayFixFlat<CKeysData *>
+    {
+public:
+    IMPORT_C static CKeysDataArray* NewL(TInt aGranularity);
+    IMPORT_C static CKeysDataArray* NewL(CKeysDataArray* aData);
+
+    IMPORT_C void Construct(TInt aGranularity);
+
+    IMPORT_C void ConstructL(CKeysDataArray* aData);
+
+    IMPORT_C ~CKeysDataArray();
+
+    IMPORT_C void CopyL(CKeysDataArray* aData);
+
+    IMPORT_C void Empty();
+
+private:
+
+    CKeysDataArray(TInt aGranularity);
+
+    CKeysDataArray(CKeysDataArray* aData);
+    };
+
+//////////////////////////////////////////////////////////////////////////////
+// class TKeyParser
+//  Parses IPsec key information from string format into binary format
+//  and vice versa.
+//////////////////////////////////////////////////////////////////////////////
+//
+class TKeyParser : public TLex
+    {
+public:
+    IMPORT_C TKeyParser(const TDesC& aStr);
+
+    IMPORT_C TInt ParseL(CKeysDataArray* aKeys);
+
+    IMPORT_C static TInt Write(CKeysDataArray* aKeys, RFile& aFile);
+
+private:
+    static void TextPFKey(CKeysData* aKey, TDes8& aElem);
+
+    void NextToken();
+
+    TPtrC8 DeHex(const TDesC& aStr);
+
+    int SkipSpaceAndMark();
+
+    static TUint8 HexVal(TUint8 aChar);
+
+    TPtrC iToken;
+
+    // Non-zero, if next token is first in line
+    TInt iFirst;
+
+    TBuf8<256> iHex;
+    };
+
+//////////////////////////////////////////////////////////////////////////////
+// class CIpSecurityPiece
+//  Contains all IPsec policy information.
+//////////////////////////////////////////////////////////////////////////////
+//
+class CIpSecurityPiece : public CBase
+    {
+public:
+
+    // Factory methods for object creation
+    IMPORT_C void ConstructL(TInt aSize = 64);
+    IMPORT_C ~CIpSecurityPiece();
+
+    //
+    IMPORT_C void SetInfoL(const TDesC& aDes);
+
+    IMPORT_C CSecPolBundleList* FQDNAddressListL();
+
+
+    inline HBufC* Info() { return iInfo;}
+
+    inline CSecurityPolicy* Policies() { return iPolicies;}
+
+    inline void SetPolicies(CSecurityPolicy* aPolicy) {iPolicies = aPolicy;}
+
+    inline CKeysDataArray* Keys() { return iKeys;}
+
+    // Buffer for last error text
+    TBuf<200> iErrorInfo;
+
+private:
+
+    // Buffer for IPsec policy information text
+    HBufC* iInfo;
+
+    // IPsec Policy data
+    CSecurityPolicy* iPolicies;
+
+    // IPsec keys data
+    CKeysDataArray* iKeys;
+    
+    // List of tunnel endpoint requiring DNS lookup
+    CSecPolBundleList* iPolicyList;
+
+    };
+
+//////////////////////////////////////////////////////////////////////////////
+// class TIpSecParser
+//  Parser for IPsec policies.
+//////////////////////////////////////////////////////////////////////////////
+//
+class TIpSecParser : public TLex
+    {
+public:
+    IMPORT_C TIpSecParser(const TDesC& aDes);
+
+    IMPORT_C TInt ParseL(CIpSecurityPiece* aPiece_data);
+
+    IMPORT_C static TInt Write(CIpSecurityPiece* aPiece_data,
+                               HBufC8*& aPolBfr);
+
+    IMPORT_C TInt ParseAndIgnoreIKEL(CIpSecurityPiece* aPiece_data);
+
+private:
+    TBool CheckVersion();
+
+    void ParseInfoL(CIpSecurityPiece* aPiece_data);
+
+    TInt ParsePoliciesL(CIpSecurityPiece* aPieceData);
+
+    TInt ParseKeysL(CKeysDataArray* aKeys);
+
+    void NextTag();
+
+    TInt DoParseL(CIpSecurityPiece* aPiece_data, TBool aIncludeIKE);
+
+    static TInt WriteVersion(HBufC8*& aPolBfr);
+
+    static TInt WriteInfo(CIpSecurityPiece* aPiece_data,
+                          HBufC8*& aPolBfr);
+
+    static TInt WritePolicies(CIpSecurityPiece* aPiece_data,
+                              HBufC8*& aPolBfr);
+
+    static TInt WriteKeys(CIpSecurityPiece* aPiece_data,
+                          RFile& aFile);
+
+private:
+
+    // IPsec policy version info
+    TInt iVersion;
+    };
+
+#endif