#include "bee2/core/blob.h"
#include "bee2/core/err.h"
#include "bee2/core/mem.h"
#include "bee2/crypto/belt.h"
err_t beltPBKDF2(octet key[32], const octet pwd[], size_t pwd_len,
size_t iter, const octet salt[], size_t salt_len)
{
void* state;
octet* t;
if (iter == 0 ||
!memIsValid(pwd, pwd_len) ||
!memIsValid(salt, salt_len) ||
!memIsValid(key, 32))
return ERR_BAD_INPUT;
state = blobCreate(beltHMAC_keep() + 32);
if (state == 0)
return ERR_OUTOFMEMORY;
t = (octet*)state + beltHMAC_keep();
beltHMACStart(state, pwd, pwd_len);
beltHMACStepA(salt, salt_len, state);
*(u32*)key = 0, key[3] = 1;
beltHMACStepA(key, 4, state);
beltHMACStepG(key, state);
memCopy(t, key, 32);
while (--iter)
{
beltHMACStart(state, pwd, pwd_len);
beltHMACStepA(t, 32, state);
beltHMACStepG(t, state);
memXor2(key, t, 32);
}
blobClose(state);
return ERR_OK;
}