/*
 * 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/MfAlgorithm.h,v 1.14 2005/05/09 09:35:24 akisada Exp $
 */
#if !defined(__MfAlgorithm_h__)
#define	__MfAlgorithm_h__	1
#include "MvFunction.h"
#include <openssl/des.h>
#include <openssl/evp.h>
#include <openssl/blowfish.h>
#include <openssl/rc5.h>
#include <openssl/cast.h>

class PFunction;
class PObjectList;
//======================================================================
class MfESPPad:public MvFunction {
private:
static	MfESPPad* defaultPadding_;
static	MfESPPad* IKEdefaultPadding_;
	PvOctets* padding_;
public:
	MfESPPad(CSTR,PvOctets*);
virtual ~MfESPPad();
virtual int32_t token() const;
virtual PObject* tokenObject(int l,CSTR f) const;
virtual bool checkArgument(const PFunction&,const PObjectList&) const;
//----------------------------------------------------------------------
virtual	OCTBUF* Padding_Octets(uint32_t) const;
static	MfESPPad* defaultPadding();
static	MfESPPad* defaultPadding(MfESPPad*);
static	MfESPPad *IKEdefaultPadding();
static	MfESPPad *IKEdefaultPadding(MfESPPad *);
static	OCTBUF* defaultOctets(uint32_t);
static	OCTBUF* IKEdefaultOctets(uint32_t);
};
inline int32_t MfESPPad::token() const {return metaToken(tkn_padfunc_);}
inline MfESPPad* MfESPPad::defaultPadding() {return defaultPadding_;}
inline MfESPPad* MfESPPad::defaultPadding(MfESPPad* m) {
	MfESPPad* o=defaultPadding_; defaultPadding_=m; return o;}
inline MfESPPad *MfESPPad::IKEdefaultPadding() { return(IKEdefaultPadding_); }
inline MfESPPad *MfESPPad::IKEdefaultPadding(MfESPPad *m) {
	MfESPPad *o = IKEdefaultPadding_; IKEdefaultPadding_ = m; return(o); }

class PFunction;
//======================================================================
class MfAuth:public MvFunction {
private:
	uint8_t icvLength_;
	uint8_t alignUnit_;
	uint16_t dummy_;
public:
	MfAuth(CSTR,uint8_t,uint8_t);
virtual	~MfAuth();
inline	uint8_t icvLength() const;
inline	uint8_t alignUnit() const;
virtual int32_t token() const;
virtual PObject* tokenObject(int l,CSTR f) const;
virtual bool checkArgument(const PFunction&,const PObjectList&) const;
//----------------------------------------------------------------------
virtual	OCTSTR init(OCTSTR,const PObjectList&) const;
virtual	void update(OCTSTR,const PObjectList&,const OCTBUF&) const;
virtual	PvOctets* result(OCTSTR,const PObjectList&) const;
virtual	uint32_t alignment(const PObjectList&) const;
};
inline int32_t MfAuth::token() const {return metaToken(tkn_authfunc_);}
inline uint8_t MfAuth::icvLength() const {return icvLength_;}
inline uint8_t MfAuth::alignUnit() const {return alignUnit_;}

//----------------------------------------------------------------------
class MfHMAC:public MfAuth {
public:
	MfHMAC(CSTR,uint8_t,uint8_t);
virtual	~MfHMAC();
virtual bool checkArgument(const PFunction&,const PObjectList&) const;
virtual	const EVP_MD* evp() const=0;
virtual	OCTSTR init(OCTSTR,const PObjectList&) const;
virtual	void update(OCTSTR,const PObjectList&,const OCTBUF&) const;
virtual	PvOctets* result(OCTSTR,const PObjectList&) const;
};

//----------------------------------------------------------------------
class MfHMACMD5:public MfHMAC {
public:
	MfHMACMD5(CSTR,uint8_t,uint8_t);
virtual	~MfHMACMD5();
virtual	const EVP_MD* evp() const;
};

class MfHMACMD5_2: public MfHMACMD5 {
	public:
		MfHMACMD5_2(CSTR, uint8_t, uint8_t);
		virtual	~MfHMACMD5_2();
		virtual bool checkArgument(const PFunction &,
			const PObjectList &) const;
		virtual OCTSTR init(OCTSTR, const PObjectList &) const;
};

