|
|
@@ -69,10 +69,15 @@ int ff_srtp_set_crypto(struct SRTPContext *s, const char *suite, |
|
|
|
ff_srtp_free(s); |
|
|
|
|
|
|
|
// RFC 4568 |
|
|
|
if (!strcmp(suite, "AES_CM_128_HMAC_SHA1_80")) { |
|
|
|
s->hmac_size = 10; |
|
|
|
if (!strcmp(suite, "AES_CM_128_HMAC_SHA1_80") || |
|
|
|
!strcmp(suite, "SRTP_AES128_CM_HMAC_SHA1_80")) { |
|
|
|
s->rtp_hmac_size = s->rtcp_hmac_size = 10; |
|
|
|
} else if (!strcmp(suite, "AES_CM_128_HMAC_SHA1_32")) { |
|
|
|
s->hmac_size = 4; |
|
|
|
s->rtp_hmac_size = s->rtcp_hmac_size = 4; |
|
|
|
} else if (!strcmp(suite, "SRTP_AES128_CM_HMAC_SHA1_32")) { |
|
|
|
// RFC 5764 section 4.1.2 |
|
|
|
s->rtp_hmac_size = 4; |
|
|
|
s->rtcp_hmac_size = 10; |
|
|
|
} else { |
|
|
|
av_log(NULL, AV_LOG_WARNING, "SRTP Crypto suite %s not supported\n", |
|
|
|
suite); |
|
|
@@ -124,19 +129,23 @@ int ff_srtp_decrypt(struct SRTPContext *s, uint8_t *buf, int *lenptr) |
|
|
|
int ext, av_uninit(seq_largest); |
|
|
|
uint32_t ssrc, av_uninit(roc); |
|
|
|
uint64_t index; |
|
|
|
int rtcp; |
|
|
|
int rtcp, hmac_size; |
|
|
|
|
|
|
|
// TODO: Missing replay protection |
|
|
|
|
|
|
|
if (len < s->hmac_size) |
|
|
|
if (len < 2) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
rtcp = RTP_PT_IS_RTCP(buf[1]); |
|
|
|
hmac_size = rtcp ? s->rtcp_hmac_size : s->rtp_hmac_size; |
|
|
|
|
|
|
|
if (len < hmac_size) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
// Authentication HMAC |
|
|
|
av_hmac_init(s->hmac, rtcp ? s->rtcp_auth : s->rtp_auth, sizeof(s->rtp_auth)); |
|
|
|
// If MKI is used, this should exclude the MKI as well |
|
|
|
av_hmac_update(s->hmac, buf, len - s->hmac_size); |
|
|
|
av_hmac_update(s->hmac, buf, len - hmac_size); |
|
|
|
|
|
|
|
if (!rtcp) { |
|
|
|
int seq = AV_RB16(buf + 2); |
|
|
@@ -166,12 +175,12 @@ int ff_srtp_decrypt(struct SRTPContext *s, uint8_t *buf, int *lenptr) |
|
|
|
} |
|
|
|
|
|
|
|
av_hmac_final(s->hmac, hmac, sizeof(hmac)); |
|
|
|
if (memcmp(hmac, buf + len - s->hmac_size, s->hmac_size)) { |
|
|
|
if (memcmp(hmac, buf + len - hmac_size, hmac_size)) { |
|
|
|
av_log(NULL, AV_LOG_WARNING, "HMAC mismatch\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
|
|
|
|
len -= s->hmac_size; |
|
|
|
len -= hmac_size; |
|
|
|
*lenptr = len; |
|
|
|
|
|
|
|
if (len < 12) |
|
|
@@ -231,7 +240,7 @@ int ff_srtp_encrypt(struct SRTPContext *s, const uint8_t *in, int len, |
|
|
|
uint8_t iv[16] = { 0 }, hmac[20]; |
|
|
|
uint64_t index; |
|
|
|
uint32_t ssrc; |
|
|
|
int rtcp; |
|
|
|
int rtcp, hmac_size; |
|
|
|
uint8_t *buf; |
|
|
|
|
|
|
|
if (len + 14 > outlen) |
|
|
@@ -243,6 +252,7 @@ int ff_srtp_encrypt(struct SRTPContext *s, const uint8_t *in, int len, |
|
|
|
buf = out; |
|
|
|
|
|
|
|
rtcp = RTP_PT_IS_RTCP(buf[1]); |
|
|
|
hmac_size = rtcp ? s->rtcp_hmac_size : s->rtp_hmac_size; |
|
|
|
|
|
|
|
if (rtcp) { |
|
|
|
ssrc = AV_RB32(buf + 4); |
|
|
@@ -300,8 +310,8 @@ int ff_srtp_encrypt(struct SRTPContext *s, const uint8_t *in, int len, |
|
|
|
} |
|
|
|
av_hmac_final(s->hmac, hmac, sizeof(hmac)); |
|
|
|
|
|
|
|
memcpy(buf + len, hmac, s->hmac_size); |
|
|
|
len += s->hmac_size; |
|
|
|
memcpy(buf + len, hmac, hmac_size); |
|
|
|
len += hmac_size; |
|
|
|
return buf + len - out; |
|
|
|
} |
|
|
|
|
|
|
|