Search in sources :

Example 6 with XMLSignatureException

use of javax.xml.crypto.dsig.XMLSignatureException in project poi by apache.

the class SignatureInfo method preSign.

/**
     * Helper method for adding informations before the signing.
     * Normally {@link #confirmSignature()} is sufficient to be used.
     */
@SuppressWarnings("unchecked")
public DigestInfo preSign(Document document, List<DigestInfo> digestInfos) throws XMLSignatureException, MarshalException {
    signatureConfig.init(false);
    // it's necessary to explicitly set the mdssi namespace, but the sign() method has no
    // normal way to interfere with, so we need to add the namespace under the hand ...
    EventTarget target = (EventTarget) document;
    EventListener creationListener = signatureConfig.getSignatureMarshalListener();
    if (creationListener != null) {
        if (creationListener instanceof SignatureMarshalListener) {
            ((SignatureMarshalListener) creationListener).setEventTarget(target);
        }
        SignatureMarshalListener.setListener(target, creationListener, true);
    }
    /*
         * Signature context construction.
         */
    XMLSignContext xmlSignContext = new DOMSignContext(signatureConfig.getKey(), document);
    URIDereferencer uriDereferencer = signatureConfig.getUriDereferencer();
    if (null != uriDereferencer) {
        xmlSignContext.setURIDereferencer(uriDereferencer);
    }
    for (Map.Entry<String, String> me : signatureConfig.getNamespacePrefixes().entrySet()) {
        xmlSignContext.putNamespacePrefix(me.getKey(), me.getValue());
    }
    xmlSignContext.setDefaultNamespacePrefix("");
    // signatureConfig.getNamespacePrefixes().get(XML_DIGSIG_NS));
    brokenJvmWorkaround(xmlSignContext);
    XMLSignatureFactory signatureFactory = signatureConfig.getSignatureFactory();
    /*
         * Add ds:References that come from signing client local files.
         */
    List<Reference> references = new ArrayList<Reference>();
    for (DigestInfo digestInfo : safe(digestInfos)) {
        byte[] documentDigestValue = digestInfo.digestValue;
        String uri = new File(digestInfo.description).getName();
        Reference reference = SignatureFacet.newReference(uri, null, null, null, documentDigestValue, signatureConfig);
        references.add(reference);
    }
    /*
         * Invoke the signature facets.
         */
    List<XMLObject> objects = new ArrayList<XMLObject>();
    for (SignatureFacet signatureFacet : signatureConfig.getSignatureFacets()) {
        LOG.log(POILogger.DEBUG, "invoking signature facet: " + signatureFacet.getClass().getSimpleName());
        signatureFacet.preSign(document, references, objects);
    }
    /*
         * ds:SignedInfo
         */
    SignedInfo signedInfo;
    try {
        SignatureMethod signatureMethod = signatureFactory.newSignatureMethod(signatureConfig.getSignatureMethodUri(), null);
        CanonicalizationMethod canonicalizationMethod = signatureFactory.newCanonicalizationMethod(signatureConfig.getCanonicalizationMethod(), (C14NMethodParameterSpec) null);
        signedInfo = signatureFactory.newSignedInfo(canonicalizationMethod, signatureMethod, references);
    } catch (GeneralSecurityException e) {
        throw new XMLSignatureException(e);
    }
    /*
         * JSR105 ds:Signature creation
         */
    String signatureValueId = signatureConfig.getPackageSignatureId() + "-signature-value";
    javax.xml.crypto.dsig.XMLSignature xmlSignature = signatureFactory.newXMLSignature(signedInfo, null, objects, signatureConfig.getPackageSignatureId(), signatureValueId);
    /*
         * ds:Signature Marshalling.
         */
    xmlSignature.sign(xmlSignContext);
    /*
         * Completion of undigested ds:References in the ds:Manifests.
         */
    for (XMLObject object : objects) {
        LOG.log(POILogger.DEBUG, "object java type: " + object.getClass().getName());
        List<XMLStructure> objectContentList = object.getContent();
        for (XMLStructure objectContent : objectContentList) {
            LOG.log(POILogger.DEBUG, "object content java type: " + objectContent.getClass().getName());
            if (!(objectContent instanceof Manifest))
                continue;
            Manifest manifest = (Manifest) objectContent;
            List<Reference> manifestReferences = manifest.getReferences();
            for (Reference manifestReference : manifestReferences) {
                if (manifestReference.getDigestValue() != null)
                    continue;
                DOMReference manifestDOMReference = (DOMReference) manifestReference;
                manifestDOMReference.digest(xmlSignContext);
            }
        }
    }
    /*
         * Completion of undigested ds:References.
         */
    List<Reference> signedInfoReferences = signedInfo.getReferences();
    for (Reference signedInfoReference : signedInfoReferences) {
        DOMReference domReference = (DOMReference) signedInfoReference;
        // ds:Reference with external digest value
        if (domReference.getDigestValue() != null)
            continue;
        domReference.digest(xmlSignContext);
    }
    /*
         * Calculation of XML signature digest value.
         */
    DOMSignedInfo domSignedInfo = (DOMSignedInfo) signedInfo;
    ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
    domSignedInfo.canonicalize(xmlSignContext, dataStream);
    byte[] octets = dataStream.toByteArray();
    /*
         * TODO: we could be using DigestOutputStream here to optimize memory
         * usage.
         */
    MessageDigest md = CryptoFunctions.getMessageDigest(signatureConfig.getDigestAlgo());
    byte[] digestValue = md.digest(octets);
    String description = signatureConfig.getSignatureDescription();
    return new DigestInfo(digestValue, signatureConfig.getDigestAlgo(), description);
}
Also used : ArrayList(java.util.ArrayList) XMLStructure(javax.xml.crypto.XMLStructure) URIDereferencer(javax.xml.crypto.URIDereferencer) XMLSignContext(javax.xml.crypto.dsig.XMLSignContext) EventListener(org.w3c.dom.events.EventListener) MessageDigest(java.security.MessageDigest) EventTarget(org.w3c.dom.events.EventTarget) XMLSignatureFactory(javax.xml.crypto.dsig.XMLSignatureFactory) DOMSignedInfo(org.apache.jcp.xml.dsig.internal.dom.DOMSignedInfo) DOMReference(org.apache.jcp.xml.dsig.internal.dom.DOMReference) Reference(javax.xml.crypto.dsig.Reference) GeneralSecurityException(java.security.GeneralSecurityException) CanonicalizationMethod(javax.xml.crypto.dsig.CanonicalizationMethod) XMLObject(javax.xml.crypto.dsig.XMLObject) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Manifest(javax.xml.crypto.dsig.Manifest) DOMReference(org.apache.jcp.xml.dsig.internal.dom.DOMReference) DOMSignedInfo(org.apache.jcp.xml.dsig.internal.dom.DOMSignedInfo) SignedInfo(javax.xml.crypto.dsig.SignedInfo) SignatureFacet(org.apache.poi.poifs.crypt.dsig.facets.SignatureFacet) DOMSignContext(javax.xml.crypto.dsig.dom.DOMSignContext) SignatureMethod(javax.xml.crypto.dsig.SignatureMethod) Map(java.util.Map) HashMap(java.util.HashMap) File(java.io.File) XMLSignatureException(javax.xml.crypto.dsig.XMLSignatureException) XMLSignature(javax.xml.crypto.dsig.XMLSignature)

