Skip to content

Commit d5f8a1d

Browse files
committed
Added support for cryptonight v7 and the associated tests.
1 parent 2a5f592 commit d5f8a1d

3 files changed

Lines changed: 61 additions & 19 deletions

File tree

multihashing.cpp

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ NAN_METHOD(quark) {
4949
char * input = node::Buffer::Data(target);
5050
Nan::MaybeLocal<v8::Object> dest = Nan::NewBuffer(32);
5151
char* output = node::Buffer::Data(dest.ToLocalChecked());
52-
52+
5353
uint32_t input_len = node::Buffer::Length(target);
5454

5555
quark_hash(input, output, input_len);
@@ -86,18 +86,18 @@ NAN_METHOD(scrypt) {
8686

8787
if(!node::Buffer::HasInstance(target))
8888
return except("Argument should be a buffer object.");
89-
89+
9090
Local<Number> numn = info[1]->ToNumber();
9191
unsigned int nValue = numn->Value();
9292
Local<Number> numr = info[2]->ToNumber();
9393
unsigned int rValue = numr->Value();
94-
94+
9595
char * input = node::Buffer::Data(target);
9696
Nan::MaybeLocal<v8::Object> dest = Nan::NewBuffer(32);
9797
char* output = node::Buffer::Data(dest.ToLocalChecked());
9898

9999
uint32_t input_len = node::Buffer::Length(target);
100-
100+
101101
scrypt_N_R_1_256(input, output, nValue, rValue, input_len);
102102

103103
info.GetReturnValue().Set(dest.ToLocalChecked());
@@ -216,7 +216,7 @@ NAN_METHOD(skein) {
216216
char* output = node::Buffer::Data(dest.ToLocalChecked());
217217

218218
uint32_t input_len = node::Buffer::Length(target);
219-
219+
220220
skein_hash(input, output, input_len);
221221

222222
info.GetReturnValue().Set(dest.ToLocalChecked());
@@ -235,7 +235,7 @@ NAN_METHOD(groestl) {
235235
char * input = node::Buffer::Data(target);
236236
Nan::MaybeLocal<v8::Object> dest = Nan::NewBuffer(32);
237237
char* output = node::Buffer::Data(dest.ToLocalChecked());
238-
238+
239239
uint32_t input_len = node::Buffer::Length(target);
240240

241241
groestl_hash(input, output, input_len);
@@ -256,7 +256,7 @@ NAN_METHOD(groestlmyriad) {
256256
char * input = node::Buffer::Data(target);
257257
Nan::MaybeLocal<v8::Object> dest = Nan::NewBuffer(32);
258258
char* output = node::Buffer::Data(dest.ToLocalChecked());
259-
259+
260260
uint32_t input_len = node::Buffer::Length(target);
261261

262262
groestlmyriad_hash(input, output, input_len);
@@ -277,7 +277,7 @@ NAN_METHOD(blake) {
277277
char * input = node::Buffer::Data(target);
278278
Nan::MaybeLocal<v8::Object> dest = Nan::NewBuffer(32);
279279
char* output = node::Buffer::Data(dest.ToLocalChecked());
280-
280+
281281
uint32_t input_len = node::Buffer::Length(target);
282282

283283
blake_hash(input, output, input_len);
@@ -298,7 +298,7 @@ NAN_METHOD(fugue) {
298298
char * input = node::Buffer::Data(target);
299299
Nan::MaybeLocal<v8::Object> dest = Nan::NewBuffer(32);
300300
char* output = node::Buffer::Data(dest.ToLocalChecked());
301-
301+
302302
uint32_t input_len = node::Buffer::Length(target);
303303

304304
fugue_hash(input, output, input_len);
@@ -319,7 +319,7 @@ NAN_METHOD(qubit) {
319319
char * input = node::Buffer::Data(target);
320320
Nan::MaybeLocal<v8::Object> dest = Nan::NewBuffer(32);
321321
char* output = node::Buffer::Data(dest.ToLocalChecked());
322-
322+
323323
uint32_t input_len = node::Buffer::Length(target);
324324

325325
qubit_hash(input, output, input_len);
@@ -340,7 +340,7 @@ NAN_METHOD(hefty1) {
340340
char * input = node::Buffer::Data(target);
341341
Nan::MaybeLocal<v8::Object> dest = Nan::NewBuffer(32);
342342
char* output = node::Buffer::Data(dest.ToLocalChecked());
343-
343+
344344
uint32_t input_len = node::Buffer::Length(target);
345345

346346
hefty1_hash(input, output, input_len);
@@ -361,7 +361,7 @@ NAN_METHOD(shavite3) {
361361
char * input = node::Buffer::Data(target);
362362
Nan::MaybeLocal<v8::Object> dest = Nan::NewBuffer(32);
363363
char* output = node::Buffer::Data(dest.ToLocalChecked());
364-
364+
365365
uint32_t input_len = node::Buffer::Length(target);
366366

367367
shavite3_hash(input, output, input_len);
@@ -371,14 +371,20 @@ NAN_METHOD(shavite3) {
371371

372372
NAN_METHOD(cryptonight) {
373373
bool fast = false;
374+
uint32_t cn_variant = 0;
374375

375376
if (info.Length() < 1)
376377
return except("You must provide one argument.");
377-
378+
378379
if (info.Length() >= 2) {
379-
if(!info[1]->IsBoolean())
380-
return except("Argument 2 should be a boolean");
381-
fast = info[1]->ToBoolean()->BooleanValue();
380+
if (info.Length() >= 2) {
381+
if(info[1]->IsBoolean())
382+
fast = info[1]->ToBoolean()->BooleanValue();
383+
else if(info[1]->IsUint32())
384+
cn_variant = info[1]->ToUint32()->Uint32Value();
385+
else
386+
return except("Argument 2 should be a boolean or uint32_t");
387+
}
382388
}
383389

384390
Local<Object> target = info[0]->ToObject();
@@ -389,13 +395,16 @@ NAN_METHOD(cryptonight) {
389395
char * input = node::Buffer::Data(target);
390396
Nan::MaybeLocal<v8::Object> dest = Nan::NewBuffer(32);
391397
char* output = node::Buffer::Data(dest.ToLocalChecked());
392-
398+
393399
uint32_t input_len = node::Buffer::Length(target);
394400

395401
if(fast)
396402
cryptonight_fast_hash(input, output, input_len);
397-
else
398-
cryptonight_hash(input, output, input_len);
403+
else {
404+
if (cn_variant > 0 && input_len < 43)
405+
return except("Argument must be 43 bytes for monero variant 1+");
406+
cryptonight_hash(input, output, input_len, cn_variant);
407+
}
399408

400409
info.GetReturnValue().Set(dest.ToLocalChecked());
401410
}

tests/cryptonight-tests.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const multiHashing = require('../build/Release/multihashing');
2+
const assert = require('assert');
3+
4+
var cn_data = new Buffer("6465206f6d6e69627573206475626974616e64756d", "hex");
5+
var cnv1_data = new Buffer("0100fb8e8ac805899323371bb790db19218afd8db8e3755d8b90f39b3d5506a9abce4fa912244500000000ee8146d49fa93ee724deb57d12cbc6c6f3b924d946127c7a97418f9348828f0f02", "hex");
6+
var cn_hash = new Buffer("2f8e3df40bd11f9ac90c743ca8e32bb391da4fb98612aa3b6cdc639ee00b31f5", "hex");
7+
var cnv1_hash = new Buffer("c9fae8425d8688dc236bcdbc42fdb42d376c6ec190501aa84b04a4b4cf1ee122", "hex");
8+
9+
hashedData = multiHashing['cryptonight'](cn_data);
10+
hashedData_v1 = multiHashing['cryptonight'](cnv1_data, 1);
11+
12+
console.log(hashedData);
13+
console.log(hashedData_v1);
14+
15+
assert.deepEqual(hashedData, cn_hash);
16+
assert.deepEqual(hashedData_v1, cnv1_hash);

tests/test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
var multiHashing = require('../build/Release/multihashing');
2+
3+
var algorithms = ['keccak', 'groestl', 'skein', 'blake', 'cryptonight', 'cryptonight v7'];
4+
5+
var data = new Buffer("7000000001e980924e4e1109230383e66d62945ff8e749903bea4336755c00000000000051928aff1b4d72416173a8c3948159a09a73ac3bb556aa6bfbcad1a85da7f4c1d13350531e24031b939b9e2b", "hex");
6+
7+
var hashedData = algorithms.map(function(algo){
8+
if (algo === 'cryptonight v7'){
9+
return multiHashing['cryptonight'](data, 1);
10+
}
11+
else{
12+
return multiHashing[algo](data);
13+
}
14+
});
15+
16+
17+
console.log(hashedData);

0 commit comments

Comments
 (0)