1 /*
2  * Copyright (c) 2020, 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 
26 package java.security.spec;
27 
28 import java.math.BigInteger;
29 import java.util.Objects;
30 
31 /**
32  * An elliptic curve point used to specify keys as defined by
33  * <a href="https://tools.ietf.org/html/rfc8032">RFC 8032: Edwards-Curve
34  * Digital Signature Algorithm (EdDSA)</a>. These points are distinct from the
35  * points represented by {@code ECPoint}, and they are intended for use with
36  * algorithms based on RFC 8032 such as the EdDSA {@code Signature} algorithm.
37  * <p>
38  * An EdEC point is specified by its y-coordinate value and a boolean that
39  * indicates whether the x-coordinate is odd. The y-coordinate is an
40  * element of the field of integers modulo some value p that is determined by
41  * the algorithm parameters. This field element is represented by a
42  * {@code BigInteger}, and implementations that consume objects of this class
43  * may reject integer values which are not in the range [0, p).
44  *
45  * @since 15
46  */
47 
48 public final class EdECPoint {
49 
50     private final boolean xOdd;
51     private final BigInteger y;
52 
53     /**
54      * Construct an EdECPoint.
55      *
56      * @param xOdd whether the x-coordinate is odd.
57      * @param y the y-coordinate, represented using a {@code BigInteger}.
58      *
59      * @throws NullPointerException if {@code y} is null.
60      */
EdECPoint(boolean xOdd, BigInteger y)61     public EdECPoint(boolean xOdd, BigInteger y) {
62 
63         Objects.requireNonNull(y, "y must not be null");
64 
65         this.xOdd = xOdd;
66         this.y = y;
67     }
68 
69     /**
70      * Get whether the x-coordinate of the point is odd.
71      *
72      * @return a boolean indicating whether the x-coordinate is odd.
73      */
isXOdd()74     public boolean isXOdd() {
75         return xOdd;
76     }
77 
78     /**
79      * Get the y-coordinate of the point.
80      *
81      * @return the y-coordinate, represented using a {@code BigInteger}.
82      */
getY()83     public BigInteger getY() {
84         return y;
85     }
86 }
87