WvStreams
wvdigest.h
00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Tunnel Vision Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  *
00005  * MD5, SHA-1 and HMAC digest abstractions.
00006  */
00007 #ifndef __WVDIGEST_H
00008 #define __WVDIGEST_H
00009 
00010 #include <stdint.h>
00011 #include "wvencoder.h"
00012 
00013 struct env_md_st;
00014 struct env_md_ctx_st;
00015 struct hmac_ctx_st;
00016 
00033 class WvDigest : public WvEncoder
00034 {
00035 public:
00037     virtual size_t digestsize() const = 0;
00038 };
00039 
00040 
00045 class WvEVPMDDigest : public WvDigest
00046 {
00047     friend class WvHMACDigest;
00048     const env_md_st *evpmd;
00049     env_md_ctx_st *evpctx;
00050     bool active;
00051 
00052 public:
00053     virtual ~WvEVPMDDigest();
00054     virtual size_t digestsize() const;
00055 
00056 protected:
00057     WvEVPMDDigest(const env_md_st *_evpmd);
00058     virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf,
00059         bool flush); // consumes input
00060     virtual bool _finish(WvBuf &outbuf); // outputs digest
00061     virtual bool _reset(); // supported: resets digest value
00062     
00063     const env_md_st *getevpmd()
00064         { return evpmd; }
00065 
00066 private:
00067     void cleanup();
00068 };
00069 
00070 
00075 class WvMD5Digest : public WvEVPMDDigest
00076 {
00077 public:
00079     WvMD5Digest();
00080     virtual ~WvMD5Digest() { }
00081 };
00082 
00083 
00088 class WvSHA1Digest : public WvEVPMDDigest
00089 {
00090 public:
00092     WvSHA1Digest();
00093     virtual ~WvSHA1Digest() { }
00094 };
00095 
00096 
00102 class WvHMACDigest : public WvDigest
00103 {
00104     WvEVPMDDigest *digest;
00105     unsigned char *key;
00106     size_t keysize;
00107     hmac_ctx_st *hmacctx;
00108     bool active;
00109 
00110 public:
00119     WvHMACDigest(WvEVPMDDigest *_digest, const void *_key,
00120                  size_t _keysize);
00121     virtual ~WvHMACDigest();
00122     virtual size_t digestsize() const;
00123 
00124 protected:
00125     virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf,
00126         bool flush); // consumes input
00127     virtual bool _finish(WvBuf &outbuf); // outputs digest
00128     virtual bool _reset(); // supported: resets digest value
00129 
00130 private:
00131     void cleanup();
00132 };
00133 
00134 
00139 class WvCrc32Digest : public WvDigest
00140 {
00141     uint32_t crc;
00142 
00143 public:
00144     WvCrc32Digest();
00145     virtual ~WvCrc32Digest() { }
00146 
00147     virtual size_t digestsize() const;
00148     virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf,
00149                          bool flush); // consumes input
00150     virtual bool _finish(WvBuf &outbuf); // outputs digest
00151     virtual bool _reset(); // supported: resets digest value
00152 };
00153 
00154 
00159 class WvAdler32Digest : public WvDigest
00160 {
00161     uint32_t crc;
00162 
00163 public:
00164     WvAdler32Digest();
00165     virtual ~WvAdler32Digest() { }
00166 
00167     virtual size_t digestsize() const;
00168     virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf,
00169                          bool flush); // consumes input
00170     virtual bool _finish(WvBuf &outbuf); // outputs digest
00171     virtual bool _reset(); // supported: resets digest value
00172 };
00173 
00174 #endif // __WVDIGEST_H