/*
* Copyright (c) 2002-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: Security parser algorithm manager.
*
*/



#ifndef __SA_SPEC_H
#define __SA_SPEC_H

#include <networking/pfkeyv2.h>

//
// This file collects minimal definitions that need to be exported
// from the Security Associations Database into Security Policy
// database
//
//
// Mapping of low level types in pfkeyv2.h into more semantic names
// (This is to avoid a need to look many places in case pfkeyv2 changes)
//
typedef uint32_t TLifetimeAllocations;
typedef uint64_t TLifetimeBytes;
typedef uint64_t TLifetimeSeconds;


//
// The default life time in seconds for larval SA's created by
// GETSPI (may also be used as a default for iLarvalLifetime in
// TSecurityAssocSpec).
//
const TInt KLifetime_LARVAL_DEFAULT = 30;	// seonds!

class TIdentity : public TPtr8
    {
    public:
        TIdentity(): TPtr8(0,0) {}
    };

// TLifetime, a help structure

class TLifetime
    {
    public:
        TLifetime(const struct sadb_lifetime &aLifetime);
        static void Freeze(TTime &aTime, const TTime &aNow);
        TLifetime();
        // For current, these will count items used so far. For Hard and
        // Soft these will contain the limit values for the current
        // counts.
        // study: present unspecified limit with 0 or max value?
        TLifetimeAllocations iAllocations;	// Connections limit
        TLifetimeBytes iBytes;				// Transmitted bytes limit
        //
        // For Current, these will record the creation and first use times.
        // For Hard and Soft, these will record the expiration times (e.g.
        // simple comparison with the current time can be used to test for
        // expiration, and for returning CURRENT values to application, use
        // the SecondsFrom method with current.
        //
        TTime iAddtime;						// Lifetime limit from creation
        TTime iUsetime;						// Lifetime limit from first use
    };


//
// A template to be used while creating new security
// associations (subclassed in Security Policy Database)
//

//
//	TSecurityAssocSpec
//
//	Specify what is required from the SA that can be used
//	for the outbound packet. If no matching SA is found, an
//	acquire message is generated, and these values specify
//	the requested values for the SA.
//
//	src, proxy
//		if no tunnel, proxy=INADDR_ANY, src=IP src
//		if tunnel, proxy=IP src, src=current host
//
class TSecurityAssocSpec
    {
    public:
        //
        // SA selection fields
        //
        TUint8 iType;				// SA type (AH or ESP)
        TUint8 iAalg;				// Authentication algorithm id
        TUint16 iAalgLen;			// Authentication algorithm key length
        TUint8 iEalg;				// Encryption algorithm id
        TUint16 iEalgLen;			// Encryption algorithm Key length
        TUint8 iReplayWindowLength;	// Replay Window length (equal or greater)
        TUint8 iPfs:1;				// SA must have same value of PFS
        TUint8 iMatchSrc:1;			// SA must have a matching src
        TUint8 iMatchProxy:1;		// SA must have a matching proxy
        TUint8 iMatchProtocol:1;	// SA must have a matching protocol
        TUint8 iMatchLocalPort:1;		// SA must have a matching src port
        TUint8 iMatchRemotePort:1;		// SA must have a matching dst port
        TUint8 iMatchLocal:1;		//resulting SA is limited to the specific local adress defined by the packet
        TUint8 iMatchRemote:1;		//resulting SA is limited to the specific remote adress defined by the packet
        
        //
        // Identity reference
        // (This is currently only used for ACQUIRE Message)
        //
        
        //!!!!!!!!!!!!!!!!!!!!!!!!!! Fields deleted!!!!
        
        //struct sadb_ident iIdentity;	// Preformatted for the PFKEY
        //TIdentity iIdentityData;		// NUL terminated Identity (NUL included
        // in the length!)
        //!!!!!!!!!!!!!!!!!!!!!!!!!!
        
        //
        // iLarvalLifetime specifies the maximum time to wait in
        // larval/egg state, when an ACQUIRE request originating
        // from this template is sent to the key management.
        //
        TUint iLarvalLifetime;		// Seconds (0 => use KLifetime_LARVAL_DEFAULT)
        //
        // These are only used in specifying the life time requirements
        // for the acquire message and are thus preformatted to be used
        // directly as a component of the TPfkeyMessage.
        
        struct sadb_lifetime iHard;	// Hard Lifetime requirement
        struct sadb_lifetime iSoft;	// Soft Lifetime requirement
    };

// endpoint name specification
class TEpSpec
    {
    public:
        TInetAddr iEpAddr;
        TBool iIsOptional;
    };


#endif
