|
129 | 129 | ok(dsa2.verifyWithMessageHash(sHashHex, hSigVal), ""); |
130 | 130 | }); |
131 | 131 |
|
| 132 | +test("signWithMessageHash retries when s is zero", function() { |
| 133 | + var pSmall = new BigInteger("17", 16); |
| 134 | + var qSmall = new BigInteger("0b", 16); |
| 135 | + var gSmall = new BigInteger("04", 16); |
| 136 | + var xSmall = new BigInteger("03", 16); |
| 137 | + var ySmall = gSmall.modPow(xSmall, pSmall); |
| 138 | + var dsaPrv = new KJUR.crypto.DSA(); |
| 139 | + dsaPrv.setPrivate(pSmall, qSmall, gSmall, null, xSmall); |
| 140 | + var dsaPub = new KJUR.crypto.DSA(); |
| 141 | + dsaPub.setPublic(pSmall, qSmall, gSmall, ySmall); |
| 142 | + |
| 143 | + var kList = [new BigInteger("2", 10), new BigInteger("3", 10)]; |
| 144 | + var kIdx = 0; |
| 145 | + var fOrig = KJUR.crypto.Util.getRandomBigIntegerMinToMax; |
| 146 | + |
| 147 | + var r0 = gSmall.modPow(kList[0], pSmall).mod(qSmall); |
| 148 | + var z = qSmall.subtract(xSmall.multiply(r0).mod(qSmall)).mod(qSmall); |
| 149 | + var sHashHex = z.toString(16); |
| 150 | + |
| 151 | + KJUR.crypto.Util.getRandomBigIntegerMinToMax = function() { |
| 152 | + return kList[kIdx++]; |
| 153 | + }; |
| 154 | + |
| 155 | + try { |
| 156 | + var hSigVal = dsaPrv.signWithMessageHash(sHashHex); |
| 157 | + var rs = dsaPrv.parseASN1Signature(hSigVal); |
| 158 | + ok(kIdx >= 2, "retry with a new k"); |
| 159 | + ok(rs[0].compareTo(BigInteger.ZERO) != 0, "r != 0"); |
| 160 | + ok(rs[1].compareTo(BigInteger.ZERO) != 0, "s != 0"); |
| 161 | + ok(dsaPub.verifyWithMessageHash(sHashHex, hSigVal), "signature verifies"); |
| 162 | + } finally { |
| 163 | + KJUR.crypto.Util.getRandomBigIntegerMinToMax = fOrig; |
| 164 | + } |
| 165 | +}); |
| 166 | + |
132 | 167 | test("readPKCS5PrvKeyHex d1", function() { |
133 | 168 | var key = new KJUR.crypto.DSA(); |
134 | 169 | key.readPKCS5PrvKeyHex(D1PRVP5HEX); |
|
0 commit comments