00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef __CCXX_DIGEST_H__
00042 #define __CCXX_DIGEST_H__
00043
00044 #ifndef CCXX_CONFIG_H_
00045 #include <cc++/config.h>
00046 #endif
00047
00048 #ifndef __CCXX_THREAD_H__
00049 #include <cc++/thread.h>
00050 #endif
00051
00052 #include <iostream>
00053 #include <fstream>
00054 #include <strstream>
00055
00056 #ifdef CCXX_NAMESPACES
00057 namespace ost {
00058 #endif
00059
00060 #ifdef WIN32
00061 class CCXX_CLASS_EXPORT Digest;
00062 class CCXX_CLASS_EXPORT ChecksumDigest;
00063 class CCXX_CLASS_EXPORT CRC16Digest;
00064 class CCXX_CLASS_EXPORT MD5Digest;
00065 #endif
00066
00074 #if defined(STLPORT) || defined(__KCC)
00075 #define std::ostream std::ostream_withassign
00076 #endif
00077 class Digest : public std::streambuf, public std::ostream
00078 {
00079 protected:
00080 Digest();
00081
00085 virtual void initDigest(void) = 0;
00086
00092 virtual unsigned getSize(void) = 0;
00093
00100 virtual unsigned getDigest(unsigned char *buffer) = 0;
00101
00108 virtual void putDigest(unsigned char *buffer, unsigned length) = 0;
00109
00115 virtual std::ostream &strDigest(std::ostream &os) = 0;
00116
00117 friend std::ostream &operator<<(std::ostream &os, Digest &ia)
00118 {return ia.strDigest(os);};
00119 };
00120
00127 class ChecksumDigest : public Digest
00128 {
00129 private:
00130 unsigned char csum;
00131
00132 protected:
00133 int overflow(int c);
00134 std::ostream &strDigest(std::ostream &os);
00135
00136 public:
00137 ChecksumDigest();
00138
00139 void initDigest(void)
00140 {csum = 0;};
00141
00142 unsigned getSize(void)
00143 {return 1;};
00144
00145 unsigned getDigest(unsigned char *buffer);
00146
00147 void putDigest(unsigned char *buffer, unsigned length);
00148 };
00149
00156 class CRC16Digest : public Digest
00157 {
00158 private:
00159 unsigned short crc16;
00160
00161 protected:
00162 int overflow(int c);
00163
00164 std::ostream &strDigest(std::ostream &os);
00165
00166 public:
00167 CRC16Digest();
00168
00169 inline void initDigest(void)
00170 {crc16 = 0;};
00171
00172 inline unsigned getSize(void)
00173 {return 2;};
00174
00175 unsigned getDigest(unsigned char *buffer);
00176
00177 void putDigest(unsigned char *buffer, unsigned length);
00178 };
00179
00186 class MD5Digest : public Digest
00187 {
00188 private:
00189 unsigned long state[4];
00190 unsigned long count[2];
00191 unsigned char buf[64];
00192 unsigned bpos;
00193 unsigned char md5[16];
00194 bool updated;
00195
00196 protected:
00197 int overflow(int c);
00198
00199 void Update(void);
00200
00201 void Commit(void);
00202
00203 std::ostream &strDigest(std::ostream &os);
00204
00205 public:
00206 MD5Digest();
00207
00208 void initDigest(void);
00209
00210 inline unsigned getSize(void)
00211 {return 16;};
00212
00213 unsigned getDigest(unsigned char *buffer);
00214
00215 void putDigest(unsigned char *buffer, unsigned len);
00216 };
00217
00218 #ifdef CCXX_NAMESPACES
00219 };
00220 #endif
00221
00222 #endif
00223