import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Signature;

public class SignatureTest {

    public static void main(String[] args) throws Exception {
        runCase("RSA", 1024, "SHA1withRSA");
        runCase("RSA", 1024, "SHA256withRSA");
        runCase("RSA", 1024, "SHA384withRSA");
        runCase("RSA", 1024, "SHA512withRSA");
        runCase("EC", 384, "SHA256withECDSA");
        runCase("EC", 384, "SHA384withECDSA");
        runCase("EC", 384, "SHA512withECDSA");
        runCase("EC", 571, "SHA256withECDSA");
        runCase("EC", 571, "SHA384withECDSA");
        runCase("EC", 571, "SHA512withECDSA");
    }

    private static void runCase(String keyAlgo, int keySize, String signAlgo) {
        System.out.println("========== Case start ==========");
        System.out.printf("keyAlgo=%s, keySize=%d, signAlgo=%s%n", keyAlgo,
                keySize, signAlgo);
        try {
            signAndVerify(keyAlgo, keySize, signAlgo);
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
        System.out.println("========== Case end ==========");
    }

    private static void signAndVerify(String keyAlgo, int keySize,
            String signAlgo) throws Exception {
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(keyAlgo);
        keyPairGen.initialize(keySize);
        KeyPair keyPair = keyPairGen.genKeyPair();

        Signature signature = Signature.getInstance(signAlgo);
        System.out.println("Provider: " + signature.getProvider());

        signature.initSign(keyPair.getPrivate());
        signature.update(new byte[100]);
        byte[] out = new byte[4096];
        System.out.println("Signing...");
        int length = signature.sign(out, 0, out.length);

        signature.initVerify(keyPair.getPublic());
        System.out.println("Verifying...");
        signature.verify(out, 0, length);
    }
}
