#include "CNNICHashWhitelist.inc"
#include <errno.h>
+#include <limits.h> // INT_MAX
#include <math.h>
#include <stdlib.h>
#include <string.h>
PBKDF2Request(Environment* env,
Local<Object> object,
const EVP_MD* digest,
- ssize_t passlen,
+ int passlen,
char* pass,
- ssize_t saltlen,
+ int saltlen,
char* salt,
- ssize_t iter,
- ssize_t keylen)
+ int iter,
+ int keylen)
: AsyncWrap(env, object, AsyncWrap::PROVIDER_CRYPTO),
digest_(digest),
error_(0),
return digest_;
}
- inline ssize_t passlen() const {
+ inline int passlen() const {
return passlen_;
}
return pass_;
}
- inline ssize_t saltlen() const {
+ inline int saltlen() const {
return saltlen_;
}
return salt_;
}
- inline ssize_t keylen() const {
+ inline int keylen() const {
return keylen_;
}
return key_;
}
- inline ssize_t iter() const {
+ inline int iter() const {
return iter_;
}
private:
const EVP_MD* digest_;
int error_;
- ssize_t passlen_;
+ int passlen_;
char* pass_;
- ssize_t saltlen_;
+ int saltlen_;
char* salt_;
- ssize_t keylen_;
+ int keylen_;
char* key_;
- ssize_t iter_;
+ int iter_;
};
const char* type_error = nullptr;
char* pass = nullptr;
char* salt = nullptr;
- ssize_t passlen = -1;
- ssize_t saltlen = -1;
- double keylen = -1;
- ssize_t iter = -1;
+ int passlen = -1;
+ int saltlen = -1;
+ double raw_keylen = -1;
+ int keylen = -1;
+ int iter = -1;
PBKDF2Request* req = nullptr;
Local<Object> obj;
goto err;
}
- keylen = args[3]->NumberValue();
- if (keylen < 0 || isnan(keylen) || isinf(keylen)) {
+ raw_keylen = args[3]->NumberValue();
+ if (raw_keylen < 0.0 || isnan(raw_keylen) || isinf(raw_keylen) ||
+ raw_keylen > INT_MAX) {
type_error = "Bad key length";
goto err;
}
+ keylen = static_cast<int>(raw_keylen);
+
if (args[4]->IsString()) {
node::Utf8Value digest_name(env->isolate(), args[4]);
digest = EVP_get_digestbyname(*digest_name);
saltlen,
salt,
iter,
- static_cast<ssize_t>(keylen));
+ keylen);
if (args[5]->IsFunction()) {
obj->Set(env->ondone_string(), args[5]);
// Should not work with Infinity key length
assert.throws(function() {
crypto.pbkdf2('password', 'salt', 1, Infinity, common.fail);
-}, function(err) {
- return err instanceof Error && err.message === 'Bad key length';
-});
+}, /Bad key length/);
// Should not work with negative Infinity key length
assert.throws(function() {
crypto.pbkdf2('password', 'salt', 1, -Infinity, common.fail);
-}, function(err) {
- return err instanceof Error && err.message === 'Bad key length';
-});
+}, /Bad key length/);
// Should not work with NaN key length
assert.throws(function() {
crypto.pbkdf2('password', 'salt', 1, NaN, common.fail);
-}, function(err) {
- return err instanceof Error && err.message === 'Bad key length';
-});
+}, /Bad key length/);
// Should not work with negative key length
assert.throws(function() {
crypto.pbkdf2('password', 'salt', 1, -1, common.fail);
-}, function(err) {
- return err instanceof Error && err.message === 'Bad key length';
-});
+}, /Bad key length/);