/* * Copyright (c) 2014, Ericsson AB. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this * list of conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstdtlssrtpbin.h" #define gst_dtls_srtp_bin_parent_class parent_class G_DEFINE_ABSTRACT_TYPE (GstDtlsSrtpBin, gst_dtls_srtp_bin, GST_TYPE_BIN); enum { PROP_0, PROP_CONNECTION_ID, PROP_KEY, PROP_SRTP_AUTH, PROP_SRTP_CIPHER, PROP_SRTCP_AUTH, PROP_SRTCP_CIPHER, NUM_PROPERTIES }; static GParamSpec *properties[NUM_PROPERTIES]; #define DEFAULT_CONNECTION_ID NULL #define DEFAULT_KEY NULL #define DEFAULT_SRTP_AUTH NULL #define DEFAULT_SRTP_CIPHER NULL #define DEFAULT_SRTCP_AUTH NULL #define DEFAULT_SRTCP_CIPHER NULL static void gst_dtls_srtp_bin_finalize (GObject *); static void gst_dtls_srtp_bin_set_property (GObject *, guint prop_id, const GValue *, GParamSpec *); static void gst_dtls_srtp_bin_get_property (GObject *, guint prop_id, GValue *, GParamSpec *); static void gst_dtls_srtp_bin_class_init (GstDtlsSrtpBinClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_dtls_srtp_bin_finalize); gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_dtls_srtp_bin_set_property); gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_dtls_srtp_bin_get_property); klass->remove_dtls_element = NULL; properties[PROP_CONNECTION_ID] = g_param_spec_string ("connection-id", "Connection id", "Every encoder/decoder pair should have the same, unique, connection-id", DEFAULT_CONNECTION_ID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); properties[PROP_KEY] = g_param_spec_boxed ("key", "Key", "SRTP master key, if this property is set, DTLS will be disabled", GST_TYPE_BUFFER, G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS); properties[PROP_SRTP_CIPHER] = g_param_spec_string ("srtp-cipher", "SRTP Cipher", "SRTP cipher name, should be 'null' or 'aes-128-icm', " "if this property is set, DTLS will be disabled", DEFAULT_SRTP_CIPHER, G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS); properties[PROP_SRTCP_CIPHER] = g_param_spec_string ("srtcp-cipher", "SRTCP Cipher", "SRTCP cipher name, should be 'null' or 'aes-128-icm', " "if this property is set, DTLS will be disabled", DEFAULT_SRTCP_CIPHER, G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS); properties[PROP_SRTP_AUTH] = g_param_spec_string ("srtp-auth", "SRTP Auth", "SRTP auth name, should be 'null', 'hmac-sha1-32' or 'hmac-sha1-80', " "if this property is set, DTLS will be disabled", DEFAULT_SRTP_AUTH, G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS); properties[PROP_SRTCP_AUTH] = g_param_spec_string ("srtcp-auth", "SRTCP Auth", "SRTCP auth name, should be 'null', 'hmac-sha1-32' or 'hmac-sha1-80', " "if this property is set, DTLS will be disabled", DEFAULT_SRTCP_AUTH, G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties); } static void gst_dtls_srtp_bin_init (GstDtlsSrtpBin * self) { self->key = NULL; self->key_is_set = FALSE; self->srtp_auth = NULL; self->srtp_cipher = NULL; self->srtcp_auth = NULL; self->srtcp_cipher = NULL; } static void gst_dtls_srtp_bin_finalize (GObject * object) { GstDtlsSrtpBin *self = GST_DTLS_SRTP_BIN (object); if (self->key) { gst_buffer_unref (self->key); self->key = NULL; } g_free (self->srtp_auth); self->srtp_auth = NULL; g_free (self->srtp_cipher); self->srtp_cipher = NULL; g_free (self->srtcp_auth); self->srtcp_auth = NULL; g_free (self->srtcp_cipher); self->srtcp_cipher = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_dtls_srtp_bin_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDtlsSrtpBin *self = GST_DTLS_SRTP_BIN (object); GstDtlsSrtpBinClass *klass = GST_DTLS_SRTP_BIN_GET_CLASS (self); switch (prop_id) { case PROP_CONNECTION_ID: if (self->dtls_element) { g_object_set_property (G_OBJECT (self->dtls_element), "connection-id", value); } else { g_warning ("tried to set connection-id after disabling DTLS"); } break; case PROP_KEY: if (self->key) { gst_buffer_unref (self->key); } self->key = g_value_dup_boxed (value); self->key_is_set = TRUE; klass->remove_dtls_element (self); break; case PROP_SRTP_AUTH: g_free (self->srtp_auth); self->srtp_auth = g_value_dup_string (value); klass->remove_dtls_element (self); break; case PROP_SRTP_CIPHER: g_free (self->srtp_cipher); self->srtp_cipher = g_value_dup_string (value); klass->remove_dtls_element (self); break; case PROP_SRTCP_AUTH: g_free (self->srtcp_auth); self->srtcp_auth = g_value_dup_string (value); klass->remove_dtls_element (self); break; case PROP_SRTCP_CIPHER: g_free (self->srtcp_cipher); self->srtcp_cipher = g_value_dup_string (value); klass->remove_dtls_element (self); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec); } } static void gst_dtls_srtp_bin_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDtlsSrtpBin *self = GST_DTLS_SRTP_BIN (object); switch (prop_id) { case PROP_CONNECTION_ID: if (self->dtls_element) { g_object_get_property (G_OBJECT (self->dtls_element), "connection-id", value); } else { g_warning ("tried to get connection-id after disabling DTLS"); } break; case PROP_KEY: if (self->key) { g_value_set_boxed (value, self->key); } break; case PROP_SRTP_AUTH: g_value_set_string (value, self->srtp_auth); break; case PROP_SRTP_CIPHER: g_value_set_string (value, self->srtp_cipher); break; case PROP_SRTCP_AUTH: g_value_set_string (value, self->srtcp_auth); break; case PROP_SRTCP_CIPHER: g_value_set_string (value, self->srtcp_cipher); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec); } }