1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.security.spec; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 23f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * The parameter specification used with Elliptic Curve Cryptography (ECC). 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class ECParameterSpec implements AlgorithmParameterSpec { 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Elliptic curve for which this is parameter 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final EllipticCurve curve; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Distinguished point on the elliptic curve called generator or base point 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final ECPoint generator; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Order of the generator 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final BigInteger order; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Cofactor 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final int cofactor; 34a812f61dc1102c8089c1acd48c24b36829ce2482Kenny Root // Name of curve if available. 35a99c6e9a3341711ca47a61a9f0fe69441e831a38Kenny Root private String curveName; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code ECParameterSpec} with the specified elliptic curve, 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the base point, the order of the generator (or base point) and the 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * co-factor. 41f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param curve 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the elliptic curve. 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param generator 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the generator (or base point). 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param order 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the order of the generator. 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param cofactor 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the co-factor. 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code order <= zero} or {@code cofactor <= zero}. 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ECParameterSpec(EllipticCurve curve, ECPoint generator, 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger order, int cofactor) { 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.curve = curve; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.generator = generator; 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.order = order; 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.cofactor = cofactor; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // throw NullPointerException if curve, generator or order is null 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this.curve == null) { 61897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("curve == null"); 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this.generator == null) { 64897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("generator == null"); 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this.order == null) { 67897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("order == null"); 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // throw IllegalArgumentException if order or cofactor is not positive 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(this.order.compareTo(BigInteger.ZERO) > 0)) { 71897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalArgumentException("order <= 0"); 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(this.cofactor > 0)) { 74897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalArgumentException("cofactor <= 0"); 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code cofactor}. 80f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code cofactor}. 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getCofactor() { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return cofactor; 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the elliptic curve. 89f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the elliptic curve. 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public EllipticCurve getCurve() { 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return curve; 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the generator (or base point). 98f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the generator (or base point). 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ECPoint getGenerator() { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return generator; 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the order of the generator. 107f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the order of the generator. 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public BigInteger getOrder() { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return order; 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113a812f61dc1102c8089c1acd48c24b36829ce2482Kenny Root 114a812f61dc1102c8089c1acd48c24b36829ce2482Kenny Root /** 115a99c6e9a3341711ca47a61a9f0fe69441e831a38Kenny Root * Used to set the curve name if available. 116a99c6e9a3341711ca47a61a9f0fe69441e831a38Kenny Root * 117a99c6e9a3341711ca47a61a9f0fe69441e831a38Kenny Root * @hide 118a99c6e9a3341711ca47a61a9f0fe69441e831a38Kenny Root */ 119a99c6e9a3341711ca47a61a9f0fe69441e831a38Kenny Root public void setCurveName(String curveName) { 120a99c6e9a3341711ca47a61a9f0fe69441e831a38Kenny Root this.curveName = curveName; 121a99c6e9a3341711ca47a61a9f0fe69441e831a38Kenny Root } 122a99c6e9a3341711ca47a61a9f0fe69441e831a38Kenny Root 123a99c6e9a3341711ca47a61a9f0fe69441e831a38Kenny Root /** 124a812f61dc1102c8089c1acd48c24b36829ce2482Kenny Root * Returns the name of the curve if this is a named curve. Returns 125a812f61dc1102c8089c1acd48c24b36829ce2482Kenny Root * {@code null} if this is not known to be a named curve. 126a812f61dc1102c8089c1acd48c24b36829ce2482Kenny Root * 127a812f61dc1102c8089c1acd48c24b36829ce2482Kenny Root * @hide 128a812f61dc1102c8089c1acd48c24b36829ce2482Kenny Root */ 129a812f61dc1102c8089c1acd48c24b36829ce2482Kenny Root public String getCurveName() { 130a812f61dc1102c8089c1acd48c24b36829ce2482Kenny Root return curveName; 131a812f61dc1102c8089c1acd48c24b36829ce2482Kenny Root } 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 133