?? filters.h
字號:
bool GetLastResult() const {return m_verified;}protected: void InitializeDerivedAndReturnNewSizes(const NameValuePairs ¶meters, unsigned int &firstSize, unsigned int &blockSize, unsigned int &lastSize); void FirstPut(const byte *inString); void NextPutMultiple(const byte *inString, unsigned int length); void LastPut(const byte *inString, unsigned int length);private: const PK_Verifier &m_verifier; member_ptr<PK_MessageAccumulator> m_messageAccumulator; word32 m_flags; SecByteBlock m_signature; bool m_verified;};typedef SignatureVerificationFilter VerifierFilter; // for backwards compatibility//! Redirect input to another BufferedTransformation without owning itclass Redirector : public CustomSignalPropagation<Sink>{public: Redirector() : m_target(NULL), m_passSignal(true) {} Redirector(BufferedTransformation &target, bool passSignal=true) : m_target(&target), m_passSignal(passSignal) {} void Redirect(BufferedTransformation &target) {m_target = ⌖} void StopRedirection() {m_target = NULL;} bool GetPassSignal() const {return m_passSignal;} void SetPassSignal(bool passSignal) {m_passSignal = passSignal;} unsigned int Put2(const byte *begin, unsigned int length, int messageEnd, bool blocking) {return m_target ? m_target->Put2(begin, length, m_passSignal ? messageEnd : 0, blocking) : 0;} void Initialize(const NameValuePairs ¶meters, int propagation) {ChannelInitialize(NULL_CHANNEL, parameters, propagation);} bool Flush(bool hardFlush, int propagation=-1, bool blocking=true) {return m_target && m_passSignal ? m_target->Flush(hardFlush, propagation, blocking) : false;} bool MessageSeriesEnd(int propagation=-1, bool blocking=true) {return m_target && m_passSignal ? m_target->MessageSeriesEnd(propagation, blocking) : false;} void ChannelInitialize(const std::string &channel, const NameValuePairs ¶meters=g_nullNameValuePairs, int propagation=-1); unsigned int ChannelPut2(const std::string &channel, const byte *begin, unsigned int length, int messageEnd, bool blocking) {return m_target ? m_target->ChannelPut2(channel, begin, length, m_passSignal ? messageEnd : 0, blocking) : 0;} unsigned int ChannelPutModifiable2(const std::string &channel, byte *begin, unsigned int length, int messageEnd, bool blocking) {return m_target ? m_target->ChannelPutModifiable2(channel, begin, length, m_passSignal ? messageEnd : 0, blocking) : 0;} bool ChannelFlush(const std::string &channel, bool completeFlush, int propagation=-1, bool blocking=true) {return m_target && m_passSignal ? m_target->ChannelFlush(channel, completeFlush, propagation, blocking) : false;} bool ChannelMessageSeriesEnd(const std::string &channel, int propagation=-1, bool blocking=true) {return m_target && m_passSignal ? m_target->ChannelMessageSeriesEnd(channel, propagation, blocking) : false;}private: BufferedTransformation *m_target; bool m_passSignal;};// Used By ProxyFilterclass OutputProxy : public CustomSignalPropagation<Sink>{public: OutputProxy(BufferedTransformation &owner, bool passSignal) : m_owner(owner), m_passSignal(passSignal) {} bool GetPassSignal() const {return m_passSignal;} void SetPassSignal(bool passSignal) {m_passSignal = passSignal;} unsigned int Put2(const byte *begin, unsigned int length, int messageEnd, bool blocking) {return m_owner.AttachedTransformation()->Put2(begin, length, m_passSignal ? messageEnd : 0, blocking);} unsigned int PutModifiable2(byte *begin, unsigned int length, int messageEnd, bool blocking) {return m_owner.AttachedTransformation()->PutModifiable2(begin, length, m_passSignal ? messageEnd : 0, blocking);} void Initialize(const NameValuePairs ¶meters=g_nullNameValuePairs, int propagation=-1) {if (m_passSignal) m_owner.AttachedTransformation()->Initialize(parameters, propagation);} bool Flush(bool hardFlush, int propagation=-1, bool blocking=true) {return m_passSignal ? m_owner.AttachedTransformation()->Flush(hardFlush, propagation, blocking) : false;} bool MessageSeriesEnd(int propagation=-1, bool blocking=true) {return m_passSignal ? m_owner.AttachedTransformation()->MessageSeriesEnd(propagation, blocking) : false;} unsigned int ChannelPut2(const std::string &channel, const byte *begin, unsigned int length, int messageEnd, bool blocking) {return m_owner.AttachedTransformation()->ChannelPut2(channel, begin, length, m_passSignal ? messageEnd : 0, blocking);} unsigned int ChannelPutModifiable2(const std::string &channel, byte *begin, unsigned int length, int messageEnd, bool blocking) {return m_owner.AttachedTransformation()->ChannelPutModifiable2(channel, begin, length, m_passSignal ? messageEnd : 0, blocking);} void ChannelInitialize(const std::string &channel, const NameValuePairs ¶meters, int propagation=-1) {if (m_passSignal) m_owner.AttachedTransformation()->ChannelInitialize(channel, parameters, propagation);} bool ChannelFlush(const std::string &channel, bool completeFlush, int propagation=-1, bool blocking=true) {return m_passSignal ? m_owner.AttachedTransformation()->ChannelFlush(channel, completeFlush, propagation, blocking) : false;} bool ChannelMessageSeriesEnd(const std::string &channel, int propagation=-1, bool blocking=true) {return m_passSignal ? m_owner.AttachedTransformation()->ChannelMessageSeriesEnd(channel, propagation, blocking) : false;}private: BufferedTransformation &m_owner; bool m_passSignal;};//! Base class for Filter classes that are proxies for a chain of other filters.class ProxyFilter : public FilterWithBufferedInput{public: ProxyFilter(BufferedTransformation *filter, unsigned int firstSize, unsigned int lastSize, BufferedTransformation *attachment); bool IsolatedFlush(bool hardFlush, bool blocking); void SetFilter(Filter *filter); void NextPutMultiple(const byte *s, unsigned int len);protected: member_ptr<BufferedTransformation> m_filter;};//! simple proxy filter that doesn't modify the underlying filter's input or outputclass SimpleProxyFilter : public ProxyFilter{public: SimpleProxyFilter(BufferedTransformation *filter, BufferedTransformation *attachment) : ProxyFilter(filter, 0, 0, attachment) {} void FirstPut(const byte *) {} void LastPut(const byte *, unsigned int) {m_filter->MessageEnd();}};//! proxy for the filter created by PK_Encryptor::CreateEncryptionFilter/*! This class is here just to provide symmetry with VerifierFilter. */class PK_EncryptorFilter : public SimpleProxyFilter{public: PK_EncryptorFilter(RandomNumberGenerator &rng, const PK_Encryptor &encryptor, BufferedTransformation *attachment = NULL) : SimpleProxyFilter(encryptor.CreateEncryptionFilter(rng), attachment) {}};//! proxy for the filter created by PK_Decryptor::CreateDecryptionFilter/*! This class is here just to provide symmetry with SignerFilter. */class PK_DecryptorFilter : public SimpleProxyFilter{public: PK_DecryptorFilter(RandomNumberGenerator &rng, const PK_Decryptor &decryptor, BufferedTransformation *attachment = NULL) : SimpleProxyFilter(decryptor.CreateDecryptionFilter(rng), attachment) {}};//! Append input to a string objecttemplate <class T>class StringSinkTemplate : public Bufferless<Sink>{public: // VC60 workaround: no T::char_type typedef typename T::traits_type::char_type char_type; StringSinkTemplate(T &output) : m_output(&output) {assert(sizeof(output[0])==1);} void IsolatedInitialize(const NameValuePairs ¶meters) {if (!parameters.GetValue("OutputStringPointer", m_output)) throw InvalidArgument("StringSink: OutputStringPointer not specified");} unsigned int Put2(const byte *begin, unsigned int length, int messageEnd, bool blocking) { if (length > 0) { typename T::size_type size = m_output->size(); if (length < size && size + length > m_output->capacity()) m_output->reserve(2*size); m_output->append((const char_type *)begin, (const char_type *)begin+length); } return 0; }private: T *m_output;};//! Append input to an std::stringtypedef StringSinkTemplate<std::string> StringSink;//! Copy input to a memory bufferclass ArraySink : public Bufferless<Sink>{public: ArraySink(const NameValuePairs ¶meters = g_nullNameValuePairs) {IsolatedInitialize(parameters);} ArraySink(byte *buf, unsigned int size) : m_buf(buf), m_size(size), m_total(0) {} unsigned int AvailableSize() {return m_size - STDMIN(m_total, (unsigned long)m_size);} unsigned long TotalPutLength() {return m_total;} void IsolatedInitialize(const NameValuePairs ¶meters); byte * CreatePutSpace(unsigned int &size); unsigned int Put2(const byte *begin, unsigned int length, int messageEnd, bool blocking);protected: byte *m_buf; unsigned int m_size; unsigned long m_total;};//! Xor input to a memory bufferclass ArrayXorSink : public ArraySink{public: ArrayXorSink(byte *buf, unsigned int size) : ArraySink(buf, size) {} unsigned int Put2(const byte *begin, unsigned int length, int messageEnd, bool blocking); byte * CreatePutSpace(unsigned int &size) {return BufferedTransformation::CreatePutSpace(size);}};//! .class StringStore : public Store{public: StringStore(const char *string = NULL) {StoreInitialize(MakeParameters("InputBuffer", ConstByteArrayParameter(string)));} StringStore(const byte *string, unsigned int length) {StoreInitialize(MakeParameters("InputBuffer", ConstByteArrayParameter(string, length)));} template <class T> StringStore(const T &string) {StoreInitialize(MakeParameters("InputBuffer", ConstByteArrayParameter(string)));} unsigned int TransferTo2(BufferedTransformation &target, unsigned long &transferBytes, const std::string &channel=NULL_CHANNEL, bool blocking=true); unsigned int CopyRangeTo2(BufferedTransformation &target, unsigned long &begin, unsigned long end=ULONG_MAX, const std::string &channel=NULL_CHANNEL, bool blocking=true) const;private: void StoreInitialize(const NameValuePairs ¶meters); const byte *m_store; unsigned int m_length, m_count;};//! .class RandomNumberStore : public Store{public: RandomNumberStore(RandomNumberGenerator &rng, unsigned long length) : m_rng(rng), m_length(length), m_count(0) {} bool AnyRetrievable() const {return MaxRetrievable() != 0;} unsigned long MaxRetrievable() const {return m_length-m_count;} unsigned int TransferTo2(BufferedTransformation &target, unsigned long &transferBytes, const std::string &channel=NULL_CHANNEL, bool blocking=true); unsigned int CopyRangeTo2(BufferedTransformation &target, unsigned long &begin, unsigned long end=ULONG_MAX, const std::string &channel=NULL_CHANNEL, bool blocking=true) const { throw NotImplemented("RandomNumberStore: CopyRangeTo2() is not supported by this store"); }private: void StoreInitialize(const NameValuePairs ¶meters) {m_count = 0;} RandomNumberGenerator &m_rng; const unsigned long m_length; unsigned long m_count;};//! .class NullStore : public Store{public: NullStore(unsigned long size = ULONG_MAX) : m_size(size) {} void StoreInitialize(const NameValuePairs ¶meters) {} unsigned long MaxRetrievable() const {return m_size;} unsigned int TransferTo2(BufferedTransformation &target, unsigned long &transferBytes, const std::string &channel=NULL_CHANNEL, bool blocking=true); unsigned int CopyRangeTo2(BufferedTransformation &target, unsigned long &begin, unsigned long end=ULONG_MAX, const std::string &channel=NULL_CHANNEL, bool blocking=true) const;private: unsigned long m_size;};//! A Filter that pumps data into its attachment as inputclass Source : public InputRejecting<Filter>{public: Source(BufferedTransformation *attachment) : InputRejecting<Filter>(attachment) {} unsigned long Pump(unsigned long pumpMax=ULONG_MAX) {Pump2(pumpMax); return pumpMax;} unsigned int PumpMessages(unsigned int count=UINT_MAX) {PumpMessages2(count); return count;} void PumpAll() {PumpAll2();} virtual unsigned int Pump2(unsigned long &byteCount, bool blocking=true) =0; virtual unsigned int PumpMessages2(unsigned int &messageCount, bool blocking=true) =0; virtual unsigned int PumpAll2(bool blocking=true); virtual bool SourceExhausted() const =0;protected: void SourceInitialize(bool pumpAll, const NameValuePairs ¶meters) { IsolatedInitialize(parameters); if (pumpAll) PumpAll(); }};//! Turn a Store into a Sourcetemplate <class T>class SourceTemplate : public Source{public: SourceTemplate<T>(BufferedTransformation *attachment) : Source(attachment) {} SourceTemplate<T>(BufferedTransformation *attachment, T store) : Source(attachment), m_store(store) {} void IsolatedInitialize(const NameValuePairs ¶meters) {m_store.IsolatedInitialize(parameters);} unsigned int Pump2(unsigned long &byteCount, bool blocking=true) {return m_store.TransferTo2(*AttachedTransformation(), byteCount, NULL_CHANNEL, blocking);} unsigned int PumpMessages2(unsigned int &messageCount, bool blocking=true) {return m_store.TransferMessagesTo2(*AttachedTransformation(), messageCount, NULL_CHANNEL, blocking);} unsigned int PumpAll2(bool blocking=true) {return m_store.TransferAllTo2(*AttachedTransformation(), NULL_CHANNEL, blocking);} bool SourceExhausted() const {return !m_store.AnyRetrievable() && !m_store.AnyMessages();} void SetAutoSignalPropagation(int propagation) {m_store.SetAutoSignalPropagation(propagation);} int GetAutoSignalPropagation() const {return m_store.GetAutoSignalPropagation();}protected: T m_store;};//! .class StringSource : public SourceTemplate<StringStore>{public: StringSource(BufferedTransformation *attachment = NULL) : SourceTemplate<StringStore>(attachment) {} StringSource(const char *string, bool pumpAll, BufferedTransformation *attachment = NULL) : SourceTemplate<StringStore>(attachment) {SourceInitialize(pumpAll, MakeParameters("InputBuffer", ConstByteArrayParameter(string)));} StringSource(const byte *string, unsigned int length, bool pumpAll, BufferedTransformation *attachment = NULL) : SourceTemplate<StringStore>(attachment) {SourceInitialize(pumpAll, MakeParameters("InputBuffer", ConstByteArrayParameter(string, length)));}#ifdef __MWERKS__ // CW60 workaround StringSource(const std::string &string, bool pumpAll, BufferedTransformation *attachment = NULL)#else template <class T> StringSource(const T &string, bool pumpAll, BufferedTransformation *attachment = NULL)#endif : SourceTemplate<StringStore>(attachment) {SourceInitialize(pumpAll, MakeParameters("InputBuffer", ConstByteArrayParameter(string)));}};//! .class RandomNumberSource : public SourceTemplate<RandomNumberStore>{public: RandomNumberSource(RandomNumberGenerator &rng, unsigned int length, bool pumpAll, BufferedTransformation *attachment = NULL) : SourceTemplate<RandomNumberStore>(attachment, RandomNumberStore(rng, length)) {if (pumpAll) PumpAll();}};NAMESPACE_END#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -