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 * A Point on an Elliptic Curve in barycentric (or affine) coordinates. 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class ECPoint { 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The point on an Elliptic Curve at infinity. 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final ECPoint POINT_INFINITY = new ECPoint(); 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // affine X coordinate of this point 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final BigInteger affineX; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // affine Y coordinate of this point 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final BigInteger affineY; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Private ctor for POINT_INFINITY 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private ECPoint() { 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project affineX = null; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project affineY = null; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new point at the specified coordinates. 44f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param affineX 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the x-coordinate. 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param affineY 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the y-coordinate. 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ECPoint(BigInteger affineX, BigInteger affineY) { 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.affineX = affineX; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this.affineX == null) { 53897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("affineX == null"); 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.affineY = affineY; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this.affineY == null) { 57897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("affineY == null"); 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the x-coordinate. 63f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the x-coordinate, or {@code null} for the infinite point. 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public BigInteger getAffineX() { 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return affineX; 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the y-coordinate. 72f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the y-coordinate, or {@code null} fot the infinite point. 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public BigInteger getAffineY() { 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return affineY; 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether the specified object and this elliptic curve point are 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * equal. 82f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param other 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to compare. 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the specified object and this elliptic curve 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * point are equal, otherwise {@code false}. 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean equals(Object other) { 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this == other) { 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (other instanceof ECPoint) { 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this.affineX != null) { 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ECPoint otherPoint = (ECPoint)other; 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // no need to check for null in this case 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this.affineX.equals(otherPoint.affineX) && 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.affineY.equals(otherPoint.affineY); 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return other == POINT_INFINITY; 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the hashcode of this elliptic curve point. 107f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the hashcode of this elliptic curve point. 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int hashCode() { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this.affineX != null) { 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return affineX.hashCode() * 31 + affineY.hashCode(); 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 11; 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 117