18212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompackage org.bouncycastle.asn1.x9; 28212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 38212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.math.BigInteger; 48212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 58212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1EncodableVector; 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer; 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object; 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier; 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive; 108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1Sequence; 118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERSequence; 128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom/** 148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * ASN.1 def for Elliptic-Curve Field ID structure. See 158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * X9.62, for further details. 168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */ 178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompublic class X9FieldID 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Object 198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom implements X9ObjectIdentifiers 208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{ 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private ASN1ObjectIdentifier id; 224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private ASN1Primitive parameters; 238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom /** 258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * Constructor for elliptic curves over prime fields 268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * <code>F<sub>2</sub></code>. 278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * @param primeP The prime <code>p</code> defining the prime field. 288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */ 298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public X9FieldID(BigInteger primeP) 308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.id = prime_field; 324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.parameters = new ASN1Integer(primeP); 338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom /** 368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * Constructor for elliptic curves over binary fields 378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * <code>F<sub>2<sup>m</sup></sub></code>. 388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * @param m The exponent <code>m</code> of 398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * <code>F<sub>2<sup>m</sup></sub></code>. 408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * @param k1 The integer <code>k1</code> where <code>x<sup>m</sup> + 418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code> 428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * represents the reduction polynomial <code>f(z)</code>. 438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * @param k2 The integer <code>k2</code> where <code>x<sup>m</sup> + 448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code> 458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * represents the reduction polynomial <code>f(z)</code>. 468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * @param k3 The integer <code>k3</code> where <code>x<sup>m</sup> + 478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code> 488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * represents the reduction polynomial <code>f(z)</code>.. 498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */ 508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public X9FieldID(int m, int k1, int k2, int k3) 518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.id = characteristic_two_field; 538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ASN1EncodableVector fieldIdParams = new ASN1EncodableVector(); 544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom fieldIdParams.add(new ASN1Integer(m)); 558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (k2 == 0) 578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom fieldIdParams.add(tpBasis); 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom fieldIdParams.add(new ASN1Integer(k1)); 608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom else 628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom fieldIdParams.add(ppBasis); 648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ASN1EncodableVector pentanomialParams = new ASN1EncodableVector(); 654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom pentanomialParams.add(new ASN1Integer(k1)); 664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom pentanomialParams.add(new ASN1Integer(k2)); 674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom pentanomialParams.add(new ASN1Integer(k3)); 688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom fieldIdParams.add(new DERSequence(pentanomialParams)); 698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.parameters = new DERSequence(fieldIdParams); 728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public X9FieldID( 758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ASN1Sequence seq) 768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.id = (ASN1ObjectIdentifier)seq.getObjectAt(0); 784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.parameters = (ASN1Primitive)seq.getObjectAt(1); 798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1ObjectIdentifier getIdentifier() 828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return id; 848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Primitive getParameters() 878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return parameters; 898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom /** 928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * Produce a DER encoding of the following structure. 938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * <pre> 948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * FieldID ::= SEQUENCE { 958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * fieldType FIELD-ID.&id({IOSet}), 968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * parameters FIELD-ID.&Type({IOSet}{@fieldType}) 978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * } 988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * </pre> 998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */ 1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Primitive toASN1Primitive() 1018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ASN1EncodableVector v = new ASN1EncodableVector(); 1038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom v.add(this.id); 1058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom v.add(this.parameters); 1068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return new DERSequence(v); 1088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom} 110