00001
00002
00003
00004
00005
00006
00007 #ifndef BALL_COMMON_MD5HASH_H
00008 #define BALL_COMMON_MD5HASH_H
00009
00010 #ifndef BALL_COMMON_H
00011 # include <BALL/common.h>
00012 #endif
00013
00014 #ifndef BALL_DATATYPE_STRING_H
00015 # include <BALL/DATATYPE/string.h>
00016 #endif
00017
00018
00019
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00054
00055 namespace BALL
00056 {
00065 class MD5Hash
00066 {
00067
00068 public:
00069 typedef unsigned int uint4;
00070 typedef unsigned short int uint2;
00071 typedef unsigned char uchar;
00072
00073 MD5Hash() { init_(); }
00074 const uchar* digest() const { return digest_; }
00075 String asString() const;
00076 void encode(const String& s);
00077
00078 private:
00079
00080 void init_();
00081 void update_(const uchar* s, Size len);
00082 void finalize_();
00083
00084 void transform_(const uchar* block);
00085 void encode_(uchar* dest, uint4* src, uint4 nLength);
00086 void decode_(uint4* dest, const uchar* src, uint4 nLength);
00087
00088
00089 inline uint4 rotate_left(uint4 x, uint4 n) { return ((x << n) | (x >> (32-n))); }
00090 inline uint4 F(uint4 x, uint4 y, uint4 z) { return ((x & y) | (~x & z)); }
00091 inline uint4 G(uint4 x, uint4 y, uint4 z) { return ((x & z) | (y & ~z)); }
00092 inline uint4 H(uint4 x, uint4 y, uint4 z) { return (x ^ y ^ z); }
00093 inline uint4 I(uint4 x, uint4 y, uint4 z) { return (y ^ (x | ~z)); }
00094 inline void FF(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)
00095 { a += F(b, c, d) + x + ac; a = rotate_left(a, s); a += b; }
00096 inline void GG(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)
00097 { a += G(b, c, d) + x + ac; a = rotate_left(a, s); a += b; }
00098 inline void HH(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)
00099 { a += H(b, c, d) + x + ac; a = rotate_left(a, s); a += b; }
00100 inline void II(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)
00101 { a += I(b, c, d) + x + ac; a = rotate_left(a, s); a += b; }
00102
00103 uint4 state_[4];
00104 uint4 count_[2];
00105 uchar buffer_[64];
00106 uchar digest_[16];
00107 uchar finalized_;
00108 static unsigned char PADDING_[64];
00109 };
00110
00111 }
00112
00113 #endif // BALL_COMMON_MD5HASH_H