Index: .cvsignore =================================================================== RCS file: /home/cvs/xml-security/.cvsignore,v retrieving revision 1.2 diff -u -r1.2 .cvsignore --- .cvsignore 17 Mar 2004 23:18:01 -0000 1.2 +++ .cvsignore 7 Jan 2005 17:15:41 -0000 @@ -2,3 +2,5 @@ .project *.properties build +10M_d_e.xml +122M_sig.xml.gz Index: src/org/apache/xml/security/algorithms/Algorithm.java =================================================================== RCS file: /home/cvs/xml-security/src/org/apache/xml/security/algorithms/Algorithm.java,v retrieving revision 1.13 diff -u -r1.13 Algorithm.java --- src/org/apache/xml/security/algorithms/Algorithm.java 24 Sep 2004 21:29:34 -0000 1.13 +++ src/org/apache/xml/security/algorithms/Algorithm.java 7 Jan 2005 17:15:48 -0000 @@ -58,6 +58,10 @@ throws XMLSecurityException { super(element, BaseURI); } + + protected Algorithm() { + + }; /** * Method getAlgorithmURI Index: src/org/apache/xml/security/algorithms/SignatureAlgorithm.java =================================================================== RCS file: /home/cvs/xml-security/src/org/apache/xml/security/algorithms/SignatureAlgorithm.java,v retrieving revision 1.19 diff -u -r1.19 SignatureAlgorithm.java --- src/org/apache/xml/security/algorithms/SignatureAlgorithm.java 25 Sep 2004 19:42:22 -0000 1.19 +++ src/org/apache/xml/security/algorithms/SignatureAlgorithm.java 7 Jan 2005 17:15:50 -0000 @@ -163,6 +163,42 @@ ex); } } + public SignatureAlgorithm(String algorithm) throws XMLSecurityException { + + try { + String implementingClass = + SignatureAlgorithm.getImplementingClass(algorithm); + if (log.isDebugEnabled()) + log.debug("Create URI \"" + algorithm + "\" class \"" + + implementingClass + "\""); + + this._signatureAlgorithm = + (SignatureAlgorithmSpi) Class.forName(implementingClass) + .newInstance(); + + + } catch (ClassNotFoundException ex) { + Object exArgs[] = { algorithm, ex.getMessage() }; + + throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs, + ex); + } catch (IllegalAccessException ex) { + Object exArgs[] = { algorithm, ex.getMessage() }; + + throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs, + ex); + } catch (InstantiationException ex) { + Object exArgs[] = { algorithm, ex.getMessage() }; + + throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs, + ex); + } catch (NullPointerException ex) { + Object exArgs[] = { algorithm, ex.getMessage() }; + + throw new RuntimeException("algorithms.NoSuchAlgorithm", + ex); + } + } /** * Proxy method for {@link java.security.Signature#sign()} Index: src/org/apache/xml/security/c14n/implementations/Canonicalizer20010315.java =================================================================== RCS file: /home/cvs/xml-security/src/org/apache/xml/security/c14n/implementations/Canonicalizer20010315.java,v retrieving revision 1.35 diff -u -r1.35 Canonicalizer20010315.java --- src/org/apache/xml/security/c14n/implementations/Canonicalizer20010315.java 18 Nov 2004 22:47:47 -0000 1.35 +++ src/org/apache/xml/security/c14n/implementations/Canonicalizer20010315.java 7 Jan 2005 17:15:51 -0000 @@ -81,8 +81,6 @@ for (int i = 0; i < attrsLength; i++) { Attr N = (Attr) attrs.item(i); - String NName=N.getLocalName(); - String NValue=N.getValue(); String NUri =N.getNamespaceURI(); if (!XMLNS_URI.equals(NUri)) { @@ -90,6 +88,8 @@ result.add(N); continue; } + String NName=N.getLocalName(); + String NValue=N.getValue(); if (XML.equals(NName) && XML_LANG_URI.equals(NValue)) { @@ -97,12 +97,12 @@ continue; } - Node n=ns.addMappingAndRender(NName,NValue,N); + Node n=(Node)ns.addMappingAndRender(NName,NValue,N); if (n!=null) { //Render the ns definition result.add(n); - if (C14nHelper.namespaceIsRelative(N)) { + if (!C14nHelper.namespaceIsAbsolute(NValue)) { Object exArgs[] = { E.getTagName(), NName, N.getNodeValue() }; throw new CanonicalizationException( "c14n.Canonicalizer.RelativeNamespace", exArgs); @@ -227,10 +227,10 @@ //ns.addInclusiveMapping(NName,NValue,N,isRealVisible); if (this._xpathNodeSet.contains(N)) { //The xpath select this node output it if needed. - Node n=ns.addMappingAndRenderXNodeSet(NName,NValue,N,isRealVisible); + Node n=(Node)ns.addMappingAndRenderXNodeSet(NName,NValue,N,isRealVisible); if (n!=null) { result.add(n); - if (C14nHelper.namespaceIsRelative(N)) { + if (!C14nHelper.namespaceIsAbsolute(NValue)) { Object exArgs[] = { E.getTagName(), NName, N.getNodeValue() }; throw new CanonicalizationException( "c14n.Canonicalizer.RelativeNamespace", exArgs); @@ -244,11 +244,11 @@ Node n=null; if (xmlns == null) { //No xmlns def just get the already defined. - n=ns.getMapping(XMLNS); + n=(Node)ns.getMapping(XMLNS); } else if ( !this._xpathNodeSet.contains(xmlns)) { //There is a definition but the xmlns is not selected by the xpath. //then xmlns="" - n=ns.addMappingAndRenderXNodeSet(XMLNS,"",nullNode,true); + n=(Node)ns.addMappingAndRenderXNodeSet(XMLNS,"",nullNode,true); } //output the xmlns def if needed. if (n!=null) { Index: src/org/apache/xml/security/c14n/implementations/Canonicalizer20010315Excl.java =================================================================== RCS file: /home/cvs/xml-security/src/org/apache/xml/security/c14n/implementations/Canonicalizer20010315Excl.java,v retrieving revision 1.18 diff -u -r1.18 Canonicalizer20010315Excl.java --- src/org/apache/xml/security/c14n/implementations/Canonicalizer20010315Excl.java 18 Nov 2004 22:50:26 -0000 1.18 +++ src/org/apache/xml/security/c14n/implementations/Canonicalizer20010315Excl.java 7 Jan 2005 17:15:52 -0000 @@ -107,12 +107,12 @@ * @param E * @throws CanonicalizationException */ - Iterator handleAttributesSubtree(Element E,NameSpaceSymbTable ns) + Iterator handleAttributesSubtree(final Element E,final NameSpaceSymbTable ns) throws CanonicalizationException { // System.out.println("During the traversal, I encountered " + // XMLUtils.getXPath(E)); // result will contain the attrs which have to be outputted - SortedSet result = new TreeSet(COMPARE); + final SortedSet result = new TreeSet(COMPARE); NamedNodeMap attrs=null; int attrsLength = 0; @@ -124,8 +124,7 @@ SortedSet visiblyUtilized =(SortedSet) _inclusiveNSSet.clone(); for (int i = 0; i < attrsLength; i++) { - Attr N = (Attr) attrs.item(i); - String NName=N.getLocalName(); + Attr N = (Attr) attrs.item(i); String NNodeValue=N.getNodeValue(); if (!XMLNS_URI.equals(N.getNamespaceURI())) { @@ -139,10 +138,11 @@ result.add(N); continue; } - + + String NName=N.getLocalName(); if (ns.addMapping(NName, NNodeValue,N)) { //New definition check if it is relative. - if (C14nHelper.namespaceIsRelative(NNodeValue)) { + if (!C14nHelper.namespaceIsAbsolute(NNodeValue)) { Object exArgs[] = {E.getTagName(), NName, N.getNodeValue()}; throw new CanonicalizationException( @@ -166,7 +166,7 @@ Iterator it=visiblyUtilized.iterator(); while (it.hasNext()) { String s=(String)it.next(); - Attr key=ns.getMapping(s); + Attr key=(Attr)ns.getMapping(s); if (key==null) { continue; } @@ -206,7 +206,7 @@ * @param E * @throws CanonicalizationException */ - final Iterator handleAttributes(Element E, NameSpaceSymbTable ns) + final Iterator handleAttributes(final Element E, final NameSpaceSymbTable ns) throws CanonicalizationException { // result will contain the attrs which have to be outputted SortedSet result = new TreeSet(COMPARE); @@ -225,8 +225,7 @@ } for (int i = 0; i < attrsLength; i++) { - Attr N = (Attr) attrs.item(i); - String NName=N.getLocalName(); + Attr N = (Attr) attrs.item(i); String NNodeValue=N.getNodeValue(); if ( !this._xpathNodeSet.contains(N) ) { //The node is not in the nodeset(if there is a nodeset) @@ -247,10 +246,10 @@ continue; } - + String NName=N.getLocalName(); if (ns.addMapping(NName, NNodeValue,N)) { //New definiton check if it is relative - if (C14nHelper.namespaceIsRelative(NNodeValue)) { + if (!C14nHelper.namespaceIsAbsolute(NNodeValue)) { Object exArgs[] = {E.getTagName(), NName, N.getNodeValue()}; throw new CanonicalizationException( @@ -283,7 +282,7 @@ Iterator it=visiblyUtilized.iterator(); while (it.hasNext()) { String s=(String)it.next(); - Attr key=ns.getMapping(s); + Attr key=(Attr)ns.getMapping(s); if (key==null) { continue; } @@ -293,7 +292,7 @@ Iterator it=this._inclusiveNSSet.iterator(); while (it.hasNext()) { String s=(String)it.next(); - Attr key=ns.getMappingWithoutRendered(s); + Attr key=(Attr)ns.getMappingWithoutRendered(s); if (key==null) { continue; } Index: src/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java =================================================================== RCS file: /home/cvs/xml-security/src/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java,v retrieving revision 1.11 diff -u -r1.11 CanonicalizerBase.java --- src/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java 5 Dec 2004 18:52:23 -0000 1.11 +++ src/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java 7 Jan 2005 17:15:55 -0000 @@ -443,7 +443,7 @@ } } Attr nsprefix; - if (((nsprefix=ns.getMappingWithoutRendered("xmlns"))!=null) + if (((nsprefix=(Attr)ns.getMappingWithoutRendered("xmlns"))!=null) && "".equals(nsprefix.getValue())) { ns.addMappingAndRender("xmlns","",nullNode); } Index: src/org/apache/xml/security/c14n/implementations/NameSpaceSymbTable.java =================================================================== RCS file: /home/cvs/xml-security/src/org/apache/xml/security/c14n/implementations/NameSpaceSymbTable.java,v retrieving revision 1.4 diff -u -r1.4 NameSpaceSymbTable.java --- src/org/apache/xml/security/c14n/implementations/NameSpaceSymbTable.java 18 Sep 2004 16:49:44 -0000 1.4 +++ src/org/apache/xml/security/c14n/implementations/NameSpaceSymbTable.java 7 Jan 2005 17:15:56 -0000 @@ -35,7 +35,7 @@ * and at the same time in a list so it can be removed when the frame is pop back. * @author Raul Benito **/ -public class NameSpaceSymbTable { +public class NameSpaceSymbTable { /**The map betwen prefix-> entry table. */ HashMap symb = new HashMap(); @@ -72,6 +72,18 @@ } } } + + public void getUnrenderedNodesNon(Collection result) { + //List result=new ArrayList(); + Iterator it=symb.entrySet().iterator(); + while (it.hasNext()) { + NameSpaceSymbEntry n=(NameSpaceSymbEntry)((Map.Entry)it.next()).getValue(); + //put them rendered? + if ((!n.rendered) && (n.n!=null)) { + result.add(n.n); + } + } + } /** * Push a frame for visible namespace. @@ -125,8 +137,11 @@ } final void needsClone() { - if (!cloned) { - level.remove(level.size()-1); + if (!cloned ) { + int num=level.size()-1; + if (num<0) + return; + level.remove(num); level.add(symb); symb=(HashMap) symb.clone(); cloned=true; @@ -140,7 +155,7 @@ * @return null if there is no need to render the prefix. Otherwise the node of * definition. **/ - public Attr getMapping(String prefix) { + public Object getMapping(String prefix) { NameSpaceSymbEntry entry=(NameSpaceSymbEntry) symb.get(prefix); if (entry==null) { //There is no definition for the prefix(a bug?). @@ -167,7 +182,7 @@ * @param prefix The prefix whose definition is neaded. * @return the attr to render, null if there is no need to render **/ - public Attr getMappingWithoutRendered(String prefix) { + public Object getMappingWithoutRendered(String prefix) { NameSpaceSymbEntry entry=(NameSpaceSymbEntry) symb.get(prefix); if (entry==null) { return null; @@ -185,7 +200,7 @@ * @param n the attribute that have the definition * @return true if there is already defined. **/ - public boolean addMapping(String prefix, String uri,Attr n) { + public boolean addMapping(String prefix, String uri,Object n) { NameSpaceSymbEntry ob = (NameSpaceSymbEntry)symb.get(prefix); if ((ob!=null) && uri.equals(ob.uri)) { //If we have it previously defined. Don't keep working. @@ -215,7 +230,7 @@ * @param n the attribute that have the definition * @return the attr to render, null if there is no need to render **/ - public Node addMappingAndRender(String prefix, String uri,Attr n) { + public Object addMappingAndRender(String prefix, String uri,Attr n) { NameSpaceSymbEntry ob = (NameSpaceSymbEntry)symb.get(prefix); if ((ob!=null) && uri.equals(ob.uri)) { @@ -254,7 +269,7 @@ * @return null if there is no need to render the prefix. Otherwise the node of * definition. **/ - public Node addMappingAndRenderXNodeSet(String prefix, String uri,Attr n,boolean outputNode) { + public Object addMappingAndRenderXNodeSet(String prefix, String uri,Attr n,boolean outputNode) { NameSpaceSymbEntry ob = (NameSpaceSymbEntry)symb.get(prefix); int visibleNameSpaces=nameSpaces; if ((ob!=null) && uri.equals(ob.uri)) { @@ -291,13 +306,25 @@ } return ne.n; } + /** @inheritDoc */ + public NameSpaceSymbTable copyCurrent() { + NameSpaceSymbTable nsNew=new NameSpaceSymbTable(); + + Iterator it=symb.keySet().iterator(); + while (it.hasNext()) { + Object ob=it.next(); + nsNew.symb.put(ob,((NameSpaceSymbEntry)symb.get(ob)).clone()); + } + return nsNew; + } + } /** * The internal structure of NameSpaceSymbTable. **/ class NameSpaceSymbEntry implements Cloneable { - NameSpaceSymbEntry(String name,Attr n,boolean rendered) { + NameSpaceSymbEntry(String name,Object n,boolean rendered) { this.uri=name; this.rendered=rendered; this.n=n; @@ -310,6 +337,7 @@ return null; } } + /** The level where the definition was rendered(Only for inclusive) */ int level=0; /**The URI that the prefix defines */ @@ -319,5 +347,5 @@ /**This prefix-URI has been already render or not.*/ boolean rendered=false; /**The attribute to include.*/ - Attr n; + Object n; }; Index: src/org/apache/xml/security/signature/Reference.java =================================================================== RCS file: /home/cvs/xml-security/src/org/apache/xml/security/signature/Reference.java,v retrieving revision 1.36 diff -u -r1.36 Reference.java --- src/org/apache/xml/security/signature/Reference.java 23 Sep 2004 20:23:18 -0000 1.36 +++ src/org/apache/xml/security/signature/Reference.java 7 Jan 2005 17:15:59 -0000 @@ -689,7 +689,7 @@ MessageDigestAlgorithm mda = this.getMessageDigestAlgorithm(); mda.reset(); - DigesterOutputStream diOs=new DigesterOutputStream(mda); + DigesterOutputStream diOs=new DigesterOutputStream(mda.getAlgorithm()); OutputStream os=new BufferedOutputStream(diOs); XMLSignatureInput output=this.dereferenceURIandPerformTransforms(os); output.updateOutputStream(os); Index: src/org/apache/xml/security/utils/DigesterOutputStream.java =================================================================== RCS file: /home/cvs/xml-security/src/org/apache/xml/security/utils/DigesterOutputStream.java,v retrieving revision 1.1 diff -u -r1.1 DigesterOutputStream.java --- src/org/apache/xml/security/utils/DigesterOutputStream.java 23 Sep 2004 20:23:19 -0000 1.1 +++ src/org/apache/xml/security/utils/DigesterOutputStream.java 7 Jan 2005 17:16:00 -0000 @@ -17,6 +17,7 @@ package org.apache.xml.security.utils; import java.io.ByteArrayOutputStream; +import java.security.MessageDigest; import org.apache.xml.security.algorithms.MessageDigestAlgorithm; @@ -26,11 +27,11 @@ */ public class DigesterOutputStream extends ByteArrayOutputStream { final static byte none[]="error".getBytes(); - final MessageDigestAlgorithm mda; + final MessageDigest mda; /** * @param mda */ - public DigesterOutputStream(MessageDigestAlgorithm mda) { + public DigesterOutputStream(MessageDigest mda) { this.mda=mda; } Index: src/org/apache/xml/security/utils/SignerOutputStream.java =================================================================== RCS file: /home/cvs/xml-security/src/org/apache/xml/security/utils/SignerOutputStream.java,v retrieving revision 1.2 diff -u -r1.2 SignerOutputStream.java --- src/org/apache/xml/security/utils/SignerOutputStream.java 8 Oct 2004 20:27:39 -0000 1.2 +++ src/org/apache/xml/security/utils/SignerOutputStream.java 7 Jan 2005 17:16:01 -0000 @@ -46,7 +46,7 @@ try { sa.update(arg0); } catch (XMLSignatureException e) { - throw new RuntimeException(""+e); + throw new RuntimeException("",e); } } @@ -66,7 +66,14 @@ sa.update(arg0,arg1,arg2); } catch (XMLSignatureException e) { throw new RuntimeException(""+e); - } + } + } + public boolean verify(byte []a) { + try { + return sa.verify(a); + } catch (XMLSignatureException e) { + throw new RuntimeException(""+e); + } } Index: src_samples/.cvsignore =================================================================== RCS file: src_samples/.cvsignore diff -N src_samples/.cvsignore --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src_samples/.cvsignore 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,1 @@ +prb.tgz Index: src_samples/com/r_bg/sax_signature/EnvelopingSignatureControler.java =================================================================== RCS file: src_samples/com/r_bg/sax_signature/EnvelopingSignatureControler.java diff -N src_samples/com/r_bg/sax_signature/EnvelopingSignatureControler.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src_samples/com/r_bg/sax_signature/EnvelopingSignatureControler.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,106 @@ +/* + * Created on Dec 30, 2004 + * + * TODO To change the template for this generated file go to + * Window - Preferences - Java - Code Style - Code Templates + */ +package com.r_bg.sax_signature; + +import java.io.IOException; + +import org.apache.xml.security.algorithms.SignatureAlgorithm; +import org.apache.xml.security.c14n.implementations.NameSpaceSymbTable; +import org.apache.xml.security.signature.XMLSignatureException; +import org.apache.xml.security.utils.SignerOutputStream; +import org.xml.sax.Attributes; + +import com.r_bg.sax_signature.c14n.SaxC14nBase; +import com.r_bg.sax_signature.c14n.SaxC14nExcl; +import com.r_bg.sax_signature.c14n.SaxC14nIncl; +import com.r_bg.sax_signature.c14n.SaxC14nUnknown; +import com.r_bg.sax_signature.readers.KeyInfoReader; +import com.r_bg.sax_signature.readers.ReferenceReader; +import com.r_bg.sax_signature.readers.SignatureReader; + +class EnvelopingSignatureControler extends SignatureControler implements SaxListener { + SaxC14nBase sc; + String uriId=null; + boolean inRef=false; + ReferenceReader ref=null; + /* (non-Javadoc) + * @see com.r_bg.sax_signature.SignatureControler#startElement(java.lang.String, java.lang.String) + */ + public void startElement(String uri, String localName,String qName,Attributes atrs) { + if (DSIG_NS.equals(uri) && SIGNATURE.equals(localName)) { + signature=new SignatureReader(this); + saxHandler.add(signature); + } else if (DSIG_NS.equals(uri) && "SignedInfo".equals(localName)) { + sc=new SaxC14nUnknown(); + sc.ns=saxHandler.ns.copyCurrent(); + saxHandler.add(sc); + } else if (!inRef && (refC14n==null) && (uriId!=null) && isId(uriId,atrs)) { + refC14n=generateSaxC14(ref); + refC14n.ns= saxHandler.ns.copyCurrent(); + saxHandler.add(refC14n); + inRef=false; + } + + } + /* (non-Javadoc) + * @see com.r_bg.sax_signature.SignatureControler#endElement(java.lang.String, java.lang.String) + */ + public void endElement(String uri, String localName) { + } + + public static boolean isId(String id, Attributes atrs) { + if (id.equals(atrs.getValue("Id"))) { + return true; + } + return false; + } + public void onReferenceReaded(ReferenceReader ref) { + + String uri=ref.getUri(); uri=uri.substring(1,uri.length()); + uriId=uri; + this.ref=ref; + System.err.println("Add referenece:"+uriId); + + } + /* (non-Javadoc) + * @see com.r_bg.sax_signature.SaxListener#onC14nMethodReaded() + */ + public void onC14nMethodReaded() { + String method=signature.getC14nMethod(); + try { + // Fix the current c14n + SaxC14nBase scNew=null; + if ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315".equals(method)) { + scNew=new SaxC14nIncl(); + } else if ("http://www.w3.org/2001/10/xml-exc-c14n#".equals(method)) { + scNew=new SaxC14nExcl(); + } + if (scNew!=null) { + scNew.ns=sc.ns; + ((SaxC14nUnknown)sc).refill(scNew); + saxHandler.replace(sc,scNew); + sc=scNew; + } + } catch (Exception e) { + throw new RuntimeException("Error",e); + } + } + + public void onKeyInfo(KeyInfoReader key) { + try { + SignatureAlgorithm sa=signature.getSignatureAlgorithm(); + sa.initVerify(key.getPublicKey()); + sc.setOutputStream(new SignerOutputStream(sa)); + } catch (XMLSignatureException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} Index: src_samples/com/r_bg/sax_signature/OneLevelEnvelopedSignatureControler.java =================================================================== RCS file: src_samples/com/r_bg/sax_signature/OneLevelEnvelopedSignatureControler.java diff -N src_samples/com/r_bg/sax_signature/OneLevelEnvelopedSignatureControler.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src_samples/com/r_bg/sax_signature/OneLevelEnvelopedSignatureControler.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,139 @@ +/* + * Created on Jan 6, 2005 + * + * TODO To change the template for this generated file go to + * Window - Preferences - Java - Code Style - Code Templates + */ +package com.r_bg.sax_signature; + +import java.io.IOException; + +import org.apache.xml.security.algorithms.SignatureAlgorithm; +import org.apache.xml.security.c14n.implementations.NameSpaceSymbTable; +import org.apache.xml.security.signature.XMLSignatureException; +import org.apache.xml.security.utils.SignerOutputStream; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +import com.r_bg.sax_signature.c14n.SaxC14nBase; +import com.r_bg.sax_signature.c14n.SaxC14nExcl; +import com.r_bg.sax_signature.c14n.SaxC14nIncl; +import com.r_bg.sax_signature.c14n.SaxC14nUnknown; +import com.r_bg.sax_signature.readers.KeyInfoReader; +import com.r_bg.sax_signature.readers.ReferenceReader; +import com.r_bg.sax_signature.readers.SignatureReader; + +/** + * @author raul + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class OneLevelEnvelopedSignatureControler extends SignatureControler implements SaxListener { + SaxC14nBase sc; + String uriId=null; + boolean inRef=false; + ReferenceReader ref=null; + /* (non-Javadoc) + * @see com.r_bg.sax_signature.SignatureControler#startElement(java.lang.String, java.lang.String) + */ + public void startElement(String uri, String localName, String qName,Attributes atrs) throws SAXException { + if (DSIG_NS.equals(uri) && SIGNATURE.equals(localName)) { + //One Signature found the above was the reference. + signature=new SignatureReader(this); + saxHandler.add(signature); + inRef=true; + //As is going to be enveloped stop C14n of the refC14n + saxHandler.pause(refC14n); + ((SaxC14nUnknown)refC14n).removeLastPrefixMapping(); + } else if (DSIG_NS.equals(uri) && "SignedInfo".equals(localName)) { + sc=new SaxC14nUnknown(); + sc.ns=(NameSpaceSymbTable) saxHandler.ns.copyCurrent(); + saxHandler.add(sc); + } else if (!inRef) { + if (refC14n!=null) { + //Just remove the before unknown c14n + saxHandler.remove(refC14n); + } + refC14n=new SaxC14nUnknown(); + refC14n.ns=(NameSpaceSymbTable) saxHandler.ns.copyCurrent(); + //System.out.println("NS:a="+((Object[])refC14n.ns.getMappingWithoutRendered("a"))[1]); + saxHandler.add(refC14n); + //refC14n.startElement(uri,localName,qName,atrs); + + } + + } + /* (non-Javadoc) + * @see com.r_bg.sax_signature.SignatureControler#endElement(java.lang.String, java.lang.String) + */ + public void endElement(String uri, String localName) { + } + + + public void onReferenceReaded(ReferenceReader ref) { + + String uri=ref.getUri(); uri=uri.substring(1,uri.length()); + uriId=uri; + this.ref=ref; + System.err.println("Add referenece:"+uriId); + + } + /* (non-Javadoc) + * @see com.r_bg.sax_signature.SaxListener#onC14nMethodReaded() + */ + public void onC14nMethodReaded() { + String method=signature.getC14nMethod(); + try { + // Fix the current c14n + SaxC14nBase scNew=null; + if ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315".equals(method)) { + scNew=new SaxC14nIncl(); + } else if ("http://www.w3.org/2001/10/xml-exc-c14n#".equals(method)) { + scNew=new SaxC14nExcl(); + } + if (scNew!=null) { + scNew.ns=sc.ns; + ((SaxC14nUnknown)sc).refill(scNew); + saxHandler.replace(sc,scNew); + sc=scNew; + } + } catch (Exception e) { + throw new RuntimeException("Error",e); + } + } + + public void onKeyInfo(KeyInfoReader key) { + try { + SignatureAlgorithm sa=signature.getSignatureAlgorithm(); + sa.initVerify(key.getPublicKey()); + sc.setOutputStream(new SignerOutputStream(sa)); + } catch (XMLSignatureException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /* (non-Javadoc) + * @see com.r_bg.sax_signature.SignatureControler#onRemove(com.r_bg.sax_signature.SaxWorker) + */ + public void onRemove(SaxWorker worker) { + if (worker==signature) { + //We have finish with the signature continue with the reference + saxHandler.resume(refC14n); + SaxC14nBase newRefC14n=generateSaxC14(ref); + try { + ((SaxC14nUnknown)refC14n).refill(newRefC14n); + } catch (SAXException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + saxHandler.replace(refC14n,newRefC14n); + refC14n=newRefC14n; + + } + } +} Index: src_samples/com/r_bg/sax_signature/SaxHandler.java =================================================================== RCS file: src_samples/com/r_bg/sax_signature/SaxHandler.java diff -N src_samples/com/r_bg/sax_signature/SaxHandler.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src_samples/com/r_bg/sax_signature/SaxHandler.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,127 @@ +/* + * Created on Dec 18, 2004 + */ +package com.r_bg.sax_signature; + +import java.util.ArrayList; +import java.util.Iterator; + +import org.apache.xml.security.c14n.implementations.NameSpaceSymbTable; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * The main receptor of SAX Events it's main role is forward to any Worker and been controled by + * Controler + * @author raul + */ +public class SaxHandler extends DefaultHandler { + SignatureControler sc; + int level=0; + int maxLevel=-1; + /** The Workers to send events */ + ArrayList workers=new ArrayList(); + ArrayList workersLevel=new ArrayList(); + + ArrayList workersPause=new ArrayList(); + ArrayList workersLevelPause=new ArrayList(); + + NameSpaceSymbTable ns=new NameSpaceSymbTable(); + + protected SaxHandler(SignatureControler sc) { + this.sc=sc; + } + /** + * A new thing. + */ + public void startElement(String uri, String localName, String qName, Attributes attributes) + throws SAXException { + ns.push(); + level++; + //Let the Sc add things add needed + sc.startElement(uri,localName,qName, attributes); + Iterator it=workers.iterator(); + while (it.hasNext()) { + ((SaxWorker)it.next()).startElement(uri,localName,qName,attributes); + } + } + + public void characters(char[] ch, int start, int length) throws SAXException{ + Iterator it=workers.iterator(); + while (it.hasNext()) { + ((SaxWorker)it.next()).characters(ch,start,length); + } + } + + public void endElement(String uri, String localName, String qName) throws SAXException { + level--; + ns.pop(); + //Let the sc remove workers + sc.endElement(uri,localName); + Iterator it=((ArrayList)(workers.clone())).iterator(); + while (it.hasNext()) { + ((SaxWorker)it.next()).endElement(uri,localName,qName); + } + + //Now remove the ones that go up the level. + if (maxLevel>level) { + //System.out.println("Looking for remove:"+maxLevel); + maxLevel=-1; + it=((ArrayList)(workersLevel.clone())).iterator(); + int i=0; + while (it.hasNext()) { + int levelC=((Integer)it.next()).intValue(); + if (levelC>level) { + Object ob=workers.remove(i); + workersLevel.remove(i); + sc.onRemove((SaxWorker)ob); + } else { + maxLevel=maxLevel'); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + public void setNamespaceTable(NameSpaceSymbTable ns) { + this.ns=ns; + } + abstract SortedSet handleAttributes(String arg2, Attributes arg3); + /** @inheritDoc **/ + public void characters(char[] arg0, int arg1, int arg2) { + try { + for (int i=arg1;i'); + } catch (IOException e) { + throw new RuntimeException(e); + } + ns.pop(); + + } + + /** @inheritDoc **/ + public void endCDATA() { + + } + + /** @inheritDoc **/ + public void endDTD() { + + } + + /** @inheritDoc **/ + public void startCDATA(){ + + } + + /** @inheritDoc **/ + public void comment(char[] arg0, int arg1, int arg2) { + if (!outputComments) { + return; + } + String st=new String(arg0,arg1,arg2); + try { + os.write(("").getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + final static void writeCharToUtf8(char c,OutputStream out) throws IOException{ + + if (/*(c >= 0x0001) &&*/ (c <= 0x007F)) { + out.write(c); + } else if (c > 0x07FF) { + out.write(0xE0 | ((c >> 12) & 0x0F)); + out.write(0x80 | ((c >> 6) & 0x3F)); + out.write(0x80 | ((c >> 0) & 0x3F)); + + } else { + out.write(0xC0 | ((c >> 6) & 0x1F)); + out.write(0x80 | ((c >> 0) & 0x3F)); + + } + + } + + /** @inheritDoc **/ + public void endEntity(String arg0) { + + } + + /** @inheritDoc **/ + public void startEntity(String arg0) { + + } + + /** @inheritDoc **/ + public void startDTD(String arg0, String arg1, String arg2) { + } + final static void writeStringToUtf8(String str,OutputStream out) throws IOException{ + int length=str.length(); + for (int i=0;i= 0x0001) && */(c <= 0x007F)) { + out.write(c); + } else if (c > 0x07FF) { + out.write(0xE0 | ((c >> 12) & 0x0F)); + out.write(0x80 | ((c >> 6) & 0x3F)); + out.write(0x80 | ((c >> 0) & 0x3F)); + + } else { + out.write(0xC0 | ((c >> 6) & 0x1F)); + out.write(0x80 | ((c >> 0) & 0x3F)); + + } + } + } + + /** + * @param md + * @throws IOException + */ + public void setOutputStream(OutputStream md) throws IOException { + md.write(((ByteArrayOutputStream)os).toByteArray()); + os=md; + } + + + public String getBase64Digest() { + try { + os.flush(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + if (os instanceof DigesterOutputStream) + return Base64.encode(((DigesterOutputStream)os).getDigestValue()); + + return null; + } + public boolean verifySignature(byte[] a) { + if (os instanceof SignerOutputStream) + return ((SignerOutputStream)os).verify(a); + return false; + } +} Index: src_samples/com/r_bg/sax_signature/c14n/SaxC14nExcl.java =================================================================== RCS file: src_samples/com/r_bg/sax_signature/c14n/SaxC14nExcl.java diff -N src_samples/com/r_bg/sax_signature/c14n/SaxC14nExcl.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src_samples/com/r_bg/sax_signature/c14n/SaxC14nExcl.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,64 @@ +/* + * Created on Dec 18, 2004 + * + * TODO To change the template for this generated file go to + * Window - Preferences - Java - Code Style - Code Templates + */ +package com.r_bg.sax_signature.c14n; + +import java.util.Iterator; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.xml.sax.Attributes; + + +/** + * @author raul + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class SaxC14nExcl extends SaxC14nBase { + /** + * @param arg2 + * @param arg3 + * @return + */ + SortedSet handleAttributes(String arg2, Attributes arg3) { + SortedSet visiblyUtilized =new TreeSet(); + SortedSet s=new TreeSet(new AttributesCompare()); + for (int i=0;i0) { + prefix=qname.substring(0,colon); + } + if (!"xml".equals(prefix)) { + visiblyUtilized.add(prefix); + } + String []attr= {arg3.getURI(i),arg3.getValue(i),qname}; + s.add(attr); + } + int colon=arg2.indexOf(':'); + String prefix=null; + if (colon>0) { + prefix=arg2.substring(0,arg2.indexOf(':')); + visiblyUtilized.add(prefix); + } else { + visiblyUtilized.add("xmlns"); + } + Iterator it=visiblyUtilized.iterator(); + while (it.hasNext()) { + String prefix1=(String)it.next(); + String[] key=(String [])ns.getMapping(prefix1); + if (key==null) { + continue; + } + s.add(key); + } + return s; + } + } + Index: src_samples/com/r_bg/sax_signature/c14n/SaxC14nIncl.java =================================================================== RCS file: src_samples/com/r_bg/sax_signature/c14n/SaxC14nIncl.java diff -N src_samples/com/r_bg/sax_signature/c14n/SaxC14nIncl.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src_samples/com/r_bg/sax_signature/c14n/SaxC14nIncl.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,34 @@ +/* + * Created on Dec 18, 2004 + * + * TODO To change the template for this generated file go to + * Window - Preferences - Java - Code Style - Code Templates + */ +package com.r_bg.sax_signature.c14n; + +import java.util.SortedSet; +import java.util.TreeSet; + +import org.xml.sax.Attributes; + + +/** + * @author raul + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class SaxC14nIncl extends SaxC14nBase { + + SortedSet handleAttributes(String arg2, Attributes arg3) { + SortedSet s=new TreeSet(new AttributesCompare()); + for (int i=0;i\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "oMQoFufPA7Un6cfz0GaEOJpE4Z8=\n" + + "\n" + + "\n" + + "\n" + + "AhyiFQ6hucykYJOJDBV3wbPBe2TAURXXfCUD7BmSAecT+izT9fHFsxRVez3s+6hYSgtaVhmeVgbd\n" + + "ZEOMPFihBGldi1NV73Z/tpXxqNvY+/NwQmmasQp9gzFHxYF2cqi8m7sAHM03BIC1YoBctxVw/jxV\n" + + "ClhLJuTSHoKwlzKH24g=\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "skqbW7oBwM1lCWNwC1obkgj4VV58G1AX7ERMWEIrQQlZ8uFdQ3FNkgMdtmx/XUjNF+zXTDmxe+K/\n" + + "lne+0KDwLWskqhS6gnkQmxZoR4FUovqRngoqU6bnnn0pM9gF/AI/vcdu7aowbF9S7TVlSw7IpxIQ\n" + + "VjevEfohDpn/+oxljm0=\n" + + "\n" + + "AQAB\n" + + "\n" + + "\n" + + "\n" + + "A text in a box\n" + + ""; + SAXParserFactory sf=SAXParserFactory.newInstance(); + sf.setNamespaceAware(true); + EnvelopingSignatureControler eC=new EnvelopingSignatureControler(); + sf.newSAXParser().parse(new ByteArrayInputStream(envelopingSig.getBytes()),eC.createSaxHandler()); + //System.out.println(new String(((ByteArrayOutputStream)eC.refC14n.os).toByteArray())); + assertTrue("Not Fine",eC.verifyReference(0)); + assertTrue("Not Fine",eC.verify()); + } + public void test122M() throws Exception{ + SAXParserFactory sf=SAXParserFactory.newInstance(); + sf.setNamespaceAware(true); + EnvelopingSignatureControler eC=new EnvelopingSignatureControler(); + sf.newSAXParser().parse(new GZIPInputStream(new FileInputStream("122M_sig.xml.gz")),eC.createSaxHandler()); + //System.out.println(new String(((ByteArrayOutputStream)eC.refC14n.os).toByteArray())); + assertTrue("Not Fine",eC.verifyReference(0)); + assertTrue("Not Fine",eC.verify()); + } + static { + Init.init(); + } +} Index: src_unitTests/com/r_bg/sax_signature/OneLevelEnvelopedSignatureTest.java =================================================================== RCS file: src_unitTests/com/r_bg/sax_signature/OneLevelEnvelopedSignatureTest.java diff -N src_unitTests/com/r_bg/sax_signature/OneLevelEnvelopedSignatureTest.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src_unitTests/com/r_bg/sax_signature/OneLevelEnvelopedSignatureTest.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,198 @@ +/* + * Created on Dec 30, 2004 + * + * TODO To change the template for this generated file go to + * Window - Preferences - Java - Code Style - Code Templates + */ +package com.r_bg.sax_signature; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.util.zip.GZIPInputStream; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.FactoryConfigurationError; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.apache.xml.security.Init; +import org.apache.xml.security.c14n.CanonicalizationException; +import org.apache.xml.security.c14n.InvalidCanonicalizerException; +import org.apache.xml.security.exceptions.XMLSecurityException; +import org.apache.xml.security.signature.ObjectContainer; +import org.apache.xml.security.signature.XMLSignature; +import org.apache.xml.security.signature.XMLSignatureException; +import org.apache.xml.security.transforms.TransformationException; +import org.apache.xml.security.transforms.Transforms; +import org.apache.xml.security.utils.Constants; +import org.apache.xml.security.utils.XMLUtils; +import org.w3c.dom.Element; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * @author raul + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class OneLevelEnvelopedSignatureTest extends TestCase { + + public static Test suite() { + return new TestSuite(OneLevelEnvelopedSignatureTest.class); + } + private static void createTestA(boolean exclusive) throws NoSuchAlgorithmException, FactoryConfigurationError, ParserConfigurationException, XMLSecurityException, TransformationException, XMLSignatureException, IOException, CanonicalizationException, InvalidCanonicalizerException { + Init.init(); + javax.xml.parsers.DocumentBuilderFactory dbf = + javax.xml.parsers.DocumentBuilderFactory.newInstance(); + + dbf.setNamespaceAware(true); + + javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder(); + KeyPair kp=KeyPairGenerator.getInstance("RSA").generateKeyPair(); + + org.w3c.dom.Document doc = db.newDocument(); + String BaseURI = "#1"; + XMLSignature sig = new XMLSignature(doc, BaseURI, + XMLSignature.ALGO_ID_SIGNATURE_RSA, + exclusive ? Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS: Transforms.TRANSFORM_C14N_OMIT_COMMENTS); + sig.addKeyInfo(kp.getPublic()); + Element anEnvelope=doc.createElementNS(null, "Envelope"); + anEnvelope.setAttributeNS(Constants.NamespaceSpecNS,"xmlns:a","http://b"); + Element anElement = doc.createElementNS(null, "RootObject"); + Element anElement2 = doc.createElementNS(null, "UnderObject"); + anElement.setAttribute("Id","1"); + anElement.appendChild(sig.getElement()); + anElement.appendChild(anElement2); + anEnvelope.appendChild(anElement); + doc.appendChild(anEnvelope); + anElement2.appendChild(doc.createTextNode("A text in a box")); + Element anElement3 =doc.createElementNS(null,"OtherObject"); + anElement2.appendChild(anElement3); + anElement3.appendChild(doc.createElementNS(null,"OtherObject2")); + anElement3.appendChild(doc.createElementNS(null,"OtherObject6")); + anElement3.appendChild(doc.createElementNS(null,"OtherObject")); + { + Transforms transforms = new Transforms(doc); + transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE); + if (exclusive) + transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS); + + sig.addDocument("#1" , transforms, Constants.ALGO_ID_DIGEST_SHA1); + } + + { + System.out.println("Start signing"); + sig.sign(kp.getPrivate()); + System.out.println("Finished signing"); + System.out.println("verifying in memory:"+sig.checkSignatureValue(kp.getPublic())); + } + + ByteArrayOutputStream f = new ByteArrayOutputStream(); + XMLUtils.outputDOMc14nWithComments(doc, f); + f.close(); + System.out.println("Wrote signature to:" + new String(f.toByteArray())); + + for (int i=0; i\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "t2hiaMVZW+Z3P2992iEyrDgVLS0=\n" + + "\n" + + "\n" + + "\n" + + "ik/EUbz8OgQztvbnK9tbZdf5XSKYc7eMyJ98trW3LoUrxXD47P3gLMnMK5t0JCe+wbxBby0Aux2M\n" + + "fctuwBsMQve6KwbdvD/2YiS70XmTEvBChCiBYdN1nHfJYyW66xnALoE5V5NuiLrt0cgEggfMTrEy\n" + + "HYm9g6RQ0IEe/lQCIK4=\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "skqbW7oBwM1lCWNwC1obkgj4VV58G1AX7ERMWEIrQQlZ8uFdQ3FNkgMdtmx/XUjNF+zXTDmxe+K/\n" + + "lne+0KDwLWskqhS6gnkQmxZoR4FUovqRngoqU6bnnn0pM9gF/AI/vcdu7aowbF9S7TVlSw7IpxIQ\n" + + "VjevEfohDpn/+oxljm0=\n" + + "\n" + + "AQAB\n" + + "\n" + + "\n" + + "\n" + + "A text in a box\n" + + ""; + SAXParserFactory sf=SAXParserFactory.newInstance(); + sf.setNamespaceAware(true); + OneLevelEnvelopedSignatureControler eC=new OneLevelEnvelopedSignatureControler(); + sf.newSAXParser().parse(new ByteArrayInputStream(envelopingSig.getBytes()),eC.createSaxHandler()); + //System.out.println(new String(((ByteArrayOutputStream)eC.refC14n.os).toByteArray())); + assertTrue("Not Fine",eC.verifyReference(0)); + assertTrue("Not Fine",eC.verify()); + } + public void testInc() throws Exception{ + createTestA(false); + String envelopingSig="\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "t2hiaMVZW+Z3P2992iEyrDgVLS0=\n" + + "\n" + + "\n" + + "\n" + + "ik/EUbz8OgQztvbnK9tbZdf5XSKYc7eMyJ98trW3LoUrxXD47P3gLMnMK5t0JCe+wbxBby0Aux2M\n" + + "fctuwBsMQve6KwbdvD/2YiS70XmTEvBChCiBYdN1nHfJYyW66xnALoE5V5NuiLrt0cgEggfMTrEy\n" + + "HYm9g6RQ0IEe/lQCIK4=\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "skqbW7oBwM1lCWNwC1obkgj4VV58G1AX7ERMWEIrQQlZ8uFdQ3FNkgMdtmx/XUjNF+zXTDmxe+K/\n" + + "lne+0KDwLWskqhS6gnkQmxZoR4FUovqRngoqU6bnnn0pM9gF/AI/vcdu7aowbF9S7TVlSw7IpxIQ\n" + + "VjevEfohDpn/+oxljm0=\n" + + "\n" + + "AQAB\n" + + "\n" + + "\n" + + "\n" + + "A text in a box\n"; + SAXParserFactory sf=SAXParserFactory.newInstance(); + sf.setNamespaceAware(true); + OneLevelEnvelopedSignatureControler eC=new OneLevelEnvelopedSignatureControler(); + sf.newSAXParser().parse(new ByteArrayInputStream(envelopingSig.getBytes()),eC.createSaxHandler()); + System.out.println(new String(((ByteArrayOutputStream)eC.refC14n.os).toByteArray())); + assertTrue("Not Fine",eC.verifyReference(0)); + assertTrue("Not Fine",eC.verify()); + } + static { + Init.init(); + } +} Index: src_unitTests/com/r_bg/sax_signature/SaxHandlerTest.java =================================================================== RCS file: src_unitTests/com/r_bg/sax_signature/SaxHandlerTest.java diff -N src_unitTests/com/r_bg/sax_signature/SaxHandlerTest.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src_unitTests/com/r_bg/sax_signature/SaxHandlerTest.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,28 @@ +/* + * Created on Dec 18, 2004 + * + * TODO To change the template for this generated file go to + * Window - Preferences - Java - Code Style - Code Templates + */ +package com.r_bg.sax_signature; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * @author raul + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class SaxHandlerTest extends TestCase { + public static Test suite() { + return new TestSuite(SaxHandler.class); + } + public void testAddAndRemoveWorkers() { + SignatureControler sc=new SignatureControler(); + + //todo + } +} Index: src_unitTests/com/r_bg/sax_signature/SignatureControlerTest.java =================================================================== RCS file: src_unitTests/com/r_bg/sax_signature/SignatureControlerTest.java diff -N src_unitTests/com/r_bg/sax_signature/SignatureControlerTest.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src_unitTests/com/r_bg/sax_signature/SignatureControlerTest.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,39 @@ +/* + * Created on Dec 18, 2004 + * + * TODO To change the template for this generated file go to + * Window - Preferences - Java - Code Style - Code Templates + */ +package com.r_bg.sax_signature; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * @author raul + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class SignatureControlerTest extends TestCase { + public static Test suite() { + return new TestSuite(SignatureControlerTest.class); + } + public void testAddASignature() throws Exception { + + SignatureControler sc=new SignatureControler(); + SaxHandler sh=sc.createSaxHandler(); + //first nothing expecial + sc.startElement("aaa","eee","aaa:eee",null); + assertEquals("add() called when some garbage",0,sh.workers.size()); + sc.startElement("http://www.w3.org/2000/09/xmldsig#","Signature","ds:Signature",null); + assertEquals("add() not called when a signature",1,sh.workers.size()); + sc.endElement("aaa","eee"); + assertEquals("remove() called when some garbage",1,sh.workers.size()); + sc.endElement("http://www.w3.org/2000/09/xmldsig#","Signature"); + assertEquals("remove() not called when a signature",0,sh.workers.size()); + + } + +}