|
Fimbulwinter Project
Pre-Alpha
An Ragnarok Online Emulator
|
00001 /* MD5 00002 converted to C++ class by Frank Thilo (thilo@unix-ag.org) 00003 for bzflag (http://www.bzflag.org) 00004 00005 based on: 00006 00007 md5.h and md5.c 00008 reference implementation of RFC 1321 00009 00010 Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All 00011 rights reserved. 00012 00013 License to copy and use this software is granted provided that it 00014 is identified as the "RSA Data Security, Inc. MD5 Message-Digest 00015 Algorithm" in all material mentioning or referencing this software 00016 or this function. 00017 00018 License is also granted to make and use derivative works provided 00019 that such works are identified as "derived from the RSA Data 00020 Security, Inc. MD5 Message-Digest Algorithm" in all material 00021 mentioning or referencing the derived work. 00022 00023 RSA Data Security, Inc. makes no representations concerning either 00024 the merchantability of this software or the suitability of this 00025 software for any particular purpose. It is provided "as is" 00026 without express or implied warranty of any kind. 00027 00028 These notices must be retained in any copies of any part of this 00029 documentation and/or software. 00030 00031 */ 00032 00033 #ifndef BZF_MD5_H 00034 #define BZF_MD5_H 00035 00036 #include <string> 00037 #include <iostream> 00038 00039 00040 // a small class for calculating MD5 hashes of strings or byte arrays 00041 // it is not meant to be fast or secure 00042 // 00043 // usage: 1) feed it blocks of uchars with update() 00044 // 2) finalize() 00045 // 3) get hexdigest() string 00046 // or 00047 // MD5(std::string).hexdigest() 00048 // 00049 // assumes that char is 8 bit and int is 32 bit 00050 class MD5 00051 { 00052 public: 00053 typedef unsigned int size_type; // must be 32bit 00054 00055 MD5(); 00056 MD5(const std::string& text); 00057 void update(const unsigned char *buf, size_type length); 00058 void update(const char *buf, size_type length); 00059 MD5& finalize(); 00060 std::string hexdigest() const; 00061 bool hexdigest(char * buf); 00062 friend std::ostream& operator<<(std::ostream&, MD5 md5); 00063 00064 private: 00065 void init(); 00066 typedef unsigned char uint1; // 8bit 00067 typedef unsigned int uint4; // 32bit 00068 enum {blocksize = 64}; // VC6 won't eat a const static int here 00069 00070 void transform(const uint1 block[blocksize]); 00071 static void decode(uint4 output[], const uint1 input[], size_type len); 00072 static void encode(uint1 output[], const uint4 input[], size_type len); 00073 00074 bool finalized; 00075 uint1 buffer[blocksize]; // bytes that didn't fit in last 64 byte chunk 00076 uint4 count[2]; // 64bit counter for number of bits (lo, hi) 00077 uint4 state[4]; // digest so far 00078 uint1 digest[16]; // the result 00079 00080 // low level logic operations 00081 static inline uint4 F(uint4 x, uint4 y, uint4 z); 00082 static inline uint4 G(uint4 x, uint4 y, uint4 z); 00083 static inline uint4 H(uint4 x, uint4 y, uint4 z); 00084 static inline uint4 I(uint4 x, uint4 y, uint4 z); 00085 static inline uint4 rotate_left(uint4 x, int n); 00086 static inline void FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); 00087 static inline void GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); 00088 static inline void HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); 00089 static inline void II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); 00090 }; 00091 00092 std::string md5(const std::string str); 00093 bool md5(const char * input, char * output); 00094 void MD5_Salt(unsigned int len, char* output); 00095 00096 #endif
1.7.6.1