From a8e7f04551d722cc9cdc85e5b6c4fecf660beded Mon Sep 17 00:00:00 2001 From: Alex Mizrahi Date: Mon, 30 Oct 2017 21:48:32 +0200 Subject: [PATCH] decoding negative integers, integer decoding tests --- lib/asn1/decoders/der.js | 4 ++++ test/der-decode-test.js | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/asn1/decoders/der.js b/lib/asn1/decoders/der.js index b2984aa..c8ccecf 100644 --- a/lib/asn1/decoders/der.js +++ b/lib/asn1/decoders/der.js @@ -254,6 +254,10 @@ DERNode.prototype._decodeInt = function decodeInt(buffer, values) { const raw = buffer.raw(); let res = new bignum(raw); + if ((raw[0] & 0x80) > 0) { // negative + res = res.fromTwos(raw.length * 8); + } + if (values) res = values[res.toString(10)] || res; diff --git a/test/der-decode-test.js b/test/der-decode-test.js index 9d28754..d002dd7 100644 --- a/test/der-decode-test.js +++ b/test/der-decode-test.js @@ -3,6 +3,7 @@ const assert = require('assert'); const asn1 = require('..'); +const bignum = asn1.bignum; const Buffer = require('buffer').Buffer; @@ -54,6 +55,22 @@ describe('asn1.js DER decoder', function() { }); } + it('should decode integers', function() { + const Int = asn1.define('Int', function () { this.int(); }); + const values = [ + ['020101', 1], + ['0203008011', 0x8011], + ['02020080', 128], + ['0201FF', -1], + ['020180', -128], + ['0202FF7F', -129] + ]; + values.forEach( function (v) { + const decoded = Int.decode(new Buffer(v[0], 'hex'), 'der'); + assert(decoded.eq(new bignum(v[1])), v[1]); + }); + }); + test('should decode choice', function() { this.choice({ apple: this.bool(),