Home | History | Annotate | Download | only in ec
      1 package org.bouncycastle.jce.provider.asymmetric.ec;
      2 
      3 import java.math.BigInteger;
      4 import java.security.spec.ECField;
      5 import java.security.spec.ECFieldF2m;
      6 import java.security.spec.ECFieldFp;
      7 import java.security.spec.ECParameterSpec;
      8 import java.security.spec.ECPoint;
      9 import java.security.spec.EllipticCurve;
     10 
     11 import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
     12 import org.bouncycastle.jce.spec.ECNamedCurveSpec;
     13 import org.bouncycastle.math.ec.ECCurve;
     14 
     15 public class EC5Util
     16 {
     17     public static EllipticCurve convertCurve(
     18         ECCurve curve,
     19         byte[]  seed)
     20     {
     21         // TODO: the Sun EC implementation doesn't currently handle the seed properly
     22         // so at the moment it's set to null. Should probably look at making this configurable
     23         if (curve instanceof ECCurve.Fp)
     24         {
     25             return new EllipticCurve(new ECFieldFp(((ECCurve.Fp)curve).getQ()), curve.getA().toBigInteger(), curve.getB().toBigInteger(), null);
     26         }
     27         else
     28         {
     29             ECCurve.F2m curveF2m = (ECCurve.F2m)curve;
     30             int ks[];
     31 
     32             if (curveF2m.isTrinomial())
     33             {
     34                 ks = new int[] { curveF2m.getK1() };
     35 
     36                 return new EllipticCurve(new ECFieldF2m(curveF2m.getM(), ks), curve.getA().toBigInteger(), curve.getB().toBigInteger(), null);
     37             }
     38             else
     39             {
     40                 ks = new int[] { curveF2m.getK3(), curveF2m.getK2(), curveF2m.getK1() };
     41 
     42                 return new EllipticCurve(new ECFieldF2m(curveF2m.getM(), ks), curve.getA().toBigInteger(), curve.getB().toBigInteger(), null);
     43             }
     44         }
     45     }
     46 
     47     public static ECCurve convertCurve(
     48         EllipticCurve ec)
     49     {
     50         ECField field = ec.getField();
     51         BigInteger a = ec.getA();
     52         BigInteger b = ec.getB();
     53 
     54         if (field instanceof ECFieldFp)
     55         {
     56             return new ECCurve.Fp(((ECFieldFp)field).getP(), a, b);
     57         }
     58         else
     59         {
     60             ECFieldF2m fieldF2m = (ECFieldF2m)field;
     61             int m = fieldF2m.getM();
     62             int ks[] = ECUtil.convertMidTerms(fieldF2m.getMidTermsOfReductionPolynomial());
     63             return new ECCurve.F2m(m, ks[0], ks[1], ks[2], a, b);
     64         }
     65     }
     66 
     67     public static ECParameterSpec convertSpec(
     68         EllipticCurve ellipticCurve,
     69         org.bouncycastle.jce.spec.ECParameterSpec spec)
     70     {
     71         if (spec instanceof ECNamedCurveParameterSpec)
     72         {
     73             return new ECNamedCurveSpec(
     74                 ((ECNamedCurveParameterSpec)spec).getName(),
     75                 ellipticCurve,
     76                 new ECPoint(
     77                     spec.getG().getX().toBigInteger(),
     78                     spec.getG().getY().toBigInteger()),
     79                 spec.getN(),
     80                 spec.getH());
     81         }
     82         else
     83         {
     84             return new ECParameterSpec(
     85                 ellipticCurve,
     86                 new ECPoint(
     87                     spec.getG().getX().toBigInteger(),
     88                     spec.getG().getY().toBigInteger()),
     89                 spec.getN(),
     90                 spec.getH().intValue());
     91         }
     92     }
     93 
     94     public static org.bouncycastle.jce.spec.ECParameterSpec convertSpec(
     95         ECParameterSpec ecSpec,
     96         boolean withCompression)
     97     {
     98         ECCurve curve = convertCurve(ecSpec.getCurve());
     99 
    100         return new org.bouncycastle.jce.spec.ECParameterSpec(
    101             curve,
    102             convertPoint(curve, ecSpec.getGenerator(), withCompression),
    103             ecSpec.getOrder(),
    104             BigInteger.valueOf(ecSpec.getCofactor()),
    105             ecSpec.getCurve().getSeed());
    106     }
    107 
    108     public static org.bouncycastle.math.ec.ECPoint convertPoint(
    109         ECParameterSpec ecSpec,
    110         ECPoint point,
    111         boolean withCompression)
    112     {
    113         return convertPoint(convertCurve(ecSpec.getCurve()), point, withCompression);
    114     }
    115 
    116     public static org.bouncycastle.math.ec.ECPoint convertPoint(
    117         ECCurve curve,
    118         ECPoint point,
    119         boolean withCompression)
    120     {
    121         return curve.createPoint(point.getAffineX(), point.getAffineY(), withCompression);
    122     }
    123 }
    124