bignum 0.12.5 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bignum might be problematic. Click here for more details.
- package/bignum.cc +103 -98
- package/binding.gyp +1 -11
- package/index.js +6 -10
- package/package.json +13 -8
- package/.npmignore +0 -14
package/bignum.cc
CHANGED
@@ -41,7 +41,7 @@ using namespace std;
|
|
41
41
|
Nan::ThrowTypeError("Argument " #I " must be a uint32"); \
|
42
42
|
return; \
|
43
43
|
} \
|
44
|
-
uint32_t VAR = info[I]
|
44
|
+
uint32_t VAR = Nan::To<int32_t>(info[I]).FromJust();
|
45
45
|
|
46
46
|
#define REQ_INT64_ARG(I, VAR) \
|
47
47
|
if (info.Length() <= (I) || !info[I]->IsNumber()) { \
|
@@ -66,8 +66,8 @@ using namespace std;
|
|
66
66
|
|
67
67
|
#define WRAP_RESULT(RES, VAR) \
|
68
68
|
Local<Value> arg[1] = { Nan::New<External>(static_cast<BigNum*>(RES)) }; \
|
69
|
-
Local<Object> VAR = Nan::New<FunctionTemplate>(constructor_template)-> \
|
70
|
-
|
69
|
+
Local<Object> VAR = Nan::NewInstance(Nan::New<FunctionTemplate>(constructor_template)->GetFunction(), \
|
70
|
+
1, arg).ToLocalChecked();
|
71
71
|
|
72
72
|
class AutoBN_CTX
|
73
73
|
{
|
@@ -140,9 +140,9 @@ int BN_jacobi_priv(const BIGNUM *A,const BIGNUM *N,int *jacobi,
|
|
140
140
|
BN_copy(a1,A);
|
141
141
|
BN_copy(n1,N);
|
142
142
|
startjacobistep1:
|
143
|
-
if BN_is_zero(a1) /* step 1 */
|
143
|
+
if (BN_is_zero(a1)) /* step 1 */
|
144
144
|
goto endBN_jacobi; /* *jacobi = 1; */
|
145
|
-
if BN_is_one(a1) /* step 2 */
|
145
|
+
if (BN_is_one(a1)) /* step 2 */
|
146
146
|
goto endBN_jacobi; /* *jacobi = 1; */
|
147
147
|
for (e=0;;e++) /* step 3 */
|
148
148
|
if (BN_is_odd(a1))
|
@@ -180,14 +180,14 @@ endBN_jacobi:
|
|
180
180
|
class BigNum : public Nan::ObjectWrap {
|
181
181
|
public:
|
182
182
|
static void Initialize(Local<Object> target);
|
183
|
-
BIGNUM bignum_;
|
183
|
+
BIGNUM* bignum_;
|
184
184
|
static Nan::Persistent<Function> js_conditioner;
|
185
185
|
static void SetJSConditioner(Local<Function> constructor);
|
186
186
|
|
187
187
|
protected:
|
188
188
|
static Nan::Persistent<FunctionTemplate> constructor_template;
|
189
189
|
|
190
|
-
BigNum(const
|
190
|
+
BigNum(const Nan::Utf8String& str, uint64_t base);
|
191
191
|
BigNum(uint64_t num);
|
192
192
|
BigNum(int64_t num);
|
193
193
|
BigNum(BIGNUM *num);
|
@@ -291,20 +291,19 @@ void BigNum::Initialize(v8::Local<v8::Object> target) {
|
|
291
291
|
target->Set(Nan::New("BigNum").ToLocalChecked(), tmpl->GetFunction());
|
292
292
|
}
|
293
293
|
|
294
|
-
BigNum::BigNum(const
|
294
|
+
BigNum::BigNum(const Nan::Utf8String& str, uint64_t base) : Nan::ObjectWrap (),
|
295
|
+
bignum_(BN_new())
|
295
296
|
{
|
296
|
-
|
297
|
-
BN_zero(&bignum_);
|
297
|
+
BN_zero(bignum_);
|
298
298
|
|
299
|
-
BIGNUM *res =
|
299
|
+
BIGNUM *res = bignum_;
|
300
300
|
|
301
301
|
const char *cstr = *str;
|
302
302
|
switch (base) {
|
303
303
|
case 2:
|
304
|
-
BN_init(&bignum_);
|
305
304
|
for (int i = 0, l = str.length(); i < l; i++) {
|
306
305
|
if (cstr[l-i-1] != '0') {
|
307
|
-
BN_set_bit(
|
306
|
+
BN_set_bit(bignum_, i);
|
308
307
|
}
|
309
308
|
}
|
310
309
|
break;
|
@@ -320,57 +319,56 @@ BigNum::BigNum(const v8::String::Utf8Value& str, uint64_t base) : Nan::ObjectWra
|
|
320
319
|
}
|
321
320
|
}
|
322
321
|
|
323
|
-
BigNum::BigNum(uint64_t num) : Nan::ObjectWrap ()
|
322
|
+
BigNum::BigNum(uint64_t num) : Nan::ObjectWrap (),
|
323
|
+
bignum_(BN_new())
|
324
324
|
{
|
325
|
-
BN_init(&bignum_);
|
326
|
-
|
327
325
|
if (sizeof(BN_ULONG) >= 8 || num <= 0xFFFFFFFFL) {
|
328
|
-
BN_set_word(
|
326
|
+
BN_set_word(bignum_, num);
|
329
327
|
} else {
|
330
|
-
BN_set_word(
|
331
|
-
BN_lshift(
|
332
|
-
BN_add_word(
|
328
|
+
BN_set_word(bignum_, num >> 32);
|
329
|
+
BN_lshift(bignum_, bignum_, 32);
|
330
|
+
BN_add_word(bignum_, num & 0xFFFFFFFFL);
|
333
331
|
}
|
334
332
|
}
|
335
333
|
|
336
|
-
BigNum::BigNum(int64_t num) : Nan::ObjectWrap ()
|
334
|
+
BigNum::BigNum(int64_t num) : Nan::ObjectWrap (),
|
335
|
+
bignum_(BN_new())
|
337
336
|
{
|
338
337
|
bool neg = (num < 0);
|
339
|
-
BN_init(&bignum_);
|
340
338
|
|
341
339
|
if (neg) {
|
342
340
|
num = -num;
|
343
341
|
}
|
344
342
|
if (num < 0) { // num is -2^63
|
345
|
-
BN_one(
|
346
|
-
BN_lshift(
|
343
|
+
BN_one(bignum_);
|
344
|
+
BN_lshift(bignum_, bignum_, 63);
|
347
345
|
} else if (sizeof(BN_ULONG) >= 8 || num <= 0xFFFFFFFFL) {
|
348
|
-
BN_set_word(
|
346
|
+
BN_set_word(bignum_, num);
|
349
347
|
} else {
|
350
|
-
BN_set_word(
|
351
|
-
BN_lshift(
|
352
|
-
BN_add_word(
|
348
|
+
BN_set_word(bignum_, num >> 32);
|
349
|
+
BN_lshift(bignum_, bignum_, 32);
|
350
|
+
BN_add_word(bignum_, num & 0xFFFFFFFFL);
|
353
351
|
}
|
354
352
|
if (neg) {
|
355
|
-
BN_set_negative(
|
353
|
+
BN_set_negative(bignum_, 1);
|
356
354
|
}
|
357
355
|
}
|
358
356
|
|
359
|
-
BigNum::BigNum(BIGNUM *num) : Nan::ObjectWrap ()
|
357
|
+
BigNum::BigNum(BIGNUM *num) : Nan::ObjectWrap (),
|
358
|
+
bignum_(BN_new())
|
360
359
|
{
|
361
|
-
|
362
|
-
BN_copy(&bignum_, num);
|
360
|
+
BN_copy(bignum_, num);
|
363
361
|
}
|
364
362
|
|
365
|
-
BigNum::BigNum() : Nan::ObjectWrap ()
|
363
|
+
BigNum::BigNum() : Nan::ObjectWrap (),
|
364
|
+
bignum_(BN_new())
|
366
365
|
{
|
367
|
-
|
368
|
-
BN_zero(&bignum_);
|
366
|
+
BN_zero(bignum_);
|
369
367
|
}
|
370
368
|
|
371
369
|
BigNum::~BigNum()
|
372
370
|
{
|
373
|
-
BN_clear_free(
|
371
|
+
BN_clear_free(bignum_);
|
374
372
|
}
|
375
373
|
|
376
374
|
NAN_METHOD(BigNum::New)
|
@@ -381,8 +379,16 @@ NAN_METHOD(BigNum::New)
|
|
381
379
|
for (int i = 0; i < len; i++) {
|
382
380
|
newArgs[i] = info[i];
|
383
381
|
}
|
384
|
-
|
385
|
-
|
382
|
+
|
383
|
+
Nan::TryCatch tryCatch;
|
384
|
+
Nan::MaybeLocal<Object> newInstMaybeLocal = Nan::NewInstance(
|
385
|
+
Nan::New<FunctionTemplate>(constructor_template)->GetFunction(), len, newArgs);
|
386
|
+
if (tryCatch.HasCaught()) {
|
387
|
+
tryCatch.ReThrow();
|
388
|
+
return;
|
389
|
+
}
|
390
|
+
|
391
|
+
Local<Value> newInst = newInstMaybeLocal.ToLocalChecked();
|
386
392
|
delete[] newArgs;
|
387
393
|
info.GetReturnValue().Set(newInst);
|
388
394
|
return;
|
@@ -409,8 +415,8 @@ NAN_METHOD(BigNum::New)
|
|
409
415
|
return;
|
410
416
|
}
|
411
417
|
|
412
|
-
|
413
|
-
base = obj->ToObject()->Get(Nan::New("base").ToLocalChecked())
|
418
|
+
Nan::Utf8String str(obj->ToObject()->Get(Nan::New("num").ToLocalChecked())->ToString());
|
419
|
+
base = Nan::To<int64_t>(obj->ToObject()->Get(Nan::New("base").ToLocalChecked())).FromJust();
|
414
420
|
|
415
421
|
bignum = new BigNum(str, base);
|
416
422
|
}
|
@@ -433,10 +439,10 @@ NAN_METHOD(BigNum::ToString)
|
|
433
439
|
char *to = NULL;
|
434
440
|
switch (base) {
|
435
441
|
case 10:
|
436
|
-
to = BN_bn2dec(
|
442
|
+
to = BN_bn2dec(bignum->bignum_);
|
437
443
|
break;
|
438
444
|
case 16:
|
439
|
-
to = BN_bn2hex(
|
445
|
+
to = BN_bn2hex(bignum->bignum_);
|
440
446
|
break;
|
441
447
|
default:
|
442
448
|
Nan::ThrowError("Invalid base, only 10 and 16 are supported");
|
@@ -456,7 +462,7 @@ NAN_METHOD(BigNum::Badd)
|
|
456
462
|
BigNum *bn = Nan::ObjectWrap::Unwrap<BigNum>(info[0]->ToObject());
|
457
463
|
BigNum *res = new BigNum();
|
458
464
|
|
459
|
-
BN_add(
|
465
|
+
BN_add(res->bignum_, bignum->bignum_, bn->bignum_);
|
460
466
|
|
461
467
|
WRAP_RESULT(res, result);
|
462
468
|
|
@@ -469,7 +475,7 @@ NAN_METHOD(BigNum::Bsub)
|
|
469
475
|
|
470
476
|
BigNum *bn = Nan::ObjectWrap::Unwrap<BigNum>(info[0]->ToObject());
|
471
477
|
BigNum *res = new BigNum();
|
472
|
-
BN_sub(
|
478
|
+
BN_sub(res->bignum_, bignum->bignum_, bn->bignum_);
|
473
479
|
|
474
480
|
WRAP_RESULT(res, result);
|
475
481
|
|
@@ -483,7 +489,7 @@ NAN_METHOD(BigNum::Bmul)
|
|
483
489
|
|
484
490
|
BigNum *bn = Nan::ObjectWrap::Unwrap<BigNum>(info[0]->ToObject());
|
485
491
|
BigNum *res = new BigNum();
|
486
|
-
BN_mul(
|
492
|
+
BN_mul(res->bignum_, bignum->bignum_, bn->bignum_, ctx);
|
487
493
|
|
488
494
|
WRAP_RESULT(res, result);
|
489
495
|
|
@@ -497,7 +503,7 @@ NAN_METHOD(BigNum::Bdiv)
|
|
497
503
|
|
498
504
|
BigNum *bi = Nan::ObjectWrap::Unwrap<BigNum>(info[0]->ToObject());
|
499
505
|
BigNum *res = new BigNum();
|
500
|
-
BN_div(
|
506
|
+
BN_div(res->bignum_, NULL, bignum->bignum_, bi->bignum_, ctx);
|
501
507
|
|
502
508
|
WRAP_RESULT(res, result);
|
503
509
|
|
@@ -509,12 +515,12 @@ NAN_METHOD(BigNum::Uadd)
|
|
509
515
|
BigNum *bignum = Nan::ObjectWrap::Unwrap<BigNum>(info.This());
|
510
516
|
|
511
517
|
REQ_UINT64_ARG(0, x);
|
512
|
-
BigNum *res = new BigNum(
|
518
|
+
BigNum *res = new BigNum(bignum->bignum_);
|
513
519
|
if (sizeof(BN_ULONG) >= 8 || x <= 0xFFFFFFFFL) {
|
514
|
-
BN_add_word(
|
520
|
+
BN_add_word(res->bignum_, x);
|
515
521
|
} else {
|
516
522
|
BigNum *bn = new BigNum(x);
|
517
|
-
BN_add(
|
523
|
+
BN_add(res->bignum_, bignum->bignum_, bn->bignum_);
|
518
524
|
}
|
519
525
|
|
520
526
|
WRAP_RESULT(res, result);
|
@@ -527,12 +533,12 @@ NAN_METHOD(BigNum::Usub)
|
|
527
533
|
BigNum *bignum = Nan::ObjectWrap::Unwrap<BigNum>(info.This());
|
528
534
|
|
529
535
|
REQ_UINT64_ARG(0, x);
|
530
|
-
BigNum *res = new BigNum(
|
536
|
+
BigNum *res = new BigNum(bignum->bignum_);
|
531
537
|
if (sizeof(BN_ULONG) >= 8 || x <= 0xFFFFFFFFL) {
|
532
|
-
BN_sub_word(
|
538
|
+
BN_sub_word(res->bignum_, x);
|
533
539
|
} else {
|
534
540
|
BigNum *bn = new BigNum(x);
|
535
|
-
BN_sub(
|
541
|
+
BN_sub(res->bignum_, bignum->bignum_, bn->bignum_);
|
536
542
|
}
|
537
543
|
|
538
544
|
WRAP_RESULT(res, result);
|
@@ -545,13 +551,13 @@ NAN_METHOD(BigNum::Umul)
|
|
545
551
|
BigNum *bignum = Nan::ObjectWrap::Unwrap<BigNum>(info.This());
|
546
552
|
|
547
553
|
REQ_UINT64_ARG(0, x);
|
548
|
-
BigNum *res = new BigNum(
|
554
|
+
BigNum *res = new BigNum(bignum->bignum_);
|
549
555
|
if (sizeof(BN_ULONG) >= 8 || x <= 0xFFFFFFFFL) {
|
550
|
-
BN_mul_word(
|
556
|
+
BN_mul_word(res->bignum_, x);
|
551
557
|
} else {
|
552
558
|
AutoBN_CTX ctx;
|
553
559
|
BigNum *bn = new BigNum(x);
|
554
|
-
BN_mul(
|
560
|
+
BN_mul(res->bignum_, bignum->bignum_, bn->bignum_, ctx);
|
555
561
|
}
|
556
562
|
|
557
563
|
WRAP_RESULT(res, result);
|
@@ -564,13 +570,13 @@ NAN_METHOD(BigNum::Udiv)
|
|
564
570
|
BigNum *bignum = Nan::ObjectWrap::Unwrap<BigNum>(info.This());
|
565
571
|
|
566
572
|
REQ_UINT64_ARG(0, x);
|
567
|
-
BigNum *res = new BigNum(
|
573
|
+
BigNum *res = new BigNum(bignum->bignum_);
|
568
574
|
if (sizeof(BN_ULONG) >= 8 || x <= 0xFFFFFFFFL) {
|
569
|
-
BN_div_word(
|
575
|
+
BN_div_word(res->bignum_, x);
|
570
576
|
} else {
|
571
577
|
AutoBN_CTX ctx;
|
572
578
|
BigNum *bn = new BigNum(x);
|
573
|
-
BN_div(
|
579
|
+
BN_div(res->bignum_, NULL, bignum->bignum_, bn->bignum_, ctx);
|
574
580
|
}
|
575
581
|
|
576
582
|
WRAP_RESULT(res, result);
|
@@ -584,7 +590,7 @@ NAN_METHOD(BigNum::Umul_2exp)
|
|
584
590
|
|
585
591
|
REQ_UINT32_ARG(0, x);
|
586
592
|
BigNum *res = new BigNum();
|
587
|
-
BN_lshift(
|
593
|
+
BN_lshift(res->bignum_, bignum->bignum_, x);
|
588
594
|
|
589
595
|
WRAP_RESULT(res, result);
|
590
596
|
|
@@ -597,7 +603,7 @@ NAN_METHOD(BigNum::Udiv_2exp)
|
|
597
603
|
|
598
604
|
REQ_UINT32_ARG(0, x);
|
599
605
|
BigNum *res = new BigNum();
|
600
|
-
BN_rshift(
|
606
|
+
BN_rshift(res->bignum_, bignum->bignum_, x);
|
601
607
|
|
602
608
|
WRAP_RESULT(res, result);
|
603
609
|
|
@@ -608,8 +614,8 @@ NAN_METHOD(BigNum::Babs)
|
|
608
614
|
{
|
609
615
|
BigNum *bignum = Nan::ObjectWrap::Unwrap<BigNum>(info.This());
|
610
616
|
|
611
|
-
BigNum *res = new BigNum(
|
612
|
-
BN_set_negative(
|
617
|
+
BigNum *res = new BigNum(bignum->bignum_);
|
618
|
+
BN_set_negative(res->bignum_, 0);
|
613
619
|
|
614
620
|
WRAP_RESULT(res, result);
|
615
621
|
|
@@ -620,8 +626,8 @@ NAN_METHOD(BigNum::Bneg)
|
|
620
626
|
{
|
621
627
|
BigNum *bignum = Nan::ObjectWrap::Unwrap<BigNum>(info.This());
|
622
628
|
|
623
|
-
BigNum *res = new BigNum(
|
624
|
-
BN_set_negative(
|
629
|
+
BigNum *res = new BigNum(bignum->bignum_);
|
630
|
+
BN_set_negative(res->bignum_, !BN_is_negative(res->bignum_));
|
625
631
|
|
626
632
|
WRAP_RESULT(res, result);
|
627
633
|
|
@@ -635,7 +641,7 @@ NAN_METHOD(BigNum::Bmod)
|
|
635
641
|
|
636
642
|
BigNum *bn = Nan::ObjectWrap::Unwrap<BigNum>(info[0]->ToObject());
|
637
643
|
BigNum *res = new BigNum();
|
638
|
-
BN_div(NULL,
|
644
|
+
BN_div(NULL, res->bignum_, bignum->bignum_, bn->bignum_, ctx);
|
639
645
|
|
640
646
|
WRAP_RESULT(res, result);
|
641
647
|
|
@@ -649,11 +655,11 @@ NAN_METHOD(BigNum::Umod)
|
|
649
655
|
REQ_UINT64_ARG(0, x);
|
650
656
|
BigNum *res = new BigNum();
|
651
657
|
if (sizeof(BN_ULONG) >= 8 || x <= 0xFFFFFFFFL) {
|
652
|
-
BN_set_word(
|
658
|
+
BN_set_word(res->bignum_, BN_mod_word(bignum->bignum_, x));
|
653
659
|
} else {
|
654
660
|
AutoBN_CTX ctx;
|
655
661
|
BigNum *bn = new BigNum(x);
|
656
|
-
BN_div(NULL,
|
662
|
+
BN_div(NULL, res->bignum_, bignum->bignum_, bn->bignum_, ctx);
|
657
663
|
}
|
658
664
|
|
659
665
|
WRAP_RESULT(res, result);
|
@@ -669,7 +675,7 @@ NAN_METHOD(BigNum::Bpowm)
|
|
669
675
|
BigNum *bn1 = Nan::ObjectWrap::Unwrap<BigNum>(info[0]->ToObject());
|
670
676
|
BigNum *bn2 = Nan::ObjectWrap::Unwrap<BigNum>(info[1]->ToObject());
|
671
677
|
BigNum *res = new BigNum();
|
672
|
-
BN_mod_exp(
|
678
|
+
BN_mod_exp(res->bignum_, bignum->bignum_, bn1->bignum_, bn2->bignum_, ctx);
|
673
679
|
|
674
680
|
WRAP_RESULT(res, result);
|
675
681
|
|
@@ -686,7 +692,7 @@ NAN_METHOD(BigNum::Upowm)
|
|
686
692
|
BigNum *exp = new BigNum(x);
|
687
693
|
|
688
694
|
BigNum *res = new BigNum();
|
689
|
-
BN_mod_exp(
|
695
|
+
BN_mod_exp(res->bignum_, bignum->bignum_, exp->bignum_, bn->bignum_, ctx);
|
690
696
|
|
691
697
|
WRAP_RESULT(res, result);
|
692
698
|
|
@@ -702,7 +708,7 @@ NAN_METHOD(BigNum::Upow)
|
|
702
708
|
BigNum *exp = new BigNum(x);
|
703
709
|
|
704
710
|
BigNum *res = new BigNum();
|
705
|
-
BN_exp(
|
711
|
+
BN_exp(res->bignum_, bignum->bignum_, exp->bignum_, ctx);
|
706
712
|
|
707
713
|
WRAP_RESULT(res, result);
|
708
714
|
|
@@ -715,7 +721,7 @@ NAN_METHOD(BigNum::Brand0)
|
|
715
721
|
|
716
722
|
BigNum *res = new BigNum();
|
717
723
|
|
718
|
-
BN_rand_range(
|
724
|
+
BN_rand_range(res->bignum_, bignum->bignum_);
|
719
725
|
|
720
726
|
WRAP_RESULT(res, result);
|
721
727
|
|
@@ -729,7 +735,7 @@ NAN_METHOD(BigNum::Uprime0)
|
|
729
735
|
|
730
736
|
BigNum *res = new BigNum();
|
731
737
|
|
732
|
-
BN_generate_prime_ex(
|
738
|
+
BN_generate_prime_ex(res->bignum_, x, safe, NULL, NULL, NULL);
|
733
739
|
|
734
740
|
WRAP_RESULT(res, result);
|
735
741
|
|
@@ -743,7 +749,7 @@ NAN_METHOD(BigNum::Probprime)
|
|
743
749
|
|
744
750
|
REQ_UINT32_ARG(0, reps);
|
745
751
|
|
746
|
-
info.GetReturnValue().Set(Nan::New<Number>(BN_is_prime_ex(
|
752
|
+
info.GetReturnValue().Set(Nan::New<Number>(BN_is_prime_ex(bignum->bignum_, reps, ctx, NULL)));
|
747
753
|
}
|
748
754
|
|
749
755
|
NAN_METHOD(BigNum::IsBitSet)
|
@@ -752,7 +758,7 @@ NAN_METHOD(BigNum::IsBitSet)
|
|
752
758
|
|
753
759
|
REQ_UINT32_ARG(0, n);
|
754
760
|
|
755
|
-
info.GetReturnValue().Set(Nan::New<Number>(BN_is_bit_set(
|
761
|
+
info.GetReturnValue().Set(Nan::New<Number>(BN_is_bit_set(bignum->bignum_, n)));
|
756
762
|
}
|
757
763
|
|
758
764
|
NAN_METHOD(BigNum::Bcompare)
|
@@ -761,7 +767,7 @@ NAN_METHOD(BigNum::Bcompare)
|
|
761
767
|
|
762
768
|
BigNum *bn = Nan::ObjectWrap::Unwrap<BigNum>(info[0]->ToObject());
|
763
769
|
|
764
|
-
info.GetReturnValue().Set(Nan::New<Number>(BN_cmp(
|
770
|
+
info.GetReturnValue().Set(Nan::New<Number>(BN_cmp(bignum->bignum_, bn->bignum_)));
|
765
771
|
}
|
766
772
|
|
767
773
|
NAN_METHOD(BigNum::Scompare)
|
@@ -770,7 +776,7 @@ NAN_METHOD(BigNum::Scompare)
|
|
770
776
|
|
771
777
|
REQ_INT64_ARG(0, x);
|
772
778
|
BigNum *bn = new BigNum(x);
|
773
|
-
int res = BN_cmp(
|
779
|
+
int res = BN_cmp(bignum->bignum_, bn->bignum_);
|
774
780
|
|
775
781
|
info.GetReturnValue().Set(Nan::New<Number>(res));
|
776
782
|
}
|
@@ -782,14 +788,13 @@ NAN_METHOD(BigNum::Ucompare)
|
|
782
788
|
REQ_UINT64_ARG(0, x);
|
783
789
|
int res;
|
784
790
|
if (sizeof(BN_ULONG) >= 8 || x <= 0xFFFFFFFFL) {
|
785
|
-
BIGNUM bn;
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
BN_clear_free(&bn);
|
791
|
+
BIGNUM* bn = BN_new();
|
792
|
+
BN_set_word(bn, x);
|
793
|
+
res = BN_cmp(bignum->bignum_, bn);
|
794
|
+
BN_clear_free(bn);
|
790
795
|
} else {
|
791
796
|
BigNum *bn = new BigNum(x);
|
792
|
-
res = BN_cmp(
|
797
|
+
res = BN_cmp(bignum->bignum_, bn->bignum_);
|
793
798
|
}
|
794
799
|
|
795
800
|
info.GetReturnValue().Set(Nan::New<Number>(res));
|
@@ -892,8 +897,8 @@ BigNum::Bop(Nan::NAN_METHOD_ARGS_TYPE info, int op)
|
|
892
897
|
BigNum *bignum = Nan::ObjectWrap::Unwrap<BigNum>(info.This());
|
893
898
|
BigNum *bn = Nan::ObjectWrap::Unwrap<BigNum>(info[0]->ToObject());
|
894
899
|
|
895
|
-
bool bignumNegative = BN_is_negative(
|
896
|
-
bool bnNegative = BN_is_negative(
|
900
|
+
bool bignumNegative = BN_is_negative(bignum->bignum_);
|
901
|
+
bool bnNegative = BN_is_negative(bn->bignum_);
|
897
902
|
|
898
903
|
BigNum *res = new BigNum();
|
899
904
|
|
@@ -901,8 +906,8 @@ BigNum::Bop(Nan::NAN_METHOD_ARGS_TYPE info, int op)
|
|
901
906
|
// Portions Copyright (c) Agora S.A.
|
902
907
|
// Licensed under the MIT License.
|
903
908
|
|
904
|
-
int payloadSize = BN_bn2mpi(
|
905
|
-
int maskSize = BN_bn2mpi(
|
909
|
+
int payloadSize = BN_bn2mpi(bignum->bignum_, NULL);
|
910
|
+
int maskSize = BN_bn2mpi(bn->bignum_, NULL);
|
906
911
|
|
907
912
|
uint32_t size = max(payloadSize, maskSize);
|
908
913
|
int offset = abs(payloadSize - maskSize);
|
@@ -919,8 +924,8 @@ BigNum::Bop(Nan::NAN_METHOD_ARGS_TYPE info, int op)
|
|
919
924
|
uint8_t* payload = (uint8_t*) calloc(size, sizeof(char));
|
920
925
|
uint8_t* mask = (uint8_t*) calloc(size, sizeof(char));
|
921
926
|
|
922
|
-
BN_bn2mpi(
|
923
|
-
BN_bn2mpi(
|
927
|
+
BN_bn2mpi(bignum->bignum_, payload + payloadOffset);
|
928
|
+
BN_bn2mpi(bn->bignum_, mask + maskOffset);
|
924
929
|
|
925
930
|
if (payloadSize < maskSize) {
|
926
931
|
shiftSizeAndMSB(payload, mask, payloadOffset);
|
@@ -989,7 +994,7 @@ BigNum::Bop(Nan::NAN_METHOD_ARGS_TYPE info, int op)
|
|
989
994
|
twos_complement2mpi(payload + BN_PAYLOAD_OFFSET, size - BN_PAYLOAD_OFFSET);
|
990
995
|
}
|
991
996
|
|
992
|
-
BN_mpi2bn(payload, size,
|
997
|
+
BN_mpi2bn(payload, size, res->bignum_);
|
993
998
|
|
994
999
|
WRAP_RESULT(res, result);
|
995
1000
|
|
@@ -1021,7 +1026,7 @@ NAN_METHOD(BigNum::Binvertm)
|
|
1021
1026
|
|
1022
1027
|
BigNum *bn = Nan::ObjectWrap::Unwrap<BigNum>(info[0]->ToObject());
|
1023
1028
|
BigNum *res = new BigNum();
|
1024
|
-
BN_mod_inverse(
|
1029
|
+
BN_mod_inverse(res->bignum_, bignum->bignum_, bn->bignum_, ctx);
|
1025
1030
|
|
1026
1031
|
WRAP_RESULT(res, result);
|
1027
1032
|
|
@@ -1042,7 +1047,7 @@ NAN_METHOD(BigNum::BitLength)
|
|
1042
1047
|
{
|
1043
1048
|
BigNum *bignum = Nan::ObjectWrap::Unwrap<BigNum>(info.This());
|
1044
1049
|
|
1045
|
-
int size = BN_num_bits(
|
1050
|
+
int size = BN_num_bits(bignum->bignum_);
|
1046
1051
|
Local<Value> result = Nan::New<Integer>(size);
|
1047
1052
|
|
1048
1053
|
info.GetReturnValue().Set(result);
|
@@ -1056,7 +1061,7 @@ NAN_METHOD(BigNum::Bgcd)
|
|
1056
1061
|
BigNum *bi = Nan::ObjectWrap::Unwrap<BigNum>(info[0]->ToObject());
|
1057
1062
|
BigNum *res = new BigNum();
|
1058
1063
|
|
1059
|
-
BN_gcd(
|
1064
|
+
BN_gcd(res->bignum_, bignum->bignum_, bi->bignum_, ctx);
|
1060
1065
|
|
1061
1066
|
WRAP_RESULT(res, result);
|
1062
1067
|
info.GetReturnValue().Set(result);
|
@@ -1070,7 +1075,7 @@ NAN_METHOD(BigNum::Bjacobi)
|
|
1070
1075
|
BigNum *bn_n = Nan::ObjectWrap::Unwrap<BigNum>(info[0]->ToObject());
|
1071
1076
|
int res = 0;
|
1072
1077
|
|
1073
|
-
if (BN_jacobi_priv(
|
1078
|
+
if (BN_jacobi_priv(bn_a->bignum_, bn_n->bignum_, &res, ctx) == -1) {
|
1074
1079
|
Nan::ThrowError("Jacobi symbol calculation failed");
|
1075
1080
|
return;
|
1076
1081
|
}
|
@@ -1082,21 +1087,21 @@ NAN_METHOD(BigNum::Bsetcompact)
|
|
1082
1087
|
{
|
1083
1088
|
BigNum *bignum = Nan::ObjectWrap::Unwrap<BigNum>(info.This());
|
1084
1089
|
|
1085
|
-
unsigned int nCompact = info[0]
|
1090
|
+
unsigned int nCompact = Nan::To<uint32_t>(info[0]).FromJust();
|
1086
1091
|
unsigned int nSize = nCompact >> 24;
|
1087
1092
|
bool fNegative =(nCompact & 0x00800000) != 0;
|
1088
1093
|
unsigned int nWord = nCompact & 0x007fffff;
|
1089
1094
|
if (nSize <= 3)
|
1090
1095
|
{
|
1091
1096
|
nWord >>= 8*(3-nSize);
|
1092
|
-
BN_set_word(
|
1097
|
+
BN_set_word(bignum->bignum_, nWord);
|
1093
1098
|
}
|
1094
1099
|
else
|
1095
1100
|
{
|
1096
|
-
BN_set_word(
|
1097
|
-
BN_lshift(
|
1101
|
+
BN_set_word(bignum->bignum_, nWord);
|
1102
|
+
BN_lshift(bignum->bignum_, bignum->bignum_, 8*(nSize-3));
|
1098
1103
|
}
|
1099
|
-
BN_set_negative(
|
1104
|
+
BN_set_negative(bignum->bignum_, fNegative);
|
1100
1105
|
|
1101
1106
|
info.GetReturnValue().Set(info.This());
|
1102
1107
|
}
|
package/binding.gyp
CHANGED
@@ -82,16 +82,6 @@
|
|
82
82
|
}
|
83
83
|
]
|
84
84
|
]
|
85
|
-
}, {
|
86
|
-
'target_name': 'action_after_build',
|
87
|
-
'type': 'none',
|
88
|
-
'dependencies': [ '<(module_name)' ],
|
89
|
-
'copies': [
|
90
|
-
{
|
91
|
-
'files': [ '<(PRODUCT_DIR)/<(module_name).node' ],
|
92
|
-
'destination': '<(module_path)'
|
93
|
-
}
|
94
|
-
]
|
95
85
|
}
|
96
86
|
]
|
97
|
-
}
|
87
|
+
}
|
package/index.js
CHANGED
@@ -1,7 +1,5 @@
|
|
1
|
-
var
|
2
|
-
var
|
3
|
-
var binPath = binary.find(path.resolve(path.join(__dirname, 'package.json')))
|
4
|
-
var bin = require(binPath)
|
1
|
+
var bin = require('bindings')('bignum')
|
2
|
+
var Buffer = require('safe-buffer').Buffer
|
5
3
|
var BigNum = bin.BigNum
|
6
4
|
|
7
5
|
module.exports = BigNum
|
@@ -28,7 +26,7 @@ BigNum.conditionArgs = function (num, base) {
|
|
28
26
|
base: 2
|
29
27
|
}
|
30
28
|
}
|
31
|
-
} else if (num.match(/e
|
29
|
+
} else if (num.match(/e-/)) { // negative exponent
|
32
30
|
return {
|
33
31
|
num: Math.floor(Number(num)).toString(),
|
34
32
|
base: base || 10
|
@@ -257,9 +255,7 @@ BigNum.prototype.rand = function (to) {
|
|
257
255
|
return this.brand0()
|
258
256
|
}
|
259
257
|
} else {
|
260
|
-
var x = BigNum.isBigNum(to)
|
261
|
-
? to.sub(this)
|
262
|
-
: BigNum(to).sub(this)
|
258
|
+
var x = BigNum.isBigNum(to) ? to.sub(this) : BigNum(to).sub(this)
|
263
259
|
return x.brand0().add(this)
|
264
260
|
}
|
265
261
|
}
|
@@ -342,7 +338,7 @@ BigNum.prototype.toBuffer = function (opts) {
|
|
342
338
|
var len = buf.length === 1 && buf[0] === 0 ? 0 : buf.length
|
343
339
|
if (buf[0] & 0x80) len++
|
344
340
|
|
345
|
-
var ret =
|
341
|
+
var ret = Buffer.alloc(4 + len)
|
346
342
|
if (len > 0) buf.copy(ret, 4 + (buf[0] & 0x80 ? 1 : 0))
|
347
343
|
if (buf[0] & 0x80) ret[4] = 0
|
348
344
|
|
@@ -377,7 +373,7 @@ BigNum.prototype.toBuffer = function (opts) {
|
|
377
373
|
var size = opts.size === 'auto' ? Math.ceil(hex.length / 2) : (opts.size || 1)
|
378
374
|
|
379
375
|
len = Math.ceil(hex.length / (2 * size)) * size
|
380
|
-
buf =
|
376
|
+
buf = Buffer.alloc(len)
|
381
377
|
|
382
378
|
// zero-pad the hex string so the chunks are all `size` long
|
383
379
|
while (hex.length < 2 * len) hex = '0' + hex
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "bignum",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.13.0",
|
4
4
|
"description": "Arbitrary-precision integer arithmetic using OpenSSL",
|
5
5
|
"main": "./index.js",
|
6
6
|
"repository": {
|
@@ -22,18 +22,23 @@
|
|
22
22
|
"url": "http://www.justmoon.net"
|
23
23
|
},
|
24
24
|
"dependencies": {
|
25
|
-
"
|
26
|
-
"
|
25
|
+
"bindings": "~1.3.0",
|
26
|
+
"nan": "~2.10.0",
|
27
|
+
"prebuild-install": "~4.0.0",
|
28
|
+
"safe-buffer": "~5.1.2"
|
27
29
|
},
|
28
30
|
"devDependencies": {
|
29
|
-
"
|
31
|
+
"prebuild": "~7.6.0",
|
32
|
+
"prebuild-ci": "~2.2.3",
|
30
33
|
"put": "~0.0.5",
|
31
|
-
"standard": "~
|
32
|
-
"tap": "~
|
34
|
+
"standard": "~11.0.1",
|
35
|
+
"tap": "~12.0.1"
|
33
36
|
},
|
34
37
|
"scripts": {
|
35
|
-
"install": "node-
|
36
|
-
"
|
38
|
+
"install": "prebuild-install || node-gyp rebuild",
|
39
|
+
"rebuild": "prebuild --compile",
|
40
|
+
"prebuild": "prebuild --all --strip --verbose",
|
41
|
+
"test": "standard && tap --timeout 120 test/*.js && prebuild-ci"
|
37
42
|
},
|
38
43
|
"binary": {
|
39
44
|
"host": "https://rvagg-node.s3-us-west-2.amazonaws.com",
|