21.03.2013 Views

Problem - Kevin Tafuro

Problem - Kevin Tafuro

Problem - Kevin Tafuro

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

#include <br />

#include <br />

/* This value needs to be the output size of your pseudo-random function (PRF)! */<br />

#define PRF_OUT_LEN 20<br />

/* This is an implementation of the PKCS#5 PBKDF2 PRF using HMAC-SHA1. It<br />

* always gives 20-byte outputs.<br />

*/<br />

static HCRYPTHASH InitHMAC(HCRYPTPROV hProvider, HCRYPTKEY hKey, ALG_ID Algid) {<br />

HMAC_INFO HMACInfo;<br />

HCRYPTHASH hHash;<br />

HMACInfo.HashAlgid = Algid;<br />

HMACInfo.pbInnerString = HMACInfo.pbOuterString = 0;<br />

HMACInfo.cbInnerString = HMACInfo.cbOuterString = 0;<br />

if (!CryptCreateHash(hProvider, CALG_HMAC, hKey, 0, &hHash)) return 0;<br />

CryptSetHashParam(hHash, HP_HMAC_INFO, (BYTE *)&HMACInfo, 0);<br />

return hHash;<br />

}<br />

static void FinalHMAC(HCRYPTHASH hHash, BYTE *pbOut, DWORD *cbOut) {<br />

*cbOut = PRF_OUT_LEN;<br />

CryptGetHashParam(hHash, HP_HASHVAL, pbOut, cbOut, 0);<br />

CryptDestroyHash(hHash);<br />

}<br />

static DWORD SwapInt32(DWORD dwInt32) {<br />

__asm mov eax, dwInt32<br />

__asm bswap eax<br />

}<br />

static BOOL PKCS5InitialPRF(HCRYPTPROV hProvider, HCRYPTKEY hKey,<br />

BYTE *pbSalt, DWORD cbSalt, DWORD dwCounter,<br />

BYTE *pbOut, DWORD *cbOut) {<br />

HCRYPTHASH hHash;<br />

if (!(hHash = InitHMAC(hProvider, hKey, CALG_SHA1))) return FALSE;<br />

CryptHashData(hHash, pbSalt, cbSalt, 0);<br />

dwCounter = SwapInt32(dwCounter);<br />

CryptHashData(hHash, (BYTE *)&dwCounter, sizeof(dwCounter), 0);<br />

FinalHMAC(hHash, pbOut, cbOut);<br />

return TRUE;<br />

}<br />

static BOOL PKCS5UpdatePRF(HCRYPTPROV hProvider, HCRYPTKEY hKey,<br />

BYTE *pbSalt, DWORD cbSalt,<br />

BYTE *pbOut, DWORD *cbOut) {<br />

HCRYPTHASH hHash;<br />

if (!(hHash = InitHMAC(hProvider, hKey, CALG_SHA1))) return FALSE;<br />

CryptHashData(hHash, pbSalt, cbSalt, 0);<br />

FinalHMAC(hHash, pbOut, cbOut);<br />

Deriving Symmetric Keys from a Password | 139<br />

This is the Title of the Book, eMatter Edition<br />

Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!