Skip to content

Commit 46a0ff2

Browse files
committed
Add PBKDF2 option for password hashing
FIPS doesn't have scrypt. This implements PBKDF2 instead. Enabled by default at 600,000 rounds for FIPS. 600,000 being the current OWASP recommendation for SHA256 HMAC.
1 parent 20a98eb commit 46a0ff2

3 files changed

Lines changed: 40 additions & 8 deletions

File tree

configure.ac

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,26 @@ then
332332
AM_CFLAGS="$AM_CFLAGS -DWOLFPKCS11_HKDF"
333333
fi
334334

335+
AC_ARG_ENABLE([pbkdf2],
336+
[AS_HELP_STRING([--enable-pbkdf2],[Enable internal PBKDF2 for PIN hashing (default: disabled)])],
337+
[ ENABLED_PBKDF2=$enableval ],
338+
[ ENABLED_PBKDF2=no ]
339+
)
340+
if test "$ENABLED_PBKDF2" = "yes"
341+
then
342+
AM_CFLAGS="$AM_CFLAGS -DWOLFPKCS11_PBKDF2"
343+
fi
344+
345+
AC_ARG_WITH([pbkdf2-iterations],
346+
[AS_HELP_STRING([--with-pbkdf2-iterations=NUM],[Set PBKDF2 iterations (default: 600000)])],
347+
[ PBKDF2_ITERATIONS=$withval ],
348+
[ PBKDF2_ITERATIONS=600000 ]
349+
)
350+
if test "$ENABLED_PBKDF2" = "yes"
351+
then
352+
AM_CFLAGS="$AM_CFLAGS -DPBKDF2_ITERATIONS=$PBKDF2_ITERATIONS"
353+
fi
354+
335355
AC_ARG_ENABLE([md5],
336356
[AS_HELP_STRING([--enable-md5],[Enable MD5 (default: enabled)])],
337357
[ ENABLED_MD5=$enableval ],

src/internal.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5739,17 +5739,22 @@ int WP11_Slot_HasSession(WP11_Slot* slot)
57395739
* -ve on failure.
57405740
*/
57415741
static int HashPIN(char* pin, int pinLen, byte* seed, int seedLen, byte* hash,
5742-
int hashLen)
5742+
int hashLen, WP11_Slot* slot)
57435743
{
5744-
#ifdef HAVE_SCRYPT
5744+
#ifdef WOLFPKCS11_PBKDF2
5745+
return wc_PBKDF2_ex(hash, (byte*)pin, pinLen, seed, seedLen,
5746+
PBKDF2_ITERATIONS, hashLen, WC_SHA256, NULL, slot->devId);
5747+
#elif defined(HAVE_SCRYPT)
57455748
/* Convert PIN into secret using scrypt algorithm. */
5749+
(void)slot;
57465750
return wc_scrypt(hash, (byte*)pin, pinLen, seed, seedLen,
57475751
WP11_HASH_PIN_COST, WP11_HASH_PIN_BLOCKSIZE,
57485752
WP11_HASH_PIN_PARALLEL, hashLen);
57495753
#elif !defined(NO_SHA256)
57505754
/* fallback to simple SHA2-256 hash of pin */
57515755
(void)seed;
57525756
(void)seedLen;
5757+
(void)slot;
57535758
XMEMSET(hash, 0, hashLen);
57545759
return wc_Sha256Hash((const byte*)pin, pinLen, hash);
57555760
#else
@@ -5759,6 +5764,7 @@ static int HashPIN(char* pin, int pinLen, byte* seed, int seedLen, byte* hash,
57595764
(void)seedLen;
57605765
(void)hash;
57615766
(void)hashLen;
5767+
(void)slot;
57625768
return NOT_COMPILED_IN;
57635769
#endif
57645770
}
@@ -5824,7 +5830,7 @@ int WP11_Slot_CheckSOPin(WP11_Slot* slot, char* pin, int pinLen)
58245830

58255831
/* Costly Operation done out of lock. */
58265832
ret = HashPIN(pin, pinLen, token->soPinSeed, sizeof(token->soPinSeed),
5827-
hash, sizeof(hash));
5833+
hash, sizeof(hash), slot);
58285834

58295835
WP11_Lock_LockRO(&slot->lock);
58305836
}
@@ -5864,7 +5870,7 @@ int WP11_Slot_CheckUserPin(WP11_Slot* slot, char* pin, int pinLen)
58645870

58655871
/* Costly Operation done out of lock. */
58665872
ret = HashPIN(pin, pinLen, token->userPinSeed,
5867-
sizeof(token->userPinSeed), hash, sizeof(hash));
5873+
sizeof(token->userPinSeed), hash, sizeof(hash), slot);
58685874

58695875
WP11_Lock_LockRO(&slot->lock);
58705876
}
@@ -6028,7 +6034,7 @@ int WP11_Slot_UserLogin(WP11_Slot* slot, char* pin, int pinLen)
60286034
#ifndef WOLFPKCS11_NO_STORE
60296035
if (ret == 0) {
60306036
ret = HashPIN(pin, pinLen, token->seed, sizeof(token->seed),
6031-
token->key, sizeof(token->key));
6037+
token->key, sizeof(token->key), slot);
60326038
}
60336039
#endif
60346040
WP11_Lock_LockRW(&slot->lock);
@@ -6100,7 +6106,7 @@ int WP11_Slot_SetSOPin(WP11_Slot* slot, char* pin, int pinLen)
61006106
/* Costly Operation done out of lock. */
61016107
ret = HashPIN(pin, pinLen, token->soPinSeed,
61026108
sizeof(token->soPinSeed), token->soPin,
6103-
sizeof(token->soPin));
6109+
sizeof(token->soPin), slot);
61046110
WP11_Lock_LockRW(&slot->lock);
61056111
}
61066112
if (ret == 0) {
@@ -6149,11 +6155,11 @@ int WP11_Slot_SetUserPin(WP11_Slot* slot, char* pin, int pinLen)
61496155
token->userPinEmpty = 0;
61506156
ret = HashPIN(pin, pinLen, token->userPinSeed,
61516157
sizeof(token->userPinSeed), token->userPin,
6152-
sizeof(token->userPin));
6158+
sizeof(token->userPin), slot);
61536159
#ifndef WOLFPKCS11_NO_STORE
61546160
if (ret == 0) {
61556161
ret = HashPIN(pin, pinLen, token->seed, sizeof(token->seed),
6156-
token->key, sizeof(token->key));
6162+
token->key, sizeof(token->key), slot);
61576163
}
61586164
#endif
61596165
WP11_Lock_LockRW(&slot->lock);

wolfpkcs11/internal.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ extern "C" {
4141

4242
#ifdef HAVE_FIPS
4343
#define NO_MD5
44+
#define WOLFPKCS11_PBKDF2
45+
#endif
46+
47+
/* FIPS has no scrypt and SHA256 is not strong enough */
48+
#ifndef PBKDF2_ITERATIONS
49+
#define PBKDF2_ITERATIONS 600000
4450
#endif
4551

4652
#ifdef WOLFPKCS11_NO_MD5

0 commit comments

Comments
 (0)