mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-09 05:38:58 +00:00
This is a copy of the Ericsson DTLS plugin from https://github.com/EricssonResearch/openwebrtc-gst-plugins/tree/master/ext/erdtls/src https://bugzilla.gnome.org/show_bug.cgi?id=744582
231 lines
8 KiB
C
231 lines
8 KiB
C
/*
|
|
* 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_er_dtls_srtp_bin_parent_class parent_class
|
|
G_DEFINE_ABSTRACT_TYPE(GstErDtlsSrtpBin, gst_er_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_er_dtls_srtp_bin_finalize(GObject *);
|
|
static void gst_er_dtls_srtp_bin_set_property(GObject *, guint prop_id, const GValue *, GParamSpec *);
|
|
static void gst_er_dtls_srtp_bin_get_property(GObject *, guint prop_id, GValue *, GParamSpec *);
|
|
|
|
static void gst_er_dtls_srtp_bin_class_init(GstErDtlsSrtpBinClass *klass)
|
|
{
|
|
GObjectClass *gobject_class;
|
|
|
|
gobject_class = (GObjectClass *) klass;
|
|
|
|
gobject_class->finalize = GST_DEBUG_FUNCPTR(gst_er_dtls_srtp_bin_finalize);
|
|
gobject_class->set_property = GST_DEBUG_FUNCPTR(gst_er_dtls_srtp_bin_set_property);
|
|
gobject_class->get_property = GST_DEBUG_FUNCPTR(gst_er_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_er_dtls_srtp_bin_init(GstErDtlsSrtpBin *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_er_dtls_srtp_bin_finalize(GObject *object)
|
|
{
|
|
GstErDtlsSrtpBin *self = GST_ER_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_er_dtls_srtp_bin_set_property(GObject *object,
|
|
guint prop_id, const GValue *value, GParamSpec *pspec)
|
|
{
|
|
GstErDtlsSrtpBin *self = GST_ER_DTLS_SRTP_BIN(object);
|
|
GstErDtlsSrtpBinClass *klass = GST_ER_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_er_dtls_srtp_bin_get_property(GObject *object,
|
|
guint prop_id, GValue *value, GParamSpec *pspec)
|
|
{
|
|
GstErDtlsSrtpBin *self = GST_ER_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);
|
|
}
|
|
}
|