diff --git a/Foundation/include/Poco/DigestEngine.h b/Foundation/include/Poco/DigestEngine.h index 3de5b08c9..28562c2a6 100644 --- a/Foundation/include/Poco/DigestEngine.h +++ b/Foundation/include/Poco/DigestEngine.h @@ -1,125 +1,128 @@ -// -// DigestEngine.h -// -// $Id: //poco/1.4/Foundation/include/Poco/DigestEngine.h#1 $ -// -// Library: Foundation -// Package: Crypt -// Module: DigestEngine -// -// Definition of class DigestEngine. -// -// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// Permission is hereby granted, free of charge, to any person or organization -// obtaining a copy of the software and accompanying documentation covered by -// this license (the "Software") to use, reproduce, display, distribute, -// execute, and transmit the Software, and to prepare derivative works of the -// Software, and to permit third-parties to whom the Software is furnished to -// do so, all subject to the following: -// -// The copyright notices in the Software and this entire statement, including -// the above license grant, this restriction and the following disclaimer, -// must be included in all copies of the Software, in whole or in part, and -// all derivative works of the Software, unless such copies or derivative -// works are solely in the form of machine-executable object code generated by -// a source language processor. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - - -#ifndef Foundation_DigestEngine_INCLUDED -#define Foundation_DigestEngine_INCLUDED - - -#include "Poco/Foundation.h" -#include - - -namespace Poco { - - -class Foundation_API DigestEngine - /// This class is an abstract base class - /// for all classes implementing a message - /// digest algorithm, like MD5Engine - /// and SHA1Engine. - /// Call update() repeatedly with data to - /// compute the digest from. When done, - /// call digest() to obtain the message - /// digest. -{ -public: - typedef std::vector Digest; - - DigestEngine(); - virtual ~DigestEngine(); - - void update(const void* data, unsigned length); - void update(char data); - void update(const std::string& data); - /// Updates the digest with the given data. - - virtual unsigned digestLength() const = 0; - /// Returns the length of the digest in bytes. - - virtual void reset() = 0; - /// Resets the engine so that a new - /// digest can be computed. - - virtual const Digest& digest() = 0; - /// Finishes the computation of the digest and - /// returns the message digest. Resets the engine - /// and can thus only be called once for every digest. - /// The returned reference is valid until the next - /// time digest() is called, or the engine object is destroyed. - - static std::string digestToHex(const Digest& bytes); - /// Converts a message digest into a string of hexadecimal numbers. - -protected: - virtual void updateImpl(const void* data, unsigned length) = 0; - /// Updates the digest with the given data. Must be implemented - /// by subclasses. - -private: - DigestEngine(const DigestEngine&); - DigestEngine& operator = (const DigestEngine&); -}; - - -// -// inlines -// - - -inline void DigestEngine::update(const void* data, unsigned length) -{ - updateImpl(data, length); -} - - -inline void DigestEngine::update(char data) -{ - updateImpl(&data, 1); -} - - -inline void DigestEngine::update(const std::string& data) -{ - updateImpl(data.data(), (unsigned) data.size()); -} - - -} // namespace Poco - - -#endif // Foundation_DigestEngine_INCLUDED +// +// DigestEngine.h +// +// $Id: //poco/1.4/Foundation/include/Poco/DigestEngine.h#1 $ +// +// Library: Foundation +// Package: Crypt +// Module: DigestEngine +// +// Definition of class DigestEngine. +// +// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software, unless such copies or derivative +// works are solely in the form of machine-executable object code generated by +// a source language processor. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// + + +#ifndef Foundation_DigestEngine_INCLUDED +#define Foundation_DigestEngine_INCLUDED + + +#include "Poco/Foundation.h" +#include + + +namespace Poco { + + +class Foundation_API DigestEngine + /// This class is an abstract base class + /// for all classes implementing a message + /// digest algorithm, like MD5Engine + /// and SHA1Engine. + /// Call update() repeatedly with data to + /// compute the digest from. When done, + /// call digest() to obtain the message + /// digest. +{ +public: + typedef std::vector Digest; + + DigestEngine(); + virtual ~DigestEngine(); + + void update(const void* data, unsigned length); + void update(char data); + void update(const std::string& data); + /// Updates the digest with the given data. + + virtual unsigned digestLength() const = 0; + /// Returns the length of the digest in bytes. + + virtual void reset() = 0; + /// Resets the engine so that a new + /// digest can be computed. + + virtual const Digest& digest() = 0; + /// Finishes the computation of the digest and + /// returns the message digest. Resets the engine + /// and can thus only be called once for every digest. + /// The returned reference is valid until the next + /// time digest() is called, or the engine object is destroyed. + + static std::string digestToHex(const Digest& bytes); + /// Converts a message digest into a string of hexadecimal numbers. + + static Digest digestFromHex(const std::string& digest); + /// Converts a string created by digestToHex back to its Digest presentation + +protected: + virtual void updateImpl(const void* data, unsigned length) = 0; + /// Updates the digest with the given data. Must be implemented + /// by subclasses. + +private: + DigestEngine(const DigestEngine&); + DigestEngine& operator = (const DigestEngine&); +}; + + +// +// inlines +// + + +inline void DigestEngine::update(const void* data, unsigned length) +{ + updateImpl(data, length); +} + + +inline void DigestEngine::update(char data) +{ + updateImpl(&data, 1); +} + + +inline void DigestEngine::update(const std::string& data) +{ + updateImpl(data.data(), (unsigned) data.size()); +} + + +} // namespace Poco + + +#endif // Foundation_DigestEngine_INCLUDED diff --git a/Foundation/src/DigestEngine.cpp b/Foundation/src/DigestEngine.cpp index 9ee745659..7d606a8e1 100644 --- a/Foundation/src/DigestEngine.cpp +++ b/Foundation/src/DigestEngine.cpp @@ -1,68 +1,104 @@ -// -// DigestEngine.cpp -// -// $Id: //poco/1.4/Foundation/src/DigestEngine.cpp#1 $ -// -// Library: Foundation -// Package: Crypt -// Module: DigestEngine -// -// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// Permission is hereby granted, free of charge, to any person or organization -// obtaining a copy of the software and accompanying documentation covered by -// this license (the "Software") to use, reproduce, display, distribute, -// execute, and transmit the Software, and to prepare derivative works of the -// Software, and to permit third-parties to whom the Software is furnished to -// do so, all subject to the following: -// -// The copyright notices in the Software and this entire statement, including -// the above license grant, this restriction and the following disclaimer, -// must be included in all copies of the Software, in whole or in part, and -// all derivative works of the Software, unless such copies or derivative -// works are solely in the form of machine-executable object code generated by -// a source language processor. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - - -#include "Poco/DigestEngine.h" - - -namespace Poco { - - -DigestEngine::DigestEngine() -{ -} - - -DigestEngine::~DigestEngine() -{ -} - - -std::string DigestEngine::digestToHex(const Digest& bytes) -{ - static const char digits[] = "0123456789abcdef"; - std::string result; - result.reserve(bytes.size()*2); - for (Digest::const_iterator it = bytes.begin(); it != bytes.end(); ++it) - { - unsigned char c = *it; - result += digits[(c >> 4) & 0xF]; - result += digits[c & 0xF]; - } - return result; -} - - -} // namespace Poco +// +// DigestEngine.cpp +// +// $Id: //poco/1.4/Foundation/src/DigestEngine.cpp#1 $ +// +// Library: Foundation +// Package: Crypt +// Module: DigestEngine +// +// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software, unless such copies or derivative +// works are solely in the form of machine-executable object code generated by +// a source language processor. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// + + +#include "Poco/DigestEngine.h" +#include "Poco/Exception.h" + + +namespace Poco { + + +DigestEngine::DigestEngine() +{ +} + + +DigestEngine::~DigestEngine() +{ +} + + +std::string DigestEngine::digestToHex(const Digest& bytes) +{ + static const char digits[] = "0123456789abcdef"; + std::string result; + result.reserve(bytes.size()*2); + for (Digest::const_iterator it = bytes.begin(); it != bytes.end(); ++it) + { + unsigned char c = *it; + result += digits[(c >> 4) & 0xF]; + result += digits[c & 0xF]; + } + return result; +} + + +DigestEngine::Digest DigestEngine::digestFromHex(const std::string& digest) +{ + if (digest.size() % 2 != 0) + throw DataFormatException(); + Digest result; + result.reserve(digest.size()/2); + for (std::size_t i = 0; i < digest.size(); ++i) + { + int c = 0; + // first upper 4 bits + if (digest[i] >= '0' && digest[i] <= '9') + c = digest[i] - '0'; + else if (digest[i] >= 'a' && digest[i] <= 'f') + c = digest[i] - 'a'+10; + else if (digest[i] >= 'A' && digest[i] <= 'F') + c = digest[i] - 'A'+10; + else + throw DataFormatException(); + c <<= 4; + ++i; + if (digest[i] >= '0' && digest[i] <= '9') + c += digest[i] - '0'; + else if (digest[i] >= 'a' && digest[i] <= 'f') + c += digest[i] - 'a'+10; + else if (digest[i] >= 'A' && digest[i] <= 'F') + c += digest[i] - 'A'+10; + else + throw DataFormatException(); + + result.push_back(static_cast(c)); + } + return result; +} + + +} // namespace Poco