aboutsummaryrefslogtreecommitdiff
path: root/src/node_crypto.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/node_crypto.cc')
-rw-r--r--src/node_crypto.cc56
1 files changed, 22 insertions, 34 deletions
diff --git a/src/node_crypto.cc b/src/node_crypto.cc
index 1a1eca297b..cd7032d6c3 100644
--- a/src/node_crypto.cc
+++ b/src/node_crypto.cc
@@ -21,6 +21,7 @@
#include "node.h"
#include "node_buffer.h"
+#include "node_errors.h"
#include "node_constants.h"
#include "node_crypto.h"
#include "node_crypto_bio.h"
@@ -45,20 +46,6 @@
#include <memory>
#include <vector>
-#define THROW_AND_RETURN_IF_NOT_BUFFER(val, prefix) \
- do { \
- if (!Buffer::HasInstance(val)) { \
- return env->ThrowTypeError(prefix " must be a buffer"); \
- } \
- } while (0)
-
-#define THROW_AND_RETURN_IF_NOT_STRING(val, prefix) \
- do { \
- if (!val->IsString()) { \
- return env->ThrowTypeError(prefix " must be a string"); \
- } \
- } while (0)
-
static const char PUBLIC_KEY_PFX[] = "-----BEGIN PUBLIC KEY-----";
static const int PUBLIC_KEY_PFX_LEN = sizeof(PUBLIC_KEY_PFX) - 1;
static const char PUBRSA_KEY_PFX[] = "-----BEGIN RSA PUBLIC KEY-----";
@@ -518,7 +505,7 @@ void SecureContext::SetKey(const FunctionCallbackInfo<Value>& args) {
if (args[1]->IsUndefined() || args[1]->IsNull())
len = 1;
else
- THROW_AND_RETURN_IF_NOT_STRING(args[1], "Pass phrase");
+ THROW_AND_RETURN_IF_NOT_STRING(env, args[1], "Pass phrase");
}
BIO *bio = LoadBIO(env, args[0]);
@@ -916,7 +903,7 @@ void SecureContext::SetCiphers(const FunctionCallbackInfo<Value>& args) {
return env->ThrowTypeError("Ciphers argument is mandatory");
}
- THROW_AND_RETURN_IF_NOT_STRING(args[0], "Ciphers");
+ THROW_AND_RETURN_IF_NOT_STRING(env, args[0], "Ciphers");
const node::Utf8Value ciphers(args.GetIsolate(), args[0]);
SSL_CTX_set_cipher_list(sc->ctx_, *ciphers);
@@ -931,7 +918,7 @@ void SecureContext::SetECDHCurve(const FunctionCallbackInfo<Value>& args) {
if (args.Length() != 1)
return env->ThrowTypeError("ECDH curve name argument is mandatory");
- THROW_AND_RETURN_IF_NOT_STRING(args[0], "ECDH curve name");
+ THROW_AND_RETURN_IF_NOT_STRING(env, args[0], "ECDH curve name");
node::Utf8Value curve(env->isolate(), args[0]);
@@ -989,7 +976,8 @@ void SecureContext::SetOptions(const FunctionCallbackInfo<Value>& args) {
ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
if (args.Length() != 1 || !args[0]->IntegerValue()) {
- return sc->env()->ThrowTypeError("Options must be an integer value");
+ return THROW_ERR_INVALID_ARG_TYPE(
+ sc->env(), "Options must be an integer value");
}
SSL_CTX_set_options(
@@ -1008,7 +996,7 @@ void SecureContext::SetSessionIdContext(
return env->ThrowTypeError("Session ID context argument is mandatory");
}
- THROW_AND_RETURN_IF_NOT_STRING(args[0], "Session ID context");
+ THROW_AND_RETURN_IF_NOT_STRING(env, args[0], "Session ID context");
const node::Utf8Value sessionIdContext(args.GetIsolate(), args[0]);
const unsigned char* sid_ctx =
@@ -1043,8 +1031,8 @@ void SecureContext::SetSessionTimeout(const FunctionCallbackInfo<Value>& args) {
ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
if (args.Length() != 1 || !args[0]->IsInt32()) {
- return sc->env()->ThrowTypeError(
- "Session timeout must be a 32-bit integer");
+ return THROW_ERR_INVALID_ARG_TYPE(
+ sc->env(), "Session timeout must be a 32-bit integer");
}
int32_t sessionTimeout = args[0]->Int32Value();
@@ -1085,7 +1073,7 @@ void SecureContext::LoadPKCS12(const FunctionCallbackInfo<Value>& args) {
}
if (args.Length() >= 2) {
- THROW_AND_RETURN_IF_NOT_BUFFER(args[1], "Pass phrase");
+ THROW_AND_RETURN_IF_NOT_BUFFER(env, args[1], "Pass phrase");
size_t passlen = Buffer::Length(args[1]);
pass = new char[passlen + 1];
memcpy(pass, Buffer::Data(args[1]), passlen);
@@ -1212,7 +1200,7 @@ void SecureContext::SetTicketKeys(const FunctionCallbackInfo<Value>& args) {
return env->ThrowTypeError("Ticket keys argument is mandatory");
}
- THROW_AND_RETURN_IF_NOT_BUFFER(args[0], "Ticket keys");
+ THROW_AND_RETURN_IF_NOT_BUFFER(env, args[0], "Ticket keys");
if (Buffer::Length(args[0]) != 48) {
return env->ThrowTypeError("Ticket keys length must be 48 bytes");
@@ -1964,7 +1952,7 @@ void SSLWrap<Base>::SetSession(const FunctionCallbackInfo<Value>& args) {
return env->ThrowError("Session argument is mandatory");
}
- THROW_AND_RETURN_IF_NOT_BUFFER(args[0], "Session");
+ THROW_AND_RETURN_IF_NOT_BUFFER(env, args[0], "Session");
size_t slen = Buffer::Length(args[0]);
char* sbuf = new char[slen];
memcpy(sbuf, Buffer::Data(args[0]), slen);
@@ -2088,7 +2076,7 @@ void SSLWrap<Base>::SetOCSPResponse(
if (args.Length() < 1)
return env->ThrowTypeError("OCSP response argument is mandatory");
- THROW_AND_RETURN_IF_NOT_BUFFER(args[0], "OCSP response");
+ THROW_AND_RETURN_IF_NOT_BUFFER(env, args[0], "OCSP response");
w->ocsp_response_.Reset(args.GetIsolate(), args[0].As<Object>());
#endif // NODE__HAVE_TLSEXT_STATUS_CB
@@ -3937,11 +3925,11 @@ template <PublicKeyCipher::Operation operation,
void PublicKeyCipher::Cipher(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
- THROW_AND_RETURN_IF_NOT_BUFFER(args[0], "Key");
+ THROW_AND_RETURN_IF_NOT_BUFFER(env, args[0], "Key");
char* kbuf = Buffer::Data(args[0]);
ssize_t klen = Buffer::Length(args[0]);
- THROW_AND_RETURN_IF_NOT_BUFFER(args[1], "Data");
+ THROW_AND_RETURN_IF_NOT_BUFFER(env, args[1], "Data");
char* buf = Buffer::Data(args[1]);
ssize_t len = Buffer::Length(args[1]);
@@ -4097,7 +4085,7 @@ void DiffieHellman::DiffieHellmanGroup(
return env->ThrowError("Group name argument is mandatory");
}
- THROW_AND_RETURN_IF_NOT_STRING(args[0], "Group name");
+ THROW_AND_RETURN_IF_NOT_STRING(env, args[0], "Group name");
bool initialized = false;
@@ -4246,7 +4234,7 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
if (args.Length() == 0) {
return env->ThrowError("Other party's public key argument is mandatory");
} else {
- THROW_AND_RETURN_IF_NOT_BUFFER(args[0], "Other party's public key");
+ THROW_AND_RETURN_IF_NOT_BUFFER(env, args[0], "Other party's public key");
key = BN_bin2bn(
reinterpret_cast<unsigned char*>(Buffer::Data(args[0])),
Buffer::Length(args[0]),
@@ -4319,7 +4307,7 @@ void DiffieHellman::SetKey(const v8::FunctionCallbackInfo<v8::Value>& args,
if (!Buffer::HasInstance(args[0])) {
snprintf(errmsg, sizeof(errmsg), "%s must be a buffer", what);
- return env->ThrowTypeError(errmsg);
+ return THROW_ERR_INVALID_ARG_TYPE(env, errmsg);
}
BIGNUM* num =
@@ -4397,7 +4385,7 @@ void ECDH::New(const FunctionCallbackInfo<Value>& args) {
MarkPopErrorOnReturn mark_pop_error_on_return;
// TODO(indutny): Support raw curves?
- THROW_AND_RETURN_IF_NOT_STRING(args[0], "ECDH curve name");
+ THROW_AND_RETURN_IF_NOT_STRING(env, args[0], "ECDH curve name");
node::Utf8Value curve(env->isolate(), args[0]);
int nid = OBJ_sn2nid(*curve);
@@ -4454,7 +4442,7 @@ EC_POINT* ECDH::BufferToPoint(Environment* env,
void ECDH::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
- THROW_AND_RETURN_IF_NOT_BUFFER(args[0], "Data");
+ THROW_AND_RETURN_IF_NOT_BUFFER(env, args[0], "Data");
ECDH* ecdh;
ASSIGN_OR_RETURN_UNWRAP(&ecdh, args.Holder());
@@ -4557,7 +4545,7 @@ void ECDH::SetPrivateKey(const FunctionCallbackInfo<Value>& args) {
ECDH* ecdh;
ASSIGN_OR_RETURN_UNWRAP(&ecdh, args.Holder());
- THROW_AND_RETURN_IF_NOT_BUFFER(args[0], "Private key");
+ THROW_AND_RETURN_IF_NOT_BUFFER(env, args[0], "Private key");
BIGNUM* priv = BN_bin2bn(
reinterpret_cast<unsigned char*>(Buffer::Data(args[0].As<Object>())),
@@ -4611,7 +4599,7 @@ void ECDH::SetPublicKey(const FunctionCallbackInfo<Value>& args) {
ECDH* ecdh;
ASSIGN_OR_RETURN_UNWRAP(&ecdh, args.Holder());
- THROW_AND_RETURN_IF_NOT_BUFFER(args[0], "Public key");
+ THROW_AND_RETURN_IF_NOT_BUFFER(env, args[0], "Public key");
MarkPopErrorOnReturn mark_pop_error_on_return;