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