1 package org.bouncycastle.math.ec.custom.sec; 2 3 import java.math.BigInteger; 4 5 import org.bouncycastle.math.ec.ECCurve; 6 import org.bouncycastle.math.ec.ECFieldElement; 7 import org.bouncycastle.math.ec.ECPoint; 8 import org.bouncycastle.util.encoders.Hex; 9 10 public class SecP224R1Curve extends ECCurve.AbstractFp 11 { 12 public static final BigInteger q = new BigInteger(1, 13 Hex.decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001")); 14 15 private static final int SecP224R1_DEFAULT_COORDS = COORD_JACOBIAN; 16 17 protected SecP224R1Point infinity; 18 19 public SecP224R1Curve() 20 { 21 super(q); 22 23 this.infinity = new SecP224R1Point(this, null, null); 24 25 this.a = fromBigInteger(new BigInteger(1, 26 Hex.decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE"))); 27 this.b = fromBigInteger(new BigInteger(1, 28 Hex.decode("B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4"))); 29 this.order = new BigInteger(1, Hex.decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D")); 30 this.cofactor = BigInteger.valueOf(1); 31 32 this.coord = SecP224R1_DEFAULT_COORDS; 33 } 34 35 protected ECCurve cloneCurve() 36 { 37 return new SecP224R1Curve(); 38 } 39 40 public boolean supportsCoordinateSystem(int coord) 41 { 42 switch (coord) 43 { 44 case COORD_JACOBIAN: 45 return true; 46 default: 47 return false; 48 } 49 } 50 51 public BigInteger getQ() 52 { 53 return q; 54 } 55 56 public int getFieldSize() 57 { 58 return q.bitLength(); 59 } 60 61 public ECFieldElement fromBigInteger(BigInteger x) 62 { 63 return new SecP224R1FieldElement(x); 64 } 65 66 protected ECPoint createRawPoint(ECFieldElement x, ECFieldElement y, boolean withCompression) 67 { 68 return new SecP224R1Point(this, x, y, withCompression); 69 } 70 71 protected ECPoint createRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, boolean withCompression) 72 { 73 return new SecP224R1Point(this, x, y, zs, withCompression); 74 } 75 76 public ECPoint getInfinity() 77 { 78 return infinity; 79 } 80 } 81