added DigestEngine::digestFromHex(const std::string& digest) method

This commit is contained in:
Marian Krivos 2012-04-28 09:32:25 +00:00
parent bd59670069
commit a4931bb9af
2 changed files with 232 additions and 193 deletions

View File

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

View File

@ -1,68 +1,104 @@
// //
// DigestEngine.cpp // DigestEngine.cpp
// //
// $Id: //poco/1.4/Foundation/src/DigestEngine.cpp#1 $ // $Id: //poco/1.4/Foundation/src/DigestEngine.cpp#1 $
// //
// Library: Foundation // Library: Foundation
// Package: Crypt // Package: Crypt
// Module: DigestEngine // Module: DigestEngine
// //
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
// and Contributors. // and Contributors.
// //
// Permission is hereby granted, free of charge, to any person or organization // Permission is hereby granted, free of charge, to any person or organization
// obtaining a copy of the software and accompanying documentation covered by // obtaining a copy of the software and accompanying documentation covered by
// this license (the "Software") to use, reproduce, display, distribute, // this license (the "Software") to use, reproduce, display, distribute,
// execute, and transmit the Software, and to prepare derivative works of the // 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 // Software, and to permit third-parties to whom the Software is furnished to
// do so, all subject to the following: // do so, all subject to the following:
// //
// The copyright notices in the Software and this entire statement, including // The copyright notices in the Software and this entire statement, including
// the above license grant, this restriction and the following disclaimer, // 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 // 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 // all derivative works of the Software, unless such copies or derivative
// works are solely in the form of machine-executable object code generated by // works are solely in the form of machine-executable object code generated by
// a source language processor. // a source language processor.
// //
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, // 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 // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
// //
#include "Poco/DigestEngine.h" #include "Poco/DigestEngine.h"
#include "Poco/Exception.h"
namespace Poco {
namespace Poco {
DigestEngine::DigestEngine()
{ DigestEngine::DigestEngine()
} {
}
DigestEngine::~DigestEngine()
{ DigestEngine::~DigestEngine()
} {
}
std::string DigestEngine::digestToHex(const Digest& bytes)
{ std::string DigestEngine::digestToHex(const Digest& bytes)
static const char digits[] = "0123456789abcdef"; {
std::string result; static const char digits[] = "0123456789abcdef";
result.reserve(bytes.size()*2); std::string result;
for (Digest::const_iterator it = bytes.begin(); it != bytes.end(); ++it) 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]; unsigned char c = *it;
result += digits[c & 0xF]; result += digits[(c >> 4) & 0xF];
} result += digits[c & 0xF];
return result; }
} return result;
}
} // namespace Poco
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<unsigned char>(c));
}
return result;
}
} // namespace Poco