18212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompackage org.bouncycastle.asn1.x9;
28212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
38212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.math.BigInteger;
48212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
68212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1OctetString;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
88212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DEROctetString;
98212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.math.ec.ECFieldElement;
108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom/**
128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * class for processing an FieldElement as a DER object.
138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */
148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompublic class X9FieldElement
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{
178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected ECFieldElement  f;
188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private static X9IntegerConverter converter = new X9IntegerConverter();
208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public X9FieldElement(ECFieldElement f)
228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.f = f;
248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public X9FieldElement(BigInteger p, ASN1OctetString s)
278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this(new ECFieldElement.Fp(p, new BigInteger(1, s.getOctets())));
298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public X9FieldElement(int m, int k1, int k2, int k3, ASN1OctetString s)
328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this(new ECFieldElement.F2m(m, k1, k2, k3, new BigInteger(1, s.getOctets())));
348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECFieldElement getValue()
378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return f;
398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * Produce an object suitable for an ASN1OutputStream.
438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * <pre>
448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     *  FieldElement ::= OCTET STRING
458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * </pre>
468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * <p>
478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * <ol>
488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * <li> if <i>q</i> is an odd prime then the field element is
498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * processed as an Integer and converted to an octet string
508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * according to x 9.62 4.3.1.</li>
518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * <li> if <i>q</i> is 2<sup>m</sup> then the bit string
528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * contained in the field element is converted into an octet
538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * string with the same ordering padded at the front if necessary.
548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * </li>
558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * </ol>
568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        int byteCount = converter.getByteLength(f);
608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        byte[] paddedBigInteger = converter.integerToBytes(f.toBigInteger(), byteCount);
618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new DEROctetString(paddedBigInteger);
638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
65