src/java.base/share/classes/sun/security/util/ECUtil.java
author apetcher
Fri, 17 Aug 2018 14:37:01 -0400
branchJDK-8171279-XDH-TLS-branch-2
changeset 56863 c9d3ea14d270
parent 56858 829e9b5ace08
child 56878 55bac0266042
permissions -rw-r--r--
Moving some code around
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17491
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
     1
/*
23010
6dadb192ad81 8029235: Update copyright year to match last edit in jdk8 jdk repository for 2013
lana
parents: 17491
diff changeset
     2
 * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
17491
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
     4
 *
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    10
 *
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    15
 * accompanied this code).
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    16
 *
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    20
 *
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    23
 * questions.
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    24
 */
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    25
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    26
package sun.security.util;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    27
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    28
import java.io.IOException;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    29
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    30
import java.math.BigInteger;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    31
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    32
import java.security.*;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    33
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    34
import java.security.interfaces.*;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    35
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    36
import java.security.spec.*;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    37
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    38
import java.util.Arrays;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    39
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    40
import sun.security.x509.X509Key;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    41
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    42
public class ECUtil {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    43
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    44
    // Used by SunPKCS11 and SunJSSE.
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    45
    public static ECPoint decodePoint(byte[] data, EllipticCurve curve)
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    46
            throws IOException {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    47
        if ((data.length == 0) || (data[0] != 4)) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    48
            throw new IOException("Only uncompressed point format supported");
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    49
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    50
        // Per ANSI X9.62, an encoded point is a 1 byte type followed by
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    51
        // ceiling(log base 2 field-size / 8) bytes of x and the same of y.
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    52
        int n = (data.length - 1) / 2;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    53
        if (n != ((curve.getField().getFieldSize() + 7 ) >> 3)) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    54
            throw new IOException("Point does not match field size");
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    55
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    56
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    57
        byte[] xb = Arrays.copyOfRange(data, 1, 1 + n);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    58
        byte[] yb = Arrays.copyOfRange(data, n + 1, n + 1 + n);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    59
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    60
        return new ECPoint(new BigInteger(1, xb), new BigInteger(1, yb));
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    61
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    62
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    63
    // Used by SunPKCS11 and SunJSSE.
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    64
    public static byte[] encodePoint(ECPoint point, EllipticCurve curve) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    65
        // get field size in bytes (rounding up)
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    66
        int n = (curve.getField().getFieldSize() + 7) >> 3;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    67
        byte[] xb = trimZeroes(point.getAffineX().toByteArray());
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    68
        byte[] yb = trimZeroes(point.getAffineY().toByteArray());
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    69
        if ((xb.length > n) || (yb.length > n)) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    70
            throw new RuntimeException
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    71
                ("Point coordinates do not match field size");
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    72
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    73
        byte[] b = new byte[1 + (n << 1)];
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    74
        b[0] = 4; // uncompressed
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    75
        System.arraycopy(xb, 0, b, n - xb.length + 1, xb.length);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    76
        System.arraycopy(yb, 0, b, b.length - yb.length, yb.length);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    77
        return b;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    78
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    79
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    80
    public static byte[] trimZeroes(byte[] b) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    81
        int i = 0;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    82
        while ((i < b.length - 1) && (b[i] == 0)) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    83
            i++;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    84
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    85
        if (i == 0) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    86
            return b;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    87
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    88
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    89
        return Arrays.copyOfRange(b, i, b.length);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    90
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    91
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    92
    private static KeyFactory getKeyFactory() {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    93
        try {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    94
            return KeyFactory.getInstance("EC", "SunEC");
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    95
        } catch (NoSuchAlgorithmException | NoSuchProviderException e) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    96
            throw new RuntimeException(e);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    97
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    98
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
    99
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   100
    public static ECPublicKey decodeX509ECPublicKey(byte[] encoded)
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   101
            throws InvalidKeySpecException {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   102
        KeyFactory keyFactory = getKeyFactory();
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   103
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   104
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   105
        return (ECPublicKey)keyFactory.generatePublic(keySpec);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   106
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   107
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   108
    public static byte[] x509EncodeECPublicKey(ECPoint w,
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   109
            ECParameterSpec params) throws InvalidKeySpecException {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   110
        KeyFactory keyFactory = getKeyFactory();
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   111
        ECPublicKeySpec keySpec = new ECPublicKeySpec(w, params);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   112
        X509Key key = (X509Key)keyFactory.generatePublic(keySpec);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   113
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   114
        return key.getEncoded();
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   115
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   116
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   117
    public static ECPrivateKey decodePKCS8ECPrivateKey(byte[] encoded)
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   118
            throws InvalidKeySpecException {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   119
        KeyFactory keyFactory = getKeyFactory();
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   120
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   121
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   122
        return (ECPrivateKey)keyFactory.generatePrivate(keySpec);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   123
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   124
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   125
    public static ECPrivateKey generateECPrivateKey(BigInteger s,
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   126
            ECParameterSpec params) throws InvalidKeySpecException {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   127
        KeyFactory keyFactory = getKeyFactory();
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   128
        ECPrivateKeySpec keySpec = new ECPrivateKeySpec(s, params);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   129
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   130
        return (ECPrivateKey)keyFactory.generatePrivate(keySpec);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   131
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   132
45883
89df6f9465a3 8182999: SunEC throws ProviderException on invalid curves
apetcher
parents: 25859
diff changeset
   133
    public static AlgorithmParameters getECParameters(Provider p) {
17491
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   134
        try {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   135
            if (p != null) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   136
                return AlgorithmParameters.getInstance("EC", p);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   137
            }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   138
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   139
            return AlgorithmParameters.getInstance("EC");
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   140
        } catch (NoSuchAlgorithmException nsae) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   141
            throw new RuntimeException(nsae);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   142
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   143
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   144
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   145
    public static byte[] encodeECParameterSpec(Provider p,
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   146
                                               ECParameterSpec spec) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   147
        AlgorithmParameters parameters = getECParameters(p);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   148
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   149
        try {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   150
            parameters.init(spec);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   151
        } catch (InvalidParameterSpecException ipse) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   152
            throw new RuntimeException("Not a known named curve: " + spec);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   153
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   154
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   155
        try {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   156
            return parameters.getEncoded();
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   157
        } catch (IOException ioe) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   158
            // it is a bug if this should happen
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   159
            throw new RuntimeException(ioe);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   160
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   161
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   162
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   163
    public static ECParameterSpec getECParameterSpec(Provider p,
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   164
                                                     ECParameterSpec spec) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   165
        AlgorithmParameters parameters = getECParameters(p);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   166
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   167
        try {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   168
            parameters.init(spec);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   169
            return parameters.getParameterSpec(ECParameterSpec.class);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   170
        } catch (InvalidParameterSpecException ipse) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   171
            return null;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   172
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   173
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   174
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   175
    public static ECParameterSpec getECParameterSpec(Provider p,
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   176
                                                     byte[] params)
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   177
            throws IOException {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   178
        AlgorithmParameters parameters = getECParameters(p);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   179
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   180
        parameters.init(params);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   181
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   182
        try {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   183
            return parameters.getParameterSpec(ECParameterSpec.class);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   184
        } catch (InvalidParameterSpecException ipse) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   185
            return null;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   186
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   187
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   188
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   189
    public static ECParameterSpec getECParameterSpec(Provider p, String name) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   190
        AlgorithmParameters parameters = getECParameters(p);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   191
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   192
        try {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   193
            parameters.init(new ECGenParameterSpec(name));
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   194
            return parameters.getParameterSpec(ECParameterSpec.class);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   195
        } catch (InvalidParameterSpecException ipse) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   196
            return null;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   197
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   198
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   199
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   200
    public static ECParameterSpec getECParameterSpec(Provider p, int keySize) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   201
        AlgorithmParameters parameters = getECParameters(p);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   202
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   203
        try {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   204
            parameters.init(new ECKeySizeParameterSpec(keySize));
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   205
            return parameters.getParameterSpec(ECParameterSpec.class);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   206
        } catch (InvalidParameterSpecException ipse) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   207
            return null;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   208
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   209
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   210
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   211
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   212
    public static String getCurveName(Provider p, ECParameterSpec spec) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   213
        ECGenParameterSpec nameSpec;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   214
        AlgorithmParameters parameters = getECParameters(p);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   215
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   216
        try {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   217
            parameters.init(spec);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   218
            nameSpec = parameters.getParameterSpec(ECGenParameterSpec.class);
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   219
        } catch (InvalidParameterSpecException ipse) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   220
            return null;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   221
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   222
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   223
        if (nameSpec == null) {
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   224
            return null;
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   225
        }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   226
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   227
        return nameSpec.getName();
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   228
    }
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   229
56858
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   230
    public static BigInteger decodeXecPublicKey(byte[] key,
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   231
                                                XECParameters params) {
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   232
56863
c9d3ea14d270 Moving some code around
apetcher
parents: 56858
diff changeset
   233
        ArrayUtil.reverse(key);
56858
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   234
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   235
        // clear the extra bits
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   236
        int bitsMod8 = params.getBits() % 8;
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   237
        if (bitsMod8 != 0) {
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   238
            int mask = (1 << bitsMod8) - 1;
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   239
            key[0] &= mask;
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   240
        }
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   241
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   242
        return new BigInteger(1, key);
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   243
    }
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   244
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   245
    public static XECPublicKeySpec decodeXecPublicKey(byte[] key,
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   246
                                                      AlgorithmParameterSpec spec)
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   247
        throws InvalidParameterSpecException {
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   248
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   249
        XECParameters params = XECParameters.get(
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   250
            InvalidParameterSpecException::new, spec);
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   251
        BigInteger u = decodeXecPublicKey(key, params);
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   252
        return new XECPublicKeySpec(spec, u);
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   253
    }
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   254
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   255
    public static byte[] encodeXecPublicKey(BigInteger u,
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   256
                                            XECParameters params) {
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   257
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   258
        byte[] u_arr = u.toByteArray();
56863
c9d3ea14d270 Moving some code around
apetcher
parents: 56858
diff changeset
   259
        ArrayUtil.reverse(u_arr);
56858
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   260
        // u_arr may be too large or too small, depending on the value of u
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   261
        return Arrays.copyOf(u_arr, params.getBytes());
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   262
    }
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   263
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   264
    public static byte[] encodeXecPublicKey(BigInteger u,
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   265
                                            AlgorithmParameterSpec spec)
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   266
        throws InvalidParameterSpecException {
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   267
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   268
        XECParameters params = XECParameters.get(
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   269
            InvalidParameterSpecException::new, spec);
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   270
        return encodeXecPublicKey(u, params);
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   271
    }
829e9b5ace08 Patching in old branch
apetcher
parents: 47216
diff changeset
   272
17491
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   273
    private ECUtil() {}
7a33824ec8c5 7194075: Various classes of sunec.jar are duplicated in rt.jar
vinnie
parents:
diff changeset
   274
}