ASF Bugzilla – Attachment 13928 Details for
Bug 32657
Experimental single pass SAX xml signature verification
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Second version
sax.patch (text/plain), 92.62 KB, created by
Raul Benito
on 2005-01-07 18:27:45 UTC
(
hide
)
Description:
Second version
Filename:
MIME Type:
Creator:
Raul Benito
Created:
2005-01-07 18:27:45 UTC
Size:
92.62 KB
patch
obsolete
>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<level?level:maxLevel; >+ i++; >+ } >+ } >+ } >+ >+ } >+ >+ public void startPrefixMapping(String prefix, String uri) >+ throws SAXException { >+ String realPrefix=("".equals(prefix) ? "xmlns" : prefix); >+ String []attr = {"xmlns" >+ ,uri,("".equals(prefix) ? "xmlns" : "xmlns:"+prefix)}; >+ ns.addMapping(realPrefix,uri,attr); >+ Iterator it=workers.iterator(); >+ while (it.hasNext()) { >+ ((SaxWorker)it.next()).startPrefixMapping(prefix,uri); >+ } >+ } >+ >+ public void add(SaxWorker worker) { >+ maxLevel=level; >+ workers.add(0,worker); >+ workersLevel.add(0,new Integer(level)); >+ } >+ public void replace(SaxWorker old,SaxWorker newW) { >+ int pos=workers.indexOf(old); >+ workers.set(pos,newW); >+ } >+ public void remove(SaxWorker worker) { >+ int pos=workers.indexOf(worker); >+ workers.remove(worker); >+ workersLevel.remove(pos); >+ } >+ public void pause(SaxWorker worker) { >+ int pos=workers.indexOf(worker); >+ workers.remove(worker); >+ workersPause.add(worker); >+ workersLevelPause.add(workersLevel.remove(pos)); >+ } >+ >+ public void resume(SaxWorker worker) { >+ int pos=workersPause.indexOf(worker); >+ workersPause.remove(worker); >+ workers.add(worker); >+ workersLevel.add(workersLevelPause.remove(pos)); >+ } >+} >Index: src_samples/com/r_bg/sax_signature/SaxListener.java >=================================================================== >RCS file: src_samples/com/r_bg/sax_signature/SaxListener.java >diff -N src_samples/com/r_bg/sax_signature/SaxListener.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src_samples/com/r_bg/sax_signature/SaxListener.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,25 @@ >+/* >+ * Created on Dec 19, 2004 >+ */ >+package com.r_bg.sax_signature; >+ >+import com.r_bg.sax_signature.readers.KeyInfoReader; >+import com.r_bg.sax_signature.readers.ReferenceReader; >+ >+/** >+ * @author raul >+ * >+ */ >+public interface SaxListener { >+ public void onReferenceReaded(ReferenceReader ref); >+ >+ /** >+ * >+ */ >+ public void onC14nMethodReaded(); >+ >+ /** >+ * @param key >+ */ >+ public void onKeyInfo(KeyInfoReader key); >+} >Index: src_samples/com/r_bg/sax_signature/SaxWorker.java >=================================================================== >RCS file: src_samples/com/r_bg/sax_signature/SaxWorker.java >diff -N src_samples/com/r_bg/sax_signature/SaxWorker.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src_samples/com/r_bg/sax_signature/SaxWorker.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,13 @@ >+/* >+ * Created on Dec 18, 2004 >+ */ >+package com.r_bg.sax_signature; >+ >+import org.xml.sax.helpers.DefaultHandler; >+ >+/** >+ * The Base class for the other people. >+ */ >+public class SaxWorker extends DefaultHandler { >+ >+} >Index: src_samples/com/r_bg/sax_signature/SignatureControler.java >=================================================================== >RCS file: src_samples/com/r_bg/sax_signature/SignatureControler.java >diff -N src_samples/com/r_bg/sax_signature/SignatureControler.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src_samples/com/r_bg/sax_signature/SignatureControler.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,101 @@ >+/* >+ * Created on Dec 18, 2004 >+ */ >+package com.r_bg.sax_signature; >+ >+import java.io.IOException; >+import java.security.PublicKey; >+ >+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.readers.ReferenceReader; >+import com.r_bg.sax_signature.readers.SignatureReader; >+ >+/** >+ * Controls the creation of SaxReaders. Possible Interface >+ * TODO: Only one signature per document right now. >+ * @author raul >+ */ >+public class SignatureControler { >+ /** The Handler we are associated to */ >+ SaxHandler saxHandler; >+ /** The signature object we are working on */ >+ SignatureReader signature; >+ protected SaxC14nBase refC14n; >+ >+ public final static String DSIG_NS="http://www.w3.org/2000/09/xmldsig#"; >+ public final static String SIGNATURE="Signature"; >+ /** >+ * Creates a signature mediator >+ */ >+ public SignatureControler() { >+ >+ } >+ >+ public SaxHandler createSaxHandler() { >+ saxHandler=new SaxHandler(this); >+ return saxHandler; >+ } >+ /** >+ * New Element processed. Before sending to the Workers. It can add new Workers. >+ * @param uri >+ * @param localName >+ */ >+ public void startElement(String uri, String localName, String qName, Attributes atr) throws SAXException { >+ if (DSIG_NS.equals(uri) && SIGNATURE.equals(localName)) { >+ signature=new SignatureReader((PublicKey)null); >+ saxHandler.add(signature); >+ } >+ } >+ public void endElement(String uri, String localName) { >+ } >+ public boolean verifyReference(int number) { >+ assert number!=0 : "Only one reference, sorry"; >+ String expected=signature.getReference(number).getDigestValue(); >+ String obtained=refC14n.getBase64Digest(); >+ if (!expected.equals(obtained)) { >+ //Log error & return >+ System.err.println("Error expected:"+expected+" but got:"+obtained); >+ return false; >+ } >+ return true; >+ >+ } >+ >+ public boolean verify() { >+ return signature.validateSignature(); >+ } >+ >+ /** >+ * @param worker >+ */ >+ public void onRemove(SaxWorker worker) { >+ } >+ >+ /** >+ * @param ref2 >+ * @return >+ */ >+ protected static SaxC14nBase generateSaxC14(ReferenceReader ref2) { >+ SaxC14nBase sol; >+ if (ref2.isExclusive()) { >+ sol=new SaxC14nExcl(); >+ } else { >+ sol=new SaxC14nIncl(); >+ } >+ >+ try { >+ sol.setOutputStream( ref2.getDigesterOutput()); >+ } catch (IOException e) { >+ throw new RuntimeException("Unable to set OutputStream",e); >+ } >+ return sol; >+ } >+ >+} >+ >Index: src_samples/com/r_bg/sax_signature/c14n/AttributesCompare.java >=================================================================== >RCS file: src_samples/com/r_bg/sax_signature/c14n/AttributesCompare.java >diff -N src_samples/com/r_bg/sax_signature/c14n/AttributesCompare.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src_samples/com/r_bg/sax_signature/c14n/AttributesCompare.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,88 @@ >+/* >+ * 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; >+ >+/** >+ * @author raul >+ * >+ * TODO To change the template for this generated type comment go to >+ * Window - Preferences - Java - Code Style - Code Templates >+ */ >+class AttributesCompare implements java.util.Comparator { >+ /* (non-Javadoc) >+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) >+ */ >+ public int compare(Object obj0, Object obj1) { >+ String[] attr0 = (String[]) obj0; >+ String[] attr1 = (String[]) obj1; >+ String namespaceURI0 = attr0[0]; >+ String namespaceURI1 = attr1[0]; >+ >+ boolean isNamespaceAttr0 = >+ "xmlns".equals(namespaceURI0); >+ boolean isNamespaceAttr1 = >+ "xmlns".equals(namespaceURI1); >+ >+ if (isNamespaceAttr0) { >+ if (isNamespaceAttr1) { >+ >+ // both are namespaces >+ String localname0 = attr0[1]; >+ String localname1 = attr1[1]; >+ >+ if (localname0.equals("xmlns")) { >+ localname0 = ""; >+ } >+ >+ if (localname1.equals("xmlns")) { >+ localname1 = ""; >+ } >+ >+ return localname0.compareTo(localname1); >+ } >+ // attr0 is a namespace, attr1 is not >+ return -1; >+ >+ } >+ if (isNamespaceAttr1) { >+ >+ // attr1 is a namespace, attr0 is not >+ return +1; >+ } >+ >+ // none is a namespae >+ >+ if (namespaceURI0 == null) { >+ if (namespaceURI1 == null) { >+ /* >+ String localName0 = attr0.getLocalName(); >+ String localName1 = attr1.getLocalName(); >+ return localName0.compareTo(localName1); >+ */ >+ >+ String name0 = attr0[1]; >+ String name1 = attr1[1]; >+ return name0.compareTo(name1); >+ } >+ return -1; >+ >+ } >+ if (namespaceURI1 == null) { >+ return +0; >+ } >+ int a = namespaceURI0.compareTo(namespaceURI1); >+ >+ if (a != 0) { >+ return a; >+ } >+ >+ String localName0 = attr0[2]; >+ String localName1 = attr1[2]; >+ >+ return localName0.compareTo(localName1); >+ } >+} >Index: src_samples/com/r_bg/sax_signature/c14n/SaxC14nBase.java >=================================================================== >RCS file: src_samples/com/r_bg/sax_signature/c14n/SaxC14nBase.java >diff -N src_samples/com/r_bg/sax_signature/c14n/SaxC14nBase.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src_samples/com/r_bg/sax_signature/c14n/SaxC14nBase.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,200 @@ >+/* >+ * 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.io.ByteArrayOutputStream; >+import java.io.IOException; >+import java.io.OutputStream; >+import java.util.Iterator; >+import java.util.SortedSet; >+ >+import org.apache.xml.security.c14n.implementations.NameSpaceSymbTable; >+import org.apache.xml.security.utils.Base64; >+import org.apache.xml.security.utils.DigesterOutputStream; >+import org.apache.xml.security.utils.SignerOutputStream; >+import org.xml.sax.Attributes; >+import org.xml.sax.SAXException; >+ >+import com.r_bg.sax_signature.SaxWorker; >+ >+/** >+ * @author raul >+ * >+ * TODO To change the template for this generated type comment go to >+ * Window - Preferences - Java - Code Style - Code Templates >+ */ >+public abstract class SaxC14nBase extends SaxWorker{ >+ public NameSpaceSymbTable ns=null; >+ >+ private boolean outputComments=true; >+ public OutputStream os=new ByteArrayOutputStream(); >+ >+ /** @throws IOException >+ * @inheritDoc **/ >+ final static byte[] EQ_Q= {'=','"'}; >+ final static byte[] END_T= {'<','/'}; >+ public void startElement(String arg0, String arg1, String arg2, Attributes arg3) >+ throws SAXException { >+ ns.push(); >+ SortedSet s = handleAttributes(arg2, arg3); >+ try { >+ os.write('<'); >+ writeStringToUtf8(arg2,os); >+ Iterator it=s.iterator(); >+ while (it.hasNext()) { >+ String[] attr=(String[])it.next(); >+ os.write(' ');writeStringToUtf8(attr[2],os); >+ os.write(EQ_Q); >+ writeStringToUtf8(attr[1],os); >+ os.write('"'); >+ } >+ os.write('>'); >+ } 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<arg1+arg2;i++) >+ writeCharToUtf8(arg0[i],os); >+ } catch (IOException e) { >+ throw new RuntimeException(e); >+ } >+ } >+ >+ /** @inheritDoc **/ >+ public void startPrefixMapping(String arg0, String arg1) >+ throws SAXException { >+ String prefix=("".equals(arg0) ? "xmlns" : arg0); >+ String []attr = {"xmlns" >+ ,arg1,("".equals(arg0) ? "xmlns" : "xmlns:"+arg0)}; >+ ns.addMapping(prefix,arg1,attr); >+ } >+ >+ /** @inheritDoc **/ >+ public void endElement(String arg0, String arg1, String arg2) >+ throws SAXException { >+ try { >+ os.write(END_T); >+ writeStringToUtf8(arg2,os); >+ os.write('>'); >+ } 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(("<!--"+st+"-->").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<length;i++) { >+ char c=str.charAt(i); >+ 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)); >+ >+ } >+ } >+ } >+ >+ /** >+ * @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;i<arg3.getLength();i++) { >+ String qname=arg3.getQName(i); >+ int colon=qname.indexOf(':'); >+ String prefix=qname; >+ if (colon>0) { >+ 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<arg3.getLength();i++) { >+ String qname=arg3.getQName(i); >+ String []attr= {arg3.getURI(i),arg3.getValue(i),qname}; >+ s.add(attr); >+ } >+ ns.getUnrenderedNodes(s); >+ return s; >+ } >+ >+} >Index: src_samples/com/r_bg/sax_signature/c14n/SaxC14nUnknown.java >=================================================================== >RCS file: src_samples/com/r_bg/sax_signature/c14n/SaxC14nUnknown.java >diff -N src_samples/com/r_bg/sax_signature/c14n/SaxC14nUnknown.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src_samples/com/r_bg/sax_signature/c14n/SaxC14nUnknown.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,120 @@ >+/* >+ * 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.io.IOException; >+import java.io.OutputStream; >+import java.util.ArrayList; >+import java.util.Iterator; >+import java.util.List; >+import java.util.SortedSet; >+ >+import org.xml.sax.Attributes; >+import org.xml.sax.SAXException; >+import org.xml.sax.helpers.AttributesImpl; >+ >+/** >+ * @author raul >+ * >+ * TODO To change the template for this generated type comment go to >+ * Window - Preferences - Java - Code Style - Code Templates >+ */ >+public class SaxC14nUnknown extends SaxC14nBase{ >+ OutputStream os=null; >+ private static final Integer ENDELEMENT = new Integer(0); >+ private static final Integer STARTPREFIXMAPPING = new Integer(1); >+ private static final Integer CHARACTERS = new Integer(2); >+ private static final Integer STARTELEMENT = new Integer(3); >+ List storedEvents=new ArrayList(); >+ public void startElement(String arg0, String arg1, String arg2, Attributes arg3) >+ throws SAXException { >+ storedEvents.add(STARTELEMENT); >+ AttributesImpl atr=new AttributesImpl(); >+ for (int i=0;i<arg3.getLength();i++) { >+ atr.addAttribute(arg3.getURI(i),arg3.getLocalName(i),arg3.getQName(i), >+ arg3.getType(i),arg3.getValue(i)); >+ } >+ storedEvents.add(new Object[]{arg0,arg1,arg2,atr}); >+ } >+ /** @inheritDoc **/ >+ public void characters(char[] arg0, int arg1, int arg2) { >+ storedEvents.add(CHARACTERS); >+ storedEvents.add(new String(arg0,arg1,arg2)); >+ } >+ >+ /* (non-Javadoc) >+ * @see prb.SaxCanon#startPrefixMapping(java.lang.String, java.lang.String) >+ */ >+ public void startPrefixMapping(String arg0, String arg1) throws SAXException { >+ storedEvents.add(STARTPREFIXMAPPING); >+ storedEvents.add(new String[]{arg0, arg1}); >+ } >+ public void removeLastPrefixMapping() { >+ int size=storedEvents.size()-2; >+ if (storedEvents.get(size)!=STARTPREFIXMAPPING) { >+ throw new RuntimeException("PROBLEM"); >+ } >+ storedEvents.remove(size); >+ storedEvents.remove(size); >+ } >+ /** @inheritDoc **/ >+ public void endElement(String arg0, String arg1, String arg2) >+ throws SAXException { >+ storedEvents.add(ENDELEMENT); >+ storedEvents.add(new String[]{arg0,arg1,arg2}); >+ } >+ SortedSet handleAttributes(String arg2, Attributes arg3) { >+ // TODO Auto-generated method stub >+ return null; >+ } >+ >+ public void refill(SaxC14nBase sc) throws SAXException { >+ //Fill with the first ns. >+ sc.setNamespaceTable(ns); >+ if (os!=null) { >+ try { >+ sc.setOutputStream(os); >+ } catch (IOException e) { >+ // TODO Auto-generated catch block >+ e.printStackTrace(); >+ } >+ } >+ Iterator it=storedEvents.iterator(); >+ while (it.hasNext()) { >+ int type=((Integer)it.next()).intValue(); >+ //System.out.println("TYPE:"+type); >+ switch (type) { >+ case 0: //endElement >+ String ob[]=(String[])it.next(); >+ sc.endElement(ob[0],ob[1],ob[2]); >+ break; >+ case 1: >+ ob=(String[])it.next(); >+ sc.startPrefixMapping(ob[0],ob[1]); >+ break; >+ case 2: >+ String a=(String)it.next(); >+ sc.characters(a.toCharArray(),0,a.length()); >+ break; >+ case 3: >+ Object ob1[]=(Object[])it.next(); >+ //System.out.println("StartElement:"+ob1[1]); >+ sc.startElement((String)ob1[0],(String)ob1[1],(String)ob1[2], >+ (Attributes) ob1[3]); >+ break; >+ } >+ } >+ >+ } >+ /* (non-Javadoc) >+ * @see prb.SaxCanon#setOutputStream(java.io.OutputStream) >+ */ >+ public void setOutputStream(OutputStream md) throws IOException { >+ os=md; >+ } >+ >+} >Index: src_samples/com/r_bg/sax_signature/readers/KeyInfoReader.java >=================================================================== >RCS file: src_samples/com/r_bg/sax_signature/readers/KeyInfoReader.java >diff -N src_samples/com/r_bg/sax_signature/readers/KeyInfoReader.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src_samples/com/r_bg/sax_signature/readers/KeyInfoReader.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,107 @@ >+/* >+ * Created on Jan 2, 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.readers; >+ >+import java.io.ByteArrayInputStream; >+import java.math.BigInteger; >+import java.security.KeyFactory; >+import java.security.NoSuchAlgorithmException; >+import java.security.PublicKey; >+import java.security.cert.CertificateException; >+import java.security.cert.CertificateFactory; >+import java.security.cert.X509Certificate; >+import java.security.spec.InvalidKeySpecException; >+import java.security.spec.RSAPublicKeySpec; >+ >+import org.apache.xml.security.exceptions.Base64DecodingException; >+import org.apache.xml.security.exceptions.XMLSecurityException; >+import org.apache.xml.security.keys.content.x509.XMLX509Certificate; >+import org.apache.xml.security.utils.Base64; >+import org.xml.sax.Attributes; >+import org.xml.sax.SAXException; >+ >+import com.r_bg.sax_signature.SaxWorker; >+ >+/** >+ * @author raul >+ * >+ * TODO Make more standard compliant. Only RSA private key >+ */ >+public class KeyInfoReader extends SaxWorker{ >+ String modulus; >+ String exponent; >+ String x509Certificate; >+ StringBuffer working=new StringBuffer(); >+ PublicKey pk; >+ public void startElement(String uri, String localname, String arg2, >+ Attributes arg3) throws SAXException { >+ if (("Modulus".equals(localname)) || "Exponent".equals(localname) || "X509Certificate".equals(localname)) { >+ working=new StringBuffer(); >+ } >+ >+ } >+ public void endElement(String uri, String localname, String arg2) >+ throws SAXException { >+ if ("Modulus".equals(localname)) { >+ modulus=working.toString(); >+ working=null; >+ } else if ("Exponent".equals(localname)) { >+ exponent=working.toString(); >+ working=null; >+ try { >+ KeyFactory rsaFactory = KeyFactory.getInstance("RSA"); >+ RSAPublicKeySpec rsaKeyspec = new RSAPublicKeySpec( >+ new BigInteger(Base64.decode(modulus)), >+ new BigInteger(Base64.decode(exponent))); >+ setPublicKey(rsaFactory.generatePublic(rsaKeyspec)); >+ } catch (NoSuchAlgorithmException e) { >+ // TODO Auto-generated catch block >+ e.printStackTrace(); >+ } catch (InvalidKeySpecException e) { >+ // TODO Auto-generated catch block >+ e.printStackTrace(); >+ } catch (Base64DecodingException e) { >+ // TODO Auto-generated catch block >+ e.printStackTrace(); >+ } >+ } else if ("X509Certificate".equals(localname)) { >+ x509Certificate=working.toString(); >+ working=null; >+ try { >+ byte certbytes[] = Base64.decode(x509Certificate.getBytes()); >+ CertificateFactory certFact = >+ CertificateFactory.getInstance(XMLX509Certificate.JCA_CERT_ID); >+ X509Certificate cert = >+ (X509Certificate) certFact >+ .generateCertificate(new ByteArrayInputStream(certbytes)); >+ setPublicKey(cert.getPublicKey()); >+ } catch (CertificateException ex) { >+ ex.printStackTrace(); >+ } catch (Base64DecodingException e) { >+ // TODO Auto-generated catch block >+ e.printStackTrace(); >+ } >+ } >+ >+ } >+ /* (non-Javadoc) >+ * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int) >+ */ >+ public void characters(char[] arg0, int arg1, int arg2) throws SAXException { >+ if (working!=null) >+ working.append(arg0,arg1,arg2); >+ } >+ public PublicKey getPublicKey() { >+ return pk; >+ } >+ private void setPublicKey(PublicKey pk) { >+ if ((this.pk!=null) && !this.pk.equals(pk)) { >+ throw new RuntimeException("Certificate and already public key not equal."); >+ } >+ this.pk=pk; >+ } >+} >Index: src_samples/com/r_bg/sax_signature/readers/ReferenceReader.java >=================================================================== >RCS file: src_samples/com/r_bg/sax_signature/readers/ReferenceReader.java >diff -N src_samples/com/r_bg/sax_signature/readers/ReferenceReader.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src_samples/com/r_bg/sax_signature/readers/ReferenceReader.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,121 @@ >+/* >+ * 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.readers; >+ >+import java.io.OutputStream; >+import java.security.MessageDigest; >+ >+import org.apache.xml.security.algorithms.JCEMapper; >+import org.apache.xml.security.utils.Base64; >+import org.apache.xml.security.utils.DigesterOutputStream; >+import org.xml.sax.Attributes; >+ >+import com.r_bg.sax_signature.SaxWorker; >+ >+/** >+ * @author raul >+ * >+ * TODO To change the template for this generated type comment go to >+ * Window - Preferences - Java - Code Style - Code Templates >+ */ >+public class ReferenceReader extends SaxWorker{ >+ String uri; >+ boolean inDigest=false; >+ String digestValue; >+ DigesterOutputStream di; >+ boolean exclusive=false; >+ boolean enveloped=false; >+ public ReferenceReader(Attributes atrs) { >+ uri=atrs.getValue("URI"); >+ } >+ public void startElement(String uri,String localname,String qname,Attributes arg3) { >+ if ("Transform".equals(localname)) { >+ String algoth=arg3.getValue("Algorithm"); >+ if ("http://www.w3.org/2001/10/xml-exc-c14n#". >+ equals(algoth)) { >+ exclusive=true; >+ } else if ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315". >+ equals(algoth)){ >+ exclusive=false; >+ } else if ("http://www.w3.org/2000/09/xmldsig#enveloped-signature".equals(algoth)){ >+ enveloped=true; >+ } else { >+ throw new RuntimeException("Sorry unknown transformation:"+algoth); >+ } >+ } >+ if ("DigestMethod".equals(localname)) { >+ String algorithmURI=arg3.getValue("Algorithm"); >+ String algorithmID = JCEMapper.translateURItoJCEID(algorithmURI); >+ >+ MessageDigest md; >+ >+ try { >+ md = MessageDigest.getInstance(algorithmID); >+ } catch (java.security.NoSuchAlgorithmException ex) { >+ Object[] exArgs = { algorithmID, >+ ex.getLocalizedMessage() }; >+ >+ throw new RuntimeException("No such algorithm"); >+ } >+ this.di=new DigesterOutputStream(md); >+ //try { >+ // sc.setOutputStream(new BufferedOutputStream(di)); >+ //} catch (IOException e) { >+ // TODO Auto-generated catch block >+ // e.printStackTrace(); >+ //} >+ >+ } >+ if ("DigestValue".equals(localname)) { >+ inDigest=true; >+ } >+ } >+ public boolean validate() { >+ /* >+ try { >+ //sc.os.flush(); >+ } catch (IOException e) { >+ >+ }*/ >+ boolean b=digestValue.equals(Base64.encode(di.getDigestValue())); >+ if (!b) { >+ //System.out.println("fail the value:"+sc.getBase64Digest()); >+ } >+ return b; >+ } >+ public void characters(char[] arg0, int arg1, int arg2) { >+ if (inDigest) { >+ //System.out.println("Setting digest:"+value); >+ digestValue=new String(arg0,arg1,arg2); >+ } >+ } >+ public void endElement(String uri,String localname,String qname) { >+ if ("DigestValue".equals(localname)) { >+ inDigest=false; >+ } >+ } >+ /** >+ * @return Returns the uri. >+ */ >+ public String getUri() { >+ return uri; >+ } >+ /** >+ * @return >+ */ >+ public boolean isExclusive() { >+ return exclusive; >+ } >+ >+ public String getDigestValue() { >+ return digestValue; >+ } >+ >+ public OutputStream getDigesterOutput() { >+ return di; >+ } >+} >Index: src_samples/com/r_bg/sax_signature/readers/SignatureReader.java >=================================================================== >RCS file: src_samples/com/r_bg/sax_signature/readers/SignatureReader.java >diff -N src_samples/com/r_bg/sax_signature/readers/SignatureReader.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src_samples/com/r_bg/sax_signature/readers/SignatureReader.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,170 @@ >+/* >+ * 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.readers; >+ >+import java.security.PublicKey; >+ >+import org.apache.xml.security.algorithms.SignatureAlgorithm; >+import org.apache.xml.security.exceptions.XMLSecurityException; >+import org.apache.xml.security.signature.XMLSignatureException; >+import org.apache.xml.security.utils.Base64; >+import org.apache.xml.security.utils.SignerOutputStream; >+import org.xml.sax.Attributes; >+import org.xml.sax.SAXException; >+ >+import com.r_bg.sax_signature.SaxListener; >+import com.r_bg.sax_signature.SaxWorker; >+ >+ >+/** >+ * @author raul >+ * >+ * TODO To change the template for this generated type comment go to >+ * Window - Preferences - Java - Code Style - Code Templates >+ */ >+public class SignatureReader extends SaxWorker { >+ SaxWorker currentReader=null; >+ private static final String XMLNS_URI = "http://www.w3.org/2000/09/xmldsig#"; >+ boolean inSignatureValue=false; >+ String c14nMethod; >+ ReferenceReader ref; >+ KeyInfoReader key; >+ String signatureValue=null; >+ PublicKey pk; >+ private SignatureAlgorithm sa; >+ SaxListener listener=null; >+ /** >+ * >+ */ >+ public SignatureReader(PublicKey pk) { >+ this.pk=pk; >+ } >+ public SignatureReader(SaxListener listener) { >+ this.listener=listener; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) >+ */ >+ public void startElement(String arg0, String arg1, String arg2, >+ Attributes arg3) throws SAXException { >+ >+ if (XMLNS_URI.equals(arg0) && "Reference".equals(arg1)) { >+ assert ref==null : "Only one reference implemented"; >+ //gives time to create a CannonWatch in case it isn't already created >+ ref=new ReferenceReader(arg3); >+ currentReader=ref; >+ } else >+ if (XMLNS_URI.equals(arg0) && "SignatureValue".equals(arg1)) { >+ inSignatureValue=true; >+ } else >+ if (XMLNS_URI.equals(arg0) && "SignatureMethod".equals(arg1)) { >+ updateSignatureStream(arg3); >+ } else >+ if (XMLNS_URI.equals(arg0) && "CanonicalizationMethod".equals(arg1)) { >+ c14nMethod=arg3.getValue("Algorithm"); >+ //sd.fireOnCanonicalizationMethod(arg3); >+ } else if (XMLNS_URI.equals(arg0) && "KeyInfo".equals(arg1)) { >+ key=new KeyInfoReader(); >+ currentReader=key; >+ } >+ else >+ if (currentReader!=null) { >+ currentReader.startElement(arg0,arg1,arg2,arg3); >+ } >+ } >+ >+ /** >+ * @param arg3 >+ */ >+ private void fireOnReference(ReferenceReader r) { >+ listener.onReferenceReaded(r); >+ >+ } >+ >+ /** >+ * @param arg3 >+ */ >+ private void updateSignatureStream(Attributes arg3) { >+ try { >+ sa = new SignatureAlgorithm(arg3.getValue("Algorithm")); >+ } catch (XMLSecurityException e) { >+ throw new RuntimeException("No algoth",e); >+ } >+ } >+ >+ public void endElement(String arg0, String arg1, String arg2) >+ throws SAXException { >+ if (XMLNS_URI.equals(arg0) && "CanonicalizationMethod".equals(arg1)) { >+ fireOnCanonicalizationMethod(); >+ } else >+ if (XMLNS_URI.equals(arg0) && "Reference".equals(arg1)) { >+ currentReader=null; >+ fireOnReference(ref); >+ } else >+ if (XMLNS_URI.equals(arg0) && "SignatureValue".equals(arg1)) { >+ inSignatureValue=false; >+ } else if (XMLNS_URI.equals(arg0) && "KeyInfo".equals(arg1)) { >+ fireOnKeyInfo(); >+ currentReader=null; >+ }else >+ if (currentReader!=null) { >+ currentReader.endElement(arg0,arg1,arg2); >+ } >+ } >+ /** >+ * >+ */ >+ private void fireOnCanonicalizationMethod() { >+ listener.onC14nMethodReaded(); >+ >+ } >+ private void fireOnKeyInfo() { >+ listener.onKeyInfo(key); >+ } >+ public boolean validateReferences() { >+ return ref.validate(); >+ } >+ >+ public void characters(char[] arg0, int arg1, int arg2) throws SAXException { >+ if (currentReader!=null) { >+ currentReader.characters(arg0,arg1,arg2); >+ } >+ if (inSignatureValue) { >+ if (signatureValue!=null) >+ signatureValue+=new String(arg0,arg1,arg2); >+ else >+ signatureValue=new String(arg0,arg1,arg2); >+ } >+ } >+ >+ public boolean validateSignature() { >+ //System.out.println("a="+signatureValue); >+ try { >+ //((CanonWatch)sd.scs.get(0)).sc.os.flush(); >+ return sa.verify(Base64.decode(signatureValue)); >+ } catch (Exception e) { >+ throw new RuntimeException(e); >+ } >+ } >+ /** >+ * @return >+ */ >+ public String getC14nMethod() { >+ return c14nMethod; >+ } >+ >+ public ReferenceReader getReference(int i) { >+ assert i==0: "More than one"; >+ return ref; >+ } >+ >+ public SignatureAlgorithm getSignatureAlgorithm() { >+ return sa; >+ } >+ >+} >Index: src_unitTests/com/r_bg/sax_signature/EnvelopingSignatureTest.java >=================================================================== >RCS file: src_unitTests/com/r_bg/sax_signature/EnvelopingSignatureTest.java >diff -N src_unitTests/com/r_bg/sax_signature/EnvelopingSignatureTest.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src_unitTests/com/r_bg/sax_signature/EnvelopingSignatureTest.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,166 @@ >+/* >+ * 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 EnvelopingSignatureTest extends TestCase { >+ >+ public static Test suite() { >+ return new TestSuite(EnvelopingSignatureTest.class); >+ } >+ private static void createTestA() 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, >+ Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS); >+ sig.addKeyInfo(kp.getPublic()); >+ Element anElement = doc.createElementNS(null, "RootObject"); >+ Element anElement2 = doc.createElementNS(null, "UnderObject"); >+ //anElement2.setAttribute("id","1"); >+ //anElement.appendChild(anElement2); >+ ObjectContainer obj=new ObjectContainer(doc); >+ obj.getElement().appendChild(anElement2); >+ obj.setId("1"); >+ sig.appendObject(obj); >+ anElement.appendChild(sig.getElement()); >+ doc.appendChild(anElement); >+ 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_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<sig.getSignedInfo().getSignedContentLength(); i++) { >+ System.out.println("--- Signed Content follows ---:"+i); >+ System.out.println(new String(sig.getSignedInfo().getSignedContentItem(i))); >+ } >+ System.out.println("Signed output:"); >+ ByteArrayOutputStream os=new ByteArrayOutputStream(); >+ sig.getSignedInfo().signInOctectStream(os); >+ System.out.println(new String(os.toByteArray())); >+ } >+ public void testExc() throws Exception{ >+ //createTestA(); >+ String envelopingSig="<RootObject><ds:Signature xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">\n" + >+ "<ds:SignedInfo>\n" + >+ "<ds:CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"></ds:CanonicalizationMethod>\n" + >+ "<ds:SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\"></ds:SignatureMethod>\n" + >+ "<ds:Reference URI=\"#1\">\n" + >+ "<ds:Transforms>\n" + >+ "<ds:Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"></ds:Transform>\n" + >+ "</ds:Transforms>\n" + >+ "<ds:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"></ds:DigestMethod>\n" + >+ "<ds:DigestValue>oMQoFufPA7Un6cfz0GaEOJpE4Z8=</ds:DigestValue>\n" + >+ "</ds:Reference>\n" + >+ "</ds:SignedInfo>\n" + >+ "<ds:SignatureValue>\n" + >+ "AhyiFQ6hucykYJOJDBV3wbPBe2TAURXXfCUD7BmSAecT+izT9fHFsxRVez3s+6hYSgtaVhmeVgbd\n" + >+ "ZEOMPFihBGldi1NV73Z/tpXxqNvY+/NwQmmasQp9gzFHxYF2cqi8m7sAHM03BIC1YoBctxVw/jxV\n" + >+ "ClhLJuTSHoKwlzKH24g=\n" + >+ "</ds:SignatureValue>\n" + >+ "<ds:KeyInfo>\n" + >+ "<ds:KeyValue>\n" + >+ "<ds:RSAKeyValue>\n" + >+ "<ds:Modulus>\n" + >+ "skqbW7oBwM1lCWNwC1obkgj4VV58G1AX7ERMWEIrQQlZ8uFdQ3FNkgMdtmx/XUjNF+zXTDmxe+K/\n" + >+ "lne+0KDwLWskqhS6gnkQmxZoR4FUovqRngoqU6bnnn0pM9gF/AI/vcdu7aowbF9S7TVlSw7IpxIQ\n" + >+ "VjevEfohDpn/+oxljm0=\n" + >+ "</ds:Modulus>\n" + >+ "<ds:Exponent>AQAB</ds:Exponent>\n" + >+ "</ds:RSAKeyValue>\n" + >+ "</ds:KeyValue>\n" + >+ "</ds:KeyInfo>\n" + >+ "<ds:Object Id=\"1\"><UnderObject>A text in a box<OtherObject><OtherObject2></OtherObject2><OtherObject6></OtherObject6><OtherObject></OtherObject></OtherObject></UnderObject></ds:Object>\n" + >+ "</ds:Signature></RootObject>"; >+ 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<sig.getSignedInfo().getSignedContentLength(); i++) { >+ System.out.println("--- Signed Content follows ---:"+i); >+ System.out.println(new String(sig.getSignedInfo().getSignedContentItem(i))); >+ } >+ System.out.println("Signed output:"); >+ ByteArrayOutputStream os=new ByteArrayOutputStream(); >+ sig.getSignedInfo().signInOctectStream(os); >+ System.out.println(new String(os.toByteArray())); >+ } >+ public void testExc() throws Exception{ >+ //createTestA(true); >+ String envelopingSig="<Envelope xmlns:a=\"http://b\"><RootObject Id=\"1\"><ds:Signature xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">\n" + >+ "<ds:SignedInfo>\n" + >+ "<ds:CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"></ds:CanonicalizationMethod>\n" + >+ "<ds:SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\"></ds:SignatureMethod>\n" + >+ "<ds:Reference URI=\"#1\">\n" + >+ "<ds:Transforms>\n" + >+ "<ds:Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\"></ds:Transform>\n" + >+ "</ds:Transforms>\n" + >+ "<ds:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"></ds:DigestMethod>\n" + >+ "<ds:DigestValue>t2hiaMVZW+Z3P2992iEyrDgVLS0=</ds:DigestValue>\n" + >+ "</ds:Reference>\n" + >+ "</ds:SignedInfo>\n" + >+ "<ds:SignatureValue>\n" + >+ "ik/EUbz8OgQztvbnK9tbZdf5XSKYc7eMyJ98trW3LoUrxXD47P3gLMnMK5t0JCe+wbxBby0Aux2M\n" + >+ "fctuwBsMQve6KwbdvD/2YiS70XmTEvBChCiBYdN1nHfJYyW66xnALoE5V5NuiLrt0cgEggfMTrEy\n" + >+ "HYm9g6RQ0IEe/lQCIK4=\n" + >+ "</ds:SignatureValue>\n" + >+ "<ds:KeyInfo>\n" + >+ "<ds:KeyValue>\n" + >+ "<ds:RSAKeyValue>\n" + >+ "<ds:Modulus>\n" + >+ "skqbW7oBwM1lCWNwC1obkgj4VV58G1AX7ERMWEIrQQlZ8uFdQ3FNkgMdtmx/XUjNF+zXTDmxe+K/\n" + >+ "lne+0KDwLWskqhS6gnkQmxZoR4FUovqRngoqU6bnnn0pM9gF/AI/vcdu7aowbF9S7TVlSw7IpxIQ\n" + >+ "VjevEfohDpn/+oxljm0=\n" + >+ "</ds:Modulus>\n" + >+ "<ds:Exponent>AQAB</ds:Exponent>\n" + >+ "</ds:RSAKeyValue>\n" + >+ "</ds:KeyValue>\n" + >+ "</ds:KeyInfo>\n" + >+ "</ds:Signature><UnderObject>A text in a box<OtherObject><OtherObject2></OtherObject2><OtherObject6></OtherObject6><OtherObject></OtherObject></OtherObject></UnderObject></RootObject></Envelope>\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="<Envelope xmlns:a=\"http://b\"><RootObject Id=\"1\"><ds:Signature xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">\n" + >+ "<ds:SignedInfo>\n" + >+ "<ds:CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"></ds:CanonicalizationMethod>\n" + >+ "<ds:SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\"></ds:SignatureMethod>\n" + >+ "<ds:Reference URI=\"#1\">\n" + >+ "<ds:Transforms>\n" + >+ "<ds:Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\"></ds:Transform>\n" + >+ "</ds:Transforms>\n" + >+ "<ds:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"></ds:DigestMethod>\n" + >+ "<ds:DigestValue>t2hiaMVZW+Z3P2992iEyrDgVLS0=</ds:DigestValue>\n" + >+ "</ds:Reference>\n" + >+ "</ds:SignedInfo>\n" + >+ "<ds:SignatureValue>\n" + >+ "ik/EUbz8OgQztvbnK9tbZdf5XSKYc7eMyJ98trW3LoUrxXD47P3gLMnMK5t0JCe+wbxBby0Aux2M\n" + >+ "fctuwBsMQve6KwbdvD/2YiS70XmTEvBChCiBYdN1nHfJYyW66xnALoE5V5NuiLrt0cgEggfMTrEy\n" + >+ "HYm9g6RQ0IEe/lQCIK4=\n" + >+ "</ds:SignatureValue>\n" + >+ "<ds:KeyInfo>\n" + >+ "<ds:KeyValue>\n" + >+ "<ds:RSAKeyValue>\n" + >+ "<ds:Modulus>\n" + >+ "skqbW7oBwM1lCWNwC1obkgj4VV58G1AX7ERMWEIrQQlZ8uFdQ3FNkgMdtmx/XUjNF+zXTDmxe+K/\n" + >+ "lne+0KDwLWskqhS6gnkQmxZoR4FUovqRngoqU6bnnn0pM9gF/AI/vcdu7aowbF9S7TVlSw7IpxIQ\n" + >+ "VjevEfohDpn/+oxljm0=\n" + >+ "</ds:Modulus>\n" + >+ "<ds:Exponent>AQAB</ds:Exponent>\n" + >+ "</ds:RSAKeyValue>\n" + >+ "</ds:KeyValue>\n" + >+ "</ds:KeyInfo>\n" + >+ "</ds:Signature><UnderObject>A text in a box<OtherObject><OtherObject2></OtherObject2><OtherObject6></OtherObject6><OtherObject></OtherObject></OtherObject></UnderObject></RootObject></Envelope>\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()); >+ >+ } >+ >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 32657
:
13738
| 13928