tripwire-open-source/src/cryptlib/filters.h

160 lines
3.6 KiB
C++

#ifndef FILTERS_H
#define FILTERS_H
#include "cryptlib.h"
#include "misc.h"
#include "smartptr.h"
class Filter : public BufferedTransformation
{
public:
Filter(BufferedTransformation *outQ = NULL);
Filter(const Filter &source);
bool Attachable() {return true;}
void Detach(BufferedTransformation *newOut = NULL);
void Attach(BufferedTransformation *newOut);
void Close()
{InputFinished(); outQueue->Close();}
unsigned long MaxRetrieveable()
{return outQueue->MaxRetrieveable();}
unsigned int Get(byte &outByte)
{return outQueue->Get(outByte);}
unsigned int Get(byte *outString, unsigned int getMax)
{return outQueue->Get(outString, getMax);}
unsigned int Peek(byte &outByte) const
{return outQueue->Peek(outByte);}
BufferedTransformation *OutQueue() {return outQueue.get();}
protected:
member_ptr<BufferedTransformation> outQueue;
private:
void operator=(const Filter &); // assignment not allowed
};
class BlockFilterBase : public Filter
{
public:
BlockFilterBase(BlockTransformation &cipher,
BufferedTransformation *outQueue);
virtual ~BlockFilterBase() {}
void Put(byte inByte)
{
if (inBufSize == S)
ProcessBuf();
inBuf[inBufSize++]=inByte;
}
void Put(const byte *inString, unsigned int length);
protected:
void ProcessBuf();
BlockTransformation &cipher;
const unsigned int S;
SecByteBlock inBuf;
unsigned int inBufSize;
};
class BlockEncryptionFilter : public BlockFilterBase
{
public:
BlockEncryptionFilter(BlockTransformation &cipher, BufferedTransformation *outQueue = NULL)
: BlockFilterBase(cipher, outQueue) {}
protected:
void InputFinished();
};
class BlockDecryptionFilter : public BlockFilterBase
{
public:
BlockDecryptionFilter(BlockTransformation &cipher, BufferedTransformation *outQueue = NULL)
: BlockFilterBase(cipher, outQueue) {}
protected:
void InputFinished();
};
class StreamCipherFilter : public Filter
{
public:
StreamCipherFilter(StreamCipher &c,
BufferedTransformation *outQueue = NULL)
: Filter(outQueue), cipher(c) {}
void Put(byte inByte)
{outQueue->Put(cipher.ProcessByte(inByte));}
void Put(const byte *inString, unsigned int length);
private:
StreamCipher &cipher;
};
class HashFilter : public Filter
{
public:
HashFilter(HashModule &hm, BufferedTransformation *outQueue = NULL)
: Filter(outQueue), hash(hm) {}
void InputFinished();
void Put(byte inByte)
{hash.Update(&inByte, 1);}
void Put(const byte *inString, unsigned int length)
{hash.Update(inString, length);}
private:
HashModule &hash;
};
class Source : public Filter
{
public:
Source(BufferedTransformation *outQ = NULL)
: Filter(outQ) {}
void Put(byte)
{Pump(1);}
void Put(const byte *, unsigned int length)
{Pump(length);}
void InputFinished()
{PumpAll();}
virtual unsigned int Pump(unsigned int size) =0;
virtual unsigned long PumpAll() =0;
};
class Sink : public BufferedTransformation
{
public:
unsigned long MaxRetrieveable()
{return 0;}
unsigned int Get(byte &)
{return 0;}
unsigned int Get(byte *, unsigned int)
{return 0;}
unsigned int Peek(byte &) const
{return 0;}
};
class BitBucket : public Sink
{
public:
void Put(byte) {}
void Put(const byte *, unsigned int) {}
};
BufferedTransformation *Insert(const byte *in, unsigned int length, BufferedTransformation *outQueue);
unsigned int Extract(Source *source, byte *out, unsigned int length);
#endif