react / wstein / node_modules / browserify / node_modules / crypto-browserify / node_modules / browserify-sign / verify.js
80540 views'use strict'1// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js2var parseKeys = require('parse-asn1')3var elliptic = require('elliptic')4var curves = require('./curves')5var BN = require('bn.js')6module.exports = verify78function verify (sig, hash, key, signType) {9var pub = parseKeys(key)10if (pub.type === 'ec') {11if (signType !== 'ecdsa') {12throw new Error('wrong public key type')13}14return ecVerify(sig, hash, pub)15} else if (pub.type === 'dsa') {16if (signType !== 'dsa') {17throw new Error('wrong public key type')18}19return dsaVerify(sig, hash, pub)20} else {21if (signType !== 'rsa') {22throw new Error('wrong public key type')23}24}25var len = pub.modulus.byteLength()26var pad = [ 1 ]27var padNum = 028while (hash.length + pad.length + 2 < len) {29pad.push(0xff)30padNum++31}32pad.push(0x00)33var i = -134while (++i < hash.length) {35pad.push(hash[i])36}37pad = new Buffer(pad)38var red = BN.mont(pub.modulus)39sig = new BN(sig).toRed(red)4041sig = sig.redPow(new BN(pub.publicExponent))4243sig = new Buffer(sig.fromRed().toArray())44var out = 045if (padNum < 8) {46out = 147}48len = Math.min(sig.length, pad.length)49if (sig.length !== pad.length) {50out = 151}5253i = -154while (++i < len) {55out |= (sig[i] ^ pad[i])56}57return out === 058}59function ecVerify (sig, hash, pub) {60var curveId = curves[pub.data.algorithm.curve.join('.')]61if (!curveId)62throw new Error('unknown curve ' + pub.data.algorithm.curve.join('.'))6364var curve = new elliptic.ec(curveId)6566var pubkey = pub.data.subjectPrivateKey.data67return curve.verify(hash, sig, pubkey)68}69function dsaVerify (sig, hash, pub) {70var p = pub.data.p71var q = pub.data.q72var g = pub.data.g73var y = pub.data.pub_key74var unpacked = parseKeys.signature.decode(sig, 'der')75var s = unpacked.s76var r = unpacked.r77checkValue(s, q)78checkValue(r, q)79var montq = BN.mont(q)80var montp = BN.mont(p)81var w = s.invm(q)82var v = g.toRed(montp)83.redPow(new BN(hash).mul(w).mod(q))84.fromRed()85.mul(86y.toRed(montp)87.redPow(r.mul(w).mod(q))88.fromRed()89).mod(p).mod(q)90return !v.cmp(r)91}92function checkValue (b, q) {93if (b.cmpn(0) <= 0) {94throw new Error('invalid sig')95}96if (b.cmp(q) >= q) {97throw new Error('invalid sig')98}99}100101102