diff --git a/daemon/rtcp.c b/daemon/rtcp.c index 7f792f6..be979e5 100644 --- a/daemon/rtcp.c +++ b/daemon/rtcp.c @@ -319,41 +319,52 @@ static inline int check_session_keys(struct crypto_context *c) { if (c->have_session_key) return 0; if (!c->crypto_suite) - return -1; + goto error; str_init_len(&s, c->session_key, c->crypto_suite->session_key_len / 8); if (crypto_gen_session_key(c, &s, 0x03, 4)) - return -1; + goto error; str_init_len(&s, c->session_auth_key, c->crypto_suite->srtcp_auth_key_len / 8); if (crypto_gen_session_key(c, &s, 0x04, 4)) - return -1; + goto error; str_init_len(&s, c->session_salt, c->crypto_suite->session_salt_len / 8); if (crypto_gen_session_key(c, &s, 0x05, 4)) - return -1; + goto error; c->have_session_key = 1; return 0; + +error: + mylog(LOG_ERROR, "Error generating SRTP session keys"); + return -1; } static int rtcp_payload(struct rtcp_packet **out, str *p, const str *s) { struct rtcp_packet *rtcp; + const char *err; + err = "short packet (header)"; if (s->len < sizeof(*rtcp)) - return -1; + goto error; rtcp = (void *) s->s; + err = "invalid header version"; if ((rtcp->header.v_p_x & 0xc0) != 0x80) /* version 2 */ - return -1; + goto error; + err = "invalid packet type"; if (rtcp->header.pt != RTCP_PT_SR && rtcp->header.pt != RTCP_PT_RR) - return -1; + goto error; *p = *s; str_shift(p, sizeof(*rtcp)); *out = rtcp; return 0; +error: + mylog(LOG_WARNING, "Error parsing RTCP header: %s", err); + return -1; } /* rfc 3711 section 3.4 */ @@ -391,6 +402,7 @@ int rtcp_savp2avp(str *s, struct crypto_context *c) { str payload, to_auth, to_decrypt, auth_tag; u_int32_t idx, *idx_p; char hmac[20]; + const char *err; if (rtcp_payload(&rtcp, &payload, s)) return -1; @@ -402,16 +414,18 @@ int rtcp_savp2avp(str *s, struct crypto_context *c) { s, &payload)) return -1; + err = "short packet"; if (to_decrypt.len < sizeof(idx)) - return -1; + goto error; to_decrypt.len -= sizeof(idx); idx_p = (void *) to_decrypt.s + to_decrypt.len; idx = ntohl(*idx_p); assert(sizeof(hmac) >= auth_tag.len); c->crypto_suite->hash_rtcp(c, hmac, &to_auth); + err = "authentication failed"; if (str_memcmp(&auth_tag, hmac)) - return -1; + goto error; if (idx & 0x80000000ULL) { if (crypto_decrypt_rtcp(c, rtcp, &to_decrypt, idx & 0x7fffffffULL)) @@ -422,4 +436,8 @@ int rtcp_savp2avp(str *s, struct crypto_context *c) { to_auth.len -= sizeof(idx); return 0; + +error: + mylog(LOG_WARNING, "Discarded invalid SRTCP packet: %s", err); + return -1; } diff --git a/daemon/rtp.c b/daemon/rtp.c index 3940467..d68bd19 100644 --- a/daemon/rtp.c +++ b/daemon/rtp.c @@ -33,18 +33,21 @@ static inline int check_session_keys(struct crypto_context *c) { return 0; error: - mylog(LOG_WARNING, "Error generating SRTP session keys"); + mylog(LOG_ERROR, "Error generating SRTP session keys"); return -1; } static int rtp_payload(struct rtp_header **out, str *p, const str *s) { struct rtp_header *rtp; struct rtp_extension *ext; + const char *err; + err = "short packet (header)"; if (s->len < sizeof(*rtp)) goto error; rtp = (void *) s->s; + err = "invalid header version"; if ((rtp->v_p_x_cc & 0xc0) != 0x80) /* version 2 */ goto error; @@ -52,14 +55,17 @@ static int rtp_payload(struct rtp_header **out, str *p, const str *s) { /* fixed header */ str_shift(p, sizeof(*rtp)); /* csrc list */ + err = "short packet (CSRC list)"; if (str_shift(p, (rtp->v_p_x_cc & 0xf) * 4)) goto error; if ((rtp->v_p_x_cc & 0x10)) { /* extension */ + err = "short packet (extension header)"; if (p->len < sizeof(*ext)) goto error; ext = (void *) p->s; + err = "short packet (header extensions)"; if (str_shift(p, 4 + ntohs(ext->length) * 4)) goto error; } @@ -69,7 +75,7 @@ static int rtp_payload(struct rtp_header **out, str *p, const str *s) { return 0; error: - mylog(LOG_WARNING, "Error parsing RTP header"); + mylog(LOG_WARNING, "Error parsing RTP header: %s", err); return -1; } @@ -185,7 +191,7 @@ int rtp_savp2avp(str *s, struct crypto_context *c) { assert(sizeof(hmac) >= auth_tag.len); c->crypto_suite->hash_rtp(c, hmac, &to_auth, index); if (str_memcmp(&auth_tag, hmac)) - return -1; + goto error; } if (crypto_decrypt_rtp(c, rtp, &to_decrypt, index)) @@ -194,6 +200,10 @@ int rtp_savp2avp(str *s, struct crypto_context *c) { *s = to_auth; return 0; + +error: + mylog(LOG_WARNING, "Discarded invalid SRTP packet: authentication failed"); + return -1; } /* rfc 3711 section 3.1 and 3.4 */ @@ -233,6 +243,6 @@ int srtp_payloads(str *to_auth, str *to_decrypt, str *auth_tag, str *mki, return 0; error: - mylog(LOG_WARNING, "Invalid SRTP packet received"); + mylog(LOG_WARNING, "Invalid SRTP/SRTCP packet received (short packet)"); return -1; }