Excepción / suspensión de la generación de keys Mono.Security Diffie-Helman para SSH Transport

Estoy tratando de empujar a través de SSH en NGit. Estoy especificando mis propias keys usando el método establecido aquí: NGit haciendo una connection con un file de key privada

Funciona bien con un clon y en el primer impulso. Después de eso, falla el 30% del time, siempre en este método en Mono. Seguridad:

Mono.Security.dll!Mono.Math.BigInteger.Kernel.MinusEq(Mono.Math.BigInteger big, Mono.Math.BigInteger small) 

O falla con el post: "Ocurrió un error durante una function criptográfica", o se cuelga indefinidamente en esta function. De nuevo, parece completamente aleatorio si tiene éxito o no. Lo está llamando por function en NGit:

 DiffieHellmanManaged dh = new DiffieHellmanManaged (pspec.P.GetBytes (), pspec.G.GetBytes (), 0); 

en GenerateKeyPair (KeyPairGenerator.cs)

¿Algunas ideas? Si no, ¿hay alguna forma de generar las keys Diffie-Helman a través de algún otro método?

Muchas gracias,

Aclamaciones,

ACTUALIZACIÓN: he descubierto una solución extraña que no entiendo del todo:

Previamente, creé un nuevo hilo, como lo llamaba desde la interfaz de usuario y no quería que se cuelgue. Este fue un hilo STA, ya que estamos construyendo una aplicación VSTO y no es compatible con MTA / BackgroundWorker () etc. de los componentes de la interfaz de usuario (lo que te limita prácticamente al antiguo Thread (), ya que puedes especificar que es STA según sea necesario ) Descubrí que el problema sucedía con más frecuencia cuando el usuario hacía clic mientras la inserción estaba en progreso (lo que hacía algunas comprobaciones de git), así que deshabilité el subprocess y lo ejecuté directamente desde la UI. Desde entonces, congela la IU como el infierno, pero no se cuelga en el cálculo de BigInt. Estoy completamente perplejo sobre cómo es este el caso a less que: Office (para el cual estamos creando complementos) de alguna manera no proporcione un hilo con suficiente memory para los cálculos de BigInt (o no administre correctamente esta memory, lo que no sería del todo sorprendente) , o, por alguna razón, los cálculos de BigInt simplemente no se pueden llamar en un context de subprocesss (quizás Thread-> Ngit-> Sharpen-> Mono.Security-> Mono.Math ( número de 32 dígitos ) se rompió?)

¿Alguna idea de lo que podría ser la causa de esto?

Tuve exactamente los mismos problemas cuando uso la key privada NGit + SSH para search / extraer desde un repository de Git, que podría solicitarse desde varios subprocesss.

Lo encontré como un problema con Mono.Security Mono.Math.BigInteger cuando se ejecuta en un context de subprocesss múltiples (el informe de errores y el código para replicarlo se pueden encontrar aquí ). Aunque por alguna razón solo pude replicar el problema en un entorno Windows. En Mono en OSX, parecía funcionar bien.

Para solucionarlo, terminé cambiando NSch para usar una implementación modificada de DiffieHellmanManaged que calculó el ModPow en BigIntegers usando la misma lógica que System.Numerics.BigInteger .

 public static BigInteger ModPower(this BigInteger value, BigInteger exp, BigInteger n) { if (exp < 0) throw new ArgumentOutOfRangeException("exponent", "power must be >= 0"); if (n == 0) throw new DivideByZeroException(); BigInteger result = new BigInteger(1) % n; while (exp != 0) { if (exp % 2 != 0) { result = result * value; result = result % n; } if (exp == 1) break; value = value * value; value = value % n; exp >>= 1; } return result; }