|
|
|
@ -231,11 +231,11 @@ sub aes_cm_iv_rtp { |
|
|
|
} |
|
|
|
|
|
|
|
sub aes_cm_iv_rtcp { |
|
|
|
my ($ctx, $r) = @_; |
|
|
|
my ($r, $ssalt, $idx) = @_; |
|
|
|
|
|
|
|
my $idx = $$ctx{rtcp_index} || 0; |
|
|
|
$idx ||= 0; |
|
|
|
my ($hdr, $ssrc) = unpack('a4a4', $r); |
|
|
|
my $iv = xor_128($$ctx{rtcp_session_salt} . "\0\0", |
|
|
|
my $iv = xor_128($ssalt . "\0\0", |
|
|
|
$ssrc . "\0\0\0\0\0\0\0\0", pack("Nn", $idx, 0)); |
|
|
|
return $iv; |
|
|
|
} |
|
|
|
@ -249,10 +249,10 @@ sub aes_f8_iv_rtp { |
|
|
|
} |
|
|
|
|
|
|
|
sub aes_f8_iv_rtcp { |
|
|
|
my ($ctx, $r) = @_; |
|
|
|
my ($r, $ssalt, $idx) = @_; |
|
|
|
|
|
|
|
my ($fields) = unpack('a8', $r); |
|
|
|
my $iv = pack('a*Na*', "\0\0\0\0", (($$ctx{rtcp_index} || 0) | 0x80000000), $fields); |
|
|
|
my $iv = pack('a*Na*', "\0\0\0\0", (($idx || 0) | 0x80000000), $fields); |
|
|
|
return $iv; |
|
|
|
} |
|
|
|
|
|
|
|
@ -313,6 +313,52 @@ sub decrypt_rtp { |
|
|
|
return ($pkt, $roc, $auth_tag, $hmac); |
|
|
|
} |
|
|
|
|
|
|
|
sub encrypt_rtcp { |
|
|
|
my ($suite, $skey, $ssalt, $sauth, $idx, $mki, $mki_len, $unenc_srtcp, $packet) = @_; |
|
|
|
|
|
|
|
my $iv = $suite->{iv_rtcp}->($packet, $ssalt, $idx); |
|
|
|
my ($hdr, $to_enc) = unpack('a8a*', $packet); |
|
|
|
my $enc = $unenc_srtcp ? $to_enc : |
|
|
|
$suite->{enc_func}->($to_enc, $skey, |
|
|
|
$iv, $ssalt); |
|
|
|
my $pkt = $hdr . $enc; |
|
|
|
$pkt .= pack("N", (($idx || 0) | ($unenc_srtcp ? 0 : 0x80000000))); |
|
|
|
|
|
|
|
my $hmac = hmac_sha1($pkt, $sauth); |
|
|
|
|
|
|
|
append_mki(\$pkt, $mki_len, $mki); |
|
|
|
|
|
|
|
#$pkt .= pack("N", 1); # mki |
|
|
|
$pkt .= substr($hmac, 0, 10); |
|
|
|
|
|
|
|
$idx++; |
|
|
|
|
|
|
|
return ($pkt, $idx); |
|
|
|
} |
|
|
|
|
|
|
|
sub decrypt_rtcp { |
|
|
|
my ($suite, $skey, $ssalt, $sauth, $packet) = @_; |
|
|
|
|
|
|
|
# XXX MKI, session parameters |
|
|
|
|
|
|
|
my $plen = length($packet); |
|
|
|
my $auth_tag = substr($packet, $plen - 10, 10); |
|
|
|
my $idx_raw = substr($packet, $plen - 4 - 10, 4); |
|
|
|
my ($idx) = unpack('N', $idx_raw); |
|
|
|
$idx &= 0x7fffffff; |
|
|
|
$packet = substr($packet, 0, $plen - 10 - 4); |
|
|
|
|
|
|
|
my $iv = $suite->{iv_rtcp}->($packet, $ssalt, $idx); |
|
|
|
my ($hdr, $to_enc) = unpack('a8a*', $packet); |
|
|
|
my $enc = $suite->{enc_func}->($to_enc, $skey, |
|
|
|
$iv, $ssalt); |
|
|
|
my $pkt = $hdr . $enc; |
|
|
|
|
|
|
|
my $hmac = hmac_sha1($packet, $sauth); |
|
|
|
|
|
|
|
return ($pkt, $idx, $auth_tag, $hmac); |
|
|
|
} |
|
|
|
|
|
|
|
sub append_mki { |
|
|
|
my ($pack_r, $mki_len, $mki) = @_; |
|
|
|
|
|
|
|
|