1 /* 2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package java.security.spec; 26 27 import java.math.BigInteger; 28 29 /** 30 * This immutable class represents a point on an elliptic curve (EC) 31 * in affine coordinates. Other coordinate systems can 32 * extend this class to represent this point in other 33 * coordinates. 34 * 35 * @author Valerie Peng 36 * 37 * @since 1.5 38 */ 39 public class ECPoint { 40 41 private final BigInteger x; 42 private final BigInteger y; 43 44 /** 45 * This defines the point at infinity. 46 */ 47 public static final ECPoint POINT_INFINITY = new ECPoint(); 48 49 // private constructor for constructing point at infinity ECPoint()50 private ECPoint() { 51 this.x = null; 52 this.y = null; 53 } 54 55 /** 56 * Creates an ECPoint from the specified affine x-coordinate 57 * {@code x} and affine y-coordinate {@code y}. 58 * @param x the affine x-coordinate. 59 * @param y the affine y-coordinate. 60 * @exception NullPointerException if {@code x} or 61 * {@code y} is null. 62 */ ECPoint(BigInteger x, BigInteger y)63 public ECPoint(BigInteger x, BigInteger y) { 64 if ((x==null) || (y==null)) { 65 throw new NullPointerException("affine coordinate x or y is null"); 66 } 67 this.x = x; 68 this.y = y; 69 } 70 71 /** 72 * Returns the affine x-coordinate {@code x}. 73 * Note: POINT_INFINITY has a null affine x-coordinate. 74 * @return the affine x-coordinate. 75 */ getAffineX()76 public BigInteger getAffineX() { 77 return x; 78 } 79 80 /** 81 * Returns the affine y-coordinate {@code y}. 82 * Note: POINT_INFINITY has a null affine y-coordinate. 83 * @return the affine y-coordinate. 84 */ getAffineY()85 public BigInteger getAffineY() { 86 return y; 87 } 88 89 /** 90 * Compares this elliptic curve point for equality with 91 * the specified object. 92 * @param obj the object to be compared. 93 * @return true if {@code obj} is an instance of 94 * ECPoint and the affine coordinates match, false otherwise. 95 */ equals(Object obj)96 public boolean equals(Object obj) { 97 if (this == obj) return true; 98 if (this == POINT_INFINITY) return false; 99 if (obj instanceof ECPoint) { 100 return ((x.equals(((ECPoint)obj).x)) && 101 (y.equals(((ECPoint)obj).y))); 102 } 103 return false; 104 } 105 106 /** 107 * Returns a hash code value for this elliptic curve point. 108 * @return a hash code value. 109 */ hashCode()110 public int hashCode() { 111 if (this == POINT_INFINITY) return 0; 112 return x.hashCode() << 5 + y.hashCode(); 113 } 114 } 115