Example 7 with XMLSignatureException

use of javax.xml.crypto.dsig.XMLSignatureException in project poi by apache.

the class OOXMLSignatureFacet method addManifestReferences.

@SuppressWarnings("resource")
protected void addManifestReferences(List<Reference> manifestReferences) throws XMLSignatureException {
    OPCPackage ooxml = signatureConfig.getOpcPackage();
    List<PackagePart> relsEntryNames = ooxml.getPartsByContentType(ContentTypes.RELATIONSHIPS_PART);
    Set<String> digestedPartNames = new HashSet<String>();
    for (PackagePart pp : relsEntryNames) {
        String baseUri = pp.getPartName().getName().replaceFirst("(.*)/_rels/.*", "$1");
        PackageRelationshipCollection prc;
        try {
            prc = new PackageRelationshipCollection(ooxml);
            prc.parseRelationshipsPart(pp);
        } catch (InvalidFormatException e) {
            throw new XMLSignatureException("Invalid relationship descriptor: " + pp.getPartName().getName(), e);
        }
        RelationshipTransformParameterSpec parameterSpec = new RelationshipTransformParameterSpec();
        for (PackageRelationship relationship : prc) {
            String relationshipType = relationship.getRelationshipType();
            /*
                 * ECMA-376 Part 2 - 3rd edition
                 * 13.2.4.16 Manifest Element
                 * "The producer shall not create a Manifest element that references any data outside of the package."
                 */
            if (TargetMode.EXTERNAL == relationship.getTargetMode()) {
                continue;
            }
            if (!isSignedRelationship(relationshipType))
                continue;
            parameterSpec.addRelationshipReference(relationship.getId());
            // TODO: find a better way ...
            String partName = relationship.getTargetURI().toString();
            if (!partName.startsWith(baseUri)) {
                partName = baseUri + partName;
            }
            try {
                partName = new URI(partName).normalize().getPath().replace('\\', '/');
                LOG.log(POILogger.DEBUG, "part name: " + partName);
            } catch (URISyntaxException e) {
                throw new XMLSignatureException(e);
            }
            String contentType;
            try {
                PackagePartName relName = PackagingURIHelper.createPartName(partName);
                PackagePart pp2 = ooxml.getPart(relName);
                contentType = pp2.getContentType();
            } catch (InvalidFormatException e) {
                throw new XMLSignatureException(e);
            }
            if (relationshipType.endsWith("customXml") && !(contentType.equals("inkml+xml") || contentType.equals("text/xml"))) {
                LOG.log(POILogger.DEBUG, "skipping customXml with content type: " + contentType);
                continue;
            }
            if (!digestedPartNames.contains(partName)) {
                // We only digest a part once.
                String uri = partName + "?ContentType=" + contentType;
                Reference reference = newReference(uri, null, null, null, null);
                manifestReferences.add(reference);
                digestedPartNames.add(partName);
            }
        }
        if (parameterSpec.hasSourceIds()) {
            List<Transform> transforms = new ArrayList<Transform>();
            transforms.add(newTransform(RelationshipTransformService.TRANSFORM_URI, parameterSpec));
            transforms.add(newTransform(CanonicalizationMethod.INCLUSIVE));
            String uri = pp.getPartName().getName() + "?ContentType=application/vnd.openxmlformats-package.relationships+xml";
            Reference reference = newReference(uri, transforms, null, null, null);
            manifestReferences.add(reference);
        }
    }
}
Also used : PackagePartName(org.apache.poi.openxml4j.opc.PackagePartName) PackageRelationshipCollection(org.apache.poi.openxml4j.opc.PackageRelationshipCollection) Reference(javax.xml.crypto.dsig.Reference) ArrayList(java.util.ArrayList) URISyntaxException(java.net.URISyntaxException) PackagePart(org.apache.poi.openxml4j.opc.PackagePart) InvalidFormatException(org.apache.poi.openxml4j.exceptions.InvalidFormatException) URI(java.net.URI) PackageRelationship(org.apache.poi.openxml4j.opc.PackageRelationship) RelationshipTransformParameterSpec(org.apache.poi.poifs.crypt.dsig.services.RelationshipTransformService.RelationshipTransformParameterSpec) Transform(javax.xml.crypto.dsig.Transform) OPCPackage(org.apache.poi.openxml4j.opc.OPCPackage) XMLSignatureException(javax.xml.crypto.dsig.XMLSignatureException) HashSet(java.util.HashSet)

