1
struct CryptKeyCacheItem
10
cleandata(AESKey,sizeof(AESKey));
11
cleandata(AESInit,sizeof(AESInit));
12
cleandata(&Password,sizeof(Password));
15
byte AESKey[16],AESInit[16];
18
byte Salt[SIZE_SALT30];
21
static CryptKeyCacheItem Cache[4];
22
static int CachePos=0;
24
1
void CryptData::SetKey30(bool Encrypt,SecPassword *Password,const wchar *PwdW,const byte *Salt)
26
3
byte AESKey[16],AESInit[16];
29
for (uint I=0;I<ASIZE(Cache);I++)
30
if (Cache[I].Password==*Password &&
31
(Salt==NULL && !Cache[I].SaltPresent || Salt!=NULL &&
32
Cache[I].SaltPresent && memcmp(Cache[I].Salt,Salt,SIZE_SALT30)==0))
6
for (uint I=0;I<ASIZE(KDF3Cache);I++)
7
if (KDF3Cache[I].Pwd==*Password &&
8
(Salt==NULL && !KDF3Cache[I].SaltPresent || Salt!=NULL &&
9
KDF3Cache[I].SaltPresent && memcmp(KDF3Cache[I].Salt,Salt,SIZE_SALT30)==0))
34
memcpy(AESKey,Cache[I].AESKey,sizeof(AESKey));
35
memcpy(AESInit,Cache[I].AESInit,sizeof(AESInit));
11
memcpy(AESKey,KDF3Cache[I].Key,sizeof(AESKey));
12
memcpy(AESInit,KDF3Cache[I].Init,sizeof(AESInit));
47
24
memcpy(RawPsw+RawLength,Salt,SIZE_SALT30);
48
25
RawLength+=SIZE_SALT30;
53
30
const int HashRounds=0x40000;
54
31
for (int I=0;I<HashRounds;I++)
56
hash_process( &c, RawPsw, RawLength, false);
33
sha1_process( &c, RawPsw, RawLength, false);
59
36
PswNum[1]=(byte)(I>>8);
60
37
PswNum[2]=(byte)(I>>16);
61
hash_process( &c, PswNum, 3, false);
38
sha1_process( &c, PswNum, 3, false);
62
39
if (I%(HashRounds/16)==0)
66
hash_final( &tempc, digest, false);
43
sha1_done( &tempc, digest, false);
67
44
AESInit[I/(HashRounds/16)]=(byte)digest[4];
71
hash_final( &c, digest, false);
48
sha1_done( &c, digest, false);
72
49
for (int I=0;I<4;I++)
73
50
for (int J=0;J<4;J++)
74
51
AESKey[I*4+J]=(byte)(digest[I]>>(J*8));
76
Cache[CachePos].Password=*Password;
77
if ((Cache[CachePos].SaltPresent=(Salt!=NULL))==true)
78
memcpy(Cache[CachePos].Salt,Salt,SIZE_SALT30);
79
memcpy(Cache[CachePos].AESKey,AESKey,sizeof(AESKey));
80
memcpy(Cache[CachePos].AESInit,AESInit,sizeof(AESInit));
81
CachePos=(CachePos+1)%ASIZE(Cache);
53
KDF3Cache[KDF3CachePos].Pwd=*Password;
54
if ((KDF3Cache[KDF3CachePos].SaltPresent=(Salt!=NULL))==true)
55
memcpy(KDF3Cache[KDF3CachePos].Salt,Salt,SIZE_SALT30);
56
memcpy(KDF3Cache[KDF3CachePos].Key,AESKey,sizeof(AESKey));
57
memcpy(KDF3Cache[KDF3CachePos].Init,AESInit,sizeof(AESInit));
58
KDF3CachePos=(KDF3CachePos+1)%ASIZE(KDF3Cache);
83
60
cleandata(RawPsw,sizeof(RawPsw));