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 517d543da5f999675023225ea5af57c5ddf68abe..afb57eccc2657e8ff289d7b636b724983bbd99b7 100644 |
--- a/talk/app/webrtc/java/jni/peerconnection_jni.cc |
+++ b/talk/app/webrtc/java/jni/peerconnection_jni.cc |
@@ -125,6 +125,10 @@ namespace webrtc_jni { |
// Field trials initialization string |
static char *field_trials_init_string = NULL; |
+// Passed to SSLIdentity::Generate, "WebRTC". Used for the certificates' |
+// subject and issuer name. |
+static const char kIdentityName[] = "WebRTC"; |
jiayl2
2015/08/31 19:47:42
a minor issue, but can you move it to a header fil
AlexG
2015/08/31 20:14:13
Done.
|
+ |
#if defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD) |
// Set in PeerConnectionFactory_initializeAndroidGlobals(). |
static bool factory_static_initialized = false; |
@@ -1273,6 +1277,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,17 +1362,21 @@ 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 = GetFieldID( |
- jni, j_rtc_config_class, "audioJitterBufferMaxPackets", |
- "I"); |
+ jni, j_rtc_config_class, "audioJitterBufferMaxPackets", "I"); |
jfieldID j_audio_jitter_buffer_fast_accelerate_id = GetFieldID( |
jni, j_rtc_config_class, "audioJitterBufferFastAccelerate", "Z"); |
- PeerConnectionInterface::RTCConfiguration rtc_config; |
+ 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); |
rtc_config.bundle_policy = JavaBundlePolicyToNativeType(jni, j_bundle_policy); |
@@ -1369,6 +1390,22 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnection)( |
rtc_config.audio_jitter_buffer_fast_accelerate = GetBooleanField( |
jni, j_rtc_config, j_audio_jitter_buffer_fast_accelerate_id); |
+ // Create ECDSA certificate. |
+ if (JavaKeyTypeToNativeType(jni, j_key_type) == rtc::KT_ECDSA) { |
+ scoped_ptr<rtc::SSLIdentity> ssl_identity( |
+ rtc::SSLIdentity::Generate(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( |