From c9fa1c07d69b3ff9d754ad6e6d6cee204960d003 Mon Sep 17 00:00:00 2001 From: Vavassor Date: Thu, 6 Jul 2017 18:27:51 -0400 Subject: [PATCH] Adds or updates Bouncy Castle as a security provider. A possible fix for alleviating issues with connections (issue #46 in particular). --- app/build.gradle | 1 + .../keylesspalace/tusky/TuskyApplication.java | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 20c3efab..cfc1fe8e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,5 +53,6 @@ dependencies { compile('org.eclipse.paho:org.eclipse.paho.android.service:1.1.1') { exclude module: 'support-v4' } + compile 'org.bouncycastle:bcprov-jdk15on:1.57' testCompile 'junit:junit:4.12' } diff --git a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java index 4b0996c9..af430390 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java +++ b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java @@ -17,12 +17,20 @@ package com.keylesspalace.tusky; import android.app.Application; import android.net.Uri; +import android.util.Log; import com.keylesspalace.tusky.util.OkHttpUtils; import com.squareup.picasso.Picasso; import com.jakewharton.picasso.OkHttp3Downloader; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import java.security.Provider; +import java.security.Security; + public class TuskyApplication extends Application { + private static final String TAG = "TuskyApplication"; // logging tag + @Override public void onCreate() { super.onCreate(); @@ -47,5 +55,34 @@ public class TuskyApplication extends Application { if (BuildConfig.DEBUG) { Picasso.with(this).setLoggingEnabled(true); } + + /* Install the new provider or, if there's a pre-existing older version, replace the + * existing version of it. */ + final String providerName = "BC"; + Provider existingProvider = Security.getProvider(providerName); + if (existingProvider == null) { + try { + Security.addProvider(new BouncyCastleProvider()); + } catch (SecurityException e) { + Log.d(TAG, "Permission to replace the security provider was denied."); + } + } else { + Provider replacement = new BouncyCastleProvider(); + if (existingProvider.getVersion() < replacement.getVersion()) { + Provider[] providers = Security.getProviders(); + int priority = 1; + for (int i = 0; i < providers.length; i++) { + if (providers[i].getName().equals(providerName)) { + priority = i + 1; + } + } + try { + Security.removeProvider(providerName); + Security.insertProviderAt(replacement, priority); + } catch (SecurityException e) { + Log.d(TAG, "Permission to replace the security provider was denied."); + } + } + } } } \ No newline at end of file