//----------------------------------------------------------------------
class MfHMACSHA1:public MfHMAC {
public:
	MfHMACSHA1(CSTR,uint8_t,uint8_t);
virtual	~MfHMACSHA1();
virtual	const EVP_MD* evp() const;
};

class MfHMACSHA1_2: public MfHMACSHA1 {
	public:
		MfHMACSHA1_2(CSTR, uint8_t, uint8_t);
		virtual	~MfHMACSHA1_2();
//		virtual	const EVP_MD *evp() const;
		virtual bool checkArgument(const PFunction &,
			const PObjectList &) const;
		virtual OCTSTR init(OCTSTR, const PObjectList &) const;
};

//----------------------------------------------------------------------
class MfHMACSHA2_256:public MfHMAC {
public:
	MfHMACSHA2_256(CSTR,uint8_t,uint8_t);
virtual ~MfHMACSHA2_256();
virtual EVP_MD* evp() const;
};

//----------------------------------------------------------------------
class MfHMACSHA2_384:public MfHMAC {
public:
	MfHMACSHA2_384(CSTR,uint8_t,uint8_t);
virtual ~MfHMACSHA2_384();
virtual EVP_MD* evp() const;
};

//----------------------------------------------------------------------
class MfHMACSHA2_512:public MfHMAC {
public:
	MfHMACSHA2_512(CSTR,uint8_t,uint8_t);
virtual ~MfHMACSHA2_512();
virtual EVP_MD* evp() const;
};

class PFunction;
//======================================================================
class MfCrypt:public MvFunction {
private:
	uint8_t keyLength_;
	uint8_t ivecLength_;
	uint8_t alignUnit_;
	uint8_t dummy_;
public:
	MfCrypt(CSTR,uint8_t,uint8_t,uint8_t);
virtual	~MfCrypt();
virtual int32_t token() const;
virtual PObject* tokenObject(int l,CSTR f) const;
virtual bool checkArgument(const PFunction&,const PObjectList&) const;
//----------------------------------------------------------------------
inline	uint8_t keyLength() const;
inline	uint8_t ivecLength() const;
inline	uint8_t alignUnit() const;
virtual	const PObject* key(const PObjectList&) const;
virtual	uint32_t alignment(const PObjectList&) const;
virtual	uint32_t alignTimes(const PObjectList&) const;
virtual	bool alignmentCheck(uint32_t,const PObjectList&) const;
virtual	OCTBUF* encryptOctets(const OCTBUF&,const PObjectList&,OCTBUF* =0) const;
virtual	OCTBUF* decryptOctets(const OCTBUF&,const PObjectList&,OCTBUF*&) const;
virtual	void encrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
virtual	void decrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
};
inline int32_t MfCrypt::token() const {return metaToken(tkn_cryptfunc_);}
inline uint8_t MfCrypt::keyLength() const {return keyLength_;};
inline uint8_t MfCrypt::ivecLength() const {return ivecLength_;};
inline uint8_t MfCrypt::alignUnit() const {return alignUnit_;};

//----------------------------------------------------------------------
class MfCryptKey:public MfCrypt {
public:
	MfCryptKey(CSTR,uint8_t,uint8_t,uint8_t);
virtual	~MfCryptKey();
virtual bool checkArgument(const PFunction&,const PObjectList&) const;
virtual	const PObject* key(const PObjectList&) const;
virtual	uint32_t alignTimes(const PObjectList&) const;
};

//----------------------------------------------------------------------
class MfDESCBC:public MfCryptKey {
public:
	MfDESCBC(CSTR,uint8_t,uint8_t,uint8_t);
virtual	~MfDESCBC();
	void scheduleKeys(const PObject*,des_key_schedule&) const;
virtual	void encrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
virtual	void decrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
};

//----------------------------------------------------------------------
class MfBLOWFISH:public MfCryptKey {
public:
	MfBLOWFISH(CSTR,uint8_t,uint8_t,uint8_t);
virtual	~MfBLOWFISH();
	void scheduleKeys(const PObject*,BF_KEY&) const;
virtual	void encrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
virtual	void decrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
};

