package org.jisonami.crypto;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.Test;

import java.security.Key;
import java.security.Security;
import java.util.Map;

/**
 * Created by jisonami on 16-10-15.
 */
public class SignatureOperationTest {

    private static final String data = "明文数据test中文";

    @Test
    public void testMD5_WIEH_RSA(){
        NonSymmetricCryptography nonSymmetricCryptography = new NonSymmetricCryptography();
        Map<String,Key> keyMap = nonSymmetricCryptography.initKey();
        String privateKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPrivateKey(keyMap));
        String publicKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPublicKey(keyMap));
        System.out.println("RSA私钥:" + privateKey);
        System.out.println("RSA公钥:" + publicKey);
        SignatureOperation signatureOperation = new SignatureOperation();
        String sign = signatureOperation.sign(data, nonSymmetricCryptography.toPrivateKey(nonSymmetricCryptography.decodeKey(privateKey)));
        System.out.println("签名值:" + sign);
        System.out.println("验证签名:" + signatureOperation.verify(data, nonSymmetricCryptography.toPublicKey(nonSymmetricCryptography.decodeKey(publicKey)), sign));
    }

    @Test
    public void testSHA1_WIEH_RSA(){
        NonSymmetricCryptography nonSymmetricCryptography = new NonSymmetricCryptography();
        Map<String,Key> keyMap = nonSymmetricCryptography.initKey();
        String privateKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPrivateKey(keyMap));
        String publicKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPublicKey(keyMap));
        System.out.println("RSA私钥:" + privateKey);
        System.out.println("RSA公钥:" + publicKey);
        Configuration configuration = new Configuration();
        configuration.setSignatureAlgorithm(Algorithms.SHA1_WIEH_RSA);
        SignatureOperation signatureOperation = new SignatureOperation(configuration);
        String sign = signatureOperation.sign(data, nonSymmetricCryptography.toPrivateKey(nonSymmetricCryptography.decodeKey(privateKey)));
        System.out.println("签名值:" + sign);
        System.out.println("验证签名:" + signatureOperation.verify(data, nonSymmetricCryptography.toPublicKey(nonSymmetricCryptography.decodeKey(publicKey)), sign));
    }

    @Test
    public void testNONE_WIEH_RSA(){
        NonSymmetricCryptography nonSymmetricCryptography = new NonSymmetricCryptography();
        Map<String,Key> keyMap = nonSymmetricCryptography.initKey();
        String privateKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPrivateKey(keyMap));
        String publicKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPublicKey(keyMap));
        System.out.println("RSA私钥:" + privateKey);
        System.out.println("RSA公钥:" + publicKey);
        Configuration configuration = new Configuration();
        configuration.setSignatureAlgorithm(Algorithms.NONE_WIEH_RSA);
        SignatureOperation signatureOperation = new SignatureOperation(configuration);
        String sign = signatureOperation.sign(data, nonSymmetricCryptography.toPrivateKey(nonSymmetricCryptography.decodeKey(privateKey)));
        System.out.println("签名值:" + sign);
        System.out.println("验证签名:" + signatureOperation.verify(data, nonSymmetricCryptography.toPublicKey(nonSymmetricCryptography.decodeKey(publicKey)), sign));
    }

    @Test
    public void testSHA1_WIEH_DSA(){
        Configuration configuration = new Configuration();
        configuration.setKeyAlgorithm(Algorithms.DSA).setKeySize(1024);
        NonSymmetricCryptography nonSymmetricCryptography = new NonSymmetricCryptography(configuration);
        Map<String,Key> keyMap = nonSymmetricCryptography.initKey();
        String privateKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPrivateKey(keyMap));
        String publicKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPublicKey(keyMap));
        System.out.println("DSA私钥:" + privateKey);
        System.out.println("DSA公钥:" + publicKey);
        configuration.setSignatureAlgorithm(Algorithms.SHA1_WIEH_DSA);
        SignatureOperation signatureOperation = new SignatureOperation(configuration);
        String sign = signatureOperation.sign(data, nonSymmetricCryptography.toPrivateKey(nonSymmetricCryptography.decodeKey(privateKey)));
        System.out.println("签名值:" + sign);
        System.out.println("验证签名:" + signatureOperation.verify(data, nonSymmetricCryptography.toPublicKey(nonSymmetricCryptography.decodeKey(publicKey)), sign));
    }

    @Test
    public void testSHA256_WIEH_DSA(){
        Configuration configuration = new Configuration();
        configuration.setKeyAlgorithm(Algorithms.DSA).setKeySize(1024);
        NonSymmetricCryptography nonSymmetricCryptography = new NonSymmetricCryptography(configuration);
        Map<String,Key> keyMap = nonSymmetricCryptography.initKey();
        String privateKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPrivateKey(keyMap));
        String publicKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPublicKey(keyMap));
        System.out.println("DSA私钥:" + privateKey);
        System.out.println("DSA公钥:" + publicKey);
        configuration.setSignatureAlgorithm(Algorithms.SHA256_WIEH_DSA);
        SignatureOperation signatureOperation = new SignatureOperation(configuration);
        String sign = signatureOperation.sign(data, nonSymmetricCryptography.toPrivateKey(nonSymmetricCryptography.decodeKey(privateKey)));
        System.out.println("签名值:" + sign);
        System.out.println("验证签名:" + signatureOperation.verify(data, nonSymmetricCryptography.toPublicKey(nonSymmetricCryptography.decodeKey(publicKey)), sign));
    }

    @Test
    public void testSHA1_WIEH_ECDSAByBouncyCastle(){
        BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
        Security.addProvider(bouncyCastleProvider);
        Configuration configuration = new Configuration();
        configuration.setKeyAlgorithm(Algorithms.ECDSA).setKeySize(256);
        NonSymmetricCryptography nonSymmetricCryptography = new NonSymmetricCryptography(configuration);
        Map<String,Key> keyMap = nonSymmetricCryptography.initKey();
        String privateKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPrivateKey(keyMap));
        String publicKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPublicKey(keyMap));
        System.out.println("ECDSA私钥:" + privateKey);
        System.out.println("ECDSA公钥:" + publicKey);
        configuration.setSignatureAlgorithm(Algorithms.SHA1_WIEH_ECDSA);
        SignatureOperation signatureOperation = new SignatureOperation(configuration);
        String sign = signatureOperation.sign(data, nonSymmetricCryptography.toPrivateKey(nonSymmetricCryptography.decodeKey(privateKey)));
        System.out.println("签名值:" + sign);
        System.out.println("验证签名:" + signatureOperation.verify(data, nonSymmetricCryptography.toPublicKey(nonSymmetricCryptography.decodeKey(publicKey)), sign));
    }

    @Test
    public void testSHA256_WIEH_ECDSAByBouncyCastle(){
        BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
        Security.addProvider(bouncyCastleProvider);
        Configuration configuration = new Configuration();
        configuration.setKeyAlgorithm(Algorithms.ECDSA).setKeySize(256);
        NonSymmetricCryptography nonSymmetricCryptography = new NonSymmetricCryptography(configuration);
        Map<String,Key> keyMap = nonSymmetricCryptography.initKey();
        String privateKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPrivateKey(keyMap));
        String publicKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPublicKey(keyMap));
        System.out.println("ECDSA私钥:" + privateKey);
        System.out.println("ECDSA公钥:" + publicKey);
        configuration.setSignatureAlgorithm(Algorithms.SHA256_WIEH_ECDSA);
        SignatureOperation signatureOperation = new SignatureOperation(configuration);
        String sign = signatureOperation.sign(data, nonSymmetricCryptography.toPrivateKey(nonSymmetricCryptography.decodeKey(privateKey)));
        System.out.println("签名值:" + sign);
        System.out.println("验证签名:" + signatureOperation.verify(data, nonSymmetricCryptography.toPublicKey(nonSymmetricCryptography.decodeKey(publicKey)), sign));
    }


    @Test
    public void testSHA1_WIEH_DSAByBouncyCastle(){
        BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
        Security.addProvider(bouncyCastleProvider);
        Configuration configuration = new Configuration();
        configuration.setKeyAlgorithm(Algorithms.DSA).setKeySize(1024);
        NonSymmetricCryptography nonSymmetricCryptography = new NonSymmetricCryptography(configuration);
        Map<String,Key> keyMap = nonSymmetricCryptography.initKey();
        String privateKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPrivateKey(keyMap));
        String publicKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPublicKey(keyMap));
        System.out.println("DSA私钥:" + privateKey);
        System.out.println("DSA公钥:" + publicKey);
        configuration.setSignatureAlgorithm(Algorithms.SHA1_WIEH_DSA);
        SignatureOperation signatureOperation = new SignatureOperation(configuration);
        String sign = signatureOperation.sign(data, nonSymmetricCryptography.toPrivateKey(nonSymmetricCryptography.decodeKey(privateKey)));
        System.out.println("签名值:" + sign);
        System.out.println("验证签名:" + signatureOperation.verify(data, nonSymmetricCryptography.toPublicKey(nonSymmetricCryptography.decodeKey(publicKey)), sign));
    }

}