http://http://diytec.web.fc2.com/mark2r2/
Dependencies: EthernetNetIf NTPClient_NetServices mbed ConfigFile
Diff: md5.h
- Revision:
- 0:08a4d61cd84c
diff -r 000000000000 -r 08a4d61cd84c md5.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/md5.h Tue Sep 20 12:46:26 2011 +0000 @@ -0,0 +1,118 @@ +/* MD5 + converted to C++ class by Frank Thilo (thilo@unix-ag.org) + for bzflag (http://www.bzflag.org) + + based on: + + md5.h and md5.c + reference implementation of RFC 1321 + + 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 BZF_MD5_H +#define BZF_MD5_H + +#include <string> + + +/** a small class for calculating MD5 hashes of strings or byte arrays + it is not meant to be fast or secure + + usage: 1) feed it blocks of uchars with update() + 2) finalize() + 3) get hexdigest() string + or + MD5(std::string).hexdigest() + + assumes that char is 8 bit and int is 32 bit +*/ +class MD5 +{ +public: + typedef unsigned int size_type; // must be 32bit + + MD5(); + /** + take string, hash it and finalize + @param text the string to hash + */ + MD5(const std::string& text); + /** + add text to hash + @param buf the text to add to the hash + @param text length + */ + void update(const unsigned char *buf, size_type length); + /** + add text to hash + @param buf the text to add to the hash + @param text length + */ + void update(const char *buf, size_type length); + /** + calculate the final hash value + */ + MD5& finalize(); + /** + @return the hash as hex string + */ + std::string hexdigest() const; + + void init(); + + /** + @return the hash as binary data, an array of 16 bytes. + */ + const unsigned char* rawdigest() const { return digest; } + +private: + typedef unsigned char uint1; // 8bit + typedef unsigned int uint4; // 32bit + enum {blocksize = 64}; // VC6 won't eat a const static int here + + void transform(const uint1 block[blocksize]); + static void decode(uint4 output[], const uint1 input[], size_type len); + static void encode(uint1 output[], const uint4 input[], size_type len); + + bool finalized; + uint1 buffer[blocksize]; // bytes that didn't fit in last 64 byte chunk + uint4 count[2]; // 64bit counter for number of bits (lo, hi) + uint4 state[4]; // digest so far + uint1 digest[16]; // the result + + // low level logic operations + 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 uint4 rotate_left(uint4 x, int n); + 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); +}; + +std::string md5(const std::string str); + +#endif \ No newline at end of file