/* * // https://csharp.hotexamples.com/examples/Org.BouncyCastle.Crypto.Parameters/ECPrivateKeyParameters/-/php-ecprivatekeyparameters-class-examples.html * public ECDiffieHellmanBc(Int32 keySize) * { * Org.BouncyCastle.Asn1.X9.X9ECParameters ecParams; * switch (keySize) { * case 256: * ecParams = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp256r1"); * break; * case 384: * ecParams = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp384r1"); * break; * case 521: * ecParams = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp521r1"); * break; * default: */ // https://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xhtml // https://tools.ietf.org/html/rfc5933 private static PublicKey toECGOSTPublicKey(byte[] keyBytes, ECKeyInfo keyinfo) // throws IOException, GeneralSecurityException { DNSInput @in = new DNSInput(keyBytes); Org.BouncyCastle.Math.BigInteger x = Helpers.readBigIntegerLittleEndian(@in, keyinfo.length); Org.BouncyCastle.Math.BigInteger y = Helpers.readBigIntegerLittleEndian(@in, keyinfo.length); // OID to be found in Org.BouncyCastle.Security.GeneratorUtilities.GetKeyPairGenerator("ECGOST3410"); // Org.BouncyCastle.Crypto.Parameters.ECDomainParameters domain = Org.BouncyCastle.Asn1.CryptoPro.ECGost3410NamedCurves.GetByOid(Org.BouncyCastle.Asn1.CryptoPro.CryptoProObjectIdentifiers.GostR3410x94CryptoProA); // Org.BouncyCastle.Math.EC.ECCurve c = domain.Curve; // Org.BouncyCastle.Math.EC.ECPoint q = new Org.BouncyCastle.Math.EC.FpPoint(c, c.FromBigInteger(x), c.FromBigInteger(y)); // Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters publicParams = new Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters(q, domain); Org.BouncyCastle.Math.EC.ECPoint q = keyinfo.curve.CreatePoint(x, y); Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters publicParams = new Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters(q, keyinfo.spec); // Org.BouncyCastle.Crypto.Signers.ECGost3410Signer // Org.BouncyCastle.Security.PublicKeyFactory.CreateKey(new Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo()) /* * ECPoint q = new ECPoint(x, y); * * KeyFactory factory = KeyFactory.getInstance("ECGOST3410"); * return factory.generatePublic(new ECPublicKeySpec(q, keyinfo.spec)); */ return(PublicKey.CreateInstance(publicParams)); }
private static PublicKey toECDSAPublicKey(byte[] keyBytes, ECKeyInfo keyinfo) // throws IOException, GeneralSecurityException { DNSInput @in = new DNSInput(keyBytes); // RFC 6605 Section 4 Org.BouncyCastle.Math.BigInteger x = Helpers.readBigInteger(@in, keyinfo.length); Org.BouncyCastle.Math.BigInteger y = Helpers.readBigInteger(@in, keyinfo.length); // Org.BouncyCastle.Asn1.X9.X9ECParameters ecParams = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp521r1"); // Org.BouncyCastle.Asn1.X9.X9ECParameters ecParams = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp256r1"); // Org.BouncyCastle.Asn1.X9.X9ECParameters p = Org.BouncyCastle.Asn1.X9.X962NamedCurves.GetByOid(Org.BouncyCastle.Asn1.X9.X9ObjectIdentifiers.Prime239v1); // Org.BouncyCastle.Asn1.X9.X9ECParameters p = Org.BouncyCastle.Asn1.X9.X962NamedCurves.GetByOid(Org.BouncyCastle.Asn1.X9.X9ObjectIdentifiers.ECDsaWithSha512); // Org.BouncyCastle.Asn1.X9.X9ECParameters ecP = Org.BouncyCastle.Asn1.Nist.NistNamedCurves.GetByName("curveName"); // Org.BouncyCastle.Math.EC.FpCurve c = (Org.BouncyCastle.Math.EC.FpCurve)ecP.Curve; // Org.BouncyCastle.Asn1.X9.X9ECParameters p = Org.BouncyCastle.Asn1.X9.X962NamedCurves.GetByOid(Org.BouncyCastle.Asn1.X9.X9ObjectIdentifiers.ECDsaWithSha512); // Org.BouncyCastle.Math.EC.ECCurve c = p.Curve; // Org.BouncyCastle.Crypto.Parameters.ECDomainParameters domain = new Org.BouncyCastle.Crypto.Parameters.ECDomainParameters(c, p.G, p.N, p.H); // Org.BouncyCastle.Math.EC.ECPoint q = new Org.BouncyCastle.Math.EC.FpPoint(c, c.FromBigInteger(x), c.FromBigInteger(y)); // Org.BouncyCastle.Math.EC.ECPoint q = c.CreatePoint(x, y); // Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters publicParams = new Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters(q, domain); Org.BouncyCastle.Math.EC.ECPoint q = keyinfo.curve.CreatePoint(x, y); Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters publicParams = new Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters(q, keyinfo.spec); // Org.BouncyCastle.Security.PublicKeyFactory.CreateKey(Org.BouncyCastle.X509.SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicParams)); // Org.BouncyCastle.Security.PrivateKeyFactory.CreateKey(publicParams); // Org.BouncyCastle.Security.PrivateKeyFactory // Org.BouncyCastle.Security.PublicKeyFactory // Org.BouncyCastle.Security.PublicKeyFactory.CreateKey(new Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo()) /* * ECPoint q = new ECPoint(x, y); * * KeyFactory factory = KeyFactory.getInstance("EC"); * return factory.generatePublic(new ECPublicKeySpec(q, keyinfo.spec)); */ return(PublicKey.CreateInstance(publicParams)); }
private static byte[] fromECDSAPublicKey(ECPublicKey key, ECKeyInfo keyinfo) { DNSOutput @out = new DNSOutput(); Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters publicParams = key.PublicKey; // BigInteger x = key.getW().getAffineX(); Org.BouncyCastle.Math.BigInteger x = publicParams.Q.AffineXCoord.ToBigInteger(); // BigInteger y = key.getW().getAffineY(); Org.BouncyCastle.Math.BigInteger y = publicParams.Q.AffineYCoord.ToBigInteger(); Helpers.writePaddedBigInteger(@out, x, keyinfo.length); Helpers.writePaddedBigInteger(@out, y, keyinfo.length); return(@out.toByteArray()); }