1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
/* * Copyright 2006 Sun Microsystems, Inc. All rights reserved. */ /* * $Id: DOMExcC14NMethod.java,v 1.28 2005/09/23 20:20:41 mullan Exp $ */ package org.jcp.xml.dsig.internal.dom; import javax.xml.crypto.*; import javax.xml.crypto.dsig.*; import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec; import javax.xml.crypto.dsig.spec.ExcC14NParameterSpec; import javax.xml.crypto.dsig.spec.TransformParameterSpec; import java.security.InvalidAlgorithmParameterException; import java.security.spec.AlgorithmParameterSpec; import java.util.*; import org.w3c.dom.Element; import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer; import com.sun.org.apache.xml.internal.security.c14n.InvalidCanonicalizerException; /** * DOM-based implementation of CanonicalizationMethod for Exclusive * Canonical XML algorithm (with or without comments). * Uses Apache XML-Sec Canonicalizer. * * @author Sean Mullan */ public final class DOMExcC14NMethod extends ApacheCanonicalizer { public void init(TransformParameterSpec params) throws InvalidAlgorithmParameterException { if (params != null) { if (!(params instanceof ExcC14NParameterSpec)) { throw new InvalidAlgorithmParameterException ("params must be of type ExcC14NParameterSpec"); } this.params = (C14NMethodParameterSpec) params; } } public void init(XMLStructure parent, XMLCryptoContext context) throws InvalidAlgorithmParameterException { super.init(parent, context); Element paramsElem = DOMUtils.getFirstChildElement(transformElem); if (paramsElem == null) { this.params = null; this.inclusiveNamespaces = null; return; } unmarshalParams(paramsElem); } private void unmarshalParams(Element paramsElem) { String prefixListAttr = paramsElem.getAttributeNS(null, "PrefixList"); this.inclusiveNamespaces = prefixListAttr; int begin = 0; int end = prefixListAttr.indexOf(' '); List prefixList = new ArrayList(); while (end != -1) { prefixList.add(prefixListAttr.substring(begin, end)); begin = end + 1; end = prefixListAttr.indexOf(' ', begin); } if (begin <= prefixListAttr.length()) { prefixList.add(prefixListAttr.substring(begin)); } this.params = new ExcC14NParameterSpec(prefixList); } public void marshalParams(XMLStructure parent, XMLCryptoContext context) throws MarshalException { super.marshalParams(parent, context); AlgorithmParameterSpec spec = getParameterSpec(); if (spec == null) { return; } String prefix = DOMUtils.getNSPrefix(context, CanonicalizationMethod.EXCLUSIVE); Element excElem = DOMUtils.createElement (ownerDoc, "InclusiveNamespaces", CanonicalizationMethod.EXCLUSIVE, prefix); if (prefix == null) { excElem.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", CanonicalizationMethod.EXCLUSIVE); } else { excElem.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:" + prefix, CanonicalizationMethod.EXCLUSIVE); } ExcC14NParameterSpec params = (ExcC14NParameterSpec) spec; StringBuffer prefixListAttr = new StringBuffer(""); List prefixList = params.getPrefixList(); for (int i = 0, size = prefixList.size(); i < size; i++) { prefixListAttr.append((String) prefixList.get(i)); if (i < size - 1) { prefixListAttr.append(" "); } } DOMUtils.setAttribute(excElem, "PrefixList", prefixListAttr.toString()); this.inclusiveNamespaces = prefixListAttr.toString(); transformElem.appendChild(excElem); } public String getParamsNSURI() { return CanonicalizationMethod.EXCLUSIVE; } public Data transform(Data data, XMLCryptoContext xc) throws TransformException { // ignore comments if dereferencing same-document URI that require // you to omit comments, even if the Transform says otherwise - // this is to be compliant with section 4.3.3.3 of W3C Rec. if (data instanceof DOMSubTreeData) { DOMSubTreeData subTree = (DOMSubTreeData) data; if (subTree.excludeComments()) { try { apacheCanonicalizer = Canonicalizer.getInstance (CanonicalizationMethod.EXCLUSIVE); } catch (InvalidCanonicalizerException ice) { throw new TransformException ("Couldn't find Canonicalizer for: " + CanonicalizationMethod.EXCLUSIVE + ": " + ice.getMessage(), ice); } } } return canonicalize(data, xc); } }