xref: /aosp_15_r20/external/lzma/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Pbkdf2HmacSha1.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include <string.h>
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/CpuArch.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "HmacSha1.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "Pbkdf2HmacSha1.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker namespace NCrypto {
13*f6dc9357SAndroid Build Coastguard Worker namespace NSha1 {
14*f6dc9357SAndroid Build Coastguard Worker 
Pbkdf2Hmac(const Byte * pwd,size_t pwdSize,const Byte * salt,size_t saltSize,UInt32 numIterations,Byte * key,size_t keySize)15*f6dc9357SAndroid Build Coastguard Worker void Pbkdf2Hmac(const Byte *pwd, size_t pwdSize,
16*f6dc9357SAndroid Build Coastguard Worker     const Byte *salt, size_t saltSize,
17*f6dc9357SAndroid Build Coastguard Worker     UInt32 numIterations,
18*f6dc9357SAndroid Build Coastguard Worker     Byte *key, size_t keySize)
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker   MY_ALIGN (16)
21*f6dc9357SAndroid Build Coastguard Worker   CHmac baseCtx;
22*f6dc9357SAndroid Build Coastguard Worker   baseCtx.SetKey(pwd, pwdSize);
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker   for (UInt32 i = 1; keySize != 0; i++)
25*f6dc9357SAndroid Build Coastguard Worker   {
26*f6dc9357SAndroid Build Coastguard Worker     MY_ALIGN (16)
27*f6dc9357SAndroid Build Coastguard Worker     CHmac ctx;
28*f6dc9357SAndroid Build Coastguard Worker     ctx = baseCtx;
29*f6dc9357SAndroid Build Coastguard Worker     ctx.Update(salt, saltSize);
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker     MY_ALIGN (16)
32*f6dc9357SAndroid Build Coastguard Worker     UInt32 u[kNumDigestWords];
33*f6dc9357SAndroid Build Coastguard Worker     SetBe32(u, i)
34*f6dc9357SAndroid Build Coastguard Worker 
35*f6dc9357SAndroid Build Coastguard Worker     ctx.Update((const Byte *)u, 4);
36*f6dc9357SAndroid Build Coastguard Worker     ctx.Final((Byte *)u);
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker     ctx = baseCtx;
39*f6dc9357SAndroid Build Coastguard Worker     ctx.GetLoopXorDigest1((void *)u, numIterations - 1);
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker     const unsigned curSize = (keySize < kDigestSize) ? (unsigned)keySize : kDigestSize;
42*f6dc9357SAndroid Build Coastguard Worker     memcpy(key, (const Byte *)u, curSize);
43*f6dc9357SAndroid Build Coastguard Worker     key += curSize;
44*f6dc9357SAndroid Build Coastguard Worker     keySize -= curSize;
45*f6dc9357SAndroid Build Coastguard Worker   }
46*f6dc9357SAndroid Build Coastguard Worker }
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker }}
49