diff options
Diffstat (limited to 'spss.test/src/testgenerator/TestCases.java')
-rw-r--r-- | spss.test/src/testgenerator/TestCases.java | 611 |
1 files changed, 611 insertions, 0 deletions
diff --git a/spss.test/src/testgenerator/TestCases.java b/spss.test/src/testgenerator/TestCases.java new file mode 100644 index 000000000..db61af297 --- /dev/null +++ b/spss.test/src/testgenerator/TestCases.java @@ -0,0 +1,611 @@ +package testgenerator; +import iaik.ixsil.init.IXSILInit; +import iaik.ixsil.util.DOMUtilsImpl; +import iaik.ixsil.util.URI; + +import iaik.asn1.ASN1Object; +import iaik.asn1.ObjectID; +import iaik.asn1.structures.AlgorithmID; +import iaik.asn1.structures.Attribute; +import iaik.asn1.structures.ChoiceOfTime; +import iaik.asn1.structures.Name; +import iaik.cms.CMSException; +import iaik.cms.ContentInfo; +import iaik.cms.IssuerAndSerialNumber; +import iaik.cms.SignedData; +import iaik.cms.SignerInfo; +import iaik.pkcs.pkcs12.CertificateBag; +import iaik.pkcs.pkcs12.KeyBag; +import iaik.pkcs.pkcs12.PKCS12; +import iaik.security.ecc.interfaces.ECDSAPrivateKey; +import iaik.security.provider.IAIK; +import iaik.utils.Base64OutputStream; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.CharArrayWriter; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.math.BigInteger; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.security.interfaces.RSAPrivateKey; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Properties; + +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * Base class for all tutorial units. + * Provides some basic functionality, such as properties and signature + * serialization. + */ +public class TestCases +{ + public String Node2String(Node outputNode) + throws + TransformerFactoryConfigurationError, + TransformerConfigurationException, + TransformerException { + CharArrayWriter caw = new CharArrayWriter(); + TransformerFactory transformerFactory = + TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty(OutputKeys.METHOD, "xml"); + transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); + transformer.transform(new DOMSource(outputNode), new StreamResult(caw)); + + String erg = caw.toString(); + return erg; + } + + public void findNode(Node base,String name,ArrayList foundNodes) + { + findNode(base,name,foundNodes,-1); + } + + + public void findNode(Node base,String name,ArrayList foundNodes, int max_level) + { + findNode(base,name,foundNodes,max_level,0); + } + + + public void findNode(Node base,String name,ArrayList foundNodes, int max_level, int level) + { + if(max_level!=-1 && max_level<=level) return; + //System.out.println("FINDNODE "+name); + //System.out.println("CHECKING "+base.getNodeName()); + if(base.getNodeName().equals(name)) + { + //System.out.println("ADD BASE !"+name); + foundNodes.add(base); + } + + NodeList children = base.getChildNodes(); + int size = children.getLength(); + for(int counter=0;counter<size;counter++) + { + findNode(children.item(counter),name,foundNodes,max_level,level+1); + } + } + + Properties configuration_; + boolean[] variations_; + + /* ==================================================================================================== */ + + public TestCases() throws Exception + { + // Set some basic configuration properties + configuration_ = new Properties(); + + String baseDir = "e:/cio/projekte/basismodule/wartung/projekt/spss.test/"; + String webBaseDir = "http://localhost:8080/moa-spss-testdata/"; + + configuration_.setProperty("baseDir", baseDir); + configuration_.setProperty("webbaseDir", webBaseDir); + + configuration_.setProperty("PKCS12file", (baseDir + "/resources/test-ee2003_normal(buergerkarte).p12")); + configuration_.setProperty("PKCS12password", "buergerkarte"); + + configuration_.setProperty("ECDSPKCS12file", baseDir + "/resources/ecc(ego).p12"); + configuration_.setProperty("ECDSPKCS12password", "ego"); + + configuration_.setProperty("IXSILInitPropertiesURI", "file:/" + baseDir + "resources/init.properties"); + + configuration_.setProperty("CERT", baseDir + "resources/test-ee2003_normal_extract.cer"); + + // Initialize IXSIL + IXSILInit.init(new URI(configuration_.getProperty("IXSILInitPropertiesURI"))); + + // Switch on debug information + IXSILInit.setPrintDebugLog(true); + + // Add IAIK JCE provider + IAIK.addAsProvider(); + } + + public String X509name = null; + public BigInteger X509number = null; + public String X509hash = null; + public String X509sub = null; + public iaik.x509.X509Certificate user1_sign = null; + + public void getX509Content() throws Exception + { + BufferedInputStream bis = new BufferedInputStream(new FileInputStream(configuration_.getProperty("CERT"))); + iaik.x509.X509Certificate cert = new iaik.x509.X509Certificate(bis); + X509name = ((Name)(cert.getIssuerDN())).getRFC2253String(); + X509number = cert.getSerialNumber(); + X509hash = new String(cert.getFingerprintSHA()); + X509sub = ((Name)(cert.getSubjectDN())).getRFC2253String(); + } + + /* ==================================================================================================== */ + + public void serialize2File(Document signature, String fileName) throws Exception + { + FileOutputStream signatureFIS = new FileOutputStream(fileName); + DOMUtilsImpl.serializeDocument(signature, signatureFIS); + } + + /* ==================================================================================================== */ + + public static HashMap pkcs12cache = new HashMap(); + + public PKCS12 decryptPKCS12( String pkcs12file, String password ) throws Exception + { + if(pkcs12cache.containsKey(pkcs12file)) return (PKCS12) pkcs12cache.get(pkcs12file); + PKCS12 pkcs12 = new PKCS12(new FileInputStream(pkcs12file)); + +// if (!pkcs12.verify(password.toCharArray())) { +// System.out.println("could not verify pkcs12 " + pkcs12.toString() + " with password " + password); +// } else { +// System.out.println("verified pkcs12 " + pkcs12.toString() + " with password " + password); +// } + + pkcs12.decrypt(password.toCharArray()); + System.out.println("decrypted pkcs12 " + pkcs12.toString() + " with password " + password); + pkcs12cache.put(pkcs12file,pkcs12); + return pkcs12; + } + + /* ==================================================================================================== */ + + public static HashMap privkeycache = new HashMap(); + + public RSAPrivateKey getPrivateKey( PKCS12 pkcs12 ) throws Exception + { + if(privkeycache.containsKey(pkcs12)) return (RSAPrivateKey)privkeycache.get(pkcs12); + KeyBag[] keyBags = pkcs12.getKeyBags(); + System.out.println("PKCS12.getKeyBags(): " + keyBags.length + " KeyBags found"); + privkeycache.put(pkcs12,keyBags[0].getPrivateKey()); + return (RSAPrivateKey) keyBags[0].getPrivateKey(); + } + + public static HashMap ecdsaprivkeycache = new HashMap(); + + public ECDSAPrivateKey getPrivateKeyECDS( PKCS12 pkcs12 ) throws Exception + { + if(ecdsaprivkeycache.containsKey(pkcs12)) return (ECDSAPrivateKey)ecdsaprivkeycache.get(pkcs12); + KeyBag[] keyBags = pkcs12.getKeyBags(); + System.out.println("PKCS12.getKeyBags(): " + keyBags.length + " KeyBags found"); + ecdsaprivkeycache.put(pkcs12,keyBags[0].getPrivateKey()); + return (ECDSAPrivateKey) keyBags[0].getPrivateKey(); + } + + /* ==================================================================================================== */ + + public static HashMap x509cache = new HashMap(); + + public X509Certificate[] getCertificates( PKCS12 pkcs12 ) throws Exception + { + if(x509cache.containsKey(pkcs12)) return (X509Certificate[])x509cache.get(pkcs12); + X509Certificate[] ret = CertificateBag.getCertificates(pkcs12.getCertificateBags()); + x509cache.put(pkcs12,ret); + return ret; + } + + /* ==================================================================================================== */ + /* ==================Created and or changed Methods by Stefan Knirsch================================== */ + /* ==================================================================================================== */ + + public String vxReqFile(String testNumber) + { + return configuration_.getProperty("baseDir") + + "/data/VX0/"+ + configuration_.getProperty("TestClass") + + "." + + testNumber + + ".Req.xml"; + } + + public String vxResFile(String testNumber) + { + return configuration_.getProperty("baseDir") + + "/data/VX0/"+ + configuration_.getProperty("TestClass") + + "." + + testNumber + + ".Res.xml"; + } + + public String vxReqFileL(String testNumber,String filename) + { + return configuration_.getProperty("baseDir") + + "/data/LVX"+filename+"/"+ + configuration_.getProperty("TestClass") + + "." + + testNumber + + ".Req.xml"; + } + + public String vxResFileL(String testNumber,String filename) + { + return configuration_.getProperty("baseDir") + + "/data/LVX"+filename+"/"+ + configuration_.getProperty("TestClass") + + "." + + testNumber + + ".Res.xml"; + } + + public void createVXConfig() throws Exception { + + String file = + configuration_.getProperty("baseDir") + + "resources/" + + configuration_.getProperty("TestClass") + + ".Config.xml"; + String config = + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+ + "<MOAConfiguration xmlns=\"http://reference.e-government.gv.at/namespace/moaconfig/20021122#\">" + + "<TrustProfile id=\"TrustProfile1\" uri=\"file://SERVER_WORKING_DIRECTORY/TrustProfile1\"/>" + + "<SupplementProfile id=\"SupplementProfile1\" uri=\"file://SERVER_WORKING_DIRECTORY/SupplementProfile1\"/>" + + "<SupplementProfile id=\"SupplementProfile2\" uri=\"file://SERVER_WORKING_DIRECTORY/SupplementProfile2\"/>" + + "</MOAConfiguration>"; + + FileOutputStream fos = new FileOutputStream(file); + fos.write(config.getBytes()); + } + + /** + * Method replaceString. + * @param input: String to be changed + * @param oldPart: subString in input to be changed + * @param newPart: new subString instead of the oldPart + * @return String + * @throws Exception + */ + public static String replaceString( + String input, + String oldPart, + String newPart) + throws Exception { + String erg = null; + + //First Part + erg = input.substring(0, input.indexOf(oldPart)); + //Insert new Part + erg += newPart; + + //insert REST + erg + += input.substring( + input.indexOf(oldPart) + oldPart.length(), + input.length()); + + return erg; + } + + public static String replaceStringAll( + String input, + String oldPart, + String newPart) + throws Exception { + + String erg = input; + + while(true) + { + + //First Part + int pos = input.indexOf(oldPart); + if(pos==-1) break; + erg = input.substring(0, pos); + + //Insert new Part + erg += newPart; + + //insert REST + erg + += input.substring( + input.indexOf(oldPart) + oldPart.length(), + input.length()); + + input = erg; + } + return erg; + } + + /** + * Method readFile. + * @param filename + * @return String + * @throws Exception + */ + + public String readFile(String filename) throws Exception { + + /*StringBuffer data = new StringBuffer(); + String line = null; + BufferedReader br = new BufferedReader(new FileReader(filename)); + while ((line = br.readLine()) != null) { + data.append(line); + data.append("\n"); + } + */ + RandomAccessFile raf = new RandomAccessFile(filename, "r"); + if (raf.length() > Integer.MAX_VALUE) + throw new IOException("file too big to fit in byte array."); + + byte[] result = new byte[(int) raf.length()]; + + raf.read(result); + + return new String(result); + + } + /** + * Method readBinaryFileAsBase64. + * @param filename + * @return Stringrepresentation as Base64 of the inputfile and saves that file + * @throws Exception + */ + public String readBinaryFileAsBase64_new(String filename) throws Exception { + + RandomAccessFile raf = new RandomAccessFile(filename, "r"); + if (raf.length() > Integer.MAX_VALUE) + throw new IOException("file too big to fit in byte array."); + byte[] result = new byte[(int) raf.length()]; + //READ the original binary Data + raf.read(result); + + //Convert the data to bas64 and store it in a new file + + ByteArrayOutputStream fos = new ByteArrayOutputStream(); + Base64OutputStream base64os = new Base64OutputStream(fos); + base64os.write(result); + base64os.flush(); + + return fos.toString(); + + } + public String readBinaryFileAsBase64(String filename) throws Exception { + + RandomAccessFile raf = new RandomAccessFile(filename, "r"); + if (raf.length() > Integer.MAX_VALUE) + throw new IOException("file too big to fit in byte array."); + byte[] result = new byte[(int) raf.length()]; + //READ the original binary Data + raf.read(result); + + //Convert the data to bas64 and store it in a new file + FileOutputStream fos = new FileOutputStream(filename + "base64.enc"); + Base64OutputStream base64os = new Base64OutputStream(fos); + base64os.write(result); + base64os.flush(); + base64os.close(); + + //read the converted data und return it + raf = new RandomAccessFile(filename + "base64.enc", "r"); + if (raf.length() > Integer.MAX_VALUE) + throw new IOException("Converted base64 file too big to fit in byte array."); + result = new byte[(int) raf.length()]; + //READ the original binary Data + raf.read(result); + + return new String(result); + + } + + /** + * Method writeFile. + * @param filename + * @param data + * @throws Exception + */ + public void writeFile(String filename, String data) throws Exception { + BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); + bw.write(data); + bw.close(); + } + + /** + * Method writeFileBinary + * @param filename + * @param data + * @throws Exception + */ + public void writeFileBinary(String filename, byte[] data) throws Exception { + BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream(filename)); + bw.write(data); + bw.close(); + } + /** + * Method getDate. + * @param changeHours to change the time into the past or future + * @return String + */ + + public String getDate(long changeHours) { + + //Use the XML-Format for the Time + SimpleDateFormat formatter = + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'+01:00"); + //get the current Time + Date currentTime = new Date(); + //add or substract a few hours + currentTime.setTime( + (currentTime.getTime() + changeHours * 1000 * 60 * 60)); + + return formatter.format(currentTime); + } + + public ASN1Object createSignedCMSData(byte[] message, int mode,boolean two_users) throws Exception { + + System.out.println("Create a new message signed by user 1:"); + + // create a new SignedData object which includes the data + SignedData signed_data = new SignedData(message, mode); + // SignedData shall include the certificate chain for verifying + + PKCS12 pkcs12 = decryptPKCS12( + configuration_.getProperty("PKCS12file"), + configuration_.getProperty("PKCS12password")); + + BufferedInputStream bis = new BufferedInputStream(new FileInputStream(configuration_.getProperty("CERT"))); + iaik.x509.X509Certificate cert = new iaik.x509.X509Certificate(bis); + user1_sign = cert; + X509name = ((Name)(cert.getIssuerDN())).getRFC2253String(); + X509number = cert.getSerialNumber(); + X509hash = new String(cert.getFingerprintSHA()); + X509sub = ((Name)cert.getSubjectDN()).getRFC2253String(); + + iaik.x509.X509Certificate[] certarray = new iaik.x509.X509Certificate[1]; + certarray[0] = cert; + + signed_data.setCertificates(certarray); + + + RSAPrivateKey privateKey = getPrivateKey( pkcs12 ); + + // cert at index 0 is the user certificate + IssuerAndSerialNumber issuer = new IssuerAndSerialNumber((Name)cert.getIssuerDN(),X509number); + + // create a new SignerInfo + SignerInfo signer_info = new SignerInfo(issuer, AlgorithmID.sha1, privateKey); + // create some authenticated attributes + // the message digest attribute is automatically added + Attribute[] attributes = new Attribute[2]; + // content type is data + attributes[0] = new Attribute(ObjectID.contentType, new ASN1Object[] {ObjectID.cms_data}); + // signing time is now + attributes[1] = new Attribute(ObjectID.signingTime, new ASN1Object[] {new ChoiceOfTime().toASN1Object()}); + // set the attributes + signer_info.setSignedAttributes(attributes); + // finish the creation of SignerInfo by calling method addSigner + try { + signed_data.addSignerInfo(signer_info); + + if(two_users) + { + // another SignerInfo without authenticated attributes and MD5 as hash algorithm + signer_info = new SignerInfo(new IssuerAndSerialNumber((Name)cert.getIssuerDN(),X509number), + AlgorithmID.md5, privateKey); + // the message digest itself is protected + signed_data.addSignerInfo(signer_info); + } + + } catch (NoSuchAlgorithmException ex) { + ex.printStackTrace(); + throw new CMSException("No implementation for signature algorithm: "+ex.getMessage()); + } + + ContentInfo ci = new ContentInfo(signed_data); + return ci.toASN1Object(); + } + + public ASN1Object createSignedCMSData(byte[] message, int mode,boolean two_users,String pkcs12file,String pkcs12password,String certname) throws Exception { + + System.out.println("Create a new message signed by user 1:"); + + // create a new SignedData object which includes the data + SignedData signed_data = new SignedData(message, mode); + // SignedData shall include the certificate chain for verifying + + PKCS12 pkcs12 = decryptPKCS12( + configuration_.getProperty(pkcs12file), + configuration_.getProperty(pkcs12password)); + + BufferedInputStream bis = new BufferedInputStream(new FileInputStream(configuration_.getProperty(certname))); + iaik.x509.X509Certificate cert = new iaik.x509.X509Certificate(bis); + X509name = ((Name)(cert.getIssuerDN())).getRFC2253String(); + X509number = cert.getSerialNumber(); + X509hash = new String(cert.getFingerprintSHA()); + X509sub = ((Name)cert.getSubjectDN()).getRFC2253String(); + + iaik.x509.X509Certificate[] certarray = new iaik.x509.X509Certificate[1]; + certarray[0] = cert; + + signed_data.setCertificates(certarray); + + + RSAPrivateKey privateKey = getPrivateKey( pkcs12 ); + + // cert at index 0 is the user certificate + IssuerAndSerialNumber issuer = new IssuerAndSerialNumber((Name)cert.getIssuerDN(),X509number); + + // create a new SignerInfo + SignerInfo signer_info = new SignerInfo(issuer, AlgorithmID.sha1, privateKey); + // create some authenticated attributes + // the message digest attribute is automatically added + Attribute[] attributes = new Attribute[2]; + // content type is data + attributes[0] = new Attribute(ObjectID.contentType, new ASN1Object[] {ObjectID.cms_data}); + // signing time is now + attributes[1] = new Attribute(ObjectID.signingTime, new ASN1Object[] {new ChoiceOfTime().toASN1Object()}); + // set the attributes + signer_info.setSignedAttributes(attributes); + // finish the creation of SignerInfo by calling method addSigner + try { + signed_data.addSignerInfo(signer_info); + + if(two_users) + { + // another SignerInfo without authenticated attributes and MD5 as hash algorithm + signer_info = new SignerInfo(new IssuerAndSerialNumber((Name)cert.getIssuerDN(),X509number), + AlgorithmID.md5, privateKey); + // the message digest itself is protected + signed_data.addSignerInfo(signer_info); + } + + } catch (NoSuchAlgorithmException ex) { + throw new CMSException("No implementation for signature algorithm: "+ex.getMessage()); + } + + ContentInfo ci = new ContentInfo(signed_data); + return ci.toASN1Object(); + } + +public String cutXML(String input) + { + int pos = input.indexOf(">"); + if(pos!=-1) + return input.substring(pos+1); + else + return input; + } + + +} |