From 48811c64e485fadb74ecf654606a31bf1f984e4b Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Wed, 24 Jul 2019 15:16:08 -0700 Subject: [PATCH 1/2] der: encode integers > 4294967295 and BigInts --- lib/asn1/encoders/der.js | 43 +++++++++++----------------------------- 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/lib/asn1/encoders/der.js b/lib/asn1/encoders/der.js index 7fc89f8..45a5a61 100644 --- a/lib/asn1/encoders/der.js +++ b/lib/asn1/encoders/der.js @@ -1,6 +1,7 @@ 'use strict'; const inherits = require('inherits'); +const BN = require('bn.js'); const Buffer = require('buffer').Buffer; const Node = require('../base/node'); @@ -194,7 +195,10 @@ DERNode.prototype._encodeInt = function encodeInt(num, values) { } // Bignum, assume big endian - if (typeof num !== 'number' && !Buffer.isBuffer(num)) { + if (!Buffer.isBuffer(num)) { + if (!BN.isBN(num)) { + num = new BN(num); + } const numArray = num.toArray(); if (!num.sign && numArray[0] & 0x80) { numArray.unshift(0); @@ -202,38 +206,15 @@ DERNode.prototype._encodeInt = function encodeInt(num, values) { num = new Buffer(numArray); } - if (Buffer.isBuffer(num)) { - let size = num.length; - if (num.length === 0) - size++; - - const out = new Buffer(size); - num.copy(out); - if (num.length === 0) - out[0] = 0; - return this._createEncoderBuffer(out); - } - - if (num < 0x80) - return this._createEncoderBuffer(num); - - if (num < 0x100) - return this._createEncoderBuffer([0, num]); - - let size = 1; - for (let i = num; i >= 0x100; i >>= 8) + let size = num.length; + if (num.length === 0) size++; - const out = new Array(size); - for (let i = out.length - 1; i >= 0; i--) { - out[i] = num & 0xff; - num >>= 8; - } - if(out[0] & 0x80) { - out.unshift(0); - } - - return this._createEncoderBuffer(new Buffer(out)); + const out = new Buffer(size); + num.copy(out); + if (num.length === 0) + out[0] = 0; + return this._createEncoderBuffer(out); }; DERNode.prototype._encodeBool = function encodeBool(value) { From 4e61ada60efebd8da61701afee0f379b3141930e Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Wed, 24 Jul 2019 15:24:06 -0700 Subject: [PATCH 2/2] der: support negative integers --- lib/asn1/decoders/der.js | 2 +- lib/asn1/encoders/der.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/asn1/decoders/der.js b/lib/asn1/decoders/der.js index c5b0515..f76fea8 100644 --- a/lib/asn1/decoders/der.js +++ b/lib/asn1/decoders/der.js @@ -253,7 +253,7 @@ DERNode.prototype._decodeBool = function decodeBool(buffer) { DERNode.prototype._decodeInt = function decodeInt(buffer, values) { // Bigint, return as it is (assume big endian) const raw = buffer.raw(); - let res = new bignum(raw); + let res = new bignum(raw).fromTwos(raw.length * 8); if (values) res = values[res.toString(10)] || res; diff --git a/lib/asn1/encoders/der.js b/lib/asn1/encoders/der.js index 45a5a61..153bfe8 100644 --- a/lib/asn1/encoders/der.js +++ b/lib/asn1/encoders/der.js @@ -199,9 +199,9 @@ DERNode.prototype._encodeInt = function encodeInt(num, values) { if (!BN.isBN(num)) { num = new BN(num); } - const numArray = num.toArray(); - if (!num.sign && numArray[0] & 0x80) { - numArray.unshift(0); + const numArray = num.toTwos(num.byteLength() * 8).toArray(); + if (num.isNeg() !== Boolean(numArray[0] & 0x80)) { + numArray.unshift(num.isNeg() ? 0xff : 0); } num = new Buffer(numArray); }