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