Example 8 with XMLSignatureException

use of javax.xml.crypto.dsig.XMLSignatureException in project AutomatedCar by SzFMV2018-Tavasz.

the class XmlToModelConverter method getRotacionFromTransformElement.

/**
 * @param transform XML element, contain transform matrix param
 * @return rotacion param
 * @throws XMLSignatureException transform matrix error
 */
private static float getRotacionFromTransformElement(Element transform) throws XMLSignatureException {
    // Inicialize
    double m11;
    double m12;
    double m21;
    double m22;
    try {
        // Get and parse attribute from element
        m11 = Double.parseDouble(transform.getAttribute("m11"));
        m12 = Double.parseDouble(transform.getAttribute("m12"));
        m21 = Double.parseDouble(transform.getAttribute("m21"));
        m22 = Double.parseDouble(transform.getAttribute("m22"));
        // convert transform matirx to rotacion
        return (float) convertMatrixToRadians(m11, m12, m21, m22);
    } catch (NumberFormatException e) {
        throw new XMLSignatureException("Invalid format: Transform attributes is not Double: " + e.getMessage());
    }
}
Also used : XMLSignatureException(javax.xml.crypto.dsig.XMLSignatureException)

Example 9 with XMLSignatureException

use of javax.xml.crypto.dsig.XMLSignatureException in project AutomatedCar by SzFMV2018-Tavasz.

