diff options
Diffstat (limited to 'vmime')
-rw-r--r-- | vmime/exception.hpp | 18 | ||||
-rw-r--r-- | vmime/object.hpp | 3 | ||||
-rw-r--r-- | vmime/security/digest/md5/md5MessageDigest.hpp (renamed from vmime/utility/md5.hpp) | 42 | ||||
-rw-r--r-- | vmime/security/digest/messageDigest.hpp | 134 | ||||
-rw-r--r-- | vmime/security/digest/messageDigestFactory.hpp | 108 | ||||
-rw-r--r-- | vmime/security/digest/sha1/sha1MessageDigest.hpp | 75 | ||||
-rw-r--r-- | vmime/types.hpp | 2 |
7 files changed, 365 insertions, 17 deletions
diff --git a/vmime/exception.hpp b/vmime/exception.hpp index 55d4c480..d7f6912d 100644 --- a/vmime/exception.hpp +++ b/vmime/exception.hpp @@ -112,6 +112,9 @@ public: }; +/** No encoder has been found for the specified encoding name. + */ + class no_encoder_available : public vmime::exception { public: @@ -124,6 +127,21 @@ public: }; +/** No algorithm has been found for the specified name. + */ + +class no_digest_algorithm_available : public vmime::exception +{ +public: + + no_digest_algorithm_available(const string& name, const exception& other = NO_EXCEPTION); + ~no_digest_algorithm_available() throw(); + + exception* clone() const; + const char* name() const throw(); +}; + + class no_such_parameter : public vmime::exception { public: diff --git a/vmime/object.hpp b/vmime/object.hpp index 0ef6e199..8d3015f2 100644 --- a/vmime/object.hpp +++ b/vmime/object.hpp @@ -21,6 +21,9 @@ #define VMIME_OBJECT_HPP_INCLUDED +#include "vmime/types.hpp" + + #include <vector> diff --git a/vmime/utility/md5.hpp b/vmime/security/digest/md5/md5MessageDigest.hpp index eaded4c9..e6a0224e 100644 --- a/vmime/utility/md5.hpp +++ b/vmime/security/digest/md5/md5MessageDigest.hpp @@ -17,40 +17,45 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -#ifndef VMIME_UTILITY_MD5_HPP_INCLUDED -#define VMIME_UTILITY_MD5_HPP_INCLUDED +#ifndef VMIME_SECURITY_DIGEST_MD5_MD5MESSAGEDIGEST_HPP_INCLUDED +#define VMIME_SECURITY_DIGEST_MD5_MD5MESSAGEDIGEST_HPP_INCLUDED -#include "vmime/base.hpp" -#include "vmime/config.hpp" +#include "vmime/security/digest/messageDigest.hpp" namespace vmime { -namespace utility { +namespace security { +namespace digest { +namespace md5 { -class md5 +class md5MessageDigest : public messageDigest { public: - md5(); - md5(const vmime_uint8* const in, const unsigned long length); - md5(const string& in); + md5MessageDigest(); -public: + void update(const byte b); + void update(const string& s); + void update(const byte* buffer, const unsigned long len); + void update(const byte* buffer, const unsigned long offset, const unsigned long len); + + void finalize(); + void finalize(const string& s); + void finalize(const byte* buffer, const unsigned long len); + void finalize(const byte* buffer, const unsigned long offset, const unsigned long len); - const string hex(); - const vmime_uint8* hash(); + const int getDigestLength() const; + const byte* getDigest() const; - void update(const vmime_uint8* data, unsigned long len); - void update(const string& in); + void reset(); protected: void init(); void transformHelper(); void transform(); - void finalize(); vmime_uint32 m_hash[4]; @@ -61,8 +66,11 @@ protected: }; -} // utility +} // md5 +} // digest +} // security } // vmime -#endif // VMIME_UTILITY_MD5_HPP_INCLUDED +#endif // VMIME_SECURITY_DIGEST_MD5_MD5MESSAGEDIGEST_HPP_INCLUDED + diff --git a/vmime/security/digest/messageDigest.hpp b/vmime/security/digest/messageDigest.hpp new file mode 100644 index 00000000..250a9992 --- /dev/null +++ b/vmime/security/digest/messageDigest.hpp @@ -0,0 +1,134 @@ +// +// VMime library (http://www.vmime.org) +// Copyright (C) 2002-2005 Vincent Richard <[email protected]> +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#ifndef VMIME_SECURITY_DIGEST_MESSAGEDIGEST_HPP_INCLUDED +#define VMIME_SECURITY_DIGEST_MESSAGEDIGEST_HPP_INCLUDED + + +#include "vmime/object.hpp" +#include "vmime/types.hpp" + + +namespace vmime { +namespace security { +namespace digest { + + +/** Computes message digests using standard algorithms, + * such as MD5 or SHA. + */ + +class messageDigest : public object +{ +public: + + /** Updates the digest using the specified string. + * + * @param s the string with which to update the digest. + */ + virtual void update(const string& s) = 0; + + /** Updates the digest using the specified byte. + * + * @param b the byte with which to update the digest. + */ + virtual void update(const byte b) = 0; + + /** Updates the digest using the specified array of bytes. + * + * @param buffer array of bytes + * @param len number of bytes to use in the buffer + */ + virtual void update(const byte* buffer, const unsigned long len) = 0; + + /** Updates the digest using the specified array of bytes, + * starting at the specified offset. + * + * @param buffer array of bytes + * @param offset offset to start from in the array of bytes + * @param len number of bytes to use, starting at offset + */ + virtual void update(const byte* buffer, + const unsigned long offset, + const unsigned long len) = 0; + + /** Completes the hash computation by performing final operations + * such as padding. + */ + virtual void finalize() = 0; + + /** Completes the hash computation by performing final operations + * such as padding. This is equivalent to calling update() and + * then finalize(). + */ + virtual void finalize(const string& s) = 0; + + /** Completes the hash computation by performing final operations + * such as padding. This is equivalent to calling update() and + * then finalize(). + */ + virtual void finalize(const byte* buffer, + const unsigned long len) = 0; + + /** Completes the hash computation by performing final operations + * such as padding. This is equivalent to calling update() and + * then finalize(). + */ + virtual void finalize(const byte* buffer, + const unsigned long offset, + const unsigned long len) = 0; + + /** Returns the length of the hash. + * This is the length of the array returned by getDigest(). + * + * @return length of computed hash + */ + virtual const int getDigestLength() const = 0; + + /** Returns the hash, as computed by the algorithm. + * You must call finalize() before using this function, or the + * hash will not be correct. + * To get the size of the returned array, call getDigestLength(). + * + * @return computed hash + */ + virtual const byte* getDigest() const = 0; + + /** Returns the hash as an hexadecimal string. + * You must call finalize() before using this function, or the + * hash will not be correct. + * + * @return computed hash, in hexadecimal format + */ + virtual const string getHexDigest() const; + + /** Resets the algorithm to its initial state, so that you can + * compute a new hash using the same object. + */ + virtual void reset() = 0; +}; + + +} // digest +} // security +} // vmime + + +#endif // VMIME_SECURITY_DIGEST_MESSAGEDIGEST_HPP_INCLUDED + diff --git a/vmime/security/digest/messageDigestFactory.hpp b/vmime/security/digest/messageDigestFactory.hpp new file mode 100644 index 00000000..3216a467 --- /dev/null +++ b/vmime/security/digest/messageDigestFactory.hpp @@ -0,0 +1,108 @@ +// +// VMime library (http://www.vmime.org) +// Copyright (C) 2002-2005 Vincent Richard <[email protected]> +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#ifndef VMIME_SECURITY_DIGEST_MESSAGEDIGESTFACTORY_HPP_INCLUDED +#define VMIME_SECURITY_DIGEST_MESSAGEDIGESTFACTORY_HPP_INCLUDED + + +#include "vmime/types.hpp" +#include "vmime/security/digest/messageDigest.hpp" +#include "vmime/utility/stringUtils.hpp" + + +namespace vmime { +namespace security { +namespace digest { + + +/** Creates instances of message digest algorithms. + */ + +class messageDigestFactory +{ +private: + + messageDigestFactory(); + ~messageDigestFactory(); + +public: + + static messageDigestFactory* getInstance(); + +private: + + class digestAlgorithmFactory : public object + { + public: + + virtual ref <messageDigest> create() const = 0; + }; + + template <class E> + class digestAlgorithmFactoryImpl : public digestAlgorithmFactory + { + public: + + ref <messageDigest> create() const + { + return vmime::create <E>(); + } + }; + + + typedef std::map <std::string, ref <digestAlgorithmFactory> > MapType; + MapType m_algos; + +public: + + /** Register a new digest algorithm by its name. + * + * @param name algorithm name + */ + template <class E> + void registerAlgorithm(const string& name) + { + m_algos.insert(MapType::value_type(utility::stringUtils::toLower(name), + vmime::create <digestAlgorithmFactoryImpl <E> >())); + } + + /** Create a new algorithm instance from its name. + * + * @param name algorithm name (eg. "md5") + * @return a new algorithm instance for the specified name + * @throw exceptions::no_digest_algorithm_available if no algorithm is + * registered with this name + */ + ref <messageDigest> create(const string& name); + + /** Return a list of supported digest algorithms. + * + * @return list of supported digest algorithms + */ + const std::vector <string> getSupportedAlgorithms() const; +}; + + +} // digest +} // security +} // vmime + + +#endif // VMIME_SECURITY_DIGEST_MESSAGEDIGESTFACTORY_HPP_INCLUDED + diff --git a/vmime/security/digest/sha1/sha1MessageDigest.hpp b/vmime/security/digest/sha1/sha1MessageDigest.hpp new file mode 100644 index 00000000..f182ede8 --- /dev/null +++ b/vmime/security/digest/sha1/sha1MessageDigest.hpp @@ -0,0 +1,75 @@ +// +// VMime library (http://www.vmime.org) +// Copyright (C) 2002-2005 Vincent Richard <[email protected]> +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#ifndef VMIME_SECURITY_DIGEST_SHA1_SHA1MESSAGEDIGEST_HPP_INCLUDED +#define VMIME_SECURITY_DIGEST_SHA1_SHA1MESSAGEDIGEST_HPP_INCLUDED + + +#include "vmime/security/digest/messageDigest.hpp" + + +namespace vmime { +namespace security { +namespace digest { +namespace sha1 { + + +class sha1MessageDigest : public messageDigest +{ +public: + + sha1MessageDigest(); + + void update(const byte b); + void update(const string& s); + void update(const byte* buffer, const unsigned long len); + void update(const byte* buffer, const unsigned long offset, const unsigned long len); + + void finalize(); + void finalize(const string& s); + void finalize(const byte* buffer, const unsigned long len); + void finalize(const byte* buffer, const unsigned long offset, const unsigned long len); + + const int getDigestLength() const; + const byte* getDigest() const; + + void reset(); + +protected: + + void init(); + + static void transform(unsigned long state[5], const byte buffer[64]); + + unsigned long m_state[5]; + unsigned long m_count[2]; + byte m_buffer[64]; + + byte m_digest[20]; +}; + + +} // sha1 +} // digest +} // security +} // vmime + + +#endif // VMIME_SECURITY_DIGEST_SHA1_SHA1MESSAGEDIGEST_HPP_INCLUDED + diff --git a/vmime/types.hpp b/vmime/types.hpp index 38485f9a..4e2fa923 100644 --- a/vmime/types.hpp +++ b/vmime/types.hpp @@ -39,6 +39,8 @@ namespace vmime typedef int char_t; + typedef vmime_uint8 byte; + // Some aliases namespace utils = utility; |