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];
{
ast_free(crypto->a_crypto);
crypto->a_crypto = NULL;
+ ast_free(crypto->tag);
+ crypto->tag = NULL;
ast_free(crypto);
}
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];
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) {
+ 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;
}
- if (!(p->a_crypto = ast_strdup(crypto_buf))) {
- return -1;
- }
+ ast_log(LOG_DEBUG, "Crypto line: %s", p->a_crypto);
return 0;
}