summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleix Conchillo FlaquƩ <aconchillo@gmail.com>2016-04-14 23:29:34 -0700
committerJosep Torra <n770galaxy@gmail.com>2016-04-19 17:43:26 +0200
commit4921231787b39fd9cde469974378a5abeeb41c58 (patch)
tree217ea5ee3be3263a32b533ceb8411ad425c35d0d
parent7a4af2eb1d0788eae5ca2510f6fdeeb3538f2591 (diff)
downloadgstreamer-plugins-base-4921231787b39fd9cde469974378a5abeeb41c58.tar.gz
mikey: add new function gst_mikey_message_to_caps
-rw-r--r--gst-libs/gst/sdp/gstmikey.c136
-rw-r--r--gst-libs/gst/sdp/gstmikey.h4
-rw-r--r--gst-libs/gst/sdp/gstsdpmessage.c119
3 files changed, 139 insertions, 120 deletions
diff --git a/gst-libs/gst/sdp/gstmikey.c b/gst-libs/gst/sdp/gstmikey.c
index 358aa2f47..f544cfaab 100644
--- a/gst-libs/gst/sdp/gstmikey.c
+++ b/gst-libs/gst/sdp/gstmikey.c
@@ -2299,6 +2299,142 @@ no_key:
return NULL;
}
+#define AES_128_KEY_LEN 16
+#define AES_256_KEY_LEN 32
+#define HMAC_32_KEY_LEN 4
+#define HMAC_80_KEY_LEN 10
+
+/**
+ * gst_mikey_message_to_caps:
+ * @msg: a #GstMIKEYMessage
+ * @caps: a #GstCaps to be filled with SRTP parameters (srtp/srtcp cipher, authorization, key data)
+ *
+ * Returns: %TRUE on success
+ *
+ * Since: 1.10
+ */
+gboolean
+gst_mikey_message_to_caps (const GstMIKEYMessage * msg, GstCaps * caps)
+{
+ gboolean res = FALSE;
+ const GstMIKEYPayload *payload;
+ const gchar *srtp_cipher;
+ const gchar *srtp_auth;
+
+ srtp_cipher = "aes-128-icm";
+ srtp_auth = "hmac-sha1-80";
+
+ /* check the Security policy if any */
+ if ((payload = gst_mikey_message_find_payload (msg, GST_MIKEY_PT_SP, 0))) {
+ GstMIKEYPayloadSP *p = (GstMIKEYPayloadSP *) payload;
+ guint len, i;
+
+ if (p->proto != GST_MIKEY_SEC_PROTO_SRTP)
+ goto done;
+
+ len = gst_mikey_payload_sp_get_n_params (payload);
+ for (i = 0; i < len; i++) {
+ const GstMIKEYPayloadSPParam *param =
+ gst_mikey_payload_sp_get_param (payload, i);
+
+ switch (param->type) {
+ case GST_MIKEY_SP_SRTP_ENC_ALG:
+ switch (param->val[0]) {
+ case 0:
+ srtp_cipher = "null";
+ break;
+ case 2:
+ case 1:
+ srtp_cipher = "aes-128-icm";
+ break;
+ default:
+ break;
+ }
+ break;
+ case GST_MIKEY_SP_SRTP_ENC_KEY_LEN:
+ switch (param->val[0]) {
+ case AES_128_KEY_LEN:
+ srtp_cipher = "aes-128-icm";
+ break;
+ case AES_256_KEY_LEN:
+ srtp_cipher = "aes-256-icm";
+ break;
+ default:
+ break;
+ }
+ break;
+ case GST_MIKEY_SP_SRTP_AUTH_ALG:
+ switch (param->val[0]) {
+ case 0:
+ srtp_auth = "null";
+ break;
+ case 2:
+ case 1:
+ srtp_auth = "hmac-sha1-80";
+ break;
+ default:
+ break;
+ }
+ break;
+ case GST_MIKEY_SP_SRTP_AUTH_KEY_LEN:
+ switch (param->val[0]) {
+ case HMAC_32_KEY_LEN:
+ srtp_auth = "hmac-sha1-32";
+ break;
+ case HMAC_80_KEY_LEN:
+ srtp_auth = "hmac-sha1-80";
+ break;
+ default:
+ break;
+ }
+ break;
+ case GST_MIKEY_SP_SRTP_SRTP_ENC:
+ break;
+ case GST_MIKEY_SP_SRTP_SRTCP_ENC:
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ if (!(payload = gst_mikey_message_find_payload (msg, GST_MIKEY_PT_KEMAC, 0)))
+ goto done;
+ else {
+ GstMIKEYPayloadKEMAC *p = (GstMIKEYPayloadKEMAC *) payload;
+ const GstMIKEYPayload *sub;
+ GstMIKEYPayloadKeyData *pkd;
+ GstBuffer *buf;
+
+ if (p->enc_alg != GST_MIKEY_ENC_NULL || p->mac_alg != GST_MIKEY_MAC_NULL)
+ goto done;
+
+ if (!(sub = gst_mikey_payload_kemac_get_sub (payload, 0)))
+ goto done;
+
+ if (sub->type != GST_MIKEY_PT_KEY_DATA)
+ goto done;
+
+ pkd = (GstMIKEYPayloadKeyData *) sub;
+ buf =
+ gst_buffer_new_wrapped (g_memdup (pkd->key_data, pkd->key_len),
+ pkd->key_len);
+ gst_caps_set_simple (caps, "srtp-key", GST_TYPE_BUFFER, buf, NULL);
+ gst_buffer_unref (buf);
+ }
+
+ gst_caps_set_simple (caps,
+ "srtp-cipher", G_TYPE_STRING, srtp_cipher,
+ "srtp-auth", G_TYPE_STRING, srtp_auth,
+ "srtcp-cipher", G_TYPE_STRING, srtp_cipher,
+ "srtcp-auth", G_TYPE_STRING, srtp_auth, NULL);
+
+ res = TRUE;
+
+done:
+ return res;
+}
+
/**
* gst_mikey_message_base64_encode:
* @msg: a #GstMIKEYMessage
diff --git a/gst-libs/gst/sdp/gstmikey.h b/gst-libs/gst/sdp/gstmikey.h
index 09ae1908d..88d9805d2 100644
--- a/gst-libs/gst/sdp/gstmikey.h
+++ b/gst-libs/gst/sdp/gstmikey.h
@@ -547,7 +547,8 @@ GstMIKEYMessage * gst_mikey_message_new_from_bytes (GBytes *bytes,
GError **error);
GBytes * gst_mikey_message_to_bytes (GstMIKEYMessage *msg, GstMIKEYEncryptInfo *info,
GError **error);
-GstMIKEYMessage * gst_mikey_message_new_from_caps (GstCaps *caps);
+GstMIKEYMessage * gst_mikey_message_new_from_caps (GstCaps *caps);
+gboolean gst_mikey_message_to_caps (const GstMIKEYMessage *msg, GstCaps *caps);
gchar * gst_mikey_message_base64_encode (GstMIKEYMessage* msg);
/**
@@ -665,4 +666,3 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstMIKEYPayload, gst_mikey_payload_unref)
G_END_DECLS
#endif /* __GST_MIKEY_H__ */
-
diff --git a/gst-libs/gst/sdp/gstsdpmessage.c b/gst-libs/gst/sdp/gstsdpmessage.c
index 9878d044e..17fa6c406 100644
--- a/gst-libs/gst/sdp/gstsdpmessage.c
+++ b/gst-libs/gst/sdp/gstsdpmessage.c
@@ -3619,11 +3619,6 @@ gst_sdp_make_keymgmt (const gchar * uri, const gchar * base64)
return g_strdup_printf ("prot=mikey;uri=\"%s\";data=\"%s\"", uri, base64);
}
-#define AES_128_KEY_LEN 16
-#define AES_256_KEY_LEN 32
-#define HMAC_32_KEY_LEN 4
-#define HMAC_80_KEY_LEN 10
-
static gboolean
gst_sdp_parse_keymgmt (const gchar * keymgmt, GstCaps * caps)
{
@@ -3631,9 +3626,6 @@ gst_sdp_parse_keymgmt (const gchar * keymgmt, GstCaps * caps)
gsize size;
guchar *data;
GstMIKEYMessage *msg;
- const GstMIKEYPayload *payload;
- const gchar *srtp_cipher;
- const gchar *srtp_auth;
gchar *orig_value;
gchar *p, *kmpid;
@@ -3661,116 +3653,7 @@ gst_sdp_parse_keymgmt (const gchar * keymgmt, GstCaps * caps)
if (msg == NULL)
return FALSE;
- srtp_cipher = "aes-128-icm";
- srtp_auth = "hmac-sha1-80";
-
- /* check the Security policy if any */
- if ((payload = gst_mikey_message_find_payload (msg, GST_MIKEY_PT_SP, 0))) {
- GstMIKEYPayloadSP *p = (GstMIKEYPayloadSP *) payload;
- guint len, i;
-
- if (p->proto != GST_MIKEY_SEC_PROTO_SRTP)
- goto done;
-
- len = gst_mikey_payload_sp_get_n_params (payload);
- for (i = 0; i < len; i++) {
- const GstMIKEYPayloadSPParam *param =
- gst_mikey_payload_sp_get_param (payload, i);
-
- switch (param->type) {
- case GST_MIKEY_SP_SRTP_ENC_ALG:
- switch (param->val[0]) {
- case 0:
- srtp_cipher = "null";
- break;
- case 2:
- case 1:
- srtp_cipher = "aes-128-icm";
- break;
- default:
- break;
- }
- break;
- case GST_MIKEY_SP_SRTP_ENC_KEY_LEN:
- switch (param->val[0]) {
- case AES_128_KEY_LEN:
- srtp_cipher = "aes-128-icm";
- break;
- case AES_256_KEY_LEN:
- srtp_cipher = "aes-256-icm";
- break;
- default:
- break;
- }
- break;
- case GST_MIKEY_SP_SRTP_AUTH_ALG:
- switch (param->val[0]) {
- case 0:
- srtp_auth = "null";
- break;
- case 2:
- case 1:
- srtp_auth = "hmac-sha1-80";
- break;
- default:
- break;
- }
- break;
- case GST_MIKEY_SP_SRTP_AUTH_KEY_LEN:
- switch (param->val[0]) {
- case HMAC_32_KEY_LEN:
- srtp_auth = "hmac-sha1-32";
- break;
- case HMAC_80_KEY_LEN:
- srtp_auth = "hmac-sha1-80";
- break;
- default:
- break;
- }
- break;
- case GST_MIKEY_SP_SRTP_SRTP_ENC:
- break;
- case GST_MIKEY_SP_SRTP_SRTCP_ENC:
- break;
- default:
- break;
- }
- }
- }
-
- if (!(payload = gst_mikey_message_find_payload (msg, GST_MIKEY_PT_KEMAC, 0)))
- goto done;
- else {
- GstMIKEYPayloadKEMAC *p = (GstMIKEYPayloadKEMAC *) payload;
- const GstMIKEYPayload *sub;
- GstMIKEYPayloadKeyData *pkd;
- GstBuffer *buf;
-
- if (p->enc_alg != GST_MIKEY_ENC_NULL || p->mac_alg != GST_MIKEY_MAC_NULL)
- goto done;
-
- if (!(sub = gst_mikey_payload_kemac_get_sub (payload, 0)))
- goto done;
-
- if (sub->type != GST_MIKEY_PT_KEY_DATA)
- goto done;
-
- pkd = (GstMIKEYPayloadKeyData *) sub;
- buf =
- gst_buffer_new_wrapped (g_memdup (pkd->key_data, pkd->key_len),
- pkd->key_len);
- gst_caps_set_simple (caps, "srtp-key", GST_TYPE_BUFFER, buf, NULL);
- gst_buffer_unref (buf);
- }
-
- gst_caps_set_simple (caps,
- "srtp-cipher", G_TYPE_STRING, srtp_cipher,
- "srtp-auth", G_TYPE_STRING, srtp_auth,
- "srtcp-cipher", G_TYPE_STRING, srtp_cipher,
- "srtcp-auth", G_TYPE_STRING, srtp_auth, NULL);
-
- res = TRUE;
-done:
+ res = gst_mikey_message_to_caps (msg, caps);
gst_mikey_message_unref (msg);
return res;