MD5.hpp

Go to the documentation of this file.
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

Generated on Fri Jun 16 15:39:08 2006 for blocxx by  doxygen 1.4.6