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