001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package org.apache.harmony.luni.util;
019:
020: import java.util.HashSet;
021: import java.util.Iterator;
022: import java.util.LinkedList;
023: import java.util.List;
024: import java.util.Set;
025:
026: public class OIDDatabase {
027:
028: private static OIDDatabase instance = new OIDDatabase();
029:
030: private Set<DBEntry> oids = new HashSet<DBEntry>();
031:
032: private Set<DBEntry> algorithms = new HashSet<DBEntry>();
033:
034: /**
035: * Private constructor to enforce singleton pattern
036: */
037: private OIDDatabase() {
038: // First, encryption algorithms...
039:
040: // MD2withRSA
041: DBEntry oid = new DBEntry("1.2.840.113549.1.1.2");
042: DBEntry alg = new DBEntry("MD2withRSA");
043: wireTogether(oid, alg);
044:
045: // MD5withRSA
046: oid = new DBEntry("1.2.840.113549.1.1.4");
047: alg = new DBEntry("MD5withRSA");
048: wireTogether(oid, alg);
049:
050: // SHA1withRSA
051: oid = new DBEntry("1.2.840.113549.1.1.5");
052: alg = new DBEntry("SHA1withRSA");
053: wireTogether(oid, alg);
054:
055: // SHA1withDSA
056: oid = new DBEntry("1.2.840.10040.4.3");
057: alg = new DBEntry("SHA1withDSA");
058: wireTogether(oid, alg);
059:
060: // message digest algorithms
061:
062: // SHA and SHA-1
063: oid = new DBEntry("1.3.14.3.2.26");
064: alg = new DBEntry("SHA");
065: DBEntry alg2 = new DBEntry("SHA-1");
066: wireTogether(oid, alg);
067: wireTogether(oid, alg2);
068:
069: // MD5
070: oid = new DBEntry("1.2.840.113549.2.5");
071: alg = new DBEntry("MD5");
072: wireTogether(oid, alg);
073:
074: // key factories
075:
076: // RSA
077: oid = new DBEntry("1.2.840.113549.1.1.1");
078: alg = new DBEntry("RSA");
079: wireTogether(oid, alg);
080:
081: // DSA
082: oid = new DBEntry("1.2.840.10040.4.1");
083: DBEntry oid2 = new DBEntry("1.3.14.3.2.12");
084: alg = new DBEntry("DSA");
085: wireTogether(oid, alg);
086: wireTogether(oid2, alg);
087:
088: // DiffieHellman
089: oid = new DBEntry("1.2.840.10046.2.1");
090: alg = new DBEntry("DiffieHellman");
091: wireTogether(oid, alg);
092: }
093:
094: private void wireTogether(DBEntry oidValue, DBEntry algorithmValue) {
095: oids.add(oidValue);
096: algorithms.add(algorithmValue);
097: oidValue.addEquivalent(algorithmValue);
098: algorithmValue.addEquivalent(oidValue);
099: }
100:
101: public static OIDDatabase getInstance() {
102: return instance;
103: }
104:
105: public String getFirstAlgorithmForOID(String oid) {
106: String result = null;
107: Iterator<String> it = this .getAllAlgorithmsForOID(oid)
108: .iterator();
109: if (it.hasNext()) {
110: result = (it.next());
111: }
112: return result;
113: }
114:
115: public Set<String> getAllAlgorithmsForOID(String oid) {
116: Set<String> result = null;
117: Iterator<DBEntry> it = this .oids.iterator();
118: result = getAllEquivalents(oid, it);
119: if (result == null) {
120: throw new IllegalArgumentException("Unknown OID : " + oid);
121: }
122: return result;
123: }
124:
125: public String getFirstOIDForAlgorithm(String algorithm) {
126: String result = null;
127: Iterator<String> it = this .getAllOIDsForAlgorithm(algorithm)
128: .iterator();
129: if (it.hasNext()) {
130: result = (it.next());
131: }
132: return result;
133: }
134:
135: public Set<String> getAllOIDsForAlgorithm(String algorithm) {
136: Set<String> result = null;
137: Iterator<DBEntry> it = this .algorithms.iterator();
138: result = getAllEquivalents(algorithm, it);
139: if (result == null) {
140: throw new IllegalArgumentException(
141: "Unsupported algorithm : " + algorithm);
142: }
143: return result;
144: }
145:
146: private Set<String> getAllEquivalents(String value,
147: Iterator<DBEntry> it) {
148: Set<String> result = null;
149: while (it.hasNext()) {
150: DBEntry element = it.next();
151: if (element.getValue().equals(value)) {
152: Set<DBEntry> allMatchingDBEntries = element
153: .getAllEquivalents();
154: result = new HashSet<String>();
155: Iterator<DBEntry> dbIt = allMatchingDBEntries
156: .iterator();
157: while (dbIt.hasNext()) {
158: DBEntry matchingEntry = dbIt.next();
159: result.add(matchingEntry.getValue());
160: }
161: }
162: }
163: return result;
164: }
165:
166: static class DBEntry {
167: private final List<DBEntry> equivalents = new LinkedList<DBEntry>();
168:
169: private final String value;
170:
171: DBEntry(String value) {
172: this .value = value;
173: }
174:
175: void addEquivalent(DBEntry entry) {
176: this .equivalents.add(entry);
177: }
178:
179: String getValue() {
180: return this .value;
181: }
182:
183: Set<DBEntry> getAllEquivalents() {
184: return new HashSet<DBEntry>(this.equivalents);
185: }
186: }
187: }
|