blob: 130327d684bef9fb7577cd3f40e8ab1de0eb48a0 [file] [log] [blame]
/*
* Copyright 2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
*/
package javax.xml.crypto.test.dsig;
import java.io.*;
import java.security.*;
import java.security.spec.*;
import java.util.*;
import javax.crypto.SecretKey;
import javax.xml.crypto.dsig.*;
import javax.xml.crypto.dsig.dom.DOMValidateContext;
import javax.xml.crypto.dsig.keyinfo.*;
import javax.xml.crypto.dsig.spec.*;
import javax.xml.crypto.dom.*;
import javax.xml.crypto.*;
import java.math.BigInteger;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.*;
/*
* @author Sean Mullan
* @author Valerie Peng
*/
public class TestUtils {
private static final String DSA_Y = "07066284216756577193658833512863439617178933165631848358445549382240081120085333137303066923542492834619027404463194956043802393462371310375123430985057160";
private static final String DSA_P = "013232376895198612407547930718267435757728527029623408872245156039757713029036368719146452186041204237350521785240337048752071462798273003935646236777459223";
private static final String DSA_Q = "0857393771208094202104259627990318636601332086981";
private static final String DSA_G = "05421644057436475141609648488325705128047428394380474376834667300766108262613900542681289080713724597310673074119355136085795982097390670890367185141189796";
private static final String DSA_X = "0527140396812450214498055937934275626078768840117";
private static final String RSA_MOD = "010800185049102889923150759252557522305032794699952150943573164381936603255999071981574575044810461362008102247767482738822150129277490998033971789476107463";
private static final String RSA_PUB = "065537";
private static final String RSA_PRIV = "0161169735844219697954459962296126719476357984292128166117072108359155865913405986839960884870654387514883422519600695753920562880636800379454345804879553";
private static final String RSA_P = "0115424415723722114324966978423259908612124678699162475636761464258454949949323";
private static final String RSA_Q = "0102758196571776648976474223306363419966067908877619912985851335233169851905977";
private static final String RSA_PE = "046029221736415726351267405909515200750383424291661371450734102390935198695783";
private static final String RSA_QE = "044015259993025528938883140770194453900658533927591226289558855038612449192129";
private static final String RSA_COEFF = "039865059011857370650977286999500339769808774456169959084951368761860263797695";
private TestUtils() {}
public static PublicKey getPublicKey(String algo)
throws InvalidKeySpecException, NoSuchAlgorithmException {
KeyFactory kf = KeyFactory.getInstance(algo);
KeySpec kspec;
if (algo.equalsIgnoreCase("DSA")) {
kspec = new DSAPublicKeySpec(new BigInteger(DSA_Y),
new BigInteger(DSA_P),
new BigInteger(DSA_Q),
new BigInteger(DSA_G));
} else if (algo.equalsIgnoreCase("RSA")) {
kspec = new RSAPublicKeySpec(new BigInteger(RSA_MOD),
new BigInteger(RSA_PUB));
} else throw new RuntimeException("Unsupported key algorithm " + algo);
return kf.generatePublic(kspec);
}
public static PrivateKey getPrivateKey(String algo)
throws InvalidKeySpecException, NoSuchAlgorithmException {
KeyFactory kf = KeyFactory.getInstance(algo);
KeySpec kspec;
if (algo.equalsIgnoreCase("DSA")) {
kspec = new DSAPrivateKeySpec
(new BigInteger(DSA_X), new BigInteger(DSA_P),
new BigInteger(DSA_Q), new BigInteger(DSA_G));
} else if (algo.equalsIgnoreCase("RSA")) {
kspec = new RSAPrivateKeySpec
(new BigInteger(RSA_MOD), new BigInteger(RSA_PRIV));
} else throw new RuntimeException("Unsupported key algorithm " + algo);
return kf.generatePrivate(kspec);
}
public static SecretKey getSecretKey(final byte[] secret) {
return new SecretKey() {
public String getFormat() { return "RAW"; }
public byte[] getEncoded() { return secret; }
public String getAlgorithm(){ return "SECRET"; }
};
}
public static Document newDocument() {
try {
DocumentBuilderFactory docFac =
DocumentBuilderFactory.newInstance();
docFac.setNamespaceAware(true);
DocumentBuilder docBuilder = docFac.newDocumentBuilder();
return docBuilder.newDocument();
} catch (Exception ex) {
return null;
}
}
public static class MyOwnC14nParameterSpec implements C14NMethodParameterSpec {}
public static class MyOwnDigestMethodParameterSpec
implements DigestMethodParameterSpec {}
public static class MyOwnSignatureMethodParameterSpec
implements SignatureMethodParameterSpec {}
public static XMLValidateContext getXMLValidateContext(String type,
File input,
String tag)
throws Exception {
if (type.equalsIgnoreCase("dom")) {
DocumentBuilderFactory docFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(input);
if (tag == null) {
return new DOMValidateContext
(TestUtils.getPublicKey("RSA"), doc.getDocumentElement());
} else {
NodeList list = doc.getElementsByTagName(tag);
return new DOMValidateContext
(TestUtils.getPublicKey("RSA"), list.item(0));
}
} else {
throw new Exception("Unsupported XMLValidateContext type: " +
type);
}
}
public static class MyOwnDOMReference extends DOMStructure
implements Reference {
private String id;
private boolean status;
private byte[] digest;
private static MessageDigest MD;
private static DigestMethod DIG_METHOD;
private Data derefData;
private InputStream dis;
static {
try {
MD = MessageDigest.getInstance("SHA");
XMLSignatureFactory factory = XMLSignatureFactory.getInstance
("DOM", new org.jcp.xml.dsig.internal.dom.XMLDSigRI());
DIG_METHOD =
factory.newDigestMethod(DigestMethod.SHA1, null);
} catch (Exception ex) {
// should never be thrown
}
};
public MyOwnDOMReference(String id, boolean status) {
super(newDocument());
this.id = id;
this.status = status;
digest = null;
}
public byte[] getDigestValue() {
if (digest == null) {
byte[] inBytes = id.getBytes();
digest = new byte[20];
if (status) {
digest = MD.digest(inBytes);
}
}
return digest;
}
public byte[] getCalculatedDigestValue() {
return null;
}
public DigestMethod getDigestMethod() { return DIG_METHOD; }
public String getId() {
return id;
}
public String getType() {
return null;
}
public String getURI() {
return null;
}
public List getTransforms() {
return Collections.EMPTY_LIST;
}
public boolean validate(XMLValidateContext vCtx)
throws XMLSignatureException {
this.dis = new ByteArrayInputStream(id.getBytes());
this.derefData = new OctetStreamData(this.dis);
return status;
}
public Data getDereferencedData() {
return derefData;
}
public InputStream getDigestInputStream() {
return dis;
}
}
public static class MyOwnXMLStructure implements XMLStructure {
public boolean isFeatureSupported(String feature)
throws NullPointerException {
if (feature == null) throw new NullPointerException();
return false;
}
}
public static class OctetStreamURIDereferencer implements URIDereferencer {
private byte[] data = null;
public OctetStreamURIDereferencer(byte[] in) {
data = (byte[]) in.clone();
}
public Data dereference(URIReference ref, XMLCryptoContext ctxt) {
return new OctetStreamData(new ByteArrayInputStream(data));
}
public byte[] getData() {
return data;
}
public boolean equals(Object obj) {
if (obj instanceof OctetStreamURIDereferencer) {
return Arrays.equals
(((OctetStreamURIDereferencer) obj).getData(), data);
} else {
return false;
}
}
public int hashCode() {
return 5678;
}
}
public static class NodeSetURIDereferencer implements URIDereferencer {
private Node data = null;
public NodeSetURIDereferencer(Node node) {
data = node;
}
public Data dereference(URIReference ref, XMLCryptoContext ctxt) {
return new NodeSetData() {
public Iterator iterator() {
return Collections.singletonList(data).iterator();
}
};
}
}
public static void dumpDocument(Document doc, String outName)
throws Exception {
DOMSource source = new DOMSource(doc);
File path = new File(System.getProperty("test.dir"), outName);
Result result = new StreamResult(new FileOutputStream(path));
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "yes");
trans.transform(source, result);
}
}