Update SRTP code

This commit is contained in:
Aaro Altonen 2020-07-30 09:41:01 +03:00
parent 1510f93f3f
commit 3207713c24
2 changed files with 18 additions and 16 deletions

View File

@ -100,12 +100,22 @@ enum RTP_CTX_ENABLE_FLAGS {
/* Use ZRTP for key management
*
* TODO selitä paremmin */
* If this flag is provided, before the session starts,
* ZRTP will negotiate keys with the remote participants
* and these keys are used as salting/keying material for the session.
*
* This flag must be coupled with RCE_SRTP and is mutually exclusive
* with RCE_SRTP_KMNGMNT_USER. */
RCE_SRTP_KMNGMNT_ZRTP = 1 << 4,
/* Use user-defined way to manage keys
*
* TODO selitä paremmin */
* If this flag is provided, before the media transportation starts,
* user must provide a master key and salt form which SRTP session
* keys are derived
*
* This flag must be coupled with RCE_SRTP and is mutually exclusive
* with RCE_SRTP_KMNGMNT_ZRTP */
RCE_SRTP_KMNGMNT_USER = 1 << 5,
/* When uvgRTP is receiving HEVC stream, as an attempt to improve

View File

@ -18,18 +18,15 @@ uvg_rtp::srtp::~srtp()
}
#ifdef __RTP_CRYPTO__
/* TODO: explain this code and refactor it! */
rtp_error_t uvg_rtp::srtp::derive_key(int label, uint8_t *key, uint8_t *salt, uint8_t *out, size_t out_len)
{
uint8_t input[AES_KEY_LENGTH] = { 0 };
memcpy(input, salt, SALT_LENGTH);
input[7] ^= label;
memset(out, 0, out_len);
uvg_rtp::crypto::aes::ecb ecb(key, AES_KEY_LENGTH);
ecb.encrypt(out, input, AES_KEY_LENGTH);
return RTP_OK;
@ -40,18 +37,15 @@ rtp_error_t uvg_rtp::srtp::create_iv(uint8_t *out, uint32_t ssrc, uint64_t index
if (!out || !salt)
return RTP_INVALID_VALUE;
uint8_t indexbuf[8];
uint8_t buf[8];
int i;
memset(out, 0, 16);
memcpy(&out[4], &ssrc, sizeof(uint32_t));
memcpy(indexbuf, &index, sizeof(uint64_t));
/* TODO: rewrite this */
memset(out, 0, AES_KEY_LENGTH);
memcpy(&out[4], &ssrc, sizeof(uint32_t));
memcpy(buf, &index, sizeof(uint64_t));
for (i = 0; i < 8; i++)
out[6 + i] ^= indexbuf[i];
out[6 + i] ^= buf[i];
for (i = 0; i < 14; i++)
out[i] ^= salt[i];
@ -137,7 +131,7 @@ rtp_error_t uvg_rtp::srtp::init_zrtp(int type, uvg_rtp::rtp *rtp, uvg_rtp::zrtp
return RTP_INVALID_VALUE;
if (type != SRTP) {
LOG_ERROR("SRTCP NOT SUPPORTED!");
LOG_ERROR("SRTCP not supported!");
return RTP_INVALID_VALUE;
}
@ -221,9 +215,7 @@ rtp_error_t uvg_rtp::srtp::decrypt(uint8_t *buffer, size_t len)
}
uint8_t *payload = buffer + sizeof(uvg_rtp::frame::rtp_header);
uvg_rtp::crypto::aes::ctr ctr(key_ctx_.remote.enc_key, sizeof(key_ctx_.remote.enc_key), iv);
ctr.decrypt(payload, payload, len - sizeof(uvg_rtp::frame::rtp_header));
return RTP_OK;