00001 #ifndef CRYPTOPP_DEFAULT_H
00002 #define CRYPTOPP_DEFAULT_H
00003
00004 #include "sha.h"
00005 #include "hmac.h"
00006 #include "des.h"
00007 #include "filters.h"
00008 #include "modes.h"
00009
00010 NAMESPACE_BEGIN(CryptoPP)
00011
00012 typedef DES_EDE2 Default_BlockCipher;
00013 typedef SHA DefaultHashModule;
00014 typedef HMAC<DefaultHashModule> DefaultMAC;
00015
00016
00017 class DefaultEncryptor : public ProxyFilter
00018 {
00019 public:
00020 DefaultEncryptor(const char *passphrase, BufferedTransformation *attachment = NULL);
00021 DefaultEncryptor(const byte *passphrase, size_t passphraseLength, BufferedTransformation *attachment = NULL);
00022
00023 protected:
00024 void FirstPut(const byte *);
00025 void LastPut(const byte *inString, size_t length);
00026
00027 private:
00028 SecByteBlock m_passphrase;
00029 CBC_Mode<Default_BlockCipher>::Encryption m_cipher;
00030 };
00031
00032
00033 class DefaultDecryptor : public ProxyFilter
00034 {
00035 public:
00036 DefaultDecryptor(const char *passphrase, BufferedTransformation *attachment = NULL, bool throwException=true);
00037 DefaultDecryptor(const byte *passphrase, size_t passphraseLength, BufferedTransformation *attachment = NULL, bool throwException=true);
00038
00039 class Err : public Exception
00040 {
00041 public:
00042 Err(const std::string &s)
00043 : Exception(DATA_INTEGRITY_CHECK_FAILED, s) {}
00044 };
00045 class KeyBadErr : public Err {public: KeyBadErr() : Err("DefaultDecryptor: cannot decrypt message with this passphrase") {}};
00046
00047 enum State {WAITING_FOR_KEYCHECK, KEY_GOOD, KEY_BAD};
00048 State CurrentState() const {return m_state;}
00049
00050 protected:
00051 void FirstPut(const byte *inString);
00052 void LastPut(const byte *inString, size_t length);
00053
00054 State m_state;
00055
00056 private:
00057 void CheckKey(const byte *salt, const byte *keyCheck);
00058
00059 SecByteBlock m_passphrase;
00060 CBC_Mode<Default_BlockCipher>::Decryption m_cipher;
00061 member_ptr<FilterWithBufferedInput> m_decryptor;
00062 bool m_throwException;
00063 };
00064
00065
00066 class DefaultEncryptorWithMAC : public ProxyFilter
00067 {
00068 public:
00069 DefaultEncryptorWithMAC(const char *passphrase, BufferedTransformation *attachment = NULL);
00070 DefaultEncryptorWithMAC(const byte *passphrase, size_t passphraseLength, BufferedTransformation *attachment = NULL);
00071
00072 protected:
00073 void FirstPut(const byte *inString) {}
00074 void LastPut(const byte *inString, size_t length);
00075
00076 private:
00077 member_ptr<DefaultMAC> m_mac;
00078 };
00079
00080
00081 class DefaultDecryptorWithMAC : public ProxyFilter
00082 {
00083 public:
00084 class MACBadErr : public DefaultDecryptor::Err {public: MACBadErr() : DefaultDecryptor::Err("DefaultDecryptorWithMAC: MAC check failed") {}};
00085
00086 DefaultDecryptorWithMAC(const char *passphrase, BufferedTransformation *attachment = NULL, bool throwException=true);
00087 DefaultDecryptorWithMAC(const byte *passphrase, size_t passphraseLength, BufferedTransformation *attachment = NULL, bool throwException=true);
00088
00089 DefaultDecryptor::State CurrentState() const;
00090 bool CheckLastMAC() const;
00091
00092 protected:
00093 void FirstPut(const byte *inString) {}
00094 void LastPut(const byte *inString, size_t length);
00095
00096 private:
00097 member_ptr<DefaultMAC> m_mac;
00098 HashVerifier *m_hashVerifier;
00099 bool m_throwException;
00100 };
00101
00102 NAMESPACE_END
00103
00104 #endif