the class XmlToModelConverter method readValueFromXml.

/**
 * @param objectElement A Xml Object that can be converted to WorldObject
 * @return WorldObject created from Xml Object
 * @throws XMLSignatureException thrown if tag missing from XmlObject
 * @throws IOException           thrown if WorldObject representative picture not found
 */
private static WorldObject readValueFromXml(Element objectElement) throws XMLSignatureException, IOException {
    // Find Position, Transform, type parameter in current object.
    String type = objectElement.getAttribute("type");
    Element position = null;
    Element transform = null;
    NodeList objectChildNodes = objectElement.getChildNodes();
    for (int i = 0; i < objectChildNodes.getLength(); i++) {
        switch(objectChildNodes.item(i).getNodeName()) {
            case "Position":
                position = (Element) objectChildNodes.item(i);
                break;
            case "Transform":
                transform = (Element) objectChildNodes.item(i);
                break;
            default:
        }
    }
    if (position == null || transform == null) {
        throw new XMLSignatureException("Invalid format: Not found Position or Transform in Object");
    }
    WorldObject wo = createObjectFromType(type);
    // Set setImageFileName
    wo.setImageFileName(type + ".png");
    // set dimens
    wo.generateDimens();
    // Set position
    Integer[] points = getPointsFromPositionElement(position);
    wo.setX(points[0]);
    wo.setY(points[1]);
    // Set rotation
    wo.setRotation(getRotacionFromTransformElement(transform));
    // Shape drowing
    wo.generateShape();
    LOGGER.debug(wo.toString());
    return wo;
}
Also used : Element(org.w3c.dom.Element) NodeList(org.w3c.dom.NodeList) XMLSignatureException(javax.xml.crypto.dsig.XMLSignatureException)

Example 10 with XMLSignatureException

use of javax.xml.crypto.dsig.XMLSignatureException in project AutomatedCar by SzFMV2018-Tavasz.

the class XmlToModelConverter method getPointsFromPositionElement.

/**
 * @param position XML element, contain positions param
 * @return Array of integer, contains point parameter
 * @throws XMLSignatureException position parse error
 */
private static Integer[] getPointsFromPositionElement(Element position) throws XMLSignatureException {
    // points[0]=>x
    // points[1]=>y
    Integer[] points = new Integer[2];
    try {
        points[0] = Integer.parseInt(position.getAttribute("x"));
        points[1] = Integer.parseInt(position.getAttribute("y"));
        return points;
    } catch (NumberFormatException e) {
        throw new XMLSignatureException("Invalid format: Position attributes is not Integer: " + e.getMessage());
    }
}
Also used : XMLSignatureException(javax.xml.crypto.dsig.XMLSignatureException)

Aggregations

XMLSignatureException (javax.xml.crypto.dsig.XMLSignatureException)13 KeySelector (javax.xml.crypto.KeySelector)5 Reference (javax.xml.crypto.dsig.Reference)4 XMLSignatureFactory (javax.xml.crypto.dsig.XMLSignatureFactory)4 GeneralSecurityException (java.security.GeneralSecurityException)3 ArrayList (java.util.ArrayList)3 XMLSignature (javax.xml.crypto.dsig.XMLSignature)3 DOMValidateContext (javax.xml.crypto.dsig.dom.DOMValidateContext)3 Element (org.w3c.dom.Element)3 File (java.io.File)2 NoSuchProviderException (java.security.NoSuchProviderException)2 SignedInfo (javax.xml.crypto.dsig.SignedInfo)2 XMLObject (javax.xml.crypto.dsig.XMLObject)2 DOMSignContext (javax.xml.crypto.dsig.dom.DOMSignContext)2 KeySelectors (javax.xml.crypto.test.KeySelectors)2 DOMReference (org.apache.jcp.xml.dsig.internal.dom.DOMReference)2 Document (org.w3c.dom.Document)2 NodeList (org.w3c.dom.NodeList)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 URI (java.net.URI)1