/*
 * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation,
 * YDC Corporation, IPA (Information-technology Promotion Agency, Japan).
 * All rights reserved.
 * 
 * Redistribution and use of this software in source and binary forms, with 
 * or without modification, are permitted provided that the following 
 * conditions and disclaimer are agreed and accepted by the user:
 * 
 * 1. Redistributions of source code must retain the above copyright 
 * notice, this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the following disclaimer in the 
 * documentation and/or other materials provided with the distribution.
 * 
 * 3. Neither the names of the copyrighters, the name of the project which 
 * is related to this software (hereinafter referred to as "project") nor 
 * the names of the contributors may be used to endorse or promote products 
 * derived from this software without specific prior written permission.
 * 
 * 4. No merchantable use may be permitted without prior written 
 * notification to the copyrighters. However, using this software for the 
 * purpose of testing or evaluating any products including merchantable 
 * products may be permitted without any notification to the copyrighters.
 * 
 * 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND 
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING 
 * BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 * FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.  IN NO EVENT SHALL THE 
 * COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT,STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $TAHI: v6eval/lib/Pz/PAlgorithm.h,v 1.8 2005/05/09 09:35:24 akisada Exp $
 */
#if !defined(__PAlgorithm_h__)
#define	__PAlgorithm_h__	1
#include "PcObject.h"

//======================================================================
// SA value
class PaObject:public PcObject{
protected:
	PaObject(const MObject*,CSTR,int);
public:
virtual	~PaObject();
virtual	WObject* selfCompose(WControl&,WObject* w_parent) const;
//----------------------------------------------------------------------
// SA FUNCTION MEMBER INTERFACE (must need as SA scope)
virtual	uint32_t ICV_Length() const;
virtual	OCTBUF*	 ICV_Calculate(const OCTBUF& ahbuf) const;
virtual	uint32_t Decrypted_Length(const OCTBUF& cryptedbuf) const;
virtual	OCTBUF*	 Decrypted_Octets(const OCTBUF& cryptedbuf,OCTBUF*& ivec) const;
virtual	uint32_t Crypted_Length(uint32_t decryptedlen) const;
virtual	OCTBUF*	 Crypted_Octets(const OCTBUF& decryptedbuf) const;
virtual	uint32_t Padding_Length(uint32_t decryptinglen) const;
virtual	OCTBUF*	 Padding_Octets(uint32_t paddinglen) const;
virtual	void icvInit() const;
virtual	void icvUpdate(OCTBUF*) const;
virtual	OCTBUF* icvResult() const;
};

class PfAuth;
//======================================================================
class PaAH:public PaObject{
private:
	PfAuth*	auth_;
public:
	PaAH(const MObject*,CSTR,int);
virtual	~PaAH();
//----------------------------------------------------------------------
// YAC INTERFACE
virtual	PObject* auth_member(PObject* p);
	PfAuth* auth() const;
//----------------------------------------------------------------------
// SA FUNCTION MEMBER INTERFACE
virtual	uint32_t ICV_Length() const;
virtual	OCTBUF*	 ICV_Calculate(const OCTBUF& ahbuf) const;
//----------------------------------------------------------------------
virtual	void print() const;
virtual	void icvInit() const;
virtual	void icvUpdate(OCTBUF*) const;
virtual	OCTBUF* icvResult() const;
virtual	void log(uint32_t=0) const;
virtual	void logSelf() const;
};
inline PfAuth* PaAH::auth() const {return auth_;}

class PfESPPad;
class PfCrypt;
//======================================================================
class PaESP:public PaAH{
protected:
	PfESPPad* pad_;
	PfCrypt* crypt_;
public:
	PaESP(const MObject*,CSTR,int);
virtual	~PaESP();
//----------------------------------------------------------------------
// YACC INTERFACE
virtual	PObject* pad_member(PObject* p);
virtual	PObject* crypt_member(PObject* p);
	PfESPPad* pad() const;
	PfCrypt* crypt() const;
//----------------------------------------------------------------------
// SA FUNCTION MEMBER INTERFACE
virtual	uint32_t ivecLength() const;
virtual	uint32_t Decrypted_Length(const OCTBUF& cryptedbuf) const;
virtual	OCTBUF*	 Decrypted_Octets(const OCTBUF& cryptedbuf,OCTBUF*& ivec) const;
virtual	uint32_t Crypted_Length(uint32_t decryptedlen) const;
virtual	OCTBUF*	 Crypted_Octets(const OCTBUF& decryptedbuf) const;
virtual	uint32_t Padding_Length(uint32_t decryptinglen) const;
virtual	OCTBUF*	 Padding_Octets(uint32_t Paddinglen) const;
//----------------------------------------------------------------------
virtual	void print() const;
virtual	void log(uint32_t=0) const;
virtual	void logSelf() const;
};
inline PfESPPad* PaESP::pad() const {return pad_;}
inline PfCrypt* PaESP::crypt() const {return crypt_;}

