-
Notifications
You must be signed in to change notification settings - Fork 83
Closed
Description
Hi,
We've recently faced an issue when our JRuby app started hanging and consuming CPU while trying to connect to SFTP server and exchange keys using diffie-hellman-group-exchange-sha256 algorithm. Here is the backtrace:
java.lang.Thread.State: RUNNABLE
at java.math.MutableBigInteger.divideKnuth(MutableBigInteger.java:1227)
at java.math.MutableBigInteger.divideKnuth(MutableBigInteger.java:1163)
at java.math.MutableBigInteger.divide2n1n(MutableBigInteger.java:1316)
at java.math.MutableBigInteger.divide3n2n(MutableBigInteger.java:1362)
at java.math.MutableBigInteger.divide2n1n(MutableBigInteger.java:1330)
at java.math.MutableBigInteger.divide3n2n(MutableBigInteger.java:1362)
at java.math.MutableBigInteger.divide2n1n(MutableBigInteger.java:1326)
at java.math.MutableBigInteger.divideAndRemainderBurnikelZiegler(MutableBigInteger.java:1293)
at java.math.BigInteger.divideAndRemainderBurnikelZiegler(BigInteger.java:2293)
at java.math.BigInteger.remainderBurnikelZiegler(BigInteger.java:2282)
at java.math.BigInteger.remainder(BigInteger.java:2254)
at java.math.BigInteger.mod(BigInteger.java:2561)
at java.math.BigInteger.lucasLehmerSequence(BigInteger.java:982)
at java.math.BigInteger.passesLucasLehmer(BigInteger.java:912)
at java.math.BigInteger.primeToCertainty(BigInteger.java:892)
at java.math.BitSieve.retrieve(BitSieve.java:203)
at java.math.BigInteger.largePrime(BigInteger.java:761)
at java.math.BigInteger.<init>(BigInteger.java:667)
at org.jruby.ext.openssl.PKeyDH.generateX(PKeyDH.java:220)
at org.jruby.ext.openssl.PKeyDH.generateX(PKeyDH.java:228)
at org.jruby.ext.openssl.PKeyDH.generate_key(PKeyDH.java:246)
IIUC, it happens because current implementation tries to generate not just a random number, but a prime random number:
// adapting algorithm from org.bouncycastle.crypto.generators.DHKeyGeneratorHelper,
// which seems a little stronger (?) than OpenSSL's (OSSL just generates a random,
// while BC generates a random potential prime [for limit > 0], though it's not
// subject to Miller-Rabin [certainty = 0], but is subject to other constraints)
// see also [ossl]/crypto/dh/dh_key.c #generate_key
I'm not a cryptography expert, but maybe it's worth to make it closer to OSSL implementation and not try generating prime here?
Metadata
Metadata
Assignees
Labels
No labels