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

import sun.security.util.HexDumpEncoder;

public class SigTest {

    private static void testCase(int keySize) {
        testCase(null, keySize);
    }

    private static void testCase(String provider, int keySize) {
        System.out.printf("===== Provider: %s, keySize: %d =====%n",
                provider == null ? "Default" : provider, keySize);

        byte[] msg = new byte[100];

        try {
            KeyPairGenerator g = provider == null
                    ? KeyPairGenerator.getInstance("EC")
                    : KeyPairGenerator.getInstance("EC", provider);
            System.out.println("Provider: " + g.getProvider());
            g.initialize(keySize);
            KeyPair p = g.generateKeyPair();
            System.out.println("Private Key:");
            System.out.println(
                    new HexDumpEncoder().encodeBuffer(p.getPrivate().getEncoded()));
            System.out.println("Public Key:");
            System.out.println(
                    new HexDumpEncoder().encodeBuffer(p.getPublic().getEncoded()));

            Signature s = provider == null
                    ? Signature.getInstance("SHA512withECDSA")
                    : Signature.getInstance("SHA512withECDSA", provider);
            s.initSign(p.getPrivate());
            s.update(msg);
            byte[] sig = s.sign();
            System.out.println("Signature:");
            System.out.println(new HexDumpEncoder().encodeBuffer(sig));

            s = provider == null
                    ? Signature.getInstance("SHA512withECDSA")
                    : Signature.getInstance("SHA512withECDSA", provider);
            s.initVerify(p.getPublic());
            s.update(msg);
            System.out.println("Verified: " + s.verify(sig));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        testCase(112);
        testCase(256);
        testCase(384);
        testCase(512);
        testCase(571);

        testCase("SunEC", 112);
        testCase("SunEC", 256);
        testCase("SunEC", 384);
        testCase("SunEC", 512);
        testCase("SunEC", 571);
    }
}