#ifndef CRYPTOPP_PANAMA_H #define CRYPTOPP_PANAMA_H #include "seckey.h" #include "secblock.h" #include "iterhash.h" #include "strciphr.h" NAMESPACE_BEGIN(CryptoPP) /// base class, do not use directly template class CRYPTOPP_NO_VTABLE Panama { public: void Reset(); void Iterate(unsigned int count, const word32 *p=NULL, word32 *z=NULL, const word32 *y=NULL); protected: typedef word32 Stage[8]; enum {STAGES = 32}; FixedSizeSecBlock m_state; unsigned int m_bstart; }; /// Panama Hash template class PanamaHash : protected Panama, public IteratedHash { public: enum {DIGESTSIZE = 32}; PanamaHash() {Panama::Reset();} unsigned int DigestSize() const {return DIGESTSIZE;} void TruncatedFinal(byte *hash, unsigned int size); protected: void Init() {Panama::Reset();} void HashEndianCorrectedBlock(const word32 *data) {Iterate(1, data);} // push unsigned int HashMultipleBlocks(const word32 *input, unsigned int length); }; //! . template class CRYPTOPP_NO_VTABLE PanamaMAC_Base : public PanamaHash, public VariableKeyLength<32, 0, UINT_MAX>, public MessageAuthenticationCode { public: void UncheckedSetKey(const byte *userKey, unsigned int keylength) { m_key.Assign(userKey, keylength); Restart(); } static const char * StaticAlgorithmName() {return B::ToEnum() == BIG_ENDIAN ? "Panama-BE" : "Panama-LE";} protected: void Init() { PanamaHash::Init(); Update(m_key, m_key.size()); } SecByteBlock m_key; }; /// Panama MAC template class PanamaMAC : public MessageAuthenticationCodeImpl > { public: PanamaMAC() {} PanamaMAC(const byte *key, unsigned int length=PanamaMAC_Base::DEFAULT_KEYLENGTH) {SetKey(key, length);} }; //! . template struct PanamaCipherInfo : public VariableKeyLength<32, 32, 64, 32, SimpleKeyingInterface::NOT_RESYNCHRONIZABLE> { static const char * StaticAlgorithmName() {return B::ToEnum() == BIG_ENDIAN_ORDER ? "Panama-BE" : "Panama-LE";} }; //! . template class PanamaCipherPolicy : public AdditiveCipherConcretePolicy, public PanamaCipherInfo, protected Panama { protected: void CipherSetKey(const NameValuePairs ¶ms, const byte *key, unsigned int length); void OperateKeystream(KeystreamOperation operation, byte *output, const byte *input, unsigned int iterationCount); bool IsRandomAccess() const {return false;} }; //! Panama Stream Cipher template struct PanamaCipher : public PanamaCipherInfo, public SymmetricCipherDocumentation { typedef SymmetricCipherFinal, AdditiveCipherTemplate<> > > Encryption; typedef Encryption Decryption; }; NAMESPACE_END #endif