From 1a3bb67dcedd60956f5e84d4cff2cb9846824657 Mon Sep 17 00:00:00 2001 From: Mariya Date: Tue, 6 Feb 2024 16:23:33 +0530 Subject: [PATCH] nats --- app/src/main/AndroidManifest.xml | 3 +- .../hpostesting/presentation/NatsManager.kt | 83 +++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a5b66b6..24f665b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -119,7 +119,8 @@ android:theme="@style/AppTheme.NoActionBar"> - + + diff --git a/app/src/main/java/com/example/hpostesting/presentation/NatsManager.kt b/app/src/main/java/com/example/hpostesting/presentation/NatsManager.kt index 4c8f3dc..fe83c25 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/NatsManager.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/NatsManager.kt @@ -8,9 +8,18 @@ import io.nats.client.Message import io.nats.client.NKey import io.nats.client.Nats import io.nats.client.Options +import java.io.BufferedInputStream +import java.io.FileInputStream import java.io.IOException import java.nio.charset.StandardCharsets import java.security.GeneralSecurityException +import java.security.KeyStore +import java.security.SecureRandom +import javax.net.ssl.KeyManager +import javax.net.ssl.KeyManagerFactory +import javax.net.ssl.SSLContext +import javax.net.ssl.TrustManager +import javax.net.ssl.TrustManagerFactory class NatsManager(datacollector: DashboardActivity) { @@ -20,6 +29,80 @@ class NatsManager(datacollector: DashboardActivity) { val datacollector = datacollector var connect = false + fun createSSLContext(): SSLContext { + val keyStorePassword = "password".toCharArray() // Change as necessary + + // Load client certificate and key + val keyStore = KeyStore.getInstance("PKCS12") + FileInputStream("path/to/client-certificate.p12").use { keyStoreInputStream -> + keyStore.load(keyStoreInputStream, keyStorePassword) + } + + // Initialize key manager factory + val keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()) + keyManagerFactory.init(keyStore, keyStorePassword) + + // Load CA certificate + val trustStore = KeyStore.getInstance(KeyStore.getDefaultType()) + FileInputStream("/storage/emulated/0/Android/data/in.sminnovations.hpostesting.quality/files/NATS/clientCertificate/client-cert.pem").use { trustStoreInputStream -> + trustStore.load(trustStoreInputStream, null) // No password for CA certificate + } + + // Initialize trust manager factory + val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) + trustManagerFactory.init(trustStore) + + // Initialize SSLContext + val sslContext = SSLContext.getInstance("TLS") + sslContext.init(keyManagerFactory.keyManagers, trustManagerFactory.trustManagers, SecureRandom()) + + return sslContext + } + + internal object SSLUtils { + var KEYSTORE_PATH = "keystore.jks" + var TRUSTSTORE_PATH = "truststore.jks" + var STORE_PASSWORD = "password" + var KEY_PASSWORD = "password" + var ALGORITHM = "SunX509" + @Throws(java.lang.Exception::class) + fun loadKeystore(path: String?): KeyStore { + val store = KeyStore.getInstance("JKS") + val `in` = BufferedInputStream(FileInputStream(path)) + try { + store.load(`in`, STORE_PASSWORD.toCharArray()) + } finally { + if (`in` != null) { + `in`.close() + } + } + return store + } + + @Throws(java.lang.Exception::class) + fun createTestKeyManagers(): Array { + val store = loadKeystore(KEYSTORE_PATH) + val factory = KeyManagerFactory.getInstance(ALGORITHM) + factory.init(store, KEY_PASSWORD.toCharArray()) + return factory.keyManagers + } + + @Throws(java.lang.Exception::class) + fun createTestTrustManagers(): Array { + val store = loadKeystore(TRUSTSTORE_PATH) + val factory = TrustManagerFactory.getInstance(ALGORITHM) + factory.init(store) + return factory.trustManagers + } + + @Throws(java.lang.Exception::class) + fun createSSLContext(): SSLContext { + val ctx = SSLContext.getInstance(Options.DEFAULT_SSL_PROTOCOL) + ctx.init(createTestKeyManagers(), createTestTrustManagers(), SecureRandom()) + return ctx + } + } + fun connect() { Log.d(TAG, "TRY TO CONNECT") Thread {