// // $Id: MD5.h 3659 2007-01-09 17:43:02Z bakerj $ // //****************************************************************************************// // Copyright (c) 2002-2007, The MITRE Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, this // list of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // * Neither the name of The MITRE Corporation nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT // SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR // TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // //****************************************************************************************// // // MD5.cpp - source code for the C++/object oriented translation and // modification of MD5. // // Translation and modification (c) 1995 by Mordechai T. Abzug // // This translation/ modification is provided "as is," without express or // implied warranty of any kind. // // The translator/ modifier does not claim (1) that MD5 will do what you think // it does; (2) that this translation/ modification is accurate; or (3) that // this software is "merchantible." (Language for this disclaimer partially // copied from the disclaimer below). // //****************************************************************************************// // // Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All // rights reserved. // // License to copy and use this software is granted provided that it // is identified as the "RSA Data Security, Inc. MD5 Message-Digest // Algorithm" in all material mentioning or referencing this software // or this function. // // License is also granted to make and use derivative works provided // that such works are identified as "derived from the RSA Data // Security, Inc. MD5 Message-Digest Algorithm" in all material // mentioning or referencing the derived work. // // RSA Data Security, Inc. makes no representations concerning either // the merchantability of this software or the suitability of this // software for any particular purpose. It is provided "as is" // without express or implied warranty of any kind. // // These notices must be retained in any copies of any part of this // documentation and/or software. // //****************************************************************************************// #ifndef MD5_H #define MD5_H #include #include #include using namespace std; /** Provides md5 support to the application. */ class MD5 { public: // methods for controlled operation: MD5 (); // simple initializer void update (unsigned char *input, unsigned int input_length); void update (FILE *file); void finalize (); // constructors for special circumstances. All these constructors finalize // the MD5 context. MD5 (FILE *file); // digest file, close, finalize // methods to acquire finalized result unsigned char *raw_digest (); // digest as a 16-byte binary array char * hex_digest (); // digest as a 33-byte ascii-hex string friend ostream& operator<< (ostream&, MD5 context); private: // first, some types: typedef unsigned int uint4; // assumes integer is 4 words long typedef unsigned short int uint2; // assumes short integer is 2 words long typedef unsigned char uint1; // assumes char is 1 word long // next, the private data: uint4 state[4]; uint4 count[2]; // number of *bits*, mod 2^64 uint1 buffer[64]; // input buffer uint1 digest[16]; uint1 finalized; // last, the private methods, mostly static: void init (); // called by all constructors void transform (uint1 *buffer); // does the real update work. Note // that length is implied to be 64. static void encode (uint1 *dest, uint4 *src, uint4 length); static void decode (uint4 *dest, uint1 *src, uint4 length); static void memcpy (uint1 *dest, uint1 *src, uint4 length); static void memset (uint1 *start, uint1 val, uint4 length); static inline uint4 rotate_left (uint4 x, uint4 n); static inline uint4 F (uint4 x, uint4 y, uint4 z); static inline uint4 G (uint4 x, uint4 y, uint4 z); static inline uint4 H (uint4 x, uint4 y, uint4 z); static inline uint4 I (uint4 x, uint4 y, uint4 z); static inline void FF (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); static inline void GG (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); static inline void HH (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); static inline void II (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); }; #endif