18212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompackage org.bouncycastle.jce.spec;
28212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
38212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.math.ec.ECCurve;
48212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.math.ec.ECPoint;
58212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
68212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.math.BigInteger;
78212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.spec.AlgorithmParameterSpec;
88212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
98212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom/**
108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * basic domain parameters for an Elliptic Curve public or private key.
118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */
128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompublic class ECParameterSpec
138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    implements AlgorithmParameterSpec
148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{
158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private ECCurve     curve;
168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private byte[]      seed;
178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private ECPoint     G;
188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private BigInteger  n;
198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private BigInteger  h;
208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECParameterSpec(
228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECCurve     curve,
238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECPoint     G,
248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger  n)
258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.curve = curve;
278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.G = G;
288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.n = n;
298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.h = BigInteger.valueOf(1);
308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.seed = null;
318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECParameterSpec(
348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECCurve     curve,
358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECPoint     G,
368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger  n,
378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger  h)
388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.curve = curve;
408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.G = G;
418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.n = n;
428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.h = h;
438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.seed = null;
448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECParameterSpec(
478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECCurve     curve,
488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECPoint     G,
498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger  n,
508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger  h,
518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        byte[]      seed)
528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.curve = curve;
548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.G = G;
558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.n = n;
568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.h = h;
578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.seed = seed;
588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * return the curve along which the base point lies.
628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @return the curve
638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECCurve getCurve()
658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return curve;
678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * return the base point we are using for these domain parameters.
718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @return the base point.
728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECPoint getG()
748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return G;
768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * return the order N of G
808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @return the order
818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public BigInteger getN()
838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return n;
858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * return the cofactor H to the order of G.
898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @return the cofactor
908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public BigInteger getH()
928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return h;
948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * return the seed used to generate this curve (if available).
988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @return the random seed
998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
1008212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public byte[] getSeed()
1018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return seed;
1038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public boolean equals(Object o)
1068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (!(o instanceof ECParameterSpec))
1088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
1098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return false;
1108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
1118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ECParameterSpec other = (ECParameterSpec)o;
1138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return this.getCurve().equals(other.getCurve()) && this.getG().equals(other.getG());
1158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public int hashCode()
1188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return this.getCurve().hashCode() ^ this.getG().hashCode();
1208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
122