1 line
9.6 KiB
JSON
1 line
9.6 KiB
JSON
{"ast":null,"code":"// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js\nvar Buffer = require('safe-buffer').Buffer;\n\nvar BN = require('bn.js');\n\nvar EC = require('elliptic').ec;\n\nvar parseKeys = require('parse-asn1');\n\nvar curves = require('./curves.json');\n\nfunction verify(sig, hash, key, signType, tag) {\n var pub = parseKeys(key);\n\n if (pub.type === 'ec') {\n // rsa keys can be interpreted as ecdsa ones in openssl\n if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type');\n return ecVerify(sig, hash, pub);\n } else if (pub.type === 'dsa') {\n if (signType !== 'dsa') throw new Error('wrong public key type');\n return dsaVerify(sig, hash, pub);\n } else {\n if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type');\n }\n\n hash = Buffer.concat([tag, hash]);\n var len = pub.modulus.byteLength();\n var pad = [1];\n var padNum = 0;\n\n while (hash.length + pad.length + 2 < len) {\n pad.push(0xff);\n padNum++;\n }\n\n pad.push(0x00);\n var i = -1;\n\n while (++i < hash.length) {\n pad.push(hash[i]);\n }\n\n pad = Buffer.from(pad);\n var red = BN.mont(pub.modulus);\n sig = new BN(sig).toRed(red);\n sig = sig.redPow(new BN(pub.publicExponent));\n sig = Buffer.from(sig.fromRed().toArray());\n var out = padNum < 8 ? 1 : 0;\n len = Math.min(sig.length, pad.length);\n if (sig.length !== pad.length) out = 1;\n i = -1;\n\n while (++i < len) out |= sig[i] ^ pad[i];\n\n return out === 0;\n}\n\nfunction ecVerify(sig, hash, pub) {\n var curveId = curves[pub.data.algorithm.curve.join('.')];\n if (!curveId) throw new Error('unknown curve ' + pub.data.algorithm.curve.join('.'));\n var curve = new EC(curveId);\n var pubkey = pub.data.subjectPrivateKey.data;\n return curve.verify(hash, sig, pubkey);\n}\n\nfunction dsaVerify(sig, hash, pub) {\n var p = pub.data.p;\n var q = pub.data.q;\n var g = pub.data.g;\n var y = pub.data.pub_key;\n var unpacked = parseKeys.signature.decode(sig, 'der');\n var s = unpacked.s;\n var r = unpacked.r;\n checkValue(s, q);\n checkValue(r, q);\n var montp = BN.mont(p);\n var w = s.invm(q);\n var v = g.toRed(montp).redPow(new BN(hash).mul(w).mod(q)).fromRed().mul(y.toRed(montp).redPow(r.mul(w).mod(q)).fromRed()).mod(p).mod(q);\n return v.cmp(r) === 0;\n}\n\nfunction checkValue(b, q) {\n if (b.cmpn(0) <= 0) throw new Error('invalid sig');\n if (b.cmp(q) >= q) throw new Error('invalid sig');\n}\n\nmodule.exports = verify;","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/browserify-sign/browser/verify.js"],"names":["Buffer","require","BN","EC","ec","parseKeys","curves","verify","sig","hash","key","signType","tag","pub","type","Error","ecVerify","dsaVerify","concat","len","modulus","byteLength","pad","padNum","length","push","i","from","red","mont","toRed","redPow","publicExponent","fromRed","toArray","out","Math","min","curveId","data","algorithm","curve","join","pubkey","subjectPrivateKey","p","q","g","y","pub_key","unpacked","signature","decode","s","r","checkValue","montp","w","invm","v","mul","mod","cmp","b","cmpn","module","exports"],"mappings":"AAAA;AACA,IAAIA,MAAM,GAAGC,OAAO,CAAC,aAAD,CAAP,CAAuBD,MAApC;;AACA,IAAIE,EAAE,GAAGD,OAAO,CAAC,OAAD,CAAhB;;AACA,IAAIE,EAAE,GAAGF,OAAO,CAAC,UAAD,CAAP,CAAoBG,EAA7B;;AACA,IAAIC,SAAS,GAAGJ,OAAO,CAAC,YAAD,CAAvB;;AACA,IAAIK,MAAM,GAAGL,OAAO,CAAC,eAAD,CAApB;;AAEA,SAASM,MAAT,CAAiBC,GAAjB,EAAsBC,IAAtB,EAA4BC,GAA5B,EAAiCC,QAAjC,EAA2CC,GAA3C,EAAgD;AAC9C,MAAIC,GAAG,GAAGR,SAAS,CAACK,GAAD,CAAnB;;AACA,MAAIG,GAAG,CAACC,IAAJ,KAAa,IAAjB,EAAuB;AACrB;AACA,QAAIH,QAAQ,KAAK,OAAb,IAAwBA,QAAQ,KAAK,WAAzC,EAAsD,MAAM,IAAII,KAAJ,CAAU,uBAAV,CAAN;AACtD,WAAOC,QAAQ,CAACR,GAAD,EAAMC,IAAN,EAAYI,GAAZ,CAAf;AACD,GAJD,MAIO,IAAIA,GAAG,CAACC,IAAJ,KAAa,KAAjB,EAAwB;AAC7B,QAAIH,QAAQ,KAAK,KAAjB,EAAwB,MAAM,IAAII,KAAJ,CAAU,uBAAV,CAAN;AACxB,WAAOE,SAAS,CAACT,GAAD,EAAMC,IAAN,EAAYI,GAAZ,CAAhB;AACD,GAHM,MAGA;AACL,QAAIF,QAAQ,KAAK,KAAb,IAAsBA,QAAQ,KAAK,WAAvC,EAAoD,MAAM,IAAII,KAAJ,CAAU,uBAAV,CAAN;AACrD;;AACDN,EAAAA,IAAI,GAAGT,MAAM,CAACkB,MAAP,CAAc,CAACN,GAAD,EAAMH,IAAN,CAAd,CAAP;AACA,MAAIU,GAAG,GAAGN,GAAG,CAACO,OAAJ,CAAYC,UAAZ,EAAV;AACA,MAAIC,GAAG,GAAG,CAAC,CAAD,CAAV;AACA,MAAIC,MAAM,GAAG,CAAb;;AACA,SAAOd,IAAI,CAACe,MAAL,GAAcF,GAAG,CAACE,MAAlB,GAA2B,CAA3B,GAA+BL,GAAtC,EAA2C;AACzCG,IAAAA,GAAG,CAACG,IAAJ,CAAS,IAAT;AACAF,IAAAA,MAAM;AACP;;AACDD,EAAAA,GAAG,CAACG,IAAJ,CAAS,IAAT;AACA,MAAIC,CAAC,GAAG,CAAC,CAAT;;AACA,SAAO,EAAEA,CAAF,GAAMjB,IAAI,CAACe,MAAlB,EAA0B;AACxBF,IAAAA,GAAG,CAACG,IAAJ,CAAShB,IAAI,CAACiB,CAAD,CAAb;AACD;;AACDJ,EAAAA,GAAG,GAAGtB,MAAM,CAAC2B,IAAP,CAAYL,GAAZ,CAAN;AACA,MAAIM,GAAG,GAAG1B,EAAE,CAAC2B,IAAH,CAAQhB,GAAG,CAACO,OAAZ,CAAV;AACAZ,EAAAA,GAAG,GAAG,IAAIN,EAAJ,CAAOM,GAAP,EAAYsB,KAAZ,CAAkBF,GAAlB,CAAN;AAEApB,EAAAA,GAAG,GAAGA,GAAG,CAACuB,MAAJ,CAAW,IAAI7B,EAAJ,CAAOW,GAAG,CAACmB,cAAX,CAAX,CAAN;AACAxB,EAAAA,GAAG,GAAGR,MAAM,CAAC2B,IAAP,CAAYnB,GAAG,CAACyB,OAAJ,GAAcC,OAAd,EAAZ,CAAN;AACA,MAAIC,GAAG,GAAGZ,MAAM,GAAG,CAAT,GAAa,CAAb,GAAiB,CAA3B;AACAJ,EAAAA,GAAG,GAAGiB,IAAI,CAACC,GAAL,CAAS7B,GAAG,CAACgB,MAAb,EAAqBF,GAAG,CAACE,MAAzB,CAAN;AACA,MAAIhB,GAAG,CAACgB,MAAJ,KAAeF,GAAG,CAACE,MAAvB,EAA+BW,GAAG,GAAG,CAAN;AAE/BT,EAAAA,CAAC,GAAG,CAAC,CAAL;;AACA,SAAO,EAAEA,CAAF,GAAMP,GAAb,EAAkBgB,GAAG,IAAI3B,GAAG,CAACkB,CAAD,CAAH,GAASJ,GAAG,CAACI,CAAD,CAAnB;;AAClB,SAAOS,GAAG,KAAK,CAAf;AACD;;AAED,SAASnB,QAAT,CAAmBR,GAAnB,EAAwBC,IAAxB,EAA8BI,GAA9B,EAAmC;AACjC,MAAIyB,OAAO,GAAGhC,MAAM,CAACO,GAAG,CAAC0B,IAAJ,CAASC,SAAT,CAAmBC,KAAnB,CAAyBC,IAAzB,CAA8B,GAA9B,CAAD,CAApB;AACA,MAAI,CAACJ,OAAL,EAAc,MAAM,IAAIvB,KAAJ,CAAU,mBAAmBF,GAAG,CAAC0B,IAAJ,CAASC,SAAT,CAAmBC,KAAnB,CAAyBC,IAAzB,CAA8B,GAA9B,CAA7B,CAAN;AAEd,MAAID,KAAK,GAAG,IAAItC,EAAJ,CAAOmC,OAAP,CAAZ;AACA,MAAIK,MAAM,GAAG9B,GAAG,CAAC0B,IAAJ,CAASK,iBAAT,CAA2BL,IAAxC;AAEA,SAAOE,KAAK,CAAClC,MAAN,CAAaE,IAAb,EAAmBD,GAAnB,EAAwBmC,MAAxB,CAAP;AACD;;AAED,SAAS1B,SAAT,CAAoBT,GAApB,EAAyBC,IAAzB,EAA+BI,GAA/B,EAAoC;AAClC,MAAIgC,CAAC,GAAGhC,GAAG,CAAC0B,IAAJ,CAASM,CAAjB;AACA,MAAIC,CAAC,GAAGjC,GAAG,CAAC0B,IAAJ,CAASO,CAAjB;AACA,MAAIC,CAAC,GAAGlC,GAAG,CAAC0B,IAAJ,CAASQ,CAAjB;AACA,MAAIC,CAAC,GAAGnC,GAAG,CAAC0B,IAAJ,CAASU,OAAjB;AACA,MAAIC,QAAQ,GAAG7C,SAAS,CAAC8C,SAAV,CAAoBC,MAApB,CAA2B5C,GAA3B,EAAgC,KAAhC,CAAf;AACA,MAAI6C,CAAC,GAAGH,QAAQ,CAACG,CAAjB;AACA,MAAIC,CAAC,GAAGJ,QAAQ,CAACI,CAAjB;AACAC,EAAAA,UAAU,CAACF,CAAD,EAAIP,CAAJ,CAAV;AACAS,EAAAA,UAAU,CAACD,CAAD,EAAIR,CAAJ,CAAV;AACA,MAAIU,KAAK,GAAGtD,EAAE,CAAC2B,IAAH,CAAQgB,CAAR,CAAZ;AACA,MAAIY,CAAC,GAAGJ,CAAC,CAACK,IAAF,CAAOZ,CAAP,CAAR;AACA,MAAIa,CAAC,GAAGZ,CAAC,CAACjB,KAAF,CAAQ0B,KAAR,EACLzB,MADK,CACE,IAAI7B,EAAJ,CAAOO,IAAP,EAAamD,GAAb,CAAiBH,CAAjB,EAAoBI,GAApB,CAAwBf,CAAxB,CADF,EAELb,OAFK,GAGL2B,GAHK,CAGDZ,CAAC,CAAClB,KAAF,CAAQ0B,KAAR,EAAezB,MAAf,CAAsBuB,CAAC,CAACM,GAAF,CAAMH,CAAN,EAASI,GAAT,CAAaf,CAAb,CAAtB,EAAuCb,OAAvC,EAHC,EAIL4B,GAJK,CAIDhB,CAJC,EAKLgB,GALK,CAKDf,CALC,CAAR;AAMA,SAAOa,CAAC,CAACG,GAAF,CAAMR,CAAN,MAAa,CAApB;AACD;;AAED,SAASC,UAAT,CAAqBQ,CAArB,EAAwBjB,CAAxB,EAA2B;AACzB,MAAIiB,CAAC,CAACC,IAAF,CAAO,CAAP,KAAa,CAAjB,EAAoB,MAAM,IAAIjD,KAAJ,CAAU,aAAV,CAAN;AACpB,MAAIgD,CAAC,CAACD,GAAF,CAAMhB,CAAN,KAAYA,CAAhB,EAAmB,MAAM,IAAI/B,KAAJ,CAAU,aAAV,CAAN;AACpB;;AAEDkD,MAAM,CAACC,OAAP,GAAiB3D,MAAjB","sourcesContent":["// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js\nvar Buffer = require('safe-buffer').Buffer\nvar BN = require('bn.js')\nvar EC = require('elliptic').ec\nvar parseKeys = require('parse-asn1')\nvar curves = require('./curves.json')\n\nfunction verify (sig, hash, key, signType, tag) {\n var pub = parseKeys(key)\n if (pub.type === 'ec') {\n // rsa keys can be interpreted as ecdsa ones in openssl\n if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type')\n return ecVerify(sig, hash, pub)\n } else if (pub.type === 'dsa') {\n if (signType !== 'dsa') throw new Error('wrong public key type')\n return dsaVerify(sig, hash, pub)\n } else {\n if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type')\n }\n hash = Buffer.concat([tag, hash])\n var len = pub.modulus.byteLength()\n var pad = [1]\n var padNum = 0\n while (hash.length + pad.length + 2 < len) {\n pad.push(0xff)\n padNum++\n }\n pad.push(0x00)\n var i = -1\n while (++i < hash.length) {\n pad.push(hash[i])\n }\n pad = Buffer.from(pad)\n var red = BN.mont(pub.modulus)\n sig = new BN(sig).toRed(red)\n\n sig = sig.redPow(new BN(pub.publicExponent))\n sig = Buffer.from(sig.fromRed().toArray())\n var out = padNum < 8 ? 1 : 0\n len = Math.min(sig.length, pad.length)\n if (sig.length !== pad.length) out = 1\n\n i = -1\n while (++i < len) out |= sig[i] ^ pad[i]\n return out === 0\n}\n\nfunction ecVerify (sig, hash, pub) {\n var curveId = curves[pub.data.algorithm.curve.join('.')]\n if (!curveId) throw new Error('unknown curve ' + pub.data.algorithm.curve.join('.'))\n\n var curve = new EC(curveId)\n var pubkey = pub.data.subjectPrivateKey.data\n\n return curve.verify(hash, sig, pubkey)\n}\n\nfunction dsaVerify (sig, hash, pub) {\n var p = pub.data.p\n var q = pub.data.q\n var g = pub.data.g\n var y = pub.data.pub_key\n var unpacked = parseKeys.signature.decode(sig, 'der')\n var s = unpacked.s\n var r = unpacked.r\n checkValue(s, q)\n checkValue(r, q)\n var montp = BN.mont(p)\n var w = s.invm(q)\n var v = g.toRed(montp)\n .redPow(new BN(hash).mul(w).mod(q))\n .fromRed()\n .mul(y.toRed(montp).redPow(r.mul(w).mod(q)).fromRed())\n .mod(p)\n .mod(q)\n return v.cmp(r) === 0\n}\n\nfunction checkValue (b, q) {\n if (b.cmpn(0) <= 0) throw new Error('invalid sig')\n if (b.cmp(q) >= q) throw new Error('invalid sig')\n}\n\nmodule.exports = verify\n"]},"metadata":{},"sourceType":"script"} |