/*
* 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