diff options
author | Olivier CrĂȘte <olivier.crete@collabora.com> | 2015-02-23 14:34:37 -0500 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.com> | 2015-02-25 16:26:48 -0500 |
commit | 98235c97645ff81cac4078b97d8f30d06eea1fff (patch) | |
tree | a02dd5cd49644699f2e39f5ccad59bb4beaf552e /gst | |
parent | 9a8e68e837029031bf082350ff5dfb2ef5cf4f7a (diff) | |
download | farstream-98235c97645ff81cac4078b97d8f30d06eea1fff.tar.gz |
stream: Add "require-encryption" parameter
If it is set to TRUE, then all buffers will be dropped before
the decryption key is set.
https://bugs.freedesktop.org/show_bug.cgi?id=89288
Diffstat (limited to 'gst')
-rw-r--r-- | gst/fsrtpconference/fs-rtp-session.c | 10 | ||||
-rw-r--r-- | gst/fsrtpconference/fs-rtp-stream.c | 49 |
2 files changed, 48 insertions, 11 deletions
diff --git a/gst/fsrtpconference/fs-rtp-session.c b/gst/fsrtpconference/fs-rtp-session.c index a465cfa0..b040a5cb 100644 --- a/gst/fsrtpconference/fs-rtp-session.c +++ b/gst/fsrtpconference/fs-rtp-session.c @@ -5523,15 +5523,7 @@ _srtpdec_request_key (GstElement *srtpdec, guint ssrc, gpointer user_data) fs_rtp_session_has_disposed_exit (self); - if (caps) - return caps; - else - return gst_caps_new_simple ("application/x-srtp", - "srtp-cipher", G_TYPE_STRING, "null", - "srtcp-cipher", G_TYPE_STRING, "null", - "srtp-auth", G_TYPE_STRING, "null", - "srtcp-auth", G_TYPE_STRING, "null", - NULL); + return caps; } static gboolean diff --git a/gst/fsrtpconference/fs-rtp-stream.c b/gst/fsrtpconference/fs-rtp-stream.c index ebe30f16..a6457d89 100644 --- a/gst/fsrtpconference/fs-rtp-stream.c +++ b/gst/fsrtpconference/fs-rtp-stream.c @@ -77,7 +77,8 @@ enum PROP_SESSION, PROP_RTP_HEADER_EXTENSIONS, PROP_DECRYPTION_PARAMETERS, - PROP_SEND_RTCP_MUX + PROP_SEND_RTCP_MUX, + PROP_REQUIRE_ENCRYPTION }; struct _FsRtpStreamPrivate @@ -98,6 +99,7 @@ struct _FsRtpStreamPrivate /* protected by session lock */ GstStructure *decryption_parameters; + gboolean encrypted; gulong local_candidates_prepared_handler_id; gulong new_active_candidate_pair_handler_id; @@ -224,6 +226,9 @@ fs_rtp_stream_class_init (FsRtpStreamClass *klass) g_object_class_override_property (gobject_class, PROP_DECRYPTION_PARAMETERS, "decryption-parameters"); + g_object_class_override_property (gobject_class, + PROP_REQUIRE_ENCRYPTION, + "require-encryption"); g_object_class_install_property (gobject_class, PROP_RTP_HEADER_EXTENSIONS, @@ -475,6 +480,11 @@ fs_rtp_stream_get_property (GObject *object, g_value_set_boolean (value, FALSE); FS_RTP_SESSION_UNLOCK (session); break; + case PROP_REQUIRE_ENCRYPTION: + FS_RTP_SESSION_LOCK (session); + g_value_set_boolean (value, self->priv->encrypted); + FS_RTP_SESSION_UNLOCK (session); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -579,6 +589,28 @@ fs_rtp_stream_set_property (GObject *object, } } break; + case PROP_REQUIRE_ENCRYPTION: + { + FsRtpSession *session = fs_rtp_stream_get_session (self, NULL); + + if (session) { + FS_RTP_SESSION_LOCK (session); + + if (self->priv->encrypted != g_value_get_boolean (value)) + { + self->priv->encrypted = g_value_get_boolean (value); + + if (!self->priv->decrypt_clear_locked_cb (self, + self->priv->user_data_for_cb)) { + g_warning ("Can't set encryption because srtpdec is not" + " installed"); + self->priv->encrypted = FALSE; + } + } + FS_RTP_SESSION_UNLOCK (session); + } + } + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1492,7 +1524,20 @@ fs_rtp_stream_get_srtp_caps_locked (FsRtpStream *self) */ if (!gst_structure_has_name (self->priv->decryption_parameters, "FarstreamSRTP")) - return NULL; + { + /* Return NULL (drop packets) if encrypted, otherwise return + * the NULL codec. + */ + if (self->priv->encrypted) + return NULL; + else + return gst_caps_new_simple ("application/x-srtp", + "srtp-cipher", G_TYPE_STRING, "null", + "srtcp-cipher", G_TYPE_STRING, "null", + "srtp-auth", G_TYPE_STRING, "null", + "srtcp-auth", G_TYPE_STRING, "null", + NULL); + } srtp_cipher = gst_structure_get_string (self->priv->decryption_parameters, "rtp-cipher"); |