#include "PvObject.h"
class MfESPPad;
//======================================================================
class PfESPPad:public PFunction {
private:
	const MfESPPad* meta_;
public:
	PfESPPad(const MfESPPad*,CSTR,int);
virtual	~PfESPPad();
	const MfESPPad* metaClass() const;
//----------------------------------------------------------------------
	OCTBUF* Padding_Octets(uint32_t) const;
//----------------------------------------------------------------------
virtual	void checkArgument() const;
virtual	const MObject* meta() const;
};
inline const MfESPPad* PfESPPad::metaClass() const {return meta_;}

class MfCrypt;
//======================================================================
class PfCrypt:public PFunction {
private:
	const MfCrypt* meta_;
public:
	PfCrypt(const MfCrypt*,CSTR,int);
virtual	~PfCrypt();
	const MfCrypt* metaClass() const;
//----------------------------------------------------------------------
	uint32_t ivecLength() const;
	uint32_t Padding_Length(uint32_t,const PfAuth*) const;
	uint32_t alignment() const;
	OCTBUF* encrypt(const OCTBUF&) const;
	OCTBUF* decrypt(const OCTBUF&,OCTBUF*&) const;
//----------------------------------------------------------------------
virtual	void checkArgument() const;
virtual	const MObject* meta() const;
};
inline const MfCrypt* PfCrypt::metaClass() const {return meta_;}

class MfAuth;
//======================================================================
class PfAuth:public PFunction {
private:
	const MfAuth* meta_;
	OCTSTR context_;
public:
	PfAuth(const MfAuth*,CSTR,int);
virtual	~PfAuth();
	const MfAuth* metaClass() const;
//----------------------------------------------------------------------
	uint32_t alignment() const;
	uint32_t ICV_Length() const;
	void init();
	void update(const OCTBUF&);
	PvOctets* result();
//----------------------------------------------------------------------
// Parse TREE interface
virtual	void checkArgument() const;
virtual	const MObject* meta() const;
};
inline const MfAuth* PfAuth::metaClass() const {return meta_;}

class AlgorithmList;
//======================================================================
class SAOctets {
private:
	PvOctets* frame_;
	AlgorithmList* algorithms_;
public:
	SAOctets(PvOctets*,AlgorithmList*);
	~SAOctets();
	PvOctets* frame() const;
	AlgorithmList* algorithms() const;
	bool isEqual(const SAOctets*) const;
};
inline PvOctets* SAOctets::frame() const {return frame_;}
inline AlgorithmList* SAOctets::algorithms() const {return algorithms_;}
interfaceCmList(SAOctetsList,SAOctets);

//======================================================================
class WAlgorithm:public CmQueue {
private:
	WObject* composed_;
	AlgorithmList* algorithms_;
public:
	WAlgorithm(WObject*,AlgorithmList*);
virtual	~WAlgorithm();
	const WObject* composed() const;
	AlgorithmList* algorithms() const;
	const WObject* matchedComposed(uint32_t,RObject*) const;
	void log(uint32_t=0) const;
};
inline const WObject* WAlgorithm::composed() const {return composed_;}
inline AlgorithmList* WAlgorithm::algorithms() const {return algorithms_;}

#include "WObject.h"
//======================================================================
class AlgorithmFrames {
private:
	CmQueue algorithms_;
	WObjectList noneAlgorithms_;
public:
	AlgorithmFrames();
	~AlgorithmFrames();
	const CmQueue* algorithms() const;
	void none(WObject*);
	void alogrithm(WAlgorithm*);
	const WObjectList& noneAlgorithms() const;
	const WAlgorithm* nextAlgorithm(const CmQueue* =0) const;
	void log(uint32_t=0) const;
};
inline const CmQueue* AlgorithmFrames::algorithms() const {
	return &algorithms_;}
inline const WObjectList& AlgorithmFrames::noneAlgorithms() const {
	return noneAlgorithms_;}

#include "CmCltn.h"
interfaceCmList(AlgorithmList,PaObject);
#endif


syntax highlighted by Code2HTML, v. 0.9.1