diff --git a/jni/Android.mk b/jni/Android.mk index b2218a002..d6f8cef16 100755 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -2,6 +2,8 @@ #default values BUILD_AMR=light +BUILD_SRTP=1 + ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) BUILD_X264=1 LINPHONE_VIDEO=1 @@ -14,7 +16,7 @@ endif ##ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) ifeq ($(BUILD_GPLV3_ZRTP), 1) -BUILD_SRTP=1 + BUILD_SRTP=1 ZRTP_C_INCLUDE= \ $(linphone-root-dir)/submodules/externals/libzrtpcpp/src endif diff --git a/jni/Application.mk b/jni/Application.mk index 88e0e64f0..85985223d 100644 --- a/jni/Application.mk +++ b/jni/Application.mk @@ -1,5 +1,5 @@ APP_PROJECT_PATH := $(call my-dir)/../ -APP_MODULES :=libspeex libgsm libortp libosip2 libeXosip2 libmediastreamer2 liblinphone +APP_MODULES :=libspeex libgsm libortp libosip2 libeXosip2 libmediastreamer2 liblinphone APP_STL := stlport_static ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) diff --git a/res/values/non_localizable_strings.xml b/res/values/non_localizable_strings.xml index cc7222cda..a5ef23b8b 100644 --- a/res/values/non_localizable_strings.xml +++ b/res/values/non_localizable_strings.xml @@ -50,6 +50,8 @@ pref_codecs_key pref_stun_server_key pref_video_codec_vp8_key - - + pref_media_encryption_key + none + srtp + zrtp diff --git a/res/values/strings.xml b/res/values/strings.xml index d9edcfd4e..b044d795c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -200,4 +200,8 @@ AMR codec might not be present on your phone VP8 +Media encryption +None +SRTP +ZRTP diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index a0970e193..fb3927936 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -146,6 +146,9 @@ + diff --git a/src/org/linphone/IncallActivity.java b/src/org/linphone/IncallActivity.java index 53c07f6d4..b2ffeacd1 100644 --- a/src/org/linphone/IncallActivity.java +++ b/src/org/linphone/IncallActivity.java @@ -35,6 +35,7 @@ import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCoreException; import org.linphone.core.Log; import org.linphone.core.LinphoneCall.State; +import org.linphone.core.LinphoneCore.MediaEncryption; import org.linphone.mediastream.Version; import org.linphone.ui.Numpad; @@ -661,17 +662,21 @@ public class IncallActivity extends ListActivity implements removeFromConfButton.setOnClickListener(l); addVideoButton.setOnClickListener(l); - String mediaEncryption = call.getCurrentParamsCopy().getMediaEncryption(); - if ("none".equals(mediaEncryption)) { - boolean showUnencrypted = Version.hasZrtp(); + MediaEncryption supposedMediaEncryption=LinphoneManager.getLc().getMediaEncryption(); + MediaEncryption mediaEncryption = call.getCurrentParamsCopy().getMediaEncryption(); + if (mediaEncryption==MediaEncryption.None) { setVisibility(v, R.id.callee_status_secured, false); setVisibility(v, R.id.callee_status_maybe_secured, false); - setVisibility(v, R.id.callee_status_not_secured, showUnencrypted); - } else { - boolean reallySecured = !Version.hasZrtp() || call.isAuthenticationTokenVerified(); + setVisibility(v, R.id.callee_status_not_secured, supposedMediaEncryption!=MediaEncryption.None); + } else if (mediaEncryption==MediaEncryption.ZRTP){ + boolean reallySecured = call.isAuthenticationTokenVerified(); setVisibility(v, R.id.callee_status_secured, reallySecured); setVisibility(v, R.id.callee_status_maybe_secured, !reallySecured); setVisibility(v, R.id.callee_status_not_secured, false); + }else if (mediaEncryption==MediaEncryption.SRTP){ + setVisibility(v, R.id.callee_status_secured, true); + setVisibility(v, R.id.callee_status_maybe_secured, false); + setVisibility(v, R.id.callee_status_not_secured, false); } v.setOnClickListener(new OnClickListener() { @@ -690,13 +695,13 @@ public class IncallActivity extends ListActivity implements enableView(content, R.id.resume, l, !isInConference && showResume); enableView(content, R.id.terminate_call, l, true); - String mediaEncryption = call.getCurrentParamsCopy().getMediaEncryption(); - if ("none".equals(mediaEncryption)) { - boolean showUnencrypted = Version.hasZrtp(); - setVisibility(content, R.id.unencrypted, showUnencrypted); - } else { + MediaEncryption mediaEncryption = call.getCurrentParamsCopy().getMediaEncryption(); + MediaEncryption supposedEncryption = LinphoneManager.getLc().getMediaEncryption(); + if (mediaEncryption==MediaEncryption.None) { + setVisibility(content, R.id.unencrypted, supposedEncryption!=MediaEncryption.None); + } else{ TextView token = (TextView) content.findViewById(R.id.authentication_token); - if ("zrtp".equals(mediaEncryption)) { + if (mediaEncryption==MediaEncryption.ZRTP) { boolean authVerified = call.isAuthenticationTokenVerified(); String fmt = getString(authVerified ? R.string.reset_sas_fmt : R.string.validate_sas_fmt); token.setText(String.format(fmt, call.getAuthenticationToken())); diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 8ee215bfa..126ecfc34 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -66,6 +66,7 @@ import org.linphone.core.LinphoneCall.State; import org.linphone.core.LinphoneCore.EcCalibratorStatus; import org.linphone.core.LinphoneCore.FirewallPolicy; import org.linphone.core.LinphoneCore.GlobalState; +import org.linphone.core.LinphoneCore.MediaEncryption; import org.linphone.core.LinphoneCore.RegistrationState; import org.linphone.core.LinphoneCore.Transports; import org.linphone.mediastream.Version; @@ -468,6 +469,18 @@ public final class LinphoneManager implements LinphoneCoreListener { } return false; } + + void initMediaEncryption(){ + String pref = mPref.getString(getString(R.string.pref_media_encryption_key), + getString(R.string.pref_media_encryption_key_none)); + MediaEncryption me=MediaEncryption.None; + if (pref.equals(getString(R.string.pref_media_encryption_key_srtp))) + me=MediaEncryption.SRTP; + else if (pref.equals(getString(R.string.pref_media_encryption_key_zrtp))) + me=MediaEncryption.ZRTP; + Log.i("Media encryption set to "+pref); + mLc.setMediaEncryption(me); + } public void initFromConf(Context context) throws LinphoneConfigException { //traces @@ -478,7 +491,7 @@ public final class LinphoneManager implements LinphoneCoreListener { initialTransports = mLc.getSignalingTransportPorts(); setSignalingTransportsFromConfiguration(initialTransports); - + initMediaEncryption(); try { // Configure audio codecs diff --git a/src/org/linphone/LinphonePreferencesActivity.java b/src/org/linphone/LinphonePreferencesActivity.java index 74cba276b..5355b733c 100644 --- a/src/org/linphone/LinphonePreferencesActivity.java +++ b/src/org/linphone/LinphonePreferencesActivity.java @@ -29,8 +29,10 @@ import static org.linphone.R.string.pref_echo_canceller_calibration_key; import static org.linphone.R.string.pref_video_enable_key; import static org.linphone.R.string.pref_echo_limiter_key; import static org.linphone.R.string.pref_echo_cancellation_key; +import static org.linphone.R.string.pref_media_encryption_key; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -39,6 +41,7 @@ import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCoreException; import org.linphone.core.Log; import org.linphone.core.LinphoneCore.EcCalibratorStatus; +import org.linphone.core.LinphoneCore.MediaEncryption; import org.linphone.mediastream.Version; import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration; import org.linphone.mediastream.video.capture.hwconf.Hacks; @@ -47,6 +50,7 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.preference.CheckBoxPreference; +import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.Preference.OnPreferenceChangeListener; @@ -58,6 +62,7 @@ public class LinphonePreferencesActivity extends PreferenceActivity implements E private CheckBoxPreference ecCalibratePref; private CheckBoxPreference elPref; private CheckBoxPreference ecPref; + private ListPreference mencPref; private SharedPreferences prefs() { return getPreferenceManager().getSharedPreferences(); @@ -98,6 +103,7 @@ public class LinphonePreferencesActivity extends PreferenceActivity implements E }); ecPref = (CheckBoxPreference) findPreference(pref_echo_cancellation_key); elPref = (CheckBoxPreference) findPreference(pref_echo_limiter_key); + mencPref = (ListPreference) findPreference(pref_media_encryption_key); boolean fastCpu = Version.isArmv7(); if (fastCpu) { @@ -109,6 +115,35 @@ public class LinphonePreferencesActivity extends PreferenceActivity implements E findPreference(pref_echo_limiter_key).setEnabled(true); } + LinphoneCore lc=LinphoneManager.getLc(); + boolean hasZrtp=lc.mediaEncryptionSupported(MediaEncryption.ZRTP); + boolean hasSrtp=lc.mediaEncryptionSupported(MediaEncryption.SRTP); + if (hasSrtp==false && hasZrtp==false){ + mencPref.setEnabled(false); + }else{ + ArrayList mencEntries=new ArrayList(); + ArrayList mencEntryValues=new ArrayList(); + mencEntries.add(getString(R.string.media_encryption_none)); + mencEntryValues.add(getString(R.string.pref_media_encryption_key_none)); + if (hasSrtp){ + mencEntries.add(getString(R.string.media_encryption_srtp)); + mencEntryValues.add(getString(R.string.pref_media_encryption_key_srtp)); + } + if (hasZrtp){ + mencEntries.add(getString(R.string.media_encryption_zrtp)); + mencEntryValues.add(getString(R.string.pref_media_encryption_key_zrtp)); + } + CharSequence[] contents=new CharSequence[mencEntries.size()]; + mencEntries.toArray(contents); + mencPref.setEntries(contents); + contents=new CharSequence[mencEntryValues.size()]; + mencEntryValues.toArray(contents); + mencPref.setEntryValues(contents); + mencPref.setDefaultValue(getString(R.string.media_encryption_none)); + //mencPref.setValueIndex(mencPref.findIndexOfValue(getString(R.string.media_encryption_none))); + } + + detectAudioCodec(pref_codec_amr_key,"AMR",8000, false); //detectAudioCodec(R.string.pref_codec_silk8_key,"SILK",8000, true); //detectAudioCodec(R.string.pref_codec_silk12_key,"SILK",12000, true); diff --git a/src/org/linphone/core/LinphoneCallParamsImpl.java b/src/org/linphone/core/LinphoneCallParamsImpl.java index 8a7fba15c..bb7e9b1ab 100644 --- a/src/org/linphone/core/LinphoneCallParamsImpl.java +++ b/src/org/linphone/core/LinphoneCallParamsImpl.java @@ -18,6 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone.core; +import org.linphone.core.LinphoneCore.MediaEncryption; + public class LinphoneCallParamsImpl implements LinphoneCallParams { protected final long nativePtr; @@ -28,8 +30,8 @@ public class LinphoneCallParamsImpl implements LinphoneCallParams { private native void enableVideo(long nativePtr, boolean b); private native boolean getVideoEnabled(long nativePtr); private native void audioBandwidth(long nativePtr, int bw); - private native void setMediaEncryption(long nativePtr, String menc); - private native String getMediaEncryption(long nativePtr); + private native void setMediaEncryption(long nativePtr, int menc); + private native int getMediaEncryption(long nativePtr); private native void destroy(long nativePtr); @@ -51,12 +53,12 @@ public class LinphoneCallParamsImpl implements LinphoneCallParams { audioBandwidth(nativePtr, value); } - public String getMediaEncryption() { - return getMediaEncryption(nativePtr); + public MediaEncryption getMediaEncryption() { + return MediaEncryption.fromInt(getMediaEncryption(nativePtr)); } - public void setMediaEnctyption(String menc) { - setMediaEncryption(nativePtr, menc); + public void setMediaEnctyption(MediaEncryption menc) { + setMediaEncryption(nativePtr, menc.mValue); } private native boolean localConferenceMode(long nativePtr); diff --git a/src/org/linphone/core/LinphoneCoreImpl.java b/src/org/linphone/core/LinphoneCoreImpl.java index 7f63f0cb3..eeb082dca 100644 --- a/src/org/linphone/core/LinphoneCoreImpl.java +++ b/src/org/linphone/core/LinphoneCoreImpl.java @@ -105,8 +105,8 @@ class LinphoneCoreImpl implements LinphoneCore { private native void enableEchoLimiter(long nativePtr2, boolean val); private native int setVideoDevice(long nativePtr2, int id); private native int getVideoDevice(long nativePtr2); - private native String getMediaEncryption(long nativePtr); - private native void setMediaEncryption(long nativePtr, String menc); + private native int getMediaEncryption(long nativePtr); + private native void setMediaEncryption(long nativePtr, int menc); private native boolean isMediaEncryptionMandatory(long nativePtr); private native void setMediaEncryptionMandatory(long nativePtr, boolean yesno); @@ -501,9 +501,9 @@ class LinphoneCoreImpl implements LinphoneCore { leaveConference(nativePtr); } - private native void enterConference(long nativePtr); - public synchronized void enterConference() { - enterConference(nativePtr); + private native boolean enterConference(long nativePtr); + public synchronized boolean enterConference() { + return enterConference(nativePtr); } private native boolean isInConference(long nativePtr); @@ -571,14 +571,14 @@ class LinphoneCoreImpl implements LinphoneCore { return (LinphoneCall) findCallFromUri(nativePtr, uri); } - public String getMediaEncryption() { - return getMediaEncryption(nativePtr); + public MediaEncryption getMediaEncryption() { + return MediaEncryption.fromInt(getMediaEncryption(nativePtr)); } public boolean isMediaEncryptionMandatory() { return isMediaEncryptionMandatory(nativePtr); } - public void setMediaEncryption(String menc) { - setMediaEncryption(nativePtr, menc); + public void setMediaEncryption(MediaEncryption menc) { + setMediaEncryption(nativePtr, menc.mValue); } public void setMediaEncryptionMandatory(boolean yesno) { setMediaEncryptionMandatory(nativePtr, yesno); @@ -610,4 +610,9 @@ class LinphoneCoreImpl implements LinphoneCore { public boolean isEchoLimiterEnabled() { return isEchoLimiterEnabled(nativePtr); } + private native boolean mediaEncryptionSupported(long nativePtr, int menc); + @Override + public boolean mediaEncryptionSupported(MediaEncryption menc) { + return mediaEncryptionSupported(nativePtr,menc.mValue); + } } diff --git a/submodules/externals/exosip b/submodules/externals/exosip index ad693d4bf..f28804413 160000 --- a/submodules/externals/exosip +++ b/submodules/externals/exosip @@ -1 +1 @@ -Subproject commit ad693d4bfa47481fa867ee0f3e7b856ac0d166f8 +Subproject commit f288044136b3e60baf6c0805e8cf87e5cdbc7890 diff --git a/submodules/externals/speex b/submodules/externals/speex index a6d05eb5f..06a869e4a 160000 --- a/submodules/externals/speex +++ b/submodules/externals/speex @@ -1 +1 @@ -Subproject commit a6d05eb5ff9d5062852cdf7df574bec728921ef9 +Subproject commit 06a869e4a71941d24bacbf08289a6319c920973c diff --git a/submodules/linphone b/submodules/linphone index ce510f9d1..72a508632 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit ce510f9d1fa8d66aabcca308f0d2a9174f68acd4 +Subproject commit 72a508632760bf20c2aeac7e253f7a481974f499 diff --git a/test/org/linphone/TestConferenceActivity.java b/test/org/linphone/TestConferenceActivity.java index 77fe7a936..1069448e0 100644 --- a/test/org/linphone/TestConferenceActivity.java +++ b/test/org/linphone/TestConferenceActivity.java @@ -223,10 +223,11 @@ public class TestConferenceActivity extends IncallActivity { } public int updateCall(LinphoneCall call, LinphoneCallParams params) {return 0;} private boolean partOfConf; - public void enterConference() { + public boolean enterConference() { pauseAllCalls(); partOfConf=true; hackTriggerConfStateUpdate(); // FIXME hack; should have an event? + return true; } public void leaveConference() { partOfConf=false; @@ -338,7 +339,7 @@ public class TestConferenceActivity extends IncallActivity { } @Override - public String getMediaEncryption() { + public MediaEncryption getMediaEncryption() { // TODO Auto-generated method stub return null; } @@ -348,11 +349,6 @@ public class TestConferenceActivity extends IncallActivity { return false; } @Override - public void setMediaEncryption(String menc) { - // TODO Auto-generated method stub - - } - @Override public void setMediaEncryptionMandatory(boolean yesno) { // TODO Auto-generated method stub @@ -362,6 +358,16 @@ public class TestConferenceActivity extends IncallActivity { // TODO Auto-generated method stub return false; } + @Override + public boolean mediaEncryptionSupported(MediaEncryption menc) { + // TODO Auto-generated method stub + return false; + } + @Override + public void setMediaEncryption(MediaEncryption menc) { + // TODO Auto-generated method stub + + } }