annotate src/win32/7zip/7z/CPP/7zip/Crypto/Sha1.h @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
rlm@1 1 // Crypto/Sha1.h
rlm@1 2 // This file is based on public domain
rlm@1 3 // Steve Reid and Wei Dai's code from Crypto++
rlm@1 4
rlm@1 5 #ifndef __CRYPTO_SHA1_H
rlm@1 6 #define __CRYPTO_SHA1_H
rlm@1 7
rlm@1 8 #include <stddef.h>
rlm@1 9 #include "../../Common/Types.h"
rlm@1 10
rlm@1 11 // Sha1 implementation in RAR before version 3.60 has bug:
rlm@1 12 // it changes data bytes in some cases.
rlm@1 13 // So this class supports both versions: normal_SHA and rar3Mode
rlm@1 14
rlm@1 15 namespace NCrypto {
rlm@1 16 namespace NSha1 {
rlm@1 17
rlm@1 18 const unsigned kBlockSize = 64;
rlm@1 19 const unsigned kDigestSize = 20;
rlm@1 20
rlm@1 21 const unsigned kBlockSizeInWords = (kBlockSize >> 2);
rlm@1 22 const unsigned kDigestSizeInWords = (kDigestSize >> 2);
rlm@1 23
rlm@1 24 class CContextBase
rlm@1 25 {
rlm@1 26 protected:
rlm@1 27 UInt32 _state[5];
rlm@1 28 UInt64 _count;
rlm@1 29 void UpdateBlock(UInt32 *data, bool returnRes = false)
rlm@1 30 {
rlm@1 31 GetBlockDigest(data, _state, returnRes);
rlm@1 32 _count++;
rlm@1 33 }
rlm@1 34 public:
rlm@1 35 void Init();
rlm@1 36 void GetBlockDigest(UInt32 *blockData, UInt32 *destDigest, bool returnRes = false);
rlm@1 37 // PrepareBlock can be used only when size <= 13. size in Words
rlm@1 38 void PrepareBlock(UInt32 *block, unsigned int size) const;
rlm@1 39 };
rlm@1 40
rlm@1 41 class CContextBase2: public CContextBase
rlm@1 42 {
rlm@1 43 protected:
rlm@1 44 unsigned _count2;
rlm@1 45 UInt32 _buffer[kBlockSizeInWords];
rlm@1 46 void UpdateBlock() { CContextBase::UpdateBlock(_buffer); }
rlm@1 47 public:
rlm@1 48 void Init() { CContextBase::Init(); _count2 = 0; }
rlm@1 49 };
rlm@1 50
rlm@1 51 class CContext: public CContextBase2
rlm@1 52 {
rlm@1 53 public:
rlm@1 54 void Update(Byte *data, size_t size, bool rar350Mode = false);
rlm@1 55 void Update(const Byte *data, size_t size) { Update((Byte *)data, size, false); }
rlm@1 56 void Final(Byte *digest);
rlm@1 57 };
rlm@1 58
rlm@1 59 class CContext32: public CContextBase2
rlm@1 60 {
rlm@1 61 public:
rlm@1 62 void Update(const UInt32 *data, size_t size);
rlm@1 63 void Final(UInt32 *digest);
rlm@1 64 };
rlm@1 65
rlm@1 66 }}
rlm@1 67
rlm@1 68 #endif