00001 #ifndef CRYPTOPP_SHA_H
00002 #define CRYPTOPP_SHA_H
00003
00004 #include "iterhash.h"
00005
00006 NAMESPACE_BEGIN(CryptoPP)
00007
00009 class SHA : public IteratedHash<word32, true, 64>
00010 {
00011 public:
00012 enum {DIGESTSIZE = 20};
00013 SHA() : IteratedHash<word32, true, 64>(DIGESTSIZE) {Init();}
00014 static void Transform(word32 *digest, const word32 *data);
00015
00016 protected:
00017 void Init();
00018 void vTransform(const word32 *data) {Transform(digest, data);}
00019 };
00020
00021 typedef SHA SHA1;
00022
00024 class SHA256 : public IteratedHash<word32, true, 64>
00025 {
00026 public:
00027 enum {DIGESTSIZE = 32};
00028 SHA256() : IteratedHash<word32, true, 64>(DIGESTSIZE) {Init();}
00029 static void Transform(word32 *digest, const word32 *data);
00030
00031 protected:
00032 void Init();
00033 void vTransform(const word32 *data) {Transform(digest, data);}
00034
00035 const static word32 K[64];
00036 };
00037
00038 #ifdef WORD64_AVAILABLE
00039
00041 class SHA512 : public IteratedHash<word64, true, 128>
00042 {
00043 public:
00044 enum {DIGESTSIZE = 64};
00045 SHA512() : IteratedHash<word64, true, 128>(DIGESTSIZE) {Init();}
00046 static void Transform(word64 *digest, const word64 *data);
00047
00048 protected:
00049 void Init();
00050 void vTransform(const word64 *data) {Transform(digest, data);}
00051
00052 const static word64 K[80];
00053 };
00054
00056 class SHA384 : public IteratedHash<word64, true, 128>
00057 {
00058 public:
00059 enum {DIGESTSIZE = 48};
00060 SHA384() : IteratedHash<word64, true, 128>(64) {Init();}
00061 unsigned int DigestSize() const {return DIGESTSIZE;};
00062
00063 protected:
00064 void Init();
00065 void vTransform(const word64 *data) {SHA512::Transform(digest, data);}
00066 };
00067
00068 #endif
00069
00070 NAMESPACE_END
00071
00072 #endif