18212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompackage org.bouncycastle.jce.spec;
28212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
38212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.math.BigInteger;
48212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.spec.ECFieldF2m;
58212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.spec.ECFieldFp;
68212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.spec.ECPoint;
78212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.spec.EllipticCurve;
88212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
98212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.math.ec.ECCurve;
108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom/**
128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * specification signifying that the curve parameters can also be
138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * referred to by name.
148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */
158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompublic class ECNamedCurveSpec
168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    extends java.security.spec.ECParameterSpec
178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{
188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private String  name;
198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private static EllipticCurve convertCurve(
218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECCurve  curve,
228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        byte[]   seed)
238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (curve instanceof ECCurve.Fp)
258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return new EllipticCurve(new ECFieldFp(((ECCurve.Fp)curve).getQ()), curve.getA().toBigInteger(), curve.getB().toBigInteger(), seed);
278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        else
298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            ECCurve.F2m curveF2m = (ECCurve.F2m)curve;
318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            int ks[];
328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            if (curveF2m.isTrinomial())
348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            {
358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                ks = new int[] { curveF2m.getK1() };
368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                return new EllipticCurve(new ECFieldF2m(curveF2m.getM(), ks), curve.getA().toBigInteger(), curve.getB().toBigInteger(), seed);
388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            }
398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            else
408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            {
418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                ks = new int[] { curveF2m.getK3(), curveF2m.getK2(), curveF2m.getK1() };
428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                return new EllipticCurve(new ECFieldF2m(curveF2m.getM(), ks), curve.getA().toBigInteger(), curve.getB().toBigInteger(), seed);
448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            }
458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private static ECPoint convertPoint(
508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        org.bouncycastle.math.ec.ECPoint  g)
518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new ECPoint(g.getX().toBigInteger(), g.getY().toBigInteger());
538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECNamedCurveSpec(
568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String                              name,
578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECCurve                             curve,
588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        org.bouncycastle.math.ec.ECPoint    g,
598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger                          n)
608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        super(convertCurve(curve, null), convertPoint(g), n, 1);
628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.name = name;
648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECNamedCurveSpec(
678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String          name,
688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        EllipticCurve   curve,
698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECPoint         g,
708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger      n)
718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        super(curve, g, n, 1);
738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.name = name;
758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECNamedCurveSpec(
788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String                              name,
798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECCurve                             curve,
808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        org.bouncycastle.math.ec.ECPoint    g,
818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger                          n,
828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger                          h)
838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        super(convertCurve(curve, null), convertPoint(g), n, h.intValue());
858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.name = name;
878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECNamedCurveSpec(
908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String          name,
918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        EllipticCurve   curve,
928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECPoint         g,
938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger      n,
948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger      h)
958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        super(curve, g, n, h.intValue());
978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.name = name;
998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1008212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECNamedCurveSpec(
1028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String                              name,
1038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECCurve                             curve,
1048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        org.bouncycastle.math.ec.ECPoint    g,
1058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger                          n,
1068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger                          h,
1078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        byte[]                              seed)
1088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        super(convertCurve(curve, seed), convertPoint(g), n, h.intValue());
1108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.name = name;
1128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
1158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * return the name of the curve the EC domain parameters belong to.
1168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
1178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public String getName()
1188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return name;
1208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
122