111975162f2da08e65157d37cd272721485f2b34bSergio Giropackage org.bouncycastle.jcajce.provider.asymmetric.ec; 211975162f2da08e65157d37cd272721485f2b34bSergio Giro 34caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giroimport java.math.BigInteger; 44caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giroimport java.security.InvalidKeyException; 54caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giroimport java.security.PublicKey; 611975162f2da08e65157d37cd272721485f2b34bSergio Giroimport java.security.spec.ECGenParameterSpec; 74caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giroimport java.security.spec.ECParameterSpec; 811975162f2da08e65157d37cd272721485f2b34bSergio Giro 911975162f2da08e65157d37cd272721485f2b34bSergio Giroimport org.bouncycastle.asn1.ASN1ObjectIdentifier; 104caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giroimport org.bouncycastle.asn1.DERNull; 114caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giroimport org.bouncycastle.asn1.x9.X962Parameters; 1211975162f2da08e65157d37cd272721485f2b34bSergio Giroimport org.bouncycastle.asn1.x9.X9ECParameters; 134caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giroimport org.bouncycastle.crypto.params.AsymmetricKeyParameter; 144caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giroimport org.bouncycastle.jcajce.provider.asymmetric.util.EC5Util; 1511975162f2da08e65157d37cd272721485f2b34bSergio Giroimport org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil; 164caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giroimport org.bouncycastle.jce.spec.ECNamedCurveSpec; 174caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giroimport org.bouncycastle.math.ec.ECCurve; 1811975162f2da08e65157d37cd272721485f2b34bSergio Giro 1911975162f2da08e65157d37cd272721485f2b34bSergio Giroclass ECUtils 2011975162f2da08e65157d37cd272721485f2b34bSergio Giro{ 214caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro static AsymmetricKeyParameter generatePublicKeyParameter( 224caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro PublicKey key) 234caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro throws InvalidKeyException 244caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 254caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return (key instanceof BCECPublicKey) ? ((BCECPublicKey)key).engineGetKeyParameters() : ECUtil.generatePublicKeyParameter(key); 264caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 274caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 2811975162f2da08e65157d37cd272721485f2b34bSergio Giro static X9ECParameters getDomainParametersFromGenSpec(ECGenParameterSpec genSpec) 2911975162f2da08e65157d37cd272721485f2b34bSergio Giro { 3011975162f2da08e65157d37cd272721485f2b34bSergio Giro return getDomainParametersFromName(genSpec.getName()); 3111975162f2da08e65157d37cd272721485f2b34bSergio Giro } 3211975162f2da08e65157d37cd272721485f2b34bSergio Giro 3311975162f2da08e65157d37cd272721485f2b34bSergio Giro static X9ECParameters getDomainParametersFromName(String curveName) 3411975162f2da08e65157d37cd272721485f2b34bSergio Giro { 3511975162f2da08e65157d37cd272721485f2b34bSergio Giro X9ECParameters domainParameters; 3611975162f2da08e65157d37cd272721485f2b34bSergio Giro try 3711975162f2da08e65157d37cd272721485f2b34bSergio Giro { 3811975162f2da08e65157d37cd272721485f2b34bSergio Giro if (curveName.charAt(0) >= '0' && curveName.charAt(0) <= '2') 3911975162f2da08e65157d37cd272721485f2b34bSergio Giro { 4011975162f2da08e65157d37cd272721485f2b34bSergio Giro ASN1ObjectIdentifier oidID = new ASN1ObjectIdentifier(curveName); 4111975162f2da08e65157d37cd272721485f2b34bSergio Giro domainParameters = ECUtil.getNamedCurveByOid(oidID); 4211975162f2da08e65157d37cd272721485f2b34bSergio Giro } 4311975162f2da08e65157d37cd272721485f2b34bSergio Giro else 4411975162f2da08e65157d37cd272721485f2b34bSergio Giro { 4511975162f2da08e65157d37cd272721485f2b34bSergio Giro if (curveName.indexOf(' ') > 0) 4611975162f2da08e65157d37cd272721485f2b34bSergio Giro { 4711975162f2da08e65157d37cd272721485f2b34bSergio Giro curveName = curveName.substring(curveName.indexOf(' ') + 1); 4811975162f2da08e65157d37cd272721485f2b34bSergio Giro domainParameters = ECUtil.getNamedCurveByName(curveName); 4911975162f2da08e65157d37cd272721485f2b34bSergio Giro } 5011975162f2da08e65157d37cd272721485f2b34bSergio Giro else 5111975162f2da08e65157d37cd272721485f2b34bSergio Giro { 5211975162f2da08e65157d37cd272721485f2b34bSergio Giro domainParameters = ECUtil.getNamedCurveByName(curveName); 5311975162f2da08e65157d37cd272721485f2b34bSergio Giro } 5411975162f2da08e65157d37cd272721485f2b34bSergio Giro } 5511975162f2da08e65157d37cd272721485f2b34bSergio Giro } 5611975162f2da08e65157d37cd272721485f2b34bSergio Giro catch (IllegalArgumentException ex) 5711975162f2da08e65157d37cd272721485f2b34bSergio Giro { 5811975162f2da08e65157d37cd272721485f2b34bSergio Giro domainParameters = ECUtil.getNamedCurveByName(curveName); 5911975162f2da08e65157d37cd272721485f2b34bSergio Giro } 6011975162f2da08e65157d37cd272721485f2b34bSergio Giro return domainParameters; 6111975162f2da08e65157d37cd272721485f2b34bSergio Giro } 624caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 634caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro static X962Parameters getDomainParametersFromName(ECParameterSpec ecSpec, boolean withCompression) 644caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 654caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro X962Parameters params; 664caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 674caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (ecSpec instanceof ECNamedCurveSpec) 684caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 694caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro ASN1ObjectIdentifier curveOid = ECUtil.getNamedCurveOid(((ECNamedCurveSpec)ecSpec).getName()); 704caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (curveOid == null) 714caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 724caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro curveOid = new ASN1ObjectIdentifier(((ECNamedCurveSpec)ecSpec).getName()); 734caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 744caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro params = new X962Parameters(curveOid); 754caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 764caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro else if (ecSpec == null) 774caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 784caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro params = new X962Parameters(DERNull.INSTANCE); 794caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 804caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro else 814caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 824caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro ECCurve curve = EC5Util.convertCurve(ecSpec.getCurve()); 834caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 844caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro X9ECParameters ecP = new X9ECParameters( 854caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro curve, 864caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro EC5Util.convertPoint(curve, ecSpec.getGenerator(), withCompression), 874caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro ecSpec.getOrder(), 884caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro BigInteger.valueOf(ecSpec.getCofactor()), 894caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro ecSpec.getCurve().getSeed()); 904caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 914caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro params = new X962Parameters(ecP); 924caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 934caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 944caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return params; 954caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 9611975162f2da08e65157d37cd272721485f2b34bSergio Giro} 97