/* * XAdES4j - A Java library for generation and verification of XAdES signatures. * Copyright (C) 2017 Luis Goncalves. * * XAdES4j is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 3 of the License, or any later version. * * XAdES4j is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License along * with XAdES4j. If not, see <http://www.gnu.org/licenses/>. */ package xades4j.utils; import java.util.Collections; import java.util.List; import org.apache.xml.security.transforms.InvalidTransformException; import org.apache.xml.security.transforms.Transform; import org.apache.xml.security.transforms.TransformationException; import org.apache.xml.security.transforms.Transforms; import org.w3c.dom.Document; import org.w3c.dom.Node; import xades4j.UnsupportedAlgorithmException; import xades4j.algorithms.Algorithm; import xades4j.xml.marshalling.algorithms.AlgorithmsParametersMarshallingProvider; /** * * @author luis */ public final class TransformUtils { /** * Creates a Transform element for a given algorithm. * @param algorithm algorithm * @param parametersMarshallingProvider algorithm parameters marshaller * @param document the target XML document * @return the Transform * @throws UnsupportedAlgorithmException if the algorithm is not supported */ public static Transform createTransform(Algorithm algorithm, AlgorithmsParametersMarshallingProvider parametersMarshallingProvider, Document document) throws UnsupportedAlgorithmException { List<Node> params = parametersMarshallingProvider.marshalParameters(algorithm, document); try { if (null == params) { return new Transform(document, algorithm.getUri()); } else { return new Transform(document, algorithm.getUri(), DOMHelper.nodeList(params)); } } catch (InvalidTransformException ex) { throw new UnsupportedAlgorithmException("C14N algorithm not supported in the XML Signature provider", algorithm.getUri(), ex); } } /** * Creates a Transforms element for a given set of algorithms * @param document the target XML document * @param algorithmsParametersMarshaller algorithm parameters marshaller * @param algorithms algorithms * @return the Transforms * @throws UnsupportedAlgorithmException if an algorithm is not supported */ public static Transforms createTransforms( Document document, AlgorithmsParametersMarshallingProvider algorithmsParametersMarshaller, Iterable<Algorithm> algorithms) throws UnsupportedAlgorithmException { Transforms transforms = new Transforms(document); for (Algorithm t : algorithms) { try { List<Node> params = algorithmsParametersMarshaller.marshalParameters(t, document); if (null == params) { transforms.addTransform(t.getUri()); } else { transforms.addTransform(t.getUri(), DOMHelper.nodeList(params)); } } catch (TransformationException ex) { throw new UnsupportedAlgorithmException( "Unsupported transform on XML Signature provider", t.getUri(), ex); } } return transforms; } /** * Creates a Transforms element for a given algorithm * @param algorithm algorithm * @param algorithmsParametersMarshaller algorithm parameters marshaller * @param document the target XML document * @return the Transforms * @throws UnsupportedAlgorithmException if an algorithm is not supported */ public static Transforms createTransforms( Algorithm algorithm, AlgorithmsParametersMarshallingProvider algorithmsParametersMarshaller, Document document) throws UnsupportedAlgorithmException { return createTransforms(document, algorithmsParametersMarshaller, Collections.singleton(algorithm)); } }