package de.bablokb.crypto; import java.io.*; import java.security.*; import sun.misc.*; import org.gnu.readline.*; public class SignAndVerify { private static final int BUF_SIZE = 8192; private String iAlgo = "DSA"; private String iFile = null; private boolean iSign; private Signature iSig = null; private void updateSignature() throws Exception { FileInputStream stream = new FileInputStream(iFile); byte[] sbuf = new byte[BUF_SIZE]; int length; while ((length=stream.read(sbuf)) != -1) iSig.update(sbuf,0,length); stream.close(); } private void getSignature() throws Exception { iSig = Signature.getInstance(iAlgo); KeyStore ks = KeyStore.getInstance("JKS"); String ksName = Readline.readline("Keystore file: "); String ksPass = Readline.readline("Keystore passphrase: "); ks.load(new FileInputStream(ksName.trim()),ksPass.toCharArray()); if (iSign) { String alias = Readline.readline("Key alias: "); String keyPass = Readline.readline("Key passphrase: "); iSig.initSign((PrivateKey) ks.getKey(alias,keyPass.toCharArray())); } else { String alias = Readline.readline("Certificate alias: "); iSig.initVerify(ks.getCertificate(alias).getPublicKey()); } } private void printSignature() throws Exception { BASE64Encoder enc = new BASE64Encoder(); String out = enc.encode(iSig.sign()); System.err.println("Signature ("+iAlgo+"):"); System.out.println(out); FileOutputStream stream = new FileOutputStream(iFile+"."+iAlgo); PrintWriter writer = new PrintWriter(stream); writer.print(out); writer.flush(); stream.close(); } private boolean checkSignature() throws Exception { String filename = Readline.readline("Signature file: "); FileInputStream stream = new FileInputStream(filename.trim()); byte[] data64 = new byte[stream.available()]; BufferedInputStream bis = new BufferedInputStream(stream); bis.read(data64,0,data64.length); stream.close(); BASE64Decoder decoder = new BASE64Decoder(); byte[] data = decoder.decodeBuffer(new String(data64)); return iSig.verify(data); } }