[asterisk-commits] dlee: branch 1.8 r380347 - /branches/1.8/channels/sip/sdp_crypto.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jan 29 11:05:22 CST 2013


Author: dlee
Date: Tue Jan 29 11:05:18 2013
New Revision: 380347

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=380347
Log:
Corrected crypto tag in SDP ANSWER for SRTP. (again)

The original fix (r380043) for getting Asterisk to respond with the correct
tag overlooked some corner cases, and the fact that the same code is in 1.8.

This patch moves the building of the crypto line out of
sdp_crypto_process(). Instead, it merely copies the accepted tag. The call to
sdp_crypto_offer() will build the crypto line in all cases now, using a tag of
"1" in the case of sending offers.

(closes issue ASTERISK-20849)
Reported by: José Luis Millán
Review: https://reviewboard.asterisk.org/r/2295/

Modified:
    branches/1.8/channels/sip/sdp_crypto.c

Modified: branches/1.8/channels/sip/sdp_crypto.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sip/sdp_crypto.c?view=diff&rev=380347&r1=380346&r2=380347
==============================================================================
--- branches/1.8/channels/sip/sdp_crypto.c (original)
+++ branches/1.8/channels/sip/sdp_crypto.c Tue Jan 29 11:05:18 2013
@@ -48,6 +48,7 @@
 struct sdp_crypto {
 	char *a_crypto;
 	unsigned char local_key[SRTP_MASTER_LEN];
+	char *tag;
 	char local_key64[SRTP_MASTER_LEN64];
 	unsigned char remote_key[SRTP_MASTER_LEN];
 	char suite[64];
@@ -64,6 +65,8 @@
 {
 	ast_free(crypto->a_crypto);
 	crypto->a_crypto = NULL;
+	ast_free(crypto->tag);
+	crypto->tag = NULL;
 	ast_free(crypto);
 }
 
@@ -197,7 +200,6 @@
 	char *key_salt = NULL;
 	char *lifetime = NULL;
 	int found = 0;
-	int attr_len = strlen(attr);
 	int key_len = 0;
 	int suite_val = 0;
 	unsigned char remote_key[SRTP_MASTER_LEN];
@@ -277,36 +279,38 @@
 		return -1;
 	}
 
-	if (!p->a_crypto) {
-		if (!(p->a_crypto = ast_calloc(1, attr_len + 11))) {
-			ast_log(LOG_ERROR, "Could not allocate memory for a_crypto\n");
+	if (!p->tag) {
+		ast_log(LOG_DEBUG, "Accepting crypto tag %s\n", tag);
+		p->tag = ast_strdup(tag);
+		if (!p->tag) {
+			ast_log(LOG_ERROR, "Could not allocate memory for tag\n");
 			return -1;
 		}
-		snprintf(p->a_crypto, attr_len + 10, "a=crypto:%s %s inline:%s\r\n", tag, suite, p->local_key64);
-	}
-	return 0;
+	}
+
+	/* Finally, rebuild the crypto line */
+	return sdp_crypto_offer(p);
 }
 
 int sdp_crypto_offer(struct sdp_crypto *p)
 {
-	char crypto_buf[128];
-
 	if (ast_strlen_zero(p->suite)) {
 		/* Default crypto offer */
 		strcpy(p->suite, "AES_CM_128_HMAC_SHA1_80");
 	}
 
+	/* Rebuild the crypto line */
 	if (p->a_crypto) {
 		ast_free(p->a_crypto);
 	}
 
-	if (snprintf(crypto_buf, sizeof(crypto_buf), "a=crypto:1 %s inline:%s\r\n",  p->suite, p->local_key64) < 1) {
-		return -1;
-	}
-
-	if (!(p->a_crypto = ast_strdup(crypto_buf))) {
-		return -1;
-	}
+	if (ast_asprintf(&p->a_crypto, "a=crypto:%s %s inline:%s\r\n",
+			 p->tag ? p->tag : "1", p->suite, p->local_key64) == -1) {
+			ast_log(LOG_ERROR, "Could not allocate memory for crypto line\n");
+		return -1;
+	}
+
+	ast_log(LOG_DEBUG, "Crypto line: %s", p->a_crypto);
 
 	return 0;
 }




More information about the asterisk-commits mailing list