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
|