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