1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Vladimir N. Molotkov
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.utils;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Provider;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Security;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.HashMap;
28a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilsonimport java.util.Locale;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Map;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Map.Entry;
317365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilsonimport java.util.Set;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ObjectIdentifier;
336243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Rootimport org.apache.harmony.security.fortress.Services;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
362f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * Provides Algorithm Name to OID and OID to Algorithm Name mappings. Some known
372f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * mappings are hardcoded. Tries to obtain additional mappings from installed
382f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * providers during initialization.
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class AlgNameMapper {
41b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root    private static AlgNameMapperSource source = null;
42f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
436243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root    private static volatile int cacheVersion = -1;
446243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Will search OID mappings for these services
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String[] serviceName = {
47f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "Cipher",
48f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "AlgorithmParameters",
49f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "Signature"
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // These mappings CAN NOT be overridden
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // by the ones from available providers
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // during maps initialization
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // (source: http://asn1.elibel.tm.fr):
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String[][] knownAlgMappings = {
57f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.10040.4.1",       "DSA"},
58f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.10040.4.3",       "SHA1withDSA"},
59f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.1.1.1",    "RSA"},
6087eb4de6347e1be029cde77dd43ad9b1af901472Urs Grob        // BEGIN android-removed
6187eb4de6347e1be029cde77dd43ad9b1af901472Urs Grob        // Dropping MD2
62f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // {"1.2.840.113549.1.1.2",    "MD2withRSA"},
6387eb4de6347e1be029cde77dd43ad9b1af901472Urs Grob        // END android-removed
64f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.1.1.4",    "MD5withRSA"},
65f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.1.1.5",    "SHA1withRSA"},
66f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.1.3.1",    "DiffieHellman"},
67f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.1.5.3",    "pbeWithMD5AndDES-CBC"},
68f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.1.12.1.3", "pbeWithSHAAnd3-KeyTripleDES-CBC"},
69f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.1.12.1.6", "pbeWithSHAAnd40BitRC2-CBC"},
70f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.3.2",      "RC2-CBC"},
71f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.3.3",      "RC2-EBC"},
72f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.3.4",      "RC4"},
73f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.3.5",      "RC4WithMAC"},
74f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.3.6",      "DESx-CBC"},
75f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.3.7",      "TripleDES-CBC"},
76f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.3.8",      "rc5CBC"},
77f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.3.9",      "RC5-CBC"},
78f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"1.2.840.113549.3.10",     "DESCDMF"},
79f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        {"2.23.42.9.11.4.1",        "ECDSA"},
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Maps alg name to OID
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final Map<String, String> alg2OidMap = new HashMap<String, String>();
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Maps OID to alg name
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final Map<String, String> oid2AlgMap = new HashMap<String, String>();
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Maps aliases to alg names
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final Map<String, String> algAliasesMap = new HashMap<String, String>();
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static {
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (String[] element : knownAlgMappings) {
90a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson            String algUC = element[1].toUpperCase(Locale.US);
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            alg2OidMap.put(algUC, element[0]);
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            oid2AlgMap.put(element[0], algUC);
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // map upper case alg name to its original name
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            algAliasesMap.put(algUC, element[1]);
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // No instances
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private AlgNameMapper() {
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
101f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1026243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root    private static synchronized void checkCacheVersion() {
1036243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root        int newCacheVersion = Services.getCacheVersion();
1046243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root        if (newCacheVersion != cacheVersion) {
1056243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root            //
1066243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root            // Now search providers for mappings like
1076243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root            // Alg.Alias.<service>.<OID-INTS-DOT-SEPARATED>=<alg-name>
1086243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root            //  or
1096243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root            // Alg.Alias.<service>.OID.<OID-INTS-DOT-SEPARATED>=<alg-name>
1106243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root            //
1116243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root            Provider[] pl = Security.getProviders();
1126243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root            for (Provider element : pl) {
1136243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root                selectEntries(element);
1146243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root            }
1156243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root            cacheVersion = newCacheVersion;
1166243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root        }
1176243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root    }
1186243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns OID for algName
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algName algorithm name to be mapped
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return OID as String
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String map2OID(String algName) {
1266243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root        checkCacheVersion();
1276243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // alg2OidMap map contains upper case keys
129b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        String result = alg2OidMap.get(algName.toUpperCase(Locale.US));
130b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        if (result != null) {
131b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root            return result;
132b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        }
133b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root
134b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        // Check our external source.
135b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        AlgNameMapperSource s = source;
136b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        if (s != null) {
137b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root            return s.mapNameToOid(algName);
138b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        }
139b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root
140b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        return null;
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns algName for OID
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param oid OID to be mapped
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return algorithm name
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String map2AlgName(String oid) {
1506243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root        checkCacheVersion();
1516243428ca4ba6d9d767070bbe2d5c480bbcd0669Kenny Root
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // oid2AlgMap map contains upper case values
153b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        String algUC = oid2AlgMap.get(oid);
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if not null there is always map UC->Orig
1554a8388aeb988c5ed88f1105f9fa66a5ebd2ffbe3Kenny Root        if (algUC != null) {
1564a8388aeb988c5ed88f1105f9fa66a5ebd2ffbe3Kenny Root            return algAliasesMap.get(algUC);
1574a8388aeb988c5ed88f1105f9fa66a5ebd2ffbe3Kenny Root        }
158b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root
159b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        // Check our external source.
160b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        AlgNameMapperSource s = source;
161b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        if (s != null) {
162b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root            return s.mapOidToName(oid);
163b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        }
164b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root
16538375a4d0b3d34e2babbd2f6a013976c7c439696Kenny Root        return null;
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns Algorithm name for given algorithm alias
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algName - alias
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return algorithm name
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String getStandardName(String algName) {
175a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson        return algAliasesMap.get(algName.toUpperCase(Locale.US));
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Searches given provider for mappings like
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Alg.Alias.<service>.<OID-INTS-DOT-SEPARATED>=<alg-name>
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //  or
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Alg.Alias.<service>.OID.<OID-INTS-DOT-SEPARATED>=<alg-name>
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Puts mappings found into appropriate internal maps
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static void selectEntries(Provider p) {
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Set<Map.Entry<Object, Object>> entrySet = p.entrySet();
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (String service : serviceName) {
186f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            String keyPrfix2find = "Alg.Alias." + service + ".";
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (Entry<Object, Object> me : entrySet) {
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                String key = (String)me.getKey();
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (key.startsWith(keyPrfix2find)) {
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    String alias = key.substring(keyPrfix2find.length());
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    String alg = (String)me.getValue();
192a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson                    String algUC = alg.toUpperCase(Locale.US);
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (isOID(alias)) {
194f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                        if (alias.startsWith("OID.")) {
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            alias = alias.substring(4);
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        // Do not overwrite already known mappings
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        boolean oid2AlgContains = oid2AlgMap.containsKey(alias);
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        boolean alg2OidContains = alg2OidMap.containsKey(algUC);
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        if (!oid2AlgContains || !alg2OidContains) {
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            if (!oid2AlgContains) {
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                oid2AlgMap.put(alias, algUC);
203f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                            }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            if (!alg2OidContains) {
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                alg2OidMap.put(algUC, alias);
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            }
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            // map upper case alg name to its original name
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            algAliasesMap.put(algUC, alg);
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                           // Do not override known standard names
211a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson                    } else if (!algAliasesMap.containsKey(alias.toUpperCase(Locale.US))) {
212a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson                        algAliasesMap.put(alias.toUpperCase(Locale.US), alg);
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
218f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Checks if parameter represents OID
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias alias to be checked
223f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @return 'true' if parameter represents OID
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean isOID(String alias) {
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ObjectIdentifier.isOID(normalize(alias));
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes leading "OID." from oid String passed
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param oid string that may contain leading "OID."
233f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @return string passed without leading "OID."
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String normalize(String oid) {
236f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        return oid.startsWith("OID.")
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ? oid.substring(4)
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            : oid;
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
240b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root
241b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root    public static void setSource(AlgNameMapperSource source) {
242b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root        AlgNameMapper.source = source;
243b6963ac272834ec5f791ecdc773d17cb156e23f0Kenny Root    }
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
245