Thanks to Jochen Hoenicke # (one of the authors of Palm Keyring) # for these next two subs. # Usage pbkdf2(password, salt, iter, keylen, prf) # iter is number of iterations # keylen is length of generated key in bytes # prf is the pseudo random function (e.g. hmac_sha1) # returns the key. sub _pbkdf2($$$$$) { my ($password, $salt, $iter, $keylen, $prf) = @_; my ($k, $t, $u, $ui, $i); $t = ""; for ($k = 1; length($t) < $keylen; $k++) { $u = $ui = &$prf($salt.pack('N', $k), $password); for ($i = 1; $i < $iter; $i++) { $ui = &$prf($ui, $password); $u ^= $ui; } $t .= $u; } return substr($t, 0, $keylen); }