|
|
|
|
@ -93,7 +93,7 @@ struct attribute_crypto {
|
|
|
|
|
str mki_str;
|
|
|
|
|
|
|
|
|
|
unsigned int tag;
|
|
|
|
|
enum crypto_suite crypto_suite;
|
|
|
|
|
const struct crypto_suite *crypto_suite;
|
|
|
|
|
str master_key;
|
|
|
|
|
str salt;
|
|
|
|
|
char key_salt_buf[30];
|
|
|
|
|
@ -309,7 +309,6 @@ static int parse_attribute_ssrc(struct sdp_attribute *output) {
|
|
|
|
|
static int parse_attribute_crypto(struct sdp_attribute *output) {
|
|
|
|
|
char *start, *end;
|
|
|
|
|
struct attribute_crypto *c;
|
|
|
|
|
const struct crypto_suite_params *cs;
|
|
|
|
|
int salt_key_len, enc_salt_key_len;
|
|
|
|
|
int b64_state = 0;
|
|
|
|
|
unsigned int b64_save = 0;
|
|
|
|
|
@ -328,11 +327,11 @@ static int parse_attribute_crypto(struct sdp_attribute *output) {
|
|
|
|
|
c = &output->u.crypto;
|
|
|
|
|
|
|
|
|
|
c->crypto_suite = crypto_find_suite(&c->crypto_suite_str);
|
|
|
|
|
if (c->crypto_suite == CS_UNKNOWN)
|
|
|
|
|
if (!c->crypto_suite)
|
|
|
|
|
return -1;
|
|
|
|
|
cs = &crypto_suite_params[c->crypto_suite];
|
|
|
|
|
/* assume everything is a multiple of 8 */
|
|
|
|
|
salt_key_len = (cs->master_key_len + cs->master_salt_len) / 8;
|
|
|
|
|
salt_key_len = (c->crypto_suite->master_key_len
|
|
|
|
|
+ c->crypto_suite->master_salt_len) / 8;
|
|
|
|
|
assert(sizeof(c->key_salt_buf) >= salt_key_len);
|
|
|
|
|
enc_salt_key_len = ceil((double) salt_key_len * 4.0/3.0);
|
|
|
|
|
|
|
|
|
|
@ -348,9 +347,9 @@ static int parse_attribute_crypto(struct sdp_attribute *output) {
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
c->master_key.s = c->key_salt_buf;
|
|
|
|
|
c->master_key.len = cs->master_key_len / 8;
|
|
|
|
|
c->master_key.len = c->crypto_suite->master_key_len / 8;
|
|
|
|
|
c->salt.s = c->master_key.s + c->master_key.len;
|
|
|
|
|
c->salt.len = cs->master_salt_len / 8;
|
|
|
|
|
c->salt.len = c->crypto_suite->master_salt_len / 8;
|
|
|
|
|
|
|
|
|
|
c->lifetime_str = c->key_params_str;
|
|
|
|
|
str_shift(&c->lifetime_str, 7 + enc_salt_key_len);
|
|
|
|
|
@ -383,7 +382,8 @@ static int parse_attribute_crypto(struct sdp_attribute *output) {
|
|
|
|
|
else
|
|
|
|
|
c->lifetime = strtoull(c->lifetime_str.s, NULL, 10);
|
|
|
|
|
|
|
|
|
|
if (!c->lifetime || c->lifetime > cs->srtp_lifetime || c->lifetime > cs->srtcp_lifetime)
|
|
|
|
|
if (!c->lifetime || c->lifetime > c->crypto_suite->srtp_lifetime
|
|
|
|
|
|| c->lifetime > c->crypto_suite->srtcp_lifetime)
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|