/** * Copyright 2006 by Know-Center, Graz, Austria * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a * joint initiative of the Federal Chancellery Austria and Graz University of * Technology. * * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by * the European Commission - subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * http://www.osor.eu/eupl/ * * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and * limitations under the Licence. * * This product combines work with different licenses. See the "NOTICE" text * file for details on the various modules and licenses. * The "NOTICE" text file is part of the distribution. Any derivative works * that you distribute must include a readable copy of the "NOTICE" text file. */ package at.gv.egiz.pdfas.algorithmSuite; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Utility for mapping signature and hash algorithms between URI and abbreviation.
* Supported algorithms are defined in external resource {@value #SUPPORTED_ALGORITHMS_RESOURCE}
* * e.g. sha1 <-> http://www.w3.org/2000/09/xmldsig#sha1 * * @author dferbas * */ public class AlgorithmMapper { private static final String SUPPORTED_ALGORITHMS_RESOURCE = "supportedAlgorithms.txt"; private static Map algorithmMap = new HashMap(); private static Log log = LogFactory.getLog(AlgorithmMapper.class); /** * read available algorithms from resource */ static { try { log.debug("reading supported algorithms from " + SUPPORTED_ALGORITHMS_RESOURCE); List lines = IOUtils.readLines(AlgorithmMapper.class.getResourceAsStream(SUPPORTED_ALGORITHMS_RESOURCE)); for (int i = 0; i < lines.size(); i++) { String uri = (String)lines.get(i); if (isValidLine(uri)) { String abbr = parseAbbreviation(uri); algorithmMap.put(abbr, uri); if (log.isDebugEnabled()) { log.debug("added supported algorithm: " + abbr + "=" + uri); } } } } catch (IOException e) { throw new RuntimeException("error loading supportetAlgorithms.properties file", e); } } /** * Get algorithm abbreviation (equals last part after namespace#) from uri
* * e.g. sha1 from http://www.w3.org/2000/09/xmldsig#sha1 * * @param algorithmUri algorithm URI * @return algorithm abbreviation */ public static String getAbbreviation(String algorithmUri) { if (!algorithmMap.containsValue(algorithmUri)) { throw new RuntimeException("unsupported Algorithm " + algorithmUri); } return parseAbbreviation(algorithmUri); } private static boolean isValidLine(String uri) { if (uri == null || uri.length() == 0) return false; if (uri.trim().startsWith("#")) return false; return true; } /** * Get valid URI from algorithm abbreviation
* * e.g. http://www.w3.org/2000/09/xmldsig#sha1 from sha1 * * @param algorithmShort * @return URI */ public static String getUri(String algorithmShort) { if (!algorithmMap.containsKey(algorithmShort)) { throw new RuntimeException("unsupported Algorithm " + algorithmShort); } return (String)algorithmMap.get(algorithmShort); } /** * Get hash (abbreviation) from signature method (eg. sha1 from ecdsa-sha1). * @param suite abbreviation or full qualified signature method * @return digest method abbreviation */ public static String getHashAbbrFromSuite(String suite) { try { int pos = suite.lastIndexOf('-'); return suite.substring(pos + 1); } catch (Exception e) { throw new RuntimeException("cannot parse algorithm string for hash method: " + suite); } } /** * * Get hash method (URI) from signature method * @param suite abbreviation or full qualified signature method * @return digest method URI * */ public static String getHashUriFromSuite(String suite) { return getUri(getHashAbbrFromSuite(suite)); } private static String parseAbbreviation(String algorithmUri) { try { int pos = algorithmUri.lastIndexOf('#'); return algorithmUri.substring(pos + 1); } catch (Exception e) { throw new RuntimeException("invalid algorithm entry in " + SUPPORTED_ALGORITHMS_RESOURCE + ": " + algorithmUri); } } }