if (!rtp_cipher || !rtp_auth || !rtcp_cipher || !rtcp_auth)
goto error;
- if (!gst_structure_get (s, "srtp-key", GST_TYPE_BUFFER, &buf, NULL) || !buf) {
- goto error;
- } else {
- GST_DEBUG ("Got key [%p]", buf);
- stream->key = buf;
- }
stream->rtp_cipher = enum_value_from_nick (GST_TYPE_SRTP_CIPHER_TYPE,
rtp_cipher);
goto error;
}
+ if (gst_structure_get (s, "srtp-key", GST_TYPE_BUFFER, &buf, NULL) || !buf) {
+ GST_DEBUG ("Got key [%p]", buf);
+ stream->key = buf;
+ } else if (stream->rtp_cipher != GST_SRTP_CIPHER_NULL ||
+ stream->rtcp_cipher != GST_SRTP_CIPHER_NULL ||
+ stream->rtp_auth != GST_SRTP_AUTH_NULL ||
+ stream->rtcp_auth != GST_SRTP_AUTH_NULL) {
+ goto error;
+ }
+
return stream;
error:
err_status_t ret;
srtp_policy_t policy;
GstMapInfo map;
+ guchar tmp[1];
memset (&policy, 0, sizeof (srtp_policy_t));
set_crypto_policy_cipher_auth (stream->rtcp_cipher, stream->rtcp_auth,
&policy.rtcp);
- gst_buffer_map (stream->key, &map, GST_MAP_READ);
+ if (stream->key) {
+ gst_buffer_map (stream->key, &map, GST_MAP_READ);
+ policy.key = (guchar *) map.data;
+ } else {
+ policy.key = tmp;
+ }
policy.ssrc.value = ssrc;
policy.ssrc.type = ssrc_specific;
- policy.key = (guchar *) map.data;
policy.next = NULL;
/* If it is the first stream, create the session
else
ret = srtp_add_stream (filter->session, &policy);
- gst_buffer_unmap (stream->key, &map);
+ if (stream->key)
+ gst_buffer_unmap (stream->key, &map);
if (ret == err_status_ok) {
filter->first_session = FALSE;
err = init_session_stream (filter, ssrc, stream);
if (err != err_status_ok) {
- gst_buffer_unref (stream->key);
+ if (stream->key)
+ gst_buffer_unref (stream->key);
g_slice_free (GstSrtpDecSsrcStream, stream);
stream = NULL;
}
static void
clear_stream (GstSrtpDecSsrcStream * stream)
{
- gst_buffer_unref (stream->key);
+ if (stream->key)
+ gst_buffer_unref (stream->key);
g_slice_free (GstSrtpDecSsrcStream, stream);
}
ps = gst_caps_get_structure (caps, 0);
if (gst_structure_has_field_typed (ps, "ssrc", G_TYPE_UINT) &&
- gst_structure_has_field_typed (ps, "srtp-key", GST_TYPE_BUFFER) &&
gst_structure_has_field_typed (ps, "srtp-cipher", G_TYPE_STRING) &&
gst_structure_has_field_typed (ps, "srtp-auth", G_TYPE_STRING) &&
gst_structure_has_field_typed (ps, "srtcp-cipher", G_TYPE_STRING) &&
#define DEFAULT_RTCP_AUTH DEFAULT_RTP_AUTH
#define DEFAULT_RANDOM_KEY FALSE
+#define HAS_CRYPTO(filter) (filter->rtp_cipher != GST_SRTP_CIPHER_NULL || \
+ filter->rtcp_cipher != GST_SRTP_CIPHER_NULL || \
+ filter->rtp_auth != GST_SRTP_AUTH_NULL || \
+ filter->rtcp_auth != GST_SRTP_AUTH_NULL)
/* Filter signals and args */
enum
err_status_t ret;
srtp_policy_t policy;
GstMapInfo map;
+ guchar tmp[1];
memset (&policy, 0, sizeof (srtp_policy_t));
if (g_hash_table_lookup (filter->ssrcs_set, GUINT_TO_POINTER (ssrc)))
return TRUE;
- if (gst_buffer_get_size (filter->key) != SRTP_MASTER_KEY_LEN) {
- GST_ELEMENT_ERROR (filter, LIBRARY, SETTINGS, ("Master key size is wrong"),
- ("Expected master key of %d bytes, but received %" G_GSIZE_FORMAT
- " bytes", SRTP_MASTER_KEY_LEN, gst_buffer_get_size (filter->key)));
- return FALSE;
+ GST_OBJECT_LOCK (filter);
+
+ if (HAS_CRYPTO (filter)) {
+ if (filter->key == NULL) {
+ GST_OBJECT_UNLOCK (filter);
+ GST_ELEMENT_ERROR (filter, LIBRARY, SETTINGS,
+ ("Cipher is not NULL, key must be set"),
+ ("Cipher is not NULL, key must be set"));
+ return FALSE;
+ }
+ if (gst_buffer_get_size (filter->key) != SRTP_MASTER_KEY_LEN) {
+ GST_OBJECT_UNLOCK (filter);
+ GST_ELEMENT_ERROR (filter, LIBRARY, SETTINGS,
+ ("Master key size is wrong"),
+ ("Expected master key of %d bytes, but received %" G_GSIZE_FORMAT
+ " bytes", SRTP_MASTER_KEY_LEN,
+ gst_buffer_get_size (filter->key)));
+ return FALSE;
+ }
}
GST_DEBUG_OBJECT (filter, "Setting RTP/RTCP policy to %d / %d",
set_crypto_policy_cipher_auth (filter->rtcp_cipher, filter->rtcp_auth,
&policy.rtcp);
- gst_buffer_map (filter->key, &map, GST_MAP_READ);
+ if (HAS_CRYPTO (filter)) {
+ gst_buffer_map (filter->key, &map, GST_MAP_READ);
+ policy.key = (guchar *) map.data;
+ } else {
+ policy.key = tmp;
+ }
policy.ssrc.value = ssrc;
policy.ssrc.type = ssrc_specific;
- policy.key = (guchar *) map.data;
policy.next = NULL;
/* If it is the first stream, create the session
else
ret = srtp_add_stream (filter->session, &policy);
- gst_buffer_unmap (filter->key, &map);
+ if (HAS_CRYPTO (filter))
+ gst_buffer_unmap (filter->key, &map);
g_hash_table_insert (filter->ssrcs_set, GUINT_TO_POINTER (ssrc),
GUINT_TO_POINTER (1));
+ GST_OBJECT_UNLOCK (filter);
+
return ret == err_status_ok;
}
GST_OBJECT_LOCK (filter);
+ if (HAS_CRYPTO (filter))
+ gst_structure_set (ps, "srtp-key", GST_TYPE_BUFFER, filter->key, NULL);
+
/* Add srtp-specific params to source caps */
- gst_structure_set (ps, "srtp-key", GST_TYPE_BUFFER, filter->key,
+ gst_structure_set (ps,
"srtp-cipher", G_TYPE_STRING,
enum_nick_from_value (GST_TYPE_SRTP_CIPHER_TYPE, filter->rtp_cipher),
"srtp-auth", G_TYPE_STRING,
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
- if (!filter->key) {
- if (filter->random_key) {
- gst_srtp_enc_replace_random_key (filter);
- } else {
- GST_ERROR_OBJECT (element, "Need a key to get to READY");
- return GST_STATE_CHANGE_FAILURE;
+ if (filter->rtp_cipher != GST_SRTP_CIPHER_NULL ||
+ filter->rtcp_cipher != GST_SRTP_CIPHER_NULL ||
+ filter->rtp_auth != GST_SRTP_AUTH_NULL ||
+ filter->rtcp_auth != GST_SRTP_AUTH_NULL) {
+ if (!filter->key) {
+ if (filter->random_key) {
+ gst_srtp_enc_replace_random_key (filter);
+ } else {
+ GST_ERROR_OBJECT (element, "Need a key to get to READY");
+ return GST_STATE_CHANGE_FAILURE;
+ }
}
}
if ((filter->rtcp_cipher != NULL_CIPHER)