//----------------------------------------------------------------------
class MfRC5:public MfCryptKey {
public:
	MfRC5(CSTR,uint8_t,uint8_t,uint8_t);
virtual	~MfRC5();
	void scheduleKeys(const PObject*,RC5_32_KEY&) const;
virtual	void encrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
virtual	void decrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
};

//----------------------------------------------------------------------
class MfCAST128:public MfCryptKey {
public:
	MfCAST128(CSTR,uint8_t,uint8_t,uint8_t);
virtual	~MfCAST128();
	void scheduleKeys(const PObject*,CAST_KEY&) const;
virtual	void encrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
virtual	void decrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
};

//----------------------------------------------------------------------
class MfDES3CBC:public MfCryptKey {
public:
	MfDES3CBC(CSTR,uint8_t,uint8_t,uint8_t);
virtual	~MfDES3CBC();
	void scheduleKeys(const PObject*,
		des_key_schedule&,des_key_schedule&,des_key_schedule&) const;
virtual	void encrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
virtual	void decrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
};



class MfIKE_DESCBC: public MfDESCBC {
	public:
		MfIKE_DESCBC(CSTR, uint8_t, uint8_t, uint8_t);
		virtual	~MfIKE_DESCBC();
		virtual bool checkArgument(const PFunction &,
			const PObjectList &) const;
		virtual int32_t token() const;

		virtual OCTBUF *encryptOctets(const OCTBUF &,
			const PObjectList &, OCTBUF * = 0) const;
		virtual OCTBUF *decryptOctets(const OCTBUF &,
			const PObjectList &, OCTBUF *&) const;
};

inline int32_t MfIKE_DESCBC::token() const {
	return(metaToken(tkn_ike_cryptfunc_)); }



class MfDESCBC_2: public MfIKE_DESCBC {
	public:
		MfDESCBC_2(CSTR, uint8_t, uint8_t, uint8_t);
		virtual	~MfDESCBC_2();
		virtual int32_t token() const;

		virtual OCTBUF *encryptOctets(const OCTBUF &,
			const PObjectList &, OCTBUF * = 0) const;
		virtual OCTBUF *decryptOctets(const OCTBUF &,
			const PObjectList &, OCTBUF *&) const;
};

inline int32_t MfDESCBC_2::token() const {
	return(metaToken(tkn_cryptfunc_)); }



class MfIKE_DES3CBC: public MfDES3CBC {
	public:
		MfIKE_DES3CBC(CSTR, uint8_t, uint8_t, uint8_t);
		virtual	~MfIKE_DES3CBC();
		virtual bool checkArgument(const PFunction &,
			const PObjectList &) const;
		virtual int32_t token() const;

		virtual OCTBUF *encryptOctets(const OCTBUF &,
			const PObjectList &, OCTBUF * = 0) const;
		virtual OCTBUF *decryptOctets(const OCTBUF &,
			const PObjectList &, OCTBUF *&) const;
};

inline int32_t MfIKE_DES3CBC::token() const {
	return(metaToken(tkn_ike_cryptfunc_)); }



class MfDES3CBC_2: public MfIKE_DES3CBC {
	public:
		MfDES3CBC_2(CSTR, uint8_t, uint8_t, uint8_t);
		virtual	~MfDES3CBC_2();
//		virtual bool checkArgument(const PFunction &,
//			const PObjectList &) const;
		virtual int32_t token() const;

		virtual OCTBUF *encryptOctets(const OCTBUF &,
			const PObjectList &, OCTBUF * = 0) const;
		virtual OCTBUF *decryptOctets(const OCTBUF &,
			const PObjectList &, OCTBUF *&) const;
};

inline int32_t MfDES3CBC_2::token() const {
	return(metaToken(tkn_cryptfunc_)); }

//----------------------------------------------------------------------
class MfRIJNDAEL:public MfCryptKey {
public:
	MfRIJNDAEL(CSTR,uint8_t,uint8_t,uint8_t);
virtual	~MfRIJNDAEL();
virtual	void encrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
virtual	void decrypt(OCTSTR,OCTSTR,uint32_t,const PObject*,OCTSTR) const;
};

//----------------------------------------------------------------------
class MfESPPadAny:public MfESPPad {
public:
	MfESPPadAny(CSTR,PvOctets*);
	~MfESPPadAny();
};
#endif


syntax highlighted by Code2HTML, v. 0.9.1