package org.bouncycastle.jce.provider.test;

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

import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec;
import org.bouncycastle.jce.spec.GOST3410ParameterSpec;
import org.bouncycastle.util.encoders.Hex;
import org.bouncycastle.util.test.SimpleTest;

public class SignatureTest
    extends SimpleTest
{
    private static final byte[] DATA = Hex.decode("00000000deadbeefbeefdeadffffffff00000000");

    private void checkSig(KeyPair kp, String name)
        throws Exception
    {
        Signature sig = Signature.getInstance(name, "BC");

        sig.initSign(kp.getPrivate());
        sig.update(DATA);

        byte[] signature1 = sig.sign();

        sig.update(DATA);

        byte[] signature2 = sig.sign();

        sig.initVerify(kp.getPublic());

        sig.update(DATA);
        if (!sig.verify(signature1))
        {
            fail("did not verify: " + name);
        }

        // After verify, should be reusable as if we are after initVerify
        sig.update(DATA);
        if (!sig.verify(signature1))
        {
            fail("second verify failed: " + name);
        }

        sig.update(DATA);
        if (!sig.verify(signature2))
        {
            fail("second verify failed (2): " + name);
        }
    }

    public void performTest()
        throws Exception
    {
        KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC");

        kpGen.initialize(2048);

        KeyPair kp = kpGen.generateKeyPair();

        checkSig(kp, "SHA1withRSA");
        checkSig(kp, "SHA224withRSA");
        checkSig(kp, "SHA256withRSA");
        checkSig(kp, "SHA384withRSA");
        checkSig(kp, "SHA512withRSA");

        checkSig(kp, "SHA3-224withRSA");
        checkSig(kp, "SHA3-256withRSA");
        checkSig(kp, "SHA3-384withRSA");
        checkSig(kp, "SHA3-512withRSA");

        checkSig(kp, "MD2withRSA");
        checkSig(kp, "MD4withRSA");
        checkSig(kp, "MD5withRSA");
        checkSig(kp, "RIPEMD160withRSA");
        checkSig(kp, "RIPEMD128withRSA");
        checkSig(kp, "RIPEMD256withRSA");

        checkSig(kp, "SHA1withRSAandMGF1");
        checkSig(kp, "SHA1withRSAandMGF1");
        checkSig(kp, "SHA224withRSAandMGF1");
        checkSig(kp, "SHA256withRSAandMGF1");
        checkSig(kp, "SHA384withRSAandMGF1");
        checkSig(kp, "SHA512withRSAandMGF1");

        checkSig(kp, "SHA1withRSA/ISO9796-2");
        checkSig(kp, "MD5withRSA/ISO9796-2");
        checkSig(kp, "RIPEMD160withRSA/ISO9796-2");

//        checkSig(kp, "SHA1withRSA/ISO9796-2PSS");
//        checkSig(kp, "MD5withRSA/ISO9796-2PSS");
//        checkSig(kp, "RIPEMD160withRSA/ISO9796-2PSS");

        checkSig(kp, "RIPEMD128withRSA/X9.31");
        checkSig(kp, "RIPEMD160withRSA/X9.31");
        checkSig(kp, "SHA1withRSA/X9.31");
        checkSig(kp, "SHA224withRSA/X9.31");
        checkSig(kp, "SHA256withRSA/X9.31");
        checkSig(kp, "SHA384withRSA/X9.31");
        checkSig(kp, "SHA512withRSA/X9.31");
        checkSig(kp, "WhirlpoolwithRSA/X9.31");

        kpGen = KeyPairGenerator.getInstance("DSA", "BC");

        kpGen.initialize(2048);

        kp = kpGen.generateKeyPair();

        checkSig(kp, "SHA1withDSA");
        checkSig(kp, "SHA224withDSA");
        checkSig(kp, "SHA256withDSA");
        checkSig(kp, "SHA384withDSA");
        checkSig(kp, "SHA512withDSA");
        checkSig(kp, "NONEwithDSA");

        kpGen = KeyPairGenerator.getInstance("EC", "BC");

        kpGen.initialize(256);

        kp = kpGen.generateKeyPair();

        checkSig(kp, "SHA1withECDSA");
        checkSig(kp, "SHA224withECDSA");
        checkSig(kp, "SHA256withECDSA");
        checkSig(kp, "SHA384withECDSA");
        checkSig(kp, "SHA512withECDSA");
        checkSig(kp, "RIPEMD160withECDSA");

        kpGen = KeyPairGenerator.getInstance("EC", "BC");

        kpGen.initialize(521);

        kp = kpGen.generateKeyPair();

        checkSig(kp, "SHA1withECNR");
        checkSig(kp, "SHA224withECNR");
        checkSig(kp, "SHA256withECNR");
        checkSig(kp, "SHA384withECNR");
        checkSig(kp, "SHA512withECNR");

        kpGen = KeyPairGenerator.getInstance("ECGOST3410", "BC");

        kpGen.initialize(new ECNamedCurveGenParameterSpec("GostR3410-2001-CryptoPro-A"), new SecureRandom());

        kp = kpGen.generateKeyPair();

        checkSig(kp, "GOST3411withECGOST3410");

        kpGen = KeyPairGenerator.getInstance("GOST3410", "BC");

        GOST3410ParameterSpec gost3410P = new GOST3410ParameterSpec(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_A.getId());

        kpGen.initialize(gost3410P);
        
        kp = kpGen.generateKeyPair();

        checkSig(kp, "GOST3411withGOST3410");
    }

    public String getName()
    {
        return "SigNameTest";
    }

    public static void main(
        String[] args)
    {
        Security.addProvider(new BouncyCastleProvider());

        runTest(new SignatureTest());
    }
}