From af5d23c30f773e275bfbe630d51fbcc7464ded9b Mon Sep 17 00:00:00 2001 From: ferbas Date: Tue, 27 Oct 2009 10:47:09 +0000 Subject: added support for dynamic algorithm suites / acos04 git-svn-id: https://joinup.ec.europa.eu/svn/pdf-as/trunk@348 7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c --- .../egiz/pdfas/algorithmSuite/AlgorithmMapper.java | 120 +++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 src/main/java/at/gv/egiz/pdfas/algorithmSuite/AlgorithmMapper.java (limited to 'src/main/java/at/gv/egiz/pdfas/algorithmSuite/AlgorithmMapper.java') diff --git a/src/main/java/at/gv/egiz/pdfas/algorithmSuite/AlgorithmMapper.java b/src/main/java/at/gv/egiz/pdfas/algorithmSuite/AlgorithmMapper.java new file mode 100644 index 0000000..8af0db2 --- /dev/null +++ b/src/main/java/at/gv/egiz/pdfas/algorithmSuite/AlgorithmMapper.java @@ -0,0 +1,120 @@ +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); + } + } + +} -- cgit v1.2.3