From d5f9b1a80a49583ef96a79694dd556df944e5c51 Mon Sep 17 00:00:00 2001 From: CliffordST Date: Thu, 3 Jul 2014 14:33:55 +0400 Subject: [PATCH 1/2] Proper address checking for all CryptoNote currencies --- src/main.cc | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/main.cc b/src/main.cc index 0e507824..8801d9c3 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,3 +1,4 @@ +#include #include #include #include @@ -10,6 +11,7 @@ #include "crypto/crypto.h" #include "crypto/hash.h" #include "common/base58.h" +#include "serialization/binary_utils.h" using namespace node; using namespace v8; @@ -82,35 +84,45 @@ Handle convert_blob_bb(const Arguments& args) { return scope.Close(buff->handle_); } -Handle address_decode(const Arguments& args) { +Handle check_address(const Arguments& args) { HandleScope scope; - if (args.Length() < 1) - return except("You must provide one argument."); + if (args.Length() < 2) + return except("You must provide two arguments."); Local target = args[0]->ToObject(); if (!Buffer::HasInstance(target)) - return except("Argument should be a buffer object."); + return except("First argument should be a buffer object."); + + if (!args[1]->IsNumber()) + return except("Second argument should be an unsigned integer number."); blobdata input = std::string(Buffer::Data(target), Buffer::Length(target)); - blobdata output = ""; + Local expected_prefix = Number::New(args[1]->NumberValue()); + blobdata data; uint64_t prefix; + if (!tools::base58::decode_addr(input, prefix, data)) + return scope.Close(Boolean::New(false)); - tools::base58::decode_addr(input, prefix, output); - - if(output.length()) - output = uint64be_to_blob(prefix) + output; + if (static_cast(llround(expected_prefix->NumberValue())) != prefix) + return scope.Close(Boolean::New(false)); - Buffer* buff = Buffer::New(output.data(), output.size()); - return scope.Close(buff->handle_); + account_public_address adr; + if (!::serialization::parse_binary(data, adr)) + return scope.Close(Boolean::New(false)); + + //if (!crypto::check_key(adr.m_spend_public_key) || !crypto::check_key(adr.m_view_public_key)) + // return scope.Close(Boolean::New(false)); + + return scope.Close(Boolean::New(true)); } void init(Handle exports) { exports->Set(String::NewSymbol("convert_blob"), FunctionTemplate::New(convert_blob)->GetFunction()); exports->Set(String::NewSymbol("convert_blob_bb"), FunctionTemplate::New(convert_blob_bb)->GetFunction()); - exports->Set(String::NewSymbol("address_decode"), FunctionTemplate::New(address_decode)->GetFunction()); + exports->Set(String::NewSymbol("check_address"), FunctionTemplate::New(check_address)->GetFunction()); } NODE_MODULE(cryptonote, init) From fc27bad5976879d80f1c59f512b5bfee894b677a Mon Sep 17 00:00:00 2001 From: CliffordST Date: Thu, 3 Jul 2014 23:57:34 +0400 Subject: [PATCH 2/2] check_address function replaced by address_decode that parse address, check it, and returns its prefix --- binding.gyp | 3 +++ src/main.cc | 27 ++++++++++----------------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/binding.gyp b/binding.gyp index 612d74b5..50b9802a 100644 --- a/binding.gyp +++ b/binding.gyp @@ -6,6 +6,9 @@ "src/main.cc", "src/cryptonote_core/cryptonote_format_utils.cpp", "src/crypto/tree-hash.c", + "src/crypto/crypto.cpp", + "src/crypto/crypto-ops.c", + "src/crypto/crypto-ops-data.c", "src/crypto/hash.c", "src/crypto/keccak.c", "src/common/base58.cpp", diff --git a/src/main.cc b/src/main.cc index 8801d9c3..abd62c15 100644 --- a/src/main.cc +++ b/src/main.cc @@ -84,45 +84,38 @@ Handle convert_blob_bb(const Arguments& args) { return scope.Close(buff->handle_); } -Handle check_address(const Arguments& args) { +Handle address_decode(const Arguments& args) { HandleScope scope; - if (args.Length() < 2) - return except("You must provide two arguments."); + if (args.Length() < 1) + return except("You must provide one argument."); Local target = args[0]->ToObject(); if (!Buffer::HasInstance(target)) - return except("First argument should be a buffer object."); - - if (!args[1]->IsNumber()) - return except("Second argument should be an unsigned integer number."); + return except("Argument should be a buffer object."); blobdata input = std::string(Buffer::Data(target), Buffer::Length(target)); - Local expected_prefix = Number::New(args[1]->NumberValue()); blobdata data; uint64_t prefix; if (!tools::base58::decode_addr(input, prefix, data)) - return scope.Close(Boolean::New(false)); - - if (static_cast(llround(expected_prefix->NumberValue())) != prefix) - return scope.Close(Boolean::New(false)); + return scope.Close(Undefined()); account_public_address adr; if (!::serialization::parse_binary(data, adr)) - return scope.Close(Boolean::New(false)); + return scope.Close(Undefined()); - //if (!crypto::check_key(adr.m_spend_public_key) || !crypto::check_key(adr.m_view_public_key)) - // return scope.Close(Boolean::New(false)); + if (!crypto::check_key(adr.m_spend_public_key) || !crypto::check_key(adr.m_view_public_key)) + return scope.Close(Undefined()); - return scope.Close(Boolean::New(true)); + return scope.Close(Integer::New(static_cast(prefix))); } void init(Handle exports) { exports->Set(String::NewSymbol("convert_blob"), FunctionTemplate::New(convert_blob)->GetFunction()); exports->Set(String::NewSymbol("convert_blob_bb"), FunctionTemplate::New(convert_blob_bb)->GetFunction()); - exports->Set(String::NewSymbol("check_address"), FunctionTemplate::New(check_address)->GetFunction()); + exports->Set(String::NewSymbol("address_decode"), FunctionTemplate::New(address_decode)->GetFunction()); } NODE_MODULE(cryptonote, init)