diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..187adb2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/nbproject/ \ No newline at end of file diff --git a/binding.gyp b/binding.gyp index 2037c2b..8e53c12 100644 --- a/binding.gyp +++ b/binding.gyp @@ -53,6 +53,7 @@ ], "include_dirs": [ "crypto", + " #include #include +#include extern "C" { #include "bcrypt.h" @@ -27,23 +28,22 @@ extern "C" { #include "boolberry.h" +#define THROW_ERROR_EXCEPTION(x) NanThrowError(x) +#define THROW_ERROR_EXCEPTION_WITH_STATUS_CODE(x, y) NanThrowError(x, y) + using namespace node; using namespace v8; -Handle except(const char* msg) { - return ThrowException(Exception::Error(String::New(msg))); -} - -Handle quark(const Arguments& args) { - HandleScope scope; +NAN_METHOD(quark) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -52,20 +52,21 @@ Handle quark(const Arguments& args) { quark_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle x11(const Arguments& args) { - HandleScope scope; +NAN_METHOD(x11) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -74,20 +75,21 @@ Handle x11(const Arguments& args) { x11_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle scrypt(const Arguments& args) { - HandleScope scope; +NAN_METHOD(scrypt) { + NanScope(); if (args.Length() < 3) - return except("You must provide buffer to hash, N value, and R value"); + return THROW_ERROR_EXCEPTION("You must provide buffer to hash, N value, and R value"); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); Local numn = args[1]->ToNumber(); unsigned int nValue = numn->Value(); @@ -101,22 +103,23 @@ Handle scrypt(const Arguments& args) { scrypt_N_R_1_256(input, output, nValue, rValue, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle scryptn(const Arguments& args) { - HandleScope scope; +NAN_METHOD(scryptn) { + NanScope(); if (args.Length() < 2) - return except("You must provide buffer to hash and N factor."); + return THROW_ERROR_EXCEPTION("You must provide buffer to hash and N factor."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); Local num = args[1]->ToNumber(); unsigned int nFactor = num->Value(); @@ -132,20 +135,21 @@ Handle scryptn(const Arguments& args) { scrypt_N_R_1_256(input, output, N, 1, input_len); //hardcode for now to R=1 for now - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle scryptjane(const Arguments& args) { - HandleScope scope; +NAN_METHOD(scryptjane) { + NanScope(); if (args.Length() < 5) - return except("You must provide two argument: buffer, timestamp as number, and nChainStarTime as number, nMin, and nMax"); + return THROW_ERROR_EXCEPTION("You must provide two argument: buffer, timestamp as number, and nChainStarTime as number, nMin, and nMax"); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("First should be a buffer object."); + return THROW_ERROR_EXCEPTION("First should be a buffer object."); Local num = args[1]->ToNumber(); int timestamp = num->Value(); @@ -166,20 +170,21 @@ Handle scryptjane(const Arguments& args) { scryptjane_hash(input, input_len, (uint32_t *)output, GetNfactorJane(timestamp, nChainStartTime, nMin, nMax)); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle keccak(const Arguments& args) { - HandleScope scope; +NAN_METHOD(keccak) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -188,41 +193,43 @@ Handle keccak(const Arguments& args) { keccak_hash(input, output, dSize); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle bcrypt(const Arguments& args) { - HandleScope scope; +NAN_METHOD(bcrypt) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; bcrypt_hash(input, output); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle skein(const Arguments& args) { - HandleScope scope; +NAN_METHOD(skein) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -231,21 +238,22 @@ Handle skein(const Arguments& args) { skein_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle groestl(const Arguments& args) { - HandleScope scope; +NAN_METHOD(groestl) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -254,21 +262,22 @@ Handle groestl(const Arguments& args) { groestl_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle groestlmyriad(const Arguments& args) { - HandleScope scope; +NAN_METHOD(groestlmyriad) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -277,21 +286,22 @@ Handle groestlmyriad(const Arguments& args) { groestlmyriad_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle blake(const Arguments& args) { - HandleScope scope; +NAN_METHOD(blake) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -300,21 +310,22 @@ Handle blake(const Arguments& args) { blake_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle fugue(const Arguments& args) { - HandleScope scope; +NAN_METHOD(fugue) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -323,21 +334,22 @@ Handle fugue(const Arguments& args) { fugue_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle qubit(const Arguments& args) { - HandleScope scope; +NAN_METHOD(qubit) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -346,21 +358,22 @@ Handle qubit(const Arguments& args) { qubit_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle hefty1(const Arguments& args) { - HandleScope scope; +NAN_METHOD(hefty1) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -369,21 +382,22 @@ Handle hefty1(const Arguments& args) { hefty1_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle shavite3(const Arguments& args) { - HandleScope scope; +NAN_METHOD(shavite3) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -392,28 +406,29 @@ Handle shavite3(const Arguments& args) { shavite3_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle cryptonight(const Arguments& args) { - HandleScope scope; +NAN_METHOD(cryptonight) { + NanScope(); bool fast = false; if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); if (args.Length() >= 2) { if(!args[1]->IsBoolean()) - return except("Argument 2 should be a boolean"); + return THROW_ERROR_EXCEPTION("Argument 2 should be a boolean"); fast = args[1]->ToBoolean()->BooleanValue(); } Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -425,20 +440,21 @@ Handle cryptonight(const Arguments& args) { else cryptonight_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle x13(const Arguments& args) { - HandleScope scope; +NAN_METHOD(x13) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -447,31 +463,32 @@ Handle x13(const Arguments& args) { x13_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle boolberry(const Arguments& args) { - HandleScope scope; +NAN_METHOD(boolberry) { + NanScope(); if (args.Length() < 2) - return except("You must provide two arguments."); + return THROW_ERROR_EXCEPTION("You must provide two arguments."); Local target = args[0]->ToObject(); Local target_spad = args[1]->ToObject(); uint32_t height = 1; if(!Buffer::HasInstance(target)) - return except("Argument 1 should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument 1 should be a buffer object."); if(!Buffer::HasInstance(target_spad)) - return except("Argument 2 should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument 2 should be a buffer object."); if(args.Length() >= 3) if(args[2]->IsUint32()) height = args[2]->ToUint32()->Uint32Value(); else - return except("Argument 3 should be an unsigned integer."); + return THROW_ERROR_EXCEPTION("Argument 3 should be an unsigned integer."); char * input = Buffer::Data(target); char * scratchpad = Buffer::Data(target_spad); @@ -482,20 +499,21 @@ Handle boolberry(const Arguments& args) { boolberry_hash(input, input_len, scratchpad, spad_len, output, height); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle nist5(const Arguments& args) { - HandleScope scope; +NAN_METHOD(nist5) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -504,20 +522,21 @@ Handle nist5(const Arguments& args) { nist5_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle sha1(const Arguments& args) { - HandleScope scope; +NAN_METHOD(sha1) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -526,20 +545,21 @@ Handle sha1(const Arguments& args) { sha1_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle x15(const Arguments& args) { - HandleScope scope; +NAN_METHOD(x15) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -548,20 +568,21 @@ Handle x15(const Arguments& args) { x15_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } -Handle fresh(const Arguments& args) { - HandleScope scope; +NAN_METHOD(fresh) { + NanScope(); if (args.Length() < 1) - return except("You must provide one argument."); + return THROW_ERROR_EXCEPTION("You must provide one argument."); Local target = args[0]->ToObject(); if(!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return THROW_ERROR_EXCEPTION("Argument should be a buffer object."); char * input = Buffer::Data(target); char output[32]; @@ -570,33 +591,34 @@ Handle fresh(const Arguments& args) { fresh_hash(input, output, input_len); - Buffer* buff = Buffer::New(output, 32); - return scope.Close(buff->handle_); + NanReturnValue( + NanNewBufferHandle(output, 32) + ); } void init(Handle exports) { - exports->Set(String::NewSymbol("quark"), FunctionTemplate::New(quark)->GetFunction()); - exports->Set(String::NewSymbol("x11"), FunctionTemplate::New(x11)->GetFunction()); - exports->Set(String::NewSymbol("scrypt"), FunctionTemplate::New(scrypt)->GetFunction()); - exports->Set(String::NewSymbol("scryptn"), FunctionTemplate::New(scryptn)->GetFunction()); - exports->Set(String::NewSymbol("scryptjane"), FunctionTemplate::New(scryptjane)->GetFunction()); - exports->Set(String::NewSymbol("keccak"), FunctionTemplate::New(keccak)->GetFunction()); - exports->Set(String::NewSymbol("bcrypt"), FunctionTemplate::New(bcrypt)->GetFunction()); - exports->Set(String::NewSymbol("skein"), FunctionTemplate::New(skein)->GetFunction()); - exports->Set(String::NewSymbol("groestl"), FunctionTemplate::New(groestl)->GetFunction()); - exports->Set(String::NewSymbol("groestlmyriad"), FunctionTemplate::New(groestlmyriad)->GetFunction()); - exports->Set(String::NewSymbol("blake"), FunctionTemplate::New(blake)->GetFunction()); - exports->Set(String::NewSymbol("fugue"), FunctionTemplate::New(fugue)->GetFunction()); - exports->Set(String::NewSymbol("qubit"), FunctionTemplate::New(qubit)->GetFunction()); - exports->Set(String::NewSymbol("hefty1"), FunctionTemplate::New(hefty1)->GetFunction()); - exports->Set(String::NewSymbol("shavite3"), FunctionTemplate::New(shavite3)->GetFunction()); - exports->Set(String::NewSymbol("cryptonight"), FunctionTemplate::New(cryptonight)->GetFunction()); - exports->Set(String::NewSymbol("x13"), FunctionTemplate::New(x13)->GetFunction()); - exports->Set(String::NewSymbol("boolberry"), FunctionTemplate::New(boolberry)->GetFunction()); - exports->Set(String::NewSymbol("nist5"), FunctionTemplate::New(nist5)->GetFunction()); - exports->Set(String::NewSymbol("sha1"), FunctionTemplate::New(sha1)->GetFunction()); - exports->Set(String::NewSymbol("x15"), FunctionTemplate::New(x15)->GetFunction()); - exports->Set(String::NewSymbol("fresh"), FunctionTemplate::New(fresh)->GetFunction()); + exports->Set(NanNew("quark"), NanNew(quark)->GetFunction()); + exports->Set(NanNew("x11"), NanNew(x11)->GetFunction()); + exports->Set(NanNew("scrypt"), NanNew(scrypt)->GetFunction()); + exports->Set(NanNew("scryptn"), NanNew(scryptn)->GetFunction()); + exports->Set(NanNew("scryptjane"), NanNew(scryptjane)->GetFunction()); + exports->Set(NanNew("keccak"), NanNew(keccak)->GetFunction()); + exports->Set(NanNew("bcrypt"), NanNew(bcrypt)->GetFunction()); + exports->Set(NanNew("skein"), NanNew(skein)->GetFunction()); + exports->Set(NanNew("groestl"), NanNew(groestl)->GetFunction()); + exports->Set(NanNew("groestlmyriad"), NanNew(groestlmyriad)->GetFunction()); + exports->Set(NanNew("blake"), NanNew(blake)->GetFunction()); + exports->Set(NanNew("fugue"), NanNew(fugue)->GetFunction()); + exports->Set(NanNew("qubit"), NanNew(qubit)->GetFunction()); + exports->Set(NanNew("hefty1"), NanNew(hefty1)->GetFunction()); + exports->Set(NanNew("shavite3"), NanNew(shavite3)->GetFunction()); + exports->Set(NanNew("cryptonight"), NanNew(cryptonight)->GetFunction()); + exports->Set(NanNew("x13"), NanNew(x13)->GetFunction()); + exports->Set(NanNew("boolberry"), NanNew(boolberry)->GetFunction()); + exports->Set(NanNew("nist5"), NanNew(nist5)->GetFunction()); + exports->Set(NanNew("sha1"), NanNew(sha1)->GetFunction()); + exports->Set(NanNew("x15"), NanNew(x15)->GetFunction()); + exports->Set(NanNew("fresh"), NanNew(fresh)->GetFunction()); } NODE_MODULE(multihashing, init) diff --git a/package.json b/package.json index 86b07c8..636d112 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "url": "https://github.com/zone117x/node-multi-hashing.git" }, "dependencies" : { - "bindings" : "*" + "bindings" : "*", + "nan" : "*" }, "keywords": [ "scrypt",