From 970b083c679d61a7ea49d28c8917d321269b7cb3 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 22 Jul 2011 11:43:05 +0200 Subject: [PATCH] Updated Android implementation to support new trusted root CA option --- src/org/linphone/LinphoneActivity.java | 53 +++++++++++++++++++ src/org/linphone/LinphoneManager.java | 5 ++ .../core/LinphoneCoreFactoryImpl.java | 14 +++++ src/org/linphone/core/LinphoneCoreImpl.java | 5 ++ 4 files changed, 77 insertions(+) diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index ff36a9360..2df104f18 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -21,8 +21,17 @@ package org.linphone; import static android.content.Intent.ACTION_MAIN; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.util.Enumeration; import java.util.List; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; + import org.linphone.LinphoneManager.EcCalibrationListener; import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCoreException; @@ -47,6 +56,7 @@ import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.text.Html; +import android.util.Base64; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -139,6 +149,49 @@ public class LinphoneActivity extends TabActivity { if (savedInstanceState !=null && savedInstanceState.getBoolean(SCREEN_IS_HIDDEN,false)) { hideScreen(true); } + + if (false) { + try { + KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); + Enumeration al = ks.aliases(); + while(al.hasMoreElements()) { + Log.i(al.nextElement()); + } + Log.i("Enumeration done"); + } catch (KeyStoreException e) { + e.printStackTrace(); + } + + } else if (false) { + try { + String defaultAlg = TrustManagerFactory.getDefaultAlgorithm(); + TrustManagerFactory tmf = TrustManagerFactory.getInstance(defaultAlg); + // init is needed for Android to fill the javax.net.ssl.trustStore property + // ref : http://groups.google.com/group/android-developers/browse_thread/thread/366a3c8a6b2a7ad/163ff07c8ac39929?lnk=gst&q=SSL+root + tmf.init((KeyStore)null); + String trustStore = System.getProperty("javax.net.ssl.trustStore"); + Log.i(trustStore + "\n"); + + for(TrustManager tm: tmf.getTrustManagers()) { + X509TrustManager xtm = (X509TrustManager)tm; + Log.i(xtm.getAcceptedIssuers().length); + for(X509Certificate ca : xtm.getAcceptedIssuers()) { + byte[] encoded = ca.getEncoded(); + String s = new String(encoded); + byte[] d2 = Base64.decode(encoded, 0); + String s2 = new String(d2); + Log.i(ca.toString()); + + + } + } + } catch (KeyStoreException e) { + } catch (NoSuchAlgorithmException e) { + } catch (Exception e) { + e.printStackTrace(); + } + } + } diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 477b70017..cae39c679 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -119,6 +119,7 @@ public final class LinphoneManager implements LinphoneCoreListener { basePath = c.getFilesDir().getAbsolutePath(); linphoneInitialConfigFile = basePath + "/linphonerc"; linphoneConfigFile = basePath + "/.linphonerc"; + linphoneRootCaFile = basePath + "/rootca.pem"; ringSoundFile = basePath + "/oldphone_mono.wav"; ringbackSoundFile = basePath + "/ringback.wav"; @@ -136,6 +137,7 @@ public final class LinphoneManager implements LinphoneCoreListener { private static final int dbStep = 4; /** Called when the activity is first created. */ private final String linphoneInitialConfigFile; + private final String linphoneRootCaFile; private final String linphoneConfigFile; private final String ringSoundFile; private final String ringbackSoundFile; @@ -326,6 +328,8 @@ public final class LinphoneManager implements LinphoneCoreListener { mLc.setPlaybackGain(3); mLc.setRing(null); + mLc.setRootCA(linphoneRootCaFile); + try { initFromConf(context); @@ -354,6 +358,7 @@ public final class LinphoneManager implements LinphoneCoreListener { copyIfNotExist(context, R.raw.oldphone_mono,ringSoundFile); copyIfNotExist(context, R.raw.ringback,ringbackSoundFile); copyFromPackage(context, R.raw.linphonerc, new File(linphoneInitialConfigFile).getName()); + copyIfNotExist(context, R.raw.rootca, new File(linphoneRootCaFile).getName()); } private void copyIfNotExist(Context context, int ressourceId,String target) throws IOException { File lFileToCopy = new File(target); diff --git a/src/org/linphone/core/LinphoneCoreFactoryImpl.java b/src/org/linphone/core/LinphoneCoreFactoryImpl.java index 7e8f6e5de..f92dd6c86 100644 --- a/src/org/linphone/core/LinphoneCoreFactoryImpl.java +++ b/src/org/linphone/core/LinphoneCoreFactoryImpl.java @@ -19,7 +19,21 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package org.linphone.core; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.security.InvalidAlgorithmParameterException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.PKIXParameters; +import java.security.cert.TrustAnchor; +import java.security.cert.X509Certificate; +import java.util.Iterator; + +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { diff --git a/src/org/linphone/core/LinphoneCoreImpl.java b/src/org/linphone/core/LinphoneCoreImpl.java index b8fddda20..f09c5f9ee 100644 --- a/src/org/linphone/core/LinphoneCoreImpl.java +++ b/src/org/linphone/core/LinphoneCoreImpl.java @@ -87,6 +87,7 @@ class LinphoneCoreImpl implements LinphoneCore { private native int[] getPreferredVideoSize(long nativePtr); private native void setRing(long nativePtr, String path); private native String getRing(long nativePtr); + private native void setRootCA(long nativePtr, String path); private native long[] listVideoPayloadTypes(long nativePtr); private native long[] listAudioPayloadTypes(long nativePtr); private native void enableKeepAlive(long nativePtr,boolean enable); @@ -420,6 +421,10 @@ class LinphoneCoreImpl implements LinphoneCore { return getRing(nativePtr); } + public void setRootCA(String path) { + setRootCA(nativePtr, path); + } + public PayloadType[] getVideoCodecs() { long[] typesPtr = listVideoPayloadTypes(nativePtr); if (typesPtr == null) return null;