package com.localz.pinch.utils;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.HashMap;

import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;

public class KeyPinStoreUtil {
    public static String serverpem = "-----BEGIN CERTIFICATE-----\n"+
"MIIFVjCCBD6gAwIBAgISA7bqR4q0XlSZvlxRDEgo6cdUMA0GCSqGSIb3DQEBCwUA\n"+
"MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD\n"+
"ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xOTAyMTkwNzA0NTVaFw0x\n"+
"OTA1MjAwNzA0NTVaMBoxGDAWBgNVBAMTD2FwaTIuYmx1ZWF2ZS5jbjCCASIwDQYJ\n"+
"KoZIhvcNAQEBBQADggEPADCCAQoCggEBALOnPQF7AJKrhm/8e2XHa3YYRJCxwFFt\n"+
"W3/BIoOM2Tmp5anff92Oj5qsn43F3LYvgNfkOyz2waYfxKeV4xD92hVgnyWOsEz1\n"+
"PCcy5DCxgZtuoMlkg/sUwTr1hhm6rdIY4ajBLUJIAnmSQpXDuGUPGlDBGAeDgsTP\n"+
"Z957egcqC99UktzKOglf+JtjseusM317HBZ2zEFwmEnmgbG7EaZF4pqwV2vIWk0c\n"+
"Ro6SqvTn7pQmUJX1tZjG9HIftfs+6/iNOcolpv+qIg8RO9/rIX/ChtA37mPyDaBE\n"+
"c44ubc9m0LfmG2QdPQRM9vYNUoiI6qUqA4PcmpsFX3vqddOZdRN6NKsCAwEAAaOC\n"+
"AmQwggJgMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB\n"+
"BQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUXgbY0FtRT6QoIYpholi7errL\n"+
"tdgwHwYDVR0jBBgwFoAUqEpqYwR93brm0Tm3pkVl7/Oo7KEwbwYIKwYBBQUHAQEE\n"+
"YzBhMC4GCCsGAQUFBzABhiJodHRwOi8vb2NzcC5pbnQteDMubGV0c2VuY3J5cHQu\n"+
"b3JnMC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDMubGV0c2VuY3J5cHQu\n"+
"b3JnLzAaBgNVHREEEzARgg9hcGkyLmJsdWVhdmUuY24wTAYDVR0gBEUwQzAIBgZn\n"+
"gQwBAgEwNwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5s\n"+
"ZXRzZW5jcnlwdC5vcmcwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdgDiaUuuJujp\n"+
"QAnohhu2O4PUPuf+dIj7pI8okwGd3fHb/gAAAWkEyVI1AAAEAwBHMEUCIQCojHMV\n"+
"Kg+KmOwi8u7zETvG8F7VwQqJct/24im4rWD5ZAIgdEpUyZX2NUpFDtBesSuQYWkQ\n"+
"VZrq/RtwcvFWLH4iJmIAdgBj8tvN6DvMLM8LcoQnV2szpI1hd4+9daY4scdoVEvY\n"+
"jQAAAWkEyVBCAAAEAwBHMEUCIDXCXxLnzFCXySFbsD6RXpS/wAVmFHQvwPmjmeiD\n"+
"MqUDAiEAqas17vpcprv+s6k+TnePAEour2lXbRkIAvG7ZDZvcw0wDQYJKoZIhvcN\n"+
"AQELBQADggEBAB//hdPiVdirLBuXo2n+SBpo6RONTsmbYUIxgzdDnXV9I20OTiKh\n"+
"kS08FYZ7vVm72+9Q9CPb+PMGPl/Ou+uESz160wwrkgfXIrw/zSJP9stHMKruNFVj\n"+
"WY+5GkOKmUyBY7fY6PmbKJFvcl+5qvo2itwKDKG/a/Q/+bF8z3C/EDj8qWHSnHnP\n"+
"byqI9L+13g/+9Mlajf/NkunNM5tUtJOJstTU0zDK+z5jToPY1M6Az+J1CMuW10SC\n"+
"eyJNgw+0k5cw08/7h1mUGcGI6/QpRunwWj2+I4Beto0oKowWkgO5kyvln1Myh6vM\n"+
"BeUeP6GHQCSjYXcn5vwZ+DS6/D8fHxQWMMQ=\n"+
"-----END CERTIFICATE-----";

    private static HashMap<String, KeyPinStoreUtil> instances = new HashMap<>();
    private SSLContext sslContext = SSLContext.getInstance("TLS");

    public static synchronized KeyPinStoreUtil getInstance(String filenames) throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException, UnrecoverableKeyException {
        if (filenames != null && instances.get(filenames) == null) {
            instances.put(filenames, new KeyPinStoreUtil(filenames));
        }
        return instances.get(filenames);

    }

    private KeyPinStoreUtil(String filenames) throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException, UnrecoverableKeyException {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");

 //        创建客户端KeyStore
        KeyStore clientKeyStore = KeyStore.getInstance("PKCS12");
        InputStream fis = new BufferedInputStream(this.getClass().getClassLoader().getResourceAsStream("assets/client.p12"));
        // FileInputStream fis = new FileInputStream("assets/client.p12");
        clientKeyStore.load(fis, "ldcx2018".toCharArray());

 //        使用客户端KeyStore构建SSLContext
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
        kmf.init(clientKeyStore,"ldcx2018".toCharArray());
        KeyManager[] clientKeyManagers = kmf.getKeyManagers();

         // Create a KeyStore for our trusted CAs
        String keyStoreType = KeyStore.getDefaultType();  //默认是jks
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);

       // for (String filename : filenames) {
            InputStream caInput = new BufferedInputStream(this.getClass().getClassLoader().getResourceAsStream("assets/" + filenames + ".pem"));
            // FileInputStream caInput = new FileInputStream("assets/" + filename + ".pem");
            Certificate ca;
            try {
                 ca = cf.generateCertificate(caInput);
                System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
            } finally {
                caInput.close();
            }

            keyStore.setCertificateEntry(filenames, ca);
       // }

        // Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

//        sslContext.init(null, tmf.getTrustManagers(), null);
//        sslContext.init(clientKeyManagers, null, null);
         sslContext.init(clientKeyManagers, tmf.getTrustManagers(), null);
//               sslContext.init(null, null, null);
    }

    public SSLContext getContext() {
        return sslContext;
    }
}
