Index: talk/app/webrtc/java/jni/peerconnection_jni.cc |
diff --git a/talk/app/webrtc/java/jni/peerconnection_jni.cc b/talk/app/webrtc/java/jni/peerconnection_jni.cc |
index fa52eead8f8ac126fcadf9b73657e9ff0ae6fa05..1329000aabe413085d031c7a155c9162de96d986 100644 |
--- a/talk/app/webrtc/java/jni/peerconnection_jni.cc |
+++ b/talk/app/webrtc/java/jni/peerconnection_jni.cc |
@@ -61,6 +61,7 @@ |
#include "talk/app/webrtc/java/jni/classreferenceholder.h" |
#include "talk/app/webrtc/java/jni/jni_helpers.h" |
#include "talk/app/webrtc/java/jni/native_handle_impl.h" |
+#include "talk/app/webrtc/dtlsidentitystore.h" |
#include "talk/app/webrtc/mediaconstraintsinterface.h" |
#include "talk/app/webrtc/peerconnectioninterface.h" |
#include "talk/app/webrtc/videosourceinterface.h" |
@@ -1273,6 +1274,19 @@ JavaTcpCandidatePolicyToNativeType( |
return PeerConnectionInterface::kTcpCandidatePolicyEnabled; |
} |
+static rtc::KeyType JavaKeyTypeToNativeType(JNIEnv* jni, jobject j_key_type) { |
+ std::string enum_name = GetJavaEnumName( |
+ jni, "org/webrtc/PeerConnection$KeyType", j_key_type); |
+ |
+ if (enum_name == "RSA") |
+ return rtc::KT_RSA; |
+ if (enum_name == "ECDSA") |
+ return rtc::KT_ECDSA; |
+ |
+ CHECK(false) << "Unexpected KeyType enum_name " << enum_name; |
+ return rtc::KT_ECDSA; |
+} |
+ |
static void JavaIceServersToJsepIceServers( |
JNIEnv* jni, jobject j_ice_servers, |
PeerConnectionInterface::IceServers* ice_servers) { |
@@ -1345,8 +1359,7 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnection)( |
jni, j_rtc_config, j_tcp_candidate_policy_id); |
jfieldID j_ice_servers_id = GetFieldID( |
- jni, j_rtc_config_class, "iceServers", |
- "Ljava/util/List;"); |
+ jni, j_rtc_config_class, "iceServers", "Ljava/util/List;"); |
jobject j_ice_servers = GetObjectField(jni, j_rtc_config, j_ice_servers_id); |
jfieldID j_audio_jitter_buffer_max_packets_id = |
@@ -1357,6 +1370,10 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnection)( |
jfieldID j_ice_connection_receiving_timeout_id = |
GetFieldID(jni, j_rtc_config_class, "iceConnectionReceivingTimeout", "I"); |
+ jfieldID j_key_type_id = GetFieldID(jni, j_rtc_config_class, "keyType", |
+ "Lorg/webrtc/PeerConnection$KeyType;"); |
+ jobject j_key_type = GetObjectField(jni, j_rtc_config, j_key_type_id); |
+ |
PeerConnectionInterface::RTCConfiguration rtc_config; |
rtc_config.type = |
JavaIceTransportsTypeToNativeType(jni, j_ice_transports_type); |
@@ -1373,6 +1390,22 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnection)( |
rtc_config.ice_connection_receiving_timeout = |
GetIntField(jni, j_rtc_config, j_ice_connection_receiving_timeout_id); |
+ // Create ECDSA certificate. |
+ if (JavaKeyTypeToNativeType(jni, j_key_type) == rtc::KT_ECDSA) { |
+ scoped_ptr<rtc::SSLIdentity> ssl_identity( |
+ rtc::SSLIdentity::Generate(webrtc::kIdentityName, rtc::KT_ECDSA)); |
+ if (ssl_identity.get()) { |
+ rtc_config.certificates.push_back( |
+ rtc::RTCCertificate::Create(ssl_identity.Pass())); |
+ LOG(LS_INFO) << "ECDSA certificate created."; |
+ } else { |
+ // Failing to create certificate should not abort peer connection |
+ // creation. Instead default encryption (currently RSA) will be used. |
+ LOG(LS_WARNING) << |
+ "Failed to generate SSLIdentity. Default encryption will be used."; |
+ } |
+ } |
+ |
PCOJava* observer = reinterpret_cast<PCOJava*>(observer_p); |
observer->SetConstraints(new ConstraintsWrapper(jni, j_constraints)); |
rtc::scoped_refptr<PeerConnectionInterface> pc(f->CreatePeerConnection( |