/// <summary> /// Called by the environment to start generating of public/private keys /// </summary> public void Execute() { BigInteger p = 1, q = 1; ProgressChanged(0, 1); switch (settings.Source) { // manually enter primes case 0: try { p = BigIntegerHelper.ParseExpression(settings.P); q = BigIntegerHelper.ParseExpression(settings.Q); if (!BigIntegerHelper.IsProbablePrime(p)) { GuiLogMessage(p.ToString() + " is not prime!", NotificationLevel.Error); return; } if (!BigIntegerHelper.IsProbablePrime(q)) { GuiLogMessage(q.ToString() + " is not prime!", NotificationLevel.Error); return; } if (p == q) { GuiLogMessage("The primes P and Q can not be equal!", NotificationLevel.Error); return; } } catch (Exception ex) { GuiLogMessage("Invalid Big Number input: " + ex.Message, NotificationLevel.Error); return; } break; //randomly generated primes case 1: try { int keyBitLength = Convert.ToInt32(settings.KeyBitLength); if (keyBitLength < 4) { GuiLogMessage("The keylength must be greater than 3.", NotificationLevel.Error); return; } int i, maxtries = 10; for (i = 0; i < maxtries; i++) { p = BigIntegerHelper.RandomPrimeMSBSet(keyBitLength - (keyBitLength / 2)); q = BigIntegerHelper.RandomPrimeMSBSet(keyBitLength / 2); //GuiLogMessage("p = " + p.ToString(), NotificationLevel.Info); //GuiLogMessage("q = " + q.ToString(), NotificationLevel.Info); if (p != q) { break; } } if (i == maxtries) { throw new Exception("Could not create two differing primes"); } } catch (Exception ex) { GuiLogMessage(ex.Message, NotificationLevel.Error); return; } break; default: throw new Exception("Illegal Key Generation Mode"); } N = p * q; G = N + 1; Lambda = (p - 1) * (q - 1); ProgressChanged(1, 1); }