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