package org.zpcat.test;
import org.zpcat.test.certs.CustomSSLSocketFactory;
import org.zpcat.test.network.HttpClientRequest;
import org.zpcat.test.network.ReqCallback;
import org.zpcat.test.network.UrlConnectionRequst;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.method.ScrollingMovementMethod;
import android.text.style.TextAppearanceSpan;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import javax.net.ssl.SSLSocketFactory;
public class MainActivity extends Activity implements View.OnClickListener {
private final String TAG = "TLSdemo";
private final String mGitlabIboxpayPemCert = "-----BEGIN CERTIFICATE-----\n"
+ "MIID/zCCAuegAwIBAgIJAI87+17ijWe6MA0GCSqGSIb3DQEBBQUAMIGVMQswCQYD\n"
+ "VQQGEwJDTjESMBAGA1UECAwJR3VhbmdEb25nMREwDwYDVQQHDAhTaGVuemhlbjEQ\n"
+ "MA4GA1UECgwHaWJveHBheTEQMA4GA1UECwwHaWJveHBheTEYMBYGA1UEAwwPZ2l0\n"
+ "Lmlib3hwYXkuY29tMSEwHwYJKoZIhvcNAQkBFhJHaXRMYWJAaWJveHBheS5jb20w\n"
+ "HhcNMTQxMTA4MTYwMzQyWhcNMjQwODA3MTYwMzQyWjCBlTELMAkGA1UEBhMCQ04x\n"
+ "EjAQBgNVBAgMCUd1YW5nRG9uZzERMA8GA1UEBwwIU2hlbnpoZW4xEDAOBgNVBAoM\n"
+ "B2lib3hwYXkxEDAOBgNVBAsMB2lib3hwYXkxGDAWBgNVBAMMD2dpdC5pYm94cGF5\n"
+ "LmNvbTEhMB8GCSqGSIb3DQEJARYSR2l0TGFiQGlib3hwYXkuY29tMIIBIjANBgkq\n"
+ "hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFVGEyr4CvNWbr6z8ZrfEMYTVHZwQGHB\n"
+ "PIFmRkxznxmoNE+b1z5zgHTA2rYoJbwlaMg2X77jEt9xPrtaCFtXxoW4zgNcTLjM\n"
+ "S5uSNVwkkvwL3+w3xQaburTK934xR86EOgQs/iZYTyiRhywkzauPaJbNFG2pBwgE\n"
+ "GgDBWwUZhtz2go7H8FEYKFUFRgA0xUXLNXE66yJicFX3jDPO7MHA1+25Si4rksGe\n"
+ "HMUg6/TAp/VW/yKnKaReZjs0EA7S0R3tDAWl8eop/k5RBpCPIDTWcg97pvc3ZYDA\n"
+ "DWPqJehy260S0YpvrvjHqS/qK9XcltKuCRG4f15CUC1VUIlwccfHzQIDAQABo1Aw\n"
+ "TjAdBgNVHQ4EFgQUgo1hZ8wB4M+4AQ8UZh8blZxOESAwHwYDVR0jBBgwFoAUgo1h\n"
+ "Z8wB4M+4AQ8UZh8blZxOESAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOC\n"
+ "AQEAWbKMIpl6hya82YAXYdcGU1coONuja6CwYKcpU/Q2ngQ5J1JEDZFFGM4VGwBb\n"
+ "tBL9o+LsDIBVAGGHSsrUhBlh4Rc7joBJmCfwb9Dkx3YKwUvZbq40QBiayBdVK5BQ\n"
+ "wlNdmdLDAAQMJj3mXRKGivzfTaKfpw5xv3vSWRU7JNQAAZBTUftWstNilRuRYq71\n"
+ "PUTfMo7k6WthGtl36SnQyYj8h8NT9C1fIaqiiEcQBmWxHT5gTO5OkP95jJnvU6aB\n"
+ "SLrk7FfaVbWUU13Iofx0NfoN1gp2jMLHdsLE3nx+5vjV7XCgADVbGL8Bhn7j+G/o\n"
+ "4TyN9ykMa4Nde6nxTT9o8dWw1A==\n"
+ "-----END CERTIFICATE-----";
private String mIboxpayPEMCert = "-----BEGIN CERTIFICATE-----\n" +
"MIIGBTCCBO2gAwIBAgIQbbfmex6qGP/VG1KkUU2xATANBgkqhkiG9w0BAQUFADCB\n" +
"ujELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\n" +
"ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2Ug\n" +
"YXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykwNjE0MDIGA1UEAxMr\n" +
"VmVyaVNpZ24gQ2xhc3MgMyBFeHRlbmRlZCBWYWxpZGF0aW9uIFNTTCBDQTAeFw0x\n" +
"NDA0MjEwMDAwMDBaFw0xNTA2MjAyMzU5NTlaMIIBQjETMBEGCysGAQQBgjc8AgED\n" +
"EwJDTjEaMBgGCysGAQQBgjc8AgECFAlHdWFuZ2RvbmcxGTAXBgsrBgEEAYI3PAIB\n" +
"ARQIU2hlbnpoZW4xHTAbBgNVBA8TFFByaXZhdGUgT3JnYW5pemF0aW9uMRgwFgYD\n" +
"VQQFEw80NDAzMDExMDU1NzczODgxCzAJBgNVBAYTAkNOMRIwEAYDVQQIFAlHdWFu\n" +
"Z0RvbmcxETAPBgNVBAcUCFNoZW5aaGVuMTgwNgYDVQQKFC9TaGVuIFpoZW4gaUJP\n" +
"WFBBWSBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IENvLmx0ZDEzMDEGA1UECxQqVGVy\n" +
"bXMgb2YgdXNlIGF0IHd3dy52ZXJpc2lnbi5jb20vcnBhIChjKTA1MRgwFgYDVQQD\n" +
"FA93d3cuaWJveHBheS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\n" +
"AQCrDaemPC8ylGOqaKtmdP0ntUq3YgEqWwWVdaSo190A9taXIrWA4fYhRZIp92wC\n" +
"9vDn2HQL0pTWqE/2E4EGF1iL+SF/wr8vCEQp/GNaPULJ/s7cfGGh4nhgrH8PKOAL\n" +
"iVZyy45PwaB0etjhDoqLwGzVXMVY8IMxv1pRmiMJYcSylLTTm7qyirPD33R+D1D7\n" +
"SKlRwjfpAVpIBN7NiQHo6MN2rVVTRcMSNDGpW7RGUbD1QtAfC0YpatQM+irBRPZM\n" +
"mHpw1/VSn0bR8GtGtfeSQ64mv2QzpY6zQpYhFUdvKELpZG8mFFeDbtFrrxm823pO\n" +
"4/SHhfS049yoYygV6mMv9yU3AgMBAAGjggF6MIIBdjAaBgNVHREEEzARgg93d3cu\n" +
"aWJveHBheS5jb20wCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCBaAwQgYDVR0fBDsw\n" +
"OTA3oDWgM4YxaHR0cDovL0VWU2VjdXJlLWNybC52ZXJpc2lnbi5jb20vRVZTZWN1\n" +
"cmUyMDA2LmNybDBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBxcGMCowKAYIKwYBBQUH\n" +
"AgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9jcHMwHQYDVR0lBBYwFAYIKwYB\n" +
"BQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFPyKULqeuSVae1WFT5UAY4/pWGtD\n" +
"MHMGCCsGAQUFBwEBBGcwZTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AudmVyaXNp\n" +
"Z24uY29tMD0GCCsGAQUFBzAChjFodHRwOi8vRVZTZWN1cmUtYWlhLnZlcmlzaWdu\n" +
"LmNvbS9FVlNlY3VyZTIwMDYuY2VyMA0GCSqGSIb3DQEBBQUAA4IBAQBf7ka0itD9\n" +
"qHvU2vSa3/Q6TsWAu3xa7VsjPQj+qHXfVQNfb5Ft271Mwr5Vkse+J8c0FIjuQXbH\n" +
"aJ+7hZTcxY7S1F2NyA8ab+HmDlH02HDxxNpaBXiE05fEekVMRUItOFOkOAX1Mpm+\n" +
"YRJXGXapwZcVo2mCjgGcyOXqw+5faMRNcHTLnjPJhIceJrpoQomE2c0B/Eox+QCz\n" +
"o3OHghtdBZd9n7TDyYn6xmi9LS2gicTKX5yKMMnpw+fQQMDP7KjdNRwBoy3aUOWL\n" +
"wqI0Jryq3ph6a4vLgBPoto4ZZYA+woQ+qnrBnJYJbqDjahJySLiWyDTbszQNMVIR\n" +
"rPDw2HHTe8/I\n" +
"-----END CERTIFICATE-----";
private String mVeriSignPemCert = "-----BEGIN CERTIFICATE-----\n"
+ "MIIF5DCCBMygAwIBAgIQW3dZxheE4V7HJ8AylSkoazANBgkqhkiG9w0BAQUFADCB\n"
+ "yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\n"
+ "ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\n"
+ "U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\n"
+ "ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\n"
+ "aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMTYxMTA3MjM1OTU5WjCBujEL\n"
+ "MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\n"
+ "ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQg\n"
+ "aHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykwNjE0MDIGA1UEAxMrVmVy\n"
+ "aVNpZ24gQ2xhc3MgMyBFeHRlbmRlZCBWYWxpZGF0aW9uIFNTTCBDQTCCASIwDQYJ\n"
+ "KoZIhvcNAQEBBQADggEPADCCAQoCggEBAJjboFXrnP0XeeOabhQdsVuYI4cWbod2\n"
+ "nLU4O7WgerQHYwkZ5iqISKnnnbYwWgiXDOyq5BZpcmIjmvt6VCiYxQwtt9citsj5\n"
+ "OBfH3doxRpqUFI6e7nigtyLUSVSXTeV0W5K87Gws3+fBthsaVWtmCAN/Ra+aM/EQ\n"
+ "wGyZSpIkMQht3QI+YXZ4eLbtfjeubPOJ4bfh3BXMt1afgKCxBX9ONxX/ty8ejwY4\n"
+ "P1C3aSijtWZfNhpSSENmUt+ikk/TGGC+4+peGXEFv54cbGhyJW+ze3PJbb0S/5tB\n"
+ "Ml706H7FC6NMZNFOvCYIZfsZl1h44TO/7Wg+sSdFb8Di7Jdp91zT91ECAwEAAaOC\n"
+ "AdIwggHOMB0GA1UdDgQWBBT8ilC6nrklWntVhU+VAGOP6VhrQzASBgNVHRMBAf8E\n"
+ "CDAGAQH/AgEAMD0GA1UdIAQ2MDQwMgYEVR0gADAqMCgGCCsGAQUFBwIBFhxodHRw\n"
+ "czovL3d3dy52ZXJpc2lnbi5jb20vY3BzMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6\n"
+ "Ly9FVlNlY3VyZS1jcmwudmVyaXNpZ24uY29tL3BjYTMtZzUuY3JsMA4GA1UdDwEB\n"
+ "/wQEAwIBBjARBglghkgBhvhCAQEEBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZ\n"
+ "MFcwVRYJaW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7\n"
+ "GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwKQYDVR0R\n"
+ "BCIwIKQeMBwxGjAYBgNVBAMTEUNsYXNzM0NBMjA0OC0xLTQ3MD0GCCsGAQUFBwEB\n"
+ "BDEwLzAtBggrBgEFBQcwAYYhaHR0cDovL0VWU2VjdXJlLW9jc3AudmVyaXNpZ24u\n"
+ "Y29tMB8GA1UdIwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqGSIb3DQEB\n"
+ "BQUAA4IBAQCWovp/5j3t1CvOtxU/wHIDX4u6FpAl98KD2Md1NGNoElMMU4l7yVYJ\n"
+ "p8M2RE4O0GJis4b66KGbNGeNUyIXPv2s7mcuQ+JdfzOE8qJwwG6Cl8A0/SXGI3/t\n"
+ "5rDFV0OEst4t8dD2SB8UcVeyrDHhlyQjyRNddOVG7wl8nuGZMQoIeRuPcZ8XZsg4\n"
+ "z+6Ml7YGuXNG5NOUweVgtSV1LdlpMezNlsOjdv3odESsErlNv1HoudRETifLriDR\n"
+ "fip8tmNHnna6l9AW5wtsbfdDbzMLKTB3+p359U64drPNGLT5IO892+bKrZvQTtKH\n"
+ "qQ2mRHNQ3XBb7a1+Srwi1agm5MKFIA3Z\n"
+ "-----END CERTIFICATE-----";
private final String mTurbinePEM = "-----BEGIN CERTIFICATE-----\n" +
"MIICwDCCAaigAwIBAgIJAL61xCEOr3OFMA0GCSqGSIb3DQEBCwUAMBgxFjAUBgNV\n" +
"BAMTDVR1cmJpbmVFbmdpbmUwHhcNMTUwNDA5MTQ1MjE2WhcNMjUwNDA2MTQ1MjE2\n" +
"WjAYMRYwFAYDVQQDEw1UdXJiaW5lRW5naW5lMIIBIjANBgkqhkiG9w0BAQEFAAOC\n" +
"AQ8AMIIBCgKCAQEAsIzmnTlvEVhKTEamNvOWS0f8bcx3I6se8V9QQRGkhw77b+OD\n" +
"iU59/f+LCigO+wSujP89PADQdiaWmz+VlM5ijf2hx0wXwPjoU1IvcpLuEhYhKJk8\n" +
"ejFMplkpfywjp5qOYzqUShuivkDhI2HsYBeeSta6VPsuySiu6alffynM0Oj3qKLM\n" +
"+XPQF51rU3aEkxbWl8sDwDMJLLdPd0F2sQ0zJ/U6jvGyZPHt9mzAhed0coqqNGcw\n" +
"jnClESfivKGEkycYCsvaceGLCnyEvwVwc+qv8TZpoEp2QxXDVf2K2hTkNg3AlNZK\n" +
"CMzW/4d3lzPNQEzLxbP5fW7paLgvvX6yDh82YwIDAQABow0wCzAJBgNVHRMEAjAA\n" +
"MA0GCSqGSIb3DQEBCwUAA4IBAQAb5PrbTYt+/lFYdrZX6S5ECPuxf8K1rJPkYm7P\n" +
"4xvuA5a8PMrIFNBAnMmpur4Lm6X+BOWcSuBHIYU4QHGtSX8y+zBsngOqUb/XPzI5\n" +
"11EztA3wZrFtzfBGFfE/ywrSqsUIJwkLEEMOmq//g5ZvEdpY3a0u28I8JycoFQVE\n" +
"EyNaSBBQA7M3o9as8ZQSzG1MyjvU3uV2qyreEc4wlpOomULwISit3tC3EKfByLVe\n" +
"p637YF94EPqPCftM04lbX03v7v4XkMZhLZ6v1es9yCU5wSluqS0eWlGJti2qzz9S\n" +
"C0Sh9gfLNGqujDPrs4hDJcfX+ujbvl9g4n6n84zSjSK4OgF4\n" +
"-----END CERTIFICATE-----";
private final String mClientPEM = "-----BEGIN CERTIFICATE-----\n" +
"MIID2TCCAcECAQEwDQYJKoZIhvcNAQELBQAwgZYxCzAJBgNVBAYTAkNOMRIwEAYD\n" +
"VQQIDAlndWFuZ2RvbmcxEjAQBgNVBAcMCXNoZW56aGVuZzEQMA4GA1UECgwHdHVy\n" +
"YmluZTEQMA4GA1UECwwHdHVyaW5iZTEaMBgGA1UEAwwRdHVyYmluZS56cGNhdC5v\n" +
"cmcxHzAdBgkqhkiG9w0BCQEWEHN1emgxOTg0QDE2My5jb20wHhcNMTUwNzE0MTQ0\n" +
"NzI0WhcNMTYwNzEzMTQ0NzI0WjBSMQswCQYDVQQGEwJDTjESMBAGA1UECAwJZ3Vh\n" +
"bmdkb25nMRIwEAYDVQQHDAlzaGVuemhlbmcxDTALBgNVBAoMBGhvbWUxDDAKBgNV\n" +
"BAsMA2hvZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwadQIAk6qMaL5G/O\n" +
"XUcDHjax16yaKSN66Nh44whJiaD4rH4jF7BpfG7i2f4gset4ZngQaPtAW+brxSIk\n" +
"JLUs5LKEKpaJ9r0WKXVIjMaX/ccoTum9X1pGOpzNiLuw8oEJf9frtcGK4KYaAact\n" +
"Yha/RVME/eP05JyurhqpmeTEtwUCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAZw6i\n" +
"WczCo+S/cXxNKkMu7z71FDgVuZSJdq6S3PpUqecuEr6Q7EqEelf6NCIRBpZ3q7uV\n" +
"2LwUC+pV3tNik9lrpvWP3MErGzqzZch5oHZ/6q+JCPfZEiAMZSU+vOiG5U+7rQ3p\n" +
"6N124OOjTFeIKv5bUEHCo9OGSA+Abgaerawkn7IcGFpRtWgWEY7w00662a3jxkK5\n" +
"QeyxhY7koItDTNXGfXZ9LdtdufzFjk1jeDf9Gs20ben/whgZgtMNqEQzqMKOCmto\n" +
"LcZ2prL+1xnliv99BlshazTz8HSuoaj4o9xi8c9157xWjuMOQvMjmTJlSvtdcRUq\n" +
"hL/gMi7/h0nfnWkbIEa1Vu+FfcFcOfnMfzTVXphOCQrp5pFXeP4/ocqgN3CDbtl5\n" +
"YKrLTxgykAx5wfdk3nBhGYffRYMNymrua4X4B4hsa4HH2OXkByDh+GwiH4qxZxMW\n" +
"5V95UJntrhAEyG1NKwKqD7dd/OzB1S0PLgymugQ6GXoSDzoIENf6FUNh4l0B2p41\n" +
"UCiHaCOFH7ev7y35F2X+F+caYAvbqsbJMTcfypZqYWipAEy8FUOyKA/vqMfz35U+\n" +
"YN4ULQj1w6LRNFmT351pafB5hKx0AxBTnbDQb7J6Dymrio/NS2Gpw4IoBUJUy3Ea\n" +
"xHFi7cF7ddAf7lCNH86kdGnAzntPQVIDTDuJjAQ=\n" +
"-----END CERTIFICATE-----";
private final String mClientKey = "-----BEGIN RSA PRIVATE KEY-----\n" +
"MIICXAIBAAKBgQDBp1AgCTqoxovkb85dRwMeNrHXrJopI3ro2HjjCEmJoPisfiMX\n" +
"sGl8buLZ/iCx63hmeBBo+0Bb5uvFIiQktSzksoQqlon2vRYpdUiMxpf9xyhO6b1f\n" +
"WkY6nM2Iu7DygQl/1+u1wYrgphoBpy1iFr9FUwT94/TknK6uGqmZ5MS3BQIDAQAB\n" +
"AoGBAIatX5IIGR2Lh3rFLxW77zUyAJjn1wbJQA9zjQ8Hkmz+4DLGPo2ZCKObUnUc\n" +
"wYw7IK7SzUbVhbrkbA/bYJuOzLrB5xFbffJje3fL2jpl6n2Jkz3Ld16/0Gekks7k\n" +
"2yYJzd36W9t9Z+WwxkAhVELgn0yxe0kibxH/tDK4uob1lJX5AkEA7nTXI5q4s+f2\n" +
"DRTA6YaZrBSl9LEd6CTaC4svs7wQWPHOPgYuj7BYnCqglmSrI/5T9P1mJ801XamO\n" +
"x6NNZvHJLwJBAM/mpHY1F8Q9ySRc9zZ4ZNuozKF8k/58gZ9A6bKmMvQpIR1f0RTf\n" +
"6tVleMVFM/jXW4T3DbXuNirSMtTpEi2HjgsCQQDSvBN9dbkR1UeP2+148+lPOJhJ\n" +
"nVWu2RKR7RnlH6ja0ifQjKoNdm145fsxrhnJH3SXKHJlbmdhNP3n1JwNBFUlAj9K\n" +
"tphj4rCn1YxzhPVSnfGg/wiLADovOo9aq/lQOmoVVLKR291HozDBf7XnLvd+deZt\n" +
"4lsLBpBw0xlxalEeC5kCQAkS1Ojt8V+sKo/eqgNGwaYENCAJth/xi0rr43o6OaZ2\n" +
"haUFCzicCPiTeDlGvj1iygSDA7P6NNaponpdEBqCDQA=\n" +
"-----END RSA PRIVATE KEY-----";
private final String mClientKeyPk8 = "-----BEGIN PRIVATE KEY-----\n" +
"MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMGnUCAJOqjGi+Rv\n" +
"zl1HAx42sdesmikjeujYeOMISYmg+Kx+IxewaXxu4tn+ILHreGZ4EGj7QFvm68Ui\n" +
"JCS1LOSyhCqWifa9Fil1SIzGl/3HKE7pvV9aRjqczYi7sPKBCX/X67XBiuCmGgGn\n" +
"LWIWv0VTBP3j9OScrq4aqZnkxLcFAgMBAAECgYEAhq1fkggZHYuHesUvFbvvNTIA\n" +
"mOfXBslAD3ONDweSbP7gMsY+jZkIo5tSdRzBjDsgrtLNRtWFuuRsD9tgm47MusHn\n" +
"EVt98mN7d8vaOmXqfYmTPct3Xr/QZ6SSzuTbJgnN3fpb231n5bDGQCFUQuCfTLF7\n" +
"SSJvEf+0Mri6hvWUlfkCQQDudNcjmriz5/YNFMDphpmsFKX0sR3oJNoLiy+zvBBY\n" +
"8c4+Bi6PsFicKqCWZKsj/lP0/WYnzTVdqY7Ho01m8ckvAkEAz+akdjUXxD3JJFz3\n" +
"Nnhk26jMoXyT/nyBn0DpsqYy9CkhHV/RFN/q1WV4xUUz+NdbhPcNte42KtIy1OkS\n" +
"LYeOCwJBANK8E311uRHVR4/b7Xjz6U84mEmdVa7ZEpHtGeUfqNrSJ9CMqg12bXjl\n" +
"+zGuGckfdJcocmVuZ2E0/efUnA0EVSUCP0q2mGPisKfVjHOE9VKd8aD/CIsAOi86\n" +
"j1qr+VA6ahVUspHb3UejMMF/tecu93515m3iWwsGkHDTGXFqUR4LmQJACRLU6O3x\n" +
"X6wqj96qA0bBpgQ0IAm2H/GLSuvjejo5pnaFpQULOJwI+JN4OUa+PWLKBIMDs/o0\n" +
"1qmiel0QGoINAA==\n" +
"-----END PRIVATE KEY-----";
private final String mTurbine2Pem = "-----BEGIN CERTIFICATE-----\n" +
"MIIEHTCCAgUCAQEwDQYJKoZIhvcNAQELBQAwgZYxCzAJBgNVBAYTAkNOMRIwEAYD\n" +
"VQQIDAlndWFuZ2RvbmcxEjAQBgNVBAcMCXNoZW56aGVuZzEQMA4GA1UECgwHdHVy\n" +
"YmluZTEQMA4GA1UECwwHdHVyaW5iZTEaMBgGA1UEAwwRdHVyYmluZS56cGNhdC5v\n" +
"cmcxHzAdBgkqhkiG9w0BCQEWEHN1emgxOTg0QDE2My5jb20wHhcNMTUwNzE0MTQ0\n" +
"NTU4WhcNMTYwNzEzMTQ0NTU4WjCBlTELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCWd1\n" +
"YW5nZG9uZzERMA8GA1UEBwwIc2hlbnpoZW4xEDAOBgNVBAoMB3R1cmJpbmUxEDAO\n" +
"BgNVBAsMB3R1cmlibmUxGjAYBgNVBAMMEXR1cmJpbmUuenBjYXQub3JnMR8wHQYJ\n" +
"KoZIhvcNAQkBFhBzdXpoMTk4NEAxNjMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GN\n" +
"ADCBiQKBgQDHCD+fgJBa9x11XSAWGfDSPSchpaXCtIdCLc3INdmu33Vfb2pESMfF\n" +
"GWqk3rQHAIxCgpuMsLPZrpEJS35UUpq/MtxgdSNqlGI6OXRmtKU+mIv7GpnOepNS\n" +
"rhgWIVBr2DbO7wBj8O/sL/J1f0hEGrbNU8w9pQy8eoocb57n0EV4DQIDAQABMA0G\n" +
"CSqGSIb3DQEBCwUAA4ICAQBh2jFJ9OA7Ye8Neevbr5WRfHp12DcX/uPBFNsFgWAq\n" +
"xgKr+VP95ZsRAOL40cWD1qef2+jVOFe0NjRqMdxjlJhB+fbrPydRP+hdV2sX9Yxx\n" +
"pwwKwb3iUnGg/AoQ5jCsemGKP4j3sOKYUyuZ99wJveY/+JFnACFkpJYm+oYj3LL5\n" +
"U5QSvjye4IetlGXfFRpV9lkP9oC8ZE4NvU6yZ3VyCjM3Vz6n1/VPF7jbJVhZ06m7\n" +
"dIK0jww/SDAh8OsQhVkRM7Q14YafXtSNWGzylG21Eoy8Tg8KQAvga0iGOtA1lQuc\n" +
"cyY/dp4tbaooqeAArxZpUoM8rYIU8ovAVMT+J97LjHX4x09URlx3hJq7WCFusGJi\n" +
"CDpAGs0XpctOpjYojhUuaFaxRmRVI/wDmUPGXycPAAvZ5TfXSsTPNhD20zI1X+n3\n" +
"h3MPajLhZpfllLmEcVPNm5ljedgZZsq9fhuJRXIanOpnOOZc2AH34STkAKBzIs1+\n" +
"vEHTfA97VbtHZQOMNTjAzYh4m5JQebxGnykbF5SuRaMi5E8tXOAiIv0x9Wg/DfIQ\n" +
"Su/qDjhBB7f4JIXSH1zd9Ngyf5klprcMusP2Z0GzoyfMifx/DqPQxEKcYPYmYR26\n" +
"5iN1cv42eH4PVKzEkOWFMc3FwKGVA9ZuzIE4qYPdVF5fK/GGno6jABAs5fGPuJvn\n" +
"kQ==\n" +
"-----END CERTIFICATE-----";
private final String mTrubine3 = "-----BEGIN CERTIFICATE-----\n" +
"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\n" +
"b+1azsk=\n" +
"-----END CERTIFICATE-----";
private CustomSSLSocketFactory mCustomSSLSocketFactory;
private TextView mMsgBoard;
private Spinner mUrlsSpinner;
private ArrayAdapter<CharSequence> mUrlAdapater;
private Spinner mCertsSpinner;
private ArrayAdapter<CharSequence> mCertsAdapater;
private Button mUrlConnectionBtn;
private Button mHttpClientBtn;
private ReqCallback mUrlConnectionCb = new ReqCallback() {
@Override
public void onResult(final String result) {
Log.e(TAG, "-----------");
CharSequence msg = mMsgBoard.getText();
SpannableStringBuilder builder = new SpannableStringBuilder()
.append(msg);
if (msg.length() > 1 && msg.charAt((msg.length() - 1)) != '\n') {
builder.append('\n');
}
if (result != null) {
Log.e(TAG, result);
builder.append(formatString(MainActivity.this, result,
R.style.MsgBoardTextAppearance));
} else {
builder.append(formatString(MainActivity.this, R.string.no_response,
R.style.CertErrorTextAppearance));
}
msg = builder.subSequence(0, builder.length());
final CharSequence finalMsg = msg;
runOnUiThread(new Runnable() {
@Override
public void run() {
mMsgBoard.setText(finalMsg);
}
});
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMsgBoard = (TextView) findViewById(R.id.tv_msg_board);
mMsgBoard.setMovementMethod(new ScrollingMovementMethod());
mUrlsSpinner = (Spinner) findViewById(R.id.sp_urls);
mUrlAdapater = ArrayAdapter.createFromResource(this,
R.array.urls, android.R.layout.simple_spinner_item);
mUrlAdapater.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mUrlsSpinner.setAdapter(mUrlAdapater);
mUrlsSpinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) {
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
);
mCertsSpinner = (Spinner) findViewById(R.id.sp_certs);
mCertsAdapater = ArrayAdapter.createFromResource(this,
R.array.certs, android.R.layout.simple_spinner_item);
mCertsAdapater.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mCertsSpinner.setAdapter(mCertsAdapater);
mCertsSpinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) {
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
);
CharSequence selectedItem = (CharSequence) mUrlsSpinner.getSelectedItem();
Log.e(TAG, selectedItem.toString());
mUrlConnectionBtn = (Button) findViewById(R.id.btn_url_connection);
mHttpClientBtn = (Button) findViewById(R.id.btn_http_client);
mUrlConnectionBtn.setOnClickListener(this);
mHttpClientBtn.setOnClickListener(this);
mCustomSSLSocketFactory = new CustomSSLSocketFactory();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} else if (id == R.id.action_clean_board) {
mMsgBoard.setText(null);
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
SSLSocketFactory sslSocketFactory = getCurrentSSLSocketFactory();
String url = mUrlsSpinner.getSelectedItem().toString();
switch (v.getId()) {
case R.id.btn_url_connection:
new UrlConnectionRequst().request(url, sslSocketFactory,
null, mUrlConnectionCb);
break;
case R.id.btn_http_client:
switch (mCertsSpinner.getSelectedItemPosition()) {
case 5:
try {
InputStream input = getResources().openRawResource(R.raw.gitlab_iboxpay);
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(input, "123456".toCharArray());
new HttpClientRequest().request(url, null, mUrlConnectionCb,
keyStore, "123456");
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
case 7:
try {
InputStream input = getResources().openRawResource(R.raw.turbine);
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(input, "123456".toCharArray());
new HttpClientRequest().request(url, null, mUrlConnectionCb,
keyStore, "123456");
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
default:
Log.e(TAG, "http client unsupport this.");
CharSequence msg = mMsgBoard.getText();
SpannableStringBuilder builder = new SpannableStringBuilder()
.append(msg);
if (msg.length() > 1 && msg.charAt((msg.length() - 1)) != '\n') {
builder.append('\n');
}
builder.append(formatString(MainActivity.this, R.string.http_client_unsupport,
R.style.CertErrorTextAppearance));
msg = builder.subSequence(0, builder.length());
final CharSequence finalMsg = msg;
runOnUiThread(new Runnable() {
@Override
public void run() {
mMsgBoard.setText(finalMsg);
}
});
break;
}
break;
default:
break;
}
}
private SSLSocketFactory getCurrentSSLSocketFactory() {
int i = mCertsSpinner.getSelectedItemPosition();
SSLSocketFactory sslSocketFactory;
switch (i) {
case 0:
sslSocketFactory = null;
Log.e(TAG, "0");
break;
case 1:
sslSocketFactory = ((TLSApplicaton)getApplication())
.getDefaultSSLSocketFactory();
Log.e(TAG, "1");
break;
case 2:
sslSocketFactory = mCustomSSLSocketFactory
.getSSLSocketFactoryFromPEM(mIboxpayPEMCert);
Log.e(TAG, "2");
break;
case 3:
sslSocketFactory = mCustomSSLSocketFactory
.getSSLSocketFactoryFromPEM(mVeriSignPemCert);
Log.e(TAG, "3");
break;
case 4:
sslSocketFactory = mCustomSSLSocketFactory
.getSSLSocketFactoryFromPEM(mGitlabIboxpayPemCert);
Log.e(TAG, "4");
break;
case 5:
InputStream input = getResources().openRawResource(R.raw.gitlab_iboxpay);
sslSocketFactory = mCustomSSLSocketFactory
.getSSLSocketFactoryFromBKSKeyStore(input, "123456");
Log.e(TAG, "5");
break;
case 6:
sslSocketFactory = mCustomSSLSocketFactory
.getSSLSocketFactoryFromPEM(mTurbinePEM);
Log.e(TAG, "6");
break;
case 7:
InputStream turbine = getResources().openRawResource(R.raw.turbine);
sslSocketFactory = mCustomSSLSocketFactory.getSSLSocketFactoryFromBKSKeyStore(
turbine, "123456");
Log.e(TAG, "7");
break;
case 8:
sslSocketFactory = mCustomSSLSocketFactory.
getSSLSocketFactoryWithKeyManagerFromPem(mClientPEM, mClientKeyPk8, mTrubine3);
break;
default:
sslSocketFactory = null;
Log.e(TAG, "null");
break;
}
return sslSocketFactory;
}
private static SpannableString formatString(Context context, int textId, int style) {
String text = context.getString(textId);
SpannableString spannableString = new SpannableString(text);
spannableString.setSpan(new TextAppearanceSpan(context, style), 0, text.length(), 0);
return spannableString;
}
private static SpannableString formatString(Context context, String text, int style) {
SpannableString spannableString = new SpannableString(text);
spannableString.setSpan(new TextAppearanceSpan(context, style), 0, text.length(), 0);
return spannableString;
}
}