|
35 | 35 | import java.lang.reflect.Method; |
36 | 36 | import java.security.Security; |
37 | 37 | import java.util.Collections; |
38 | | -import java.util.Enumeration; |
39 | 38 | import java.util.List; |
| 39 | +import java.util.Set; |
40 | 40 | import java.util.zip.ZipEntry; |
41 | 41 | import java.util.zip.ZipFile; |
42 | 42 |
|
@@ -86,13 +86,57 @@ public static void insertProvider(Context context) { |
86 | 86 | System.load(cacheFile.getAbsolutePath()); |
87 | 87 |
|
88 | 88 | Class<NativeCrypto> clazz = NativeCrypto.class; |
| 89 | + |
89 | 90 | Field loadError = clazz.getDeclaredField("loadError"); |
90 | 91 | loadError.setAccessible(true); |
91 | 92 | loadError.set(null, null); |
92 | | - Method clinit =clazz.getDeclaredMethod("clinit"); |
| 93 | + |
| 94 | + Method clinit = clazz.getDeclaredMethod("clinit"); |
93 | 95 | clinit.setAccessible(true); |
| 96 | + |
| 97 | + Method get_cipher_names = clazz.getDeclaredMethod("get_cipher_names", String.class); |
| 98 | + get_cipher_names.setAccessible(true); |
| 99 | + |
| 100 | + Method cipherSuiteToJava = clazz.getDeclaredMethod("cipherSuiteToJava", String.class); |
| 101 | + cipherSuiteToJava.setAccessible(true); |
| 102 | + |
| 103 | + Method EVP_has_aes_hardware = clazz.getDeclaredMethod("EVP_has_aes_hardware"); |
| 104 | + EVP_has_aes_hardware.setAccessible(true); |
| 105 | + |
| 106 | + Field f = clazz.getDeclaredField("SUPPORTED_TLS_1_2_CIPHER_SUITES_SET"); |
| 107 | + f.setAccessible(true); |
| 108 | + |
| 109 | + Set<String> SUPPORTED_TLS_1_2_CIPHER_SUITES_SET = (Set<String>) f.get(null); |
| 110 | + f = clazz.getDeclaredField("SUPPORTED_LEGACY_CIPHER_SUITES_SET"); |
| 111 | + f.setAccessible(true); |
| 112 | + |
| 113 | + Set<String> SUPPORTED_LEGACY_CIPHER_SUITES_SET = (Set<String>) f.get(null); |
| 114 | + f = clazz.getDeclaredField("SUPPORTED_TLS_1_2_CIPHER_SUITES"); |
| 115 | + f.setAccessible(true); |
| 116 | + |
94 | 117 | try { |
95 | 118 | clinit.invoke(null); |
| 119 | + |
| 120 | + String[] allCipherSuites = (String[]) get_cipher_names.invoke(null, "ALL:!DHE"); |
| 121 | + int size = allCipherSuites.length; |
| 122 | + |
| 123 | + String[] SUPPORTED_TLS_1_2_CIPHER_SUITES = new String[size / 2 + 2]; |
| 124 | + for (int i = 0; i < size; i += 2) { |
| 125 | + String cipherSuite = (String) cipherSuiteToJava.invoke(null, allCipherSuites[i]); |
| 126 | + |
| 127 | + SUPPORTED_TLS_1_2_CIPHER_SUITES[i / 2] = cipherSuite; |
| 128 | + SUPPORTED_TLS_1_2_CIPHER_SUITES_SET.add(cipherSuite); |
| 129 | + |
| 130 | + SUPPORTED_LEGACY_CIPHER_SUITES_SET.add(allCipherSuites[i + 1]); |
| 131 | + } |
| 132 | + SUPPORTED_TLS_1_2_CIPHER_SUITES[size / 2] = "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"; |
| 133 | + SUPPORTED_TLS_1_2_CIPHER_SUITES[size / 2 + 1] = "TLS_FALLBACK_SCSV"; |
| 134 | + f.set(null, SUPPORTED_TLS_1_2_CIPHER_SUITES); |
| 135 | + |
| 136 | + f = clazz.getDeclaredField("HAS_AES_HARDWARE"); |
| 137 | + f.setAccessible(true); |
| 138 | + f.set(null, (int) EVP_has_aes_hardware.invoke(null) == 1); |
| 139 | + |
96 | 140 | provider = new OpenSSLProvider("GmsCore_OpenSSL"); |
97 | 141 | } catch (InvocationTargetException inner) { |
98 | 142 | if (inner.getTargetException() instanceof UnsatisfiedLinkError) { |
|
0 commit comments