00001 /******************************************************************************* 00002 * Copyright (C) 2004 Vintela, Inc. All rights reserved. 00003 * Copyright (C) 2005 Novell, Inc. All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * - Redistributions of source code must retain the above copyright notice, 00009 * this list of conditions and the following disclaimer. 00010 * 00011 * - Redistributions in binary form must reproduce the above copyright notice, 00012 * this list of conditions and the following disclaimer in the documentation 00013 * and/or other materials provided with the distribution. 00014 * 00015 * - Neither the name of Vintela, Inc., Novell, Inc., nor the names of its 00016 * contributors may be used to endorse or promote products derived from this 00017 * software without specific prior written permission. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' 00020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00022 * ARE DISCLAIMED. IN NO EVENT SHALL Vintela, Inc., Novell, Inc., OR THE 00023 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00024 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00025 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 00026 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 00027 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 00028 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 00029 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00030 *******************************************************************************/ 00031 00032 00041 /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All 00042 rights reserved. 00043 License to copy and use this software is granted provided that it 00044 is identified as the "RSA Data Security, Inc. MD5 Message-Digest 00045 Algorithm" in all material mentioning or referencing this software 00046 or this function. 00047 License is also granted to make and use derivative works provided 00048 that such works are identified as "derived from the RSA Data 00049 Security, Inc. MD5 Message-Digest Algorithm" in all material 00050 mentioning or referencing the derived work. 00051 RSA Data Security, Inc. makes no representations concerning either 00052 the merchantability of this software or the suitability of this 00053 software for any particular purpose. It is provided "as is" 00054 without express or implied warranty of any kind. 00055 These notices must be retained in any copies of any part of this 00056 documentation and/or software. 00057 */ 00058 #ifndef BLOCXX_MD5_HPP_INCLUDE_GUARD_ 00059 #define BLOCXX_MD5_HPP_INCLUDE_GUARD_ 00060 #include "blocxx/BLOCXX_config.h" 00061 #include "blocxx/Types.hpp" 00062 #include "blocxx/Exception.hpp" 00063 #include "blocxx/CommonFwd.hpp" 00064 #ifdef BLOCXX_HAVE_STREAMBUF 00065 #include <streambuf> 00066 #else 00067 #include <streambuf.h> 00068 #endif 00069 #ifdef BLOCXX_HAVE_OSTREAM 00070 #include <ostream> 00071 #elif defined(BLOCXX_HAVE_OSTREAM_H) 00072 #include <ostream.h> 00073 #else 00074 #include <iostream> 00075 #endif 00076 00077 namespace BLOCXX_NAMESPACE 00078 { 00079 00080 BLOCXX_DECLARE_APIEXCEPTION(MD5, BLOCXX_COMMON_API) 00081 00082 const int MD5HASHLEN = 16; 00084 class BLOCXX_COMMON_API MD5StreamBuffer : public std::streambuf 00085 { 00086 public: 00087 MD5StreamBuffer(MD5* md5); 00088 protected: 00089 MD5* _md5; 00090 virtual int overflow(int c); 00091 virtual std::streamsize xsputn(const char* s, std::streamsize num); 00092 }; 00094 class BLOCXX_COMMON_API MD5OStreamBase 00095 { 00096 public: 00097 MD5StreamBuffer _buf; 00098 MD5OStreamBase(MD5* md5); 00099 }; 00101 class BLOCXX_COMMON_API MD5 : private MD5OStreamBase, public std::ostream 00102 { 00103 /* MD5 context. */ 00104 public: 00105 MD5(); 00110 MD5(const String& input); 00111 void init(const String& input); 00112 ~MD5() {}; 00113 typedef struct 00114 { 00115 UInt32 state[4]; /* state (ABCD) */ 00116 UInt32 count[2]; /* number of bits, modulo 2^64 (lsb first) */ 00117 unsigned char buffer[64]; /* input buffer */ 00118 } MD5_CTX; 00123 void update(const String& input); 00128 String toString(); 00129 unsigned char* getDigest(); 00130 static String convertBinToHex( const unsigned char* sBin); 00131 private: 00132 MD5_CTX m_ctx; 00133 unsigned char m_digest[16]; 00134 bool m_finished; 00135 static void MD5Init(MD5_CTX * md5ctx); 00136 static void MD5Update(MD5_CTX *md5ctx, const unsigned char* input, 00137 UInt32 inputLen); 00138 static void MD5Final(unsigned char*, MD5_CTX *); 00139 friend class MD5StreamBuffer; 00140 }; 00141 00142 } // end namespace BLOCXX_NAMESPACE 00143 00144 #endif