annotate src/win32/7zip/7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp @ 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 // Pbkdf2HmacSha1.cpp
rlm@1 2
rlm@1 3 #include "StdAfx.h"
rlm@1 4
rlm@1 5 #include "HmacSha1.h"
rlm@1 6
rlm@1 7 namespace NCrypto {
rlm@1 8 namespace NSha1 {
rlm@1 9
rlm@1 10 void Pbkdf2Hmac(const Byte *pwd, size_t pwdSize, const Byte *salt, size_t saltSize,
rlm@1 11 UInt32 numIterations, Byte *key, size_t keySize)
rlm@1 12 {
rlm@1 13 CHmac baseCtx;
rlm@1 14 baseCtx.SetKey(pwd, pwdSize);
rlm@1 15 for (UInt32 i = 1; keySize > 0; i++)
rlm@1 16 {
rlm@1 17 CHmac ctx = baseCtx;
rlm@1 18 ctx.Update(salt, saltSize);
rlm@1 19 Byte u[kDigestSize] = { (Byte)(i >> 24), (Byte)(i >> 16), (Byte)(i >> 8), (Byte)(i) };
rlm@1 20 const unsigned int curSize = (keySize < kDigestSize) ? (unsigned int)keySize : kDigestSize;
rlm@1 21 ctx.Update(u, 4);
rlm@1 22 ctx.Final(u, kDigestSize);
rlm@1 23
rlm@1 24 unsigned int s;
rlm@1 25 for (s = 0; s < curSize; s++)
rlm@1 26 key[s] = u[s];
rlm@1 27
rlm@1 28 for (UInt32 j = numIterations; j > 1; j--)
rlm@1 29 {
rlm@1 30 ctx = baseCtx;
rlm@1 31 ctx.Update(u, kDigestSize);
rlm@1 32 ctx.Final(u, kDigestSize);
rlm@1 33 for (s = 0; s < curSize; s++)
rlm@1 34 key[s] ^= u[s];
rlm@1 35 }
rlm@1 36
rlm@1 37 key += curSize;
rlm@1 38 keySize -= curSize;
rlm@1 39 }
rlm@1 40 }
rlm@1 41
rlm@1 42 void Pbkdf2Hmac32(const Byte *pwd, size_t pwdSize, const UInt32 *salt, size_t saltSize,
rlm@1 43 UInt32 numIterations, UInt32 *key, size_t keySize)
rlm@1 44 {
rlm@1 45 CHmac32 baseCtx;
rlm@1 46 baseCtx.SetKey(pwd, pwdSize);
rlm@1 47 for (UInt32 i = 1; keySize > 0; i++)
rlm@1 48 {
rlm@1 49 CHmac32 ctx = baseCtx;
rlm@1 50 ctx.Update(salt, saltSize);
rlm@1 51 UInt32 u[kDigestSizeInWords] = { i };
rlm@1 52 const unsigned int curSize = (keySize < kDigestSizeInWords) ? (unsigned int)keySize : kDigestSizeInWords;
rlm@1 53 ctx.Update(u, 1);
rlm@1 54 ctx.Final(u, kDigestSizeInWords);
rlm@1 55
rlm@1 56 // Speed-optimized code start
rlm@1 57 ctx = baseCtx;
rlm@1 58 ctx.GetLoopXorDigest(u, numIterations - 1);
rlm@1 59 // Speed-optimized code end
rlm@1 60
rlm@1 61 unsigned int s;
rlm@1 62 for (s = 0; s < curSize; s++)
rlm@1 63 key[s] = u[s];
rlm@1 64
rlm@1 65 /*
rlm@1 66 // Default code start
rlm@1 67 for (UInt32 j = numIterations; j > 1; j--)
rlm@1 68 {
rlm@1 69 ctx = baseCtx;
rlm@1 70 ctx.Update(u, kDigestSizeInWords);
rlm@1 71 ctx.Final(u, kDigestSizeInWords);
rlm@1 72 for (s = 0; s < curSize; s++)
rlm@1 73 key[s] ^= u[s];
rlm@1 74 }
rlm@1 75 // Default code end
rlm@1 76 */
rlm@1 77
rlm@1 78 key += curSize;
rlm@1 79 keySize -= curSize;
rlm@1 80 }
rlm@1 81 }
rlm@1 82
rlm@1 83 }}