151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.security.x509;
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.*;
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.*;
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.*;
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.util.*;
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class identifies algorithms, such as cryptographic transforms, each
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of which may be associated with parameters.  Instances of this base class
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * are used when this runtime environment has no special knowledge of the
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * algorithm type, and may also be used in other cases.  Equivalence is
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * defined according to OID and (where relevant) parameters.
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>Subclasses may be used, for example when when the algorithm ID has
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * associated parameters which some code (e.g. code using public keys) needs
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to have parsed.  Two examples of such algorithms are Diffie-Hellman key
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * exchange, and the Digital Signature Standard Algorithm (DSS/DSA).
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>The OID constants defined in this class correspond to some widely
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used algorithms, for which conventional string names have been defined.
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class is not a general repository for OIDs, or for such string names.
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Note that the mappings between algorithm IDs and algorithm names is
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * not one-to-one.
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author David Brownell
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Amit Kapoor
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Hemma Prafullchandra
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class AlgorithmId implements Serializable, DerEncoder {
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /** use serialVersionUID from JDK 1.1. for interoperability */
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final long serialVersionUID = 7205873507486557157L;
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The object identitifer being used for this algorithm.
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private ObjectIdentifier algid;
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // The (parsed) parameters
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private AlgorithmParameters algParams;
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private boolean constructedFromDer = true;
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Parameters for this algorithm.  These are stored in unparsed
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * DER-encoded form; subclasses can be made to automaticaly parse
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * them so there is fast access to these parameters.
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected DerValue          params;
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Constructs an algorithm ID which will be initialized
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * separately, for example by deserialization.
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated use one of the other constructors.
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public AlgorithmId() { }
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Constructs a parameterless algorithm ID.
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param oid the identifier for the algorithm
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public AlgorithmId(ObjectIdentifier oid) {
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        algid = oid;
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Constructs an algorithm ID with algorithm parameters.
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param oid the identifier for the algorithm.
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param algparams the associated algorithm parameters.
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public AlgorithmId(ObjectIdentifier oid, AlgorithmParameters algparams) {
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        algid = oid;
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        algParams = algparams;
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        constructedFromDer = false;
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private AlgorithmId(ObjectIdentifier oid, DerValue params)
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throws IOException {
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.algid = oid;
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.params = params;
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (this.params != null) {
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            decodeParams();
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected void decodeParams() throws IOException {
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String algidString = algid.toString();
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            algParams = AlgorithmParameters.getInstance(algidString);
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (NoSuchAlgorithmException e) {
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            try {
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // Try the internal EC code so that we can fully parse EC
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // keys even if the provider is not registered.
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // This code can go away once we have EC in the SUN provider.
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                algParams = AlgorithmParameters.getInstance(algidString,
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                sun.security.ec.ECKeyFactory.ecInternalProvider);
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } catch (NoSuchAlgorithmException ee) {
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                /*
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 * This algorithm parameter type is not supported, so we cannot
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 * parse the parameters.
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 */
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                algParams = null;
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return;
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Decode (parse) the parameters
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        algParams.init(params.toByteArray());
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Marshal a DER-encoded "AlgorithmID" sequence on the DER stream.
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final void encode(DerOutputStream out) throws IOException {
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        derEncode(out);
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * DER encode this object onto an output stream.
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Implements the <code>DerEncoder</code> interface.
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param out
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the output stream on which to write the DER encoding.
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception IOException on encoding error.
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void derEncode (OutputStream out) throws IOException {
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DerOutputStream bytes = new DerOutputStream();
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DerOutputStream tmp = new DerOutputStream();
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        bytes.putOID(algid);
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Setup params from algParams since no DER encoding is given
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (constructedFromDer == false) {
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (algParams != null) {
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                params = new DerValue(algParams.getEncoded());
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                params = null;
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (params == null) {
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // Changes backed out for compatibility with Solaris
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // Several AlgorithmId should omit the whole parameter part when
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // it's NULL. They are ---
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // rfc3370 2.1: Implementations SHOULD generate SHA-1
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // AlgorithmIdentifiers with absent parameters.
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // rfc3447 C1: When id-sha1, id-sha256, id-sha384 and id-sha512
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // are used in an AlgorithmIdentifier the parameters (which are
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // optional) SHOULD be omitted.
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // rfc3279 2.3.2: The id-dsa algorithm syntax includes optional
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // domain parameters... When omitted, the parameters component
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // MUST be omitted entirely
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // rfc3370 3.1: When the id-dsa-with-sha1 algorithm identifier
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // is used, the AlgorithmIdentifier parameters field MUST be absent.
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            /*if (
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                algid.equals((Object)SHA_oid) ||
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                algid.equals((Object)SHA256_oid) ||
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                algid.equals((Object)SHA384_oid) ||
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                algid.equals((Object)SHA512_oid) ||
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                algid.equals((Object)DSA_oid) ||
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                algid.equals((Object)sha1WithDSA_oid)) {
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ; // no parameter part encoded
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                bytes.putNull();
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }*/
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            bytes.putNull();
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            bytes.putDerValue(params);
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        tmp.write(DerValue.tag_Sequence, bytes);
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        out.write(tmp.toByteArray());
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the DER-encoded X.509 AlgorithmId as a byte array.
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final byte[] encode() throws IOException {
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DerOutputStream out = new DerOutputStream();
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        derEncode(out);
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return out.toByteArray();
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the ISO OID for this algorithm.  This is usually converted
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to a string and used as part of an algorithm name, for example
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * "OID.1.3.14.3.2.13" style notation.  Use the <code>getName</code>
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * call when you do not need to ensure cross-system portability
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of algorithm names, or need a user friendly name.
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final ObjectIdentifier getOID () {
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return algid;
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a name for the algorithm which may be more intelligible
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to humans than the algorithm's OID, but which won't necessarily
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * be comprehensible on other systems.  For example, this might
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * return a name such as "MD5withRSA" for a signature algorithm on
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * some systems.  It also returns names like "OID.1.2.3.4", when
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * no particular name for the algorithm is known.
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String getName() {
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String algName = nameTable.get(algid);
23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (algName != null) {
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return algName;
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if ((params != null) && algid.equals(specifiedWithECDSA_oid)) {
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            try {
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                AlgorithmId paramsId =
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        AlgorithmId.parse(new DerValue(getEncodedParams()));
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                String paramsName = paramsId.getName();
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (paramsName.equals("SHA")) {
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    paramsName = "SHA1";
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                algName = paramsName + "withECDSA";
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } catch (IOException e) {
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // ignore
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
253613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root
254613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root        // Try to update the name <-> OID mapping table.
255613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root        synchronized (oidTable) {
256613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root            reinitializeMappingTableLocked();
257613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root            algName = nameTable.get(algid);
258613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root        }
259613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (algName == null) ? algid.toString() : algName;
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public AlgorithmParameters getParameters() {
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return algParams;
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the DER encoded parameter, which can then be
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * used to initialize java.security.AlgorithmParamters.
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return DER encoded parameters, or null not present.
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public byte[] getEncodedParams() throws IOException {
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (params == null) ? null : params.toByteArray();
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns true iff the argument indicates the same algorithm
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with the same parameters.
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean equals(AlgorithmId other) {
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        boolean paramsEqual =
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski          (params == null ? other.params == null : params.equals(other.params));
28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (algid.equals(other.algid) && paramsEqual);
28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Compares this AlgorithmID to another.  If algorithm parameters are
28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * available, they are compared.  Otherwise, just the object IDs
29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for the algorithm are compared.
29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param other preferably an AlgorithmId, else an ObjectIdentifier
29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean equals(Object other) {
29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (this == other) {
29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return true;
29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (other instanceof AlgorithmId) {
29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return equals((AlgorithmId) other);
30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else if (other instanceof ObjectIdentifier) {
30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return equals((ObjectIdentifier) other);
30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return false;
30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Compares two algorithm IDs for equality.  Returns true iff
30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * they are the same algorithm, ignoring algorithm parameters.
31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final boolean equals(ObjectIdentifier id) {
31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return algid.equals(id);
31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a hashcode for this AlgorithmId.
31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a hashcode for this AlgorithmId.
31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int hashCode() {
32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        StringBuilder sbuf = new StringBuilder();
32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sbuf.append(algid.toString());
32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sbuf.append(paramsToString());
32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return sbuf.toString().hashCode();
32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Provides a human-readable description of the algorithm parameters.
32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This may be redefined by subclasses which parse those parameters.
33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected String paramsToString() {
33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (params == null) {
33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return "";
33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else if (algParams != null) {
33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return algParams.toString();
33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return ", params unparsed";
33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a string describing the algorithm and its parameters.
34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String toString() {
34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getName() + paramsToString();
34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Parse (unmarshal) an ID from a DER sequence input value.  This form
35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * parsing might be used when expanding a value which has already been
35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * partially unmarshaled as a set or sequence member.
35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception IOException on error.
35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param val the input value, which contains the algid and, if
35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          there are any parameters, those parameters.
35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return an ID for the algorithm.  If the system is configured
35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          appropriately, this may be an instance of a class
35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          with some kind of special support for this algorithm.
35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          In that case, you may "narrow" the type of the ID.
36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static AlgorithmId parse(DerValue val) throws IOException {
36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (val.tag != DerValue.tag_Sequence) {
36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IOException("algid parse error, not a sequence");
36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        /*
36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * Get the algorithm ID and any parameters.
36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         */
36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ObjectIdentifier        algid;
37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DerValue                params;
37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DerInputStream          in = val.toDerInputStream();
37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        algid = in.getOID();
37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (in.available() == 0) {
37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            params = null;
37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            params = in.getDerValue();
37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (params.tag == DerValue.tag_Null) {
37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (params.length() != 0) {
38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    throw new IOException("invalid NULL");
38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                params = null;
38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (in.available() != 0) {
38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                throw new IOException("Invalid AlgorithmIdentifier: extra data");
38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new AlgorithmId(algid, params);
39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns one of the algorithm IDs most commonly associated
39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with this algorithm name.
39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param algname the name being used
39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated use the short get form of this method.
39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception NoSuchAlgorithmException on error.
39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static AlgorithmId getAlgorithmId(String algname)
40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throws NoSuchAlgorithmException {
40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return get(algname);
40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns one of the algorithm IDs most commonly associated
40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with this algorithm name.
40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param algname the name being used
41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception NoSuchAlgorithmException on error.
41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static AlgorithmId get(String algname)
41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throws NoSuchAlgorithmException {
41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ObjectIdentifier oid;
41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            oid = algOID(algname);
41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (IOException ioe) {
41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new NoSuchAlgorithmException
42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ("Invalid ObjectIdentifier " + algname);
42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (oid == null) {
42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new NoSuchAlgorithmException
42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ("unrecognized algorithm name: " + algname);
42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new AlgorithmId(oid);
42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns one of the algorithm IDs most commonly associated
43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with this algorithm parameters.
43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param algparams the associated algorithm parameters.
43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception NoSuchAlgorithmException on error.
43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static AlgorithmId get(AlgorithmParameters algparams)
43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throws NoSuchAlgorithmException {
43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ObjectIdentifier oid;
44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String algname = algparams.getAlgorithm();
44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            oid = algOID(algname);
44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (IOException ioe) {
44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new NoSuchAlgorithmException
44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ("Invalid ObjectIdentifier " + algname);
44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (oid == null) {
44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new NoSuchAlgorithmException
44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ("unrecognized algorithm name: " + algname);
45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new AlgorithmId(oid, algparams);
45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /*
45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Translates from some common algorithm names to the
45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID with which they're usually associated ... this mapping
45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is the reverse of the one below, except in those cases
45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * where synonyms are supported or where a given algorithm
45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is commonly associated with multiple OIDs.
46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * XXX This method needs to be enhanced so that we can also pass the
46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * scope of the algorithm name to it, e.g., the algorithm name "DSA"
46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * may have a different OID when used as a "Signature" algorithm than when
46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * used as a "KeyPairGenerator" algorithm.
46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static ObjectIdentifier algOID(String name) throws IOException {
46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // See if algname is in printable OID ("dot-dot") notation
46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.indexOf('.') != -1) {
46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (name.startsWith("OID.")) {
47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return new ObjectIdentifier(name.substring("OID.".length()));
47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return new ObjectIdentifier(name);
47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Digesting algorithms
47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("MD5")) {
47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.MD5_oid;
47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("MD2")) {
48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.MD2_oid;
48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("SHA") || name.equalsIgnoreCase("SHA1")
48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || name.equalsIgnoreCase("SHA-1")) {
48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.SHA_oid;
48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("SHA-256") ||
48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            name.equalsIgnoreCase("SHA256")) {
48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.SHA256_oid;
49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("SHA-384") ||
49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            name.equalsIgnoreCase("SHA384")) {
49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.SHA384_oid;
49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("SHA-512") ||
49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            name.equalsIgnoreCase("SHA512")) {
49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.SHA512_oid;
49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Various public key algorithms
50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("RSA")) {
50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.RSAEncryption_oid;
50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
50551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("Diffie-Hellman")
50651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || name.equalsIgnoreCase("DH")) {
50751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.DH_oid;
50851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
50951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("DSA")) {
51051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.DSA_oid;
51151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
51251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("EC")) {
51351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return EC_oid;
51451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
51551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
51651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Common signature types
51751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("MD5withRSA")
51851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || name.equalsIgnoreCase("MD5/RSA")) {
51951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.md5WithRSAEncryption_oid;
52051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
52151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("MD2withRSA")
52251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || name.equalsIgnoreCase("MD2/RSA")) {
52351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.md2WithRSAEncryption_oid;
52451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
52551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("SHAwithDSA")
52651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || name.equalsIgnoreCase("SHA1withDSA")
52751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || name.equalsIgnoreCase("SHA/DSA")
52851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || name.equalsIgnoreCase("SHA1/DSA")
52951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || name.equalsIgnoreCase("DSAWithSHA1")
53051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || name.equalsIgnoreCase("DSS")
53151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || name.equalsIgnoreCase("SHA-1/DSA")) {
53251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.sha1WithDSA_oid;
53351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
53451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("SHA1WithRSA")
53551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || name.equalsIgnoreCase("SHA1/RSA")) {
53651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.sha1WithRSAEncryption_oid;
53751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
53851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("SHA1withECDSA")
53951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                || name.equalsIgnoreCase("ECDSA")) {
54051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.sha1WithECDSA_oid;
54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("SHA224withECDSA")) {
54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.sha224WithECDSA_oid;
54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("SHA256withECDSA")) {
54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.sha256WithECDSA_oid;
54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
54851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("SHA384withECDSA")) {
54951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.sha384WithECDSA_oid;
55051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (name.equalsIgnoreCase("SHA512withECDSA")) {
55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return AlgorithmId.sha512WithECDSA_oid;
55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
55451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
55551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // See if any of the installed providers supply a mapping from
55651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // the given algorithm name to an OID string
5571120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski        synchronized (oidTable) {
558613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root            reinitializeMappingTableLocked();
559613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root            return oidTable.get(name.toUpperCase(Locale.ENGLISH));
560613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root        }
561613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root    }
562877e25431c4f4811851161d2047a4d7d270334bbKenny Root
563613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root    private static void reinitializeMappingTableLocked() {
564613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root        // Android-changed: Update the table only if the OID changed. Also synchronize
565613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root        // on oidTable for thread safety.
566613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root        int currentVersion = Security.getVersion();
567613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root        if (initOidTableVersion != currentVersion) {
568613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root            Provider[] provs = Security.getProviders();
569613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root            for (int i=0; i<provs.length; i++) {
570613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                for (Enumeration<Object> enum_ = provs[i].keys();
571613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                     enum_.hasMoreElements(); ) {
572613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                    String alias = (String)enum_.nextElement();
573613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                    String upperCaseAlias = alias.toUpperCase(Locale.ENGLISH);
574613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                    int index;
575613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                    if (upperCaseAlias.startsWith("ALG.ALIAS")) {
576613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                        if ((index=upperCaseAlias.indexOf("OID.", 0)) != -1) {
577613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            index += "OID.".length();
578613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            if (index == alias.length()) {
579613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                // invalid alias entry
580613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                break;
581613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            }
582613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            String oidString = alias.substring(index);
583613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            String stdAlgName = provs[i].getProperty(alias);
584613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            if (stdAlgName != null) {
585613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                stdAlgName = stdAlgName.toUpperCase(Locale.ENGLISH);
5861120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski
5871120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski                                ObjectIdentifier oid = null;
5881120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski                                try {
589613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                    oid = new ObjectIdentifier(oidString);
5901120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski                                } catch (IOException e) {
5911120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski                                    // Not an OID.
5921120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski                                }
5931120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski
5941120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski                                if (oid != null) {
595613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                    if (!oidTable.containsKey(stdAlgName)) {
596613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                        oidTable.put(stdAlgName, oid);
597613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                    }
598613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                    if (!nameTable.containsKey(oid)) {
599613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                        nameTable.put(oid, stdAlgName);
600613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                    }
601613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                }
602613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            }
603613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                        } else {
604613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            // Android-changed: If the alias isn't specified with an explicit
605613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            // "OID." in the name, we still attempt to parse it as one.
606613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            final int sep = alias.indexOf('.', "ALG.ALIAS.".length());
607613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            String suffix = alias.substring(sep + 1);
608613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root
609613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            ObjectIdentifier oid = null;
610613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            try {
611613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                oid = new ObjectIdentifier(suffix);
612613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            } catch (IOException e) {
613613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                // Not an OID.
614613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            }
615613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root
616613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                            if (oid != null) {
617613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                String stdAlgName = provs[i].getProperty(alias);
618613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                if (stdAlgName != null) {
619613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                    stdAlgName = stdAlgName.toUpperCase(Locale.ENGLISH);
620613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                    if (!oidTable.containsKey(stdAlgName)) {
621613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                        oidTable.put(stdAlgName, oid);
622613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                    }
623613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                    if (!nameTable.containsKey(oid)) {
624613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root                                        nameTable.put(oid, stdAlgName);
6251120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski                                    }
6261120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski                                }
6271120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski                            }
62851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        }
62951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
63051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
63151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
63251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
633613b47c1b5668c4e43854550d62855c4c92ede8dKenny Root            initOidTableVersion = currentVersion;
6341120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski        }
63551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
63651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
63751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static ObjectIdentifier oid(int ... values) {
63851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return ObjectIdentifier.newInternal(values);
63951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
64051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6411120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski    private static int initOidTableVersion = -1;
6421120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski    private static final Map<String,ObjectIdentifier> oidTable =
6431120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski        new HashMap<String,ObjectIdentifier>(1);
6441120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski    private static final Map<ObjectIdentifier,String> nameTable =
6451120db19d7abaa8d8a91a92b45bcbcec42ffb5e7Piotr Jastrzebski        new HashMap<ObjectIdentifier,String>();
64651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
64751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /*****************************************************************/
64851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
64951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /*
65051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * HASHING ALGORITHMS
65151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
65251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
65351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
65451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Algorithm ID for the MD2 Message Digest Algorthm, from RFC 1319.
65551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.113549.2.2
65651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
65751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier MD2_oid =
65851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    ObjectIdentifier.newInternal(new int[] {1, 2, 840, 113549, 2, 2});
65951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
66051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
66151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Algorithm ID for the MD5 Message Digest Algorthm, from RFC 1321.
66251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.113549.2.5
66351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
66451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier MD5_oid =
66551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    ObjectIdentifier.newInternal(new int[] {1, 2, 840, 113549, 2, 5});
66651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
66751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
66851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Algorithm ID for the SHA1 Message Digest Algorithm, from FIPS 180-1.
66951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This is sometimes called "SHA", though that is often confusing since
67051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * many people refer to FIPS 180 (which has an error) as defining SHA.
67151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.3.14.3.2.26. Old SHA-0 OID: 1.3.14.3.2.18.
67251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
67351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier SHA_oid =
67451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    ObjectIdentifier.newInternal(new int[] {1, 3, 14, 3, 2, 26});
67551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
67651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier SHA256_oid =
67751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    ObjectIdentifier.newInternal(new int[] {2, 16, 840, 1, 101, 3, 4, 2, 1});
67851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
67951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier SHA384_oid =
68051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    ObjectIdentifier.newInternal(new int[] {2, 16, 840, 1, 101, 3, 4, 2, 2});
68151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
68251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier SHA512_oid =
68351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    ObjectIdentifier.newInternal(new int[] {2, 16, 840, 1, 101, 3, 4, 2, 3});
68451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
68551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /*
68651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * COMMON PUBLIC KEY TYPES
68751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
68851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int DH_data[] = { 1, 2, 840, 113549, 1, 3, 1 };
68951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int DH_PKIX_data[] = { 1, 2, 840, 10046, 2, 1 };
69051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int DSA_OIW_data[] = { 1, 3, 14, 3, 2, 12 };
69151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int DSA_PKIX_data[] = { 1, 2, 840, 10040, 4, 1 };
69251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int RSA_data[] = { 2, 5, 8, 1, 1 };
69351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int RSAEncryption_data[] =
69451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                 { 1, 2, 840, 113549, 1, 1, 1 };
69551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
69651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier DH_oid;
69751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier DH_PKIX_oid;
69851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier DSA_oid;
69951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier DSA_OIW_oid;
70051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier EC_oid = oid(1, 2, 840, 10045, 2, 1);
70151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier RSA_oid;
70251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier RSAEncryption_oid;
70351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
70451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /*
70551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * COMMON SIGNATURE ALGORITHMS
70651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
70751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int md2WithRSAEncryption_data[] =
70851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                       { 1, 2, 840, 113549, 1, 1, 2 };
70951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int md5WithRSAEncryption_data[] =
71051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                       { 1, 2, 840, 113549, 1, 1, 4 };
71151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int sha1WithRSAEncryption_data[] =
71251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                       { 1, 2, 840, 113549, 1, 1, 5 };
71351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int sha1WithRSAEncryption_OIW_data[] =
71451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                       { 1, 3, 14, 3, 2, 29 };
71551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int sha256WithRSAEncryption_data[] =
71651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                       { 1, 2, 840, 113549, 1, 1, 11 };
71751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int sha384WithRSAEncryption_data[] =
71851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                       { 1, 2, 840, 113549, 1, 1, 12 };
71951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int sha512WithRSAEncryption_data[] =
72051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                       { 1, 2, 840, 113549, 1, 1, 13 };
72151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int shaWithDSA_OIW_data[] =
72251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                       { 1, 3, 14, 3, 2, 13 };
72351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int sha1WithDSA_OIW_data[] =
72451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                       { 1, 3, 14, 3, 2, 27 };
72551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int dsaWithSHA1_PKIX_data[] =
72651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                       { 1, 2, 840, 10040, 4, 3 };
72751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
72851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier md2WithRSAEncryption_oid;
72951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier md5WithRSAEncryption_oid;
73051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha1WithRSAEncryption_oid;
73151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha1WithRSAEncryption_OIW_oid;
73251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha256WithRSAEncryption_oid;
73351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha384WithRSAEncryption_oid;
73451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha512WithRSAEncryption_oid;
73551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier shaWithDSA_OIW_oid;
73651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha1WithDSA_OIW_oid;
73751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha1WithDSA_oid;
73851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
73951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha1WithECDSA_oid =
74051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                            oid(1, 2, 840, 10045, 4, 1);
74151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha224WithECDSA_oid =
74251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                            oid(1, 2, 840, 10045, 4, 3, 1);
74351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha256WithECDSA_oid =
74451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                            oid(1, 2, 840, 10045, 4, 3, 2);
74551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha384WithECDSA_oid =
74651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                            oid(1, 2, 840, 10045, 4, 3, 3);
74751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier sha512WithECDSA_oid =
74851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                            oid(1, 2, 840, 10045, 4, 3, 4);
74951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier specifiedWithECDSA_oid =
75051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                            oid(1, 2, 840, 10045, 4, 3);
75151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
75251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
75351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Algorithm ID for the PBE encryption algorithms from PKCS#5 and
75451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * PKCS#12.
75551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
75651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier pbeWithMD5AndDES_oid =
75751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ObjectIdentifier.newInternal(new int[]{1, 2, 840, 113549, 1, 5, 3});
75851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier pbeWithMD5AndRC2_oid =
75951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ObjectIdentifier.newInternal(new int[] {1, 2, 840, 113549, 1, 5, 6});
76051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier pbeWithSHA1AndDES_oid =
76151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ObjectIdentifier.newInternal(new int[] {1, 2, 840, 113549, 1, 5, 10});
76251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final ObjectIdentifier pbeWithSHA1AndRC2_oid =
76351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ObjectIdentifier.newInternal(new int[] {1, 2, 840, 113549, 1, 5, 11});
76451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static ObjectIdentifier pbeWithSHA1AndDESede_oid =
76551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ObjectIdentifier.newInternal(new int[] {1, 2, 840, 113549, 1, 12, 1, 3});
76651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static ObjectIdentifier pbeWithSHA1AndRC2_40_oid =
76751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ObjectIdentifier.newInternal(new int[] {1, 2, 840, 113549, 1, 12, 1, 6});
76851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
76951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
77051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static {
77151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /*
77251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Note the preferred OIDs are named simply with no "OIW" or
77351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * "PKIX" in them, even though they may point to data from these
77451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specs; e.g. SHA_oid, DH_oid, DSA_oid, SHA1WithDSA_oid...
77551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
77651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
77751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Algorithm ID for Diffie Hellman Key agreement, from PKCS #3.
77851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Parameters include public values P and G, and may optionally specify
77951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the length of the private key X.  Alternatively, algorithm parameters
78051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * may be derived from another source such as a Certificate Authority's
78151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * certificate.
78251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.113549.1.3.1
78351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
78451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DH_oid = ObjectIdentifier.newInternal(DH_data);
78551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
78651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
78751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Algorithm ID for the Diffie Hellman Key Agreement (DH), from RFC 3279.
78851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Parameters may include public values P and G.
78951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.10046.2.1
79051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
79151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DH_PKIX_oid = ObjectIdentifier.newInternal(DH_PKIX_data);
79251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
79351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
79451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Algorithm ID for the Digital Signing Algorithm (DSA), from the
79551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * NIST OIW Stable Agreements part 12.
79651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Parameters may include public values P, Q, and G; or these may be
79751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * derived from
79851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * another source such as a Certificate Authority's certificate.
79951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.3.14.3.2.12
80051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
80151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DSA_OIW_oid = ObjectIdentifier.newInternal(DSA_OIW_data);
80251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
80351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
80451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Algorithm ID for the Digital Signing Algorithm (DSA), from RFC 3279.
80551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Parameters may include public values P, Q, and G; or these may be
80651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * derived from another source such as a Certificate Authority's
80751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * certificate.
80851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.10040.4.1
80951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
81051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DSA_oid = ObjectIdentifier.newInternal(DSA_PKIX_data);
81151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
81251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
81351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Algorithm ID for RSA keys used for any purpose, as defined in X.509.
81451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The algorithm parameter is a single value, the number of bits in the
81551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * public modulus.
81651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 2.5.8.1.1
81751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
81851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        RSA_oid = ObjectIdentifier.newInternal(RSA_data);
81951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
82051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
82151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Algorithm ID for RSA keys used with RSA encryption, as defined
82251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in PKCS #1.  There are no parameters associated with this algorithm.
82351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.113549.1.1.1
82451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
82551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        RSAEncryption_oid = ObjectIdentifier.newInternal(RSAEncryption_data);
82651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
82751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
82851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Identifies a signing algorithm where an MD2 digest is encrypted
82951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * using an RSA private key; defined in PKCS #1.  Use of this
83051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * signing algorithm is discouraged due to MD2 vulnerabilities.
83151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.113549.1.1.2
83251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
83351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        md2WithRSAEncryption_oid =
83451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            ObjectIdentifier.newInternal(md2WithRSAEncryption_data);
83551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
83651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
83751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Identifies a signing algorithm where an MD5 digest is
83851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * encrypted using an RSA private key; defined in PKCS #1.
83951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.113549.1.1.4
84051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
84151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        md5WithRSAEncryption_oid =
84251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            ObjectIdentifier.newInternal(md5WithRSAEncryption_data);
84351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
84451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
84551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Identifies a signing algorithm where a SHA1 digest is
84651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * encrypted using an RSA private key; defined by RSA DSI.
84751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.113549.1.1.5
84851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
84951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sha1WithRSAEncryption_oid =
85051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            ObjectIdentifier.newInternal(sha1WithRSAEncryption_data);
85151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
85251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
85351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Identifies a signing algorithm where a SHA1 digest is
85451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * encrypted using an RSA private key; defined in NIST OIW.
85551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.3.14.3.2.29
85651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
85751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sha1WithRSAEncryption_OIW_oid =
85851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            ObjectIdentifier.newInternal(sha1WithRSAEncryption_OIW_data);
85951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
86051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
86151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Identifies a signing algorithm where a SHA256 digest is
86251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * encrypted using an RSA private key; defined by PKCS #1.
86351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.113549.1.1.11
86451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
86551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sha256WithRSAEncryption_oid =
86651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            ObjectIdentifier.newInternal(sha256WithRSAEncryption_data);
86751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
86851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
86951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Identifies a signing algorithm where a SHA384 digest is
87051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * encrypted using an RSA private key; defined by PKCS #1.
87151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.113549.1.1.12
87251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
87351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sha384WithRSAEncryption_oid =
87451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            ObjectIdentifier.newInternal(sha384WithRSAEncryption_data);
87551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
87651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
87751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Identifies a signing algorithm where a SHA512 digest is
87851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * encrypted using an RSA private key; defined by PKCS #1.
87951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.113549.1.1.13
88051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
88151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sha512WithRSAEncryption_oid =
88251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            ObjectIdentifier.newInternal(sha512WithRSAEncryption_data);
88351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
88451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
88551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Identifies the FIPS 186 "Digital Signature Standard" (DSS), where a
88651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * SHA digest is signed using the Digital Signing Algorithm (DSA).
88751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This should not be used.
88851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.3.14.3.2.13
88951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
89051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        shaWithDSA_OIW_oid = ObjectIdentifier.newInternal(shaWithDSA_OIW_data);
89151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
89251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
89351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Identifies the FIPS 186 "Digital Signature Standard" (DSS), where a
89451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * SHA1 digest is signed using the Digital Signing Algorithm (DSA).
89551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.3.14.3.2.27
89651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
89751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sha1WithDSA_OIW_oid = ObjectIdentifier.newInternal(sha1WithDSA_OIW_data);
89851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
89951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
90051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Identifies the FIPS 186 "Digital Signature Standard" (DSS), where a
90151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * SHA1 digest is signed using the Digital Signing Algorithm (DSA).
90251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OID = 1.2.840.10040.4.3
90351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
90451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sha1WithDSA_oid = ObjectIdentifier.newInternal(dsaWithSHA1_PKIX_data);
90551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
90651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(MD5_oid, "MD5");
90751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(MD2_oid, "MD2");
90851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(SHA_oid, "SHA");
90951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(SHA256_oid, "SHA256");
91051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(SHA384_oid, "SHA384");
91151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(SHA512_oid, "SHA512");
91251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(RSAEncryption_oid, "RSA");
91351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(RSA_oid, "RSA");
91451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(DH_oid, "Diffie-Hellman");
91551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(DH_PKIX_oid, "Diffie-Hellman");
91651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(DSA_oid, "DSA");
91751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(DSA_OIW_oid, "DSA");
91851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(EC_oid, "EC");
91951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha1WithECDSA_oid, "SHA1withECDSA");
92051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha224WithECDSA_oid, "SHA224withECDSA");
92151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha256WithECDSA_oid, "SHA256withECDSA");
92251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha384WithECDSA_oid, "SHA384withECDSA");
92351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha512WithECDSA_oid, "SHA512withECDSA");
92451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(md5WithRSAEncryption_oid, "MD5withRSA");
92551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(md2WithRSAEncryption_oid, "MD2withRSA");
92651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha1WithDSA_oid, "SHA1withDSA");
92751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha1WithDSA_OIW_oid, "SHA1withDSA");
92851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(shaWithDSA_OIW_oid, "SHA1withDSA");
92951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha1WithRSAEncryption_oid, "SHA1withRSA");
93051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha1WithRSAEncryption_OIW_oid, "SHA1withRSA");
93151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha256WithRSAEncryption_oid, "SHA256withRSA");
93251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha384WithRSAEncryption_oid, "SHA384withRSA");
93351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(sha512WithRSAEncryption_oid, "SHA512withRSA");
93451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(pbeWithMD5AndDES_oid, "PBEWithMD5AndDES");
93551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(pbeWithMD5AndRC2_oid, "PBEWithMD5AndRC2");
93651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(pbeWithSHA1AndDES_oid, "PBEWithSHA1AndDES");
93751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(pbeWithSHA1AndRC2_oid, "PBEWithSHA1AndRC2");
93851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(pbeWithSHA1AndDESede_oid, "PBEWithSHA1AndDESede");
93951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nameTable.put(pbeWithSHA1AndRC2_40_oid, "PBEWithSHA1AndRC2_40");
94051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
94151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
94251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
94351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a signature algorithm name from a digest algorithm
94451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * name and a encryption algorithm name.
94551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
94651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static String makeSigAlg(String digAlg, String encAlg) {
94751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        digAlg = digAlg.replace("-", "").toUpperCase(Locale.ENGLISH);
94851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (digAlg.equalsIgnoreCase("SHA")) digAlg = "SHA1";
94951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
95051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        encAlg = encAlg.toUpperCase(Locale.ENGLISH);
95151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (encAlg.equals("EC")) encAlg = "ECDSA";
95251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
95351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return digAlg + "with" + encAlg;
95451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
95551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
95651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
95751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Extracts the encryption algorithm name from a signature
95851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * algorithm name.
95951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski      */
96051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static String getEncAlgFromSigAlg(String signatureAlgorithm) {
96151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        signatureAlgorithm = signatureAlgorithm.toUpperCase(Locale.ENGLISH);
96251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int with = signatureAlgorithm.indexOf("WITH");
96351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String keyAlgorithm = null;
96451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (with > 0) {
96551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            int and = signatureAlgorithm.indexOf("AND", with + 4);
96651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (and > 0) {
96751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                keyAlgorithm = signatureAlgorithm.substring(with + 4, and);
96851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
96951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                keyAlgorithm = signatureAlgorithm.substring(with + 4);
97051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
97151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (keyAlgorithm.equalsIgnoreCase("ECDSA")) {
97251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                keyAlgorithm = "EC";
97351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
97451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
97551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return keyAlgorithm;
97651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
97751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
97851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
97951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Extracts the digest algorithm name from a signature
98051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * algorithm name.
98151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski      */
98251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static String getDigAlgFromSigAlg(String signatureAlgorithm) {
98351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        signatureAlgorithm = signatureAlgorithm.toUpperCase(Locale.ENGLISH);
98451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int with = signatureAlgorithm.indexOf("WITH");
98551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (with > 0) {
98651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return signatureAlgorithm.substring(0, with);
98751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
98851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return null;
98951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
99051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
991