diff --git a/asn1.js b/asn1.js index 4914536..2a92fda 100644 --- a/asn1.js +++ b/asn1.js @@ -128,22 +128,28 @@ Stream.prototype.parseTime = function (start, end, shortYear) { return s; }; Stream.prototype.parseInteger = function (start, end) { - var len = end - start, - v = this.get(start), + var v = this.get(start), neg = (v > 127), + pad = neg ? 255 : 0, + len, s = ''; - if (len > 6) { //TODO: this assumes DER, let's support BER too + // skip unuseful bits (not allowed in DER) + while (v == pad && start < end) + v = this.get(++start); + len = end - start; + if (len === 0) + return neg ? -1 : 0; + // show bit length of huge integers + if (len > 4) { + s = v; len <<= 3; - s = this.get(start); - if (s === 0) - len -= 8; - else - while (s < 128) { - s <<= 1; - --len; - } + while (((s ^ pad) & 0x80) == 0) { + s <<= 1; + --len; + } s = "(" + len + " bit)\n"; } + // decode the integer if (neg) v = v - 256; var n = new Int10(v); for (var i = start + 1; i < end; ++i) diff --git a/test.js b/test.js index c3cb82a..1f87bf5 100755 --- a/test.js +++ b/test.js @@ -25,6 +25,7 @@ tests = [ ['02820201009BA9ABBF614A97AF2F97669A745FD0D996FDCFE2E466EF1F1F4733C244A3DF9ADE1FB554DD157C6935116FBBC80C8E6A181ED88FD916BC1048365CF063B3905A5C2437D7A3D6CB0971B9F1017284B07DDB4D80CDFCD36FC9F8DAB60E82D24585A81B68A83DE8F4446CBDA1C2CB03BE8C3E130084DF4A48C0E3220AE8E937A7184CB1090D23567F044DD9178418A5C8DA409473EBCE0E573C03813A9D0AA1574369AC576D799078E5B5B43BD8BC4C8D28A1A7A3A7BA024E25D12AAEEDAE0322B86B200F302854957FE0EECE0A669DD1402D6E22AF9D1AC10519D26FC0F29FF87BB30242FB50A91D2D930F23ABC6C10F92FFD0A215F55309711CFF451384E6265EF8E0881C0AFC16B6A87306B8F0638402A0C65AECE774DF70AEA38325EAD6C7978793A7C68A8A33976037103E973E6E2915D6A10FD1882C129F6FAAA4C642EB41A2E39543D301856D8EBB3BF32336C7FE3BE0A1250748ABC98974FF088F80BFC09665F3EEEC4B68BD9D88C331B340F1E8CFF638BB9CE4D17FD4E5589B7CFAD4F30E9B7591E4BA522E197ED1F5CD5A19FCBA06F6FB52A84B9904DDF8F9B48B50A34E6289F08724FA8342C187FAD52D292A5A717A646AD72760630DDBCE49F58D1F90893217F87343B8D25A938661D6E1750AEA796676884F71EB0425D60A5A7A93E5B94B17400FB1B6B9F5DE4FDCE0B3AC3B117060844A436E9920C029710AC065', '(4096 bit)\n635048724432704421127930570668665246853305382538324205739741643121831497295424070220821366244137115920753022123888627038218427491681054376713237422498116573180444839575827154645186734602336866679804832661256616738257119870932328599495025506292424741581222812593482590762754785441060866630543522468678295806775919446210955958208696766307578451905771148370694894591388931494246786732600822191966681852303750991082312180670980233382216493445574638820565887523903118457551295241540793541306271618874366356869335229283992012581380459991160410157116077111142487644315609688092841697874946124416376553323373756926990721842430477982958383467149331238064901788481621489266725616974850293388387825359434286033332681714766010619113405542747712973535303497912234899589502990216128180823653963322406352206636893824027962569732222882297210841939793442415179615290739900774082858983244011679281115202763730964934473392333219986431517733237277686866318351054204026883453068392486990840498271719737813876367239342153571643327128417739316281558041652406500713712661305061745568036561978158652008943224271511931676512028205883718704503533046383542018858616087454820845906934069146870330990447993387221061968484774662499598623702280426558025111180066917', 'Big integer (4096 bit)'], + ['0202007F', '127', 'Padded 127'], ['0202FF7F', '-129', 'Negative 129'], ['0202FC18', '-1000', 'Negative 1000 (2)'], ['0204FFFFFC18', '-1000', 'Negative 1000 (4)'],